static void dispose (GObject *object) { NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (object); _ppp_cleanup (NM_PPP_MANAGER (object)); _ppp_kill (NM_PPP_MANAGER (object)); g_clear_object (&priv->act_req); G_OBJECT_CLASS (nm_ppp_manager_parent_class)->dispose (object); }
static void ppp_watch_cb (GPid pid, gint status, gpointer user_data) { NMPPPManager *manager = NM_PPP_MANAGER (user_data); NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager); guint err; g_assert (pid == priv->pid); if (WIFEXITED (status)) { err = WEXITSTATUS (status); if (err != 0) ppp_exit_code (err, priv->pid); } else if (WIFSTOPPED (status)) { _LOGI ("pppd pid %d stopped unexpectedly with signal %d", priv->pid, WSTOPSIG (status)); } else if (WIFSIGNALED (status)) { _LOGI ("pppd pid %d died with signal %d", priv->pid, WTERMSIG (status)); } else _LOGI ("pppd pid %d died from an unknown cause", priv->pid); _LOGD ("pppd pid %d cleaned up", priv->pid); priv->pid = 0; priv->ppp_watch_id = 0; g_signal_emit (manager, signals[STATE_CHANGED], 0, NM_PPP_STATUS_DEAD); }
static gboolean pppd_timed_out (gpointer data) { NMPPPManager *manager = NM_PPP_MANAGER (data); nm_log_warn (LOGD_PPP, "pppd timed out or didn't initialize our dbus module"); _ppp_cleanup (manager); g_signal_emit (manager, signals[STATE_CHANGED], 0, NM_PPP_STATUS_DEAD); return FALSE; }
static void ppp_secrets_cb (NMActRequest *req, NMActRequestGetSecretsCallId call_id, NMSettingsConnection *settings_connection, /* unused (we pass NULL here) */ GError *error, gpointer user_data) { NMPPPManager *self = NM_PPP_MANAGER (user_data); NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (self); const char *username = NULL; const char *password = NULL; GError *local = NULL; NMConnection *applied_connection; g_return_if_fail (priv->pending_secrets_context != NULL); g_return_if_fail (req == priv->act_req); g_return_if_fail (call_id == priv->secrets_id); if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) goto out; if (error) { _LOGW ("%s", error->message); g_dbus_method_invocation_return_gerror (priv->pending_secrets_context, error); goto out; } applied_connection = nm_act_request_get_applied_connection (req); if (!extract_details_from_connection (applied_connection, priv->secrets_setting_name, &username, &password, &local)) { _LOGW ("%s", local->message); g_dbus_method_invocation_take_error (priv->pending_secrets_context, local); goto out; } /* This is sort of a hack but... * pppd plugin only ever needs username and password. Passing the full * connection there would mean some bloat: the plugin would need to link * against libnm just to parse this. So instead, let's just send what * it needs. */ g_dbus_method_invocation_return_value ( priv->pending_secrets_context, g_variant_new ("(ss)", username ? username : "", password ? password : "")); out: priv->pending_secrets_context = NULL; priv->secrets_id = NULL; priv->secrets_setting_name = NULL; }
static void ppp_secrets_cb (NMActRequest *req, guint32 call_id, NMConnection *connection, GError *error, gpointer user_data) { NMPPPManager *self = NM_PPP_MANAGER (user_data); NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (self); const char *username = NULL; const char *password = NULL; GError *local = NULL; g_return_if_fail (priv->pending_secrets_context != NULL); g_return_if_fail (req == priv->act_req); g_return_if_fail (call_id == priv->secrets_id); if (error) { nm_log_warn (LOGD_PPP, "%s", error->message); dbus_g_method_return_error (priv->pending_secrets_context, error); goto out; } if (!extract_details_from_connection (connection, &username, &password, &local)) { nm_log_warn (LOGD_PPP, "%s", local->message); dbus_g_method_return_error (priv->pending_secrets_context, local); g_clear_error (&local); goto out; } /* This is sort of a hack but... * pppd plugin only ever needs username and password. Passing the full * connection there would mean some bloat: the plugin would need to link * against libnm-util just to parse this. So instead, let's just send what * it needs. */ dbus_g_method_return (priv->pending_secrets_context, username, password); out: priv->pending_secrets_context = NULL; priv->secrets_id = 0; }
static gboolean monitor_cb (gpointer user_data) { NMPPPManager *manager = NM_PPP_MANAGER (user_data); NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager); struct ifpppstatsreq req; memset (&req, 0, sizeof (req)); req.stats_ptr = (caddr_t) &req.stats; strncpy (req.ifr__name, priv->ip_iface, sizeof (req.ifr__name)); if (ioctl (priv->monitor_fd, SIOCGPPPSTATS, &req) < 0) { nm_log_warn (LOGD_PPP, "could not read ppp stats: %s", strerror (errno)); } else { g_signal_emit (manager, signals[STATS], 0, req.stats.p.ppp_ibytes, req.stats.p.ppp_obytes); } return TRUE; }
static void dispose (GObject *object) { NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (object); if (priv->disposed == FALSE) { priv->disposed = TRUE; _ppp_cleanup (NM_PPP_MANAGER (object)); if (priv->act_req) { g_object_unref (priv->act_req); priv->act_req = NULL; } g_object_unref (priv->dbus_manager); priv->dbus_manager = NULL; } G_OBJECT_CLASS (nm_ppp_manager_parent_class)->dispose (object); }
static gboolean monitor_cb (gpointer user_data) { NMPPPManager *manager = NM_PPP_MANAGER (user_data); NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager); struct ifreq req; struct ppp_stats stats; memset (&req, 0, sizeof (req)); memset (&stats, 0, sizeof (stats)); req.ifr_data = (caddr_t) &stats; strncpy (req.ifr_name, priv->ip_iface, sizeof (req.ifr_name)); if (ioctl (priv->monitor_fd, SIOCGPPPSTATS, &req) < 0) { if (errno != ENODEV) _LOGW ("could not read ppp stats: %s", strerror (errno)); } else { g_signal_emit (manager, signals[STATS], 0, stats.p.ppp_ibytes, stats.p.ppp_obytes); } return TRUE; }