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 impl_vpn_plugin_set_failure (NMVPNPlugin *plugin, char *reason, GError **err) { nm_vpn_plugin_failure (plugin, NM_VPN_PLUGIN_FAILURE_BAD_IP_CONFIG); return TRUE; }
/** * signal failure to NM, connecting failed */ static void signal_failure(NMVPNPlugin *plugin, NMVPNPluginFailure failure) { nm_handler_t *handler = NM_STRONGSWAN_PLUGIN_GET_PRIVATE(plugin)->handler; handler->reset(handler); /* TODO: NM does not handle this failure!? */ nm_vpn_plugin_failure(plugin, failure); nm_vpn_plugin_set_state(plugin, NM_VPN_SERVICE_STATE_STOPPED); }
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 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 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); }