--- src/main.c | 2 +- src/nm-policy.c | 389 ++++++++++++++++++++++++++++++++----------------------- src/nm-policy.h | 21 +++- 3 files changed, 246 insertions(+), 166 deletions(-)
diff --git a/src/main.c b/src/main.c index 328c253..109b352 100644 --- a/src/main.c +++ b/src/main.c @@ -778,7 +778,7 @@ main (int argc, char *argv[]) done: if (policy) - nm_policy_destroy (policy); + g_object_unref (policy); if (manager) g_object_unref (manager); diff --git a/src/nm-policy.c b/src/nm-policy.c index 20729fd..f84306a 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -48,7 +48,8 @@ #include "nm-policy-hostname.h" #include "nm-manager-auth.h" -struct NMPolicy { +typedef struct { + gboolean disposed; NMManager *manager; guint update_state_id; GSList *pending_activation_checks; @@ -71,7 +72,12 @@ struct NMPolicy { char *orig_hostname; /* hostname at NM start time */ char *cur_hostname; /* hostname we want to assign */ -}; +} NMPolicyPrivate; + + +G_DEFINE_TYPE (NMPolicy, nm_policy, G_TYPE_OBJECT) + +#define NM_POLICY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_POLICY, NMPolicyPrivate)) #define RETRIES_TAG "autoconnect-retries" #define RETRIES_DEFAULT 4 @@ -227,23 +233,25 @@ get_best_ip6_device (NMManager *manager, NMActRequest **out_req) } static void -_set_hostname (NMPolicy *policy, +_set_hostname (NMPolicy *self, gboolean change_hostname, const char *new_hostname, const char *msg) { + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); + if (change_hostname) { NMDnsManager *dns_mgr; - g_free (policy->cur_hostname); - policy->cur_hostname = g_strdup (new_hostname); + g_free (priv->cur_hostname); + priv->cur_hostname = g_strdup (new_hostname); dns_mgr = nm_dns_manager_get (NULL); - nm_dns_manager_set_hostname (dns_mgr, policy->cur_hostname); + nm_dns_manager_set_hostname (dns_mgr, priv->cur_hostname); g_object_unref (dns_mgr); } - if (nm_policy_set_system_hostname (policy->cur_hostname, msg)) + if (nm_policy_set_system_hostname (priv->cur_hostname, msg)) nm_utils_call_dispatcher ("hostname", NULL, NULL, NULL, NULL, NULL); } @@ -253,36 +261,38 @@ lookup_callback (HostnameThread *thread, const char *hostname, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); char *msg; /* Update the hostname if the calling lookup thread is the in-progress one */ - if (!hostname_thread_is_dead (thread) && (thread == policy->lookup)) { - policy->lookup = NULL; + if (!hostname_thread_is_dead (thread) && (thread == priv->lookup)) { + priv->lookup = NULL; if (!hostname) { /* Fall back to localhost.localdomain */ msg = g_strdup_printf ("address lookup failed: %d", result); - _set_hostname (policy, TRUE, NULL, msg); + _set_hostname (self, TRUE, NULL, msg); g_free (msg); } else - _set_hostname (policy, TRUE, hostname, "from address lookup"); + _set_hostname (self, TRUE, hostname, "from address lookup"); } hostname_thread_free (thread); } static void -update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) +update_system_hostname (NMPolicy *self, NMDevice *best4, NMDevice *best6) { + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); char *configured_hostname = NULL; NMActRequest *best_req4 = NULL; NMActRequest *best_req6 = NULL; const char *dhcp_hostname, *p; - g_return_if_fail (policy != NULL); + g_return_if_fail (self != NULL); - if (policy->lookup) { - hostname_thread_kill (policy->lookup); - policy->lookup = NULL; + if (priv->lookup) { + hostname_thread_kill (priv->lookup); + priv->lookup = NULL; } /* Hostname precedence order: @@ -295,24 +305,24 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) */ /* Try a persistent hostname first */ - g_object_get (G_OBJECT (policy->manager), NM_MANAGER_HOSTNAME, &configured_hostname, NULL); + g_object_get (G_OBJECT (priv->manager), NM_MANAGER_HOSTNAME, &configured_hostname, NULL); if (configured_hostname) { - _set_hostname (policy, TRUE, configured_hostname, "from system configuration"); + _set_hostname (self, TRUE, configured_hostname, "from system configuration"); g_free (configured_hostname); return; } /* Try automatically determined hostname from the best device's IP config */ if (!best4) - best4 = get_best_ip4_device (policy->manager, &best_req4); + best4 = get_best_ip4_device (priv->manager, &best_req4); if (!best6) - best6 = get_best_ip6_device (policy->manager, &best_req6); + best6 = get_best_ip6_device (priv->manager, &best_req6); if (!best4 && !best6) { /* No best device; fall back to original hostname or if there wasn't * one, 'localhost.localdomain' */ - _set_hostname (policy, TRUE, policy->orig_hostname, "no default device"); + _set_hostname (self, TRUE, priv->orig_hostname, "no default device"); return; } @@ -327,7 +337,7 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) /* Sanity check; strip leading spaces */ while (*p) { if (!isblank (*p++)) { - _set_hostname (policy, TRUE, p-1, "from DHCPv4"); + _set_hostname (self, TRUE, p-1, "from DHCPv4"); return; } } @@ -346,7 +356,7 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) /* Sanity check; strip leading spaces */ while (*p) { if (!isblank (*p++)) { - _set_hostname (policy, TRUE, p-1, "from DHCPv6"); + _set_hostname (self, TRUE, p-1, "from DHCPv6"); return; } } @@ -359,8 +369,8 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) /* If no automatically-configured hostname, try using the hostname from * when NM started up. */ - if (policy->orig_hostname) { - _set_hostname (policy, TRUE, policy->orig_hostname, "from system startup"); + if (priv->orig_hostname) { + _set_hostname (self, TRUE, priv->orig_hostname, "from system startup"); return; } @@ -376,7 +386,7 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) || (nm_ip4_config_get_num_nameservers (ip4_config) == 0) || (nm_ip4_config_get_num_addresses (ip4_config) == 0)) { /* No valid IP4 config (!!); fall back to localhost.localdomain */ - _set_hostname (policy, TRUE, NULL, "no IPv4 config"); + _set_hostname (self, TRUE, NULL, "no IPv4 config"); return; } @@ -384,7 +394,7 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) g_assert (addr4); /* checked for > 1 address above */ /* Start the hostname lookup thread */ - policy->lookup = hostname4_thread_new (nm_ip4_address_get_address (addr4), lookup_callback, policy); + priv->lookup = hostname4_thread_new (nm_ip4_address_get_address (addr4), lookup_callback, self); } else if (best6) { NMIP6Config *ip6_config; NMIP6Address *addr6; @@ -394,7 +404,7 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) || (nm_ip6_config_get_num_nameservers (ip6_config) == 0) || (nm_ip6_config_get_num_addresses (ip6_config) == 0)) { /* No valid IP6 config (!!); fall back to localhost.localdomain */ - _set_hostname (policy, TRUE, NULL, "no IPv6 config"); + _set_hostname (self, TRUE, NULL, "no IPv6 config"); return; } @@ -402,18 +412,19 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) g_assert (addr6); /* checked for > 1 address above */ /* Start the hostname lookup thread */ - policy->lookup = hostname6_thread_new (nm_ip6_address_get_address (addr6), lookup_callback, policy); + priv->lookup = hostname6_thread_new (nm_ip6_address_get_address (addr6), lookup_callback, self); } - if (!policy->lookup) { + if (!priv->lookup) { /* Fall back to 'localhost.localdomain' */ - _set_hostname (policy, TRUE, NULL, "error starting hostname thread"); + _set_hostname (self, TRUE, NULL, "error starting hostname thread"); } } static void -update_ip4_routing_and_dns (NMPolicy *policy, gboolean force_update) +update_ip4_routing_and_dns (NMPolicy *self, gboolean force_update) { + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); NMDnsIPConfigType dns_type = NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE; NMDevice *best = NULL; NMActRequest *best_req = NULL; @@ -426,14 +437,14 @@ update_ip4_routing_and_dns (NMPolicy *policy, gboolean force_update) NMSettingConnection *s_con = NULL; const char *connection_id; - best = get_best_ip4_device (policy->manager, &best_req); + best = get_best_ip4_device (priv->manager, &best_req); if (!best) goto out; - if (!force_update && (best == policy->default_device4)) + if (!force_update && (best == priv->default_device4)) goto out; /* If a VPN connection is active, it is preferred */ - vpns = nm_vpn_manager_get_active_connections (policy->vpn_manager); + vpns = nm_vpn_manager_get_active_connections (priv->vpn_manager); for (iter = vpns; iter; iter = g_slist_next (iter)) { NMVPNConnection *candidate = NM_VPN_CONNECTION (iter->data); NMConnection *vpn_connection; @@ -503,7 +514,7 @@ update_ip4_routing_and_dns (NMPolicy *policy, gboolean force_update) * first. The order is important, we don't want two connections marked * default at the same time ever. */ - devices = nm_manager_get_devices (policy->manager); + devices = nm_manager_get_devices (priv->manager); for (iter = devices; iter; iter = g_slist_next (iter)) { NMDevice *dev = NM_DEVICE (iter->data); NMActRequest *req; @@ -534,12 +545,13 @@ update_ip4_routing_and_dns (NMPolicy *policy, gboolean force_update) } out: - policy->default_device4 = best; + priv->default_device4 = best; } static void -update_ip6_routing_and_dns (NMPolicy *policy, gboolean force_update) +update_ip6_routing_and_dns (NMPolicy *self, gboolean force_update) { + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); NMDnsIPConfigType dns_type = NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE; NMDevice *best = NULL; NMActRequest *best_req = NULL; @@ -555,15 +567,15 @@ update_ip6_routing_and_dns (NMPolicy *policy, gboolean force_update) NMSettingConnection *s_con = NULL; const char *connection_id; - best = get_best_ip6_device (policy->manager, &best_req); + best = get_best_ip6_device (priv->manager, &best_req); if (!best) goto out; - if (!force_update && (best == policy->default_device6)) + if (!force_update && (best == priv->default_device6)) goto out; #if 0 /* If a VPN connection is active, it is preferred */ - vpns = nm_vpn_manager_get_active_connections (policy->vpn_manager); + vpns = nm_vpn_manager_get_active_connections (priv->vpn_manager); for (iter = vpns; iter; iter = g_slist_next (iter)) { NMVPNConnection *candidate = NM_VPN_CONNECTION (iter->data); NMConnection *vpn_connection; @@ -628,7 +640,7 @@ update_ip6_routing_and_dns (NMPolicy *policy, gboolean force_update) * first. The order is important, we don't want two connections marked * default at the same time ever. */ - devices = nm_manager_get_devices (policy->manager); + devices = nm_manager_get_devices (priv->manager); for (iter = devices; iter; iter = g_slist_next (iter)) { NMDevice *dev = NM_DEVICE (iter->data); NMActRequest *req; @@ -659,17 +671,18 @@ update_ip6_routing_and_dns (NMPolicy *policy, gboolean force_update) } out: - policy->default_device6 = best; + priv->default_device6 = best; } static void -update_routing_and_dns (NMPolicy *policy, gboolean force_update) +update_routing_and_dns (NMPolicy *self, gboolean force_update) { - update_ip4_routing_and_dns (policy, force_update); - update_ip6_routing_and_dns (policy, force_update); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); + update_ip4_routing_and_dns (self, force_update); + update_ip6_routing_and_dns (self, force_update); /* Update the system hostname */ - update_system_hostname (policy, policy->default_device4, policy->default_device6); + update_system_hostname (self, priv->default_device4, priv->default_device6); } static void @@ -706,16 +719,18 @@ static gboolean auto_activate_device (gpointer user_data) { ActivateData *data = (ActivateData *) user_data; - NMPolicy *policy; + NMPolicy *self; + NMPolicyPrivate *priv; NMConnection *best_connection; char *specific_object = NULL; GSList *connections, *iter; g_assert (data); - policy = data->policy; + self = data->policy; + priv = NM_POLICY_GET_PRIVATE (self); data->id = 0; - policy->pending_activation_checks = g_slist_remove (policy->pending_activation_checks, data); + priv->pending_activation_checks = g_slist_remove (priv->pending_activation_checks, data); // FIXME: if a device is already activating (or activated) with a connection // but another connection now overrides the current one for that device, @@ -724,7 +739,7 @@ auto_activate_device (gpointer user_data) if (nm_device_get_act_request (data->device)) goto out; - iter = connections = nm_settings_get_connections (policy->settings); + iter = connections = nm_settings_get_connections (priv->settings); /* Remove connections that shouldn't be auto-activated */ while (iter) { @@ -760,7 +775,7 @@ auto_activate_device (gpointer user_data) nm_log_info (LOGD_DEVICE, "Auto-activating connection '%s'.", nm_connection_get_id (best_connection)); - if (!nm_manager_activate_connection (policy->manager, + if (!nm_manager_activate_connection (priv->manager, best_connection, specific_object, nm_device_get_path (data->device), @@ -780,12 +795,12 @@ auto_activate_device (gpointer user_data) } static ActivateData * -activate_data_new (NMPolicy *policy, NMDevice *device, guint delay_seconds) +activate_data_new (NMPolicy *self, NMDevice *device, guint delay_seconds) { ActivateData *data; data = g_malloc0 (sizeof (ActivateData)); - data->policy = policy; + data->policy = self; data->device = g_object_ref (device); if (delay_seconds > 0) data->id = g_timeout_add_seconds (delay_seconds, auto_activate_device, data); @@ -872,7 +887,8 @@ reset_retries_for_failed_secrets (NMSettings *settings) static void sleeping_changed (NMManager *manager, GParamSpec *pspec, gpointer user_data) { - NMPolicy *policy = user_data; + NMPolicy *self = user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); gboolean sleeping = FALSE, enabled = FALSE; g_object_get (G_OBJECT (manager), NM_MANAGER_SLEEPING, &sleeping, NULL); @@ -880,16 +896,17 @@ sleeping_changed (NMManager *manager, GParamSpec *pspec, gpointer user_data) /* Reset retries on all connections so they'll checked on wakeup */ if (sleeping || !enabled) - reset_retries_all (policy->settings, NULL); + reset_retries_all (priv->settings, NULL); } static void -schedule_activate_check (NMPolicy *policy, NMDevice *device, guint delay_seconds) +schedule_activate_check (NMPolicy *self, NMDevice *device, guint delay_seconds) { + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); ActivateData *data; NMDeviceState state; - if (nm_manager_get_state (policy->manager) == NM_STATE_ASLEEP) + if (nm_manager_get_state (priv->manager) == NM_STATE_ASLEEP) return; state = nm_device_interface_get_state (NM_DEVICE_INTERFACE (device)); @@ -900,23 +917,24 @@ schedule_activate_check (NMPolicy *policy, NMDevice *device, guint delay_seconds return; /* Schedule an auto-activation if there isn't one already for this device */ - if (find_pending_activation (policy->pending_activation_checks, device) == NULL) { - data = activate_data_new (policy, device, delay_seconds); - policy->pending_activation_checks = g_slist_append (policy->pending_activation_checks, data); + if (find_pending_activation (priv->pending_activation_checks, device) == NULL) { + data = activate_data_new (self, device, delay_seconds); + priv->pending_activation_checks = g_slist_append (priv->pending_activation_checks, data); } } static gboolean reset_connections_retries (gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); GSList *connections, *iter; time_t con_stamp, min_stamp, now; - policy->reset_retries_id = 0; + priv->reset_retries_id = 0; min_stamp = now = time (NULL); - connections = nm_settings_get_connections (policy->settings); + connections = nm_settings_get_connections (priv->settings); for (iter = connections; iter; iter = g_slist_next (iter)) { con_stamp = GPOINTER_TO_SIZE (g_object_get_data (G_OBJECT (iter->data), RESET_RETRIES_TIMESTAMP_TAG)); if (con_stamp == 0) @@ -933,7 +951,7 @@ reset_connections_retries (gpointer user_data) /* Schedule the handler again if there are some stamps left */ if (min_stamp != now) - policy->reset_retries_id = g_timeout_add_seconds (RESET_RETRIES_TIMER - (now - min_stamp), reset_connections_retries, policy); + priv->reset_retries_id = g_timeout_add_seconds (RESET_RETRIES_TIMER - (now - min_stamp), reset_connections_retries, self); return FALSE; } @@ -956,7 +974,8 @@ device_state_changed (NMDevice *device, NMDeviceStateReason reason, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); NMConnection *connection = get_device_connection (device); if (connection) @@ -993,12 +1012,12 @@ device_state_changed (NMDevice *device, nm_log_info (LOGD_DEVICE, "Marking connection '%s' invalid.", nm_connection_get_id (connection)); /* Schedule a handler to reset retries count */ g_object_set_data (G_OBJECT (connection), RESET_RETRIES_TIMESTAMP_TAG, GSIZE_TO_POINTER ((gsize) time (NULL))); - if (!policy->reset_retries_id) - policy->reset_retries_id = g_timeout_add_seconds (RESET_RETRIES_TIMER, reset_connections_retries, policy); + if (!priv->reset_retries_id) + priv->reset_retries_id = g_timeout_add_seconds (RESET_RETRIES_TIMER, reset_connections_retries, self); } nm_connection_clear_secrets (connection); } - schedule_activate_check (policy, device, 3); + schedule_activate_check (self, device, 3); break; case NM_DEVICE_STATE_ACTIVATED: if (connection) { @@ -1011,21 +1030,21 @@ device_state_changed (NMDevice *device, nm_connection_clear_secrets (connection); } - update_routing_and_dns (policy, FALSE); + update_routing_and_dns (self, FALSE); break; case NM_DEVICE_STATE_UNMANAGED: case NM_DEVICE_STATE_UNAVAILABLE: - update_routing_and_dns (policy, FALSE); + update_routing_and_dns (self, FALSE); break; case NM_DEVICE_STATE_DISCONNECTED: /* Reset RETRIES_TAG when carrier on. If cable was unplugged * and plugged again, we should try to reconnect */ if (reason == NM_DEVICE_STATE_REASON_CARRIER && old_state == NM_DEVICE_STATE_UNAVAILABLE) - reset_retries_all (policy->settings, device); + reset_retries_all (priv->settings, device); /* Device is now available for auto-activation */ - update_routing_and_dns (policy, FALSE); - schedule_activate_check (policy, device, 0); + update_routing_and_dns (self, FALSE); + schedule_activate_check (self, device, 0); break; default: break; @@ -1060,33 +1079,34 @@ typedef struct { } DeviceSignalId; static void -_connect_device_signal (NMPolicy *policy, NMDevice *device, const char *name, gpointer callback) +_connect_device_signal (NMPolicy *self, NMDevice *device, const char *name, gpointer callback) { + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); DeviceSignalId *data; data = g_slice_new0 (DeviceSignalId); g_assert (data); - data->id = g_signal_connect (device, name, callback, policy); + data->id = g_signal_connect (device, name, callback, self); data->device = device; - policy->dev_ids = g_slist_prepend (policy->dev_ids, data); + priv->dev_ids = g_slist_prepend (priv->dev_ids, data); } static void device_added (NMManager *manager, NMDevice *device, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; + NMPolicy *self = (NMPolicy *) user_data; - _connect_device_signal (policy, device, "state-changed", device_state_changed); - _connect_device_signal (policy, device, "notify::" NM_DEVICE_INTERFACE_IP4_CONFIG, device_ip_config_changed); - _connect_device_signal (policy, device, "notify::" NM_DEVICE_INTERFACE_IP6_CONFIG, device_ip_config_changed); + _connect_device_signal (self, device, "state-changed", device_state_changed); + _connect_device_signal (self, device, "notify::" NM_DEVICE_INTERFACE_IP4_CONFIG, device_ip_config_changed); + _connect_device_signal (self, device, "notify::" NM_DEVICE_INTERFACE_IP6_CONFIG, device_ip_config_changed); if (NM_IS_DEVICE_WIFI (device)) { - _connect_device_signal (policy, device, "access-point-added", wireless_networks_changed); - _connect_device_signal (policy, device, "access-point-removed", wireless_networks_changed); + _connect_device_signal (self, device, "access-point-added", wireless_networks_changed); + _connect_device_signal (self, device, "access-point-removed", wireless_networks_changed); #if WITH_WIMAX } else if (NM_IS_DEVICE_WIMAX (device)) { - _connect_device_signal (policy, device, "nsp-added", nsps_changed); - _connect_device_signal (policy, device, "nsp-removed", nsps_changed); + _connect_device_signal (self, device, "nsp-added", nsps_changed); + _connect_device_signal (self, device, "nsp-removed", nsps_changed); #endif } } @@ -1094,19 +1114,20 @@ device_added (NMManager *manager, NMDevice *device, gpointer user_data) static void device_removed (NMManager *manager, NMDevice *device, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); ActivateData *tmp; GSList *iter; /* Clear any idle callbacks for this device */ - tmp = find_pending_activation (policy->pending_activation_checks, device); + tmp = find_pending_activation (priv->pending_activation_checks, device); if (tmp) { - policy->pending_activation_checks = g_slist_remove (policy->pending_activation_checks, tmp); + priv->pending_activation_checks = g_slist_remove (priv->pending_activation_checks, tmp); activate_data_free (tmp); } /* Clear any signal handlers for this device */ - iter = policy->dev_ids; + iter = priv->dev_ids; while (iter) { DeviceSignalId *data = iter->data; GSList *next = g_slist_next (iter); @@ -1114,22 +1135,23 @@ device_removed (NMManager *manager, NMDevice *device, gpointer user_data) if (data->device == device) { g_signal_handler_disconnect (data->device, data->id); g_slice_free (DeviceSignalId, data); - policy->dev_ids = g_slist_delete_link (policy->dev_ids, iter); + priv->dev_ids = g_slist_delete_link (priv->dev_ids, iter); } iter = next; } - update_routing_and_dns (policy, FALSE); + update_routing_and_dns (self, FALSE); } static void -schedule_activate_all (NMPolicy *policy) +schedule_activate_all (NMPolicy *self) { + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); GSList *iter, *devices; - devices = nm_manager_get_devices (policy->manager); + devices = nm_manager_get_devices (priv->manager); for (iter = devices; iter; iter = g_slist_next (iter)) - schedule_activate_check (policy, NM_DEVICE (iter->data), 0); + schedule_activate_check (self, NM_DEVICE (iter->data), 0); } static void @@ -1194,9 +1216,10 @@ connection_removed (NMSettings *settings, NMConnection *connection, gpointer user_data) { - NMPolicy *policy = user_data; + NMPolicy *self = user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); - _deactivate_if_active (policy->manager, connection); + _deactivate_if_active (priv->manager, connection); } static void @@ -1204,12 +1227,13 @@ connection_visibility_changed (NMSettings *settings, NMSettingsConnection *connection, gpointer user_data) { - NMPolicy *policy = user_data; + NMPolicy *self = user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); if (nm_settings_connection_is_visible (connection)) - schedule_activate_all (policy); + schedule_activate_all (self); else - _deactivate_if_active (policy->manager, NM_CONNECTION (connection)); + _deactivate_if_active (priv->manager, NM_CONNECTION (connection)); } static void @@ -1226,21 +1250,23 @@ secret_agent_registered (NMSettings *settings, } static void -_connect_manager_signal (NMPolicy *policy, const char *name, gpointer callback) +_connect_manager_signal (NMPolicy *self, const char *name, gpointer callback) { + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); guint id; - id = g_signal_connect (policy->manager, name, callback, policy); - policy->manager_ids = g_slist_prepend (policy->manager_ids, GUINT_TO_POINTER (id)); + id = g_signal_connect (priv->manager, name, callback, self); + priv->manager_ids = g_slist_prepend (priv->manager_ids, GUINT_TO_POINTER (id)); } static void -_connect_settings_signal (NMPolicy *policy, const char *name, gpointer callback) +_connect_settings_signal (NMPolicy *self, const char *name, gpointer callback) { + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); guint id; - id = g_signal_connect (policy->settings, name, callback, policy); - policy->settings_ids = g_slist_prepend (policy->settings_ids, GUINT_TO_POINTER (id)); + id = g_signal_connect (priv->settings, name, callback, self); + priv->settings_ids = g_slist_prepend (priv->settings_ids, GUINT_TO_POINTER (id)); } NMPolicy * @@ -1248,7 +1274,8 @@ nm_policy_new (NMManager *manager, NMVPNManager *vpn_manager, NMSettings *settings) { - NMPolicy *policy; + NMPolicy *self; + NMPolicyPrivate *priv; static gboolean initialized = FALSE; gulong id; char hostname[HOST_NAME_MAX + 2]; @@ -1256,10 +1283,15 @@ nm_policy_new (NMManager *manager, g_return_val_if_fail (NM_IS_MANAGER (manager), NULL); g_return_val_if_fail (initialized == FALSE, NULL); - policy = g_malloc0 (sizeof (NMPolicy)); - policy->manager = g_object_ref (manager); - policy->settings = g_object_ref (settings); - policy->update_state_id = 0; + self = g_object_new (NM_TYPE_POLICY, NULL); + if (!self) + return NULL; + + priv = NM_POLICY_GET_PRIVATE (self); + + priv->manager = g_object_ref (manager); + priv->settings = g_object_ref (settings); + priv->update_state_id = 0; /* Grab hostname on startup and use that if nothing provides one */ memset (hostname, 0, sizeof (hostname)); @@ -1269,85 +1301,118 @@ nm_policy_new (NMManager *manager, && strcmp (hostname, "localhost") && strcmp (hostname, "localhost.localdomain") && strcmp (hostname, "(none)")) - policy->orig_hostname = g_strdup (hostname); + priv->orig_hostname = g_strdup (hostname); } - policy->vpn_manager = g_object_ref (vpn_manager); - id = g_signal_connect (policy->vpn_manager, "connection-activated", - G_CALLBACK (vpn_connection_activated), policy); - policy->vpn_activated_id = id; - id = g_signal_connect (policy->vpn_manager, "connection-deactivated", - G_CALLBACK (vpn_connection_deactivated), policy); - policy->vpn_deactivated_id = id; - - _connect_manager_signal (policy, "state-changed", global_state_changed); - _connect_manager_signal (policy, "notify::" NM_MANAGER_HOSTNAME, hostname_changed); - _connect_manager_signal (policy, "notify::" NM_MANAGER_SLEEPING, sleeping_changed); - _connect_manager_signal (policy, "notify::" NM_MANAGER_NETWORKING_ENABLED, sleeping_changed); - _connect_manager_signal (policy, "device-added", device_added); - _connect_manager_signal (policy, "device-removed", device_removed); - - _connect_settings_signal (policy, NM_SETTINGS_SIGNAL_CONNECTIONS_LOADED, connections_loaded); - _connect_settings_signal (policy, NM_SETTINGS_SIGNAL_CONNECTION_ADDED, connection_added); - _connect_settings_signal (policy, NM_SETTINGS_SIGNAL_CONNECTION_UPDATED, connection_updated); - _connect_settings_signal (policy, NM_SETTINGS_SIGNAL_CONNECTION_REMOVED, connection_removed); - _connect_settings_signal (policy, NM_SETTINGS_SIGNAL_CONNECTION_VISIBILITY_CHANGED, + priv->vpn_manager = g_object_ref (vpn_manager); + id = g_signal_connect (priv->vpn_manager, "connection-activated", + G_CALLBACK (vpn_connection_activated), self); + priv->vpn_activated_id = id; + id = g_signal_connect (priv->vpn_manager, "connection-deactivated", + G_CALLBACK (vpn_connection_deactivated), self); + priv->vpn_deactivated_id = id; + + _connect_manager_signal (self, "state-changed", global_state_changed); + _connect_manager_signal (self, "notify::" NM_MANAGER_HOSTNAME, hostname_changed); + _connect_manager_signal (self, "notify::" NM_MANAGER_SLEEPING, sleeping_changed); + _connect_manager_signal (self, "notify::" NM_MANAGER_NETWORKING_ENABLED, sleeping_changed); + _connect_manager_signal (self, "device-added", device_added); + _connect_manager_signal (self, "device-removed", device_removed); + + _connect_settings_signal (self, NM_SETTINGS_SIGNAL_CONNECTIONS_LOADED, connections_loaded); + _connect_settings_signal (self, NM_SETTINGS_SIGNAL_CONNECTION_ADDED, connection_added); + _connect_settings_signal (self, NM_SETTINGS_SIGNAL_CONNECTION_UPDATED, connection_updated); + _connect_settings_signal (self, NM_SETTINGS_SIGNAL_CONNECTION_REMOVED, connection_removed); + _connect_settings_signal (self, NM_SETTINGS_SIGNAL_CONNECTION_VISIBILITY_CHANGED, connection_visibility_changed); - _connect_settings_signal (policy, NM_SETTINGS_SIGNAL_AGENT_REGISTERED, secret_agent_registered); + _connect_settings_signal (self, NM_SETTINGS_SIGNAL_AGENT_REGISTERED, secret_agent_registered); /* Initialize connections' auto-retries */ - reset_retries_all (policy->settings, NULL); + reset_retries_all (priv->settings, NULL); initialized = TRUE; - return policy; + return self; } -void -nm_policy_destroy (NMPolicy *policy) +static void +nm_policy_init (NMPolicy *self) { - GSList *iter; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); + priv->disposed = FALSE; +} - g_return_if_fail (policy != NULL); +static void +dispose (GObject *object) +{ + NMPolicy *self = NM_POLICY (object); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); + + if (!priv->disposed) { + priv->disposed = TRUE; + g_object_unref (priv->manager); + g_object_unref (priv->vpn_manager); + g_object_unref (priv->settings); + } + G_OBJECT_CLASS (nm_policy_parent_class)->dispose (object); +} + +static void +finalize (GObject *object) +{ + NMPolicy *self = NM_POLICY (object); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); + + GSList *iter; /* Tell any existing hostname lookup thread to die, it'll get cleaned up * by the lookup thread callback. */ - if (policy->lookup) { - hostname_thread_kill (policy->lookup); - policy->lookup = NULL; + if (priv->lookup) { + hostname_thread_kill (priv->lookup); + priv->lookup = NULL; } - g_slist_foreach (policy->pending_activation_checks, (GFunc) activate_data_free, NULL); - g_slist_free (policy->pending_activation_checks); + g_slist_foreach (priv->pending_activation_checks, (GFunc) activate_data_free, NULL); + g_slist_free (priv->pending_activation_checks); - g_signal_handler_disconnect (policy->vpn_manager, policy->vpn_activated_id); - g_signal_handler_disconnect (policy->vpn_manager, policy->vpn_deactivated_id); - g_object_unref (policy->vpn_manager); + g_signal_handler_disconnect (priv->vpn_manager, priv->vpn_activated_id); + g_signal_handler_disconnect (priv->vpn_manager, priv->vpn_deactivated_id); - for (iter = policy->manager_ids; iter; iter = g_slist_next (iter)) - g_signal_handler_disconnect (policy->manager, GPOINTER_TO_UINT (iter->data)); - g_slist_free (policy->manager_ids); + for (iter = priv->manager_ids; iter; iter = g_slist_next (iter)) + g_signal_handler_disconnect (priv->manager, GPOINTER_TO_UINT (iter->data)); + g_slist_free (priv->manager_ids); - for (iter = policy->settings_ids; iter; iter = g_slist_next (iter)) - g_signal_handler_disconnect (policy->settings, GPOINTER_TO_UINT (iter->data)); - g_slist_free (policy->settings_ids); + for (iter = priv->settings_ids; iter; iter = g_slist_next (iter)) + g_signal_handler_disconnect (priv->settings, GPOINTER_TO_UINT (iter->data)); + g_slist_free (priv->settings_ids); - for (iter = policy->dev_ids; iter; iter = g_slist_next (iter)) { + for (iter = priv->dev_ids; iter; iter = g_slist_next (iter)) { DeviceSignalId *data = iter->data; g_signal_handler_disconnect (data->device, data->id); g_slice_free (DeviceSignalId, data); } - g_slist_free (policy->dev_ids); + g_slist_free (priv->dev_ids); - if (policy->reset_retries_id) - g_source_remove (policy->reset_retries_id); + if (priv->reset_retries_id) + g_source_remove (priv->reset_retries_id); - g_free (policy->orig_hostname); - g_free (policy->cur_hostname); + g_free (priv->orig_hostname); + g_free (priv->cur_hostname); - g_object_unref (policy->settings); - g_object_unref (policy->manager); - g_free (policy); + G_OBJECT_CLASS (nm_policy_parent_class)->finalize (object); } + +static void +nm_policy_class_init (NMPolicyClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + g_type_class_add_private (class, sizeof (NMPolicyPrivate)); + + /* virtual methods */ + object_class->dispose = dispose; + object_class->finalize = finalize; + +} diff --git a/src/nm-policy.h b/src/nm-policy.h index 33796bc..6837103 100644 --- a/src/nm-policy.h +++ b/src/nm-policy.h @@ -15,7 +15,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * Copyright (C) 2004 - 2010 Red Hat, Inc. + * Copyright (C) 2004 - 2011 Red Hat, Inc. * Copyright (C) 2007 - 2008 Novell, Inc. */ @@ -26,11 +26,26 @@ #include "nm-vpn-manager.h" #include "nm-settings.h" -typedef struct NMPolicy NMPolicy; +#define NM_TYPE_POLICY (nm_policy_get_type ()) +#define NM_POLICY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_POLICY, NMPolicy)) +#define NM_POLICY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_POLICY, NMPolicyClass)) +#define NM_IS_POLICY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_POLICY)) +#define NM_IS_POLICY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_POLICY)) +#define NM_POLICY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_POLICY, NMPolicyClass)) + +typedef struct { + GObject parent_instance; +} NMPolicy; + +typedef struct { + GObjectClass parent_class; + +} NMPolicyClass; + +GType nm_policy_get_type (void); NMPolicy *nm_policy_new (NMManager *manager, NMVPNManager *vpn_manager, NMSettings *settings); -void nm_policy_destroy (NMPolicy *policy); #endif /* NM_POLICY_H */ -- 1.7.6 _______________________________________________ networkmanager-list mailing list networkmanager-list@gnome.org http://mail.gnome.org/mailman/listinfo/networkmanager-list