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; }
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; }
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; }