From 8bdf070ff046f482f6eb5e2b15ebc216f5d1e3da Mon Sep 17 00:00:00 2001 From: Michael Biebl Date: Wed, 12 Feb 2025 13:46:50 +0100 Subject: New upstream version 1.51.90 --- src/nmcli/common.c | 8 +- src/nmcli/common.h | 2 +- src/nmcli/connections.c | 45 ++++++---- src/nmcli/devices.c | 24 +++--- src/nmcli/gen-metadata-nm-settings-nmcli.c | 13 +++ src/nmcli/gen-metadata-nm-settings-nmcli.xml.in | 110 ++++++++++++++++++++++-- src/nmcli/general.c | 4 +- src/nmcli/settings.c | 53 ++++++++++-- src/nmcli/settings.h | 3 + src/nmcli/utils.c | 27 ++++-- src/nmcli/utils.h | 4 +- 11 files changed, 234 insertions(+), 59 deletions(-) (limited to 'src/nmcli') diff --git a/src/nmcli/common.c b/src/nmcli/common.c index fbabdffc..2ced70f3 100644 --- a/src/nmcli/common.c +++ b/src/nmcli/common.c @@ -355,7 +355,7 @@ print_ip_config(NMIPConfig *cfg, } if (!nmc_print_table(nmc_config, - (gpointer[]){cfg, NULL}, + (gpointer[]) {cfg, NULL}, NULL, NULL, addr_family == AF_INET @@ -386,7 +386,7 @@ print_dhcp_config(NMDhcpConfig *dhcp, } if (!nmc_print_table(nmc_config, - (gpointer[]){dhcp, NULL}, + (gpointer[]) {dhcp, NULL}, NULL, NULL, addr_family == AF_INET @@ -1399,7 +1399,7 @@ call_cmd(NmCli *nmc, GTask *task, const NMCCommand *cmd, int argc, const char *c nmc->should_wait++; call = g_slice_new(CmdCall); - *call = (CmdCall){ + *call = (CmdCall) { .cmd = cmd, .argc = argc, .argv = nm_strv_dup(argv, argc, TRUE), @@ -1430,7 +1430,7 @@ call_cmd(NmCli *nmc, GTask *task, const NMCCommand *cmd, int argc, const char *c nmc->should_wait++; call = g_slice_new(CmdCall); - *call = (CmdCall){ + *call = (CmdCall) { .cmd = cmd, .argc = argc, .argv = nm_strv_dup(argv, argc, TRUE), diff --git a/src/nmcli/common.h b/src/nmcli/common.h index 3784da35..892b2d4e 100644 --- a/src/nmcli/common.h +++ b/src/nmcli/common.h @@ -70,7 +70,7 @@ nmc_do_cmd(NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, const void nmc_complete_strv(const char *prefix, gssize nargs, const char *const *args); #define nmc_complete_strings(prefix, ...) \ - nmc_complete_strv((prefix), NM_NARG(__VA_ARGS__), (const char *const[]){__VA_ARGS__}) + nmc_complete_strv((prefix), NM_NARG(__VA_ARGS__), (const char *const[]) {__VA_ARGS__}) void nmc_complete_bool(const char *prefix); diff --git a/src/nmcli/connections.c b/src/nmcli/connections.c index 002dd402..bccec3a1 100644 --- a/src/nmcli/connections.c +++ b/src/nmcli/connections.c @@ -113,7 +113,7 @@ _add_connection_info_new(NmCli *nmc, NMConnection *orig_connection, NMConnection AddConnectionInfo *info; info = g_slice_new(AddConnectionInfo); - *info = (AddConnectionInfo){ + *info = (AddConnectionInfo) { .nmc = nmc, .orig_id = orig_connection ? g_strdup(nm_connection_get_id(orig_connection)) : NULL, .orig_uuid = orig_connection ? g_strdup(nm_connection_get_uuid(orig_connection)) : NULL, @@ -1075,7 +1075,7 @@ const NmcMetaGenericInfo "," NM_SETTING_PROXY_SETTING_NAME "," NM_SETTING_TC_CONFIG_SETTING_NAME \ "," NM_SETTING_SRIOV_SETTING_NAME "," NM_SETTING_ETHTOOL_SETTING_NAME \ "," NM_SETTING_OVS_DPDK_SETTING_NAME "," NM_SETTING_HOSTNAME_SETTING_NAME \ - "," NM_SETTING_HSR_SETTING_NAME + "," NM_SETTING_HSR_SETTING_NAME "," NM_SETTING_IPVLAN_SETTING_NAME /* NM_SETTING_DUMMY_SETTING_NAME NM_SETTING_WIMAX_SETTING_NAME */ const NmcMetaGenericInfo *const nmc_fields_con_active_details_groups[] = { @@ -1763,7 +1763,7 @@ nmc_active_connection_details(NMActiveConnection *acon, NmCli *nmc) nmc_print_table( &nmc->nmc_config, - (gpointer[]){acon, NULL}, + (gpointer[]) {acon, NULL}, NULL, NULL, NMC_META_GENERIC_GROUP("GENERAL", metagen_con_active_general, N_("GROUP")), @@ -1820,7 +1820,7 @@ nmc_active_connection_details(NMActiveConnection *acon, NmCli *nmc) if (nmc_fields_con_active_details_groups[group_idx]->nested == metagen_con_active_vpn) { if (NM_IS_VPN_CONNECTION(acon)) { nmc_print_table(&nmc->nmc_config, - (gpointer[]){acon, NULL}, + (gpointer[]) {acon, NULL}, NULL, NULL, NMC_META_GENERIC_GROUP("VPN", metagen_con_active_vpn, N_("NAME")), @@ -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; @@ -3143,9 +3158,6 @@ do_connection_up(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const const char *pwds = NULL; gs_free_error GError *error = NULL; gs_strfreev char **arg_arr = NULL; - int arg_num; - const char *const **argv_ptr; - int *argc_ptr; /* * Set default timeout for connection activation. @@ -3155,8 +3167,6 @@ do_connection_up(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const nmc->timeout = 90; next_arg(nmc, &argc, &argv, NULL); - argv_ptr = &argv; - argc_ptr = &argc; if (argc == 0 && nmc->ask) { gs_free char *line = NULL; @@ -3165,13 +3175,12 @@ do_connection_up(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const g_return_if_fail(!nmc->complete); line = nmc_readline(&nmc->nmc_config, PROMPT_CONNECTION); - nmc_string_to_arg_array(line, NULL, TRUE, &arg_arr, &arg_num); - argv_ptr = (const char *const **) &arg_arr; - argc_ptr = &arg_num; + nmc_string_to_arg_array(line, NULL, TRUE, &arg_arr, &argc); + argv = (const char *const *) arg_arr; } if (argc > 0 && !nm_streq(*argv, "ifname")) { - connection = get_connection(nmc, argc_ptr, argv_ptr, NULL, NULL, NULL, &error); + connection = get_connection(nmc, &argc, &argv, NULL, NULL, NULL, &error); if (!connection) { g_string_printf(nmc->return_text, _("Error: %s."), error->message); nmc->return_value = error->code; @@ -4398,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; } @@ -6919,7 +6928,7 @@ nmcli_editor_tab_completion(const char *text, int start, int end) return match_array; } -#define NMCLI_EDITOR_HISTORY ".nmcli-history" +#define NMCLI_EDITOR_HISTORY "nmcli-history" static void load_history_cmds(const char *uuid) @@ -6931,7 +6940,7 @@ load_history_cmds(const char *uuid) size_t i; GError *err = NULL; - filename = g_build_filename(g_get_home_dir(), NMCLI_EDITOR_HISTORY, NULL); + filename = g_build_filename(g_get_user_cache_dir(), NMCLI_EDITOR_HISTORY, NULL); kf = g_key_file_new(); if (!g_key_file_load_from_file(kf, filename, G_KEY_FILE_KEEP_COMMENTS, &err)) { if (g_error_matches(err, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE)) @@ -6967,7 +6976,7 @@ save_history_cmds(const char *uuid) if (!hist) return; - filename = g_build_filename(g_get_home_dir(), NMCLI_EDITOR_HISTORY, NULL); + filename = g_build_filename(g_get_user_cache_dir(), NMCLI_EDITOR_HISTORY, NULL); kf = g_key_file_new(); diff --git a/src/nmcli/devices.c b/src/nmcli/devices.c index f6163757..b308e440 100644 --- a/src/nmcli/devices.c +++ b/src/nmcli/devices.c @@ -1675,7 +1675,7 @@ show_device_info(NMDevice *device, NmCli *nmc) nmc_print_table( &nmc->nmc_config, - (gpointer[]){device, NULL}, + (gpointer[]) {device, NULL}, NULL, NULL, NMC_META_GENERIC_GROUP("GENERAL", metagen_device_detail_general, N_("NAME")), @@ -1690,7 +1690,7 @@ show_device_info(NMDevice *device, NmCli *nmc) gs_free char *f = section_fld ? g_strdup_printf("CAPABILITIES.%s", section_fld) : NULL; nmc_print_table(&nmc->nmc_config, - (gpointer[]){device, NULL}, + (gpointer[]) {device, NULL}, NULL, NULL, NMC_META_GENERIC_GROUP("CAPABILITIES", @@ -1708,7 +1708,7 @@ show_device_info(NMDevice *device, NmCli *nmc) section_fld ? g_strdup_printf("INTERFACE-FLAGS.%s", section_fld) : NULL; nmc_print_table(&nmc->nmc_config, - (gpointer[]){device, NULL}, + (gpointer[]) {device, NULL}, NULL, NULL, NMC_META_GENERIC_GROUP("INTERFACE-FLAGS", @@ -1727,7 +1727,7 @@ show_device_info(NMDevice *device, NmCli *nmc) section_fld ? g_strdup_printf("WIFI-PROPERTIES.%s", section_fld) : NULL; nmc_print_table(&nmc->nmc_config, - (gpointer[]){device, NULL}, + (gpointer[]) {device, NULL}, NULL, NULL, NMC_META_GENERIC_GROUP("WIFI-PROPERTIES", @@ -1791,7 +1791,7 @@ show_device_info(NMDevice *device, NmCli *nmc) section_fld ? g_strdup_printf("WIRED-PROPERTIES.%s", section_fld) : NULL; nmc_print_table(&nmc->nmc_config, - (gpointer[]){device, NULL}, + (gpointer[]) {device, NULL}, NULL, NULL, NMC_META_GENERIC_GROUP("WIRED-PROPERTIES", @@ -1920,7 +1920,7 @@ show_device_info(NMDevice *device, NmCli *nmc) gs_free char *f = section_fld ? g_strdup_printf("CONNECTIONS.%s", section_fld) : NULL; nmc_print_table(&nmc->nmc_config, - (gpointer[]){device, NULL}, + (gpointer[]) {device, NULL}, NULL, NULL, NMC_META_GENERIC_GROUP("CONNECTIONS", @@ -2102,7 +2102,7 @@ add_and_activate_info_new(NmCli *nmc, AddAndActivateInfo *info; info = g_slice_new(AddAndActivateInfo); - *info = (AddAndActivateInfo){ + *info = (AddAndActivateInfo) { .nmc = nmc, .device = g_object_ref(device), .hotspot = hotspot, @@ -2639,7 +2639,7 @@ do_device_modify(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const nmc->should_wait++; info = g_slice_new(ModifyInfo); - *info = (ModifyInfo){ + *info = (ModifyInfo) { .nmc = nmc, .argc = argc, .argv = nm_strv_dup(argv, argc, TRUE), @@ -3535,7 +3535,7 @@ do_device_wifi_list(const NMCCommand *cmd, NmCli *nmc, int argc, const char *con } scan_info = g_slice_new(ScanInfo); - *scan_info = (ScanInfo){ + *scan_info = (ScanInfo) { .out_indices = g_array_ref(out_indices), .tmpl = tmpl, .bssid_user = g_strdup(bssid_user), @@ -3557,7 +3557,7 @@ do_device_wifi_list(const NMCCommand *cmd, NmCli *nmc, int argc, const char *con timeout_msec = 15000; wifi_list_data = g_slice_new(WifiListData); - *wifi_list_data = (WifiListData){ + *wifi_list_data = (WifiListData) { .wifi = wifi, .scan_info = scan_info, .timeout_id = g_timeout_add(timeout_msec, wifi_list_scan_timeout, wifi_list_data), @@ -4113,7 +4113,7 @@ generate_wpa_key(char *key, size_t len) int c; do { - c = nm_random_u64_range_full(48, 122, TRUE); + c = nm_random_u64_range(48, 122); /* skip characters that look similar */ } while (NM_IN_SET(c, '1', 'l', 'I', '0', 'O', 'Q', '8', 'B', '5', 'S') || !g_ascii_isalnum(c)); @@ -4136,7 +4136,7 @@ generate_wep_key(char *key, size_t len) for (i = 0; i < 10; i++) { int digit; - digit = nm_random_u64_range_full(0, 16, TRUE); + digit = nm_random_u64_range(0, 16); key[i] = hexdigits[digit]; } key[10] = '\0'; diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.c b/src/nmcli/gen-metadata-nm-settings-nmcli.c index 1764da73..2ba95995 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.c +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.c @@ -124,6 +124,8 @@ get_ethtool_format(const NMMetaPropertyInfo *prop_info) case NM_ETHTOOL_TYPE_PAUSE: case NM_ETHTOOL_TYPE_EEE: return g_strdup("ternary"); + case NM_ETHTOOL_TYPE_FEC: + return g_strdup("flags (NMSettingEthtoolFecMode)"); case NM_ETHTOOL_TYPE_UNKNOWN: nm_assert_not_reached(); }; @@ -158,6 +160,8 @@ get_multilist_format(const NMMetaPropertyInfo *prop_info) return g_strdup("list of IPv4 addresses"); case NM_META_PROPERTY_TYPE_FORMAT_IPV6: return g_strdup("list of IPv6 addresses"); + case NM_META_PROPERTY_TYPE_FORMAT_IPV4_IPV6: + return g_strdup("list of IPv4 or IPv6 addresses"); default: prop_abort(prop_info, "unsupported item format (%d)", item_fmt); break; @@ -198,6 +202,8 @@ get_property_format(const NMMetaPropertyInfo *prop_info) return g_strdup("IPv4 address"); case NM_META_PROPERTY_TYPE_FORMAT_IPV6: return g_strdup("IPv6 address"); + case NM_META_PROPERTY_TYPE_FORMAT_IPV4_IPV6: + return g_strdup("IPv4 or IPv6 address"); case NM_META_PROPERTY_TYPE_FORMAT_BYTES: return g_strdup("bytes"); case NM_META_PROPERTY_TYPE_FORMAT_PATH: @@ -330,6 +336,13 @@ append_ethtool_valid_values(const NMMetaPropertyInfo *prop_info, GPtrArray *vali case NM_ETHTOOL_TYPE_EEE: append_vals(valid_values, "on", "off", "ignore"); break; + case NM_ETHTOOL_TYPE_FEC: + _append_enum_valid_values(NM_TYPE_SETTING_ETHTOOL_FEC_MODE, + 0, + G_MAXUINT, + NULL, + valid_values); + break; case NM_ETHTOOL_TYPE_UNKNOWN: nm_assert_not_reached(); } diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in index ae3a388b..9aa1751e 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in @@ -629,7 +629,7 @@ alias="type" nmcli-description="Base type of the connection. For hardware-dependent connections, should contain the setting name of the hardware-type specific setting (ie, "802-3-ethernet" or "802-11-wireless" or "bluetooth", etc), and for non-hardware dependent connections like VPN or otherwise, should contain the setting name of that setting type (ie, "vpn" or "bridge", etc)." format="string" - values="6lowpan, 802-11-olpc-mesh, 802-11-wireless, 802-3-ethernet, adsl, bluetooth, bond, bridge, cdma, dummy, generic, gsm, hsr, infiniband, ip-tunnel, loopback, macsec, macvlan, ovs-bridge, ovs-dpdk, ovs-interface, ovs-patch, ovs-port, pppoe, team, tun, veth, vlan, vpn, vrf, vxlan, wifi-p2p, wimax, wireguard, wpan" /> + values="6lowpan, 802-11-olpc-mesh, 802-11-wireless, 802-3-ethernet, adsl, bluetooth, bond, bridge, cdma, dummy, generic, gsm, hsr, infiniband, ip-tunnel, ipvlan, loopback, macsec, macvlan, ovs-bridge, ovs-dpdk, ovs-interface, ovs-patch, ovs-port, pppoe, team, tun, veth, vlan, vpn, vrf, vxlan, wifi-p2p, wimax, wireguard, wpan" /> + + + + + + + + + + + + + + + @@ -1376,10 +1433,14 @@ + + values="default (0), auto (1), disabled (2), enabled (3), fallback (4)" /> @@ -1387,6 +1448,14 @@ nmcli-description="VPN connections will default to add the route automatically unless this setting is set to FALSE. For other connection types, adding such an automatic route is currently not supported and setting this to TRUE has no effect." format="ternary" values="true/yes/on, false/no/off, default/unknown" /> + + + + @@ -1517,6 +1594,25 @@ nmcli-description="Configure the token for draft-chown-6man-tokenised-ipv6-identifiers-02 IPv6 tokenized interface identifiers. Useful with eui64 addr-gen-mode. When set, the token is used as IPv6 interface identifier instead of the hardware address. This only applies to addresses from stateless autoconfiguration, not to IPv6 link local addresses." format="string" /> + + + + + + required_fields; if (!nmc_print_table(&nmc->nmc_config, - (gpointer[]){nmc, NULL}, + (gpointer[]) {nmc, NULL}, NULL, pretty_header_name ?: N_("NetworkManager status"), (const NMMetaAbstractInfo *const *) metagen_general_status, @@ -733,7 +733,7 @@ show_general_logging(NmCli *nmc) fields_str = nmc->required_fields; if (!nmc_print_table(&nmc->nmc_config, - (gpointer const[]){&d, NULL}, + (gpointer const[]) {&d, NULL}, NULL, _("NetworkManager logging"), (const NMMetaAbstractInfo *const *) metagen_general_logging, diff --git a/src/nmcli/settings.c b/src/nmcli/settings.c index 636df466..85f4ad83 100644 --- a/src/nmcli/settings.c +++ b/src/nmcli/settings.c @@ -503,7 +503,7 @@ _env_get_env_flags(const NMMetaEnvironment *environment, gpointer environment_us /*****************************************************************************/ -const NMMetaEnvironment *const nmc_meta_environment = &((NMMetaEnvironment){ +const NMMetaEnvironment *const nmc_meta_environment = &((NMMetaEnvironment) { .warn_fcn = _env_warn_fcn_handle, .get_nm_devices = _env_get_nm_devices, .get_nm_connections = _env_get_nm_connections, @@ -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; @@ -764,13 +777,43 @@ setting_details(const NmcConfig *nmc_config, NMSetting *setting, const char *one if (!nmc_print_table( nmc_config, - (gpointer[]){setting, NULL}, + (gpointer[]) {setting, NULL}, NULL, NULL, - (const NMMetaAbstractInfo *const[]){(const NMMetaAbstractInfo *) setting_info, NULL}, + (const NMMetaAbstractInfo *const[]) {(const NMMetaAbstractInfo *) setting_info, NULL}, fields_str, &error)) return FALSE; 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 9cbf13c4..c1d0e387 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 c65a5486..a613c28f 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; } } diff --git a/src/nmcli/utils.h b/src/nmcli/utils.h index b68a3803..b2539bf4 100644 --- a/src/nmcli/utils.h +++ b/src/nmcli/utils.h @@ -269,13 +269,13 @@ struct _NmcMetaGenericInfo { }; #define NMC_META_GENERIC(n, ...) \ - (&((NmcMetaGenericInfo){.meta_type = &nmc_meta_type_generic_info, .name = n, __VA_ARGS__})) + (&((NmcMetaGenericInfo) {.meta_type = &nmc_meta_type_generic_info, .name = n, __VA_ARGS__})) #define NMC_META_GENERIC_WITH_NESTED(n, nest, ...) \ NMC_META_GENERIC(n, .nested = (nest), __VA_ARGS__) #define NMC_META_GENERIC_GROUP(_group_name, _nested, _name_header) \ - ((const NMMetaAbstractInfo *const *) ((const NmcMetaGenericInfo *const[]){ \ + ((const NMMetaAbstractInfo *const *) ((const NmcMetaGenericInfo *const[]) { \ NMC_META_GENERIC_WITH_NESTED(_group_name, _nested, .name_header = _name_header), \ NULL, \ })) -- cgit 1.3.0-6-gf8a5