From 5c6ae44e006b7378c6913f1d7e3195419f1e905f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8D=C3=B1igo=20Huguet?= Date: Tue, 5 Sep 2023 16:25:02 +0200 Subject: [PATCH] man nm-settings-nmcli: add "Special values" field If there are properties that accept special values apart from the normally accepted values, or any of those values has an special meaning, it can be shown as "Special value", indicating the nicknames and numbers that can be used to select it. --- man/nm-settings-nmcli.xsl | 5 + src/libnmc-setting/nm-meta-setting-desc.c | 3 - src/nmcli/gen-metadata-nm-settings-nmcli.c | 84 ++++++++++- .../gen-metadata-nm-settings-nmcli.xml.in | 134 ++++++++++++------ tools/generate-docs-nm-property-infos.py | 1 + tools/generate-docs-nm-settings-docs-merge.py | 1 + 6 files changed, 173 insertions(+), 55 deletions(-) diff --git a/man/nm-settings-nmcli.xsl b/man/nm-settings-nmcli.xsl index 5f6783d362..794ee507b1 100644 --- a/man/nm-settings-nmcli.xsl +++ b/man/nm-settings-nmcli.xsl @@ -181,6 +181,11 @@ Valid values: + + + Special values: + + diff --git a/src/libnmc-setting/nm-meta-setting-desc.c b/src/libnmc-setting/nm-meta-setting-desc.c index afe74045be..2b2209d9f9 100644 --- a/src/libnmc-setting/nm-meta-setting-desc.c +++ b/src/libnmc-setting/nm-meta-setting-desc.c @@ -5672,9 +5672,6 @@ static const NMMetaPropertyInfo *const property_infos_CONNECTION[] = { .set_fcn = _set_fcn_connection_metered, .doc_format = NM_META_PROPERTY_TYPE_FORMAT_TERNARY, ), - .property_typ_data = DEFINE_PROPERTY_TYP_DATA ( - .values_static = NM_MAKE_STRV ("yes", "no", "unknown"), - ), ), PROPERTY_INFO_WITH_DESC (NM_SETTING_CONNECTION_LLDP, .property_type = &_pt_gobject_enum, diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.c b/src/nmcli/gen-metadata-nm-settings-nmcli.c index f81bb6ee28..f29c91805c 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.c +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.c @@ -402,6 +402,65 @@ get_property_valid_values(const NMMetaPropertyInfo *prop_info) return valid_values; } +static void +append_int_special_values(const NMMetaPropertyInfo *prop_info, GPtrArray *special_values) +{ + const NMMetaPropertyTypData *prop_typ_data = prop_info->property_typ_data; + + if (prop_typ_data && prop_typ_data->subtype.gobject_int.value_infos) { + GType gtype = _property_get_gtype(prop_info); + bool is_uint = NM_IN_SET(gtype, G_TYPE_UINT, G_TYPE_UINT64); + guint base = prop_typ_data->subtype.gobject_int.base; + const NMMetaUtilsIntValueInfo *v = prop_typ_data->subtype.gobject_int.value_infos; + + if (!(base == 0 || base == 10 || (is_uint && base == 16))) { + if (is_uint) + prop_abort(prop_info, "only base 10 supported for signed int"); + else + prop_abort(prop_info, "only base 10 or 16 supported for uint"); + } + + for (; v->nick != NULL; v++) { + char *v_str; + if (base == 16) + v_str = g_strdup_printf("%s (0x%lx)", v->nick, v->value.u64); + else if (is_uint) + v_str = g_strdup_printf("%s (%lu)", v->nick, v->value.u64); + else + v_str = g_strdup_printf("%s (%ld)", v->nick, v->value.i64); + + g_ptr_array_add(special_values, v_str); + } + } +} + +static GPtrArray * +get_property_special_values(const NMMetaPropertyInfo *prop_info) +{ + const NMMetaPropertyType *prop_type = prop_info->property_type; + const NMMetaPropertyTypData *prop_typ_data = prop_info->property_typ_data; + NMMetaPropertyTypeFormat fmt = prop_type->doc_format; + GPtrArray *special_values = g_ptr_array_new_full(16, g_free); + + switch (fmt) { + case NM_META_PROPERTY_TYPE_FORMAT_INT: + append_int_special_values(prop_info, special_values); + break; + case NM_META_PROPERTY_TYPE_FORMAT_MAC: + if (prop_typ_data + && prop_typ_data->subtype.mac.mode == NM_META_PROPERTY_TYPE_MAC_MODE_CLONED) + append_vals(special_values, "preserve", "permanent", "random", "stable"); + break; + case NM_META_PROPERTY_TYPE_FORMAT_MTU: + g_ptr_array_add(special_values, g_strdup("auto")); + break; + default: + break; + } + + return special_values; +} + int main(int argc, char *argv[]) { @@ -424,13 +483,15 @@ main(int argc, char *argv[]) g_print(" >\n"); for (i_property = 0; i_property < sett_info->properties_num; i_property++) { - const NMMetaPropertyInfo *prop_info = sett_info->properties[i_property]; - gs_free char *name = NULL; - gs_free char *alias = NULL; - gs_free char *descr = NULL; - gs_free char *fmt = NULL; - gs_unref_ptrarray GPtrArray *vals_arr = NULL; - gs_free char *vals_str = NULL; + const NMMetaPropertyInfo *prop_info = sett_info->properties[i_property]; + gs_free char *name = NULL; + gs_free char *alias = NULL; + gs_free char *descr = NULL; + gs_free char *fmt = NULL; + gs_unref_ptrarray GPtrArray *vals_arr = NULL; + gs_free char *vals_str = NULL; + gs_unref_ptrarray GPtrArray *specials_arr = NULL; + gs_free char *specials_str = NULL; g_print("%sproperty_name)); @@ -470,6 +531,15 @@ main(int argc, char *argv[]) _xml_escape_attribute(vals_str)); } + specials_arr = get_property_special_values(prop_info); + if (specials_arr->len) { + g_ptr_array_add(specials_arr, NULL); + specials_str = g_strjoinv(", ", (char **) specials_arr->pdata); + g_print("\n%sspecial-values=%s", + _indent_level(2 * INDENT + 10), + _xml_escape_attribute(specials_str)); + } + g_print(" />\n"); } diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in index cbf3345b12..6a8d3af527 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in @@ -50,7 +50,8 @@ + format="MAC address" + special-values="preserve, permanent, random, stable" /> @@ -64,7 +65,8 @@ + format="integer" + special-values="auto" /> @@ -347,7 +349,8 @@ + format="MAC address" + special-values="preserve, permanent, random, stable" /> @@ -357,7 +360,8 @@ + format="integer" + special-values="auto" /> @@ -594,7 +598,8 @@ values="none (0x0), agent-owned (0x1), not-saved (0x2), not-required (0x4)" /> + format="integer" + special-values="auto" /> + values="-1 - 2147483647" + special-values="default (-1), forever (0)" /> + values="true/yes/on, false/no/off, default/unknown" /> + values="-1 - 7" + special-values="unset (-1)" /> + values="-1 - 7" + special-values="unset (-1)" /> + values="-1 - 7" + special-values="unset (-1)" /> + format="integer" + special-values="auto" /> + format="integer" + special-values="auto" /> + values="-1 - 65535" + special-values="default (-1)" /> + format="integer" + special-values="auto" /> + values="0 - 4294967295" + special-values="unspec (0), main (254)" /> + values="0 - 2147483647" + special-values="default (0), infinity (2147483647)" /> + values="-1 - 2147483647" + special-values="default (-1), infinity (2147483647)" /> + values="-1 - 30000" + special-values="default (-1), off (0)" /> @@ -1332,7 +1349,8 @@ + values="0 - 4294967295" + special-values="unspec (0), main (254)" /> + values="-1 - 2147483647" + special-values="default (-1), infinity (2147483647)" /> + values="0 - 2147483647" + special-values="default (0), infinity (2147483647)" /> + format="integer" + special-values="auto" /> @@ -1386,7 +1407,8 @@ + values="0 - 2147483647" + special-values="default (0), infinity (2147483647)" /> + values="-1 - 4294967295" + special-values="default (-1)" /> + values="-1 - 4294967295" + special-values="default (-1)" /> + values="-1 - 4294967295" + special-values="default (-1)" /> + values="-1 - 4294967295" + special-values="default (-1)" /> + format="integer" + special-values="auto" /> + format="integer" + special-values="auto" /> + values="-2147483648 - 2147483647" + special-values="unset (-1), disabled (0)" /> + values="-2147483648 - 2147483647" + special-values="unset (-1), default (0)" /> + values="-2147483648 - 2147483647" + special-values="unset (-1), disabled (0)" /> + values="-2147483648 - 2147483647" + special-values="unset (-1), default (0)" /> + values="-2147483648 - 2147483647" + special-values="unset (-1), default (50)" /> + values="-2147483648 - 2147483647" + special-values="unset (-1), default (65535)" /> + values="-2147483648 - 2147483647" + special-values="unset (-1), default (1)" /> + values="-2147483648 - 2147483647" + special-values="unset (-1), default (0)" /> + values="-2147483648 - 2147483647" + special-values="unset (0), default (0)" /> + values="-2147483648 - 2147483647" + special-values="unset (-1), default (255)" /> + values="-2147483648 - 2147483647" + special-values="unset (-1), default (0)" /> @@ -2056,7 +2095,8 @@ values="true/yes/on, false/no/off" /> + format="integer" + special-values="auto" /> + values="0 - 65535" + special-values="unset (0xffff)" /> + values="0 - 65535" + special-values="unset (0xffff)" /> + values="-32768 - 32767" + special-values="default (-1)" /> + values="-32768 - 32767" + special-values="default (-1)" /> diff --git a/tools/generate-docs-nm-property-infos.py b/tools/generate-docs-nm-property-infos.py index d7e3c8c29b..13b33fcdea 100755 --- a/tools/generate-docs-nm-property-infos.py +++ b/tools/generate-docs-nm-property-infos.py @@ -125,6 +125,7 @@ keywords = collections.OrderedDict( ("variable", KEYWORD_XML_TYPE_ATTR), ("format", KEYWORD_XML_TYPE_ATTR), ("values", KEYWORD_XML_TYPE_ATTR), + ("special-values", KEYWORD_XML_TYPE_ATTR), ("default", KEYWORD_XML_TYPE_ATTR), ("example", KEYWORD_XML_TYPE_ATTR), ("description", KEYWORD_XML_TYPE_ELEM), diff --git a/tools/generate-docs-nm-settings-docs-merge.py b/tools/generate-docs-nm-settings-docs-merge.py index e44dac9c93..5d4e00a1eb 100755 --- a/tools/generate-docs-nm-settings-docs-merge.py +++ b/tools/generate-docs-nm-settings-docs-merge.py @@ -297,6 +297,7 @@ for setting_name in iter_keys_of_dicts(settings_roots, key_fcn_setting_name): node_set_attr(property_node, "type", properties_attrs) node_set_attr(property_node, "values", properties_attrs) + node_set_attr(property_node, "special-values", properties_attrs) node_set_attr(property_node, "default", properties_attrs) node_set_attr(property_node, "alias", properties_attrs)