static void dispose (GObject *object) { NMVPNPlugin *plugin = NM_VPN_PLUGIN (object); NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); NMVPNServiceState state; GError *err = NULL; if (priv->fail_stop_id) { g_source_remove (priv->fail_stop_id); priv->fail_stop_id = 0; } state = nm_vpn_plugin_get_state (plugin); if (state == NM_VPN_SERVICE_STATE_STARTED || state == NM_VPN_SERVICE_STATE_STARTING) nm_vpn_plugin_disconnect (plugin, &err); if (err) { g_warning ("Error disconnecting VPN connection: %s", err->message); g_error_free (err); } G_OBJECT_CLASS (nm_vpn_plugin_parent_class)->dispose (object); }
static gboolean fail_stop (gpointer data) { NMVPNPlugin *plugin = NM_VPN_PLUGIN (data); nm_vpn_plugin_set_state (plugin, NM_VPN_SERVICE_STATE_STOPPED); return FALSE; }
static void openconnect_watch_cb (GPid pid, gint status, gpointer user_data) { NMOPENCONNECTPlugin *plugin = NM_OPENCONNECT_PLUGIN (user_data); NMOPENCONNECTPluginPrivate *priv = NM_OPENCONNECT_PLUGIN_GET_PRIVATE (plugin); guint error = 0; if (WIFEXITED (status)) { error = WEXITSTATUS (status); if (error != 0) g_warning ("openconnect exited with error code %d", error); } else if (WIFSTOPPED (status)) g_warning ("openconnect stopped unexpectedly with signal %d", WSTOPSIG (status)); else if (WIFSIGNALED (status)) g_warning ("openconnect died with signal %d", WTERMSIG (status)); else g_warning ("openconnect died from an unknown cause"); /* Reap child if needed. */ waitpid (priv->pid, NULL, WNOHANG); priv->pid = 0; if (priv->tun_name) { destroy_persistent_tundev (priv->tun_name); g_free (priv->tun_name); priv->tun_name = NULL; } /* Must be after data->state is set since signals use data->state */ switch (error) { case 2: /* Couldn't log in due to bad user/pass */ nm_vpn_plugin_failure (NM_VPN_PLUGIN (plugin), NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED); break; case 1: /* Other error (couldn't bind to address, etc) */ nm_vpn_plugin_failure (NM_VPN_PLUGIN (plugin), NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED); break; default: break; } nm_vpn_plugin_set_state (NM_VPN_PLUGIN (plugin), NM_VPN_SERVICE_STATE_STOPPED); }
static gboolean quit_timer_expired (gpointer data) { NMVPNPlugin *plugin = NM_VPN_PLUGIN (data); nm_vpn_plugin_emit_quit (plugin); return FALSE; }
static gboolean fail_stop (gpointer data) { NMVPNPlugin *self = NM_VPN_PLUGIN (data); NM_VPN_PLUGIN_GET_PRIVATE (self)->fail_stop_id = 0; nm_vpn_plugin_set_state (self, NM_VPN_SERVICE_STATE_STOPPED); return G_SOURCE_REMOVE; }
static gboolean quit_timer_expired (gpointer data) { NMVPNPlugin *self = NM_VPN_PLUGIN (data); NM_VPN_PLUGIN_GET_PRIVATE (self)->quit_timer = 0; nm_vpn_plugin_emit_quit (self); return G_SOURCE_REMOVE; }
static gboolean pppd_timed_out (gpointer user_data) { NML2tpPlugin *plugin = NM_L2TP_PLUGIN (user_data); g_warning (_("pppd timeout. Looks like pppd didn't initialize our dbus module")); nm_vpn_plugin_failure (NM_VPN_PLUGIN (plugin), NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT); return FALSE; }
static void service_ppp_state_cb (NML2tpPppService *service, guint32 ppp_state, NML2tpPlugin *plugin) { NMVPNServiceState plugin_state = nm_vpn_plugin_get_state (NM_VPN_PLUGIN (plugin)); switch (ppp_state) { case NM_PPP_STATUS_DEAD: case NM_PPP_STATUS_DISCONNECT: if (plugin_state == NM_VPN_SERVICE_STATE_STARTED) nm_vpn_plugin_disconnect (NM_VPN_PLUGIN (plugin), NULL); else if (plugin_state == NM_VPN_SERVICE_STATE_STARTING) nm_vpn_plugin_failure (NM_VPN_PLUGIN (plugin), NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED); break; default: break; } }
static void finalize (GObject *object) { NMVPNPlugin *plugin = NM_VPN_PLUGIN (object); NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); nm_vpn_plugin_set_connection (plugin, NULL); g_free (priv->dbus_service_name); G_OBJECT_CLASS (nm_vpn_plugin_parent_class)->finalize (object); }
static gboolean connect_timer_expired (gpointer data) { NMVPNPlugin *plugin = NM_VPN_PLUGIN (data); GError *err = NULL; g_message ("Connect timer expired, disconnecting."); nm_vpn_plugin_disconnect (plugin, &err); if (err) { g_warning ("Disconnect failed: %s", err->message); g_error_free (err); } return FALSE; }
static void get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (object); switch (prop_id) { case PROP_DBUS_SERVICE_NAME: g_value_set_string (value, priv->dbus_service_name); break; case PROP_STATE: g_value_set_uint (value, nm_vpn_plugin_get_state (NM_VPN_PLUGIN (object))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void finalize (GObject *object) { NMVPNPlugin *plugin = NM_VPN_PLUGIN (object); NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); nm_vpn_plugin_set_connection (plugin, NULL); g_free (priv->dbus_service_name); if (G_IS_VALUE (&priv->banner)) g_value_unset (&priv->banner); if (G_IS_VALUE (&priv->tundev)) g_value_unset (&priv->tundev); if (G_IS_VALUE (&priv->gateway)) g_value_unset (&priv->gateway); if (G_IS_VALUE (&priv->mtu)) g_value_unset (&priv->mtu); G_OBJECT_CLASS (nm_vpn_plugin_parent_class)->finalize (object); }
static void set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (object); switch (prop_id) { case PROP_DBUS_SERVICE_NAME: /* Construct-only */ priv->dbus_service_name = g_strdup (g_value_get_string (value)); break; case PROP_STATE: nm_vpn_plugin_set_state (NM_VPN_PLUGIN (object), (NMVPNServiceState) g_value_get_uint (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void child_watch_cb (GPid pid, gint status, gpointer user_data) { NMVPNPlugin *plugin = NM_VPN_PLUGIN (user_data); NMOpensshPluginPrivate *priv = NM_OPENSSH_PLUGIN_GET_PRIVATE (plugin); NMVPNPluginFailure failure = NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED; guint error = 0; gboolean good_exit = FALSE; if (WIFEXITED (status)) { error = WEXITSTATUS (status); if (error != 0) nm_warning ("sshtun exited with error code %d", error); } else if (WIFSTOPPED (status)) nm_warning ("sshtun stopped unexpectedly with signal %d", WSTOPSIG (status)); else if (WIFSIGNALED (status)) nm_warning ("sshtun died with signal %d", WTERMSIG (status)); else nm_warning ("sshtun died from an unknown cause"); sshtun_stop (priv->handle); sshtun_del (priv->handle); priv->handle = NULL; switch (error) { case 0: good_exit = TRUE; break; default: failure = NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED; break; } if (!good_exit) nm_vpn_plugin_failure (plugin, failure); nm_vpn_plugin_set_state (plugin, NM_VPN_SERVICE_STATE_STOPPED); }
static GObject * constructor (GType type, guint n_construct_params, GObjectConstructParam *construct_params) { GObject *object; NMVPNPlugin *plugin; NMVPNPluginPrivate *priv; DBusGConnection *connection; DBusGProxy *proxy; guint request_name_result; GError *err = NULL; object = G_OBJECT_CLASS (nm_vpn_plugin_parent_class)->constructor (type, n_construct_params, construct_params); if (!object) return NULL; priv = NM_VPN_PLUGIN_GET_PRIVATE (object); if (!priv->dbus_service_name) goto err; connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &err); if (!connection) goto err; proxy = dbus_g_proxy_new_for_name (connection, "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus"); if (!dbus_g_proxy_call (proxy, "RequestName", &err, G_TYPE_STRING, priv->dbus_service_name, G_TYPE_UINT, 0, G_TYPE_INVALID, G_TYPE_UINT, &request_name_result, G_TYPE_INVALID)) { g_object_unref (proxy); goto err; } g_object_unref (proxy); dbus_g_connection_register_g_object (connection, NM_VPN_DBUS_PLUGIN_PATH, object); plugin = NM_VPN_PLUGIN (object); nm_vpn_plugin_set_connection (plugin, connection); nm_vpn_plugin_set_state (plugin, NM_VPN_SERVICE_STATE_INIT); return object; err: if (err) { g_warning ("Failed to initialize VPN plugin: %s", err->message); g_error_free (err); } if (object) g_object_unref (object); return NULL; }
static void l2tpd_watch_cb (GPid pid, gint status, gpointer user_data) { NML2tpPlugin *plugin = NM_L2TP_PLUGIN (user_data); NML2tpPluginPrivate *priv = NM_L2TP_PLUGIN_GET_PRIVATE (plugin); guint error = 0; pid_t my_pid = getpid (); char *filename; if (WIFEXITED (status)) { error = WEXITSTATUS (status); if (error != 0) g_warning (_("xl2tpd exited with error code %d"), error); } else if (WIFSTOPPED (status)) g_warning (_("xl2tpd stopped unexpectedly with signal %d"), WSTOPSIG (status)); else if (WIFSIGNALED (status)) g_warning (_("xl2tpd died with signal %d"), WTERMSIG (status)); else g_warning (_("xl2tpd died from an unknown cause")); /* Reap child if needed. */ waitpid (priv->pid_l2tpd, NULL, WNOHANG); priv->pid_l2tpd = 0; if(priv->ipsec_up) { nm_l2tp_stop_ipsec(); } /* Cleaning up config files */ filename = g_strdup_printf ("/var/run/nm-xl2tpd.conf.%d", my_pid); unlink(filename); g_free(filename); filename = g_strdup_printf ("/var/run/nm-ppp-options.xl2tpd.%d", my_pid); unlink(filename); g_free(filename); filename = g_strdup_printf ("/var/run/nm-ipsec-l2tp.%d/ipsec.conf", my_pid); // unlink(filename); g_free(filename); filename = g_strdup_printf ("/var/run/nm-ipsec-l2tp.%d/ipsec.secrets", my_pid); // unlink(filename); g_free(filename); filename = g_strdup_printf ("/var/run/nm-ipsec-l2tp.%d", my_pid); rmdir(filename); g_free(filename); /* Must be after data->state is set since signals use data->state */ switch (error) { case 16: /* hangup */ // FIXME: better failure reason nm_vpn_plugin_failure (NM_VPN_PLUGIN (plugin), NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED); break; case 2: /* Couldn't log in due to bad user/pass */ nm_vpn_plugin_failure (NM_VPN_PLUGIN (plugin), NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED); break; case 1: /* Other error (couldn't bind to address, etc) */ nm_vpn_plugin_failure (NM_VPN_PLUGIN (plugin), NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED); break; default: break; } nm_vpn_plugin_set_state (NM_VPN_PLUGIN (plugin), NM_VPN_SERVICE_STATE_STOPPED); }