diff options
author | Thomas Haller <thaller@redhat.com> | 2016-03-29 13:01:18 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-03-29 13:01:18 +0200 |
commit | 53011592af2d282947a513b2b7da1b3b08be2aea (patch) | |
tree | af9f3943aac5ff2ea1a685567301e287b400d961 /src | |
parent | c473cb42d0d7a2157ddba119aac17fdb9c448e2d (diff) | |
parent | b645a3b39d574fdf4e02bae3ee18bea8a3d3f95c (diff) | |
download | NetworkManager-th/mif.tar.gz |
Merge branch master of git://anongit.freedesktop.org/NetworkManager/NetworkManagerth/mif
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/nm-device.c | 5 | ||||
-rw-r--r-- | src/nm-core-utils.c | 33 | ||||
-rw-r--r-- | src/nm-core-utils.h | 25 | ||||
-rw-r--r-- | src/nm-manager.c | 2 | ||||
-rw-r--r-- | src/nm-policy.c | 643 | ||||
-rw-r--r-- | src/nm-policy.h | 7 | ||||
-rw-r--r-- | src/settings/nm-settings-connection.c | 5 | ||||
-rw-r--r-- | src/settings/nm-settings.c | 5 |
8 files changed, 365 insertions, 360 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index de3d8ea693..fba1100640 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -7378,7 +7378,10 @@ impl_device_reapply (NMDevice *self, if (settings && g_variant_n_children (settings)) { /* New settings specified inline. */ - connection = nm_simple_connection_new_from_dbus (settings, &error); + connection = _nm_simple_connection_new_from_dbus (settings, + NM_SETTING_PARSE_FLAGS_STRICT + | NM_SETTING_PARSE_FLAGS_NORMALIZE, + &error); if (!connection) { g_prefix_error (&error, "The settings specified are invalid: "); nm_audit_log_device_op (NM_AUDIT_OP_DEVICE_REAPPLY, self, FALSE, context, error->message); diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index 1a6d00f973..b98b6e8abd 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -109,39 +109,6 @@ _nm_utils_set_testing (NMUtilsTestFlags flags) /*****************************************************************************/ -G_DEFINE_QUARK (nm-utils-error-quark, nm_utils_error) - -void -nm_utils_error_set_cancelled (GError **error, - gboolean is_disposing, - const char *instance_name) -{ - if (is_disposing) { - g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_CANCELLED_DISPOSING, - "Disposing %s instance", - instance_name && *instance_name ? instance_name : "source"); - } else { - g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CANCELLED, - "Request cancelled"); - } -} - -gboolean -nm_utils_error_is_cancelled (GError *error, - gboolean consider_is_disposing) -{ - if (error) { - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - return TRUE; - if ( consider_is_disposing - && g_error_matches (error, NM_UTILS_ERROR, NM_UTILS_ERROR_CANCELLED_DISPOSING)) - return TRUE; - } - return FALSE; -} - -/*****************************************************************************/ - static GSList *_singletons = NULL; static gboolean _singletons_shutdown = FALSE; diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h index 2fb5273d74..f77b43e2a3 100644 --- a/src/nm-core-utils.h +++ b/src/nm-core-utils.h @@ -91,31 +91,6 @@ GETTER (void) \ /*****************************************************************************/ -/** - * NMUtilsError: - * @NM_UTILS_ERROR_UNKNOWN: unknown or unclassified error - * @NM_UTILS_ERROR_CANCELLED_DISPOSING: when disposing an object that has - * pending aynchronous operations, the operation is cancelled with this - * error reason. Depending on the usage, this might indicate a bug because - * usually the target object should stay alive as long as there are pending - * operations. - */ -typedef enum { - NM_UTILS_ERROR_UNKNOWN = 0, /*< nick=Unknown >*/ - NM_UTILS_ERROR_CANCELLED_DISPOSING, /*< nick=CancelledDisposing >*/ -} NMUtilsError; - -#define NM_UTILS_ERROR (nm_utils_error_quark ()) -GQuark nm_utils_error_quark (void); - -void nm_utils_error_set_cancelled (GError **error, - gboolean is_disposing, - const char *instance_name); -gboolean nm_utils_error_is_cancelled (GError *error, - gboolean consider_is_disposing); - -/*****************************************************************************/ - gint nm_utils_ascii_str_to_bool (const char *str, gint default_value); diff --git a/src/nm-manager.c b/src/nm-manager.c index 27241c26f0..5b618af0c2 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -3612,7 +3612,7 @@ impl_manager_add_and_activate_connection (NMManager *self, */ connection = nm_simple_connection_new (); if (settings && g_variant_n_children (settings)) - nm_connection_replace_settings (connection, settings, NULL); + _nm_connection_replace_settings (connection, settings, NM_SETTING_PARSE_FLAGS_STRICT, NULL); subject = validate_activation_request (self, context, diff --git a/src/nm-policy.c b/src/nm-policy.c index ef0e7d975f..545a68728a 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -60,7 +60,6 @@ typedef struct { NMManager *manager; NMDefaultRouteManager *default_route_manager; NMFirewallManager *firewall_manager; - guint update_state_id; GSList *pending_activation_checks; GSList *manager_ids; GSList *settings_ids; @@ -92,16 +91,17 @@ typedef struct { G_DEFINE_TYPE (NMPolicy, nm_policy, G_TYPE_OBJECT) -enum { - PROP_0, - +NM_GOBJECT_PROPERTIES_DEFINE (NMPolicy, + PROP_MANAGER, + PROP_SETTINGS, + PROP_DEFAULT_ROUTE_MANAGER, PROP_DEFAULT_IP4_DEVICE, PROP_DEFAULT_IP6_DEVICE, PROP_ACTIVATING_IP4_DEVICE, - PROP_ACTIVATING_IP6_DEVICE -}; + PROP_ACTIVATING_IP6_DEVICE, +); -static void schedule_activate_all (NMPolicy *policy); +static void schedule_activate_all (NMPolicy *self); static NMDevice * @@ -128,9 +128,10 @@ get_best_ip6_device (NMPolicy *self, gboolean fully_activated) #define FALLBACK_HOSTNAME4 "localhost.localdomain" -static void settings_set_hostname_cb (const char *hostname, - gboolean result, - gpointer user_data) +static void +settings_set_hostname_cb (const char *hostname, + gboolean result, + gpointer user_data) { int ret = 0; @@ -151,11 +152,11 @@ static void settings_set_hostname_cb (const char *hostname, } static void -_set_hostname (NMPolicy *policy, +_set_hostname (NMPolicy *self, const char *new_hostname, const char *msg) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); char old_hostname[HOST_NAME_MAX + 1]; const char *name; int ret; @@ -232,8 +233,8 @@ lookup_callback (GObject *source, GAsyncResult *result, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); const char *hostname; GError *error = NULL; @@ -245,9 +246,9 @@ lookup_callback (GObject *source, } if (hostname) - _set_hostname (policy, hostname, "from address lookup"); + _set_hostname (self, hostname, "from address lookup"); else { - _set_hostname (policy, NULL, error->message); + _set_hostname (self, NULL, error->message); g_error_free (error); } @@ -255,15 +256,15 @@ lookup_callback (GObject *source, } 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 (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); char *configured_hostname = NULL; const char *dhcp_hostname, *p; NMIP4Config *ip4_config; NMIP6Config *ip6_config; - g_return_if_fail (policy != NULL); + g_return_if_fail (self != NULL); if (priv->lookup_cancellable) { g_cancellable_cancel (priv->lookup_cancellable); @@ -282,7 +283,7 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) /* Try a persistent hostname first */ g_object_get (G_OBJECT (priv->manager), NM_MANAGER_HOSTNAME, &configured_hostname, NULL); if (configured_hostname && nm_utils_is_specific_hostname (configured_hostname)) { - _set_hostname (policy, configured_hostname, "from system configuration"); + _set_hostname (self, configured_hostname, "from system configuration"); g_free (configured_hostname); return; } @@ -290,15 +291,15 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) /* Try automatically determined hostname from the best device's IP config */ if (!best4) - best4 = get_best_ip4_device (policy, TRUE); + best4 = get_best_ip4_device (self, TRUE); if (!best6) - best6 = get_best_ip6_device (policy, TRUE); + best6 = get_best_ip6_device (self, TRUE); if (!best4 && !best6) { /* No best device; fall back to original hostname or if there wasn't * one, 'localhost.localdomain' */ - _set_hostname (policy, priv->orig_hostname, "no default device"); + _set_hostname (self, priv->orig_hostname, "no default device"); return; } @@ -313,7 +314,7 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) /* Sanity check; strip leading spaces */ while (*p) { if (!g_ascii_isspace (*p++)) { - _set_hostname (policy, p-1, "from DHCPv4"); + _set_hostname (self, p-1, "from DHCPv4"); return; } } @@ -332,7 +333,7 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) /* Sanity check; strip leading spaces */ while (*p) { if (!g_ascii_isspace (*p++)) { - _set_hostname (policy, p-1, "from DHCPv6"); + _set_hostname (self, p-1, "from DHCPv6"); return; } } @@ -346,7 +347,7 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) * when NM started up. */ if (priv->orig_hostname) { - _set_hostname (policy, priv->orig_hostname, "from system startup"); + _set_hostname (self, priv->orig_hostname, "from system startup"); return; } @@ -372,7 +373,7 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) G_SOCKET_FAMILY_IPV6); } else { /* No valid IP config; fall back to localhost.localdomain */ - _set_hostname (policy, NULL, "no IP config"); + _set_hostname (self, NULL, "no IP config"); return; } @@ -380,15 +381,15 @@ update_system_hostname (NMPolicy *policy, NMDevice *best4, NMDevice *best6) g_resolver_lookup_by_address_async (priv->resolver, priv->lookup_addr, priv->lookup_cancellable, - lookup_callback, policy); + lookup_callback, self); } static void -update_default_ac (NMPolicy *policy, +update_default_ac (NMPolicy *self, NMActiveConnection *best, void (*set_active_func)(NMActiveConnection*, gboolean)) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); const GSList *connections, *iter; /* Clear the 'default[6]' flag on all active connections that aren't the new @@ -425,14 +426,14 @@ get_best_ip4_config (NMPolicy *self, } static void -update_ip4_dns (NMPolicy *policy, NMDnsManager *dns_mgr) +update_ip4_dns (NMPolicy *self, NMDnsManager *dns_mgr) { NMIP4Config *ip4_config; const char *ip_iface = NULL; NMVpnConnection *vpn = NULL; NMDnsIPConfigType dns_type = NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE; - ip4_config = get_best_ip4_config (policy, TRUE, &ip_iface, NULL, NULL, &vpn); + ip4_config = get_best_ip4_config (self, TRUE, &ip_iface, NULL, NULL, &vpn); if (ip4_config) { if (vpn) dns_type = NM_DNS_IP_CONFIG_TYPE_VPN; @@ -445,9 +446,9 @@ update_ip4_dns (NMPolicy *policy, NMDnsManager *dns_mgr) } static void -update_ip4_routing (NMPolicy *policy, gboolean force_update) +update_ip4_routing (NMPolicy *self, gboolean force_update) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); NMDevice *best = NULL, *default_device; NMConnection *connection = NULL; NMVpnConnection *vpn = NULL; @@ -457,13 +458,13 @@ update_ip4_routing (NMPolicy *policy, gboolean force_update) /* Note that we might have an IPv4 VPN tunneled over an IPv6-only device, * so we can get (vpn != NULL && best == NULL). */ - if (!get_best_ip4_config (policy, FALSE, &ip_iface, &best_ac, &best, &vpn)) { + if (!get_best_ip4_config (self, FALSE, &ip_iface, &best_ac, &best, &vpn)) { gboolean changed; changed = (priv->default_device4 != NULL); priv->default_device4 = NULL; if (changed) - g_object_notify (G_OBJECT (policy), NM_POLICY_DEFAULT_IP4_DEVICE); + _notify (self, PROP_DEFAULT_IP4_DEVICE); return; } @@ -491,7 +492,7 @@ update_ip4_routing (NMPolicy *policy, gboolean force_update) else default_device = best; - update_default_ac (policy, best_ac, nm_active_connection_set_default); + update_default_ac (self, best_ac, nm_active_connection_set_default); if (default_device == priv->default_device4) return; @@ -500,7 +501,7 @@ update_ip4_routing (NMPolicy *policy, gboolean force_update) connection = nm_active_connection_get_applied_connection (best_ac); _LOGI (LOGD_CORE, "set '%s' (%s) as default for IPv4 routing and DNS", nm_connection_get_id (connection), ip_iface); - g_object_notify (G_OBJECT (policy), NM_POLICY_DEFAULT_IP4_DEVICE); + _notify (self, PROP_DEFAULT_IP4_DEVICE); } static NMIP6Config * @@ -522,14 +523,14 @@ get_best_ip6_config (NMPolicy *self, } static void -update_ip6_dns (NMPolicy *policy, NMDnsManager *dns_mgr) +update_ip6_dns (NMPolicy *self, NMDnsManager *dns_mgr) { NMIP6Config *ip6_config; const char *ip_iface = NULL; NMVpnConnection *vpn = NULL; NMDnsIPConfigType dns_type = NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE; - ip6_config = get_best_ip6_config (policy, TRUE, &ip_iface, NULL, NULL, &vpn); + ip6_config = get_best_ip6_config (self, TRUE, &ip_iface, NULL, NULL, &vpn); if (ip6_config) { if (vpn) dns_type = NM_DNS_IP_CONFIG_TYPE_VPN; @@ -542,9 +543,9 @@ update_ip6_dns (NMPolicy *policy, NMDnsManager *dns_mgr) } static void -update_ip6_routing (NMPolicy *policy, gboolean force_update) +update_ip6_routing (NMPolicy *self, gboolean force_update) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); NMDevice *best = NULL, *default_device6; NMConnection *connection = NULL; NMVpnConnection *vpn = NULL; @@ -554,13 +555,13 @@ update_ip6_routing (NMPolicy *policy, gboolean force_update) /* Note that we might have an IPv6 VPN tunneled over an IPv4-only device, * so we can get (vpn != NULL && best == NULL). */ - if (!get_best_ip6_config (policy, FALSE, &ip_iface, &best_ac, &best, &vpn)) { + if (!get_best_ip6_config (self, FALSE, &ip_iface, &best_ac, &best, &vpn)) { gboolean changed; changed = (priv->default_device6 != NULL); priv->default_device6 = NULL; if (changed) - g_object_notify (G_OBJECT (policy), NM_POLICY_DEFAULT_IP6_DEVICE); + _notify (self, PROP_DEFAULT_IP6_DEVICE); return; } @@ -588,7 +589,7 @@ update_ip6_routing (NMPolicy *policy, gboolean force_update) else default_device6 = best; - update_default_ac (policy, best_ac, nm_active_connection_set_default6); + update_default_ac (self, best_ac, nm_active_connection_set_default6); if (default_device6 == priv->default_device6) return; @@ -597,47 +598,47 @@ update_ip6_routing (NMPolicy *policy, gboolean force_update) connection = nm_active_connection_get_applied_connection (best_ac); _LOGI (LOGD_CORE, "set '%s' (%s) as default for IPv6 routing and DNS", nm_connection_get_id (connection), ip_iface); - g_object_notify (G_OBJECT (policy), NM_POLICY_DEFAULT_IP6_DEVICE); + _notify (self, PROP_DEFAULT_IP6_DEVICE); } static void -update_routing_and_dns (NMPolicy *policy, gboolean force_update) +update_routing_and_dns (NMPolicy *self, gboolean force_update) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); nm_dns_manager_begin_updates (priv->dns_manager, __func__); - update_ip4_dns (policy, priv->dns_manager); - update_ip6_dns (policy, priv->dns_manager); + update_ip4_dns (self, priv->dns_manager); + update_ip6_dns (self, priv->dns_manager); - update_ip4_routing (policy, force_update); - update_ip6_routing (policy, force_update); + update_ip4_routing (self, force_update); + update_ip6_routing (self, force_update); /* Update the system hostname */ - update_system_hostname (policy, priv->default_device4, priv->default_device6); + update_system_hostname (self, priv->default_device4, priv->default_device6); nm_dns_manager_end_updates (priv->dns_manager, __func__); } static void -check_activating_devices (NMPolicy *policy) +check_activating_devices (NMPolicy *self) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); - GObject *object = G_OBJECT (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); + GObject *object = G_OBJECT (self); NMDevice *best4, *best6 = NULL; - best4 = get_best_ip4_device (policy, FALSE); - best6 = get_best_ip6_device (policy, FALSE); + best4 = get_best_ip4_device (self, FALSE); + best6 = get_best_ip6_device (self, FALSE); g_object_freeze_notify (object); if (best4 != priv->activating_device4) { priv->activating_device4 = best4; - g_object_notify (object, NM_POLICY_ACTIVATING_IP4_DEVICE); + _notify (self, PROP_ACTIVATING_IP4_DEVICE); } if (best6 != priv->activating_device6) { priv->activating_device6 = best6; - g_object_notify (object, NM_POLICY_ACTIVATING_IP6_DEVICE); + _notify (self, PROP_ACTIVATING_IP6_DEVICE); } g_object_thaw_notify (object); @@ -660,14 +661,15 @@ activate_data_free (ActivateData *data) if (data->autoactivate_id) g_source_remove (data->autoactivate_id); g_object_unref (data->device); - g_free (data); + + g_slice_free (ActivateData, data); } static gboolean auto_activate_device (gpointer user_data) { ActivateData *data = (ActivateData *) user_data; - NMPolicy *policy; + NMPolicy *self; NMPolicyPrivate *priv; NMSettingsConnection *best_connection; char *specific_object = NULL; @@ -676,8 +678,8 @@ auto_activate_device (gpointer user_data) guint i; g_assert (data); - policy = data->policy; - priv = NM_POLICY_GET_PRIVATE (policy); + self = data->policy; + priv = NM_POLICY_GET_PRIVATE (self); data->autoactivate_id = 0; @@ -764,7 +766,7 @@ pending_secondary_data_new (NMDevice *device, GSList *secondaries) { PendingSecondaryData *data; - data = g_malloc0 (sizeof (PendingSecondaryData)); + data = g_slice_new (PendingSecondaryData); data->device = g_object_ref (device); data->secondaries = secondaries; return data; @@ -775,16 +777,15 @@ pending_secondary_data_free (PendingSecondaryData *data) { g_object_unref (data->device); g_slist_free_full (data->secondaries, g_object_unref); - memset (data, 0, sizeof (*data)); - g_free (data); + g_slice_free (PendingSecondaryData, data); } static void -process_secondaries (NMPolicy *policy, +process_secondaries (NMPolicy *self, NMActiveConnection *active, gboolean connected) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); GSList *iter, *iter2, *next, *next2; /* Loop through devices waiting for secondary connections to activate */ @@ -849,9 +850,9 @@ hostname_changed (NMManager *manager, GParamSpec *pspec, gpointer user_data) } static void -reset_autoconnect_all (NMPolicy *policy, NMDevice *device) +reset_autoconnect_all (NMPolicy *self, NMDevice *device) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); GSList *connections, *iter; if (device) { @@ -871,9 +872,9 @@ reset_autoconnect_all (NMPolicy *policy, NMDevice *device) } static void -reset_autoconnect_for_failed_secrets (NMPolicy *policy) +reset_autoconnect_for_failed_secrets (NMPolicy *self) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); GSList *connections, *iter; _LOGD (LOGD_DEVICE, "re-enabling autoconnect for all connections with failed secrets"); @@ -891,9 +892,9 @@ reset_autoconnect_for_failed_secrets (NMPolicy *policy) } static void -block_autoconnect_for_device (NMPolicy *policy, NMDevice *device) +block_autoconnect_for_device (NMPolicy *self, NMDevice *device) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); GSList *connections, *iter; _LOGD (LOGD_DEVICE, "blocking autoconnect for all connections on %s", @@ -918,7 +919,7 @@ block_autoconnect_for_device (NMPolicy *policy, NMDevice *device) static void sleeping_changed (NMManager *manager, GParamSpec *pspec, gpointer user_data) { - NMPolicy *policy = user_data; + NMPolicy *self = user_data; gboolean sleeping = FALSE, enabled = FALSE; g_object_get (G_OBJECT (manager), NM_MANAGER_SLEEPING, &sleeping, NULL); @@ -926,13 +927,13 @@ sleeping_changed (NMManager *manager, GParamSpec *pspec, gpointer user_data) /* Reset retries on all connections so they'll checked on wakeup */ if (sleeping || !enabled) - reset_autoconnect_all (policy, NULL); + reset_autoconnect_all (self, NULL); } static void -schedule_activate_check (NMPolicy *policy, NMDevice *device) +schedule_activate_check (NMPolicy *self, NMDevice *device) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); ActivateData *data; const GSList *active_connections, *iter; @@ -956,17 +957,17 @@ schedule_activate_check (NMPolicy *policy, NMDevice *device) nm_device_add_pending_action (device, "autoactivate", TRUE); - data = g_malloc0 (sizeof (ActivateData)); - data->policy = policy; + data = g_slice_new0 (ActivateData); + data->policy = self; data->device = g_object_ref (device); data->autoactivate_id = g_idle_add (auto_activate_device, data); priv->pending_activation_checks = g_slist_append (priv->pending_activation_checks, data); } static void -clear_pending_activate_check (NMPolicy *policy, NMDevice *device) +clear_pending_activate_check (NMPolicy *self, NMDevice *device) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); ActivateData *data; data = find_pending_activation (priv->pending_activation_checks, device); @@ -977,8 +978,8 @@ clear_pending_activate_check (NMPolicy *policy, NMDevice *device) static gboolean reset_connections_retries (gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); GSList *connections, *iter; gint32 con_stamp, min_stamp, now; gboolean changed = FALSE; @@ -1005,21 +1006,21 @@ reset_connections_retries (gpointer user_data) /* Schedule the handler again if there are some stamps left */ if (min_stamp != 0) - priv->reset_retries_id = g_timeout_add_seconds (min_stamp - now, reset_connections_retries, policy); + priv->reset_retries_id = g_timeout_add_seconds (min_stamp - now, reset_connections_retries, self); /* If anything changed, try to activate the newly re-enabled connections */ if (changed) - schedule_activate_all (policy); + schedule_activate_all (self); return FALSE; } -static void schedule_activate_all (NMPolicy *policy); +static void schedule_activate_all (NMPolicy *self); static void -activate_slave_connections (NMPolicy *policy, NMDevice *device) +activate_slave_connections (NMPolicy *self, NMDevice *device) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); const char *master_device, *master_uuid_settings = NULL, *master_uuid_applied = NULL; GSList *connections, *iter; NMActRequest *req; @@ -1065,15 +1066,15 @@ activate_slave_connections (NMPolicy *policy, NMDevice *device) g_slist_free (connections); - schedule_activate_all (policy); + schedule_activate_all (self); } static gboolean -activate_secondary_connections (NMPolicy *policy, +activate_secondary_connections (NMPolicy *self, NMConnection *connection, NMDevice *device) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); NMSettingConnection *s_con; NMSettingsConnection *settings_con; NMActiveConnection *ac; @@ -1145,8 +1146,8 @@ device_state_changed (NMDevice *device, NMDeviceStateReason reason, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); NMSettingsConnection *connection = nm_device_get_settings_connection (device); @@ -1184,7 +1185,7 @@ device_state_changed (NMDevice *device, gint32 retry_time = nm_settings_connection_get_autoconnect_retry_time (connection); g_warn_if_fail (retry_time != 0); - priv->reset_retries_id = g_timeout_add_seconds (MAX (0, retry_time - nm_utils_get_monotonic_timestamp_s ()), reset_connections_retries, policy); + priv->reset_retries_id = g_timeout_add_seconds (MAX (0, retry_time - nm_utils_get_monotonic_timestamp_s ()), reset_connections_retries, self); } } nm_connection_clear_secrets (NM_CONNECTION (connection)); @@ -1213,20 +1214,20 @@ device_state_changed (NMDevice *device, if (ip6_config) nm_dns_manager_add_ip6_config (priv->dns_manager, ip_iface, ip6_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT); - update_routing_and_dns (policy, FALSE); + update_routing_and_dns (self, FALSE); nm_dns_manager_end_updates (priv->dns_manager, __func__); break; case NM_DEVICE_STATE_UNMANAGED: case NM_DEVICE_STATE_UNAVAILABLE: if (old_state > NM_DEVICE_STATE_DISCONNECTED) - update_routing_and_dns (policy, FALSE); + update_routing_and_dns (self, FALSE); break; case NM_DEVICE_STATE_DEACTIVATING: if (reason == NM_DEVICE_STATE_REASON_USER_REQUESTED) { if (!nm_device_get_autoconnect (device)) { /* The device was disconnected; block all connections on it */ - block_autoconnect_for_device (policy, device); + block_autoconnect_for_device (self, device); } else { if (connection) { /* The connection was deactivated, so block just this connection */ @@ -1243,19 +1244,19 @@ device_state_changed (NMDevice *device, * was unplugged and plugged in again, we should try to reconnect. */ if (reason == NM_DEVICE_STATE_REASON_CARRIER && old_state == NM_DEVICE_STATE_UNAVAILABLE) - reset_autoconnect_all (policy, device); + reset_autoconnect_all (self, device); if (old_state > NM_DEVICE_STATE_DISCONNECTED) - update_routing_and_dns (policy, FALSE); + update_routing_and_dns (self, FALSE); /* Device is now available for auto-activation */ - schedule_activate_check (policy, device); + schedule_activate_check (self, device); break; case NM_DEVICE_STATE_PREPARE: /* Reset auto-connect retries of all slaves and schedule them for * activation. */ - activate_slave_connections (policy, device); + activate_slave_connections (self, device); break; case NM_DEVICE_STATE_IP_CONFIG: /* We must have secrets if we got here. */ @@ -1267,10 +1268,10 @@ device_state_changed (NMDevice *device, s_con = nm_connection_get_setting_connection (NM_CONNECTION (connection)); if (s_con && nm_setting_connection_get_num_secondaries (s_con) > 0) { /* Make routes and DNS up-to-date before activating dependent connections */ - update_routing_and_dns (policy, FALSE); + update_routing_and_dns (self, FALSE); /* Activate secondary (VPN) connections */ - if (!activate_secondary_connections (policy, NM_CONNECTION (connection), device)) + if (!activate_secondary_connections (self, NM_CONNECTION (connection), device)) nm_device_queue_state (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_SECONDARY_CONNECTION_FAILED); } else @@ -1282,7 +1283,7 @@ device_state_changed (NMDevice *device, break; } - check_activating_devices (policy); + check_activating_devices (self); } static void @@ -1291,8 +1292,8 @@ device_ip4_config_changed (NMDevice *device, NMIP4Config *old_config, gpointer user_data) { - NMPolicy *policy = user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); const char *ip_iface = nm_device_get_ip_iface (device); nm_dns_manager_begin_updates (priv->dns_manager, __func__); @@ -1308,8 +1309,8 @@ device_ip4_config_changed (NMDevice *device, if (new_config) nm_dns_manager_add_ip4_config (priv->dns_manager, ip_iface, new_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT); } - update_ip4_dns (policy, priv->dns_manager); - update_ip4_routing (policy, TRUE); + update_ip4_dns (self, priv->dns_manager); + update_ip4_routing (self, TRUE); } else { /* Old configs get removed immediately */ if (old_config) @@ -1325,8 +1326,8 @@ device_ip6_config_changed (NMDevice *device, NMIP6Config *old_config, gpointer user_data) { - NMPolicy *policy = user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); const char *ip_iface = nm_device_get_ip_iface (device); nm_dns_manager_begin_updates (priv->dns_manager, __func__); @@ -1342,8 +1343,8 @@ device_ip6_config_changed (NMDevice *device, if (new_config) nm_dns_manager_add_ip6_config (priv->dns_manager, ip_iface, new_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT); } - update_ip6_dns (policy, priv->dns_manager); - update_ip6_routing (policy, TRUE); + update_ip6_dns (self, priv->dns_manager); + update_ip6_routing (self, TRUE); } else { /* Old configs get removed immediately */ if (old_config) @@ -1374,21 +1375,21 @@ typedef struct { } DeviceSignalId; static void -_connect_device_signal (NMPolicy *policy, +_connect_device_signal (NMPolicy *self, NMDevice *device, const char *name, gpointer callback, gboolean after) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); DeviceSignalId *data; data = g_slice_new0 (DeviceSignalId); g_assert (data); if (after) - data->id = g_signal_connect_after (device, name, callback, policy); + data->id = g_signal_connect_after (device, name, callback, self); else - data->id = g_signal_connect (device, name, callback, policy); + data->id = g_signal_connect (device, name, callback, self); data->device = device; priv->dev_ids = g_slist_prepend (priv->dev_ids, data); } @@ -1396,25 +1397,25 @@ _connect_device_signal (NMPolicy *policy, static void device_added (NMManager *manager, NMDevice *device, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; + NMPolicy *self = (NMPolicy *) user_data; /* Connect state-changed with _after, so that the handler is invoked after other handlers. */ - _connect_device_signal (policy, device, NM_DEVICE_STATE_CHANGED, device_state_changed, TRUE); - _connect_device_signal (policy, device, NM_DEVICE_IP4_CONFIG_CHANGED, device_ip4_config_changed, FALSE); - _connect_device_signal (policy, device, NM_DEVICE_IP6_CONFIG_CHANGED, device_ip6_config_changed, FALSE); - _connect_device_signal (policy, device, "notify::" NM_DEVICE_AUTOCONNECT, device_autoconnect_changed, FALSE); - _connect_device_signal (policy, device, NM_DEVICE_RECHECK_AUTO_ACTIVATE, device_recheck_auto_activate, FALSE); + _connect_device_signal (self, device, NM_DEVICE_STATE_CHANGED, device_state_changed, TRUE); + _connect_device_signal (self, device, NM_DEVICE_IP4_CONFIG_CHANGED, device_ip4_config_changed, FALSE); + _connect_device_signal (self, device, NM_DEVICE_IP6_CONFIG_CHANGED, device_ip6_config_changed, FALSE); + _connect_device_signal (self, device, "notify::" NM_DEVICE_AUTOCONNECT, device_autoconnect_changed, FALSE); + _connect_device_signal (self, device, NM_DEVICE_RECHECK_AUTO_ACTIVATE, device_recheck_auto_activate, FALSE); } static void device_removed (NMManager *manager, NMDevice *device, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); GSList *iter; /* Clear any idle callbacks for this device */ - clear_pending_activate_check (policy, device); + clear_pending_activate_check (self, device); /* Clear any signal handlers for this device */ iter = priv->dev_ids; @@ -1438,9 +1439,9 @@ device_removed (NMManager *manager, NMDevice *device, gpointer user_data) /**************************************************************************/ static void -vpn_connection_activated (NMPolicy *policy, NMVpnConnection *vpn) +vpn_connection_activated (NMPolicy *self, NMVpnConnection *vpn) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); NMIP4Config *ip4_config; NMIP6Config *ip6_config; const char *ip_iface; @@ -1459,15 +1460,15 @@ vpn_connection_activated (NMPolicy *policy, NMVpnConnection *vpn) if (ip6_config) nm_dns_manager_add_ip6_config (priv->dns_manager, ip_iface, ip6_config, NM_DNS_IP_CONFIG_TYPE_VPN); - update_routing_and_dns (policy, TRUE); + update_routing_and_dns (self, TRUE); nm_dns_manager_end_updates (priv->dns_manager, __func__); } static void -vpn_connection_deactivated (NMPolicy *policy, NMVpnConnection *vpn) +vpn_connection_deactivated (NMPolicy *self, NMVpnConnection *vpn) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); NMIP4Config *ip4_config; NMIP6Config *ip6_config; @@ -1485,7 +1486,7 @@ vpn_connection_deactivated (NMPolicy *policy, NMVpnConnection *vpn) nm_dns_manager_remove_ip6_config (priv->dns_manager, ip6_config); } - update_routing_and_dns (policy, TRUE); + update_routing_and_dns (self, TRUE); nm_dns_manager_end_updates (priv->dns_manager, __func__); } @@ -1495,22 +1496,22 @@ vpn_connection_state_changed (NMVpnConnection *vpn, NMVpnConnectionState new_state, NMVpnConnectionState old_state, NMVpnConnectionStateReason reason, - NMPolicy *policy) + NMPolicy *self) { if (new_state == NM_VPN_CONNECTION_STATE_ACTIVATED) - vpn_connection_activated (policy, vpn); + vpn_connection_activated (self, vpn); else if (new_state >= NM_VPN_CONNECTION_STATE_FAILED) { /* Only clean up IP/DNS if the connection ever got past IP_CONFIG */ if (old_state >= NM_VPN_CONNECTION_STATE_IP_CONFIG_GET && old_state <= NM_VPN_CONNECTION_STATE_ACTIVATED) - vpn_connection_deactivated (policy, vpn); + vpn_connection_deactivated (self, vpn); } } static void -vpn_connection_retry_after_failure (NMVpnConnection *vpn, NMPolicy *policy) +vpn_connection_retry_after_failure (NMVpnConnection *vpn, NMPolicy *self) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); NMActiveConnection *ac = NM_ACTIVE_CONNECTION (vpn); NMSettingsConnection *connection = nm_active_connection_get_settings_connection (ac); GError *error = NULL; @@ -1532,14 +1533,14 @@ vpn_connection_retry_after_failure (NMVpnConnection *vpn, NMPolicy *policy) static void active_connection_state_changed (NMActiveConnection *active, GParamSpec *pspec, - NMPolicy *policy) + NMPolicy *self) { NMActiveConnectionState state = nm_active_connection_get_state (active); if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) - process_secondaries (policy, active, TRUE); + process_secondaries (self, active, TRUE); else if (state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) - process_secondaries (policy, active, FALSE); + process_secondaries (self, active, FALSE); } static void @@ -1547,20 +1548,20 @@ active_connection_added (NMManager *manager, NMActiveConnection *active, gpointer user_data) { - NMPolicy *policy = NM_POLICY (user_data); + NMPolicy *self = NM_POLICY (user_data); if (NM_IS_VPN_CONNECTION (active)) { g_signal_connect (active, NM_VPN_CONNECTION_INTERNAL_STATE_CHANGED, G_CALLBACK (vpn_connection_state_changed), - policy); + self); g_signal_connect (active, NM_VPN_CONNECTION_INTERNAL_RETRY_AFTER_FAILURE, G_CALLBACK (vpn_connection_retry_after_failure), - policy); + self); } g_signal_connect (active, "notify::" NM_ACTIVE_CONNECTION_STATE, G_CALLBACK (active_connection_state_changed), - policy); + self); } static void @@ -1568,29 +1569,29 @@ active_connection_removed (NMManager *manager, NMActiveConnection *active, gpointer user_data) { - NMPolicy *policy = NM_POLICY (user_data); + NMPolicy *self = NM_POLICY (user_data); g_signal_handlers_disconnect_by_func (active, vpn_connection_state_changed, - policy); + self); g_signal_handlers_disconnect_by_func (active, vpn_connection_retry_after_failure, - policy); + self); g_signal_handlers_disconnect_by_func (active, active_connection_state_changed, - policy); + self); } /**************************************************************************/ static void -schedule_activate_all (NMPolicy *policy) +schedule_activate_all (NMPolicy *self) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); const GSList *iter; for (iter = nm_manager_get_devices (priv->manager); iter; iter = g_slist_next (iter)) - schedule_activate_check (policy, NM_DEVICE (iter->data)); + schedule_activate_check (self, NM_DEVICE (iter->data)); } static void @@ -1598,17 +1599,17 @@ connection_added (NMSettings *settings, NMSettingsConnection *connection, gpointer user_data) { - NMPolicy *policy = NM_POLICY (user_data); + NMPolicy *self = NM_POLICY (user_data); - schedule_activate_all (policy); + schedule_activate_all (self); } static void firewall_started (NMFirewallManager *manager, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); const GSList *iter; /* add interface of each device to correct zone */ @@ -1619,8 +1620,8 @@ firewall_started (NMFirewallManager *manager, static void dns_config_changed (NMDnsManager *dns_manager, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); /* Restart a thread for reverse-DNS lookup after we are signalled that * DNS changed. Because the result from a previous run may not be right @@ -1645,7 +1646,7 @@ dns_config_changed (NMDnsManager *dns_manager, gpointer user_data) g_resolver_lookup_by_address_async (priv->resolver, priv->lookup_addr, priv->lookup_cancellable, - lookup_callback, policy); + lookup_callback, self); } } @@ -1662,8 +1663,8 @@ connection_updated_by_user (NMSettings *settings, NMSettingsConnection *connection, gpointer user_data) { - NMPolicy *policy = (NMPolicy *) user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = (NMPolicy *) user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); const GSList *iter; NMDevice *device = NULL; @@ -1716,8 +1717,8 @@ connection_removed (NMSettings *settings, NMSettingsConnection *connection, gpointer user_data) { - NMPolicy *policy = user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = user_data; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); _deactivate_if_active (priv->manager, connection); } @@ -1727,11 +1728,11 @@ connection_visibility_changed (NMSettings *settings, NMSettingsConnection *connection, gpointer user_data) { - NMPolicy *policy = user_data; - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + 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 (priv->manager, connection); } @@ -1741,55 +1742,130 @@ secret_agent_registered (NMSettings *settings, NMSecretAgent *agent, gpointer user_data) { - NMPolicy *policy = NM_POLICY (user_data); + NMPolicy *self = NM_POLICY (user_data); /* The registered secret agent may provide some missing secrets. Thus we * reset retries count here and schedule activation, so that the * connections failed due to missing secrets may re-try auto-connection. */ - reset_autoconnect_for_failed_secrets (policy); - schedule_activate_all (policy); + reset_autoconnect_for_failed_secrets (self); + schedule_activate_all (self); +} + +NMDevice * +nm_policy_get_default_ip4_device (NMPolicy *self) +{ + return NM_POLICY_GET_PRIVATE (self)->default_device4; +} + +NMDevice * +nm_policy_get_default_ip6_device (NMPolicy *self) +{ + return NM_POLICY_GET_PRIVATE (self)->default_device6; +} + +NMDevice * +nm_policy_get_activating_ip4_device (NMPolicy *self) +{ + return NM_POLICY_GET_PRIVATE (self)->activating_device4; } +NMDevice * +nm_policy_get_activating_ip6_device (NMPolicy *self) +{ + return NM_POLICY_GET_PRIVATE (self)->activating_device6; +} + +/*****************************************************************************/ + static void -_connect_manager_signal (NMPolicy *policy, const char *name, gpointer callback) +get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) { - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = NM_POLICY (object); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); + + switch (prop_id) { + case PROP_DEFAULT_IP4_DEVICE: + g_value_set_object (value, priv->default_device4); + break; + case PROP_DEFAULT_IP6_DEVICE: + g_value_set_object (value, priv->default_device6); + break; + case PROP_ACTIVATING_IP4_DEVICE: + g_value_set_object (value, priv->activating_device4); + break; + case PROP_ACTIVATING_IP6_DEVICE: + g_value_set_object (value, priv->activating_device6); + 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) +{ + NMPolicy *self = NM_POLICY (object); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); + + switch (prop_id) { + case PROP_MANAGER: + /* construct-only */ + priv->manager = g_value_get_object (value); + g_return_if_fail (NM_IS_MANAGER (priv->manager)); + break; + case PROP_SETTINGS: + /* construct-only */ + priv->settings = g_value_dup_object (value); + g_return_if_fail (NM_IS_SETTINGS (priv->settings)); + break; + case PROP_DEFAULT_ROUTE_MANAGER: + /* construct-only */ + priv->default_route_manager = g_value_dup_object (value); + g_return_if_fail (NM_IS_SETTINGS (priv->default_route_manager)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/*****************************************************************************/ + +static void +_connect_manager_signal (NMPolicy *self, const char *name, gpointer callback) +{ + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); gulong id; - id = g_signal_connect (priv->manager, name, callback, policy); + id = g_signal_connect (priv->manager, name, callback, self); priv->manager_ids = g_slist_prepend (priv->manager_ids, (gpointer) 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 (policy); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); gulong id; - id = g_signal_connect (priv->settings, name, callback, policy); + id = g_signal_connect (priv->settings, name, callback, self); priv->settings_ids = g_slist_prepend (priv->settings_ids, (gpointer) id); } -NMPolicy * -nm_policy_new (NMManager *manager, - NMSettings *settings, - NMDefaultRouteManager *default_route_manager) +static void +nm_policy_init (NMPolicy *self) { - NMPolicy *policy; - NMPolicyPrivate *priv; - static gboolean initialized = FALSE; - char hostname[HOST_NAME_MAX + 2]; - - g_return_val_if_fail (NM_IS_MANAGER (manager), NULL); - g_return_val_if_fail (initialized == FALSE, NULL); +} - policy = g_object_new (NM_TYPE_POLICY, NULL); - priv = NM_POLICY_GET_PRIVATE (policy); - priv->manager = manager; - priv->default_route_manager = g_object_ref (default_route_manager); - priv->settings = g_object_ref (settings); - priv->update_state_id = 0; +static void +constructed (GObject *object) +{ + NMPolicy *self = NM_POLICY (object); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); + char hostname[HOST_NAME_MAX + 2]; /* Grab hostname on startup and use that if nothing provides one */ memset (hostname, 0, sizeof (hostname)); @@ -1802,103 +1878,60 @@ nm_policy_new (NMManager *manager, priv->firewall_manager = g_object_ref (nm_firewall_manager_get ()); priv->fw_started_id = g_signal_connect (priv->firewall_manager, "started", - G_CALLBACK (firewall_started), policy); + G_CALLBACK (firewall_started), self); priv->dns_manager = g_object_ref (nm_dns_manager_get ()); nm_dns_manager_set_initial_hostname (priv->dns_manager, priv->orig_hostname); priv->config_changed_id = g_signal_connect (priv->dns_manager, "config-changed", - G_CALLBACK (dns_config_changed), policy); + G_CALLBACK (dns_config_changed), self); priv->resolver = g_resolver_get_default (); - _connect_manager_signal (policy, NM_MANAGER_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, "internal-device-added", device_added); - _connect_manager_signal (policy, "internal-device-removed", device_removed); - _connect_manager_signal (policy, NM_MANAGER_ACTIVE_CONNECTION_ADDED, active_connection_added); - _connect_manager_signal (policy, NM_MANAGER_ACTIVE_CONNECTION_REMOVED, active_connection_removed); - - _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_UPDATED_BY_USER, connection_updated_by_user); - _connect_settings_signal (policy, NM_SETTINGS_SIGNAL_CONNECTION_REMOVED, connection_removed); - _connect_settings_signal (policy, NM_SETTINGS_SIGNAL_CONNECTION_VISIBILITY_CHANGED, + _connect_manager_signal (self, NM_MANAGER_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, "internal-device-added", device_added); + _connect_manager_signal (self, "internal-device-removed", device_removed); + _connect_manager_signal (self, NM_MANAGER_ACTIVE_CONNECTION_ADDED, active_connection_added); + _connect_manager_signal (self, NM_MANAGER_ACTIVE_CONNECTION_REMOVED, active_connection_removed); + + _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_UPDATED_BY_USER, connection_updated_by_user); + _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); - - initialized = TRUE; - return policy; -} + _connect_settings_signal (self, NM_SETTINGS_SIGNAL_AGENT_REGISTERED, secret_agent_registered); -NMDevice * -nm_policy_get_default_ip4_device (NMPolicy *policy) -{ - return NM_POLICY_GET_PRIVATE (policy)->default_device4; -} - -NMDevice * -nm_policy_get_default_ip6_device (NMPolicy *policy) -{ - return NM_POLICY_GET_PRIVATE (policy)->default_device6; -} - -NMDevice * -nm_policy_get_activating_ip4_device (NMPolicy *policy) -{ - return NM_POLICY_GET_PRIVATE (policy)->activating_device4; + G_OBJECT_CLASS (nm_policy_parent_class)->constructed (object); } -NMDevice * -nm_policy_get_activating_ip6_device (NMPolicy *policy) -{ - return NM_POLICY_GET_PRIVATE (policy)->activating_device6; -} - -static void -nm_policy_init (NMPolicy *policy) -{ -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +NMPolicy * +nm_policy_new (NMManager *manager, + NMSettings *settings, + NMDefaultRouteManager *default_route_manager) { - NMPolicy *policy = NM_POLICY (object); - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + g_return_val_if_fail (NM_IS_MANAGER (manager), NULL); + g_return_val_if_fail (NM_IS_SETTINGS (settings), NULL); + g_return_val_if_fail (NM_IS_DEFAULT_ROUTE_MANAGER (default_route_manager), NULL); - switch (prop_id) { - case PROP_DEFAULT_IP4_DEVICE: - g_value_set_object (value, priv->default_device4); - break; - case PROP_DEFAULT_IP6_DEVICE: - g_value_set_object (value, priv->default_device6); - break; - case PROP_ACTIVATING_IP4_DEVICE: - g_value_set_object (value, priv->activating_device4); - break; - case PROP_ACTIVATING_IP6_DEVICE: - g_value_set_object (value, priv->activating_device6); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + return g_object_new (NM_TYPE_POLICY, + NM_POLICY_MANAGER, manager, + NM_POLICY_SETTINGS, settings, + NM_POLICY_DEFAULT_ROUTE_MANAGER, default_route_manager, + NULL); } static void dispose (GObject *object) { - NMPolicy *policy = NM_POLICY (object); - NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); + NMPolicy *self = NM_POLICY (object); + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self); const GSList *connections, *iter; - /* Tell any existing hostname lookup thread to die. */ - if (priv->lookup_cancellable) { - g_cancellable_cancel (priv->lookup_cancellable); - g_clear_object (&priv->lookup_cancellable); - } + nm_clear_g_cancellable (&priv->lookup_cancellable); + g_clear_object (&priv->lookup_addr); g_clear_object (&priv->resolver); @@ -1910,13 +1943,12 @@ dispose (GObject *object) if (priv->firewall_manager) { g_assert (priv->fw_started_id); - g_signal_handler_disconnect (priv->firewall_manager, priv->fw_started_id); - priv->fw_started_id = 0; + nm_clear_g_signal_handler (priv->firewall_manager, &priv->fw_started_id); g_clear_object (&priv->firewall_manager); } if (priv->dns_manager) { - g_signal_handler_disconnect (priv->dns_manager, priv->config_changed_id); + nm_clear_g_signal_handler (priv->dns_manager, &priv->config_changed_id); g_clear_object (&priv->dns_manager); } @@ -1951,6 +1983,8 @@ dispose (GObject *object) g_clear_object (&priv->settings); g_clear_object (&priv->default_route_manager); + nm_assert (NM_IS_MANAGER (priv->manager)); + G_OBJECT_CLASS (nm_policy_parent_class)->dispose (object); } @@ -1962,30 +1996,47 @@ nm_policy_class_init (NMPolicyClass *policy_class) g_type_class_add_private (policy_class, sizeof (NMPolicyPrivate)); object_class->get_property = get_property; + object_class->set_property = set_property; + object_class->constructed = constructed; object_class->dispose = dispose; - g_object_class_install_property - (object_class, PROP_DEFAULT_IP4_DEVICE, - g_param_spec_object (NM_POLICY_DEFAULT_IP4_DEVICE, "", "", - NM_TYPE_DEVICE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - g_object_class_install_property - (object_class, PROP_DEFAULT_IP6_DEVICE, - g_param_spec_object (NM_POLICY_DEFAULT_IP6_DEVICE, "", "", - NM_TYPE_DEVICE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - g_object_class_install_property - (object_class, PROP_ACTIVATING_IP4_DEVICE, - g_param_spec_object (NM_POLICY_ACTIVATING_IP4_DEVICE, "", "", - NM_TYPE_DEVICE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - g_object_class_install_property - (object_class, PROP_ACTIVATING_IP6_DEVICE, - g_param_spec_object (NM_POLICY_ACTIVATING_IP6_DEVICE, "", "", - NM_TYPE_DEVICE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); + obj_properties[PROP_MANAGER] = + g_param_spec_object (NM_POLICY_MANAGER, "", "", + NM_TYPE_MANAGER, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + obj_properties[PROP_SETTINGS] = + g_param_spec_object (NM_POLICY_SETTINGS, "", "", + NM_TYPE_SETTINGS, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + obj_properties[PROP_DEFAULT_ROUTE_MANAGER] = + g_param_spec_object (NM_POLICY_DEFAULT_ROUTE_MANAGER, "", "", + NM_TYPE_DEFAULT_ROUTE_MANAGER, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + obj_properties[PROP_DEFAULT_IP4_DEVICE] = + g_param_spec_object (NM_POLICY_DEFAULT_IP4_DEVICE, "", "", + NM_TYPE_DEVICE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS); + obj_properties[PROP_DEFAULT_IP6_DEVICE] = + g_param_spec_object (NM_POLICY_DEFAULT_IP6_DEVICE, "", "", + NM_TYPE_DEVICE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS); + obj_properties[PROP_ACTIVATING_IP4_DEVICE] = + g_param_spec_object (NM_POLICY_ACTIVATING_IP4_DEVICE, "", "", + NM_TYPE_DEVICE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS); + obj_properties[PROP_ACTIVATING_IP6_DEVICE] = + g_param_spec_object (NM_POLICY_ACTIVATING_IP6_DEVICE, "", "", + NM_TYPE_DEVICE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties); } diff --git a/src/nm-policy.h b/src/nm-policy.h index f41f743d7e..9ccb209269 100644 --- a/src/nm-policy.h +++ b/src/nm-policy.h @@ -31,8 +31,11 @@ #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)) -#define NM_POLICY_DEFAULT_IP4_DEVICE "default-ip4-device" -#define NM_POLICY_DEFAULT_IP6_DEVICE "default-ip6-device" +#define NM_POLICY_MANAGER "manager" +#define NM_POLICY_SETTINGS "settings" +#define NM_POLICY_DEFAULT_ROUTE_MANAGER "default-route-manager" +#define NM_POLICY_DEFAULT_IP4_DEVICE "default-ip4-device" +#define NM_POLICY_DEFAULT_IP6_DEVICE "default-ip6-device" #define NM_POLICY_ACTIVATING_IP4_DEVICE "activating-ip4-device" #define NM_POLICY_ACTIVATING_IP6_DEVICE "activating-ip6-device" diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c index 10aa77ab41..6bed3fe5f2 100644 --- a/src/settings/nm-settings-connection.c +++ b/src/settings/nm-settings-connection.c @@ -1735,7 +1735,10 @@ settings_connection_update_helper (NMSettingsConnection *self, /* Check if the settings are valid first */ if (new_settings) { - tmp = nm_simple_connection_new_from_dbus (new_settings, &error); + tmp = _nm_simple_connection_new_from_dbus (new_settings, + NM_SETTING_PARSE_FLAGS_STRICT + | NM_SETTING_PARSE_FLAGS_NORMALIZE, + &error); if (!tmp) goto error; } diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index a189d7b1b0..1798dc477d 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -1411,7 +1411,10 @@ impl_settings_add_connection_helper (NMSettings *self, NMConnection *connection; GError *error = NULL; - connection = nm_simple_connection_new_from_dbus (settings, &error); + connection = _nm_simple_connection_new_from_dbus (settings, + NM_SETTING_PARSE_FLAGS_STRICT + | NM_SETTING_PARSE_FLAGS_NORMALIZE, + &error); if (connection) { if (!nm_connection_verify_secrets (connection, &error)) |