diff options
| author | Michael Biebl <biebl@debian.org> | 2019-07-31 10:51:42 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2019-07-31 10:51:42 +0200 |
| commit | 2e5fa45ddfbb5cffa1e78221f1cea706e2f298af (patch) | |
| tree | 86f69d36c56de3074280456eddc854a780b8e04b /libnm-glib | |
| parent | 85563b7fc7ec2cd21e38debb9b28db342e2e8e7c (diff) | |
New upstream version 1.19.90 upstream/1.19.90
Diffstat (limited to 'libnm-glib')
85 files changed, 0 insertions, 28192 deletions
diff --git a/libnm-glib/libnm-glib-test.c b/libnm-glib/libnm-glib-test.c deleted file mode 100644 index 3b1866c5..00000000 --- a/libnm-glib/libnm-glib-test.c +++ /dev/null @@ -1,426 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * libnm_glib -- Access network status & information from glib applications - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright (C) 2007 - 2008 Novell, Inc. - * Copyright (C) 2007 - 2008 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <stdlib.h> -#include <signal.h> -#include <string.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include "nm-client.h" -#include "nm-device.h" -#include "nm-device-ethernet.h" -#include "nm-device-wifi.h" -#include "nm-device-generic.h" -#include "nm-utils.h" -#include "nm-active-connection.h" -#include "nm-vpn-connection.h" -#include "nm-setting-ip4-config.h" - -static gboolean -test_wireless_enabled (NMClient *client) -{ - gboolean wireless; - - wireless = nm_client_wireless_get_enabled (client); - g_print ("Wireless enabled? %s\n", wireless ? "yes" : "no"); - -// nm_client_wireless_set_enabled (client, !wireless); - - wireless = nm_client_wireless_hardware_get_enabled (client); - g_print ("Wireless HW enabled? %s\n", wireless ? "yes" : "no"); - -// nm_client_wireless_set_enabled (client, !wireless); - - return TRUE; -} - -static gboolean -test_get_state (NMClient *client) -{ - guint state; - - state = nm_client_get_state (client); - g_print ("Current state: %d\n", state); - - return TRUE; -} - -static char * -ip4_address_as_string (guint32 ip) -{ - char buf[INET_ADDRSTRLEN+1]; - guint32 tmp_addr; - - memset (&buf, '\0', sizeof (buf)); - tmp_addr = ip; - - if (inet_ntop (AF_INET, &tmp_addr, buf, INET_ADDRSTRLEN)) { - return g_strdup (buf); - } else { - g_warning ("%s: error converting IP4 address 0x%X", - __func__, ntohl (tmp_addr)); - return NULL; - } -} - -static void -dump_ip4_config (NMIP4Config *cfg) -{ - char *tmp; - const GArray *array; - const GPtrArray *ptr_array; - GSList *iter; - int i; - - for (iter = (GSList *) nm_ip4_config_get_addresses (cfg); iter; iter = g_slist_next (iter)) { - NMIP4Address *addr = iter->data; - guint32 u; - - tmp = ip4_address_as_string (nm_ip4_address_get_address (addr)); - g_print ("IP4 address: %s\n", tmp); - g_free (tmp); - - u = nm_ip4_address_get_prefix (addr); - tmp = ip4_address_as_string (nm_utils_ip4_prefix_to_netmask (u)); - g_print ("IP4 prefix: %d (%s)\n", u, tmp); - g_free (tmp); - - tmp = ip4_address_as_string (nm_ip4_address_get_gateway (addr)); - g_print ("IP4 gateway: %s\n\n", tmp); - g_free (tmp); - } - - array = nm_ip4_config_get_nameservers (cfg); - if (array) { - g_print ("IP4 DNS:\n"); - for (i = 0; i < array->len; i++) { - tmp = ip4_address_as_string (g_array_index (array, guint32, i)); - g_print ("\t%s\n", tmp); - g_free (tmp); - } - } - - ptr_array = nm_ip4_config_get_domains (cfg); - if (ptr_array) { - g_print ("IP4 domains:\n"); - for (i = 0; i < ptr_array->len; i++) - g_print ("\t%s\n", (const char *) g_ptr_array_index (ptr_array, i)); - } - - array = nm_ip4_config_get_wins_servers (cfg); - if (array) { - g_print ("IP4 WINS:\n"); - for (i = 0; i < array->len; i++) { - tmp = ip4_address_as_string (g_array_index (array, guint32, i)); - g_print ("\t%s\n", tmp); - g_free (tmp); - } - } -} - -static void -print_one_dhcp4_option (gpointer key, gpointer data, gpointer user_data) -{ - const char *option = (const char *) key; - const char *value = (const char *) data; - - g_print (" %s: %s\n", option, value); -} - -static void -dump_dhcp4_config (NMDHCP4Config *config) -{ - GHashTable *options = NULL; - - if (!config) - return; - - g_print ("\nDHCP4 Options:\n"); - g_print ("-------------------------------------\n"); - - g_object_get (G_OBJECT (config), NM_DHCP4_CONFIG_OPTIONS, &options, NULL); - g_hash_table_foreach (options, print_one_dhcp4_option, NULL); -} - -static void -dump_access_point (NMAccessPoint *ap) -{ - const GByteArray * ssid; - const char * str; - - ssid = nm_access_point_get_ssid (ap); - g_print ("\tSsid: %s\n", - ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(none)"); - - str = nm_access_point_get_bssid (ap); - g_print ("\tMAC Address: %s\n", str); - - g_print ("\tFlags: 0x%X\n", nm_access_point_get_flags (ap)); - g_print ("\tWPA Flags: 0x%X\n", nm_access_point_get_wpa_flags (ap)); - g_print ("\tRSN Flags: 0x%X\n", nm_access_point_get_rsn_flags (ap)); - g_print ("\tFrequency: %u\n", nm_access_point_get_frequency (ap)); - - g_print ("\tMode: %d\n", nm_access_point_get_mode (ap)); - g_print ("\tRate: %d\n", nm_access_point_get_max_bitrate (ap)); - g_print ("\tStrength: %d\n", nm_access_point_get_strength (ap)); -} - -static void -dump_wireless (NMDeviceWifi *device) -{ - const char *str; - const GPtrArray *aps; - int i; - - g_print ("Mode: %d\n", nm_device_wifi_get_mode (device)); - g_print ("Bitrate: %d\n", nm_device_wifi_get_bitrate (device)); - - str = nm_device_wifi_get_hw_address (device); - g_print ("MAC: %s\n", str); - - g_print ("AccessPoints:\n"); - aps = nm_device_wifi_get_access_points (device); - for (i = 0; aps && (i < aps->len); i++) { - dump_access_point (NM_ACCESS_POINT (g_ptr_array_index (aps, i))); - g_print ("\n"); - } -} - -static void -dump_generic (NMDeviceGeneric *device) -{ - g_print ("HW address: %s\n", nm_device_generic_get_hw_address (device)); -} - -static void -dump_wired (NMDeviceEthernet *device) -{ - const char *str; - - g_print ("Speed: %d\n", nm_device_ethernet_get_speed (device)); - - str = nm_device_ethernet_get_hw_address (device); - g_print ("MAC: %s\n", str); -} - -static void -dump_device (NMDevice *device) -{ - const char *str; - NMDeviceState state; - - str = nm_device_get_iface (device); - g_print ("Interface: %s\n", str); - - str = nm_device_get_udi (device); - g_print ("Udi: %s\n", str); - - str = nm_device_get_driver (device); - g_print ("Driver: %s\n", str); - - str = nm_device_get_vendor (device); - g_print ("Vendor: %s\n", str); - - str = nm_device_get_product (device); - g_print ("Product: %s\n", str); - - state = nm_device_get_state (device); - g_print ("State: %d\n", state); - - if (state == NM_DEVICE_STATE_ACTIVATED) - dump_ip4_config (nm_device_get_ip4_config (device)); - - if (NM_IS_DEVICE_ETHERNET (device)) - dump_wired (NM_DEVICE_ETHERNET (device)); - else if (NM_IS_DEVICE_WIFI (device)) - dump_wireless (NM_DEVICE_WIFI (device)); - else if (NM_IS_DEVICE_GENERIC (device)) - dump_generic (NM_DEVICE_GENERIC (device)); - - dump_dhcp4_config (nm_device_get_dhcp4_config (device)); -} - -static gboolean -test_devices (NMClient *client) -{ - const GPtrArray *devices; - int i; - - devices = nm_client_get_devices (client); - g_print ("Got devices:\n"); - if (!devices) { - g_print (" NONE\n"); - return TRUE; - } - - for (i = 0; i < devices->len; i++) { - NMDevice *device = g_ptr_array_index (devices, i); - dump_device (device); - g_print ("\n"); - } - - return TRUE; -} - -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)); - } -} - -static void -show_active_connection_device (gpointer data, gpointer user_data) -{ - NMDevice *device = NM_DEVICE (data); - - g_print (" %s\n", nm_device_get_udi (device)); -} - -static void -test_get_active_connections (NMClient *client) -{ - const GPtrArray *connections; - int i; - - g_print ("Active connections:\n"); - connections = nm_client_get_active_connections (client); - for (i = 0; connections && (i < connections->len); i++) { - const GPtrArray *devices; - - g_print (" %s\n", nm_object_get_path (g_ptr_array_index (connections, i))); - devices = nm_active_connection_get_devices (g_ptr_array_index (connections, i)); - if (devices) - g_ptr_array_foreach ((GPtrArray *) devices, show_active_connection_device, NULL); - } -} - -static void -device_state_changed (NMDevice *device, GParamSpec *pspec, gpointer user_data) -{ - g_print ("Device state changed: %s %d\n", - nm_device_get_iface (device), - nm_device_get_state (device)); -} - -static void -device_added_cb (NMClient *client, NMDevice *device, gpointer user_data) -{ - g_print ("New device added\n"); - dump_device (device); - g_signal_connect (G_OBJECT (device), "notify::state", - (GCallback) device_state_changed, NULL); -} - -static void -device_removed_cb (NMClient *client, NMDevice *device, gpointer user_data) -{ - g_print ("Device removed\n"); - dump_device (device); -} - -static void -manager_running (NMClient *client, GParamSpec *pspec, gpointer user_data) -{ - if (nm_client_get_manager_running (client)) { - g_print ("NM appeared\n"); - test_wireless_enabled (client); - test_get_state (client); - test_get_active_connections (client); - test_devices (client); - } else - g_print ("NM disappeared\n"); -} - -static GMainLoop *loop = NULL; - -static void -signal_handler (int signo) -{ - if (signo == SIGINT || signo == SIGTERM) { - g_message ("Caught signal %d, shutting down...", signo); - g_main_loop_quit (loop); - } -} - -static void -setup_signals (void) -{ - struct sigaction action; - sigset_t mask; - - sigemptyset (&mask); - action.sa_handler = signal_handler; - action.sa_mask = mask; - action.sa_flags = 0; - sigaction (SIGTERM, &action, NULL); - sigaction (SIGINT, &action, NULL); -} - -int -main (int argc, char *argv[]) -{ - NMClient *client; - - client = nm_client_new (); - if (!client) { - exit (1); - } - - g_signal_connect (client, "notify::" NM_CLIENT_MANAGER_RUNNING, - G_CALLBACK (manager_running), NULL); - g_signal_connect (client, "notify::" NM_CLIENT_ACTIVE_CONNECTIONS, - G_CALLBACK (active_connections_changed), NULL); - manager_running (client, NULL, NULL); - - g_signal_connect (client, "device-added", - G_CALLBACK (device_added_cb), NULL); - g_signal_connect (client, "device-removed", - G_CALLBACK (device_removed_cb), NULL); - - loop = g_main_loop_new (NULL, FALSE); - setup_signals (); - g_main_loop_run (loop); - - g_object_unref (client); - - return 0; -} diff --git a/libnm-glib/libnm-glib-vpn.pc.in b/libnm-glib/libnm-glib-vpn.pc.in deleted file mode 100644 index 046f5b07..00000000 --- a/libnm-glib/libnm-glib-vpn.pc.in +++ /dev/null @@ -1,13 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: libnm-glib-vpn -Description: Convenience library for NetworkManager VPN plugins -Version: @VERSION@ -Requires: NetworkManager >= @VERSION@ glib-2.0 dbus-glib-1 -Cflags: -I${includedir}/libnm-glib -Libs: -L${libdir} -lnm-glib-vpn - - diff --git a/libnm-glib/libnm-glib-vpn.ver b/libnm-glib/libnm-glib-vpn.ver deleted file mode 100644 index b2e763b2..00000000 --- a/libnm-glib/libnm-glib-vpn.ver +++ /dev/null @@ -1,29 +0,0 @@ -{ -global: - nm_vpn_plugin_disconnect; - nm_vpn_plugin_error_get_type; - nm_vpn_plugin_error_quark; - nm_vpn_plugin_failure; - nm_vpn_plugin_get_connection; - nm_vpn_plugin_get_state; - nm_vpn_plugin_get_type; - nm_vpn_plugin_secrets_required; - nm_vpn_plugin_set_ip4_config; - nm_vpn_plugin_set_login_banner; - nm_vpn_plugin_set_state; - nm_vpn_plugin_ui_interface_delete_connection; - nm_vpn_plugin_ui_interface_export; - nm_vpn_plugin_ui_interface_get_capabilities; - nm_vpn_plugin_ui_interface_get_suggested_name; - nm_vpn_plugin_ui_interface_get_type; - nm_vpn_plugin_ui_interface_import; - nm_vpn_plugin_ui_interface_ui_factory; - nm_vpn_plugin_ui_widget_interface_get_type; - nm_vpn_plugin_ui_widget_interface_get_widget; - nm_vpn_plugin_ui_widget_interface_save_secrets; - nm_vpn_plugin_ui_widget_interface_update_connection; - nm_vpn_plugin_utils_get_secret_flags; - nm_vpn_plugin_utils_read_vpn_details; -local: - *; -}; diff --git a/libnm-glib/libnm-glib.pc.in b/libnm-glib/libnm-glib.pc.in deleted file mode 100644 index 2b4e6996..00000000 --- a/libnm-glib/libnm-glib.pc.in +++ /dev/null @@ -1,13 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: libnm-glib -Description: Convenience library for clients of NetworkManager -Version: @VERSION@ -Requires: libnm-util >= @VERSION@ NetworkManager >= @VERSION@ gobject-2.0 dbus-glib-1 -Cflags: -I${includedir}/libnm-glib -Libs: -L${libdir} -lnm-glib - - diff --git a/libnm-glib/libnm-glib.ver b/libnm-glib/libnm-glib.ver deleted file mode 100644 index bce31b0b..00000000 --- a/libnm-glib/libnm-glib.ver +++ /dev/null @@ -1,309 +0,0 @@ -{ -global: - libnm_glib_get_network_state; - libnm_glib_init; - libnm_glib_register_callback; - libnm_glib_shutdown; - libnm_glib_unregister_callback; - nm_access_point_connection_valid; - nm_access_point_filter_connections; - nm_access_point_get_bssid; - nm_access_point_get_flags; - nm_access_point_get_frequency; - nm_access_point_get_hw_address; - nm_access_point_get_last_seen; - nm_access_point_get_max_bitrate; - nm_access_point_get_mode; - nm_access_point_get_rsn_flags; - nm_access_point_get_ssid; - nm_access_point_get_strength; - nm_access_point_get_type; - nm_access_point_get_wpa_flags; - nm_access_point_new; - nm_active_connection_get_connection; - nm_active_connection_get_connection_type; - nm_active_connection_get_default6; - nm_active_connection_get_default; - nm_active_connection_get_devices; - nm_active_connection_get_dhcp4_config; - nm_active_connection_get_dhcp6_config; - nm_active_connection_get_id; - nm_active_connection_get_ip4_config; - nm_active_connection_get_ip6_config; - nm_active_connection_get_master; - nm_active_connection_get_specific_object; - nm_active_connection_get_state; - nm_active_connection_get_type; - nm_active_connection_get_uuid; - nm_active_connection_get_vpn; - nm_active_connection_new; - nm_client_activate_connection; - nm_client_add_and_activate_connection; - nm_client_check_connectivity; - nm_client_check_connectivity_async; - nm_client_check_connectivity_finish; - nm_client_deactivate_connection; - nm_client_error_get_type; - nm_client_error_quark; - nm_client_get_activating_connection; - nm_client_get_active_connections; - nm_client_get_all_devices; - nm_client_get_connectivity; - nm_client_get_device_by_iface; - nm_client_get_device_by_path; - nm_client_get_devices; - nm_client_get_logging; - nm_client_get_manager_running; - nm_client_get_permission_result; - nm_client_get_primary_connection; - nm_client_get_startup; - nm_client_get_state; - nm_client_get_type; - nm_client_get_version; - nm_client_networking_get_enabled; - nm_client_networking_set_enabled; - nm_client_new; - nm_client_new_async; - nm_client_new_finish; - nm_client_permission_get_type; - nm_client_permission_result_get_type; - nm_client_set_logging; - nm_client_sleep; - nm_client_wimax_get_enabled; - nm_client_wimax_hardware_get_enabled; - nm_client_wimax_set_enabled; - nm_client_wireless_get_enabled; - nm_client_wireless_hardware_get_enabled; - nm_client_wireless_set_enabled; - nm_client_wwan_get_enabled; - nm_client_wwan_hardware_get_enabled; - nm_client_wwan_set_enabled; - nm_device_adsl_error_get_type; - nm_device_adsl_error_quark; - nm_device_adsl_get_carrier; - nm_device_adsl_get_type; - nm_device_adsl_new; - nm_device_bond_error_get_type; - nm_device_bond_error_quark; - nm_device_bond_get_carrier; - nm_device_bond_get_hw_address; - nm_device_bond_get_slaves; - nm_device_bond_get_type; - nm_device_bond_new; - nm_device_bridge_error_get_type; - nm_device_bridge_error_quark; - nm_device_bridge_get_carrier; - nm_device_bridge_get_hw_address; - nm_device_bridge_get_slaves; - nm_device_bridge_get_type; - nm_device_bridge_new; - nm_device_bt_error_get_type; - nm_device_bt_error_quark; - nm_device_bt_get_capabilities; - nm_device_bt_get_hw_address; - nm_device_bt_get_name; - nm_device_bt_get_type; - nm_device_bt_new; - nm_device_connection_compatible; - nm_device_connection_valid; - nm_device_delete; - nm_device_disambiguate_names; - nm_device_disconnect; - nm_device_error_get_type; - nm_device_error_quark; - nm_device_ethernet_error_get_type; - nm_device_ethernet_error_quark; - nm_device_ethernet_get_carrier; - nm_device_ethernet_get_hw_address; - nm_device_ethernet_get_permanent_hw_address; - nm_device_ethernet_get_speed; - nm_device_ethernet_get_type; - nm_device_ethernet_new; - nm_device_filter_connections; - nm_device_generic_error_get_type; - nm_device_generic_error_quark; - nm_device_generic_get_hw_address; - nm_device_generic_get_type; - nm_device_generic_new; - nm_device_get_active_connection; - nm_device_get_autoconnect; - nm_device_get_available_connections; - nm_device_get_capabilities; - nm_device_get_description; - nm_device_get_device_type; - nm_device_get_dhcp4_config; - nm_device_get_dhcp6_config; - nm_device_get_driver; - nm_device_get_driver_version; - nm_device_get_firmware_missing; - nm_device_get_firmware_version; - nm_device_get_hw_address; - nm_device_get_iface; - nm_device_get_ip4_config; - nm_device_get_ip6_config; - nm_device_get_ip_iface; - nm_device_get_managed; - nm_device_get_mtu; - nm_device_get_physical_port_id; - nm_device_get_product; - nm_device_get_setting_type; - nm_device_get_state; - nm_device_get_state_reason; - nm_device_get_type; - nm_device_get_type_description; - nm_device_get_udi; - nm_device_get_vendor; - nm_device_infiniband_error_get_type; - nm_device_infiniband_error_quark; - nm_device_infiniband_get_carrier; - nm_device_infiniband_get_hw_address; - nm_device_infiniband_get_type; - nm_device_infiniband_new; - nm_device_is_real; - nm_device_is_software; - nm_device_modem_error_get_type; - nm_device_modem_error_quark; - nm_device_modem_get_current_capabilities; - nm_device_modem_get_modem_capabilities; - nm_device_modem_get_type; - nm_device_new; - nm_device_olpc_mesh_error_get_type; - nm_device_olpc_mesh_error_quark; - nm_device_olpc_mesh_get_active_channel; - nm_device_olpc_mesh_get_companion; - nm_device_olpc_mesh_get_hw_address; - nm_device_olpc_mesh_get_type; - nm_device_olpc_mesh_new; - nm_device_set_autoconnect; - nm_device_set_managed; - nm_device_team_error_get_type; - nm_device_team_error_quark; - nm_device_team_get_carrier; - nm_device_team_get_hw_address; - nm_device_team_get_slaves; - nm_device_team_get_type; - nm_device_team_new; - nm_device_vlan_error_get_type; - nm_device_vlan_error_quark; - nm_device_vlan_get_carrier; - nm_device_vlan_get_hw_address; - nm_device_vlan_get_parent; - nm_device_vlan_get_type; - nm_device_vlan_get_vlan_id; - nm_device_vlan_new; - nm_device_wifi_error_get_type; - nm_device_wifi_error_quark; - nm_device_wifi_get_access_point_by_path; - nm_device_wifi_get_access_points; - nm_device_wifi_get_active_access_point; - nm_device_wifi_get_bitrate; - nm_device_wifi_get_capabilities; - nm_device_wifi_get_hw_address; - nm_device_wifi_get_mode; - nm_device_wifi_get_permanent_hw_address; - nm_device_wifi_get_type; - nm_device_wifi_new; - nm_device_wifi_request_scan_simple; - nm_device_wimax_error_get_type; - nm_device_wimax_error_quark; - nm_device_wimax_get_active_nsp; - nm_device_wimax_get_bsid; - nm_device_wimax_get_center_frequency; - nm_device_wimax_get_cinr; - nm_device_wimax_get_hw_address; - nm_device_wimax_get_nsp_by_path; - nm_device_wimax_get_nsps; - nm_device_wimax_get_rssi; - nm_device_wimax_get_tx_power; - nm_device_wimax_get_type; - nm_device_wimax_new; - nm_dhcp4_config_get_one_option; - nm_dhcp4_config_get_options; - nm_dhcp4_config_get_type; - nm_dhcp4_config_new; - nm_dhcp6_config_get_one_option; - nm_dhcp6_config_get_options; - nm_dhcp6_config_get_type; - nm_dhcp6_config_new; - nm_ip4_config_get_addresses; - nm_ip4_config_get_domains; - nm_ip4_config_get_gateway; - nm_ip4_config_get_nameservers; - nm_ip4_config_get_routes; - nm_ip4_config_get_searches; - nm_ip4_config_get_type; - nm_ip4_config_get_wins_servers; - nm_ip4_config_new; - nm_ip6_address_array_get_type; - nm_ip6_address_object_array_get_type; - nm_ip6_config_get_addresses; - nm_ip6_config_get_domains; - nm_ip6_config_get_gateway; - nm_ip6_config_get_nameserver; - nm_ip6_config_get_nameservers; - nm_ip6_config_get_num_nameservers; - nm_ip6_config_get_routes; - nm_ip6_config_get_searches; - nm_ip6_config_get_type; - nm_ip6_config_new; - nm_ip6_route_object_array_get_type; - nm_object_array_get_type; - nm_object_error_get_type; - nm_object_error_quark; - nm_object_get_connection; - nm_object_get_path; - nm_object_get_type; - nm_remote_connection_commit_changes; - nm_remote_connection_commit_changes_unsaved; - nm_remote_connection_delete; - nm_remote_connection_error_get_type; - nm_remote_connection_error_quark; - nm_remote_connection_get_secrets; - nm_remote_connection_get_type; - nm_remote_connection_get_unsaved; - nm_remote_connection_new; - nm_remote_connection_save; - nm_remote_settings_add_connection; - nm_remote_settings_add_connection_unsaved; - nm_remote_settings_error_get_type; - nm_remote_settings_error_quark; - nm_remote_settings_get_connection_by_id; - nm_remote_settings_get_connection_by_path; - nm_remote_settings_get_connection_by_uuid; - nm_remote_settings_get_type; - nm_remote_settings_list_connections; - nm_remote_settings_load_connections; - nm_remote_settings_new; - nm_remote_settings_new_async; - nm_remote_settings_new_finish; - nm_remote_settings_reload_connections; - nm_remote_settings_save_hostname; - nm_secret_agent_capabilities_get_type; - nm_secret_agent_delete_secrets; - nm_secret_agent_error_get_type; - nm_secret_agent_error_quark; - nm_secret_agent_get_registered; - nm_secret_agent_get_secrets; - nm_secret_agent_get_secrets_flags_get_type; - nm_secret_agent_get_type; - nm_secret_agent_register; - nm_secret_agent_save_secrets; - nm_secret_agent_unregister; - nm_ssid_get_type; - nm_string_array_get_type; - nm_uint_array_get_type; - nm_vpn_connection_get_banner; - nm_vpn_connection_get_type; - nm_vpn_connection_get_vpn_state; - nm_vpn_connection_new; - nm_wimax_nsp_connection_valid; - nm_wimax_nsp_filter_connections; - nm_wimax_nsp_get_name; - nm_wimax_nsp_get_network_type; - nm_wimax_nsp_get_signal_quality; - nm_wimax_nsp_get_type; - nm_wimax_nsp_network_type_get_type; - nm_wimax_nsp_new; -local: - *; -}; diff --git a/libnm-glib/libnm_glib.c b/libnm-glib/libnm_glib.c deleted file mode 100644 index 1e0725ca..00000000 --- a/libnm-glib/libnm_glib.c +++ /dev/null @@ -1,580 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * libnm_glib -- Access network status & information from glib applications - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright (C) 2005 - 2008 Red Hat, Inc. - * Copyright (C) 2005 - 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <dbus/dbus.h> -#include <dbus/dbus-glib-lowlevel.h> - -#include "NetworkManager.h" -#include "libnm_glib.h" - -#define DBUS_NO_SERVICE_ERROR "org.freedesktop.DBus.Error.ServiceDoesNotExist" - -struct libnm_glib_ctx -{ - unsigned char check; - - GMainContext * g_main_ctx; - GMainLoop * g_main_loop; - DBusConnection * dbus_con; - guint dbus_watcher; - guint dbus_watch_interval; - - gboolean thread_done; - gboolean thread_inited; - GThread * thread; - - GSList * callbacks; - GMutex * callbacks_lock; - guint callback_id_last; - - libnm_glib_state nm_state; -}; - -typedef struct libnm_glib_callback -{ - guint id; - GMainContext * gmain_ctx; - libnm_glib_ctx * libnm_glib_ctx; - libnm_glib_callback_func func; - gpointer user_data; -} libnm_glib_callback; - -static void _libnm_glib_schedule_dbus_watcher (libnm_glib_ctx *ctx); -static DBusConnection * _libnm_glib_dbus_init (gpointer *user_data, GMainContext *context); -static void _libnm_glib_update_state (libnm_glib_ctx *ctx, NMState state); - -static void -_libnm_glib_nm_state_cb (DBusPendingCall *pcall, void *user_data) -{ - DBusMessage *reply; - libnm_glib_ctx *ctx = (libnm_glib_ctx *) user_data; - NMState nm_state; - - g_return_if_fail (pcall != NULL); - g_return_if_fail (ctx != NULL); - - if (!(reply = dbus_pending_call_steal_reply (pcall))) - goto out; - - if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR) - { - DBusError err; - - dbus_error_init (&err); - dbus_set_error_from_message (&err, reply); - fprintf (stderr, "%s: dbus returned an error.\n (%s) %s\n", __func__, err.name, err.message); - dbus_error_free (&err); - dbus_message_unref (reply); - goto out; - } - - if (dbus_message_get_args (reply, NULL, DBUS_TYPE_UINT32, &nm_state, DBUS_TYPE_INVALID)) - _libnm_glib_update_state (ctx, nm_state); - - dbus_message_unref (reply); - -out: - dbus_pending_call_unref (pcall); -} - -static void -_libnm_glib_get_nm_state (libnm_glib_ctx *ctx) -{ - DBusMessage *message; - DBusPendingCall *pcall = NULL; - - g_return_if_fail (ctx != NULL); - - if ((message = dbus_message_new_method_call (NM_DBUS_SERVICE, NM_DBUS_PATH, NM_DBUS_INTERFACE, "state"))) - { - dbus_connection_send_with_reply (ctx->dbus_con, message, &pcall, -1); - if (pcall) - dbus_pending_call_set_notify (pcall, _libnm_glib_nm_state_cb, ctx, NULL); - dbus_message_unref (message); - } -} - -static gboolean -_libnm_glib_callback_helper (gpointer user_data) -{ - libnm_glib_callback *cb_data = (libnm_glib_callback *)user_data; - - g_return_val_if_fail (cb_data != NULL, FALSE); - g_return_val_if_fail (cb_data->func != NULL, FALSE); - g_return_val_if_fail (cb_data->libnm_glib_ctx != NULL, FALSE); - - (*(cb_data->func)) (cb_data->libnm_glib_ctx, cb_data->user_data); - - return FALSE; -} - -static void -_libnm_glib_schedule_single_callback (libnm_glib_ctx *ctx, - libnm_glib_callback *callback) -{ - GSource *source; - - g_return_if_fail (ctx != NULL); - g_return_if_fail (callback != NULL); - - callback->libnm_glib_ctx = ctx; - - source = g_idle_source_new (); - g_source_set_callback (source, _libnm_glib_callback_helper, callback, NULL); - g_source_attach (source, callback->gmain_ctx); - g_source_unref (source); -} - -static void -_libnm_glib_unschedule_single_callback (libnm_glib_ctx *ctx, - libnm_glib_callback *callback) -{ - GSource *source; - - g_return_if_fail (ctx != NULL); - g_return_if_fail (callback != NULL); - - source = g_main_context_find_source_by_user_data (callback->gmain_ctx, callback); - if (source) - g_source_destroy (source); -} - -static void -_libnm_glib_call_callbacks (libnm_glib_ctx *ctx) -{ - GSList *elem; - - g_return_if_fail (ctx != NULL); - - g_mutex_lock (ctx->callbacks_lock); - for (elem = ctx->callbacks; elem; elem = g_slist_next (elem)) - { - libnm_glib_callback *callback = (libnm_glib_callback *)(elem->data); - if (callback) - _libnm_glib_schedule_single_callback (ctx, callback); - } - g_mutex_unlock (ctx->callbacks_lock); -} - -static void -_libnm_glib_update_state (libnm_glib_ctx *ctx, NMState state) -{ - libnm_glib_state old_state; - - g_return_if_fail (ctx != NULL); - - old_state = ctx->nm_state; - switch (state) { - case NM_STATE_CONNECTED_LOCAL: - case NM_STATE_CONNECTED_SITE: - case NM_STATE_CONNECTED_GLOBAL: - ctx->nm_state = LIBNM_ACTIVE_NETWORK_CONNECTION; - break; - case NM_STATE_ASLEEP: - case NM_STATE_CONNECTING: - case NM_STATE_DISCONNECTED: - case NM_STATE_DISCONNECTING: - ctx->nm_state = LIBNM_NO_NETWORK_CONNECTION; - break; - case NM_STATE_UNKNOWN: - default: - ctx->nm_state = LIBNM_NO_NETWORKMANAGER; - break; - } - - if (old_state != ctx->nm_state) - _libnm_glib_call_callbacks (ctx); -} - -static DBusHandlerResult -_libnm_glib_dbus_filter (DBusConnection *connection, - DBusMessage *message, - void *user_data) -{ - libnm_glib_ctx *ctx = (libnm_glib_ctx *)user_data; - gboolean handled = TRUE; - DBusError error; - - g_return_val_if_fail (ctx != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); - g_return_val_if_fail (connection != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); - g_return_val_if_fail (message != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); - - dbus_error_init (&error); - if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")) - { - /* Try to reactivate our connection to dbus on the next pass through the event loop */ - ctx->nm_state = LIBNM_NO_DBUS; - dbus_connection_close (ctx->dbus_con); - dbus_connection_unref (ctx->dbus_con); - ctx->dbus_con = NULL; - _libnm_glib_schedule_dbus_watcher (ctx); - } - else if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) - { - /* New signal for dbus 0.23... */ - char *service; - char *old_owner; - char *new_owner; - - if ( dbus_message_get_args (message, &error, - DBUS_TYPE_STRING, &service, - DBUS_TYPE_STRING, &old_owner, - DBUS_TYPE_STRING, &new_owner, - DBUS_TYPE_INVALID)) - { - if (strcmp (service, NM_DBUS_SERVICE) == 0) - { - gboolean old_owner_good = (old_owner && (strlen (old_owner) > 0)); - gboolean new_owner_good = (new_owner && (strlen (new_owner) > 0)); - - if (!old_owner_good && new_owner_good) /* Equivalent to old ServiceCreated signal */ - _libnm_glib_get_nm_state (ctx); - else if (old_owner_good && !new_owner_good) /* Equivalent to old ServiceDeleted signal */ - ctx->nm_state = LIBNM_NO_NETWORKMANAGER; - } - } - } - else if ( dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNowActive") - || dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNoLongerActive") - || dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceActivating") - || dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DevicesChanged")) - { - _libnm_glib_get_nm_state (ctx); - } - else if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "StateChanged")) - { - NMState state = NM_STATE_UNKNOWN; - - dbus_message_get_args (message, &error, DBUS_TYPE_UINT32, &state, DBUS_TYPE_INVALID); - _libnm_glib_update_state (ctx, state); - } - else - handled = FALSE; - - if (dbus_error_is_set (&error)) - dbus_error_free (&error); - - return (handled ? DBUS_HANDLER_RESULT_HANDLED : DBUS_HANDLER_RESULT_NOT_YET_HANDLED); -} - -/* - * libnm_glib_dbus_init - * - * Initialize a connection to dbus and set up our callbacks. - * - */ -static DBusConnection * -_libnm_glib_dbus_init (gpointer *user_data, GMainContext *context) -{ - DBusConnection *connection = NULL; - DBusError error; - - dbus_error_init (&error); - connection = dbus_bus_get_private (DBUS_BUS_SYSTEM, &error); - if (dbus_error_is_set (&error)) - { - fprintf (stderr, "%s: error, %s raised:\n %s\n\n", __func__, error.name, error.message); - dbus_error_free (&error); - return (NULL); - } - if (!connection) - return NULL; - - if (!dbus_connection_add_filter (connection, _libnm_glib_dbus_filter, user_data, NULL)) - return (NULL); - - dbus_connection_set_exit_on_disconnect (connection, FALSE); - dbus_connection_setup_with_g_main (connection, context); - - dbus_error_init (&error); - dbus_bus_add_match (connection, - "type='signal'," - "interface='" DBUS_INTERFACE_DBUS "'," - "sender='" DBUS_SERVICE_DBUS "'", - &error); - if (dbus_error_is_set (&error)) - dbus_error_free (&error); - - dbus_error_init (&error); - dbus_bus_add_match (connection, - "type='signal'," - "interface='" NM_DBUS_INTERFACE "'," - "path='" NM_DBUS_PATH "'," - "sender='" NM_DBUS_SERVICE "'", - &error); - if (dbus_error_is_set (&error)) - dbus_error_free (&error); - - return (connection); -} - -/* - * libnm_glib_dbus_watcher - * - * Repeatedly try to re-activate the connection to dbus. - * - */ -static gboolean -_libnm_glib_dbus_watcher (gpointer user_data) -{ - libnm_glib_ctx *ctx = (libnm_glib_ctx *)user_data; - - g_return_val_if_fail (ctx != NULL, FALSE); - - ctx->dbus_watcher = 0; - - if (!ctx->dbus_con) - ctx->dbus_con = _libnm_glib_dbus_init ((gpointer)ctx, ctx->g_main_ctx); - - if (ctx->dbus_con) - { - /* Get NM's state right away after we reconnect */ - _libnm_glib_get_nm_state (ctx); - ctx->dbus_watch_interval = 1000; - } - else - { - /* Wait 3 seconds longer each time we fail to reconnect to dbus, - * with a maximum wait of one minute. - */ - ctx->dbus_watch_interval = MIN(ctx->dbus_watch_interval + 3000, 60000); - - /* Reschule ourselves if we _still_ don't have a connection to dbus */ - _libnm_glib_schedule_dbus_watcher (ctx); - } - - return FALSE; -} - -/* - * libnm_glib_schedule_dbus_watcher - * - * Schedule an idle handler in our main loop to repeatedly - * attempt to re-activate the dbus connection until connected. - * - */ -static void -_libnm_glib_schedule_dbus_watcher (libnm_glib_ctx *ctx) -{ - g_return_if_fail (ctx != NULL); - - if (ctx->dbus_watcher == 0) - { - GSource *source = g_timeout_source_new (ctx->dbus_watch_interval); - g_source_set_callback (source, _libnm_glib_dbus_watcher, (gpointer) ctx, NULL); - ctx->dbus_watcher = g_source_attach (source, ctx->g_main_ctx); - g_source_unref (source); - } -} - -/* - * libnm_glib_dbus_worker - * - * Main thread for libnm - * - */ -static gpointer -_libnm_glib_dbus_worker (gpointer user_data) -{ - libnm_glib_ctx *ctx = (libnm_glib_ctx *)user_data; - - g_return_val_if_fail (ctx != NULL, NULL); - - /* If dbus isn't up yet, schedule an idle handler to check for dbus. - * We also need a way to reconnect to dbus if the connection ever goes - * down. Should probably be done by a timeout polling dbus_connection_is_connected() - * or by getting connection status out of libdbus or something. - */ - if (!(ctx->dbus_con = _libnm_glib_dbus_init ((gpointer) ctx, ctx->g_main_ctx))) - _libnm_glib_schedule_dbus_watcher (ctx); - else - _libnm_glib_get_nm_state (ctx); - - ctx->thread_inited = TRUE; - g_main_loop_run (ctx->g_main_loop); - ctx->thread_done = TRUE; - - return NULL; -} - -static void -_libnm_glib_ctx_free (libnm_glib_ctx *ctx) -{ - g_return_if_fail (ctx != NULL); - - if (ctx->check == 0xDD) - { - fprintf (stderr, "%s: context %p already freed!\n", __func__, ctx); - return; - } - - if (ctx->g_main_ctx) - g_main_context_unref (ctx->g_main_ctx); - if (ctx->g_main_loop) - g_main_loop_unref (ctx->g_main_loop); - - if (ctx->dbus_con) - { - dbus_connection_close (ctx->dbus_con); - dbus_connection_unref (ctx->dbus_con); - ctx->dbus_con = NULL; - } - - if (ctx->callbacks_lock) - g_mutex_free (ctx->callbacks_lock); - - g_slist_free_full (ctx->callbacks, g_free); - - if (ctx->thread) - g_thread_join (ctx->thread); - - memset (ctx, 0, sizeof (libnm_glib_ctx)); - memset (&(ctx->check), 0xDD, sizeof (ctx->check)); - g_free (ctx); -} - -static libnm_glib_ctx * -_libnm_glib_ctx_new (void) -{ - libnm_glib_ctx *ctx = g_malloc0 (sizeof (libnm_glib_ctx)); - - if (!(ctx->g_main_ctx = g_main_context_new ())) - goto error; - if (!(ctx->g_main_loop = g_main_loop_new (ctx->g_main_ctx, FALSE))) - goto error; - if (!(ctx->callbacks_lock = g_mutex_new ())) - goto error; - ctx->dbus_watch_interval = 1000; - - return ctx; - -error: - _libnm_glib_ctx_free (ctx); - return NULL; -} - -libnm_glib_ctx * -libnm_glib_init (void) -{ - libnm_glib_ctx *ctx = NULL; - - if (!g_thread_supported ()) - g_thread_init (NULL); - dbus_g_thread_init (); - - if (!(ctx = _libnm_glib_ctx_new ())) - return NULL; - - ctx->thread = g_thread_create (_libnm_glib_dbus_worker, ctx, TRUE, NULL); - if (!ctx->thread) - goto error; - - /* Wait until initialization of the thread */ - while (!ctx->thread_inited) - g_usleep (G_USEC_PER_SEC / 20); - - return ctx; - -error: - _libnm_glib_ctx_free (ctx); - return NULL; -} - -void -libnm_glib_shutdown (libnm_glib_ctx *ctx) -{ - g_return_if_fail (ctx != NULL); - - g_main_loop_quit (ctx->g_main_loop); - while (!ctx->thread_done) - g_usleep (G_USEC_PER_SEC / 20); - - _libnm_glib_ctx_free (ctx); -} - -libnm_glib_state -libnm_glib_get_network_state (const libnm_glib_ctx *ctx) -{ - if (!ctx) - return LIBNM_INVALID_CONTEXT; - - return ctx->nm_state; -} - -guint -libnm_glib_register_callback (libnm_glib_ctx *ctx, - libnm_glib_callback_func func, - gpointer user_data, - GMainContext *g_main_ctx) -{ - libnm_glib_callback *callback = NULL; - - g_return_val_if_fail (ctx != NULL, 0); - g_return_val_if_fail (func != NULL, 0); - - callback = g_malloc0 (sizeof (libnm_glib_callback)); - - callback->id = ++ (ctx->callback_id_last); - callback->func = func; - callback->gmain_ctx = g_main_ctx; - callback->libnm_glib_ctx = ctx; - callback->user_data = user_data; - - g_mutex_lock (ctx->callbacks_lock); - ctx->callbacks = g_slist_append (ctx->callbacks, callback); - _libnm_glib_schedule_single_callback (ctx, callback); - g_mutex_unlock (ctx->callbacks_lock); - - return (callback->id); -} - -void -libnm_glib_unregister_callback (libnm_glib_ctx *ctx, - guint id) -{ - GSList *elem; - - g_return_if_fail (ctx != NULL); - g_return_if_fail (id > 0); - - g_mutex_lock (ctx->callbacks_lock); - elem = ctx->callbacks; - while (elem) - { - libnm_glib_callback *callback = (libnm_glib_callback *)(elem->data); - if (callback && (callback->id == id)) - { - _libnm_glib_unschedule_single_callback (ctx, callback); - ctx->callbacks = g_slist_remove_link (ctx->callbacks, elem); - break; - } - - elem = g_slist_next (elem); - } - g_mutex_unlock (ctx->callbacks_lock); -} diff --git a/libnm-glib/libnm_glib.h b/libnm-glib/libnm_glib.h deleted file mode 100644 index 4137a8ca..00000000 --- a/libnm-glib/libnm_glib.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * libnm_glib -- Access network status & information from glib applications - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright (C) 2005 - 2008 Red Hat, Inc. - * Copyright (C) 2005 - 2008 Novell, Inc. - */ - -#ifndef _LIB_NM_H_ -#define _LIB_NM_H_ - -#ifndef NM_DISABLE_DEPRECATED - -#include <glib.h> - -G_BEGIN_DECLS - -typedef enum libnm_glib_state -{ - LIBNM_NO_DBUS = 0, - LIBNM_NO_NETWORKMANAGER, - LIBNM_NO_NETWORK_CONNECTION, - LIBNM_ACTIVE_NETWORK_CONNECTION, - LIBNM_INVALID_CONTEXT -} libnm_glib_state G_GNUC_DEPRECATED; - -typedef struct libnm_glib_ctx libnm_glib_ctx G_GNUC_DEPRECATED; - -typedef void (*libnm_glib_callback_func) (libnm_glib_ctx *libnm_ctx, gpointer user_data) G_GNUC_DEPRECATED; - -G_GNUC_DEPRECATED libnm_glib_ctx * libnm_glib_init (void); -G_GNUC_DEPRECATED void libnm_glib_shutdown (libnm_glib_ctx *ctx); - -G_GNUC_DEPRECATED libnm_glib_state libnm_glib_get_network_state (const libnm_glib_ctx *ctx); - -G_GNUC_DEPRECATED guint libnm_glib_register_callback (libnm_glib_ctx *ctx, libnm_glib_callback_func func, gpointer user_data, GMainContext *g_main_ctx); -G_GNUC_DEPRECATED void libnm_glib_unregister_callback (libnm_glib_ctx *ctx, guint id); - -G_END_DECLS - -#endif /* NM_DISABLE_DEPRECATED */ - -#endif /* _LIB_NM_H_ */ diff --git a/libnm-glib/meson.build b/libnm-glib/meson.build deleted file mode 100644 index 5f08141e..00000000 --- a/libnm-glib/meson.build +++ /dev/null @@ -1,286 +0,0 @@ -libnm_glib_inc = include_directories('.') - -dbus_binding_tool = find_program('dbus-binding-tool') - -common_deps = [ - dbus_dep, - dbus_glib_dep, - shared_nm_glib_aux_dep, -] - -common_cflags = [ - '-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_LIBNM_GLIB', -] - -cflags = common_cflags + [ - '-DG_LOG_DOMAIN="@0@"'.format(libnm_glib_name), -] - -vpn_headers = files( - 'nm-vpn-plugin.h', - 'nm-vpn-plugin-ui-interface.h', - 'nm-vpn-plugin-utils.h', -) - -headers = files( - 'nm-access-point.h', - 'nm-active-connection.h', - 'nm-client.h', - 'nm-device-adsl.h', - 'nm-device-bond.h', - 'nm-device-bridge.h', - 'nm-device-bt.h', - 'nm-device-ethernet.h', - 'nm-device-generic.h', - 'nm-device.h', - 'nm-device-infiniband.h', - 'nm-device-modem.h', - 'nm-device-olpc-mesh.h', - 'nm-device-team.h', - 'nm-device-vlan.h', - 'nm-device-wifi.h', - 'nm-device-wimax.h', - 'nm-dhcp4-config.h', - 'nm-dhcp6-config.h', - 'nm-ip4-config.h', - 'nm-ip6-config.h', - 'nm-object.h', - 'nm-remote-connection.h', - 'nm-remote-settings.h', - 'nm-secret-agent.h', - 'nm-types.h', - 'nm-vpn-connection.h', - 'nm-wimax-nsp.h', -) - -deprecated_headers = files('libnm_glib.h') - -install_headers( - headers + vpn_headers + deprecated_headers, - subdir: libnm_glib_name, -) - -libdeprecated_nm_glib = static_library( - 'deprecated-nm-glib', - sources: 'libnm_glib.c', - include_directories: libnm_util_inc, - dependencies: common_deps, - c_args: cflags + [ - '-Wno-deprecated-declarations', - '-Wno-deprecated', - ], -) - -sources = files( - 'nm-vpn-plugin.c', - 'nm-vpn-plugin-ui-interface.c', - 'nm-vpn-plugin-utils.c', -) - -glue = 'nm-vpn-plugin-glue.h' - -enum_types = 'nm-vpn-enum-types' - -libnm_glib_vpn_enum = gnome.mkenums( - enum_types, - sources: vpn_headers, - identifier_prefix: nm_id_prefix, - c_template: enum_types + '.c.template', - h_template: enum_types + '.h.template', - install_header: true, - install_dir: libnm_glib_pkgincludedir, -) - -linker_script = join_paths(meson.current_source_dir(), 'libnm-glib-vpn.ver') - -libnm_glib_vpn = shared_library( - 'nm-glib-vpn', - sources: files( - 'nm-vpn-plugin.c', - 'nm-vpn-plugin-ui-interface.c', - 'nm-vpn-plugin-utils.c', - ) + [ - custom_target( - glue, - input: ifaces_vpn_plugin_xml, - output: glue, - command: [dbus_binding_tool, '--prefix=nm_vpn_plugin', '--mode=glib-server', '--output=@OUTPUT@', '@INPUT@'], - ), - ] + libnm_glib_vpn_enum, - version: libnm_glib_vpn_version, - dependencies: common_deps + [libnm_util_dep], - c_args: cflags, - link_args: [ - '-Wl,--version-script,@0@'.format(linker_script), - ], - link_depends: linker_script, - install: true, -) - -libnm_glib_vpn_dep = declare_dependency( - include_directories: libnm_glib_inc, - link_with: libnm_glib_vpn, -) - -pkg.generate( - libraries: libnm_glib_vpn, - version: nm_version, - name: libnm_glib_vpn_name, - description: 'Convenience library for NetworkManager VPN plugins', - filebase: libnm_glib_vpn_name, - subdirs: libnm_glib_name, - requires: 'NetworkManager >= ' + nm_version + ' glib-2.0 dbus-glib-1', - variables: 'exec_prefix=${prefix}', -) - -libnm_glib_sources = files( - 'nm-access-point.c', - 'nm-active-connection.c', - 'nm-client.c', - 'nm-dbus-helpers.c', - 'nm-device-adsl.c', - 'nm-device-bond.c', - 'nm-device-bridge.c', - 'nm-device-bt.c', - 'nm-device.c', - 'nm-device-ethernet.c', - 'nm-device-generic.c', - 'nm-device-infiniband.c', - 'nm-device-olpc-mesh.c', - 'nm-device-modem.c', - 'nm-device-team.c', - 'nm-device-vlan.c', - 'nm-device-wifi.c', - 'nm-device-wimax.c', - 'nm-dhcp4-config.c', - 'nm-dhcp6-config.c', - 'nm-ip4-config.c', - 'nm-ip6-config.c', - 'nm-object.c', - 'nm-object-cache.c', - 'nm-remote-connection.c', - 'nm-remote-settings.c', - 'nm-secret-agent.c', - 'nm-types.c', - 'nm-vpn-connection.c', - 'nm-wimax-nsp.c', -) - -glue = 'nm-secret-agent-glue.h' - -nm_secret_agent_glue = custom_target( - glue, - input: ifaces_secret_agent_xml, - output: glue, - command: [dbus_binding_tool, '--prefix=nm_secret_agent', '--mode=glib-server', '--output=@OUTPUT@', '@INPUT@'], -) - -enum_types = 'nm-glib-enum-types' - -libnm_glib_enum = gnome.mkenums( - enum_types, - sources: headers, - identifier_prefix: nm_id_prefix, - c_template: enum_types + '.c.template', - h_template: enum_types + '.h.template', - install_header: true, - install_dir: libnm_glib_pkgincludedir, -) - -linker_script = join_paths(meson.current_source_dir(), 'libnm-glib.ver') - -libnm_glib = shared_library( - 'nm-glib', - sources: libnm_glib_sources + libnm_glib_enum + [nm_secret_agent_glue], - version: libnm_glib_version, - dependencies: common_deps + [ - libnm_util_dep, - libudev_dep, - shared_nm_udev_aux_dep, - ], - c_args: cflags, - link_whole: libdeprecated_nm_glib, - link_args: [ - '-Wl,--version-script,@0@'.format(linker_script), - ], - link_depends: linker_script, - install: true, -) - -libnm_glib_dep = declare_dependency( - include_directories: libnm_glib_inc, - link_with: libnm_glib, -) - -pkg.generate( - libraries: libnm_glib, - version: nm_version, - name: libnm_glib_name, - description: 'Convenience library for clients of NetworkManager', - filebase: libnm_glib_name, - subdirs: libnm_glib_name, - requires: 'libnm-util >= ' + nm_version + ' NetworkManager >= ' + nm_version + ' gobject-2.0 dbus-glib-1', - variables: 'exec_prefix=${prefix}', -) - -if enable_introspection - gir_sources = libnm_glib_sources + headers + libnm_glib_enum - - libnm_glib_gir = gnome.generate_gir( - libnm_glib, - sources: gir_sources, - dependencies: [ - dbus_glib_dep, - libnm_glib_dep, - libnm_util_gir_dep, - ], - nsversion: nm_gir_version, - namespace: 'NMClient', - identifier_prefix: nm_id_prefix, - symbol_prefix: nm_id_prefix.to_lower(), - export_packages: [libnm_glib_name, libnm_glib_vpn_name], - includes: [ - 'DBusGLib-1.0', - 'Gio-2.0', - ], - extra_args: cflags + [ - '--include-uninstalled=' + libnm_util_gir[0].full_path(), - ], - install: true, - ) -endif - -name = libnm_glib_name + '-test' - -executable( - name, - name + '.c', - dependencies: common_deps + [libnm_util_dep], - c_args: cflags, - link_with: libnm_glib, -) - -test( - 'check-local-exports-' + libnm_glib_name, - check_exports, - args: [libnm_glib.full_path(), linker_script], -) - -if enable_tests - subdir('tests') -endif - -pkg.generate( - version: nm_version, - name: nm_name, - description: 'System for maintaining active network connection', - filebase: nm_name, - subdirs: nm_name, - requires: '', - variables: [ - 'exec_prefix=${prefix}', - 'libgnome_serverdir=' + nm_libexecdir, - 'plugindir=' + nm_vpndir, - 'configdir=' + nm_pkgconfdir, - ], -) diff --git a/libnm-glib/nm-access-point.c b/libnm-glib/nm-access-point.c deleted file mode 100644 index a0cacfde..00000000 --- a/libnm-glib/nm-access-point.c +++ /dev/null @@ -1,720 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2011 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <netinet/ether.h> - -#include "nm-connection.h" -#include "nm-setting-connection.h" -#include "nm-setting-wireless.h" -#include "nm-setting-wireless-security.h" -#include "nm-utils.h" - -#include "nm-access-point.h" -#include "NetworkManager.h" -#include "nm-types-private.h" -#include "nm-object-private.h" - -G_DEFINE_TYPE (NMAccessPoint, nm_access_point, NM_TYPE_OBJECT) - -#define NM_ACCESS_POINT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_ACCESS_POINT, NMAccessPointPrivate)) - -typedef struct { - DBusGProxy *proxy; - - NM80211ApFlags flags; - NM80211ApSecurityFlags wpa_flags; - NM80211ApSecurityFlags rsn_flags; - GByteArray *ssid; - guint32 frequency; - char *bssid; - NM80211Mode mode; - guint32 max_bitrate; - guint8 strength; - int last_seen; -} NMAccessPointPrivate; - -enum { - PROP_0, - PROP_FLAGS, - PROP_WPA_FLAGS, - PROP_RSN_FLAGS, - PROP_SSID, - PROP_FREQUENCY, - PROP_HW_ADDRESS, - PROP_MODE, - PROP_MAX_BITRATE, - PROP_STRENGTH, - PROP_BSSID, - PROP_LAST_SEEN, - - LAST_PROP -}; - -/** - * nm_access_point_new: - * @connection: the #DBusGConnection - * @path: the DBusobject path of the access point - * - * Creates a new #NMAccessPoint. - * - * Returns: (transfer full): a new access point - **/ -GObject * -nm_access_point_new (DBusGConnection *connection, const char *path) -{ - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - return (GObject *) g_object_new (NM_TYPE_ACCESS_POINT, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); -} - -/** - * nm_access_point_get_flags: - * @ap: a #NMAccessPoint - * - * Gets the flags of the access point. - * - * Returns: the flags - **/ -NM80211ApFlags -nm_access_point_get_flags (NMAccessPoint *ap) -{ - g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NM_802_11_AP_FLAGS_NONE); - - _nm_object_ensure_inited (NM_OBJECT (ap)); - return NM_ACCESS_POINT_GET_PRIVATE (ap)->flags; -} - -/** - * nm_access_point_get_wpa_flags: - * @ap: a #NMAccessPoint - * - * Gets the WPA (version 1) flags of the access point. - * - * Returns: the WPA flags - **/ -NM80211ApSecurityFlags -nm_access_point_get_wpa_flags (NMAccessPoint *ap) -{ - g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NM_802_11_AP_SEC_NONE); - - _nm_object_ensure_inited (NM_OBJECT (ap)); - return NM_ACCESS_POINT_GET_PRIVATE (ap)->wpa_flags; -} - -/** - * nm_access_point_get_rsn_flags: - * @ap: a #NMAccessPoint - * - * Gets the RSN (Robust Secure Network, ie WPA version 2) flags of the access - * point. - * - * Returns: the RSN flags - **/ -NM80211ApSecurityFlags -nm_access_point_get_rsn_flags (NMAccessPoint *ap) -{ - g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NM_802_11_AP_SEC_NONE); - - _nm_object_ensure_inited (NM_OBJECT (ap)); - return NM_ACCESS_POINT_GET_PRIVATE (ap)->rsn_flags; -} - -/** - * nm_access_point_get_ssid: - * @ap: a #NMAccessPoint - * - * Gets the SSID of the access point. - * - * Returns: the #GByteArray containing the SSID. This is the internal copy used by the - * access point, and must not be modified. - **/ -const GByteArray * -nm_access_point_get_ssid (NMAccessPoint *ap) -{ - g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NULL); - - _nm_object_ensure_inited (NM_OBJECT (ap)); - return NM_ACCESS_POINT_GET_PRIVATE (ap)->ssid; -} - -/** - * nm_access_point_get_frequency: - * @ap: a #NMAccessPoint - * - * Gets the frequency of the access point in MHz. - * - * Returns: the frequency in MHz - **/ -guint32 -nm_access_point_get_frequency (NMAccessPoint *ap) -{ - g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), 0); - - _nm_object_ensure_inited (NM_OBJECT (ap)); - return NM_ACCESS_POINT_GET_PRIVATE (ap)->frequency; -} - -/** - * nm_access_point_get_bssid: - * @ap: a #NMAccessPoint - * - * Gets the Basic Service Set ID (BSSID) of the Wi-Fi access point. - * - * Returns: the BSSID of the access point. This is an internal string and must - * not be modified or freed. - **/ -const char * -nm_access_point_get_bssid (NMAccessPoint *ap) -{ - g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), NULL); - - _nm_object_ensure_inited (NM_OBJECT (ap)); - return NM_ACCESS_POINT_GET_PRIVATE (ap)->bssid; -} - -/** - * nm_access_point_get_hw_address: - * @ap: a #NMAccessPoint - * - * Gets the hardware (MAC) address of the access point. - * - * Returns: the hardware address of the access point. This is the internal string used by the - * access point and must not be modified. - * - * Deprecated: 0.9: Use nm_access_point_get_bssid() instead. - **/ -const char * -nm_access_point_get_hw_address (NMAccessPoint *ap) -{ - return nm_access_point_get_bssid (ap); -} - -/** - * nm_access_point_get_mode: - * @ap: a #NMAccessPoint - * - * Gets the mode of the access point. - * - * Returns: the mode - **/ -NM80211Mode -nm_access_point_get_mode (NMAccessPoint *ap) -{ - g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), 0); - - _nm_object_ensure_inited (NM_OBJECT (ap)); - return NM_ACCESS_POINT_GET_PRIVATE (ap)->mode; -} - -/** - * nm_access_point_get_max_bitrate: - * @ap: a #NMAccessPoint - * - * Gets the maximum bit rate of the access point in kbit/s. - * - * Returns: the maximum bit rate (kbit/s) - **/ -guint32 -nm_access_point_get_max_bitrate (NMAccessPoint *ap) -{ - g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), 0); - - _nm_object_ensure_inited (NM_OBJECT (ap)); - return NM_ACCESS_POINT_GET_PRIVATE (ap)->max_bitrate; -} - -/** - * nm_access_point_get_strength: - * @ap: a #NMAccessPoint - * - * Gets the current signal strength of the access point as a percentage. - * - * Returns: the signal strength (0 to 100) - **/ -guint8 -nm_access_point_get_strength (NMAccessPoint *ap) -{ - g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), 0); - - _nm_object_ensure_inited (NM_OBJECT (ap)); - return NM_ACCESS_POINT_GET_PRIVATE (ap)->strength; -} - -/** - * nm_access_point_get_last_seen: - * @ap: a #NMAccessPoint - * - * Returns the timestamp (in CLOCK_BOOTTIME seconds) for the last time the - * access point was found in scan results. A value of -1 means the access - * point has not been found in a scan. - * - * Returns: the last seen time in seconds - * - * Since: 1.2 - **/ -int -nm_access_point_get_last_seen (NMAccessPoint *ap) -{ - g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), -1); - - _nm_object_ensure_inited (NM_OBJECT (ap)); - return NM_ACCESS_POINT_GET_PRIVATE (ap)->last_seen; -} - -/** - * nm_access_point_connection_valid: - * @ap: an #NMAccessPoint to validate @connection against - * @connection: an #NMConnection to validate against @ap - * - * Validates a given connection against a given Wi-Fi access point to ensure that - * the connection may be activated with that AP. The connection must match the - * @ap's SSID, (if given) BSSID, and other attributes like security settings, - * channel, band, etc. - * - * Returns: %TRUE if the connection may be activated with this Wi-Fi AP, - * %FALSE if it cannot be. - **/ -gboolean -nm_access_point_connection_valid (NMAccessPoint *ap, NMConnection *connection) -{ - NMSettingConnection *s_con; - NMSettingWireless *s_wifi; - NMSettingWirelessSecurity *s_wsec; - const char *ctype, *ap_bssid_str; - const GByteArray *setting_ssid; - const GByteArray *ap_ssid; - const GByteArray *setting_bssid; - const char *setting_mode; - NM80211Mode ap_mode; - const char *setting_band; - guint32 ap_freq, setting_chan, ap_chan; - - s_con = nm_connection_get_setting_connection (connection); - if (!s_con) - return FALSE; - - ctype = nm_setting_connection_get_connection_type (s_con); - if (!ctype || !nm_streq (ctype, NM_SETTING_WIRELESS_SETTING_NAME)) - return FALSE; - - s_wifi = nm_connection_get_setting_wireless (connection); - if (!s_wifi) - return FALSE; - - /* SSID checks */ - ap_ssid = nm_access_point_get_ssid (ap); - if (!ap_ssid) - return FALSE; - setting_ssid = nm_setting_wireless_get_ssid (s_wifi); - if ( !setting_ssid - || setting_ssid->len != ap_ssid->len - || memcmp (setting_ssid->data, ap_ssid->data, ap_ssid->len) != 0) - return FALSE; - - /* BSSID checks */ - ap_bssid_str = nm_access_point_get_bssid (ap); - if (!ap_bssid_str) - return FALSE; - setting_bssid = nm_setting_wireless_get_bssid (s_wifi); - if (setting_bssid) { - struct ether_addr addr; - - g_return_val_if_fail (setting_bssid->len == ETH_ALEN, FALSE); - - if (!ether_aton_r (ap_bssid_str, &addr)) - return FALSE; - if (memcmp (addr.ether_addr_octet, setting_bssid->data, ETH_ALEN) != 0) - return FALSE; - } - - /* Mode */ - ap_mode = nm_access_point_get_mode (ap); - if (ap_mode == NM_802_11_MODE_UNKNOWN) - return FALSE; - setting_mode = nm_setting_wireless_get_mode (s_wifi); - if (setting_mode && ap_mode) { - if (!strcmp (setting_mode, "infrastructure") && (ap_mode != NM_802_11_MODE_INFRA)) - return FALSE; - if (!strcmp (setting_mode, "adhoc") && (ap_mode != NM_802_11_MODE_ADHOC)) - return FALSE; - /* Hotspot never matches against APs as it's a device-specific mode. */ - if (!strcmp (setting_mode, "ap")) - return FALSE; - } - - /* Band and Channel/Frequency */ - ap_freq = nm_access_point_get_frequency (ap); - if (ap_freq) { - setting_band = nm_setting_wireless_get_band (s_wifi); - if (g_strcmp0 (setting_band, "a") == 0) { - if (ap_freq < 4915 || ap_freq > 5825) - return FALSE; - } else if (g_strcmp0 (setting_band, "bg") == 0) { - if (ap_freq < 2412 || ap_freq > 2484) - return FALSE; - } - - setting_chan = nm_setting_wireless_get_channel (s_wifi); - if (setting_chan) { - ap_chan = nm_utils_wifi_freq_to_channel (ap_freq); - if (setting_chan != ap_chan) - return FALSE; - } - } - - s_wsec = nm_connection_get_setting_wireless_security (connection); - if (!nm_setting_wireless_ap_security_compatible (s_wifi, - s_wsec, - nm_access_point_get_flags (ap), - nm_access_point_get_wpa_flags (ap), - nm_access_point_get_rsn_flags (ap), - ap_mode)) - return FALSE; - - return TRUE; -} - -/** - * nm_access_point_filter_connections: - * @ap: an #NMAccessPoint to filter connections for - * @connections: (element-type NMConnection): a list of - * #NMConnection objects to filter - * - * Filters a given list of connections for a given #NMAccessPoint object and - * return connections which may be activated with the access point. Any - * returned connections will match the @ap's SSID and (if given) BSSID and - * other attributes like security settings, channel, etc. - * - * To obtain the list of connections that are compatible with this access point, - * use nm_remote_settings_list_connections() and then filter the returned list - * for a given #NMDevice using nm_device_filter_connections() and finally - * filter that list with this function. - * - * Returns: (transfer container) (element-type NMConnection): a - * list of #NMConnection objects that could be activated with the given @ap. - * The elements of the list are owned by their creator and should not be freed - * by the caller, but the returned list itself is owned by the caller and should - * be freed with g_slist_free() when it is no longer required. - **/ -GSList * -nm_access_point_filter_connections (NMAccessPoint *ap, const GSList *connections) -{ - GSList *filtered = NULL; - const GSList *iter; - - for (iter = connections; iter; iter = g_slist_next (iter)) { - NMConnection *candidate = NM_CONNECTION (iter->data); - - if (nm_access_point_connection_valid (ap, candidate)) - filtered = g_slist_prepend (filtered, candidate); - } - - return g_slist_reverse (filtered); -} - -/*****************************************************************************/ - -static void -nm_access_point_init (NMAccessPoint *ap) -{ - NM_ACCESS_POINT_GET_PRIVATE (ap)->last_seen = -1; -} - -static void -dispose (GObject *object) -{ - NMAccessPointPrivate *priv = NM_ACCESS_POINT_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_access_point_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMAccessPointPrivate *priv = NM_ACCESS_POINT_GET_PRIVATE (object); - - if (priv->ssid) - g_byte_array_free (priv->ssid, TRUE); - - g_free (priv->bssid); - - G_OBJECT_CLASS (nm_access_point_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMAccessPoint *ap = NM_ACCESS_POINT (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_FLAGS: - g_value_set_uint (value, nm_access_point_get_flags (ap)); - break; - case PROP_WPA_FLAGS: - g_value_set_uint (value, nm_access_point_get_wpa_flags (ap)); - break; - case PROP_RSN_FLAGS: - g_value_set_uint (value, nm_access_point_get_rsn_flags (ap)); - break; - case PROP_SSID: - g_value_set_boxed (value, nm_access_point_get_ssid (ap)); - break; - case PROP_FREQUENCY: - g_value_set_uint (value, nm_access_point_get_frequency (ap)); - break; - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_access_point_get_bssid (ap)); - break; - case PROP_BSSID: - g_value_set_string (value, nm_access_point_get_bssid (ap)); - break; - case PROP_MODE: - g_value_set_uint (value, nm_access_point_get_mode (ap)); - break; - case PROP_MAX_BITRATE: - g_value_set_uint (value, nm_access_point_get_max_bitrate (ap)); - break; - case PROP_STRENGTH: - g_value_set_uchar (value, nm_access_point_get_strength (ap)); - break; - case PROP_LAST_SEEN: - g_value_set_int (value, nm_access_point_get_last_seen (ap)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static gboolean -demarshal_ssid (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - if (!_nm_ssid_demarshal (value, (GByteArray **) field)) - return FALSE; - - _nm_object_queue_notify (object, NM_ACCESS_POINT_SSID); - return TRUE; -} - -static void -register_properties (NMAccessPoint *ap) -{ - NMAccessPointPrivate *priv = NM_ACCESS_POINT_GET_PRIVATE (ap); - const NMPropertiesInfo property_info[] = { - { NM_ACCESS_POINT_FLAGS, &priv->flags }, - { NM_ACCESS_POINT_WPA_FLAGS, &priv->wpa_flags }, - { NM_ACCESS_POINT_RSN_FLAGS, &priv->rsn_flags }, - { NM_ACCESS_POINT_SSID, &priv->ssid, demarshal_ssid }, - { NM_ACCESS_POINT_FREQUENCY, &priv->frequency }, - { NM_ACCESS_POINT_HW_ADDRESS, &priv->bssid }, - { NM_ACCESS_POINT_MODE, &priv->mode }, - { NM_ACCESS_POINT_MAX_BITRATE, &priv->max_bitrate }, - { NM_ACCESS_POINT_STRENGTH, &priv->strength }, - { NM_ACCESS_POINT_LAST_SEEN, &priv->last_seen }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (ap), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMAccessPointPrivate *priv; - - G_OBJECT_CLASS (nm_access_point_parent_class)->constructed (object); - - priv = NM_ACCESS_POINT_GET_PRIVATE (object); - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_ACCESS_POINT); - register_properties (NM_ACCESS_POINT (object)); -} - -static void -nm_access_point_class_init (NMAccessPointClass *ap_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (ap_class); - - g_type_class_add_private (ap_class, sizeof (NMAccessPointPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->dispose = dispose; - object_class->finalize = finalize; - - /* properties */ - - /** - * NMAccessPoint:flags: - * - * The flags of the access point. - **/ - g_object_class_install_property - (object_class, PROP_FLAGS, - g_param_spec_uint (NM_ACCESS_POINT_FLAGS, "", "", - NM_802_11_AP_FLAGS_NONE, - NM_802_11_AP_FLAGS_PRIVACY, - NM_802_11_AP_FLAGS_NONE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMAccessPoint:wpa-flags: - * - * The WPA flags of the access point. - **/ - g_object_class_install_property - (object_class, PROP_WPA_FLAGS, - g_param_spec_uint (NM_ACCESS_POINT_WPA_FLAGS, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMAccessPoint:rsn-flags: - * - * The RSN flags of the access point. - **/ - g_object_class_install_property - (object_class, PROP_RSN_FLAGS, - g_param_spec_uint (NM_ACCESS_POINT_RSN_FLAGS, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMAccessPoint:ssid: - * - * The SSID of the access point. - **/ - g_object_class_install_property - (object_class, PROP_SSID, - g_param_spec_boxed (NM_ACCESS_POINT_SSID, "", "", - NM_TYPE_SSID, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMAccessPoint:frequency: - * - * The frequency of the access point. - **/ - g_object_class_install_property - (object_class, PROP_FREQUENCY, - g_param_spec_uint (NM_ACCESS_POINT_FREQUENCY, "", "", - 0, 10000, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMAccessPoint:bssid: - * - * The BSSID of the access point. - **/ - g_object_class_install_property - (object_class, PROP_BSSID, - g_param_spec_string (NM_ACCESS_POINT_BSSID, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMAccessPoint:hw-address: - * - * The hardware address of the access point. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_ACCESS_POINT_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMAccessPoint:mode: - * - * The mode of the access point; either "infrastructure" (a central - * coordinator of the wireless network allowing clients to connect) or - * "ad-hoc" (a network with no central controller). - **/ - g_object_class_install_property - (object_class, PROP_MODE, - g_param_spec_uint (NM_ACCESS_POINT_MODE, "", "", - NM_802_11_MODE_ADHOC, NM_802_11_MODE_INFRA, NM_802_11_MODE_INFRA, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMAccessPoint:max-bitrate: - * - * The maximum bit rate of the access point in kbit/s. - **/ - g_object_class_install_property - (object_class, PROP_MAX_BITRATE, - g_param_spec_uint (NM_ACCESS_POINT_MAX_BITRATE, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMAccessPoint:strength: - * - * The current signal strength of the access point. - **/ - g_object_class_install_property - (object_class, PROP_STRENGTH, - g_param_spec_uchar (NM_ACCESS_POINT_STRENGTH, "", "", - 0, G_MAXUINT8, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMAccessPoint:last-seen: - * - * The timestamp (in CLOCK_BOOTTIME seconds) for the last time the - * access point was found in scan results. A value of -1 means the - * access point has not been found in a scan. - * - * Since: 1.2 - **/ - g_object_class_install_property - (object_class, PROP_LAST_SEEN, - g_param_spec_int (NM_ACCESS_POINT_LAST_SEEN, "", "", - -1, G_MAXINT, -1, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-glib/nm-access-point.h b/libnm-glib/nm-access-point.h deleted file mode 100644 index d25de541..00000000 --- a/libnm-glib/nm-access-point.h +++ /dev/null @@ -1,98 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2011 Red Hat, Inc. - */ - -#ifndef NM_ACCESS_POINT_H -#define NM_ACCESS_POINT_H - -#include <glib.h> -#include <glib-object.h> -#include "NetworkManager.h" -#include "nm-connection.h" -#include "nm-object.h" - -G_BEGIN_DECLS - -#define NM_TYPE_ACCESS_POINT (nm_access_point_get_type ()) -#define NM_ACCESS_POINT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_ACCESS_POINT, NMAccessPoint)) -#define NM_ACCESS_POINT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_ACCESS_POINT, NMAccessPointClass)) -#define NM_IS_ACCESS_POINT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_ACCESS_POINT)) -#define NM_IS_ACCESS_POINT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_ACCESS_POINT)) -#define NM_ACCESS_POINT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_ACCESS_POINT, NMAccessPointClass)) - -#define NM_ACCESS_POINT_FLAGS "flags" -#define NM_ACCESS_POINT_WPA_FLAGS "wpa-flags" -#define NM_ACCESS_POINT_RSN_FLAGS "rsn-flags" -#define NM_ACCESS_POINT_SSID "ssid" -#define NM_ACCESS_POINT_BSSID "bssid" -#define NM_ACCESS_POINT_FREQUENCY "frequency" -#define NM_ACCESS_POINT_MODE "mode" -#define NM_ACCESS_POINT_MAX_BITRATE "max-bitrate" -#define NM_ACCESS_POINT_STRENGTH "strength" -#define NM_ACCESS_POINT_LAST_SEEN "last-seen" - -/* DEPRECATED */ -#define NM_ACCESS_POINT_HW_ADDRESS "hw-address" - -typedef struct { - NMObject parent; -} NMAccessPoint; - -typedef struct { - NMObjectClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMAccessPointClass; - -GType nm_access_point_get_type (void); - -GObject *nm_access_point_new (DBusGConnection *connection, const char *path); - -NM80211ApFlags nm_access_point_get_flags (NMAccessPoint *ap); -NM80211ApSecurityFlags nm_access_point_get_wpa_flags (NMAccessPoint *ap); -NM80211ApSecurityFlags nm_access_point_get_rsn_flags (NMAccessPoint *ap); -const GByteArray * nm_access_point_get_ssid (NMAccessPoint *ap); -const char * nm_access_point_get_bssid (NMAccessPoint *ap); -guint32 nm_access_point_get_frequency (NMAccessPoint *ap); -NM80211Mode nm_access_point_get_mode (NMAccessPoint *ap); -guint32 nm_access_point_get_max_bitrate (NMAccessPoint *ap); -guint8 nm_access_point_get_strength (NMAccessPoint *ap); -NM_AVAILABLE_IN_1_2 -int nm_access_point_get_last_seen (NMAccessPoint *ap); - -GSList * nm_access_point_filter_connections (NMAccessPoint *ap, - const GSList *connections); - -gboolean nm_access_point_connection_valid (NMAccessPoint *ap, - NMConnection *connection); - -/* DEPRECATED */ -NM_DEPRECATED_IN_0_9_10 -const char * nm_access_point_get_hw_address (NMAccessPoint *ap); - -G_END_DECLS - -#endif /* NM_ACCESS_POINT_H */ diff --git a/libnm-glib/nm-active-connection.c b/libnm-glib/nm-active-connection.c deleted file mode 100644 index a8150755..00000000 --- a/libnm-glib/nm-active-connection.c +++ /dev/null @@ -1,851 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "NetworkManager.h" -#include "nm-active-connection.h" -#include "nm-object-private.h" -#include "nm-types-private.h" -#include "nm-device.h" -#include "nm-device-private.h" -#include "nm-connection.h" -#include "nm-vpn-connection.h" -#include "nm-dbus-helpers-private.h" - -static GType _nm_active_connection_type_for_path (DBusGConnection *connection, - const char *path); -static void _nm_active_connection_type_for_path_async (DBusGConnection *connection, - const char *path, - NMObjectTypeCallbackFunc callback, - gpointer user_data); - -G_DEFINE_TYPE_WITH_CODE (NMActiveConnection, nm_active_connection, NM_TYPE_OBJECT, - _nm_object_register_type_func (g_define_type_id, - _nm_active_connection_type_for_path, - _nm_active_connection_type_for_path_async); - ) - -#define NM_ACTIVE_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_ACTIVE_CONNECTION, NMActiveConnectionPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *connection; - char *id; - char *uuid; - char *type; - char *specific_object; - GPtrArray *devices; - NMActiveConnectionState state; - gboolean is_default; - NMIP4Config *ip4_config; - NMDHCP4Config *dhcp4_config; - gboolean is_default6; - NMIP6Config *ip6_config; - NMDHCP6Config *dhcp6_config; - gboolean is_vpn; - char *master; -} NMActiveConnectionPrivate; - -enum { - PROP_0, - PROP_CONNECTION, - PROP_ID, - PROP_UUID, - PROP_TYPE, - PROP_SPECIFIC_OBJECT, - PROP_DEVICES, - PROP_STATE, - PROP_DEFAULT, - PROP_IP4_CONFIG, - PROP_DHCP4_CONFIG, - PROP_DEFAULT6, - PROP_IP6_CONFIG, - PROP_DHCP6_CONFIG, - PROP_VPN, - PROP_MASTER, - - LAST_PROP -}; - -/** - * nm_active_connection_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMActiveConnection. - * - * Returns: (transfer full): a new active connection - **/ -GObject * -nm_active_connection_new (DBusGConnection *connection, const char *path) -{ - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - return g_object_new (NM_TYPE_ACTIVE_CONNECTION, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); -} - -static GType -_nm_active_connection_type_for_path (DBusGConnection *connection, - const char *path) -{ - DBusGProxy *proxy; - GError *error = NULL; - GValue value = G_VALUE_INIT; - GType type; - - proxy = _nm_dbus_new_proxy_for_connection (connection, path, DBUS_INTERFACE_PROPERTIES); - if (!proxy) { - g_warning ("%s: couldn't create D-Bus object proxy.", __func__); - return G_TYPE_INVALID; - } - - /* Have to create an NMVPNConnection if it's a VPN connection, otherwise - * a plain NMActiveConnection. - */ - if (dbus_g_proxy_call (proxy, - "Get", &error, - G_TYPE_STRING, NM_DBUS_INTERFACE_ACTIVE_CONNECTION, - G_TYPE_STRING, "Vpn", - G_TYPE_INVALID, - G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - if (g_value_get_boolean (&value)) - type = NM_TYPE_VPN_CONNECTION; - else - type = NM_TYPE_ACTIVE_CONNECTION; - } else { - g_warning ("Error in getting active connection 'Vpn' property: %s", - error->message); - g_error_free (error); - type = G_TYPE_INVALID; - } - - g_object_unref (proxy); - return type; -} - -typedef struct { - DBusGConnection *connection; - NMObjectTypeCallbackFunc callback; - gpointer user_data; -} NMActiveConnectionAsyncData; - -static void -async_got_type (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) -{ - NMActiveConnectionAsyncData *async_data = user_data; - GValue value = G_VALUE_INIT; - const char *path = dbus_g_proxy_get_path (proxy); - GError *error = NULL; - GType type; - - if (dbus_g_proxy_end_call (proxy, call, &error, - G_TYPE_VALUE, &value, - G_TYPE_INVALID)) { - if (g_value_get_boolean (&value)) - type = NM_TYPE_VPN_CONNECTION; - else - type = NM_TYPE_ACTIVE_CONNECTION; - } else { - g_warning ("%s: could not read properties for %s: %s", __func__, path, error->message); - type = G_TYPE_INVALID; - } - - async_data->callback (type, async_data->user_data); - - g_object_unref (proxy); - g_slice_free (NMActiveConnectionAsyncData, async_data); -} - -static void -_nm_active_connection_type_for_path_async (DBusGConnection *connection, - const char *path, - NMObjectTypeCallbackFunc callback, - gpointer user_data) -{ - NMActiveConnectionAsyncData *async_data; - DBusGProxy *proxy; - - async_data = g_slice_new (NMActiveConnectionAsyncData); - async_data->connection = connection; - async_data->callback = callback; - async_data->user_data = user_data; - - proxy = _nm_dbus_new_proxy_for_connection (connection, path, DBUS_INTERFACE_PROPERTIES); - dbus_g_proxy_begin_call (proxy, "Get", - async_got_type, async_data, NULL, - G_TYPE_STRING, NM_DBUS_INTERFACE_ACTIVE_CONNECTION, - G_TYPE_STRING, "Vpn", - G_TYPE_INVALID); -} - -/** - * nm_active_connection_get_connection: - * @connection: a #NMActiveConnection - * - * Gets the #NMConnection's DBus object path. This is often used with - * nm_remote_settings_get_connection_by_path() to retrieve the - * #NMRemoteConnection object that describes the connection. - * - * Returns: the object path of the #NMConnection which this #NMActiveConnection - * is an active instance of. This is the internal string used by the - * connection, and must not be modified. - **/ -const char * -nm_active_connection_get_connection (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->connection; -} - -/** - * nm_active_connection_get_id: - * @connection: a #NMActiveConnection - * - * Gets the #NMConnection's ID. - * - * Returns: the ID of the #NMConnection that backs the #NMActiveConnection. - * This is the internal string used by the connection, and must not be modified. - * - * Since: 0.9.10 - **/ -const char * -nm_active_connection_get_id (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->id; -} - -/** - * nm_active_connection_get_uuid: - * @connection: a #NMActiveConnection - * - * Gets the #NMConnection's UUID. - * - * Returns: the UUID of the #NMConnection that backs the #NMActiveConnection. - * This is the internal string used by the connection, and must not be modified. - **/ -const char * -nm_active_connection_get_uuid (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->uuid; -} - -/** - * nm_active_connection_get_connection_type: - * @connection: a #NMActiveConnection - * - * Gets the #NMConnection's type. - * - * Returns: the type of the #NMConnection that backs the #NMActiveConnection. - * This is the internal string used by the connection, and must not be modified. - * - * Since: 0.9.10 - **/ -const char * -nm_active_connection_get_connection_type (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->type; -} - -/** - * nm_active_connection_get_specific_object: - * @connection: a #NMActiveConnection - * - * Gets the "specific object" used at the activation. - * - * Returns: the specific object's DBus path. This is the internal string used by the - * connection, and must not be modified. - **/ -const char * -nm_active_connection_get_specific_object (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->specific_object; -} - -/** - * nm_active_connection_get_devices: - * @connection: a #NMActiveConnection - * - * Gets the #NMDevices used for the active connections. - * - * Returns: (element-type NMDevice): the #GPtrArray containing #NMDevices. - * This is the internal copy used by the connection, and must not be modified. - **/ -const GPtrArray * -nm_active_connection_get_devices (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return handle_ptr_array_return (NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->devices); -} - -/** - * nm_active_connection_get_state: - * @connection: a #NMActiveConnection - * - * Gets the active connection's state. - * - * Returns: the state - **/ -NMActiveConnectionState -nm_active_connection_get_state (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NM_ACTIVE_CONNECTION_STATE_UNKNOWN); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->state; -} - -/** - * nm_active_connection_get_default: - * @connection: a #NMActiveConnection - * - * Whether the active connection is the default IPv4 one (that is, is used for - * the default IPv4 route and DNS information). - * - * Returns: %TRUE if the active connection is the default IPv4 connection - **/ -gboolean -nm_active_connection_get_default (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->is_default; -} - -/** - * nm_active_connection_get_ip4_config: - * @connection: an #NMActiveConnection - * - * Gets the current #NMIP4Config associated with the #NMActiveConnection. - * - * Returns: (transfer none): the #NMIP4Config, or %NULL if the - * connection is not in the %NM_ACTIVE_CONNECTION_STATE_ACTIVATED - * state. - * - * Since: 0.9.10 - **/ -NMIP4Config * -nm_active_connection_get_ip4_config (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->ip4_config; -} - -/** - * nm_active_connection_get_dhcp4_config: - * @connection: an #NMActiveConnection - * - * Gets the current #NMDHCP4Config (if any) associated with the - * #NMActiveConnection. - * - * Returns: (transfer none): the #NMDHCP4Config, or %NULL if the - * connection does not use DHCP, or is not in the - * %NM_ACTIVE_CONNECTION_STATE_ACTIVATED state. - * - * Since: 0.9.10 - **/ -NMDHCP4Config * -nm_active_connection_get_dhcp4_config (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->dhcp4_config; -} - -/** - * nm_active_connection_get_default6: - * @connection: a #NMActiveConnection - * - * Whether the active connection is the default IPv6 one (that is, is used for - * the default IPv6 route and DNS information). - * - * Returns: %TRUE if the active connection is the default IPv6 connection - **/ -gboolean -nm_active_connection_get_default6 (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->is_default6; -} - -/** - * nm_active_connection_get_ip6_config: - * @connection: an #NMActiveConnection - * - * Gets the current #NMIP6Config associated with the #NMActiveConnection. - * - * Returns: (transfer none): the #NMIP6Config, or %NULL if the - * connection is not in the %NM_ACTIVE_CONNECTION_STATE_ACTIVATED - * state. - * - * Since: 0.9.10 - **/ -NMIP6Config * -nm_active_connection_get_ip6_config (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->ip6_config; -} - -/** - * nm_active_connection_get_dhcp6_config: - * @connection: an #NMActiveConnection - * - * Gets the current #NMDHCP6Config (if any) associated with the - * #NMActiveConnection. - * - * Returns: (transfer none): the #NMDHCP6Config, or %NULL if the - * connection does not use DHCPv6, or is not in the - * %NM_ACTIVE_CONNECTION_STATE_ACTIVATED state. - * - * Since: 0.9.10 - **/ -NMDHCP6Config * -nm_active_connection_get_dhcp6_config (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->dhcp6_config; -} - -/** - * nm_active_connection_get_vpn: - * @connection: a #NMActiveConnection - * - * Whether the active connection is a VPN connection. - * - * Returns: %TRUE if the active connection is a VPN connection - * - * Since: 0.9.10 - **/ -gboolean -nm_active_connection_get_vpn (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->is_vpn; -} - -/** - * nm_active_connection_get_master: - * @connection: a #NMActiveConnection - * - * Gets the path to the master #NMDevice of the connection. - * - * Returns: the path of the master #NMDevice of the #NMActiveConnection. - * This is the internal string used by the connection, and must not be modified. - **/ -const char * -nm_active_connection_get_master (NMActiveConnection *connection) -{ - g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); - - _nm_object_ensure_inited (NM_OBJECT (connection)); - return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->master; -} - -static void -nm_active_connection_init (NMActiveConnection *ap) -{ -} - -static void -dispose (GObject *object) -{ - NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object); - - if (priv->devices) { - g_ptr_array_set_free_func (priv->devices, g_object_unref); - g_ptr_array_free (priv->devices, TRUE); - priv->devices = NULL; - } - - g_clear_object (&priv->ip4_config); - g_clear_object (&priv->dhcp4_config); - g_clear_object (&priv->ip6_config); - g_clear_object (&priv->dhcp6_config); - - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_active_connection_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object); - - g_free (priv->connection); - g_free (priv->id); - g_free (priv->uuid); - g_free (priv->type); - g_free (priv->specific_object); - g_free (priv->master); - - G_OBJECT_CLASS (nm_active_connection_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMActiveConnection *self = NM_ACTIVE_CONNECTION (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_CONNECTION: - g_value_set_string (value, nm_active_connection_get_connection (self)); - break; - case PROP_ID: - g_value_set_string (value, nm_active_connection_get_id (self)); - break; - case PROP_UUID: - g_value_set_string (value, nm_active_connection_get_uuid (self)); - break; - case PROP_TYPE: - g_value_set_string (value, nm_active_connection_get_connection_type (self)); - break; - case PROP_SPECIFIC_OBJECT: - g_value_set_boxed (value, nm_active_connection_get_specific_object (self)); - break; - case PROP_DEVICES: - g_value_set_boxed (value, nm_active_connection_get_devices (self)); - break; - case PROP_STATE: - g_value_set_uint (value, nm_active_connection_get_state (self)); - break; - case PROP_DEFAULT: - g_value_set_boolean (value, nm_active_connection_get_default (self)); - break; - case PROP_IP4_CONFIG: - g_value_set_object (value, nm_active_connection_get_ip4_config (self)); - break; - case PROP_DHCP4_CONFIG: - g_value_set_object (value, nm_active_connection_get_dhcp4_config (self)); - break; - case PROP_DEFAULT6: - g_value_set_boolean (value, nm_active_connection_get_default6 (self)); - break; - case PROP_IP6_CONFIG: - g_value_set_object (value, nm_active_connection_get_ip6_config (self)); - break; - case PROP_DHCP6_CONFIG: - g_value_set_object (value, nm_active_connection_get_dhcp6_config (self)); - break; - case PROP_VPN: - g_value_set_boolean (value, nm_active_connection_get_vpn (self)); - break; - case PROP_MASTER: - g_value_set_string (value, nm_active_connection_get_master (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -register_properties (NMActiveConnection *connection) -{ - NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (connection); - const NMPropertiesInfo property_info[] = { - { NM_ACTIVE_CONNECTION_CONNECTION, &priv->connection }, - { NM_ACTIVE_CONNECTION_ID, &priv->id }, - { NM_ACTIVE_CONNECTION_UUID, &priv->uuid }, - { NM_ACTIVE_CONNECTION_TYPE, &priv->type }, - { NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT, &priv->specific_object }, - { NM_ACTIVE_CONNECTION_DEVICES, &priv->devices, NULL, NM_TYPE_DEVICE }, - { NM_ACTIVE_CONNECTION_STATE, &priv->state }, - { NM_ACTIVE_CONNECTION_DEFAULT, &priv->is_default }, - { NM_ACTIVE_CONNECTION_IP4_CONFIG, &priv->ip4_config, NULL, NM_TYPE_IP4_CONFIG }, - { NM_ACTIVE_CONNECTION_DHCP4_CONFIG, &priv->dhcp4_config, NULL, NM_TYPE_DHCP4_CONFIG }, - { NM_ACTIVE_CONNECTION_DEFAULT6, &priv->is_default6 }, - { NM_ACTIVE_CONNECTION_IP6_CONFIG, &priv->ip6_config, NULL, NM_TYPE_IP6_CONFIG }, - { NM_ACTIVE_CONNECTION_DHCP6_CONFIG, &priv->dhcp6_config, NULL, NM_TYPE_DHCP6_CONFIG }, - { NM_ACTIVE_CONNECTION_VPN, &priv->is_vpn }, - { NM_ACTIVE_CONNECTION_MASTER, &priv->master }, - - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (connection), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_active_connection_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_ACTIVE_CONNECTION); - register_properties (NM_ACTIVE_CONNECTION (object)); -} - -static void -nm_active_connection_class_init (NMActiveConnectionClass *ap_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (ap_class); - - g_type_class_add_private (ap_class, sizeof (NMActiveConnectionPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->dispose = dispose; - object_class->finalize = finalize; - - /* properties */ - - /** - * NMActiveConnection:connection: - * - * The connection's path of the active connection. - **/ - g_object_class_install_property - (object_class, PROP_CONNECTION, - g_param_spec_string (NM_ACTIVE_CONNECTION_CONNECTION, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:id: - * - * The active connection's ID - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_ID, - g_param_spec_string (NM_ACTIVE_CONNECTION_ID, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:uuid: - * - * The active connection's UUID - **/ - g_object_class_install_property - (object_class, PROP_UUID, - g_param_spec_string (NM_ACTIVE_CONNECTION_UUID, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:type: - * - * The active connection's type - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_TYPE, - g_param_spec_string (NM_ACTIVE_CONNECTION_TYPE, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:specific-object: - * - * The specific object's path of the active connection. - **/ - g_object_class_install_property - (object_class, PROP_SPECIFIC_OBJECT, - g_param_spec_string (NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:device: - * - * The devices (#NMDevice) of the active connection. - **/ - g_object_class_install_property - (object_class, PROP_DEVICES, - g_param_spec_boxed (NM_ACTIVE_CONNECTION_DEVICES, "", "", - NM_TYPE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:state: - * - * The state of the active connection. - **/ - g_object_class_install_property - (object_class, PROP_STATE, - g_param_spec_uint (NM_ACTIVE_CONNECTION_STATE, "", "", - NM_ACTIVE_CONNECTION_STATE_UNKNOWN, - NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, - NM_ACTIVE_CONNECTION_STATE_UNKNOWN, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:default: - * - * Whether the active connection is the default IPv4 one. - **/ - g_object_class_install_property - (object_class, PROP_DEFAULT, - g_param_spec_boolean (NM_ACTIVE_CONNECTION_DEFAULT, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:ip4-config: - * - * The #NMIP4Config of the connection. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_IP4_CONFIG, - g_param_spec_object (NM_ACTIVE_CONNECTION_IP4_CONFIG, "", "", - NM_TYPE_IP4_CONFIG, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:dhcp4-config: - * - * The #NMDHCP4Config of the connection. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_DHCP4_CONFIG, - g_param_spec_object (NM_ACTIVE_CONNECTION_DHCP4_CONFIG, "", "", - NM_TYPE_DHCP4_CONFIG, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:default6: - * - * Whether the active connection is the default IPv6 one. - **/ - g_object_class_install_property - (object_class, PROP_DEFAULT6, - g_param_spec_boolean (NM_ACTIVE_CONNECTION_DEFAULT6, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:ip6-config: - * - * The #NMIP6Config of the connection. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_IP6_CONFIG, - g_param_spec_object (NM_ACTIVE_CONNECTION_IP6_CONFIG, "", "", - NM_TYPE_IP6_CONFIG, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:dhcp6-config: - * - * The #NMDHCP6Config of the connection. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_DHCP6_CONFIG, - g_param_spec_object (NM_ACTIVE_CONNECTION_DHCP6_CONFIG, "", "", - NM_TYPE_DHCP6_CONFIG, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:vpn: - * - * Whether the active connection is a VPN connection. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_VPN, - g_param_spec_boolean (NM_ACTIVE_CONNECTION_VPN, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMActiveConnection:master: - * - * The path of the master device if one exists. - **/ - g_object_class_install_property - (object_class, PROP_MASTER, - g_param_spec_string (NM_ACTIVE_CONNECTION_MASTER, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-glib/nm-active-connection.h b/libnm-glib/nm-active-connection.h deleted file mode 100644 index cdf02a94..00000000 --- a/libnm-glib/nm-active-connection.h +++ /dev/null @@ -1,105 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2014 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#ifndef NM_ACTIVE_CONNECTION_H -#define NM_ACTIVE_CONNECTION_H - -#include <glib.h> -#include <glib-object.h> -#include "nm-object.h" -#include "nm-connection.h" -#include "NetworkManager.h" -#include "nm-ip4-config.h" -#include "nm-dhcp4-config.h" -#include "nm-ip6-config.h" -#include "nm-dhcp6-config.h" - -G_BEGIN_DECLS - -#define NM_TYPE_ACTIVE_CONNECTION (nm_active_connection_get_type ()) -#define NM_ACTIVE_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_ACTIVE_CONNECTION, NMActiveConnection)) -#define NM_ACTIVE_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_ACTIVE_CONNECTION, NMActiveConnectionClass)) -#define NM_IS_ACTIVE_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_ACTIVE_CONNECTION)) -#define NM_IS_ACTIVE_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_ACTIVE_CONNECTION)) -#define NM_ACTIVE_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_ACTIVE_CONNECTION, NMActiveConnectionClass)) - -#define NM_ACTIVE_CONNECTION_CONNECTION "connection" -#define NM_ACTIVE_CONNECTION_ID "id" -#define NM_ACTIVE_CONNECTION_UUID "uuid" -#define NM_ACTIVE_CONNECTION_TYPE "type" -#define NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT "specific-object" -#define NM_ACTIVE_CONNECTION_DEVICES "devices" -#define NM_ACTIVE_CONNECTION_STATE "state" -#define NM_ACTIVE_CONNECTION_DEFAULT "default" -#define NM_ACTIVE_CONNECTION_IP4_CONFIG "ip4-config" -#define NM_ACTIVE_CONNECTION_DHCP4_CONFIG "dhcp4-config" -#define NM_ACTIVE_CONNECTION_DEFAULT6 "default6" -#define NM_ACTIVE_CONNECTION_IP6_CONFIG "ip6-config" -#define NM_ACTIVE_CONNECTION_DHCP6_CONFIG "dhcp6-config" -#define NM_ACTIVE_CONNECTION_VPN "vpn" -#define NM_ACTIVE_CONNECTION_MASTER "master" - -typedef struct { - NMObject parent; -} NMActiveConnection; - -typedef struct { - NMObjectClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMActiveConnectionClass; - -GType nm_active_connection_get_type (void); - -GObject *nm_active_connection_new (DBusGConnection *connection, const char *path); - -const char * nm_active_connection_get_connection (NMActiveConnection *connection); -NM_AVAILABLE_IN_0_9_10 -const char * nm_active_connection_get_id (NMActiveConnection *connection); -const char * nm_active_connection_get_uuid (NMActiveConnection *connection); -NM_AVAILABLE_IN_0_9_10 -const char * nm_active_connection_get_connection_type (NMActiveConnection *connection); -const char * nm_active_connection_get_specific_object (NMActiveConnection *connection); -const GPtrArray *nm_active_connection_get_devices (NMActiveConnection *connection); -NMActiveConnectionState nm_active_connection_get_state (NMActiveConnection *connection); -const char * nm_active_connection_get_master (NMActiveConnection *connection); -gboolean nm_active_connection_get_default (NMActiveConnection *connection); -NM_AVAILABLE_IN_0_9_10 -NMIP4Config * nm_active_connection_get_ip4_config (NMActiveConnection *connection); -NM_AVAILABLE_IN_0_9_10 -NMDHCP4Config *nm_active_connection_get_dhcp4_config (NMActiveConnection *connection); -gboolean nm_active_connection_get_default6 (NMActiveConnection *connection); -NM_AVAILABLE_IN_0_9_10 -NMIP6Config * nm_active_connection_get_ip6_config (NMActiveConnection *connection); -NM_AVAILABLE_IN_0_9_10 -NMDHCP6Config *nm_active_connection_get_dhcp6_config (NMActiveConnection *connection); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_active_connection_get_vpn (NMActiveConnection *connection); - -G_END_DECLS - -#endif /* NM_ACTIVE_CONNECTION_H */ diff --git a/libnm-glib/nm-client.c b/libnm-glib/nm-client.c deleted file mode 100644 index 8f1524e3..00000000 --- a/libnm-glib/nm-client.c +++ /dev/null @@ -1,2514 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include "nm-client.h" - -#include <dbus/dbus-glib.h> -#include <string.h> - -#include "nm-utils.h" -#include "nm-libnm-core-intern/nm-common-macros.h" - -#include "nm-device-ethernet.h" -#include "nm-device-wifi.h" -#include "nm-device-private.h" -#include "nm-types-private.h" -#include "nm-object-private.h" -#include "nm-active-connection.h" -#include "nm-vpn-connection.h" -#include "nm-object-cache.h" -#include "nm-dbus-glib-types.h" - -void _nm_device_wifi_set_wireless_enabled (NMDeviceWifi *device, gboolean enabled); - -static void nm_client_initable_iface_init (GInitableIface *iface); -static void nm_client_async_initable_iface_init (GAsyncInitableIface *iface); -static GInitableIface *nm_client_parent_initable_iface; -static GAsyncInitableIface *nm_client_parent_async_initable_iface; - -G_DEFINE_TYPE_WITH_CODE (NMClient, nm_client, NM_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, nm_client_initable_iface_init); - G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, nm_client_async_initable_iface_init); - ) - -#define NM_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CLIENT, NMClientPrivate)) - -typedef struct { - DBusGProxy *client_proxy; - DBusGProxy *bus_proxy; - gboolean manager_running; - char *version; - NMState state; - gboolean startup; - GPtrArray *devices; - GPtrArray *all_devices; - GPtrArray *active_connections; - NMConnectivityState connectivity; - NMActiveConnection *primary_connection; - NMActiveConnection *activating_connection; - - DBusGProxyCall *perm_call; - GHashTable *permissions; - - /* Activations waiting for their NMActiveConnection - * to appear and then their callback to be called. - */ - GSList *pending_activations; - - gboolean networking_enabled; - gboolean wireless_enabled; - gboolean wireless_hw_enabled; - - gboolean wwan_enabled; - gboolean wwan_hw_enabled; - - gboolean wimax_enabled; - gboolean wimax_hw_enabled; -} NMClientPrivate; - -enum { - PROP_0, - PROP_VERSION, - PROP_STATE, - PROP_STARTUP, - PROP_MANAGER_RUNNING, - PROP_NETWORKING_ENABLED, - PROP_WIRELESS_ENABLED, - PROP_WIRELESS_HARDWARE_ENABLED, - PROP_WWAN_ENABLED, - PROP_WWAN_HARDWARE_ENABLED, - PROP_WIMAX_ENABLED, - PROP_WIMAX_HARDWARE_ENABLED, - PROP_ACTIVE_CONNECTIONS, - PROP_CONNECTIVITY, - PROP_PRIMARY_CONNECTION, - PROP_ACTIVATING_CONNECTION, - PROP_DEVICES, - PROP_ALL_DEVICES, - - LAST_PROP -}; - -enum { - DEVICE_ADDED, - DEVICE_REMOVED, - ANY_DEVICE_ADDED, - ANY_DEVICE_REMOVED, - PERMISSION_CHANGED, - - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -static void proxy_name_owner_changed (DBusGProxy *proxy, - const char *name, - const char *old_owner, - const char *new_owner, - gpointer user_data); - -/*****************************************************************************/ - -/** - * nm_client_error_quark: - * - * Registers an error quark for #NMClient if necessary. - * - * Returns: the error quark used for #NMClient errors. - * - * Since: 0.9.10 - **/ -GQuark -nm_client_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-client-error-quark"); - return quark; -} - -/*****************************************************************************/ - -static void -nm_client_init (NMClient *client) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client); - - priv->state = NM_STATE_UNKNOWN; - - priv->permissions = g_hash_table_new (NULL, NULL); -} - -static void -poke_wireless_devices_with_rf_status (NMClient *client) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client); - int i; - - for (i = 0; priv->all_devices && (i < priv->all_devices->len); i++) { - NMDevice *device = g_ptr_array_index (priv->all_devices, i); - - if (NM_IS_DEVICE_WIFI (device)) - _nm_device_wifi_set_wireless_enabled (NM_DEVICE_WIFI (device), priv->wireless_enabled); - } -} - -static void -wireless_enabled_cb (GObject *object, GParamSpec *pspec, gpointer user_data) -{ - poke_wireless_devices_with_rf_status (NM_CLIENT (object)); -} - -static void -register_properties (NMClient *client) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client); - const NMPropertiesInfo property_info[] = { - { NM_CLIENT_VERSION, &priv->version }, - { NM_CLIENT_STATE, &priv->state }, - { NM_CLIENT_STARTUP, &priv->startup }, - { NM_CLIENT_NETWORKING_ENABLED, &priv->networking_enabled }, - { NM_CLIENT_WIRELESS_ENABLED, &priv->wireless_enabled }, - { NM_CLIENT_WIRELESS_HARDWARE_ENABLED, &priv->wireless_hw_enabled }, - { NM_CLIENT_WWAN_ENABLED, &priv->wwan_enabled }, - { NM_CLIENT_WWAN_HARDWARE_ENABLED, &priv->wwan_hw_enabled }, - { NM_CLIENT_WIMAX_ENABLED, &priv->wimax_enabled }, - { NM_CLIENT_WIMAX_HARDWARE_ENABLED, &priv->wimax_hw_enabled }, - { NM_CLIENT_ACTIVE_CONNECTIONS, &priv->active_connections, NULL, NM_TYPE_ACTIVE_CONNECTION }, - { NM_CLIENT_CONNECTIVITY, &priv->connectivity }, - { NM_CLIENT_PRIMARY_CONNECTION, &priv->primary_connection, NULL, NM_TYPE_ACTIVE_CONNECTION }, - { NM_CLIENT_ACTIVATING_CONNECTION, &priv->activating_connection, NULL, NM_TYPE_ACTIVE_CONNECTION }, - { NM_CLIENT_DEVICES, &priv->devices, NULL, NM_TYPE_DEVICE, "device" }, - { NM_CLIENT_ALL_DEVICES, &priv->all_devices, NULL, NM_TYPE_DEVICE, "any-device" }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (client), - priv->client_proxy, - property_info); -} - -static NMClientPermission -nm_permission_to_client (const char *nm) -{ - if (!strcmp (nm, NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK)) - return NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK; - else if (!strcmp (nm, NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI)) - return NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI; - else if (!strcmp (nm, NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN)) - return NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN; - else if (!strcmp (nm, NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX)) - return NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX; - else if (!strcmp (nm, NM_AUTH_PERMISSION_SLEEP_WAKE)) - return NM_CLIENT_PERMISSION_SLEEP_WAKE; - else if (!strcmp (nm, NM_AUTH_PERMISSION_NETWORK_CONTROL)) - return NM_CLIENT_PERMISSION_NETWORK_CONTROL; - else if (!strcmp (nm, NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED)) - return NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED; - else if (!strcmp (nm, NM_AUTH_PERMISSION_WIFI_SHARE_OPEN)) - return NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN; - else if (!strcmp (nm, NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM)) - return NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM; - else if (!strcmp (nm, NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN)) - return NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN; - else if (!strcmp (nm, NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME)) - return NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME; - else if (!strcmp (nm, NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS)) - return NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS; - else if (!strcmp (nm, NM_AUTH_PERMISSION_RELOAD)) - return NM_CLIENT_PERMISSION_RELOAD; - else if (!strcmp (nm, NM_AUTH_PERMISSION_CHECKPOINT_ROLLBACK)) - return NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK; - else if (!strcmp (nm, NM_AUTH_PERMISSION_ENABLE_DISABLE_STATISTICS)) - return NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS; - - return NM_CLIENT_PERMISSION_NONE; -} - -static NMClientPermissionResult -nm_permission_result_to_client (const char *nm) -{ - if (!strcmp (nm, "yes")) - return NM_CLIENT_PERMISSION_RESULT_YES; - else if (!strcmp (nm, "no")) - return NM_CLIENT_PERMISSION_RESULT_NO; - else if (!strcmp (nm, "auth")) - return NM_CLIENT_PERMISSION_RESULT_AUTH; - return NM_CLIENT_PERMISSION_RESULT_UNKNOWN; -} - -static void -update_permissions (NMClient *self, GHashTable *permissions) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (self); - GHashTableIter iter; - gpointer key, value; - NMClientPermission perm; - NMClientPermissionResult perm_result; - GList *keys, *keys_iter; - - /* get list of old permissions for change notification */ - keys = g_hash_table_get_keys (priv->permissions); - g_hash_table_remove_all (priv->permissions); - - if (permissions) { - /* Process new permissions */ - g_hash_table_iter_init (&iter, permissions); - while (g_hash_table_iter_next (&iter, &key, &value)) { - perm = nm_permission_to_client ((const char *) key); - perm_result = nm_permission_result_to_client ((const char *) value); - if (perm) { - g_hash_table_insert (priv->permissions, - GUINT_TO_POINTER (perm), - GUINT_TO_POINTER (perm_result)); - - /* Remove this permission from the list of previous permissions - * we'll be sending NM_CLIENT_PERMISSION_RESULT_UNKNOWN for - * in the change signal since it is still a known permission. - */ - keys = g_list_remove (keys, GUINT_TO_POINTER (perm)); - } - } - } - - /* Signal changes in all updated permissions */ - g_hash_table_iter_init (&iter, priv->permissions); - while (g_hash_table_iter_next (&iter, &key, &value)) { - g_signal_emit (self, signals[PERMISSION_CHANGED], 0, - GPOINTER_TO_UINT (key), - GPOINTER_TO_UINT (value)); - } - - /* And signal changes in all permissions that used to be valid but for - * some reason weren't received in the last request (if any). - */ - for (keys_iter = keys; keys_iter; keys_iter = g_list_next (keys_iter)) { - g_signal_emit (self, signals[PERMISSION_CHANGED], 0, - GPOINTER_TO_UINT (keys_iter->data), - NM_CLIENT_PERMISSION_RESULT_UNKNOWN); - } - g_list_free (keys); -} - -static gboolean -get_permissions_sync (NMClient *self, GError **error) -{ - gboolean success; - gs_unref_hashtable GHashTable *permissions = NULL; - - success = dbus_g_proxy_call_with_timeout (NM_CLIENT_GET_PRIVATE (self)->client_proxy, - "GetPermissions", 3000, error, - G_TYPE_INVALID, - DBUS_TYPE_G_MAP_OF_STRING, &permissions, G_TYPE_INVALID); - update_permissions (self, success ? permissions : NULL); - return success; -} - -static void -get_permissions_reply (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - NMClient *self = NM_CLIENT (user_data); - gs_unref_hashtable GHashTable *permissions = NULL; - gs_free_error GError *error = NULL; - - dbus_g_proxy_end_call (proxy, call, &error, - DBUS_TYPE_G_MAP_OF_STRING, &permissions, - G_TYPE_INVALID); - NM_CLIENT_GET_PRIVATE (self)->perm_call = NULL; - update_permissions (NM_CLIENT (user_data), error ? NULL : permissions); -} - -static void -client_recheck_permissions (DBusGProxy *proxy, gpointer user_data) -{ - NMClient *self = NM_CLIENT (user_data); - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (self); - - if (!priv->perm_call) { - priv->perm_call = dbus_g_proxy_begin_call (NM_CLIENT_GET_PRIVATE (self)->client_proxy, "GetPermissions", - get_permissions_reply, self, NULL, - G_TYPE_INVALID); - } -} - -/** - * nm_client_get_devices: - * @client: a #NMClient - * - * Gets all the known network devices. Use nm_device_get_type() or the - * <literal>NM_IS_DEVICE_XXXX</literal> functions to determine what kind of - * device member of the returned array is, and then you may use device-specific - * methods such as nm_device_ethernet_get_hw_address(). - * - * Returns: (transfer none) (element-type NMDevice): a #GPtrArray - * containing all the #NMDevices. The returned array is owned by the - * #NMClient object and should not be modified. - **/ -const GPtrArray * -nm_client_get_devices (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), NULL); - - _nm_object_ensure_inited (NM_OBJECT (client)); - - return handle_ptr_array_return (NM_CLIENT_GET_PRIVATE (client)->devices); -} - -/** - * nm_client_get_all_devices: - * @client: a #NMClient - * - * Gets both real devices and device placeholders (eg, software devices which - * do not currently exist, but could be created automatically by NetworkManager - * if one of their NMDevice::ActivatableConnections was activated). Use - * nm_device_is_real() to determine whether each device is a real device or - * a placeholder. - * - * Use nm_device_get_type() or the NM_IS_DEVICE_XXXX() functions to determine - * what kind of device each member of the returned array is, and then you may - * use device-specific methods such as nm_device_ethernet_get_hw_address(). - * - * Returns: (transfer none) (element-type NMDevice): a #GPtrArray - * containing all the #NMDevices. The returned array is owned by the - * #NMClient object and should not be modified. - * - * Since: 1.2 - **/ -const GPtrArray * -nm_client_get_all_devices (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), NULL); - - return NM_CLIENT_GET_PRIVATE (client)->all_devices; -} - -/** - * nm_client_get_device_by_path: - * @client: a #NMClient - * @object_path: the object path to search for - * - * Gets a #NMDevice from a #NMClient. - * - * Returns: (transfer none): the #NMDevice for the given @object_path or %NULL if none is found. - **/ -NMDevice * -nm_client_get_device_by_path (NMClient *client, const char *object_path) -{ - const GPtrArray *devices; - int i; - NMDevice *device = NULL; - - g_return_val_if_fail (NM_IS_CLIENT (client), NULL); - g_return_val_if_fail (object_path, NULL); - - devices = nm_client_get_devices (client); - if (!devices) - return NULL; - - for (i = 0; i < devices->len; i++) { - NMDevice *candidate = g_ptr_array_index (devices, i); - if (!strcmp (nm_object_get_path (NM_OBJECT (candidate)), object_path)) { - device = candidate; - break; - } - } - - return device; -} - -/** - * nm_client_get_device_by_iface: - * @client: a #NMClient - * @iface: the interface name to search for - * - * Gets a #NMDevice from a #NMClient. - * - * Returns: (transfer none): the #NMDevice for the given @iface or %NULL if none is found. - **/ -NMDevice * -nm_client_get_device_by_iface (NMClient *client, const char *iface) -{ - const GPtrArray *devices; - int i; - NMDevice *device = NULL; - - g_return_val_if_fail (NM_IS_CLIENT (client), NULL); - g_return_val_if_fail (iface, NULL); - - devices = nm_client_get_devices (client); - if (!devices) - return NULL; - - for (i = 0; i < devices->len; i++) { - NMDevice *candidate = g_ptr_array_index (devices, i); - if (!strcmp (nm_device_get_iface (candidate), iface)) { - device = candidate; - break; - } - } - - return device; -} - -typedef struct { - NMClient *client; - NMClientActivateFn act_fn; - NMClientAddActivateFn add_act_fn; - char *active_path; - char *new_connection_path; - guint idle_id; - gpointer user_data; -} ActivateInfo; - -static void -activate_info_free (ActivateInfo *info) -{ - if (info->idle_id) - g_source_remove (info->idle_id); - g_free (info->active_path); - g_free (info->new_connection_path); - memset (info, 0, sizeof (*info)); - g_slice_free (ActivateInfo, info); -} - -static void -activate_info_complete (ActivateInfo *info, - NMActiveConnection *active, - GError *error) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (info->client); - - if (info->act_fn) - info->act_fn (info->client, error ? NULL : active, error, info->user_data); - else if (info->add_act_fn) { - info->add_act_fn (info->client, - error ? NULL : active, - error ? NULL : info->new_connection_path, - error, - info->user_data); - } else if (error) - g_warning ("Device activation failed: %s", error->message); - - priv->pending_activations = g_slist_remove (priv->pending_activations, info); -} - -static void -recheck_pending_activations (NMClient *self, const char *failed_path, GError *error) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (self); - GSList *iter, *next; - const GPtrArray *active_connections; - gboolean found_in_active = FALSE; - gboolean found_in_pending = FALSE; - ActivateInfo *ainfo = NULL; - int i; - - active_connections = nm_client_get_active_connections (self); - - /* For each pending activation, look for a active connection that has - * the pending activation's object path, and call pending connection's - * callback. - * If the connection to activate doesn't make it to active_connections, - * due to an error, we have to call the callback for failed_path. - */ - for (iter = priv->pending_activations; iter; iter = next) { - ActivateInfo *info = iter->data; - - next = g_slist_next (iter); - - if (!found_in_pending && failed_path && g_strcmp0 (failed_path, info->active_path) == 0) { - found_in_pending = TRUE; - ainfo = info; - } - - for (i = 0; active_connections && i < active_connections->len; i++) { - NMActiveConnection *active = g_ptr_array_index (active_connections, i); - const char *active_path = nm_object_get_path (NM_OBJECT (active)); - - if (!found_in_active && failed_path && g_strcmp0 (failed_path, active_path) == 0) - found_in_active = TRUE; - - if (g_strcmp0 (info->active_path, active_path) == 0) { - /* Call the pending activation's callback and it all up */ - activate_info_complete (info, active, NULL); - activate_info_free (info); - break; - } - } - } - - if (!found_in_active && found_in_pending) { - /* A newly activated connection failed due to some immediate error - * and disappeared from active connection list. Make sure the - * callback gets called. - */ - activate_info_complete (ainfo, NULL, error); - activate_info_free (ainfo); - } -} - -static void -activate_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - ActivateInfo *info = user_data; - char *path; - GError *error = NULL; - - dbus_g_proxy_end_call (proxy, call, &error, - DBUS_TYPE_G_OBJECT_PATH, &path, - G_TYPE_INVALID); - if (error) { - activate_info_complete (info, NULL, error); - activate_info_free (info); - g_clear_error (&error); - } else { - info->active_path = path; - recheck_pending_activations (info->client, NULL, NULL); - } -} - -static gboolean -activate_nm_not_running (gpointer user_data) -{ - ActivateInfo *info = user_data; - GError *error; - - info->idle_id = 0; - - error = g_error_new_literal (NM_CLIENT_ERROR, - NM_CLIENT_ERROR_MANAGER_NOT_RUNNING, - "NetworkManager is not running"); - activate_info_complete (info, NULL, error); - activate_info_free (info); - g_clear_error (&error); - return FALSE; -} - -/** - * nm_client_activate_connection: - * @client: a #NMClient - * @connection: (allow-none): an #NMConnection - * @device: (allow-none): the #NMDevice - * @specific_object: (allow-none): the object path of a connection-type-specific - * object this activation should use. This parameter is currently ignored for - * wired and mobile broadband connections, and the value of %NULL should be used - * (ie, no specific object). For Wi-Fi or WiMAX connections, pass the object - * path of a #NMAccessPoint or #NMWimaxNsp owned by @device, which you can - * get using nm_object_get_path(), and which will be used to complete the - * details of the newly added connection. - * @callback: (scope async) (allow-none): the function to call when the call is done - * @user_data: (closure): user data to pass to the callback function - * - * Starts a connection to a particular network using the configuration settings - * from @connection and the network device @device. Certain connection types - * also take a "specific object" which is the object path of a connection- - * specific object, like an #NMAccessPoint for Wi-Fi connections, or an - * #NMWimaxNsp for WiMAX connections, to which you wish to connect. If the - * specific object is not given, NetworkManager can, in some cases, automatically - * determine which network to connect to given the settings in @connection. - * - * If @connection is not given for a device-based activation, NetworkManager - * picks the best available connection for the device and activates it. - * - * Note that the callback is invoked when NetworkManager has started activating - * the new connection, not when it finishes. You can used the returned - * #NMActiveConnection object (in particular, #NMActiveConnection:state) to - * track the activation to its completion. - **/ -void -nm_client_activate_connection (NMClient *client, - NMConnection *connection, - NMDevice *device, - const char *specific_object, - NMClientActivateFn callback, - gpointer user_data) -{ - NMClientPrivate *priv; - ActivateInfo *info; - - g_return_if_fail (NM_IS_CLIENT (client)); - if (device) - g_return_if_fail (NM_IS_DEVICE (device)); - if (connection) - g_return_if_fail (NM_IS_CONNECTION (connection)); - - info = g_slice_new0 (ActivateInfo); - info->act_fn = callback; - info->user_data = user_data; - info->client = client; - - priv = NM_CLIENT_GET_PRIVATE (client); - priv->pending_activations = g_slist_prepend (priv->pending_activations, info); - - if (priv->manager_running == FALSE) { - info->idle_id = g_idle_add (activate_nm_not_running, info); - return; - } - - dbus_g_proxy_begin_call (priv->client_proxy, "ActivateConnection", - activate_cb, info, NULL, - DBUS_TYPE_G_OBJECT_PATH, connection ? nm_connection_get_path (connection) : "/", - DBUS_TYPE_G_OBJECT_PATH, device ? nm_object_get_path (NM_OBJECT (device)) : "/", - DBUS_TYPE_G_OBJECT_PATH, specific_object ?: "/", - G_TYPE_INVALID); -} - -static void -add_activate_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - ActivateInfo *info = user_data; - char *connection_path; - char *active_path; - GError *error = NULL; - - dbus_g_proxy_end_call (proxy, call, &error, - DBUS_TYPE_G_OBJECT_PATH, &connection_path, - DBUS_TYPE_G_OBJECT_PATH, &active_path, - G_TYPE_INVALID); - if (error) { - activate_info_complete (info, NULL, error); - activate_info_free (info); - } else { - info->new_connection_path = connection_path; - info->active_path = active_path; - recheck_pending_activations (info->client, NULL, NULL); - } -} - -/** - * nm_client_add_and_activate_connection: - * @client: a #NMClient - * @partial: (allow-none): an #NMConnection to add; the connection may be - * partially filled (or even %NULL) and will be completed by NetworkManager - * using the given @device and @specific_object before being added - * @device: the #NMDevice - * @specific_object: (allow-none): the object path of a connection-type-specific - * object this activation should use. This parameter is currently ignored for - * wired and mobile broadband connections, and the value of %NULL should be used - * (ie, no specific object). For Wi-Fi or WiMAX connections, pass the object - * path of a #NMAccessPoint or #NMWimaxNsp owned by @device, which you can - * get using nm_object_get_path(), and which will be used to complete the - * details of the newly added connection. - * @callback: (scope async) (allow-none): the function to call when the call is done - * @user_data: (closure): user data to pass to the callback function - * - * Adds a new connection using the given details (if any) as a template, - * automatically filling in missing settings with the capabilities of the - * given device and specific object. The new connection is then activated. - * Cannot be used for VPN connections at this time. - * - * Note that the callback is invoked when NetworkManager has started activating - * the new connection, not when it finishes. You can used the returned - * #NMActiveConnection object (in particular, #NMActiveConnection:state) to - * track the activation to its completion. - **/ -void -nm_client_add_and_activate_connection (NMClient *client, - NMConnection *partial, - NMDevice *device, - const char *specific_object, - NMClientAddActivateFn callback, - gpointer user_data) -{ - NMClientPrivate *priv; - ActivateInfo *info; - GHashTable *hash = NULL; - - g_return_if_fail (NM_IS_CLIENT (client)); - g_return_if_fail (NM_IS_DEVICE (device)); - - info = g_slice_new0 (ActivateInfo); - info->add_act_fn = callback; - info->user_data = user_data; - info->client = client; - - if (partial) - hash = nm_connection_to_hash (partial, NM_SETTING_HASH_FLAG_ALL); - if (!hash) - hash = g_hash_table_new (g_str_hash, g_str_equal); - - priv = NM_CLIENT_GET_PRIVATE (client); - priv->pending_activations = g_slist_prepend (priv->pending_activations, info); - - if (priv->manager_running) { - dbus_g_proxy_begin_call (priv->client_proxy, "AddAndActivateConnection", - add_activate_cb, info, NULL, - DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, hash, - DBUS_TYPE_G_OBJECT_PATH, nm_object_get_path (NM_OBJECT (device)), - DBUS_TYPE_G_OBJECT_PATH, specific_object ?: "/", - G_TYPE_INVALID); - } else - info->idle_id = g_idle_add (activate_nm_not_running, info); - - g_hash_table_unref (hash); -} - -static void -active_connections_changed_cb (GObject *object, GParamSpec *pspec, gpointer user_data) -{ - recheck_pending_activations (NM_CLIENT (object), NULL, NULL); -} - -static void -object_creation_failed_cb (GObject *object, GError *error, char *failed_path) -{ - if (error) - recheck_pending_activations (NM_CLIENT (object), failed_path, error); -} - -/** - * nm_client_deactivate_connection: - * @client: a #NMClient - * @active: the #NMActiveConnection to deactivate - * - * Deactivates an active #NMActiveConnection. - **/ -void -nm_client_deactivate_connection (NMClient *client, NMActiveConnection *active) -{ - NMClientPrivate *priv; - const char *path; - GError *error = NULL; - - g_return_if_fail (NM_IS_CLIENT (client)); - g_return_if_fail (NM_IS_ACTIVE_CONNECTION (active)); - - priv = NM_CLIENT_GET_PRIVATE (client); - if (!priv->manager_running) - return; - - path = nm_object_get_path (NM_OBJECT (active)); - if (!dbus_g_proxy_call (priv->client_proxy, "DeactivateConnection", &error, - DBUS_TYPE_G_OBJECT_PATH, path, - G_TYPE_INVALID, - G_TYPE_INVALID)) { - g_warning ("Could not deactivate connection '%s': %s", - path, NM_G_ERROR_MSG (error)); - g_clear_error (&error); - } -} - -/** - * nm_client_get_active_connections: - * @client: a #NMClient - * - * Gets the active connections. - * - * Returns: (transfer none) (element-type NMActiveConnection): a #GPtrArray - * containing all the active #NMActiveConnections. - * The returned array is owned by the client and should not be modified. - **/ -const GPtrArray * -nm_client_get_active_connections (NMClient *client) -{ - NMClientPrivate *priv; - - g_return_val_if_fail (NM_IS_CLIENT (client), NULL); - - _nm_object_ensure_inited (NM_OBJECT (client)); - - priv = NM_CLIENT_GET_PRIVATE (client); - if (!priv->manager_running) - return NULL; - - return handle_ptr_array_return (priv->active_connections); -} - -/** - * nm_client_wireless_get_enabled: - * @client: a #NMClient - * - * Determines whether the wireless is enabled. - * - * Returns: %TRUE if wireless is enabled - **/ -gboolean -nm_client_wireless_get_enabled (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (client)); - return NM_CLIENT_GET_PRIVATE (client)->wireless_enabled; -} - -/** - * nm_client_wireless_set_enabled: - * @client: a #NMClient - * @enabled: %TRUE to enable wireless - * - * Enables or disables wireless devices. - **/ -void -nm_client_wireless_set_enabled (NMClient *client, gboolean enabled) -{ - GValue value = G_VALUE_INIT; - - g_return_if_fail (NM_IS_CLIENT (client)); - - if (!NM_CLIENT_GET_PRIVATE (client)->manager_running) - return; - - g_value_init (&value, G_TYPE_BOOLEAN); - g_value_set_boolean (&value, enabled); - - _nm_object_set_property (NM_OBJECT (client), - NM_DBUS_INTERFACE, - "WirelessEnabled", - &value); -} - -/** - * nm_client_wireless_hardware_get_enabled: - * @client: a #NMClient - * - * Determines whether the wireless hardware is enabled. - * - * Returns: %TRUE if the wireless hardware is enabled - **/ -gboolean -nm_client_wireless_hardware_get_enabled (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (client)); - return NM_CLIENT_GET_PRIVATE (client)->wireless_hw_enabled; -} - -/** - * nm_client_wwan_get_enabled: - * @client: a #NMClient - * - * Determines whether WWAN is enabled. - * - * Returns: %TRUE if WWAN is enabled - **/ -gboolean -nm_client_wwan_get_enabled (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (client)); - return NM_CLIENT_GET_PRIVATE (client)->wwan_enabled; -} - -/** - * nm_client_wwan_set_enabled: - * @client: a #NMClient - * @enabled: %TRUE to enable WWAN - * - * Enables or disables WWAN devices. - **/ -void -nm_client_wwan_set_enabled (NMClient *client, gboolean enabled) -{ - GValue value = G_VALUE_INIT; - - g_return_if_fail (NM_IS_CLIENT (client)); - - if (!NM_CLIENT_GET_PRIVATE (client)->manager_running) - return; - - g_value_init (&value, G_TYPE_BOOLEAN); - g_value_set_boolean (&value, enabled); - - _nm_object_set_property (NM_OBJECT (client), - NM_DBUS_INTERFACE, - "WwanEnabled", - &value); -} - -/** - * nm_client_wwan_hardware_get_enabled: - * @client: a #NMClient - * - * Determines whether the WWAN hardware is enabled. - * - * Returns: %TRUE if the WWAN hardware is enabled - **/ -gboolean -nm_client_wwan_hardware_get_enabled (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (client)); - return NM_CLIENT_GET_PRIVATE (client)->wwan_hw_enabled; -} - -/** - * nm_client_wimax_get_enabled: - * @client: a #NMClient - * - * Determines whether WiMAX is enabled. - * - * Returns: %TRUE if WiMAX is enabled - **/ -gboolean -nm_client_wimax_get_enabled (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (client)); - return NM_CLIENT_GET_PRIVATE (client)->wimax_enabled; -} - -/** - * nm_client_wimax_set_enabled: - * @client: a #NMClient - * @enabled: %TRUE to enable WiMAX - * - * Enables or disables WiMAX devices. - **/ -void -nm_client_wimax_set_enabled (NMClient *client, gboolean enabled) -{ - GValue value = G_VALUE_INIT; - - g_return_if_fail (NM_IS_CLIENT (client)); - - if (!NM_CLIENT_GET_PRIVATE (client)->manager_running) - return; - - g_value_init (&value, G_TYPE_BOOLEAN); - g_value_set_boolean (&value, enabled); - - _nm_object_set_property (NM_OBJECT (client), - NM_DBUS_INTERFACE, - "WimaxEnabled", - &value); -} - -/** - * nm_client_wimax_hardware_get_enabled: - * @client: a #NMClient - * - * Determines whether the WiMAX hardware is enabled. - * - * Returns: %TRUE if the WiMAX hardware is enabled - **/ -gboolean -nm_client_wimax_hardware_get_enabled (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (client)); - return NM_CLIENT_GET_PRIVATE (client)->wimax_hw_enabled; -} - -/** - * nm_client_get_version: - * @client: a #NMClient - * - * Gets NetworkManager version. - * - * Returns: string with the version - **/ -const char * -nm_client_get_version (NMClient *client) -{ - NMClientPrivate *priv; - - g_return_val_if_fail (NM_IS_CLIENT (client), NULL); - - priv = NM_CLIENT_GET_PRIVATE (client); - - _nm_object_ensure_inited (NM_OBJECT (client)); - - return priv->manager_running ? priv->version : NULL; -} - -/** - * nm_client_get_state: - * @client: a #NMClient - * - * Gets the current daemon state. - * - * Returns: the current %NMState - **/ -NMState -nm_client_get_state (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), NM_STATE_UNKNOWN); - - _nm_object_ensure_inited (NM_OBJECT (client)); - - return NM_CLIENT_GET_PRIVATE (client)->state; -} - -/** - * nm_client_get_startup: - * @client: a #NMClient - * - * Tests whether the daemon is still in the process of activating - * connections at startup. - * - * Returns: whether the daemon is still starting up - * - * Since: 0.9.10 - **/ -gboolean -nm_client_get_startup (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), NM_STATE_UNKNOWN); - - _nm_object_ensure_inited (NM_OBJECT (client)); - - return NM_CLIENT_GET_PRIVATE (client)->startup; -} - -/** - * nm_client_networking_get_enabled: - * @client: a #NMClient - * - * Whether networking is enabled or disabled. - * - * Returns: %TRUE if networking is enabled, %FALSE if networking is disabled - **/ -gboolean -nm_client_networking_get_enabled (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (client)); - return NM_CLIENT_GET_PRIVATE (client)->networking_enabled; -} - -/** - * nm_client_networking_set_enabled: - * @client: a #NMClient - * @enabled: %TRUE to set networking enabled, %FALSE to set networking disabled - * - * Enables or disables networking. When networking is disabled, all controlled - * interfaces are disconnected and deactivated. When networking is enabled, - * all controlled interfaces are available for activation. - **/ -void -nm_client_networking_set_enabled (NMClient *client, gboolean enable) -{ - GError *err = NULL; - - g_return_if_fail (NM_IS_CLIENT (client)); - - if (!NM_CLIENT_GET_PRIVATE (client)->manager_running) - return; - - if (!dbus_g_proxy_call (NM_CLIENT_GET_PRIVATE (client)->client_proxy, "Enable", &err, - G_TYPE_BOOLEAN, enable, - G_TYPE_INVALID, - G_TYPE_INVALID)) { - g_warning ("Error enabling/disabling networking: %s", - err ? err->message : "(unknown)"); - g_clear_error (&err); - } -} - -/** - * nm_client_sleep: - * @client: a #NMClient - * @sleep_: %TRUE to put the daemon to sleep - * - * Deprecated; use nm_client_networking_set_enabled() instead. - **/ -void -nm_client_sleep (NMClient *client, gboolean sleep_) -{ - nm_client_networking_set_enabled (client, !sleep_); -} - -/** - * nm_client_get_manager_running: - * @client: a #NMClient - * - * Determines whether the daemon is running. - * - * Returns: %TRUE if the daemon is running - **/ -gboolean -nm_client_get_manager_running (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - - return NM_CLIENT_GET_PRIVATE (client)->manager_running; -} - -/** - * nm_client_get_permission_result: - * @client: a #NMClient - * @permission: the permission for which to return the result, one of #NMClientPermission - * - * Requests the result of a specific permission, which indicates whether the - * client can or cannot perform the action the permission represents - * - * Returns: the permission's result, one of #NMClientPermissionResult - **/ -NMClientPermissionResult -nm_client_get_permission_result (NMClient *client, NMClientPermission permission) -{ - gpointer result; - - g_return_val_if_fail (NM_IS_CLIENT (client), NM_CLIENT_PERMISSION_RESULT_UNKNOWN); - - result = g_hash_table_lookup (NM_CLIENT_GET_PRIVATE (client)->permissions, - GUINT_TO_POINTER (permission)); - return GPOINTER_TO_UINT (result); -} - -/** - * nm_client_get_logging: - * @client: a #NMClient - * @level: (allow-none): return location for logging level string - * @domains: (allow-none): return location for log domains string. The string is - * a list of domains separated by "," - * @error: (allow-none): return location for a #GError, or %NULL - * - * Gets NetworkManager current logging level and domains. - * - * Returns: %TRUE on success, %FALSE otherwise - * - * Since: 0.9.8 - **/ -gboolean -nm_client_get_logging (NMClient *client, char **level, char **domains, GError **error) -{ - NMClientPrivate *priv; - - g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - g_return_val_if_fail (level == NULL || *level == NULL, FALSE); - g_return_val_if_fail (domains == NULL || *domains == NULL, FALSE); - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - priv = NM_CLIENT_GET_PRIVATE (client); - if (!priv->manager_running) { - g_set_error_literal (error, - NM_CLIENT_ERROR, - NM_CLIENT_ERROR_MANAGER_NOT_RUNNING, - "NetworkManager is not running"); - return FALSE; - } - - if (!level && !domains) - return TRUE; - - return dbus_g_proxy_call (priv->client_proxy, "GetLogging", error, - G_TYPE_INVALID, - G_TYPE_STRING, level, - G_TYPE_STRING, domains, - G_TYPE_INVALID); -} - -/** - * nm_client_set_logging: - * @client: a #NMClient - * @level: (allow-none): logging level to set (%NULL or an empty string for no change) - * @domains: (allow-none): logging domains to set. The string should be a list of log - * domains separated by ",". (%NULL or an empty string for no change) - * @error: (allow-none): return location for a #GError, or %NULL - * - * Sets NetworkManager logging level and/or domains. - * - * Returns: %TRUE on success, %FALSE otherwise - * - * Since: 0.9.8 - **/ -gboolean -nm_client_set_logging (NMClient *client, const char *level, const char *domains, GError **error) -{ - NMClientPrivate *priv; - - g_return_val_if_fail (NM_IS_CLIENT (client), FALSE); - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - priv = NM_CLIENT_GET_PRIVATE (client); - if (!priv->manager_running) { - g_set_error_literal (error, - NM_CLIENT_ERROR, - NM_CLIENT_ERROR_MANAGER_NOT_RUNNING, - "NetworkManager is not running"); - return FALSE; - } - - if (!level && !domains) - return TRUE; - - return dbus_g_proxy_call (priv->client_proxy, "SetLogging", error, - G_TYPE_STRING, level ?: "", - G_TYPE_STRING, domains ?: "", - G_TYPE_INVALID, - G_TYPE_INVALID); -} - -/** - * nm_client_get_primary_connection: - * @client: an #NMClient - * - * Gets the #NMActiveConnection corresponding to the primary active - * network device. - * - * In particular, when there is no VPN active, or the VPN does not - * have the default route, this returns the active connection that has - * the default route. If there is a VPN active with the default route, - * then this function returns the active connection that contains the - * route to the VPN endpoint. - * - * If there is no default route, or the default route is over a - * non-NetworkManager-recognized device, this will return %NULL. - * - * Returns: (transfer none): the appropriate #NMActiveConnection, if - * any - * - * Since: 0.9.8.6 - */ -NMActiveConnection * -nm_client_get_primary_connection (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), NULL); - - _nm_object_ensure_inited (NM_OBJECT (client)); - return NM_CLIENT_GET_PRIVATE (client)->primary_connection; -} - -/** - * nm_client_get_activating_connection: - * @client: an #NMClient - * - * Gets the #NMActiveConnection corresponding to a - * currently-activating connection that is expected to become the new - * #NMClient:primary-connection upon successful activation. - * - * Returns: (transfer none): the appropriate #NMActiveConnection, if - * any. - * - * Since: 0.9.8.6 - */ -NMActiveConnection * -nm_client_get_activating_connection (NMClient *client) -{ - g_return_val_if_fail (NM_IS_CLIENT (client), NULL); - - _nm_object_ensure_inited (NM_OBJECT (client)); - return NM_CLIENT_GET_PRIVATE (client)->activating_connection; -} - -/*****************************************************************************/ - -static void -free_devices (NMClient *client, gboolean in_dispose) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client); - gs_unref_ptrarray GPtrArray *real_devices = NULL; - gs_unref_ptrarray GPtrArray *all_devices = NULL; - GPtrArray *devices = NULL; - guint i, j; - - real_devices = priv->devices; - all_devices = priv->all_devices; - - if (in_dispose) { - priv->devices = NULL; - priv->all_devices = NULL; - } else { - priv->devices = g_ptr_array_new (); - priv->all_devices = g_ptr_array_new (); - } - - if (all_devices && all_devices->len > 0) - devices = all_devices; - else if (real_devices && real_devices->len > 0) - devices = real_devices; - - if (real_devices && devices != real_devices) { - for (i = 0; i < real_devices->len; i++) { - NMDevice *d = real_devices->pdata[i]; - - if (all_devices) { - for (j = 0; j < all_devices->len; j++) { - if (d == all_devices->pdata[j]) - goto next; - } - } - if (!in_dispose) - g_signal_emit (client, signals[DEVICE_REMOVED], 0, d); -next: - g_object_unref (d); - } - } - if (devices) { - for (i = 0; i < devices->len; i++) { - NMDevice *d = devices->pdata[i]; - - if (!in_dispose) - g_signal_emit (client, signals[DEVICE_REMOVED], 0, d); - g_object_unref (d); - } - } -} - -static void -free_active_connections (NMClient *client, gboolean emit_signals) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client); - GPtrArray *active_connections; - NMActiveConnection *active_connection; - int i; - - if (!priv->active_connections) - return; - - active_connections = priv->active_connections; - priv->active_connections = NULL; - for (i = 0; i < active_connections->len; i++) { - active_connection = active_connections->pdata[i]; - /* Break circular refs */ - g_object_run_dispose (G_OBJECT (active_connection)); - g_object_unref (active_connection); - } - g_ptr_array_free (active_connections, TRUE); - - if (emit_signals) - g_object_notify (G_OBJECT (client), NM_CLIENT_ACTIVE_CONNECTIONS); -} - -static void -updated_properties (GObject *object, GAsyncResult *result, gpointer user_data) -{ - NMClient *client = NM_CLIENT (user_data); - GError *error = NULL; - - if (!_nm_object_reload_properties_finish (NM_OBJECT (object), result, &error)) { - g_warning ("%s: error reading NMClient properties: %s", __func__, error->message); - g_error_free (error); - } - - _nm_object_queue_notify (NM_OBJECT (client), NM_CLIENT_MANAGER_RUNNING); -} - -static void -proxy_name_owner_changed (DBusGProxy *proxy, - const char *name, - const char *old_owner, - const char *new_owner, - gpointer user_data) -{ - NMClient *client = NM_CLIENT (user_data); - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client); - gboolean old_good = (old_owner && strlen (old_owner)); - gboolean new_good = (new_owner && strlen (new_owner)); - gboolean new_running = FALSE; - - if (!name || strcmp (name, NM_DBUS_SERVICE)) - return; - - if (!old_good && new_good) - new_running = TRUE; - else if (old_good && !new_good) - new_running = FALSE; - - if (new_running == priv->manager_running) - return; - - priv->manager_running = new_running; - if (!priv->manager_running) { - priv->state = NM_STATE_UNKNOWN; - priv->startup = FALSE; - _nm_object_queue_notify (NM_OBJECT (client), NM_CLIENT_MANAGER_RUNNING); - _nm_object_suppress_property_updates (NM_OBJECT (client), TRUE); - poke_wireless_devices_with_rf_status (client); - free_devices (client, FALSE); - free_active_connections (client, TRUE); - update_permissions (client, NULL); - priv->wireless_enabled = FALSE; - priv->wireless_hw_enabled = FALSE; - priv->wwan_enabled = FALSE; - priv->wwan_hw_enabled = FALSE; - priv->wimax_enabled = FALSE; - priv->wimax_hw_enabled = FALSE; - g_free (priv->version); - priv->version = NULL; - - /* Clear object cache to ensure bad refcounting by clients doesn't - * keep objects in the cache. - */ - _nm_object_cache_clear (); - } else { - _nm_object_suppress_property_updates (NM_OBJECT (client), FALSE); - _nm_object_reload_properties_async (NM_OBJECT (client), updated_properties, client); - client_recheck_permissions (priv->client_proxy, client); - } -} - -/** - * nm_client_get_connectivity: - * @client: an #NMClient - * - * Gets the current network connectivity state. Contrast - * nm_client_check_connectivity() and - * nm_client_check_connectivity_async(), which re-check the - * connectivity state first before returning any information. - * - * Returns: the current connectivity state - * Since: 0.9.8.6 - */ -NMConnectivityState -nm_client_get_connectivity (NMClient *client) -{ - NMClientPrivate *priv; - - g_return_val_if_fail (NM_IS_CLIENT (client), NM_CONNECTIVITY_UNKNOWN); - priv = NM_CLIENT_GET_PRIVATE (client); - - _nm_object_ensure_inited (NM_OBJECT (client)); - - return priv->connectivity; -} - -/** - * nm_client_check_connectivity: - * @client: an #NMClient - * @cancellable: a #GCancellable - * @error: return location for a #GError - * - * Updates the network connectivity state and returns the (new) - * current state. Contrast nm_client_get_connectivity(), which returns - * the most recent known state without re-checking. - * - * This is a blocking call; use nm_client_check_connectivity_async() - * if you do not want to block. - * - * Returns: the (new) current connectivity state - * Since: 0.9.8.6 - */ -NMConnectivityState -nm_client_check_connectivity (NMClient *client, - GCancellable *cancellable, - GError **error) -{ - NMClientPrivate *priv; - NMConnectivityState connectivity; - - g_return_val_if_fail (NM_IS_CLIENT (client), NM_CONNECTIVITY_UNKNOWN); - priv = NM_CLIENT_GET_PRIVATE (client); - - if (!dbus_g_proxy_call (priv->client_proxy, "CheckConnectivity", error, - G_TYPE_INVALID, - G_TYPE_UINT, &connectivity, - G_TYPE_INVALID)) - connectivity = NM_CONNECTIVITY_UNKNOWN; - - return connectivity; -} - -typedef struct { - NMClient *client; - DBusGProxyCall *call; - GCancellable *cancellable; - guint cancelled_id; - NMConnectivityState connectivity; -} CheckConnectivityData; - -static void -check_connectivity_data_free (CheckConnectivityData *ccd) -{ - if (ccd->cancellable) { - if (ccd->cancelled_id) - g_signal_handler_disconnect (ccd->cancellable, ccd->cancelled_id); - g_object_unref (ccd->cancellable); - } - - g_slice_free (CheckConnectivityData, ccd); -} - -static void -check_connectivity_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - GSimpleAsyncResult *simple = user_data; - CheckConnectivityData *ccd = g_simple_async_result_get_op_res_gpointer (simple); - GError *error = NULL; - - if (ccd->cancellable) { - g_signal_handler_disconnect (ccd->cancellable, ccd->cancelled_id); - ccd->cancelled_id = 0; - } - - if (!dbus_g_proxy_end_call (proxy, call, &error, - G_TYPE_UINT, &ccd->connectivity, - G_TYPE_INVALID)) - g_simple_async_result_take_error (simple, error); - - g_simple_async_result_complete (simple); - g_object_unref (simple); -} - -static void -check_connectivity_cancelled_cb (GCancellable *cancellable, - gpointer user_data) -{ - GSimpleAsyncResult *simple = user_data; - CheckConnectivityData *ccd = g_simple_async_result_get_op_res_gpointer (simple); - - g_signal_handler_disconnect (cancellable, ccd->cancelled_id); - ccd->cancelled_id = 0; - - dbus_g_proxy_cancel_call (NM_CLIENT_GET_PRIVATE (ccd->client)->client_proxy, ccd->call); - g_simple_async_result_complete_in_idle (simple); -} - -/** - * nm_client_check_connectivity_async: - * @client: an #NMClient - * @cancellable: a #GCancellable - * @callback: callback to call with the result - * @user_data: data for @callback. - * - * Asynchronously updates the network connectivity state and invokes - * @callback when complete. Contrast nm_client_get_connectivity(), - * which (immediately) returns the most recent known state without - * re-checking, and nm_client_check_connectivity(), which blocks. - * - * Since: 0.9.8.6 - */ -void -nm_client_check_connectivity_async (NMClient *client, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - NMClientPrivate *priv; - GSimpleAsyncResult *simple; - CheckConnectivityData *ccd; - - g_return_if_fail (NM_IS_CLIENT (client)); - priv = NM_CLIENT_GET_PRIVATE (client); - - ccd = g_slice_new0 (CheckConnectivityData); - ccd->client = client; - - simple = g_simple_async_result_new (G_OBJECT (client), callback, user_data, - nm_client_check_connectivity_async); - if (cancellable) - g_simple_async_result_set_check_cancellable (simple, cancellable); - g_simple_async_result_set_op_res_gpointer (simple, ccd, (GDestroyNotify) check_connectivity_data_free); - - if (cancellable) { - ccd->cancellable = g_object_ref (cancellable); - ccd->cancelled_id = g_signal_connect (cancellable, "cancelled", - G_CALLBACK (check_connectivity_cancelled_cb), - simple); - g_simple_async_result_set_check_cancellable (simple, cancellable); - } - - ccd->call = dbus_g_proxy_begin_call (priv->client_proxy, "CheckConnectivity", - check_connectivity_cb, simple, NULL, - G_TYPE_INVALID); -} - -/** - * nm_client_check_connectivity_finish: - * @client: an #NMClient - * @result: the #GAsyncResult - * @error: return location for a #GError - * - * Retrieves the result of an nm_client_check_connectivity_async() - * call. - * - * Returns: the (new) current connectivity state - * Since: 0.9.8.6 - */ -NMConnectivityState -nm_client_check_connectivity_finish (NMClient *client, - GAsyncResult *result, - GError **error) -{ - GSimpleAsyncResult *simple; - CheckConnectivityData *ccd; - - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (client), nm_client_check_connectivity_async), NM_CONNECTIVITY_UNKNOWN); - - simple = G_SIMPLE_ASYNC_RESULT (result); - ccd = g_simple_async_result_get_op_res_gpointer (simple); - - if (g_simple_async_result_propagate_error (simple, error)) - return NM_CONNECTIVITY_UNKNOWN; - - return ccd->connectivity; -} - -/*****************************************************************************/ - -/** - * nm_client_new: - * - * Creates a new #NMClient. - * - * Note that this will do blocking D-Bus calls to initialize the - * client. You can use nm_client_new_async() if you want to avoid - * that. - * - * NOTE: #NMClient provides information about devices and a mechanism to - * control them. To access and modify network configuration data, use the - * #NMRemoteSettings object. - * - * Returns: a new #NMClient or NULL on an error - **/ -NMClient * -nm_client_new (void) -{ - NMClient *client; - - client = g_object_new (NM_TYPE_CLIENT, NM_OBJECT_DBUS_PATH, NM_DBUS_PATH, NULL); - - /* NMObject's constructor() can fail on a D-Bus connection error. So we can - * get NULL here instead of a valid NMClient object. - */ - if (client) - _nm_object_ensure_inited (NM_OBJECT (client)); - - return client; -} - -static void -client_inited (GObject *source, GAsyncResult *result, gpointer user_data) -{ - GSimpleAsyncResult *simple = user_data; - GError *error = NULL; - - if (!g_async_initable_init_finish (G_ASYNC_INITABLE (source), result, &error)) - g_simple_async_result_take_error (simple, error); - else - g_simple_async_result_set_op_res_gpointer (simple, source, g_object_unref); - g_simple_async_result_complete (simple); - g_object_unref (simple); -} - -/** - * nm_client_new_async: - * @cancellable: a #GCancellable, or %NULL - * @callback: callback to call when the client is created - * @user_data: data for @callback - * - * Creates a new #NMClient and begins asynchronously initializing it. - * @callback will be called when it is done; use - * nm_client_new_finish() to get the result. Note that on an error, - * the callback can be invoked with two first parameters as NULL. - * - * NOTE: #NMClient provides information about devices and a mechanism to - * control them. To access and modify network configuration data, use the - * #NMRemoteSettings object. - **/ -void -nm_client_new_async (GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - NMClient *client; - GSimpleAsyncResult *simple; - - client = g_object_new (NM_TYPE_CLIENT, NM_OBJECT_DBUS_PATH, NM_DBUS_PATH, NULL); - /* When client is NULL, do no continue with initialization and run callback - * directly with result == NULL indicating NMClient creation failure. - */ - if (!client) { - callback (NULL, NULL, user_data); - return; - } - - simple = g_simple_async_result_new (NULL, callback, user_data, nm_client_new_async); - if (cancellable) - g_simple_async_result_set_check_cancellable (simple, cancellable); - g_async_initable_init_async (G_ASYNC_INITABLE (client), G_PRIORITY_DEFAULT, - cancellable, client_inited, simple); -} - -/** - * nm_client_new_finish: - * @result: a #GAsyncResult - * @error: location for a #GError, or %NULL - * - * Gets the result of an nm_client_new_async() call. - * - * Returns: a new #NMClient, or %NULL on error - **/ -NMClient * -nm_client_new_finish (GAsyncResult *result, GError **error) -{ - GSimpleAsyncResult *simple; - - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - if (!result) { - g_set_error_literal (error, - NM_CLIENT_ERROR, - NM_CLIENT_ERROR_UNKNOWN, - "NMClient initialization failed (or you passed NULL 'result' by mistake)"); - return NULL; - } - - g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, nm_client_new_async), NULL); - - simple = G_SIMPLE_ASYNC_RESULT (result); - if (g_simple_async_result_propagate_error (simple, error)) - return NULL; - else - return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple)); -} - -/* - * constructor() shouldn't be overridden in most cases, rather constructed() - * method is preferred and more useful. - * But, this serves as a workaround for bindings (use) calling the constructor() - * directly instead of nm_client_new() function, and neither providing - * construction properties. So, we fill "dbus-path" here if it was not specified - * (was set to default value (NULL)). - * - * It allows this python code: - * from gi.repository import NMClient - * nmclient = NMClient.Client() - * print nmclient.get_active_connections() - * - * instead of proper - * nmclient = NMClient.Client().new() - * - * Note: - * A nice overview of GObject construction is here: - * http://blogs.gnome.org/desrt/2012/02/26/a-gentle-introduction-to-gobject-construction - * It is much better explanation than the official docs - * http://developer.gnome.org/gobject/unstable/chapter-gobject.html#gobject-instantiation - */ -static GObject* -constructor (GType type, - guint n_construct_params, - GObjectConstructParam *construct_params) -{ - GObject *object; - guint i; - const char *dbus_path; - - for (i = 0; i < n_construct_params; i++) { - if (strcmp (construct_params[i].pspec->name, NM_OBJECT_DBUS_PATH) == 0) { - dbus_path = g_value_get_string (construct_params[i].value); - if (dbus_path == NULL) { - g_value_set_static_string (construct_params[i].value, NM_DBUS_PATH); - } else { - if (!g_variant_is_object_path (dbus_path)) { - g_warning ("Passed D-Bus object path '%s' is invalid; using default '%s' instead", - dbus_path, NM_DBUS_PATH); - g_value_set_static_string (construct_params[i].value, NM_DBUS_PATH); - } - } - break; - } - } - - object = G_OBJECT_CLASS (nm_client_parent_class)->constructor (type, - n_construct_params, - construct_params); - - return object; -} - -static void -constructed (GObject *object) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (object); - GError *error = NULL; - - if (!nm_utils_init (&error)) { - g_warning ("Couldn't initialize nm-utils/crypto system: %s", - error->message); - g_clear_error (&error); - } - - G_OBJECT_CLASS (nm_client_parent_class)->constructed (object); - - priv->client_proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE); - - register_properties (NM_CLIENT (object)); - - /* Permissions */ - dbus_g_proxy_add_signal (priv->client_proxy, "CheckPermissions", G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->client_proxy, - "CheckPermissions", - G_CALLBACK (client_recheck_permissions), - object, - NULL); - - priv->bus_proxy = dbus_g_proxy_new_for_name (nm_object_get_connection (NM_OBJECT (object)), - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS); - g_assert (priv->bus_proxy); - - dbus_g_proxy_add_signal (priv->bus_proxy, "NameOwnerChanged", - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->bus_proxy, - "NameOwnerChanged", - G_CALLBACK (proxy_name_owner_changed), - object, NULL); - - g_signal_connect (object, "notify::" NM_CLIENT_WIRELESS_ENABLED, - G_CALLBACK (wireless_enabled_cb), NULL); - - g_signal_connect (object, "notify::" NM_CLIENT_ACTIVE_CONNECTIONS, - G_CALLBACK (active_connections_changed_cb), NULL); - - g_signal_connect (object, "object-creation-failed", - G_CALLBACK (object_creation_failed_cb), NULL); -} - -static gboolean -init_sync (GInitable *initable, GCancellable *cancellable, GError **error) -{ - NMClient *client = NM_CLIENT (initable); - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (client); - - if (!nm_client_parent_initable_iface->init (initable, cancellable, error)) - return FALSE; - - if (!dbus_g_proxy_call (priv->bus_proxy, - "NameHasOwner", error, - G_TYPE_STRING, NM_DBUS_SERVICE, - G_TYPE_INVALID, - G_TYPE_BOOLEAN, &priv->manager_running, - G_TYPE_INVALID)) - return FALSE; - - if (priv->manager_running && !get_permissions_sync (client, error)) - return FALSE; - - return TRUE; -} - -typedef struct { - NMClient *client; - GSimpleAsyncResult *result; - gboolean properties_pending; - gboolean permissions_pending; -} NMClientInitData; - -static void -init_async_complete (NMClientInitData *init_data) -{ - if (init_data->properties_pending || init_data->permissions_pending) - return; - - g_simple_async_result_complete (init_data->result); - g_object_unref (init_data->result); - g_slice_free (NMClientInitData, init_data); -} - -static void -init_async_got_permissions (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) -{ - NMClientInitData *init_data = user_data; - gs_unref_hashtable GHashTable *permissions = NULL; - gs_free_error GError *error = NULL; - - dbus_g_proxy_end_call (proxy, call, &error, - DBUS_TYPE_G_MAP_OF_STRING, &permissions, - G_TYPE_INVALID); - update_permissions (init_data->client, error ? NULL : permissions); - - init_data->permissions_pending = FALSE; - init_async_complete (init_data); -} - -static void -init_async_got_properties (GObject *source, GAsyncResult *result, gpointer user_data) -{ - NMClientInitData *init_data = user_data; - GError *error = NULL; - - if (!nm_client_parent_async_initable_iface->init_finish (G_ASYNC_INITABLE (source), result, &error)) - g_simple_async_result_take_error (init_data->result, error); - - init_data->properties_pending = FALSE; - init_async_complete (init_data); -} - -static void -finish_init (NMClientInitData *init_data) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (init_data->client); - - nm_client_parent_async_initable_iface->init_async (G_ASYNC_INITABLE (init_data->client), - G_PRIORITY_DEFAULT, NULL, /* FIXME cancellable */ - init_async_got_properties, init_data); - init_data->properties_pending = TRUE; - - dbus_g_proxy_begin_call (priv->client_proxy, "GetPermissions", - init_async_got_permissions, init_data, NULL, - G_TYPE_INVALID); - init_data->permissions_pending = TRUE; -} - -static void -init_async_got_manager_running (DBusGProxy *proxy, DBusGProxyCall *call, - gpointer user_data) -{ - NMClientInitData *init_data = user_data; - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (init_data->client); - GError *error = NULL; - - if (!dbus_g_proxy_end_call (proxy, call, &error, - G_TYPE_BOOLEAN, &priv->manager_running, - G_TYPE_INVALID)) { - g_simple_async_result_take_error (init_data->result, error); - init_async_complete (init_data); - return; - } - - if (!priv->manager_running) { - init_async_complete (init_data); - return; - } - - finish_init (init_data); -} - -static void -init_async (GAsyncInitable *initable, int io_priority, - GCancellable *cancellable, GAsyncReadyCallback callback, - gpointer user_data) -{ - NMClientInitData *init_data; - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (initable); - - init_data = g_slice_new0 (NMClientInitData); - init_data->client = NM_CLIENT (initable); - init_data->result = g_simple_async_result_new (G_OBJECT (initable), callback, - user_data, init_async); - if (cancellable) - g_simple_async_result_set_check_cancellable (init_data->result, cancellable); - g_simple_async_result_set_op_res_gboolean (init_data->result, TRUE); - - /* Check if NM is running */ - dbus_g_proxy_begin_call (priv->bus_proxy, "NameHasOwner", - init_async_got_manager_running, - init_data, NULL, - G_TYPE_STRING, NM_DBUS_SERVICE, - G_TYPE_INVALID); -} - -static gboolean -init_finish (GAsyncInitable *initable, GAsyncResult *result, GError **error) -{ - GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); - - if (g_simple_async_result_propagate_error (simple, error)) - return FALSE; - else - return TRUE; -} - -static void -dispose (GObject *object) -{ - NMClient *client = NM_CLIENT (object); - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (object); - - if (priv->perm_call) { - dbus_g_proxy_cancel_call (priv->client_proxy, priv->perm_call); - priv->perm_call = NULL; - } - - g_clear_object (&priv->client_proxy); - g_clear_object (&priv->bus_proxy); - - free_devices (client, TRUE); - free_active_connections (client, FALSE); - g_clear_object (&priv->primary_connection); - g_clear_object (&priv->activating_connection); - - g_slist_free_full (priv->pending_activations, (GDestroyNotify) activate_info_free); - priv->pending_activations = NULL; - - g_hash_table_destroy (priv->permissions); - priv->permissions = NULL; - - G_OBJECT_CLASS (nm_client_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (object); - - g_free (priv->version); - - G_OBJECT_CLASS (nm_client_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (object); - gboolean b; - - switch (prop_id) { - case PROP_NETWORKING_ENABLED: - b = g_value_get_boolean (value); - if (priv->networking_enabled != b) { - nm_client_networking_set_enabled (NM_CLIENT (object), b); - /* Let the property value flip when we get the change signal from NM */ - } - break; - case PROP_WIRELESS_ENABLED: - b = g_value_get_boolean (value); - if (priv->wireless_enabled != b) { - nm_client_wireless_set_enabled (NM_CLIENT (object), b); - /* Let the property value flip when we get the change signal from NM */ - } - break; - case PROP_WWAN_ENABLED: - b = g_value_get_boolean (value); - if (priv->wwan_enabled != b) { - nm_client_wwan_set_enabled (NM_CLIENT (object), b); - /* Let the property value flip when we get the change signal from NM */ - } - break; - case PROP_WIMAX_ENABLED: - b = g_value_get_boolean (value); - if (priv->wimax_enabled != b) { - nm_client_wimax_set_enabled (NM_CLIENT (object), b); - /* Let the property value flip when we get the change signal from NM */ - } - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMClient *self = NM_CLIENT (object); - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (self); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_VERSION: - g_value_set_string (value, nm_client_get_version (self)); - break; - case PROP_STATE: - g_value_set_uint (value, nm_client_get_state (self)); - break; - case PROP_STARTUP: - g_value_set_boolean (value, nm_client_get_startup (self)); - break; - case PROP_MANAGER_RUNNING: - g_value_set_boolean (value, priv->manager_running); - break; - case PROP_NETWORKING_ENABLED: - g_value_set_boolean (value, nm_client_networking_get_enabled (self)); - break; - case PROP_WIRELESS_ENABLED: - g_value_set_boolean (value, priv->wireless_enabled); - break; - case PROP_WIRELESS_HARDWARE_ENABLED: - g_value_set_boolean (value, priv->wireless_hw_enabled); - break; - case PROP_WWAN_ENABLED: - g_value_set_boolean (value, priv->wwan_enabled); - break; - case PROP_WWAN_HARDWARE_ENABLED: - g_value_set_boolean (value, priv->wwan_hw_enabled); - break; - case PROP_WIMAX_ENABLED: - g_value_set_boolean (value, priv->wimax_enabled); - break; - case PROP_WIMAX_HARDWARE_ENABLED: - g_value_set_boolean (value, priv->wimax_hw_enabled); - break; - case PROP_ACTIVE_CONNECTIONS: - g_value_set_boxed (value, nm_client_get_active_connections (self)); - break; - case PROP_CONNECTIVITY: - g_value_set_uint (value, priv->connectivity); - break; - case PROP_PRIMARY_CONNECTION: - g_value_set_object (value, priv->primary_connection); - break; - case PROP_ACTIVATING_CONNECTION: - g_value_set_object (value, priv->activating_connection); - break; - case PROP_DEVICES: - g_value_set_boxed (value, nm_client_get_devices (self)); - break; - case PROP_ALL_DEVICES: - g_value_set_boxed (value, nm_client_get_all_devices (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_client_class_init (NMClientClass *client_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (client_class); - - g_type_class_add_private (client_class, sizeof (NMClientPrivate)); - - /* virtual methods */ - object_class->constructor = constructor; - object_class->constructed = constructed; - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->dispose = dispose; - object_class->finalize = finalize; - - /* properties */ - - /** - * NMClient:version: - * - * The NetworkManager version. - **/ - g_object_class_install_property - (object_class, PROP_VERSION, - g_param_spec_string (NM_CLIENT_VERSION, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:state: - * - * The current daemon state. - **/ - g_object_class_install_property - (object_class, PROP_STATE, - g_param_spec_uint (NM_CLIENT_STATE, "", "", - NM_STATE_UNKNOWN, NM_STATE_CONNECTED_GLOBAL, NM_STATE_UNKNOWN, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:startup: - * - * Whether the daemon is still starting up. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_STARTUP, - g_param_spec_boolean (NM_CLIENT_STARTUP, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:manager-running: - * - * Whether the daemon is running. - **/ - g_object_class_install_property - (object_class, PROP_MANAGER_RUNNING, - g_param_spec_boolean (NM_CLIENT_MANAGER_RUNNING, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:networking-enabled: - * - * Whether networking is enabled. - **/ - g_object_class_install_property - (object_class, PROP_NETWORKING_ENABLED, - g_param_spec_boolean (NM_CLIENT_NETWORKING_ENABLED, "", "", - TRUE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:wireless-enabled: - * - * Whether wireless is enabled. - **/ - g_object_class_install_property - (object_class, PROP_WIRELESS_ENABLED, - g_param_spec_boolean (NM_CLIENT_WIRELESS_ENABLED, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:wireless-hardware-enabled: - * - * Whether the wireless hardware is enabled. - **/ - g_object_class_install_property - (object_class, PROP_WIRELESS_HARDWARE_ENABLED, - g_param_spec_boolean (NM_CLIENT_WIRELESS_HARDWARE_ENABLED, "", "", - TRUE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:wwan-enabled: - * - * Whether WWAN functionality is enabled. - **/ - g_object_class_install_property - (object_class, PROP_WWAN_ENABLED, - g_param_spec_boolean (NM_CLIENT_WWAN_ENABLED, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:wwan-hardware-enabled: - * - * Whether the WWAN hardware is enabled. - **/ - g_object_class_install_property - (object_class, PROP_WWAN_HARDWARE_ENABLED, - g_param_spec_boolean (NM_CLIENT_WWAN_HARDWARE_ENABLED, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:wimax-enabled: - * - * Whether WiMAX functionality is enabled. - **/ - g_object_class_install_property - (object_class, PROP_WIMAX_ENABLED, - g_param_spec_boolean (NM_CLIENT_WIMAX_ENABLED, "", "", - FALSE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:wimax-hardware-enabled: - * - * Whether the WiMAX hardware is enabled. - **/ - g_object_class_install_property - (object_class, PROP_WIMAX_HARDWARE_ENABLED, - g_param_spec_boolean (NM_CLIENT_WIMAX_HARDWARE_ENABLED, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:active-connections: (type GPtrArray): - * - * The active connections. - **/ - g_object_class_install_property - (object_class, PROP_ACTIVE_CONNECTIONS, - g_param_spec_boxed (NM_CLIENT_ACTIVE_CONNECTIONS, "", "", - NM_TYPE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:connectivity: - * - * The network connectivity state. - * - * Since: 0.9.8.6 - */ - g_object_class_install_property - (object_class, PROP_CONNECTIVITY, - g_param_spec_uint (NM_CLIENT_CONNECTIVITY, "", "", - NM_CONNECTIVITY_UNKNOWN, NM_CONNECTIVITY_FULL, NM_CONNECTIVITY_UNKNOWN, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:primary-connection: - * - * The #NMActiveConnection of the device with the default route; - * see nm_client_get_primary_connection() for more details. - * - * Since: 0.9.8.6 - **/ - g_object_class_install_property - (object_class, PROP_PRIMARY_CONNECTION, - g_param_spec_object (NM_CLIENT_PRIMARY_CONNECTION, "", "", - NM_TYPE_ACTIVE_CONNECTION, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:activating-connection: - * - * The #NMActiveConnection of the activating connection that is - * likely to become the new #NMClient:primary-connection. - * - * Since: 0.9.8.6 - **/ - g_object_class_install_property - (object_class, PROP_ACTIVATING_CONNECTION, - g_param_spec_object (NM_CLIENT_ACTIVATING_CONNECTION, "", "", - NM_TYPE_ACTIVE_CONNECTION, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:devices: - * - * List of real network devices. Does not include placeholder devices. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_DEVICES, - g_param_spec_boxed (NM_CLIENT_DEVICES, "", "", - NM_TYPE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMClient:all-devices: - * - * List of both real devices and device placeholders. - * - * Since: 1.2 - **/ - g_object_class_install_property - (object_class, PROP_ALL_DEVICES, - g_param_spec_boxed (NM_CLIENT_ALL_DEVICES, "", "", - NM_TYPE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /* signals */ - - /** - * NMClient::device-added: - * @client: the client that received the signal - * @device: (type NMDevice): the new device - * - * Notifies that a #NMDevice is added. This signal is not emitted for - * placeholder devices. - **/ - signals[DEVICE_ADDED] = - g_signal_new ("device-added", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMClientClass, device_added), - NULL, NULL, NULL, - G_TYPE_NONE, 1, - G_TYPE_OBJECT); - - /** - * NMClient::device-removed: - * @client: the client that received the signal - * @device: (type NMDevice): the removed device - * - * Notifies that a #NMDevice is removed. This signal is not emitted for - * placeholder devices. - **/ - signals[DEVICE_REMOVED] = - g_signal_new ("device-removed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMClientClass, device_removed), - NULL, NULL, NULL, - G_TYPE_NONE, 1, - G_TYPE_OBJECT); - - /** - * NMClient::any-device-added: - * @client: the client that received the signal - * @device: (type NMDevice): the new device - * - * Notifies that a #NMDevice is added. This signal is emitted for both - * regular devices and placeholder devices. - **/ - signals[ANY_DEVICE_ADDED] = - g_signal_new ("any-device-added", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, NULL, - G_TYPE_NONE, 1, - G_TYPE_OBJECT); - - /** - * NMClient::any-device-removed: - * @client: the client that received the signal - * @device: (type NMDevice): the removed device - * - * Notifies that a #NMDevice is removed. This signal is emitted for both - * regular devices and placeholder devices. - **/ - signals[ANY_DEVICE_REMOVED] = - g_signal_new ("any-device-removed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, NULL, - G_TYPE_NONE, 1, - G_TYPE_OBJECT); - - /** - * NMClient::permission-changed: - * @client: the client that received the signal - * @permission: a permission from #NMClientPermission - * @result: the permission's result, one of #NMClientPermissionResult - * - * Notifies that a permission has changed - **/ - signals[PERMISSION_CHANGED] = - g_signal_new ("permission-changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, NULL, - G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); -} - -static void -nm_client_initable_iface_init (GInitableIface *iface) -{ - nm_client_parent_initable_iface = g_type_interface_peek_parent (iface); - - iface->init = init_sync; -} - -static void -nm_client_async_initable_iface_init (GAsyncInitableIface *iface) -{ - nm_client_parent_async_initable_iface = g_type_interface_peek_parent (iface); - - iface->init_async = init_async; - iface->init_finish = init_finish; -} diff --git a/libnm-glib/nm-client.h b/libnm-glib/nm-client.h deleted file mode 100644 index fbbc3d92..00000000 --- a/libnm-glib/nm-client.h +++ /dev/null @@ -1,269 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#ifndef NM_CLIENT_H -#define NM_CLIENT_H - -#include <glib.h> -#include <glib-object.h> -#include <gio/gio.h> -#include <dbus/dbus-glib.h> -#include "NetworkManager.h" -#include "nm-object.h" -#include "nm-device.h" -#include "nm-active-connection.h" -#include "nm-vpn-connection.h" - -G_BEGIN_DECLS - -#define NM_TYPE_CLIENT (nm_client_get_type ()) -#define NM_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CLIENT, NMClient)) -#define NM_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CLIENT, NMClientClass)) -#define NM_IS_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CLIENT)) -#define NM_IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CLIENT)) -#define NM_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CLIENT, NMClientClass)) - -#define NM_CLIENT_VERSION "version" -#define NM_CLIENT_STATE "state" -#define NM_CLIENT_STARTUP "startup" -#define NM_CLIENT_MANAGER_RUNNING "manager-running" -#define NM_CLIENT_NETWORKING_ENABLED "networking-enabled" -#define NM_CLIENT_WIRELESS_ENABLED "wireless-enabled" -#define NM_CLIENT_WIRELESS_HARDWARE_ENABLED "wireless-hardware-enabled" -#define NM_CLIENT_WWAN_ENABLED "wwan-enabled" -#define NM_CLIENT_WWAN_HARDWARE_ENABLED "wwan-hardware-enabled" -#define NM_CLIENT_WIMAX_ENABLED "wimax-enabled" -#define NM_CLIENT_WIMAX_HARDWARE_ENABLED "wimax-hardware-enabled" -#define NM_CLIENT_ACTIVE_CONNECTIONS "active-connections" -#define NM_CLIENT_CONNECTIVITY "connectivity" -#define NM_CLIENT_PRIMARY_CONNECTION "primary-connection" -#define NM_CLIENT_ACTIVATING_CONNECTION "activating-connection" -#define NM_CLIENT_DEVICES "devices" -#define NM_CLIENT_ALL_DEVICES "all-devices" - -/** - * NMClientPermission: - * @NM_CLIENT_PERMISSION_NONE: unknown or no permission - * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK: controls whether networking - * can be globally enabled or disabled - * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI: controls whether Wi-Fi can be - * globally enabled or disabled - * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN: controls whether WWAN (3G) can be - * globally enabled or disabled - * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX: controls whether WiMAX can be - * globally enabled or disabled - * @NM_CLIENT_PERMISSION_SLEEP_WAKE: controls whether the client can ask - * NetworkManager to sleep and wake - * @NM_CLIENT_PERMISSION_NETWORK_CONTROL: controls whether networking connections - * can be started, stopped, and changed - * @NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED: controls whether a password - * protected Wi-Fi hotspot can be created - * @NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN: controls whether an open Wi-Fi hotspot - * can be created - * @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM: controls whether connections - * that are available to all users can be modified - * @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN: controls whether connections - * owned by the current user can be modified - * @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME: controls whether the - * persistent hostname can be changed - * @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS: modify persistent global - * DNS configuration - * @NM_CLIENT_PERMISSION_RELOAD: controls access to Reload. - * persistent hostname can be changed - * @NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK: permission to create checkpoints. - * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS: controls whether device - * statistics can be globally enabled or disabled - * @NM_CLIENT_PERMISSION_LAST: a reserved boundary value - * - * #NMClientPermission values indicate various permissions that NetworkManager - * clients can obtain to perform certain tasks on behalf of the current user. - **/ -typedef enum { - NM_CLIENT_PERMISSION_NONE = 0, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK = 1, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI = 2, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN = 3, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX = 4, - NM_CLIENT_PERMISSION_SLEEP_WAKE = 5, - NM_CLIENT_PERMISSION_NETWORK_CONTROL = 6, - NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED = 7, - NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN = 8, - NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM = 9, - NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN = 10, - NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME = 11, - NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS = 12, - NM_CLIENT_PERMISSION_RELOAD = 13, - NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK = 14, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS = 15, - - NM_CLIENT_PERMISSION_LAST = 15, -} NMClientPermission; - -/** - * NMClientPermissionResult: - * @NM_CLIENT_PERMISSION_RESULT_UNKNOWN: unknown or no authorization - * @NM_CLIENT_PERMISSION_RESULT_YES: the permission is available - * @NM_CLIENT_PERMISSION_RESULT_AUTH: authorization is necessary before the - * permission is available - * @NM_CLIENT_PERMISSION_RESULT_NO: permission to perform the operation is - * denied by system policy - * - * #NMClientPermissionResult values indicate what authorizations and permissions - * the user requires to obtain a given #NMClientPermission - **/ -typedef enum { - NM_CLIENT_PERMISSION_RESULT_UNKNOWN = 0, - NM_CLIENT_PERMISSION_RESULT_YES, - NM_CLIENT_PERMISSION_RESULT_AUTH, - NM_CLIENT_PERMISSION_RESULT_NO -} NMClientPermissionResult; - -/** - * NMClientError: - * @NM_CLIENT_ERROR_UNKNOWN: unknown or unclassified error - * @NM_CLIENT_ERROR_MANAGER_NOT_RUNNING: an operation that requires NetworkManager - * failed because NetworkManager is not running - * - * Describes errors that may result from operations involving a #NMClient. - **/ -typedef enum { - NM_CLIENT_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_CLIENT_ERROR_MANAGER_NOT_RUNNING, /*< nick=ManagerNotRunning >*/ -} NMClientError; - -#define NM_CLIENT_ERROR nm_client_error_quark () -NM_AVAILABLE_IN_0_9_10 -GQuark nm_client_error_quark (void); - -typedef struct { - NMObject parent; -} NMClient; - -typedef struct { - NMObjectClass parent; - - /* Signals */ - void (*device_added) (NMClient *client, NMDevice *device); - void (*device_removed) (NMClient *client, NMDevice *device); - void (*permission_changed) (NMClient *client, - NMClientPermission permission, - NMClientPermissionResult result); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMClientClass; - -GType nm_client_get_type (void); - -NMClient *nm_client_new (void); - -void nm_client_new_async (GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -NMClient *nm_client_new_finish (GAsyncResult *result, - GError **error); - -const GPtrArray *nm_client_get_devices (NMClient *client); -NM_AVAILABLE_IN_1_2 -const GPtrArray *nm_client_get_all_devices(NMClient *client); -NMDevice *nm_client_get_device_by_path (NMClient *client, const char *object_path); -NMDevice *nm_client_get_device_by_iface (NMClient *client, const char *iface); - -typedef void (*NMClientActivateFn) (NMClient *client, - NMActiveConnection *active_connection, - GError *error, - gpointer user_data); - -void nm_client_activate_connection (NMClient *client, - NMConnection *connection, - NMDevice *device, - const char *specific_object, - NMClientActivateFn callback, - gpointer user_data); - -typedef void (*NMClientAddActivateFn) (NMClient *client, - NMActiveConnection *connection, - const char *new_connection_path, - GError *error, - gpointer user_data); - -void nm_client_add_and_activate_connection (NMClient *client, - NMConnection *partial, - NMDevice *device, - const char *specific_object, - NMClientAddActivateFn callback, - gpointer user_data); - -void nm_client_deactivate_connection (NMClient *client, NMActiveConnection *active); - -gboolean nm_client_networking_get_enabled (NMClient *client); -void nm_client_networking_set_enabled (NMClient *client, gboolean enabled); - -gboolean nm_client_wireless_get_enabled (NMClient *client); -void nm_client_wireless_set_enabled (NMClient *client, gboolean enabled); -gboolean nm_client_wireless_hardware_get_enabled (NMClient *client); - -gboolean nm_client_wwan_get_enabled (NMClient *client); -void nm_client_wwan_set_enabled (NMClient *client, gboolean enabled); -gboolean nm_client_wwan_hardware_get_enabled (NMClient *client); - -gboolean nm_client_wimax_get_enabled (NMClient *client); -void nm_client_wimax_set_enabled (NMClient *client, gboolean enabled); -gboolean nm_client_wimax_hardware_get_enabled (NMClient *client); - -const char *nm_client_get_version (NMClient *client); -NMState nm_client_get_state (NMClient *client); -NM_AVAILABLE_IN_0_9_10 -gboolean nm_client_get_startup (NMClient *client); -gboolean nm_client_get_manager_running (NMClient *client); -const GPtrArray *nm_client_get_active_connections (NMClient *client); -void nm_client_sleep (NMClient *client, gboolean sleep_); - -NMClientPermissionResult nm_client_get_permission_result (NMClient *client, - NMClientPermission permission); - -gboolean nm_client_get_logging (NMClient *client, char **level, char **domains, GError **error); -gboolean nm_client_set_logging (NMClient *client, const char *level, const char *domains, GError **error); - -NMConnectivityState nm_client_get_connectivity (NMClient *client); - -NMConnectivityState nm_client_check_connectivity (NMClient *client, - GCancellable *cancellable, - GError **error); -void nm_client_check_connectivity_async (NMClient *client, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -NMConnectivityState nm_client_check_connectivity_finish (NMClient *client, - GAsyncResult *result, - GError **error); - -NMActiveConnection *nm_client_get_primary_connection (NMClient *client); -NMActiveConnection *nm_client_get_activating_connection (NMClient *client); - -G_END_DECLS - -#endif /* NM_CLIENT_H */ diff --git a/libnm-glib/nm-dbus-helpers-private.h b/libnm-glib/nm-dbus-helpers-private.h deleted file mode 100644 index 1d98e77d..00000000 --- a/libnm-glib/nm-dbus-helpers-private.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - */ - -#ifndef NM_DBUS_HELPERS_PRIVATE_H -#define NM_DBUS_HELPERS_PRIVATE_H - -#include <dbus/dbus.h> -#include <dbus/dbus-glib-lowlevel.h> - -DBusGConnection *_nm_dbus_new_connection (GError **error); - -DBusGProxy * _nm_dbus_new_proxy_for_connection (DBusGConnection *connection, - const char *path, - const char *interface); - -#endif /* NM_DBUS_HELPERS_PRIVATE_H */ diff --git a/libnm-glib/nm-dbus-helpers.c b/libnm-glib/nm-dbus-helpers.c deleted file mode 100644 index 539dabb9..00000000 --- a/libnm-glib/nm-dbus-helpers.c +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <dbus/dbus.h> -#include <dbus/dbus-glib-lowlevel.h> - -#include "nm-dbus-helpers-private.h" -#include "NetworkManager.h" - -DBusGConnection * -_nm_dbus_new_connection (GError **error) -{ - DBusGConnection *connection = NULL; - - if (connection == NULL) - connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, error); - - return connection; -} - -DBusGProxy * -_nm_dbus_new_proxy_for_connection (DBusGConnection *connection, - const char *path, - const char *interface) -{ - return dbus_g_proxy_new_for_name (connection, NM_DBUS_SERVICE, path, interface); -} diff --git a/libnm-glib/nm-device-adsl.c b/libnm-glib/nm-device-adsl.c deleted file mode 100644 index 30f6c4ec..00000000 --- a/libnm-glib/nm-device-adsl.c +++ /dev/null @@ -1,245 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * author: Pantelis Koukousoulas <pktoss@gmail.com> - * Copyright 2009 - 2011 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include "nm-device-adsl.h" - -#include <string.h> - -#include "nm-device-private.h" -#include "nm-object-private.h" - -#include "nm-setting-adsl.h" - -G_DEFINE_TYPE (NMDeviceAdsl, nm_device_adsl, NM_TYPE_DEVICE) - -#define NM_DEVICE_ADSL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_ADSL, NMDeviceAdslPrivate)) - -typedef struct { - DBusGProxy *proxy; - - gboolean carrier; - - gboolean disposed; -} NMDeviceAdslPrivate; - -enum { - PROP_0, - PROP_CARRIER, - LAST_PROP -}; - -/** - * nm_device_adsl_error_quark: - * - * Registers an error quark for #NMDeviceAdsl if necessary. - * - * Returns: the error quark used for #NMDeviceAdsl errors. - **/ -GQuark -nm_device_adsl_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-adsl-error-quark"); - return quark; -} - -/** - * nm_device_adsl_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceAdsl. - * - * Returns: (transfer full): a new device - **/ -GObject * -nm_device_adsl_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_ADSL, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_adsl_get_carrier: - * @device: a #NMDeviceAdsl - * - * Whether the device has carrier. - * - * Returns: %TRUE if the device has carrier - **/ -gboolean -nm_device_adsl_get_carrier (NMDeviceAdsl *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_ADSL (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_ADSL_GET_PRIVATE (device)->carrier; -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingAdsl *s_adsl; - const char *ctype; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_ADSL_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_ADSL_ERROR, NM_DEVICE_ADSL_ERROR_NOT_ADSL_CONNECTION, - "The connection was not an ADSL connection."); - return FALSE; - } - - s_adsl = nm_connection_get_setting_adsl (connection); - if (!s_adsl) { - g_set_error (error, NM_DEVICE_ADSL_ERROR, NM_DEVICE_ADSL_ERROR_INVALID_ADSL_CONNECTION, - "The connection was not a valid ADSL connection."); - return FALSE; - } - - return NM_DEVICE_CLASS (nm_device_adsl_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_ADSL; -} - -/*****************************************************************************/ - -static void -nm_device_adsl_init (NMDeviceAdsl *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_ADSL); -} - -static void -register_properties (NMDeviceAdsl *device) -{ - NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_ADSL_CARRIER, &priv->carrier }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_adsl_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_ADSL); - register_properties (NM_DEVICE_ADSL (object)); -} - -static void -dispose (GObject *object) -{ - NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (object); - - if (priv->disposed) { - G_OBJECT_CLASS (nm_device_adsl_parent_class)->dispose (object); - return; - } - - priv->disposed = TRUE; - - g_object_unref (priv->proxy); - - G_OBJECT_CLASS (nm_device_adsl_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - G_OBJECT_CLASS (nm_device_adsl_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceAdsl *device = NM_DEVICE_ADSL (object); - - switch (prop_id) { - case PROP_CARRIER: - g_value_set_boolean (value, nm_device_adsl_get_carrier (device)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_adsl_class_init (NMDeviceAdslClass *adsl_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (adsl_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (adsl_class); - - g_type_class_add_private (object_class, sizeof (NMDeviceAdslPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->dispose = dispose; - object_class->finalize = finalize; - object_class->get_property = get_property; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - - /* properties */ - /** - * NMDeviceAdsl:carrier: - * - * Whether the device has carrier. - **/ - g_object_class_install_property - (object_class, PROP_CARRIER, - g_param_spec_boolean (NM_DEVICE_ADSL_CARRIER, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-glib/nm-device-adsl.h b/libnm-glib/nm-device-adsl.h deleted file mode 100644 index 35d2731a..00000000 --- a/libnm-glib/nm-device-adsl.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 Pantelis Koukousoulas <pktoss@gmail.com> - */ - -#ifndef NM_DEVICE_ADSL_H -#define NM_DEVICE_ADSL_H - -#include "nm-device.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_ADSL (nm_device_adsl_get_type ()) -#define NM_DEVICE_ADSL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_ADSL, NMDeviceAdsl)) -#define NM_DEVICE_ADSL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_ADSL, NMDeviceAdslClass)) -#define NM_IS_DEVICE_ADSL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_ADSL)) -#define NM_IS_DEVICE_ADSL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_ADSL)) -#define NM_DEVICE_ADSL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_ADSL, NMDeviceAdslClass)) - -/** - * NMDeviceAdslError: - * @NM_DEVICE_ADSL_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_ADSL_ERROR_NOT_ADSL_CONNECTION: the connection was not of ADSL type - * @NM_DEVICE_ADSL_ERROR_INVALID_ADSL_CONNECTION: the ADSL connection was invalid - */ -typedef enum { - NM_DEVICE_ADSL_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_ADSL_ERROR_NOT_ADSL_CONNECTION, /*< nick=NotAdslConnection >*/ - NM_DEVICE_ADSL_ERROR_INVALID_ADSL_CONNECTION, /*< nick=InvalidAdslConnection >*/ -} NMDeviceAdslError; - -#define NM_DEVICE_ADSL_ERROR nm_device_adsl_error_quark () -GQuark nm_device_adsl_error_quark (void); - -#define NM_DEVICE_ADSL_CARRIER "carrier" - -typedef struct { - NMDevice parent; -} NMDeviceAdsl; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceAdslClass; - -GType nm_device_adsl_get_type (void); - -GObject *nm_device_adsl_new (DBusGConnection *connection, const char *path); -gboolean nm_device_adsl_get_carrier (NMDeviceAdsl *device); - -G_END_DECLS - -#endif /* NM_DEVICE_ADSL_H */ diff --git a/libnm-glib/nm-device-bond.c b/libnm-glib/nm-device-bond.c deleted file mode 100644 index a4f0f501..00000000 --- a/libnm-glib/nm-device-bond.c +++ /dev/null @@ -1,346 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <netinet/ether.h> - -#include "nm-setting-connection.h" -#include "nm-setting-bond.h" -#include "nm-utils.h" - -#include "nm-device-bond.h" -#include "nm-device-private.h" -#include "nm-object-private.h" -#include "nm-types.h" - -G_DEFINE_TYPE (NMDeviceBond, nm_device_bond, NM_TYPE_DEVICE) - -#define NM_DEVICE_BOND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_BOND, NMDeviceBondPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - gboolean carrier; - GPtrArray *slaves; -} NMDeviceBondPrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_CARRIER, - PROP_SLAVES, - - LAST_PROP -}; - -/** - * nm_device_bond_error_quark: - * - * Registers an error quark for #NMDeviceBond if necessary. - * - * Returns: the error quark used for #NMDeviceBond errors. - **/ -GQuark -nm_device_bond_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-bond-error-quark"); - return quark; -} - -/** - * nm_device_bond_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceBond. - * - * Returns: (transfer full): a new device - **/ -GObject * -nm_device_bond_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_BOND, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_bond_get_hw_address: - * @device: a #NMDeviceBond - * - * Gets the hardware (MAC) address of the #NMDeviceBond - * - * Returns: the hardware address. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_bond_get_hw_address (NMDeviceBond *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_BOND (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_BOND_GET_PRIVATE (device)->hw_address; -} - -/** - * nm_device_bond_get_carrier: - * @device: a #NMDeviceBond - * - * Whether the device has carrier. - * - * Returns: %TRUE if the device has carrier - **/ -gboolean -nm_device_bond_get_carrier (NMDeviceBond *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_BOND (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_BOND_GET_PRIVATE (device)->carrier; -} - -/** - * nm_device_bond_get_slaves: - * @device: a #NMDeviceBond - * - * Gets the devices currently enslaved to @device. - * - * Returns: (element-type NMDevice): the #GPtrArray containing - * #NMDevices that are slaves of @device. This is the internal - * copy used by the device, and must not be modified. - * - * Since: 0.9.6.4 - **/ -const GPtrArray * -nm_device_bond_get_slaves (NMDeviceBond *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_BOND (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return handle_ptr_array_return (NM_DEVICE_BOND_GET_PRIVATE (device)->slaves); -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingBond *s_bond; - const char *ctype, *dev_iface_name, *bond_iface_name; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_BOND_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_BOND_ERROR, NM_DEVICE_BOND_ERROR_NOT_BOND_CONNECTION, - "The connection was not a bond connection."); - return FALSE; - } - - s_bond = nm_connection_get_setting_bond (connection); - if (!s_bond) { - g_set_error (error, NM_DEVICE_BOND_ERROR, NM_DEVICE_BOND_ERROR_INVALID_BOND_CONNECTION, - "The connection was not a valid bond connection."); - return FALSE; - } - - dev_iface_name = nm_device_get_iface (device); - bond_iface_name = nm_setting_bond_get_interface_name (s_bond); - if (g_strcmp0 (dev_iface_name, bond_iface_name) != 0) { - g_set_error (error, NM_DEVICE_BOND_ERROR, NM_DEVICE_BOND_ERROR_INTERFACE_MISMATCH, - "The interfaces of the device and the connection didn't match."); - return FALSE; - } - - /* FIXME: check slaves? */ - - return NM_DEVICE_CLASS (nm_device_bond_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_BOND; -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_bond_get_hw_address (NM_DEVICE_BOND (device)); -} - -/*****************************************************************************/ - -static void -nm_device_bond_init (NMDeviceBond *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_BOND); -} - -static void -register_properties (NMDeviceBond *device) -{ - NMDeviceBondPrivate *priv = NM_DEVICE_BOND_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_BOND_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_BOND_CARRIER, &priv->carrier }, - { NM_DEVICE_BOND_SLAVES, &priv->slaves, NULL, NM_TYPE_DEVICE }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDeviceBondPrivate *priv = NM_DEVICE_BOND_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_bond_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_BOND); - register_properties (NM_DEVICE_BOND (object)); -} - -static void -dispose (GObject *object) -{ - NMDeviceBondPrivate *priv = NM_DEVICE_BOND_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - - if (priv->slaves) { - g_ptr_array_set_free_func (priv->slaves, g_object_unref); - g_ptr_array_free (priv->slaves, TRUE); - priv->slaves = NULL; - } - - G_OBJECT_CLASS (nm_device_bond_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDeviceBondPrivate *priv = NM_DEVICE_BOND_GET_PRIVATE (object); - - g_free (priv->hw_address); - - G_OBJECT_CLASS (nm_device_bond_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceBond *device = NM_DEVICE_BOND (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_device_bond_get_hw_address (device)); - break; - case PROP_CARRIER: - g_value_set_boolean (value, nm_device_bond_get_carrier (device)); - break; - case PROP_SLAVES: - g_value_set_boxed (value, nm_device_bond_get_slaves (device)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_bond_class_init (NMDeviceBondClass *bond_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (bond_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (bond_class); - - g_type_class_add_private (bond_class, sizeof (NMDeviceBondPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->dispose = dispose; - object_class->finalize = finalize; - object_class->get_property = get_property; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - device_class->get_hw_address = get_hw_address; - - /* properties */ - - /** - * NMDeviceBond:hw-address: - * - * The hardware (MAC) address of the device. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_BOND_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceBond:carrier: - * - * Whether the device has carrier. - **/ - g_object_class_install_property - (object_class, PROP_CARRIER, - g_param_spec_boolean (NM_DEVICE_BOND_CARRIER, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceBond:slaves: - * - * The devices (#NMDevice) enslaved to the bond device. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_SLAVES, - g_param_spec_boxed (NM_DEVICE_BOND_SLAVES, "", "", - NM_TYPE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-glib/nm-device-bond.h b/libnm-glib/nm-device-bond.h deleted file mode 100644 index cd1a6027..00000000 --- a/libnm-glib/nm-device-bond.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2012 Red Hat, Inc. - */ - -#ifndef NM_DEVICE_BOND_H -#define NM_DEVICE_BOND_H - -#include "nm-device.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_BOND (nm_device_bond_get_type ()) -#define NM_DEVICE_BOND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_BOND, NMDeviceBond)) -#define NM_DEVICE_BOND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_BOND, NMDeviceBondClass)) -#define NM_IS_DEVICE_BOND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_BOND)) -#define NM_IS_DEVICE_BOND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_BOND)) -#define NM_DEVICE_BOND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_BOND, NMDeviceBondClass)) - -/** - * NMDeviceBondError: - * @NM_DEVICE_BOND_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_BOND_ERROR_NOT_BOND_CONNECTION: the connection was not of bond type - * @NM_DEVICE_BOND_ERROR_INVALID_BOND_CONNECTION: the bond connection was invalid - * @NM_DEVICE_BOND_ERROR_INTERFACE_MISMATCH: the interfaces of the connection and the device mismatched - */ -typedef enum { - NM_DEVICE_BOND_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_BOND_ERROR_NOT_BOND_CONNECTION, /*< nick=NotBondConnection >*/ - NM_DEVICE_BOND_ERROR_INVALID_BOND_CONNECTION, /*< nick=InvalidBondConnection >*/ - NM_DEVICE_BOND_ERROR_INTERFACE_MISMATCH, /*< nick=InterfaceMismatch >*/ -} NMDeviceBondError; - -#define NM_DEVICE_BOND_ERROR nm_device_bond_error_quark () -GQuark nm_device_bond_error_quark (void); - -#define NM_DEVICE_BOND_HW_ADDRESS "hw-address" -#define NM_DEVICE_BOND_CARRIER "carrier" -#define NM_DEVICE_BOND_SLAVES "slaves" - -typedef struct { - NMDevice parent; -} NMDeviceBond; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceBondClass; - -GType nm_device_bond_get_type (void); - -GObject *nm_device_bond_new (DBusGConnection *connection, const char *path); - -const char *nm_device_bond_get_hw_address (NMDeviceBond *device); -gboolean nm_device_bond_get_carrier (NMDeviceBond *device); -const GPtrArray *nm_device_bond_get_slaves (NMDeviceBond *device); - -G_END_DECLS - -#endif /* NM_DEVICE_BOND_H */ diff --git a/libnm-glib/nm-device-bridge.c b/libnm-glib/nm-device-bridge.c deleted file mode 100644 index d5a2bbbc..00000000 --- a/libnm-glib/nm-device-bridge.c +++ /dev/null @@ -1,358 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <netinet/ether.h> - -#include "nm-setting-connection.h" -#include "nm-setting-bridge.h" -#include "nm-utils.h" - -#include "nm-device-bridge.h" -#include "nm-device-private.h" -#include "nm-object-private.h" -#include "nm-types.h" - -G_DEFINE_TYPE (NMDeviceBridge, nm_device_bridge, NM_TYPE_DEVICE) - -#define NM_DEVICE_BRIDGE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_BRIDGE, NMDeviceBridgePrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - gboolean carrier; - GPtrArray *slaves; -} NMDeviceBridgePrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_CARRIER, - PROP_SLAVES, - - LAST_PROP -}; - -/** - * nm_device_bridge_error_quark: - * - * Registers an error quark for #NMDeviceBridge if necessary. - * - * Returns: the error quark used for #NMDeviceBridge errors. - * - * Since: 0.9.8 - **/ -GQuark -nm_device_bridge_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-bridge-error-quark"); - return quark; -} - -/** - * nm_device_bridge_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceBridge. - * - * Returns: (transfer full): a new device - * - * Since: 0.9.8 - **/ -GObject * -nm_device_bridge_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_BRIDGE, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_bridge_get_hw_address: - * @device: a #NMDeviceBridge - * - * Gets the hardware (MAC) address of the #NMDeviceBridge - * - * Returns: the hardware address. This is the internal string used by the - * device, and must not be modified. - * - * Since: 0.9.8 - **/ -const char * -nm_device_bridge_get_hw_address (NMDeviceBridge *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_BRIDGE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_BRIDGE_GET_PRIVATE (device)->hw_address; -} - -/** - * nm_device_bridge_get_carrier: - * @device: a #NMDeviceBridge - * - * Whether the device has carrier. - * - * Returns: %TRUE if the device has carrier - * - * Since: 0.9.8 - **/ -gboolean -nm_device_bridge_get_carrier (NMDeviceBridge *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_BRIDGE (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_BRIDGE_GET_PRIVATE (device)->carrier; -} - -/** - * nm_device_bridge_get_slaves: - * @device: a #NMDeviceBridge - * - * Gets the devices currently enslaved to @device. - * - * Returns: (element-type NMDevice): the #GPtrArray containing - * #NMDevices that are slaves of @device. This is the internal - * copy used by the device, and must not be modified. - * - * Since: 0.9.8 - **/ -const GPtrArray * -nm_device_bridge_get_slaves (NMDeviceBridge *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_BRIDGE (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return handle_ptr_array_return (NM_DEVICE_BRIDGE_GET_PRIVATE (device)->slaves); -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingBridge *s_bridge; - const char *ctype, *dev_iface_name, *bridge_iface_name; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_BRIDGE_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_BRIDGE_ERROR, NM_DEVICE_BRIDGE_ERROR_NOT_BRIDGE_CONNECTION, - "The connection was not a bridge connection."); - return FALSE; - } - - s_bridge = nm_connection_get_setting_bridge (connection); - if (!s_bridge) { - g_set_error (error, NM_DEVICE_BRIDGE_ERROR, NM_DEVICE_BRIDGE_ERROR_INVALID_BRIDGE_CONNECTION, - "The connection was not a valid bridge connection."); - return FALSE; - } - - dev_iface_name = nm_device_get_iface (device); - bridge_iface_name = nm_setting_bridge_get_interface_name (s_bridge); - if (g_strcmp0 (dev_iface_name, bridge_iface_name) != 0) { - g_set_error (error, NM_DEVICE_BRIDGE_ERROR, NM_DEVICE_BRIDGE_ERROR_INTERFACE_MISMATCH, - "The interfaces of the device and the connection didn't match."); - return FALSE; - } - - /* FIXME: check ports? */ - - return NM_DEVICE_CLASS (nm_device_bridge_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_BRIDGE; -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_bridge_get_hw_address (NM_DEVICE_BRIDGE (device)); -} - -/*****************************************************************************/ - -static void -nm_device_bridge_init (NMDeviceBridge *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_BRIDGE); -} - -static void -register_properties (NMDeviceBridge *device) -{ - NMDeviceBridgePrivate *priv = NM_DEVICE_BRIDGE_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_BRIDGE_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_BRIDGE_CARRIER, &priv->carrier }, - { NM_DEVICE_BRIDGE_SLAVES, &priv->slaves, NULL, NM_TYPE_DEVICE }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDeviceBridgePrivate *priv = NM_DEVICE_BRIDGE_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_bridge_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_BRIDGE); - register_properties (NM_DEVICE_BRIDGE (object)); -} - -static void -dispose (GObject *object) -{ - NMDeviceBridgePrivate *priv = NM_DEVICE_BRIDGE_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - - if (priv->slaves) { - g_ptr_array_set_free_func (priv->slaves, g_object_unref); - g_ptr_array_free (priv->slaves, TRUE); - priv->slaves = NULL; - } - - G_OBJECT_CLASS (nm_device_bridge_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDeviceBridgePrivate *priv = NM_DEVICE_BRIDGE_GET_PRIVATE (object); - - g_free (priv->hw_address); - - G_OBJECT_CLASS (nm_device_bridge_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceBridge *device = NM_DEVICE_BRIDGE (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_device_bridge_get_hw_address (device)); - break; - case PROP_CARRIER: - g_value_set_boolean (value, nm_device_bridge_get_carrier (device)); - break; - case PROP_SLAVES: - g_value_set_boxed (value, nm_device_bridge_get_slaves (device)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_bridge_class_init (NMDeviceBridgeClass *bridge_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (bridge_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (bridge_class); - - g_type_class_add_private (bridge_class, sizeof (NMDeviceBridgePrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->dispose = dispose; - object_class->finalize = finalize; - object_class->get_property = get_property; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - device_class->get_hw_address = get_hw_address; - - /* properties */ - - /** - * NMDeviceBridge:hw-address: - * - * The hardware (MAC) address of the device. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_BRIDGE_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceBridge:carrier: - * - * Whether the device has carrier. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_CARRIER, - g_param_spec_boolean (NM_DEVICE_BRIDGE_CARRIER, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceBridge:slaves: - * - * The devices (#NMDevice) enslaved to the bridge device. - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_SLAVES, - g_param_spec_boxed (NM_DEVICE_BRIDGE_SLAVES, "", "", - NM_TYPE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-glib/nm-device-bridge.h b/libnm-glib/nm-device-bridge.h deleted file mode 100644 index 2eaf475d..00000000 --- a/libnm-glib/nm-device-bridge.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2012 Red Hat, Inc. - */ - -#ifndef NM_DEVICE_BRIDGE_H -#define NM_DEVICE_BRIDGE_H - -#include "nm-device.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_BRIDGE (nm_device_bridge_get_type ()) -#define NM_DEVICE_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_BRIDGE, NMDeviceBridge)) -#define NM_DEVICE_BRIDGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_BRIDGE, NMDeviceBridgeClass)) -#define NM_IS_DEVICE_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_BRIDGE)) -#define NM_IS_DEVICE_BRIDGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_BRIDGE)) -#define NM_DEVICE_BRIDGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_BRIDGE, NMDeviceBridgeClass)) - -/** - * NMDeviceBridgeError: - * @NM_DEVICE_BRIDGE_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_BRIDGE_ERROR_NOT_BRIDGE_CONNECTION: the connection was not of bridge type - * @NM_DEVICE_BRIDGE_ERROR_INVALID_BRIDGE_CONNECTION: the bridge connection was invalid - * @NM_DEVICE_BRIDGE_ERROR_INTERFACE_MISMATCH: the interfaces of the connection and the device mismatched - * - * Since: 0.9.8 - */ -typedef enum { - NM_DEVICE_BRIDGE_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_BRIDGE_ERROR_NOT_BRIDGE_CONNECTION, /*< nick=NotBridgeConnection >*/ - NM_DEVICE_BRIDGE_ERROR_INVALID_BRIDGE_CONNECTION, /*< nick=InvalidBridgeConnection >*/ - NM_DEVICE_BRIDGE_ERROR_INTERFACE_MISMATCH, /*< nick=InterfaceMismatch >*/ -} NMDeviceBridgeError; - -#define NM_DEVICE_BRIDGE_ERROR nm_device_bridge_error_quark () -GQuark nm_device_bridge_error_quark (void); - -#define NM_DEVICE_BRIDGE_HW_ADDRESS "hw-address" -#define NM_DEVICE_BRIDGE_CARRIER "carrier" -#define NM_DEVICE_BRIDGE_SLAVES "slaves" - -typedef struct { - NMDevice parent; -} NMDeviceBridge; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceBridgeClass; - -GType nm_device_bridge_get_type (void); - -GObject * nm_device_bridge_new (DBusGConnection *connection, const char *path); - -const char *nm_device_bridge_get_hw_address (NMDeviceBridge *device); -gboolean nm_device_bridge_get_carrier (NMDeviceBridge *device); -const GPtrArray *nm_device_bridge_get_slaves (NMDeviceBridge *device); - -G_END_DECLS - -#endif /* NM_DEVICE_BRIDGE_H */ diff --git a/libnm-glib/nm-device-bt.c b/libnm-glib/nm-device-bt.c deleted file mode 100644 index 5cf55c57..00000000 --- a/libnm-glib/nm-device-bt.c +++ /dev/null @@ -1,372 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <netinet/ether.h> - -#include "nm-setting-connection.h" -#include "nm-setting-bluetooth.h" - -#include "nm-device-bt.h" -#include "nm-device-private.h" -#include "nm-object-private.h" - -G_DEFINE_TYPE (NMDeviceBt, nm_device_bt, NM_TYPE_DEVICE) - -#define NM_DEVICE_BT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_BT, NMDeviceBtPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - char *name; - guint32 bt_capabilities; -} NMDeviceBtPrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_NAME, - PROP_BT_CAPABILITIES, - - LAST_PROP -}; - -/** - * nm_device_bt_error_quark: - * - * Registers an error quark for #NMDeviceBt if necessary. - * - * Returns: the error quark used for #NMDeviceBt errors. - **/ -GQuark -nm_device_bt_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-bt-error-quark"); - return quark; -} - -/** - * nm_device_bt_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceBt. - * - * Returns: (transfer full): a new device - **/ -GObject * -nm_device_bt_new (DBusGConnection *connection, const char *path) -{ - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - return g_object_new (NM_TYPE_DEVICE_BT, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); -} - -/** - * nm_device_bt_get_hw_address: - * @device: a #NMDeviceBt - * - * Gets the hardware (MAC) address of the #NMDeviceBt - * - * Returns: the hardware address. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_bt_get_hw_address (NMDeviceBt *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_BT (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_BT_GET_PRIVATE (device)->hw_address; -} - -/** - * nm_device_bt_get_name: - * @device: a #NMDeviceBt - * - * Gets the name of the #NMDeviceBt. - * - * Returns: the name of the device - **/ -const char * -nm_device_bt_get_name (NMDeviceBt *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_BT (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_BT_GET_PRIVATE (device)->name; -} - -/** - * nm_device_bt_get_capabilities: - * @device: a #NMDeviceBt - * - * Returns the Bluetooth device's usable capabilities. - * - * Returns: a combination of #NMBluetoothCapabilities - **/ -NMBluetoothCapabilities -nm_device_bt_get_capabilities (NMDeviceBt *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_BT (device), NM_BT_CAPABILITY_NONE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_BT_GET_PRIVATE (device)->bt_capabilities; -} - -static NMBluetoothCapabilities -get_connection_bt_type (NMConnection *connection) -{ - NMSettingBluetooth *s_bt; - const char *bt_type; - - s_bt = nm_connection_get_setting_bluetooth (connection); - if (!s_bt) - return NM_BT_CAPABILITY_NONE; - - bt_type = nm_setting_bluetooth_get_connection_type (s_bt); - g_assert (bt_type); - - if (!strcmp (bt_type, NM_SETTING_BLUETOOTH_TYPE_DUN)) - return NM_BT_CAPABILITY_DUN; - else if (!strcmp (bt_type, NM_SETTING_BLUETOOTH_TYPE_PANU)) - return NM_BT_CAPABILITY_NAP; - - return NM_BT_CAPABILITY_NONE; -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingBluetooth *s_bt; - const char *ctype; - const GByteArray *mac; - const char *hw_str; - struct ether_addr *hw_mac; - NMBluetoothCapabilities dev_caps; - NMBluetoothCapabilities bt_type; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_BLUETOOTH_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_BT_ERROR, NM_DEVICE_BT_ERROR_NOT_BT_CONNECTION, - "The connection was not a Bluetooth connection."); - return FALSE; - } - - s_bt = nm_connection_get_setting_bluetooth (connection); - if (!s_bt) { - g_set_error (error, NM_DEVICE_BT_ERROR, NM_DEVICE_BT_ERROR_INVALID_BT_CONNECTION, - "The connection was not a valid Bluetooth connection."); - return FALSE; - } - - /* Check BT address */ - hw_str = nm_device_bt_get_hw_address (NM_DEVICE_BT (device)); - if (hw_str) { - hw_mac = ether_aton (hw_str); - if (!hw_mac) { - g_set_error (error, NM_DEVICE_BT_ERROR, NM_DEVICE_BT_ERROR_INVALID_DEVICE_MAC, - "Invalid device MAC address."); - return FALSE; - } - mac = nm_setting_bluetooth_get_bdaddr (s_bt); - if (mac && hw_mac && memcmp (mac->data, hw_mac->ether_addr_octet, ETH_ALEN)) { - g_set_error (error, NM_DEVICE_BT_ERROR, NM_DEVICE_BT_ERROR_MAC_MISMATCH, - "The MACs of the device and the connection didn't match."); - return FALSE; - } - } - - dev_caps = nm_device_bt_get_capabilities (NM_DEVICE_BT (device)); - bt_type = get_connection_bt_type (connection); - if (!(bt_type & dev_caps)) { - g_set_error (error, NM_DEVICE_BT_ERROR, NM_DEVICE_BT_ERROR_MISSING_DEVICE_CAPS, - "The device missed BT capabilities required by the connection."); - return FALSE; - } - - return NM_DEVICE_CLASS (nm_device_bt_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_BLUETOOTH; -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_bt_get_hw_address (NM_DEVICE_BT (device)); -} - -/*****************************************************************************/ - -static void -nm_device_bt_init (NMDeviceBt *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_BT); -} - -static void -register_properties (NMDeviceBt *device) -{ - NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_BT_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_BT_NAME, &priv->name }, - { NM_DEVICE_BT_CAPABILITIES, &priv->bt_capabilities }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_bt_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_BLUETOOTH); - register_properties (NM_DEVICE_BT (object)); -} - -static void -dispose (GObject *object) -{ - NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_device_bt_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE (object); - - g_free (priv->hw_address); - g_free (priv->name); - - G_OBJECT_CLASS (nm_device_bt_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceBt *device = NM_DEVICE_BT (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_device_bt_get_hw_address (device)); - break; - case PROP_NAME: - g_value_set_string (value, nm_device_bt_get_name (device)); - break; - case PROP_BT_CAPABILITIES: - g_value_set_uint (value, nm_device_bt_get_capabilities (device)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_bt_class_init (NMDeviceBtClass *bt_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (bt_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (bt_class); - - g_type_class_add_private (bt_class, sizeof (NMDeviceBtPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->dispose = dispose; - object_class->finalize = finalize; - object_class->get_property = get_property; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - device_class->get_hw_address = get_hw_address; - - /* properties */ - - /** - * NMDeviceBt:hw-address: - * - * The hardware (MAC) address of the device. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_BT_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceBt:name: - * - * The name of the bluetooth device. - **/ - g_object_class_install_property - (object_class, PROP_NAME, - g_param_spec_string (NM_DEVICE_BT_NAME, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceBt:bt-capabilities: - * - * The device's bluetooth capabilities, a combination of #NMBluetoothCapabilities. - **/ - g_object_class_install_property - (object_class, PROP_BT_CAPABILITIES, - g_param_spec_uint (NM_DEVICE_BT_CAPABILITIES, "", "", - NM_BT_CAPABILITY_NONE, G_MAXUINT32, NM_BT_CAPABILITY_NONE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - -} diff --git a/libnm-glib/nm-device-bt.h b/libnm-glib/nm-device-bt.h deleted file mode 100644 index 51dc86e3..00000000 --- a/libnm-glib/nm-device-bt.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2012 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#ifndef NM_DEVICE_BT_H -#define NM_DEVICE_BT_H - -#include "NetworkManager.h" -#include "nm-device.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_BT (nm_device_bt_get_type ()) -#define NM_DEVICE_BT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_BT, NMDeviceBt)) -#define NM_DEVICE_BT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_BT, NMDeviceBtClass)) -#define NM_IS_DEVICE_BT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_BT)) -#define NM_IS_DEVICE_BT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_BT)) -#define NM_DEVICE_BT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_BT, NMDeviceBtClass)) - -/** - * NMDeviceBtError: - * @NM_DEVICE_BT_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_BT_ERROR_NOT_BT_CONNECTION: the connection was not of bluetooth type - * @NM_DEVICE_BT_ERROR_INVALID_BT_CONNECTION: the bluetooth connection was invalid - * @NM_DEVICE_BT_ERROR_INVALID_DEVICE_MAC: the device's MAC was invalid - * @NM_DEVICE_BT_ERROR_MAC_MISMATCH: the MACs of the connection and the device mismatched - * @NM_DEVICE_BT_ERROR_MISSING_DEVICE_CAPS: the device missed required capabilities - */ -typedef enum { - NM_DEVICE_BT_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_BT_ERROR_NOT_BT_CONNECTION, /*< nick=NotBtConnection >*/ - NM_DEVICE_BT_ERROR_INVALID_BT_CONNECTION, /*< nick=InvalidBtConnection >*/ - NM_DEVICE_BT_ERROR_INVALID_DEVICE_MAC, /*< nick=InvalidDeviceMac >*/ - NM_DEVICE_BT_ERROR_MAC_MISMATCH, /*< nick=MacMismatch >*/ - NM_DEVICE_BT_ERROR_MISSING_DEVICE_CAPS, /*< nick=MissingDeviceCaps >*/ -} NMDeviceBtError; - -#define NM_DEVICE_BT_ERROR nm_device_bt_error_quark () -GQuark nm_device_bt_error_quark (void); - -#define NM_DEVICE_BT_HW_ADDRESS "hw-address" -#define NM_DEVICE_BT_NAME "name" -#define NM_DEVICE_BT_CAPABILITIES "bt-capabilities" - -typedef struct { - NMDevice parent; -} NMDeviceBt; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceBtClass; - -GType nm_device_bt_get_type (void); - -GObject *nm_device_bt_new (DBusGConnection *connection, const char *path); - -const char *nm_device_bt_get_hw_address (NMDeviceBt *device); - -const char *nm_device_bt_get_name (NMDeviceBt *device); - -NMBluetoothCapabilities nm_device_bt_get_capabilities (NMDeviceBt *device); - -G_END_DECLS - -#endif /* NM_DEVICE_BT_H */ diff --git a/libnm-glib/nm-device-ethernet.c b/libnm-glib/nm-device-ethernet.c deleted file mode 100644 index df677b29..00000000 --- a/libnm-glib/nm-device-ethernet.c +++ /dev/null @@ -1,391 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <netinet/ether.h> - -#include "nm-setting-connection.h" -#include "nm-setting-wired.h" -#include "nm-setting-pppoe.h" - -#include "nm-device-ethernet.h" -#include "nm-device-private.h" -#include "nm-object-private.h" - -G_DEFINE_TYPE (NMDeviceEthernet, nm_device_ethernet, NM_TYPE_DEVICE) - -#define NM_DEVICE_ETHERNET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_ETHERNET, NMDeviceEthernetPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - char *perm_hw_address; - guint32 speed; - gboolean carrier; -} NMDeviceEthernetPrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_PERM_HW_ADDRESS, - PROP_SPEED, - PROP_CARRIER, - - LAST_PROP -}; - -/** - * nm_device_ethernet_error_quark: - * - * Registers an error quark for #NMDeviceEthernet if necessary. - * - * Returns: the error quark used for #NMDeviceEthernet errors. - **/ -GQuark -nm_device_ethernet_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-ethernet-error-quark"); - return quark; -} - -/** - * nm_device_ethernet_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceEthernet. - * - * Returns: (transfer full): a new device - **/ -GObject * -nm_device_ethernet_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_ETHERNET, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_ethernet_get_hw_address: - * @device: a #NMDeviceEthernet - * - * Gets the active hardware (MAC) address of the #NMDeviceEthernet - * - * Returns: the active hardware address. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_ethernet_get_hw_address (NMDeviceEthernet *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_ETHERNET (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_ETHERNET_GET_PRIVATE (device)->hw_address; -} - -/** - * nm_device_ethernet_get_permanent_hw_address: - * @device: a #NMDeviceEthernet - * - * Gets the permanent hardware (MAC) address of the #NMDeviceEthernet - * - * Returns: the permanent hardware address. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_ethernet_get_permanent_hw_address (NMDeviceEthernet *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_ETHERNET (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_ETHERNET_GET_PRIVATE (device)->perm_hw_address; -} - -/** - * nm_device_ethernet_get_speed: - * @device: a #NMDeviceEthernet - * - * Gets the speed of the #NMDeviceEthernet in Mbit/s. - * - * Returns: the speed of the device in Mbit/s - **/ -guint32 -nm_device_ethernet_get_speed (NMDeviceEthernet *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_ETHERNET (device), 0); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_ETHERNET_GET_PRIVATE (device)->speed; -} - -/** - * nm_device_ethernet_get_carrier: - * @device: a #NMDeviceEthernet - * - * Whether the device has carrier. - * - * Returns: %TRUE if the device has carrier - **/ -gboolean -nm_device_ethernet_get_carrier (NMDeviceEthernet *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_ETHERNET (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_ETHERNET_GET_PRIVATE (device)->carrier; -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingWired *s_wired; - const char *ctype; - gboolean is_pppoe = FALSE; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (!strcmp (ctype, NM_SETTING_PPPOE_SETTING_NAME)) - is_pppoe = TRUE; - else if (strcmp (ctype, NM_SETTING_WIRED_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_ETHERNET_ERROR, NM_DEVICE_ETHERNET_ERROR_NOT_ETHERNET_CONNECTION, - "The connection was not a wired or PPPoE connection."); - return FALSE; - } - - s_wired = nm_connection_get_setting_wired (connection); - /* Wired setting optional for PPPoE */ - if (!is_pppoe && !s_wired) { - g_set_error (error, NM_DEVICE_ETHERNET_ERROR, NM_DEVICE_ETHERNET_ERROR_INVALID_ETHERNET_CONNECTION, - "The connection was not a valid Ethernet connection."); - return FALSE; - } - - if (s_wired) { - const GByteArray *mac; - const char *perm_str; - struct ether_addr *perm_mac; - - /* FIXME: filter using s390 subchannels when they are exported over the bus */ - - /* Check MAC address */ - perm_str = nm_device_ethernet_get_permanent_hw_address (NM_DEVICE_ETHERNET (device)); - if (perm_str) { - perm_mac = ether_aton (perm_str); - if (!perm_mac) { - g_set_error (error, NM_DEVICE_ETHERNET_ERROR, NM_DEVICE_ETHERNET_ERROR_INVALID_DEVICE_MAC, - "Invalid device MAC address."); - return FALSE; - } - mac = nm_setting_wired_get_mac_address (s_wired); - if (mac && perm_mac && memcmp (mac->data, perm_mac->ether_addr_octet, ETH_ALEN)) { - g_set_error (error, NM_DEVICE_ETHERNET_ERROR, NM_DEVICE_ETHERNET_ERROR_MAC_MISMATCH, - "The MACs of the device and the connection didn't match."); - return FALSE; - } - } - } - - return NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_WIRED; -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_ethernet_get_hw_address (NM_DEVICE_ETHERNET (device)); -} - -/*****************************************************************************/ - -static void -nm_device_ethernet_init (NMDeviceEthernet *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_ETHERNET); -} - -static void -register_properties (NMDeviceEthernet *device) -{ - NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_ETHERNET_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS, &priv->perm_hw_address }, - { NM_DEVICE_ETHERNET_SPEED, &priv->speed }, - { NM_DEVICE_ETHERNET_CARRIER, &priv->carrier }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_ethernet_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_WIRED); - register_properties (NM_DEVICE_ETHERNET (object)); -} - -static void -dispose (GObject *object) -{ - NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_device_ethernet_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (object); - - g_free (priv->hw_address); - g_free (priv->perm_hw_address); - - G_OBJECT_CLASS (nm_device_ethernet_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceEthernet *device = NM_DEVICE_ETHERNET (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_device_ethernet_get_hw_address (device)); - break; - case PROP_PERM_HW_ADDRESS: - g_value_set_string (value, nm_device_ethernet_get_permanent_hw_address (device)); - break; - case PROP_SPEED: - g_value_set_uint (value, nm_device_ethernet_get_speed (device)); - break; - case PROP_CARRIER: - g_value_set_boolean (value, nm_device_ethernet_get_carrier (device)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_ethernet_class_init (NMDeviceEthernetClass *eth_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (eth_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (eth_class); - - g_type_class_add_private (eth_class, sizeof (NMDeviceEthernetPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->dispose = dispose; - object_class->finalize = finalize; - object_class->get_property = get_property; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - device_class->get_hw_address = get_hw_address; - - /* properties */ - - /** - * NMDeviceEthernet:hw-address: - * - * The active hardware (MAC) address of the device. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_ETHERNET_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceEthernet:perm-hw-address: - * - * The permanent hardware (MAC) address of the device. - **/ - g_object_class_install_property - (object_class, PROP_PERM_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceEthernet:speed: - * - * The speed of the device. - **/ - g_object_class_install_property - (object_class, PROP_SPEED, - g_param_spec_uint (NM_DEVICE_ETHERNET_SPEED, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceEthernet:carrier: - * - * Whether the device has carrier. - **/ - g_object_class_install_property - (object_class, PROP_CARRIER, - g_param_spec_boolean (NM_DEVICE_ETHERNET_CARRIER, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - -} diff --git a/libnm-glib/nm-device-ethernet.h b/libnm-glib/nm-device-ethernet.h deleted file mode 100644 index be289cdf..00000000 --- a/libnm-glib/nm-device-ethernet.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#ifndef NM_DEVICE_ETHERNET_H -#define NM_DEVICE_ETHERNET_H - -#include "nm-device.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_ETHERNET (nm_device_ethernet_get_type ()) -#define NM_DEVICE_ETHERNET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_ETHERNET, NMDeviceEthernet)) -#define NM_DEVICE_ETHERNET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_ETHERNET, NMDeviceEthernetClass)) -#define NM_IS_DEVICE_ETHERNET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_ETHERNET)) -#define NM_IS_DEVICE_ETHERNET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_ETHERNET)) -#define NM_DEVICE_ETHERNET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_ETHERNET, NMDeviceEthernetClass)) - -/** - * NMDeviceEthernetError: - * @NM_DEVICE_ETHERNET_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_ETHERNET_ERROR_NOT_ETHERNET_CONNECTION: the connection was not of Ethernet or PPPoE type - * @NM_DEVICE_ETHERNET_ERROR_INVALID_ETHERNET_CONNECTION: the Ethernet connection was invalid - * @NM_DEVICE_ETHERNET_ERROR_INVALID_DEVICE_MAC: the device's MAC was invalid - * @NM_DEVICE_ETHERNET_ERROR_MAC_MISMATCH: the MACs of the connection and the device mismatched - */ -typedef enum { - NM_DEVICE_ETHERNET_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_ETHERNET_ERROR_NOT_ETHERNET_CONNECTION, /*< nick=NotEthernetConnection >*/ - NM_DEVICE_ETHERNET_ERROR_INVALID_ETHERNET_CONNECTION, /*< nick=InvalidEthernetConnection >*/ - NM_DEVICE_ETHERNET_ERROR_INVALID_DEVICE_MAC, /*< nick=InvalidDeviceMac >*/ - NM_DEVICE_ETHERNET_ERROR_MAC_MISMATCH, /*< nick=MacMismatch >*/ -} NMDeviceEthernetError; - -#define NM_DEVICE_ETHERNET_ERROR nm_device_ethernet_error_quark () -GQuark nm_device_ethernet_error_quark (void); - -#define NM_DEVICE_ETHERNET_HW_ADDRESS "hw-address" -#define NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS "perm-hw-address" -#define NM_DEVICE_ETHERNET_SPEED "speed" -#define NM_DEVICE_ETHERNET_CARRIER "carrier" - -typedef struct { - NMDevice parent; -} NMDeviceEthernet; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceEthernetClass; - -GType nm_device_ethernet_get_type (void); - -GObject *nm_device_ethernet_new (DBusGConnection *connection, const char *path); - -const char * nm_device_ethernet_get_hw_address (NMDeviceEthernet *device); -const char * nm_device_ethernet_get_permanent_hw_address (NMDeviceEthernet *device); -guint32 nm_device_ethernet_get_speed (NMDeviceEthernet *device); -gboolean nm_device_ethernet_get_carrier (NMDeviceEthernet *device); - -G_END_DECLS - -#endif /* NM_DEVICE_ETHERNET_H */ diff --git a/libnm-glib/nm-device-generic.c b/libnm-glib/nm-device-generic.c deleted file mode 100644 index 206174fb..00000000 --- a/libnm-glib/nm-device-generic.c +++ /dev/null @@ -1,310 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-device-generic.h" -#include "nm-device-private.h" -#include "nm-object-private.h" -#include "nm-setting-generic.h" - -G_DEFINE_TYPE (NMDeviceGeneric, nm_device_generic, NM_TYPE_DEVICE) - -#define NM_DEVICE_GENERIC_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_GENERIC, NMDeviceGenericPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - char *type_description; -} NMDeviceGenericPrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_TYPE_DESCRIPTION, - - LAST_PROP -}; - -/** - * nm_device_generic_error_quark: - * - * Registers an error quark for #NMDeviceGeneric if necessary. - * - * Returns: the error quark used for #NMDeviceGeneric errors. - * - * Since: 0.9.10 - **/ -GQuark -nm_device_generic_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-generic-error-quark"); - return quark; -} - -/** - * nm_device_generic_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceGeneric. - * - * Returns: (transfer full): a new device - * - * Since: 0.9.10 - **/ -GObject * -nm_device_generic_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_GENERIC, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_generic_get_hw_address: - * @device: a #NMDeviceGeneric - * - * Gets the hardware address of the #NMDeviceGeneric - * - * Returns: the hardware address. This is the internal string used by the - * device, and must not be modified. - * - * Since: 0.9.10 - **/ -const char * -nm_device_generic_get_hw_address (NMDeviceGeneric *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_GENERIC (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GENERIC_GET_PRIVATE (device)->hw_address; -} - -/*****************************************************************************/ - -static const char * -get_type_description (NMDevice *device) -{ - NMDeviceGenericPrivate *priv = NM_DEVICE_GENERIC_GET_PRIVATE (device); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return priv->type_description; -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_generic_get_hw_address (NM_DEVICE_GENERIC (device)); -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - const char *ctype, *iface_name; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_GENERIC_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_GENERIC_ERROR, NM_DEVICE_GENERIC_ERROR_NOT_GENERIC_CONNECTION, - "The connection was not a generic connection."); - return FALSE; - } - - iface_name = nm_setting_connection_get_interface_name (s_con); - if (!iface_name) { - g_set_error (error, NM_DEVICE_GENERIC_ERROR, NM_DEVICE_GENERIC_ERROR_MISSING_INTERFACE_NAME, - "The connection did not specify an interface name."); - return FALSE; - } - - return NM_DEVICE_CLASS (nm_device_generic_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_GENERIC; -} - -/*****************************************************************************/ - -static void -nm_device_generic_init (NMDeviceGeneric *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_GENERIC); -} - -static void -register_properties (NMDeviceGeneric *device) -{ - NMDeviceGenericPrivate *priv = NM_DEVICE_GENERIC_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_GENERIC_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_GENERIC_TYPE_DESCRIPTION, &priv->type_description }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static const char * -_device_type_to_interface (NMDeviceType type) -{ - switch (type) { - case NM_DEVICE_TYPE_GENERIC: - return NM_DBUS_INTERFACE_DEVICE_GENERIC; - case NM_DEVICE_TYPE_TUN: - return NM_DBUS_INTERFACE_DEVICE_TUN; - default: - return NULL; - } -} - -static void -constructed (GObject *object) -{ - NMDeviceGenericPrivate *priv = NM_DEVICE_GENERIC_GET_PRIVATE (object); - NMDeviceType type; - DBusGConnection *connection; - const char *path, *interface; - - G_OBJECT_CLASS (nm_device_generic_parent_class)->constructed (object); - - g_object_get (object, - NM_OBJECT_DBUS_CONNECTION, &connection, - NM_OBJECT_DBUS_PATH, &path, - NULL); - - type = _nm_device_type_for_path (connection, path); - interface = _device_type_to_interface (type); - - if (interface) { - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, interface); - register_properties (NM_DEVICE_GENERIC (object)); - } -} - -static void -dispose (GObject *object) -{ - NMDeviceGenericPrivate *priv = NM_DEVICE_GENERIC_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_device_generic_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDeviceGenericPrivate *priv = NM_DEVICE_GENERIC_GET_PRIVATE (object); - - g_free (priv->hw_address); - g_free (priv->type_description); - - G_OBJECT_CLASS (nm_device_generic_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceGenericPrivate *priv = NM_DEVICE_GENERIC_GET_PRIVATE (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, priv->hw_address); - break; - case PROP_TYPE_DESCRIPTION: - g_value_set_string (value, priv->type_description); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_generic_class_init (NMDeviceGenericClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - NMDeviceClass *device_class = NM_DEVICE_CLASS (klass); - - g_type_class_add_private (klass, sizeof (NMDeviceGenericPrivate)); - - object_class->constructed = constructed; - object_class->dispose = dispose; - object_class->finalize = finalize; - object_class->get_property = get_property; - - device_class->get_type_description = get_type_description; - device_class->get_hw_address = get_hw_address; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - - /** - * NMDeviceGeneric:hw-address: - * - * The hardware address of the device. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_GENERIC_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceGeneric:type-description: - * - * A description of the specific type of device this is, or %NULL - * if not known. - **/ - g_object_class_install_property - (object_class, PROP_TYPE_DESCRIPTION, - g_param_spec_string (NM_DEVICE_GENERIC_TYPE_DESCRIPTION, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-glib/nm-device-generic.h b/libnm-glib/nm-device-generic.h deleted file mode 100644 index 5bff1e3f..00000000 --- a/libnm-glib/nm-device-generic.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Red Hat, Inc. - */ - -#ifndef NM_DEVICE_GENERIC_H -#define NM_DEVICE_GENERIC_H - -#include "nm-device.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_GENERIC (nm_device_generic_get_type ()) -#define NM_DEVICE_GENERIC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_GENERIC, NMDeviceGeneric)) -#define NM_DEVICE_GENERIC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_GENERIC, NMDeviceGenericClass)) -#define NM_IS_DEVICE_GENERIC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_GENERIC)) -#define NM_IS_DEVICE_GENERIC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_GENERIC)) -#define NM_DEVICE_GENERIC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_GENERIC, NMDeviceGenericClass)) - -/** - * NMDeviceGenericError: - * @NM_DEVICE_GENERIC_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_GENERIC_ERROR_NOT_GENERIC_CONNECTION: the connection was not of generic type - * @NM_DEVICE_GENERIC_ERROR_MISSING_INTERFACE_NAME: the connection did not specify the interface name - */ -typedef enum { - NM_DEVICE_GENERIC_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_GENERIC_ERROR_NOT_GENERIC_CONNECTION, /*< nick=NotGenericConnection >*/ - NM_DEVICE_GENERIC_ERROR_MISSING_INTERFACE_NAME, /*< nick=MissingInterfaceName >*/ -} NMDeviceGenericError; - -#define NM_DEVICE_GENERIC_ERROR nm_device_generic_error_quark () -GQuark nm_device_generic_error_quark (void); - -#define NM_DEVICE_GENERIC_HW_ADDRESS "hw-address" -#define NM_DEVICE_GENERIC_TYPE_DESCRIPTION "type-description" - -typedef struct { - NMDevice parent; -} NMDeviceGeneric; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceGenericClass; - -NM_AVAILABLE_IN_0_9_10 -GType nm_device_generic_get_type (void); - -NM_AVAILABLE_IN_0_9_10 -GObject *nm_device_generic_new (DBusGConnection *connection, const char *path); - -const char *nm_device_generic_get_hw_address (NMDeviceGeneric *device); - -G_END_DECLS - -#endif /* NM_DEVICE_GENERIC_H */ diff --git a/libnm-glib/nm-device-infiniband.c b/libnm-glib/nm-device-infiniband.c deleted file mode 100644 index 5c4a8c8b..00000000 --- a/libnm-glib/nm-device-infiniband.c +++ /dev/null @@ -1,310 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <linux/if_infiniband.h> -#include <netinet/ether.h> - -#include "nm-setting-connection.h" -#include "nm-setting-infiniband.h" -#include "nm-utils.h" - -#include "nm-device-infiniband.h" -#include "nm-device-private.h" -#include "nm-object-private.h" - -G_DEFINE_TYPE (NMDeviceInfiniband, nm_device_infiniband, NM_TYPE_DEVICE) - -#define NM_DEVICE_INFINIBAND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_INFINIBAND, NMDeviceInfinibandPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - gboolean carrier; -} NMDeviceInfinibandPrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_CARRIER, - - LAST_PROP -}; - -/** - * nm_device_infiniband_error_quark: - * - * Registers an error quark for #NMDeviceInfiniband if necessary. - * - * Returns: the error quark used for #NMDeviceInfiniband errors. - **/ -GQuark -nm_device_infiniband_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-infiniband-error-quark"); - return quark; -} - -/** - * nm_device_infiniband_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceInfiniband. - * - * Returns: (transfer full): a new device - **/ -GObject * -nm_device_infiniband_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_INFINIBAND, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_infiniband_get_hw_address: - * @device: a #NMDeviceInfiniband - * - * Gets the hardware (MAC) address of the #NMDeviceInfiniband - * - * Returns: the hardware address. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_infiniband_get_hw_address (NMDeviceInfiniband *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_INFINIBAND (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_INFINIBAND_GET_PRIVATE (device)->hw_address; -} - -/** - * nm_device_infiniband_get_carrier: - * @device: a #NMDeviceInfiniband - * - * Whether the device has carrier. - * - * Returns: %TRUE if the device has carrier - **/ -gboolean -nm_device_infiniband_get_carrier (NMDeviceInfiniband *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_INFINIBAND (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_INFINIBAND_GET_PRIVATE (device)->carrier; -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingInfiniband *s_infiniband; - const char *ctype, *hwaddr_str; - const GByteArray *mac; - guint8 *hwaddr, hwaddr_buf[INFINIBAND_ALEN]; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_INFINIBAND_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_INFINIBAND_ERROR, NM_DEVICE_INFINIBAND_ERROR_NOT_INFINIBAND_CONNECTION, - "The connection was not a InfiniBand connection."); - return FALSE; - } - - s_infiniband = nm_connection_get_setting_infiniband (connection); - if (!s_infiniband) { - g_set_error (error, NM_DEVICE_INFINIBAND_ERROR, NM_DEVICE_INFINIBAND_ERROR_INVALID_INFINIBAND_CONNECTION, - "The connection was not a valid InfiniBand connection."); - return FALSE; - } - - hwaddr_str = nm_device_infiniband_get_hw_address (NM_DEVICE_INFINIBAND (device)); - if (hwaddr_str) { - hwaddr = nm_utils_hwaddr_aton (hwaddr_str, ARPHRD_INFINIBAND, hwaddr_buf); - if (!hwaddr) { - g_set_error (error, NM_DEVICE_INFINIBAND_ERROR, NM_DEVICE_INFINIBAND_ERROR_INVALID_DEVICE_MAC, - "Invalid device MAC address."); - return FALSE; - } - mac = nm_setting_infiniband_get_mac_address (s_infiniband); - - /* We only match against the last 8 bytes */ - if (mac && hwaddr && memcmp (mac->data + INFINIBAND_ALEN - 8, hwaddr + INFINIBAND_ALEN - 8, 8)) { - g_set_error (error, NM_DEVICE_INFINIBAND_ERROR, NM_DEVICE_INFINIBAND_ERROR_MAC_MISMATCH, - "The MACs of the device and the connection didn't match."); - return FALSE; - } - } - - return NM_DEVICE_CLASS (nm_device_infiniband_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_INFINIBAND; -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_infiniband_get_hw_address (NM_DEVICE_INFINIBAND (device)); -} - -/*****************************************************************************/ - -static void -nm_device_infiniband_init (NMDeviceInfiniband *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_INFINIBAND); -} - -static void -register_properties (NMDeviceInfiniband *device) -{ - NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_INFINIBAND_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_INFINIBAND_CARRIER, &priv->carrier }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_infiniband_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_INFINIBAND); - register_properties (NM_DEVICE_INFINIBAND (object)); -} - -static void -dispose (GObject *object) -{ - NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_device_infiniband_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (object); - - g_free (priv->hw_address); - - G_OBJECT_CLASS (nm_device_infiniband_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceInfiniband *device = NM_DEVICE_INFINIBAND (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_device_infiniband_get_hw_address (device)); - break; - case PROP_CARRIER: - g_value_set_boolean (value, nm_device_infiniband_get_carrier (device)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_infiniband_class_init (NMDeviceInfinibandClass *ib_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (ib_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (ib_class); - - g_type_class_add_private (ib_class, sizeof (NMDeviceInfinibandPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->dispose = dispose; - object_class->finalize = finalize; - object_class->get_property = get_property; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - device_class->get_hw_address = get_hw_address; - - /* properties */ - - /** - * NMDeviceInfiniband:hw-address: - * - * The hardware (MAC) address of the device. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_INFINIBAND_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceInfiniband:carrier: - * - * Whether the device has carrier. - **/ - g_object_class_install_property - (object_class, PROP_CARRIER, - g_param_spec_boolean (NM_DEVICE_INFINIBAND_CARRIER, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - -} diff --git a/libnm-glib/nm-device-infiniband.h b/libnm-glib/nm-device-infiniband.h deleted file mode 100644 index ba587d93..00000000 --- a/libnm-glib/nm-device-infiniband.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2012 Red Hat, Inc. - */ - -#ifndef NM_DEVICE_INFINIBAND_H -#define NM_DEVICE_INFINIBAND_H - -#include "nm-device.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_INFINIBAND (nm_device_infiniband_get_type ()) -#define NM_DEVICE_INFINIBAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_INFINIBAND, NMDeviceInfiniband)) -#define NM_DEVICE_INFINIBAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_INFINIBAND, NMDeviceInfinibandClass)) -#define NM_IS_DEVICE_INFINIBAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_INFINIBAND)) -#define NM_IS_DEVICE_INFINIBAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_INFINIBAND)) -#define NM_DEVICE_INFINIBAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_INFINIBAND, NMDeviceInfinibandClass)) - -/** - * NMDeviceInfinibandError: - * @NM_DEVICE_INFINIBAND_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_INFINIBAND_ERROR_NOT_INFINIBAND_CONNECTION: the connection was not of InfiniBand type - * @NM_DEVICE_INFINIBAND_ERROR_INVALID_INFINIBAND_CONNECTION: the InfiniBand connection was invalid - * @NM_DEVICE_INFINIBAND_ERROR_INVALID_DEVICE_MAC: the device's MAC was invalid - * @NM_DEVICE_INFINIBAND_ERROR_MAC_MISMATCH: the MACs of the connection and the device mismatched - */ -typedef enum { - NM_DEVICE_INFINIBAND_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_INFINIBAND_ERROR_NOT_INFINIBAND_CONNECTION, /*< nick=NotInfinibandConnection >*/ - NM_DEVICE_INFINIBAND_ERROR_INVALID_INFINIBAND_CONNECTION, /*< nick=InvalidInfinibandConnection >*/ - NM_DEVICE_INFINIBAND_ERROR_INVALID_DEVICE_MAC, /*< nick=InvalidDeviceMac >*/ - NM_DEVICE_INFINIBAND_ERROR_MAC_MISMATCH, /*< nick=MacMismatch >*/ -} NMDeviceInfinibandError; - -#define NM_DEVICE_INFINIBAND_ERROR nm_device_infiniband_error_quark () -GQuark nm_device_infiniband_error_quark (void); - -#define NM_DEVICE_INFINIBAND_HW_ADDRESS "hw-address" -#define NM_DEVICE_INFINIBAND_CARRIER "carrier" - -typedef struct { - NMDevice parent; -} NMDeviceInfiniband; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceInfinibandClass; - -GType nm_device_infiniband_get_type (void); - -GObject *nm_device_infiniband_new (DBusGConnection *connection, const char *path); - -const char * nm_device_infiniband_get_hw_address (NMDeviceInfiniband *device); -gboolean nm_device_infiniband_get_carrier (NMDeviceInfiniband *device); - -G_END_DECLS - -#endif /* NM_DEVICE_INFINIBAND_H */ diff --git a/libnm-glib/nm-device-modem.c b/libnm-glib/nm-device-modem.c deleted file mode 100644 index d4c15617..00000000 --- a/libnm-glib/nm-device-modem.c +++ /dev/null @@ -1,290 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2012 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-setting-connection.h" -#include "nm-setting-gsm.h" -#include "nm-setting-cdma.h" - -#include "nm-device-modem.h" -#include "nm-device-private.h" -#include "nm-object-private.h" - -G_DEFINE_TYPE (NMDeviceModem, nm_device_modem, NM_TYPE_DEVICE) - -#define NM_DEVICE_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_MODEM, NMDeviceModemPrivate)) - -typedef struct { - DBusGProxy *proxy; - - NMDeviceModemCapabilities caps; - NMDeviceModemCapabilities current_caps; -} NMDeviceModemPrivate; - -enum { - PROP_0, - PROP_MODEM_CAPS, - PROP_CURRENT_CAPS, - LAST_PROP -}; - -/** - * nm_device_modem_error_quark: - * - * Registers an error quark for #NMDeviceModem if necessary. - * - * Returns: the error quark used for #NMDeviceModem errors. - **/ -GQuark -nm_device_modem_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-modem-error-quark"); - return quark; -} - -/** - * nm_device_modem_get_modem_capabilities: - * @self: a #NMDeviceModem - * - * Returns a bitfield of the generic access technology families the modem - * supports. Not all capabilities are available concurrently however; some - * may require a firmware reload or reinitialization. - * - * Returns: the generic access technology families the modem supports - **/ -NMDeviceModemCapabilities -nm_device_modem_get_modem_capabilities (NMDeviceModem *self) -{ - g_return_val_if_fail (NM_IS_DEVICE_MODEM (self), NM_DEVICE_MODEM_CAPABILITY_NONE); - - _nm_object_ensure_inited (NM_OBJECT (self)); - return NM_DEVICE_MODEM_GET_PRIVATE (self)->caps; -} - -/** - * nm_device_modem_get_current_capabilities: - * @self: a #NMDeviceModem - * - * Returns a bitfield of the generic access technology families the modem - * supports without a firmware reload or reinitialization. This value - * represents the network types the modem can immediately connect to. - * - * Returns: the generic access technology families the modem supports without - * a firmware reload or other reinitialization - **/ -NMDeviceModemCapabilities -nm_device_modem_get_current_capabilities (NMDeviceModem *self) -{ - g_return_val_if_fail (NM_IS_DEVICE_MODEM (self), NM_DEVICE_MODEM_CAPABILITY_NONE); - - _nm_object_ensure_inited (NM_OBJECT (self)); - return NM_DEVICE_MODEM_GET_PRIVATE (self)->current_caps; -} - -static const char * -get_type_description (NMDevice *device) -{ - NMDeviceModemCapabilities caps; - - caps = nm_device_modem_get_current_capabilities (NM_DEVICE_MODEM (device)); - if (caps & NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS) - return "gsm"; - else if (caps & NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO) - return "cdma"; - else - return NULL; -} - -#define MODEM_CAPS_3GPP(caps) (caps & (NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS | \ - NM_DEVICE_MODEM_CAPABILITY_LTE)) - -#define MODEM_CAPS_3GPP2(caps) (caps & (NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO)) - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingGsm *s_gsm; - NMSettingCdma *s_cdma; - const char *ctype; - NMDeviceModemCapabilities current_caps; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if ( strcmp (ctype, NM_SETTING_GSM_SETTING_NAME) != 0 - && strcmp (ctype, NM_SETTING_CDMA_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_MODEM_ERROR, NM_DEVICE_MODEM_ERROR_NOT_MODEM_CONNECTION, - "The connection was not a modem connection."); - return FALSE; - } - - s_gsm = nm_connection_get_setting_gsm (connection); - s_cdma = nm_connection_get_setting_cdma (connection); - if (!s_cdma && !s_gsm) { - g_set_error (error, NM_DEVICE_MODEM_ERROR, NM_DEVICE_MODEM_ERROR_INVALID_MODEM_CONNECTION, - "The connection was not a valid modem connection."); - return FALSE; - } - - current_caps = nm_device_modem_get_current_capabilities (NM_DEVICE_MODEM (device)); - if (!(s_gsm && MODEM_CAPS_3GPP (current_caps)) && !(s_cdma && MODEM_CAPS_3GPP2 (current_caps))) { - g_set_error (error, NM_DEVICE_MODEM_ERROR, NM_DEVICE_MODEM_ERROR_MISSING_DEVICE_CAPS, - "The device missed capabilities required by the GSM/CDMA connection."); - return FALSE; - } - - return NM_DEVICE_CLASS (nm_device_modem_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - NMDeviceModemCapabilities caps; - - caps = nm_device_modem_get_current_capabilities (NM_DEVICE_MODEM (device)); - if (caps & (NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS | NM_DEVICE_MODEM_CAPABILITY_LTE)) - return NM_TYPE_SETTING_GSM; - else if (caps & NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO) - return NM_TYPE_SETTING_CDMA; - else - return G_TYPE_INVALID; -} - -/*****************************************************************************/ - -static void -nm_device_modem_init (NMDeviceModem *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_MODEM); -} - -static void -register_properties (NMDeviceModem *device) -{ - NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_MODEM_MODEM_CAPABILITIES, &priv->caps }, - { NM_DEVICE_MODEM_CURRENT_CAPABILITIES, &priv->current_caps }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_modem_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_MODEM); - register_properties (NM_DEVICE_MODEM (object)); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceModem *self = NM_DEVICE_MODEM (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_MODEM_CAPS: - g_value_set_uint (value, nm_device_modem_get_modem_capabilities (self)); - break; - case PROP_CURRENT_CAPS: - g_value_set_uint (value, nm_device_modem_get_current_capabilities (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -dispose (GObject *object) -{ - NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_device_modem_parent_class)->dispose (object); -} - -static void -nm_device_modem_class_init (NMDeviceModemClass *modem_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (modem_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (modem_class); - - g_type_class_add_private (modem_class, sizeof (NMDeviceModemPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->dispose = dispose; - - device_class->get_type_description = get_type_description; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - - /** - * NMDeviceModem:modem-capabilities: - * - * The generic family of access technologies the modem supports. Not all - * capabilities are available at the same time however; some modems require - * a firmware reload or other reinitialization to switch between eg - * CDMA/EVDO and GSM/UMTS. - **/ - g_object_class_install_property - (object_class, PROP_MODEM_CAPS, - g_param_spec_uint (NM_DEVICE_MODEM_MODEM_CAPABILITIES, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceModem:current-capabilities: - * - * The generic family of access technologies the modem currently supports - * without a firmware reload or reinitialization. - **/ - g_object_class_install_property - (object_class, PROP_CURRENT_CAPS, - g_param_spec_uint (NM_DEVICE_MODEM_CURRENT_CAPABILITIES, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-glib/nm-device-modem.h b/libnm-glib/nm-device-modem.h deleted file mode 100644 index 226cd046..00000000 --- a/libnm-glib/nm-device-modem.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2012 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#ifndef NM_DEVICE_MODEM_H -#define NM_DEVICE_MODEM_H - -#include "nm-device.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_MODEM (nm_device_modem_get_type ()) -#define NM_DEVICE_MODEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_MODEM, NMDeviceModem)) -#define NM_DEVICE_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_MODEM, NMDeviceModemClass)) -#define NM_IS_DEVICE_MODEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_MODEM)) -#define NM_IS_DEVICE_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_MODEM)) -#define NM_DEVICE_MODEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_MODEM, NMDeviceModemClass)) - -/** - * NMDeviceModemError: - * @NM_DEVICE_MODEM_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_MODEM_ERROR_NOT_MODEM_CONNECTION: the connection was not of modem type - * @NM_DEVICE_MODEM_ERROR_INVALID_MODEM_CONNECTION: the modem connection was invalid - * @NM_DEVICE_MODEM_ERROR_MISSING_DEVICE_CAPS: the device missed required capabilities - */ -typedef enum { - NM_DEVICE_MODEM_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_MODEM_ERROR_NOT_MODEM_CONNECTION, /*< nick=NotModemConnection >*/ - NM_DEVICE_MODEM_ERROR_INVALID_MODEM_CONNECTION, /*< nick=InvalidModemConnection >*/ - NM_DEVICE_MODEM_ERROR_MISSING_DEVICE_CAPS, /*< nick=MissingDeviceCaps >*/ -} NMDeviceModemError; - -#define NM_DEVICE_MODEM_ERROR nm_device_modem_error_quark () -GQuark nm_device_modem_error_quark (void); - -#define NM_DEVICE_MODEM_MODEM_CAPABILITIES "modem-capabilities" -#define NM_DEVICE_MODEM_CURRENT_CAPABILITIES "current-capabilities" - -typedef struct { - NMDevice parent; -} NMDeviceModem; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceModemClass; - -GType nm_device_modem_get_type (void); - -NMDeviceModemCapabilities nm_device_modem_get_modem_capabilities (NMDeviceModem *self); -NMDeviceModemCapabilities nm_device_modem_get_current_capabilities (NMDeviceModem *self); - -G_END_DECLS - -#endif /* NM_DEVICE_MODEM_H */ diff --git a/libnm-glib/nm-device-olpc-mesh.c b/libnm-glib/nm-device-olpc-mesh.c deleted file mode 100644 index df4fb465..00000000 --- a/libnm-glib/nm-device-olpc-mesh.c +++ /dev/null @@ -1,325 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-setting-connection.h" -#include "nm-setting-olpc-mesh.h" - -#include "nm-device-olpc-mesh.h" -#include "nm-device-private.h" -#include "nm-object-private.h" -#include "nm-device-wifi.h" - -G_DEFINE_TYPE (NMDeviceOlpcMesh, nm_device_olpc_mesh, NM_TYPE_DEVICE) - -#define NM_DEVICE_OLPC_MESH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_OLPC_MESH, NMDeviceOlpcMeshPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - NMDeviceWifi *companion; - guint32 active_channel; -} NMDeviceOlpcMeshPrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_COMPANION, - PROP_ACTIVE_CHANNEL, - - LAST_PROP -}; - -/** - * nm_device_olpc_mesh_error_quark: - * - * Registers an error quark for #NMDeviceOlpcMesh if necessary. - * - * Returns: the error quark used for #NMDeviceOlpcMesh errors. - **/ -GQuark -nm_device_olpc_mesh_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-olpc-mesh-error-quark"); - return quark; -} - -/** - * nm_device_olpc_mesh_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceOlpcMesh. - * - * Returns: (transfer full): a new OlpcMesh device - **/ -GObject * -nm_device_olpc_mesh_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_OLPC_MESH, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_olpc_mesh_get_hw_address: - * @device: a #NMDeviceOlpcMesh - * - * Gets the hardware (MAC) address of the #NMDeviceOlpcMesh - * - * Returns: the hardware address. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_olpc_mesh_get_hw_address (NMDeviceOlpcMesh *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_OLPC_MESH (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_OLPC_MESH_GET_PRIVATE (device)->hw_address; -} - -/** - * nm_device_olpc_mesh_get_companion: - * @device: a #NMDeviceOlpcMesh - * - * Gets the companion device of the #NMDeviceOlpcMesh. - * - * Returns: (transfer none): the companion of the device of %NULL - **/ -NMDeviceWifi * -nm_device_olpc_mesh_get_companion (NMDeviceOlpcMesh *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_OLPC_MESH (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_OLPC_MESH_GET_PRIVATE (device)->companion; -} - -/** - * nm_device_olpc_mesh_get_active_channel: - * @device: a #NMDeviceOlpcMesh - * - * Returns the active channel of the #NMDeviceOlpcMesh device. - * - * Returns: active channel of the device - **/ -guint32 -nm_device_olpc_mesh_get_active_channel (NMDeviceOlpcMesh *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_OLPC_MESH (device), 0); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_OLPC_MESH_GET_PRIVATE (device)->active_channel; -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_olpc_mesh_get_hw_address (NM_DEVICE_OLPC_MESH (device)); -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingOlpcMesh *s_olpc_mesh; - const char *ctype; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_OLPC_MESH_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_OLPC_MESH_ERROR, NM_DEVICE_OLPC_MESH_ERROR_NOT_OLPC_MESH_CONNECTION, - "The connection was not a Olpc Mesh connection."); - return FALSE; - } - - s_olpc_mesh = nm_connection_get_setting_olpc_mesh (connection); - if (!s_olpc_mesh) { - g_set_error (error, NM_DEVICE_OLPC_MESH_ERROR, NM_DEVICE_OLPC_MESH_ERROR_INVALID_OLPC_MESH_CONNECTION, - "The connection was not a valid Olpc Mesh connection."); - return FALSE; - } - - return NM_DEVICE_CLASS (nm_device_olpc_mesh_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_OLPC_MESH; -} - -/*****************************************************************************/ - -static void -nm_device_olpc_mesh_init (NMDeviceOlpcMesh *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_OLPC_MESH); -} - -static void -register_properties (NMDeviceOlpcMesh *device) -{ - NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_OLPC_MESH_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_OLPC_MESH_COMPANION, &priv->companion, NULL, NM_TYPE_DEVICE_WIFI }, - { NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL, &priv->active_channel }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_olpc_mesh_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_OLPC_MESH); - register_properties (NM_DEVICE_OLPC_MESH (object)); -} - -static void -dispose (GObject *object) -{ - NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (object); - - g_clear_object (&priv->companion); - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_device_olpc_mesh_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (object); - - g_free (priv->hw_address); - - G_OBJECT_CLASS (nm_device_olpc_mesh_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceOlpcMesh *device = NM_DEVICE_OLPC_MESH (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_device_olpc_mesh_get_hw_address (device)); - break; - case PROP_COMPANION: - g_value_set_object (value, nm_device_olpc_mesh_get_companion (device)); - break; - case PROP_ACTIVE_CHANNEL: - g_value_set_uint (value, nm_device_olpc_mesh_get_active_channel (device)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_olpc_mesh_class_init (NMDeviceOlpcMeshClass *olpc_mesh_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (olpc_mesh_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (olpc_mesh_class); - - g_type_class_add_private (olpc_mesh_class, sizeof (NMDeviceOlpcMeshPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->dispose = dispose; - object_class->finalize = finalize; - object_class->get_property = get_property; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - device_class->get_hw_address = get_hw_address; - - /* properties */ - - /** - * NMDeviceOlpcMesh:hw-address: - * - * The hardware (MAC) address of the device. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_OLPC_MESH_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceOlpcMesh:companion: - * - * The companion device. - **/ - g_object_class_install_property - (object_class, PROP_COMPANION, - g_param_spec_object (NM_DEVICE_OLPC_MESH_COMPANION, "", "", - NM_TYPE_DEVICE_WIFI, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceOlpcMesh:active-channel: - * - * The device's active channel. - **/ - g_object_class_install_property - (object_class, PROP_ACTIVE_CHANNEL, - g_param_spec_uint (NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - -} diff --git a/libnm-glib/nm-device-olpc-mesh.h b/libnm-glib/nm-device-olpc-mesh.h deleted file mode 100644 index fcef83bc..00000000 --- a/libnm-glib/nm-device-olpc-mesh.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2012 Red Hat, Inc. - */ - -#ifndef NM_DEVICE_OLPC_MESH_H -#define NM_DEVICE_OLPC_MESH_H - -#include "nm-device.h" -#include "nm-device-wifi.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_OLPC_MESH (nm_device_olpc_mesh_get_type ()) -#define NM_DEVICE_OLPC_MESH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_OLPC_MESH, NMDeviceOlpcMesh)) -#define NM_DEVICE_OLPC_MESH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_OLPC_MESH, NMDeviceOlpcMeshClass)) -#define NM_IS_DEVICE_OLPC_MESH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_OLPC_MESH)) -#define NM_IS_DEVICE_OLPC_MESH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_OLPC_MESH)) -#define NM_DEVICE_OLPC_MESH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_OLPC_MESH, NMDeviceOlpcMeshClass)) - -/** - * NMDeviceOlpcMeshError: - * @NM_DEVICE_OLPC_MESH_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_OLPC_MESH_ERROR_NOT_OLPC_MESH_CONNECTION: the connection was not of Olpc Mesh type - * @NM_DEVICE_OLPC_MESH_ERROR_INVALID_OLPC_MESH_CONNECTION: the Olpc Mesh connection was invalid - */ -typedef enum { - NM_DEVICE_OLPC_MESH_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_OLPC_MESH_ERROR_NOT_OLPC_MESH_CONNECTION, /*< nick=NotOlpcMeshConnection >*/ - NM_DEVICE_OLPC_MESH_ERROR_INVALID_OLPC_MESH_CONNECTION, /*< nick=InvalidOlpcMeshConnection >*/ -} NMDeviceOlpcMeshError; - -#define NM_DEVICE_OLPC_MESH_ERROR nm_device_olpc_mesh_error_quark () -GQuark nm_device_olpc_mesh_error_quark (void); - -#define NM_DEVICE_OLPC_MESH_HW_ADDRESS "hw-address" -#define NM_DEVICE_OLPC_MESH_COMPANION "companion" -#define NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL "active-channel" - -typedef struct { - NMDevice parent; -} NMDeviceOlpcMesh; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceOlpcMeshClass; - -GType nm_device_olpc_mesh_get_type (void); - -GObject *nm_device_olpc_mesh_new (DBusGConnection *connection, const char *path); - -const char *nm_device_olpc_mesh_get_hw_address (NMDeviceOlpcMesh *device); -NMDeviceWifi *nm_device_olpc_mesh_get_companion (NMDeviceOlpcMesh *device); -guint32 nm_device_olpc_mesh_get_active_channel (NMDeviceOlpcMesh *device); - -G_END_DECLS - -#endif /* NM_DEVICE_OLPC_MESH_H */ diff --git a/libnm-glib/nm-device-private.h b/libnm-glib/nm-device-private.h deleted file mode 100644 index 1a29c97d..00000000 --- a/libnm-glib/nm-device-private.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#ifndef NM_DEVICE_PRIVATE_H -#define NM_DEVICE_PRIVATE_H - -void _nm_device_set_device_type (NMDevice *device, NMDeviceType dtype); -NMDeviceType _nm_device_type_for_path (DBusGConnection *connection, const char *path); - -#endif /* NM_DEVICE_PRIVATE_H */ diff --git a/libnm-glib/nm-device-team.c b/libnm-glib/nm-device-team.c deleted file mode 100644 index 2a12a732..00000000 --- a/libnm-glib/nm-device-team.c +++ /dev/null @@ -1,352 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Jiri Pirko <jiri@resnulli.us> - */ - -#include "nm-default.h" - -#include <string.h> -#include <netinet/ether.h> - -#include "nm-setting-connection.h" -#include "nm-setting-team.h" -#include "nm-utils.h" - -#include "nm-device-team.h" -#include "nm-device-private.h" -#include "nm-object-private.h" -#include "nm-types.h" - -G_DEFINE_TYPE (NMDeviceTeam, nm_device_team, NM_TYPE_DEVICE) - -#define NM_DEVICE_TEAM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_TEAM, NMDeviceTeamPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - gboolean carrier; - GPtrArray *slaves; -} NMDeviceTeamPrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_CARRIER, - PROP_SLAVES, - - LAST_PROP -}; - -/** - * nm_device_team_error_quark: - * - * Registers an error quark for #NMDeviceTeam if necessary. - * - * Returns: the error quark used for #NMDeviceTeam errors. - * - * Since: 0.9.10 - **/ -GQuark -nm_device_team_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-team-error-quark"); - return quark; -} - -/** - * nm_device_team_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceTeam. - * - * Returns: (transfer full): a new device - * - * Since: 0.9.10 - **/ -GObject * -nm_device_team_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_TEAM, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_team_get_hw_address: - * @device: a #NMDeviceTeam - * - * Gets the hardware (MAC) address of the #NMDeviceTeam - * - * Returns: the hardware address. This is the internal string used by the - * device, and must not be modified. - * - * Since: 0.9.10 - **/ -const char * -nm_device_team_get_hw_address (NMDeviceTeam *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_TEAM (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_TEAM_GET_PRIVATE (device)->hw_address; -} - -/** - * nm_device_team_get_carrier: - * @device: a #NMDeviceTeam - * - * Whether the device has carrier. - * - * Returns: %TRUE if the device has carrier - * - * Since: 0.9.10 - **/ -gboolean -nm_device_team_get_carrier (NMDeviceTeam *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_TEAM (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_TEAM_GET_PRIVATE (device)->carrier; -} - -/** - * nm_device_team_get_slaves: - * @device: a #NMDeviceTeam - * - * Gets the devices currently enslaved to @device. - * - * Returns: (element-type NMDevice): the #GPtrArray containing - * #NMDevices that are slaves of @device. This is the internal - * copy used by the device, and must not be modified. - * - * Since: 0.9.10 - **/ -const GPtrArray * -nm_device_team_get_slaves (NMDeviceTeam *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_TEAM (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return handle_ptr_array_return (NM_DEVICE_TEAM_GET_PRIVATE (device)->slaves); -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_team_get_hw_address (NM_DEVICE_TEAM (device)); -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingTeam *s_team; - const char *ctype, *dev_iface_name, *team_iface_name; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_TEAM_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_TEAM_ERROR, NM_DEVICE_TEAM_ERROR_NOT_TEAM_CONNECTION, - "The connection was not a team connection."); - return FALSE; - } - - s_team = nm_connection_get_setting_team (connection); - if (!s_team) { - g_set_error (error, NM_DEVICE_TEAM_ERROR, NM_DEVICE_TEAM_ERROR_INVALID_TEAM_CONNECTION, - "The connection was not a valid team connection."); - return FALSE; - } - - dev_iface_name = nm_device_get_iface (device); - team_iface_name = nm_setting_team_get_interface_name (s_team); - if (g_strcmp0 (dev_iface_name, team_iface_name) != 0) { - g_set_error (error, NM_DEVICE_TEAM_ERROR, NM_DEVICE_TEAM_ERROR_INTERFACE_MISMATCH, - "The interfaces of the device and the connection didn't match."); - return FALSE; - } - - /* FIXME: check slaves? */ - - return NM_DEVICE_CLASS (nm_device_team_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_TEAM; -} - -/*****************************************************************************/ - -static void -nm_device_team_init (NMDeviceTeam *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_TEAM); -} - -static void -register_properties (NMDeviceTeam *device) -{ - NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_TEAM_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_TEAM_CARRIER, &priv->carrier }, - { NM_DEVICE_TEAM_SLAVES, &priv->slaves, NULL, NM_TYPE_DEVICE }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_team_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_TEAM); - register_properties (NM_DEVICE_TEAM (object)); -} - -static void -dispose (GObject *object) -{ - NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - - if (priv->slaves) { - g_ptr_array_set_free_func (priv->slaves, g_object_unref); - g_ptr_array_free (priv->slaves, TRUE); - priv->slaves = NULL; - } - - G_OBJECT_CLASS (nm_device_team_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE (object); - - g_free (priv->hw_address); - - G_OBJECT_CLASS (nm_device_team_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceTeam *device = NM_DEVICE_TEAM (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_device_team_get_hw_address (device)); - break; - case PROP_CARRIER: - g_value_set_boolean (value, nm_device_team_get_carrier (device)); - break; - case PROP_SLAVES: - g_value_set_boxed (value, nm_device_team_get_slaves (device)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_team_class_init (NMDeviceTeamClass *team_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (team_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (team_class); - - g_type_class_add_private (team_class, sizeof (NMDeviceTeamPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->dispose = dispose; - object_class->finalize = finalize; - object_class->get_property = get_property; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - device_class->get_hw_address = get_hw_address; - - /* properties */ - - /** - * NMDeviceTeam:hw-address: - * - * The hardware (MAC) address of the device. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_TEAM_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceTeam:carrier: - * - * Whether the device has carrier. - **/ - g_object_class_install_property - (object_class, PROP_CARRIER, - g_param_spec_boolean (NM_DEVICE_TEAM_CARRIER, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceTeam:slaves: - * - * The devices (#NMDevice) enslaved to the team device. - **/ - g_object_class_install_property - (object_class, PROP_SLAVES, - g_param_spec_boxed (NM_DEVICE_TEAM_SLAVES, "", "", - NM_TYPE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-glib/nm-device-team.h b/libnm-glib/nm-device-team.h deleted file mode 100644 index 46e910ba..00000000 --- a/libnm-glib/nm-device-team.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2013 Jiri Pirko <jiri@resnulli.us> - */ - -#ifndef NM_DEVICE_TEAM_H -#define NM_DEVICE_TEAM_H - -#include "nm-device.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_TEAM (nm_device_team_get_type ()) -#define NM_DEVICE_TEAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_TEAM, NMDeviceTeam)) -#define NM_DEVICE_TEAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_TEAM, NMDeviceTeamClass)) -#define NM_IS_DEVICE_TEAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_TEAM)) -#define NM_IS_DEVICE_TEAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_TEAM)) -#define NM_DEVICE_TEAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_TEAM, NMDeviceTeamClass)) - -/** - * NMDeviceTeamError: - * @NM_DEVICE_TEAM_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_TEAM_ERROR_NOT_TEAM_CONNECTION: the connection was not of team type - * @NM_DEVICE_TEAM_ERROR_INVALID_TEAM_CONNECTION: the team connection was invalid - * @NM_DEVICE_TEAM_ERROR_INTERFACE_MISMATCH: the interfaces of the connection and the device mismatched - */ -typedef enum { - NM_DEVICE_TEAM_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_TEAM_ERROR_NOT_TEAM_CONNECTION, /*< nick=NotTeamConnection >*/ - NM_DEVICE_TEAM_ERROR_INVALID_TEAM_CONNECTION, /*< nick=InvalidTeamConnection >*/ - NM_DEVICE_TEAM_ERROR_INTERFACE_MISMATCH, /*< nick=InterfaceMismatch >*/ -} NMDeviceTeamError; - -#define NM_DEVICE_TEAM_ERROR nm_device_team_error_quark () -NM_AVAILABLE_IN_0_9_10 -GQuark nm_device_team_error_quark (void); - -#define NM_DEVICE_TEAM_HW_ADDRESS "hw-address" -#define NM_DEVICE_TEAM_CARRIER "carrier" -#define NM_DEVICE_TEAM_SLAVES "slaves" - -typedef struct { - NMDevice parent; -} NMDeviceTeam; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceTeamClass; - -NM_AVAILABLE_IN_0_9_10 -GType nm_device_team_get_type (void); - -NM_AVAILABLE_IN_0_9_10 -GObject *nm_device_team_new (DBusGConnection *connection, const char *path); - -const char *nm_device_team_get_hw_address (NMDeviceTeam *device); -gboolean nm_device_team_get_carrier (NMDeviceTeam *device); -const GPtrArray *nm_device_team_get_slaves (NMDeviceTeam *device); - -G_END_DECLS - -#endif /* NM_DEVICE_TEAM_H */ diff --git a/libnm-glib/nm-device-vlan.c b/libnm-glib/nm-device-vlan.c deleted file mode 100644 index 3f40ec56..00000000 --- a/libnm-glib/nm-device-vlan.c +++ /dev/null @@ -1,390 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <netinet/ether.h> - -#include "nm-setting-connection.h" -#include "nm-setting-vlan.h" -#include "nm-utils.h" - -#include "nm-device-vlan.h" -#include "nm-device-private.h" -#include "nm-object-private.h" - -G_DEFINE_TYPE (NMDeviceVlan, nm_device_vlan, NM_TYPE_DEVICE) - -#define NM_DEVICE_VLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_VLAN, NMDeviceVlanPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - gboolean carrier; - NMDevice *parent; - guint vlan_id; -} NMDeviceVlanPrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_CARRIER, - PROP_PARENT, - PROP_VLAN_ID, - - LAST_PROP -}; - -/** - * nm_device_vlan_error_quark: - * - * Registers an error quark for #NMDeviceVlan if necessary. - * - * Returns: the error quark used for #NMDeviceVlan errors. - **/ -GQuark -nm_device_vlan_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-vlan-error-quark"); - return quark; -} - -/** - * nm_device_vlan_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceVlan. - * - * Returns: (transfer full): a new device - **/ -GObject * -nm_device_vlan_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_VLAN, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_vlan_get_hw_address: - * @device: a #NMDeviceVlan - * - * Gets the hardware (MAC) address of the #NMDeviceVlan - * - * Returns: the hardware address. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_vlan_get_hw_address (NMDeviceVlan *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_VLAN (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_VLAN_GET_PRIVATE (device)->hw_address; -} - -/** - * nm_device_vlan_get_carrier: - * @device: a #NMDeviceVlan - * - * Whether the device has carrier. - * - * Returns: %TRUE if the device has carrier - **/ -gboolean -nm_device_vlan_get_carrier (NMDeviceVlan *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_VLAN (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_VLAN_GET_PRIVATE (device)->carrier; -} - -/** - * nm_device_vlan_get_parent: - * @device: a #NMDeviceVlan - * - * Returns: (transfer none): the device's parent device - * - * Since: 1.0 - **/ -NMDevice * -nm_device_vlan_get_parent (NMDeviceVlan *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_VLAN (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_VLAN_GET_PRIVATE (device)->parent; -} - -/** - * nm_device_vlan_get_vlan_id: - * @device: a #NMDeviceVlan - * - * Returns: the device's VLAN ID - **/ -guint -nm_device_vlan_get_vlan_id (NMDeviceVlan *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_VLAN (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_VLAN_GET_PRIVATE (device)->vlan_id; -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingVlan *s_vlan; - NMSettingWired *s_wired; - const char *ctype, *dev_iface_name, *vlan_iface_name; - const GByteArray *mac_address; - char *mac_address_str; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_VLAN_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_VLAN_ERROR, NM_DEVICE_VLAN_ERROR_NOT_VLAN_CONNECTION, - "The connection was not a VLAN connection."); - return FALSE; - } - - s_vlan = nm_connection_get_setting_vlan (connection); - if (!s_vlan) { - g_set_error (error, NM_DEVICE_VLAN_ERROR, NM_DEVICE_VLAN_ERROR_INVALID_VLAN_CONNECTION, - "The connection was not a valid VLAN connection."); - return FALSE; - } - - if (nm_setting_vlan_get_id (s_vlan) != nm_device_vlan_get_vlan_id (NM_DEVICE_VLAN (device))) { - g_set_error (error, NM_DEVICE_VLAN_ERROR, NM_DEVICE_VLAN_ERROR_ID_MISMATCH, - "The VLAN identifiers of the device and the connection didn't match."); - return FALSE; - } - - dev_iface_name = nm_device_get_iface (device); - vlan_iface_name = nm_setting_vlan_get_interface_name (s_vlan); - if (vlan_iface_name && g_strcmp0 (dev_iface_name, vlan_iface_name) != 0) { - g_set_error (error, NM_DEVICE_VLAN_ERROR, NM_DEVICE_VLAN_ERROR_INTERFACE_MISMATCH, - "The interfaces of the device and the connection didn't match."); - return FALSE; - } - - s_wired = nm_connection_get_setting_wired (connection); - if (s_wired) - mac_address = nm_setting_wired_get_mac_address (s_wired); - else - mac_address = NULL; - if (mac_address) { - mac_address_str = nm_utils_hwaddr_ntoa_len (mac_address->data, mac_address->len); - if (!g_strcmp0 (mac_address_str, NM_DEVICE_VLAN_GET_PRIVATE (device)->hw_address)) { - g_set_error (error, NM_DEVICE_VLAN_ERROR, NM_DEVICE_VLAN_ERROR_MAC_MISMATCH, - "The hardware address of the device and the connection didn't match."); - } - g_free (mac_address_str); - } - - return NM_DEVICE_CLASS (nm_device_vlan_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_VLAN; -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_vlan_get_hw_address (NM_DEVICE_VLAN (device)); -} - -/*****************************************************************************/ - -static void -nm_device_vlan_init (NMDeviceVlan *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_VLAN); -} - -static void -register_properties (NMDeviceVlan *device) -{ - NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_VLAN_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_VLAN_CARRIER, &priv->carrier }, - { NM_DEVICE_VLAN_PARENT, &priv->parent, NULL, NM_TYPE_DEVICE }, - { NM_DEVICE_VLAN_VLAN_ID, &priv->vlan_id }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_vlan_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_VLAN); - register_properties (NM_DEVICE_VLAN (object)); -} - -static void -dispose (GObject *object) -{ - NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (object); - - g_clear_object (&priv->parent); - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_device_vlan_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (object); - - g_free (priv->hw_address); - - G_OBJECT_CLASS (nm_device_vlan_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceVlan *device = NM_DEVICE_VLAN (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_device_vlan_get_hw_address (device)); - break; - case PROP_CARRIER: - g_value_set_boolean (value, nm_device_vlan_get_carrier (device)); - break; - case PROP_PARENT: - g_value_set_object (value, nm_device_vlan_get_parent (device)); - break; - case PROP_VLAN_ID: - g_value_set_uint (value, nm_device_vlan_get_vlan_id (device)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_vlan_class_init (NMDeviceVlanClass *vlan_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (vlan_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (vlan_class); - - g_type_class_add_private (vlan_class, sizeof (NMDeviceVlanPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->dispose = dispose; - object_class->finalize = finalize; - object_class->get_property = get_property; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - device_class->get_hw_address = get_hw_address; - - /* properties */ - - /** - * NMDeviceVlan:hw-address: - * - * The hardware (MAC) address of the device. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_VLAN_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceVlan:carrier: - * - * Whether the device has carrier. - **/ - g_object_class_install_property - (object_class, PROP_CARRIER, - g_param_spec_boolean (NM_DEVICE_VLAN_CARRIER, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceVlan:parent: - * - * The devices's parent device. - * - * Since: 1.0 - **/ - g_object_class_install_property - (object_class, PROP_PARENT, - g_param_spec_object (NM_DEVICE_VLAN_PARENT, "", "", - NM_TYPE_DEVICE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceVlan:vlan-id: - * - * The device's VLAN ID. - **/ - g_object_class_install_property - (object_class, PROP_VLAN_ID, - g_param_spec_uint (NM_DEVICE_VLAN_VLAN_ID, "", "", - 0, 4095, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-glib/nm-device-vlan.h b/libnm-glib/nm-device-vlan.h deleted file mode 100644 index 107cfea8..00000000 --- a/libnm-glib/nm-device-vlan.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2012 - 2014 Red Hat, Inc. - */ - -#ifndef NM_DEVICE_VLAN_H -#define NM_DEVICE_VLAN_H - -#include "nm-device.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_VLAN (nm_device_vlan_get_type ()) -#define NM_DEVICE_VLAN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_VLAN, NMDeviceVlan)) -#define NM_DEVICE_VLAN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_VLAN, NMDeviceVlanClass)) -#define NM_IS_DEVICE_VLAN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_VLAN)) -#define NM_IS_DEVICE_VLAN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_VLAN)) -#define NM_DEVICE_VLAN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_VLAN, NMDeviceVlanClass)) - -/** - * NMDeviceVlanError: - * @NM_DEVICE_VLAN_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_VLAN_ERROR_NOT_VLAN_CONNECTION: the connection was not of VLAN type - * @NM_DEVICE_VLAN_ERROR_INVALID_VLAN_CONNECTION: the VLAN connection was invalid - * @NM_DEVICE_VLAN_ERROR_ID_MISMATCH: the VLAN identifiers of the connection and the device mismatched - * @NM_DEVICE_VLAN_ERROR_INTERFACE_MISMATCH: the interfaces of the connection and the device mismatched - * @NM_DEVICE_VLAN_ERROR_MAC_MISMATCH: the MACs of the connection and the device mismatched - */ -typedef enum { - NM_DEVICE_VLAN_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_VLAN_ERROR_NOT_VLAN_CONNECTION, /*< nick=NotVlanConnection >*/ - NM_DEVICE_VLAN_ERROR_INVALID_VLAN_CONNECTION, /*< nick=InvalidVlanConnection >*/ - NM_DEVICE_VLAN_ERROR_ID_MISMATCH, /*< nick=IdMismatch >*/ - NM_DEVICE_VLAN_ERROR_INTERFACE_MISMATCH, /*< nick=InterfaceMismatch >*/ - NM_DEVICE_VLAN_ERROR_MAC_MISMATCH, /*< nick=MacMismatch >*/ -} NMDeviceVlanError; - -#define NM_DEVICE_VLAN_ERROR nm_device_vlan_error_quark () -GQuark nm_device_vlan_error_quark (void); - -#define NM_DEVICE_VLAN_HW_ADDRESS "hw-address" -#define NM_DEVICE_VLAN_CARRIER "carrier" -#define NM_DEVICE_VLAN_PARENT "parent" -#define NM_DEVICE_VLAN_VLAN_ID "vlan-id" - -typedef struct { - NMDevice parent; -} NMDeviceVlan; - -typedef struct { - NMDeviceClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceVlanClass; - -GType nm_device_vlan_get_type (void); - -GObject *nm_device_vlan_new (DBusGConnection *connection, const char *path); - -const char * nm_device_vlan_get_hw_address (NMDeviceVlan *device); -gboolean nm_device_vlan_get_carrier (NMDeviceVlan *device); -NM_AVAILABLE_IN_1_0 -NMDevice * nm_device_vlan_get_parent (NMDeviceVlan *device); -guint nm_device_vlan_get_vlan_id (NMDeviceVlan *device); - -G_END_DECLS - -#endif /* NM_DEVICE_VLAN_H */ diff --git a/libnm-glib/nm-device-wifi.c b/libnm-glib/nm-device-wifi.c deleted file mode 100644 index 08e5b90c..00000000 --- a/libnm-glib/nm-device-wifi.c +++ /dev/null @@ -1,837 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <netinet/ether.h> - -#include "nm-setting-connection.h" -#include "nm-setting-wireless.h" -#include "nm-setting-wireless-security.h" - -#include "nm-device-wifi.h" -#include "nm-device-private.h" -#include "nm-object-private.h" -#include "nm-object-cache.h" -#include "nm-dbus-glib-types.h" -#include "nm-types-private.h" - -G_DEFINE_TYPE (NMDeviceWifi, nm_device_wifi, NM_TYPE_DEVICE) - -#define NM_DEVICE_WIFI_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_WIFI, NMDeviceWifiPrivate)) - -void _nm_device_wifi_set_wireless_enabled (NMDeviceWifi *device, gboolean enabled); - -typedef struct { - NMDeviceWifi *device; - NMDeviceWifiRequestScanFn callback; - gpointer user_data; -} RequestScanInfo; - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - char *perm_hw_address; - NM80211Mode mode; - guint32 rate; - NMAccessPoint *active_ap; - NMDeviceWifiCapabilities wireless_caps; - GPtrArray *aps; - - DBusGProxyCall *scan_call; - RequestScanInfo *scan_info; -} NMDeviceWifiPrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_PERM_HW_ADDRESS, - PROP_MODE, - PROP_BITRATE, - PROP_ACTIVE_ACCESS_POINT, - PROP_WIRELESS_CAPABILITIES, - PROP_ACCESS_POINTS, - - LAST_PROP -}; - -enum { - ACCESS_POINT_ADDED, - ACCESS_POINT_REMOVED, - - LAST_SIGNAL -}; -static guint signals[LAST_SIGNAL] = { 0 }; - -/** - * nm_device_wifi_error_quark: - * - * Registers an error quark for #NMDeviceWifi if necessary. - * - * Returns: the error quark used for #NMDeviceWifi errors. - **/ -GQuark -nm_device_wifi_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-wifi-error-quark"); - return quark; -} - -/** - * nm_device_wifi_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDeviceWifi. - * - * Returns: (transfer full): a new Wi-Fi device - **/ -GObject * -nm_device_wifi_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_WIFI, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_wifi_get_hw_address: - * @device: a #NMDeviceWifi - * - * Gets the actual hardware (MAC) address of the #NMDeviceWifi - * - * Returns: the actual hardware address. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_wifi_get_hw_address (NMDeviceWifi *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_WIFI_GET_PRIVATE (device)->hw_address; -} - -/** - * nm_device_wifi_get_permanent_hw_address: - * @device: a #NMDeviceWifi - * - * Gets the permanent hardware (MAC) address of the #NMDeviceWifi - * - * Returns: the permanent hardware address. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_wifi_get_permanent_hw_address (NMDeviceWifi *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_WIFI_GET_PRIVATE (device)->perm_hw_address; -} - -/** - * nm_device_wifi_get_mode: - * @device: a #NMDeviceWifi - * - * Gets the #NMDeviceWifi mode. - * - * Returns: the mode - **/ -NM80211Mode -nm_device_wifi_get_mode (NMDeviceWifi *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), 0); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_WIFI_GET_PRIVATE (device)->mode; -} - -/** - * nm_device_wifi_get_bitrate: - * @device: a #NMDeviceWifi - * - * Gets the bit rate of the #NMDeviceWifi in kbit/s. - * - * Returns: the bit rate (kbit/s) - **/ -guint32 -nm_device_wifi_get_bitrate (NMDeviceWifi *device) -{ - NMDeviceState state; - - g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), 0); - - state = nm_device_get_state (NM_DEVICE (device)); - switch (state) { - case NM_DEVICE_STATE_IP_CONFIG: - case NM_DEVICE_STATE_IP_CHECK: - case NM_DEVICE_STATE_SECONDARIES: - case NM_DEVICE_STATE_ACTIVATED: - case NM_DEVICE_STATE_DEACTIVATING: - break; - default: - return 0; - } - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_WIFI_GET_PRIVATE (device)->rate; -} - -/** - * nm_device_wifi_get_capabilities: - * @device: a #NMDeviceWifi - * - * Gets the Wi-Fi capabilities of the #NMDeviceWifi. - * - * Returns: the capabilities - **/ -NMDeviceWifiCapabilities -nm_device_wifi_get_capabilities (NMDeviceWifi *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), 0); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_WIFI_GET_PRIVATE (device)->wireless_caps; -} - -/** - * nm_device_wifi_get_active_access_point: - * @device: a #NMDeviceWifi - * - * Gets the active #NMAccessPoint. - * - * Returns: (transfer none): the access point or %NULL if none is active - **/ -NMAccessPoint * -nm_device_wifi_get_active_access_point (NMDeviceWifi *device) -{ - NMDeviceState state; - - g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL); - - state = nm_device_get_state (NM_DEVICE (device)); - switch (state) { - case NM_DEVICE_STATE_PREPARE: - case NM_DEVICE_STATE_CONFIG: - case NM_DEVICE_STATE_NEED_AUTH: - case NM_DEVICE_STATE_IP_CONFIG: - case NM_DEVICE_STATE_IP_CHECK: - case NM_DEVICE_STATE_SECONDARIES: - case NM_DEVICE_STATE_ACTIVATED: - case NM_DEVICE_STATE_DEACTIVATING: - break; - default: - return NULL; - break; - } - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_WIFI_GET_PRIVATE (device)->active_ap; -} - -/** - * nm_device_wifi_get_access_points: - * @device: a #NMDeviceWifi - * - * Gets all the scanned access points of the #NMDeviceWifi. - * - * Returns: (element-type NMAccessPoint): a #GPtrArray containing all the - * scanned #NMAccessPoints. - * The returned array is owned by the client and should not be modified. - **/ -const GPtrArray * -nm_device_wifi_get_access_points (NMDeviceWifi *device) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return handle_ptr_array_return (NM_DEVICE_WIFI_GET_PRIVATE (device)->aps); -} - -/** - * nm_device_wifi_get_access_point_by_path: - * @device: a #NMDeviceWifi - * @path: the object path of the access point - * - * Gets a #NMAccessPoint by path. - * - * Returns: (transfer none): the access point or %NULL if none is found. - **/ -NMAccessPoint * -nm_device_wifi_get_access_point_by_path (NMDeviceWifi *device, - const char *path) -{ - const GPtrArray *aps; - int i; - NMAccessPoint *ap = NULL; - - g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL); - g_return_val_if_fail (path != NULL, NULL); - - aps = nm_device_wifi_get_access_points (device); - if (!aps) - return NULL; - - for (i = 0; i < aps->len; i++) { - NMAccessPoint *candidate = g_ptr_array_index (aps, i); - if (!strcmp (nm_object_get_path (NM_OBJECT (candidate)), path)) { - ap = candidate; - break; - } - } - - return ap; -} - -static void -request_scan_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - RequestScanInfo *info = user_data; - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (info->device); - GError *error = NULL; - - dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); - - if (info->callback) - info->callback (info->device, error, info->user_data); - - g_clear_error (&error); - g_slice_free (RequestScanInfo, info); - - priv->scan_call = NULL; - priv->scan_info = NULL; -} - -/** - * nm_device_wifi_request_scan_simple: - * @device: a #NMDeviceWifi - * @callback: (scope async) (allow-none): the function to call when the call is done - * @user_data: (closure): user data to pass to the callback function - * - * Request NM to scan for access points on the #NMDeviceWifi. This function only - * instructs NM to perform scanning. Use nm_device_wifi_get_access_points() - * to get available access points. - * - * Since: 0.9.8 - **/ -void -nm_device_wifi_request_scan_simple (NMDeviceWifi *device, - NMDeviceWifiRequestScanFn callback, - gpointer user_data) -{ - RequestScanInfo *info; - GHashTable *options; - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (device); - - g_return_if_fail (NM_IS_DEVICE_WIFI (device)); - - /* If a scan is in progress, just return */ - if (priv->scan_call) - return; - - options = g_hash_table_new (g_str_hash, g_str_equal); - - info = g_slice_new0 (RequestScanInfo); - info->device = device; - info->callback = callback; - info->user_data = user_data; - - priv->scan_info = info; - priv->scan_call = dbus_g_proxy_begin_call (NM_DEVICE_WIFI_GET_PRIVATE (device)->proxy, "RequestScan", - request_scan_cb, info, NULL, - DBUS_TYPE_G_MAP_OF_VARIANT, options, - G_TYPE_INVALID); - - g_hash_table_unref (options); -} - -static void -clean_up_aps (NMDeviceWifi *self, gboolean notify) -{ - NMDeviceWifiPrivate *priv; - - g_return_if_fail (NM_IS_DEVICE_WIFI (self)); - - priv = NM_DEVICE_WIFI_GET_PRIVATE (self); - - if (priv->active_ap) { - g_object_unref (priv->active_ap); - priv->active_ap = NULL; - } - - if (priv->aps) { - while (priv->aps->len) { - NMAccessPoint *ap = NM_ACCESS_POINT (g_ptr_array_index (priv->aps, 0)); - - if (notify) - g_signal_emit (self, signals[ACCESS_POINT_REMOVED], 0, ap); - g_ptr_array_remove (priv->aps, ap); - g_object_unref (ap); - } - g_ptr_array_free (priv->aps, TRUE); - priv->aps = NULL; - } -} - -/** - * _nm_device_wifi_set_wireless_enabled: - * @device: a #NMDeviceWifi - * @enabled: %TRUE to enable the device - * - * Enables or disables the wireless device. - **/ -void -_nm_device_wifi_set_wireless_enabled (NMDeviceWifi *device, - gboolean enabled) -{ - g_return_if_fail (NM_IS_DEVICE_WIFI (device)); - - if (!enabled) - clean_up_aps (device, TRUE); -} - -#define WPA_CAPS (NM_WIFI_DEVICE_CAP_CIPHER_TKIP | \ - NM_WIFI_DEVICE_CAP_CIPHER_CCMP | \ - NM_WIFI_DEVICE_CAP_WPA | \ - NM_WIFI_DEVICE_CAP_RSN) - -#define RSN_CAPS (NM_WIFI_DEVICE_CAP_CIPHER_CCMP | NM_WIFI_DEVICE_CAP_RSN) - -static gboolean -has_proto (NMSettingWirelessSecurity *s_wsec, const char *proto) -{ - int i; - - for (i = 0; i < nm_setting_wireless_security_get_num_protos (s_wsec); i++) { - if (g_strcmp0 (proto, nm_setting_wireless_security_get_proto (s_wsec, i)) == 0) - return TRUE; - } - return FALSE; -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingWireless *s_wifi; - NMSettingWirelessSecurity *s_wsec; - const char *ctype; - const GByteArray *mac; - const char *hw_str; - struct ether_addr *hw_mac; - NMDeviceWifiCapabilities wifi_caps; - const char *key_mgmt; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_WIRELESS_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_WIFI_ERROR, NM_DEVICE_WIFI_ERROR_NOT_WIFI_CONNECTION, - "The connection was not a Wi-Fi connection."); - return FALSE; - } - - s_wifi = nm_connection_get_setting_wireless (connection); - if (!s_wifi) { - g_set_error (error, NM_DEVICE_WIFI_ERROR, NM_DEVICE_WIFI_ERROR_INVALID_WIFI_CONNECTION, - "The connection was not a valid Wi-Fi connection."); - return FALSE; - } - - /* Check MAC address */ - hw_str = nm_device_wifi_get_permanent_hw_address (NM_DEVICE_WIFI (device)); - if (hw_str) { - hw_mac = ether_aton (hw_str); - if (!hw_mac) { - g_set_error (error, NM_DEVICE_WIFI_ERROR, NM_DEVICE_WIFI_ERROR_INVALID_DEVICE_MAC, - "Invalid device MAC address."); - return FALSE; - } - mac = nm_setting_wireless_get_mac_address (s_wifi); - if (mac && hw_mac && memcmp (mac->data, hw_mac->ether_addr_octet, ETH_ALEN)) { - g_set_error (error, NM_DEVICE_WIFI_ERROR, NM_DEVICE_WIFI_ERROR_MAC_MISMATCH, - "The MACs of the device and the connection didn't match."); - return FALSE; - } - } - - /* Check device capabilities; we assume all devices can do WEP at least */ - wifi_caps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (device)); - - s_wsec = nm_connection_get_setting_wireless_security (connection); - if (s_wsec) { - /* Connection has security, verify it against the device's capabilities */ - key_mgmt = nm_setting_wireless_security_get_key_mgmt (s_wsec); - if ( !g_strcmp0 (key_mgmt, "wpa-none") - || !g_strcmp0 (key_mgmt, "wpa-psk") - || !g_strcmp0 (key_mgmt, "wpa-eap")) { - - /* Is device only WEP capable? */ - if (!(wifi_caps & WPA_CAPS)) { - g_set_error (error, NM_DEVICE_WIFI_ERROR, NM_DEVICE_WIFI_ERROR_MISSING_DEVICE_WPA_CAPS, - "The device missed WPA capabilities required by the connection."); - return FALSE; - } - - /* Make sure WPA2/RSN-only connections don't get chosen for WPA-only cards */ - if (has_proto (s_wsec, "rsn") && !has_proto (s_wsec, "wpa") && !(wifi_caps & RSN_CAPS)) { - g_set_error (error, NM_DEVICE_WIFI_ERROR, NM_DEVICE_WIFI_ERROR_MISSING_DEVICE_RSN_CAPS, - "The device missed WPA2/RSN capabilities required by the connection."); - return FALSE; - } - } - } - - return NM_DEVICE_CLASS (nm_device_wifi_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_WIRELESS; -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_wifi_get_hw_address (NM_DEVICE_WIFI (device)); -} - -/*****************************************************************************/ - -static void -nm_device_wifi_init (NMDeviceWifi *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_WIFI); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceWifi *self = NM_DEVICE_WIFI (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_device_wifi_get_hw_address (self)); - break; - case PROP_PERM_HW_ADDRESS: - g_value_set_string (value, nm_device_wifi_get_permanent_hw_address (self)); - break; - case PROP_MODE: - g_value_set_uint (value, nm_device_wifi_get_mode (self)); - break; - case PROP_BITRATE: - g_value_set_uint (value, nm_device_wifi_get_bitrate (self)); - break; - case PROP_ACTIVE_ACCESS_POINT: - g_value_set_object (value, nm_device_wifi_get_active_access_point (self)); - break; - case PROP_WIRELESS_CAPABILITIES: - g_value_set_uint (value, nm_device_wifi_get_capabilities (self)); - break; - case PROP_ACCESS_POINTS: - g_value_set_boxed (value, nm_device_wifi_get_access_points (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -state_changed_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data) -{ - NMDeviceWifi *self = NM_DEVICE_WIFI (device); - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self); - - switch (nm_device_get_state (device)) { - case NM_DEVICE_STATE_UNKNOWN: - case NM_DEVICE_STATE_UNMANAGED: - case NM_DEVICE_STATE_UNAVAILABLE: - case NM_DEVICE_STATE_DISCONNECTED: - case NM_DEVICE_STATE_FAILED: - /* Just clear active AP; don't clear the AP list unless wireless is disabled completely */ - if (priv->active_ap) { - g_object_unref (priv->active_ap); - priv->active_ap = NULL; - } - _nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT); - priv->rate = 0; - _nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_WIFI_BITRATE); - break; - default: - break; - } -} - -static void -register_properties (NMDeviceWifi *device) -{ - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_WIFI_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS, &priv->perm_hw_address }, - { NM_DEVICE_WIFI_MODE, &priv->mode }, - { NM_DEVICE_WIFI_BITRATE, &priv->rate }, - { NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT, &priv->active_ap, NULL, NM_TYPE_ACCESS_POINT }, - { NM_DEVICE_WIFI_CAPABILITIES, &priv->wireless_caps }, - { NM_DEVICE_WIFI_ACCESS_POINTS, &priv->aps, NULL, NM_TYPE_ACCESS_POINT, "access-point" }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -static void -access_point_removed (NMDeviceWifi *self, NMAccessPoint *ap) -{ - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self); - - if (ap == priv->active_ap) { - g_object_unref (priv->active_ap); - priv->active_ap = NULL; - _nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT); - - priv->rate = 0; - _nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIFI_BITRATE); - } -} - -static void -constructed (GObject *object) -{ - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_wifi_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_WIRELESS); - register_properties (NM_DEVICE_WIFI (object)); - - g_signal_connect (NM_DEVICE (object), - "notify::" NM_DEVICE_STATE, - G_CALLBACK (state_changed_cb), - NULL); -} - -static void -dispose (GObject *object) -{ - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (object); - GError *error = NULL; - - if (priv->scan_call) { - g_set_error_literal (&error, NM_DEVICE_WIFI_ERROR, NM_DEVICE_WIFI_ERROR_UNKNOWN, - "Wi-Fi device was destroyed"); - if (priv->scan_info) { - if (priv->scan_info->callback) - priv->scan_info->callback (NULL, error, priv->scan_info->user_data); - g_slice_free (RequestScanInfo, priv->scan_info); - priv->scan_info = NULL; - } - g_clear_error (&error); - - dbus_g_proxy_cancel_call (priv->proxy, priv->scan_call); - priv->scan_call = NULL; - } - - clean_up_aps (NM_DEVICE_WIFI (object), FALSE); - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_device_wifi_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (object); - - g_free (priv->hw_address); - g_free (priv->perm_hw_address); - - G_OBJECT_CLASS (nm_device_wifi_parent_class)->finalize (object); -} - -static void -nm_device_wifi_class_init (NMDeviceWifiClass *wifi_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (wifi_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (wifi_class); - - g_type_class_add_private (wifi_class, sizeof (NMDeviceWifiPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->dispose = dispose; - object_class->finalize = finalize; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - device_class->get_hw_address = get_hw_address; - wifi_class->access_point_removed = access_point_removed; - - /* properties */ - - /** - * NMDeviceWifi:hw-address: - * - * The hardware (MAC) address of the device. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_WIFI_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWifi:perm-hw-address: - * - * The hardware (MAC) address of the device. - **/ - g_object_class_install_property - (object_class, PROP_PERM_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWifi:mode: - * - * The mode of the device. - **/ - g_object_class_install_property - (object_class, PROP_MODE, - g_param_spec_uint (NM_DEVICE_WIFI_MODE, "", "", - NM_802_11_MODE_UNKNOWN, NM_802_11_MODE_AP, NM_802_11_MODE_INFRA, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWifi:bitrate: - * - * The bit rate of the device in kbit/s. - **/ - g_object_class_install_property - (object_class, PROP_BITRATE, - g_param_spec_uint (NM_DEVICE_WIFI_BITRATE, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWifi:active-access-point: - * - * The active #NMAccessPoint of the device. - **/ - g_object_class_install_property - (object_class, PROP_ACTIVE_ACCESS_POINT, - g_param_spec_object (NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT, "", "", - NM_TYPE_ACCESS_POINT, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWifi:wireless-capabilities: - * - * The wireless capabilities of the device. - **/ - g_object_class_install_property - (object_class, PROP_WIRELESS_CAPABILITIES, - g_param_spec_uint (NM_DEVICE_WIFI_CAPABILITIES, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWifi:access-points: - * - * List of all Wi-Fi access points the device can see. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_ACCESS_POINTS, - g_param_spec_boxed (NM_DEVICE_WIFI_ACCESS_POINTS, "", "", - NM_TYPE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /* signals */ - - /** - * NMDeviceWifi::access-point-added: - * @device: the Wi-Fi device that received the signal - * @ap: the new access point - * - * Notifies that a #NMAccessPoint is added to the Wi-Fi device. - **/ - signals[ACCESS_POINT_ADDED] = - g_signal_new ("access-point-added", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMDeviceWifiClass, access_point_added), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, - G_TYPE_OBJECT); - - /** - * NMDeviceWifi::access-point-removed: - * @device: the Wi-Fi device that received the signal - * @ap: the removed access point - * - * Notifies that a #NMAccessPoint is removed from the Wi-Fi device. - **/ - signals[ACCESS_POINT_REMOVED] = - g_signal_new ("access-point-removed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMDeviceWifiClass, access_point_removed), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, - G_TYPE_OBJECT); -} diff --git a/libnm-glib/nm-device-wifi.h b/libnm-glib/nm-device-wifi.h deleted file mode 100644 index 2bb432a7..00000000 --- a/libnm-glib/nm-device-wifi.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#ifndef NM_DEVICE_WIFI_H -#define NM_DEVICE_WIFI_H - -#include "nm-device.h" -#include "nm-access-point.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_WIFI (nm_device_wifi_get_type ()) -#define NM_DEVICE_WIFI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_WIFI, NMDeviceWifi)) -#define NM_DEVICE_WIFI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_WIFI, NMDeviceWifiClass)) -#define NM_IS_DEVICE_WIFI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_WIFI)) -#define NM_IS_DEVICE_WIFI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_WIFI)) -#define NM_DEVICE_WIFI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_WIFI, NMDeviceWifiClass)) - -/** - * NMDeviceWifiError: - * @NM_DEVICE_WIFI_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_WIFI_ERROR_NOT_WIFI_CONNECTION: the connection was not of Wi-Fi type - * @NM_DEVICE_WIFI_ERROR_INVALID_WIFI_CONNECTION: the Wi-Fi connection was invalid - * @NM_DEVICE_WIFI_ERROR_INVALID_DEVICE_MAC: the device's MAC was invalid - * @NM_DEVICE_WIFI_ERROR_MAC_MISMATCH: the MACs of the connection and the device mismatched - * @NM_DEVICE_WIFI_ERROR_MISSING_DEVICE_WPA_CAPS: the device missed WPA capabilities - * required by the connection - * @NM_DEVICE_WIFI_ERROR_MISSING_DEVICE_RSN_CAPS: the device missed RSN capabilities - * required by the connection - */ -typedef enum { - NM_DEVICE_WIFI_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_WIFI_ERROR_NOT_WIFI_CONNECTION, /*< nick=NotWifiConnection >*/ - NM_DEVICE_WIFI_ERROR_INVALID_WIFI_CONNECTION, /*< nick=InvalidWifiConnection >*/ - NM_DEVICE_WIFI_ERROR_INVALID_DEVICE_MAC, /*< nick=InvalidDeviceMac >*/ - NM_DEVICE_WIFI_ERROR_MAC_MISMATCH, /*< nick=MacMismatch >*/ - NM_DEVICE_WIFI_ERROR_MISSING_DEVICE_WPA_CAPS, /*< nick=MissingDeviceWpaCaps >*/ - NM_DEVICE_WIFI_ERROR_MISSING_DEVICE_RSN_CAPS, /*< nick=MissingDeviceRsnCaps >*/ -} NMDeviceWifiError; - -#define NM_DEVICE_WIFI_ERROR nm_device_wifi_error_quark () -GQuark nm_device_wifi_error_quark (void); - -#define NM_DEVICE_WIFI_HW_ADDRESS "hw-address" -#define NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS "perm-hw-address" -#define NM_DEVICE_WIFI_MODE "mode" -#define NM_DEVICE_WIFI_BITRATE "bitrate" -#define NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT "active-access-point" -#define NM_DEVICE_WIFI_CAPABILITIES "wireless-capabilities" -#define NM_DEVICE_WIFI_ACCESS_POINTS "access-points" - -typedef struct { - NMDevice parent; -} NMDeviceWifi; - -typedef struct { - NMDeviceClass parent; - - /* Signals */ - void (*access_point_added) (NMDeviceWifi *device, NMAccessPoint *ap); - void (*access_point_removed) (NMDeviceWifi *device, NMAccessPoint *ap); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDeviceWifiClass; - -GType nm_device_wifi_get_type (void); - -GObject *nm_device_wifi_new (DBusGConnection *connection, const char *path); - -const char * nm_device_wifi_get_hw_address (NMDeviceWifi *device); -const char * nm_device_wifi_get_permanent_hw_address (NMDeviceWifi *device); -NM80211Mode nm_device_wifi_get_mode (NMDeviceWifi *device); -guint32 nm_device_wifi_get_bitrate (NMDeviceWifi *device); -NMDeviceWifiCapabilities nm_device_wifi_get_capabilities (NMDeviceWifi *device); -NMAccessPoint * nm_device_wifi_get_active_access_point (NMDeviceWifi *device); - -NMAccessPoint * nm_device_wifi_get_access_point_by_path (NMDeviceWifi *device, - const char *path); - -const GPtrArray * nm_device_wifi_get_access_points (NMDeviceWifi *device); - -typedef void (*NMDeviceWifiRequestScanFn) (NMDeviceWifi *device, - GError *error, - gpointer user_data); -void nm_device_wifi_request_scan_simple (NMDeviceWifi *device, - NMDeviceWifiRequestScanFn callback, - gpointer user_data); - -G_END_DECLS - -#endif /* NM_DEVICE_WIFI_H */ diff --git a/libnm-glib/nm-device-wimax.c b/libnm-glib/nm-device-wimax.c deleted file mode 100644 index 3465475a..00000000 --- a/libnm-glib/nm-device-wimax.c +++ /dev/null @@ -1,795 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2012 Red Hat, Inc. - * Copyright 2009 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <netinet/ether.h> - -#include "nm-setting-connection.h" -#include "nm-setting-wimax.h" - -#include "nm-device-wimax.h" -#include "nm-object-private.h" -#include "nm-object-cache.h" -#include "nm-dbus-glib-types.h" -#include "nm-types-private.h" -#include "nm-device-private.h" - -G_DEFINE_TYPE (NMDeviceWimax, nm_device_wimax, NM_TYPE_DEVICE) - -#define NM_DEVICE_WIMAX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_WIMAX, NMDeviceWimaxPrivate)) - -void _nm_device_wimax_set_wireless_enabled (NMDeviceWimax *wimax, gboolean enabled); - -typedef struct { - DBusGProxy *proxy; - - char *hw_address; - NMWimaxNsp *active_nsp; - GPtrArray *nsps; - - guint center_freq; - int rssi; - int cinr; - int tx_power; - char *bsid; -} NMDeviceWimaxPrivate; - -enum { - PROP_0, - PROP_HW_ADDRESS, - PROP_ACTIVE_NSP, - PROP_CENTER_FREQ, - PROP_RSSI, - PROP_CINR, - PROP_TX_POWER, - PROP_BSID, - PROP_NSPS, - - LAST_PROP -}; - -enum { - NSP_ADDED, - NSP_REMOVED, - - LAST_SIGNAL -}; -static guint signals[LAST_SIGNAL] = { 0 }; - -/** - * nm_device_wimax_error_quark: - * - * Registers an error quark for #NMDeviceWimax if necessary. - * - * Returns: the error quark used for #NMDeviceWimax errors. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -GQuark -nm_device_wimax_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-wimax-error-quark"); - return quark; -} - -/** - * nm_device_wimax_new: - * @connection: the #DBusGConnection - * @path: the D-Bus object path of the WiMAX device - * - * Creates a new #NMDeviceWimax. - * - * Returns: (transfer full): a new WiMAX device - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -GObject * -nm_device_wimax_new (DBusGConnection *connection, const char *path) -{ - GObject *device; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - device = g_object_new (NM_TYPE_DEVICE_WIMAX, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return device; -} - -/** - * nm_device_wimax_get_hw_address: - * @wimax: a #NMDeviceWimax - * - * Gets the hardware (MAC) address of the #NMDeviceWimax - * - * Returns: the hardware address. This is the internal string used by the - * device, and must not be modified. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -const char * -nm_device_wimax_get_hw_address (NMDeviceWimax *wimax) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIMAX (wimax), NULL); - - _nm_object_ensure_inited (NM_OBJECT (wimax)); - return NM_DEVICE_WIMAX_GET_PRIVATE (wimax)->hw_address; -} - -/** - * nm_device_wimax_get_active_nsp: - * @wimax: a #NMDeviceWimax - * - * Gets the active #NMWimaxNsp. - * - * Returns: (transfer full): the access point or %NULL if none is active - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -NMWimaxNsp * -nm_device_wimax_get_active_nsp (NMDeviceWimax *wimax) -{ - NMDeviceState state; - - g_return_val_if_fail (NM_IS_DEVICE_WIMAX (wimax), NULL); - - state = nm_device_get_state (NM_DEVICE (wimax)); - switch (state) { - case NM_DEVICE_STATE_PREPARE: - case NM_DEVICE_STATE_CONFIG: - case NM_DEVICE_STATE_NEED_AUTH: - case NM_DEVICE_STATE_IP_CONFIG: - case NM_DEVICE_STATE_IP_CHECK: - case NM_DEVICE_STATE_SECONDARIES: - case NM_DEVICE_STATE_ACTIVATED: - case NM_DEVICE_STATE_DEACTIVATING: - break; - default: - return NULL; - break; - } - - _nm_object_ensure_inited (NM_OBJECT (wimax)); - return NM_DEVICE_WIMAX_GET_PRIVATE (wimax)->active_nsp; -} - -/** - * nm_device_wimax_get_nsps: - * @wimax: a #NMDeviceWimax - * - * Gets all the scanned NSPs of the #NMDeviceWimax. - * - * Returns: (element-type NMWimaxNsp): a #GPtrArray containing - * all the scanned #NMWimaxNsps. - * The returned array is owned by the client and should not be modified. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -const GPtrArray * -nm_device_wimax_get_nsps (NMDeviceWimax *wimax) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIMAX (wimax), NULL); - - _nm_object_ensure_inited (NM_OBJECT (wimax)); - return handle_ptr_array_return (NM_DEVICE_WIMAX_GET_PRIVATE (wimax)->nsps); -} - -/** - * nm_device_wimax_get_nsp_by_path: - * @wimax: a #NMDeviceWimax - * @path: the object path of the NSP - * - * Gets a #NMWimaxNsp by path. - * - * Returns: (transfer none): the access point or %NULL if none is found. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -NMWimaxNsp * -nm_device_wimax_get_nsp_by_path (NMDeviceWimax *wimax, - const char *path) -{ - const GPtrArray *nsps; - int i; - NMWimaxNsp *nsp = NULL; - - g_return_val_if_fail (NM_IS_DEVICE_WIMAX (wimax), NULL); - g_return_val_if_fail (path != NULL, NULL); - - nsps = nm_device_wimax_get_nsps (wimax); - if (!nsps) - return NULL; - - for (i = 0; i < nsps->len; i++) { - NMWimaxNsp *candidate = g_ptr_array_index (nsps, i); - if (!strcmp (nm_object_get_path (NM_OBJECT (candidate)), path)) { - nsp = candidate; - break; - } - } - - return nsp; -} - -static void -clean_up_nsps (NMDeviceWimax *self, gboolean notify) -{ - NMDeviceWimaxPrivate *priv; - - g_return_if_fail (NM_IS_DEVICE_WIMAX (self)); - - priv = NM_DEVICE_WIMAX_GET_PRIVATE (self); - - if (priv->active_nsp) { - g_object_unref (priv->active_nsp); - priv->active_nsp = NULL; - } - - if (priv->nsps) { - while (priv->nsps->len) { - NMWimaxNsp *nsp = NM_WIMAX_NSP (g_ptr_array_index (priv->nsps, 0)); - - if (notify) - g_signal_emit (self, signals[NSP_REMOVED], 0, nsp); - g_ptr_array_remove (priv->nsps, nsp); - g_object_unref (nsp); - } - g_ptr_array_free (priv->nsps, TRUE); - priv->nsps = NULL; - } -} - -/** - * nm_device_wimax_get_center_frequency: - * @self: a #NMDeviceWimax - * - * Gets the center frequency (in KHz) of the radio channel the device is using - * to communicate with the network when connected. Has no meaning when the - * device is not connected. - * - * Returns: the center frequency in KHz, or 0 - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -guint -nm_device_wimax_get_center_frequency (NMDeviceWimax *self) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIMAX (self), 0); - - _nm_object_ensure_inited (NM_OBJECT (self)); - return NM_DEVICE_WIMAX_GET_PRIVATE (self)->center_freq; -} - -/** - * nm_device_wimax_get_rssi: - * @self: a #NMDeviceWimax - * - * Gets the RSSI of the current radio link in dBm. This value indicates how - * strong the raw received RF signal from the base station is, but does not - * indicate the overall quality of the radio link. Has no meaning when the - * device is not connected. - * - * Returns: the RSSI in dBm, or 0 - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -int -nm_device_wimax_get_rssi (NMDeviceWimax *self) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIMAX (self), 0); - - _nm_object_ensure_inited (NM_OBJECT (self)); - return NM_DEVICE_WIMAX_GET_PRIVATE (self)->rssi; -} - -/** - * nm_device_wimax_get_cinr: - * @self: a #NMDeviceWimax - * - * Gets the CINR (Carrier to Interference + Noise Ratio) of the current radio - * link in dB. CINR is a more accurate measure of radio link quality. Has no - * meaning when the device is not connected. - * - * Returns: the CINR in dB, or 0 - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -int -nm_device_wimax_get_cinr (NMDeviceWimax *self) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIMAX (self), 0); - - _nm_object_ensure_inited (NM_OBJECT (self)); - return NM_DEVICE_WIMAX_GET_PRIVATE (self)->cinr; -} - -/** - * nm_device_wimax_get_tx_power: - * @self: a #NMDeviceWimax - * - * Average power of the last burst transmitted by the device, in units of - * 0.5 dBm. i.e. a TxPower of -11 represents an actual device TX power of - * -5.5 dBm. Has no meaning when the device is not connected. - * - * Returns: the TX power in dBm, or 0 - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -int -nm_device_wimax_get_tx_power (NMDeviceWimax *self) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIMAX (self), 0); - - _nm_object_ensure_inited (NM_OBJECT (self)); - return NM_DEVICE_WIMAX_GET_PRIVATE (self)->tx_power; -} - -/** - * nm_device_wimax_get_bsid: - * @self: a #NMDeviceWimax - * - * Gets the ID of the serving Base Station when the device is connected. - * - * Returns: the ID of the serving Base Station, or %NULL - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ -const char * -nm_device_wimax_get_bsid (NMDeviceWimax *self) -{ - g_return_val_if_fail (NM_IS_DEVICE_WIMAX (self), NULL); - - _nm_object_ensure_inited (NM_OBJECT (self)); - return NM_DEVICE_WIMAX_GET_PRIVATE (self)->bsid; -} - -static gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - NMSettingWimax *s_wimax; - const char *ctype; - const GByteArray *mac; - const char *hw_str; - struct ether_addr *hw_mac; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_WIMAX_SETTING_NAME) != 0) { - g_set_error (error, NM_DEVICE_WIMAX_ERROR, NM_DEVICE_WIMAX_ERROR_NOT_WIMAX_CONNECTION, - "The connection was not a Wimax connection."); - return FALSE; - } - - s_wimax = nm_connection_get_setting_wimax (connection); - if (!s_wimax) { - g_set_error (error, NM_DEVICE_WIMAX_ERROR, NM_DEVICE_WIMAX_ERROR_INVALID_WIMAX_CONNECTION, - "The connection was not a valid Wimax connection."); - return FALSE; - } - - /* Check MAC address */ - hw_str = nm_device_wimax_get_hw_address (NM_DEVICE_WIMAX (device)); - if (hw_str) { - hw_mac = ether_aton (hw_str); - if (!hw_mac) { - g_set_error (error, NM_DEVICE_WIMAX_ERROR, NM_DEVICE_WIMAX_ERROR_INVALID_DEVICE_MAC, - "Invalid device MAC address."); - return FALSE; - } - mac = nm_setting_wimax_get_mac_address (s_wimax); - if (mac && hw_mac && memcmp (mac->data, hw_mac->ether_addr_octet, ETH_ALEN)) { - g_set_error (error, NM_DEVICE_WIMAX_ERROR, NM_DEVICE_WIMAX_ERROR_MAC_MISMATCH, - "The MACs of the device and the connection didn't match."); - return FALSE; - } - } - - return NM_DEVICE_CLASS (nm_device_wimax_parent_class)->connection_compatible (device, connection, error); -} - -static GType -get_setting_type (NMDevice *device) -{ - return NM_TYPE_SETTING_WIMAX; -} - -static const char * -get_hw_address (NMDevice *device) -{ - return nm_device_wimax_get_hw_address (NM_DEVICE_WIMAX (device)); -} - -/*****************************************************************************/ - -static void -nm_device_wimax_init (NMDeviceWimax *device) -{ - _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_WIMAX); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDeviceWimax *self = NM_DEVICE_WIMAX (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_HW_ADDRESS: - g_value_set_string (value, nm_device_wimax_get_hw_address (self)); - break; - case PROP_ACTIVE_NSP: - g_value_set_object (value, nm_device_wimax_get_active_nsp (self)); - break; - case PROP_CENTER_FREQ: - g_value_set_uint (value, nm_device_wimax_get_center_frequency (self)); - break; - case PROP_RSSI: - g_value_set_int (value, nm_device_wimax_get_rssi (self)); - break; - case PROP_CINR: - g_value_set_int (value, nm_device_wimax_get_cinr (self)); - break; - case PROP_TX_POWER: - g_value_set_int (value, nm_device_wimax_get_tx_power (self)); - break; - case PROP_BSID: - g_value_set_string (value, nm_device_wimax_get_bsid (self)); - break; - case PROP_NSPS: - g_value_set_boxed (value, nm_device_wimax_get_nsps (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -clear_link_status (NMDeviceWimax *self) -{ - NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (self); - - if (priv->center_freq) { - priv->center_freq = 0; - _nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIMAX_CENTER_FREQUENCY); - } - - if (priv->rssi) { - priv->rssi = 0; - _nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIMAX_RSSI); - } - - if (priv->cinr) { - priv->cinr = 0; - _nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIMAX_CINR); - } - - if (priv->tx_power) { - priv->tx_power = 0; - _nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIMAX_TX_POWER); - } - - if (priv->bsid) { - g_free (priv->bsid); - priv->bsid = NULL; - _nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIMAX_BSID); - } -} - -static void -state_changed_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data) -{ - NMDeviceWimax *self = NM_DEVICE_WIMAX (device); - NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (self); - NMDeviceState state; - - state = nm_device_get_state (device); - switch (state) { - case NM_DEVICE_STATE_UNKNOWN: - case NM_DEVICE_STATE_UNMANAGED: - case NM_DEVICE_STATE_UNAVAILABLE: - case NM_DEVICE_STATE_DISCONNECTED: - case NM_DEVICE_STATE_FAILED: - if (priv->active_nsp) { - g_object_unref (priv->active_nsp); - priv->active_nsp = NULL; - } - _nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_WIMAX_ACTIVE_NSP); - clear_link_status (self); - break; - case NM_DEVICE_STATE_PREPARE: - case NM_DEVICE_STATE_CONFIG: - case NM_DEVICE_STATE_NEED_AUTH: - case NM_DEVICE_STATE_IP_CONFIG: - clear_link_status (self); - break; - default: - break; - } -} - -static void -register_properties (NMDeviceWimax *wimax) -{ - NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (wimax); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_WIMAX_HW_ADDRESS, &priv->hw_address }, - { NM_DEVICE_WIMAX_ACTIVE_NSP, &priv->active_nsp, NULL, NM_TYPE_WIMAX_NSP }, - { NM_DEVICE_WIMAX_CENTER_FREQUENCY, &priv->center_freq }, - { NM_DEVICE_WIMAX_RSSI, &priv->rssi }, - { NM_DEVICE_WIMAX_CINR, &priv->cinr }, - { NM_DEVICE_WIMAX_TX_POWER, &priv->tx_power }, - { NM_DEVICE_WIMAX_BSID, &priv->bsid }, - { NM_DEVICE_WIMAX_NSPS, &priv->nsps, NULL, NM_TYPE_WIMAX_NSP, "nsp" }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (wimax), - priv->proxy, - property_info); -} - -static void -nsp_removed (NMDeviceWimax *self, NMWimaxNsp *nsp) -{ - NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (self); - - if (nsp == priv->active_nsp) { - g_object_unref (priv->active_nsp); - priv->active_nsp = NULL; - _nm_object_queue_notify (NM_OBJECT (self), NM_DEVICE_WIMAX_ACTIVE_NSP); - } -} - -static void -constructed (GObject *object) -{ - NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_device_wimax_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE_WIMAX); - register_properties (NM_DEVICE_WIMAX (object)); - - g_signal_connect (object, - "notify::" NM_DEVICE_STATE, - G_CALLBACK (state_changed_cb), - NULL); -} - -static void -dispose (GObject *object) -{ - NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (object); - - if (priv->hw_address) { - g_free (priv->hw_address); - priv->hw_address = NULL; - } - - if (priv->bsid) { - g_free (priv->bsid); - priv->bsid = NULL; - } - - clean_up_nsps (NM_DEVICE_WIMAX (object), FALSE); - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_device_wimax_parent_class)->dispose (object); -} - -static void -nm_device_wimax_class_init (NMDeviceWimaxClass *wimax_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (wimax_class); - NMDeviceClass *device_class = NM_DEVICE_CLASS (wimax_class); - - g_type_class_add_private (wimax_class, sizeof (NMDeviceWimaxPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->dispose = dispose; - device_class->connection_compatible = connection_compatible; - device_class->get_setting_type = get_setting_type; - device_class->get_hw_address = get_hw_address; - wimax_class->nsp_removed = nsp_removed; - - /* properties */ - - /** - * NMDeviceWimax:hw-address: - * - * The hardware (MAC) address of the device. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - g_object_class_install_property - (object_class, PROP_HW_ADDRESS, - g_param_spec_string (NM_DEVICE_WIMAX_HW_ADDRESS, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWimax:active-nsp: - * - * The active #NMWimaxNsp of the device. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - g_object_class_install_property - (object_class, PROP_ACTIVE_NSP, - g_param_spec_object (NM_DEVICE_WIMAX_ACTIVE_NSP, "", "", - NM_TYPE_WIMAX_NSP, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWimax:center-frequency: - * - * The center frequency (in KHz) of the radio channel the device is using to - * communicate with the network when connected. Has no meaning when the - * device is not connected. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - g_object_class_install_property - (object_class, PROP_CENTER_FREQ, - g_param_spec_uint (NM_DEVICE_WIMAX_CENTER_FREQUENCY, "", "", - 0, G_MAXUINT, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWimax:rssi: - * - * RSSI of the current radio link in dBm. This value indicates how strong - * the raw received RF signal from the base station is, but does not - * indicate the overall quality of the radio link. Has no meaning when the - * device is not connected. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - g_object_class_install_property - (object_class, PROP_RSSI, - g_param_spec_int (NM_DEVICE_WIMAX_RSSI, "", "", - G_MININT, G_MAXINT, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWimax:cinr: - * - * CINR (Carrier to Interference + Noise Ratio) of the current radio link - * in dB. CINR is a more accurate measure of radio link quality. Has no - * meaning when the device is not connected. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - g_object_class_install_property - (object_class, PROP_CINR, - g_param_spec_int (NM_DEVICE_WIMAX_CINR, "", "", - G_MININT, G_MAXINT, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWimax:tx-power: - * - * Average power of the last burst transmitted by the device, in units of - * 0.5 dBm. i.e. a TxPower of -11 represents an actual device TX power of - * -5.5 dBm. Has no meaning when the device is not connected. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - g_object_class_install_property - (object_class, PROP_TX_POWER, - g_param_spec_int (NM_DEVICE_WIMAX_TX_POWER, "", "", - G_MININT, G_MAXINT, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWimax:bsid: - * - * The ID of the serving base station as received from the network. Has - * no meaning when the device is not connected. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - g_object_class_install_property - (object_class, PROP_BSID, - g_param_spec_string (NM_DEVICE_WIMAX_BSID, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDeviceWimax:nsps: - * - * List of all WiMAX Network Service Providers the device can see. - * - * Since: 0.9.10 - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - g_object_class_install_property - (object_class, PROP_NSPS, - g_param_spec_boxed (NM_DEVICE_WIMAX_NSPS, "", "", - NM_TYPE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /* signals */ - - /** - * NMDeviceWimax::nsp-added: - * @self: the wimax device that received the signal - * @nsp: the new NSP - * - * Notifies that a #NMWimaxNsp is added to the wimax device. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - signals[NSP_ADDED] = - g_signal_new ("nsp-added", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMDeviceWimaxClass, nsp_added), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, - G_TYPE_OBJECT); - - /** - * NMDeviceWimax::nsp-removed: - * @self: the wimax device that received the signal - * @nsp: the removed NSP - * - * Notifies that a #NMWimaxNsp is removed from the wimax device. - * - * Deprecated: 1.2: WiMAX is no longer supported. - **/ - signals[NSP_REMOVED] = - g_signal_new ("nsp-removed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMDeviceWimaxClass, nsp_removed), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, - G_TYPE_OBJECT); -} diff --git a/libnm-glib/nm-device-wimax.h b/libnm-glib/nm-device-wimax.h deleted file mode 100644 index 21d28117..00000000 --- a/libnm-glib/nm-device-wimax.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 - 2012 Red Hat, Inc. - * Copyright 2009 Novell, Inc. - */ - -#ifndef NM_DEVICE_WIMAX_H -#define NM_DEVICE_WIMAX_H - -#include "nm-device.h" -#include "nm-wimax-nsp.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE_WIMAX (nm_device_wimax_get_type ()) -#define NM_DEVICE_WIMAX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_WIMAX, NMDeviceWimax)) -#define NM_DEVICE_WIMAX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_WIMAX, NMDeviceWimaxClass)) -#define NM_IS_DEVICE_WIMAX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_WIMAX)) -#define NM_IS_DEVICE_WIMAX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_WIMAX)) -#define NM_DEVICE_WIMAX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_WIMAX, NMDeviceWimaxClass)) - -/** - * NMDeviceWimaxError: - * @NM_DEVICE_WIMAX_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_WIMAX_ERROR_NOT_WIMAX_CONNECTION: the connection was not of WiMax type - * @NM_DEVICE_WIMAX_ERROR_INVALID_WIMAX_CONNECTION: the WiMax connection was invalid - * @NM_DEVICE_WIMAX_ERROR_INVALID_DEVICE_MAC: the device's MAC was invalid - * @NM_DEVICE_WIMAX_ERROR_MAC_MISMATCH: the MACs of the connection and the device mismatched - */ -typedef enum { - NM_DEVICE_WIMAX_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_WIMAX_ERROR_NOT_WIMAX_CONNECTION, /*< nick=NotWimaxConnection >*/ - NM_DEVICE_WIMAX_ERROR_INVALID_WIMAX_CONNECTION, /*< nick=InvalidWimaxConnection >*/ - NM_DEVICE_WIMAX_ERROR_INVALID_DEVICE_MAC, /*< nick=InvalidDeviceMac >*/ - NM_DEVICE_WIMAX_ERROR_MAC_MISMATCH, /*< nick=MacMismatch >*/ -} NMDeviceWimaxError; - -#define NM_DEVICE_WIMAX_ERROR nm_device_wimax_error_quark () -NM_DEPRECATED_IN_1_2 -GQuark nm_device_wimax_error_quark (void); - -#define NM_DEVICE_WIMAX_HW_ADDRESS "hw-address" -#define NM_DEVICE_WIMAX_ACTIVE_NSP "active-nsp" -#define NM_DEVICE_WIMAX_CENTER_FREQUENCY "center-frequency" -#define NM_DEVICE_WIMAX_RSSI "rssi" -#define NM_DEVICE_WIMAX_CINR "cinr" -#define NM_DEVICE_WIMAX_TX_POWER "tx-power" -#define NM_DEVICE_WIMAX_BSID "bsid" -#define NM_DEVICE_WIMAX_NSPS "nsps" - -typedef struct { - NMDevice parent; -} NMDeviceWimax; - -typedef struct { - NMDeviceClass parent; - - /* Signals */ - void (*nsp_added) (NMDeviceWimax *self, NMWimaxNsp *nsp); - void (*nsp_removed) (NMDeviceWimax *self, NMWimaxNsp *nsp); -} NMDeviceWimaxClass; - -NM_DEPRECATED_IN_1_2 -GType nm_device_wimax_get_type (void); - -NM_DEPRECATED_IN_1_2 -GObject *nm_device_wimax_new (DBusGConnection *connection, - const char *path); - -NM_DEPRECATED_IN_1_2 -const char *nm_device_wimax_get_hw_address (NMDeviceWimax *wimax); -NM_DEPRECATED_IN_1_2 -NMWimaxNsp *nm_device_wimax_get_active_nsp (NMDeviceWimax *wimax); -NM_DEPRECATED_IN_1_2 -NMWimaxNsp *nm_device_wimax_get_nsp_by_path (NMDeviceWimax *wimax, - const char *path); - -NM_DEPRECATED_IN_1_2 -const GPtrArray *nm_device_wimax_get_nsps (NMDeviceWimax *wimax); - -NM_DEPRECATED_IN_1_2 -guint nm_device_wimax_get_center_frequency (NMDeviceWimax *self); -NM_DEPRECATED_IN_1_2 -int nm_device_wimax_get_rssi (NMDeviceWimax *self); -NM_DEPRECATED_IN_1_2 -int nm_device_wimax_get_cinr (NMDeviceWimax *self); -NM_DEPRECATED_IN_1_2 -int nm_device_wimax_get_tx_power (NMDeviceWimax *self); -NM_DEPRECATED_IN_1_2 -const char * nm_device_wimax_get_bsid (NMDeviceWimax *self); - -G_END_DECLS - -#endif /* NM_DEVICE_WIMAX_H */ diff --git a/libnm-glib/nm-device.c b/libnm-glib/nm-device.c deleted file mode 100644 index e9b3b30f..00000000 --- a/libnm-glib/nm-device.c +++ /dev/null @@ -1,2375 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <libudev.h> - -#include "NetworkManager.h" - -#include "nm-udev-aux/nm-udev-utils.h" -#include "nm-device-ethernet.h" -#include "nm-device-adsl.h" -#include "nm-device-wifi.h" -#include "nm-device-modem.h" -#include "nm-device-bt.h" -#include "nm-device-olpc-mesh.h" -#include "nm-device-wimax.h" -#include "nm-device-infiniband.h" -#include "nm-device-bond.h" -#include "nm-device-team.h" -#include "nm-device-bridge.h" -#include "nm-device-vlan.h" -#include "nm-device-generic.h" -#include "nm-device.h" -#include "nm-device-private.h" -#include "nm-object-private.h" -#include "nm-object-cache.h" -#include "nm-remote-connection.h" -#include "nm-types.h" -#include "nm-dbus-glib-types.h" -#include "nm-utils.h" -#include "nm-dbus-helpers-private.h" - -static GType _nm_device_gtype_for_path (DBusGConnection *connection, - const char *path); -static void _nm_device_gtype_for_path_async (DBusGConnection *connection, - const char *path, - NMObjectTypeCallbackFunc callback, - gpointer user_data); -gboolean connection_compatible (NMDevice *device, NMConnection *connection, GError **error); - -G_DEFINE_TYPE_WITH_CODE (NMDevice, nm_device, NM_TYPE_OBJECT, - _nm_object_register_type_func (g_define_type_id, _nm_device_gtype_for_path, - _nm_device_gtype_for_path_async); - ) - -#define DBUS_G_TYPE_UINT_STRUCT (dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID)) - -#define NM_DEVICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE, NMDevicePrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *iface; - char *ip_iface; - NMDeviceType device_type; - char *udi; - char *driver; - char *driver_version; - char *firmware_version; - char *type_description; - NMDeviceCapabilities capabilities; - gboolean real; - gboolean managed; - gboolean firmware_missing; - gboolean autoconnect; - NMIP4Config *ip4_config; - NMDHCP4Config *dhcp4_config; - NMIP6Config *ip6_config; - NMDHCP6Config *dhcp6_config; - NMDeviceState state; - NMDeviceState last_seen_state; - NMDeviceStateReason reason; - - NMActiveConnection *active_connection; - GPtrArray *available_connections; - - NMUdevClient *udev_client; - char *product, *short_product; - char *vendor, *short_vendor; - char *description, *bus_name; - - char *physical_port_id; - guint32 mtu; -} NMDevicePrivate; - -enum { - PROP_0, - PROP_INTERFACE, - PROP_UDI, - PROP_DRIVER, - PROP_DRIVER_VERSION, - PROP_FIRMWARE_VERSION, - PROP_CAPABILITIES, - PROP_REAL, - PROP_MANAGED, - PROP_AUTOCONNECT, - PROP_FIRMWARE_MISSING, - PROP_IP4_CONFIG, - PROP_DHCP4_CONFIG, - PROP_IP6_CONFIG, - PROP_STATE, - PROP_STATE_REASON, - PROP_PRODUCT, - PROP_VENDOR, - PROP_DHCP6_CONFIG, - PROP_IP_INTERFACE, - PROP_DEVICE_TYPE, - PROP_ACTIVE_CONNECTION, - PROP_AVAILABLE_CONNECTIONS, - PROP_PHYSICAL_PORT_ID, - PROP_MTU, - - LAST_PROP -}; - -enum { - STATE_CHANGED, - - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -/** - * nm_device_error_quark: - * - * Registers an error quark for #NMDevice if necessary. - * - * Returns: the error quark used for #NMDevice errors. - * - * Since: 0.9.10 - **/ -GQuark -nm_device_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-device-error-quark"); - return quark; -} - -static void -nm_device_init (NMDevice *device) -{ - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device); - - priv->state = NM_DEVICE_STATE_UNKNOWN; - priv->reason = NM_DEVICE_STATE_REASON_NONE; -} - -static gboolean -demarshal_state_reason (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (object); - - if (!G_VALUE_HOLDS (value, DBUS_G_TYPE_UINT_STRUCT)) - return FALSE; - - dbus_g_type_struct_get (value, - 0, &priv->state, - 1, &priv->reason, - G_MAXUINT); - - _nm_object_queue_notify (object, NM_DEVICE_STATE_REASON); - return TRUE; -} - -static void -register_properties (NMDevice *device) -{ - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device); - const NMPropertiesInfo property_info[] = { - { NM_DEVICE_UDI, &priv->udi }, - { NM_DEVICE_INTERFACE, &priv->iface }, - { NM_DEVICE_IP_INTERFACE, &priv->ip_iface }, - { NM_DEVICE_DRIVER, &priv->driver }, - { NM_DEVICE_DRIVER_VERSION, &priv->driver_version }, - { NM_DEVICE_FIRMWARE_VERSION, &priv->firmware_version }, - { NM_DEVICE_CAPABILITIES, &priv->capabilities }, - { NM_DEVICE_REAL, &priv->real }, - { NM_DEVICE_MANAGED, &priv->managed }, - { NM_DEVICE_AUTOCONNECT, &priv->autoconnect }, - { NM_DEVICE_FIRMWARE_MISSING, &priv->firmware_missing }, - { NM_DEVICE_IP4_CONFIG, &priv->ip4_config, NULL, NM_TYPE_IP4_CONFIG }, - { NM_DEVICE_DHCP4_CONFIG, &priv->dhcp4_config, NULL, NM_TYPE_DHCP4_CONFIG }, - { NM_DEVICE_IP6_CONFIG, &priv->ip6_config, NULL, NM_TYPE_IP6_CONFIG }, - { NM_DEVICE_DHCP6_CONFIG, &priv->dhcp6_config, NULL, NM_TYPE_DHCP6_CONFIG }, - { NM_DEVICE_STATE, &priv->state }, - { NM_DEVICE_STATE_REASON, &priv->state, demarshal_state_reason }, - { NM_DEVICE_ACTIVE_CONNECTION, &priv->active_connection, NULL, NM_TYPE_ACTIVE_CONNECTION }, - { NM_DEVICE_AVAILABLE_CONNECTIONS, &priv->available_connections, NULL, NM_TYPE_REMOTE_CONNECTION }, - { NM_DEVICE_PHYSICAL_PORT_ID, &priv->physical_port_id }, - { NM_DEVICE_MTU, &priv->mtu }, - - /* Properties that exist in D-Bus but that we don't track */ - { "ip4-address", NULL }, - { "device-type", NULL }, - - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (device), - priv->proxy, - property_info); -} - -typedef struct { - NMDeviceState old_state; - NMDeviceState new_state; - NMDeviceStateReason reason; -} StateChangeData; - -static void -device_state_change_reloaded (GObject *object, - GAsyncResult *result, - gpointer user_data) -{ - NMDevice *self = NM_DEVICE (object); - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); - StateChangeData *data = user_data; - NMDeviceState old_state = data->old_state; - NMDeviceState new_state = data->new_state; - NMDeviceStateReason reason = data->reason; - - g_slice_free (StateChangeData, data); - - _nm_object_reload_properties_finish (NM_OBJECT (object), result, NULL); - - /* If the device changes state several times in rapid succession, then we'll - * queue several reload_properties() calls, and there's no guarantee that - * they'll finish in the right order. In that case, only emit the signal - * for the last one. - */ - if (priv->last_seen_state != new_state) - return; - - /* Ensure that nm_device_get_state() will return the right value even if - * we haven't processed the corresponding PropertiesChanged yet. - */ - priv->state = new_state; - - g_signal_emit (self, signals[STATE_CHANGED], 0, - new_state, old_state, reason); -} - -static void -device_state_changed (DBusGProxy *proxy, - NMDeviceState new_state, - NMDeviceState old_state, - NMDeviceStateReason reason, - gpointer user_data) -{ - NMDevice *self = NM_DEVICE (user_data); - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); - - if (old_state != new_state) { - StateChangeData *data; - - /* Our object-valued properties (eg, ip4_config) will still - * have their old values at this point, because NMObject is - * in the process of asynchronously reading the new values. - * Wait for that to finish before emitting the signal. - */ - priv->last_seen_state = new_state; - - data = g_slice_new (StateChangeData); - data->old_state = old_state; - data->new_state = new_state; - data->reason = reason; - _nm_object_reload_properties_async (NM_OBJECT (user_data), - device_state_change_reloaded, - data); - } -} - -static GType -_nm_device_gtype_from_dtype (NMDeviceType dtype) -{ - switch (dtype) { - case NM_DEVICE_TYPE_VETH: - case NM_DEVICE_TYPE_ETHERNET: - return NM_TYPE_DEVICE_ETHERNET; - case NM_DEVICE_TYPE_WIFI: - return NM_TYPE_DEVICE_WIFI; - case NM_DEVICE_TYPE_MODEM: - return NM_TYPE_DEVICE_MODEM; - case NM_DEVICE_TYPE_BT: - return NM_TYPE_DEVICE_BT; - case NM_DEVICE_TYPE_ADSL: - return NM_TYPE_DEVICE_ADSL; - case NM_DEVICE_TYPE_OLPC_MESH: - return NM_TYPE_DEVICE_OLPC_MESH; - case NM_DEVICE_TYPE_WIMAX: - return NM_TYPE_DEVICE_WIMAX; - case NM_DEVICE_TYPE_INFINIBAND: - return NM_TYPE_DEVICE_INFINIBAND; - case NM_DEVICE_TYPE_BOND: - return NM_TYPE_DEVICE_BOND; - case NM_DEVICE_TYPE_TEAM: - return NM_TYPE_DEVICE_TEAM; - case NM_DEVICE_TYPE_BRIDGE: - return NM_TYPE_DEVICE_BRIDGE; - case NM_DEVICE_TYPE_VLAN: - return NM_TYPE_DEVICE_VLAN; - case NM_DEVICE_TYPE_GENERIC: - case NM_DEVICE_TYPE_TUN: - case NM_DEVICE_TYPE_IP_TUNNEL: - return NM_TYPE_DEVICE_GENERIC; - default: - /* Fall back to NMDeviceGeneric for unknown devices */ - return NM_TYPE_DEVICE_GENERIC; - } -} - -static void -constructed (GObject *object) -{ - NMDevicePrivate *priv; - - G_OBJECT_CLASS (nm_device_parent_class)->constructed (object); - - priv = NM_DEVICE_GET_PRIVATE (object); - /* Catch failure of subclasses to call _nm_device_set_device_type() */ - g_warn_if_fail (priv->device_type != NM_DEVICE_TYPE_UNKNOWN); - /* Catch a subclass setting the wrong type */ - g_warn_if_fail (G_OBJECT_TYPE (object) == _nm_device_gtype_from_dtype (priv->device_type)); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DEVICE); - - register_properties (NM_DEVICE (object)); - - dbus_g_object_register_marshaller (g_cclosure_marshal_generic, - G_TYPE_NONE, - G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, - G_TYPE_INVALID); - - dbus_g_proxy_add_signal (priv->proxy, - "StateChanged", - G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, - G_TYPE_INVALID); - - dbus_g_proxy_connect_signal (priv->proxy, "StateChanged", - G_CALLBACK (device_state_changed), - NM_DEVICE (object), - NULL); -} - -static void -dispose (GObject *object) -{ - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - g_clear_object (&priv->ip4_config); - g_clear_object (&priv->dhcp4_config); - g_clear_object (&priv->ip6_config); - g_clear_object (&priv->dhcp6_config); - g_clear_object (&priv->active_connection); - - priv->udev_client = nm_udev_client_unref (priv->udev_client); - - if (priv->available_connections) { - int i; - - for (i = 0; i < priv->available_connections->len; i++) - g_object_unref (priv->available_connections->pdata[i]); - g_ptr_array_free (priv->available_connections, TRUE); - priv->available_connections = NULL; - } - - G_OBJECT_CLASS (nm_device_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (object); - - g_free (priv->iface); - g_free (priv->ip_iface); - g_free (priv->udi); - g_free (priv->driver); - g_free (priv->driver_version); - g_free (priv->firmware_version); - g_free (priv->product); - g_free (priv->short_product); - g_free (priv->vendor); - g_free (priv->short_vendor); - g_free (priv->description); - g_free (priv->bus_name); - g_free (priv->type_description); - g_free (priv->physical_port_id); - - G_OBJECT_CLASS (nm_device_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDevice *device = NM_DEVICE (object); - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_DEVICE_TYPE: - g_value_set_uint (value, nm_device_get_device_type (device)); - break; - case PROP_UDI: - g_value_set_string (value, nm_device_get_udi (device)); - break; - case PROP_INTERFACE: - g_value_set_string (value, nm_device_get_iface (device)); - break; - case PROP_IP_INTERFACE: - g_value_set_string (value, nm_device_get_ip_iface (device)); - break; - case PROP_DRIVER: - g_value_set_string (value, nm_device_get_driver (device)); - break; - case PROP_DRIVER_VERSION: - g_value_set_string (value, nm_device_get_driver_version (device)); - break; - case PROP_FIRMWARE_VERSION: - g_value_set_string (value, nm_device_get_firmware_version (device)); - break; - case PROP_CAPABILITIES: - g_value_set_uint (value, nm_device_get_capabilities (device)); - break; - case PROP_REAL: - g_value_set_boolean (value, nm_device_is_real (device)); - break; - case PROP_MANAGED: - g_value_set_boolean (value, nm_device_get_managed (device)); - break; - case PROP_AUTOCONNECT: - g_value_set_boolean (value, nm_device_get_autoconnect (device)); - break; - case PROP_FIRMWARE_MISSING: - g_value_set_boolean (value, nm_device_get_firmware_missing (device)); - break; - case PROP_IP4_CONFIG: - g_value_set_object (value, nm_device_get_ip4_config (device)); - break; - case PROP_DHCP4_CONFIG: - g_value_set_object (value, nm_device_get_dhcp4_config (device)); - break; - case PROP_IP6_CONFIG: - g_value_set_object (value, nm_device_get_ip6_config (device)); - break; - case PROP_DHCP6_CONFIG: - g_value_set_object (value, nm_device_get_dhcp6_config (device)); - break; - case PROP_STATE: - g_value_set_uint (value, nm_device_get_state (device)); - break; - case PROP_STATE_REASON: - g_value_set_boxed (value, - dbus_g_type_specialized_construct (DBUS_G_TYPE_UINT_STRUCT)); - dbus_g_type_struct_set (value, - 0, priv->state, - 1, priv->reason, - G_MAXUINT); - break; - case PROP_ACTIVE_CONNECTION: - g_value_set_object (value, nm_device_get_active_connection (device)); - break; - case PROP_AVAILABLE_CONNECTIONS: - g_value_set_boxed (value, nm_device_get_available_connections (device)); - break; - case PROP_PRODUCT: - g_value_set_string (value, nm_device_get_product (device)); - break; - case PROP_VENDOR: - g_value_set_string (value, nm_device_get_vendor (device)); - break; - case PROP_PHYSICAL_PORT_ID: - g_value_set_string (value, nm_device_get_physical_port_id (device)); - break; - case PROP_MTU: - g_value_set_uint (value, nm_device_get_mtu (device)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - NMDevice *self = NM_DEVICE (object); - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); - gboolean b; - - switch (prop_id) { - case PROP_DEVICE_TYPE: - /* construct-only */ - priv->device_type = g_value_get_uint (value); - break; - case PROP_MANAGED: - b = g_value_get_boolean (value); - if (priv->managed != b) - nm_device_set_managed (NM_DEVICE (object), b); - break; - case PROP_AUTOCONNECT: - b = g_value_get_boolean (value); - if (priv->autoconnect != b) - nm_device_set_autoconnect (NM_DEVICE (object), b); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_device_class_init (NMDeviceClass *device_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (device_class); - - g_type_class_add_private (device_class, sizeof (NMDevicePrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->set_property = set_property; - object_class->dispose = dispose; - object_class->finalize = finalize; - - device_class->connection_compatible = connection_compatible; - - /* properties */ - - /** - * NMDevice:interface: - * - * The interface of the device. - **/ - g_object_class_install_property - (object_class, PROP_INTERFACE, - g_param_spec_string (NM_DEVICE_INTERFACE, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:ip-interface: - * - * The IP interface of the device which should be used for all IP-related - * operations like addressing and routing. - **/ - g_object_class_install_property - (object_class, PROP_IP_INTERFACE, - g_param_spec_string (NM_DEVICE_IP_INTERFACE, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:device-type: - * - * The numeric type of the device. - **/ - g_object_class_install_property - (object_class, PROP_DEVICE_TYPE, - g_param_spec_uint (NM_DEVICE_DEVICE_TYPE, "", "", - NM_DEVICE_TYPE_UNKNOWN, G_MAXUINT32, NM_DEVICE_TYPE_UNKNOWN, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - /** - * NMDevice:udi: - * - * An operating-system specific device hardware identifier; this is not - * unique to a specific hardware device across reboots or hotplugs. It - * is an opaque string which for some device types (Bluetooth, Modem) - * contains an identifier provided by the underlying hardware service daemon - * such as Bluez or ModemManager, and clients can use this property to - * request more information about the device from those services. - **/ - g_object_class_install_property - (object_class, PROP_UDI, - g_param_spec_string (NM_DEVICE_UDI, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:driver: - * - * The driver of the device. - **/ - g_object_class_install_property - (object_class, PROP_DRIVER, - g_param_spec_string (NM_DEVICE_DRIVER, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:driver-version: - * - * The version of the device driver. - **/ - g_object_class_install_property - (object_class, PROP_DRIVER_VERSION, - g_param_spec_string (NM_DEVICE_DRIVER_VERSION, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:firmware-version: - * - * The firmware version of the device. - **/ - g_object_class_install_property - (object_class, PROP_FIRMWARE_VERSION, - g_param_spec_string (NM_DEVICE_FIRMWARE_VERSION, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:capabilities: - * - * The capabilities of the device. - **/ - g_object_class_install_property - (object_class, PROP_CAPABILITIES, - g_param_spec_uint (NM_DEVICE_CAPABILITIES, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:real: - * - * Whether the device is real or is a placeholder device that could - * be created automatically by NetworkManager if one of its - * #NMDevice:available-connections was activated. - * - * Since: 1.2 - **/ - g_object_class_install_property - (object_class, PROP_REAL, - g_param_spec_boolean (NM_DEVICE_REAL, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:managed: - * - * Whether the device is managed by NetworkManager. - **/ - g_object_class_install_property - (object_class, PROP_MANAGED, - g_param_spec_boolean (NM_DEVICE_MANAGED, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:autoconnect: - * - * Whether the device can auto-activate a connection. - **/ - g_object_class_install_property - (object_class, PROP_AUTOCONNECT, - g_param_spec_boolean (NM_DEVICE_AUTOCONNECT, "", "", - TRUE, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:firmware-missing: - * - * When %TRUE indicates the device is likely missing firmware required - * for its operation. - **/ - g_object_class_install_property - (object_class, PROP_FIRMWARE_MISSING, - g_param_spec_boolean (NM_DEVICE_FIRMWARE_MISSING, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:ip4-config: - * - * The #NMIP4Config of the device. - **/ - g_object_class_install_property - (object_class, PROP_IP4_CONFIG, - g_param_spec_object (NM_DEVICE_IP4_CONFIG, "", "", - NM_TYPE_IP4_CONFIG, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:dhcp4-config: - * - * The #NMDHCP4Config of the device. - **/ - g_object_class_install_property - (object_class, PROP_DHCP4_CONFIG, - g_param_spec_object (NM_DEVICE_DHCP4_CONFIG, "", "", - NM_TYPE_DHCP4_CONFIG, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:ip6-config: - * - * The #NMIP6Config of the device. - **/ - g_object_class_install_property - (object_class, PROP_IP6_CONFIG, - g_param_spec_object (NM_DEVICE_IP6_CONFIG, "", "", - NM_TYPE_IP6_CONFIG, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:dhcp6-config: - * - * The #NMDHCP6Config of the device. - **/ - g_object_class_install_property - (object_class, PROP_DHCP6_CONFIG, - g_param_spec_object (NM_DEVICE_DHCP6_CONFIG, "", "", - NM_TYPE_DHCP6_CONFIG, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:state: - * - * The state of the device. - **/ - g_object_class_install_property - (object_class, PROP_STATE, - g_param_spec_uint (NM_DEVICE_STATE, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:state-reason: - * - * The state and reason of the device. - **/ - g_object_class_install_property - (object_class, PROP_STATE_REASON, - g_param_spec_boxed (NM_DEVICE_STATE_REASON, "", "", - DBUS_G_TYPE_UINT_STRUCT, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:active-connection: - * - * The #NMActiveConnection object that "owns" this device during activation. - **/ - g_object_class_install_property - (object_class, PROP_ACTIVE_CONNECTION, - g_param_spec_object (NM_DEVICE_ACTIVE_CONNECTION, "", "", - NM_TYPE_ACTIVE_CONNECTION, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:available-connections: - * - * The available connections (#NMRemoteConnection) of the device - * - * Since: 0.9.8 - **/ - g_object_class_install_property - (object_class, PROP_AVAILABLE_CONNECTIONS, - g_param_spec_boxed (NM_DEVICE_AVAILABLE_CONNECTIONS, "", "", - NM_TYPE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:vendor: - * - * The vendor string of the device. - **/ - g_object_class_install_property - (object_class, PROP_VENDOR, - g_param_spec_string (NM_DEVICE_VENDOR, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:product: - * - * The product string of the device. - **/ - g_object_class_install_property - (object_class, PROP_PRODUCT, - g_param_spec_string (NM_DEVICE_PRODUCT, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:physical-port-id: - * - * The physical port ID of the device. (See - * nm_device_get_physical_port_id().) - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_PHYSICAL_PORT_ID, - g_param_spec_string (NM_DEVICE_PHYSICAL_PORT_ID, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMDevice:mtu: - * - * The MTU of the device. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_MTU, - g_param_spec_uint (NM_DEVICE_MTU, "", "", - 0, G_MAXUINT32, 1500, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /* signals */ - - /** - * NMDevice::state-changed: - * @device: the device object that received the signal - * @new_state: the new state of the device - * @old_state: the previous state of the device - * @reason: the reason describing the state change - * - * Notifies the state change of a #NMDevice. - **/ - signals[STATE_CHANGED] = - g_signal_new ("state-changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMDeviceClass, state_changed), - NULL, NULL, NULL, - G_TYPE_NONE, 3, - G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); -} - -/** - * _nm_device_set_device_type: - * @device: the device - * @dtype: the NM device type - * - * Sets the NM device type if it wasn't set during construction. INTERNAL - * ONLY METHOD. - **/ -void -_nm_device_set_device_type (NMDevice *device, NMDeviceType dtype) -{ - NMDevicePrivate *priv; - - g_return_if_fail (device != NULL); - g_return_if_fail (dtype != NM_DEVICE_TYPE_UNKNOWN); - - priv = NM_DEVICE_GET_PRIVATE (device); - if (priv->device_type == NM_DEVICE_TYPE_UNKNOWN) - priv->device_type = dtype; - else - g_warn_if_fail (dtype == priv->device_type); -} - -NMDeviceType -_nm_device_type_for_path (DBusGConnection *connection, const char *path) -{ - DBusGProxy *proxy; - GError *err = NULL; - GValue value = G_VALUE_INIT; - - proxy = _nm_dbus_new_proxy_for_connection (connection, path, DBUS_INTERFACE_PROPERTIES); - if (!proxy) { - g_warning ("%s: couldn't create D-Bus object proxy.", __func__); - return G_TYPE_INVALID; - } - - if (!dbus_g_proxy_call (proxy, - "Get", &err, - G_TYPE_STRING, NM_DBUS_INTERFACE_DEVICE, - G_TYPE_STRING, "DeviceType", - G_TYPE_INVALID, - G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning ("Error in get_property: %s\n", err->message); - g_error_free (err); - g_object_unref (proxy); - return G_TYPE_INVALID; - } - g_object_unref (proxy); - - return g_value_get_uint (&value); -} - -static GType -_nm_device_gtype_for_path (DBusGConnection *connection, - const char *path) -{ - return _nm_device_gtype_from_dtype (_nm_device_type_for_path (connection, path)); -} - -/** - * nm_device_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the device - * - * Creates a new #NMDevice. - * - * Returns: (transfer full): a new device - **/ -GObject * -nm_device_new (DBusGConnection *connection, const char *path) -{ - GType dtype; - NMDevice *device = NULL; - - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - dtype = _nm_device_gtype_for_path (connection, path); - if (dtype == G_TYPE_INVALID) - return NULL; - - device = (NMDevice *) g_object_new (dtype, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - _nm_object_ensure_inited (NM_OBJECT (device)); - return G_OBJECT (device); -} - -typedef struct { - DBusGConnection *connection; - NMObjectTypeCallbackFunc callback; - gpointer user_data; -} NMDeviceAsyncData; - -static void -async_got_type (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) -{ - NMDeviceAsyncData *async_data = user_data; - GValue value = G_VALUE_INIT; - const char *path = dbus_g_proxy_get_path (proxy); - GError *error = NULL; - GType type; - - if (dbus_g_proxy_end_call (proxy, call, &error, - G_TYPE_VALUE, &value, - G_TYPE_INVALID)) { - NMDeviceType dtype; - - dtype = g_value_get_uint (&value); - type = _nm_device_gtype_from_dtype (dtype); - } else { - g_warning ("%s: could not read properties for %s: %s", __func__, path, error->message); - g_error_free (error); - type = G_TYPE_INVALID; - } - - async_data->callback (type, async_data->user_data); - g_object_unref (proxy); - g_slice_free (NMDeviceAsyncData, async_data); -} - -static void -_nm_device_gtype_for_path_async (DBusGConnection *connection, - const char *path, - NMObjectTypeCallbackFunc callback, - gpointer user_data) -{ - NMDeviceAsyncData *async_data; - DBusGProxy *proxy; - - async_data = g_slice_new (NMDeviceAsyncData); - async_data->connection = connection; - async_data->callback = callback; - async_data->user_data = user_data; - - proxy = _nm_dbus_new_proxy_for_connection (connection, path, DBUS_INTERFACE_PROPERTIES); - dbus_g_proxy_begin_call (proxy, "Get", - async_got_type, async_data, NULL, - G_TYPE_STRING, NM_DBUS_INTERFACE_DEVICE, - G_TYPE_STRING, "DeviceType", - G_TYPE_INVALID); -} - -/** - * nm_device_get_iface: - * @device: a #NMDevice - * - * Gets the interface name of the #NMDevice. - * - * Returns: the interface of the device. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_get_iface (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->iface; -} - -/** - * nm_device_get_ip_iface: - * @device: a #NMDevice - * - * Gets the IP interface name of the #NMDevice over which IP traffic flows - * when the device is in the ACTIVATED state. - * - * Returns: the IP traffic interface of the device. This is the internal string - * used by the device, and must not be modified. - **/ -const char * -nm_device_get_ip_iface (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->ip_iface; -} - -/** - * nm_device_get_device_type: - * @device: a #NMDevice - * - * Returns the numeric type of the #NMDevice, ie Ethernet, Wi-Fi, etc. - * - * Returns: the device type - **/ -NMDeviceType -nm_device_get_device_type (NMDevice *self) -{ - g_return_val_if_fail (NM_IS_DEVICE (self), NM_DEVICE_TYPE_UNKNOWN); - - return NM_DEVICE_GET_PRIVATE (self)->device_type; -} - -/** - * nm_device_get_udi: - * @device: a #NMDevice - * - * Gets the Unique Device Identifier of the #NMDevice. - * - * Returns: the Unique Device Identifier of the device. This identifier may be - * used to gather more information about the device from various operating - * system services like udev or sysfs. - **/ -const char * -nm_device_get_udi (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->udi; -} - -/** - * nm_device_get_driver: - * @device: a #NMDevice - * - * Gets the driver of the #NMDevice. - * - * Returns: the driver of the device. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_get_driver (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->driver; -} - -/** - * nm_device_get_driver_version: - * @device: a #NMDevice - * - * Gets the driver version of the #NMDevice. - * - * Returns: the version of the device driver. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_get_driver_version (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->driver_version; -} - -/** - * nm_device_get_firmware_version: - * @device: a #NMDevice - * - * Gets the firmware version of the #NMDevice. - * - * Returns: the firmware version of the device. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_get_firmware_version (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->firmware_version; -} - -/** - * nm_device_get_type_description: - * @device: a #NMDevice - * - * Gets a (non-localized) description of the type of device that - * @device is. - * - * Returns: the type description of the device. This is the internal - * string used by the device, and must not be modified. - * - * Since: 0.9.10 - **/ -const char * -nm_device_get_type_description (NMDevice *device) -{ - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device); - const char *desc, *typename; - - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - if (priv->type_description) - return priv->type_description; - - if (NM_DEVICE_GET_CLASS (device)->get_type_description) { - desc = NM_DEVICE_GET_CLASS (device)->get_type_description (device); - if (desc) - return desc; - } - - typename = G_OBJECT_TYPE_NAME (device); - if (g_str_has_prefix (typename, "NMDevice")) - typename += 8; - priv->type_description = g_ascii_strdown (typename, -1); - - return priv->type_description; -} - -/** - * nm_device_get_hw_address: - * @device: a #NMDevice - * - * Gets the current a hardware address (MAC) for the @device. - * - * Returns: the current MAC of the device, or %NULL. - * This is the internal string used by the device, and must not be modified. - * - * Since: 0.9.10 - **/ -const char * -nm_device_get_hw_address (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - if (NM_DEVICE_GET_CLASS (device)->get_hw_address) - return NM_DEVICE_GET_CLASS (device)->get_hw_address (device); - - return NULL; -} - -/** - * nm_device_get_capabilities: - * @device: a #NMDevice - * - * Gets the device' capabilities. - * - * Returns: the capabilities - **/ -NMDeviceCapabilities -nm_device_get_capabilities (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), 0); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->capabilities; -} - -/** - * nm_device_get_managed: - * @device: a #NMDevice - * - * Whether the #NMDevice is managed by NetworkManager. - * - * Returns: %TRUE if the device is managed by NetworkManager - **/ -gboolean -nm_device_get_managed (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), 0); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->managed; -} - -/** - * nm_device_set_managed: - * @device: a #NMDevice - * @managed: %TRUE to make the device managed by NetworkManager. - * - * Enables or disables management of #NMDevice by NetworkManager. - * - * Since: 1.2 - **/ -void -nm_device_set_managed (NMDevice *device, gboolean managed) -{ - GValue value = G_VALUE_INIT; - - g_return_if_fail (NM_IS_DEVICE (device)); - - managed = !!managed; - - g_value_init (&value, G_TYPE_BOOLEAN); - g_value_set_boolean (&value, managed); - - NM_DEVICE_GET_PRIVATE (device)->managed = managed; - - _nm_object_set_property (NM_OBJECT (device), - NM_DBUS_INTERFACE_DEVICE, - "Managed", - &value); -} - -/** - * nm_device_get_autoconnect: - * @device: a #NMDevice - * - * Whether the #NMDevice can be autoconnected. - * - * Returns: %TRUE if the device is allowed to be autoconnected - **/ -gboolean -nm_device_get_autoconnect (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->autoconnect; -} - -/** - * nm_device_set_autoconnect: - * @device: a #NMDevice - * @autoconnect: %TRUE to enable autoconnecting - * - * Enables or disables automatic activation of the #NMDevice. - **/ -void -nm_device_set_autoconnect (NMDevice *device, gboolean autoconnect) -{ - GValue value = G_VALUE_INIT; - - g_return_if_fail (NM_IS_DEVICE (device)); - - g_value_init (&value, G_TYPE_BOOLEAN); - g_value_set_boolean (&value, autoconnect); - - NM_DEVICE_GET_PRIVATE (device)->autoconnect = autoconnect; - - _nm_object_set_property (NM_OBJECT (device), - NM_DBUS_INTERFACE_DEVICE, - "Autoconnect", - &value); -} - -/** - * nm_device_get_firmware_missing: - * @device: a #NMDevice - * - * Indicates that firmware required for the device's operation is likely - * to be missing. - * - * Returns: %TRUE if firmware required for the device's operation is likely - * to be missing. - **/ -gboolean -nm_device_get_firmware_missing (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), 0); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->firmware_missing; -} - -/** - * nm_device_get_ip4_config: - * @device: a #NMDevice - * - * Gets the current #NMIP4Config associated with the #NMDevice. - * - * Note that as of NetworkManager 0.9.10, you can alternatively use - * nm_active_connection_get_ip4_config(), which also works with VPN - * connections. - * - * Returns: (transfer none): the #NMIP4Config or %NULL if the device is not activated. - **/ -NMIP4Config * -nm_device_get_ip4_config (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->ip4_config; -} - -/** - * nm_device_get_dhcp4_config: - * @device: a #NMDevice - * - * Gets the current #NMDHCP4Config associated with the #NMDevice. - * - * Note that as of NetworkManager 0.9.10, you can alternatively use - * nm_active_connection_get_dhcp4_config(), which also works with VPN - * connections. - * - * Returns: (transfer none): the #NMDHCP4Config or %NULL if the device is not activated or not - * using DHCP. - **/ -NMDHCP4Config * -nm_device_get_dhcp4_config (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->dhcp4_config; -} - -/** - * nm_device_get_ip6_config: - * @device: a #NMDevice - * - * Gets the current #NMIP6Config associated with the #NMDevice. - * - * Note that as of NetworkManager 0.9.10, you can alternatively use - * nm_active_connection_get_ip6_config(), which also works with VPN - * connections. - * - * Returns: (transfer none): the #NMIP6Config or %NULL if the device is not activated. - **/ -NMIP6Config * -nm_device_get_ip6_config (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->ip6_config; -} - -/** - * nm_device_get_dhcp6_config: - * @device: a #NMDevice - * - * Gets the current #NMDHCP6Config associated with the #NMDevice. - * - * Note that as of NetworkManager 0.9.10, you can alternatively use - * nm_active_connection_get_dhcp6_config(), which also works with VPN - * connections. - * - * Returns: (transfer none): the #NMDHCP6Config or %NULL if the device is not activated or not - * using DHCP. - **/ -NMDHCP6Config * -nm_device_get_dhcp6_config (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->dhcp6_config; -} - -/** - * nm_device_get_state: - * @device: a #NMDevice - * - * Gets the current #NMDevice state. - * - * Returns: the current device state - **/ -NMDeviceState -nm_device_get_state (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NM_DEVICE_STATE_UNKNOWN); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->state; -} - -/** - * nm_device_get_state_reason: - * @device: a #NMDevice - * @reason: (out) (allow-none): location to store reason (#NMDeviceStateReason), or %NULL - * - * Gets the current #NMDevice state (return value) and the reason for entering - * the state (@reason argument). - * - * Returns: the current device state - **/ -NMDeviceState -nm_device_get_state_reason (NMDevice *device, NMDeviceStateReason *reason) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NM_DEVICE_STATE_UNKNOWN); - - _nm_object_ensure_inited (NM_OBJECT (device)); - if (reason) - *reason = NM_DEVICE_GET_PRIVATE (device)->reason; - return NM_DEVICE_GET_PRIVATE (device)->state; -} - -/** - * nm_device_get_active_connection: - * @device: a #NMDevice - * - * Gets the #NMActiveConnection object which owns this device during activation. - * - * Returns: (transfer none): the #NMActiveConnection or %NULL if the device is - * not part of an active connection - **/ -NMActiveConnection * -nm_device_get_active_connection (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->active_connection; -} - -/** - * nm_device_get_available_connections: - * @device: a #NMDevice - * - * Gets the #NMRemoteConnections currently known to the daemon that could - * be activated on @device. - * - * Returns: (element-type NMRemoteConnection): the #GPtrArray - * containing #NMRemoteConnections. This is the internal copy used by - * the connection, and must not be modified. - * - * Since: 0.9.8 - **/ -const GPtrArray * -nm_device_get_available_connections (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return handle_ptr_array_return (NM_DEVICE_GET_PRIVATE (device)->available_connections); -} - -static gboolean -ensure_udev_client (NMDevice *device) -{ - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device); - - if (!priv->udev_client) { - priv->udev_client = nm_udev_client_new ((const char *[]) { "net", "tty", NULL }, - NULL, NULL); - } - return !!priv->udev_client; -} - -static char * -_get_udev_property (NMDevice *device, - const char *enc_prop, /* ID_XXX_ENC */ - const char *db_prop) /* ID_XXX_FROM_DATABASE */ -{ - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device); - struct udev_device *udev_device, *tmpdev; - const char *ifname; - guint32 count = 0; - char *enc_value = NULL, *db_value = NULL; - - if (!ensure_udev_client (device)) - return NULL; - - ifname = nm_device_get_iface (device); - if (!ifname) - return NULL; - - udev_device = udev_device_new_from_subsystem_sysname (nm_udev_client_get_udev (priv->udev_client), "net", ifname); - if (!udev_device) { - udev_device = udev_device_new_from_subsystem_sysname (nm_udev_client_get_udev (priv->udev_client), "tty", ifname); - if (!udev_device) - return NULL; - } - /* Walk up the chain of the device and its parents a few steps to grab - * vendor and device ID information off it. - */ - tmpdev = udev_device; - while ((count++ < 3) && tmpdev && !enc_value) { - if (!enc_value) - enc_value = nm_udev_utils_property_decode_cp (udev_device_get_property_value (tmpdev, enc_prop)); - if (!db_value) - db_value = g_strdup (udev_device_get_property_value (tmpdev, db_prop)); - - tmpdev = udev_device_get_parent (tmpdev); - } - udev_device_unref (udev_device); - - /* Prefer the encoded value which comes directly from the device - * over the hwdata database value. - */ - if (enc_value) { - g_free (db_value); - return enc_value; - } - - return db_value; -} - -/** - * nm_device_get_product: - * @device: a #NMDevice - * - * Gets the product string of the #NMDevice. - * - * Returns: the product name of the device. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_get_product (NMDevice *device) -{ - NMDevicePrivate *priv; - - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - priv = NM_DEVICE_GET_PRIVATE (device); - if (!priv->product) { - priv->product = _get_udev_property (device, "ID_MODEL_ENC", "ID_MODEL_FROM_DATABASE"); - if (!priv->product) { - /* Sometimes ID_PRODUCT_FROM_DATABASE is used? */ - priv->product = _get_udev_property (device, "ID_MODEL_ENC", "ID_PRODUCT_FROM_DATABASE"); - } - _nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_PRODUCT); - } - return priv->product; -} - -/** - * nm_device_get_vendor: - * @device: a #NMDevice - * - * Gets the vendor string of the #NMDevice. - * - * Returns: the vendor name of the device. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_device_get_vendor (NMDevice *device) -{ - NMDevicePrivate *priv; - - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - priv = NM_DEVICE_GET_PRIVATE (device); - if (!priv->vendor) { - priv->vendor = _get_udev_property (device, "ID_VENDOR_ENC", "ID_VENDOR_FROM_DATABASE"); - _nm_object_queue_notify (NM_OBJECT (device), NM_DEVICE_VENDOR); - } - return priv->vendor; -} - -static const char * const ignored_words[] = { - "Semiconductor", - "Components", - "Corporation", - "Communications", - "Company", - "Corp.", - "Corp", - "Co.", - "Inc.", - "Inc", - "Incorporated", - "Ltd.", - "Limited.", - "Intel?", - "chipset", - "adapter", - "[hex]", - "NDIS", - "Module", - NULL -}; - -static const char * const ignored_phrases[] = { - "Multiprotocol MAC/baseband processor", - "Wireless LAN Controller", - "Wireless LAN Adapter", - "Wireless Adapter", - "Network Connection", - "Wireless Cardbus Adapter", - "Wireless CardBus Adapter", - "54 Mbps Wireless PC Card", - "Wireless PC Card", - "Wireless PC", - "PC Card with XJACK(r) Antenna", - "Wireless cardbus", - "Wireless LAN PC Card", - "Technology Group Ltd.", - "Communication S.p.A.", - "Business Mobile Networks BV", - "Mobile Broadband Minicard Composite Device", - "Mobile Communications AB", - "(PC-Suite Mode)", - NULL -}; - -static char * -fixup_desc_string (const char *desc) -{ - char *p, *temp; - char **words, **item; - GString *str; - int i; - - if (!desc) - return NULL; - - p = temp = g_strdup (desc); - while (*p) { - if (*p == '_' || *p == ',') - *p = ' '; - p++; - } - - /* Attempt to shorten ID by ignoring certain phrases */ - for (i = 0; ignored_phrases[i]; i++) { - p = strstr (temp, ignored_phrases[i]); - if (p) { - guint32 ignored_len = strlen (ignored_phrases[i]); - - memmove (p, p + ignored_len, strlen (p + ignored_len) + 1); /* +1 for the \0 */ - } - } - - /* Attempt to shorten ID by ignoring certain individual words */ - words = g_strsplit (temp, " ", 0); - str = g_string_new_len (NULL, strlen (temp)); - g_free (temp); - - for (item = words; *item; item++) { - gboolean ignore = FALSE; - - if (**item == '\0') - continue; - - for (i = 0; ignored_words[i]; i++) { - if (!strcmp (*item, ignored_words[i])) { - ignore = TRUE; - break; - } - } - - if (!ignore) { - if (str->len) - g_string_append_c (str, ' '); - g_string_append (str, *item); - } - } - g_strfreev (words); - - temp = str->str; - g_string_free (str, FALSE); - - return temp; -} - -static void -get_description (NMDevice *device) -{ - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device); - const char *dev_product; - const char *dev_vendor; - char *pdown; - char *vdown; - GString *str; - GParamSpec *name_prop; - - dev_product = nm_device_get_product (device); - priv->short_product = fixup_desc_string (dev_product); - - dev_vendor = nm_device_get_vendor (device); - priv->short_vendor = fixup_desc_string (dev_vendor); - - /* Grab device's preferred name, if any */ - name_prop = g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (device)), "name"); - if (name_prop) { - g_object_get (device, "name", &priv->description, NULL); - if (priv->description && priv->description[0]) - return; - g_clear_pointer (&priv->description, g_free); - } - - if (!dev_product || !dev_vendor) { - priv->description = g_strdup (nm_device_get_iface (device)); - return; - } - - str = g_string_new_len (NULL, strlen (priv->short_vendor) + strlen (priv->short_product) + 1); - - /* Another quick hack; if all of the fixed up vendor string - * is found in product, ignore the vendor. - */ - pdown = g_ascii_strdown (priv->short_product, -1); - vdown = g_ascii_strdown (priv->short_vendor, -1); - if (!strstr (pdown, vdown)) { - g_string_append (str, priv->short_vendor); - g_string_append_c (str, ' '); - } - g_free (pdown); - g_free (vdown); - - g_string_append (str, priv->short_product); - - priv->description = g_string_free (str, FALSE); -} - -static const char * -get_short_vendor (NMDevice *device) -{ - NMDevicePrivate *priv; - - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - priv = NM_DEVICE_GET_PRIVATE (device); - - if (!priv->description) - get_description (device); - - return priv->short_vendor; -} - -/** - * nm_device_get_description: - * @device: an #NMDevice - * - * Gets a description of @device, based on its vendor and product names. - * - * Returns: a description of @device. If either the vendor or the - * product name is unknown, this returns the interface name. - * - * Since: 0.9.10 - */ -const char * -nm_device_get_description (NMDevice *device) -{ - NMDevicePrivate *priv; - - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - priv = NM_DEVICE_GET_PRIVATE (device); - - if (!priv->description) - get_description (device); - - return priv->description; -} - -static const char * -get_type_name (NMDevice *device) -{ - switch (nm_device_get_device_type (device)) { - case NM_DEVICE_TYPE_ETHERNET: - return _("Ethernet"); - case NM_DEVICE_TYPE_WIFI: - return _("Wi-Fi"); - case NM_DEVICE_TYPE_BT: - return _("Bluetooth"); - case NM_DEVICE_TYPE_OLPC_MESH: - return _("OLPC Mesh"); - case NM_DEVICE_TYPE_WIMAX: - return _("WiMAX"); - case NM_DEVICE_TYPE_MODEM: - return _("Mobile Broadband"); - case NM_DEVICE_TYPE_INFINIBAND: - return _("InfiniBand"); - case NM_DEVICE_TYPE_BOND: - return _("Bond"); - case NM_DEVICE_TYPE_TEAM: - return _("Team"); - case NM_DEVICE_TYPE_BRIDGE: - return _("Bridge"); - case NM_DEVICE_TYPE_VLAN: - return _("VLAN"); - case NM_DEVICE_TYPE_ADSL: - return _("ADSL"); - case NM_DEVICE_TYPE_MACVLAN: - return _("MACVLAN"); - case NM_DEVICE_TYPE_VXLAN: - return _("VXLAN"); - case NM_DEVICE_TYPE_IP_TUNNEL: - return _("IPTunnel"); - case NM_DEVICE_TYPE_TUN: - return _("Tun"); - case NM_DEVICE_TYPE_VETH: - return _("Veth"); - case NM_DEVICE_TYPE_GENERIC: - case NM_DEVICE_TYPE_UNUSED1: - case NM_DEVICE_TYPE_UNUSED2: - case NM_DEVICE_TYPE_UNKNOWN: - break; - } - return _("Unknown"); -} - -static char * -get_device_type_name_with_iface (NMDevice *device) -{ - const char *type_name = get_type_name (device); - - switch (nm_device_get_device_type (device)) { - case NM_DEVICE_TYPE_BOND: - case NM_DEVICE_TYPE_TEAM: - case NM_DEVICE_TYPE_BRIDGE: - case NM_DEVICE_TYPE_VLAN: - return g_strdup_printf ("%s (%s)", type_name, nm_device_get_iface (device)); - default: - return g_strdup (type_name); - } -} - -static char * -get_device_generic_type_name_with_iface (NMDevice *device) -{ - switch (nm_device_get_device_type (device)) { - case NM_DEVICE_TYPE_ETHERNET: - case NM_DEVICE_TYPE_INFINIBAND: - return g_strdup (_("Wired")); - default: - return get_device_type_name_with_iface (device); - } -} - -static const char * -get_bus_name (NMDevice *device) -{ - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device); - struct udev_device *udevice; - const char *ifname, *bus; - - if (priv->bus_name) - goto out; - - if (!ensure_udev_client (device)) - return NULL; - - ifname = nm_device_get_iface (device); - if (!ifname) - return NULL; - - udevice = udev_device_new_from_subsystem_sysname (nm_udev_client_get_udev (priv->udev_client), "net", ifname); - if (!udevice) - udevice = udev_device_new_from_subsystem_sysname (nm_udev_client_get_udev (priv->udev_client), "tty", ifname); - if (!udevice) - return NULL; - - bus = udev_device_get_property_value (udevice, "ID_BUS"); - if (!g_strcmp0 (bus, "pci")) - priv->bus_name = g_strdup (_("PCI")); - else if (!g_strcmp0 (bus, "usb")) - priv->bus_name = g_strdup (_("USB")); - else { - /* Use "" instead of NULL so we can tell later that we've - * already tried. - */ - priv->bus_name = g_strdup (""); - } - udev_device_unref (udevice); - -out: - if (*priv->bus_name) - return priv->bus_name; - else - return NULL; -} - -static gboolean -find_duplicates (char **names, - gboolean *duplicates, - int num_devices) -{ - int i, j; - gboolean found_any = FALSE; - - memset (duplicates, 0, num_devices * sizeof (gboolean)); - for (i = 0; i < num_devices; i++) { - if (duplicates[i]) - continue; - for (j = i + 1; j < num_devices; j++) { - if (duplicates[j]) - continue; - if (!strcmp (names[i], names[j])) - duplicates[i] = duplicates[j] = found_any = TRUE; - } - } - - return found_any; -} - -/** - * nm_device_disambiguate_names: - * @devices: (array length=num_devices): an array of #NMDevice - * @num_devices: length of @devices - * - * Generates a list of short-ish unique presentation names for the - * devices in @devices. - * - * Returns: (transfer full) (array zero-terminated=1): the device names - * - * Since: 0.9.10 - */ -char ** -nm_device_disambiguate_names (NMDevice **devices, - int num_devices) -{ - char **names; - gboolean *duplicates; - int i; - - names = g_new (char *, num_devices + 1); - duplicates = g_new (gboolean, num_devices); - - /* Generic device name */ - for (i = 0; i < num_devices; i++) - names[i] = get_device_generic_type_name_with_iface (devices[i]); - if (!find_duplicates (names, duplicates, num_devices)) - goto done; - - /* Try specific names (eg, "Ethernet" and "InfiniBand" rather - * than "Wired") - */ - for (i = 0; i < num_devices; i++) { - if (duplicates[i]) { - g_free (names[i]); - names[i] = get_device_type_name_with_iface (devices[i]); - } - } - if (!find_duplicates (names, duplicates, num_devices)) - goto done; - - /* Try prefixing bus name (eg, "PCI Ethernet" vs "USB Ethernet") */ - for (i = 0; i < num_devices; i++) { - if (duplicates[i]) { - const char *bus = get_bus_name (devices[i]); - char *name; - - if (!bus) - continue; - - g_free (names[i]); - name = get_device_type_name_with_iface (devices[i]); - /* TRANSLATORS: the first %s is a bus name (eg, "USB") or - * product name, the second is a device type (eg, - * "Ethernet"). You can change this to something like - * "%2$s (%1$s)" if there's no grammatical way to combine - * the strings otherwise. - */ - names[i] = g_strdup_printf (C_("long device name", "%s %s"), - bus, name); - g_free (name); - } - } - if (!find_duplicates (names, duplicates, num_devices)) - goto done; - - /* Try prefixing vendor name */ - for (i = 0; i < num_devices; i++) { - if (duplicates[i]) { - const char *vendor = get_short_vendor (devices[i]); - char *name; - - if (!vendor) - continue; - - g_free (names[i]); - name = get_device_type_name_with_iface (devices[i]); - names[i] = g_strdup_printf (C_("long device name", "%s %s"), - vendor, - get_type_name (devices[i])); - g_free (name); - } - } - if (!find_duplicates (names, duplicates, num_devices)) - goto done; - - /* We have multiple identical network cards, so we have to differentiate - * them by interface name. - */ - for (i = 0; i < num_devices; i++) { - if (duplicates[i]) { - const char *interface = nm_device_get_iface (devices[i]); - - if (!interface) - continue; - - g_free (names[i]); - names[i] = g_strdup_printf ("%s (%s)", - get_type_name (devices[i]), - interface); - } - } - -done: - g_free (duplicates); - names[num_devices] = NULL; - return names; -} - -/** - * nm_device_get_physical_port_id: - * @device: a #NMDevice - * - * Gets the physical port ID of the #NMDevice. If non-%NULL, this is - * an opaque string that can be used to recognize when - * seemingly-unrelated #NMDevices are actually just different virtual - * ports on a single physical port. (Eg, NPAR / SR-IOV.) - * - * Returns: the physical port ID of the device, or %NULL if the port - * ID is unknown. This is the internal string used by the device and - * must not be modified. - * - * Since: 0.9.10 - **/ -const char * -nm_device_get_physical_port_id (NMDevice *device) -{ - NMDevicePrivate *priv; - - g_return_val_if_fail (NM_IS_DEVICE (device), NULL); - - priv = NM_DEVICE_GET_PRIVATE (device); - - _nm_object_ensure_inited (NM_OBJECT (device)); - if (priv->physical_port_id && *priv->physical_port_id) - return priv->physical_port_id; - else - return NULL; -} - -/** - * nm_device_get_mtu: - * @device: a #NMDevice - * - * Gets the MTU of the #NMDevice. - * - * Returns: the MTU of the device in bytes. - * - * Since: 0.9.10 - **/ -guint32 -nm_device_get_mtu (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), 0); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->mtu; -} - -/** - * nm_device_is_real: - * @device: a #NMDevice - * - * Returns: %TRUE if the device exists, or %FALSE if it is a placeholder device - * that could be automatically created by NetworkManager if one of its - * #NMDevice:available-connections was activated. - * - * Since: 1.2 - **/ -gboolean -nm_device_is_real (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return NM_DEVICE_GET_PRIVATE (device)->real; -} - -/** - * nm_device_is_software: - * @device: a #NMDevice - * - * Whether the device is a software device. - * - * Returns: %TRUE if @device is a software device, %FALSE if it is a hardware device. - * - * Since: 1.0 - **/ -gboolean -nm_device_is_software (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), FALSE); - - _nm_object_ensure_inited (NM_OBJECT (device)); - return !!(NM_DEVICE_GET_PRIVATE (device)->capabilities & NM_DEVICE_CAP_IS_SOFTWARE); -} - -typedef struct { - NMDevice *device; - NMDeviceCallbackFn fn; - gpointer user_data; - const char *method; -} DeviceCallbackInfo; - -static void -device_operation_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - DeviceCallbackInfo *info = user_data; - GError *error = NULL; - - dbus_g_proxy_end_call (proxy, call, &error, - G_TYPE_INVALID); - if (info->fn) - info->fn (info->device, error, info->user_data); - else if (error) { - g_warning ("%s: device %s %s failed: %s", - __func__, - nm_object_get_path (NM_OBJECT (info->device)), - info->method, - NM_G_ERROR_MSG (error)); - } - g_clear_error (&error); - - g_object_unref (info->device); - g_slice_free (DeviceCallbackInfo, info); -} - -/** - * nm_device_disconnect: - * @device: a #NMDevice - * @callback: (scope async) (allow-none): callback to be called when disconnect - * operation completes - * @user_data: (closure): caller-specific data passed to @callback - * - * Disconnects the device if currently connected, and prevents the device from - * automatically connecting to networks until the next manual network connection - * request. - **/ -void -nm_device_disconnect (NMDevice *device, - NMDeviceCallbackFn callback, - gpointer user_data) -{ - DeviceCallbackInfo *info; - - g_return_if_fail (NM_IS_DEVICE (device)); - - info = g_slice_new (DeviceCallbackInfo); - info->fn = callback; - info->user_data = user_data; - info->method = "Disconnect"; - info->device = g_object_ref (device); - - dbus_g_proxy_begin_call (NM_DEVICE_GET_PRIVATE (device)->proxy, "Disconnect", - device_operation_cb, info, NULL, - G_TYPE_INVALID); -} - -/** - * nm_device_delete: - * @device: a #NMDevice - * @callback: (scope async) (allow-none): callback to be called when delete - * operation completes - * @user_data: (closure): caller-specific data passed to @callback - * - * Deletes the software device. Hardware devices can't be deleted. - * - * Since: 1.0 - **/ -void -nm_device_delete (NMDevice *device, - NMDeviceCallbackFn callback, - gpointer user_data) -{ - DeviceCallbackInfo *info; - - g_return_if_fail (NM_IS_DEVICE (device)); - - info = g_slice_new (DeviceCallbackInfo); - info->fn = callback; - info->user_data = user_data; - info->method = "Delete"; - info->device = g_object_ref (device); - - dbus_g_proxy_begin_call (NM_DEVICE_GET_PRIVATE (device)->proxy, "Delete", - device_operation_cb, info, NULL, - G_TYPE_INVALID); -} - -/** - * nm_device_connection_valid: - * @device: an #NMDevice to validate @connection against - * @connection: an #NMConnection to validate against @device - * - * Validates a given connection for a given #NMDevice object and returns - * whether the connection may be activated with the device. For example if - * @device is a Wi-Fi device that supports only WEP encryption, the connection - * will only be valid if it is a Wi-Fi connection which describes a WEP or open - * network, and will not be valid if it describes a WPA network, or if it is - * an Ethernet, Bluetooth, WWAN, etc connection that is incompatible with the - * device. - * - * Returns: %TRUE if the connection may be activated with this device, %FALSE - * if is incompatible with the device's capabilities and characteristics. - **/ -gboolean -nm_device_connection_valid (NMDevice *device, NMConnection *connection) -{ - return nm_device_connection_compatible (device, connection, NULL); -} - -gboolean -connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - NMSettingConnection *s_con; - const char *config_iface, *device_iface; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - - config_iface = nm_setting_connection_get_interface_name (s_con); - device_iface = nm_device_get_iface (device); - if (config_iface && g_strcmp0 (config_iface, device_iface) != 0) { - g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_INTERFACE_MISMATCH, - "The interface names of the device and the connection didn't match."); - return FALSE; - } - - return TRUE; -} - -/** - * nm_device_connection_compatible: - * @device: an #NMDevice to validate @connection against - * @connection: an #NMConnection to validate against @device - * @error: return location for a #GError, or %NULL - * - * Validates a given connection for a given #NMDevice object and returns - * whether the connection may be activated with the device. For example if - * @device is a Wi-Fi device that supports only WEP encryption, the connection - * will only be valid if it is a Wi-Fi connection which describes a WEP or open - * network, and will not be valid if it describes a WPA network, or if it is - * an Ethernet, Bluetooth, WWAN, etc connection that is incompatible with the - * device. - * - * This function does the same as nm_device_connection_valid(), i.e. checking - * compatibility of the given device and connection. But, in addition, it sets - * GError when FALSE is returned. - * - * Returns: %TRUE if the connection may be activated with this device, %FALSE - * if is incompatible with the device's capabilities and characteristics. - **/ -gboolean -nm_device_connection_compatible (NMDevice *device, NMConnection *connection, GError **error) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), FALSE); - g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - return NM_DEVICE_GET_CLASS (device)->connection_compatible (device, connection, error); -} - -/** - * nm_device_filter_connections: - * @device: an #NMDevice to filter connections for - * @connections: (element-type NMConnection): a list of #NMConnection objects to filter - * - * Filters a given list of connections for a given #NMDevice object and return - * connections which may be activated with the device. For example if @device - * is a Wi-Fi device that supports only WEP encryption, the returned list will - * contain any Wi-Fi connections in @connections that allow connection to - * unencrypted or WEP-enabled SSIDs. The returned list will not contain - * Ethernet, Bluetooth, Wi-Fi WPA connections, or any other connection that is - * incompatible with the device. To get the full list of connections see - * nm_remote_settings_list_connections(). - * - * Returns: (transfer container) (element-type NMConnection): a - * list of #NMConnection objects that could be activated with the given @device. - * The elements of the list are owned by their creator and should not be freed - * by the caller, but the returned list itself is owned by the caller and should - * be freed with g_slist_free() when it is no longer required. - **/ -GSList * -nm_device_filter_connections (NMDevice *device, const GSList *connections) -{ - GSList *filtered = NULL; - const GSList *iter; - - for (iter = connections; iter; iter = g_slist_next (iter)) { - NMConnection *candidate = NM_CONNECTION (iter->data); - - /* Connection applies to this device */ - if (nm_device_connection_valid (device, candidate)) - filtered = g_slist_prepend (filtered, candidate); - } - - return g_slist_reverse (filtered); -} - -/** - * nm_device_get_setting_type: - * @device: an #NMDevice - * - * Gets the (primary) #NMSetting subtype associated with connections - * that can be used on @device. - * - * Returns: @device's associated #NMSetting type - * - * Since: 0.9.10 - */ -GType -nm_device_get_setting_type (NMDevice *device) -{ - g_return_val_if_fail (NM_IS_DEVICE (device), G_TYPE_INVALID); - g_return_val_if_fail (NM_DEVICE_GET_CLASS (device)->get_setting_type != NULL, G_TYPE_INVALID); - - return NM_DEVICE_GET_CLASS (device)->get_setting_type (device); -} diff --git a/libnm-glib/nm-device.h b/libnm-glib/nm-device.h deleted file mode 100644 index d2d154dc..00000000 --- a/libnm-glib/nm-device.h +++ /dev/null @@ -1,191 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2013 Red Hat, Inc. - */ - -#ifndef NM_DEVICE_H -#define NM_DEVICE_H - -#include <glib.h> -#include <glib-object.h> -#include <dbus/dbus-glib.h> -#include "nm-object.h" -#include "NetworkManager.h" -#include "nm-ip4-config.h" -#include "nm-dhcp4-config.h" -#include "nm-ip6-config.h" -#include "nm-dhcp6-config.h" -#include "nm-connection.h" -#include "nm-active-connection.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DEVICE (nm_device_get_type ()) -#define NM_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE, NMDevice)) -#define NM_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE, NMDeviceClass)) -#define NM_IS_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE)) -#define NM_IS_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE)) -#define NM_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE, NMDeviceClass)) - -/** - * NMDeviceError: - * @NM_DEVICE_ERROR_UNKNOWN: unknown or unclassified error - * @NM_DEVICE_ERROR_INTERFACE_MISMATCH: the interface names of the connection and the - * device mismatched - */ -typedef enum { - NM_DEVICE_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_DEVICE_ERROR_INTERFACE_MISMATCH, /*< nick=InterfaceMismatch >*/ -} NMDeviceError; - -#define NM_DEVICE_ERROR nm_device_error_quark () -NM_AVAILABLE_IN_0_9_10 -GQuark nm_device_error_quark (void); - -#define NM_DEVICE_DEVICE_TYPE "device-type" -#define NM_DEVICE_UDI "udi" -#define NM_DEVICE_INTERFACE "interface" -#define NM_DEVICE_IP_INTERFACE "ip-interface" -#define NM_DEVICE_DRIVER "driver" -#define NM_DEVICE_DRIVER_VERSION "driver-version" -#define NM_DEVICE_FIRMWARE_VERSION "firmware-version" -#define NM_DEVICE_CAPABILITIES "capabilities" -#define NM_DEVICE_REAL "real" -#define NM_DEVICE_MANAGED "managed" -#define NM_DEVICE_AUTOCONNECT "autoconnect" -#define NM_DEVICE_FIRMWARE_MISSING "firmware-missing" -#define NM_DEVICE_IP4_CONFIG "ip4-config" -#define NM_DEVICE_DHCP4_CONFIG "dhcp4-config" -#define NM_DEVICE_IP6_CONFIG "ip6-config" -#define NM_DEVICE_DHCP6_CONFIG "dhcp6-config" -#define NM_DEVICE_STATE "state" -#define NM_DEVICE_STATE_REASON "state-reason" -#define NM_DEVICE_ACTIVE_CONNECTION "active-connection" -#define NM_DEVICE_AVAILABLE_CONNECTIONS "available-connections" -#define NM_DEVICE_VENDOR "vendor" -#define NM_DEVICE_PRODUCT "product" -#define NM_DEVICE_PHYSICAL_PORT_ID "physical-port-id" -#define NM_DEVICE_MTU "mtu" - -typedef struct { - NMObject parent; -} NMDevice; - -typedef struct { - NMObjectClass parent; - - /* Signals */ - void (*state_changed) (NMDevice *device, - NMDeviceState new_state, - NMDeviceState old_state, - NMDeviceStateReason reason); - - gboolean (*connection_compatible) (NMDevice *device, - NMConnection *connection, - GError **error); - - const char * (*get_type_description) (NMDevice *device); - const char * (*get_hw_address) (NMDevice *device); - - GType (*get_setting_type) (NMDevice *device); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); -} NMDeviceClass; - -GType nm_device_get_type (void); - -GObject * nm_device_new (DBusGConnection *connection, const char *path); - -const char * nm_device_get_iface (NMDevice *device); -const char * nm_device_get_ip_iface (NMDevice *device); -NMDeviceType nm_device_get_device_type (NMDevice *device); -const char * nm_device_get_udi (NMDevice *device); -const char * nm_device_get_driver (NMDevice *device); -const char * nm_device_get_driver_version (NMDevice *device); -const char * nm_device_get_firmware_version (NMDevice *device); -NM_AVAILABLE_IN_0_9_10 -const char * nm_device_get_type_description (NMDevice *device); -NM_AVAILABLE_IN_0_9_10 -const char * nm_device_get_hw_address (NMDevice *device); -NMDeviceCapabilities nm_device_get_capabilities (NMDevice *device); -gboolean nm_device_get_managed (NMDevice *device); -NM_AVAILABLE_IN_1_2 -void nm_device_set_managed (NMDevice *device, gboolean managed); -gboolean nm_device_get_autoconnect (NMDevice *device); -void nm_device_set_autoconnect (NMDevice *device, gboolean autoconnect); -gboolean nm_device_get_firmware_missing (NMDevice *device); -NMIP4Config * nm_device_get_ip4_config (NMDevice *device); -NMDHCP4Config * nm_device_get_dhcp4_config (NMDevice *device); -NMIP6Config * nm_device_get_ip6_config (NMDevice *device); -NMDHCP6Config * nm_device_get_dhcp6_config (NMDevice *device); -NMDeviceState nm_device_get_state (NMDevice *device); -NMDeviceState nm_device_get_state_reason (NMDevice *device, NMDeviceStateReason *reason); -NMActiveConnection * nm_device_get_active_connection(NMDevice *device); -const GPtrArray * nm_device_get_available_connections(NMDevice *device); -NM_AVAILABLE_IN_0_9_10 -const char * nm_device_get_physical_port_id (NMDevice *device); -NM_AVAILABLE_IN_0_9_10 -guint32 nm_device_get_mtu (NMDevice *device); -NM_AVAILABLE_IN_1_0 -gboolean nm_device_is_software (NMDevice *device); -NM_AVAILABLE_IN_1_2 -gboolean nm_device_is_real (NMDevice *device); - -const char * nm_device_get_product (NMDevice *device); -const char * nm_device_get_vendor (NMDevice *device); -NM_AVAILABLE_IN_0_9_10 -const char * nm_device_get_description (NMDevice *device); -NM_AVAILABLE_IN_0_9_10 -char ** nm_device_disambiguate_names (NMDevice **devices, - int num_devices); - -typedef void (*NMDeviceCallbackFn) (NMDevice *device, GError *error, gpointer user_data); - -void nm_device_disconnect (NMDevice *device, - NMDeviceCallbackFn callback, - gpointer user_data); - -NM_AVAILABLE_IN_1_0 -void nm_device_delete (NMDevice *device, - NMDeviceCallbackFn callback, - gpointer user_data); - -GSList * nm_device_filter_connections (NMDevice *device, - const GSList *connections); - -gboolean nm_device_connection_valid (NMDevice *device, - NMConnection *connection); - -gboolean nm_device_connection_compatible (NMDevice *device, - NMConnection *connection, - GError **error); - -NM_AVAILABLE_IN_0_9_10 -GType nm_device_get_setting_type (NMDevice *device); - -/* Deprecated */ -NM_DEPRECATED_IN_1_0 -typedef void (*NMDeviceDeactivateFn) (NMDevice *device, GError *error, gpointer user_data); - -G_END_DECLS - -#endif /* NM_DEVICE_H */ diff --git a/libnm-glib/nm-dhcp4-config.c b/libnm-glib/nm-dhcp4-config.c deleted file mode 100644 index e446280f..00000000 --- a/libnm-glib/nm-dhcp4-config.c +++ /dev/null @@ -1,218 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2011 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-dhcp4-config.h" -#include "NetworkManager.h" -#include "nm-types-private.h" -#include "nm-object-private.h" -#include "nm-utils.h" - -G_DEFINE_TYPE (NMDHCP4Config, nm_dhcp4_config, NM_TYPE_OBJECT) - -#define NM_DHCP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DHCP4_CONFIG, NMDHCP4ConfigPrivate)) - -typedef struct { - DBusGProxy *proxy; - - GHashTable *options; -} NMDHCP4ConfigPrivate; - -enum { - PROP_0, - PROP_OPTIONS, - - LAST_PROP -}; - -static void -nm_dhcp4_config_init (NMDHCP4Config *config) -{ -} - -static gboolean -demarshal_dhcp4_options (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - NMDHCP4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (object); - GHashTable *new_options; - GHashTableIter iter; - const char *key; - GValue *opt; - - g_hash_table_remove_all (priv->options); - - new_options = g_value_get_boxed (value); - if (new_options) { - g_hash_table_iter_init (&iter, new_options); - while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &opt)) - g_hash_table_insert (priv->options, g_strdup (key), g_value_dup_string (opt)); - } - - _nm_object_queue_notify (object, NM_DHCP4_CONFIG_OPTIONS); - return TRUE; -} - -static void -register_properties (NMDHCP4Config *config) -{ - NMDHCP4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (config); - const NMPropertiesInfo property_info[] = { - { NM_DHCP4_CONFIG_OPTIONS, &priv->options, demarshal_dhcp4_options }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (config), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDHCP4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_dhcp4_config_parent_class)->constructed (object); - - priv->options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DHCP4_CONFIG); - register_properties (NM_DHCP4_CONFIG (object)); -} - -static void -finalize (GObject *object) -{ - NMDHCP4ConfigPrivate *priv = NM_DHCP4_CONFIG_GET_PRIVATE (object); - - if (priv->options) - g_hash_table_destroy (priv->options); - - g_object_unref (priv->proxy); - - G_OBJECT_CLASS (nm_dhcp4_config_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDHCP4Config *self = NM_DHCP4_CONFIG (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_OPTIONS: - g_value_set_boxed (value, nm_dhcp4_config_get_options (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_dhcp4_config_class_init (NMDHCP4ConfigClass *config_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (config_class); - - g_type_class_add_private (config_class, sizeof (NMDHCP4ConfigPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->finalize = finalize; - - /* properties */ - - /** - * NMDHCP4Config:options: (type GHashTable(utf8,GObject.Value)): - * - * The #GHashTable containing options of the configuration. - **/ - g_object_class_install_property - (object_class, PROP_OPTIONS, - g_param_spec_boxed (NM_DHCP4_CONFIG_OPTIONS, "", "", - G_TYPE_HASH_TABLE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} - -/** - * nm_dhcp4_config_new: - * @connection: the #DBusGConnection - * @object_path: the DBus object path of the device - * - * Creates a new #NMDHCP4Config. - * - * Returns: (transfer full): a new configuration - **/ -GObject * -nm_dhcp4_config_new (DBusGConnection *connection, const char *object_path) -{ - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (object_path != NULL, NULL); - - return (GObject *) g_object_new (NM_TYPE_DHCP4_CONFIG, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, object_path, - NULL); -} - -/** - * nm_dhcp4_config_get_options: - * @config: a #NMDHCP4Config - * - * Gets all the options contained in the configuration. - * - * Returns: (transfer none) (element-type utf8 GObject.Value): the #GHashTable containing strings for keys and values. - * This is the internal copy used by the configuration, and must not be modified. - **/ -GHashTable * -nm_dhcp4_config_get_options (NMDHCP4Config *config) -{ - g_return_val_if_fail (NM_IS_DHCP4_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_DHCP4_CONFIG_GET_PRIVATE (config)->options; -} - -/** - * nm_dhcp4_config_get_one_option: - * @config: a #NMDHCP4Config - * @option: the option to retrieve - * - * Gets one option by option name. - * - * Returns: the configuration option's value. This is the internal string used by the - * configuration, and must not be modified. - **/ -const char * -nm_dhcp4_config_get_one_option (NMDHCP4Config *config, const char *option) -{ - g_return_val_if_fail (NM_IS_DHCP4_CONFIG (config), NULL); - - return g_hash_table_lookup (nm_dhcp4_config_get_options (config), option); -} diff --git a/libnm-glib/nm-dhcp4-config.h b/libnm-glib/nm-dhcp4-config.h deleted file mode 100644 index c64e9a9c..00000000 --- a/libnm-glib/nm-dhcp4-config.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#ifndef NM_DHCP4_CONFIG_H -#define NM_DHCP4_CONFIG_H - -#include <glib.h> -#include <glib-object.h> -#include <dbus/dbus-glib.h> -#include "nm-object.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DHCP4_CONFIG (nm_dhcp4_config_get_type ()) -#define NM_DHCP4_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DHCP4_CONFIG, NMDHCP4Config)) -#define NM_DHCP4_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DHCP4_CONFIG, NMDHCP4ConfigClass)) -#define NM_IS_DHCP4_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DHCP4_CONFIG)) -#define NM_IS_DHCP4_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DHCP4_CONFIG)) - -typedef struct { - NMObject parent; -} NMDHCP4Config; - -typedef struct { - NMObjectClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDHCP4ConfigClass; - -#define NM_DHCP4_CONFIG_OPTIONS "options" - -GType nm_dhcp4_config_get_type (void); - -GObject *nm_dhcp4_config_new (DBusGConnection *connection, const char *object_path); - -GHashTable * nm_dhcp4_config_get_options (NMDHCP4Config *config); - -const char * nm_dhcp4_config_get_one_option (NMDHCP4Config *config, const char *option); - -G_END_DECLS - -#endif /* NM_DHCP4_CONFIG_H */ diff --git a/libnm-glib/nm-dhcp6-config.c b/libnm-glib/nm-dhcp6-config.c deleted file mode 100644 index c35fb3ba..00000000 --- a/libnm-glib/nm-dhcp6-config.c +++ /dev/null @@ -1,218 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2011 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-dhcp6-config.h" -#include "NetworkManager.h" -#include "nm-types-private.h" -#include "nm-object-private.h" -#include "nm-utils.h" - -G_DEFINE_TYPE (NMDHCP6Config, nm_dhcp6_config, NM_TYPE_OBJECT) - -#define NM_DHCP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DHCP6_CONFIG, NMDHCP6ConfigPrivate)) - -typedef struct { - DBusGProxy *proxy; - - GHashTable *options; -} NMDHCP6ConfigPrivate; - -enum { - PROP_0, - PROP_OPTIONS, - - LAST_PROP -}; - -static void -nm_dhcp6_config_init (NMDHCP6Config *config) -{ -} - -static gboolean -demarshal_dhcp6_options (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - NMDHCP6ConfigPrivate *priv = NM_DHCP6_CONFIG_GET_PRIVATE (object); - GHashTable *new_options; - GHashTableIter iter; - const char *key; - GValue *opt; - - g_hash_table_remove_all (priv->options); - - new_options = g_value_get_boxed (value); - if (new_options) { - g_hash_table_iter_init (&iter, new_options); - while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &opt)) - g_hash_table_insert (priv->options, g_strdup (key), g_value_dup_string (opt)); - } - - _nm_object_queue_notify (object, NM_DHCP6_CONFIG_OPTIONS); - return TRUE; -} - -static void -register_properties (NMDHCP6Config *config) -{ - NMDHCP6ConfigPrivate *priv = NM_DHCP6_CONFIG_GET_PRIVATE (config); - const NMPropertiesInfo property_info[] = { - { NM_DHCP6_CONFIG_OPTIONS, &priv->options, demarshal_dhcp6_options }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (config), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMDHCP6ConfigPrivate *priv = NM_DHCP6_CONFIG_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_dhcp6_config_parent_class)->constructed (object); - - priv->options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_DHCP6_CONFIG); - register_properties (NM_DHCP6_CONFIG (object)); -} - -static void -finalize (GObject *object) -{ - NMDHCP6ConfigPrivate *priv = NM_DHCP6_CONFIG_GET_PRIVATE (object); - - if (priv->options) - g_hash_table_destroy (priv->options); - - g_object_unref (priv->proxy); - - G_OBJECT_CLASS (nm_dhcp6_config_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMDHCP6Config *self = NM_DHCP6_CONFIG (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_OPTIONS: - g_value_set_boxed (value, nm_dhcp6_config_get_options (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_dhcp6_config_class_init (NMDHCP6ConfigClass *config_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (config_class); - - g_type_class_add_private (config_class, sizeof (NMDHCP6ConfigPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->finalize = finalize; - - /* properties */ - - /** - * NMDHCP6Config:options: (type GHashTable(utf8,GObject.Value)): - * - * The #GHashTable containing options of the configuration. - **/ - g_object_class_install_property - (object_class, PROP_OPTIONS, - g_param_spec_boxed (NM_DHCP6_CONFIG_OPTIONS, "", "", - G_TYPE_HASH_TABLE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} - -/** - * nm_dhcp6_config_new: - * @connection: the #DBusGConnection - * @object_path: the DBus object path of the device - * - * Creates a new #NMDHCP6Config. - * - * Returns: (transfer full): a new configuration - **/ -GObject * -nm_dhcp6_config_new (DBusGConnection *connection, const char *object_path) -{ - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (object_path != NULL, NULL); - - return (GObject *) g_object_new (NM_TYPE_DHCP6_CONFIG, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, object_path, - NULL); -} - -/** - * nm_dhcp6_config_get_options: - * @config: a #NMDHCP6Config - * - * Gets all the options contained in the configuration. - * - * Returns: (transfer none) (element-type utf8 GObject.Value): the #GHashTable containing strings for keys and values. - * This is the internal copy used by the configuration, and must not be modified. - **/ -GHashTable * -nm_dhcp6_config_get_options (NMDHCP6Config *config) -{ - g_return_val_if_fail (NM_IS_DHCP6_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_DHCP6_CONFIG_GET_PRIVATE (config)->options; -} - -/** - * nm_dhcp6_config_get_one_option: - * @config: a #NMDHCP6Config - * @option: the option to retrieve - * - * Gets one option by option name. - * - * Returns: the configuration option's value. This is the internal string used by the - * configuration, and must not be modified. - **/ -const char * -nm_dhcp6_config_get_one_option (NMDHCP6Config *config, const char *option) -{ - g_return_val_if_fail (NM_IS_DHCP6_CONFIG (config), NULL); - - return g_hash_table_lookup (nm_dhcp6_config_get_options (config), option); -} diff --git a/libnm-glib/nm-dhcp6-config.h b/libnm-glib/nm-dhcp6-config.h deleted file mode 100644 index 939b3fdb..00000000 --- a/libnm-glib/nm-dhcp6-config.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2010 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#ifndef NM_DHCP6_CONFIG_H -#define NM_DHCP6_CONFIG_H - -#include <glib.h> -#include <glib-object.h> -#include <dbus/dbus-glib.h> -#include "nm-object.h" - -G_BEGIN_DECLS - -#define NM_TYPE_DHCP6_CONFIG (nm_dhcp6_config_get_type ()) -#define NM_DHCP6_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DHCP6_CONFIG, NMDHCP6Config)) -#define NM_DHCP6_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DHCP6_CONFIG, NMDHCP6ConfigClass)) -#define NM_IS_DHCP6_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DHCP6_CONFIG)) -#define NM_IS_DHCP6_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DHCP6_CONFIG)) - -typedef struct { - NMObject parent; -} NMDHCP6Config; - -typedef struct { - NMObjectClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMDHCP6ConfigClass; - -#define NM_DHCP6_CONFIG_OPTIONS "options" - -GType nm_dhcp6_config_get_type (void); - -GObject *nm_dhcp6_config_new (DBusGConnection *connection, const char *object_path); - -GHashTable * nm_dhcp6_config_get_options (NMDHCP6Config *config); - -const char * nm_dhcp6_config_get_one_option (NMDHCP6Config *config, const char *option); - -G_END_DECLS - -#endif /* NM_DHCP6_CONFIG_H */ diff --git a/libnm-glib/nm-glib-enum-types.c.template b/libnm-glib/nm-glib-enum-types.c.template deleted file mode 100644 index 8bd4732e..00000000 --- a/libnm-glib/nm-glib-enum-types.c.template +++ /dev/null @@ -1,62 +0,0 @@ -/*** BEGIN file-header ***/ -#include "config.h" - -#include "nm-glib-enum-types.h" - -#include "nm-object.h" -#include "nm-client.h" -#include "nm-device.h" -#include "nm-device-ethernet.h" -#include "nm-device-infiniband.h" -#include "nm-device-adsl.h" -#include "nm-device-wifi.h" -#include "nm-device-bt.h" -#include "nm-device-olpc-mesh.h" -#include "nm-device-bond.h" -#include "nm-device-team.h" -#include "nm-device-bridge.h" -#include "nm-device-vlan.h" -#include "nm-device-generic.h" -#include "nm-access-point.h" -#include "nm-ip4-config.h" -#include "nm-device-modem.h" -#include "nm-vpn-connection.h" -#include "nm-types.h" -#include "nm-active-connection.h" -#include "nm-dhcp4-config.h" -#include "nm-ip6-config.h" -#include "nm-dhcp6-config.h" -#include "nm-remote-connection.h" -#include "nm-remote-settings.h" -#include "nm-secret-agent.h" -#include "nm-device-wimax.h" -#include "nm-wimax-nsp.h" -/*** END file-header ***/ - -/*** BEGIN value-header ***/ -GType -@enum_name@_get_type (void) -{ - static volatile gsize g_define_type_id__volatile = 0; - - if (g_once_init_enter (&g_define_type_id__volatile)) - { - static const G@Type@Value values[] = { -/*** END value-header ***/ - -/*** BEGIN value-production ***/ - { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, -/*** END value-production ***/ - -/*** BEGIN value-tail ***/ - { 0, NULL, NULL } - }; - GType g_define_type_id = - g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); - g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); - } - - return g_define_type_id__volatile; -} - -/*** END value-tail ***/ diff --git a/libnm-glib/nm-glib-enum-types.h.template b/libnm-glib/nm-glib-enum-types.h.template deleted file mode 100644 index c0699560..00000000 --- a/libnm-glib/nm-glib-enum-types.h.template +++ /dev/null @@ -1,21 +0,0 @@ -/*** BEGIN file-header ***/ -#ifndef __NM_GLIB_ENUM_TYPES_H__ -#define __NM_GLIB_ENUM_TYPES_H__ - -#include <glib-object.h> - -G_BEGIN_DECLS - -/*** END file-header ***/ - -/*** BEGIN enumeration-production ***/ -GType @enum_name@_get_type (void) G_GNUC_CONST; -#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) - -/*** END enumeration-production ***/ - -/*** BEGIN file-tail ***/ -G_END_DECLS - -#endif /* __NM_GLIB_ENUM_TYPES_H__ */ -/*** END file-tail ***/ diff --git a/libnm-glib/nm-ip4-config.c b/libnm-glib/nm-ip4-config.c deleted file mode 100644 index 8954ee7b..00000000 --- a/libnm-glib/nm-ip4-config.c +++ /dev/null @@ -1,472 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2011 Novell, Inc. - * Copyright 2008 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-setting-ip4-config.h" -#include "nm-ip4-config.h" -#include "NetworkManager.h" -#include "nm-types-private.h" -#include "nm-object-private.h" -#include "nm-utils.h" - -G_DEFINE_TYPE (NMIP4Config, nm_ip4_config, NM_TYPE_OBJECT) - -#define NM_IP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_IP4_CONFIG, NMIP4ConfigPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *gateway; - GSList *addresses; - GSList *routes; - GArray *nameservers; - GPtrArray *domains; - GPtrArray *searches; - GArray *wins; -} NMIP4ConfigPrivate; - -enum { - PROP_0, - PROP_GATEWAY, - PROP_ADDRESSES, - PROP_ROUTES, - PROP_NAMESERVERS, - PROP_DOMAINS, - PROP_SEARCHES, - PROP_WINS_SERVERS, - - LAST_PROP -}; - -static void -nm_ip4_config_init (NMIP4Config *config) -{ -} - -static gboolean -demarshal_ip4_address_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (object); - - g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip4_address_unref); - priv->addresses = NULL; - - priv->addresses = nm_utils_ip4_addresses_from_gvalue (value); - _nm_object_queue_notify (object, NM_IP4_CONFIG_ADDRESSES); - - return TRUE; -} - -static gboolean -demarshal_ip4_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - if (!_nm_uint_array_demarshal (value, (GArray **) field)) - return FALSE; - - if (!strcmp (pspec->name, NM_IP4_CONFIG_NAMESERVERS)) - _nm_object_queue_notify (object, NM_IP4_CONFIG_NAMESERVERS); - else if (!strcmp (pspec->name, NM_IP4_CONFIG_WINS_SERVERS)) - _nm_object_queue_notify (object, NM_IP4_CONFIG_WINS_SERVERS); - - return TRUE; -} - -static gboolean -demarshal_string_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - if (!_nm_string_array_demarshal (value, (GPtrArray **) field)) - return FALSE; - - _nm_object_queue_notify (object, pspec->name); - return TRUE; -} - -static gboolean -demarshal_ip4_routes_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (object); - - g_slist_free_full (priv->routes, (GDestroyNotify) nm_ip4_route_unref); - priv->routes = NULL; - - priv->routes = nm_utils_ip4_routes_from_gvalue (value); - _nm_object_queue_notify (object, NM_IP4_CONFIG_ROUTES); - - return TRUE; -} - -static void -register_properties (NMIP4Config *config) -{ - NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config); - const NMPropertiesInfo property_info[] = { - { NM_IP4_CONFIG_GATEWAY, &priv->gateway, }, - { NM_IP4_CONFIG_ADDRESSES, &priv->addresses, demarshal_ip4_address_array }, - { NM_IP4_CONFIG_ROUTES, &priv->routes, demarshal_ip4_routes_array }, - { NM_IP4_CONFIG_NAMESERVERS, &priv->nameservers, demarshal_ip4_array }, - { NM_IP4_CONFIG_DOMAINS, &priv->domains, demarshal_string_array }, - { NM_IP4_CONFIG_SEARCHES, &priv->searches, demarshal_string_array }, - { NM_IP4_CONFIG_WINS_SERVERS, &priv->wins, demarshal_ip4_array }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (config), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_ip4_config_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_IP4_CONFIG); - register_properties (NM_IP4_CONFIG (object)); -} - -static void -finalize (GObject *object) -{ - NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (object); - - g_free (priv->gateway); - - g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip4_address_unref); - g_slist_free_full (priv->routes, (GDestroyNotify) nm_ip4_route_unref); - - if (priv->nameservers) - g_array_free (priv->nameservers, TRUE); - - if (priv->wins) - g_array_free (priv->wins, TRUE); - - if (priv->domains) { - g_ptr_array_set_free_func (priv->domains, g_free); - g_ptr_array_free (priv->domains, TRUE); - } - - if (priv->searches) { - g_ptr_array_set_free_func (priv->searches, g_free); - g_ptr_array_free (priv->searches, TRUE); - } - - g_object_unref (priv->proxy); - - G_OBJECT_CLASS (nm_ip4_config_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMIP4Config *self = NM_IP4_CONFIG (object); - NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_GATEWAY: - g_value_set_string (value, nm_ip4_config_get_gateway (self)); - break; - case PROP_ADDRESSES: - nm_utils_ip4_addresses_to_gvalue (priv->addresses, value); - break; - case PROP_ROUTES: - nm_utils_ip4_routes_to_gvalue (priv->routes, value); - break; - case PROP_NAMESERVERS: - g_value_set_boxed (value, nm_ip4_config_get_nameservers (self)); - break; - case PROP_DOMAINS: - g_value_set_boxed (value, nm_ip4_config_get_domains (self)); - break; - case PROP_SEARCHES: - g_value_set_boxed (value, nm_ip4_config_get_searches (self)); - break; - case PROP_WINS_SERVERS: - g_value_set_boxed (value, nm_ip4_config_get_wins_servers (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_ip4_config_class_init (NMIP4ConfigClass *config_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (config_class); - - g_type_class_add_private (config_class, sizeof (NMIP4ConfigPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->finalize = finalize; - - /* properties */ - - /** - * NMIP4Config:gateway: - * - * The IP4 gateway address of the configuration as string. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_GATEWAY, - g_param_spec_string (NM_IP4_CONFIG_GATEWAY, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP4Config:addresses: - * - * The #GPtrArray containing #NMIP4Address<!-- -->es of the configuration. - **/ - g_object_class_install_property - (object_class, PROP_ADDRESSES, - g_param_spec_pointer (NM_IP4_CONFIG_ADDRESSES, "", "", - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP4Config:routes: - * - * The #GPtrArray containing #NMSettingIP4Route<!-- -->s of the configuration. - **/ - g_object_class_install_property - (object_class, PROP_ROUTES, - g_param_spec_pointer (NM_IP4_CONFIG_ROUTES, "", "", - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP4Config:nameservers: - * - * The #GArray containing name servers (#guint32s) of the configuration. - **/ - g_object_class_install_property - (object_class, PROP_NAMESERVERS, - g_param_spec_boxed (NM_IP4_CONFIG_NAMESERVERS, "", "", - NM_TYPE_UINT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP4Config:domains: - * - * The #GPtrArray containing domain strings of the configuration. - **/ - g_object_class_install_property - (object_class, PROP_DOMAINS, - g_param_spec_boxed (NM_IP4_CONFIG_DOMAINS, "", "", - NM_TYPE_STRING_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP4Config:searches: - * - * The #GPtrArray containing dns search strings of the configuration. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_SEARCHES, - g_param_spec_boxed (NM_IP4_CONFIG_SEARCHES, "", "", - NM_TYPE_STRING_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP4Config:wins-servers: - * - * The #GArray containing WINS servers (#guint32s) of the configuration. - **/ - g_object_class_install_property - (object_class, PROP_WINS_SERVERS, - g_param_spec_boxed (NM_IP4_CONFIG_WINS_SERVERS, "", "", - NM_TYPE_UINT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} - -/** - * nm_ip4_config_new: - * @connection: the #DBusGConnection - * @object_path: the DBus object path of the device - * - * Creates a new #NMIP4Config. - * - * Returns: (transfer full): a new IP4 configuration - **/ -GObject * -nm_ip4_config_new (DBusGConnection *connection, const char *object_path) -{ - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (object_path != NULL, NULL); - - return (GObject *) g_object_new (NM_TYPE_IP4_CONFIG, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, object_path, - NULL); -} - -/** - * nm_ip4_config_get_gateway: - * @config: a #NMIP4Config - * - * Gets the IP4 gateway address. - * - * Returns: the IP4 address of the gateway. - * - * Since: 0.9.10 - **/ -const char * -nm_ip4_config_get_gateway (NMIP4Config *config) -{ - g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_IP4_CONFIG_GET_PRIVATE (config)->gateway; -} - -/** - * nm_ip4_config_get_addresses: - * @config: a #NMIP4Config - * - * Gets the IP4 addresses (containing the address, prefix, and gateway). - * - * Returns: (element-type NMIP4Address): the #GSList containing #NMIP4Address<!-- -->es. - * This is the internal copy used by the configuration and must not be modified. - **/ -const GSList * -nm_ip4_config_get_addresses (NMIP4Config *config) -{ - g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_IP4_CONFIG_GET_PRIVATE (config)->addresses; -} - -/** - * nm_ip4_config_get_nameservers: - * @config: a #NMIP4Config - * - * Gets the domain name servers (DNS). - * - * Returns: (element-type guint32): the #GArray containing #guint32s. - * This is the internal copy used by the configuration and must not be - * modified. - **/ -const GArray * -nm_ip4_config_get_nameservers (NMIP4Config *config) -{ - g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_IP4_CONFIG_GET_PRIVATE (config)->nameservers; -} - -/** - * nm_ip4_config_get_domains: - * @config: a #NMIP4Config - * - * Gets the domain names. - * - * Returns: (element-type utf8): the #GPtrArray containing domains as strings. This is the - * internal copy used by the configuration, and must not be modified. - **/ -const GPtrArray * -nm_ip4_config_get_domains (NMIP4Config *config) -{ - g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return handle_ptr_array_return (NM_IP4_CONFIG_GET_PRIVATE (config)->domains); -} - -/** - * nm_ip4_config_get_searches: - * @config: a #NMIP4Config - * - * Gets the dns searches. - * - * Returns: (element-type utf8): the #GPtrArray containing dns searches as strings. This is the - * internal copy used by the configuration, and must not be modified. - * - * Since: 0.9.10 - **/ -const GPtrArray * -nm_ip4_config_get_searches (NMIP4Config *config) -{ - g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return handle_ptr_array_return (NM_IP4_CONFIG_GET_PRIVATE (config)->searches); -} - -/** - * nm_ip4_config_get_wins_servers: - * @config: a #NMIP4Config - * - * Gets the Windows Internet Name Service servers (WINS). - * - * Returns: (element-type guint32): the #GArray containing #guint32s. - * This is the internal copy used by the configuration and must not be - * modified. - **/ -const GArray * -nm_ip4_config_get_wins_servers (NMIP4Config *config) -{ - g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_IP4_CONFIG_GET_PRIVATE (config)->wins; -} - -/** - * nm_ip4_config_get_routes: - * @config: a #NMIP4Config - * - * Gets the routes. - * - * Returns: (element-type NMIP4Route): the #GSList containing - * #NMIP4Route<!-- -->s. This is the internal copy used by the configuration, - * and must not be modified. - **/ -const GSList * -nm_ip4_config_get_routes (NMIP4Config *config) -{ - g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_IP4_CONFIG_GET_PRIVATE (config)->routes; -} diff --git a/libnm-glib/nm-ip4-config.h b/libnm-glib/nm-ip4-config.h deleted file mode 100644 index 58b6b371..00000000 --- a/libnm-glib/nm-ip4-config.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2008 Red Hat, Inc. - */ - -#ifndef NM_IP4_CONFIG_H -#define NM_IP4_CONFIG_H - -#include <glib.h> -#include <glib-object.h> -#include <dbus/dbus-glib.h> -#include "nm-object.h" - -G_BEGIN_DECLS - -#define NM_TYPE_IP4_CONFIG (nm_ip4_config_get_type ()) -#define NM_IP4_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_IP4_CONFIG, NMIP4Config)) -#define NM_IP4_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_IP4_CONFIG, NMIP4ConfigClass)) -#define NM_IS_IP4_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_IP4_CONFIG)) -#define NM_IS_IP4_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_IP4_CONFIG)) -#define NM_IP4_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_IP4_CONFIG, NMIP4ConfigClass)) - -typedef struct { - NMObject parent; -} NMIP4Config; - -typedef struct { - NMObjectClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMIP4ConfigClass; - -#define NM_IP4_CONFIG_GATEWAY "gateway" -#define NM_IP4_CONFIG_ADDRESSES "addresses" -#define NM_IP4_CONFIG_ROUTES "routes" -#define NM_IP4_CONFIG_NAMESERVERS "nameservers" -#define NM_IP4_CONFIG_DOMAINS "domains" -#define NM_IP4_CONFIG_SEARCHES "searches" -#define NM_IP4_CONFIG_WINS_SERVERS "wins-servers" - -GType nm_ip4_config_get_type (void); - -GObject *nm_ip4_config_new (DBusGConnection *connection, const char *object_path); - -NM_AVAILABLE_IN_0_9_10 -const char * nm_ip4_config_get_gateway (NMIP4Config *config); -const GSList * nm_ip4_config_get_addresses (NMIP4Config *config); -const GSList * nm_ip4_config_get_routes (NMIP4Config *config); -const GArray * nm_ip4_config_get_nameservers (NMIP4Config *config); -const GPtrArray *nm_ip4_config_get_domains (NMIP4Config *config); -NM_AVAILABLE_IN_0_9_10 -const GPtrArray *nm_ip4_config_get_searches (NMIP4Config *config); -const GArray * nm_ip4_config_get_wins_servers (NMIP4Config *config); - -G_END_DECLS - -#endif /* NM_IP4_CONFIG_H */ diff --git a/libnm-glib/nm-ip6-config.c b/libnm-glib/nm-ip6-config.c deleted file mode 100644 index b655b239..00000000 --- a/libnm-glib/nm-ip6-config.c +++ /dev/null @@ -1,498 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2008 - 2014 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-setting-ip6-config.h" -#include "nm-ip6-config.h" -#include "NetworkManager.h" -#include "nm-types-private.h" -#include "nm-object-private.h" -#include "nm-utils.h" - -G_DEFINE_TYPE (NMIP6Config, nm_ip6_config, NM_TYPE_OBJECT) - -#define NM_IP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_IP6_CONFIG, NMIP6ConfigPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *gateway; - GSList *addresses; - GSList *routes; - GSList *nameservers; - GPtrArray *domains; - GPtrArray *searches; -} NMIP6ConfigPrivate; - -enum { - PROP_0, - PROP_GATEWAY, - PROP_ADDRESSES, - PROP_ROUTES, - PROP_NAMESERVERS, - PROP_DOMAINS, - PROP_SEARCHES, - - LAST_PROP -}; - -/** - * nm_ip6_config_new: - * @connection: the #DBusGConnection - * @object_path: the DBus object path of the device - * - * Creates a new #NMIP6Config. - * - * Returns: (transfer full): a new IP6 configuration - **/ -GObject * -nm_ip6_config_new (DBusGConnection *connection, const char *object_path) -{ - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (object_path != NULL, NULL); - - return (GObject *) g_object_new (NM_TYPE_IP6_CONFIG, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, object_path, - NULL); -} - -static gboolean -demarshal_ip6_address_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (object); - - g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip6_address_unref); - priv->addresses = NULL; - - priv->addresses = nm_utils_ip6_addresses_from_gvalue (value); - _nm_object_queue_notify (object, NM_IP6_CONFIG_ADDRESSES); - - return TRUE; -} - -static gboolean -demarshal_ip6_nameserver_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - if (!_nm_ip6_address_array_demarshal (value, (GSList **) field)) - return FALSE; - - if (pspec && !strcmp (pspec->name, NM_IP6_CONFIG_NAMESERVERS)) - _nm_object_queue_notify (object, NM_IP6_CONFIG_NAMESERVERS); - - return TRUE; -} - -static gboolean -demarshal_domains (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - if (!_nm_string_array_demarshal (value, (GPtrArray **) field)) - return FALSE; - - _nm_object_queue_notify (object, NM_IP6_CONFIG_DOMAINS); - return TRUE; -} - -static gboolean -demarshal_searches (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - if (!_nm_string_array_demarshal (value, (GPtrArray **) field)) - return FALSE; - - _nm_object_queue_notify (object, NM_IP6_CONFIG_SEARCHES); - return TRUE; -} - -static gboolean -demarshal_ip6_routes_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field) -{ - NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (object); - - g_slist_free_full (priv->routes, (GDestroyNotify) nm_ip6_route_unref); - priv->routes = NULL; - - priv->routes = nm_utils_ip6_routes_from_gvalue (value); - _nm_object_queue_notify (object, NM_IP6_CONFIG_ROUTES); - - return TRUE; -} - -static void -register_properties (NMIP6Config *config) -{ - NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config); - const NMPropertiesInfo property_info[] = { - { NM_IP6_CONFIG_GATEWAY, &priv->gateway, }, - { NM_IP6_CONFIG_ADDRESSES, &priv->addresses, demarshal_ip6_address_array }, - { NM_IP6_CONFIG_ROUTES, &priv->routes, demarshal_ip6_routes_array }, - { NM_IP6_CONFIG_NAMESERVERS, &priv->nameservers, demarshal_ip6_nameserver_array }, - { NM_IP6_CONFIG_DOMAINS, &priv->domains, demarshal_domains }, - { NM_IP6_CONFIG_SEARCHES, &priv->searches, demarshal_searches }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (config), - priv->proxy, - property_info); -} - -/** - * nm_ip6_config_get_gateway: - * @config: a #NMIP6Config - * - * Gets the IP6 gateway. - * - * Returns: the IPv6 gateway of the configuration. - * - * Since: 0.9.10 - **/ -const char * -nm_ip6_config_get_gateway (NMIP6Config *config) -{ - g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_IP6_CONFIG_GET_PRIVATE (config)->gateway; -} - -/** - * nm_ip6_config_get_addresses: - * @config: a #NMIP6Config - * - * Gets the IP6 addresses (containing the address, prefix, and gateway). - * - * Returns: (element-type NMIP6Address): the #GSList containing - * #NMIP6Address<!-- -->es. This is the internal copy used by the configuration - * and must not be modified. - **/ -const GSList * -nm_ip6_config_get_addresses (NMIP6Config *config) -{ - g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_IP6_CONFIG_GET_PRIVATE (config)->addresses; -} - -/** - * nm_ip6_config_get_num_nameservers: - * @config: a #NMIP6Config - * - * Gets the number of the domain name servers in the configuration. - * - * Returns: the number of domain name servers - * - * Since: 0.9.10 - **/ -guint32 -nm_ip6_config_get_num_nameservers (NMIP6Config *config) -{ - g_return_val_if_fail (NM_IS_IP6_CONFIG (config), 0); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return g_slist_length (NM_IP6_CONFIG_GET_PRIVATE (config)->nameservers); -} - -/** - * nm_ip6_config_get_nameserver: - * @config: a #NMIP6Config - * @idx: index of the nameserver to return - * - * Gets the domain name server at index @idx in the configuration. - * - * Returns: (array fixed-size=16) (element-type guint8) (transfer none): - * the IPv6 address of domain name server at index @iidx - * - * Since: 0.9.10 - **/ -const struct in6_addr * -nm_ip6_config_get_nameserver (NMIP6Config *config, guint32 idx) -{ - NMIP6ConfigPrivate *priv; - GSList *item; - guint32 i = 0; - - g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - priv = NM_IP6_CONFIG_GET_PRIVATE (config); - - for (item = priv->nameservers; item && i < idx; i++) - item = item->next; - - g_return_val_if_fail (item, NULL); - return item ? (const struct in6_addr *) item->data : NULL; -} - -/* FIXME: like in libnm_util, in6_addr is not introspectable, so skipping here */ -/** - * nm_ip6_config_get_nameservers: (skip) - * @config: a #NMIP6Config - * - * Gets the domain name servers (DNS). - * - * Returns: a #GSList containing elements of type 'struct in6_addr' which - * contain the addresses of nameservers of the configuration. This is the - * internal copy used by the configuration and must not be modified. - **/ -const GSList * -nm_ip6_config_get_nameservers (NMIP6Config *config) -{ - g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_IP6_CONFIG_GET_PRIVATE (config)->nameservers; -} - -/** - * nm_ip6_config_get_domains: - * @config: a #NMIP6Config - * - * Gets the domain names. - * - * Returns: (element-type utf8): the #GPtrArray containing domains as strings. - * This is the internal copy used by the configuration, and must not be modified. - **/ -const GPtrArray * -nm_ip6_config_get_domains (NMIP6Config *config) -{ - g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return handle_ptr_array_return (NM_IP6_CONFIG_GET_PRIVATE (config)->domains); -} - -/** - * nm_ip6_config_get_searches: - * @config: a #NMIP6Config - * - * Gets the dns searches. - * - * Returns: (element-type utf8): the #GPtrArray containing dns searches as strings. - * This is the internal copy used by the configuration, and must not be modified. - * - * Since: 0.9.10 - **/ -const GPtrArray * -nm_ip6_config_get_searches (NMIP6Config *config) -{ - g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return handle_ptr_array_return (NM_IP6_CONFIG_GET_PRIVATE (config)->searches); -} - -/** - * nm_ip6_config_get_routes: - * @config: a #NMIP6Config - * - * Gets the routes. - * - * Returns: (element-type NMIP6Route): the #GSList containing - * #NMIP6Route<!-- -->s. This is the internal copy used by the configuration, - * and must not be modified. - **/ -const GSList * -nm_ip6_config_get_routes (NMIP6Config *config) -{ - g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL); - - _nm_object_ensure_inited (NM_OBJECT (config)); - return NM_IP6_CONFIG_GET_PRIVATE (config)->routes; -} - -static void -constructed (GObject *object) -{ - NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_ip6_config_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_IP6_CONFIG); - register_properties (NM_IP6_CONFIG (object)); -} - -static void -finalize (GObject *object) -{ - NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (object); - - g_free (priv->gateway); - - g_slist_free_full (priv->addresses, (GDestroyNotify) nm_ip6_address_unref); - g_slist_free_full (priv->routes, (GDestroyNotify) nm_ip6_route_unref); - g_slist_free_full (priv->nameservers, g_free); - - if (priv->domains) { - g_ptr_array_set_free_func (priv->domains, g_free); - g_ptr_array_free (priv->domains, TRUE); - } - - if (priv->searches) { - g_ptr_array_set_free_func (priv->searches, g_free); - g_ptr_array_free (priv->searches, TRUE); - } - - g_object_unref (priv->proxy); - - G_OBJECT_CLASS (nm_ip6_config_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMIP6Config *self = NM_IP6_CONFIG (object); - NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (self); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_GATEWAY: - g_value_set_string (value, nm_ip6_config_get_gateway (self)); - break; - case PROP_ADDRESSES: - nm_utils_ip6_addresses_to_gvalue (priv->addresses, value); - break; - case PROP_ROUTES: - nm_utils_ip6_routes_to_gvalue (priv->routes, value); - break; - case PROP_NAMESERVERS: - g_value_set_boxed (value, nm_ip6_config_get_nameservers (self)); - break; - case PROP_DOMAINS: - g_value_set_boxed (value, nm_ip6_config_get_domains (self)); - break; - case PROP_SEARCHES: - g_value_set_boxed (value, nm_ip6_config_get_searches (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_ip6_config_init (NMIP6Config *config) -{ -} - -static void -nm_ip6_config_class_init (NMIP6ConfigClass *config_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (config_class); - - g_type_class_add_private (config_class, sizeof (NMIP6ConfigPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->finalize = finalize; - - /* properties */ - - /** - * NMIP6Config:gateway: - * - * The IPv6 gateway as string - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_GATEWAY, - g_param_spec_string (NM_IP6_CONFIG_GATEWAY, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP6Config:addresses: - * - * The #GPtrArray containing the IPv6 addresses; use - * nm_utils_ip6_addresses_from_gvalue() to return a #GSList of - * #NMSettingIP6Address objects that is more usable than the raw data. - **/ - g_object_class_install_property - (object_class, PROP_ADDRESSES, - g_param_spec_boxed (NM_IP6_CONFIG_ADDRESSES, "", "", - NM_TYPE_IP6_ADDRESS_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP6Config:routes: - * - * The #GPtrArray containing the IPv6 routes; use - * nm_utils_ip6_routes_from_gvalue() to return a #GSList of - * #NMSettingIP6Address objects that is more usable than the raw data. - **/ - g_object_class_install_property - (object_class, PROP_ROUTES, - g_param_spec_boxed (NM_IP6_CONFIG_ROUTES, "", "", - NM_TYPE_IP6_ROUTE_OBJECT_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP6Config:nameservers: - * - * The #GPtrArray containing elements of type 'struct ip6_addr' which - * contain the addresses of nameservers of the configuration. - **/ - g_object_class_install_property - (object_class, PROP_NAMESERVERS, - g_param_spec_boxed (NM_IP6_CONFIG_NAMESERVERS, "", "", - NM_TYPE_IP6_ADDRESS_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP6Config:domains: - * - * The #GPtrArray containing domain strings of the configuration. - **/ - g_object_class_install_property - (object_class, PROP_DOMAINS, - g_param_spec_boxed (NM_IP6_CONFIG_DOMAINS, "", "", - NM_TYPE_STRING_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMIP6Config:searches: - * - * The #GPtrArray containing dns search strings of the configuration. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_SEARCHES, - g_param_spec_boxed (NM_IP6_CONFIG_SEARCHES, "", "", - NM_TYPE_STRING_ARRAY, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - -} diff --git a/libnm-glib/nm-ip6-config.h b/libnm-glib/nm-ip6-config.h deleted file mode 100644 index 7a64805b..00000000 --- a/libnm-glib/nm-ip6-config.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2008 - 2014 Red Hat, Inc. - */ - -#ifndef NM_IP6_CONFIG_H -#define NM_IP6_CONFIG_H - -#include <glib.h> -#include <glib-object.h> -#include <dbus/dbus-glib.h> -#include "nm-object.h" - -G_BEGIN_DECLS - -#define NM_TYPE_IP6_CONFIG (nm_ip6_config_get_type ()) -#define NM_IP6_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_IP6_CONFIG, NMIP6Config)) -#define NM_IP6_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_IP6_CONFIG, NMIP6ConfigClass)) -#define NM_IS_IP6_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_IP6_CONFIG)) -#define NM_IS_IP6_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_IP6_CONFIG)) -#define NM_IP6_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_IP6_CONFIG, NMIP6ConfigClass)) - -typedef struct { - NMObject parent; -} NMIP6Config; - -typedef struct { - NMObjectClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMIP6ConfigClass; - -#define NM_IP6_CONFIG_GATEWAY "gateway" -#define NM_IP6_CONFIG_ADDRESSES "addresses" -#define NM_IP6_CONFIG_ROUTES "routes" -#define NM_IP6_CONFIG_NAMESERVERS "nameservers" -#define NM_IP6_CONFIG_DOMAINS "domains" -#define NM_IP6_CONFIG_SEARCHES "searches" - -GType nm_ip6_config_get_type (void); - -GObject *nm_ip6_config_new (DBusGConnection *connection, const char *object_path); - -NM_AVAILABLE_IN_0_9_10 -const char * nm_ip6_config_get_gateway (NMIP6Config *config); -const GSList * nm_ip6_config_get_addresses (NMIP6Config *config); -const GSList * nm_ip6_config_get_routes (NMIP6Config *config); -NM_AVAILABLE_IN_0_9_10 -guint32 nm_ip6_config_get_num_nameservers (NMIP6Config *config); -NM_AVAILABLE_IN_0_9_10 -const struct in6_addr *nm_ip6_config_get_nameserver (NMIP6Config *config, guint32 idx); -const GSList * nm_ip6_config_get_nameservers (NMIP6Config *config); -const GPtrArray * nm_ip6_config_get_domains (NMIP6Config *config); -NM_AVAILABLE_IN_0_9_10 -const GPtrArray * nm_ip6_config_get_searches (NMIP6Config *config); - -G_END_DECLS - -#endif /* NM_IP6_CONFIG_H */ diff --git a/libnm-glib/nm-object-cache.c b/libnm-glib/nm-object-cache.c deleted file mode 100644 index fa56ace5..00000000 --- a/libnm-glib/nm-object-cache.c +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-object-cache.h" -#include "nm-object.h" - -static GHashTable *cache = NULL; - -static void -_init_cache (void) -{ - if (G_UNLIKELY (cache == NULL)) - cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); -} - -static void -_nm_object_cache_remove_by_path (char *path) -{ - _init_cache (); - g_hash_table_remove (cache, path); - g_free (path); -} - -void -_nm_object_cache_add (NMObject *object) -{ - char *path; - - _init_cache (); - path = g_strdup (nm_object_get_path (object)); - g_hash_table_insert (cache, path, object); - g_object_set_data_full (G_OBJECT (object), "nm-object-cache-tag", - g_strdup (path), (GDestroyNotify) _nm_object_cache_remove_by_path); -} - -NMObject * -_nm_object_cache_get (const char *path) -{ - NMObject *object; - - _init_cache (); - object = g_hash_table_lookup (cache, path); - return object ? g_object_ref (object) : NULL; -} - -void -_nm_object_cache_clear (void) -{ - GHashTableIter iter; - GObject *obj; - const char *path; - char *foo; - - if (!cache) - return; - - g_hash_table_iter_init (&iter, cache); - while (g_hash_table_iter_next (&iter, (gpointer) &path, (gpointer) &obj)) { - /* Remove the callback so that if the object isn't yet released - * by a client, when it does finally get unrefed, it won't trigger - * the cache removal for a new object with the same path as the - * one being released. - */ - foo = g_object_steal_data (obj, "nm-object-cache-tag"); - g_free (foo); - - g_hash_table_iter_remove (&iter); - } -} diff --git a/libnm-glib/nm-object-cache.h b/libnm-glib/nm-object-cache.h deleted file mode 100644 index 03229d56..00000000 --- a/libnm-glib/nm-object-cache.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 Red Hat, Inc. - */ - -#ifndef NM_OBJECT_CACHE_H -#define NM_OBJECT_CACHE_H - -#include "nm-object.h" - -G_BEGIN_DECLS - -/* Returns referenced object from the cache */ -NMObject *_nm_object_cache_get (const char *path); -void _nm_object_cache_add (NMObject *object); -void _nm_object_cache_clear (void); - -G_END_DECLS - -#endif /* NM_OBJECT_CACHE_H */ diff --git a/libnm-glib/nm-object-private.h b/libnm-glib/nm-object-private.h deleted file mode 100644 index 87141aab..00000000 --- a/libnm-glib/nm-object-private.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2011 Red Hat, Inc. - */ - -#ifndef NM_OBJECT_PRIVATE_H -#define NM_OBJECT_PRIVATE_H - -#include "nm-object.h" - -void _nm_object_ensure_inited (NMObject *object); - -typedef gboolean (*PropertyMarshalFunc) (NMObject *object, - GParamSpec *pspec, - GValue *value, - gpointer field); - -typedef struct { - const char *name; - gpointer field; - PropertyMarshalFunc func; - GType object_type; - const char *signal_prefix; -} NMPropertiesInfo; - -DBusGProxy *_nm_object_new_proxy (NMObject *self, - const char *path, - const char *interface); - -void _nm_object_register_properties (NMObject *object, - DBusGProxy *proxy, - const NMPropertiesInfo *info); - -gboolean _nm_object_reload_properties (NMObject *object, GError **error); - -void _nm_object_reload_properties_async (NMObject *object, - GAsyncReadyCallback callback, - gpointer user_data); -gboolean _nm_object_reload_properties_finish (NMObject *object, - GAsyncResult *result, - GError **error); - -void _nm_object_queue_notify (NMObject *object, const char *property); - -void _nm_object_suppress_property_updates (NMObject *object, gboolean suppress); - -/* DBus property accessors */ - -void _nm_object_reload_property (NMObject *object, - const char *interface, - const char *prop_name); - -void _nm_object_set_property (NMObject *object, - const char *interface, - const char *prop_name, - GValue *value); - -static inline const GPtrArray * -handle_ptr_array_return (GPtrArray *array) -{ - /* zero-length is special-case; return NULL */ - if (!array || !array->len) - return NULL; - return array; -} - -/* object demarshalling support */ -typedef GType (*NMObjectTypeFunc) (DBusGConnection *connection, const char *path); -typedef void (*NMObjectTypeCallbackFunc) (GType type, gpointer user_data); -typedef void (*NMObjectTypeAsyncFunc) (DBusGConnection *connection, - const char *path, - NMObjectTypeCallbackFunc callback, - gpointer user_data); - -void _nm_object_register_type_func (GType base_type, NMObjectTypeFunc type_func, - NMObjectTypeAsyncFunc type_async_func); - -#endif /* NM_OBJECT_PRIVATE_H */ diff --git a/libnm-glib/nm-object.c b/libnm-glib/nm-object.c deleted file mode 100644 index 967400e7..00000000 --- a/libnm-glib/nm-object.c +++ /dev/null @@ -1,1576 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -#include "nm-utils.h" -#include "NetworkManager.h" -#include "nm-object.h" -#include "nm-object-cache.h" -#include "nm-object-private.h" -#include "nm-dbus-glib-types.h" -#include "nm-types.h" -#include "nm-dbus-helpers-private.h" - -static gboolean debug = FALSE; -#define dbgmsg(f,...) if (G_UNLIKELY (debug)) { g_message (f, ## __VA_ARGS__ ); } - -static void nm_object_initable_iface_init (GInitableIface *iface); -static void nm_object_async_initable_iface_init (GAsyncInitableIface *iface); - -static GHashTable *type_funcs, *type_async_funcs; - -G_DEFINE_ABSTRACT_TYPE_WITH_CODE (NMObject, nm_object, G_TYPE_OBJECT, - type_funcs = g_hash_table_new (NULL, NULL); - type_async_funcs = g_hash_table_new (NULL, NULL); - G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, nm_object_initable_iface_init); - G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, nm_object_async_initable_iface_init); - ) - -#define NM_OBJECT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_OBJECT, NMObjectPrivate)) - -typedef struct { - PropertyMarshalFunc func; - GType object_type; - gpointer field; - const char *signal_prefix; -} PropertyInfo; - -static void reload_complete (NMObject *object, gboolean emit_now); - -typedef struct { - DBusGConnection *connection; - DBusGProxy *bus_proxy; - gboolean nm_running; - - char *path; - DBusGProxy *properties_proxy; - GSList *property_interfaces; - GSList *property_tables; - NMObject *parent; - gboolean suppress_property_updates; - - GSList *notify_items; - guint32 notify_id; - gboolean inited; - - GSList *reload_results; - guint reload_remaining; - GError *reload_error; -} NMObjectPrivate; - -enum { - PROP_0, - PROP_DBUS_CONNECTION, - PROP_DBUS_PATH, - - LAST_PROP -}; - -enum { - OBJECT_CREATION_FAILED, - - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -/** - * nm_object_error_quark: - * - * Registers an error quark for #NMObject if necessary. - * - * Returns: the error quark used for #NMObject errors. - **/ -GQuark -nm_object_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-object-error-quark"); - return quark; -} - -typedef enum { - NOTIFY_SIGNAL_PENDING_NONE, - NOTIFY_SIGNAL_PENDING_ADDED, - NOTIFY_SIGNAL_PENDING_REMOVED, - NOTIFY_SIGNAL_PENDING_ADDED_REMOVED, -} NotifySignalPending; - -typedef struct { - const char *property; - const char *signal_prefix; - NotifySignalPending pending; - NMObject *changed; -} NotifyItem; - -static void -notify_item_free (NotifyItem *item) -{ - g_clear_object (&item->changed); - g_slice_free (NotifyItem, item); -} - -static void -proxy_name_owner_changed (DBusGProxy *proxy, - const char *name, - const char *old_owner, - const char *new_owner, - gpointer user_data) -{ - NMObject *self = NM_OBJECT (user_data); - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (self); - - if (g_strcmp0 (name, NM_DBUS_SERVICE) == 0) { - gboolean old_good = (old_owner && old_owner[0]); - gboolean new_good = (new_owner && new_owner[0]); - - if (!old_good && new_good) - priv->nm_running = TRUE; - else if (old_good && !new_good) - priv->nm_running = FALSE; - } -} - -static void -nm_object_init (NMObject *object) -{ -} - -static GObject* -constructor (GType type, - guint n_construct_params, - GObjectConstructParam *construct_params) -{ - GObject *object; - NMObjectPrivate *priv; - - object = G_OBJECT_CLASS (nm_object_parent_class)->constructor (type, - n_construct_params, - construct_params); - - priv = NM_OBJECT_GET_PRIVATE (object); - - if (priv->connection == NULL) { - GError *error = NULL; - - priv->connection = _nm_dbus_new_connection (&error); - - if (priv->connection == NULL) { - g_warning ("Error connecting to system bus: %s", error->message); - g_clear_error (&error); - g_object_unref (object); - return NULL; - } - } - - g_assert (priv->connection != NULL); - - if (priv->path == NULL) { - g_warn_if_reached (); - g_object_unref (object); - return NULL; - } - - return object; -} - -static void -constructed (GObject *object) -{ - NMObject *self = NM_OBJECT (object); - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - - if (G_OBJECT_CLASS (nm_object_parent_class)->constructed) - G_OBJECT_CLASS (nm_object_parent_class)->constructed (object); - - priv->properties_proxy = _nm_object_new_proxy (self, NULL, DBUS_INTERFACE_PROPERTIES); - - priv->bus_proxy = dbus_g_proxy_new_for_name (priv->connection, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS); - g_assert (priv->bus_proxy); - - dbus_g_proxy_add_signal (priv->bus_proxy, "NameOwnerChanged", - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->bus_proxy, - "NameOwnerChanged", - G_CALLBACK (proxy_name_owner_changed), - object, NULL); -} - -static gboolean -init_sync (GInitable *initable, GCancellable *cancellable, GError **error) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (initable); - - if (priv->bus_proxy) { - if (!dbus_g_proxy_call (priv->bus_proxy, - "NameHasOwner", error, - G_TYPE_STRING, NM_DBUS_SERVICE, - G_TYPE_INVALID, - G_TYPE_BOOLEAN, &priv->nm_running, - G_TYPE_INVALID)) - return FALSE; - } - - priv->inited = TRUE; - return _nm_object_reload_properties (NM_OBJECT (initable), error); -} - -/* Takes ownership of @error */ -static void -init_async_complete (GSimpleAsyncResult *simple, GError *error) -{ - if (error) - g_simple_async_result_take_error (simple, error); - else - g_simple_async_result_set_op_res_gboolean (simple, TRUE); - g_simple_async_result_complete (simple); - g_object_unref (simple); -} - -static void -init_async_got_properties (GObject *object, GAsyncResult *result, gpointer user_data) -{ - GSimpleAsyncResult *simple = user_data; - GError *error = NULL; - - NM_OBJECT_GET_PRIVATE (object)->inited = TRUE; - if (!_nm_object_reload_properties_finish (NM_OBJECT (object), result, &error)) - g_assert (error); - init_async_complete (simple, error); -} - -static void -init_async_got_manager_running (DBusGProxy *proxy, DBusGProxyCall *call, - gpointer user_data) -{ - GSimpleAsyncResult *simple = user_data; - NMObject *self; - NMObjectPrivate *priv; - GError *error = NULL; - - self = NM_OBJECT (g_async_result_get_source_object (G_ASYNC_RESULT (simple))); - priv = NM_OBJECT_GET_PRIVATE (self); - - if (!dbus_g_proxy_end_call (proxy, call, &error, - G_TYPE_BOOLEAN, &priv->nm_running, - G_TYPE_INVALID)) { - init_async_complete (simple, error); - } else if (!priv->nm_running) { - priv->inited = TRUE; - init_async_complete (simple, NULL); - } else - _nm_object_reload_properties_async (self, init_async_got_properties, simple); - - /* g_async_result_get_source_object() adds a ref */ - g_object_unref (self); -} - -static void -init_async (GAsyncInitable *initable, int io_priority, - GCancellable *cancellable, GAsyncReadyCallback callback, - gpointer user_data) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (initable); - GSimpleAsyncResult *simple; - - simple = g_simple_async_result_new (G_OBJECT (initable), callback, user_data, init_async); - if (cancellable) - g_simple_async_result_set_check_cancellable (simple, cancellable); - - /* Check if NM is running */ - dbus_g_proxy_begin_call (priv->bus_proxy, "NameHasOwner", - init_async_got_manager_running, - simple, NULL, - G_TYPE_STRING, NM_DBUS_SERVICE, - G_TYPE_INVALID); -} - -static gboolean -init_finish (GAsyncInitable *initable, GAsyncResult *result, GError **error) -{ - GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); - - if (g_simple_async_result_propagate_error (simple, error)) - return FALSE; - else - return TRUE; -} - -static void -dispose (GObject *object) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - - if (priv->notify_id) { - g_source_remove (priv->notify_id); - priv->notify_id = 0; - } - - g_slist_free_full (priv->notify_items, (GDestroyNotify) notify_item_free); - priv->notify_items = NULL; - - g_slist_free_full (priv->property_interfaces, g_free); - priv->property_interfaces = NULL; - - g_clear_object (&priv->properties_proxy); - g_clear_object (&priv->bus_proxy); - - if (priv->connection) { - dbus_g_connection_unref (priv->connection); - priv->connection = NULL; - } - - G_OBJECT_CLASS (nm_object_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - - g_slist_free_full (priv->property_tables, (GDestroyNotify) g_hash_table_destroy); - g_free (priv->path); - - G_OBJECT_CLASS (nm_object_parent_class)->finalize (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_DBUS_CONNECTION: - /* construct-only */ - priv->connection = g_value_dup_boxed (value); - break; - case PROP_DBUS_PATH: - /* construct-only */ - priv->path = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_DBUS_CONNECTION: - g_value_set_boxed (value, priv->connection); - break; - case PROP_DBUS_PATH: - g_value_set_string (value, priv->path); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_object_class_init (NMObjectClass *nm_object_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (nm_object_class); - - g_type_class_add_private (nm_object_class, sizeof (NMObjectPrivate)); - - /* virtual methods */ - object_class->constructor = constructor; - object_class->constructed = constructed; - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->dispose = dispose; - object_class->finalize = finalize; - - /* Properties */ - - /** - * NMObject:connection: - * - * The #DBusGConnection of the object. - **/ - g_object_class_install_property - (object_class, PROP_DBUS_CONNECTION, - g_param_spec_boxed (NM_OBJECT_DBUS_CONNECTION, "", "", - DBUS_TYPE_G_CONNECTION, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - /** - * NMObject:path: - * - * The DBus object path. - **/ - g_object_class_install_property - (object_class, PROP_DBUS_PATH, - g_param_spec_string (NM_OBJECT_DBUS_PATH, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - /* signals */ - - /** - * NMObject::object-creation-failed: - * @master_object: the object that received the signal - * @error: the error that occurred while creating object - * @failed_path: object path of the failed object - * - * Indicates that an error occurred while creating an #NMObject object - * during property handling of @master_object. - * - * Note: Be aware that the signal is private for libnm-glib's internal - * use. - **/ - signals[OBJECT_CREATION_FAILED] = - g_signal_new ("object-creation-failed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMObjectClass, object_creation_failed), - NULL, NULL, NULL, - G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); -} - -static void -nm_object_initable_iface_init (GInitableIface *iface) -{ - iface->init = init_sync; -} - -static void -nm_object_async_initable_iface_init (GAsyncInitableIface *iface) -{ - iface->init_async = init_async; - iface->init_finish = init_finish; -} - -/** - * nm_object_get_connection: - * @object: a #NMObject - * - * Gets the #NMObject's DBusGConnection. - * - * Returns: (transfer none): the connection - **/ -DBusGConnection * -nm_object_get_connection (NMObject *object) -{ - g_return_val_if_fail (NM_IS_OBJECT (object), NULL); - - return NM_OBJECT_GET_PRIVATE (object)->connection; -} - -/** - * nm_object_get_path: - * @object: a #NMObject - * - * Gets the DBus path of the #NMObject. - * - * Returns: the object's path. This is the internal string used by the - * device, and must not be modified. - **/ -const char * -nm_object_get_path (NMObject *object) -{ - g_return_val_if_fail (NM_IS_OBJECT (object), NULL); - - return NM_OBJECT_GET_PRIVATE (object)->path; -} - -static gboolean -deferred_notify_cb (gpointer data) -{ - NMObject *object = NM_OBJECT (data); - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - NMObjectClass *object_class = NM_OBJECT_GET_CLASS (object); - GSList *props, *iter; - - priv->notify_id = 0; - - /* Wait until all reloads are done before notifying */ - if (priv->reload_remaining) - return G_SOURCE_REMOVE; - - /* Clear priv->notify_items early so that an NMObject subclass that - * listens to property changes can queue up other property changes - * during the g_object_notify() call separately from the property - * list we're iterating. - */ - props = g_slist_reverse (priv->notify_items); - priv->notify_items = NULL; - - g_object_ref (object); - - /* Emit property change notifications first */ - for (iter = props; iter; iter = g_slist_next (iter)) { - NotifyItem *item = iter->data; - - if (item->property) - g_object_notify (G_OBJECT (object), item->property); - } - - /* And added/removed signals second */ - for (iter = props; iter; iter = g_slist_next (iter)) { - NotifyItem *item = iter->data; - char buf[50]; - int ret = 0; - - switch (item->pending) { - case NOTIFY_SIGNAL_PENDING_ADDED: - ret = g_snprintf (buf, sizeof (buf), "%s-added", item->signal_prefix); - break; - case NOTIFY_SIGNAL_PENDING_REMOVED: - ret = g_snprintf (buf, sizeof (buf), "%s-removed", item->signal_prefix); - break; - case NOTIFY_SIGNAL_PENDING_ADDED_REMOVED: - // XXX - if (object_class->object_creation_failed) - object_class->object_creation_failed (object, NULL, g_strdup (nm_object_get_path (item->changed))); - break; - case NOTIFY_SIGNAL_PENDING_NONE: - default: - break; - } - if (ret > 0) { - g_assert (ret < sizeof (buf)); - g_signal_emit_by_name (object, buf, item->changed); - } - } - g_object_unref (object); - - g_slist_free_full (props, (GDestroyNotify) notify_item_free); - return G_SOURCE_REMOVE; -} - -static void -_nm_object_defer_notify (NMObject *object) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - - if (!priv->notify_id) - priv->notify_id = g_idle_add_full (G_PRIORITY_LOW, deferred_notify_cb, object, NULL); -} - -static void -_nm_object_queue_notify_full (NMObject *object, - const char *property, - const char *signal_prefix, - gboolean added, - NMObject *changed) -{ - NMObjectPrivate *priv; - NotifyItem *item; - GSList *iter; - - g_return_if_fail (NM_IS_OBJECT (object)); - g_return_if_fail (!signal_prefix != !property); - g_return_if_fail (!signal_prefix == !changed); - - priv = NM_OBJECT_GET_PRIVATE (object); - _nm_object_defer_notify (object); - - property = g_intern_string (property); - signal_prefix = g_intern_string (signal_prefix); - for (iter = priv->notify_items; iter; iter = g_slist_next (iter)) { - item = iter->data; - - if (property && (property == item->property)) - return; - - /* Collapse signals for the same object (such as "added->removed") to - * ensure we don't emit signals when their sum should have no effect. - * The "added->removed->removed" sequence requires special handling, - * hence the addition of the ADDED_REMOVED state to ensure that no - * signal is emitted in this case: - * - * Without the ADDED_REMOVED state: - * NONE + added -> ADDED - * ADDED + removed -> NONE - * NONE + removed -> REMOVED (would emit 'removed' signal) - * - * With the ADDED_REMOVED state: - * NONE | ADDED_REMOVED + added -> ADDED - * ADDED + removed -> ADDED_REMOVED - * ADDED_REMOVED + removed -> ADDED_REMOVED (emits no signal) - */ - if (signal_prefix && (changed == item->changed) && (item->signal_prefix == signal_prefix)) { - switch (item->pending) { - case NOTIFY_SIGNAL_PENDING_ADDED: - if (!added) - item->pending = NOTIFY_SIGNAL_PENDING_ADDED_REMOVED; - break; - case NOTIFY_SIGNAL_PENDING_REMOVED: - if (added) - item->pending = NOTIFY_SIGNAL_PENDING_NONE; - break; - case NOTIFY_SIGNAL_PENDING_ADDED_REMOVED: - if (added) - item->pending = NOTIFY_SIGNAL_PENDING_ADDED; - break; - case NOTIFY_SIGNAL_PENDING_NONE: - item->pending = added ? NOTIFY_SIGNAL_PENDING_ADDED : NOTIFY_SIGNAL_PENDING_REMOVED; - break; - default: - g_assert_not_reached (); - } - return; - } - } - - item = g_slice_new0 (NotifyItem); - item->property = property; - if (signal_prefix) { - item->signal_prefix = signal_prefix; - item->pending = added ? NOTIFY_SIGNAL_PENDING_ADDED : NOTIFY_SIGNAL_PENDING_REMOVED; - item->changed = changed ? g_object_ref (changed) : NULL; - } - priv->notify_items = g_slist_prepend (priv->notify_items, item); -} - -void -_nm_object_queue_notify (NMObject *object, const char *property) -{ - _nm_object_queue_notify_full (object, property, NULL, FALSE, NULL); -} - -void -_nm_object_register_type_func (GType base_type, NMObjectTypeFunc type_func, - NMObjectTypeAsyncFunc type_async_func) -{ - g_hash_table_insert (type_funcs, - GSIZE_TO_POINTER (base_type), - type_func); - g_hash_table_insert (type_async_funcs, - GSIZE_TO_POINTER (base_type), - type_async_func); -} - -static GObject * -_nm_object_create (GType type, DBusGConnection *connection, const char *path) -{ - NMObjectTypeFunc type_func; - GObject *object; - GError *error = NULL; - - type_func = g_hash_table_lookup (type_funcs, GSIZE_TO_POINTER (type)); - if (type_func) - type = type_func (connection, path); - - if (type == G_TYPE_INVALID) { - dbgmsg ("Could not create object for %s: unknown object type", path); - return NULL; - } - - object = g_object_new (type, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); - if (NM_IS_OBJECT (object)) - _nm_object_cache_add (NM_OBJECT (object)); - if (!g_initable_init (G_INITABLE (object), NULL, &error)) { - dbgmsg ("Could not create object for %s: %s", path, error->message); - g_error_free (error); - g_clear_object (&object); - } - - return object; -} - -typedef void (*NMObjectCreateCallbackFunc) (GObject *, const char *, gpointer); -typedef struct { - DBusGConnection *connection; - char *path; - NMObjectCreateCallbackFunc callback; - gpointer user_data; -} NMObjectTypeAsyncData; - -static void -create_async_complete (GObject *object, NMObjectTypeAsyncData *async_data) -{ - async_data->callback (object, async_data->path, async_data->user_data); - - g_free (async_data->path); - g_slice_free (NMObjectTypeAsyncData, async_data); -} - -static const char * -nm_object_or_connection_get_path (gpointer instance) -{ - if (NM_IS_OBJECT (instance)) - return nm_object_get_path (instance); - else if (NM_IS_CONNECTION (instance)) - return nm_connection_get_path (instance); - - g_assert_not_reached (); -} - -static void -async_inited (GObject *source, GAsyncResult *result, gpointer user_data) -{ - NMObjectTypeAsyncData *async_data = user_data; - GObject *object = G_OBJECT (source); - GError *error = NULL; - - if (!g_async_initable_init_finish (G_ASYNC_INITABLE (object), result, &error)) { - dbgmsg ("Could not create object for %s: %s", - nm_object_or_connection_get_path (object), - error->message); - g_error_free (error); - g_clear_object (&object); - } - - create_async_complete (object, async_data); -} - -static void -async_got_type (GType type, gpointer user_data) -{ - NMObjectTypeAsyncData *async_data = user_data; - GObject *object; - - /* Ensure we don't have the object already; we may get multiple type - * requests for the same object if there are multiple properties on - * other objects that refer to the object at this path. One of those - * other requests may have already completed. - */ - object = (GObject *) _nm_object_cache_get (async_data->path); - if (object) { - create_async_complete (object, async_data); - return; - } - - if (type == G_TYPE_INVALID) { - /* Don't know how to create this object */ - create_async_complete (NULL, async_data); - return; - } - - object = g_object_new (type, - NM_OBJECT_DBUS_CONNECTION, async_data->connection, - NM_OBJECT_DBUS_PATH, async_data->path, - NULL); - g_warn_if_fail (object != NULL); - if (NM_IS_OBJECT (object)) - _nm_object_cache_add (NM_OBJECT (object)); - g_async_initable_init_async (G_ASYNC_INITABLE (object), G_PRIORITY_DEFAULT, - NULL, async_inited, async_data); -} - -static void -_nm_object_create_async (GType type, DBusGConnection *connection, const char *path, - NMObjectCreateCallbackFunc callback, gpointer user_data) -{ - NMObjectTypeAsyncFunc type_async_func; - NMObjectTypeFunc type_func; - NMObjectTypeAsyncData *async_data; - - async_data = g_slice_new (NMObjectTypeAsyncData); - async_data->connection = connection; - async_data->path = g_strdup (path); - async_data->callback = callback; - async_data->user_data = user_data; - - type_async_func = g_hash_table_lookup (type_async_funcs, GSIZE_TO_POINTER (type)); - if (type_async_func) { - type_async_func (connection, path, async_got_type, async_data); - return; - } - - type_func = g_hash_table_lookup (type_funcs, GSIZE_TO_POINTER (type)); - if (type_func) - type = type_func (connection, path); - - async_got_type (type, async_data); -} - -/* Stolen from dbus-glib */ -static char* -wincaps_to_dash (const char *caps) -{ - const char *p; - GString *str; - - str = g_string_new (NULL); - p = caps; - while (*p) { - if (g_ascii_isupper (*p)) { - if (str->len > 0 && (str->len < 2 || str->str[str->len-2] != '-')) - g_string_append_c (str, '-'); - g_string_append_c (str, g_ascii_tolower (*p)); - } else - g_string_append_c (str, *p); - ++p; - } - - return g_string_free (str, FALSE); -} - -/* Adds object to array if it's not already there */ -static void -add_to_object_array_unique (GPtrArray *array, GObject *obj) -{ - guint i; - - g_return_if_fail (array != NULL); - - if (obj != NULL) { - for (i = 0; i < array->len; i++) { - if (g_ptr_array_index (array, i) == obj) { - g_object_unref (obj); - return; - } - } - g_ptr_array_add (array, obj); - } -} - -typedef struct { - NMObject *self; - PropertyInfo *pi; - - GObject **objects; - int length, remaining; - - gboolean array; - const char *property_name; -} ObjectCreatedData; - -/* Places items from 'needles' that are not in 'haystack' into 'diff' */ -static void -array_diff (GPtrArray *needles, GPtrArray *haystack, GPtrArray *diff) -{ - guint i, j; - GObject *obj; - - g_assert (needles); - g_assert (haystack); - g_assert (diff); - - for (i = 0; i < needles->len; i++) { - obj = g_ptr_array_index (needles, i); - - for (j = 0; j < haystack->len; j++) { - if (g_ptr_array_index (haystack, j) == obj) - break; - } - - if (j == haystack->len) - g_ptr_array_add (diff, obj); - } -} - -static void -queue_added_removed_signal (NMObject *self, - const char *signal_prefix, - NMObject *changed, - gboolean added) -{ - _nm_object_queue_notify_full (self, NULL, signal_prefix, added, changed); -} - -static void -object_property_complete (ObjectCreatedData *odata) -{ - NMObject *self = odata->self; - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (self); - PropertyInfo *pi = odata->pi; - gboolean different = TRUE; - - if (odata->array) { - GPtrArray *old = *((GPtrArray **) pi->field); - GPtrArray *new; - int i; - - /* Build up new array */ - new = g_ptr_array_sized_new (odata->length); - for (i = 0; i < odata->length; i++) - add_to_object_array_unique (new, odata->objects[i]); - - if (pi->signal_prefix) { - GPtrArray *added = g_ptr_array_sized_new (3); - GPtrArray *removed = g_ptr_array_sized_new (3); - - if (old) { - /* Find objects in 'old' that do not exist in 'new' */ - array_diff (old, new, removed); - - /* Find objects in 'new' that do not exist in old */ - array_diff (new, old, added); - } else { - for (i = 0; i < new->len; i++) - g_ptr_array_add (added, g_ptr_array_index (new, i)); - } - - *((GPtrArray **) pi->field) = new; - - /* Emit added & removed */ - for (i = 0; i < removed->len; i++) { - queue_added_removed_signal (self, - pi->signal_prefix, - g_ptr_array_index (removed, i), - FALSE); - } - - for (i = 0; i < added->len; i++) { - queue_added_removed_signal (self, - pi->signal_prefix, - g_ptr_array_index (added, i), - TRUE); - } - - different = removed->len || added->len; - g_ptr_array_free (added, TRUE); - g_ptr_array_free (removed, TRUE); - } else { - /* No added/removed signals to send, just replace the property with - * the new values. - */ - *((GPtrArray **) pi->field) = new; - different = TRUE; - } - - /* Free old array last since it will release references, thus freeing - * any objects in the 'removed' array. - */ - if (old) - g_boxed_free (NM_TYPE_OBJECT_ARRAY, old); - } else { - GObject **obj_p = pi->field; - - different = (*obj_p != odata->objects[0]); - if (*obj_p) - g_object_unref (*obj_p); - *obj_p = odata->objects[0]; - } - - if (different && odata->property_name) - _nm_object_queue_notify (self, odata->property_name); - - if (--priv->reload_remaining == 0) - reload_complete (self, FALSE); - - g_object_unref (self); - g_free (odata->objects); - g_slice_free (ObjectCreatedData, odata); -} - -static void -object_created (GObject *obj, const char *path, gpointer user_data) -{ - ObjectCreatedData *odata = user_data; - - /* We assume that on error, the creator_func printed something */ - - if (obj == NULL && g_strcmp0 (path, "/") != 0 ) { - GError *error; - error = g_error_new (NM_OBJECT_ERROR, - NM_OBJECT_ERROR_OBJECT_CREATION_FAILURE, - "Creating object for path '%s' failed in libnm-glib.", - path); - /* Emit a signal about the error. */ - g_signal_emit (odata->self, signals[OBJECT_CREATION_FAILED], 0, error, path); - g_error_free (error); - } - - odata->objects[--odata->remaining] = obj; - if (!odata->remaining) - object_property_complete (odata); -} - -static gboolean -handle_object_property (NMObject *self, const char *property_name, GValue *value, - PropertyInfo *pi, gboolean synchronously) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (self); - GObject *obj; - const char *path; - ObjectCreatedData *odata; - - odata = g_slice_new (ObjectCreatedData); - odata->self = g_object_ref (self); - odata->pi = pi; - odata->objects = g_new (GObject *, 1); - odata->length = odata->remaining = 1; - odata->array = FALSE; - odata->property_name = property_name; - - priv->reload_remaining++; - - path = g_value_get_boxed (value); - - if (!strcmp (path, "/")) { - object_created (NULL, path, odata); - return TRUE; - } - - obj = G_OBJECT (_nm_object_cache_get (path)); - if (obj) { - object_created (obj, path, odata); - return TRUE; - } else if (synchronously) { - obj = _nm_object_create (pi->object_type, priv->connection, path); - object_created (obj, path, odata); - return obj != NULL; - } else { - _nm_object_create_async (pi->object_type, priv->connection, path, - object_created, odata); - /* Assume success */ - return TRUE; - } -} - -static gboolean -handle_object_array_property (NMObject *self, const char *property_name, GValue *value, - PropertyInfo *pi, gboolean synchronously) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (self); - GObject *obj; - GPtrArray *paths; - GPtrArray **array = pi->field; - const char *path; - ObjectCreatedData *odata; - int i; - - paths = g_value_get_boxed (value); - - odata = g_slice_new (ObjectCreatedData); - odata->self = g_object_ref (self); - odata->pi = pi; - odata->objects = g_new0 (GObject *, paths->len); - odata->length = odata->remaining = paths->len; - odata->array = TRUE; - odata->property_name = property_name; - - priv->reload_remaining++; - - if (paths->len == 0) { - object_property_complete (odata); - return TRUE; - } - - for (i = 0; i < paths->len; i++) { - path = paths->pdata[i]; - if (!strcmp (path, "/")) { - /* FIXME: can't happen? */ - continue; - } - - obj = G_OBJECT (_nm_object_cache_get (path)); - if (obj) { - object_created (obj, path, odata); - } else if (synchronously) { - obj = _nm_object_create (pi->object_type, priv->connection, path); - object_created (obj, path, odata); - } else { - _nm_object_create_async (pi->object_type, priv->connection, path, - object_created, odata); - } - } - - if (!synchronously) { - /* Assume success */ - return TRUE; - } - - return *array && ((*array)->len == paths->len); -} - -static void -handle_property_changed (NMObject *self, const char *dbus_name, GValue *value, gboolean synchronously) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (self); - char *prop_name; - PropertyInfo *pi; - GParamSpec *pspec; - gboolean success = FALSE, found = FALSE; - GSList *iter; - - prop_name = wincaps_to_dash (dbus_name); - - /* Iterate through the object and its parents to find the property */ - for (iter = priv->property_tables; iter; iter = g_slist_next (iter)) { - pi = g_hash_table_lookup ((GHashTable *) iter->data, prop_name); - if (pi) { - if (!pi->field) { - /* We know about this property but aren't tracking changes on it. */ - goto out; - } - - found = TRUE; - break; - } - } - - if (!found) { - dbgmsg ("Property '%s' unhandled.", prop_name); - goto out; - } - - pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (self)), prop_name); - if (!pspec) { - dbgmsg ("%s: property '%s' changed but wasn't defined by object type %s.", - __func__, - prop_name, - G_OBJECT_TYPE_NAME (self)); - goto out; - } - - if (G_UNLIKELY (debug)) { - char *s; - s = g_strdup_value_contents (value); - dbgmsg ("PC: (%p) %s::%s => '%s' (%s%s%s)", - self, G_OBJECT_TYPE_NAME (self), - prop_name, - s, - G_VALUE_TYPE_NAME (value), - pi->object_type ? " / " : "", - pi->object_type ? g_type_name (pi->object_type) : ""); - g_free (s); - } - - if (pi->object_type) { - if (G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH)) - success = handle_object_property (self, pspec->name, value, pi, synchronously); - else if (G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH)) - success = handle_object_array_property (self, pspec->name, value, pi, synchronously); - else { - g_warn_if_reached (); - goto out; - } - } else - success = (*(pi->func)) (self, pspec, value, pi->field); - - if (!success) { - dbgmsg ("%s: failed to update property '%s' of object type %s.", - __func__, - prop_name, - G_OBJECT_TYPE_NAME (self)); - } - -out: - g_free (prop_name); -} - -static void -process_properties_changed (NMObject *self, GHashTable *properties, gboolean synchronously) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (self); - GHashTableIter iter; - gpointer name, value; - - if (priv->suppress_property_updates) - return; - - g_hash_table_iter_init (&iter, properties); - while (g_hash_table_iter_next (&iter, &name, &value)) { - if (value) - handle_property_changed (self, name, value, synchronously); - else { - dbgmsg ("%s:%d %s(): object %s property '%s' value is unexpectedly NULL", - __FILE__, __LINE__, __func__, G_OBJECT_TYPE_NAME (self), (const char *) name); - } - } -} - -static void -properties_changed_proxy (DBusGProxy *proxy, - GHashTable *properties, - gpointer user_data) -{ - process_properties_changed (NM_OBJECT (user_data), properties, FALSE); -} - -#define HANDLE_TYPE(ucase, lcase, getter) \ - } else if (pspec->value_type == G_TYPE_##ucase) { \ - if (G_VALUE_HOLDS_##ucase (value)) { \ - g##lcase *param = (g##lcase *) field; \ - *param = g_value_get_##getter (value); \ - } else { \ - success = FALSE; \ - goto done; \ - } - -static gboolean -demarshal_generic (NMObject *object, - GParamSpec *pspec, - GValue *value, - gpointer field) -{ - gboolean success = TRUE; - - if (pspec->value_type == G_TYPE_STRING) { - if (G_VALUE_HOLDS_STRING (value)) { - char **param = (char **) field; - g_free (*param); - *param = g_value_dup_string (value); - } else if (G_VALUE_HOLDS (value, DBUS_TYPE_G_OBJECT_PATH)) { - char **param = (char **) field; - g_free (*param); - *param = g_strdup (g_value_get_boxed (value)); - /* Handle "NULL" object paths */ - if (g_strcmp0 (*param, "/") == 0) { - g_free (*param); - *param = NULL; - } - } else { - success = FALSE; - goto done; - } - HANDLE_TYPE(BOOLEAN, boolean, boolean) - HANDLE_TYPE(CHAR, char, schar) - HANDLE_TYPE(UCHAR, uchar, uchar) - HANDLE_TYPE(DOUBLE, double, double) - HANDLE_TYPE(INT, int, int) - HANDLE_TYPE(UINT, uint, uint) - HANDLE_TYPE(INT64, int64, int64) - HANDLE_TYPE(UINT64, uint64, uint64) - HANDLE_TYPE(LONG, long, long) - HANDLE_TYPE(ULONG, ulong, ulong) - } else { - dbgmsg ("%s: %s/%s unhandled type %s.", - __func__, - G_OBJECT_TYPE_NAME (object), - pspec->name, - g_type_name (pspec->value_type)); - success = FALSE; - } - -done: - if (success) { - _nm_object_queue_notify (object, pspec->name); - } else { - dbgmsg ("%s: %s/%s (type %s) couldn't be set with type %s.", - __func__, G_OBJECT_TYPE_NAME (object), pspec->name, - g_type_name (pspec->value_type), G_VALUE_TYPE_NAME (value)); - } - return success; -} - -void -_nm_object_register_properties (NMObject *object, - DBusGProxy *proxy, - const NMPropertiesInfo *info) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - static gsize dval = 0; - const char *debugstr; - NMPropertiesInfo *tmp; - GHashTable *instance; - - g_return_if_fail (NM_IS_OBJECT (object)); - g_return_if_fail (proxy != NULL); - g_return_if_fail (info != NULL); - - if (g_once_init_enter (&dval)) { - debugstr = getenv ("LIBNM_GLIB_DEBUG"); - if (debugstr && strstr (debugstr, "properties-changed")) - debug = TRUE; - g_once_init_leave (&dval, 1); - } - - priv->property_interfaces = g_slist_prepend (priv->property_interfaces, - g_strdup (dbus_g_proxy_get_interface (proxy))); - - dbus_g_proxy_add_signal (proxy, "PropertiesChanged", DBUS_TYPE_G_MAP_OF_VARIANT, G_TYPE_INVALID); - dbus_g_proxy_connect_signal (proxy, - "PropertiesChanged", - G_CALLBACK (properties_changed_proxy), - object, - NULL); - - instance = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - priv->property_tables = g_slist_prepend (priv->property_tables, instance); - - for (tmp = (NMPropertiesInfo *) info; tmp->name; tmp++) { - PropertyInfo *pi; - - if (!tmp->name || (tmp->func && !tmp->field)) { - g_warning ("%s: missing field in NMPropertiesInfo", __func__); - continue; - } - - pi = g_malloc0 (sizeof (PropertyInfo)); - pi->func = tmp->func ?: demarshal_generic; - pi->object_type = tmp->object_type; - pi->field = tmp->field; - pi->signal_prefix = tmp->signal_prefix; - g_hash_table_insert (instance, g_strdup (tmp->name), pi); - } -} - -gboolean -_nm_object_reload_properties (NMObject *object, GError **error) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - GHashTable *props = NULL; - GSList *p; - - if (!priv->property_interfaces || !priv->nm_running) - return TRUE; - - priv->reload_remaining++; - - for (p = priv->property_interfaces; p; p = p->next) { - if (!dbus_g_proxy_call (priv->properties_proxy, "GetAll", error, - G_TYPE_STRING, p->data, - G_TYPE_INVALID, - DBUS_TYPE_G_MAP_OF_VARIANT, &props, - G_TYPE_INVALID)) - return FALSE; - - process_properties_changed (object, props, TRUE); - g_hash_table_destroy (props); - } - - if (--priv->reload_remaining == 0) - reload_complete (object, TRUE); - - return TRUE; -} - -void -_nm_object_suppress_property_updates (NMObject *object, gboolean suppress) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - - priv->suppress_property_updates = suppress; -} - -void -_nm_object_ensure_inited (NMObject *object) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - GError *error = NULL; - - if (!priv->inited) { - if (!g_initable_init (G_INITABLE (object), NULL, &error)) { - dbgmsg ("Could not initialize %s %s: %s", - G_OBJECT_TYPE_NAME (object), - priv->path, - error->message); - g_error_free (error); - - /* Only warn once */ - priv->inited = TRUE; - } - } -} - -void -_nm_object_reload_property (NMObject *object, - const char *interface, - const char *prop_name) -{ - GValue value = G_VALUE_INIT; - GError *err = NULL; - - g_return_if_fail (NM_IS_OBJECT (object)); - g_return_if_fail (interface != NULL); - g_return_if_fail (prop_name != NULL); - - if (!NM_OBJECT_GET_PRIVATE (object)->nm_running) - return; - - if (!dbus_g_proxy_call_with_timeout (NM_OBJECT_GET_PRIVATE (object)->properties_proxy, - "Get", 15000, &err, - G_TYPE_STRING, interface, - G_TYPE_STRING, prop_name, - G_TYPE_INVALID, - G_TYPE_VALUE, &value, - G_TYPE_INVALID)) { - dbgmsg ("%s: Error getting '%s' for %s: %s\n", - __func__, - prop_name, - nm_object_get_path (object), - err->message); - g_clear_error (&err); - return; - } - - handle_property_changed (object, prop_name, &value, TRUE); - g_value_unset (&value); -} - -void -_nm_object_set_property (NMObject *object, - const char *interface, - const char *prop_name, - GValue *value) -{ - g_return_if_fail (NM_IS_OBJECT (object)); - g_return_if_fail (interface != NULL); - g_return_if_fail (prop_name != NULL); - g_return_if_fail (G_IS_VALUE (value)); - - if (!NM_OBJECT_GET_PRIVATE (object)->nm_running) - return; - - if (!dbus_g_proxy_call_with_timeout (NM_OBJECT_GET_PRIVATE (object)->properties_proxy, - "Set", 2000, NULL, - G_TYPE_STRING, interface, - G_TYPE_STRING, prop_name, - G_TYPE_VALUE, value, - G_TYPE_INVALID)) { - - /* Ignore errors. dbus_g_proxy_call_with_timeout() is called instead of - * dbus_g_proxy_call_no_reply() to give NM chance to authenticate the caller. - */ - } -} - -static void -reload_complete (NMObject *object, gboolean emit_now) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - GSimpleAsyncResult *simple; - GSList *results, *iter; - GError *error; - - if (emit_now) { - if (priv->notify_id) { - g_source_remove (priv->notify_id); - priv->notify_id = 0; - } - deferred_notify_cb (object); - } else - _nm_object_defer_notify (object); - - results = priv->reload_results; - priv->reload_results = NULL; - error = priv->reload_error; - priv->reload_error = NULL; - - for (iter = results; iter; iter = iter->next) { - simple = iter->data; - - if (error) - g_simple_async_result_set_from_error (simple, error); - else - g_simple_async_result_set_op_res_gboolean (simple, TRUE); - - g_simple_async_result_complete (simple); - g_object_unref (simple); - } - g_slist_free (results); - g_clear_error (&error); -} - -static void -reload_got_properties (DBusGProxy *proxy, DBusGProxyCall *call, - gpointer user_data) -{ - NMObject *object = user_data; - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - GHashTable *props = NULL; - GError *error = NULL; - - if (dbus_g_proxy_end_call (proxy, call, &error, - DBUS_TYPE_G_MAP_OF_VARIANT, &props, - G_TYPE_INVALID)) { - process_properties_changed (object, props, FALSE); - g_hash_table_destroy (props); - } else { - if (priv->reload_error) - g_error_free (error); - else - priv->reload_error = error; - } - - if (--priv->reload_remaining == 0) - reload_complete (object, FALSE); -} - -void -_nm_object_reload_properties_async (NMObject *object, GAsyncReadyCallback callback, gpointer user_data) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (object); - GSimpleAsyncResult *simple; - GSList *p; - - simple = g_simple_async_result_new (G_OBJECT (object), callback, - user_data, _nm_object_reload_properties_async); - - if (!priv->property_interfaces) { - g_simple_async_result_complete_in_idle (simple); - g_object_unref (simple); - return; - } - - priv->reload_results = g_slist_prepend (priv->reload_results, simple); - - /* If there was already a reload happening, we don't need to - * re-read the properties again, we just need to wait for the - * existing reload to finish. - */ - if (priv->reload_results->next) - return; - - for (p = priv->property_interfaces; p; p = p->next) { - priv->reload_remaining++; - dbus_g_proxy_begin_call (priv->properties_proxy, "GetAll", - reload_got_properties, object, NULL, - G_TYPE_STRING, p->data, - G_TYPE_INVALID); - } -} - -gboolean -_nm_object_reload_properties_finish (NMObject *object, GAsyncResult *result, GError **error) -{ - GSimpleAsyncResult *simple; - - g_return_val_if_fail (NM_IS_OBJECT (object), FALSE); - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (object), _nm_object_reload_properties_async), FALSE); - - simple = G_SIMPLE_ASYNC_RESULT (result); - if (g_simple_async_result_propagate_error (simple, error)) - return FALSE; - - return g_simple_async_result_get_op_res_gboolean (simple); -} - -DBusGProxy * -_nm_object_new_proxy (NMObject *self, const char *path, const char *interface) -{ - NMObjectPrivate *priv = NM_OBJECT_GET_PRIVATE (self); - - return _nm_dbus_new_proxy_for_connection (priv->connection, path ?: priv->path, interface); -} diff --git a/libnm-glib/nm-object.h b/libnm-glib/nm-object.h deleted file mode 100644 index d37fb683..00000000 --- a/libnm-glib/nm-object.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#ifndef NM_OBJECT_H -#define NM_OBJECT_H - -#include <glib.h> -#include <glib-object.h> -#include <dbus/dbus-glib.h> - -#include "nm-version.h" - -G_BEGIN_DECLS - -#define NM_TYPE_OBJECT (nm_object_get_type ()) -#define NM_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_OBJECT, NMObject)) -#define NM_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_OBJECT, NMObjectClass)) -#define NM_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_OBJECT)) -#define NM_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_OBJECT)) -#define NM_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_OBJECT, NMObjectClass)) - -/** - * NMObjectError: - * @NM_OBJECT_ERROR_UNKNOWN: unknown or unclassified error - * @NM_OBJECT_ERROR_OBJECT_CREATION_FAILURE: an error ocured while creating an #NMObject - * - * Describes errors that may result from operations involving a #NMObject. - * - **/ -typedef enum { - NM_OBJECT_ERROR_UNKNOWN = 0, - NM_OBJECT_ERROR_OBJECT_CREATION_FAILURE, -} NMObjectError; - -#define NM_OBJECT_ERROR nm_object_error_quark () -GQuark nm_object_error_quark (void); - -#define NM_OBJECT_DBUS_CONNECTION "dbus-connection" -#define NM_OBJECT_DBUS_PATH "dbus-path" - -typedef struct { - GObject parent; -} NMObject; - -typedef struct { - GObjectClass parent; - - /* Signals */ - /* The "object-creation-failed" signal is PRIVATE for libnm-glib and - * is not meant for any external usage. It indicates that an error - * occurred during creation of an object. - */ - void (*object_creation_failed) (NMObject *master_object, - GError *error, - char *failed_path); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMObjectClass; - -GType nm_object_get_type (void); - -DBusGConnection *nm_object_get_connection (NMObject *object); -const char *nm_object_get_path (NMObject *object); - -G_END_DECLS - -#endif /* NM_OBJECT_H */ diff --git a/libnm-glib/nm-remote-connection-private.h b/libnm-glib/nm-remote-connection-private.h deleted file mode 100644 index e3f35428..00000000 --- a/libnm-glib/nm-remote-connection-private.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2009 Red Hat, Inc. - */ - -#ifndef __NM_REMOTE_CONNECTION_PRIVATE_H__ -#define __NM_REMOTE_CONNECTION_PRIVATE_H__ - -#define NM_REMOTE_CONNECTION_INIT_RESULT "init-result" - -typedef enum { - NM_REMOTE_CONNECTION_INIT_RESULT_UNKNOWN = 0, - NM_REMOTE_CONNECTION_INIT_RESULT_SUCCESS, - NM_REMOTE_CONNECTION_INIT_RESULT_ERROR, - NM_REMOTE_CONNECTION_INIT_RESULT_INVISIBLE, -} NMRemoteConnectionInitResult; - -#endif /* __NM_REMOTE_CONNECTION_PRIVATE__ */ diff --git a/libnm-glib/nm-remote-connection.c b/libnm-glib/nm-remote-connection.c deleted file mode 100644 index eb99ef35..00000000 --- a/libnm-glib/nm-remote-connection.c +++ /dev/null @@ -1,954 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2011 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "NetworkManager.h" -#include "nm-utils.h" -#include "nm-setting-connection.h" -#include "nm-remote-connection.h" -#include "nm-remote-connection-private.h" -#include "nm-object-private.h" -#include "nm-dbus-glib-types.h" -#include "nm-dbus-helpers-private.h" -#include "nm-setting-private.h" - -#define NM_REMOTE_CONNECTION_BUS "bus" -#define NM_REMOTE_CONNECTION_DBUS_CONNECTION "dbus-connection" -#define NM_REMOTE_CONNECTION_DBUS_PATH "dbus-path" - -static void nm_remote_connection_initable_iface_init (GInitableIface *iface); -static void nm_remote_connection_async_initable_iface_init (GAsyncInitableIface *iface); - -G_DEFINE_TYPE_WITH_CODE (NMRemoteConnection, nm_remote_connection, NM_TYPE_CONNECTION, - G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, nm_remote_connection_initable_iface_init); - G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, nm_remote_connection_async_initable_iface_init); - ) - -enum { - PROP_0, - PROP_BUS, - PROP_DBUS_CONNECTION, - PROP_DBUS_PATH, - PROP_UNSAVED, - - LAST_PROP -}; - -enum { - UPDATED, - REMOVED, - VISIBLE, - - LAST_SIGNAL -}; -static guint signals[LAST_SIGNAL] = { 0 }; - -typedef struct RemoteCall RemoteCall; -typedef void (*RemoteCallFetchResultCb) (RemoteCall *call, DBusGProxyCall *proxy_call, GError *error); - -struct RemoteCall { - NMRemoteConnection *self; - DBusGProxyCall *call; - RemoteCallFetchResultCb fetch_result_cb; - GFunc callback; - gpointer user_data; -}; - -typedef struct { - DBusGConnection *bus; - DBusGProxy *proxy; - DBusGProxy *props_proxy; - gboolean proxy_is_destroyed; - GSList *calls; - - gboolean inited; - gboolean unsaved; - - gboolean visible; -} NMRemoteConnectionPrivate; - -#define NM_REMOTE_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_REMOTE_CONNECTION, NMRemoteConnectionPrivate)) - -/** - * nm_remote_connection_error_quark: - * - * Registers an error quark for #NMRemoteConnection if necessary. - * - * Returns: the error quark used for #NMRemoteConnection errors. - **/ -GQuark -nm_remote_connection_error_quark (void) -{ - static GQuark quark = 0; - - if (G_UNLIKELY (quark == 0)) - quark = g_quark_from_static_string ("nm-remote-connection-error-quark"); - return quark; -} - -/*****************************************************************************/ - -static void -_nm_remote_connection_ensure_inited (NMRemoteConnection *self) -{ - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (self); - GError *error = NULL; - - if (!priv->inited) { - if (!g_initable_init (G_INITABLE (self), NULL, &error)) { - /* Don't warn when the call times out because the settings service can't - * be activated or whatever. - */ - if (!g_error_matches (error, DBUS_GERROR, DBUS_GERROR_NO_REPLY)) { - g_warning ("%s: (NMRemoteConnection) error initializing: %s\n", - __func__, error->message); - } - g_error_free (error); - } - priv->inited = TRUE; - } -} - -/*****************************************************************************/ - -static void -remote_call_dbus_cb (DBusGProxy *proxy, DBusGProxyCall *proxy_call, gpointer user_data) -{ - RemoteCall *call = user_data; - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (call->self); - GError *error = NULL; - - g_assert ( (!proxy && !proxy_call && priv->proxy_is_destroyed) || - ( proxy && proxy_call && !priv->proxy_is_destroyed && proxy == priv->proxy) ); - - if (priv->proxy_is_destroyed) { - error = g_error_new_literal (NM_REMOTE_CONNECTION_ERROR, - NM_REMOTE_CONNECTION_ERROR_DISCONNECTED, - _("Disconnected by D-Bus")); - } - call->fetch_result_cb (call, proxy_call, error); - g_clear_error (&error); - - priv->calls = g_slist_remove (priv->calls, call); - g_object_unref (call->self); - g_free (call); -} - -static gboolean -remote_call_cleanup_cb (void *user_data) -{ - remote_call_dbus_cb (NULL, NULL, user_data); - return G_SOURCE_REMOVE; -} - -static RemoteCall * -remote_call_new (NMRemoteConnection *self, - RemoteCallFetchResultCb fetch_result_cb, - GFunc callback, - gpointer user_data) -{ - RemoteCall *call; - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (self); - - g_assert (fetch_result_cb); - - if (priv->proxy_is_destroyed && !callback) - return NULL; - - call = g_malloc0 (sizeof (RemoteCall)); - call->self = g_object_ref (self); - call->fetch_result_cb = fetch_result_cb; - call->user_data = user_data; - call->callback = callback; - - if (priv->proxy_is_destroyed) { - g_idle_add (remote_call_cleanup_cb, call); - return NULL; - } - priv->calls = g_slist_prepend (priv->calls, call); - return call; -} - -static void -proxy_set_destroyed (NMRemoteConnection *self) -{ - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (self); - - if (priv->proxy_is_destroyed) { - g_assert (!priv->calls); - return; - } - - priv->proxy_is_destroyed = TRUE; - - priv->calls = g_slist_reverse (priv->calls); - while (priv->calls) - remote_call_dbus_cb (NULL, NULL, priv->calls->data); -} - -static void -proxy_destroy_cb (DBusGProxy* proxy, gpointer user_data) { - proxy_set_destroyed (user_data); -} - -/*****************************************************************************/ - -static void -result_cb (RemoteCall *call, DBusGProxyCall *proxy_call, GError *error) -{ - NMRemoteConnectionResultFunc func = (NMRemoteConnectionResultFunc)(void (*) (void)) call->callback; - GError *local_error = NULL; - - if (!error) { - dbus_g_proxy_end_call (NM_REMOTE_CONNECTION_GET_PRIVATE (call->self)->proxy, - proxy_call, &local_error, G_TYPE_INVALID); - error = local_error; - } - if (func) - (*func) (call->self, error, call->user_data); - g_clear_error (&local_error); -} - -/** - * nm_remote_connection_commit_changes: - * @connection: the #NMRemoteConnection - * @callback: (scope async) (allow-none): a function to be called when the - * commit completes - * @user_data: (closure): caller-specific data to be passed to @callback - * - * Send any local changes to the settings and properties of this connection to - * NetworkManager, which will immediately save them to disk. - **/ -void -nm_remote_connection_commit_changes (NMRemoteConnection *self, - NMRemoteConnectionResultFunc callback, - gpointer user_data) -{ - NMRemoteConnectionPrivate *priv; - RemoteCall *call; - GHashTable *settings; - - g_return_if_fail (NM_IS_REMOTE_CONNECTION (self)); - - priv = NM_REMOTE_CONNECTION_GET_PRIVATE (self); - - call = remote_call_new (self, result_cb, (GFunc)(void (*) (void)) callback, user_data); - if (!call) - return; - - settings = nm_connection_to_hash (NM_CONNECTION (self), NM_SETTING_HASH_FLAG_ALL); - call->call = dbus_g_proxy_begin_call (priv->proxy, "Update", - remote_call_dbus_cb, call, NULL, - DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, settings, - G_TYPE_INVALID); - g_assert (call->call); - g_hash_table_destroy (settings); -} - -/** - * nm_remote_connection_commit_changes_unsaved: - * @connection: the #NMRemoteConnection - * @callback: (scope async) (allow-none): a function to be called when the - * commit completes - * @user_data: (closure): caller-specific data to be passed to @callback - * - * Send any local changes to the settings and properties of this connection to - * NetworkManager. The changes are not saved to disk until either - * nm_remote_connection_save() or nm_remote_connection_commit_changes() is - * called. - * - * Since: 0.9.10 - **/ -void -nm_remote_connection_commit_changes_unsaved (NMRemoteConnection *connection, - NMRemoteConnectionResultFunc callback, - gpointer user_data) -{ - NMRemoteConnectionPrivate *priv; - GHashTable *settings = NULL; - RemoteCall *call; - - g_return_if_fail (NM_IS_REMOTE_CONNECTION (connection)); - - priv = NM_REMOTE_CONNECTION_GET_PRIVATE (connection); - - call = remote_call_new (connection, result_cb, (GFunc)(void (*) (void)) callback, user_data); - if (!call) - return; - - settings = nm_connection_to_hash (NM_CONNECTION (connection), NM_SETTING_HASH_FLAG_ALL); - call->call = dbus_g_proxy_begin_call (priv->proxy, "UpdateUnsaved", - remote_call_dbus_cb, call, NULL, - DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, settings, - G_TYPE_INVALID); - g_assert (call->call); - g_hash_table_destroy (settings); -} - -/** - * nm_remote_connection_save: - * @connection: the #NMRemoteConnection - * @callback: (scope async) (allow-none): a function to be called when the - * save completes - * @user_data: (closure): caller-specific data to be passed to @callback - * - * Saves the connection to disk if the connection has changes that have not yet - * been written to disk, or if the connection has never been saved. - * - * Since: 0.9.10 - **/ -void -nm_remote_connection_save (NMRemoteConnection *connection, - NMRemoteConnectionResultFunc callback, - gpointer user_data) -{ - NMRemoteConnectionPrivate *priv; - RemoteCall *call; - - g_return_if_fail (NM_IS_REMOTE_CONNECTION (connection)); - - priv = NM_REMOTE_CONNECTION_GET_PRIVATE (connection); - - call = remote_call_new (connection, result_cb, (GFunc)(void (*) (void)) callback, user_data); - if (!call) - return; - - call->call = dbus_g_proxy_begin_call (priv->proxy, "Save", remote_call_dbus_cb, call, NULL, G_TYPE_INVALID); - g_assert (call->call); -} - -/** - * nm_remote_connection_delete: - * @connection: the #NMRemoteConnection - * @callback: (scope async) (allow-none): a function to be called when the delete completes - * @user_data: (closure): caller-specific data to be passed to @callback - * - * Delete the connection. - **/ -void -nm_remote_connection_delete (NMRemoteConnection *self, - NMRemoteConnectionResultFunc callback, - gpointer user_data) -{ - NMRemoteConnectionPrivate *priv; - RemoteCall *call; - - g_return_if_fail (NM_IS_REMOTE_CONNECTION (self)); - - priv = NM_REMOTE_CONNECTION_GET_PRIVATE (self); - - call = remote_call_new (self, result_cb, (GFunc)(void (*) (void)) callback, user_data); - if (!call) - return; - - call->call = dbus_g_proxy_begin_call (priv->proxy, "Delete", - remote_call_dbus_cb, call, NULL, - G_TYPE_INVALID); - g_assert (call->call); -} - -static void -get_secrets_cb (RemoteCall *call, DBusGProxyCall *proxy_call, GError *error) -{ - NMRemoteConnectionGetSecretsFunc func = (NMRemoteConnectionGetSecretsFunc)(void (*) (void)) call->callback; - GHashTable *secrets = NULL; - GError *local_error = NULL; - - if (!error) { - dbus_g_proxy_end_call (NM_REMOTE_CONNECTION_GET_PRIVATE (call->self)->proxy, - proxy_call, &local_error, - DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, &secrets, - G_TYPE_INVALID); - error = local_error; - } - if (func) - (*func) (call->self, error ? NULL : secrets, error, call->user_data); - g_clear_error (&local_error); - if (secrets) - g_hash_table_destroy (secrets); -} - -/** - * nm_remote_connection_get_secrets: - * @connection: the #NMRemoteConnection - * @setting_name: the #NMSetting object name to get secrets for - * @callback: (scope async): a function to be called when the update completes; - * must not be %NULL - * @user_data: (closure): caller-specific data to be passed to @callback - * - * Request the connection's secrets. - **/ -void -nm_remote_connection_get_secrets (NMRemoteConnection *self, - const char *setting_name, - NMRemoteConnectionGetSecretsFunc callback, - gpointer user_data) -{ - NMRemoteConnectionPrivate *priv; - RemoteCall *call; - - g_return_if_fail (NM_IS_REMOTE_CONNECTION (self)); - g_return_if_fail (callback != NULL); - - priv = NM_REMOTE_CONNECTION_GET_PRIVATE (self); - - call = remote_call_new (self, get_secrets_cb, (GFunc)(void (*) (void)) callback, user_data); - if (!call) - return; - - call->call = dbus_g_proxy_begin_call (priv->proxy, "GetSecrets", - remote_call_dbus_cb, call, NULL, - G_TYPE_STRING, setting_name, - G_TYPE_INVALID); - g_assert (call->call); -} - -/** - * nm_remote_connection_get_unsaved: - * @connection: the #NMRemoteConnection - * - * Returns: %TRUE if the remote connection contains changes that have not - * been saved to disk, %FALSE if the connection is the same as its on-disk - * representation. - * - * Since: 0.9.10 - **/ -gboolean -nm_remote_connection_get_unsaved (NMRemoteConnection *connection) -{ - g_return_val_if_fail (NM_IS_REMOTE_CONNECTION (connection), FALSE); - - _nm_remote_connection_ensure_inited (connection); - return NM_REMOTE_CONNECTION_GET_PRIVATE (connection)->unsaved; -} - -/*****************************************************************************/ - -static void -updated_get_settings_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - NMRemoteConnection *self = user_data; - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (self); - GHashTable *new_settings; - GError *error = NULL; - - dbus_g_proxy_end_call (proxy, call, &error, - DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, &new_settings, - G_TYPE_INVALID); - if (error) { - GHashTable *hash; - - g_error_free (error); - - /* Connection is no longer visible to this user. Let the settings - * service handle this via 'visible'. The settings service will emit - * the "removed" signal for us since it handles the lifetime of this - * object. - */ - hash = g_hash_table_new (g_str_hash, g_str_equal); - _nm_connection_replace_settings (NM_CONNECTION (self), hash); - g_hash_table_destroy (hash); - - priv->visible = FALSE; - g_signal_emit (self, signals[VISIBLE], 0, FALSE); - } else { - gs_unref_object NMRemoteConnection *self_alive = NULL; - - self_alive = g_object_ref (self); - _nm_connection_replace_settings (NM_CONNECTION (self), new_settings); - g_signal_emit (self, signals[UPDATED], 0, new_settings); - g_hash_table_destroy (new_settings); - - /* Settings service will handle announcing the connection to clients */ - if (priv->visible == FALSE) { - priv->visible = TRUE; - g_signal_emit (self, signals[VISIBLE], 0, TRUE); - } - } -} - -static void -updated_cb (DBusGProxy *proxy, gpointer user_data) -{ - NMRemoteConnection *self = NM_REMOTE_CONNECTION (user_data); - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (self); - - /* The connection got updated; request the replacement settings */ - if (!priv->proxy_is_destroyed) { - dbus_g_proxy_begin_call (priv->proxy, "GetSettings", - updated_get_settings_cb, self, NULL, - G_TYPE_INVALID); - } -} - -static void -removed_cb (DBusGProxy *proxy, gpointer user_data) -{ - g_signal_emit (G_OBJECT (user_data), signals[REMOVED], 0); -} - -static void -properties_changed_cb (DBusGProxy *proxy, - GHashTable *properties, - gpointer user_data) -{ - NMRemoteConnection *self = NM_REMOTE_CONNECTION (user_data); - GHashTableIter iter; - const char *key; - GValue *value; - - g_hash_table_iter_init (&iter, properties); - while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &value)) { - if (!strcmp (key, "Unsaved")) { - NM_REMOTE_CONNECTION_GET_PRIVATE (self)->unsaved = g_value_get_boolean (value); - g_object_notify (G_OBJECT (self), NM_REMOTE_CONNECTION_UNSAVED); - } - } -} - -/*****************************************************************************/ - -/** - * nm_remote_connection_new: - * @bus: a valid and connected D-Bus connection - * @path: the D-Bus path of the connection as exported by the settings service - * - * Creates a new object representing the remote connection. - * - * Returns: the new remote connection object on success, or %NULL on failure - **/ -NMRemoteConnection * -nm_remote_connection_new (DBusGConnection *bus, - const char *path) -{ - g_return_val_if_fail (bus != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - return (NMRemoteConnection *) g_object_new (NM_TYPE_REMOTE_CONNECTION, - NM_REMOTE_CONNECTION_BUS, bus, - NM_CONNECTION_PATH, path, - NULL); -} - -static void -constructed (GObject *object) -{ - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_remote_connection_parent_class)->constructed (object); - - g_assert (priv->bus); - g_assert (nm_connection_get_path (NM_CONNECTION (object))); - - priv->proxy = _nm_dbus_new_proxy_for_connection (priv->bus, - nm_connection_get_path (NM_CONNECTION (object)), - NM_DBUS_IFACE_SETTINGS_CONNECTION); - g_assert (priv->proxy); - dbus_g_proxy_set_default_timeout (priv->proxy, G_MAXINT); - - dbus_g_proxy_add_signal (priv->proxy, "Updated", G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->proxy, "Updated", G_CALLBACK (updated_cb), object, NULL); - - dbus_g_proxy_add_signal (priv->proxy, "Removed", G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->proxy, "Removed", G_CALLBACK (removed_cb), object, NULL); - - g_signal_connect (priv->proxy, "destroy", G_CALLBACK (proxy_destroy_cb), object); - - /* Monitor properties */ - dbus_g_object_register_marshaller (g_cclosure_marshal_VOID__BOXED, - G_TYPE_NONE, - DBUS_TYPE_G_MAP_OF_VARIANT, - G_TYPE_INVALID); - dbus_g_proxy_add_signal (priv->proxy, "PropertiesChanged", - DBUS_TYPE_G_MAP_OF_VARIANT, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->proxy, "PropertiesChanged", - G_CALLBACK (properties_changed_cb), - object, - NULL); - - priv->props_proxy = _nm_dbus_new_proxy_for_connection (priv->bus, - nm_connection_get_path (NM_CONNECTION (object)), - DBUS_INTERFACE_PROPERTIES); - g_assert (priv->props_proxy); -} - -static gboolean -init_sync (GInitable *initable, GCancellable *cancellable, GError **error) -{ - NMRemoteConnection *self = NM_REMOTE_CONNECTION (initable); - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (self); - GHashTable *hash; - gs_unref_object NMRemoteConnection *self_alive = NULL; - - if (!dbus_g_proxy_call (priv->proxy, "GetSettings", error, - G_TYPE_INVALID, - DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, &hash, - G_TYPE_INVALID)) - return FALSE; - priv->visible = TRUE; - self_alive = g_object_ref (self); - _nm_connection_replace_settings (NM_CONNECTION (self), hash); - g_signal_emit (self, signals[UPDATED], 0, hash); - g_hash_table_destroy (hash); - - /* Get properties */ - hash = NULL; - if (!dbus_g_proxy_call (priv->props_proxy, "GetAll", error, - G_TYPE_STRING, NM_DBUS_IFACE_SETTINGS_CONNECTION, - G_TYPE_INVALID, - DBUS_TYPE_G_MAP_OF_VARIANT, &hash, - G_TYPE_INVALID)) - return FALSE; - properties_changed_cb (priv->props_proxy, hash, NM_REMOTE_CONNECTION (initable)); - g_hash_table_destroy (hash); - - return TRUE; -} - -typedef struct { - NMRemoteConnection *connection; - GSimpleAsyncResult *result; -} NMRemoteConnectionInitData; - -static void -init_async_complete (NMRemoteConnectionInitData *init_data, GError *error) -{ - if (error) - g_simple_async_result_take_error (init_data->result, error); - else { - g_simple_async_result_set_op_res_gboolean (init_data->result, TRUE); - NM_REMOTE_CONNECTION_GET_PRIVATE (init_data->connection)->inited = TRUE; - } - - g_simple_async_result_complete (init_data->result); - g_object_unref (init_data->result); - g_slice_free (NMRemoteConnectionInitData, init_data); -} - -static void -init_async_got_properties (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) -{ - NMRemoteConnectionInitData *init_data = user_data; - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (init_data->connection); - GHashTable *props; - GError *error = NULL; - - if (dbus_g_proxy_end_call (proxy, call, &error, - DBUS_TYPE_G_MAP_OF_VARIANT, &props, - G_TYPE_INVALID)) { - properties_changed_cb (priv->props_proxy, props, init_data->connection); - g_hash_table_destroy (props); - } - init_async_complete (init_data, error); -} - -static void -init_get_settings_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - NMRemoteConnectionInitData *init_data = user_data; - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (init_data->connection); - GHashTable *settings; - GError *error = NULL; - gs_unref_object NMRemoteConnection *self_alive = NULL; - - dbus_g_proxy_end_call (proxy, call, &error, - DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, &settings, - G_TYPE_INVALID); - if (error) { - init_async_complete (init_data, error); - return; - } - - priv->visible = TRUE; - self_alive = g_object_ref (init_data->connection); - _nm_connection_replace_settings (NM_CONNECTION (init_data->connection), settings); - g_signal_emit (init_data->connection, signals[UPDATED], 0, settings); - g_hash_table_destroy (settings); - - /* Grab properties */ - dbus_g_proxy_begin_call (priv->props_proxy, "GetAll", - init_async_got_properties, init_data, NULL, - G_TYPE_STRING, NM_DBUS_IFACE_SETTINGS_CONNECTION, - G_TYPE_INVALID); -} - -static void -init_async (GAsyncInitable *initable, int io_priority, - GCancellable *cancellable, GAsyncReadyCallback callback, - gpointer user_data) -{ - NMRemoteConnectionInitData *init_data; - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (initable); - - init_data = g_slice_new0 (NMRemoteConnectionInitData); - init_data->connection = NM_REMOTE_CONNECTION (initable); - init_data->result = g_simple_async_result_new (G_OBJECT (initable), callback, - user_data, init_async); - if (cancellable) - g_simple_async_result_set_check_cancellable (init_data->result, cancellable); - - dbus_g_proxy_begin_call (priv->proxy, "GetSettings", - init_get_settings_cb, init_data, NULL, - G_TYPE_INVALID); -} - -static gboolean -init_finish (GAsyncInitable *initable, GAsyncResult *result, GError **error) -{ - GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); - - if (g_simple_async_result_propagate_error (simple, error)) - return FALSE; - else - return TRUE; -} - -static void -nm_remote_connection_init (NMRemoteConnection *self) -{ -} - -static GObject * -constructor (GType type, guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - static GParamSpec *nm_connection_path = NULL; - static GParamSpec *nm_remote_connection_dbus_path = NULL; - int i, path_index = -1, dbus_path_index = -1; - - if (!nm_connection_path) { - nm_connection_path = - g_object_class_find_property (g_type_class_peek (NM_TYPE_CONNECTION), - NM_CONNECTION_PATH); - nm_remote_connection_dbus_path = - g_object_class_find_property (g_type_class_peek (NM_TYPE_REMOTE_CONNECTION), - NM_REMOTE_CONNECTION_DBUS_PATH); - } - - /* Find the two properties */ - for (i = 0; i < n_construct_properties; i++) { - if (construct_properties[i].pspec == nm_connection_path) - path_index = i; - else if (construct_properties[i].pspec == nm_remote_connection_dbus_path) - dbus_path_index = i; - } - g_assert (path_index != -1 && dbus_path_index != -1); - - /* If NMRemoteConnection:dbus-path is set, and NMConnection:path - * is not, then copy the value of the former to the latter. - */ - if (g_value_get_string (construct_properties[dbus_path_index].value) && - !g_value_get_string (construct_properties[path_index].value)) - construct_properties[path_index].value = construct_properties[dbus_path_index].value; - - return G_OBJECT_CLASS (nm_remote_connection_parent_class)-> - constructor (type, n_construct_properties, construct_properties); -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - _nm_remote_connection_ensure_inited (NM_REMOTE_CONNECTION (object)); - - switch (prop_id) { - case PROP_UNSAVED: - g_value_set_boolean (value, NM_REMOTE_CONNECTION_GET_PRIVATE (object)->unsaved); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_BUS: - case PROP_DBUS_CONNECTION: - /* construct-only */ - /* priv->bus is set from either of two properties so that it (a) remains - * backwards compatible with the previous "bus" property, and that (b) - * it can be created just like an NMObject using the "dbus-connection", - * even though it's not a subclass of NMObject. So don't overwrite the - * a valid value that the other property set with NULL, if one of the - * properties isn't specified at construction time. - */ - if (!priv->bus) - priv->bus = g_value_dup_boxed (value); - break; - case PROP_DBUS_PATH: - /* Don't need to do anything; see constructor(). */ - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -dispose (GObject *object) -{ - NMRemoteConnection *self = NM_REMOTE_CONNECTION (object); - NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (self); - - proxy_set_destroyed (self); - - if (priv->proxy) { - g_signal_handlers_disconnect_by_func (priv->proxy, proxy_destroy_cb, object); - g_clear_object (&priv->proxy); - } - g_clear_object (&priv->props_proxy); - - if (priv->bus) { - dbus_g_connection_unref (priv->bus); - priv->bus = NULL; - } - - G_OBJECT_CLASS (nm_remote_connection_parent_class)->dispose (object); -} - -static void -nm_remote_connection_class_init (NMRemoteConnectionClass *remote_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (remote_class); - - g_type_class_add_private (object_class, sizeof (NMRemoteConnectionPrivate)); - - /* virtual methods */ - object_class->constructor = constructor; - object_class->get_property = get_property; - object_class->set_property = set_property; - object_class->dispose = dispose; - object_class->constructed = constructed; - - /* Properties */ - /** - * NMRemoteConnection:bus: - * - * The #DBusGConnection that the #NMRemoteConnection is connected to. - */ - g_object_class_install_property - (object_class, PROP_BUS, - g_param_spec_boxed (NM_REMOTE_CONNECTION_BUS, "", "", - DBUS_TYPE_G_CONNECTION, - G_PARAM_WRITABLE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - /* These are needed so _nm_object_create() can create NMRemoteConnections */ - g_object_class_install_property - (object_class, PROP_DBUS_CONNECTION, - g_param_spec_boxed (NM_REMOTE_CONNECTION_DBUS_CONNECTION, "", "", - DBUS_TYPE_G_CONNECTION, - G_PARAM_WRITABLE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - g_object_class_install_property - (object_class, PROP_DBUS_PATH, - g_param_spec_string (NM_REMOTE_CONNECTION_DBUS_PATH, "", "", - NULL, - G_PARAM_WRITABLE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - /** - * NMRemoteConnection:unsaved: - * - * %TRUE if the remote connection contains changes that have not been saved - * to disk, %FALSE if the connection is the same as its on-disk representation. - * - * Since: 0.9.10 - **/ - g_object_class_install_property - (object_class, PROP_UNSAVED, - g_param_spec_boolean (NM_REMOTE_CONNECTION_UNSAVED, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /* Signals */ - /** - * NMRemoteConnection::updated: - * @connection: a #NMConnection - * - * This signal is emitted when a connection changes, and it is - * still visible to the user. - */ - signals[UPDATED] = - g_signal_new (NM_REMOTE_CONNECTION_UPDATED, - G_TYPE_FROM_CLASS (remote_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMRemoteConnectionClass, updated), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - /** - * NMRemoteConnection::removed: - * @connection: a #NMConnection - * - * This signal is emitted when a connection is either deleted or becomes - * invisible to the current user. - */ - signals[REMOVED] = - g_signal_new (NM_REMOTE_CONNECTION_REMOVED, - G_TYPE_FROM_CLASS (remote_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMRemoteConnectionClass, removed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - /* Private signal */ - signals[VISIBLE] = - g_signal_new ("visible", - G_TYPE_FROM_CLASS (remote_class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, G_TYPE_BOOLEAN); -} - -static void -nm_remote_connection_initable_iface_init (GInitableIface *iface) -{ - iface->init = init_sync; -} - -static void -nm_remote_connection_async_initable_iface_init (GAsyncInitableIface *iface) -{ - iface->init_async = init_async; - iface->init_finish = init_finish; -} diff --git a/libnm-glib/nm-remote-connection.h b/libnm-glib/nm-remote-connection.h deleted file mode 100644 index 1f951cfa..00000000 --- a/libnm-glib/nm-remote-connection.h +++ /dev/null @@ -1,148 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2011 Red Hat, Inc. - */ - -#ifndef __NM_REMOTE_CONNECTION_H__ -#define __NM_REMOTE_CONNECTION_H__ - -#include <glib-object.h> -#include <dbus/dbus-glib.h> - -#include "nm-connection.h" - -G_BEGIN_DECLS - -#define NM_TYPE_REMOTE_CONNECTION (nm_remote_connection_get_type ()) -#define NM_REMOTE_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_REMOTE_CONNECTION, NMRemoteConnection)) -#define NM_REMOTE_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_REMOTE_CONNECTION, NMRemoteConnectionClass)) -#define NM_IS_REMOTE_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_REMOTE_CONNECTION)) -#define NM_IS_REMOTE_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_REMOTE_CONNECTION)) -#define NM_REMOTE_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_REMOTE_CONNECTION, NMRemoteConnectionClass)) - -/** - * NMRemoteConnectionError: - * @NM_REMOTE_CONNECTION_ERROR_UNKNOWN: unknown or unclassified error - * @NM_REMOTE_CONNECTION_ERROR_DISCONNECTED: dbus disconnected - */ -typedef enum { - NM_REMOTE_CONNECTION_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_REMOTE_CONNECTION_ERROR_DISCONNECTED, /*< nick=Disconnected >*/ -} NMRemoteConnectionError; - -#define NM_REMOTE_CONNECTION_ERROR (nm_remote_connection_error_quark ()) -GQuark nm_remote_connection_error_quark (void); - -/* Properties */ -#define NM_REMOTE_CONNECTION_UNSAVED "unsaved" - -/* Signals */ -#define NM_REMOTE_CONNECTION_UPDATED "updated" -#define NM_REMOTE_CONNECTION_REMOVED "removed" - -typedef struct { - NMConnection parent; -} NMRemoteConnection; - -typedef struct { - NMConnectionClass parent_class; - - /* Signals */ - void (*updated) (NMRemoteConnection *connection, - GHashTable *new_settings); - - void (*removed) (NMRemoteConnection *connection); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMRemoteConnectionClass; - -/** - * NMRemoteConnectionResultFunc: - * @connection: the connection for which an operation was performed - * @error: on failure, a descriptive error - * @user_data: user data passed to function which began the operation - * - * Called when NetworkManager has finished an asynchronous operation on a - * connection, like commit changes, deleting, saving, etc. - */ -typedef void (*NMRemoteConnectionResultFunc) (NMRemoteConnection *connection, - GError *error, - gpointer user_data); - -/* Backwards compatibility */ -typedef NMRemoteConnectionResultFunc NMRemoteConnectionCommitFunc; -typedef NMRemoteConnectionResultFunc NMRemoteConnectionDeleteFunc; - -/** - * NMRemoteConnectionGetSecretsFunc: - * @connection: the connection for which secrets were requested - * @secrets: (element-type utf8 GLib.HashTable): on success, a hash table of - * hash tables, with each inner hash mapping a setting property to a #GValue - * containing that property's value - * @error: on failure, a descriptive error - * @user_data: user data passed to nm_remote_connection_get_secrets() - * - * Called when NetworkManager returns secrets in response to a request for - * secrets via nm_remote_connection_get_secrets(). - */ -typedef void (*NMRemoteConnectionGetSecretsFunc) (NMRemoteConnection *connection, - GHashTable *secrets, - GError *error, - gpointer user_data); - -GType nm_remote_connection_get_type (void); - -NMRemoteConnection *nm_remote_connection_new (DBusGConnection *bus, - const char *path); - -void nm_remote_connection_commit_changes (NMRemoteConnection *connection, - NMRemoteConnectionResultFunc callback, - gpointer user_data); - -NM_AVAILABLE_IN_0_9_10 -void nm_remote_connection_commit_changes_unsaved (NMRemoteConnection *connection, - NMRemoteConnectionResultFunc callback, - gpointer user_data); - -NM_AVAILABLE_IN_0_9_10 -void nm_remote_connection_save (NMRemoteConnection *connection, - NMRemoteConnectionResultFunc callback, - gpointer user_data); - -void nm_remote_connection_delete (NMRemoteConnection *connection, - NMRemoteConnectionResultFunc callback, - gpointer user_data); - -void nm_remote_connection_get_secrets (NMRemoteConnection *connection, - const char *setting_name, - NMRemoteConnectionGetSecretsFunc callback, - gpointer user_data); - -NM_AVAILABLE_IN_0_9_10 -gboolean nm_remote_connection_get_unsaved (NMRemoteConnection *connection); - -G_END_DECLS - -#endif /* __NM_REMOTE_CONNECTION__ */ diff --git a/libnm-glib/nm-remote-settings.c b/libnm-glib/nm-remote-settings.c deleted file mode 100644 index e8a80f6f..00000000 --- a/libnm-glib/nm-remote-settings.c +++ /dev/null @@ -1,1569 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 Novell, Inc. - * Copyright 2009 - 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "NetworkManager.h" -#include "nm-connection.h" -#include "nm-dbus-glib-types.h" -#include "nm-remote-settings.h" -#include "nm-remote-connection-private.h" -#include "nm-object-private.h" -#include "nm-dbus-helpers-private.h" -#include "nm-object-private.h" - -/** - * SECTION:nm-remote-settings - * @Short_description: A helper for NetworkManager's settings API - * @Title: NMRemoteSettings - * @See_also:#NMRemoteConnection, #NMClient - * - * The #NMRemoteSettings object represents NetworkManager's "settings" service, - * which stores network configuration and allows authenticated clients to - * add, delete, and modify that configuration. The data required to connect - * to a specific network is called a "connection" and encapsulated by the - * #NMConnection object. Once a connection is known to NetworkManager, having - * either been added by a user or read from on-disk storage, the - * #NMRemoteSettings object creates a #NMRemoteConnection object which - * represents this stored connection. Use the #NMRemoteConnection object to - * perform any operations like modification or deletion. - * - * To add a new network connection to the NetworkManager settings service, first - * build up a template #NMConnection object. Since this connection is not yet - * added to NetworkManager, it is known only to your program and is not yet - * an #NMRemoteConnection. Then ask #NMRemoteSettings to add your connection. - * When the connection is added successfully, the supplied callback is called - * and returns to your program the new #NMRemoteConnection which represents - * the stored object known to NetworkManager. - * - * |[<!-- language="C" --> - * static void - * added_cb (NMRemoteSettings *settings, - * NMRemoteConnection *remote, - * GError *error, - * gpointer user_data) - * { - * if (error) - * g_print ("Error adding connection: %s", error->message); - * else { - * g_print ("Added: %s\n", nm_connection_get_path (NM_CONNECTION (remote))); - * /* Use 'remote' with nm_remote_connection_commit_changes() to save - * * changes and nm_remote_connection_delete() to delete the connection */ - * } - * } - * - * static gboolean - * add_wired_connection (const char *human_name) - * { - * NMConnection *connection; - * NMSettingConnection *s_con; - * NMSettingWired *s_wired; - * char *uuid; - * gboolean success; - * - * connection = nm_connection_new (); - * - * /* Build up the 'connection' setting */ - * s_con = (NMSettingConnection *) nm_setting_connection_new (); - * uuid = nm_utils_uuid_generate (); - * g_object_set (G_OBJECT (s_con), - * NM_SETTING_CONNECTION_UUID, uuid, - * NM_SETTING_CONNECTION_ID, human_name, - * NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, - * NULL); - * g_free (uuid); - * nm_connection_add_setting (connection, NM_SETTING (s_con)); - * - * /* Add the required 'wired' setting as this is a wired connection */ - * nm_connection_add_setting (connection, nm_setting_wired_new ()); - * - * /* Add an 'ipv4' setting using AUTO configuration (eg DHCP) */ - * s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new (); - * g_object_set (G_OBJECT (s_ip4), - * NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, - * NULL); - * nm_connection_add_setting (connection, NM_SETTING (s_ip4)); - * - * /* Ask NetworkManager to store the connection */ - * success = nm_remote_settings_add_connection (settings, connection, added_cb, loop); - * - * /* Release the template connection; the actual stored connection will - * * be returned in added_cb() */ - * g_object_unref (connection); - * - * /* Let glib event loop run and added_cb() will be called when NetworkManager - * * is done adding the new connection. */ - * - * return success; - * } - * ]| - */ - -static void nm_remote_settings_initable_iface_init (GInitableIface *iface); -static void nm_remote_settings_async_initable_iface_init (GAsyncInitableIface *iface); - -G_DEFINE_TYPE_WITH_CODE (NMRemoteSettings, nm_remote_settings, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, nm_remote_settings_initable_iface_init); - G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, nm_remote_settings_async_initable_iface_init); - ) - -#define NM_REMOTE_SETTINGS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_REMOTE_SETTINGS, NMRemoteSettingsPrivate)) - -typedef struct { - DBusGConnection *bus; - gboolean inited; - - DBusGProxy *proxy; - GHashTable *connections; - GHashTable *pending; /* Connections we don't have settings for yet */ - gboolean service_running; - guint32 init_left; - - /* AddConnectionInfo objects that are waiting for the connection to become initialized */ - GSList *add_list; - - DBusGProxy *props_proxy; - char *hostname; - gboolean can_modify; - - DBusGProxy *dbus_proxy; - - DBusGProxyCall *listcon_call; -} NMRemoteSettingsPrivate; - -enum { - PROP_0, - PROP_BUS, - PROP_SERVICE_RUNNING, - PROP_HOSTNAME, - PROP_CAN_MODIFY, - - LAST_PROP -}; - -/* Signals */ -enum { - NEW_CONNECTION, - CONNECTIONS_READ, - - LAST_SIGNAL -}; -static guint signals[LAST_SIGNAL] = { 0 }; - -/*****************************************************************************/ - -/** - * nm_remote_settings_error_quark: - * - * Registers an error quark for #NMRemoteSettings if necessary. - * - * Returns: the error quark used for #NMRemoteSettings errors. - **/ -GQuark -nm_remote_settings_error_quark (void) -{ - static GQuark quark; - - if (G_UNLIKELY (!quark)) - quark = g_quark_from_static_string ("nm-remote-settings-error-quark"); - return quark; -} - -/*****************************************************************************/ - -static void -_nm_remote_settings_ensure_inited (NMRemoteSettings *self) -{ - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - GError *error = NULL; - - if (!priv->inited) { - if (!g_initable_init (G_INITABLE (self), NULL, &error)) { - /* Don't warn when the call times out because the settings service can't - * be activated or whatever. - */ - if (!g_error_matches (error, DBUS_GERROR, DBUS_GERROR_NO_REPLY)) { - g_warning ("%s: (NMRemoteSettings) error initializing: %s\n", - __func__, error->message); - } - g_error_free (error); - } - priv->inited = TRUE; - } -} - -/*****************************************************************************/ - -typedef struct { - NMRemoteSettings *self; - NMRemoteSettingsAddConnectionFunc callback; - gpointer callback_data; - NMRemoteConnection *connection; -} AddConnectionInfo; - -static AddConnectionInfo * -add_connection_info_find (NMRemoteSettings *self, NMRemoteConnection *connection) -{ - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - GSList *iter; - - for (iter = priv->add_list; iter; iter = g_slist_next (iter)) { - AddConnectionInfo *info = iter->data; - - if (info->connection == connection) - return info; - } - - return NULL; -} - -static void -add_connection_info_dispose (NMRemoteSettings *self, AddConnectionInfo *info) -{ - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - - priv->add_list = g_slist_remove (priv->add_list, info); - - g_free (info); -} - -static void -add_connection_info_complete (NMRemoteSettings *self, - AddConnectionInfo *info, - GError *error) -{ - g_return_if_fail (info != NULL); - - info->callback (info->self, error ? NULL : info->connection, error, info->callback_data); - add_connection_info_dispose (self, info); -} - -/** - * nm_remote_settings_get_connection_by_id: - * @settings: the %NMRemoteSettings - * @id: the id of the remote connection - * - * Returns the first matching %NMRemoteConnection matching a given @id. - * - * Returns: (transfer none): the remote connection object on success, or %NULL if no - * matching object was found. - * - * Since: 0.9.10 - **/ -NMRemoteConnection * -nm_remote_settings_get_connection_by_id (NMRemoteSettings *settings, const char *id) -{ - NMRemoteSettingsPrivate *priv; - - g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), NULL); - g_return_val_if_fail (id != NULL, NULL); - - priv = NM_REMOTE_SETTINGS_GET_PRIVATE (settings); - - _nm_remote_settings_ensure_inited (settings); - - if (priv->service_running) { - GHashTableIter iter; - NMConnection *candidate; - - g_hash_table_iter_init (&iter, priv->connections); - while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &candidate)) { - - if (!strcmp (id, nm_connection_get_id (candidate))) - return NM_REMOTE_CONNECTION (candidate); - } - } - - return NULL; -} - -/** - * nm_remote_settings_get_connection_by_path: - * @settings: the %NMRemoteSettings - * @path: the D-Bus object path of the remote connection - * - * Returns the %NMRemoteConnection representing the connection at @path. - * - * Returns: (transfer none): the remote connection object on success, or %NULL if the object was - * not known - **/ -NMRemoteConnection * -nm_remote_settings_get_connection_by_path (NMRemoteSettings *settings, const char *path) -{ - NMRemoteSettingsPrivate *priv; - - g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), NULL); - g_return_val_if_fail (path != NULL, NULL); - - priv = NM_REMOTE_SETTINGS_GET_PRIVATE (settings); - - _nm_remote_settings_ensure_inited (settings); - - return priv->service_running ? g_hash_table_lookup (priv->connections, path) : NULL; -} - -/** - * nm_remote_settings_get_connection_by_uuid: - * @settings: the %NMRemoteSettings - * @uuid: the UUID of the remote connection - * - * Returns the %NMRemoteConnection identified by @uuid. - * - * Returns: (transfer none): the remote connection object on success, or %NULL if the object was - * not known - **/ -NMRemoteConnection * -nm_remote_settings_get_connection_by_uuid (NMRemoteSettings *settings, const char *uuid) -{ - NMRemoteSettingsPrivate *priv; - GHashTableIter iter; - NMRemoteConnection *candidate; - - g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), NULL); - g_return_val_if_fail (uuid != NULL, NULL); - - priv = NM_REMOTE_SETTINGS_GET_PRIVATE (settings); - - _nm_remote_settings_ensure_inited (settings); - - if (priv->service_running) { - g_hash_table_iter_init (&iter, priv->connections); - while (g_hash_table_iter_next (&iter, NULL, (gpointer) &candidate)) { - if (g_strcmp0 (uuid, nm_connection_get_uuid (NM_CONNECTION (candidate))) == 0) - return candidate; - } - } - - return NULL; -} - -static void -connection_removed_cb (NMRemoteConnection *remote, gpointer user_data) -{ - NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - AddConnectionInfo *addinfo; - GError *add_error; - const char *path; - - /* Might have been removed while it was waiting to be initialized */ - addinfo = add_connection_info_find (self, remote); - if (addinfo) { - add_error = g_error_new_literal (NM_REMOTE_SETTINGS_ERROR, - NM_REMOTE_SETTINGS_ERROR_CONNECTION_REMOVED, - "Connection removed before it was initialized"); - add_connection_info_complete (self, addinfo, add_error); - g_error_free (add_error); - } - - path = nm_connection_get_path (NM_CONNECTION (remote)); - g_hash_table_remove (priv->connections, path); - g_hash_table_remove (priv->pending, path); -} - -static void connection_visible_cb (NMRemoteConnection *remote, - gboolean visible, - gpointer user_data); - -/* Takes a reference to the connection when adding to 'to' */ -static void -move_connection (NMRemoteSettings *self, - NMRemoteConnection *remote, - GHashTable *from, - GHashTable *to) -{ - const char *path = nm_connection_get_path (NM_CONNECTION (remote)); - - g_hash_table_insert (to, g_strdup (path), g_object_ref (remote)); - if (from) - g_hash_table_remove (from, path); - - /* Setup connection signals since removing from 'from' clears them, but - * also the first time the connection is added to a hash if 'from' is NULL. - */ - if (!g_signal_handler_find (remote, G_SIGNAL_MATCH_FUNC, - 0, 0, NULL, connection_removed_cb, NULL)) { - g_signal_connect (remote, - NM_REMOTE_CONNECTION_REMOVED, - G_CALLBACK (connection_removed_cb), - self); - } - - if (!g_signal_handler_find (remote, G_SIGNAL_MATCH_FUNC, - 0, 0, NULL, connection_visible_cb, NULL)) { - g_signal_connect (remote, - "visible", - G_CALLBACK (connection_visible_cb), - self); - } -} - -static void -connection_visible_cb (NMRemoteConnection *remote, - gboolean visible, - gpointer user_data) -{ - NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - const char *path; - - path = nm_connection_get_path (NM_CONNECTION (remote)); - g_assert (path); - - /* When a connection becomes invisible, we put it back in the pending - * hash until it becomes visible again. When it does, we move it back to - * the normal connections hash. - */ - if (visible) { - /* Connection visible to this user again */ - if (g_hash_table_lookup (priv->pending, path)) { - /* Move connection from pending to visible hash; emit for clients */ - move_connection (self, remote, priv->pending, priv->connections); - g_signal_emit (self, signals[NEW_CONNECTION], 0, remote); - } - } else { - /* Connection now invisible to this user */ - if (g_hash_table_lookup (priv->connections, path)) { - /* Move connection to pending hash and wait for it to become visible again */ - move_connection (self, remote, priv->connections, priv->pending); - - /* Signal to clients that the connection is gone; but we have to - * block our connection removed handler so we don't destroy - * the connection when the signal is emitted. - */ - g_signal_handlers_block_by_func (remote, connection_removed_cb, self); - g_signal_emit_by_name (remote, NM_REMOTE_CONNECTION_REMOVED); - g_signal_handlers_unblock_by_func (remote, connection_removed_cb, self); - } - } -} - -static void -connection_inited (GObject *source, GAsyncResult *result, gpointer user_data) -{ - NMRemoteConnection *remote = NM_REMOTE_CONNECTION (source); - NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - AddConnectionInfo *addinfo; - const char *path; - GError *error = NULL, *local; - static gboolean print_once = TRUE; - - path = nm_connection_get_path (NM_CONNECTION (remote)); - addinfo = add_connection_info_find (self, remote); - - if (g_async_initable_init_finish (G_ASYNC_INITABLE (remote), result, &error)) { - /* Connection is initialized and visible; expose it to clients */ - move_connection (self, remote, priv->pending, priv->connections); - - /* If there's a pending AddConnection request, complete that here before - * signaling new-connection. - */ - if (addinfo) - add_connection_info_complete (self, addinfo, NULL); - - /* Finally, let users know of the new connection now that it has all - * its settings and is valid. - */ - g_signal_emit (self, signals[NEW_CONNECTION], 0, remote); - } else { - if (addinfo) { - local = g_error_new (NM_REMOTE_SETTINGS_ERROR, - NM_REMOTE_SETTINGS_ERROR_CONNECTION_UNAVAILABLE, - "Connection not visible or not available: %s", - error->message); - add_connection_info_complete (self, addinfo, local); - g_error_free (local); - } - - /* PermissionDenied means the connection isn't visible to this user, so - * keep it in priv->pending to be notified later of visibility changes. - * Otherwise forget it. - */ - if (!dbus_g_error_has_name (error, "org.freedesktop.NetworkManager.Settings.PermissionDenied")) - g_hash_table_remove (priv->pending, path); - - if (print_once && g_error_matches (error, DBUS_GERROR, DBUS_GERROR_LIMITS_EXCEEDED)) { - g_printerr ("Warning: libnm-glib:%s(): a D-Bus limit exceeded: %s. The application might not work properly.\n" - "Consider increasing max_replies_per_connection limit in /etc/dbus-1/system.d/org.freedesktop.NetworkManager.conf " - "like <limit name=\"max_replies_per_connection\">2048</limit>", - __func__, error->message); - print_once = FALSE; - } - - g_error_free (error); - } - - /* Let listeners know that all connections have been found */ - priv->init_left--; - if (priv->init_left == 0) - g_signal_emit (self, signals[CONNECTIONS_READ], 0); - - g_object_unref (self); -} - -static NMRemoteConnection * -new_connection_cb (DBusGProxy *proxy, const char *path, gpointer user_data) -{ - NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - NMRemoteConnection *connection = NULL; - - /* Make double-sure we don't already have it */ - connection = g_hash_table_lookup (priv->pending, path); - if (connection) - return connection; - connection = g_hash_table_lookup (priv->connections, path); - if (connection) - return connection; - - /* Create a new connection object for it */ - connection = nm_remote_connection_new (priv->bus, path); - if (connection) { - g_async_initable_init_async (G_ASYNC_INITABLE (connection), - G_PRIORITY_DEFAULT, NULL, - connection_inited, g_object_ref (self)); - - /* Add the connection to the pending table to wait for it to retrieve - * it's settings asynchronously over D-Bus. The connection isn't - * really valid until it has all its settings, so hide it until it does. - */ - move_connection (self, connection, NULL, priv->pending); - g_object_unref (connection); /* move_connection() takes a ref */ - } - return connection; -} - -static void -fetch_connections_done (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - GPtrArray *connections; - GError *error = NULL; - int i; - - g_warn_if_fail (priv->listcon_call == call); - priv->listcon_call = NULL; - - if (!dbus_g_proxy_end_call (proxy, call, &error, - DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH, &connections, - G_TYPE_INVALID)) { - if ( !g_error_matches (error, DBUS_GERROR, DBUS_GERROR_SERVICE_UNKNOWN) - && !g_error_matches (error, DBUS_GERROR, DBUS_GERROR_NAME_HAS_NO_OWNER) - && priv->service_running) { - g_warning ("%s: error fetching connections: %s.", - __func__, - error->message ?: "(unknown)"); - } - g_clear_error (&error); - - /* We tried to read connections and failed */ - g_signal_emit (self, signals[CONNECTIONS_READ], 0); - return; - } - - /* Let listeners know we are done getting connections */ - if (connections->len == 0) - g_signal_emit (self, signals[CONNECTIONS_READ], 0); - else { - priv->init_left = connections->len; - for (i = 0; i < connections->len; i++) { - char *path = g_ptr_array_index (connections, i); - - new_connection_cb (proxy, path, user_data); - g_free (path); - } - } - - g_ptr_array_free (connections, TRUE); -} - -/** - * nm_remote_settings_list_connections: - * @settings: the %NMRemoteSettings - * - * Returns: (transfer container) (element-type NMRemoteConnection): a - * list containing all connections provided by the remote settings service. - * Each element of the returned list is a %NMRemoteConnection instance, which is - * owned by the %NMRemoteSettings object and should not be freed by the caller. - * The returned list is, however, owned by the caller and should be freed - * using g_slist_free() when no longer required. - **/ -GSList * -nm_remote_settings_list_connections (NMRemoteSettings *settings) -{ - NMRemoteSettingsPrivate *priv; - GSList *list = NULL; - GHashTableIter iter; - gpointer value; - - g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), NULL); - - priv = NM_REMOTE_SETTINGS_GET_PRIVATE (settings); - - _nm_remote_settings_ensure_inited (settings); - - if (priv->service_running) { - g_hash_table_iter_init (&iter, priv->connections); - while (g_hash_table_iter_next (&iter, NULL, &value)) - list = g_slist_prepend (list, NM_REMOTE_CONNECTION (value)); - } - - return list; -} - -static void -add_connection_done (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) -{ - AddConnectionInfo *info = user_data; - GError *error = NULL; - char *path = NULL; - - if (dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &path, G_TYPE_INVALID)) { - info->connection = new_connection_cb (proxy, path, info->self); - g_assert (info->connection); - /* Wait until this connection is fully initialized before calling the callback */ - g_free (path); - } else - add_connection_info_complete (info->self, info, error); - - g_clear_error (&error); -} - -/** - * nm_remote_settings_add_connection: - * @settings: the %NMRemoteSettings - * @connection: the connection to add. Note that this object's settings will be - * added, not the object itself - * @callback: (scope async): callback to be called when the add operation completes - * @user_data: (closure): caller-specific data passed to @callback - * - * Requests that the remote settings service add the given settings to a new - * connection. The connection is immediately written to disk. @connection is - * untouched by this function and only serves as a template of the settings to - * add. The #NMRemoteConnection object that represents what NetworkManager - * actually added is returned to @callback when the addition operation is complete. - * - * Note that the #NMRemoteConnection returned in @callback may not contain - * identical settings to @connection as NetworkManager may perform automatic - * completion and/or normalization of connection properties. - * - * Returns: %TRUE if the request was successful, %FALSE if it failed - **/ -gboolean -nm_remote_settings_add_connection (NMRemoteSettings *settings, - NMConnection *connection, - NMRemoteSettingsAddConnectionFunc callback, - gpointer user_data) -{ - NMRemoteSettingsPrivate *priv; - AddConnectionInfo *info; - GHashTable *new_settings; - - g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), FALSE); - g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); - g_return_val_if_fail (callback != NULL, FALSE); - - priv = NM_REMOTE_SETTINGS_GET_PRIVATE (settings); - - _nm_remote_settings_ensure_inited (settings); - - if (!priv->service_running) - return FALSE; - - info = g_malloc0 (sizeof (AddConnectionInfo)); - info->self = settings; - info->callback = callback; - info->callback_data = user_data; - - new_settings = nm_connection_to_hash (connection, NM_SETTING_HASH_FLAG_ALL); - dbus_g_proxy_begin_call (priv->proxy, "AddConnection", - add_connection_done, - info, - NULL, - DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, new_settings, - G_TYPE_INVALID); - g_hash_table_destroy (new_settings); - - priv->add_list = g_slist_append (priv->add_list, info); - - return TRUE; -} - -/** - * nm_remote_settings_add_connection_unsaved: - * @settings: the %NMRemoteSettings - * @connection: the connection to add. Note that this object's settings will be - * added, not the object itself - * @callback: (scope async): callback to be called when the add operation completes - * @user_data: (closure): caller-specific data passed to @callback - * - * Requests that the remote settings service add the given settings to a new - * connection. The connection is not written to disk, which may be done at - * a later time by calling the connection's nm_remote_connection_commit_changes() - * method. - * - * Returns: %TRUE if the request was successful, %FALSE if it failed - * - * Since: 0.9.10 - **/ -gboolean -nm_remote_settings_add_connection_unsaved (NMRemoteSettings *settings, - NMConnection *connection, - NMRemoteSettingsAddConnectionFunc callback, - gpointer user_data) -{ - NMRemoteSettingsPrivate *priv; - AddConnectionInfo *info; - GHashTable *new_settings; - - g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), FALSE); - g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE); - g_return_val_if_fail (callback != NULL, FALSE); - - priv = NM_REMOTE_SETTINGS_GET_PRIVATE (settings); - - _nm_remote_settings_ensure_inited (settings); - - if (!priv->service_running) - return FALSE; - - info = g_malloc0 (sizeof (AddConnectionInfo)); - info->self = settings; - info->callback = callback; - info->callback_data = user_data; - - new_settings = nm_connection_to_hash (connection, NM_SETTING_HASH_FLAG_ALL); - dbus_g_proxy_begin_call (priv->proxy, "AddConnectionUnsaved", - add_connection_done, - info, - NULL, - DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, new_settings, - G_TYPE_INVALID); - g_hash_table_destroy (new_settings); - - priv->add_list = g_slist_append (priv->add_list, info); - - return TRUE; -} - -/** - * nm_remote_settings_load_connections: - * @settings: the %NMRemoteSettings - * @filenames: %NULL-terminated array of filenames to load - * @failures: (out) (transfer full): on return, a %NULL-terminated array of - * filenames that failed to load - * @error: return location for #GError - * - * Requests that the remote settings service load or reload the given files, - * adding or updating the connections described within. - * - * The changes to the indicated files will not yet be reflected in - * @settings's connections array when the function returns. - * - * If all of the indicated files were successfully loaded, the - * function will return %TRUE, and @failures will be set to %NULL. If - * NetworkManager tried to load the files, but some (or all) failed, - * then @failures will be set to a %NULL-terminated array of the - * filenames that failed to load. - - * Returns: %TRUE if NetworkManager at least tried to load @filenames, - * %FALSE if an error occurred (eg, permission denied). - * - * Since: 0.9.10 - **/ -gboolean -nm_remote_settings_load_connections (NMRemoteSettings *settings, - char **filenames, - char ***failures, - GError **error) -{ - NMRemoteSettingsPrivate *priv; - char **my_failures = NULL; - gboolean ret; - - g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), FALSE); - g_return_val_if_fail (filenames != NULL, FALSE); - - priv = NM_REMOTE_SETTINGS_GET_PRIVATE (settings); - - _nm_remote_settings_ensure_inited (settings); - - if (!priv->service_running) { - g_set_error_literal (error, NM_REMOTE_SETTINGS_ERROR, - NM_REMOTE_SETTINGS_ERROR_SERVICE_UNAVAILABLE, - "NetworkManager is not running."); - return FALSE; - } - - if (!dbus_g_proxy_call (priv->proxy, "LoadConnections", error, - G_TYPE_STRV, filenames, - G_TYPE_INVALID, - G_TYPE_BOOLEAN, &ret, - G_TYPE_STRV, &my_failures, - G_TYPE_INVALID)) - ret = FALSE; - - if (failures) { - if (my_failures && !*my_failures) - g_clear_pointer (&my_failures, g_free); - *failures = my_failures; - } else - g_strfreev (my_failures); - - return ret; -} - -/** - * nm_remote_settings_reload_connections: - * @settings: the #NMRemoteSettings - * @error: return location for #GError - * - * Requests that the remote settings service reload all connection - * files from disk, adding, updating, and removing connections until - * the in-memory state matches the on-disk state. - * - * Return value: %TRUE on success, %FALSE on failure - * - * Since: 0.9.10 - **/ -gboolean -nm_remote_settings_reload_connections (NMRemoteSettings *settings, - GError **error) -{ - NMRemoteSettingsPrivate *priv; - gboolean success; - - g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), FALSE); - - priv = NM_REMOTE_SETTINGS_GET_PRIVATE (settings); - - _nm_remote_settings_ensure_inited (settings); - - if (!priv->service_running) { - g_set_error_literal (error, NM_REMOTE_SETTINGS_ERROR, - NM_REMOTE_SETTINGS_ERROR_SERVICE_UNAVAILABLE, - "NetworkManager is not running."); - return FALSE; - } - - if (!dbus_g_proxy_call (priv->proxy, "ReloadConnections", error, - G_TYPE_INVALID, - G_TYPE_BOOLEAN, &success, - G_TYPE_INVALID)) - return FALSE; - return success; -} - -static void -clear_one_hash (GHashTable *table) -{ - GHashTableIter iter; - gpointer value; - GSList *list = NULL, *list_iter; - - /* Build up the list of connections; we can't emit "removed" during hash - * table iteration because emission of the "removed" signal may trigger code - * that explicitly removes the connection from the hash table somewhere - * else. - */ - g_hash_table_iter_init (&iter, table); - while (g_hash_table_iter_next (&iter, NULL, &value)) - list = g_slist_prepend (list, NM_REMOTE_CONNECTION (value)); - - for (list_iter = list; list_iter; list_iter = g_slist_next (list_iter)) - g_signal_emit_by_name (NM_REMOTE_CONNECTION (list_iter->data), NM_REMOTE_CONNECTION_REMOVED); - g_slist_free (list); - - g_hash_table_remove_all (table); -} - -typedef struct { - NMRemoteSettings *settings; - NMRemoteSettingsSaveHostnameFunc callback; - gpointer callback_data; -} SaveHostnameInfo; - -static void -save_hostname_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - SaveHostnameInfo *info = user_data; - GError *error = NULL; - - dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); - if (info->callback != NULL) - info->callback (info->settings, error, info->callback_data); - g_clear_error (&error); -} - -/** - * nm_remote_settings_save_hostname: - * @settings: the %NMRemoteSettings - * @hostname: the new persistent hostname to set, or %NULL to clear any existing - * persistent hostname - * @callback: (scope async) (allow-none): callback to be called when the - * hostname operation completes - * @user_data: (closure): caller-specific data passed to @callback - * - * Requests that the machine's persistent hostname be set to the specified value - * or cleared. - * - * Returns: %TRUE if the request was successful, %FALSE if it failed - **/ -gboolean -nm_remote_settings_save_hostname (NMRemoteSettings *settings, - const char *hostname, - NMRemoteSettingsSaveHostnameFunc callback, - gpointer user_data) -{ - NMRemoteSettingsPrivate *priv; - SaveHostnameInfo *info; - - g_return_val_if_fail (NM_IS_REMOTE_SETTINGS (settings), FALSE); - g_return_val_if_fail (hostname != NULL, FALSE); - g_return_val_if_fail (callback != NULL, FALSE); - - priv = NM_REMOTE_SETTINGS_GET_PRIVATE (settings); - - _nm_remote_settings_ensure_inited (settings); - - if (!priv->service_running) - return FALSE; - - info = g_malloc0 (sizeof (SaveHostnameInfo)); - info->settings = settings; - info->callback = callback; - info->callback_data = user_data; - - dbus_g_proxy_begin_call (priv->proxy, "SaveHostname", - save_hostname_cb, - info, - g_free, - G_TYPE_STRING, hostname ?: "", - G_TYPE_INVALID); - return TRUE; -} - -static void -properties_changed_cb (DBusGProxy *proxy, - GHashTable *properties, - gpointer user_data) -{ - NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - GHashTableIter iter; - gpointer key, tmp; - - g_hash_table_iter_init (&iter, properties); - while (g_hash_table_iter_next (&iter, &key, &tmp)) { - GValue *value = tmp; - - if (!strcmp ((const char *) key, "Hostname")) { - g_free (priv->hostname); - priv->hostname = g_value_dup_string (value); - g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_HOSTNAME); - } - - if (!strcmp ((const char *) key, "CanModify")) { - priv->can_modify = g_value_get_boolean (value); - g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_CAN_MODIFY); - } - } -} - -static void -nm_appeared_got_properties (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) -{ - NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - GHashTable *props = NULL; - - if (dbus_g_proxy_end_call (proxy, call, NULL, - DBUS_TYPE_G_MAP_OF_VARIANT, &props, - G_TYPE_INVALID)) { - properties_changed_cb (priv->props_proxy, props, self); - g_hash_table_destroy (props); - } -} - -static void -name_owner_changed (DBusGProxy *proxy, - const char *name, - const char *old_owner, - const char *new_owner, - gpointer user_data) -{ - NMRemoteSettings *self = NM_REMOTE_SETTINGS (user_data); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - const char *sname = NM_DBUS_SERVICE; - - if (!strcmp (name, sname)) { - if (new_owner && strlen (new_owner) > 0) { - priv->service_running = TRUE; - - priv->listcon_call = dbus_g_proxy_begin_call (priv->proxy, "ListConnections", - fetch_connections_done, self, NULL, - G_TYPE_INVALID); - - dbus_g_proxy_begin_call (priv->props_proxy, "GetAll", - nm_appeared_got_properties, self, NULL, - G_TYPE_STRING, NM_DBUS_IFACE_SETTINGS, - G_TYPE_INVALID); - } else { - priv->service_running = FALSE; - - clear_one_hash (priv->pending); - clear_one_hash (priv->connections); - - /* Clear properties */ - g_free (priv->hostname); - priv->hostname = NULL; - g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_HOSTNAME); - - priv->can_modify = FALSE; - g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_CAN_MODIFY); - - if (priv->listcon_call) { - dbus_g_proxy_cancel_call (priv->proxy, priv->listcon_call); - priv->listcon_call = NULL; - } - } - g_object_notify (G_OBJECT (self), NM_REMOTE_SETTINGS_SERVICE_RUNNING); - } -} - -/*****************************************************************************/ - -/** - * nm_remote_settings_new: - * @bus: (allow-none): a valid and connected D-Bus connection - * - * Creates a new object representing the remote settings service. - * - * Note that this will do blocking D-Bus calls to initialize the - * settings object. You can use nm_remote_settings_new_async() if you - * want to avoid that. - * - * Returns: the new remote settings object on success, or %NULL on failure - **/ -NMRemoteSettings * -nm_remote_settings_new (DBusGConnection *bus) -{ - NMRemoteSettings *self; - - self = g_object_new (NM_TYPE_REMOTE_SETTINGS, NM_REMOTE_SETTINGS_BUS, bus, NULL); - _nm_remote_settings_ensure_inited (self); - return self; -} - -static void -remote_settings_inited (GObject *source, GAsyncResult *result, gpointer user_data) -{ - GSimpleAsyncResult *simple = user_data; - GError *error = NULL; - - if (!g_async_initable_init_finish (G_ASYNC_INITABLE (source), result, &error)) - g_simple_async_result_take_error (simple, error); - else - g_simple_async_result_set_op_res_gpointer (simple, source, g_object_unref); - g_simple_async_result_complete (simple); - g_object_unref (simple); -} - -/** - * nm_remote_settings_new_async: - * @bus: (allow-none): a valid and connected D-Bus connection - * @cancellable: a #GCancellable, or %NULL - * @callback: callback to call when the settings object is created - * @user_data: data for @callback - * - * Creates a new object representing the remote settings service and - * begins asynchronously initializing it. @callback will be called - * when it is done; use nm_remote_settings_new_finish() to get the - * result. - **/ -void -nm_remote_settings_new_async (DBusGConnection *bus, GCancellable *cancellable, - GAsyncReadyCallback callback, gpointer user_data) -{ - NMRemoteSettings *self; - GSimpleAsyncResult *simple; - - simple = g_simple_async_result_new (NULL, callback, user_data, nm_remote_settings_new_async); - if (cancellable) - g_simple_async_result_set_check_cancellable (simple, cancellable); - - self = g_object_new (NM_TYPE_REMOTE_SETTINGS, - NM_REMOTE_SETTINGS_BUS, bus, - NULL); - g_async_initable_init_async (G_ASYNC_INITABLE (self), G_PRIORITY_DEFAULT, - cancellable, remote_settings_inited, simple); -} - -/** - * nm_remote_settings_new_finish: - * @result: a #GAsyncResult - * @error: location for a #GError, or %NULL - * - * Gets the result of an nm_remote_settings_new_async() call. - * - * Returns: a new #NMRemoteSettings object, or %NULL on error - **/ -NMRemoteSettings * -nm_remote_settings_new_finish (GAsyncResult *result, GError **error) -{ - GSimpleAsyncResult *simple; - - g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, nm_remote_settings_new_async), NULL); - - simple = G_SIMPLE_ASYNC_RESULT (result); - if (g_simple_async_result_propagate_error (simple, error)) - return NULL; - else - return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple)); -} - -static void -forget_connection (gpointer user_data) -{ - NMRemoteConnection *remote = NM_REMOTE_CONNECTION (user_data); - - g_signal_handlers_disconnect_matched (remote, G_SIGNAL_MATCH_FUNC, - 0, 0, NULL, connection_removed_cb, NULL); - g_signal_handlers_disconnect_matched (remote, G_SIGNAL_MATCH_FUNC, - 0, 0, NULL, connection_visible_cb, NULL); - g_object_unref (remote); -} - -static void -nm_remote_settings_init (NMRemoteSettings *self) -{ - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - - priv->connections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, forget_connection); - priv->pending = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, forget_connection); -} - -static void -constructed (GObject *object) -{ - NMRemoteSettingsPrivate *priv; - - priv = NM_REMOTE_SETTINGS_GET_PRIVATE (object); - - /* D-Bus proxy for clearing connections on NameOwnerChanged */ - priv->dbus_proxy = dbus_g_proxy_new_for_name (priv->bus, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS); - g_assert (priv->dbus_proxy); - - dbus_g_object_register_marshaller (g_cclosure_marshal_generic, - G_TYPE_NONE, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_add_signal (priv->dbus_proxy, "NameOwnerChanged", - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->dbus_proxy, - "NameOwnerChanged", - G_CALLBACK (name_owner_changed), - object, NULL); - - priv->proxy = _nm_dbus_new_proxy_for_connection (priv->bus, - NM_DBUS_PATH_SETTINGS, - NM_DBUS_IFACE_SETTINGS); - g_assert (priv->proxy); - dbus_g_proxy_set_default_timeout (priv->proxy, G_MAXINT); - - dbus_g_proxy_add_signal (priv->proxy, "NewConnection", - DBUS_TYPE_G_OBJECT_PATH, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->proxy, "NewConnection", - G_CALLBACK (new_connection_cb), - object, - NULL); - - /* D-Bus properties proxy */ - priv->props_proxy = _nm_dbus_new_proxy_for_connection (priv->bus, - NM_DBUS_PATH_SETTINGS, - DBUS_INTERFACE_PROPERTIES); - g_assert (priv->props_proxy); - - /* Monitor properties */ - dbus_g_object_register_marshaller (g_cclosure_marshal_generic, - G_TYPE_NONE, - DBUS_TYPE_G_MAP_OF_VARIANT, - G_TYPE_INVALID); - dbus_g_proxy_add_signal (priv->proxy, "PropertiesChanged", - DBUS_TYPE_G_MAP_OF_VARIANT, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->proxy, "PropertiesChanged", - G_CALLBACK (properties_changed_cb), - object, - NULL); -} - -static gboolean -init_sync (GInitable *initable, GCancellable *cancellable, GError **error) -{ - NMRemoteSettings *settings = NM_REMOTE_SETTINGS (initable); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (settings); - GHashTable *props; - - if (!dbus_g_proxy_call (priv->dbus_proxy, "NameHasOwner", error, - G_TYPE_STRING, NM_DBUS_SERVICE, - G_TYPE_INVALID, - G_TYPE_BOOLEAN, &priv->service_running, - G_TYPE_INVALID)) { - priv->service_running = FALSE; - return FALSE; - } - - /* If NM isn't running we'll grab properties from name_owner_changed() - * when it starts. - */ - if (!priv->service_running) - return TRUE; - - priv->listcon_call = dbus_g_proxy_begin_call (priv->proxy, "ListConnections", - fetch_connections_done, NM_REMOTE_SETTINGS (initable), NULL, - G_TYPE_INVALID); - - /* Get properties */ - if (!dbus_g_proxy_call (priv->props_proxy, "GetAll", error, - G_TYPE_STRING, NM_DBUS_IFACE_SETTINGS, - G_TYPE_INVALID, - DBUS_TYPE_G_MAP_OF_VARIANT, &props, - G_TYPE_INVALID)) - return FALSE; - properties_changed_cb (priv->props_proxy, props, settings); - g_hash_table_destroy (props); - - return TRUE; -} - -typedef struct { - NMRemoteSettings *settings; - GSimpleAsyncResult *result; -} NMRemoteSettingsInitData; - -static void -init_async_complete (NMRemoteSettingsInitData *init_data) -{ - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (init_data->settings); - - priv->inited = TRUE; - - g_simple_async_result_complete (init_data->result); - g_object_unref (init_data->result); - g_slice_free (NMRemoteSettingsInitData, init_data); -} - -static void -init_read_connections (NMRemoteSettings *settings, gpointer user_data) -{ - NMRemoteSettingsInitData *init_data = user_data; - - g_signal_handlers_disconnect_by_func (settings, G_CALLBACK (init_read_connections), user_data); - - init_async_complete (init_data); -} - -static void -init_async_got_properties (DBusGProxy *proxy, DBusGProxyCall *call, - gpointer user_data) -{ - NMRemoteSettingsInitData *init_data = user_data; - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (init_data->settings); - GHashTable *props; - GError *error = NULL; - - if (dbus_g_proxy_end_call (proxy, call, &error, - DBUS_TYPE_G_MAP_OF_VARIANT, &props, - G_TYPE_INVALID)) { - properties_changed_cb (priv->props_proxy, props, init_data->settings); - g_hash_table_destroy (props); - g_simple_async_result_set_op_res_gboolean (init_data->result, TRUE); - } else - g_simple_async_result_take_error (init_data->result, error); - - /* Read connections and wait for the result */ - priv->listcon_call = dbus_g_proxy_begin_call (priv->proxy, "ListConnections", - fetch_connections_done, init_data->settings, NULL, - G_TYPE_INVALID); - g_signal_connect (init_data->settings, "connections-read", - G_CALLBACK (init_read_connections), init_data); -} - -static void -init_get_properties (NMRemoteSettingsInitData *init_data) -{ - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (init_data->settings); - - dbus_g_proxy_begin_call (priv->props_proxy, "GetAll", - init_async_got_properties, init_data, NULL, - G_TYPE_STRING, NM_DBUS_IFACE_SETTINGS, - G_TYPE_INVALID); -} - -static void -init_async_got_manager_running (DBusGProxy *proxy, DBusGProxyCall *call, - gpointer user_data) -{ - NMRemoteSettingsInitData *init_data = user_data; - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (init_data->settings); - GError *error = NULL; - - if (!dbus_g_proxy_end_call (proxy, call, &error, - G_TYPE_BOOLEAN, &priv->service_running, - G_TYPE_INVALID)) { - g_simple_async_result_take_error (init_data->result, error); - init_async_complete (init_data); - return; - } - - if (!priv->service_running) { - g_simple_async_result_set_op_res_gboolean (init_data->result, TRUE); - init_async_complete (init_data); - return; - } - - init_get_properties (init_data); -} - -static void -init_async (GAsyncInitable *initable, int io_priority, - GCancellable *cancellable, GAsyncReadyCallback callback, - gpointer user_data) -{ - NMRemoteSettingsInitData *init_data; - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (initable); - - init_data = g_slice_new0 (NMRemoteSettingsInitData); - init_data->settings = NM_REMOTE_SETTINGS (initable); - init_data->result = g_simple_async_result_new (G_OBJECT (initable), callback, - user_data, init_async); - if (cancellable) - g_simple_async_result_set_check_cancellable (init_data->result, cancellable); - - /* Check if NM is running */ - dbus_g_proxy_begin_call (priv->dbus_proxy, "NameHasOwner", - init_async_got_manager_running, - init_data, NULL, - G_TYPE_STRING, NM_DBUS_SERVICE, - G_TYPE_INVALID); -} - -static gboolean -init_finish (GAsyncInitable *initable, GAsyncResult *result, GError **error) -{ - GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); - - if (g_simple_async_result_propagate_error (simple, error)) - return FALSE; - else - return TRUE; -} - -static void -dispose (GObject *object) -{ - NMRemoteSettings *self = NM_REMOTE_SETTINGS (object); - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (self); - - while (g_slist_length (priv->add_list)) - add_connection_info_dispose (self, (AddConnectionInfo *) priv->add_list->data); - - if (priv->connections) { - g_hash_table_destroy (priv->connections); - priv->connections = NULL; - } - - if (priv->pending) { - g_hash_table_destroy (priv->pending); - priv->pending = NULL; - } - - g_free (priv->hostname); - priv->hostname = NULL; - - g_clear_object (&priv->dbus_proxy); - g_clear_object (&priv->proxy); - g_clear_object (&priv->props_proxy); - - if (priv->bus) { - dbus_g_connection_unref (priv->bus); - priv->bus = NULL; - } - - G_OBJECT_CLASS (nm_remote_settings_parent_class)->dispose (object); -} - -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_BUS: - /* construct-only */ - priv->bus = g_value_dup_boxed (value); - if (!priv->bus) - priv->bus = _nm_dbus_new_connection (NULL); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMRemoteSettingsPrivate *priv = NM_REMOTE_SETTINGS_GET_PRIVATE (object); - - _nm_remote_settings_ensure_inited (NM_REMOTE_SETTINGS (object)); - - switch (prop_id) { - case PROP_BUS: - g_value_set_boxed (value, priv->bus); - break; - case PROP_SERVICE_RUNNING: - g_value_set_boolean (value, priv->service_running); - break; - case PROP_HOSTNAME: - g_value_set_string (value, priv->hostname); - break; - case PROP_CAN_MODIFY: - g_value_set_boolean (value, priv->can_modify); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_remote_settings_class_init (NMRemoteSettingsClass *class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (class); - - g_type_class_add_private (class, sizeof (NMRemoteSettingsPrivate)); - - /* Virtual methods */ - object_class->constructed = constructed; - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->dispose = dispose; - - /* Properties */ - - /** - * NMRemoteSettings:bus: - * - * The #DBusGConnection that the #NMRemoteSettings is connected to. Defaults - * to the system bus if not specified. - */ - g_object_class_install_property - (object_class, PROP_BUS, - g_param_spec_boxed (NM_REMOTE_SETTINGS_BUS, "", "", - DBUS_TYPE_G_CONNECTION, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - /** - * NMRemoteSettings:service-running: - * - * Whether the settings service is running. - */ - g_object_class_install_property - (object_class, PROP_SERVICE_RUNNING, - g_param_spec_boolean (NM_REMOTE_SETTINGS_SERVICE_RUNNING, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMRemoteSettings:hostname: - * - * The machine hostname stored in persistent configuration. This can be - * modified by calling nm_remote_settings_save_hostname(). - */ - g_object_class_install_property - (object_class, PROP_HOSTNAME, - g_param_spec_string (NM_REMOTE_SETTINGS_HOSTNAME, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMRemoteSettings:can-modify: - * - * If %TRUE, adding and modifying connections is supported. - */ - g_object_class_install_property - (object_class, PROP_CAN_MODIFY, - g_param_spec_boolean (NM_REMOTE_SETTINGS_CAN_MODIFY, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /* Signals */ - signals[NEW_CONNECTION] = - g_signal_new (NM_REMOTE_SETTINGS_NEW_CONNECTION, - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMRemoteSettingsClass, new_connection), - NULL, NULL, NULL, - G_TYPE_NONE, 1, G_TYPE_OBJECT); - - signals[CONNECTIONS_READ] = - g_signal_new (NM_REMOTE_SETTINGS_CONNECTIONS_READ, - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMRemoteSettingsClass, connections_read), - NULL, NULL, NULL, - G_TYPE_NONE, 0); -} - -static void -nm_remote_settings_initable_iface_init (GInitableIface *iface) -{ - iface->init = init_sync; -} - -static void -nm_remote_settings_async_initable_iface_init (GAsyncInitableIface *iface) -{ - iface->init_async = init_async; - iface->init_finish = init_finish; -} diff --git a/libnm-glib/nm-remote-settings.h b/libnm-glib/nm-remote-settings.h deleted file mode 100644 index 2f9e00a0..00000000 --- a/libnm-glib/nm-remote-settings.h +++ /dev/null @@ -1,159 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 Novell, Inc. - * Copyright 2009 - 2011 Red Hat, Inc. - */ - -#ifndef NM_REMOTE_SETTINGS_H -#define NM_REMOTE_SETTINGS_H - -#include <gio/gio.h> -#include <dbus/dbus-glib.h> -#include "nm-connection.h" -#include "nm-remote-connection.h" - -G_BEGIN_DECLS - -#define NM_TYPE_REMOTE_SETTINGS (nm_remote_settings_get_type ()) -#define NM_REMOTE_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_REMOTE_SETTINGS, NMRemoteSettings)) -#define NM_REMOTE_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_REMOTE_SETTINGS, NMRemoteSettingsClass)) -#define NM_IS_REMOTE_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_REMOTE_SETTINGS)) -#define NM_IS_REMOTE_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_REMOTE_SETTINGS)) -#define NM_REMOTE_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_REMOTE_SETTINGS, NMRemoteSettingsClass)) - -/** - * NMRemoteSettingsError: - * @NM_REMOTE_SETTINGS_ERROR_UNKNOWN: unknown or unclassified error - * @NM_REMOTE_SETTINGS_ERROR_CONNECTION_REMOVED: the #NMRemoteConnection object - * was removed before it was completely initialized - * @NM_REMOTE_SETTINGS_ERROR_CONNECTION_UNAVAILABLE: the #NMRemoteConnection object - * is not visible or otherwise unreadable - * @NM_REMOTE_SETTINGS_ERROR_SERVICE_UNAVAILABLE: NetworkManager is not running. - * (Since 0.9.10) - * - * Describes errors that may result from operations involving a #NMRemoteSettings. - * - **/ -typedef enum { - NM_REMOTE_SETTINGS_ERROR_UNKNOWN = 0, /*< nick=UnknownError >*/ - NM_REMOTE_SETTINGS_ERROR_CONNECTION_REMOVED, /*< nick=ConnectionRemoved >*/ - NM_REMOTE_SETTINGS_ERROR_CONNECTION_UNAVAILABLE, /*< nick=ConnectionUnavailable >*/ - NM_REMOTE_SETTINGS_ERROR_SERVICE_UNAVAILABLE, /*< nick=ServiceUnavailable >*/ -} NMRemoteSettingsError; - -#define NM_REMOTE_SETTINGS_ERROR nm_remote_settings_error_quark () -GQuark nm_remote_settings_error_quark (void); - -#define NM_REMOTE_SETTINGS_BUS "bus" -#define NM_REMOTE_SETTINGS_SERVICE_RUNNING "service-running" -#define NM_REMOTE_SETTINGS_HOSTNAME "hostname" -#define NM_REMOTE_SETTINGS_CAN_MODIFY "can-modify" - -#define NM_REMOTE_SETTINGS_NEW_CONNECTION "new-connection" -#define NM_REMOTE_SETTINGS_CONNECTIONS_READ "connections-read" - -typedef struct _NMRemoteSettings NMRemoteSettings; -typedef struct _NMRemoteSettingsClass NMRemoteSettingsClass; - -typedef void (*NMRemoteSettingsAddConnectionFunc) (NMRemoteSettings *settings, - NMRemoteConnection *connection, - GError *error, - gpointer user_data); - -typedef void (*NMRemoteSettingsLoadConnectionsFunc) (NMRemoteSettings *settings, - char **failures, - GError *error, - gpointer user_data); - -typedef void (*NMRemoteSettingsSaveHostnameFunc) (NMRemoteSettings *settings, - GError *error, - gpointer user_data); - -struct _NMRemoteSettings { - GObject parent; -}; - -struct _NMRemoteSettingsClass { - GObjectClass parent; - - /* Signals */ - void (*new_connection) (NMRemoteSettings *settings, - NMRemoteConnection *connection); - - void (*connections_read) (NMRemoteSettings *settings); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -}; - -GType nm_remote_settings_get_type (void); - -NMRemoteSettings *nm_remote_settings_new (DBusGConnection *bus); - -void nm_remote_settings_new_async (DBusGConnection *bus, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -NMRemoteSettings *nm_remote_settings_new_finish (GAsyncResult *result, - GError **error); - -GSList *nm_remote_settings_list_connections (NMRemoteSettings *settings); - -NMRemoteConnection *nm_remote_settings_get_connection_by_id (NMRemoteSettings *settings, - const char *id); - -NMRemoteConnection * nm_remote_settings_get_connection_by_path (NMRemoteSettings *settings, - const char *path); - -NMRemoteConnection *nm_remote_settings_get_connection_by_uuid (NMRemoteSettings *settings, - const char *uuid); - -gboolean nm_remote_settings_add_connection (NMRemoteSettings *settings, - NMConnection *connection, - NMRemoteSettingsAddConnectionFunc callback, - gpointer user_data); - -NM_AVAILABLE_IN_0_9_10 -gboolean nm_remote_settings_add_connection_unsaved (NMRemoteSettings *settings, - NMConnection *connection, - NMRemoteSettingsAddConnectionFunc callback, - gpointer user_data); - -NM_AVAILABLE_IN_0_9_10 -gboolean nm_remote_settings_load_connections (NMRemoteSettings *settings, - char **filenames, - char ***failures, - GError **error); - -NM_AVAILABLE_IN_0_9_10 -gboolean nm_remote_settings_reload_connections (NMRemoteSettings *settings, - GError **error); - -gboolean nm_remote_settings_save_hostname (NMRemoteSettings *settings, - const char *hostname, - NMRemoteSettingsSaveHostnameFunc callback, - gpointer user_data); - -G_END_DECLS - -#endif /* NM_REMOTE_SETTINGS_H */ diff --git a/libnm-glib/nm-secret-agent.c b/libnm-glib/nm-secret-agent.c deleted file mode 100644 index 361af6f8..00000000 --- a/libnm-glib/nm-secret-agent.c +++ /dev/null @@ -1,1052 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2010 - 2011 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> -#include <dbus/dbus-glib-lowlevel.h> - -#include "NetworkManager.h" -#include "nm-secret-agent.h" -#include "nm-glib-enum-types.h" -#include "nm-dbus-helpers-private.h" -#include "nm-setting-private.h" - -static void impl_secret_agent_get_secrets (NMSecretAgent *self, - GHashTable *connection_hash, - const char *connection_path, - const char *setting_name, - const char **hints, - guint32 flags, - DBusGMethodInvocation *context); - -static void impl_secret_agent_cancel_get_secrets (NMSecretAgent *self, - const char *connection_path, - const char *setting_name, - DBusGMethodInvocation *context); - -static void impl_secret_agent_save_secrets (NMSecretAgent *self, - GHashTable *connection_hash, - const char *connection_path, - DBusGMethodInvocation *context); - -static void impl_secret_agent_delete_secrets (NMSecretAgent *self, - GHashTable *connection_hash, - const char *connection_path, - DBusGMethodInvocation *context); - -#include "nm-secret-agent-glue.h" - -G_DEFINE_ABSTRACT_TYPE (NMSecretAgent, nm_secret_agent, G_TYPE_OBJECT) - -#define NM_SECRET_AGENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SECRET_AGENT, NMSecretAgentPrivate)) - -static gboolean auto_register_cb (gpointer user_data); - -typedef struct { - gboolean registered; - NMSecretAgentCapabilities capabilities; - - DBusGConnection *bus; - DBusGProxy *dbus_proxy; - DBusGProxy *manager_proxy; - DBusGProxyCall *reg_call; - - /* GetSecretsInfo structs of in-flight GetSecrets requests */ - GSList *pending_gets; - - char *nm_owner; - - char *identifier; - gboolean auto_register; - gboolean suppress_auto; - gboolean auto_register_id; -} NMSecretAgentPrivate; - -enum { - PROP_0, - PROP_IDENTIFIER, - PROP_AUTO_REGISTER, - PROP_REGISTERED, - PROP_CAPABILITIES, - - LAST_PROP -}; - -enum { - REGISTRATION_RESULT, - - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -/*****************************************************************************/ - -GQuark -nm_secret_agent_error_quark (void) -{ - static GQuark ret = 0; - - if (G_UNLIKELY (ret == 0)) - ret = g_quark_from_static_string ("nm-secret-agent-error"); - return ret; -} - -/*****************************************************************************/ - -static const char * -get_nm_owner (NMSecretAgent *self) -{ - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - GError *error = NULL; - char *owner; - - if (!priv->nm_owner) { - if (!dbus_g_proxy_call_with_timeout (priv->dbus_proxy, - "GetNameOwner", 2000, &error, - G_TYPE_STRING, NM_DBUS_SERVICE, - G_TYPE_INVALID, - G_TYPE_STRING, &owner, - G_TYPE_INVALID)) - return NULL; - - priv->nm_owner = g_strdup (owner); - g_free (owner); - } - - return priv->nm_owner; -} - -static void -_internal_unregister (NMSecretAgent *self) -{ - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - - if (priv->registered) { - dbus_g_connection_unregister_g_object (priv->bus, G_OBJECT (self)); - priv->registered = FALSE; - g_object_notify (G_OBJECT (self), NM_SECRET_AGENT_REGISTERED); - } -} - -typedef struct { - char *path; - char *setting_name; - DBusGMethodInvocation *context; -} GetSecretsInfo; - -static void -get_secrets_info_finalize (NMSecretAgent *self, GetSecretsInfo *info) -{ - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - - g_return_if_fail (info != NULL); - - priv->pending_gets = g_slist_remove (priv->pending_gets, info); - - g_free (info->path); - g_free (info->setting_name); - memset (info, 0, sizeof (*info)); - g_free (info); -} - -static void -name_owner_changed (DBusGProxy *proxy, - const char *name, - const char *old_owner, - const char *new_owner, - gpointer user_data) -{ - NMSecretAgent *self = NM_SECRET_AGENT (user_data); - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - gboolean old_owner_good = (old_owner && strlen (old_owner)); - gboolean new_owner_good = (new_owner && strlen (new_owner)); - GSList *iter; - - if (strcmp (name, NM_DBUS_SERVICE) == 0) { - g_free (priv->nm_owner); - priv->nm_owner = g_strdup (new_owner); - - if (!old_owner_good && new_owner_good) { - /* NM appeared */ - auto_register_cb (self); - } else if (old_owner_good && !new_owner_good) { - /* Cancel any pending secrets requests */ - for (iter = priv->pending_gets; iter; iter = g_slist_next (iter)) { - GetSecretsInfo *info = iter->data; - - NM_SECRET_AGENT_GET_CLASS (self)->cancel_get_secrets (self, - info->path, - info->setting_name); - } - g_slist_free (priv->pending_gets); - priv->pending_gets = NULL; - - /* NM disappeared */ - _internal_unregister (self); - } else if (old_owner_good && new_owner_good && strcmp (old_owner, new_owner)) { - /* Hmm, NM magically restarted */ - _internal_unregister (self); - auto_register_cb (self); - } - } -} - -static gboolean -verify_sender (NMSecretAgent *self, - DBusGMethodInvocation *context, - GError **error) -{ - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - DBusConnection *bus; - char *sender; - const char *nm_owner; - DBusError dbus_error; - uid_t sender_uid = G_MAXUINT; - gboolean allowed = FALSE; - - g_return_val_if_fail (context != NULL, FALSE); - - /* Verify the sender's UID is 0, and that the sender is the same as - * NetworkManager's bus name owner. - */ - - nm_owner = get_nm_owner (self); - if (!nm_owner) { - g_set_error_literal (error, - NM_SECRET_AGENT_ERROR, - NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED, - "NetworkManager bus name owner unknown."); - return FALSE; - } - - bus = dbus_g_connection_get_connection (priv->bus); - if (!bus) { - g_set_error_literal (error, - NM_SECRET_AGENT_ERROR, - NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED, - "Failed to get DBus connection."); - return FALSE; - } - - sender = dbus_g_method_get_sender (context); - if (!sender) { - g_set_error_literal (error, - NM_SECRET_AGENT_ERROR, - NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED, - "Failed to get request sender."); - return FALSE; - } - - /* Check that the sender matches the current NM bus name owner */ - if (strcmp (sender, nm_owner) != 0) { - g_set_error_literal (error, - NM_SECRET_AGENT_ERROR, - NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED, - "Request sender does not match NetworkManager bus name owner."); - goto out; - } - - dbus_error_init (&dbus_error); - sender_uid = dbus_bus_get_unix_user (bus, sender, &dbus_error); - if (dbus_error_is_set (&dbus_error)) { - g_set_error (error, - NM_SECRET_AGENT_ERROR, - NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED, - "Failed to get request unix user: (%s) %s.", - dbus_error.name, dbus_error.message); - dbus_error_free (&dbus_error); - goto out; - } - - /* We only accept requests from NM, which always runs as root */ - if (0 != sender_uid) { - g_set_error_literal (error, - NM_SECRET_AGENT_ERROR, - NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED, - "Request sender is not root."); - goto out; - } - - allowed = TRUE; - -out: - g_free (sender); - return allowed; -} - -static gboolean -verify_request (NMSecretAgent *self, - DBusGMethodInvocation *context, - GHashTable *connection_hash, - const char *connection_path, - NMConnection **out_connection, - GError **error) -{ - NMConnection *connection = NULL; - - g_return_val_if_fail (!connection_hash || out_connection, FALSE); - - if (!verify_sender (self, context, error)) - return FALSE; - - /* No connection? If the sender verified, then we allow the request */ - if (connection_hash == NULL) - return TRUE; - - /* If we have a connection hash, we require a path too */ - if (connection_path == NULL) { - g_set_error_literal (error, - NM_SECRET_AGENT_ERROR, - NM_SECRET_AGENT_ERROR_INVALID_CONNECTION, - "Invalid connection: no connection path given."); - return FALSE; - } - - /* Make sure the given connection is valid */ - connection = _nm_connection_new_from_hash (connection_hash); - nm_connection_set_path (connection, connection_path); - *out_connection = connection; - - return TRUE; -} - -static void -get_secrets_cb (NMSecretAgent *self, - NMConnection *connection, - GHashTable *secrets, - GError *error, - gpointer user_data) -{ - GetSecretsInfo *info = user_data; - - if (error) - dbus_g_method_return_error (info->context, error); - else - dbus_g_method_return (info->context, secrets); - - /* Remove the request from internal tracking */ - get_secrets_info_finalize (self, info); -} - -static void -impl_secret_agent_get_secrets (NMSecretAgent *self, - GHashTable *connection_hash, - const char *connection_path, - const char *setting_name, - const char **hints, - guint32 flags, - DBusGMethodInvocation *context) -{ - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - GError *error = NULL; - NMConnection *connection = NULL; - GetSecretsInfo *info; - - /* Make sure the request comes from NetworkManager and is valid */ - if (!verify_request (self, context, connection_hash, connection_path, &connection, &error)) { - dbus_g_method_return_error (context, error); - g_clear_error (&error); - return; - } - - info = g_malloc0 (sizeof (GetSecretsInfo)); - info->path = g_strdup (connection_path); - info->setting_name = g_strdup (setting_name); - info->context = context; - priv->pending_gets = g_slist_append (priv->pending_gets, info); - - NM_SECRET_AGENT_GET_CLASS (self)->get_secrets (self, - connection, - connection_path, - setting_name, - hints, - flags, - get_secrets_cb, - info); - g_object_unref (connection); -} - -static GetSecretsInfo * -find_get_secrets_info (GSList *list, const char *path, const char *setting_name) -{ - GSList *iter; - - for (iter = list; iter; iter = g_slist_next (iter)) { - GetSecretsInfo *candidate = iter->data; - - if ( g_strcmp0 (path, candidate->path) == 0 - && g_strcmp0 (setting_name, candidate->setting_name) == 0) - return candidate; - } - return NULL; -} - -static void -impl_secret_agent_cancel_get_secrets (NMSecretAgent *self, - const char *connection_path, - const char *setting_name, - DBusGMethodInvocation *context) -{ - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - GError *error = NULL; - GetSecretsInfo *info; - - /* Make sure the request comes from NetworkManager and is valid */ - if (!verify_request (self, context, NULL, NULL, NULL, &error)) { - dbus_g_method_return_error (context, error); - g_clear_error (&error); - return; - } - - info = find_get_secrets_info (priv->pending_gets, connection_path, setting_name); - if (!info) { - g_set_error_literal (&error, - NM_SECRET_AGENT_ERROR, - NM_SECRET_AGENT_ERROR_INTERNAL_ERROR, - "No secrets request in progress for this connection."); - dbus_g_method_return_error (context, error); - g_clear_error (&error); - return; - } - - /* Send the cancel request up to the subclass and finalize it */ - NM_SECRET_AGENT_GET_CLASS (self)->cancel_get_secrets (self, - info->path, - info->setting_name); - dbus_g_method_return (context); -} - -static void -save_secrets_cb (NMSecretAgent *self, - NMConnection *connection, - GError *error, - gpointer user_data) -{ - DBusGMethodInvocation *context = user_data; - - if (error) - dbus_g_method_return_error (context, error); - else - dbus_g_method_return (context); -} - -static void -impl_secret_agent_save_secrets (NMSecretAgent *self, - GHashTable *connection_hash, - const char *connection_path, - DBusGMethodInvocation *context) -{ - GError *error = NULL; - NMConnection *connection = NULL; - - /* Make sure the request comes from NetworkManager and is valid */ - if (!verify_request (self, context, connection_hash, connection_path, &connection, &error)) { - dbus_g_method_return_error (context, error); - g_clear_error (&error); - return; - } - - NM_SECRET_AGENT_GET_CLASS (self)->save_secrets (self, - connection, - connection_path, - save_secrets_cb, - context); - g_object_unref (connection); -} - -static void -delete_secrets_cb (NMSecretAgent *self, - NMConnection *connection, - GError *error, - gpointer user_data) -{ - DBusGMethodInvocation *context = user_data; - - if (error) - dbus_g_method_return_error (context, error); - else - dbus_g_method_return (context); -} - -static void -impl_secret_agent_delete_secrets (NMSecretAgent *self, - GHashTable *connection_hash, - const char *connection_path, - DBusGMethodInvocation *context) -{ - GError *error = NULL; - NMConnection *connection = NULL; - - /* Make sure the request comes from NetworkManager and is valid */ - if (!verify_request (self, context, connection_hash, connection_path, &connection, &error)) { - dbus_g_method_return_error (context, error); - g_clear_error (&error); - return; - } - - NM_SECRET_AGENT_GET_CLASS (self)->delete_secrets (self, - connection, - connection_path, - delete_secrets_cb, - context); - g_object_unref (connection); -} - -/*****************************************************************************/ - -static void -reg_result (NMSecretAgent *self, GError *error) -{ - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - - if (error) { - /* If registration failed we shouldn't expose ourselves on the bus */ - _internal_unregister (self); - } else { - priv->registered = TRUE; - g_object_notify (G_OBJECT (self), NM_SECRET_AGENT_REGISTERED); - } - - g_signal_emit (self, signals[REGISTRATION_RESULT], 0, error); -} - -static void -reg_request_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - NMSecretAgent *self = NM_SECRET_AGENT (user_data); - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - GError *error = NULL; - - priv->reg_call = NULL; - - dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); - reg_result (self, error); - g_clear_error (&error); -} - -static void -reg_with_caps_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - NMSecretAgent *self = NM_SECRET_AGENT (user_data); - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - - priv->reg_call = NULL; - - if (dbus_g_proxy_end_call (proxy, call, NULL, G_TYPE_INVALID)) { - reg_result (self, NULL); - return; - } - - /* Might be an old NetworkManager that doesn't support capabilities; - * fall back to old Register() method instead. - */ - priv->reg_call = dbus_g_proxy_begin_call_with_timeout (priv->manager_proxy, - "Register", - reg_request_cb, - self, - NULL, - 5000, - G_TYPE_STRING, priv->identifier, - G_TYPE_INVALID); -} - -/** - * nm_secret_agent_register: - * @self: a #NMSecretAgent - * - * Registers the #NMSecretAgent with the NetworkManager secret manager, - * indicating to NetworkManager that the agent is able to provide and save - * secrets for connections on behalf of its user. Registration is an - * asynchronous operation and its success or failure is indicated via the - * 'registration-result' signal. - * - * Returns: a new %TRUE if registration was successfully requested (this does - * not mean registration itself was successful), %FALSE if registration was not - * successfully requested. - **/ -gboolean -nm_secret_agent_register (NMSecretAgent *self) -{ - NMSecretAgentPrivate *priv; - NMSecretAgentClass *class; - - g_return_val_if_fail (NM_IS_SECRET_AGENT (self), FALSE); - - priv = NM_SECRET_AGENT_GET_PRIVATE (self); - - g_return_val_if_fail (priv->registered == FALSE, FALSE); - g_return_val_if_fail (priv->reg_call == NULL, FALSE); - g_return_val_if_fail (priv->bus != NULL, FALSE); - g_return_val_if_fail (priv->manager_proxy != NULL, FALSE); - - /* Also make sure the subclass can actually respond to secrets requests */ - class = NM_SECRET_AGENT_GET_CLASS (self); - g_return_val_if_fail (class->get_secrets != NULL, FALSE); - g_return_val_if_fail (class->save_secrets != NULL, FALSE); - g_return_val_if_fail (class->delete_secrets != NULL, FALSE); - - if (!priv->nm_owner) - return FALSE; - - priv->suppress_auto = FALSE; - - /* Export our secret agent interface before registering with the manager */ - dbus_g_connection_register_g_object (priv->bus, - NM_DBUS_PATH_SECRET_AGENT, - G_OBJECT (self)); - - priv->reg_call = dbus_g_proxy_begin_call_with_timeout (priv->manager_proxy, - "RegisterWithCapabilities", - reg_with_caps_cb, - self, - NULL, - 5000, - G_TYPE_STRING, priv->identifier, - G_TYPE_UINT, priv->capabilities, - G_TYPE_INVALID); - return TRUE; -} - -/** - * nm_secret_agent_unregister: - * @self: a #NMSecretAgent - * - * Unregisters the #NMSecretAgent with the NetworkManager secret manager, - * indicating to NetworkManager that the agent is will no longer provide or - * store secrets on behalf of this user. - * - * Returns: a new %TRUE if unregistration was successful, %FALSE if it was not. - **/ -gboolean -nm_secret_agent_unregister (NMSecretAgent *self) -{ - NMSecretAgentPrivate *priv; - - g_return_val_if_fail (NM_IS_SECRET_AGENT (self), FALSE); - - priv = NM_SECRET_AGENT_GET_PRIVATE (self); - - g_return_val_if_fail (priv->registered == TRUE, FALSE); - g_return_val_if_fail (priv->bus != NULL, FALSE); - g_return_val_if_fail (priv->manager_proxy != NULL, FALSE); - - if (!priv->nm_owner) - return FALSE; - - dbus_g_proxy_call_no_reply (priv->manager_proxy, "Unregister", G_TYPE_INVALID); - - _internal_unregister (self); - priv->suppress_auto = TRUE; - - return TRUE; -} - -/** - * nm_secret_agent_get_registered: - * @self: a #NMSecretAgent - * - * Returns: a %TRUE if the agent is registered, %FALSE if it is not. - **/ -gboolean -nm_secret_agent_get_registered (NMSecretAgent *self) -{ - g_return_val_if_fail (NM_IS_SECRET_AGENT (self), FALSE); - - return NM_SECRET_AGENT_GET_PRIVATE (self)->registered; -} - -static gboolean -auto_register_cb (gpointer user_data) -{ - NMSecretAgent *self = NM_SECRET_AGENT (user_data); - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - - priv->auto_register_id = 0; - if (priv->auto_register && !priv->suppress_auto && - (priv->reg_call == NULL && !priv->registered)) - nm_secret_agent_register (self); - return FALSE; -} - -/*****************************************************************************/ - -/** - * nm_secret_agent_get_secrets: (virtual get_secrets): - * @self: a #NMSecretAgent - * @connection: the #NMConnection for which we're asked secrets - * @setting_name: the name of the secret setting - * @hints: (array zero-terminated=1): hints to the agent - * @flags: flags that modify the behavior of the request - * @callback: (scope async): a callback, to be invoked when the operation is done - * @user_data: (closure): caller-specific data to be passed to @callback - * - * Asynchronously retrieve secrets belonging to @connection for the - * setting @setting_name. @flags indicate specific behavior that the secret - * agent should use when performing the request, for example returning only - * existing secrets without user interaction, or requesting entirely new - * secrets from the user. - */ -void -nm_secret_agent_get_secrets (NMSecretAgent *self, - NMConnection *connection, - const char *setting_name, - const char **hints, - NMSecretAgentGetSecretsFlags flags, - NMSecretAgentGetSecretsFunc callback, - gpointer user_data) -{ - g_return_if_fail (NM_IS_SECRET_AGENT (self)); - g_return_if_fail (NM_IS_CONNECTION (connection)); - g_return_if_fail (nm_connection_get_path (connection)); - g_return_if_fail (setting_name != NULL); - g_return_if_fail (strlen (setting_name) > 0); - g_return_if_fail (callback != NULL); - - NM_SECRET_AGENT_GET_CLASS (self)->get_secrets (self, - connection, - nm_connection_get_path (connection), - setting_name, - hints, - flags, - callback, - user_data); -} - -/** - * nm_secret_agent_save_secrets: (virtual save_secrets): - * @self: a #NMSecretAgent - * @connection: a #NMConnection - * @callback: (scope async): a callback, to be invoked when the operation is done - * @user_data: (closure): caller-specific data to be passed to @callback - * - * Asynchronously ensure that all secrets inside @connection - * are stored to disk. - */ -void -nm_secret_agent_save_secrets (NMSecretAgent *self, - NMConnection *connection, - NMSecretAgentSaveSecretsFunc callback, - gpointer user_data) -{ - g_return_if_fail (NM_IS_SECRET_AGENT (self)); - g_return_if_fail (NM_IS_CONNECTION (connection)); - g_return_if_fail (nm_connection_get_path (connection)); - - NM_SECRET_AGENT_GET_CLASS (self)->save_secrets (self, - connection, - nm_connection_get_path (connection), - callback, - user_data); -} - -/** - * nm_secret_agent_delete_secrets: (virtual delete_secrets): - * @self: a #NMSecretAgent - * @connection: a #NMConnection - * @callback: (scope async): a callback, to be invoked when the operation is done - * @user_data: (closure): caller-specific data to be passed to @callback - * - * Asynchronously ask the agent to delete all saved secrets belonging to - * @connection. - */ -void -nm_secret_agent_delete_secrets (NMSecretAgent *self, - NMConnection *connection, - NMSecretAgentDeleteSecretsFunc callback, - gpointer user_data) -{ - g_return_if_fail (NM_IS_SECRET_AGENT (self)); - g_return_if_fail (NM_IS_CONNECTION (connection)); - g_return_if_fail (nm_connection_get_path (connection)); - - NM_SECRET_AGENT_GET_CLASS (self)->delete_secrets (self, - connection, - nm_connection_get_path (connection), - callback, - user_data); -} - -/*****************************************************************************/ - -static gboolean -validate_identifier (const char *identifier) -{ - const char *p = identifier; - size_t id_len; - - /* Length between 3 and 255 characters inclusive */ - id_len = strlen (identifier); - if (id_len < 3 || id_len > 255) - return FALSE; - - if ((identifier[0] == '.') || (identifier[id_len - 1] == '.')) - return FALSE; - - /* FIXME: do complete validation here */ - while (p && *p) { - if (!g_ascii_isalnum (*p) && (*p != '_') && (*p != '-') && (*p != '.')) - return FALSE; - if ((*p == '.') && (*(p + 1) == '.')) - return FALSE; - p++; - } - - return TRUE; -} - -static void -nm_secret_agent_init (NMSecretAgent *self) -{ - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - GError *error = NULL; - - priv->bus = _nm_dbus_new_connection (&error); - if (!priv->bus) { - g_warning ("Couldn't connect to system bus: %s", error->message); - g_error_free (error); - return; - } - - priv->dbus_proxy = dbus_g_proxy_new_for_name (priv->bus, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS); - g_assert (priv->dbus_proxy); - - dbus_g_object_register_marshaller (g_cclosure_marshal_generic, - G_TYPE_NONE, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_add_signal (priv->dbus_proxy, "NameOwnerChanged", - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->dbus_proxy, - "NameOwnerChanged", - G_CALLBACK (name_owner_changed), - self, NULL); - - get_nm_owner (self); - - priv->manager_proxy = _nm_dbus_new_proxy_for_connection (priv->bus, - NM_DBUS_PATH_AGENT_MANAGER, - NM_DBUS_INTERFACE_AGENT_MANAGER); - if (!priv->manager_proxy) { - g_warning ("Couldn't create NM agent manager proxy."); - return; - } - - if (priv->nm_owner) - priv->auto_register_id = g_idle_add (auto_register_cb, self); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_IDENTIFIER: - g_value_set_string (value, priv->identifier); - break; - case PROP_AUTO_REGISTER: - g_value_set_boolean (value, priv->auto_register); - break; - case PROP_REGISTERED: - g_value_set_boolean (value, priv->registered); - break; - case PROP_CAPABILITIES: - g_value_set_flags (value, priv->capabilities); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (object); - const char *identifier; - - switch (prop_id) { - case PROP_IDENTIFIER: - identifier = g_value_get_string (value); - - g_return_if_fail (validate_identifier (identifier)); - - g_free (priv->identifier); - priv->identifier = g_strdup (identifier); - break; - case PROP_AUTO_REGISTER: - priv->auto_register = g_value_get_boolean (value); - break; - case PROP_CAPABILITIES: - priv->capabilities = g_value_get_flags (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -dispose (GObject *object) -{ - NMSecretAgent *self = NM_SECRET_AGENT (object); - NMSecretAgentPrivate *priv = NM_SECRET_AGENT_GET_PRIVATE (self); - - if (priv->registered) - nm_secret_agent_unregister (self); - - if (priv->auto_register_id) { - g_source_remove (priv->auto_register_id); - priv->auto_register_id = 0; - } - - g_free (priv->identifier); - priv->identifier = NULL; - g_free (priv->nm_owner); - priv->nm_owner = NULL; - - while (priv->pending_gets) - get_secrets_info_finalize (self, priv->pending_gets->data); - - g_clear_object (&priv->dbus_proxy); - g_clear_object (&priv->manager_proxy); - - if (priv->bus) { - dbus_g_connection_unref (priv->bus); - priv->bus = NULL; - } - - G_OBJECT_CLASS (nm_secret_agent_parent_class)->dispose (object); -} - -static void -nm_secret_agent_class_init (NMSecretAgentClass *class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (class); - - g_type_class_add_private (class, sizeof (NMSecretAgentPrivate)); - - /* Virtual methods */ - object_class->dispose = dispose; - object_class->get_property = get_property; - object_class->set_property = set_property; - - /** - * NMSecretAgent:identifier: - * - * Identifies this agent; only one agent in each user session may use the - * same identifier. Identifier formatting follows the same rules as - * D-Bus bus names with the exception that the ':' character is not - * allowed. The valid set of characters is "[A-Z][a-z][0-9]_-." and the - * identifier is limited in length to 255 characters with a minimum - * of 3 characters. An example valid identifier is 'org.gnome.nm-applet' - * (without quotes). - **/ - g_object_class_install_property - (object_class, PROP_IDENTIFIER, - g_param_spec_string (NM_SECRET_AGENT_IDENTIFIER, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSecretAgent:auto-register: - * - * If TRUE, the agent will attempt to automatically register itself after - * it is created (via an idle handler) and to re-register itself if - * NetworkManager restarts. If FALSE, the agent does not automatically - * register with NetworkManager, and nm_secret_agent_register() must be - * called. If 'auto-register' is TRUE, calling nm_secret_agent_unregister() - * will suppress auto-registration until nm_secret_agent_register() is - * called, which re-enables auto-registration. - **/ - g_object_class_install_property - (object_class, PROP_AUTO_REGISTER, - g_param_spec_boolean (NM_SECRET_AGENT_AUTO_REGISTER, "", "", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSecretAgent:registered: - * - * %TRUE if the agent is registered with NetworkManager, %FALSE if not. - **/ - g_object_class_install_property - (object_class, PROP_REGISTERED, - g_param_spec_boolean (NM_SECRET_AGENT_REGISTERED, "", "", - FALSE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSecretAgent:capabilities: - * - * A bitfield of %NMSecretAgentCapabilities. - **/ - g_object_class_install_property - (object_class, PROP_CAPABILITIES, - g_param_spec_flags (NM_SECRET_AGENT_CAPABILITIES, "", "", - NM_TYPE_SECRET_AGENT_CAPABILITIES, - NM_SECRET_AGENT_CAPABILITY_NONE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - /** - * NMSecretAgent::registration-result: - * @agent: the agent that received the signal - * @error: the error, if any, that occurred while registering - * - * Indicates the result of a registration request; if @error is NULL the - * request was successful. - **/ - signals[REGISTRATION_RESULT] = - g_signal_new (NM_SECRET_AGENT_REGISTRATION_RESULT, - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, NULL, - G_TYPE_NONE, 1, G_TYPE_POINTER); - - dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (class), - &dbus_glib_nm_secret_agent_object_info); - - dbus_g_error_domain_register (NM_SECRET_AGENT_ERROR, - NM_DBUS_INTERFACE_SECRET_AGENT, - NM_TYPE_SECRET_AGENT_ERROR); -} diff --git a/libnm-glib/nm-secret-agent.h b/libnm-glib/nm-secret-agent.h deleted file mode 100644 index 621e5e7b..00000000 --- a/libnm-glib/nm-secret-agent.h +++ /dev/null @@ -1,307 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2010 - 2011 Red Hat, Inc. - */ - -#ifndef NM_SECRET_AGENT_H -#define NM_SECRET_AGENT_H - -#include "nm-connection.h" - -G_BEGIN_DECLS - -#define NM_SECRET_AGENT_ERROR (nm_secret_agent_error_quark ()) - -GQuark nm_secret_agent_error_quark (void); - -/** - * NMSecretAgentError: - * @NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED: the caller (ie, NetworkManager) is not - * authorized to make this request - * @NM_SECRET_AGENT_ERROR_INVALID_CONNECTION: the connection for which secrets - * were requested could not be found - * @NM_SECRET_AGENT_ERROR_USER_CANCELED: the request was canceled by the user - * @NM_SECRET_AGENT_ERROR_AGENT_CANCELED: the agent canceled the request - * because it was requested to do so by NetworkManager - * @NM_SECRET_AGENT_ERROR_INTERNAL_ERROR: some internal error in the agent caused - * the request to fail - * @NM_SECRET_AGENT_ERROR_NO_SECRETS: the agent cannot find any secrets for this - * connection - * - * #NMSecretAgentError values are passed by secret agents back to NetworkManager - * when they encounter problems retrieving secrets on behalf of NM. - */ -typedef enum { - NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED = 0, /*< nick=NotAuthorized >*/ - NM_SECRET_AGENT_ERROR_INVALID_CONNECTION, /*< nick=InvalidConnection >*/ - NM_SECRET_AGENT_ERROR_USER_CANCELED, /*< nick=UserCanceled >*/ - NM_SECRET_AGENT_ERROR_AGENT_CANCELED, /*< nick=AgentCanceled >*/ - NM_SECRET_AGENT_ERROR_INTERNAL_ERROR, /*< nick=InternalError >*/ - NM_SECRET_AGENT_ERROR_NO_SECRETS, /*< nick=NoSecrets >*/ -} NMSecretAgentError; - -/** - * NMSecretAgentCapabilities: - * @NM_SECRET_AGENT_CAPABILITY_NONE: the agent supports no special capabilities - * @NM_SECRET_AGENT_CAPABILITY_VPN_HINTS: the agent supports sending hints given - * by the <literal>get_secrets</literal> class method to VPN plugin - * authentication dialogs. - * @NM_SECRET_AGENT_CAPABILITY_LAST: bounds checking value; should not be used. - * - * #NMSecretAgentCapabilities indicate various capabilities of the agent. - * - * Since: 0.9.10 - */ -typedef enum /*< flags >*/ { - NM_SECRET_AGENT_CAPABILITY_NONE = 0x0, - NM_SECRET_AGENT_CAPABILITY_VPN_HINTS = 0x1, - - /* boundary value */ - NM_SECRET_AGENT_CAPABILITY_LAST = NM_SECRET_AGENT_CAPABILITY_VPN_HINTS -} NMSecretAgentCapabilities; - -/** - * NMSecretAgentGetSecretsFlags: - * @NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE: no special behavior; by default no - * user interaction is allowed and requests for secrets are fulfilled from - * persistent storage, or if no secrets are available an error is returned. - * @NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION: allows the request to - * interact with the user, possibly prompting via UI for secrets if any are - * required, or if none are found in persistent storage. - * @NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW: explicitly prompt for new - * secrets from the user. This flag signals that NetworkManager thinks any - * existing secrets are invalid or wrong. This flag implies that interaction - * is allowed. - * @NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED: set if the request was - * initiated by user-requested action via the D-Bus interface, as opposed to - * automatically initiated by NetworkManager in response to (for example) scan - * results or carrier changes. - * - * #NMSecretAgentGetSecretsFlags values modify the behavior of a GetSecrets request. - */ -typedef enum /*< flags >*/ { - NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE = 0x0, - NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION = 0x1, - NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW = 0x2, - NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED = 0x4 -} NMSecretAgentGetSecretsFlags; - -#define NM_TYPE_SECRET_AGENT (nm_secret_agent_get_type ()) -#define NM_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SECRET_AGENT, NMSecretAgent)) -#define NM_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SECRET_AGENT, NMSecretAgentClass)) -#define NM_IS_SECRET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SECRET_AGENT)) -#define NM_IS_SECRET_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SECRET_AGENT)) -#define NM_SECRET_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SECRET_AGENT, NMSecretAgentClass)) - -#define NM_SECRET_AGENT_IDENTIFIER "identifier" -#define NM_SECRET_AGENT_AUTO_REGISTER "auto-register" -#define NM_SECRET_AGENT_REGISTERED "registered" -#define NM_SECRET_AGENT_CAPABILITIES "capabilities" - -#define NM_SECRET_AGENT_REGISTRATION_RESULT "registration-result" - -typedef struct { - GObject parent; -} NMSecretAgent; - -/** - * NMSecretAgentGetSecretsFunc: - * @agent: the secret agent object - * @connection: (transfer none): the connection for which secrets were requested, - * note that this object will be unrefed after the callback has returned, use - * g_object_ref()/g_object_unref() if you want to use this object after the callback - * has returned - * @secrets: (element-type utf8 GLib.HashTable): the #GHashTable containing - * the requested secrets in the same format as an #NMConnection hash (as - * created by nm_connection_to_hash() for example). Each key in @secrets - * should be the name of a #NMSetting object (like "802-11-wireless-security") - * and each value should be a #GHashTable. The sub-hashes map string:#GValue - * where the string is the setting property name (like "psk") and the value - * is the secret - * @error: if the secrets request failed, give a descriptive error here - * @user_data: caller-specific data to be passed to the function - * - * Called as a result of a request by NM to retrieve secrets. When the - * #NMSecretAgent subclass has finished retrieving secrets and is ready to - * return them, or to return an error, this function should be called with - * those secrets or the error. - * - * To easily create the hash table to return the Wi-Fi PSK, you could do - * something like this: - * <example> - * <title>Creating a secrets hash</title> - * <programlisting> - * NMConnection *secrets; - * NMSettingWirelessSecurity *s_wsec; - * GHashTable *secrets_hash; - * - * secrets = nm_connection_new (); - * s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new (); - * g_object_set (G_OBJECT (s_wsec), - * NM_SETTING_WIRELESS_SECURITY_PSK, "my really cool PSK", - * NULL); - * nm_connection_add_setting (secrets, NM_SETTING (s_wsec)); - * secrets_hash = nm_connection_to_hash (secrets, NM_SETTING_HASH_FLAG_ALL); - * - * (call the NMSecretAgentGetSecretsFunc with secrets_hash) - * - * g_object_unref (secrets); - * g_hash_table_unref (secrets_hash); - * </programlisting> - * </example> - */ -typedef void (*NMSecretAgentGetSecretsFunc) (NMSecretAgent *agent, - NMConnection *connection, - GHashTable *secrets, - GError *error, - gpointer user_data); - -/** - * NMSecretAgentSaveSecretsFunc: - * @agent: the secret agent object - * @connection: (transfer none): the connection for which secrets were to be saved, - * note that this object will be unrefed after the callback has returned, use - * g_object_ref()/g_object_unref() if you want to use this object after the callback - * has returned - * @error: if the saving secrets failed, give a descriptive error here - * @user_data: caller-specific data to be passed to the function - * - * Called as a result of a request by NM to save secrets. When the - * #NMSecretAgent subclass has finished saving the secrets, this function - * should be called. - */ -typedef void (*NMSecretAgentSaveSecretsFunc) (NMSecretAgent *agent, - NMConnection *connection, - GError *error, - gpointer user_data); - -/** - * NMSecretAgentDeleteSecretsFunc: - * @agent: the secret agent object - * @connection: (transfer none): the connection for which secrets were to be deleted, - * note that this object will be unrefed after the callback has returned, use - * g_object_ref()/g_object_unref() if you want to use this object after the callback - * has returned - * @error: if the deleting secrets failed, give a descriptive error here - * @user_data: caller-specific data to be passed to the function - * - * Called as a result of a request by NM to delete secrets. When the - * #NMSecretAgent subclass has finished deleting the secrets, this function - * should be called. - */ -typedef void (*NMSecretAgentDeleteSecretsFunc) (NMSecretAgent *agent, - NMConnection *connection, - GError *error, - gpointer user_data); - -typedef struct { - GObjectClass parent; - - /* Virtual methods for subclasses */ - - /* Called when the subclass should retrieve and return secrets. Subclass - * must copy or reference any arguments it may require after returning from - * this method, as the arguments will freed (except for 'self', 'callback', - * and 'user_data' of course). If the request is canceled, the callback - * should still be called, but with the NM_SECRET_AGENT_ERROR_AGENT_CANCELED - * error. - */ - void (*get_secrets) (NMSecretAgent *self, - NMConnection *connection, - const char *connection_path, - const char *setting_name, - const char **hints, - NMSecretAgentGetSecretsFlags flags, - NMSecretAgentGetSecretsFunc callback, - gpointer user_data); - - /* Called when the subclass should cancel an outstanding request to - * get secrets for a given connection. Canceling the request MUST - * call the callback that was passed along with the initial get_secrets - * call, sending the NM_SECRET_AGENT_ERROR/NM_SECRET_AGENT_ERROR_AGENT_CANCELED - * error to that callback. - */ - void (*cancel_get_secrets) (NMSecretAgent *self, - const char *connection_path, - const char *setting_name); - - /* Called when the subclass should save the secrets contained in the - * connection to backing storage. Subclass must copy or reference any - * arguments it may require after returning from this method, as the - * arguments will freed (except for 'self', 'callback', and 'user_data' - * of course). - */ - void (*save_secrets) (NMSecretAgent *self, - NMConnection *connection, - const char *connection_path, - NMSecretAgentSaveSecretsFunc callback, - gpointer user_data); - - /* Called when the subclass should delete the secrets contained in the - * connection from backing storage. Subclass must copy or reference any - * arguments it may require after returning from this method, as the - * arguments will freed (except for 'self', 'callback', and 'user_data' - * of course). - */ - void (*delete_secrets) (NMSecretAgent *self, - NMConnection *connection, - const char *connection_path, - NMSecretAgentDeleteSecretsFunc callback, - gpointer user_data); - - /* Signals */ - void (*registration_result) (NMSecretAgent *agent, GError *error); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMSecretAgentClass; - -GType nm_secret_agent_get_type (void); - -gboolean nm_secret_agent_register (NMSecretAgent *self); - -gboolean nm_secret_agent_unregister (NMSecretAgent *self); - -gboolean nm_secret_agent_get_registered (NMSecretAgent *self); - -void nm_secret_agent_get_secrets (NMSecretAgent *self, - NMConnection *connection, - const char *setting_name, - const char **hints, - NMSecretAgentGetSecretsFlags flags, - NMSecretAgentGetSecretsFunc callback, - gpointer user_data); - -void nm_secret_agent_save_secrets (NMSecretAgent *self, - NMConnection *connection, - NMSecretAgentSaveSecretsFunc callback, - gpointer user_data); - -void nm_secret_agent_delete_secrets (NMSecretAgent *self, - NMConnection *connection, - NMSecretAgentDeleteSecretsFunc callback, - gpointer user_data); - -G_END_DECLS - -#endif /* NM_SECRET_AGENT_H */ diff --git a/libnm-glib/nm-types-private.h b/libnm-glib/nm-types-private.h deleted file mode 100644 index 7cd907dc..00000000 --- a/libnm-glib/nm-types-private.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Red Hat, Inc. - */ - -#ifndef NM_TYPES_PRIVATE_H -#define NM_TYPES_PRIVATE_H - -#include <dbus/dbus-glib.h> -#include "nm-types.h" -#include "nm-object-private.h" - -gboolean _nm_ssid_demarshal (GValue *value, GByteArray **dest); -gboolean _nm_uint_array_demarshal (GValue *value, GArray **dest); -gboolean _nm_string_array_demarshal (GValue *value, GPtrArray **dest); -gboolean _nm_ip6_address_array_demarshal (GValue *value, GSList **dest); - -#endif /* NM_TYPES_PRIVATE_H */ diff --git a/libnm-glib/nm-types.c b/libnm-glib/nm-types.c deleted file mode 100644 index 4f7236d3..00000000 --- a/libnm-glib/nm-types.c +++ /dev/null @@ -1,375 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <dbus/dbus-glib.h> -#include <string.h> - -#include "nm-types.h" -#include "nm-types-private.h" -#include "nm-object-private.h" -#include "nm-object-cache.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-ip6-config.h" - -static gpointer -_nm_ssid_copy (GByteArray *src) -{ - GByteArray *dest; - - dest = g_byte_array_sized_new (src->len); - g_byte_array_append (dest, src->data, src->len); - return dest; -} - -static void -_nm_ssid_free (GByteArray *ssid) -{ - g_byte_array_free (ssid, TRUE); -} - -GType -nm_ssid_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_boxed_type_register_static (g_intern_static_string ("NMSsid"), - (GBoxedCopyFunc) _nm_ssid_copy, - (GBoxedFreeFunc) _nm_ssid_free); - return our_type; -} - -gboolean -_nm_ssid_demarshal (GValue *value, GByteArray **dest) -{ - GByteArray *array; - - if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_UCHAR_ARRAY)) - return FALSE; - - if (*dest) { - g_boxed_free (NM_TYPE_SSID, *dest); - *dest = NULL; - } - - array = (GByteArray *) g_value_get_boxed (value); - if (array && (array->len > 0)) { - *dest = g_byte_array_sized_new (array->len); - (*dest)->len = array->len; - memcpy ((*dest)->data, array->data, array->len); - } - - return TRUE; -} - -/*****************************************************************************/ - -static gpointer -_nm_uint_array_copy (GArray *src) -{ - GArray *dest; - - dest = g_array_sized_new (FALSE, TRUE, sizeof (guint32), src->len); - g_array_append_vals (dest, src->data, src->len); - return dest; -} - -static void -_nm_uint_array_free (GArray *array) -{ - g_array_free (array, TRUE); -} - -GType -nm_uint_array_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_boxed_type_register_static (g_intern_static_string ("NMUintArray"), - (GBoxedCopyFunc) _nm_uint_array_copy, - (GBoxedFreeFunc) _nm_uint_array_free); - return our_type; -} - -gboolean -_nm_uint_array_demarshal (GValue *value, GArray **dest) -{ - GArray *array; - - if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_UINT_ARRAY)) - return FALSE; - - if (*dest) { - g_boxed_free (NM_TYPE_UINT_ARRAY, *dest); - *dest = NULL; - } - - array = (GArray *) g_value_get_boxed (value); - if (array && (array->len > 0)) { - *dest = g_array_sized_new (FALSE, TRUE, sizeof (guint32), array->len); - g_array_append_vals (*dest, array->data, array->len); - } - - return TRUE; -} - -/*****************************************************************************/ - -static gpointer -_nm_string_array_copy (GPtrArray *src) -{ - GPtrArray *dest; - int i; - - dest = g_ptr_array_sized_new (src->len); - for (i = 0; i < src->len; i++) - g_ptr_array_add (dest, g_strdup (g_ptr_array_index (src, i))); - return dest; -} - -static void -_nm_string_array_free (GPtrArray *array) -{ - int i; - - for (i = 0; i < array->len; i++) - g_free (g_ptr_array_index (array, i)); - g_ptr_array_free (array, TRUE); -} - -GType -nm_string_array_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_boxed_type_register_static (g_intern_static_string ("NMStringArray"), - (GBoxedCopyFunc) _nm_string_array_copy, - (GBoxedFreeFunc) _nm_string_array_free); - return our_type; -} - -gboolean -_nm_string_array_demarshal (GValue *value, GPtrArray **dest) -{ - char **array; - - if (!G_VALUE_HOLDS (value, G_TYPE_STRV)) - return FALSE; - - if (*dest) { - g_boxed_free (NM_TYPE_STRING_ARRAY, *dest); - *dest = NULL; - } - - array = (char **) g_value_get_boxed (value); - if (array && array[0]) { - int i; - - *dest = g_ptr_array_new (); - for (i = 0; array[i]; i++) - g_ptr_array_add (*dest, g_strdup (array[i])); - } - - return TRUE; -} - -/*****************************************************************************/ - -static gpointer -_nm_object_array_copy (GPtrArray *src) -{ - GPtrArray *dest; - int i; - - dest = g_ptr_array_sized_new (src->len); - for (i = 0; i < src->len; i++) - g_ptr_array_add (dest, g_object_ref (g_ptr_array_index (src, i))); - return dest; -} - -static void -_nm_object_array_free (GPtrArray *array) -{ - int i; - - for (i = 0; i < array->len; i++) - g_object_unref (g_ptr_array_index (array, i)); - g_ptr_array_free (array, TRUE); -} - -GType -nm_object_array_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_boxed_type_register_static (g_intern_static_string ("NMObjectArray"), - (GBoxedCopyFunc) _nm_object_array_copy, - (GBoxedFreeFunc) _nm_object_array_free); - return our_type; -} - -/*****************************************************************************/ - -static gpointer -_nm_ip6_address_object_array_copy (GPtrArray *src) -{ - GPtrArray *dest; - int i; - - dest = g_ptr_array_sized_new (src->len); - for (i = 0; i < src->len; i++) - g_ptr_array_add (dest, nm_ip6_address_dup (g_ptr_array_index (src, i))); - return dest; -} - -static void -_nm_ip6_address_object_array_free (GPtrArray *array) -{ - int i; - - for (i = 0; i < array->len; i++) - nm_ip6_address_unref (g_ptr_array_index (array, i)); - g_ptr_array_free (array, TRUE); -} - -GType -nm_ip6_address_object_array_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_boxed_type_register_static (g_intern_static_string ("NMIP6AddressObjectArray"), - (GBoxedCopyFunc) _nm_ip6_address_object_array_copy, - (GBoxedFreeFunc) _nm_ip6_address_object_array_free); - return our_type; -} - -/*****************************************************************************/ - -static gpointer -_nm_ip6_address_array_copy (GPtrArray *src) -{ - GPtrArray *dest; - int i; - - dest = g_ptr_array_sized_new (src->len); - for (i = 0; i < src->len; i++) { - struct in6_addr *addr = g_ptr_array_index (src, i); - struct in6_addr *copy; - - copy = g_malloc0 (sizeof (struct in6_addr)); - memcpy (copy, addr, sizeof (struct in6_addr)); - g_ptr_array_add (dest, copy); - } - return dest; -} - -static void -_nm_ip6_address_array_free (GPtrArray *array) -{ - int i; - - for (i = 0; i < array->len; i++) - g_free (g_ptr_array_index (array, i)); - g_ptr_array_free (array, TRUE); -} - -GType -nm_ip6_address_array_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_boxed_type_register_static (g_intern_static_string ("NMIP6AddressArray"), - (GBoxedCopyFunc) _nm_ip6_address_array_copy, - (GBoxedFreeFunc) _nm_ip6_address_array_free); - return our_type; -} - -gboolean -_nm_ip6_address_array_demarshal (GValue *value, GSList **dest) -{ - GPtrArray *array; - - if (!G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR)) - return FALSE; - - if (*dest) { - g_slist_free_full (*dest, g_free); - *dest = NULL; - } - - array = (GPtrArray *) g_value_get_boxed (value); - if (array && array->len) { - int i; - - for (i = 0; i < array->len; i++) { - GByteArray *bytearray = (GByteArray *) g_ptr_array_index (array, i); - struct in6_addr *addr; - - addr = g_malloc0 (sizeof (struct in6_addr)); - memcpy (addr->s6_addr, bytearray->data, bytearray->len); - *dest = g_slist_append (*dest, addr); - } - } - - return TRUE; -} - -/*****************************************************************************/ - -static gpointer -_nm_ip6_route_object_array_copy (GPtrArray *src) -{ - GPtrArray *dest; - int i; - - dest = g_ptr_array_sized_new (src->len); - for (i = 0; i < src->len; i++) - g_ptr_array_add (dest, nm_ip6_route_dup (g_ptr_array_index (src, i))); - return dest; -} - -static void -_nm_ip6_route_object_array_free (GPtrArray *array) -{ - int i; - - for (i = 0; i < array->len; i++) - nm_ip6_route_unref (g_ptr_array_index (array, i)); - g_ptr_array_free (array, TRUE); -} - -GType -nm_ip6_route_object_array_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_boxed_type_register_static (g_intern_static_string ("NMIP6RouteObjectArray"), - (GBoxedCopyFunc) _nm_ip6_route_object_array_copy, - (GBoxedFreeFunc) _nm_ip6_route_object_array_free); - return our_type; -} diff --git a/libnm-glib/nm-types.h b/libnm-glib/nm-types.h deleted file mode 100644 index 9b58cd81..00000000 --- a/libnm-glib/nm-types.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 Red Hat, Inc. - */ - -#ifndef NM_TYPES_H -#define NM_TYPES_H - -#include <glib.h> -#include <glib-object.h> - -#include "nm-glib-enum-types.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SSID (nm_ssid_get_type ()) -GType nm_ssid_get_type (void) G_GNUC_CONST; - -#define NM_TYPE_UINT_ARRAY (nm_uint_array_get_type ()) -GType nm_uint_array_get_type (void) G_GNUC_CONST; - -#define NM_TYPE_STRING_ARRAY (nm_string_array_get_type ()) -GType nm_string_array_get_type (void) G_GNUC_CONST; - -#define NM_TYPE_OBJECT_ARRAY (nm_object_array_get_type ()) -GType nm_object_array_get_type (void) G_GNUC_CONST; - -#define NM_TYPE_IP6_ADDRESS_OBJECT_ARRAY (nm_ip6_address_object_array_get_type ()) -GType nm_ip6_address_object_array_get_type (void) G_GNUC_CONST; - -#define NM_TYPE_IP6_ADDRESS_ARRAY (nm_ip6_address_array_get_type ()) -GType nm_ip6_address_array_get_type (void) G_GNUC_CONST; - -#define NM_TYPE_IP6_ROUTE_OBJECT_ARRAY (nm_ip6_route_object_array_get_type ()) -GType nm_ip6_route_object_array_get_type (void) G_GNUC_CONST; - -G_END_DECLS - -#endif /* NM_TYPES_H */ diff --git a/libnm-glib/nm-vpn-connection.c b/libnm-glib/nm-vpn-connection.c deleted file mode 100644 index 68f495a9..00000000 --- a/libnm-glib/nm-vpn-connection.c +++ /dev/null @@ -1,270 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2012 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-vpn-connection.h" -#include "NetworkManager.h" -#include "nm-utils.h" -#include "nm-object-private.h" -#include "nm-active-connection.h" - -G_DEFINE_TYPE (NMVPNConnection, nm_vpn_connection, NM_TYPE_ACTIVE_CONNECTION) - -#define NM_VPN_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_VPN_CONNECTION, NMVPNConnectionPrivate)) - -typedef struct { - DBusGProxy *proxy; - char *banner; - NMVPNConnectionState vpn_state; -} NMVPNConnectionPrivate; - -enum { - PROP_0, - PROP_VPN_STATE, - PROP_BANNER, - - LAST_PROP -}; - -enum { - VPN_STATE_CHANGED, - - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -/** - * nm_vpn_connection_new: - * @connection: the #DBusGConnection - * @path: the DBus object path of the new connection - * - * Creates a new #NMVPNConnection. - * - * Returns: (transfer full): a new connection object - **/ -GObject * -nm_vpn_connection_new (DBusGConnection *connection, const char *path) -{ - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - return g_object_new (NM_TYPE_VPN_CONNECTION, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); -} - -/** - * 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; -} - -/** - * 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; -} - -static void -vpn_state_changed_proxy (DBusGProxy *proxy, - NMVPNConnectionState vpn_state, - NMVPNConnectionStateReason reason, - gpointer user_data) -{ - NMVPNConnection *connection = NM_VPN_CONNECTION (user_data); - NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection); - - if (priv->vpn_state != vpn_state) { - priv->vpn_state = vpn_state; - g_signal_emit (connection, signals[VPN_STATE_CHANGED], 0, vpn_state, reason); - g_object_notify (G_OBJECT (connection), NM_VPN_CONNECTION_VPN_STATE); - } -} - -/*****************************************************************************/ - -static void -nm_vpn_connection_init (NMVPNConnection *connection) -{ - NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection); - - priv->vpn_state = NM_VPN_CONNECTION_STATE_UNKNOWN; -} - -static void -register_properties (NMVPNConnection *connection) -{ - NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection); - const NMPropertiesInfo property_info[] = { - { NM_VPN_CONNECTION_BANNER, &priv->banner }, - { NM_VPN_CONNECTION_VPN_STATE, &priv->vpn_state }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (connection), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_vpn_connection_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_VPN_CONNECTION); - - dbus_g_object_register_marshaller (g_cclosure_marshal_generic, - G_TYPE_NONE, - G_TYPE_UINT, G_TYPE_UINT, - G_TYPE_INVALID); - dbus_g_proxy_add_signal (priv->proxy, "VpnStateChanged", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID); - dbus_g_proxy_connect_signal (priv->proxy, - "VpnStateChanged", - G_CALLBACK (vpn_state_changed_proxy), - object, - NULL); - - register_properties (NM_VPN_CONNECTION (object)); -} - -static void -finalize (GObject *object) -{ - NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (object); - - g_free (priv->banner); - g_object_unref (priv->proxy); - - G_OBJECT_CLASS (nm_vpn_connection_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMVPNConnection *self = NM_VPN_CONNECTION (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_VPN_STATE: - g_value_set_uint (value, nm_vpn_connection_get_vpn_state (self)); - break; - case PROP_BANNER: - g_value_set_string (value, nm_vpn_connection_get_banner (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -nm_vpn_connection_class_init (NMVPNConnectionClass *connection_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (connection_class); - - g_type_class_add_private (connection_class, sizeof (NMVPNConnectionPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->finalize = finalize; - - /* properties */ - - /** - * NMVPNConnection:vpn-state: - * - * The VPN state of the active VPN connection. - **/ - g_object_class_install_property - (object_class, PROP_VPN_STATE, - g_param_spec_uint (NM_VPN_CONNECTION_VPN_STATE, "", "", - NM_VPN_CONNECTION_STATE_UNKNOWN, - NM_VPN_CONNECTION_STATE_DISCONNECTED, - NM_VPN_CONNECTION_STATE_UNKNOWN, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMVPNConnection:banner: - * - * The VPN login banner of the active VPN connection. - **/ - g_object_class_install_property - (object_class, PROP_BANNER, - g_param_spec_string (NM_VPN_CONNECTION_BANNER, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /* signals */ - signals[VPN_STATE_CHANGED] = - g_signal_new ("vpn-state-changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMVPNConnectionClass, vpn_state_changed), - NULL, NULL, NULL, - G_TYPE_NONE, 2, - G_TYPE_UINT, G_TYPE_UINT); -} diff --git a/libnm-glib/nm-vpn-connection.h b/libnm-glib/nm-vpn-connection.h deleted file mode 100644 index 0495310f..00000000 --- a/libnm-glib/nm-vpn-connection.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2010 Red Hat, Inc. - */ - -#ifndef NM_VPN_CONNECTION_H -#define NM_VPN_CONNECTION_H - -#include <glib.h> -#include <glib-object.h> -#include <dbus/dbus-glib.h> -#include "nm-active-connection.h" -#include "NetworkManagerVPN.h" - -G_BEGIN_DECLS - -#define NM_TYPE_VPN_CONNECTION (nm_vpn_connection_get_type ()) -#define NM_VPN_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VPN_CONNECTION, NMVPNConnection)) -#define NM_VPN_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_VPN_CONNECTION, NMVPNConnectionClass)) -#define NM_IS_VPN_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_VPN_CONNECTION)) -#define NM_IS_VPN_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_VPN_CONNECTION)) -#define NM_VPN_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_VPN_CONNECTION, NMVPNConnectionClass)) - -#define NM_VPN_CONNECTION_VPN_STATE "vpn-state" -#define NM_VPN_CONNECTION_BANNER "banner" - -typedef struct { - NMActiveConnection parent; -} NMVPNConnection; - -typedef struct { - NMActiveConnectionClass parent; - - /* Signals */ - void (*vpn_state_changed) (NMVPNConnection *connection, - NMVPNConnectionState state, - NMVPNConnectionStateReason reason); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMVPNConnectionClass; - -GType nm_vpn_connection_get_type (void); - -GObject * nm_vpn_connection_new (DBusGConnection *connection, const char *path); - -NMVPNConnectionState nm_vpn_connection_get_vpn_state (NMVPNConnection *vpn); -const char * nm_vpn_connection_get_banner (NMVPNConnection *vpn); - -G_END_DECLS - -#endif /* NM_VPN_CONNECTION_H */ diff --git a/libnm-glib/nm-vpn-enum-types.c.template b/libnm-glib/nm-vpn-enum-types.c.template deleted file mode 100644 index 8aa02ff7..00000000 --- a/libnm-glib/nm-vpn-enum-types.c.template +++ /dev/null @@ -1,37 +0,0 @@ -/*** BEGIN file-header ***/ -#include "config.h" - -#include "nm-vpn-enum-types.h" - -#include "nm-vpn-plugin.h" -#include "nm-vpn-plugin-ui-interface.h" -#include "nm-vpn-plugin-utils.h" -/*** END file-header ***/ - -/*** BEGIN value-header ***/ -GType -@enum_name@_get_type (void) -{ - static volatile gsize g_define_type_id__volatile = 0; - - if (g_once_init_enter (&g_define_type_id__volatile)) - { - static const G@Type@Value values[] = { -/*** END value-header ***/ - -/*** BEGIN value-production ***/ - { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, -/*** END value-production ***/ - -/*** BEGIN value-tail ***/ - { 0, NULL, NULL } - }; - GType g_define_type_id = - g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); - g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); - } - - return g_define_type_id__volatile; -} - -/*** END value-tail ***/ diff --git a/libnm-glib/nm-vpn-enum-types.h.template b/libnm-glib/nm-vpn-enum-types.h.template deleted file mode 100644 index 47fd96be..00000000 --- a/libnm-glib/nm-vpn-enum-types.h.template +++ /dev/null @@ -1,21 +0,0 @@ -/*** BEGIN file-header ***/ -#ifndef __NM_VPN_ENUM_TYPES_H__ -#define __NM_VPN_ENUM_TYPES_H__ - -#include <glib-object.h> - -G_BEGIN_DECLS - -/*** END file-header ***/ - -/*** BEGIN enumeration-production ***/ -GType @enum_name@_get_type (void) G_GNUC_CONST; -#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) - -/*** END enumeration-production ***/ - -/*** BEGIN file-tail ***/ -G_END_DECLS - -#endif /* __NM_VPN_ENUM_TYPES_H__ */ -/*** END file-tail ***/ diff --git a/libnm-glib/nm-vpn-plugin-ui-interface.c b/libnm-glib/nm-vpn-plugin-ui-interface.c deleted file mode 100644 index ec554e6c..00000000 --- a/libnm-glib/nm-vpn-plugin-ui-interface.c +++ /dev/null @@ -1,246 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2010 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#include "nm-default.h" - -#include "nm-vpn-plugin-ui-interface.h" - -static void -interface_init (gpointer g_iface) -{ - static gboolean initialized = FALSE; - - if (initialized) - return; - - /* Properties */ - - /** - * NMVPNPluginUiInterface:name: - * - * Short display name of the VPN plugin. - */ - g_object_interface_install_property (g_iface, - g_param_spec_string (NM_VPN_PLUGIN_UI_INTERFACE_NAME, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMVPNPluginUiInterface:desc: - * - * Longer description of the VPN plugin. - */ - g_object_interface_install_property (g_iface, - g_param_spec_string (NM_VPN_PLUGIN_UI_INTERFACE_DESC, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMVPNPluginUiInterface:service: - * - * D-Bus service name of the plugin's VPN service. - */ - g_object_interface_install_property (g_iface, - g_param_spec_string (NM_VPN_PLUGIN_UI_INTERFACE_SERVICE, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - initialized = TRUE; -} - -GType -nm_vpn_plugin_ui_interface_get_type (void) -{ - static GType vpn_plugin_ui_interface_type = 0; - - if (!vpn_plugin_ui_interface_type) { - const GTypeInfo vpn_plugin_ui_interface_info = { - sizeof (NMVpnPluginUiInterface), /* class_size */ - interface_init, /* base_init */ - NULL, /* base_finalize */ - NULL, - NULL, /* class_finalize */ - NULL, /* class_data */ - 0, - 0, /* n_preallocs */ - NULL - }; - - vpn_plugin_ui_interface_type = g_type_register_static (G_TYPE_INTERFACE, - "NMVpnPluginUiInterface", - &vpn_plugin_ui_interface_info, - 0); - - g_type_interface_add_prerequisite (vpn_plugin_ui_interface_type, G_TYPE_OBJECT); - } - - return vpn_plugin_ui_interface_type; -} - -NMVpnPluginUiWidgetInterface * -nm_vpn_plugin_ui_interface_ui_factory (NMVpnPluginUiInterface *iface, - NMConnection *connection, - GError **error) -{ - g_return_val_if_fail (NM_IS_VPN_PLUGIN_UI_INTERFACE (iface), NULL); - - return NM_VPN_PLUGIN_UI_INTERFACE_GET_INTERFACE (iface)->ui_factory (iface, connection, error); -} - -guint32 -nm_vpn_plugin_ui_interface_get_capabilities (NMVpnPluginUiInterface *iface) -{ - g_return_val_if_fail (NM_IS_VPN_PLUGIN_UI_INTERFACE (iface), 0); - - return NM_VPN_PLUGIN_UI_INTERFACE_GET_INTERFACE (iface)->get_capabilities (iface); -} - -NMConnection * -nm_vpn_plugin_ui_interface_import (NMVpnPluginUiInterface *iface, - const char *path, - GError **error) -{ - g_return_val_if_fail (NM_IS_VPN_PLUGIN_UI_INTERFACE (iface), NULL); - - if (nm_vpn_plugin_ui_interface_get_capabilities (iface) & NM_VPN_PLUGIN_UI_CAPABILITY_IMPORT) { - g_return_val_if_fail (NM_VPN_PLUGIN_UI_INTERFACE_GET_INTERFACE (iface)->import_from_file != NULL, NULL); - return NM_VPN_PLUGIN_UI_INTERFACE_GET_INTERFACE (iface)->import_from_file (iface, path, error); - } - return NULL; -} - -gboolean -nm_vpn_plugin_ui_interface_export (NMVpnPluginUiInterface *iface, - const char *path, - NMConnection *connection, - GError **error) -{ - g_return_val_if_fail (NM_IS_VPN_PLUGIN_UI_INTERFACE (iface), FALSE); - - if (nm_vpn_plugin_ui_interface_get_capabilities (iface) & NM_VPN_PLUGIN_UI_CAPABILITY_EXPORT) { - g_return_val_if_fail (NM_VPN_PLUGIN_UI_INTERFACE_GET_INTERFACE (iface)->export_to_file != NULL, FALSE); - return NM_VPN_PLUGIN_UI_INTERFACE_GET_INTERFACE (iface)->export_to_file (iface, path, connection, error); - } - return FALSE; -} - -char * -nm_vpn_plugin_ui_interface_get_suggested_name (NMVpnPluginUiInterface *iface, - NMConnection *connection) -{ - g_return_val_if_fail (NM_IS_VPN_PLUGIN_UI_INTERFACE (iface), NULL); - - if (NM_VPN_PLUGIN_UI_INTERFACE_GET_INTERFACE (iface)->get_suggested_name) - return NM_VPN_PLUGIN_UI_INTERFACE_GET_INTERFACE (iface)->get_suggested_name (iface, connection); - return NULL; -} - -gboolean -nm_vpn_plugin_ui_interface_delete_connection (NMVpnPluginUiInterface *iface, - NMConnection *connection, - GError **error) -{ - /* Deprecated and no longer used */ - return TRUE; -} - -static void -widget_interface_init (gpointer g_iface) -{ - GType iface_type = G_TYPE_FROM_INTERFACE (g_iface); - static gboolean initialized = FALSE; - - if (initialized) - return; - - /* Signals */ - g_signal_new ("changed", - iface_type, - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMVpnPluginUiWidgetInterface, changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - initialized = TRUE; -} - -GType -nm_vpn_plugin_ui_widget_interface_get_type (void) -{ - static GType vpn_plugin_ui_widget_interface_type = 0; - - if (!vpn_plugin_ui_widget_interface_type) { - const GTypeInfo vpn_plugin_ui_widget_interface_info = { - sizeof (NMVpnPluginUiWidgetInterface), /* class_size */ - widget_interface_init, /* base_init */ - NULL, /* base_finalize */ - NULL, - NULL, /* class_finalize */ - NULL, /* class_data */ - 0, - 0, /* n_preallocs */ - NULL - }; - - vpn_plugin_ui_widget_interface_type = g_type_register_static (G_TYPE_INTERFACE, - "NMVpnPluginUiWidgetInterface", - &vpn_plugin_ui_widget_interface_info, - 0); - - g_type_interface_add_prerequisite (vpn_plugin_ui_widget_interface_type, G_TYPE_OBJECT); - } - - return vpn_plugin_ui_widget_interface_type; -} - -GObject * -nm_vpn_plugin_ui_widget_interface_get_widget (NMVpnPluginUiWidgetInterface *iface) -{ - g_return_val_if_fail (NM_IS_VPN_PLUGIN_UI_WIDGET_INTERFACE (iface), NULL); - - return NM_VPN_PLUGIN_UI_WIDGET_INTERFACE_GET_INTERFACE (iface)->get_widget (iface); -} - -gboolean -nm_vpn_plugin_ui_widget_interface_update_connection (NMVpnPluginUiWidgetInterface *iface, - NMConnection *connection, - GError **error) -{ - g_return_val_if_fail (NM_IS_VPN_PLUGIN_UI_WIDGET_INTERFACE (iface), FALSE); - - if (error) - g_return_val_if_fail (*error == NULL, FALSE); - - return NM_VPN_PLUGIN_UI_WIDGET_INTERFACE_GET_INTERFACE (iface)->update_connection (iface, connection, error); -} - -gboolean -nm_vpn_plugin_ui_widget_interface_save_secrets (NMVpnPluginUiWidgetInterface *iface, - NMConnection *connection, - GError **error) -{ - /* Deprecated and no longer used */ - return TRUE; -} diff --git a/libnm-glib/nm-vpn-plugin-ui-interface.h b/libnm-glib/nm-vpn-plugin-ui-interface.h deleted file mode 100644 index 7d870128..00000000 --- a/libnm-glib/nm-vpn-plugin-ui-interface.h +++ /dev/null @@ -1,271 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2008 - 2010 Red Hat, Inc. - * Copyright 2008 Novell, Inc. - */ - -#ifndef NM_VPN_PLUGIN_UI_INTERFACE_H -#define NM_VPN_PLUGIN_UI_INTERFACE_H - -#include <glib.h> -#include <glib-object.h> -#include "nm-connection.h" - -G_BEGIN_DECLS - -typedef struct _NMVpnPluginUiInterface NMVpnPluginUiInterface; -typedef struct _NMVpnPluginUiWidgetInterface NMVpnPluginUiWidgetInterface; - -/* Plugin's factory function that returns a GObject that implements - * NMVpnPluginUiInterface. - */ -typedef NMVpnPluginUiInterface * (*NMVpnPluginUiFactory) (GError **error); -NMVpnPluginUiInterface *nm_vpn_plugin_ui_factory (GError **error); - -/*****************************************************************************/ -/* Plugin interface */ -/*****************************************************************************/ - -#define NM_TYPE_VPN_PLUGIN_UI_INTERFACE (nm_vpn_plugin_ui_interface_get_type ()) -#define NM_VPN_PLUGIN_UI_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VPN_PLUGIN_UI_INTERFACE, NMVpnPluginUiInterface)) -#define NM_IS_VPN_PLUGIN_UI_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_VPN_PLUGIN_UI_INTERFACE)) -#define NM_VPN_PLUGIN_UI_INTERFACE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NM_TYPE_VPN_PLUGIN_UI_INTERFACE, NMVpnPluginUiInterface)) - -/** - * NMVpnPluginUiCapability: - * @NM_VPN_PLUGIN_UI_CAPABILITY_NONE: unknown or no capability - * @NM_VPN_PLUGIN_UI_CAPABILITY_IMPORT: the plugin can import new connections - * @NM_VPN_PLUGIN_UI_CAPABILITY_EXPORT: the plugin can export connections - * @NM_VPN_PLUGIN_UI_CAPABILITY_IPV6: the plugin supports IPv6 addressing - * - * Flags that indicate to UI programs certain capabilities of the plugin. - **/ -typedef enum /*< flags >*/ { - NM_VPN_PLUGIN_UI_CAPABILITY_NONE = 0x00, - NM_VPN_PLUGIN_UI_CAPABILITY_IMPORT = 0x01, - NM_VPN_PLUGIN_UI_CAPABILITY_EXPORT = 0x02, - NM_VPN_PLUGIN_UI_CAPABILITY_IPV6 = 0x04 -} NMVpnPluginUiCapability; - -/* Short display name of the VPN plugin */ -#define NM_VPN_PLUGIN_UI_INTERFACE_NAME "name" - -/* Longer description of the VPN plugin */ -#define NM_VPN_PLUGIN_UI_INTERFACE_DESC "desc" - -/* D-Bus service name of the plugin's VPN service */ -#define NM_VPN_PLUGIN_UI_INTERFACE_SERVICE "service" - -/** - * NMVpnPluginUiInterfaceProp: - * @NM_VPN_PLUGIN_UI_INTERFACE_PROP_NAME: the VPN plugin's name - * @NM_VPN_PLUGIN_UI_INTERFACE_PROP_DESC: description of the VPN plugin and what - * VPN services it supports - * @NM_VPN_PLUGIN_UI_INTERFACE_PROP_SERVICE: the D-Bus service name used by the - * plugin's VPN service daemon - * - * #GObject property numbers that plugins should override to provide certain - * information to UI programs. - **/ -typedef enum { - /* private */ - NM_VPN_PLUGIN_UI_INTERFACE_PROP_FIRST = 0x1000, - - /* public */ - NM_VPN_PLUGIN_UI_INTERFACE_PROP_NAME = NM_VPN_PLUGIN_UI_INTERFACE_PROP_FIRST, - NM_VPN_PLUGIN_UI_INTERFACE_PROP_DESC, - NM_VPN_PLUGIN_UI_INTERFACE_PROP_SERVICE -} NMVpnPluginUiInterfaceProp; - -struct _NMVpnPluginUiInterface { - GTypeInterface g_iface; - - /* Plugin's factory function that returns a GObject that implements - * NMVpnPluginUiWidgetInterface, pre-filled with values from 'connection' - * if non-NULL. - */ - NMVpnPluginUiWidgetInterface * (*ui_factory) (NMVpnPluginUiInterface *iface, - NMConnection *connection, - GError **error); - - /* Plugin's capabiltity function that returns a bitmask of capabilities - * described by NM_VPN_PLUGIN_UI_CAPABILITY_* defines. - */ - guint32 (*get_capabilities) (NMVpnPluginUiInterface *iface); - - /* Try to import a connection from the specified path. On success, return a - * partial NMConnection object. On error, return NULL and set 'error' with - * additional information. Note that 'error' can be NULL, in which case no - * additional error information should be provided. - */ - NMConnection * (*import_from_file) (NMVpnPluginUiInterface *iface, - const char *path, - GError **error); - - /* Export the given connection to the specified path. Return TRUE on success. - * On error, return FALSE and set 'error' with additional error information. - * Note that 'error' can be NULL, in which case no additional error information - * should be provided. - */ - gboolean (*export_to_file) (NMVpnPluginUiInterface *iface, - const char *path, - NMConnection *connection, - GError **error); - - /* For a given connection, return a suggested file name. Returned value should - * be NULL or a suggested file name allocated via g_malloc/g_new/etc to be freed - * by the caller. - */ - char * (*get_suggested_name) (NMVpnPluginUiInterface *iface, NMConnection *connection); - - /* Deprecated and no longer used */ - gboolean (*delete_connection) (NMVpnPluginUiInterface *iface, NMConnection *connection, GError **error); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -}; - -GType nm_vpn_plugin_ui_interface_get_type (void); - -NMVpnPluginUiWidgetInterface *nm_vpn_plugin_ui_interface_ui_factory (NMVpnPluginUiInterface *iface, - NMConnection *connection, - GError **error); - -guint32 nm_vpn_plugin_ui_interface_get_capabilities (NMVpnPluginUiInterface *iface); - -NMConnection *nm_vpn_plugin_ui_interface_import (NMVpnPluginUiInterface *iface, - const char *path, - GError **error); - -gboolean nm_vpn_plugin_ui_interface_export (NMVpnPluginUiInterface *iface, - const char *path, - NMConnection *connection, - GError **error); - -char *nm_vpn_plugin_ui_interface_get_suggested_name (NMVpnPluginUiInterface *iface, - NMConnection *connection); - -/* Deprecated and no longer used */ -NM_DEPRECATED_IN_0_9_10 -gboolean nm_vpn_plugin_ui_interface_delete_connection (NMVpnPluginUiInterface *iface, - NMConnection *connection, - GError **error); - -/*****************************************************************************/ -/* UI widget interface */ -/*****************************************************************************/ - -#define NM_TYPE_VPN_PLUGIN_UI_WIDGET_INTERFACE (nm_vpn_plugin_ui_widget_interface_get_type ()) -#define NM_VPN_PLUGIN_UI_WIDGET_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VPN_PLUGIN_UI_WIDGET_INTERFACE, NMVpnPluginUiWidgetInterface)) -#define NM_IS_VPN_PLUGIN_UI_WIDGET_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_VPN_PLUGIN_UI_WIDGET_INTERFACE)) -#define NM_VPN_PLUGIN_UI_WIDGET_INTERFACE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NM_TYPE_VPN_PLUGIN_UI_WIDGET_INTERFACE, NMVpnPluginUiWidgetInterface)) - -struct _NMVpnPluginUiWidgetInterface { - GTypeInterface g_iface; - - /* Return the GtkWidget for the VPN's UI */ - GObject * (*get_widget) (NMVpnPluginUiWidgetInterface *iface); - - /* Called to save the user-entered options to the connection object. Should - * return FALSE and set 'error' if the current options are invalid. 'error' - * should contain enough information for the plugin to determine which UI - * widget is invalid at a later point in time. For example, creating unique - * error codes for what error occurred and populating the message field - * of 'error' with the name of the invalid property. - */ - gboolean (*update_connection) (NMVpnPluginUiWidgetInterface *iface, - NMConnection *connection, - GError **error); - - /* Deprecated and no longer used */ - gboolean (*save_secrets) (NMVpnPluginUiWidgetInterface *iface, - NMConnection *connection, - GError **error); - - /* Emitted when the value of a UI widget changes. May trigger a validity - * check via update_connection() to write values to the connection */ - void (*changed) (NMVpnPluginUiWidgetInterface *iface); -}; - -GType nm_vpn_plugin_ui_widget_interface_get_type (void); - -GObject * nm_vpn_plugin_ui_widget_interface_get_widget (NMVpnPluginUiWidgetInterface *iface); - -gboolean nm_vpn_plugin_ui_widget_interface_update_connection (NMVpnPluginUiWidgetInterface *iface, - NMConnection *connection, - GError **error); - -/* Deprecated and no longer used */ -NM_DEPRECATED_IN_0_9_10 -gboolean nm_vpn_plugin_ui_widget_interface_save_secrets (NMVpnPluginUiWidgetInterface *iface, - NMConnection *connection, - GError **error); - -#ifdef NM_VPN_LIBNM_COMPAT -#define nm_vpn_editor_plugin_factory nm_vpn_plugin_ui_factory - -#define NM_TYPE_VPN_EDITOR_PLUGIN NM_TYPE_VPN_PLUGIN_UI_INTERFACE -#define NM_VPN_EDITOR_PLUGIN(obj) NM_VPN_PLUGIN_UI_INTERFACE(obj) -#define NM_IS_VPN_EDITOR_PLUGIN(obj) NM_IS_VPN_PLUGIN_UI_INTERFACE(obj) -#define NM_VPN_EDITOR_PLUGIN_GET_INTERFACE(obj) NM_VPN_PLUGIN_UI_INTERFACE_GET_INTERFACE(obj) - -#define NMVpnEditorPluginCapability NMVpnPluginUiCapability -#define NM_VPN_EDITOR_PLUGIN_CAPABILITY_NONE NM_VPN_PLUGIN_UI_CAPABILITY_NONE -#define NM_VPN_EDITOR_PLUGIN_CAPABILITY_IMPORT NM_VPN_PLUGIN_UI_CAPABILITY_IMPORT -#define NM_VPN_EDITOR_PLUGIN_CAPABILITY_EXPORT NM_VPN_PLUGIN_UI_CAPABILITY_EXPORT -#define NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6 NM_VPN_PLUGIN_UI_CAPABILITY_IPV6 - -#define NM_VPN_EDITOR_PLUGIN_NAME NM_VPN_PLUGIN_UI_INTERFACE_NAME -#define NM_VPN_EDITOR_PLUGIN_DESCRIPTION NM_VPN_PLUGIN_UI_INTERFACE_DESC -#define NM_VPN_EDITOR_PLUGIN_SERVICE NM_VPN_PLUGIN_UI_INTERFACE_SERVICE - -#define NMVpnEditorPlugin NMVpnPluginUiInterface -#define NMVpnEditorPluginInterface NMVpnPluginUiInterface - -#define get_editor ui_factory -#define get_suggested_filename get_suggested_name - -#define nm_vpn_editor_plugin_get_type nm_vpn_plugin_ui_interface_get_type -#define nm_vpn_editor_plugin_get_editor nm_vpn_plugin_ui_interface_ui_factory -#define nm_vpn_editor_plugin_get_capabilities nm_vpn_plugin_ui_interface_get_capabilities -#define nm_vpn_editor_plugin_import nm_vpn_plugin_ui_interface_import -#define nm_vpn_editor_plugin_export nm_vpn_plugin_ui_interface_export -#define nm_vpn_editor_plugin_get_suggested_filename nm_vpn_plugin_ui_interface_get_suggested_name - -#define NM_TYPE_VPN_EDITOR NM_TYPE_VPN_PLUGIN_UI_WIDGET_INTERFACE -#define NM_VPN_EDITOR(obj) NM_VPN_PLUGIN_UI_WIDGET_INTERFACE (obj) -#define NM_IS_VPN_EDITOR(obj) NM_IS_VPN_PLUGIN_UI_WIDGET_INTERFACE (obj) -#define NM_VPN_EDITOR_GET_INTERFACE(obj) NM_VPN_PLUGIN_UI_WIDGET_INTERFACE_GET_INTERFACE (obj) - -#define NMVpnEditor NMVpnPluginUiWidgetInterface -#define NMVpnEditorInterface NMVpnPluginUiWidgetInterface - -#define nm_vpn_editor_get_type nm_vpn_plugin_ui_widget_interface_get_type -#define nm_vpn_editor_get_widget nm_vpn_plugin_ui_widget_interface_get_widget -#define nm_vpn_editor_update_connection nm_vpn_plugin_ui_widget_interface_update_connection - -#endif /* NM_VPN_LIBNM_COMPAT */ - -G_END_DECLS - -#endif /* NM_VPN_PLUGIN_UI_INTERFACE_H */ diff --git a/libnm-glib/nm-vpn-plugin-utils.c b/libnm-glib/nm-vpn-plugin-utils.c deleted file mode 100644 index 30949d19..00000000 --- a/libnm-glib/nm-vpn-plugin-utils.c +++ /dev/null @@ -1,189 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <stdlib.h> -#include <unistd.h> -#include <string.h> - -#include "nm-vpn-plugin-utils.h" -#include "nm-vpn-plugin.h" -#include "nm-setting-private.h" -#include "nm-dbus-glib-types.h" - -#define DATA_KEY_TAG "DATA_KEY=" -#define DATA_VAL_TAG "DATA_VAL=" -#define SECRET_KEY_TAG "SECRET_KEY=" -#define SECRET_VAL_TAG "SECRET_VAL=" - -static void -free_secret (gpointer data) -{ - char *secret = data; - - memset (secret, 0, strlen (secret)); - g_free (secret); -} - -/** - * nm_vpn_plugin_utils_read_vpn_details: - * @fd: file descriptor to read from, usually stdin (0) - * @out_data: (out) (transfer full): on successful return, a hash table - * (mapping char*:char*) containing the key/value pairs of VPN data items - * @out_secrets: (out) (transfer full): on successful return, a hash table - * (mapping char*:char*) containing the key/value pairsof VPN secrets - * - * Parses key/value pairs from a file descriptor (normally stdin) passed by - * an applet when the applet calls the authentication dialog of the VPN plugin. - * - * Returns: %TRUE if reading values was successful, %FALSE if not - **/ -gboolean -nm_vpn_plugin_utils_read_vpn_details (int fd, - GHashTable **out_data, - GHashTable **out_secrets) -{ - GHashTable *data, *secrets; - gboolean success = FALSE; - char *key = NULL, *val = NULL; - GString *line; - char c; - - if (out_data) - g_return_val_if_fail (*out_data == NULL, FALSE); - if (out_secrets) - g_return_val_if_fail (*out_secrets == NULL, FALSE); - - data = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - secrets = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, free_secret); - - line = g_string_new (NULL); - - /* Read stdin for data and secret items until we get a DONE */ - while (1) { - ssize_t nr; - GHashTable *hash = NULL; - - nr = read (fd, &c, 1); - if (nr == -1) { - if (errno == EAGAIN) { - g_usleep (100); - continue; - } - break; - } - - if (c != '\n') { - g_string_append_c (line, c); - continue; - } - - /* Check for the finish marker */ - if (strcmp (line->str, "DONE") == 0) - break; - - /* Otherwise it's a data/secret item */ - if (strncmp (line->str, DATA_KEY_TAG, strlen (DATA_KEY_TAG)) == 0) { - hash = data; - key = g_strdup (line->str + strlen (DATA_KEY_TAG)); - } else if (strncmp (line->str, DATA_VAL_TAG, strlen (DATA_VAL_TAG)) == 0) { - hash = data; - val = g_strdup (line->str + strlen (DATA_VAL_TAG)); - } else if (strncmp (line->str, SECRET_KEY_TAG, strlen (SECRET_KEY_TAG)) == 0) { - hash = secrets; - key = g_strdup (line->str + strlen (SECRET_KEY_TAG)); - } else if (strncmp (line->str, SECRET_VAL_TAG, strlen (SECRET_VAL_TAG)) == 0) { - hash = secrets; - val = g_strdup (line->str + strlen (SECRET_VAL_TAG)); - } - g_string_truncate (line, 0); - - if (key && val && hash) { - g_hash_table_insert (hash, key, val); - key = NULL; - val = NULL; - success = TRUE; /* Got at least one value */ - } - } - - if (success) { - if (out_data) - *out_data = data; - else - g_hash_table_destroy (data); - - if (out_secrets) - *out_secrets = secrets; - else - g_hash_table_destroy (secrets); - } else { - g_hash_table_destroy (data); - g_hash_table_destroy (secrets); - } - - g_string_free (line, TRUE); - return success; -} - -/** - * nm_vpn_plugin_utils_get_secret_flags: - * @data: hash table containing VPN key/value pair data items - * @secret_name: VPN secret key name for which to retrieve flags for - * @out_flags: (out): on success, the flags associated with @secret_name - * - * Given a VPN secret key name, attempts to find the corresponding flags data - * item in @data. If found, converts the flags data item to - * #NMSettingSecretFlags and returns it. - * - * Returns: %TRUE if the flag data item was found and successfully converted - * to flags, %FALSE if not - **/ -gboolean -nm_vpn_plugin_utils_get_secret_flags (GHashTable *data, - const char *secret_name, - NMSettingSecretFlags *out_flags) -{ - char *flag_name; - const char *val; - unsigned long tmp; - gboolean success = FALSE; - - g_return_val_if_fail (data != NULL, FALSE); - g_return_val_if_fail (secret_name != NULL, FALSE); - g_return_val_if_fail (out_flags != NULL, FALSE); - g_return_val_if_fail (*out_flags == NM_SETTING_SECRET_FLAG_NONE, FALSE); - - flag_name = g_strdup_printf ("%s-flags", secret_name); - - /* Try new flags value first */ - val = g_hash_table_lookup (data, flag_name); - if (val) { - errno = 0; - tmp = strtoul (val, NULL, 10); - if (errno == 0 && tmp <= NM_SETTING_SECRET_FLAGS_ALL) { - *out_flags = (NMSettingSecretFlags) tmp; - success = TRUE; - } - } - - g_free (flag_name); - return success; -} diff --git a/libnm-glib/nm-vpn-plugin-utils.h b/libnm-glib/nm-vpn-plugin-utils.h deleted file mode 100644 index dfb621ca..00000000 --- a/libnm-glib/nm-vpn-plugin-utils.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 Red Hat, Inc. - */ - -#ifndef NM_VPN_PLUGIN_UTILS_H -#define NM_VPN_PLUGIN_UTILS_H - -#include <glib.h> -#include "nm-setting.h" - -G_BEGIN_DECLS - -gboolean nm_vpn_plugin_utils_read_vpn_details (int fd, - GHashTable **out_data, - GHashTable **out_secrets); - -gboolean nm_vpn_plugin_utils_get_secret_flags (GHashTable *data, - const char *secret_name, - NMSettingSecretFlags *out_flags); - -G_END_DECLS - -#endif /* NM_VPN_PLUGIN_UTILS_H */ diff --git a/libnm-glib/nm-vpn-plugin.c b/libnm-glib/nm-vpn-plugin.c deleted file mode 100644 index c7c68a8d..00000000 --- a/libnm-glib/nm-vpn-plugin.c +++ /dev/null @@ -1,1041 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2008 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include "nm-vpn-plugin.h" - -#include <signal.h> - -#include "nm-vpn-enum-types.h" -#include "nm-utils.h" -#include "nm-connection.h" -#include "nm-dbus-glib-types.h" -#include "nm-setting-private.h" - -static gboolean impl_vpn_plugin_connect (NMVPNPlugin *plugin, - GHashTable *connection, - GError **error); - -static gboolean impl_vpn_plugin_connect_interactive (NMVPNPlugin *plugin, - GHashTable *connection, - GHashTable *details, - GError **error); - -static gboolean impl_vpn_plugin_need_secrets (NMVPNPlugin *plugin, - GHashTable *connection, - char **service_name, - GError **err); - -static gboolean impl_vpn_plugin_new_secrets (NMVPNPlugin *plugin, - GHashTable *connection, - GError **err); - -static gboolean impl_vpn_plugin_disconnect (NMVPNPlugin *plugin, - GError **err); - -static gboolean impl_vpn_plugin_set_config (NMVPNPlugin *plugin, - GHashTable *config, - GError **err); - -static gboolean impl_vpn_plugin_set_ip4_config (NMVPNPlugin *plugin, - GHashTable *config, - GError **err); - -static gboolean impl_vpn_plugin_set_ip6_config (NMVPNPlugin *plugin, - GHashTable *config, - GError **err); - -static gboolean impl_vpn_plugin_set_failure (NMVPNPlugin *plugin, - char *reason, - GError **err); - -#include "nm-vpn-plugin-glue.h" - -#define NM_VPN_PLUGIN_QUIT_TIMER 180 - -G_DEFINE_ABSTRACT_TYPE (NMVPNPlugin, nm_vpn_plugin, G_TYPE_OBJECT) - -typedef struct { - NMVPNServiceState state; - - /* DBUS-y stuff */ - DBusGConnection *connection; - char *dbus_service_name; - - /* Temporary stuff */ - guint connect_timer; - guint quit_timer; - guint fail_stop_id; - gboolean interactive; - - gboolean got_config; - gboolean has_ip4, got_ip4; - gboolean has_ip6, got_ip6; - - /* Config stuff copied from config to ip4config */ - GValue banner, tundev, gateway, mtu; -} NMVPNPluginPrivate; - -#define NM_VPN_PLUGIN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_VPN_PLUGIN, NMVPNPluginPrivate)) - -enum { - STATE_CHANGED, - CONFIG, - IP4_CONFIG, - IP6_CONFIG, - LOGIN_BANNER, - FAILURE, - QUIT, - SECRETS_REQUIRED, - - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -enum { - PROP_0, - PROP_DBUS_SERVICE_NAME, - PROP_STATE, - - LAST_PROP -}; - -static GSList *active_plugins = NULL; - -GQuark -nm_vpn_plugin_error_quark (void) -{ - static GQuark quark = 0; - - if (!quark) - quark = g_quark_from_static_string ("nm_vpn_plugin_error"); - - return quark; -} - -static void -nm_vpn_plugin_set_connection (NMVPNPlugin *plugin, - DBusGConnection *connection) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - - if (priv->connection) - dbus_g_connection_unref (priv->connection); - - priv->connection = connection; -} - -DBusGConnection * -nm_vpn_plugin_get_connection (NMVPNPlugin *plugin) -{ - DBusGConnection *connection; - - g_return_val_if_fail (NM_IS_VPN_PLUGIN (plugin), NULL); - - connection = NM_VPN_PLUGIN_GET_PRIVATE (plugin)->connection; - - if (connection) - dbus_g_connection_ref (connection); - - return connection; -} - -NMVPNServiceState -nm_vpn_plugin_get_state (NMVPNPlugin *plugin) -{ - g_return_val_if_fail (NM_IS_VPN_PLUGIN (plugin), NM_VPN_SERVICE_STATE_UNKNOWN); - - return NM_VPN_PLUGIN_GET_PRIVATE (plugin)->state; -} - -void -nm_vpn_plugin_set_state (NMVPNPlugin *plugin, - NMVPNServiceState state) -{ - NMVPNPluginPrivate *priv; - - g_return_if_fail (NM_IS_VPN_PLUGIN (plugin)); - - priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - if (priv->state != state) { - priv->state = state; - g_signal_emit (plugin, signals[STATE_CHANGED], 0, state); - } -} - -void -nm_vpn_plugin_set_login_banner (NMVPNPlugin *plugin, - const char *banner) -{ - g_return_if_fail (NM_IS_VPN_PLUGIN (plugin)); - g_return_if_fail (banner != NULL); - - g_signal_emit (plugin, signals[LOGIN_BANNER], 0, banner); -} - -void -nm_vpn_plugin_failure (NMVPNPlugin *plugin, - NMVPNPluginFailure reason) -{ - g_return_if_fail (NM_IS_VPN_PLUGIN (plugin)); - - g_signal_emit (plugin, signals[FAILURE], 0, reason); -} - -gboolean -nm_vpn_plugin_disconnect (NMVPNPlugin *plugin, GError **err) -{ - gboolean ret = FALSE; - NMVPNServiceState state; - - g_return_val_if_fail (NM_IS_VPN_PLUGIN (plugin), FALSE); - - state = nm_vpn_plugin_get_state (plugin); - switch (state) { - case NM_VPN_SERVICE_STATE_STOPPING: - g_set_error (err, - NM_VPN_PLUGIN_ERROR, - NM_VPN_PLUGIN_ERROR_STOPPING_IN_PROGRESS, - "%s", - "Could not process the request because the VPN connection is already being stopped."); - break; - case NM_VPN_SERVICE_STATE_STOPPED: - g_set_error (err, - NM_VPN_PLUGIN_ERROR, - NM_VPN_PLUGIN_ERROR_ALREADY_STOPPED, - "%s", - "Could not process the request because no VPN connection was active."); - break; - case NM_VPN_SERVICE_STATE_STARTING: - case NM_VPN_SERVICE_STATE_STARTED: - nm_vpn_plugin_set_state (plugin, NM_VPN_SERVICE_STATE_STOPPING); - ret = NM_VPN_PLUGIN_GET_CLASS (plugin)->disconnect (plugin, err); - nm_vpn_plugin_set_state (plugin, NM_VPN_SERVICE_STATE_STOPPED); - break; - case NM_VPN_SERVICE_STATE_INIT: - ret = TRUE; - break; - - default: - g_warning ("Unhandled VPN service state %d", state); - g_assert_not_reached (); - break; - } - - return ret; -} - -static void -nm_vpn_plugin_emit_quit (NMVPNPlugin *plugin) -{ - g_signal_emit (plugin, signals[QUIT], 0); -} - -static gboolean -connect_timer_expired (gpointer data) -{ - NMVPNPlugin *plugin = NM_VPN_PLUGIN (data); - GError *err = NULL; - - NM_VPN_PLUGIN_GET_PRIVATE (plugin)->connect_timer = 0; - 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 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 void -schedule_quit_timer (NMVPNPlugin *self) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (self); - - nm_clear_g_source (&priv->quit_timer); - priv->quit_timer = g_timeout_add_seconds (NM_VPN_PLUGIN_QUIT_TIMER, - quit_timer_expired, - self); -} - -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 void -schedule_fail_stop (NMVPNPlugin *plugin, guint timeout_secs) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - - nm_clear_g_source (&priv->fail_stop_id); - if (timeout_secs) - priv->fail_stop_id = g_timeout_add_seconds (timeout_secs, fail_stop, plugin); - else - priv->fail_stop_id = g_idle_add (fail_stop, plugin); -} - -static void -_g_value_set (GValue *dst, GValue *src) -{ - if (src) { - GType type = G_VALUE_TYPE (src); - - if (G_IS_VALUE (dst)) - g_value_unset (dst); - g_value_init (dst, type); - g_value_copy (src, dst); - } else if (G_IS_VALUE (dst)) - g_value_unset (dst); -} - -void -nm_vpn_plugin_set_config (NMVPNPlugin *plugin, - GHashTable *config) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - GValue *val; - - g_return_if_fail (NM_IS_VPN_PLUGIN (plugin)); - g_return_if_fail (config != NULL); - - priv->got_config = TRUE; - - val = g_hash_table_lookup (config, NM_VPN_PLUGIN_CONFIG_HAS_IP4); - if (val && g_value_get_boolean (val)) - priv->has_ip4 = TRUE; - val = g_hash_table_lookup (config, NM_VPN_PLUGIN_CONFIG_HAS_IP6); - if (val && g_value_get_boolean (val)) - priv->has_ip6 = TRUE; - - /* Record the items that need to also be inserted into the - * ip4config, for compatibility with older daemons. - */ - _g_value_set (&priv->banner, g_hash_table_lookup (config, NM_VPN_PLUGIN_CONFIG_BANNER)); - _g_value_set (&priv->tundev, g_hash_table_lookup (config, NM_VPN_PLUGIN_CONFIG_TUNDEV)); - _g_value_set (&priv->gateway, g_hash_table_lookup (config, NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY)); - _g_value_set (&priv->mtu, g_hash_table_lookup (config, NM_VPN_PLUGIN_CONFIG_MTU)); - - g_signal_emit (plugin, signals[CONFIG], 0, config); -} - -void -nm_vpn_plugin_set_ip4_config (NMVPNPlugin *plugin, - GHashTable *ip4_config) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - GHashTable *combined_config; - GHashTableIter iter; - gpointer key, value; - - g_return_if_fail (NM_IS_VPN_PLUGIN (plugin)); - g_return_if_fail (ip4_config != NULL); - - priv->got_ip4 = TRUE; - - /* Old plugins won't send the "config" signal and thus can't send - * NM_VPN_PLUGIN_CONFIG_HAS_IP4 either. But since they don't support IPv6, - * we can safely assume that, if we don't receive a "config" signal but do - * receive an "ip4-config" signal, the old plugin supports IPv4. - */ - if (!priv->got_config) - priv->has_ip4 = TRUE; - - /* Older NetworkManager daemons expect all config info to be in - * the ip4 config, so they won't even notice the "config" signal - * being emitted. So just copy all of that data into the ip4 - * config too. - */ - combined_config = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_iter_init (&iter, ip4_config); - while (g_hash_table_iter_next (&iter, &key, &value)) - g_hash_table_insert (combined_config, key, value); - - if (G_VALUE_TYPE (&priv->banner) != G_TYPE_INVALID) - g_hash_table_insert (combined_config, NM_VPN_PLUGIN_IP4_CONFIG_BANNER, &priv->banner); - if (G_VALUE_TYPE (&priv->tundev) != G_TYPE_INVALID) - g_hash_table_insert (combined_config, NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV, &priv->tundev); - if (G_VALUE_TYPE (&priv->gateway) != G_TYPE_INVALID) - g_hash_table_insert (combined_config, NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY, &priv->gateway); - if (G_VALUE_TYPE (&priv->mtu) != G_TYPE_INVALID) - g_hash_table_insert (combined_config, NM_VPN_PLUGIN_IP4_CONFIG_MTU, &priv->mtu); - - g_signal_emit (plugin, signals[IP4_CONFIG], 0, combined_config); - g_hash_table_destroy (combined_config); - - if ( priv->has_ip4 == priv->got_ip4 - && priv->has_ip6 == priv->got_ip6) - nm_vpn_plugin_set_state (plugin, NM_VPN_SERVICE_STATE_STARTED); -} - -void -nm_vpn_plugin_set_ip6_config (NMVPNPlugin *plugin, - GHashTable *ip6_config) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - - g_return_if_fail (NM_IS_VPN_PLUGIN (plugin)); - g_return_if_fail (ip6_config != NULL); - - priv->got_ip6 = TRUE; - g_signal_emit (plugin, signals[IP6_CONFIG], 0, ip6_config); - - if ( priv->has_ip4 == priv->got_ip4 - && priv->has_ip6 == priv->got_ip6) - nm_vpn_plugin_set_state (plugin, NM_VPN_SERVICE_STATE_STARTED); -} - -static void -connect_timer_start (NMVPNPlugin *plugin) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - - nm_clear_g_source (&priv->connect_timer); - priv->connect_timer = g_timeout_add_seconds (60, connect_timer_expired, plugin); -} - -static gboolean -_connect_generic (NMVPNPlugin *plugin, - GHashTable *properties, - GHashTable *details, - GError **error) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - NMVPNPluginClass *vpn_class = NM_VPN_PLUGIN_GET_CLASS (plugin); - NMConnection *connection; - gboolean success = FALSE; - GError *local = NULL; - guint fail_stop_timeout = 0; - - if (priv->state != NM_VPN_SERVICE_STATE_STOPPED && - priv->state != NM_VPN_SERVICE_STATE_INIT) { - g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_WRONG_STATE, - "Could not start connection: wrong plugin state %d", - priv->state); - return FALSE; - } - - connection = _nm_connection_new_from_hash (properties); - - priv->interactive = FALSE; - if (details && !vpn_class->connect_interactive) { - g_set_error_literal (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_INTERACTIVE_NOT_SUPPORTED, - "Plugin does not implement ConnectInteractive()"); - return FALSE; - } - - nm_clear_g_source (&priv->fail_stop_id); - - if (details) { - priv->interactive = TRUE; - success = vpn_class->connect_interactive (plugin, connection, details, &local); - if (g_error_matches (local, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_INTERACTIVE_NOT_SUPPORTED)) { - /* Give NetworkManager a bit of time to fall back to Connect() */ - fail_stop_timeout = 5; - } - g_propagate_error (error, local); - } else - success = vpn_class->connect (plugin, connection, error); - - if (success) { - nm_vpn_plugin_set_state (plugin, NM_VPN_SERVICE_STATE_STARTING); - - /* Add a timer to make sure we do not wait indefinitely for the successful connect. */ - connect_timer_start (plugin); - } else { - /* Stop the plugin from an idle handler so that the Connect - * method return gets sent before the STOP StateChanged signal. - */ - schedule_fail_stop (plugin, fail_stop_timeout); - } - - g_object_unref (connection); - return success; -} - -static gboolean -impl_vpn_plugin_connect (NMVPNPlugin *plugin, - GHashTable *connection, - GError **error) -{ - return _connect_generic (plugin, connection, NULL, error); -} - -static gboolean -impl_vpn_plugin_connect_interactive (NMVPNPlugin *plugin, - GHashTable *connection, - GHashTable *details, - GError **error) -{ - return _connect_generic (plugin, connection, details, error); -} - -/*****************************************************************************/ - -static gboolean -impl_vpn_plugin_need_secrets (NMVPNPlugin *plugin, - GHashTable *properties, - char **setting_name, - GError **err) -{ - gboolean ret = FALSE; - NMConnection *connection; - char *sn = NULL; - GError *ns_err = NULL; - gboolean needed = FALSE; - - g_return_val_if_fail (NM_IS_VPN_PLUGIN (plugin), FALSE); - g_return_val_if_fail (properties != NULL, FALSE); - - connection = _nm_connection_new_from_hash (properties); - - if (!NM_VPN_PLUGIN_GET_CLASS (plugin)->need_secrets) { - *setting_name = ""; - ret = TRUE; - goto out; - } - - needed = NM_VPN_PLUGIN_GET_CLASS (plugin)->need_secrets (plugin, connection, &sn, &ns_err); - if (ns_err) { - *err = g_error_copy (ns_err); - g_error_free (ns_err); - goto out; - } - - ret = TRUE; - if (needed) { - /* Push back the quit timer so the VPN plugin doesn't quit in the - * middle of asking the user for secrets. - */ - schedule_quit_timer (plugin); - - g_assert (sn); - *setting_name = g_strdup (sn); - } else { - /* No secrets required */ - *setting_name = g_strdup (""); - } - -out: - return ret; -} - -static gboolean -impl_vpn_plugin_new_secrets (NMVPNPlugin *plugin, - GHashTable *properties, - GError **error) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - NMConnection *connection; - gboolean success; - - if (priv->state != NM_VPN_SERVICE_STATE_STARTING) { - g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_WRONG_STATE, - "Could not accept new secrets: wrong plugin state %d", - priv->state); - return FALSE; - } - - connection = _nm_connection_new_from_hash (properties); - - if (!NM_VPN_PLUGIN_GET_CLASS (plugin)->new_secrets) { - g_set_error_literal (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_INTERACTIVE_NOT_SUPPORTED, - "Could not accept new secrets: plugin cannot process interactive secrets"); - g_object_unref (connection); - return FALSE; - } - - success = NM_VPN_PLUGIN_GET_CLASS (plugin)->new_secrets (plugin, connection, error); - if (success) { - /* Add a timer to make sure we do not wait indefinitely for the successful connect. */ - connect_timer_start (plugin); - } else { - /* Stop the plugin from and idle handler so that the NewSecrets - * method return gets sent before the STOP StateChanged signal. - */ - schedule_fail_stop (plugin, 0); - } - - g_object_unref (connection); - return success; -} - -/** - * nm_vpn_plugin_secrets_required: - * @plugin: the #NMVPNPlugin - * @message: an information message about why secrets are required, if any - * @hints: VPN specific secret names for required new secrets - * - * Called by VPN plugin implementations to signal to NetworkManager that secrets - * are required during the connection process. This signal may be used to - * request new secrets when the secrets originally provided by NetworkManager - * are insufficient, or the VPN process indicates that it needs additional - * information to complete the request. - * - * Since: 0.9.10 - */ -void -nm_vpn_plugin_secrets_required (NMVPNPlugin *plugin, - const char *message, - const char **hints) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - - /* Plugin must be able to accept the new secrets if it calls this method */ - g_return_if_fail (NM_VPN_PLUGIN_GET_CLASS (plugin)->new_secrets); - - /* Plugin cannot call this method if NetworkManager didn't originally call - * ConnectInteractive(). - */ - g_return_if_fail (priv->interactive == TRUE); - - /* Cancel the connect timer since secrets might take a while. It'll - * get restarted when the secrets come back via NewSecrets(). - */ - nm_clear_g_source (&priv->connect_timer); - - g_signal_emit (plugin, signals[SECRETS_REQUIRED], 0, message, hints); -} - -/*****************************************************************************/ - -static gboolean -impl_vpn_plugin_disconnect (NMVPNPlugin *plugin, - GError **err) -{ - return nm_vpn_plugin_disconnect (plugin, err); -} - -static gboolean -impl_vpn_plugin_set_config (NMVPNPlugin *plugin, - GHashTable *config, - GError **err) -{ - nm_vpn_plugin_set_config (plugin, config); - - return TRUE; -} - -static gboolean -impl_vpn_plugin_set_ip4_config (NMVPNPlugin *plugin, - GHashTable *config, - GError **err) -{ - nm_vpn_plugin_set_ip4_config (plugin, config); - - return TRUE; -} - -static gboolean -impl_vpn_plugin_set_ip6_config (NMVPNPlugin *plugin, - GHashTable *config, - GError **err) -{ - nm_vpn_plugin_set_ip6_config (plugin, config); - - return TRUE; -} - -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; -} - -/*****************************************************************************/ - -static void -_emit_quit (gpointer data, gpointer user_data) -{ - NMVPNPlugin *plugin = data; - - nm_vpn_plugin_emit_quit (plugin); -} - -static void -sigterm_handler (int signum) -{ - g_slist_foreach (active_plugins, _emit_quit, NULL); -} - -static void -setup_unix_signal_handler (void) -{ - struct sigaction action; - sigset_t block_mask; - - action.sa_handler = sigterm_handler; - sigemptyset (&block_mask); - action.sa_mask = block_mask; - action.sa_flags = 0; - sigaction (SIGINT, &action, NULL); - sigaction (SIGTERM, &action, NULL); -} - -/*****************************************************************************/ - -static void -one_plugin_destroyed (gpointer data, - GObject *object) -{ - active_plugins = g_slist_remove (active_plugins, object); -} - -static void -nm_vpn_plugin_init (NMVPNPlugin *plugin) -{ - active_plugins = g_slist_append (active_plugins, plugin); - g_object_weak_ref (G_OBJECT (plugin), - one_plugin_destroyed, - NULL); -} - -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, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_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 -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_value_dup_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 -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 -dispose (GObject *object) -{ - NMVPNPlugin *plugin = NM_VPN_PLUGIN (object); - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - NMVPNServiceState state; - GError *err = NULL; - - nm_clear_g_source (&priv->fail_stop_id); - nm_clear_g_source (&priv->quit_timer); - nm_clear_g_source (&priv->connect_timer); - - 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 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 -state_changed (NMVPNPlugin *plugin, NMVPNServiceState state) -{ - NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (plugin); - - switch (state) { - case NM_VPN_SERVICE_STATE_STARTING: - nm_clear_g_source (&priv->quit_timer); - nm_clear_g_source (&priv->fail_stop_id); - break; - case NM_VPN_SERVICE_STATE_STOPPED: - schedule_quit_timer (plugin); - break; - default: - /* Clean up all timers we might have set up. */ - nm_clear_g_source (&priv->connect_timer); - nm_clear_g_source (&priv->quit_timer); - nm_clear_g_source (&priv->fail_stop_id); - break; - } -} - -static void -nm_vpn_plugin_class_init (NMVPNPluginClass *plugin_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (plugin_class); - - g_type_class_add_private (object_class, sizeof (NMVPNPluginPrivate)); - - dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (plugin_class), - &dbus_glib_nm_vpn_plugin_object_info); - - /* virtual methods */ - object_class->constructor = constructor; - object_class->set_property = set_property; - object_class->get_property = get_property; - object_class->dispose = dispose; - object_class->finalize = finalize; - - plugin_class->state_changed = state_changed; - - /* properties */ - - /** - * NMVPNPlugin:service-name: - * - * The D-Bus service name of this plugin. - */ - g_object_class_install_property - (object_class, PROP_DBUS_SERVICE_NAME, - g_param_spec_string (NM_VPN_PLUGIN_DBUS_SERVICE_NAME, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - /** - * NMVPNPlugin:state: - * - * The state of the plugin. - */ - g_object_class_install_property - (object_class, PROP_STATE, - g_param_spec_uint (NM_VPN_PLUGIN_STATE, "", "", - NM_VPN_SERVICE_STATE_UNKNOWN, - NM_VPN_SERVICE_STATE_STOPPED, - NM_VPN_SERVICE_STATE_INIT, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - /* signals */ - signals[STATE_CHANGED] = - g_signal_new ("state-changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMVPNPluginClass, state_changed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, - G_TYPE_NONE, 1, - G_TYPE_UINT); - - signals[SECRETS_REQUIRED] = - g_signal_new ("secrets-required", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - NULL, - G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRV); - - signals[CONFIG] = - g_signal_new ("config", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMVPNPluginClass, config), - NULL, NULL, - g_cclosure_marshal_VOID__BOXED, - G_TYPE_NONE, 1, - DBUS_TYPE_G_MAP_OF_VARIANT); - - signals[IP4_CONFIG] = - g_signal_new ("ip4-config", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMVPNPluginClass, ip4_config), - NULL, NULL, - g_cclosure_marshal_VOID__BOXED, - G_TYPE_NONE, 1, - DBUS_TYPE_G_MAP_OF_VARIANT); - - signals[IP6_CONFIG] = - g_signal_new ("ip6-config", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMVPNPluginClass, ip6_config), - NULL, NULL, - g_cclosure_marshal_VOID__BOXED, - G_TYPE_NONE, 1, - DBUS_TYPE_G_MAP_OF_VARIANT); - - signals[LOGIN_BANNER] = - g_signal_new ("login-banner", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMVPNPluginClass, login_banner), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - signals[FAILURE] = - g_signal_new ("failure", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMVPNPluginClass, failure), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, - G_TYPE_NONE, 1, - G_TYPE_UINT); - - signals[QUIT] = - g_signal_new ("quit", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (NMVPNPluginClass, quit), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, - G_TYPE_NONE); - - dbus_g_error_domain_register (NM_VPN_PLUGIN_ERROR, - NM_DBUS_VPN_ERROR_PREFIX, - NM_TYPE_VPN_PLUGIN_ERROR); - - setup_unix_signal_handler (); -} diff --git a/libnm-glib/nm-vpn-plugin.h b/libnm-glib/nm-vpn-plugin.h deleted file mode 100644 index a33349a1..00000000 --- a/libnm-glib/nm-vpn-plugin.h +++ /dev/null @@ -1,175 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2007 - 2008 Novell, Inc. - * Copyright 2007 - 2013 Red Hat, Inc. - */ - -#ifndef NM_VPN_PLUGIN_H -#define NM_VPN_PLUGIN_H - -#include <glib.h> -#include <glib-object.h> -#include <dbus/dbus-glib.h> -#include "NetworkManagerVPN.h" -#include "nm-connection.h" - -G_BEGIN_DECLS - -#define NM_TYPE_VPN_PLUGIN (nm_vpn_plugin_get_type ()) -#define NM_VPN_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VPN_PLUGIN, NMVPNPlugin)) -#define NM_VPN_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_VPN_PLUGIN, NMVPNPluginClass)) -#define NM_IS_VPN_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_VPN_PLUGIN)) -#define NM_IS_VPN_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_VPN_PLUGIN)) -#define NM_VPN_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_VPN_PLUGIN, NMVPNPluginClass)) - -#define NM_VPN_PLUGIN_DBUS_SERVICE_NAME "service-name" -#define NM_VPN_PLUGIN_STATE "state" - -/** - * NMVPNPluginError: - * @NM_VPN_PLUGIN_ERROR_GENERAL: general failure - * @NM_VPN_PLUGIN_ERROR_STARTING_IN_PROGRESS: the plugin is already starting, - * and another connect request was received - * @NM_VPN_PLUGIN_ERROR_ALREADY_STARTED: the plugin is already connected, and - * another connect request was received - * @NM_VPN_PLUGIN_ERROR_STOPPING_IN_PROGRESS: the plugin is already stopping, - * and another stop request was received - * @NM_VPN_PLUGIN_ERROR_ALREADY_STOPPED: the plugin is already stopped, and - * another disconnect request was received - * @NM_VPN_PLUGIN_ERROR_WRONG_STATE: the operation could not be performed in - * this state - * @NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS: the operation could not be performed as - * the request contained malformed arguments, or arguments of unexpected type. - * Usually means that one of the VPN setting data items or secrets was not of - * the expected type (ie int, string, bool, etc). - * @NM_VPN_PLUGIN_ERROR_LAUNCH_FAILED: a child process failed to launch - * @NM_VPN_PLUGIN_ERROR_CONNECTION_INVALID: the operation could not be performed - * because the connection was invalid. Usually means that the connection's - * VPN setting was missing some required data item or secret. - * @NM_VPN_PLUGIN_ERROR_INTERACTIVE_NOT_SUPPORTED: the operation could not be - * performed as the plugin does not support interactive operations, such as - * ConnectInteractive() or NewSecrets() - * - * Returned by the VPN service plugin to indicate errors. - **/ -typedef enum { - NM_VPN_PLUGIN_ERROR_GENERAL, /*< nick=General >*/ - NM_VPN_PLUGIN_ERROR_STARTING_IN_PROGRESS, /*< nick=StartingInProgress >*/ - NM_VPN_PLUGIN_ERROR_ALREADY_STARTED, /*< nick=AlreadyStarted >*/ - NM_VPN_PLUGIN_ERROR_STOPPING_IN_PROGRESS, /*< nick=StoppingInProgress >*/ - NM_VPN_PLUGIN_ERROR_ALREADY_STOPPED, /*< nick=AlreadyStopped >*/ - NM_VPN_PLUGIN_ERROR_WRONG_STATE, /*< nick=WrongState >*/ - NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS, /*< nick=BadArguments >*/ - NM_VPN_PLUGIN_ERROR_LAUNCH_FAILED, /*< nick=LaunchFailed >*/ - NM_VPN_PLUGIN_ERROR_CONNECTION_INVALID, /*< nick=ConnectionInvalid >*/ - NM_VPN_PLUGIN_ERROR_INTERACTIVE_NOT_SUPPORTED /*< nick=InteractiveNotSupported >*/ -} NMVPNPluginError; - -#define NM_VPN_PLUGIN_ERROR (nm_vpn_plugin_error_quark ()) - -typedef struct { - GObject parent; -} NMVPNPlugin; - -typedef struct { - GObjectClass parent; - - /* virtual methods */ - gboolean (*connect) (NMVPNPlugin *plugin, - NMConnection *connection, - GError **err); - - gboolean (*need_secrets) (NMVPNPlugin *plugin, - NMConnection *connection, - char **setting_name, - GError **error); - - gboolean (*disconnect) (NMVPNPlugin *plugin, - GError **err); - - /* Signals */ - void (*state_changed) (NMVPNPlugin *plugin, - NMVPNServiceState state); - - void (*ip4_config) (NMVPNPlugin *plugin, - GHashTable *ip4_config); - - void (*login_banner) (NMVPNPlugin *plugin, - const char *banner); - - void (*failure) (NMVPNPlugin *plugin, - NMVPNPluginFailure reason); - - void (*quit) (NMVPNPlugin *plugin); - - void (*config) (NMVPNPlugin *plugin, - GHashTable *config); - - void (*ip6_config) (NMVPNPlugin *plugin, - GHashTable *config); - - /* more methods */ - gboolean (*new_secrets) (NMVPNPlugin *plugin, - NMConnection *connection, - GError **error); - - gboolean (*connect_interactive) (NMVPNPlugin *plugin, - NMConnection *connection, - GHashTable *details, - GError **error); - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); -} NMVPNPluginClass; - -GType nm_vpn_plugin_get_type (void); -GQuark nm_vpn_plugin_error_quark (void); -GType nm_vpn_plugin_error_get_type (void); - -DBusGConnection *nm_vpn_plugin_get_connection (NMVPNPlugin *plugin); -NMVPNServiceState nm_vpn_plugin_get_state (NMVPNPlugin *plugin); -void nm_vpn_plugin_set_state (NMVPNPlugin *plugin, - NMVPNServiceState state); - -NM_AVAILABLE_IN_0_9_10 -void nm_vpn_plugin_secrets_required (NMVPNPlugin *plugin, - const char *message, - const char **hints); - -void nm_vpn_plugin_set_login_banner (NMVPNPlugin *plugin, - const char *banner); - -void nm_vpn_plugin_failure (NMVPNPlugin *plugin, - NMVPNPluginFailure reason); - -void nm_vpn_plugin_set_config (NMVPNPlugin *plugin, - GHashTable *config); - -void nm_vpn_plugin_set_ip4_config (NMVPNPlugin *plugin, - GHashTable *ip4_config); - -void nm_vpn_plugin_set_ip6_config (NMVPNPlugin *plugin, - GHashTable *ip6_config); - -gboolean nm_vpn_plugin_disconnect (NMVPNPlugin *plugin, - GError **err); - -G_END_DECLS - -#endif /* NM_VPN_PLUGIN_H */ diff --git a/libnm-glib/nm-wimax-nsp.c b/libnm-glib/nm-wimax-nsp.c deleted file mode 100644 index d0ab1f5c..00000000 --- a/libnm-glib/nm-wimax-nsp.c +++ /dev/null @@ -1,331 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 Red Hat, Inc. - */ - -#include "nm-default.h" - -#include <string.h> - -#include "nm-connection.h" -#include "nm-setting-connection.h" -#include "nm-setting-wimax.h" -#include "nm-wimax-nsp.h" -#include "NetworkManager.h" -#include "nm-types-private.h" -#include "nm-object-private.h" - -G_DEFINE_TYPE (NMWimaxNsp, nm_wimax_nsp, NM_TYPE_OBJECT) - -#define NM_WIMAX_NSP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_WIMAX_NSP, NMWimaxNspPrivate)) - -typedef struct { - DBusGProxy *proxy; - - char *name; - guint32 signal_quality; - NMWimaxNspNetworkType network_type; -} NMWimaxNspPrivate; - -enum { - PROP_0, - PROP_NAME, - PROP_SIGNAL_QUALITY, - PROP_NETWORK_TYPE, - - LAST_PROP -}; - -/** - * nm_wimax_nsp_new: - * @connection: the #DBusGConnection - * @path: the D-Bus object path of the WiMAX NSP - * - * Creates a new #NMWimaxNsp. - * - * Returns: (transfer full): a new WiMAX NSP - **/ -GObject * -nm_wimax_nsp_new (DBusGConnection *connection, const char *path) -{ - g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - - return (GObject *) g_object_new (NM_TYPE_WIMAX_NSP, - NM_OBJECT_DBUS_CONNECTION, connection, - NM_OBJECT_DBUS_PATH, path, - NULL); -} - -/** - * nm_wimax_nsp_get_name: - * @nsp: a #NMWimaxNsp - * - * Gets the name of the wimax NSP - * - * Returns: the name - **/ -const char * -nm_wimax_nsp_get_name (NMWimaxNsp *nsp) -{ - g_return_val_if_fail (NM_IS_WIMAX_NSP (nsp), NULL); - - _nm_object_ensure_inited (NM_OBJECT (nsp)); - return NM_WIMAX_NSP_GET_PRIVATE (nsp)->name; -} - -/** - * nm_wimax_nsp_get_signal_quality: - * @nsp: a #NMWimaxNsp - * - * Gets the WPA signal quality of the wimax NSP. - * - * Returns: the signal quality - **/ -guint32 -nm_wimax_nsp_get_signal_quality (NMWimaxNsp *nsp) -{ - g_return_val_if_fail (NM_IS_WIMAX_NSP (nsp), 0); - - _nm_object_ensure_inited (NM_OBJECT (nsp)); - return NM_WIMAX_NSP_GET_PRIVATE (nsp)->signal_quality; -} - -/** - * nm_wimax_nsp_get_network_type: - * @nsp: a #NMWimaxNsp - * - * Gets the network type of the wimax NSP. - * - * Returns: the network type - **/ -NMWimaxNspNetworkType -nm_wimax_nsp_get_network_type (NMWimaxNsp *nsp) -{ - g_return_val_if_fail (NM_IS_WIMAX_NSP (nsp), NM_WIMAX_NSP_NETWORK_TYPE_UNKNOWN); - - _nm_object_ensure_inited (NM_OBJECT (nsp)); - return NM_WIMAX_NSP_GET_PRIVATE (nsp)->network_type; -} - -/** - * nm_wimax_nsp_connection_valid: - * @nsp: an #NMWimaxNsp to validate @connection against - * @connection: an #NMConnection to validate against @nsp - * - * Validates a given connection against a given WiMAX NSP to ensure that the - * connection may be activated with that NSP. The connection must match the - * @nsp's network name and other attributes. - * - * Returns: %TRUE if the connection may be activated with this WiMAX NSP, - * %FALSE if it cannot be. - **/ -gboolean -nm_wimax_nsp_connection_valid (NMWimaxNsp *nsp, NMConnection *connection) -{ - NMSettingConnection *s_con; - NMSettingWimax *s_wimax; - const char *ctype; - const char *nsp_name; - const char *setting_name; - - s_con = nm_connection_get_setting_connection (connection); - g_assert (s_con); - ctype = nm_setting_connection_get_connection_type (s_con); - if (strcmp (ctype, NM_SETTING_WIMAX_SETTING_NAME) != 0) - return FALSE; - - s_wimax = nm_connection_get_setting_wimax (connection); - if (!s_wimax) - return FALSE; - - setting_name = nm_setting_wimax_get_network_name (s_wimax); - if (!setting_name) - return FALSE; - - nsp_name = nm_wimax_nsp_get_name (nsp); - g_warn_if_fail (nsp_name != NULL); - if (g_strcmp0 (nsp_name, setting_name) != 0) - return FALSE; - - return TRUE; -} - -/** - * nm_wimax_nsp_filter_connections: - * @nsp: an #NMWimaxNsp to filter connections for - * @connections: (element-type NMConnection): a list of - * #NMConnection objects to filter - * - * Filters a given list of connections for a given #NMWimaxNsp object and - * return connections which may be activated with the access point. Any - * returned connections will match the @nsp's network name and other attributes. - * - * Returns: (transfer container) (element-type NMConnection): a - * list of #NMConnection objects that could be activated with the given @nsp. - * The elements of the list are owned by their creator and should not be freed - * by the caller, but the returned list itself is owned by the caller and should - * be freed with g_slist_free() when it is no longer required. - **/ -GSList * -nm_wimax_nsp_filter_connections (NMWimaxNsp *nsp, const GSList *connections) -{ - GSList *filtered = NULL; - const GSList *iter; - - for (iter = connections; iter; iter = g_slist_next (iter)) { - NMConnection *candidate = NM_CONNECTION (iter->data); - - if (nm_wimax_nsp_connection_valid (nsp, candidate)) - filtered = g_slist_prepend (filtered, candidate); - } - - return g_slist_reverse (filtered); -} - -/*****************************************************************************/ - -static void -nm_wimax_nsp_init (NMWimaxNsp *nsp) -{ -} - -static void -dispose (GObject *object) -{ - NMWimaxNspPrivate *priv = NM_WIMAX_NSP_GET_PRIVATE (object); - - g_clear_object (&priv->proxy); - - G_OBJECT_CLASS (nm_wimax_nsp_parent_class)->dispose (object); -} - -static void -finalize (GObject *object) -{ - NMWimaxNspPrivate *priv = NM_WIMAX_NSP_GET_PRIVATE (object); - - g_free (priv->name); - - G_OBJECT_CLASS (nm_wimax_nsp_parent_class)->finalize (object); -} - -static void -get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - NMWimaxNsp *nsp = NM_WIMAX_NSP (object); - - _nm_object_ensure_inited (NM_OBJECT (object)); - - switch (prop_id) { - case PROP_NAME: - g_value_set_string (value, nm_wimax_nsp_get_name (nsp)); - break; - case PROP_SIGNAL_QUALITY: - g_value_set_uint (value, nm_wimax_nsp_get_signal_quality (nsp)); - break; - case PROP_NETWORK_TYPE: - g_value_set_uint (value, nm_wimax_nsp_get_network_type (nsp)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -register_properties (NMWimaxNsp *nsp) -{ - NMWimaxNspPrivate *priv = NM_WIMAX_NSP_GET_PRIVATE (nsp); - const NMPropertiesInfo property_info[] = { - { NM_WIMAX_NSP_NAME, &priv->name }, - { NM_WIMAX_NSP_SIGNAL_QUALITY, &priv->signal_quality }, - { NM_WIMAX_NSP_NETWORK_TYPE, &priv->network_type }, - { NULL }, - }; - - _nm_object_register_properties (NM_OBJECT (nsp), - priv->proxy, - property_info); -} - -static void -constructed (GObject *object) -{ - NMWimaxNspPrivate *priv = NM_WIMAX_NSP_GET_PRIVATE (object); - - G_OBJECT_CLASS (nm_wimax_nsp_parent_class)->constructed (object); - - priv->proxy = _nm_object_new_proxy (NM_OBJECT (object), NULL, NM_DBUS_INTERFACE_WIMAX_NSP); - register_properties (NM_WIMAX_NSP (object)); -} - -static void -nm_wimax_nsp_class_init (NMWimaxNspClass *nsp_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (nsp_class); - - g_type_class_add_private (nsp_class, sizeof (NMWimaxNspPrivate)); - - /* virtual methods */ - object_class->constructed = constructed; - object_class->get_property = get_property; - object_class->dispose = dispose; - object_class->finalize = finalize; - - /* properties */ - - /** - * NMWimaxNsp:name: - * - * The name of the WiMAX NSP. - **/ - g_object_class_install_property - (object_class, PROP_NAME, - g_param_spec_string (NM_WIMAX_NSP_NAME, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMWimaxNsp:signal-quality: - * - * The signal quality of the WiMAX NSP. - **/ - g_object_class_install_property - (object_class, PROP_SIGNAL_QUALITY, - g_param_spec_uint (NM_WIMAX_NSP_SIGNAL_QUALITY, "", "", - 0, 100, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - /** - * NMWimaxNsp:network-type: - * - * The network type of the WiMAX NSP. - **/ - g_object_class_install_property - (object_class, PROP_NETWORK_TYPE, - g_param_spec_uint (NM_WIMAX_NSP_NETWORK_TYPE, "", "", - 0, G_MAXUINT32, 0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -} diff --git a/libnm-glib/nm-wimax-nsp.h b/libnm-glib/nm-wimax-nsp.h deleted file mode 100644 index 336f331d..00000000 --- a/libnm-glib/nm-wimax-nsp.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2011 Red Hat, Inc. - * Copyright 2009 Novell, Inc. - */ - -#ifndef NM_WIMAX_NSP_H -#define NM_WIMAX_NSP_H - -#include <glib.h> -#include <glib-object.h> -#include "NetworkManager.h" -#include "nm-object.h" - -G_BEGIN_DECLS - -#define NM_TYPE_WIMAX_NSP (nm_wimax_nsp_get_type ()) -#define NM_WIMAX_NSP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_WIMAX_NSP, NMWimaxNsp)) -#define NM_WIMAX_NSP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_WIMAX_NSP, NMWimaxNspClass)) -#define NM_IS_WIMAX_NSP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_WIMAX_NSP)) -#define NM_IS_WIMAX_NSP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_WIMAX_NSP)) -#define NM_WIMAX_NSP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_WIMAX_NSP, NMWimaxNspClass)) - -#define NM_WIMAX_NSP_NAME "name" -#define NM_WIMAX_NSP_SIGNAL_QUALITY "signal-quality" -#define NM_WIMAX_NSP_NETWORK_TYPE "network-type" - -/** - * NMWimaxNspNetworkType: - * @NM_WIMAX_NSP_NETWORK_TYPE_UNKNOWN: unknown network type - * @NM_WIMAX_NSP_NETWORK_TYPE_HOME: home network - * @NM_WIMAX_NSP_NETWORK_TYPE_PARTNER: partner network - * @NM_WIMAX_NSP_NETWORK_TYPE_ROAMING_PARTNER: roaming partner network - * - * WiMAX network type. - */ -typedef enum { - NM_WIMAX_NSP_NETWORK_TYPE_UNKNOWN = 0, - NM_WIMAX_NSP_NETWORK_TYPE_HOME = 1, - NM_WIMAX_NSP_NETWORK_TYPE_PARTNER = 2, - NM_WIMAX_NSP_NETWORK_TYPE_ROAMING_PARTNER = 3 -} NMWimaxNspNetworkType; - -typedef struct { - NMObject parent; -} NMWimaxNsp; - -typedef struct { - NMObjectClass parent; - - /* Padding for future expansion */ - void (*_reserved1) (void); - void (*_reserved2) (void); - void (*_reserved3) (void); - void (*_reserved4) (void); - void (*_reserved5) (void); - void (*_reserved6) (void); -} NMWimaxNspClass; - -GType nm_wimax_nsp_get_type (void); - -GObject *nm_wimax_nsp_new (DBusGConnection *connection, const char *path); - -const char * nm_wimax_nsp_get_name (NMWimaxNsp *nsp); -guint32 nm_wimax_nsp_get_signal_quality (NMWimaxNsp *nsp); -NMWimaxNspNetworkType nm_wimax_nsp_get_network_type (NMWimaxNsp *nsp); - -GSList * nm_wimax_nsp_filter_connections (NMWimaxNsp *nsp, - const GSList *connections); - -gboolean nm_wimax_nsp_connection_valid (NMWimaxNsp *nsp, - NMConnection *connection); - -G_END_DECLS - -#endif /* NM_WIMAX_NSP_H */ diff --git a/libnm-glib/tests/meson.build b/libnm-glib/tests/meson.build deleted file mode 100644 index de74f3b2..00000000 --- a/libnm-glib/tests/meson.build +++ /dev/null @@ -1,30 +0,0 @@ -deps = [ - dbus_dep, - dbus_glib_dep, - libnm_glib_dep, - libnm_util_dep, - shared_nm_glib_aux_dep, -] - -test_units = [ - 'test-nm-client', - 'test-remote-settings-client', -] - -foreach test_unit: test_units - exe = executable( - test_unit, - [test_unit + '.c'] + shared_nm_test_utils_impl_c, - dependencies: deps, - c_args: - common_cflags + [ - '-DNETWORKMANAGER_COMPILATION_TEST', - ], - ) - - test( - 'libnm-glib/' + test_unit, - test_script, - args: test_args + [exe.full_path()], - ) -endforeach diff --git a/libnm-glib/tests/test-nm-client.c b/libnm-glib/tests/test-nm-client.c deleted file mode 100644 index df857215..00000000 --- a/libnm-glib/tests/test-nm-client.c +++ /dev/null @@ -1,1156 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2010 - 2014 Red Hat, Inc. - * - */ - -#include "nm-default.h" - -#include <dbus/dbus.h> -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> -#include <string.h> -#include <sys/types.h> -#include <signal.h> - -#include "nm-client.h" -#include "nm-device-wifi.h" -#include "nm-device-ethernet.h" -#include "nm-device-wimax.h" -#include "nm-connection.h" -#include "nm-setting.h" - -#include "nm-test-libnm-utils.h" - -static GMainLoop *loop = NULL; -static NMTstcServiceInfo *sinfo; - -/*****************************************************************************/ - -static gboolean -loop_quit (gpointer user_data) -{ - g_main_loop_quit ((GMainLoop *) user_data); - return G_SOURCE_REMOVE; -} - -static gboolean -add_device (const char *method, const char *ifname, char **out_path) -{ - GError *error = NULL; - GVariant *ret; - - ret = g_dbus_proxy_call_sync (sinfo->proxy, - method, - g_variant_new ("(s)", ifname), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - 3000, - NULL, - &error); - g_assert_no_error (error); - g_assert (ret); - g_assert_cmpstr (g_variant_get_type_string (ret), ==, "(o)"); - if (out_path) - g_variant_get (ret, "(o)", out_path); - g_variant_unref (ret); - return TRUE; -} - -static gboolean -add_wired_device (const char *method, const char *ifname, char **out_path) -{ - const char *empty[] = { NULL }; - GError *error = NULL; - GVariant *ret; - - ret = g_dbus_proxy_call_sync (sinfo->proxy, - method, - g_variant_new ("(ss^as)", ifname, "/", empty), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - 3000, - NULL, - &error); - g_assert_no_error (error); - g_assert (ret); - g_assert_cmpstr (g_variant_get_type_string (ret), ==, "(o)"); - if (out_path) - g_variant_get (ret, "(o)", out_path); - g_variant_unref (ret); - return TRUE; -} - -/*****************************************************************************/ - -typedef struct { - GMainLoop *loop; - gboolean signaled; - gboolean notified; - guint quit_count; - guint quit_id; -} DeviceAddedInfo; - -static void -device_add_check_quit (DeviceAddedInfo *info) -{ - info->quit_count--; - if (info->quit_count == 0) { - g_source_remove (info->quit_id); - info->quit_id = 0; - g_main_loop_quit (info->loop); - } -} - -static void -device_added_cb (NMClient *c, - NMDevice *device, - DeviceAddedInfo *info) -{ - g_assert (device); - g_assert_cmpstr (nm_device_get_iface (device), ==, "eth0"); - info->signaled = TRUE; - device_add_check_quit (info); -} - -static void -devices_notify_cb (NMClient *c, - GParamSpec *pspec, - DeviceAddedInfo *info) -{ - const GPtrArray *devices; - NMDevice *device; - - devices = nm_client_get_devices (c); - g_assert (devices); - g_assert_cmpint (devices->len, ==, 1); - - device = g_ptr_array_index (devices, 0); - g_assert (device); - g_assert_cmpstr (nm_device_get_iface (device), ==, "eth0"); - - info->notified = TRUE; - - device_add_check_quit (info); -} - -static void -test_device_added (void) -{ - NMClient *client; - const GPtrArray *devices; - NMDevice *device; - DeviceAddedInfo info = { loop, FALSE, FALSE, 0, 0 }; - - sinfo = nmtstc_service_init (); - if (!nmtstc_service_available (sinfo)) - return; - - client = nmtstc_nm_client_new (); - - devices = nm_client_get_devices (client); - g_assert (devices == NULL); - - /* Tell the test service to add a new device */ - add_wired_device ("AddWiredDevice", "eth0", NULL); - - g_signal_connect (client, - "device-added", - (GCallback) device_added_cb, - &info); - info.quit_count++; - - g_signal_connect (client, - "notify::devices", - (GCallback) devices_notify_cb, - &info); - info.quit_count++; - - /* Wait for libnm-glib to find the device */ - info.quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - - g_assert (info.signaled); - g_assert (info.notified); - - g_signal_handlers_disconnect_by_func (client, device_added_cb, &info); - g_signal_handlers_disconnect_by_func (client, devices_notify_cb, &info); - - devices = nm_client_get_devices (client); - g_assert (devices); - g_assert_cmpint (devices->len, ==, 1); - - device = g_ptr_array_index (devices, 0); - g_assert (device); - g_assert_cmpstr (nm_device_get_iface (device), ==, "eth0"); - - g_object_unref (client); - g_clear_pointer (&sinfo, nmtstc_service_cleanup); -} - -/*****************************************************************************/ - -static const char *expected_bssid = "66:55:44:33:22:11"; - -typedef struct { - GMainLoop *loop; - gboolean found; - char *ap_path; - gboolean signaled; - gboolean notified; - guint quit_id; - guint quit_count; -} WifiApInfo; - -static void -wifi_check_quit (WifiApInfo *info) -{ - info->quit_count--; - if (info->quit_count == 0) { - g_source_remove (info->quit_id); - info->quit_id = 0; - g_main_loop_quit (info->loop); - } -} - -static void -wifi_device_added_cb (NMClient *c, - NMDevice *device, - WifiApInfo *info) -{ - g_assert_cmpstr (nm_device_get_iface (device), ==, "wlan0"); - info->found = TRUE; - wifi_check_quit (info); -} - -static void -got_ap_path (WifiApInfo *info, const char *path) -{ - if (info->ap_path) - g_assert_cmpstr (info->ap_path, ==, path); - else - info->ap_path = g_strdup (path); -} - -static void -wifi_ap_added_cb (NMDeviceWifi *w, - NMAccessPoint *ap, - WifiApInfo *info) -{ - g_assert (ap); - g_assert_cmpstr (nm_access_point_get_bssid (ap), ==, expected_bssid); - got_ap_path (info, nm_object_get_path (NM_OBJECT (ap))); - - info->signaled = TRUE; - wifi_check_quit (info); -} - -static void -wifi_ap_add_notify_cb (NMDeviceWifi *w, - GParamSpec *pspec, - WifiApInfo *info) -{ - const GPtrArray *aps; - NMAccessPoint *ap; - - aps = nm_device_wifi_get_access_points (w); - g_assert (aps); - g_assert_cmpint (aps->len, ==, 1); - - ap = g_ptr_array_index (aps, 0); - g_assert (ap); - g_assert_cmpstr (nm_access_point_get_bssid (ap), ==, "66:55:44:33:22:11"); - got_ap_path (info, nm_object_get_path (NM_OBJECT (ap))); - - info->notified = TRUE; - wifi_check_quit (info); -} - -static void -wifi_ap_removed_cb (NMDeviceWifi *w, - NMAccessPoint *ap, - WifiApInfo *info) -{ - g_assert (ap); - g_assert_cmpstr (info->ap_path, ==, nm_object_get_path (NM_OBJECT (ap))); - - info->signaled = TRUE; - wifi_check_quit (info); -} - -static void -wifi_ap_remove_notify_cb (NMDeviceWifi *w, - GParamSpec *pspec, - WifiApInfo *info) -{ - const GPtrArray *aps; - - aps = nm_device_wifi_get_access_points (w); - g_assert (aps == NULL); - - info->notified = TRUE; - wifi_check_quit (info); -} - -static void -test_wifi_ap_added_removed (void) -{ - NMClient *client; - NMDeviceWifi *wifi; - WifiApInfo info = { loop, FALSE, FALSE, 0, 0 }; - GVariant *ret; - GError *error = NULL; - char *expected_path = NULL; - - sinfo = nmtstc_service_init (); - if (!nmtstc_service_available (sinfo)) - return; - - client = nmtstc_nm_client_new (); - - /*************************************/ - /* Add the wifi device */ - add_device ("AddWifiDevice", "wlan0", NULL); - - g_signal_connect (client, - "device-added", - (GCallback) wifi_device_added_cb, - &info); - info.quit_count = 1; - - /* Wait for libnm-glib to find the device */ - info.quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - - g_assert (info.found); - g_signal_handlers_disconnect_by_func (client, wifi_device_added_cb, &info); - - wifi = (NMDeviceWifi *) nm_client_get_device_by_iface (client, "wlan0"); - g_assert (NM_IS_DEVICE_WIFI (wifi)); - - /*************************************/ - /* Add the wifi device */ - info.signaled = FALSE; - info.notified = FALSE; - info.quit_id = 0; - - ret = g_dbus_proxy_call_sync (sinfo->proxy, - "AddWifiAp", - g_variant_new ("(sss)", "wlan0", "test-ap", expected_bssid), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - 3000, - NULL, - &error); - g_assert_no_error (error); - g_assert (ret); - g_assert_cmpstr (g_variant_get_type_string (ret), ==, "(o)"); - g_variant_get (ret, "(o)", &expected_path); - g_variant_unref (ret); - - g_signal_connect (wifi, - "access-point-added", - (GCallback) wifi_ap_added_cb, - &info); - info.quit_count = 1; - - g_signal_connect (wifi, - "notify::access-points", - (GCallback) wifi_ap_add_notify_cb, - &info); - info.quit_count++; - - /* Wait for libnm-glib to find the AP */ - info.quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - - g_assert (info.signaled); - g_assert (info.notified); - g_assert (info.ap_path); - g_assert_cmpstr (info.ap_path, ==, expected_path); - g_signal_handlers_disconnect_by_func (wifi, wifi_ap_added_cb, &info); - g_signal_handlers_disconnect_by_func (wifi, wifi_ap_add_notify_cb, &info); - - /*************************************/ - /* Remove the wifi device */ - info.signaled = FALSE; - info.notified = FALSE; - info.quit_id = 0; - - ret = g_dbus_proxy_call_sync (sinfo->proxy, - "RemoveWifiAp", - g_variant_new ("(so)", "wlan0", expected_path), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - 3000, - NULL, - &error); - g_assert_no_error (error); - g_clear_pointer (&ret, g_variant_unref); - - g_signal_connect (wifi, - "access-point-removed", - (GCallback) wifi_ap_removed_cb, - &info); - info.quit_count = 1; - - g_signal_connect (wifi, - "notify::access-points", - (GCallback) wifi_ap_remove_notify_cb, - &info); - info.quit_count++; - - /* Wait for libnm-glib to find the AP */ - info.quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - - g_assert (info.signaled); - g_assert (info.notified); - g_signal_handlers_disconnect_by_func (wifi, wifi_ap_removed_cb, &info); - g_signal_handlers_disconnect_by_func (wifi, wifi_ap_remove_notify_cb, &info); - - g_free (info.ap_path); - g_free (expected_path); - - g_object_unref (client); - g_clear_pointer (&sinfo, nmtstc_service_cleanup); -} - -/*****************************************************************************/ - -static const char *expected_nsp_name = "Clear"; - -typedef struct { - GMainLoop *loop; - gboolean found; - char *nsp_path; - gboolean signaled; - gboolean notified; - guint quit_id; - guint quit_count; -} WimaxNspInfo; - -static void -wimax_check_quit (WimaxNspInfo *info) -{ - info->quit_count--; - if (info->quit_count == 0) { - g_source_remove (info->quit_id); - info->quit_id = 0; - g_main_loop_quit (info->loop); - } -} - -static void -wimax_device_added_cb (NMClient *c, - NMDevice *device, - WimaxNspInfo *info) -{ - g_assert_cmpstr (nm_device_get_iface (device), ==, "wmx0"); - info->found = TRUE; - wimax_check_quit (info); -} - -static void -got_nsp_path (WimaxNspInfo *info, const char *path) -{ - if (info->nsp_path) - g_assert_cmpstr (info->nsp_path, ==, path); - else - info->nsp_path = g_strdup (path); -} - -static void -wimax_nsp_added_cb (NMDeviceWimax *w, - NMWimaxNsp *nsp, - WimaxNspInfo *info) -{ - g_assert (nsp); - g_assert_cmpstr (nm_wimax_nsp_get_name (nsp), ==, expected_nsp_name); - got_nsp_path (info, nm_object_get_path (NM_OBJECT (nsp))); - - info->signaled = TRUE; - wimax_check_quit (info); -} - -static void -wimax_nsp_add_notify_cb (NMDeviceWimax *w, - GParamSpec *pspec, - WimaxNspInfo *info) -{ - const GPtrArray *nsps; - NMWimaxNsp *nsp; - - nsps = nm_device_wimax_get_nsps (w); - g_assert (nsps); - g_assert_cmpint (nsps->len, ==, 1); - - nsp = g_ptr_array_index (nsps, 0); - g_assert (nsp); - g_assert_cmpstr (nm_wimax_nsp_get_name (nsp), ==, expected_nsp_name); - got_nsp_path (info, nm_object_get_path (NM_OBJECT (nsp))); - - info->notified = TRUE; - wimax_check_quit (info); -} - -static void -wimax_nsp_removed_cb (NMDeviceWimax *w, - NMWimaxNsp *nsp, - WimaxNspInfo *info) -{ - g_assert (nsp); - g_assert_cmpstr (info->nsp_path, ==, nm_object_get_path (NM_OBJECT (nsp))); - - info->signaled = TRUE; - wimax_check_quit (info); -} - -static void -wimax_nsp_remove_notify_cb (NMDeviceWimax *w, - GParamSpec *pspec, - WimaxNspInfo *info) -{ - const GPtrArray *nsps; - - nsps = nm_device_wimax_get_nsps (w); - g_assert (nsps == NULL); - - info->notified = TRUE; - wimax_check_quit (info); -} - -static void -test_wimax_nsp_added_removed (void) -{ - NMClient *client; - NMDeviceWimax *wimax; - WimaxNspInfo info = { loop, FALSE, FALSE, 0, 0 }; - GVariant *ret; - GError *error = NULL; - char *expected_path = NULL; - - sinfo = nmtstc_service_init (); - if (!nmtstc_service_available (sinfo)) - return; - - client = nmtstc_nm_client_new (); - - /*************************************/ - /* Add the wimax device */ - add_device ("AddWimaxDevice", "wmx0", NULL); - - g_signal_connect (client, - "device-added", - (GCallback) wimax_device_added_cb, - &info); - info.quit_count = 1; - - /* Wait for libnm-glib to find the device */ - info.quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - - g_assert (info.found); - g_signal_handlers_disconnect_by_func (client, wimax_device_added_cb, &info); - - wimax = (NMDeviceWimax *) nm_client_get_device_by_iface (client, "wmx0"); - g_assert (NM_IS_DEVICE_WIMAX (wimax)); - - /*************************************/ - /* Add the wimax NSP */ - info.signaled = FALSE; - info.notified = FALSE; - info.quit_id = 0; - - ret = g_dbus_proxy_call_sync (sinfo->proxy, - "AddWimaxNsp", - g_variant_new ("(ss)", "wmx0", expected_nsp_name), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - 3000, - NULL, - &error); - g_assert_no_error (error); - g_assert (ret); - g_assert_cmpstr (g_variant_get_type_string (ret), ==, "(o)"); - g_variant_get (ret, "(o)", &expected_path); - g_variant_unref (ret); - - g_signal_connect (wimax, - "nsp-added", - (GCallback) wimax_nsp_added_cb, - &info); - info.quit_count = 1; - - g_signal_connect (wimax, - "notify::nsps", - (GCallback) wimax_nsp_add_notify_cb, - &info); - info.quit_count++; - - /* Wait for libnm-glib to find the AP */ - info.quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - - g_assert (info.signaled); - g_assert (info.notified); - g_assert (info.nsp_path); - g_assert_cmpstr (info.nsp_path, ==, expected_path); - g_signal_handlers_disconnect_by_func (wimax, wimax_nsp_added_cb, &info); - g_signal_handlers_disconnect_by_func (wimax, wimax_nsp_add_notify_cb, &info); - - /*************************************/ - /* Remove the wimax NSP */ - info.signaled = FALSE; - info.notified = FALSE; - info.quit_id = 0; - - ret = g_dbus_proxy_call_sync (sinfo->proxy, - "RemoveWimaxNsp", - g_variant_new ("(so)", "wmx0", expected_path), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - 3000, - NULL, - &error); - g_assert_no_error (error); - g_clear_pointer (&ret, g_variant_unref); - - g_signal_connect (wimax, - "nsp-removed", - (GCallback) wimax_nsp_removed_cb, - &info); - info.quit_count = 1; - - g_signal_connect (wimax, - "notify::nsps", - (GCallback) wimax_nsp_remove_notify_cb, - &info); - info.quit_count++; - - /* Wait for libnm-glib to find the AP */ - info.quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - - g_assert (info.signaled); - g_assert (info.notified); - g_signal_handlers_disconnect_by_func (wimax, wimax_nsp_removed_cb, &info); - g_signal_handlers_disconnect_by_func (wimax, wimax_nsp_remove_notify_cb, &info); - - g_free (info.nsp_path); - g_free (expected_path); - - g_object_unref (client); - g_clear_pointer (&sinfo, nmtstc_service_cleanup); -} - -/*****************************************************************************/ - -typedef struct { - GMainLoop *loop; - gboolean signaled; - gboolean notified; - guint quit_count; - guint quit_id; -} DaInfo; - -static void -da_check_quit (DaInfo *info) -{ - g_assert (info->quit_count > 0); - info->quit_count--; - if (info->quit_count == 0) { - g_source_remove (info->quit_id); - info->quit_id = 0; - g_main_loop_quit (info->loop); - } -} - -static void -da_device_added_cb (NMClient *c, - NMDevice *device, - DaInfo *info) -{ - da_check_quit (info); -} - -static void -da_device_removed_cb (NMClient *c, - NMDevice *device, - DaInfo *info) -{ - g_assert_cmpstr (nm_device_get_iface (device), ==, "eth0"); - info->signaled = TRUE; - da_check_quit (info); -} - -static void -da_devices_notify_cb (NMClient *c, - GParamSpec *pspec, - DaInfo *info) -{ - const GPtrArray *devices; - NMDevice *device; - guint i; - const char *iface; - - devices = nm_client_get_devices (c); - g_assert (devices); - g_assert_cmpint (devices->len, ==, 2); - - for (i = 0; i < devices->len; i++) { - device = g_ptr_array_index (devices, i); - iface = nm_device_get_iface (device); - - g_assert (!strcmp (iface, "wlan0") || !strcmp (iface, "eth1")); - } - - info->notified = TRUE; - da_check_quit (info); -} - -static void -test_devices_array (void) -{ - NMClient *client; - DaInfo info = { loop }; - char *paths[3] = { NULL, NULL, NULL }; - NMDevice *device; - const GPtrArray *devices; - GError *error = NULL; - GVariant *ret; - - sinfo = nmtstc_service_init (); - if (!nmtstc_service_available (sinfo)) - return; - - client = nmtstc_nm_client_new (); - - /*************************************/ - /* Add some devices */ - add_device ("AddWifiDevice", "wlan0", &paths[0]); - add_wired_device ("AddWiredDevice", "eth0", &paths[1]); - add_wired_device ("AddWiredDevice", "eth1", &paths[2]); - info.quit_count = 3; - - g_signal_connect (client, - "device-added", - (GCallback) da_device_added_cb, - &info); - - /* Wait for libnm-glib to find the device */ - info.quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - - g_assert_cmpint (info.quit_count, ==, 0); - g_signal_handlers_disconnect_by_func (client, da_device_added_cb, &info); - - /* Ensure the devices now exist */ - devices = nm_client_get_devices (client); - g_assert (devices); - g_assert_cmpint (devices->len, ==, 3); - - device = nm_client_get_device_by_iface (client, "wlan0"); - g_assert (NM_IS_DEVICE_WIFI (device)); - - device = nm_client_get_device_by_iface (client, "eth0"); - g_assert (NM_IS_DEVICE_ETHERNET (device)); - - device = nm_client_get_device_by_iface (client, "eth1"); - g_assert (NM_IS_DEVICE_ETHERNET (device)); - - /********************************/ - /* Now remove the device in the middle */ - ret = g_dbus_proxy_call_sync (sinfo->proxy, - "RemoveDevice", - g_variant_new ("(o)", paths[1]), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - 3000, - NULL, - &error); - g_assert_no_error (error); - g_assert (ret); - g_variant_unref (ret); - - g_signal_connect (client, - "device-removed", - (GCallback) da_device_removed_cb, - &info); - - g_signal_connect (client, - "notify::devices", - (GCallback) da_devices_notify_cb, - &info); - info.quit_count = 2; - - /* Wait for libnm-glib to find the device */ - info.quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - - g_assert_cmpint (info.quit_count, ==, 0); - g_signal_handlers_disconnect_by_func (client, da_device_removed_cb, &info); - g_signal_handlers_disconnect_by_func (client, da_devices_notify_cb, &info); - - /* Ensure only two are left */ - devices = nm_client_get_devices (client); - g_assert (devices); - g_assert_cmpint (devices->len, ==, 2); - - device = nm_client_get_device_by_iface (client, "wlan0"); - g_assert (NM_IS_DEVICE_WIFI (device)); - - device = nm_client_get_device_by_iface (client, "eth1"); - g_assert (NM_IS_DEVICE_ETHERNET (device)); - - g_free (paths[0]); - g_free (paths[1]); - g_free (paths[2]); - - g_object_unref (client); - g_clear_pointer (&sinfo, nmtstc_service_cleanup); -} - -static void -manager_running_changed (GObject *client, - GParamSpec *pspec, - gpointer user_data) -{ - int *running_changed = user_data; - - (*running_changed)++; - g_main_loop_quit (loop); -} - -static void -test_client_manager_running (void) -{ - gs_unref_object NMClient *client1 = NULL; - gs_unref_object NMClient *client2 = NULL; - guint quit_id; - int running_changed = 0; - GError *error = NULL; - - client1 = nmtstc_nm_client_new (); - - g_assert (!nm_client_get_manager_running (client1)); - g_assert_cmpstr (nm_client_get_version (client1), ==, NULL); - - g_assert (!nm_client_networking_get_enabled (client1)); - /* This will have no effect, but it shouldn't cause any warnings either. */ - nm_client_networking_set_enabled (client1, TRUE); - g_assert (!nm_client_networking_get_enabled (client1)); - - /* OTOH, this should result in an error */ - nm_client_set_logging (client1, "DEFAULT", "INFO", &error); - g_assert_error (error, NM_CLIENT_ERROR, NM_CLIENT_ERROR_MANAGER_NOT_RUNNING); - g_clear_error (&error); - - /* Now start the test service. */ - sinfo = nmtstc_service_init (); - if (!nmtstc_service_available (sinfo)) - return; - - client2 = nmtstc_nm_client_new (); - - /* client2 should know that NM is running, but the previously-created - * client1 hasn't gotten the news yet. - */ - g_assert (!nm_client_get_manager_running (client1)); - g_assert (nm_client_get_manager_running (client2)); - - g_signal_connect (client1, "notify::" NM_CLIENT_MANAGER_RUNNING, - G_CALLBACK (manager_running_changed), &running_changed); - quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - g_assert_cmpint (running_changed, ==, 1); - g_assert (nm_client_get_manager_running (client1)); - g_source_remove (quit_id); - - /* And kill it */ - g_clear_pointer (&sinfo, nmtstc_service_cleanup); - - g_assert (nm_client_get_manager_running (client1)); - - quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - g_assert_cmpint (running_changed, ==, 2); - g_assert (!nm_client_get_manager_running (client1)); - g_source_remove (quit_id); -} - -/*****************************************************************************/ - -static GPtrArray * -_slist_to_array (GPtrArray **connections, GSList *list) -{ - GPtrArray *array; - const GSList *iter; - - if (!*connections) - *connections = array = g_ptr_array_new (); - else { - array = *connections; - g_ptr_array_set_size (array, 0); - } - for (iter = list; iter; iter = iter->next) - g_ptr_array_add (array, iter->data); - g_slist_free (list); - return array; -} - -static gboolean -_test_connection_invalid_find_connections (gpointer element, gpointer needle, gpointer user_data) -{ - NMRemoteConnection *con = NM_REMOTE_CONNECTION (element); - const char *path = needle; - - g_assert (NM_IS_REMOTE_CONNECTION (con)); - g_assert (path && *path); - - return strcmp (path, nm_connection_get_path ((NMConnection *) con)) == 0; -} - -#define ASSERT_IDX(i) \ - g_assert_cmpint (idx[i], >=, 0); \ - g_assert (path##i && *path##i); \ - g_assert (NM_IS_REMOTE_CONNECTION (connections->pdata[idx[i]])); \ - g_assert_cmpstr (nm_connection_get_path (connections->pdata[idx[i]]), ==, path##i); - -static void -test_connection_invalid (void) -{ - NMTSTC_SERVICE_INFO_SETUP (my_sinfo) - gs_unref_object NMConnection *connection = NULL; - NMSettingConnection *s_con; - gs_unref_object NMRemoteSettings *settings = NULL; - gs_unref_ptrarray GPtrArray *connections = NULL; - gs_free char *path0 = NULL; - gs_free char *path1 = NULL; - gs_free char *path2 = NULL; - gs_free char *uuid2 = NULL; - gsize n_found; - gssize idx[3]; - - /************************************************************************** - * Add two connection before starting libnm. One valid, one invalid. - *************************************************************************/ - - connection = nmtst_create_minimal_connection ("test-connection-invalid-0", NULL, NM_SETTING_WIRED_SETTING_NAME, &s_con); - nmtst_connection_normalize (connection); - g_object_set (s_con, - NM_SETTING_CONNECTION_UUID, nmtst_uuid_generate (), - NULL); - nmtstc_service_add_connection (my_sinfo, - connection, - TRUE, - &path0); - - nm_connection_remove_setting (connection, NM_TYPE_SETTING_WIRED); - g_object_set (s_con, - NM_SETTING_CONNECTION_ID, "test-connection-invalid-1", - NM_SETTING_CONNECTION_TYPE, "invalid-type-1", - NM_SETTING_CONNECTION_UUID, nmtst_uuid_generate (), - NULL); - nmtstc_service_add_connection (my_sinfo, - connection, - FALSE, - &path1); - - nmtst_main_loop_run (loop, 100); - - settings = nmtstc_nm_remote_settings_new (); - - nmtst_main_loop_run (loop, 100); - - _slist_to_array (&connections, nm_remote_settings_list_connections (settings)); - - g_assert_cmpint (connections->len, ==, 2); - n_found = nmtst_find_all_indexes (connections->pdata, - connections->len, - (gpointer *) ((const char *[]) { path0, path1 }), - 2, - _test_connection_invalid_find_connections, - NULL, - idx); - g_assert_cmpint (n_found, ==, 2); - ASSERT_IDX (0); - ASSERT_IDX (1); - nmtst_assert_connection_verifies_without_normalization (connections->pdata[idx[0]]); - nmtst_assert_connection_unnormalizable (connections->pdata[idx[1]], 0, 0); - - /************************************************************************** - * After having the client up and running, add another invalid connection - *************************************************************************/ - - g_object_set (s_con, - NM_SETTING_CONNECTION_ID, "test-connection-invalid-2", - NM_SETTING_CONNECTION_TYPE, "invalid-type-2", - NM_SETTING_CONNECTION_UUID, (uuid2 = g_strdup (nmtst_uuid_generate ())), - NULL); - nmtstc_service_add_connection (my_sinfo, - connection, - FALSE, - &path2); - - nmtst_main_loop_run (loop, 100); - - _slist_to_array (&connections, nm_remote_settings_list_connections (settings)); - - g_assert_cmpint (connections->len, ==, 3); - n_found = nmtst_find_all_indexes (connections->pdata, - connections->len, - (gpointer *) ((const char *[]) { path0, path1, path2 }), - 3, - _test_connection_invalid_find_connections, - NULL, - idx); - g_assert_cmpint (n_found, ==, 3); - ASSERT_IDX (0); - ASSERT_IDX (1); - ASSERT_IDX (2); - nmtst_assert_connection_verifies_without_normalization (connections->pdata[idx[0]]); - nmtst_assert_connection_unnormalizable (connections->pdata[idx[1]], 0, 0); - nmtst_assert_connection_unnormalizable (connections->pdata[idx[2]], 0, 0); - - /************************************************************************** - * Modify the invalid connection. Connection disappears - *************************************************************************/ - - g_object_set (s_con, - NM_SETTING_CONNECTION_ID, "test-connection-invalid-2x", - NULL); - nmtstc_service_update_connection (my_sinfo, - path2, - connection, - FALSE); - - nmtst_main_loop_run (loop, 100); - - _slist_to_array (&connections, nm_remote_settings_list_connections (settings)); - - g_assert_cmpint (connections->len, ==, 3); - n_found = nmtst_find_all_indexes (connections->pdata, - connections->len, - (gpointer *) ((const char *[]) { path0, path1, path2 }), - 3, - _test_connection_invalid_find_connections, - NULL, - idx); - g_assert_cmpint (n_found, ==, 3); - ASSERT_IDX (0); - ASSERT_IDX (1); - ASSERT_IDX (2); - nmtst_assert_connection_verifies_without_normalization (connections->pdata[idx[0]]); - nmtst_assert_connection_unnormalizable (connections->pdata[idx[1]], 0, 0); - nmtst_assert_connection_unnormalizable (connections->pdata[idx[2]], 0, 0); - - /************************************************************************** - * Modify the invalid connection again. Note that the connection stays - * invisible (although it exists, and is valid). - *************************************************************************/ - - g_clear_object (&connection); - connection = nmtst_create_minimal_connection ("test-connection-invalid-2", NULL, NM_SETTING_WIRED_SETTING_NAME, &s_con); - nmtst_connection_normalize (connection); - g_object_set (s_con, - NM_SETTING_CONNECTION_ID, "test-connection-invalid-2z", - NM_SETTING_CONNECTION_TYPE, "802-3-ethernet", - NM_SETTING_CONNECTION_UUID, uuid2, - NULL); - - nmtstc_service_update_connection (my_sinfo, - path2, - connection, - FALSE); - - nmtst_main_loop_run (loop, 100); - - _slist_to_array (&connections, nm_remote_settings_list_connections (settings)); - - g_assert_cmpint (connections->len, ==, 3); - n_found = nmtst_find_all_indexes (connections->pdata, - connections->len, - (gpointer *) ((const char *[]) { path0, path1, path2 }), - 3, - _test_connection_invalid_find_connections, - NULL, - idx); - g_assert_cmpint (n_found, ==, 3); - ASSERT_IDX (0); - ASSERT_IDX (1); - ASSERT_IDX (2); - nmtst_assert_connection_verifies_without_normalization (connections->pdata[idx[0]]); - nmtst_assert_connection_unnormalizable (connections->pdata[idx[1]], 0, 0); - nmtst_assert_connection_verifies_without_normalization (connections->pdata[idx[2]]); - - /************************************************************************** - * Modify the invalid connection and make it valid - *************************************************************************/ - - g_clear_object (&connection); - connection = nmtst_create_minimal_connection ("test-connection-invalid-1", NULL, NM_SETTING_WIRED_SETTING_NAME, &s_con); - nmtst_connection_normalize (connection); - g_object_set (s_con, - NM_SETTING_CONNECTION_ID, "test-connection-invalid-1x", - NM_SETTING_CONNECTION_TYPE, "802-3-ethernet", - NM_SETTING_CONNECTION_UUID, nm_connection_get_uuid (connections->pdata[idx[1]]), - NULL); - - nmtstc_service_update_connection (my_sinfo, - path1, - connection, - FALSE); - - nmtst_main_loop_run (loop, 100); - - _slist_to_array (&connections, nm_remote_settings_list_connections (settings)); - - g_assert_cmpint (connections->len, ==, 3); - n_found = nmtst_find_all_indexes (connections->pdata, - connections->len, - (gpointer *) ((const char *[]) { path0, path1, path2 }), - 3, - _test_connection_invalid_find_connections, - NULL, - idx); - g_assert_cmpint (n_found, ==, 3); - ASSERT_IDX (0); - ASSERT_IDX (1); - ASSERT_IDX (2); - nmtst_assert_connection_verifies_without_normalization (connections->pdata[idx[0]]); - nmtst_assert_connection_verifies_without_normalization (connections->pdata[idx[1]]); - nmtst_assert_connection_verifies_without_normalization (connections->pdata[idx[2]]); - g_assert_cmpstr ("test-connection-invalid-1x", ==, nm_connection_get_id (connections->pdata[idx[1]])); - -#undef ASSERT_IDX -} - -/*****************************************************************************/ - -NMTST_DEFINE (); - -int -main (int argc, char **argv) -{ - nmtst_init (&argc, &argv, TRUE); - - loop = g_main_loop_new (NULL, FALSE); - - g_test_add_func ("/libnm-glib/device-added", test_device_added); - g_test_add_func ("/libnm-glib/wifi-ap-added-removed", test_wifi_ap_added_removed); - g_test_add_func ("/libnm-glib/wimax-nsp-added-removed", test_wimax_nsp_added_removed); - g_test_add_func ("/libnm-glib/devices-array", test_devices_array); - g_test_add_func ("/libnm-glib/client-manager-running", test_client_manager_running); - g_test_add_func ("/libnm/connection/invalid", test_connection_invalid); - - return g_test_run (); -} - diff --git a/libnm-glib/tests/test-remote-settings-client.c b/libnm-glib/tests/test-remote-settings-client.c deleted file mode 100644 index 031e83f8..00000000 --- a/libnm-glib/tests/test-remote-settings-client.c +++ /dev/null @@ -1,470 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2010 - 2011 Red Hat, Inc. - * - */ - -#include "nm-default.h" - -#include <dbus/dbus.h> -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> -#include <string.h> -#include <sys/types.h> -#include <signal.h> - -#include "NetworkManager.h" -#include "nm-setting-connection.h" -#include "nm-setting-wired.h" -#include "nm-utils.h" - -#include "nm-remote-settings.h" - -#include "nm-test-libnm-utils.h" - -static NMTstcServiceInfo *sinfo; -static NMRemoteSettings *settings = NULL; -DBusGConnection *bus = NULL; -NMRemoteConnection *remote = NULL; - -/*****************************************************************************/ - -static void -add_cb (NMRemoteSettings *s, - NMRemoteConnection *connection, - GError *error, - gpointer user_data) -{ - if (error) - g_warning ("Add error: %s", error->message); - - *((gboolean *) user_data) = TRUE; - remote = connection; - g_object_add_weak_pointer (G_OBJECT (connection), (void **) &remote); -} - -#define TEST_CON_ID "blahblahblah" - -static void -test_add_connection (void) -{ - gs_unref_object NMConnection *connection = NULL; - NMSettingConnection *s_con; - NMSettingWired *s_wired; - char *uuid; - gboolean success; - time_t start, now; - gboolean done = FALSE; - - if (!nmtstc_service_available (sinfo)) - return; - - connection = nm_connection_new (); - - s_con = (NMSettingConnection *) nm_setting_connection_new (); - uuid = nm_utils_uuid_generate (); - g_object_set (G_OBJECT (s_con), - NM_SETTING_CONNECTION_ID, TEST_CON_ID, - NM_SETTING_CONNECTION_UUID, uuid, - NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, - NULL); - g_free (uuid); - nm_connection_add_setting (connection, NM_SETTING (s_con)); - - s_wired = (NMSettingWired *) nm_setting_wired_new (); - nm_connection_add_setting (connection, NM_SETTING (s_wired)); - - success = nm_remote_settings_add_connection (settings, - connection, - add_cb, - &done); - g_assert (success == TRUE); - - start = time (NULL); - do { - now = time (NULL); - g_main_context_iteration (NULL, FALSE); - } while ((done == FALSE) && (now - start < 5)); - g_assert (done == TRUE); - g_assert (remote != NULL); - - /* Make sure the connection is the same as what we added */ - g_assert (nm_connection_compare (connection, - NM_CONNECTION (remote), - NM_SETTING_COMPARE_FLAG_EXACT) == TRUE); -} - -/*****************************************************************************/ - -static void -set_visible_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - GError *error = NULL; - gboolean success; - - success = dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); - g_assert_no_error (error); - g_assert (success == TRUE); -} - -static void -invis_removed_cb (NMRemoteConnection *connection, gboolean *done) -{ - *done = TRUE; -} - -static void -invis_has_settings_cb (NMSetting *setting, - const char *key, - const GValue *value, - GParamFlags flags, - gpointer user_data) -{ - *((gboolean *) user_data) = TRUE; -} - -static void -test_make_invisible (void) -{ - time_t start, now; - GSList *list, *iter; - DBusGProxy *proxy; - gboolean done = FALSE, has_settings = FALSE; - char *path; - - if (!nmtstc_service_available (sinfo)) - return; - - g_assert (remote != NULL); - - /* Listen for the remove event when the connection becomes invisible */ - g_signal_connect (remote, "removed", G_CALLBACK (invis_removed_cb), &done); - - path = g_strdup (nm_connection_get_path (NM_CONNECTION (remote))); - proxy = dbus_g_proxy_new_for_name (bus, - NM_DBUS_SERVICE, - path, - NM_DBUS_IFACE_SETTINGS_CONNECTION); - g_assert (proxy != NULL); - - /* Bypass the NMRemoteSettings object so we can test it independently */ - dbus_g_proxy_begin_call (proxy, "SetVisible", set_visible_cb, NULL, NULL, - G_TYPE_BOOLEAN, FALSE, G_TYPE_INVALID); - - /* Wait for the connection to be removed */ - start = time (NULL); - do { - now = time (NULL); - g_main_context_iteration (NULL, FALSE); - } while ((done == FALSE) && (now - start < 5)); - g_assert (done == TRUE); - - g_assert (remote); - g_signal_handlers_disconnect_by_func (remote, G_CALLBACK (invis_removed_cb), &done); - - /* Ensure NMRemoteSettings no longer has the connection */ - list = nm_remote_settings_list_connections (settings); - for (iter = list; iter; iter = g_slist_next (iter)) { - NMConnection *candidate = NM_CONNECTION (iter->data); - - g_assert ((gpointer) remote != (gpointer) candidate); - g_assert (strcmp (path, nm_connection_get_path (candidate)) != 0); - } - - /* And ensure the invisible connection no longer has any settings */ - g_assert (remote); - nm_connection_for_each_setting_value (NM_CONNECTION (remote), - invis_has_settings_cb, - &has_settings); - g_assert (has_settings == FALSE); - - g_free (path); - g_object_unref (proxy); -} - -/*****************************************************************************/ - -static void -vis_new_connection_cb (NMRemoteSettings *foo, - NMRemoteConnection *connection, - NMRemoteConnection **new) -{ - *new = connection; -} - -static void -test_make_visible (void) -{ - time_t start, now; - GSList *list, *iter; - DBusGProxy *proxy; - gboolean found = FALSE; - char *path; - NMRemoteConnection *new = NULL; - - if (!nmtstc_service_available (sinfo)) - return; - - g_assert (remote != NULL); - - /* Wait for the new-connection signal when the connection is visible again */ - g_signal_connect (settings, NM_REMOTE_SETTINGS_NEW_CONNECTION, - G_CALLBACK (vis_new_connection_cb), &new); - - path = g_strdup (nm_connection_get_path (NM_CONNECTION (remote))); - proxy = dbus_g_proxy_new_for_name (bus, - NM_DBUS_SERVICE, - path, - NM_DBUS_IFACE_SETTINGS_CONNECTION); - g_assert (proxy != NULL); - - /* Bypass the NMRemoteSettings object so we can test it independently */ - dbus_g_proxy_begin_call (proxy, "SetVisible", set_visible_cb, NULL, NULL, - G_TYPE_BOOLEAN, TRUE, G_TYPE_INVALID); - - /* Wait for the settings service to announce the connection again */ - start = time (NULL); - do { - now = time (NULL); - g_main_context_iteration (NULL, FALSE); - } while ((new == NULL) && (now - start < 5)); - - /* Ensure the new connection is the same as the one we made visible again */ - g_assert (new); - g_assert (new == remote); - - g_signal_handlers_disconnect_by_func (settings, G_CALLBACK (vis_new_connection_cb), &new); - - /* Ensure NMRemoteSettings has the connection */ - list = nm_remote_settings_list_connections (settings); - for (iter = list; iter; iter = g_slist_next (iter)) { - NMConnection *candidate = NM_CONNECTION (iter->data); - - if ((gpointer) remote == (gpointer) candidate) { - g_assert_cmpstr (path, ==, nm_connection_get_path (candidate)); - g_assert_cmpstr (TEST_CON_ID, ==, nm_connection_get_id (candidate)); - found = TRUE; - break; - } - } - g_slist_free (list); - g_assert (found == TRUE); - - g_free (path); - g_object_unref (proxy); -} - -/*****************************************************************************/ - -static void -deleted_cb (DBusGProxy *proxy, - DBusGProxyCall *call, - gpointer user_data) -{ - GError *error = NULL; - gboolean success; - - success = dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); - g_assert_no_error (error); - g_assert (success == TRUE); -} - -static void -removed_cb (NMRemoteConnection *connection, gboolean *done) -{ - *done = TRUE; -} - -static void -test_remove_connection (void) -{ - NMRemoteConnection *connection; - time_t start, now; - GSList *list, *iter; - DBusGProxy *proxy; - gboolean done = FALSE; - char *path; - - if (!nmtstc_service_available (sinfo)) - return; - - /* Find a connection to delete */ - list = nm_remote_settings_list_connections (settings); - g_assert_cmpint (g_slist_length (list), >, 0); - - connection = NM_REMOTE_CONNECTION (list->data); - g_slist_free (list); - g_assert (connection); - g_assert (remote == connection); - path = g_strdup (nm_connection_get_path (NM_CONNECTION (connection))); - g_signal_connect (connection, "removed", G_CALLBACK (removed_cb), &done); - - proxy = dbus_g_proxy_new_for_name (bus, - NM_DBUS_SERVICE, - path, - NM_DBUS_IFACE_SETTINGS_CONNECTION); - g_assert (proxy != NULL); - - /* Bypass the NMRemoteSettings object so we can test it independently */ - dbus_g_proxy_begin_call (proxy, "Delete", deleted_cb, NULL, NULL, G_TYPE_INVALID); - - start = time (NULL); - do { - now = time (NULL); - g_main_context_iteration (NULL, FALSE); - } while ((done == FALSE) && (now - start < 5)); - g_assert (done == TRUE); - - g_assert (!remote); - - /* Ensure NMRemoteSettings no longer has the connection */ - list = nm_remote_settings_list_connections (settings); - for (iter = list; iter; iter = g_slist_next (iter)) { - NMConnection *candidate = NM_CONNECTION (iter->data); - - g_assert ((gpointer) connection != (gpointer) candidate); - g_assert_cmpstr (path, ==, nm_connection_get_path (candidate)); - } - g_slist_free (list); - - g_free (path); - g_object_unref (proxy); -} - -/*****************************************************************************/ - -static GMainLoop *loop; - -static gboolean -loop_quit (gpointer user_data) -{ - g_main_loop_quit (loop); - return G_SOURCE_REMOVE; -} - -static void -settings_service_running_changed (GObject *client, - GParamSpec *pspec, - gpointer user_data) -{ - int *running_changed = user_data; - - (*running_changed)++; - g_main_loop_quit (loop); -} - -static void -test_service_running (void) -{ - gs_unref_object NMRemoteSettings *settings2 = NULL; - guint quit_id; - int running_changed = 0; - gboolean running; - - if (!nmtstc_service_available (sinfo)) - return; - - loop = g_main_loop_new (NULL, FALSE); - - g_object_get (G_OBJECT (settings), - NM_REMOTE_SETTINGS_SERVICE_RUNNING, &running, - NULL); - g_assert (running == TRUE); - - /* Now kill the test service. */ - nmtstc_service_cleanup (sinfo); - - settings2 = nm_remote_settings_new (bus); - - /* settings2 should know that NM is running, but the previously-created - * settings hasn't gotten the news yet. - */ - g_object_get (G_OBJECT (settings2), - NM_REMOTE_SETTINGS_SERVICE_RUNNING, &running, - NULL); - g_assert (running == FALSE); - g_object_get (G_OBJECT (settings), - NM_REMOTE_SETTINGS_SERVICE_RUNNING, &running, - NULL); - g_assert (running == TRUE); - - g_signal_connect (settings, "notify::" NM_REMOTE_SETTINGS_SERVICE_RUNNING, - G_CALLBACK (settings_service_running_changed), &running_changed); - quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - g_assert_cmpint (running_changed, ==, 1); - g_source_remove (quit_id); - - g_object_get (G_OBJECT (settings2), - NM_REMOTE_SETTINGS_SERVICE_RUNNING, &running, - NULL); - g_assert (running == FALSE); - - /* Now restart it */ - sinfo = nmtstc_service_init (); - g_assert (nmtstc_service_available (sinfo)); - - quit_id = g_timeout_add_seconds (5, loop_quit, loop); - g_main_loop_run (loop); - g_assert_cmpint (running_changed, ==, 2); - g_source_remove (quit_id); - - g_object_get (G_OBJECT (settings2), - NM_REMOTE_SETTINGS_SERVICE_RUNNING, &running, - NULL); - g_assert (running == TRUE); -} - -/*****************************************************************************/ - -NMTST_DEFINE (); - -int -main (int argc, char **argv) -{ - int ret; - GError *error = NULL; - - nmtst_init (&argc, &argv, TRUE); - - bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); - g_assert_no_error (error); - - sinfo = nmtstc_service_init (); - - settings = nmtstc_nm_remote_settings_new (); - - /* FIXME: these tests assume that they get run in order, but g_test_run() - * does not actually guarantee that! - */ - g_test_add_func ("/remote_settings/add_connection", test_add_connection); - g_test_add_func ("/remote_settings/make_invisible", test_make_invisible); - g_test_add_func ("/remote_settings/make_visible", test_make_visible); - g_test_add_func ("/remote_settings/remove_connection", test_remove_connection); - g_test_add_func ("/remote_settings/service_running", test_service_running); - - ret = g_test_run (); - - nmtstc_service_cleanup (sinfo); - g_object_unref (settings); - dbus_g_connection_unref (bus); - - return ret; -} - |