diff --git a/src/nmcli/connections.c b/src/nmcli/connections.c index 5cbc4c10f2..bccec3a1a2 100644 --- a/src/nmcli/connections.c +++ b/src/nmcli/connections.c @@ -1883,8 +1883,23 @@ split_required_fields_for_con_show(const char *input, for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) { if (is_all || is_common || !g_ascii_strcasecmp(s_mutable, nm_meta_setting_infos[i].setting_name)) { - if (dot) + gs_free char *to_free = NULL; + + if (dot) { + /* If there was a dot we have 'setting.property'. Some properties has different + * name for the user than internally in libnm and D-Bus. Make the conversion + * from user names to libnm names. + */ + const char *prop_user = dot + 1; + const char *prop_libnm = + nmc_setting_propname_user_to_libnm(s_mutable, prop_user); + if (prop_user != prop_libnm) { + to_free = g_strdup_printf("%s.%s", s_mutable, prop_libnm); + s_mutable = to_free; + } *dot = '.'; + } + g_string_append(str1, s_mutable); g_string_append_c(str1, ','); found = TRUE; @@ -4392,7 +4407,7 @@ set_property(NMClient *client, } /* Don't ask for this property in interactive mode. */ - disable_options(setting_name, property_name); + disable_options(setting_name, nmc_setting_propname_user_to_libnm(setting_name, property_name)); return TRUE; } diff --git a/src/nmcli/settings.c b/src/nmcli/settings.c index d7bd73fb99..85f4ad8346 100644 --- a/src/nmcli/settings.c +++ b/src/nmcli/settings.c @@ -525,6 +525,8 @@ get_property_val(NMSetting *setting, NM_IN_SET(get_type, NM_META_ACCESSOR_GET_TYPE_PARSABLE, NM_META_ACCESSOR_GET_TYPE_PRETTY), NULL); + prop = nmc_setting_propname_user_to_libnm(nm_setting_get_name(setting), prop); + if ((property_info = nm_meta_property_info_find_by_setting(setting, prop))) { if (property_info->property_type->get_fcn) { NMMetaAccessorGetOutFlags out_flags = NM_META_ACCESSOR_GET_OUT_FLAGS_NONE; @@ -593,8 +595,11 @@ nmc_setting_set_property(NMClient *client, NM_META_ACCESSOR_MODIFIER_ADD), FALSE); + prop = nmc_setting_propname_user_to_libnm(nm_setting_get_name(setting), prop); + if (!(property_info = nm_meta_property_info_find_by_setting(setting, prop))) goto out_fail_read_only; + if (!property_info->property_type->set_fcn) goto out_fail_read_only; @@ -661,8 +666,12 @@ nmc_setting_get_valid_properties(NMSetting *setting) num = setting_info ? setting_info->properties_num : 0; valid_props = g_new(char *, num + 1); - for (i = 0; i < num; i++) - valid_props[i] = g_strdup(setting_info->properties[i]->property_name); + for (i = 0; i < num; i++) { + const char *prop = + nmc_setting_propname_libnm_to_user(setting_info->general->setting_name, + setting_info->properties[i]->property_name); + valid_props[i] = g_strdup(prop); + } valid_props[num] = NULL; return valid_props; @@ -678,6 +687,8 @@ nmc_setting_get_property_allowed_values(NMSetting *setting, const char *prop, ch *out_to_free = NULL; + prop = nmc_setting_propname_user_to_libnm(nm_setting_get_name(setting), prop); + if ((property_info = nm_meta_property_info_find_by_setting(setting, prop))) { if (property_info->property_type->values_fcn) { return property_info->property_type->values_fcn(property_info, out_to_free); @@ -711,6 +722,8 @@ nmc_setting_get_property_desc(NMSetting *setting, const char *prop) g_return_val_if_fail(NM_IS_SETTING(setting), FALSE); + prop = nmc_setting_propname_user_to_libnm(nm_setting_get_name(setting), prop); + property_info = nm_meta_property_info_find_by_setting(setting, prop); if (!property_info) return NULL; @@ -774,3 +787,33 @@ setting_details(const NmcConfig *nmc_config, NMSetting *setting, const char *one return TRUE; } + +const char * +nmc_setting_propname_user_to_libnm(const char *setting_name, const char *prop) +{ + if (NM_IN_STRSET(setting_name, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_SETTING_NAME)) { + if (nm_streq0(prop, "dhcp-send-hostname")) + return NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME_V2; + else if (nm_streq0(prop, "dhcp-send-hostname-deprecated")) + return NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME; + } + + return prop; +} + +const char * +nmc_setting_propname_libnm_to_user(const char *setting_name, const char *prop) +{ + if (NM_IN_STRSET(setting_name, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_SETTING_NAME)) { + if (nm_streq0(prop, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME_V2)) + return "dhcp-send-hostname"; + else if (nm_streq0(prop, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME)) + return "dhcp-send-hostname-deprecated"; + } + + return prop; +} diff --git a/src/nmcli/settings.h b/src/nmcli/settings.h index 9cbf13c4b7..c1d0e3877c 100644 --- a/src/nmcli/settings.h +++ b/src/nmcli/settings.h @@ -34,4 +34,7 @@ gboolean nmc_setting_set_property(NMClient *client, gboolean setting_details(const NmcConfig *nmc_config, NMSetting *setting, const char *one_prop); +const char *nmc_setting_propname_user_to_libnm(const char *setting_name, const char *prop); +const char *nmc_setting_propname_libnm_to_user(const char *setting_name, const char *prop); + #endif /* NMC_SETTINGS_H */ diff --git a/src/nmcli/utils.c b/src/nmcli/utils.c index c65a5486bc..a613c28fc6 100644 --- a/src/nmcli/utils.c +++ b/src/nmcli/utils.c @@ -1016,6 +1016,8 @@ _print_fill(const NmcConfig *nmc_config, PrintDataHeaderCell *header_cell; guint col_idx; const NMMetaAbstractInfo *info; + const char *setting_name; + gboolean is_prop; col = &cols[i_col]; if (!col->is_leaf) @@ -1036,14 +1038,23 @@ _print_fill(const NmcConfig *nmc_config, header_cell->to_print = FALSE; header_cell->title = nm_meta_abstract_info_get_name(info, TRUE); - if (nmc_config->multiline_output && col->parent_col - && NM_IN_SET(info->meta_type, - &nm_meta_type_property_info, - &nmc_meta_type_generic_info)) { - header_cell->title = g_strdup_printf( - "%s.%s", - nm_meta_abstract_info_get_name(col->parent_col->selection_item->info, FALSE), - header_cell->title); + + is_prop = + col->parent_col + && NM_IN_SET(info->meta_type, &nm_meta_type_property_info, &nmc_meta_type_generic_info); + + if (is_prop) { + /* Some properties has different name for the user than internally in + * libnm and D-Bus. Make the conversion from libnm names to user names. + */ + setting_name = + nm_meta_abstract_info_get_name(col->parent_col->selection_item->info, FALSE); + header_cell->title = + nmc_setting_propname_libnm_to_user(setting_name, header_cell->title); + } + + if (nmc_config->multiline_output && is_prop) { + header_cell->title = g_strdup_printf("%s.%s", setting_name, header_cell->title); header_cell->title_to_free = TRUE; } }