gboolean nm_vpn_service_activate (NMVPNService *service, NMVPNConnection *vpn, GError **error) { NMVPNServicePrivate *priv; g_return_val_if_fail (NM_IS_VPN_SERVICE (service), FALSE); g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), FALSE); g_return_val_if_fail (error != NULL, FALSE); g_return_val_if_fail (*error == NULL, FALSE); priv = NM_VPN_SERVICE_GET_PRIVATE (service); clear_quit_timeout (service); g_signal_connect (vpn, NM_VPN_CONNECTION_INTERNAL_STATE_CHANGED, G_CALLBACK (connection_vpn_state_changed), service); priv->connections = g_slist_prepend (priv->connections, g_object_ref (vpn)); if (nm_dbus_manager_name_has_owner (priv->dbus_mgr, priv->dbus_service)) nm_vpn_connection_activate (vpn); else if (priv->start_timeout == 0) { nm_log_info (LOGD_VPN, "Starting VPN service '%s'...", priv->name); if (!nm_vpn_service_daemon_exec (service, error)) return FALSE; } return TRUE; }
/** * nm_vpn_connection_get_vpn_state: * @vpn: a #NMVpnConnection * * Gets the current #NMVpnConnection state. * * Returns: the VPN state of the active VPN connection. **/ NMVpnConnectionState nm_vpn_connection_get_vpn_state (NMVpnConnection *vpn) { g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), NM_VPN_CONNECTION_STATE_UNKNOWN); return NM_VPN_CONNECTION_GET_PRIVATE (vpn)->vpn_state; }
gboolean nm_vpn_service_activate (NMVpnService *service, NMVpnConnection *vpn, GError **error) { NMVpnServicePrivate *priv; g_return_val_if_fail (NM_IS_VPN_SERVICE (service), FALSE); g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), FALSE); g_return_val_if_fail (error != NULL, FALSE); g_return_val_if_fail (*error == NULL, FALSE); priv = NM_VPN_SERVICE_GET_PRIVATE (service); g_signal_connect (vpn, NM_VPN_CONNECTION_INTERNAL_STATE_CHANGED, G_CALLBACK (connection_vpn_state_changed), service); /* Queue up the new VPN connection */ priv->pending = g_slist_append (priv->pending, g_object_ref (vpn)); /* Tell the active VPN to deactivate and wait for it to quit before we * start the next VPN. The just-queued VPN will then be started from * connection_vpn_state_changed(). */ if (priv->active) { nm_vpn_connection_deactivate (priv->active, NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED, FALSE); return TRUE; } /* Otherwise start the next VPN */ return start_pending_vpn (service, error); }
/** * nm_vpn_connection_get_vpn_state: * @vpn: a #NMVPNConnection * * Gets the current #NMVPNConnection state. * * Returns: the VPN state of the active VPN connection. **/ NMVPNConnectionState nm_vpn_connection_get_vpn_state (NMVPNConnection *vpn) { g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), NM_VPN_CONNECTION_STATE_UNKNOWN); _nm_object_ensure_inited (NM_OBJECT (vpn)); return NM_VPN_CONNECTION_GET_PRIVATE (vpn)->vpn_state; }
gboolean nm_vpn_manager_activate_connection (NMVpnManager *manager, NMVpnConnection *vpn, GError **error) { NMVpnManagerPrivate *priv; NMVpnPluginInfo *plugin_info; const char *service_name; NMDevice *device; g_return_val_if_fail (NM_IS_VPN_MANAGER (manager), FALSE); g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), FALSE); g_return_val_if_fail (!error || !*error, FALSE); priv = NM_VPN_MANAGER_GET_PRIVATE (manager); device = nm_active_connection_get_device (NM_ACTIVE_CONNECTION (vpn)); g_assert (device); if ( nm_device_get_state (device) != NM_DEVICE_STATE_ACTIVATED && nm_device_get_state (device) != NM_DEVICE_STATE_SECONDARIES) { g_set_error_literal (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_DEPENDENCY_FAILED, "The base device for the VPN connection was not active."); return FALSE; } service_name = nm_vpn_connection_get_service (vpn); plugin_info = nm_vpn_plugin_info_list_find_by_service (priv->plugins, service_name); if (!plugin_info) { g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_CONNECTION_NOT_AVAILABLE, "The VPN service '%s' was not installed.", service_name); return FALSE; } if ( !nm_vpn_plugin_info_supports_multiple (plugin_info) && g_hash_table_contains (priv->active_services, service_name)) { g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_CONNECTION_NOT_AVAILABLE, "The '%s' plugin only supports a single active connection.", nm_vpn_plugin_info_get_name (plugin_info)); return FALSE; } nm_vpn_connection_activate (vpn, plugin_info); if (!nm_vpn_plugin_info_supports_multiple (plugin_info)) { /* Block activations of the connections of the same service type. */ g_hash_table_add (priv->active_services, g_strdup (service_name)); g_signal_connect (vpn, "notify::" NM_ACTIVE_CONNECTION_STATE, G_CALLBACK (vpn_state_changed), g_object_ref (manager)); } return TRUE; }
/** * nm_vpn_connection_get_banner: * @vpn: a #NMVpnConnection * * Gets the VPN login banner of the active #NMVpnConnection. * * Returns: the VPN login banner of the VPN connection. This is the internal * string used by the connection, and must not be modified. **/ const char * nm_vpn_connection_get_banner (NMVpnConnection *vpn) { NMVpnConnectionPrivate *priv; g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), NULL); priv = NM_VPN_CONNECTION_GET_PRIVATE (vpn); if (priv->vpn_state != NM_VPN_CONNECTION_STATE_ACTIVATED) return NULL; return nm_str_not_empty (priv->banner); }
/** * nm_vpn_connection_get_banner: * @vpn: a #NMVPNConnection * * Gets the VPN login banner of the active #NMVPNConnection. * * Returns: the VPN login banner of the VPN connection. This is the internal * string used by the connection, and must not be modified. **/ const char * nm_vpn_connection_get_banner (NMVPNConnection *vpn) { NMVPNConnectionPrivate *priv; g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), NULL); priv = NM_VPN_CONNECTION_GET_PRIVATE (vpn); /* We need to update vpn_state first in case it's unknown. */ _nm_object_ensure_inited (NM_OBJECT (vpn)); if (priv->vpn_state != NM_VPN_CONNECTION_STATE_ACTIVATED) return NULL; return priv->banner; }
static void detail_vpn (gpointer data, gpointer user_data) { NMActiveConnection *active = NM_ACTIVE_CONNECTION (data); NMConnection *connection; NMSettingConnection *s_con; NMVPNConnectionState state; const char *banner; if (!NM_IS_VPN_CONNECTION (active)) return; connection = get_connection_for_active (active); g_return_if_fail (connection != NULL); s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); g_return_if_fail (s_con != NULL); print_header ("VPN", NULL, nm_setting_connection_get_id (s_con)); state = nm_vpn_connection_get_vpn_state (NM_VPN_CONNECTION (active)); print_string ("State", get_vpn_state_string (state)); if (nm_active_connection_get_default (active)) print_string ("Default", "yes"); else print_string ("Default", "no"); banner = nm_vpn_connection_get_banner (NM_VPN_CONNECTION (active)); if (banner) { char **lines, **iter; printf ("\n Message:\n"); lines = g_strsplit_set (banner, "\n\r", -1); for (iter = lines; *iter; iter++) { if (*iter && strlen (*iter)) printf (" %s\n", *iter); } g_strfreev (lines); } printf ("\n\n"); }
gboolean nm_vpn_manager_activate_connection (NMVpnManager *manager, NMVpnConnection *vpn, GError **error) { NMConnection *connection; NMSettingVpn *s_vpn; NMVpnService *service; const char *service_name; NMDevice *device; g_return_val_if_fail (NM_IS_VPN_MANAGER (manager), FALSE); g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), FALSE); g_return_val_if_fail (error != NULL, FALSE); g_return_val_if_fail (*error == NULL, FALSE); device = nm_active_connection_get_device (NM_ACTIVE_CONNECTION (vpn)); g_assert (device); if ( nm_device_get_state (device) != NM_DEVICE_STATE_ACTIVATED && nm_device_get_state (device) != NM_DEVICE_STATE_SECONDARIES) { g_set_error_literal (error, NM_VPN_MANAGER_ERROR, NM_VPN_MANAGER_ERROR_DEVICE_NOT_ACTIVE, "The base device for the VPN connection was not active."); return FALSE; } connection = nm_active_connection_get_connection (NM_ACTIVE_CONNECTION (vpn)); g_assert (connection); s_vpn = nm_connection_get_setting_vpn (connection); g_assert (s_vpn); service_name = nm_setting_vpn_get_service_type (s_vpn); g_assert (service_name); service = g_hash_table_lookup (NM_VPN_MANAGER_GET_PRIVATE (manager)->services, service_name); if (!service) { g_set_error (error, NM_VPN_MANAGER_ERROR, NM_VPN_MANAGER_ERROR_SERVICE_INVALID, "The VPN service '%s' was not installed.", service_name); return FALSE; } return nm_vpn_service_activate (service, vpn, error); }
static void active_connections_changed (NMClient *client, GParamSpec *pspec, gpointer user_data) { const GPtrArray *connections; int i, j; g_print ("Active connections changed:\n"); connections = nm_client_get_active_connections (client); for (i = 0; connections && (i < connections->len); i++) { NMActiveConnection *connection; const GPtrArray *devices; connection = g_ptr_array_index (connections, i); g_print (" %s\n", nm_object_get_path (NM_OBJECT (connection))); devices = nm_active_connection_get_devices (connection); for (j = 0; devices && j < devices->len; j++) g_print (" %s\n", nm_device_get_udi (g_ptr_array_index (devices, j))); if (NM_IS_VPN_CONNECTION (connection)) g_print (" VPN base connection: %s\n", nm_active_connection_get_specific_object (connection)); } }