diff options
author | Thomas Haller <thaller@redhat.com> | 2019-07-25 11:38:22 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-07-25 11:38:22 +0200 |
commit | 3c003e0ea49a73f5e6ffc32eda5378621ceebec9 (patch) | |
tree | 021ce8787f99e8fc13e9235032494c7e9f8b9617 | |
parent | 31d74e8b457380e6a9f46fca47f8fef8a56f7cb0 (diff) | |
parent | b424f7547902eff9293b5f173e32245ec51982b5 (diff) | |
download | NetworkManager-3c003e0ea49a73f5e6ffc32eda5378621ceebec9.tar.gz |
core: merge branch 'th/no-auto-default-by-ifname'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/206
-rw-r--r-- | libnm-core/nm-utils.c | 16 | ||||
-rw-r--r-- | shared/nm-glib-aux/nm-shared-utils.c | 35 | ||||
-rw-r--r-- | shared/nm-glib-aux/nm-shared-utils.h | 2 | ||||
-rw-r--r-- | src/devices/nm-device.c | 3 | ||||
-rw-r--r-- | src/nm-config-data.c | 67 | ||||
-rw-r--r-- | src/nm-config.c | 115 | ||||
-rw-r--r-- | src/nm-core-utils.c | 17 | ||||
-rw-r--r-- | src/nm-core-utils.h | 4 | ||||
-rw-r--r-- | src/settings/nm-settings.c | 6 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c | 6 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 2 | ||||
-rw-r--r-- | src/settings/plugins/ifupdown/nms-ifupdown-plugin.c | 3 |
12 files changed, 181 insertions, 95 deletions
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 6dc3f53dd3..68da624818 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -4660,7 +4660,7 @@ nm_utils_is_valid_iface_name_utf8safe (const char *utf8safe_name) /** * nm_utils_is_valid_iface_name: - * @name: Name of interface + * @name: (allow-none): Name of interface * @error: location to store the error occurring, or %NULL to ignore * * Validate the network interface name. @@ -4669,13 +4669,20 @@ nm_utils_is_valid_iface_name_utf8safe (const char *utf8safe_name) * function in net/core/dev.c. * * Returns: %TRUE if interface name is valid, otherwise %FALSE is returned. + * + * Before 1.20, this function did not accept %NULL as @name argument. If you + * want to run against older versions of libnm, don't pass %NULL. */ gboolean nm_utils_is_valid_iface_name (const char *name, GError **error) { int i; - g_return_val_if_fail (name, FALSE); + if (!name) { + g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN, + _("interface name is missing")); + return FALSE; + } if (name[0] == '\0') { g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN, @@ -4712,13 +4719,16 @@ nm_utils_is_valid_iface_name (const char *name, GError **error) /** * nm_utils_iface_valid_name: - * @name: Name of interface + * @name: (allow-none): Name of interface * * Validate the network interface name. * * Deprecated: 1.6: use nm_utils_is_valid_iface_name() instead, with better error reporting. * * Returns: %TRUE if interface name is valid, otherwise %FALSE is returned. + * + * Before 1.20, this function did not accept %NULL as @name argument. If you + * want to run against older versions of libnm, don't pass %NULL. */ gboolean nm_utils_iface_valid_name (const char *name) diff --git a/shared/nm-glib-aux/nm-shared-utils.c b/shared/nm-glib-aux/nm-shared-utils.c index 7362dfc930..c8a253a668 100644 --- a/shared/nm-glib-aux/nm-shared-utils.c +++ b/shared/nm-glib-aux/nm-shared-utils.c @@ -806,6 +806,15 @@ _nm_utils_ascii_str_to_uint64 (const char *str, guint base, guint64 min, guint64 /*****************************************************************************/ +int +nm_strcmp_with_data (gconstpointer a, gconstpointer b, gpointer user_data) +{ + const char *s1 = a; + const char *s2 = b; + + return strcmp (s1, s2); +} + /* like nm_strcmp_p(), suitable for g_ptr_array_sort_with_data(). * g_ptr_array_sort() just casts nm_strcmp_p() to a function of different * signature. I guess, in glib there are knowledgeable people that ensure @@ -823,6 +832,15 @@ nm_strcmp_p_with_data (gconstpointer a, gconstpointer b, gpointer user_data) } int +nm_strcmp0_p_with_data (gconstpointer a, gconstpointer b, gpointer user_data) +{ + const char *s1 = *((const char **) a); + const char *s2 = *((const char **) b); + + return nm_strcmp0 (s1, s2); +} + +int nm_cmp_uint32_p_with_data (gconstpointer p_a, gconstpointer p_b, gpointer user_data) { const guint32 a = *((const guint32 *) p_a); @@ -1346,6 +1364,8 @@ _nm_utils_strv_cleanup (char **strv, return strv; if (strip_whitespace) { + /* we only modify the strings pointed to by @strv if @strip_whitespace is + * requested. Otherwise, the strings themselves are untouched. */ for (i = 0; strv[i]; i++) g_strstrip (strv[i]); } @@ -2690,8 +2710,8 @@ fail: * @len: the number of elements in strv. If negative, * strv must be a NULL terminated array and the length * will be calculated first. If @len is a positive - * number, all first @len elements in @strv must be - * non-NULL, valid strings. + * number, @strv is allowed to contain %NULL strings + * too. * * Ascending sort of the array @strv inplace, using plain strcmp() string * comparison. @@ -2699,9 +2719,16 @@ fail: void _nm_utils_strv_sort (const char **strv, gssize len) { + GCompareDataFunc cmp; gsize l; - l = len < 0 ? (gsize) NM_PTRARRAY_LEN (strv) : (gsize) len; + if (len < 0) { + l = NM_PTRARRAY_LEN (strv); + cmp = nm_strcmp_p_with_data; + } else { + l = len; + cmp = nm_strcmp0_p_with_data; + } if (l <= 1) return; @@ -2711,7 +2738,7 @@ _nm_utils_strv_sort (const char **strv, gssize len) g_qsort_with_data (strv, l, sizeof (const char *), - nm_strcmp_p_with_data, + cmp, NULL); } diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h index 3868a4938d..d9c430d495 100644 --- a/shared/nm-glib-aux/nm-shared-utils.h +++ b/shared/nm-glib-aux/nm-shared-utils.h @@ -918,7 +918,9 @@ nm_utf8_collate0 (const char *a, const char *b) return g_utf8_collate (a, b); } +int nm_strcmp_with_data (gconstpointer a, gconstpointer b, gpointer user_data); int nm_strcmp_p_with_data (gconstpointer a, gconstpointer b, gpointer user_data); +int nm_strcmp0_p_with_data (gconstpointer a, gconstpointer b, gpointer user_data); int nm_cmp_uint32_p_with_data (gconstpointer p_a, gconstpointer p_b, gpointer user_data); int nm_cmp_int2ptr_p_with_data (gconstpointer p_a, gconstpointer p_b, gpointer user_data); diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 4a4fd13b36..04a94db8a1 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -4796,9 +4796,6 @@ nm_device_new_default_connection (NMDevice *self) if (!NM_DEVICE_GET_CLASS (self)->new_default_connection) return NULL; - if (nm_config_get_no_auto_default_for_device (nm_config_get (), self)) - return NULL; - connection = NM_DEVICE_GET_CLASS (self)->new_default_connection (self); if (!connection) return NULL; diff --git a/src/nm-config-data.c b/src/nm-config-data.c index 85a481f6c2..5655c8fd0e 100644 --- a/src/nm-config-data.c +++ b/src/nm-config-data.c @@ -1503,16 +1503,6 @@ _match_section_infos_construct (GKeyFile *keyfile, const char *prefix) /*****************************************************************************/ -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) { @@ -1541,8 +1531,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; - 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)) + if ( nm_utils_g_slist_strlist_cmp (priv_old->no_auto_default.specs, priv_new->no_auto_default.specs) != 0 + || nm_utils_g_slist_strlist_cmp (priv_old->no_auto_default.specs_config, priv_new->no_auto_default.specs_config) != 0) 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))) @@ -1633,22 +1623,47 @@ set_property (GObject *object, case PROP_NO_AUTO_DEFAULT: /* construct-only */ { - 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])); + const char *const*value_arr_orig = g_value_get_boxed (value); + gs_free const char **value_arr = NULL; + GSList *specs = NULL; + gsize i, j; + gsize len; + + len = NM_PTRARRAY_LEN (value_arr_orig); + + /* sort entries, remove duplicates and empty words. */ + value_arr = len == 0 + ? NULL + : nm_memdup (value_arr_orig, sizeof (const char *) * (len + 1)); + nm_utils_strv_sort (value_arr, len); + _nm_utils_strv_cleanup ((char **) value_arr, FALSE, TRUE, TRUE); + + len = NM_PTRARRAY_LEN (value_arr); + j = 0; + for (i = 0; i < len; i++) { + const char *s = value_arr[i]; + gboolean is_mac; + char *spec; + + if (NM_STR_HAS_PREFIX (s, NM_MATCH_SPEC_INTERFACE_NAME_TAG"=")) + is_mac = FALSE; + else if (nm_utils_hwaddr_valid (s, -1)) + is_mac = TRUE; + else { + /* we drop all lines that we don't understand. */ + continue; } + + value_arr[j++] = s; + + spec = is_mac + ? g_strdup_printf (NM_MATCH_SPEC_MAC_TAG"%s", s) + : g_strdup (s); + specs = g_slist_prepend (specs, spec); } - priv->no_auto_default.arr[j++] = NULL; - priv->no_auto_default.specs = g_slist_reverse (priv->no_auto_default.specs); + + priv->no_auto_default.arr = nm_utils_strv_dup (value_arr, j); + priv->no_auto_default.specs = g_slist_reverse (specs); } break; default: diff --git a/src/nm-config.c b/src/nm-config.c index bb37d08fc3..d12798143f 100644 --- a/src/nm-config.c +++ b/src/nm-config.c @@ -349,47 +349,44 @@ nm_config_get_first_start (NMConfig *config) static char ** no_auto_default_from_file (const char *no_auto_default_file) { - GPtrArray *no_auto_default_new; - char **list; - guint i; - char *data; - - no_auto_default_new = g_ptr_array_new (); + gs_free char *data = NULL; + const char **list = NULL; + gsize i; if ( no_auto_default_file - && g_file_get_contents (no_auto_default_file, &data, NULL, NULL)) { - list = g_strsplit (data, "\n", -1); - for (i = 0; list[i]; i++) { - if ( *list[i] - && nm_utils_hwaddr_valid (list[i], -1) - && nm_utils_strv_find_first (list, i, list[i]) < 0) - g_ptr_array_add (no_auto_default_new, list[i]); - else - g_free (list[i]); - } - g_free (list); - g_free (data); + && g_file_get_contents (no_auto_default_file, &data, NULL, NULL)) + list = nm_utils_strsplit_set (data, "\n"); + + if (list) { + for (i = 0; list[i]; i++) + list[i] = nm_utils_str_utf8safe_unescape_cp (list[i]); } - g_ptr_array_add (no_auto_default_new, NULL); - return (char **) g_ptr_array_free (no_auto_default_new, FALSE); + /* The returned buffer here is not at all compact. That means, it has additional + * memory allocations and is larger than needed. That means, you should not keep + * this result around, only process it further and free it. */ + return (char **) list; } static gboolean no_auto_default_to_file (const char *no_auto_default_file, const char *const*no_auto_default, GError **error) { - GString *data; - gboolean success; - guint i; + nm_auto_free_gstring GString *data = NULL; + gsize i; data = g_string_new (""); for (i = 0; no_auto_default && no_auto_default[i]; i++) { - g_string_append (data, no_auto_default[i]); + gs_free char *s_to_free = NULL; + const char *s = no_auto_default[i]; + + s = nm_utils_str_utf8safe_escape (s, + NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL + | NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_NON_ASCII, + &s_to_free); + g_string_append (data, s); g_string_append_c (data, '\n'); } - success = g_file_set_contents (no_auto_default_file, data->str, data->len, error); - g_string_free (data, TRUE); - return success; + return g_file_set_contents (no_auto_default_file, data->str, data->len, error); } gboolean @@ -413,44 +410,76 @@ nm_config_set_no_auto_default_for_device (NMConfig *self, NMDevice *device) NMConfigPrivate *priv; GError *error = NULL; NMConfigData *new_data = NULL; + gs_free char *spec_to_free = NULL; + const char *ifname; const char *hw_address; + const char *spec; const char *const*no_auto_default_current; - GPtrArray *no_auto_default_new = NULL; - guint i; + gs_free const char **no_auto_default_new = NULL; + gboolean is_fake; + gsize len; + gssize idx; g_return_if_fail (NM_IS_CONFIG (self)); g_return_if_fail (NM_IS_DEVICE (device)); priv = NM_CONFIG_GET_PRIVATE (self); - hw_address = nm_device_get_permanent_hw_address (device); - if (!hw_address) + hw_address = nm_device_get_permanent_hw_address_full (device, TRUE, &is_fake); + + if (!hw_address) { + /* No MAC address, not even a fake one. We don't do anything for this device. */ return; + } + + if (is_fake) { + /* A fake MAC address, no point in storing it to the file. + * Also, nm_match_spec_device() would ignore fake MAC addresses. + * + * Instead, try the interface-name... */ + ifname = nm_device_get_ip_iface (device); + if (!nm_utils_is_valid_iface_name (ifname, NULL)) + return; + + spec_to_free = g_strdup_printf (NM_MATCH_SPEC_INTERFACE_NAME_TAG"=%s", ifname); + spec = spec_to_free; + } else + spec = hw_address; no_auto_default_current = nm_config_data_get_no_auto_default (priv->config_data); - if (nm_utils_strv_find_first ((char **) no_auto_default_current, -1, hw_address) >= 0) { - /* @hw_address is already blocked. We don't have to update our in-memory representation. + len = NM_PTRARRAY_LEN (no_auto_default_current); + + idx = nm_utils_ptrarray_find_binary_search ((gconstpointer *) no_auto_default_current, + len, + spec, + nm_strcmp_with_data, + NULL, + NULL, + NULL); + if (idx >= 0) { + /* @spec is already blocked. We don't have to update our in-memory representation. * Maybe we should write to no_auto_default_file anew, but let's save that too. */ return; } - no_auto_default_new = g_ptr_array_new (); - for (i = 0; no_auto_default_current && no_auto_default_current[i]; i++) - g_ptr_array_add (no_auto_default_new, (char *) no_auto_default_current[i]); - g_ptr_array_add (no_auto_default_new, (char *) hw_address); - g_ptr_array_add (no_auto_default_new, NULL); + idx = ~idx; - if (!no_auto_default_to_file (priv->no_auto_default_file, (const char *const*) no_auto_default_new->pdata, &error)) { + no_auto_default_new = g_new (const char *, len + 2); + if (idx > 0) + memcpy (no_auto_default_new, no_auto_default_current, sizeof (const char *) * idx); + no_auto_default_new[idx] = spec; + if (idx < len) + memcpy (&no_auto_default_new[idx + 1], &no_auto_default_current[idx], sizeof (const char *) * (len - idx)); + no_auto_default_new[len + 1] = NULL; + + if (!no_auto_default_to_file (priv->no_auto_default_file, no_auto_default_new, &error)) { _LOGW ("Could not update no-auto-default.state file: %s", error->message); g_error_free (error); } - new_data = nm_config_data_new_update_no_auto_default (priv->config_data, (const char *const*) no_auto_default_new->pdata); - - /* unref no_auto_default_set here. Note that _set_config_data() probably invalidates the content of the array. */ - g_ptr_array_unref (no_auto_default_new); + new_data = nm_config_data_new_update_no_auto_default (priv->config_data, no_auto_default_new); _set_config_data (self, new_data, NM_CONFIG_CHANGE_CAUSE_NO_AUTO_DEFAULT); } diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index 12780e1875..d896d4d33d 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -1158,13 +1158,10 @@ nm_utils_read_link_absolute (const char *link_file, GError **error) /*****************************************************************************/ -#define MAC_TAG "mac:" -#define INTERFACE_NAME_TAG "interface-name:" -#define DEVICE_TYPE_TAG "type:" -#define DRIVER_TAG "driver:" -#define SUBCHAN_TAG "s390-subchannels:" -#define DHCP_PLUGIN_TAG "dhcp-plugin:" -#define EXCEPT_TAG "except:" +#define DEVICE_TYPE_TAG "type:" +#define DRIVER_TAG "driver:" +#define DHCP_PLUGIN_TAG "dhcp-plugin:" +#define EXCEPT_TAG "except:" #define MATCH_TAG_CONFIG_NM_VERSION "nm-version:" #define MATCH_TAG_CONFIG_NM_VERSION_MIN "nm-version-min:" #define MATCH_TAG_CONFIG_NM_VERSION_MAX "nm-version-max:" @@ -1363,10 +1360,10 @@ match_device_eval (const char *spec_str, && nm_streq (spec_str, match_data->device_type); } - if (_MATCH_CHECK (spec_str, MAC_TAG)) + if (_MATCH_CHECK (spec_str, NM_MATCH_SPEC_MAC_TAG)) return match_device_hwaddr_eval (spec_str, match_data); - if (_MATCH_CHECK (spec_str, INTERFACE_NAME_TAG)) { + if (_MATCH_CHECK (spec_str, NM_MATCH_SPEC_INTERFACE_NAME_TAG)) { gboolean use_pattern = FALSE; if (spec_str[0] == '=') @@ -1418,7 +1415,7 @@ match_device_eval (const char *spec_str, match_data->driver_version ?: ""); } - if (_MATCH_CHECK (spec_str, SUBCHAN_TAG)) + if (_MATCH_CHECK (spec_str, NM_MATCH_SPEC_S390_SUBCHANNELS_TAG)) return match_data_s390_subchannels_eval (spec_str, match_data); if (_MATCH_CHECK (spec_str, DHCP_PLUGIN_TAG)) diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h index 1f4420ea52..855a5d080e 100644 --- a/src/nm-core-utils.h +++ b/src/nm-core-utils.h @@ -216,6 +216,10 @@ const char *nm_utils_find_helper (const char *progname, char *nm_utils_read_link_absolute (const char *link_file, GError **error); +#define NM_MATCH_SPEC_MAC_TAG "mac:" +#define NM_MATCH_SPEC_S390_SUBCHANNELS_TAG "s390-subchannels:" +#define NM_MATCH_SPEC_INTERFACE_NAME_TAG "interface-name:" + typedef enum { NM_MATCH_SPEC_NO_MATCH = 0, NM_MATCH_SPEC_MATCH = 1, diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index 13071ec367..e24814b1d8 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -2907,6 +2907,7 @@ static void device_realized (NMDevice *device, GParamSpec *pspec, NMSettings *self) { gs_unref_object NMConnection *connection = NULL; + NMSettingsPrivate *priv; NMSettingsConnection *added; GError *error = NULL; @@ -2917,12 +2918,15 @@ device_realized (NMDevice *device, GParamSpec *pspec, NMSettings *self) G_CALLBACK (device_realized), self); + priv = NM_SETTINGS_GET_PRIVATE (self); + /* If the device isn't managed or it already has a default wired connection, * ignore it. */ if ( !nm_device_get_managed (device, FALSE) || g_object_get_qdata (G_OBJECT (device), _default_wired_connection_quark ()) - || have_connection_for_device (self, device)) + || have_connection_for_device (self, device) + || nm_config_get_no_auto_default_for_device (priv->config, device)) return; connection = nm_device_new_default_connection (device); diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c index 177c60ff4a..900a3fc1de 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c @@ -5630,21 +5630,21 @@ create_unhandled_connection (const char *filename, shvarFile *ifcfg, if (v) { gs_free char *lower = g_ascii_strdown (v, -1); - *out_spec = g_strdup_printf ("%s:mac:%s", type, lower); + *out_spec = g_strdup_printf ("%s:"NM_MATCH_SPEC_MAC_TAG"%s", type, lower); return connection; } nm_clear_g_free (&value); v = svGetValueStr (ifcfg, "SUBCHANNELS", &value); if (v) { - *out_spec = g_strdup_printf ("%s:s390-subchannels:%s", type, v); + *out_spec = g_strdup_printf ("%s:"NM_MATCH_SPEC_S390_SUBCHANNELS_TAG"%s", type, v); return connection; } nm_clear_g_free (&value); v = svGetValueStr (ifcfg, "DEVICE", &value); if (v) { - *out_spec = g_strdup_printf ("%s:interface-name:%s", type, v); + *out_spec = g_strdup_printf ("%s:"NM_MATCH_SPEC_INTERFACE_NAME_TAG"=%s", type, v); return connection; } diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c index 9792e20ecd..45e90b919c 100644 --- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -721,7 +721,7 @@ test_read_unmanaged_unrecognized (void) connection = _connection_from_file (TEST_IFCFG_DIR"/ifcfg-test-nm-controlled-unrecognized", NULL, NULL, &unhandled_spec); - g_assert_cmpstr (unhandled_spec, ==, "unmanaged:interface-name:ipoac0"); + g_assert_cmpstr (unhandled_spec, ==, "unmanaged:interface-name:=ipoac0"); /* ===== CONNECTION SETTING ===== */ s_con = nm_connection_get_setting_connection (connection); diff --git a/src/settings/plugins/ifupdown/nms-ifupdown-plugin.c b/src/settings/plugins/ifupdown/nms-ifupdown-plugin.c index 94426d8b60..93f1813cfd 100644 --- a/src/settings/plugins/ifupdown/nms-ifupdown-plugin.c +++ b/src/settings/plugins/ifupdown/nms-ifupdown-plugin.c @@ -25,6 +25,7 @@ #include "nms-ifupdown-plugin.h" #include "nm-core-internal.h" +#include "nm-core-utils.h" #include "nm-config.h" #include "settings/nm-settings-plugin.h" #include "settings/nm-settings-storage.h" @@ -208,7 +209,7 @@ _unmanaged_specs (GHashTable *eni_ifaces) keys = nm_utils_strdict_get_keys (eni_ifaces, TRUE, &len); for (i = len; i > 0; ) { i--; - specs = g_slist_prepend (specs, g_strdup_printf ("interface-name:=%s", keys[i])); + specs = g_slist_prepend (specs, g_strdup_printf (NM_MATCH_SPEC_INTERFACE_NAME_TAG"=%s", keys[i])); } return specs; } |