From 7478c4b54a0ce2fce78947ecb16ec5f755eda4ca Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 17:53:25 +0200 Subject: [PATCH 01/15] libnm: fix compare_property() to handle default values Before, get_property_for_dbus() would @ignore_defaults. That is for example wrong for properties of type G_TYPE_STRV. In this case, if one operand has the property at its default (NULL) and the other has it to an empty string list, both would compare equal. This has the effect that different settings might compare equal. --- libnm-core/nm-setting.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c index 0791b0d198..e1e81b5de2 100644 --- a/libnm-core/nm-setting.c +++ b/libnm-core/nm-setting.c @@ -1053,13 +1053,15 @@ compare_property (NMSetting *setting, property = nm_setting_class_find_property (NM_SETTING_GET_CLASS (setting), prop_spec->name); g_return_val_if_fail (property != NULL, FALSE); - value1 = get_property_for_dbus (setting, property, FALSE); - value2 = get_property_for_dbus (other, property, FALSE); + value1 = get_property_for_dbus (setting, property, TRUE); + value2 = get_property_for_dbus (other, property, TRUE); cmp = nm_property_compare (value1, value2); - g_variant_unref (value1); - g_variant_unref (value2); + if (value1) + g_variant_unref (value1); + if (value2) + g_variant_unref (value2); return cmp == 0; } From 32871deecc127cfa35dd5fc212e63d2e5bd468e2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 13:54:25 +0200 Subject: [PATCH 02/15] ifcfg-rh: refactor svSetValue() and svEscape() not to clone string needlessly In the most cases we don't expect that our values need escaping. No need to do an additional copy of the unmodified string. --- src/settings/plugins/ifcfg-rh/shvar.c | 35 +++++++++++++------------- src/settings/plugins/ifcfg-rh/shvar.h | 4 +-- src/settings/plugins/ifcfg-rh/writer.c | 10 +++++--- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/settings/plugins/ifcfg-rh/shvar.c b/src/settings/plugins/ifcfg-rh/shvar.c index ed12683072..0aa9569608 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.c +++ b/src/settings/plugins/ifcfg-rh/shvar.c @@ -36,6 +36,7 @@ #include "shvar.h" +#include "gsystem-local-alloc.h" #include "nm-core-internal.h" #include "nm-logging.h" @@ -206,8 +207,8 @@ static const char escapees[] = "\"'\\$~`"; /* must be escaped */ static const char spaces[] = " \t|&;()<>"; /* only require "" */ static const char newlines[] = "\n\r"; /* will be removed */ -char * -svEscape (const char *s) +const char * +svEscape (const char *s, char **to_free) { char *new; int i, j, mangle = 0, space = 0, newline = 0; @@ -223,8 +224,10 @@ svEscape (const char *s) if (strchr (newlines, s[i])) newline++; } - if (!mangle && !space && !newline) - return strdup (s); + if (!mangle && !space && !newline) { + *to_free = NULL; + return s; + } newlen = slen + mangle - newline + 3; /* 3 is extra ""\0 */ new = g_malloc (newlen); @@ -243,6 +246,7 @@ svEscape (const char *s) new[j++] = '\0'; g_assert (j == slen + mangle - newline + 3); + *to_free = new; return new; } @@ -354,17 +358,19 @@ svGetValueInt64 (shvarFile *s, const char *key, guint base, gint64 min, gint64 m void svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim) { - char *newval = NULL, *oldval = NULL; + gs_free char *newval_free = NULL; + gs_free char *oldval = NULL; + const char *newval; char *keyValue; g_return_if_fail (s != NULL); g_return_if_fail (key != NULL); /* value may be NULL */ - if (value) - newval = verbatim ? g_strdup (value) : svEscape (value); - keyValue = g_strdup_printf ("%s=%s", key, newval ? newval : ""); - + if (!value || verbatim) + newval = value; + else + newval = svEscape (value, &newval_free); oldval = svGetValue (s, key, FALSE); if (!newval || !newval[0]) { @@ -376,15 +382,15 @@ svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim) g_list_free_1 (s->current); s->modified = TRUE; } - g_free (keyValue); - goto end; + return; } + keyValue = g_strdup_printf ("%s=%s", key, newval); if (!oldval) { /* append line */ s->lineList = g_list_append (s->lineList, keyValue); s->modified = TRUE; - goto end; + return; } if (strcmp (oldval, newval) != 0) { @@ -397,11 +403,6 @@ svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim) s->modified = TRUE; } else g_free (keyValue); - - end: - g_free (newval); - g_free (oldval); - return; } /* Write the current contents iff modified. Returns FALSE on error diff --git a/src/settings/plugins/ifcfg-rh/shvar.h b/src/settings/plugins/ifcfg-rh/shvar.h index b2a2f2636e..28634ddd5d 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.h +++ b/src/settings/plugins/ifcfg-rh/shvar.h @@ -84,8 +84,8 @@ gboolean svWriteFile (shvarFile *s, int mode, GError **error); /* Close the file descriptor (if open) and free the shvarFile. */ void svCloseFile (shvarFile *s); -/* Return a new escaped string */ -char *svEscape (const char *s); +/* Return @s unmodified or an escaped string */ +const char *svEscape (const char *s, char **to_free); /* Unescape a string in-place */ void svUnescape (char *s); diff --git a/src/settings/plugins/ifcfg-rh/writer.c b/src/settings/plugins/ifcfg-rh/writer.c index 27f1c70599..9924eb0f06 100644 --- a/src/settings/plugins/ifcfg-rh/writer.c +++ b/src/settings/plugins/ifcfg-rh/writer.c @@ -889,20 +889,22 @@ write_wireless_setting (NMConnection *connection, svSetValue (ifcfg, "ESSID", str->str, TRUE); g_string_free (str, TRUE); } else { + const char *tmp_escaped; + /* Printable SSIDs always get quoted */ memset (buf, 0, sizeof (buf)); memcpy (buf, ssid_data, ssid_len); - tmp = svEscape (buf); + tmp_escaped = svEscape (buf, &tmp); /* svEscape will usually quote the string, but just for consistency, * if svEscape doesn't quote the ESSID, we quote it ourselves. */ - if (tmp[0] != '"' && tmp[strlen (tmp) - 1] != '"') { - tmp2 = g_strdup_printf ("\"%s\"", tmp); + if (tmp_escaped[0] != '"' && tmp_escaped[strlen (tmp_escaped) - 1] != '"') { + tmp2 = g_strdup_printf ("\"%s\"", tmp_escaped); svSetValue (ifcfg, "ESSID", tmp2, TRUE); g_free (tmp2); } else - svSetValue (ifcfg, "ESSID", tmp, TRUE); + svSetValue (ifcfg, "ESSID", tmp_escaped, TRUE); g_free (tmp); } From 33aaa730c5b57ee406bd8e1affa29ee117209ca9 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 13:41:31 +0200 Subject: [PATCH 03/15] ifcfg-rh: add svGetValueFull() function --- src/settings/plugins/ifcfg-rh/shvar.c | 23 +++++++++++++++++------ src/settings/plugins/ifcfg-rh/shvar.h | 1 + 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/settings/plugins/ifcfg-rh/shvar.c b/src/settings/plugins/ifcfg-rh/shvar.c index 0aa9569608..75c038ccaf 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.c +++ b/src/settings/plugins/ifcfg-rh/shvar.c @@ -256,6 +256,22 @@ svEscape (const char *s, char **to_free) */ char * svGetValue (shvarFile *s, const char *key, gboolean verbatim) +{ + char *value; + + value = svGetValueFull (s, key, verbatim); + if (value && !*value) { + g_free (value); + return NULL; + } + return value; +} + +/* svGetValueFull() is identical to svGetValue() except that + * svGetValue() will never return an empty value (but %NULL instead). + * svGetValueFull() will return empty values if that is the value for the @key. */ +char * +svGetValueFull (shvarFile *s, const char *key, gboolean verbatim) { char *value = NULL; char *line; @@ -280,12 +296,7 @@ svGetValue (shvarFile *s, const char *key, gboolean verbatim) } g_free (keyString); - if (value && value[0]) { - return value; - } else { - g_free (value); - return NULL; - } + return value; } /* return TRUE if resolves to any truth value (e.g. "yes", "y", "true") diff --git a/src/settings/plugins/ifcfg-rh/shvar.h b/src/settings/plugins/ifcfg-rh/shvar.h index 28634ddd5d..738bce6d11 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.h +++ b/src/settings/plugins/ifcfg-rh/shvar.h @@ -56,6 +56,7 @@ shvarFile *svOpenFile (const char *name, GError **error); * be freed by the caller. */ char *svGetValue (shvarFile *s, const char *key, gboolean verbatim); +char *svGetValueFull (shvarFile *s, const char *key, gboolean verbatim); /* return TRUE if resolves to any truth value (e.g. "yes", "y", "true") * return FALSE if resolves to any non-truth value (e.g. "no", "n", "false") From c6efbeccf36d4205cd74fbeeb58b6ec8f71dd51f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 14:16:09 +0200 Subject: [PATCH 04/15] ifcfg-rh: use svGetValueFull() in svGetValueInt64() Previously, it would silently accept a value set to "empty". This is however not a valid number and we should raise a warning just like for any other invalid number. --- src/settings/plugins/ifcfg-rh/shvar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings/plugins/ifcfg-rh/shvar.c b/src/settings/plugins/ifcfg-rh/shvar.c index 75c038ccaf..f041aa6cb4 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.c +++ b/src/settings/plugins/ifcfg-rh/shvar.c @@ -345,7 +345,7 @@ svGetValueInt64 (shvarFile *s, const char *key, guint base, gint64 min, gint64 m gint64 result; int errsv; - tmp = svGetValue (s, key, FALSE); + tmp = svGetValueFull (s, key, FALSE); if (!tmp) { errno = 0; return fallback; From 51255d8b64861ce57e40ff47f877dbe41188a1dd Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 14:02:02 +0200 Subject: [PATCH 05/15] ifcfg-rh: fix svSetValue() to properly handle empty variables svSetValue() called svGetValue() which would return %NULL for empty variables. That is wrong, because it caused svSetValue() to add the variable anew. --- src/settings/plugins/ifcfg-rh/shvar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings/plugins/ifcfg-rh/shvar.c b/src/settings/plugins/ifcfg-rh/shvar.c index f041aa6cb4..8e174bd56b 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.c +++ b/src/settings/plugins/ifcfg-rh/shvar.c @@ -382,7 +382,7 @@ svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim) newval = value; else newval = svEscape (value, &newval_free); - oldval = svGetValue (s, key, FALSE); + oldval = svGetValueFull (s, key, FALSE); if (!newval || !newval[0]) { /* delete value */ From 0348bc9195b423f06cee6c4d8ff0a85befcc4882 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 14:07:57 +0200 Subject: [PATCH 06/15] ifcfg-rh: add svSetValueFull() to support writing empty values svSetValue() treated the empty word like %NULL. Handle empty differently from unset. --- src/settings/plugins/ifcfg-rh/shvar.c | 10 +++++++++- src/settings/plugins/ifcfg-rh/shvar.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/settings/plugins/ifcfg-rh/shvar.c b/src/settings/plugins/ifcfg-rh/shvar.c index 8e174bd56b..4a5ca1d186 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.c +++ b/src/settings/plugins/ifcfg-rh/shvar.c @@ -368,6 +368,14 @@ svGetValueInt64 (shvarFile *s, const char *key, guint base, gint64 min, gint64 m */ void svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim) +{ + svSetValueFull (s, key, value && value[0] ? value : NULL, verbatim); +} + +/* Same as svSetValue() but it preserves empty @value -- contrary to + * svSetValue() for which "" effectively means to remove the value. */ +void +svSetValueFull (shvarFile *s, const char *key, const char *value, gboolean verbatim) { gs_free char *newval_free = NULL; gs_free char *oldval = NULL; @@ -384,7 +392,7 @@ svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim) newval = svEscape (value, &newval_free); oldval = svGetValueFull (s, key, FALSE); - if (!newval || !newval[0]) { + if (!newval) { /* delete value */ if (oldval) { /* delete line */ diff --git a/src/settings/plugins/ifcfg-rh/shvar.h b/src/settings/plugins/ifcfg-rh/shvar.h index 738bce6d11..4902541b00 100644 --- a/src/settings/plugins/ifcfg-rh/shvar.h +++ b/src/settings/plugins/ifcfg-rh/shvar.h @@ -72,6 +72,7 @@ gint64 svGetValueInt64 (shvarFile *s, const char *key, guint base, gint64 min, g * to the top of the file. */ void svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim); +void svSetValueFull (shvarFile *s, const char *key, const char *value, gboolean verbatim); /* Write the current contents iff modified. Returns FALSE on error From a8dd1b535840f6b856a3c3aa8cbe01ba5c956860 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 13:19:35 +0200 Subject: [PATCH 07/15] libnm: make dns-options support an "undefined" default value We want to distinguish between "no-options/empty" and "unset/default". The latter can be interpreted by NM to use a default set of options. --- libnm-core/nm-setting-ip-config.c | 93 ++++++++++++++++--- libnm-core/nm-setting-ip-config.h | 3 +- libnm/libnm.ver | 1 + .../plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 4 +- 4 files changed, 84 insertions(+), 17 deletions(-) diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c index 3112e2748d..949a9e3d08 100644 --- a/libnm-core/nm-setting-ip-config.c +++ b/libnm-core/nm-setting-ip-config.c @@ -1424,9 +1424,33 @@ nm_setting_ip_config_clear_dns_searches (NMSettingIPConfig *setting) guint nm_setting_ip_config_get_num_dns_options (NMSettingIPConfig *setting) { + NMSettingIPConfigPrivate *priv; + g_return_val_if_fail (NM_IS_SETTING_IP_CONFIG (setting), 0); - return NM_SETTING_IP_CONFIG_GET_PRIVATE (setting)->dns_options->len; + priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + + return priv->dns_options ? priv->dns_options->len : 0; +} + +/** + * nm_setting_ip_config_has_dns_options: + * @setting: the #NMSettingIPConfig + * + * NMSettingIPConfig can have a list of dns-options. If the list + * is empty, there are two similar (but differentiated) states. + * Either the options are explicitly set to have no values, + * or the options are left undefined. The latter means to use + * a default configuration, while the former explicitly means "no-options". + * + * Returns: whether DNS options are initalized or left unset (the default). + **/ +gboolean +nm_setting_ip_config_has_dns_options (NMSettingIPConfig *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP_CONFIG (setting), 0); + + return !!NM_SETTING_IP_CONFIG_GET_PRIVATE (setting)->dns_options; } /** @@ -1446,6 +1470,7 @@ nm_setting_ip_config_get_dns_option (NMSettingIPConfig *setting, guint idx) g_return_val_if_fail (NM_IS_SETTING_IP_CONFIG (setting), NULL); priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + g_return_val_if_fail (priv->dns_options, NULL); g_return_val_if_fail (idx < priv->dns_options->len, NULL); return priv->dns_options->pdata[idx]; @@ -1470,6 +1495,9 @@ nm_setting_ip_config_next_valid_dns_option (NMSettingIPConfig *setting, guint id priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + if (!priv->dns_options) + return -1; + for (; idx < priv->dns_options->len; idx++) { if (_nm_utils_dns_option_validate (priv->dns_options->pdata[idx], NULL, NULL, NM_IS_SETTING_IP6_CONFIG (setting), @@ -1505,8 +1533,12 @@ nm_setting_ip_config_add_dns_option (NMSettingIPConfig *setting, return FALSE; priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); - if (_nm_utils_dns_option_find_idx (priv->dns_options, dns_option) >= 0) - return FALSE; + if (!priv->dns_options) + priv->dns_options = g_ptr_array_new_with_free_func (g_free); + else { + if (_nm_utils_dns_option_find_idx (priv->dns_options, dns_option) >= 0) + return FALSE; + } g_ptr_array_add (priv->dns_options, g_strdup (dns_option)); g_object_notify (G_OBJECT (setting), NM_SETTING_IP_CONFIG_DNS_OPTIONS); @@ -1530,6 +1562,7 @@ nm_setting_ip_config_remove_dns_option (NMSettingIPConfig *setting, int idx) g_return_if_fail (NM_IS_SETTING_IP_CONFIG (setting)); priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + g_return_if_fail (priv->dns_options); g_return_if_fail (idx < priv->dns_options->len); g_ptr_array_remove_index (priv->dns_options, idx); @@ -1559,6 +1592,9 @@ nm_setting_ip_config_remove_dns_option_by_value (NMSettingIPConfig *setting, g_return_val_if_fail (dns_option[0] != '\0', FALSE); priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); + if (!priv->dns_options) + return FALSE; + i = _nm_utils_dns_option_find_idx (priv->dns_options, dns_option); if (i >= 0) { g_ptr_array_remove_index (priv->dns_options, i); @@ -1572,20 +1608,35 @@ nm_setting_ip_config_remove_dns_option_by_value (NMSettingIPConfig *setting, /** * nm_setting_ip_config_clear_dns_options: * @setting: the #NMSettingIPConfig + * @is_set: the dns-options can be either empty or unset (default). + * Specify how to clear the options. * * Removes all configured DNS options. * * Since: 1.2 **/ void -nm_setting_ip_config_clear_dns_options (NMSettingIPConfig *setting) +nm_setting_ip_config_clear_dns_options (NMSettingIPConfig *setting, gboolean is_set) { NMSettingIPConfigPrivate *priv; g_return_if_fail (NM_IS_SETTING_IP_CONFIG (setting)); priv = NM_SETTING_IP_CONFIG_GET_PRIVATE (setting); - g_ptr_array_set_size (priv->dns_options, 0); + if (!priv->dns_options) { + if (!is_set) + return; + priv->dns_options = g_ptr_array_new_with_free_func (g_free); + } else { + if (!is_set) { + g_ptr_array_unref (priv->dns_options); + priv->dns_options = NULL; + } else { + if (priv->dns_options->len == 0) + return; + g_ptr_array_set_size (priv->dns_options, 0); + } + } g_object_notify (G_OBJECT (setting), NM_SETTING_IP_CONFIG_DNS_OPTIONS); } @@ -2155,7 +2206,7 @@ nm_setting_ip_config_init (NMSettingIPConfig *setting) priv->dns = g_ptr_array_new_with_free_func (g_free); priv->dns_search = g_ptr_array_new_with_free_func (g_free); - priv->dns_options = g_ptr_array_new_with_free_func (g_free); + priv->dns_options = NULL; priv->addresses = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_address_unref); priv->routes = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_route_unref); } @@ -2172,7 +2223,8 @@ finalize (GObject *object) g_ptr_array_unref (priv->dns); g_ptr_array_unref (priv->dns_search); - g_ptr_array_unref (priv->dns_options); + if (priv->dns_options) + g_ptr_array_unref (priv->dns_options); g_ptr_array_unref (priv->addresses); g_ptr_array_unref (priv->routes); @@ -2204,12 +2256,21 @@ set_property (GObject *object, guint prop_id, break; case PROP_DNS_OPTIONS: strv = g_value_get_boxed (value); - g_ptr_array_unref (priv->dns_options); - priv->dns_options = g_ptr_array_new_with_free_func (g_free); - for (i = 0; strv && strv[i]; i++) { - if ( _nm_utils_dns_option_validate (strv[i], NULL, NULL, FALSE, NULL) - && _nm_utils_dns_option_find_idx (priv->dns_options, strv[i]) < 0) - g_ptr_array_add (priv->dns_options, g_strdup (strv[i])); + if (!strv) { + if (priv->dns_options) { + g_ptr_array_unref (priv->dns_options); + priv->dns_options = NULL; + } + } else { + if (priv->dns_options) + g_ptr_array_set_size (priv->dns_options, 0); + else + priv->dns_options = g_ptr_array_new_with_free_func (g_free); + for (i = 0; strv[i]; i++) { + if ( _nm_utils_dns_option_validate (strv[i], NULL, NULL, FALSE, NULL) + && _nm_utils_dns_option_find_idx (priv->dns_options, strv[i]) < 0) + g_ptr_array_add (priv->dns_options, g_strdup (strv[i])); + } } break; case PROP_ADDRESSES: @@ -2276,7 +2337,7 @@ get_property (GObject *object, guint prop_id, g_value_take_boxed (value, _nm_utils_ptrarray_to_strv (priv->dns_search)); break; case PROP_DNS_OPTIONS: - g_value_take_boxed (value, _nm_utils_ptrarray_to_strv (priv->dns_options)); + g_value_take_boxed (value, priv->dns_options ? _nm_utils_ptrarray_to_strv (priv->dns_options) : NULL); break; case PROP_ADDRESSES: g_value_take_boxed (value, _nm_utils_copy_array (priv->addresses, @@ -2402,6 +2463,10 @@ nm_setting_ip_config_class_init (NMSettingIPConfigClass *setting_class) * * Array of DNS options. * + * %NULL means that the options are unset and left at the default. + * In this case NetworkManager will use default options. This is + * distinct from an empty list of properties. + * * Since: 1.2 **/ g_object_class_install_property diff --git a/libnm-core/nm-setting-ip-config.h b/libnm-core/nm-setting-ip-config.h index b150a3178d..6e8c02021a 100644 --- a/libnm-core/nm-setting-ip-config.h +++ b/libnm-core/nm-setting-ip-config.h @@ -198,6 +198,7 @@ gboolean nm_setting_ip_config_remove_dns_search_by_value (NMSettingIPConfig void nm_setting_ip_config_clear_dns_searches (NMSettingIPConfig *setting); guint nm_setting_ip_config_get_num_dns_options (NMSettingIPConfig *setting); +gboolean nm_setting_ip_config_has_dns_options (NMSettingIPConfig *setting); const char *nm_setting_ip_config_get_dns_option (NMSettingIPConfig *setting, guint idx); gint nm_setting_ip_config_next_valid_dns_option (NMSettingIPConfig *setting, @@ -208,7 +209,7 @@ void nm_setting_ip_config_remove_dns_option (NMSettingIPConfig int idx); gboolean nm_setting_ip_config_remove_dns_option_by_value (NMSettingIPConfig *setting, const char *dns_option); -void nm_setting_ip_config_clear_dns_options (NMSettingIPConfig *setting); +void nm_setting_ip_config_clear_dns_options (NMSettingIPConfig *setting, gboolean is_set); guint nm_setting_ip_config_get_num_addresses (NMSettingIPConfig *setting); NMIPAddress *nm_setting_ip_config_get_address (NMSettingIPConfig *setting, diff --git a/libnm/libnm.ver b/libnm/libnm.ver index 7245ea7af8..c15f0381c0 100644 --- a/libnm/libnm.ver +++ b/libnm/libnm.ver @@ -855,6 +855,7 @@ global: nm_setting_ip_config_clear_dns_options; nm_setting_ip_config_get_dns_option; nm_setting_ip_config_get_num_dns_options; + nm_setting_ip_config_has_dns_options; nm_setting_ip_config_remove_dns_option; nm_setting_ip_config_remove_dns_option_by_value; nm_setting_wireless_get_powersave; 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 b1c50fef8e..77021d69a6 100644 --- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -2635,11 +2635,11 @@ test_write_dns_options (void) unlink (testfile); /* RES_OPTIONS is copied to both IPv4 and IPv6 settings */ - nm_setting_ip_config_clear_dns_options (s_ip4); + nm_setting_ip_config_clear_dns_options (s_ip4, TRUE); nm_setting_ip_config_add_dns_option (s_ip4, "debug"); nm_setting_ip_config_add_dns_option (s_ip4, "timeout:3"); - nm_setting_ip_config_clear_dns_options (s_ip6); + nm_setting_ip_config_clear_dns_options (s_ip6, TRUE); nm_setting_ip_config_add_dns_option (s_ip6, "debug"); nm_setting_ip_config_add_dns_option (s_ip6, "timeout:3"); From d5e948e482cb2c1f4ab2789439106b029a388b55 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 17:53:25 +0200 Subject: [PATCH 08/15] libnm/test: test compare_property() to handle default values Add a test case to check whether compare/diff works correctly. --- libnm-core/tests/test-general.c | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c index e7f27c5729..55e905d5e8 100644 --- a/libnm-core/tests/test-general.c +++ b/libnm-core/tests/test-general.c @@ -3964,6 +3964,51 @@ typedef struct { const guint expected_len; } HexItem; +static void +test_setting_compare_default_strv (void) +{ + gs_unref_object NMConnection *c1 = NULL, *c2 = NULL; + char **strv; + NMSettingIPConfig *s_ip2, *s_ip1; + gboolean compare; + GHashTable *out_settings = NULL; + + c1 = nmtst_create_minimal_connection ("test_compare_default_strv", NULL, + NM_SETTING_WIRED_SETTING_NAME, NULL); + nmtst_assert_connection_verifies_and_normalizable (c1); + + c2 = nm_simple_connection_new_clone (c1); + nmtst_assert_connection_verifies_without_normalization (c2); + + nmtst_assert_connection_equals (c1, FALSE, c2, FALSE); + + s_ip1 = nm_connection_get_setting_ip4_config (c1); + s_ip2 = nm_connection_get_setting_ip4_config (c2); + + nm_setting_ip_config_clear_dns_options (s_ip2, FALSE); + g_object_get (G_OBJECT (s_ip2), NM_SETTING_IP_CONFIG_DNS_OPTIONS, &strv, NULL); + g_assert (!strv); + nmtst_assert_connection_equals (c1, FALSE, c2, FALSE); + + nm_setting_ip_config_clear_dns_options (s_ip2, TRUE); + g_object_get (G_OBJECT (s_ip2), NM_SETTING_IP_CONFIG_DNS_OPTIONS, &strv, NULL); + g_assert (strv && !strv[0]); + g_strfreev (strv); + + compare = nm_setting_diff ((NMSetting *) s_ip1, (NMSetting *) s_ip2, NM_SETTING_COMPARE_FLAG_EXACT, FALSE, &out_settings); + g_assert (!compare); + g_assert (out_settings); + g_assert (g_hash_table_contains (out_settings, NM_SETTING_IP_CONFIG_DNS_OPTIONS)); + g_hash_table_unref (out_settings); + out_settings = NULL; + + compare = nm_connection_diff (c1, c2, NM_SETTING_COMPARE_FLAG_EXACT, &out_settings); + g_assert (!compare); + g_assert (out_settings); + g_hash_table_unref (out_settings); + out_settings = NULL; +} + static void test_hexstr2bin (void) { @@ -4406,6 +4451,7 @@ int main (int argc, char **argv) g_test_add_func ("/core/general/test_setting_802_1x_changed_signal", test_setting_802_1x_changed_signal); g_test_add_func ("/core/general/test_setting_ip4_gateway", test_setting_ip4_gateway); g_test_add_func ("/core/general/test_setting_ip6_gateway", test_setting_ip6_gateway); + g_test_add_func ("/core/general/test_setting_compare_default_strv", test_setting_compare_default_strv); g_test_add_func ("/core/general/hexstr2bin", test_hexstr2bin); g_test_add_func ("/core/general/test_nm_utils_uuid_generate_from_string", test_nm_utils_uuid_generate_from_string); From 51b1fd976f25d1411daa655e1817d936c31eb062 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 14:29:49 +0200 Subject: [PATCH 09/15] ifcfg-rh: distinguish in reader and writer between unset and empty dns-options --- src/settings/plugins/ifcfg-rh/reader.c | 11 +++++++---- .../tests/network-scripts/ifcfg-test-wired-static | 1 + .../network-scripts/ifcfg-test-wired-static-bootproto | 1 + src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 10 ++++++++++ src/settings/plugins/ifcfg-rh/writer.c | 6 ++++-- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c index ccbcdb07ab..71bb2b942d 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -677,6 +677,9 @@ parse_dns_options (NMSettingIPConfig *ip_config, char *value) if (!value) return; + if (!nm_setting_ip_config_has_dns_options (ip_config)) + nm_setting_ip_config_clear_dns_options (ip_config, TRUE); + options = g_strsplit (value, " ", 0); if (options) { char **item; @@ -927,7 +930,7 @@ make_ip4_setting (shvarFile *ifcfg, /* Get the connection ifcfg device name and the global gateway device */ value = svGetValue (ifcfg, "DEVICE", FALSE); gatewaydev = svGetValue (network_ifcfg, "GATEWAYDEV", FALSE); - dns_options = svGetValue (network_ifcfg, "RES_OPTIONS", FALSE); + dns_options = svGetValueFull (network_ifcfg, "RES_OPTIONS", FALSE); /* If there was a global gateway device specified, then only connections * for that device can be the default connection. @@ -1105,7 +1108,7 @@ make_ip4_setting (shvarFile *ifcfg, } /* DNS options */ - value = svGetValue (ifcfg, "RES_OPTIONS", FALSE); + value = svGetValueFull (ifcfg, "RES_OPTIONS", FALSE); parse_dns_options (s_ip4, value); parse_dns_options (s_ip4, dns_options); g_free (value); @@ -1317,7 +1320,7 @@ make_ip6_setting (shvarFile *ifcfg, value = svGetValue (ifcfg, "DEVICE", FALSE); ipv6_defaultgw = svGetValue (network_ifcfg, "IPV6_DEFAULTGW", FALSE); ipv6_defaultdev = svGetValue (network_ifcfg, "IPV6_DEFAULTDEV", FALSE); - dns_options = svGetValue (network_ifcfg, "RES_OPTIONS", FALSE); + dns_options = svGetValueFull (network_ifcfg, "RES_OPTIONS", FALSE); if (ipv6_defaultgw) { default_dev = strchr (ipv6_defaultgw, '%'); @@ -1515,7 +1518,7 @@ make_ip6_setting (shvarFile *ifcfg, } /* DNS options */ - value = svGetValue (ifcfg, "RES_OPTIONS", FALSE); + value = svGetValueFull (ifcfg, "RES_OPTIONS", FALSE); parse_dns_options (s_ip6, value); parse_dns_options (s_ip6, dns_options); g_free (value); diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-static b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-static index c8315f45d3..6d49c01c1f 100644 --- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-static +++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-static @@ -18,3 +18,4 @@ IPV6ADDR=dead:beaf::1 IPV6ADDR_SECONDARIES="dead:beaf::2/56" DNS3=1:2:3:4::a DNS4=1:2:3:4::b +RES_OPTIONS= diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-static-bootproto b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-static-bootproto index ee821503e2..a01f655833 100644 --- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-static-bootproto +++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-static-bootproto @@ -13,3 +13,4 @@ DNS2=4.2.2.2 IPADDR=192.168.1.5 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 +RES_OPTIONS= 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 77021d69a6..350ea534fc 100644 --- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -484,6 +484,9 @@ test_read_wired_static (const char *file, g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_MANUAL); g_assert (nm_setting_ip_config_get_may_fail (s_ip4)); + g_assert (nm_setting_ip_config_has_dns_options (s_ip4)); + g_assert_cmpint (nm_setting_ip_config_get_num_dns_options (s_ip4), ==, 0); + /* DNS Addresses */ g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 2); g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip4, 0), ==, "4.2.2.1"); @@ -506,6 +509,9 @@ test_read_wired_static (const char *file, g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_MANUAL); g_assert (nm_setting_ip_config_get_may_fail (s_ip6)); + g_assert (nm_setting_ip_config_has_dns_options (s_ip6)); + g_assert_cmpint (nm_setting_ip_config_get_num_dns_options (s_ip6), ==, 0); + /* DNS Addresses */ g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 2); g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip6, 0), ==, "1:2:3:4::a"); @@ -525,6 +531,7 @@ test_read_wired_static (const char *file, g_assert_cmpstr (nm_ip_address_get_address (ip6_addr), ==, "dead:beaf::2"); } else { g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_IGNORE); + g_assert (!nm_setting_ip_config_has_dns_options (s_ip6)); } g_object_unref (connection); @@ -563,6 +570,9 @@ test_read_wired_static_no_prefix (gconstpointer user_data) g_assert (s_ip4); g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_MANUAL); + g_assert (!nm_setting_ip_config_has_dns_options (s_ip4)); + g_assert_cmpint (nm_setting_ip_config_get_num_dns_options (s_ip4), ==, 0); + g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip4), ==, 1); ip4_addr = nm_setting_ip_config_get_address (s_ip4, 0); g_assert (ip4_addr); diff --git a/src/settings/plugins/ifcfg-rh/writer.c b/src/settings/plugins/ifcfg-rh/writer.c index 9924eb0f06..e432d1b95e 100644 --- a/src/settings/plugins/ifcfg-rh/writer.c +++ b/src/settings/plugins/ifcfg-rh/writer.c @@ -2506,14 +2506,16 @@ write_res_options (NMConnection *connection, shvarFile *ifcfg, GError **error) } } - if (array->len > 0) { + if (array->len > 0 + || (s_ip4 && nm_setting_ip_config_has_dns_options (s_ip4)) + || (s_ip6 && nm_setting_ip_config_has_dns_options (s_ip6))) { value = g_string_new (NULL); for (i = 0; i < array->len; i++) { if (i > 0) g_string_append_c (value, ' '); g_string_append (value, array->pdata[i]); } - svSetValue (ifcfg, "RES_OPTIONS", value->str, FALSE); + svSetValueFull (ifcfg, "RES_OPTIONS", value->str, FALSE); g_string_free (value, TRUE); } else svSetValue (ifcfg, "RES_OPTIONS", NULL, FALSE); From 8a14851f93211baaa040a40d5dadfa1e3eb4f1e2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 21 May 2015 13:00:40 +0200 Subject: [PATCH 10/15] cli: refactor property to string conversion Instead of having a get_func() and out2in_func(), have only one get_func() that accepts an argument of the output format. This way, a conversion to parsable input format, doesn't have to go first thourgh get_func() and mangle the pretty string in out2in_func(). This fixes conversions via nmc_property_out2in_cut_paren(). For example, nmc_property_802_1X_get_private_key_password_flags() would return a localized string _("0 (none)"). There is no guarantee that out2in_func() would find the expected output format after localizing. This also fixes nmc_property_out2in_routes() which expected a format "dst =" (would be "ip =") and expects mandatory 'nh' and 'mt' arguments. In fact, the regex didn't match and nmc_property_out2in_routes() always failed. While at it, also combine the implementation of nmc_property_ipv4_get_routes() and nmc_property_ipv6_get_routes(). --- clients/cli/connections.c | 2 +- clients/cli/settings.c | 686 ++++++++++++++++++-------------------- clients/cli/settings.h | 6 +- 3 files changed, 321 insertions(+), 373 deletions(-) diff --git a/clients/cli/connections.c b/clients/cli/connections.c index 89225f34f8..28c7cd6006 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -7357,7 +7357,7 @@ property_edit_submenu (NmCli *nmc, case NMC_EDITOR_SUB_CMD_CHANGE: rl_startup_hook = nmc_rl_set_deftext; - nmc_rl_pre_input_deftext = nmc_setting_get_property_out2in (curr_setting, prop_name, NULL); + nmc_rl_pre_input_deftext = nmc_setting_get_property_parsable (curr_setting, prop_name, NULL); prop_val_user = nmc_readline (_("Edit '%s' value: "), prop_name); nmc_property_get_gvalue (curr_setting, prop_name, &prop_g_value); diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 8ae1b7f7c3..963d5f878c 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -34,6 +34,11 @@ /* Forward declarations */ static char *wep_key_type_to_string (NMWepKeyType type); +typedef enum { + NMC_PROPERTY_GET_PRETTY, + NMC_PROPERTY_GET_PARSABLE, +} NmcPropertyGetType; + /* Helper macro to define fields */ #define SETTING_FIELD(setting, width) { setting, N_(setting), width, NULL, FALSE, FALSE, 0 } @@ -752,8 +757,11 @@ vlan_priorities_to_string (NMSettingVlan *s_vlan, NMVlanPriorityMap map) } static char * -ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy) +ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy, NmcPropertyGetType get_type) { + if (get_type == NMC_PROPERTY_GET_PARSABLE) + return g_strdup_printf ("%d", ip6_privacy); + switch (ip6_privacy) { case NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED: return g_strdup_printf (_("%d (disabled)"), ip6_privacy); @@ -767,15 +775,18 @@ ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy) } static char * -secret_flags_to_string (guint32 flags) +secret_flags_to_string (guint32 flags, NmcPropertyGetType get_type) { GString *flag_str; + if (get_type == NMC_PROPERTY_GET_PARSABLE) + return g_strdup_printf ("%u", flags); + if (flags == 0) return g_strdup (_("0 (none)")); flag_str = g_string_new (NULL); - g_string_printf (flag_str, "%d (", flags); + g_string_printf (flag_str, "%u (", flags); if (flags & NM_SETTING_SECRET_FLAG_AGENT_OWNED) g_string_append (flag_str, _("agent-owned, ")); @@ -809,7 +820,7 @@ vpn_data_item (const char *key, const char *value, gpointer user_data) /* === property get functions === */ #define DEFINE_GETTER(func_name, property_name) \ static char * \ - func_name (NMSetting *setting) \ + func_name (NMSetting *setting, NmcPropertyGetType get_type) \ { \ char *s; \ GValue val = G_VALUE_INIT; \ @@ -822,7 +833,7 @@ vpn_data_item (const char *key, const char *value, gpointer user_data) #define DEFINE_SECRET_FLAGS_GETTER(func_name, property_name) \ static char * \ - func_name (NMSetting *setting) \ + func_name (NMSetting *setting, NmcPropertyGetType get_type) \ { \ guint v; \ GValue val = G_VALUE_INIT; \ @@ -830,7 +841,7 @@ vpn_data_item (const char *key, const char *value, gpointer user_data) g_object_get_property (G_OBJECT (setting), property_name, &val); \ v = g_value_get_uint (&val); \ g_value_unset (&val); \ - return secret_flags_to_string (v); \ + return secret_flags_to_string (v, get_type); \ } /* --- NM_SETTING_802_1X_SETTING_NAME property get functions --- */ @@ -861,7 +872,7 @@ DEFINE_SECRET_FLAGS_GETTER (nmc_property_802_1X_get_pin_flags, NM_SETTING_802_1X DEFINE_GETTER (nmc_property_802_1X_get_system_ca_certs, NM_SETTING_802_1X_SYSTEM_CA_CERTS) static char * -nmc_property_802_1X_get_ca_cert (NMSetting *setting) +nmc_property_802_1X_get_ca_cert (NMSetting *setting, NmcPropertyGetType get_type) { NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting); NMSetting8021xCKScheme scheme; @@ -877,7 +888,7 @@ nmc_property_802_1X_get_ca_cert (NMSetting *setting) } static char * -nmc_property_802_1X_get_client_cert (NMSetting *setting) +nmc_property_802_1X_get_client_cert (NMSetting *setting, NmcPropertyGetType get_type) { NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting); NMSetting8021xCKScheme scheme; @@ -893,7 +904,7 @@ nmc_property_802_1X_get_client_cert (NMSetting *setting) } static char * -nmc_property_802_1X_get_phase2_ca_cert (NMSetting *setting) +nmc_property_802_1X_get_phase2_ca_cert (NMSetting *setting, NmcPropertyGetType get_type) { NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting); NMSetting8021xCKScheme scheme; @@ -909,7 +920,7 @@ nmc_property_802_1X_get_phase2_ca_cert (NMSetting *setting) } static char * -nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting) +nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting, NmcPropertyGetType get_type) { NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting); NMSetting8021xCKScheme scheme; @@ -925,14 +936,14 @@ nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting) } static char * -nmc_property_802_1X_get_password_raw (NMSetting *setting) +nmc_property_802_1X_get_password_raw (NMSetting *setting, NmcPropertyGetType get_type) { NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting); return bytes_to_string (nm_setting_802_1x_get_password_raw (s_8021X)); } static char * -nmc_property_802_1X_get_private_key (NMSetting *setting) +nmc_property_802_1X_get_private_key (NMSetting *setting, NmcPropertyGetType get_type) { NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting); NMSetting8021xCKScheme scheme; @@ -948,7 +959,7 @@ nmc_property_802_1X_get_private_key (NMSetting *setting) } static char * -nmc_property_802_1X_get_phase2_private_key (NMSetting *setting) +nmc_property_802_1X_get_phase2_private_key (NMSetting *setting, NmcPropertyGetType get_type) { NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting); NMSetting8021xCKScheme scheme; @@ -977,7 +988,7 @@ DEFINE_GETTER (nmc_property_bluetooth_get_bdaddr, NM_SETTING_BLUETOOTH_BDADDR) DEFINE_GETTER (nmc_property_bluetooth_get_type, NM_SETTING_BLUETOOTH_TYPE) static char * -nmc_property_bond_get_options (NMSetting *setting) +nmc_property_bond_get_options (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingBond *s_bond = NM_SETTING_BOND (setting); GString *bond_options_s; @@ -1034,7 +1045,7 @@ DEFINE_GETTER (nmc_property_connection_get_timestamp, NM_SETTING_CONNECTION_TIME DEFINE_GETTER (nmc_property_connection_get_read_only, NM_SETTING_CONNECTION_READ_ONLY) static char * -nmc_property_connection_get_permissions (NMSetting *setting) +nmc_property_connection_get_permissions (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingConnection *s_con = NM_SETTING_CONNECTION (setting); GString *perm = NULL; @@ -1090,7 +1101,7 @@ dcb_flags_to_string (NMSettingDcbFlags flags) #define DEFINE_DCB_FLAGS_GETTER(func_name, property_name) \ static char * \ - func_name (NMSetting *setting) \ + func_name (NMSetting *setting, NmcPropertyGetType get_type) \ { \ guint v; \ GValue val = G_VALUE_INIT; \ @@ -1109,7 +1120,7 @@ dcb_app_priority_to_string (gint priority) #define DEFINE_DCB_APP_PRIORITY_GETTER(func_name, property_name) \ static char * \ - func_name (NMSetting *setting) \ + func_name (NMSetting *setting, NmcPropertyGetType get_type) \ { \ int v; \ GValue val = G_VALUE_INIT; \ @@ -1122,7 +1133,7 @@ dcb_app_priority_to_string (gint priority) #define DEFINE_DCB_BOOL_GETTER(func_name, getter_func_name) \ static char * \ - func_name (NMSetting *setting) \ + func_name (NMSetting *setting, NmcPropertyGetType get_type) \ { \ NMSettingDcb *s_dcb = NM_SETTING_DCB (setting); \ GString *str; \ @@ -1144,7 +1155,7 @@ dcb_app_priority_to_string (gint priority) #define DEFINE_DCB_UINT_GETTER(func_name, getter_func_name) \ static char * \ - func_name (NMSetting *setting) \ + func_name (NMSetting *setting, NmcPropertyGetType get_type) \ { \ NMSettingDcb *s_dcb = NM_SETTING_DCB (setting); \ GString *str; \ @@ -1194,7 +1205,7 @@ DEFINE_GETTER (nmc_property_ib_get_mac_address, NM_SETTING_INFINIBAND_MAC_ADDRES DEFINE_GETTER (nmc_property_ib_get_transport_mode, NM_SETTING_INFINIBAND_TRANSPORT_MODE) static char * -nmc_property_ib_get_mtu (NMSetting *setting) +nmc_property_ib_get_mtu (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingInfiniband *s_infiniband = NM_SETTING_INFINIBAND (setting); int mtu; @@ -1207,7 +1218,7 @@ nmc_property_ib_get_mtu (NMSetting *setting) } static char * -nmc_property_ib_get_p_key (NMSetting *setting) +nmc_property_ib_get_p_key (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingInfiniband *s_infiniband = NM_SETTING_INFINIBAND (setting); int p_key; @@ -1228,7 +1239,7 @@ DEFINE_GETTER (nmc_property_ipv4_get_dns_search, NM_SETTING_IP_CONFIG_DNS_SEARCH DEFINE_GETTER (nmc_property_ipv4_get_dns_options, NM_SETTING_IP_CONFIG_DNS_OPTIONS) static char * -nmc_property_ip_get_addresses (NMSetting *setting) +nmc_property_ip_get_addresses (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingIPConfig *s_ip = NM_SETTING_IP_CONFIG (setting); GString *printable; @@ -1253,42 +1264,62 @@ nmc_property_ip_get_addresses (NMSetting *setting) } static char * -nmc_property_ipv4_get_routes (NMSetting *setting) +nmc_property_ipvx_get_routes (NMSetting *setting, NmcPropertyGetType get_type) { - NMSettingIPConfig *s_ip4 = NM_SETTING_IP_CONFIG (setting); + NMSettingIPConfig *s_ip = NM_SETTING_IP_CONFIG (setting); GString *printable; guint32 num_routes, i; NMIPRoute *route; printable = g_string_new (NULL); - num_routes = nm_setting_ip_config_get_num_routes (s_ip4); + num_routes = nm_setting_ip_config_get_num_routes (s_ip); for (i = 0; i < num_routes; i++) { - route = nm_setting_ip_config_get_route (s_ip4, i); + route = nm_setting_ip_config_get_route (s_ip, i); - if (printable->len > 0) - g_string_append (printable, "; "); + if (get_type == NMC_PROPERTY_GET_PARSABLE) { + if (printable->len > 0) + g_string_append (printable, ", "); - g_string_append (printable, "{ "); + g_string_append_printf (printable, "%s/%u", + nm_ip_route_get_dest (route), + nm_ip_route_get_prefix (route)); - g_string_append_printf (printable, "ip = %s/%u", - nm_ip_route_get_dest (route), - nm_ip_route_get_prefix (route)); + if (nm_ip_route_get_next_hop (route)) + g_string_append_printf (printable, " %s", nm_ip_route_get_next_hop (route)); + if (nm_ip_route_get_metric (route) != -1) + g_string_append_printf (printable, " %u", (guint32) nm_ip_route_get_metric (route)); + } else { + if (printable->len > 0) + g_string_append (printable, "; "); - if (nm_ip_route_get_next_hop (route)) { - g_string_append_printf (printable, ", nh = %s", - nm_ip_route_get_next_hop (route)); + g_string_append (printable, "{ "); + + g_string_append_printf (printable, "ip = %s/%u", + nm_ip_route_get_dest (route), + nm_ip_route_get_prefix (route)); + + if (nm_ip_route_get_next_hop (route)) { + g_string_append_printf (printable, ", nh = %s", + nm_ip_route_get_next_hop (route)); + } + + if (nm_ip_route_get_metric (route) != -1) + g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route)); + + g_string_append (printable, " }"); } - - if (nm_ip_route_get_metric (route) != -1) - g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route)); - - g_string_append (printable, " }"); } return g_string_free (printable, FALSE); } +static char * +nmc_property_ipv4_get_routes (NMSetting *setting, NmcPropertyGetType get_type) +{ + return nmc_property_ipvx_get_routes (setting, get_type); +} + DEFINE_GETTER (nmc_property_ipv4_get_gateway, NM_SETTING_IP_CONFIG_GATEWAY) DEFINE_GETTER (nmc_property_ipv4_get_route_metric, NM_SETTING_IP_CONFIG_ROUTE_METRIC) DEFINE_GETTER (nmc_property_ipv4_get_ignore_auto_routes, NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES) @@ -1306,40 +1337,9 @@ DEFINE_GETTER (nmc_property_ipv6_get_dns_search, NM_SETTING_IP_CONFIG_DNS_SEARCH DEFINE_GETTER (nmc_property_ipv6_get_dns_options, NM_SETTING_IP_CONFIG_DNS_OPTIONS) static char * -nmc_property_ipv6_get_routes (NMSetting *setting) +nmc_property_ipv6_get_routes (NMSetting *setting, NmcPropertyGetType get_type) { - NMSettingIPConfig *s_ip6 = NM_SETTING_IP_CONFIG (setting); - GString *printable; - guint32 num_routes, i; - NMIPRoute *route; - - printable = g_string_new (NULL); - - num_routes = nm_setting_ip_config_get_num_routes (s_ip6); - for (i = 0; i < num_routes; i++) { - route = nm_setting_ip_config_get_route (s_ip6, i); - - if (printable->len > 0) - g_string_append (printable, "; "); - - g_string_append (printable, "{ "); - - g_string_append_printf (printable, "ip = %s/%u", - nm_ip_route_get_dest (route), - nm_ip_route_get_prefix (route)); - - if (nm_ip_route_get_next_hop (route)) { - g_string_append_printf (printable, ", nh = %s", - nm_ip_route_get_next_hop (route)); - } - - if (nm_ip_route_get_metric (route) != -1) - g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route)); - - g_string_append (printable, " }"); - } - - return g_string_free (printable, FALSE); + return nmc_property_ipvx_get_routes (setting, get_type); } DEFINE_GETTER (nmc_property_ipv6_get_gateway, NM_SETTING_IP_CONFIG_GATEWAY) @@ -1352,10 +1352,10 @@ DEFINE_GETTER (nmc_property_ipv6_get_dhcp_send_hostname, NM_SETTING_IP_CONFIG_DH DEFINE_GETTER (nmc_property_ipv6_get_dhcp_hostname, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME) static char * -nmc_property_ipv6_get_ip6_privacy (NMSetting *setting) +nmc_property_ipv6_get_ip6_privacy (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingIP6Config *s_ip6 = NM_SETTING_IP6_CONFIG (setting); - return ip6_privacy_to_string (nm_setting_ip6_config_get_ip6_privacy (s_ip6)); + return ip6_privacy_to_string (nm_setting_ip6_config_get_ip6_privacy (s_ip6), get_type); } /* --- NM_SETTING_OLPC_MESH_SETTING_NAME property get functions --- */ @@ -1363,7 +1363,7 @@ DEFINE_GETTER (nmc_property_olpc_get_channel, NM_SETTING_OLPC_MESH_CHANNEL) DEFINE_GETTER (nmc_property_olpc_get_anycast_address, NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS) static char * -nmc_property_olpc_get_ssid (NMSetting *setting) +nmc_property_olpc_get_ssid (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingOlpcMesh *s_olpc_mesh = NM_SETTING_OLPC_MESH (setting); GBytes *ssid; @@ -1416,21 +1416,21 @@ DEFINE_GETTER (nmc_property_vlan_get_id, NM_SETTING_VLAN_ID) static char * -nmc_property_vlan_get_flags (NMSetting *setting) +nmc_property_vlan_get_flags (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingVlan *s_vlan = NM_SETTING_VLAN (setting); return vlan_flags_to_string (nm_setting_vlan_get_flags (s_vlan)); } static char * -nmc_property_vlan_get_ingress_priority_map (NMSetting *setting) +nmc_property_vlan_get_ingress_priority_map (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingVlan *s_vlan = NM_SETTING_VLAN (setting); return vlan_priorities_to_string (s_vlan, NM_VLAN_INGRESS_MAP); } static char * -nmc_property_vlan_get_egress_priority_map (NMSetting *setting) +nmc_property_vlan_get_egress_priority_map (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingVlan *s_vlan = NM_SETTING_VLAN (setting); return vlan_priorities_to_string (s_vlan, NM_VLAN_EGRESS_MAP); @@ -1441,7 +1441,7 @@ DEFINE_GETTER (nmc_property_vpn_get_service_type, NM_SETTING_VPN_SERVICE_TYPE) DEFINE_GETTER (nmc_property_vpn_get_user_name, NM_SETTING_VPN_USER_NAME) static char * -nmc_property_vpn_get_data (NMSetting *setting) +nmc_property_vpn_get_data (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingVpn *s_vpn = NM_SETTING_VPN (setting); GString *data_item_str; @@ -1453,7 +1453,7 @@ nmc_property_vpn_get_data (NMSetting *setting) } static char * -nmc_property_vpn_get_secrets (NMSetting *setting) +nmc_property_vpn_get_secrets (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingVpn *s_vpn = NM_SETTING_VPN (setting); GString *secret_str; @@ -1483,7 +1483,7 @@ DEFINE_GETTER (nmc_property_wired_get_s390_nettype, NM_SETTING_WIRED_S390_NETTYP DEFINE_GETTER (nmc_property_wired_get_s390_options, NM_SETTING_WIRED_S390_OPTIONS) static char * -nmc_property_wired_get_mtu (NMSetting *setting) +nmc_property_wired_get_mtu (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingWired *s_wired = NM_SETTING_WIRED (setting); int mtu; @@ -1509,7 +1509,7 @@ DEFINE_GETTER (nmc_property_wireless_get_seen_bssids, NM_SETTING_WIRELESS_SEEN_B DEFINE_GETTER (nmc_property_wireless_get_hidden, NM_SETTING_WIRELESS_HIDDEN) static char * -nmc_property_wireless_get_ssid (NMSetting *setting) +nmc_property_wireless_get_ssid (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (setting); GBytes *ssid; @@ -1525,7 +1525,7 @@ nmc_property_wireless_get_ssid (NMSetting *setting) } static char * -nmc_property_wireless_get_mtu (NMSetting *setting) +nmc_property_wireless_get_mtu (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (setting); int mtu; @@ -1538,7 +1538,7 @@ nmc_property_wireless_get_mtu (NMSetting *setting) } static char * -nmc_property_wireless_get_powersave (NMSetting *setting) +nmc_property_wireless_get_powersave (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (setting); guint powersave = nm_setting_wireless_get_powersave (s_wireless); @@ -1566,35 +1566,35 @@ DEFINE_GETTER (nmc_property_wifi_sec_get_leap_password, NM_SETTING_WIRELESS_SECU DEFINE_SECRET_FLAGS_GETTER (nmc_property_wifi_sec_get_leap_password_flags, NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS) static char * -nmc_property_wifi_sec_get_wep_key0 (NMSetting *setting) +nmc_property_wifi_sec_get_wep_key0 (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting); return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 0)); } static char * -nmc_property_wifi_sec_get_wep_key1 (NMSetting *setting) +nmc_property_wifi_sec_get_wep_key1 (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting); return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 1)); } static char * -nmc_property_wifi_sec_get_wep_key2 (NMSetting *setting) +nmc_property_wifi_sec_get_wep_key2 (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting); return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 2)); } static char * -nmc_property_wifi_sec_get_wep_key3 (NMSetting *setting) +nmc_property_wifi_sec_get_wep_key3 (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting); return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 3)); } static char * -nmc_property_wifi_sec_get_wep_key_type (NMSetting *setting) +nmc_property_wifi_sec_get_wep_key_type (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting); return wep_key_type_to_string (nm_setting_wireless_security_get_wep_key_type (s_wireless_sec)); @@ -1627,12 +1627,11 @@ register_nmcli_value_transforms (void) /* Main hash table storing function pointer for manipulating properties */ static GHashTable *nmc_properties = NULL; -typedef char * (*NmcPropertyGetFunc) (NMSetting *); +typedef char * (*NmcPropertyGetFunc) (NMSetting *, NmcPropertyGetType); typedef gboolean (*NmcPropertySetFunc) (NMSetting *, const char *, const char *, GError **); typedef gboolean (*NmcPropertyRemoveFunc) (NMSetting *, const char *, const char *, guint32, GError **); typedef const char * (*NmcPropertyDescribeFunc) (NMSetting *, const char *); typedef const char ** (*NmcPropertyValuesFunc) (NMSetting *, const char *); -typedef char * (*NmcPropertyOut2InFunc) (const char *); typedef struct { NmcPropertyGetFunc get_func; /* func getting property values */ @@ -1640,7 +1639,6 @@ typedef struct { NmcPropertyRemoveFunc remove_func; /* func removing items from container options */ NmcPropertyDescribeFunc describe_func; /* func returning property description */ NmcPropertyValuesFunc values_func; /* func returning allowed property values */ - NmcPropertyOut2InFunc out2in_func; /* func converting property values from output to input format */ } NmcPropertyFuncs; /* @@ -2435,17 +2433,6 @@ done: return TRUE; \ } -static char * -nmc_property_out2in_cut_paren (const char *out_format) -{ - const char *p; - size_t n; - - p = strstr (out_format, " ("); - n = p ? p - out_format : strlen (out_format); - return g_strndup (out_format, n); -} - /* --- NM_SETTING_CONNECTION_SETTING_NAME property setter functions --- */ #if 0 /* @@ -3480,37 +3467,6 @@ nmc_property_ipv4_describe_routes (NMSetting *setting, const char *prop) " 10.1.2.0/24\n"); } -static char * -nmc_property_out2in_routes (const char *out_format) -{ - GRegex *regex; - GString *str; - char **strv; - int i; - - str = g_string_sized_new (128); - regex = g_regex_new ("\\{ dst = ([^/]+)/([^,]+), nh = ([^,]+), mt = ([^ ]+) \\}", 0, 0, NULL); - - strv = g_regex_split (regex, out_format, 0); - for (i = 1; strv && strv[i] && strv[i+1] && strv[i+2] && strv[i+3]; i=i+5) { - g_string_append (str, strv[i]); /* IP */ - g_string_append_c (str, '/'); - g_string_append (str, strv[i+1]); /* prefix */ - g_string_append_c (str, ' '); - g_string_append (str, strv[i+2]); /* next hop */ - g_string_append_c (str, ' '); - g_string_append (str, strv[i+3]); /* metric */ - g_string_append (str, ", "); - } - if (str->len > 0) - g_string_truncate (str, str->len - 2); - - g_strfreev (strv); - g_regex_unref (regex); - - return g_string_free (str, FALSE); -} - /* --- NM_SETTING_IP6_CONFIG_SETTING_NAME property setter functions --- */ /* 'method' */ static const char *ipv6_valid_methods[] = { @@ -3865,7 +3821,7 @@ nmc_property_olpc_set_channel (NMSetting *setting, const char *prop, const char /* --- NM_SETTING_SERIAL_SETTING_NAME property setter functions --- */ static char * -nmc_property_serial_get_parity (NMSetting *setting) +nmc_property_serial_get_parity (NMSetting *setting, NmcPropertyGetType get_type) { NMSettingSerial *s_serial = NM_SETTING_SERIAL (setting); @@ -4838,7 +4794,7 @@ nmc_add_prop_funcs (char *key, NmcPropertyRemoveFunc remove_func, NmcPropertyDescribeFunc describe_func, NmcPropertyValuesFunc values_func, - NmcPropertyOut2InFunc out2in_func) + gpointer dummy) { NmcPropertyFuncs *item = g_malloc0 (sizeof (NmcPropertyFuncs)); item->get_func = get_func; @@ -4846,7 +4802,6 @@ nmc_add_prop_funcs (char *key, item->remove_func = remove_func; item->describe_func = describe_func; item->values_func = values_func; - item->out2in_func = out2in_func; g_hash_table_insert (nmc_properties, key, item); } @@ -5011,7 +4966,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE (802_1X, PASSWORD_RAW), nmc_property_802_1X_get_password_raw, nmc_property_802_1X_set_password_raw, @@ -5025,7 +4980,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE (802_1X, PRIVATE_KEY), nmc_property_802_1X_get_private_key, nmc_property_802_1X_set_private_key, @@ -5046,7 +5001,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE (802_1X, PHASE2_PRIVATE_KEY), nmc_property_802_1X_get_phase2_private_key, nmc_property_802_1X_set_phase2_private_key, @@ -5067,7 +5022,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE (802_1X, PIN), nmc_property_802_1X_get_pin, nmc_property_set_string, @@ -5081,7 +5036,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE (802_1X, SYSTEM_CA_CERTS), nmc_property_802_1X_get_system_ca_certs, nmc_property_set_bool, @@ -5111,7 +5066,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE (ADSL, PROTOCOL), nmc_property_adsl_get_protocol, nmc_property_adsl_set_protocol, @@ -5276,7 +5231,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); /* Add editable properties for NM_SETTING_CONNECTION_SETTING_NAME */ nmc_add_prop_funcs (GLUE (CONNECTION, ID), @@ -5513,7 +5468,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE (GSM, APN), nmc_property_gsm_get_apn, nmc_property_set_string, @@ -5541,7 +5496,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE (GSM, HOME_ONLY), nmc_property_gsm_get_home_only, nmc_property_set_bool, @@ -5636,7 +5591,7 @@ nmc_properties_init (void) nmc_property_ipv4_remove_routes, nmc_property_ipv4_describe_routes, NULL, - nmc_property_out2in_routes); + NULL); nmc_add_prop_funcs (GLUE_IP (4, ROUTE_METRIC), nmc_property_ipv4_get_route_metric, nmc_property_set_int64, @@ -5743,7 +5698,7 @@ nmc_properties_init (void) nmc_property_ipv6_remove_routes, nmc_property_ipv6_describe_routes, NULL, - nmc_property_out2in_routes); + NULL); nmc_add_prop_funcs (GLUE_IP (6, ROUTE_METRIC), nmc_property_ipv6_get_route_metric, nmc_property_set_int64, @@ -5785,7 +5740,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE_IP (6, DHCP_SEND_HOSTNAME), nmc_property_ipv6_get_dhcp_send_hostname, nmc_property_set_bool, @@ -5980,7 +5935,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); /* Add editable properties for NM_SETTING_SERIAL_SETTING_NAME */ nmc_add_prop_funcs (GLUE (SERIAL, BAUD), @@ -6394,7 +6349,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE (WIRELESS_SECURITY, WEP_KEY_TYPE), nmc_property_wifi_sec_get_wep_key_type, nmc_property_wifi_set_wep_key_type, @@ -6415,7 +6370,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); nmc_add_prop_funcs (GLUE (WIRELESS_SECURITY, LEAP_PASSWORD), nmc_property_wifi_sec_get_leap_password, nmc_property_set_string, @@ -6429,7 +6384,7 @@ nmc_properties_init (void) NULL, NULL, NULL, - nmc_property_out2in_cut_paren); + NULL); } void @@ -6456,7 +6411,7 @@ nmc_properties_find (const char *s_name, const char *p_name) } static char * -get_property_val (NMSetting *setting, const char *prop, gboolean convert, GError **error) +get_property_val (NMSetting *setting, const char *prop, NmcPropertyGetType get_type, GError **error) { const NmcPropertyFuncs *item; @@ -6464,15 +6419,8 @@ get_property_val (NMSetting *setting, const char *prop, gboolean convert, GError g_return_val_if_fail (error == NULL || *error == NULL, FALSE); item = nmc_properties_find (nm_setting_get_name (setting), prop); - if (item && item->get_func) { - char *prop_val = item->get_func (setting); - if (convert && item->out2in_func) { - char *converted = item->out2in_func (prop_val); - g_free (prop_val); - return converted; - } else - return prop_val; - } + if (item && item->get_func) + return item->get_func (setting, get_type); g_set_error_literal (error, 1, 0, _("don't know how to get the property value")); return NULL; @@ -6488,17 +6436,17 @@ get_property_val (NMSetting *setting, const char *prop, gboolean convert, GError char * nmc_setting_get_property (NMSetting *setting, const char *prop, GError **error) { - return get_property_val (setting, prop, FALSE, error); + return get_property_val (setting, prop, NMC_PROPERTY_GET_PRETTY, error); } /* - * The same as nmc_setting_get_property(), but in addition converts - * usual output format into a simpler one, used as input in the editor. + * Similar to nmc_setting_get_property(), but returns the property in a string + * format that can be parsed via nmc_setting_set_property(). */ char * -nmc_setting_get_property_out2in (NMSetting *setting, const char *prop, GError **error) +nmc_setting_get_property_parsable (NMSetting *setting, const char *prop, GError **error) { - return get_property_val (setting, prop, TRUE, error); + return get_property_val (setting, prop, NMC_PROPERTY_GET_PARSABLE, error); } /* @@ -6730,7 +6678,7 @@ nmc_property_set_gvalue (NMSetting *setting, const char *prop, GValue *value) /*----------------------------------------------------------------------------*/ #define GET_SECRET(show, setting, func) \ - (show ? func (setting) : g_strdup (_(""))) + (show ? func (setting, NMC_PROPERTY_GET_PRETTY) : g_strdup (_(""))) static gboolean setting_connection_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboolean secrets) @@ -6750,20 +6698,20 @@ setting_connection_details (NMSetting *setting, NmCli *nmc, const char *one_pro arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_connection_get_id (setting)); - set_val_str (arr, 2, nmc_property_connection_get_uuid (setting)); - set_val_str (arr, 3, nmc_property_connection_get_interface_name (setting)); - set_val_str (arr, 4, nmc_property_connection_get_type (setting)); - set_val_str (arr, 5, nmc_property_connection_get_autoconnect (setting)); - set_val_str (arr, 6, nmc_property_connection_get_autoconnect_priority (setting)); - set_val_str (arr, 7, nmc_property_connection_get_timestamp (setting)); - set_val_str (arr, 8, nmc_property_connection_get_read_only (setting)); - set_val_str (arr, 9, nmc_property_connection_get_permissions (setting)); - set_val_str (arr, 10, nmc_property_connection_get_zone (setting)); - set_val_str (arr, 11, nmc_property_connection_get_master (setting)); - set_val_str (arr, 12, nmc_property_connection_get_slave_type (setting)); - set_val_str (arr, 13, nmc_property_connection_get_secondaries (setting)); - set_val_str (arr, 14, nmc_property_connection_get_gateway_ping_timeout (setting)); + set_val_str (arr, 1, nmc_property_connection_get_id (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_connection_get_uuid (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_connection_get_interface_name (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_connection_get_type (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_connection_get_autoconnect (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_connection_get_autoconnect_priority (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_connection_get_timestamp (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 8, nmc_property_connection_get_read_only (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 9, nmc_property_connection_get_permissions (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 10, nmc_property_connection_get_zone (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 11, nmc_property_connection_get_master (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 12, nmc_property_connection_get_slave_type (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 13, nmc_property_connection_get_secondaries (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 14, nmc_property_connection_get_gateway_ping_timeout (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -6789,17 +6737,17 @@ setting_wired_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gb arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_wired_get_port (setting)); - set_val_str (arr, 2, nmc_property_wired_get_speed (setting)); - set_val_str (arr, 3, nmc_property_wired_get_duplex (setting)); - set_val_str (arr, 4, nmc_property_wired_get_auto_negotiate (setting)); - set_val_str (arr, 5, nmc_property_wired_get_mac_address (setting)); - set_val_str (arr, 6, nmc_property_wired_get_cloned_mac_address (setting)); - set_val_str (arr, 7, nmc_property_wired_get_mac_address_blacklist (setting)); - set_val_str (arr, 8, nmc_property_wired_get_mtu (setting)); - set_val_str (arr, 9, nmc_property_wired_get_s390_subchannels (setting)); - set_val_str (arr, 10, nmc_property_wired_get_s390_nettype (setting)); - set_val_str (arr, 11, nmc_property_wired_get_s390_options (setting)); + set_val_str (arr, 1, nmc_property_wired_get_port (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_wired_get_speed (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_wired_get_duplex (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_wired_get_auto_negotiate (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_wired_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_wired_get_cloned_mac_address (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_wired_get_mac_address_blacklist (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 8, nmc_property_wired_get_mtu (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 9, nmc_property_wired_get_s390_subchannels (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 10, nmc_property_wired_get_s390_nettype (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 11, nmc_property_wired_get_s390_options (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -6825,38 +6773,38 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc, const char *one_prop, g arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_802_1X_get_eap (setting)); - set_val_str (arr, 2, nmc_property_802_1X_get_identity (setting)); - set_val_str (arr, 3, nmc_property_802_1X_get_anonymous_identity (setting)); - set_val_str (arr, 4, nmc_property_802_1X_get_pac_file (setting)); - set_val_str (arr, 5, nmc_property_802_1X_get_ca_cert (setting)); - set_val_str (arr, 6, nmc_property_802_1X_get_ca_path (setting)); - set_val_str (arr, 7, nmc_property_802_1X_get_subject_match (setting)); - set_val_str (arr, 8, nmc_property_802_1X_get_altsubject_matches (setting)); - set_val_str (arr, 9, nmc_property_802_1X_get_client_cert (setting)); - set_val_str (arr, 10, nmc_property_802_1X_get_phase1_peapver (setting)); - set_val_str (arr, 11, nmc_property_802_1X_get_phase1_peaplabel (setting)); - set_val_str (arr, 12, nmc_property_802_1X_get_phase1_fast_provisioning (setting)); - set_val_str (arr, 13, nmc_property_802_1X_get_phase2_auth (setting)); - set_val_str (arr, 14, nmc_property_802_1X_get_phase2_autheap (setting)); - set_val_str (arr, 15, nmc_property_802_1X_get_phase2_ca_cert (setting)); - set_val_str (arr, 16, nmc_property_802_1X_get_phase2_ca_path (setting)); - set_val_str (arr, 17, nmc_property_802_1X_get_phase2_subject_match (setting)); - set_val_str (arr, 18, nmc_property_802_1X_get_phase2_altsubject_matches (setting)); - set_val_str (arr, 19, nmc_property_802_1X_get_phase2_client_cert (setting)); + set_val_str (arr, 1, nmc_property_802_1X_get_eap (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_802_1X_get_identity (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_802_1X_get_anonymous_identity (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_802_1X_get_pac_file (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_802_1X_get_ca_cert (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_802_1X_get_ca_path (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_802_1X_get_subject_match (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 8, nmc_property_802_1X_get_altsubject_matches (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 9, nmc_property_802_1X_get_client_cert (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 10, nmc_property_802_1X_get_phase1_peapver (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 11, nmc_property_802_1X_get_phase1_peaplabel (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 12, nmc_property_802_1X_get_phase1_fast_provisioning (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 13, nmc_property_802_1X_get_phase2_auth (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 14, nmc_property_802_1X_get_phase2_autheap (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 15, nmc_property_802_1X_get_phase2_ca_cert (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 16, nmc_property_802_1X_get_phase2_ca_path (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 17, nmc_property_802_1X_get_phase2_subject_match (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 18, nmc_property_802_1X_get_phase2_altsubject_matches (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 19, nmc_property_802_1X_get_phase2_client_cert (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 20, GET_SECRET (secrets, setting, nmc_property_802_1X_get_password)); - set_val_str (arr, 21, nmc_property_802_1X_get_password_flags (setting)); + set_val_str (arr, 21, nmc_property_802_1X_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 22, GET_SECRET (secrets, setting, nmc_property_802_1X_get_password_raw)); - set_val_str (arr, 23, nmc_property_802_1X_get_password_raw_flags (setting)); - set_val_str (arr, 24, nmc_property_802_1X_get_private_key (setting)); + set_val_str (arr, 23, nmc_property_802_1X_get_password_raw_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 24, nmc_property_802_1X_get_private_key (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 25, GET_SECRET (secrets, setting, nmc_property_802_1X_get_private_key_password)); - set_val_str (arr, 26, nmc_property_802_1X_get_private_key_password_flags (setting)); - set_val_str (arr, 27, nmc_property_802_1X_get_phase2_private_key (setting)); + set_val_str (arr, 26, nmc_property_802_1X_get_private_key_password_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 27, nmc_property_802_1X_get_phase2_private_key (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 28, GET_SECRET (secrets, setting, nmc_property_802_1X_get_phase2_private_key_password)); - set_val_str (arr, 29, nmc_property_802_1X_get_phase2_private_key_password_flags (setting)); + set_val_str (arr, 29, nmc_property_802_1X_get_phase2_private_key_password_flags (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 30, GET_SECRET (secrets, setting, nmc_property_802_1X_get_pin)); - set_val_str (arr, 31, nmc_property_802_1X_get_pin_flags (setting)); - set_val_str (arr, 32, nmc_property_802_1X_get_system_ca_certs (setting)); + set_val_str (arr, 31, nmc_property_802_1X_get_pin_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 32, nmc_property_802_1X_get_system_ca_certs (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -6882,20 +6830,20 @@ setting_wireless_details (NMSetting *setting, NmCli *nmc, const char *one_prop, arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_wireless_get_ssid (setting)); - set_val_str (arr, 2, nmc_property_wireless_get_mode (setting)); - set_val_str (arr, 3, nmc_property_wireless_get_band (setting)); - set_val_str (arr, 4, nmc_property_wireless_get_channel (setting)); - set_val_str (arr, 5, nmc_property_wireless_get_bssid (setting)); - set_val_str (arr, 6, nmc_property_wireless_get_rate (setting)); - set_val_str (arr, 7, nmc_property_wireless_get_tx_power (setting)); - set_val_str (arr, 8, nmc_property_wireless_get_mac_address (setting)); - set_val_str (arr, 9, nmc_property_wireless_get_cloned_mac_address (setting)); - set_val_str (arr, 10, nmc_property_wireless_get_mac_address_blacklist (setting)); - set_val_str (arr, 11, nmc_property_wireless_get_mtu (setting)); - set_val_str (arr, 12, nmc_property_wireless_get_seen_bssids (setting)); - set_val_str (arr, 13, nmc_property_wireless_get_hidden (setting)); - set_val_str (arr, 14, nmc_property_wireless_get_powersave (setting)); + set_val_str (arr, 1, nmc_property_wireless_get_ssid (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_wireless_get_mode (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_wireless_get_band (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_wireless_get_channel (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_wireless_get_bssid (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_wireless_get_rate (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_wireless_get_tx_power (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 8, nmc_property_wireless_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 9, nmc_property_wireless_get_cloned_mac_address (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 10, nmc_property_wireless_get_mac_address_blacklist (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 11, nmc_property_wireless_get_mtu (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 12, nmc_property_wireless_get_seen_bssids (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 13, nmc_property_wireless_get_hidden (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 14, nmc_property_wireless_get_powersave (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -6921,23 +6869,23 @@ setting_wireless_security_details (NMSetting *setting, NmCli *nmc, const char *o arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_wifi_sec_get_key_mgmt (setting)); - set_val_str (arr, 2, nmc_property_wifi_sec_get_wep_tx_keyidx (setting)); - set_val_str (arr, 3, nmc_property_wifi_sec_get_auth_alg (setting)); - set_val_str (arr, 4, nmc_property_wifi_sec_get_proto (setting)); - set_val_str (arr, 5, nmc_property_wifi_sec_get_pairwise (setting)); - set_val_str (arr, 6, nmc_property_wifi_sec_get_group (setting)); - set_val_str (arr, 7, nmc_property_wifi_sec_get_leap_username (setting)); + set_val_str (arr, 1, nmc_property_wifi_sec_get_key_mgmt (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_wifi_sec_get_wep_tx_keyidx (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_wifi_sec_get_auth_alg (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_wifi_sec_get_proto (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_wifi_sec_get_pairwise (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_wifi_sec_get_group (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_wifi_sec_get_leap_username (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 8, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key0)); set_val_str (arr, 9, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key1)); set_val_str (arr, 10, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key2)); set_val_str (arr, 11, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key3)); - set_val_str (arr, 12, nmc_property_wifi_sec_get_wep_key_flags (setting)); - set_val_str (arr, 13, nmc_property_wifi_sec_get_wep_key_type (setting)); + set_val_str (arr, 12, nmc_property_wifi_sec_get_wep_key_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 13, nmc_property_wifi_sec_get_wep_key_type (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 14, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_psk)); - set_val_str (arr, 15, nmc_property_wifi_sec_get_psk_flags (setting)); + set_val_str (arr, 15, nmc_property_wifi_sec_get_psk_flags (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 16, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_leap_password)); - set_val_str (arr, 17, nmc_property_wifi_sec_get_leap_password_flags (setting)); + set_val_str (arr, 17, nmc_property_wifi_sec_get_leap_password_flags (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -6963,21 +6911,21 @@ setting_ip4_config_details (NMSetting *setting, NmCli *nmc, const char *one_pro arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_ipv4_get_method (setting)); - set_val_str (arr, 2, nmc_property_ipv4_get_dns (setting)); - set_val_str (arr, 3, nmc_property_ipv4_get_dns_search (setting)); - set_val_str (arr, 4, nmc_property_ipv4_get_dns_options (setting)); - set_val_str (arr, 5, nmc_property_ip_get_addresses (setting)); - set_val_str (arr, 6, nmc_property_ipv4_get_gateway (setting)); - set_val_str (arr, 7, nmc_property_ipv4_get_routes (setting)); - set_val_str (arr, 8, nmc_property_ipv4_get_route_metric (setting)); - set_val_str (arr, 9, nmc_property_ipv4_get_ignore_auto_routes (setting)); - set_val_str (arr, 10, nmc_property_ipv4_get_ignore_auto_dns (setting)); - set_val_str (arr, 11, nmc_property_ipv4_get_dhcp_client_id (setting)); - set_val_str (arr, 12, nmc_property_ipv4_get_dhcp_send_hostname (setting)); - set_val_str (arr, 13, nmc_property_ipv4_get_dhcp_hostname (setting)); - set_val_str (arr, 14, nmc_property_ipv4_get_never_default (setting)); - set_val_str (arr, 15, nmc_property_ipv4_get_may_fail (setting)); + set_val_str (arr, 1, nmc_property_ipv4_get_method (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_ipv4_get_dns (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_ipv4_get_dns_search (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_ipv4_get_dns_options (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_ipv4_get_gateway (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_ipv4_get_routes (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 8, nmc_property_ipv4_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 9, nmc_property_ipv4_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 10, nmc_property_ipv4_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 11, nmc_property_ipv4_get_dhcp_client_id (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 12, nmc_property_ipv4_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 13, nmc_property_ipv4_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 14, nmc_property_ipv4_get_never_default (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 15, nmc_property_ipv4_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7003,21 +6951,21 @@ setting_ip6_config_details (NMSetting *setting, NmCli *nmc, const char *one_pro arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_ipv6_get_method (setting)); - set_val_str (arr, 2, nmc_property_ipv6_get_dns (setting)); - set_val_str (arr, 3, nmc_property_ipv6_get_dns_search (setting)); - set_val_str (arr, 4, nmc_property_ipv6_get_dns_options (setting)); - set_val_str (arr, 5, nmc_property_ip_get_addresses (setting)); - set_val_str (arr, 6, nmc_property_ipv6_get_gateway (setting)); - set_val_str (arr, 7, nmc_property_ipv6_get_routes (setting)); - set_val_str (arr, 8, nmc_property_ipv6_get_route_metric (setting)); - set_val_str (arr, 9, nmc_property_ipv6_get_ignore_auto_routes (setting)); - set_val_str (arr, 10, nmc_property_ipv6_get_ignore_auto_dns (setting)); - set_val_str (arr, 11, nmc_property_ipv6_get_never_default (setting)); - set_val_str (arr, 12, nmc_property_ipv6_get_may_fail (setting)); - set_val_str (arr, 13, nmc_property_ipv6_get_ip6_privacy (setting)); - set_val_str (arr, 14, nmc_property_ipv6_get_dhcp_send_hostname (setting)); - set_val_str (arr, 15, nmc_property_ipv6_get_dhcp_hostname (setting)); + set_val_str (arr, 1, nmc_property_ipv6_get_method (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_ipv6_get_dns (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_ipv6_get_dns_search (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_ipv6_get_dns_options (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_ipv6_get_gateway (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_ipv6_get_routes (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 8, nmc_property_ipv6_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 9, nmc_property_ipv6_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 10, nmc_property_ipv6_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 11, nmc_property_ipv6_get_never_default (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 12, nmc_property_ipv6_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 13, nmc_property_ipv6_get_ip6_privacy (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 14, nmc_property_ipv6_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 15, nmc_property_ipv6_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7043,11 +6991,11 @@ setting_serial_details (NMSetting *setting, NmCli *nmc, const char *one_prop, g arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_serial_get_baud (setting)); - set_val_str (arr, 2, nmc_property_serial_get_bits (setting)); - set_val_str (arr, 3, nmc_property_serial_get_parity (setting)); - set_val_str (arr, 4, nmc_property_serial_get_stopbits (setting)); - set_val_str (arr, 5, nmc_property_serial_get_send_delay (setting)); + set_val_str (arr, 1, nmc_property_serial_get_baud (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_serial_get_bits (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_serial_get_parity (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_serial_get_stopbits (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_serial_get_send_delay (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7073,24 +7021,24 @@ setting_ppp_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboo arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_ppp_get_noauth (setting)); - set_val_str (arr, 2, nmc_property_ppp_get_refuse_eap (setting)); - set_val_str (arr, 3, nmc_property_ppp_get_refuse_pap (setting)); - set_val_str (arr, 4, nmc_property_ppp_get_refuse_chap (setting)); - set_val_str (arr, 5, nmc_property_ppp_get_refuse_mschap (setting)); - set_val_str (arr, 6, nmc_property_ppp_get_refuse_mschapv2 (setting)); - set_val_str (arr, 7, nmc_property_ppp_get_nobsdcomp (setting)); - set_val_str (arr, 8, nmc_property_ppp_get_nodeflate (setting)); - set_val_str (arr, 9, nmc_property_ppp_get_no_vj_comp (setting)); - set_val_str (arr, 10, nmc_property_ppp_get_require_mppe (setting)); - set_val_str (arr, 11, nmc_property_ppp_get_require_mppe_128 (setting)); - set_val_str (arr, 12, nmc_property_ppp_get_mppe_stateful (setting)); - set_val_str (arr, 13, nmc_property_ppp_get_crtscts (setting)); - set_val_str (arr, 14, nmc_property_ppp_get_baud (setting)); - set_val_str (arr, 15, nmc_property_ppp_get_mru (setting)); - set_val_str (arr, 16, nmc_property_ppp_get_mtu (setting)); - set_val_str (arr, 17, nmc_property_ppp_get_lcp_echo_failure (setting)); - set_val_str (arr, 18, nmc_property_ppp_get_lcp_echo_interval (setting)); + set_val_str (arr, 1, nmc_property_ppp_get_noauth (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_ppp_get_refuse_eap (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_ppp_get_refuse_pap (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_ppp_get_refuse_chap (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_ppp_get_refuse_mschap (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_ppp_get_refuse_mschapv2 (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_ppp_get_nobsdcomp (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 8, nmc_property_ppp_get_nodeflate (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 9, nmc_property_ppp_get_no_vj_comp (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 10, nmc_property_ppp_get_require_mppe (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 11, nmc_property_ppp_get_require_mppe_128 (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 12, nmc_property_ppp_get_mppe_stateful (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 13, nmc_property_ppp_get_crtscts (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 14, nmc_property_ppp_get_baud (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 15, nmc_property_ppp_get_mru (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 16, nmc_property_ppp_get_mtu (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 17, nmc_property_ppp_get_lcp_echo_failure (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 18, nmc_property_ppp_get_lcp_echo_interval (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7116,10 +7064,10 @@ setting_pppoe_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gb arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_pppoe_get_service (setting)); - set_val_str (arr, 2, nmc_property_pppoe_get_username (setting)); + set_val_str (arr, 1, nmc_property_pppoe_get_service (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_pppoe_get_username (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 3, GET_SECRET (secrets, setting, nmc_property_pppoe_get_password)); - set_val_str (arr, 4, nmc_property_pppoe_get_password_flags (setting)); + set_val_str (arr, 4, nmc_property_pppoe_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7145,15 +7093,15 @@ setting_gsm_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboo arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_gsm_get_number (setting)); - set_val_str (arr, 2, nmc_property_gsm_get_username (setting)); + set_val_str (arr, 1, nmc_property_gsm_get_number (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_gsm_get_username (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 3, GET_SECRET (secrets, setting, nmc_property_gsm_get_password)); - set_val_str (arr, 4, nmc_property_gsm_get_password_flags (setting)); - set_val_str (arr, 5, nmc_property_gsm_get_apn (setting)); - set_val_str (arr, 6, nmc_property_gsm_get_network_id (setting)); + set_val_str (arr, 4, nmc_property_gsm_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_gsm_get_apn (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_gsm_get_network_id (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 7, GET_SECRET (secrets, setting, nmc_property_gsm_get_pin)); - set_val_str (arr, 8, nmc_property_gsm_get_pin_flags (setting)); - set_val_str (arr, 9, nmc_property_gsm_get_home_only (setting)); + set_val_str (arr, 8, nmc_property_gsm_get_pin_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 9, nmc_property_gsm_get_home_only (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7179,10 +7127,10 @@ setting_cdma_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gbo arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_cdma_get_number (setting)); - set_val_str (arr, 2, nmc_property_cdma_get_username (setting)); + set_val_str (arr, 1, nmc_property_cdma_get_number (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_cdma_get_username (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 3, GET_SECRET (secrets, setting, nmc_property_cdma_get_password)); - set_val_str (arr, 4, nmc_property_cdma_get_password_flags (setting)); + set_val_str (arr, 4, nmc_property_cdma_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7208,8 +7156,8 @@ setting_bluetooth_details (NMSetting *setting, NmCli *nmc, const char *one_prop arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_bluetooth_get_bdaddr (setting)); - set_val_str (arr, 2, nmc_property_bluetooth_get_type (setting)); + set_val_str (arr, 1, nmc_property_bluetooth_get_bdaddr (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_bluetooth_get_type (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7235,9 +7183,9 @@ setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc, const char *one_prop arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_olpc_get_ssid (setting)); - set_val_str (arr, 2, nmc_property_olpc_get_channel (setting)); - set_val_str (arr, 3, nmc_property_olpc_get_anycast_address (setting)); + set_val_str (arr, 1, nmc_property_olpc_get_ssid (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_olpc_get_channel (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_olpc_get_anycast_address (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7263,11 +7211,11 @@ setting_vpn_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboo arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_vpn_get_service_type (setting)); - set_val_str (arr, 2, nmc_property_vpn_get_user_name (setting)); - set_val_str (arr, 3, nmc_property_vpn_get_data (setting)); + set_val_str (arr, 1, nmc_property_vpn_get_service_type (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_vpn_get_user_name (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_vpn_get_data (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 4, GET_SECRET (secrets, setting, nmc_property_vpn_get_secrets)); - set_val_str (arr, 5, nmc_property_vpn_get_persistent (setting)); + set_val_str (arr, 5, nmc_property_vpn_get_persistent (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7293,8 +7241,8 @@ setting_wimax_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gb arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_wimax_get_mac_address (setting)); - set_val_str (arr, 2, nmc_property_wimax_get_network_name (setting)); + set_val_str (arr, 1, nmc_property_wimax_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_wimax_get_network_name (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7320,11 +7268,11 @@ setting_infiniband_details (NMSetting *setting, NmCli *nmc, const char *one_pro arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_ib_get_mac_address (setting)); - set_val_str (arr, 2, nmc_property_ib_get_mtu (setting)); - set_val_str (arr, 3, nmc_property_ib_get_transport_mode (setting)); - set_val_str (arr, 4, nmc_property_ib_get_p_key (setting)); - set_val_str (arr, 5, nmc_property_ib_get_parent (setting)); + set_val_str (arr, 1, nmc_property_ib_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_ib_get_mtu (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_ib_get_transport_mode (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_ib_get_p_key (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_ib_get_parent (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7350,7 +7298,7 @@ setting_bond_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gbo arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_bond_get_options (setting)); + set_val_str (arr, 1, nmc_property_bond_get_options (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7376,11 +7324,11 @@ setting_vlan_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gbo arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_vlan_get_parent (setting)); - set_val_str (arr, 2, nmc_property_vlan_get_id (setting)); - set_val_str (arr, 3, nmc_property_vlan_get_flags (setting)); - set_val_str (arr, 4, nmc_property_vlan_get_ingress_priority_map (setting)); - set_val_str (arr, 5, nmc_property_vlan_get_egress_priority_map (setting)); + set_val_str (arr, 1, nmc_property_vlan_get_parent (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_vlan_get_id (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_vlan_get_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_vlan_get_ingress_priority_map (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_vlan_get_egress_priority_map (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7406,13 +7354,13 @@ setting_adsl_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gbo arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_adsl_get_username (setting)); + set_val_str (arr, 1, nmc_property_adsl_get_username (setting, NMC_PROPERTY_GET_PRETTY)); set_val_str (arr, 2, GET_SECRET (secrets, setting, nmc_property_adsl_get_password)); - set_val_str (arr, 3, nmc_property_adsl_get_password_flags (setting)); - set_val_str (arr, 4, nmc_property_adsl_get_protocol (setting)); - set_val_str (arr, 5, nmc_property_adsl_get_encapsulation (setting)); - set_val_str (arr, 6, nmc_property_adsl_get_vpi (setting)); - set_val_str (arr, 7, nmc_property_adsl_get_vci (setting)); + set_val_str (arr, 3, nmc_property_adsl_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_adsl_get_protocol (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_adsl_get_encapsulation (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_adsl_get_vpi (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_adsl_get_vci (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7438,14 +7386,14 @@ setting_bridge_details (NMSetting *setting, NmCli *nmc, const char *one_prop, g arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_bridge_get_mac_address (setting)); - set_val_str (arr, 2, nmc_property_bridge_get_stp (setting)); - set_val_str (arr, 3, nmc_property_bridge_get_priority (setting)); - set_val_str (arr, 4, nmc_property_bridge_get_forward_delay (setting)); - set_val_str (arr, 5, nmc_property_bridge_get_hello_time (setting)); - set_val_str (arr, 6, nmc_property_bridge_get_max_age (setting)); - set_val_str (arr, 7, nmc_property_bridge_get_ageing_time (setting)); - set_val_str (arr, 8, nmc_property_bridge_get_multicast_snooping (setting)); + set_val_str (arr, 1, nmc_property_bridge_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_bridge_get_stp (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_bridge_get_priority (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_bridge_get_forward_delay (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_bridge_get_hello_time (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_bridge_get_max_age (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_bridge_get_ageing_time (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 8, nmc_property_bridge_get_multicast_snooping (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7471,9 +7419,9 @@ setting_bridge_port_details (NMSetting *setting, NmCli *nmc, const char *one_pr arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_bridge_port_get_priority (setting)); - set_val_str (arr, 2, nmc_property_bridge_port_get_path_cost (setting)); - set_val_str (arr, 3, nmc_property_bridge_port_get_hairpin_mode (setting)); + set_val_str (arr, 1, nmc_property_bridge_port_get_priority (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_bridge_port_get_path_cost (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_bridge_port_get_hairpin_mode (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7499,7 +7447,7 @@ setting_team_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gbo arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_team_get_config (setting)); + set_val_str (arr, 1, nmc_property_team_get_config (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7525,7 +7473,7 @@ setting_team_port_details (NMSetting *setting, NmCli *nmc, const char *one_prop arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_team_port_get_config (setting)); + set_val_str (arr, 1, nmc_property_team_port_get_config (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ @@ -7551,21 +7499,21 @@ setting_dcb_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboo arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting))); - set_val_str (arr, 1, nmc_property_dcb_get_app_fcoe_flags (setting)); - set_val_str (arr, 2, nmc_property_dcb_get_app_fcoe_priority (setting)); - set_val_str (arr, 3, nmc_property_dcb_get_app_fcoe_mode (setting)); - set_val_str (arr, 4, nmc_property_dcb_get_app_iscsi_flags (setting)); - set_val_str (arr, 5, nmc_property_dcb_get_app_iscsi_priority (setting)); - set_val_str (arr, 6, nmc_property_dcb_get_app_fip_flags (setting)); - set_val_str (arr, 7, nmc_property_dcb_get_app_fip_priority (setting)); - set_val_str (arr, 8, nmc_property_dcb_get_pfc_flags (setting)); - set_val_str (arr, 9, nmc_property_dcb_get_pfc (setting)); - set_val_str (arr, 10, nmc_property_dcb_get_pg_flags (setting)); - set_val_str (arr, 11, nmc_property_dcb_get_pg_group_id (setting)); - set_val_str (arr, 12, nmc_property_dcb_get_pg_group_bandwidth (setting)); - set_val_str (arr, 13, nmc_property_dcb_get_pg_bandwidth (setting)); - set_val_str (arr, 14, nmc_property_dcb_get_pg_strict (setting)); - set_val_str (arr, 15, nmc_property_dcb_get_pg_traffic_class (setting)); + set_val_str (arr, 1, nmc_property_dcb_get_app_fcoe_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 2, nmc_property_dcb_get_app_fcoe_priority (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 3, nmc_property_dcb_get_app_fcoe_mode (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 4, nmc_property_dcb_get_app_iscsi_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 5, nmc_property_dcb_get_app_iscsi_priority (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 6, nmc_property_dcb_get_app_fip_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 7, nmc_property_dcb_get_app_fip_priority (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 8, nmc_property_dcb_get_pfc_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 9, nmc_property_dcb_get_pfc (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 10, nmc_property_dcb_get_pg_flags (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 11, nmc_property_dcb_get_pg_group_id (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 12, nmc_property_dcb_get_pg_group_bandwidth (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 13, nmc_property_dcb_get_pg_bandwidth (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 14, nmc_property_dcb_get_pg_strict (setting, NMC_PROPERTY_GET_PRETTY)); + set_val_str (arr, 15, nmc_property_dcb_get_pg_traffic_class (setting, NMC_PROPERTY_GET_PRETTY)); g_ptr_array_add (nmc->output_data, arr); print_data (nmc); /* Print all data */ diff --git a/clients/cli/settings.h b/clients/cli/settings.h index 179ef751cf..bab00ee908 100644 --- a/clients/cli/settings.h +++ b/clients/cli/settings.h @@ -41,9 +41,9 @@ const char **nmc_setting_get_property_allowed_values (NMSetting *setting, const char *nmc_setting_get_property (NMSetting *setting, const char *prop, GError **error); -char *nmc_setting_get_property_out2in (NMSetting *setting, - const char *prop, - GError **error); +char *nmc_setting_get_property_parsable (NMSetting *setting, + const char *prop, + GError **error); gboolean nmc_setting_set_property (NMSetting *setting, const char *prop, const char *val, From 16f089ce64ac38b6dd5f5912e4c3e19cad18aa69 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 21 May 2015 13:22:16 +0200 Subject: [PATCH 11/15] cli: do not create a copy of static strings for nmc_properties hash The keys of the hash are static strings. No need to make a copy of it. If we ever need dynamics properties, we should intern those strings. --- clients/cli/settings.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 963d5f878c..2da3596777 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -4788,13 +4788,13 @@ DEFINE_ALLOWED_VAL_FUNC (nmc_property_dcb_allowed_app_fcoe_modes, _dcb_valid_fco /*----------------------------------------------------------------------------*/ static void -nmc_add_prop_funcs (char *key, - NmcPropertyGetFunc get_func, - NmcPropertySetFunc set_func, - NmcPropertyRemoveFunc remove_func, - NmcPropertyDescribeFunc describe_func, - NmcPropertyValuesFunc values_func, - gpointer dummy) +_nmc_add_prop_funcs (const char *key, + NmcPropertyGetFunc get_func, + NmcPropertySetFunc set_func, + NmcPropertyRemoveFunc remove_func, + NmcPropertyDescribeFunc describe_func, + NmcPropertyValuesFunc values_func, + gpointer dummy) { NmcPropertyFuncs *item = g_malloc0 (sizeof (NmcPropertyFuncs)); item->get_func = get_func; @@ -4803,12 +4803,14 @@ nmc_add_prop_funcs (char *key, item->describe_func = describe_func; item->values_func = values_func; - g_hash_table_insert (nmc_properties, key, item); + g_hash_table_insert (nmc_properties, (gpointer) key, item); } +#define nmc_add_prop_funcs(key, ...) _nmc_add_prop_funcs ("" key, __VA_ARGS__) + /* concatenate setting name and property name */ -#define GLUE(A,B) (g_strconcat ((NM_SETTING_##A##_SETTING_NAME),(NM_SETTING_##A##_##B), NULL)) -#define GLUE_IP(A,B) (g_strconcat ((NM_SETTING_IP##A##_CONFIG_SETTING_NAME),(NM_SETTING_IP_CONFIG_##B), NULL)) +#define GLUE(A,B) "" NM_SETTING_##A##_SETTING_NAME "" NM_SETTING_##A##_##B "" +#define GLUE_IP(A,B) "" NM_SETTING_IP##A##_CONFIG_SETTING_NAME "" NM_SETTING_IP_CONFIG_##B "" void nmc_properties_init (void) @@ -4817,7 +4819,7 @@ nmc_properties_init (void) return; /* create properties hash table */ - nmc_properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + nmc_properties = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free); /* Add editable properties for NM_SETTING_802_1X_SETTING_NAME */ nmc_add_prop_funcs (GLUE (802_1X, EAP), From 035e31327bc3e59eb5b9981469756cf71c0c833d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 21 May 2015 13:38:20 +0200 Subject: [PATCH 12/15] cli: refactor nmc_add_prop_funcs() to use variadic macro The advantage of this is that if we later add another function pointer we don't have to touch any existing calls which would only pass NULL to that argument. Using a variadic argument and partial initialization of an auto variable gives us that flexibility. --- clients/cli/settings.c | 49 ++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 2da3596777..1183f45a3c 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -1634,11 +1634,16 @@ typedef const char * (*NmcPropertyDescribeFunc) (NMSetting *, const char *); typedef const char ** (*NmcPropertyValuesFunc) (NMSetting *, const char *); typedef struct { - NmcPropertyGetFunc get_func; /* func getting property values */ - NmcPropertySetFunc set_func; /* func adding/setting property values */ - NmcPropertyRemoveFunc remove_func; /* func removing items from container options */ - NmcPropertyDescribeFunc describe_func; /* func returning property description */ - NmcPropertyValuesFunc values_func; /* func returning allowed property values */ + /* The order of the fields is important as they correspond + * to the order as _nmc_add_prop_funcs() passes the arguments. */ +#define NmcPropertyFuncsFields \ + NmcPropertyGetFunc get_func; /* func getting property values */ \ + NmcPropertySetFunc set_func; /* func adding/setting property values */ \ + NmcPropertyRemoveFunc remove_func; /* func removing items from container options */ \ + NmcPropertyDescribeFunc describe_func; /* func returning property description */ \ + NmcPropertyValuesFunc values_func; /* func returning allowed property values */ \ + ; + NmcPropertyFuncsFields } NmcPropertyFuncs; /* @@ -4787,26 +4792,32 @@ DEFINE_ALLOWED_VAL_FUNC (nmc_property_dcb_allowed_app_fcoe_modes, _dcb_valid_fco /*----------------------------------------------------------------------------*/ -static void +static inline void _nmc_add_prop_funcs (const char *key, - NmcPropertyGetFunc get_func, - NmcPropertySetFunc set_func, - NmcPropertyRemoveFunc remove_func, - NmcPropertyDescribeFunc describe_func, - NmcPropertyValuesFunc values_func, - gpointer dummy) + const NmcPropertyFuncs *item_init) { - NmcPropertyFuncs *item = g_malloc0 (sizeof (NmcPropertyFuncs)); - item->get_func = get_func; - item->set_func = set_func; - item->remove_func = remove_func; - item->describe_func = describe_func; - item->values_func = values_func; + NmcPropertyFuncs *item; + item = g_malloc (sizeof (NmcPropertyFuncs)); + *item = *item_init; g_hash_table_insert (nmc_properties, (gpointer) key, item); } -#define nmc_add_prop_funcs(key, ...) _nmc_add_prop_funcs ("" key, __VA_ARGS__) +#define nmc_add_prop_funcs(key, ...) \ + G_STMT_START { \ + struct { \ + NmcPropertyFuncsFields; \ + /* The _dummy field is here so that the last argument can be always + * NULL. That means every call to nmc_add_prop_funcs() below ends + * with a separate line "NULL);". */ \ + gpointer _dummy; \ + } _item_init = { \ + __VA_ARGS__ \ + };\ + \ + nm_assert (_item_init._dummy == NULL); \ + _nmc_add_prop_funcs ("" key, (NmcPropertyFuncs *) &_item_init); \ + } G_STMT_END /* concatenate setting name and property name */ #define GLUE(A,B) "" NM_SETTING_##A##_SETTING_NAME "" NM_SETTING_##A##_##B "" From 350900d0a54c8536f1910b06d42f00a240c7cae9 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 21 May 2015 18:10:40 +0200 Subject: [PATCH 13/15] cli: stack allocate search string in nmc_properties_find() --- clients/cli/settings.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 1183f45a3c..32158ed6a3 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -6410,17 +6410,17 @@ nmc_properties_cleanup () static const NmcPropertyFuncs * nmc_properties_find (const char *s_name, const char *p_name) { - NmcPropertyFuncs *item = NULL; char *key; + gsize p_l, s_l; - /* FIXME: maybe it's better to init it globally */ nmc_properties_init (); - key = g_strdup_printf ("%s%s", s_name, p_name); - item = (NmcPropertyFuncs *) g_hash_table_lookup (nmc_properties, key); - g_free (key); - - return item; + s_l = strlen (s_name); + p_l = strlen (p_name); + key = g_alloca (s_l + p_l + 1); + memcpy (&key[ 0], s_name, s_l); + memcpy (&key[s_l], p_name, p_l + 1); + return (NmcPropertyFuncs *) g_hash_table_lookup (nmc_properties, key); } static char * From f81d7242c3298972f178556dfba821447fa6fecd Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 14:52:37 +0200 Subject: [PATCH 14/15] cli: add DEFINE_GETTER_WITH_DEFAULT() macro --- clients/cli/settings.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 32158ed6a3..598c51f9b7 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -831,6 +831,31 @@ vpn_data_item (const char *key, const char *value, gpointer user_data) return s; \ } +#define DEFINE_GETTER_WITH_DEFAULT(func_name, property_name, check_is_default) \ + static char * \ + func_name (NMSetting *setting, NmcPropertyGetType get_type) \ + { \ + const char *s; \ + char *s_full; \ + GValue val = G_VALUE_INIT; \ + \ + if ((check_is_default)) { \ + if (get_type == NMC_PROPERTY_GET_PARSABLE) \ + return g_strdup (""); \ + return g_strdup (_("(default)")); \ + } \ + \ + g_value_init (&val, G_TYPE_STRING); \ + g_object_get_property (G_OBJECT (setting), property_name, &val); \ + s = g_value_get_string (&val); \ + if (get_type == NMC_PROPERTY_GET_PARSABLE) \ + s_full = g_strdup (s && *s ? s : " "); \ + else \ + s_full = s ? g_strdup_printf ("\"%s\"", s) : g_strdup (""); \ + g_value_unset (&val); \ + return s_full; \ + } + #define DEFINE_SECRET_FLAGS_GETTER(func_name, property_name) \ static char * \ func_name (NMSetting *setting, NmcPropertyGetType get_type) \ From 230099aa524c536bf19d49c6ef10b5a906a06dc5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 May 2015 14:55:04 +0200 Subject: [PATCH 15/15] cli: show dns-options default value You can reset the default value via $ nmcli connection modify id CON ipv4.dns-options "" and set an empty value with $ nmcli connection modify id CON ipv4.dns-options " " --- clients/cli/settings.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 598c51f9b7..e0ae53904f 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -1261,7 +1261,7 @@ DEFINE_GETTER (nmc_property_ib_get_parent, NM_SETTING_INFINIBAND_PARENT) DEFINE_GETTER (nmc_property_ipv4_get_method, NM_SETTING_IP_CONFIG_METHOD) DEFINE_GETTER (nmc_property_ipv4_get_dns, NM_SETTING_IP_CONFIG_DNS) DEFINE_GETTER (nmc_property_ipv4_get_dns_search, NM_SETTING_IP_CONFIG_DNS_SEARCH) -DEFINE_GETTER (nmc_property_ipv4_get_dns_options, NM_SETTING_IP_CONFIG_DNS_OPTIONS) +DEFINE_GETTER_WITH_DEFAULT (nmc_property_ipv4_get_dns_options, NM_SETTING_IP_CONFIG_DNS_OPTIONS, !nm_setting_ip_config_has_dns_options ((NMSettingIPConfig *) setting)) static char * nmc_property_ip_get_addresses (NMSetting *setting, NmcPropertyGetType get_type) @@ -1359,7 +1359,7 @@ DEFINE_GETTER (nmc_property_ipv4_get_may_fail, NM_SETTING_IP_CONFIG_MAY_FAIL) DEFINE_GETTER (nmc_property_ipv6_get_method, NM_SETTING_IP_CONFIG_METHOD) DEFINE_GETTER (nmc_property_ipv6_get_dns, NM_SETTING_IP_CONFIG_DNS) DEFINE_GETTER (nmc_property_ipv6_get_dns_search, NM_SETTING_IP_CONFIG_DNS_SEARCH) -DEFINE_GETTER (nmc_property_ipv6_get_dns_options, NM_SETTING_IP_CONFIG_DNS_OPTIONS) +DEFINE_GETTER_WITH_DEFAULT (nmc_property_ipv6_get_dns_options, NM_SETTING_IP_CONFIG_DNS_OPTIONS, !nm_setting_ip_config_has_dns_options ((NMSettingIPConfig *) setting)) static char * nmc_property_ipv6_get_routes (NMSetting *setting, NmcPropertyGetType get_type) @@ -3319,6 +3319,7 @@ nmc_property_ipv4_set_dns_options (NMSetting *setting, const char *prop, const c g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + nm_setting_ip_config_clear_dns_options (NM_SETTING_IP_CONFIG (setting), TRUE); strv = nmc_strsplit_set (val, " \t,", 0); while (strv && strv[i]) nm_setting_ip_config_add_dns_option (NM_SETTING_IP_CONFIG (setting), strv[i++]); @@ -3632,6 +3633,7 @@ nmc_property_ipv6_set_dns_options (NMSetting *setting, const char *prop, const c g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + nm_setting_ip_config_clear_dns_options (NM_SETTING_IP_CONFIG (setting), TRUE); strv = nmc_strsplit_set (val, " \t,", 0); while (strv && strv[i]) nm_setting_ip_config_add_dns_option (NM_SETTING_IP_CONFIG (setting), strv[i++]);