diff options
Diffstat (limited to 'src/nm-config-data.c')
-rw-r--r-- | src/nm-config-data.c | 69 |
1 files changed, 45 insertions, 24 deletions
diff --git a/src/nm-config-data.c b/src/nm-config-data.c index 73c36312f3..f093292564 100644 --- a/src/nm-config-data.c +++ b/src/nm-config-data.c @@ -60,6 +60,7 @@ typedef struct { struct { char **arr; GSList *specs; + GSList *specs_config; } no_auto_default; GSList *ignore_carrier; @@ -145,12 +146,17 @@ nm_config_data_get_no_auto_default (const NMConfigData *self) return (const char *const*) NM_CONFIG_DATA_GET_PRIVATE (self)->no_auto_default.arr; } -const GSList * -nm_config_data_get_no_auto_default_list (const NMConfigData *self) +gboolean +nm_config_data_get_no_auto_default_for_device (const NMConfigData *self, NMDevice *device) { - g_return_val_if_fail (self, NULL); + NMConfigDataPrivate *priv; + + g_return_val_if_fail (NM_IS_CONFIG_DATA (self), FALSE); + g_return_val_if_fail (NM_IS_DEVICE (device), FALSE); - return NM_CONFIG_DATA_GET_PRIVATE (self)->no_auto_default.specs; + priv = NM_CONFIG_DATA_GET_PRIVATE (self); + return nm_device_spec_match_list (device, priv->no_auto_default.specs) + || nm_device_spec_match_list (device, priv->no_auto_default.specs_config); } const char * @@ -310,12 +316,21 @@ _keyfile_a_contains_all_in_b (GKeyFile *kf_a, GKeyFile *kf_b) return TRUE; } +static gboolean +_slist_str_equals (GSList *a, GSList *b) +{ + while (a && b && g_strcmp0 (a->data, b->data) == 0) { + a = a->next; + b = b->next; + } + return !a && !b; +} + NMConfigChangeFlags nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data) { NMConfigChangeFlags changes = NM_CONFIG_CHANGE_NONE; NMConfigDataPrivate *priv_old, *priv_new; - GSList *spec_old, *spec_new; g_return_val_if_fail (NM_IS_CONFIG_DATA (old_data), NM_CONFIG_CHANGE_NONE); g_return_val_if_fail (NM_IS_CONFIG_DATA (new_data), NM_CONFIG_CHANGE_NONE); @@ -336,13 +351,8 @@ nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data) || g_strcmp0 (nm_config_data_get_connectivity_response (old_data), nm_config_data_get_connectivity_response (new_data))) changes |= NM_CONFIG_CHANGE_CONNECTIVITY; - spec_old = priv_old->no_auto_default.specs; - spec_new = priv_new->no_auto_default.specs; - while (spec_old && spec_new && strcmp (spec_old->data, spec_new->data) == 0) { - spec_old = spec_old->next; - spec_new = spec_new->next; - } - if (spec_old || spec_new) + if ( !_slist_str_equals (priv_old->no_auto_default.specs, priv_new->no_auto_default.specs) + || !_slist_str_equals (priv_old->no_auto_default.specs_config, priv_new->no_auto_default.specs_config)) changes |= NM_CONFIG_CHANGE_NO_AUTO_DEFAULT; if (g_strcmp0 (nm_config_data_get_dns_mode (old_data), nm_config_data_get_dns_mode (new_data))) @@ -371,9 +381,6 @@ get_property (GObject *object, case PROP_CONFIG_DESCRIPTION: g_value_set_string (value, nm_config_data_get_config_description (self)); break; - case PROP_NO_AUTO_DEFAULT: - g_value_take_boxed (value, g_strdupv ((char **) nm_config_data_get_no_auto_default (self))); - break; case PROP_CONNECTIVITY_URI: g_value_set_string (value, nm_config_data_get_connectivity_uri (self)); break; @@ -397,7 +404,6 @@ set_property (GObject *object, { NMConfigData *self = NM_CONFIG_DATA (object); NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE (self); - guint i; /* This type is immutable. All properties are construct only. */ switch (prop_id) { @@ -413,12 +419,24 @@ set_property (GObject *object, priv->keyfile = nm_config_create_keyfile (); break; case PROP_NO_AUTO_DEFAULT: - priv->no_auto_default.arr = g_strdupv (g_value_get_boxed (value)); - if (!priv->no_auto_default.arr) - priv->no_auto_default.arr = g_new0 (char *, 1); - for (i = 0; priv->no_auto_default.arr[i]; i++) - priv->no_auto_default.specs = g_slist_prepend (priv->no_auto_default.specs, priv->no_auto_default.arr[i]); - priv->no_auto_default.specs = g_slist_reverse (priv->no_auto_default.specs); + { + char ** value_arr = g_value_get_boxed (value); + guint i, j = 0; + + priv->no_auto_default.arr = g_new (char *, g_strv_length (value_arr) + 1); + priv->no_auto_default.specs = NULL; + + for (i = 0; value_arr && value_arr[i]; i++) { + if ( *value_arr[i] + && nm_utils_hwaddr_valid (value_arr[i], -1) + && _nm_utils_strv_find_first (value_arr, i, value_arr[i]) < 0) { + priv->no_auto_default.arr[j++] = g_strdup (value_arr[i]); + priv->no_auto_default.specs = g_slist_prepend (priv->no_auto_default.specs, g_strdup_printf ("mac:%s", value_arr[i])); + } + } + priv->no_auto_default.arr[j++] = NULL; + priv->no_auto_default.specs = g_slist_reverse (priv->no_auto_default.specs); + } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -443,7 +461,8 @@ finalize (GObject *gobject) g_free (priv->connectivity.uri); g_free (priv->connectivity.response); - g_slist_free (priv->no_auto_default.specs); + g_slist_free_full (priv->no_auto_default.specs, g_free); + g_slist_free_full (priv->no_auto_default.specs_config, g_free); g_strfreev (priv->no_auto_default.arr); g_free (priv->dns_mode); @@ -496,6 +515,8 @@ constructed (GObject *object) priv->ignore_carrier = nm_config_get_device_match_spec (priv->keyfile, "main", "ignore-carrier"); priv->assume_ipv6ll_only = nm_config_get_device_match_spec (priv->keyfile, "main", "assume-ipv6ll-only"); + priv->no_auto_default.specs_config = nm_config_get_device_match_spec (priv->keyfile, "main", "no-auto-default"); + G_OBJECT_CLASS (nm_config_data_parent_class)->constructed (object); } @@ -589,7 +610,7 @@ nm_config_data_class_init (NMConfigDataClass *config_class) (object_class, PROP_NO_AUTO_DEFAULT, g_param_spec_boxed (NM_CONFIG_DATA_NO_AUTO_DEFAULT, "", "", G_TYPE_STRV, - G_PARAM_READWRITE | + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); |