コード例 #1
0
static void
try_add_plugin (NMVpnManager *self, NMVpnPluginInfo *plugin_info)
{
	NMVpnManagerPrivate *priv = NM_VPN_MANAGER_GET_PRIVATE (self);
	const char *program;

	program = nm_vpn_plugin_info_get_program (plugin_info);
	if (!program || !*program)
		return;

	/* Make sure we don't add dupes.
	 * We don't really allow reload of the same file. What we do allow is however to
	 * delete a file and re-add it. */
	if (nm_vpn_plugin_info_list_find_by_filename (priv->plugins,
	                                              nm_vpn_plugin_info_get_filename (plugin_info)))
		return;
	if (!nm_vpn_plugin_info_list_add (&priv->plugins, plugin_info, NULL))
		return;
}
コード例 #2
0
NMVpnService *
nm_vpn_service_new (NMVpnPluginInfo *plugin_info, GError **error)
{
	NMVpnService *self;
	NMVpnServicePrivate *priv;

	g_return_val_if_fail (NM_IS_VPN_PLUGIN_INFO (plugin_info), NULL);
	g_return_val_if_fail (nm_vpn_plugin_info_get_filename (plugin_info), NULL);

	if (!nm_vpn_plugin_info_get_program (plugin_info)) {
		g_set_error (error,
		             NM_VPN_PLUGIN_ERROR,
		             NM_VPN_PLUGIN_ERROR_FAILED,
		             "missing \"program\" entry");
		return NULL;
	}

	self = (NMVpnService *) g_object_new (NM_TYPE_VPN_SERVICE, NULL);
	priv = NM_VPN_SERVICE_GET_PRIVATE (self);
	priv->plugin_info = g_object_ref (plugin_info);

	priv->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
	                                             G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
	                                                 G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS |
	                                                 G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
	                                             NULL,
	                                             nm_vpn_plugin_info_get_service (plugin_info),
	                                             NM_VPN_DBUS_PLUGIN_PATH,
	                                             NM_VPN_DBUS_PLUGIN_INTERFACE,
	                                             NULL, error);
	if (!priv->proxy) {
		g_object_unref (self);
		return NULL;
	}

	g_signal_connect (priv->proxy, "notify::g-name-owner",
	                  G_CALLBACK (_name_owner_changed), self);
	_name_owner_changed (G_OBJECT (priv->proxy), NULL, self);

	return self;
}
コード例 #3
0
static gboolean
nm_vpn_service_daemon_exec (NMVpnService *service, GError **error)
{
	NMVpnServicePrivate *priv = NM_VPN_SERVICE_GET_PRIVATE (service);
	GPid pid;
	char *vpn_argv[2];
	gboolean success = FALSE;
	GError *spawn_error = NULL;

	g_return_val_if_fail (NM_IS_VPN_SERVICE (service), FALSE);

	vpn_argv[0] = (char *) nm_vpn_plugin_info_get_program (priv->plugin_info);
	vpn_argv[1] = NULL;

	g_assert (vpn_argv[0]);

	success = g_spawn_async (NULL, vpn_argv, NULL, 0, nm_utils_setpgid, NULL, &pid, &spawn_error);
	if (success) {
		nm_log_info (LOGD_VPN, "VPN service '%s' started (%s), PID %ld",
		             nm_vpn_plugin_info_get_name (priv->plugin_info),
		             nm_vpn_service_get_dbus_service (service),
		             (long int) pid);
		priv->start_timeout = g_timeout_add_seconds (5, _daemon_exec_timeout, service);
	} else {
		nm_log_warn (LOGD_VPN, "VPN service '%s': could not launch the VPN service. error: (%d) %s.",
		             nm_vpn_plugin_info_get_name (priv->plugin_info),
		             spawn_error ? spawn_error->code : -1,
		             spawn_error && spawn_error->message ? spawn_error->message : "(unknown)");

		g_set_error (error,
		             NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
		             "%s", spawn_error ? spawn_error->message : "unknown g_spawn_async() error");

		nm_vpn_service_stop_connections (service, FALSE, NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_FAILED);
		if (spawn_error)
			g_error_free (spawn_error);
	}

	return success;
}