diff options
author | Thomas Haller <thaller@redhat.com> | 2018-04-30 10:33:40 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2018-06-13 15:42:58 +0200 |
commit | 3f6b776fd44937c2b4d1ff41a2fb7ae74a364417 (patch) | |
tree | 1af0712b10ffae45f1c56837aa8244602d9acccc | |
parent | 8a2552c800987864a67bc0c14e14733ddecc96bf (diff) | |
download | NetworkManager-3f6b776fd44937c2b4d1ff41a2fb7ae74a364417.tar.gz |
WIP: cli: rework printing of "ap" device detailsth/cli-connection-handling-x
-rw-r--r-- | clients/cli/devices.c | 748 | ||||
-rw-r--r-- | clients/cli/devices.h | 4 | ||||
-rw-r--r-- | clients/cli/nmcli.c | 4 | ||||
-rw-r--r-- | clients/cli/utils.c | 2 | ||||
-rw-r--r-- | clients/cli/utils.h | 18 | ||||
-rw-r--r-- | clients/common/nm-meta-setting-access.c | 28 | ||||
-rw-r--r-- | clients/common/nm-meta-setting-access.h | 3 | ||||
-rwxr-xr-x | clients/tests/test-client.py | 4 |
8 files changed, 387 insertions, 424 deletions
diff --git a/clients/cli/devices.c b/clients/cli/devices.c index ff03419cf7..9cde78f873 100644 --- a/clients/cli/devices.c +++ b/clients/cli/devices.c @@ -29,6 +29,7 @@ #include "nm-secret-agent-simple.h" #include "nm-client-utils.h" +#include "nm-meta-setting-access.h" #include "polkit-agent.h" #include "utils.h" @@ -42,45 +43,41 @@ /*****************************************************************************/ static char * -ap_wpa_rsn_flags_to_string (NM80211ApSecurityFlags flags) +ap_wpa_rsn_flags_to_string (NM80211ApSecurityFlags flags, NMMetaAccessorGetType get_type) { - char *flags_str[16]; /* Enough space for flags and terminating NULL */ - char *ret_str; + char *flags_str[16]; int i = 0; if (flags & NM_802_11_AP_SEC_PAIR_WEP40) - flags_str[i++] = g_strdup ("pair_wpe40"); + flags_str[i++] = "pair_wpe40"; if (flags & NM_802_11_AP_SEC_PAIR_WEP104) - flags_str[i++] = g_strdup ("pair_wpe104"); + flags_str[i++] = "pair_wpe104"; if (flags & NM_802_11_AP_SEC_PAIR_TKIP) - flags_str[i++] = g_strdup ("pair_tkip"); + flags_str[i++] = "pair_tkip"; if (flags & NM_802_11_AP_SEC_PAIR_CCMP) - flags_str[i++] = g_strdup ("pair_ccmp"); + flags_str[i++] = "pair_ccmp"; if (flags & NM_802_11_AP_SEC_GROUP_WEP40) - flags_str[i++] = g_strdup ("group_wpe40"); + flags_str[i++] = "group_wpe40"; if (flags & NM_802_11_AP_SEC_GROUP_WEP104) - flags_str[i++] = g_strdup ("group_wpe104"); + flags_str[i++] = "group_wpe104"; if (flags & NM_802_11_AP_SEC_GROUP_TKIP) - flags_str[i++] = g_strdup ("group_tkip"); + flags_str[i++] = "group_tkip"; if (flags & NM_802_11_AP_SEC_GROUP_CCMP) - flags_str[i++] = g_strdup ("group_ccmp"); + flags_str[i++] = "group_ccmp"; if (flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) - flags_str[i++] = g_strdup ("psk"); + flags_str[i++] = "psk"; if (flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) - flags_str[i++] = g_strdup ("802.1X"); + flags_str[i++] = "802.1X"; - if (i == 0) - flags_str[i++] = g_strdup (_("(none)")); + if (i == 0) { + if (get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY) + return g_strdup (_("(none)")); + return g_strdup ("(none)"); + } flags_str[i] = NULL; - - ret_str = g_strjoinv (" ", flags_str); - - i = 0; - while (flags_str[i]) - g_free (flags_str[i++]); - - return ret_str; + nm_assert (i < G_N_ELEMENTS (flags_str)); + return g_strjoinv (" ", flags_str); } static NMMetaColor @@ -551,41 +548,196 @@ const NmcMetaGenericInfo *const metagen_device_detail_wimax_properties[] = { /*****************************************************************************/ -const NmcMetaGenericInfo *const nmc_fields_dev_wifi_list[] = { - NMC_META_GENERIC ("NAME"), /* 0 */ - NMC_META_GENERIC ("SSID"), /* 1 */ - NMC_META_GENERIC ("SSID-HEX"), /* 2 */ - NMC_META_GENERIC ("BSSID"), /* 3 */ - NMC_META_GENERIC ("MODE"), /* 4 */ - NMC_META_GENERIC ("CHAN"), /* 5 */ - NMC_META_GENERIC ("FREQ"), /* 6 */ - NMC_META_GENERIC ("RATE"), /* 7 */ - NMC_META_GENERIC ("SIGNAL"), /* 8 */ - NMC_META_GENERIC ("BARS"), /* 9 */ - NMC_META_GENERIC ("SECURITY"), /* 10 */ - NMC_META_GENERIC ("WPA-FLAGS"), /* 11 */ - NMC_META_GENERIC ("RSN-FLAGS"), /* 12 */ - NMC_META_GENERIC ("DEVICE"), /* 13 */ - NMC_META_GENERIC ("ACTIVE"), /* 14 */ - NMC_META_GENERIC ("IN-USE"), /* 15 */ - NMC_META_GENERIC ("DBUS-PATH"), /* 16 */ - NULL, +typedef struct { + const char *device_name; + NMAccessPoint *active_ap; +} MetagenDeviceDetailApTableData; + +typedef struct { + NMAccessPoint *ap; + guint index; +} MetagenDeviceDetailApRowData; + +static const MetagenDeviceDetailApRowData ** +_aps_to_row_data (NMAccessPoint *const*aps, guint len) +{ + gpointer r; + const MetagenDeviceDetailApRowData **r_p; + MetagenDeviceDetailApRowData *r_v; + guint i; + + if (len == 0) + return g_new0 (const MetagenDeviceDetailApRowData *, 1); + + G_STATIC_ASSERT_EXPR (_nm_alignof (gpointer) == _nm_alignof (MetagenDeviceDetailApRowData)); + r = g_malloc0 (sizeof (gpointer) * (len + 1) + (sizeof (MetagenDeviceDetailApRowData) * len)); + r_p = r; + r_v = (MetagenDeviceDetailApRowData *) &(((char *) r)[sizeof (gpointer) * (len + 1)]); + + for (i = 0; i < len; i++) { + nm_assert (NM_IS_ACCESS_POINT (aps[i])); + r_v[i].ap = aps[i]; + r_v[i].index = i; + r_p[i] = &r_v[i]; + } + nm_assert (len == NM_PTRARRAY_LEN (r_p)); + return r_p; +} + +static gconstpointer +_metagen_device_detail_ap_get_fcn (NMC_META_GENERIC_INFO_GET_FCN_ARGS) +{ + const MetagenDeviceDetailApTableData *table_data = target_data; + const MetagenDeviceDetailApRowData *row_data = target; + NMAccessPoint *ap = row_data->ap; + GBytes *ssid; + const guint8 *ssid_data; + gsize ssid_len; + NM80211Mode mode; + guint32 freq, bitrate; + guint8 strength; + NM80211ApFlags flags; + NM80211ApSecurityFlags wpa_flags, rsn_flags; + GString *str; + + if (get_type == NM_META_ACCESSOR_GET_TYPE_COLOR) { + NMMetaColor color; + + strength = MIN (nm_access_point_get_strength (ap), 100); + color = wifi_signal_to_color (strength); + if ( info->info_type == NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_IN_USE + && ap == table_data->active_ap) + color = NM_META_COLOR_CONNECTION_ACTIVATED; + return GINT_TO_POINTER (color); + } + + switch (info->info_type) { + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SSID: + ssid = nm_access_point_get_ssid (ap); + if (!ssid) + return NULL; + ssid_data = g_bytes_get_data (ssid, &ssid_len); + return (*out_to_free = nm_utils_ssid_to_utf8 (ssid_data, ssid_len)); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SSID_HEX: + ssid = nm_access_point_get_ssid (ap); + if (!ssid) + return NULL; + ssid_data = g_bytes_get_data (ssid, &ssid_len); + return (*out_to_free = ssid_to_hex ((const char *) ssid_data, ssid_len)); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_BSSID: + return nm_access_point_get_bssid (ap); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_MODE: + mode = nm_access_point_get_mode (ap); + return nmc_meta_generic_get_str_i18n ( mode == NM_802_11_MODE_ADHOC + ? N_("Ad-Hoc") + : ( mode == NM_802_11_MODE_INFRA + ? N_("Infra") + : N_("N/A")), + get_type); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_CHAN: + freq = nm_access_point_get_frequency (ap); + return (*out_to_free = g_strdup_printf ("%u", (guint) nm_utils_wifi_freq_to_channel (freq))); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_FREQ: + freq = nm_access_point_get_frequency (ap); + if (get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY) + return (*out_to_free = g_strdup_printf (_("%u MHz"), (guint) freq)); + return (*out_to_free = g_strdup_printf ("%u MHz", (guint) freq)); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_RATE: + bitrate = nm_access_point_get_max_bitrate (ap); + if (get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY) + return (*out_to_free = g_strdup_printf (_("%u Mbit/s"), (guint) (bitrate / 1000))); + return (*out_to_free = g_strdup_printf ("%u Mbit/s", (guint) (bitrate / 1000))); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SIGNAL: + strength = MIN (nm_access_point_get_strength (ap), 100); + return (*out_to_free = g_strdup_printf ("%u", strength)); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_BARS: + strength = MIN (nm_access_point_get_strength (ap), 100); + return nmc_wifi_strength_bars (strength); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SECURITY: + flags = nm_access_point_get_flags (ap); + wpa_flags = nm_access_point_get_wpa_flags (ap); + rsn_flags = nm_access_point_get_rsn_flags (ap); + str = g_string_new (""); + if ( (flags & NM_802_11_AP_FLAGS_PRIVACY) + && (wpa_flags == NM_802_11_AP_SEC_NONE) + && (rsn_flags == NM_802_11_AP_SEC_NONE)) { + g_string_append (str, get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY ? _("WEP") : "WEP"); + } + if (wpa_flags != NM_802_11_AP_SEC_NONE) { + if (str->len > 0) + g_string_append_c (str, ' '); + g_string_append (str, get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY ? _("WPA1") : "WPA1"); + } + if (rsn_flags != NM_802_11_AP_SEC_NONE) { + if (str->len > 0) + g_string_append_c (str, ' '); + g_string_append (str, get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY ? _("WPA2") : "WPA2"); + } + if ( (wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) + || (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) { + if (str->len > 0) + g_string_append_c (str, ' '); + g_string_append (str, get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY ? _("802.1X") : "802.1X"); + } + return (*out_to_free = g_string_free (str, FALSE)); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_WPA_FLAGS: + wpa_flags = nm_access_point_get_wpa_flags (ap); + return (*out_to_free = ap_wpa_rsn_flags_to_string (wpa_flags, get_type)); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_RSN_FLAGS: + rsn_flags = nm_access_point_get_rsn_flags (ap); + return (*out_to_free = ap_wpa_rsn_flags_to_string (rsn_flags, get_type)); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_DEVICE: + return table_data->device_name; + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_ACTIVE: + return nmc_meta_generic_get_bool (ap == table_data->active_ap, + get_type); + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_IN_USE: + return ap == table_data->active_ap + ? "*" + : " "; + case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_DBUS_PATH: + return nm_object_get_path (NM_OBJECT (ap)); + default: + break; + } + + g_return_val_if_reached (NULL); +} + +const NmcMetaGenericInfo *const metagen_device_detail_ap[_NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_NUM + 1] = { +#define _METAGEN_DEVICE_DETAIL_AP(type, name, ...) \ + [type] = NMC_META_GENERIC(name, .info_type = type, .get_fcn = _metagen_device_detail_ap_get_fcn, ##__VA_ARGS__) + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SSID, "SSID", .common_priority = 2), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SSID_HEX, "SSID-HEX", .common_priority = -1), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_BSSID, "BSSID", .common_priority = -1), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_MODE, "MODE", .common_priority = 3), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_CHAN, "CHAN", .common_priority = 4), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_FREQ, "FREQ", .common_priority = -1), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_RATE, "RATE", .common_priority = 5), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SIGNAL, "SIGNAL", .common_priority = 6), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_BARS, "BARS", .common_priority = 7), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SECURITY, "SECURITY", .common_priority = 8), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_WPA_FLAGS, "WPA-FLAGS", .common_priority = -1), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_RSN_FLAGS, "RSN-FLAGS", .common_priority = -1), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_DEVICE, "DEVICE", .common_priority = -1), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_ACTIVE, "ACTIVE", .common_priority = -1), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_IN_USE, "IN-USE", .common_priority = 1), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_DBUS_PATH, "DBUS-PATH", .common_priority = -1), }; -#define NMC_FIELDS_DEV_WIFI_LIST_COMMON "IN-USE,SSID,MODE,CHAN,RATE,SIGNAL,BARS,SECURITY" -#define NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST "NAME,"NMC_FIELDS_DEV_WIFI_LIST_COMMON - -const NmcMetaGenericInfo *const nmc_fields_dev_wimax_list[] = { - NMC_META_GENERIC ("NAME"), /* 0 */ - NMC_META_GENERIC ("NSP"), /* 1 */ - NMC_META_GENERIC ("SIGNAL"), /* 2 */ - NMC_META_GENERIC ("TYPE"), /* 3 */ - NMC_META_GENERIC ("DEVICE"), /* 4 */ - NMC_META_GENERIC ("ACTIVE"), /* 5 */ - NMC_META_GENERIC ("DBUS-PATH"), /* 6 */ + +/*****************************************************************************/ + +const NmcMetaGenericInfo *const metagen_device_detail_nsp[] = { + NMC_META_GENERIC ("NSP"), + NMC_META_GENERIC ("SIGNAL"), + NMC_META_GENERIC ("TYPE"), + NMC_META_GENERIC ("DEVICE"), + NMC_META_GENERIC ("ACTIVE"), + NMC_META_GENERIC ("DBUS-PATH"), NULL, }; -#define NMC_FIELDS_DEV_WIMAX_LIST_COMMON "NSP,SIGNAL,TYPE,DEVICE,ACTIVE" -#define NMC_FIELDS_DEV_WIMAX_LIST_FOR_DEV_LIST "NAME,"NMC_FIELDS_DEV_WIMAX_LIST_COMMON + +/*****************************************************************************/ const NmcMetaGenericInfo *const nmc_fields_dev_show_master_prop[] = { NMC_META_GENERIC ("NAME"), /* 0 */ @@ -622,10 +774,10 @@ const NmcMetaGenericInfo *const nmc_fields_dev_show_sections[] = { NMC_META_GENERIC_WITH_NESTED ("GENERAL", metagen_device_detail_general), /* 0 */ NMC_META_GENERIC_WITH_NESTED ("CAPABILITIES", metagen_device_detail_capabilities), /* 1 */ NMC_META_GENERIC_WITH_NESTED ("WIFI-PROPERTIES", metagen_device_detail_wifi_properties), /* 2 */ - NMC_META_GENERIC_WITH_NESTED ("AP", nmc_fields_dev_wifi_list + 1), /* 3 */ + NMC_META_GENERIC_WITH_NESTED ("AP", metagen_device_detail_ap), /* 3 */ NMC_META_GENERIC_WITH_NESTED ("WIRED-PROPERTIES", metagen_device_detail_wired_properties), /* 4 */ NMC_META_GENERIC_WITH_NESTED ("WIMAX-PROPERTIES", metagen_device_detail_wimax_properties), /* 5 */ - NMC_META_GENERIC_WITH_NESTED ("NSP", nmc_fields_dev_wimax_list + 1), /* 6 */ + NMC_META_GENERIC_WITH_NESTED ("NSP", metagen_device_detail_nsp), /* 6 */ NMC_META_GENERIC_WITH_NESTED ("IP4", metagen_ip4_config), /* 7 */ NMC_META_GENERIC_WITH_NESTED ("DHCP4", metagen_dhcp_config), /* 8 */ NMC_META_GENERIC_WITH_NESTED ("IP6", metagen_ip6_config), /* 9 */ @@ -1097,30 +1249,25 @@ compare_aps (gconstpointer a, gconstpointer b, gpointer user_data) { NMAccessPoint *apa = *(NMAccessPoint **)a; NMAccessPoint *apb = *(NMAccessPoint **)b; - int cmp; - - cmp = nm_access_point_get_strength (apb) - nm_access_point_get_strength (apa); - if (cmp != 0) - return cmp; - - cmp = nm_access_point_get_frequency (apa) - nm_access_point_get_frequency (apb); - if (cmp != 0) - return cmp; - return nm_access_point_get_max_bitrate (apb) - nm_access_point_get_max_bitrate (apa); + NM_CMP_DIRECT (nm_access_point_get_strength (apb), nm_access_point_get_strength (apa)); + NM_CMP_DIRECT (nm_access_point_get_frequency (apa), nm_access_point_get_frequency (apb)); + NM_CMP_DIRECT (nm_access_point_get_max_bitrate (apb), nm_access_point_get_max_bitrate (apa)); + return 0; } static GPtrArray * sort_access_points (const GPtrArray *aps) { GPtrArray *sorted; - int i; + guint i; g_return_val_if_fail (aps, NULL); sorted = g_ptr_array_sized_new (aps->len); + g_ptr_array_set_free_func (sorted, nm_g_object_unref); for (i = 0; i < aps->len; i++) - g_ptr_array_add (sorted, aps->pdata[i]); + g_ptr_array_add (sorted, g_object_ref (aps->pdata[i])); g_ptr_array_sort_with_data (sorted, compare_aps, NULL); return sorted; } @@ -1134,121 +1281,6 @@ typedef struct { GPtrArray *output_data; } APInfo; -static void -fill_output_access_point (gpointer data, gpointer user_data) -{ - NMAccessPoint *ap = NM_ACCESS_POINT (data); - APInfo *info = (APInfo *) user_data; - NmcOutputField *arr; - gboolean active = FALSE; - NM80211ApFlags flags; - NM80211ApSecurityFlags wpa_flags, rsn_flags; - guint32 freq, bitrate; - guint8 strength; - GBytes *ssid; - const char *bssid; - NM80211Mode mode; - char *channel_str, *freq_str, *ssid_str = NULL, *ssid_hex_str = NULL, - *bitrate_str, *strength_str, *wpa_flags_str, *rsn_flags_str; - GString *security_str; - char *ap_name; - const char *sig_bars; - NMMetaColor color; - - if (info->active_bssid) { - const char *current_bssid = nm_access_point_get_bssid (ap); - if (current_bssid && !strcmp (current_bssid, info->active_bssid)) - active = TRUE; - } - - /* Get AP properties */ - flags = nm_access_point_get_flags (ap); - wpa_flags = nm_access_point_get_wpa_flags (ap); - rsn_flags = nm_access_point_get_rsn_flags (ap); - ssid = nm_access_point_get_ssid (ap); - bssid = nm_access_point_get_bssid (ap); - freq = nm_access_point_get_frequency (ap); - mode = nm_access_point_get_mode (ap); - bitrate = nm_access_point_get_max_bitrate (ap); - strength = MIN (nm_access_point_get_strength (ap), 100); - - /* Convert to strings */ - if (ssid) { - const guint8 *ssid_data; - gsize ssid_len; - - ssid_data = g_bytes_get_data (ssid, &ssid_len); - ssid_str = nm_utils_ssid_to_utf8 (ssid_data, ssid_len); - ssid_hex_str = ssid_to_hex ((const char *) ssid_data, ssid_len); - } - channel_str = g_strdup_printf ("%u", nm_utils_wifi_freq_to_channel (freq)); - freq_str = g_strdup_printf (_("%u MHz"), freq); - bitrate_str = g_strdup_printf (_("%u Mbit/s"), bitrate/1000); - strength_str = g_strdup_printf ("%u", strength); - wpa_flags_str = ap_wpa_rsn_flags_to_string (wpa_flags); - rsn_flags_str = ap_wpa_rsn_flags_to_string (rsn_flags); - sig_bars = nmc_wifi_strength_bars (strength); - - security_str = g_string_new (NULL); - - if ( (flags & NM_802_11_AP_FLAGS_PRIVACY) - && (wpa_flags == NM_802_11_AP_SEC_NONE) - && (rsn_flags == NM_802_11_AP_SEC_NONE)) { - g_string_append (security_str, _("WEP")); - g_string_append_c (security_str, ' '); - } - if (wpa_flags != NM_802_11_AP_SEC_NONE) { - g_string_append (security_str, _("WPA1")); - g_string_append_c (security_str, ' '); - } - if (rsn_flags != NM_802_11_AP_SEC_NONE) { - g_string_append (security_str, _("WPA2")); - g_string_append_c (security_str, ' '); - } - if ( (wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) - || (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) { - g_string_append (security_str, _("802.1X")); - g_string_append_c (security_str, ' '); - } - - if (security_str->len > 0) - g_string_truncate (security_str, security_str->len-1); /* Chop off last space */ - - arr = nmc_dup_fields_array ((const NMMetaAbstractInfo *const*) nmc_fields_dev_wifi_list, - info->output_flags); - - ap_name = g_strdup_printf ("AP[%d]", info->index++); /* AP */ - set_val_str (arr, 0, ap_name); - set_val_str (arr, 1, ssid_str); - set_val_str (arr, 2, ssid_hex_str); - set_val_strc (arr, 3, bssid); - set_val_strc (arr, 4, mode == NM_802_11_MODE_ADHOC ? _("Ad-Hoc") - : mode == NM_802_11_MODE_INFRA ? _("Infra") - : _("N/A")); - set_val_str (arr, 5, channel_str); - set_val_str (arr, 6, freq_str); - set_val_str (arr, 7, bitrate_str); - set_val_str (arr, 8, strength_str); - set_val_strc (arr, 9, sig_bars); - set_val_str (arr, 10, security_str->str); - set_val_str (arr, 11, wpa_flags_str); - set_val_str (arr, 12, rsn_flags_str); - set_val_strc (arr, 13, info->device); - set_val_strc (arr, 14, active ? _("yes") : _("no")); - set_val_strc (arr, 15, active ? "*" : " "); - set_val_strc (arr, 16, nm_object_get_path (NM_OBJECT (ap))); - - /* Set colors */ - color = wifi_signal_to_color (strength); - set_val_color_all (arr, color); - if (active) - arr[15].color = NM_META_COLOR_CONNECTION_ACTIVATED; - - g_ptr_array_add (info->output_data, arr); - - g_string_free (security_str, FALSE); -} - static char * bluetooth_caps_to_string (NMBluetoothCapabilities caps) { @@ -1410,7 +1442,6 @@ static gboolean show_device_info (NMDevice *device, NmCli *nmc) { GError *error = NULL; - NMDeviceState state = NM_DEVICE_STATE_UNKNOWN; GArray *sections_array; int k; const char *fields_str = NULL; @@ -1471,8 +1502,6 @@ show_device_info (NMDevice *device, NmCli *nmc) was_output = FALSE; - state = nm_device_get_state (device); - if (nmc_fields_dev_show_sections[section_idx]->nested == metagen_device_detail_general) { nmc_print (&nmc->nmc_config, (gpointer[]) { device, NULL }, @@ -1514,45 +1543,32 @@ show_device_info (NMDevice *device, NmCli *nmc) continue; } - /* Wireless specific information */ - if ((NM_IS_DEVICE_WIFI (device))) { - NMAccessPoint *active_ap = NULL; - const char *active_bssid = NULL; - GPtrArray *aps; - - /* section AP */ - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[3]->name)) { - NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - - if (state == NM_DEVICE_STATE_ACTIVATED) { - active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (device)); - active_bssid = active_ap ? nm_access_point_get_bssid (active_ap) : NULL; - } - - tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_wifi_list; - out_indices = parse_output_fields (section_fld ?: NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST, - tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (out.output_data, arr); - - { - APInfo info = { - .nmc = nmc, - .index = 1, - .output_flags = NMC_OF_FLAG_SECTION_PREFIX, - .active_bssid = active_bssid, - .device = nm_device_get_iface (device), - .output_data = out.output_data, + if (nmc_fields_dev_show_sections[section_idx]->nested == metagen_device_detail_ap) { + if ((NM_IS_DEVICE_WIFI (device))) { + gs_unref_array GPtrArray *aps = NULL; + + aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device))); + if (aps->len > 0) { + const MetagenDeviceDetailApTableData table_data = { + .device_name = nm_device_get_iface (device), + .active_ap = (nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED) + ? nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (device)) + : NULL, }; - - aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device))); - g_ptr_array_foreach (aps, fill_output_access_point, &info); - g_ptr_array_free (aps, FALSE); + gs_free const MetagenDeviceDetailApRowData **aps_row = NULL; + + aps_row = _aps_to_row_data ((NMAccessPoint **) aps->pdata, aps->len); + nmc_print (&nmc->nmc_config, + (gpointer *) aps_row, + (gpointer) &table_data, + NULL, + NMC_META_GENERIC_GROUP ("AP", metagen_device_detail_ap, N_("NAME"), + .with_indexed_header = TRUE), + "AP", + section_fld, + NULL); + was_output = TRUE; } - - print_data_prepare_width (out.output_data); - print_data (&nmc->nmc_config, out_indices, NULL, 0, &out); - was_output = TRUE; } } @@ -2671,41 +2687,6 @@ do_devices_monitor (NmCli *nmc, int argc, char **argv) return nmc->return_value; } -static void -show_access_point_info (NMDevice *device, NmCli *nmc, NmcOutputData *out) -{ - NMAccessPoint *active_ap = NULL; - const char *active_bssid = NULL; - GPtrArray *aps; - NmcOutputField *arr; - - if (nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED) { - active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (device)); - active_bssid = active_ap ? nm_access_point_get_bssid (active_ap) : NULL; - } - - arr = nmc_dup_fields_array ((const NMMetaAbstractInfo *const*) nmc_fields_dev_wifi_list, - NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (out->output_data, arr); - - { - APInfo info = { - .nmc = nmc, - .index = 1, - .output_flags = 0, - .active_bssid = active_bssid, - .device = nm_device_get_iface (device), - .output_data = out->output_data, - }; - - aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device))); - g_ptr_array_foreach (aps, fill_output_access_point, &info); - g_ptr_array_free (aps, FALSE); - } - - print_data_prepare_width (out->output_data); -} - /* * Find a Wi-Fi device with 'iface' in 'devices' array. If 'iface' is NULL, * the first Wi-Fi device is returned. 'idx' parameter is updated to the point @@ -2823,21 +2804,16 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) { GError *error = NULL; NMDevice *device = NULL; - NMAccessPoint *ap = NULL; const char *ifname = NULL; const char *bssid_user = NULL; - gs_free NMDevice **devices = NULL; - const GPtrArray *aps; - APInfo *info; - int i, j; - const char *fields_str = NULL; - const NMMetaAbstractInfo *const*tmpl; - NmcOutputField *arr; - const char *base_hdr = _("Wi-Fi scan list"); - NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - gs_free char *header_name = NULL; + gboolean bssid_user_handled; + gboolean ifname_handled; + NMDevice *ifname_handled_candidate; + gs_free NMDevice **devices_all = NULL; + guint idx_d, i; + gs_free NMMetaSelectionResultList *selection = NULL; - devices = nmc_get_devices_sorted (nmc->client); + devices_all = nmc_get_devices_sorted (nmc->client); next_arg (nmc, &argc, &argv, NULL); while (argc > 0) { @@ -2853,7 +2829,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) } ifname = *argv; if (argc == 1 && nmc->complete) - complete_device (devices, ifname, TRUE); + complete_device (devices_all, ifname, TRUE); } else if (strcmp (*argv, "bssid") == 0 || strcmp (*argv, "hwaddr") == 0) { /* hwaddr is deprecated and will be removed later */ argc--; @@ -2864,7 +2840,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) } bssid_user = *argv; if (argc == 1 && nmc->complete) - complete_aps (devices, NULL, bssid_user, NULL); + complete_aps (devices_all, NULL, bssid_user, NULL); } else if (!nmc->complete) { g_printerr (_("Unknown parameter: %s\n"), *argv); } @@ -2872,159 +2848,119 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) next_arg (nmc, &argc, &argv, NULL); } - if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) - fields_str = NMC_FIELDS_DEV_WIFI_LIST_COMMON; - else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) { - } else - fields_str = nmc->required_fields; - - tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_wifi_list; - out_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); + if (nmc->complete) + return nmc->return_value; + selection = nm_meta_selection_create_parse_list ((const NMMetaAbstractInfo *const*) metagen_device_detail_ap, + NULL, + nmc->required_fields, + FALSE, + &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'device wifi': %s"), error->message); g_error_free (error); return NMC_RESULT_ERROR_USER_INPUT; } - if (nmc->complete) - return nmc->return_value; + bssid_user_handled = !bssid_user; + ifname_handled = !ifname; + ifname_handled_candidate = NULL; - if (ifname) { - - device = find_wifi_device_by_iface (devices, ifname, NULL); - if (!device) { - g_string_printf (nmc->return_text, _("Error: Device '%s' not found."), ifname); - return NMC_RESULT_ERROR_NOT_FOUND; - } - /* Main header name */ - header_name = construct_header_name (base_hdr, ifname); - - if (NM_IS_DEVICE_WIFI (device)) { - if (bssid_user) { - /* Specific AP requested - list only that */ - aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device)); - for (j = 0; j < aps->len; j++) { - char *bssid_up; - NMAccessPoint *candidate_ap = g_ptr_array_index (aps, j); - const char *candidate_bssid = nm_access_point_get_bssid (candidate_ap); - - bssid_up = g_ascii_strup (bssid_user, -1); - if (!strcmp (bssid_up, candidate_bssid)) - ap = candidate_ap; - g_free (bssid_up); - } - if (!ap) { - g_string_printf (nmc->return_text, _("Error: Access point with bssid '%s' not found."), - bssid_user); - return NMC_RESULT_ERROR_NOT_FOUND; - } - /* Add headers (field names) */ - arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (out.output_data, arr); - - info = g_malloc0 (sizeof (APInfo)); - info->nmc = nmc; - info->index = 1; - info->output_flags = 0; - info->active_bssid = NULL; - info->device = nm_device_get_iface (device); + for (idx_d = 0; devices_all[idx_d]; idx_d++) { + const GPtrArray *aps_all; + gs_unref_ptrarray GPtrArray *aps_selected = NULL; + const char *dev_iface; + gs_free char *header_name = NULL; + MetagenDeviceDetailApTableData table_data = { }; + gs_free const MetagenDeviceDetailApRowData **aps_row = NULL; - fill_output_access_point (ap, info); + device = devices_all[idx_d]; + dev_iface = nm_device_get_iface (device); - print_data_prepare_width (out.output_data); - print_data (&nmc->nmc_config, out_indices, header_name, 0, &out); - g_free (info); - } else { - show_access_point_info (device, nmc, &out); - print_data (&nmc->nmc_config, out_indices, NULL, 0, &out); + if (ifname) { + if (!nm_streq0 (ifname, dev_iface)) + continue; + if (!NM_IS_DEVICE_WIFI (device)) { + if ( nm_device_get_device_type (device) == NM_DEVICE_TYPE_GENERIC + && nm_streq0 (nm_device_get_type_description (device), "wifi")) + ifname_handled_candidate = device; + else if (!ifname_handled_candidate) + ifname_handled_candidate = device; + continue; } + ifname_handled = TRUE; } else { - if ( nm_device_get_device_type (device) == NM_DEVICE_TYPE_GENERIC - && g_strcmp0 (nm_device_get_type_description (device), "wifi") == 0) { - g_string_printf (nmc->return_text, - _("Error: Device '%s' was not recognized as a Wi-Fi device, check NetworkManager Wi-Fi plugin."), - ifname); - } else { - g_string_printf (nmc->return_text, - _("Error: Device '%s' is not a Wi-Fi device."), - ifname); - } - return NMC_RESULT_ERROR_UNKNOWN; + if (!NM_IS_DEVICE_WIFI (device)) + continue; } - } else { - gboolean empty_line = FALSE; - /* List APs for all devices */ + aps_all = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device)); if (bssid_user) { - /* Specific AP requested - list only that */ - for (i = 0; devices[i]; i++) { - NMDevice *dev = devices[i]; - NMC_OUTPUT_DATA_DEFINE_SCOPED (out2); - gs_free char *header_name2 = NULL; + gs_free char *bssid_user_up = g_ascii_strup (bssid_user, -1); - if (!NM_IS_DEVICE_WIFI (dev)) - continue; + for (i = 0; i < aps_all->len; i++) { + NMAccessPoint *candidate_ap = aps_all->pdata[i]; + const char *candidate_bssid = nm_access_point_get_bssid (candidate_ap); - /* Main header name */ - header_name2 = construct_header_name (base_hdr, nm_device_get_iface (dev)); - out2_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL); - - arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (out2.output_data, arr); - - aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (dev)); - for (j = 0; j < aps->len; j++) { - char *bssid_up; - NMAccessPoint *candidate_ap = g_ptr_array_index (aps, j); - const char *candidate_bssid = nm_access_point_get_bssid (candidate_ap); - - bssid_up = g_ascii_strup (bssid_user, -1); - if (!strcmp (bssid_up, candidate_bssid)) { - ap = candidate_ap; - - info = g_malloc0 (sizeof (APInfo)); - info->nmc = nmc; - info->index = 1; - info->output_flags = 0; - info->active_bssid = NULL; - info->device = nm_device_get_iface (dev); - fill_output_access_point (ap, info); - g_free (info); - } - g_free (bssid_up); - } - if (empty_line) - g_print ("\n"); /* Empty line between devices' APs */ - print_data_prepare_width (out2.output_data); - print_data (&nmc->nmc_config, out2_indices, header_name2, 0, &out2); - empty_line = TRUE; - } - if (!ap) { - g_string_printf (nmc->return_text, _("Error: Access point with bssid '%s' not found."), - bssid_user); - return NMC_RESULT_ERROR_NOT_FOUND; + if (!candidate_bssid) + continue; + if (!nm_utils_hwaddr_matches (bssid_user, -1, candidate_bssid, -1)) + continue; + if (!aps_selected) + aps_selected = g_ptr_array_new_with_free_func (nm_g_object_unref); + g_ptr_array_add (aps_selected, g_object_ref (candidate_ap)); } + + if (!aps_selected) + continue; + + bssid_user_handled = FALSE; } else { - for (i = 0; devices[i]; i++) { - NMDevice *dev = devices[i]; - NMC_OUTPUT_DATA_DEFINE_SCOPED (out2); - gs_free char *header_name2 = NULL; - - /* Main header name */ - header_name2 = construct_header_name (base_hdr, - nm_device_get_iface (dev)); - out2_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL); - - if (NM_IS_DEVICE_WIFI (dev)) { - if (empty_line) - g_print ("\n"); /* Empty line between devices' APs */ - show_access_point_info (dev, nmc, &out2); - print_data (&nmc->nmc_config, out2_indices, header_name2, 0, &out2); - empty_line = TRUE; - } - } + aps_selected = sort_access_points (aps_all); + if (aps_selected->len == 0) + continue; } + + header_name = construct_header_name (_("Wi-Fi scan list"), nm_device_get_iface (device)); + + table_data.device_name = dev_iface; + if (nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED) + table_data.active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (device)); + + aps_row = _aps_to_row_data ((NMAccessPoint **) aps_selected->pdata, aps_selected->len); + nmc_print (&nmc->nmc_config, + (gpointer *) aps_row, + &table_data, + header_name, + NMC_META_GENERIC_GROUP ("AP", metagen_device_detail_ap, N_("NAME"), + .with_indexed_header = TRUE), + "AP", + nmc->required_fields, + NULL); + } + + if (!ifname_handled) { + if (!ifname_handled_candidate) { + g_string_printf (nmc->return_text, + _("Error: Device '%s' not found."), + ifname); + } else if ( nm_device_get_device_type (ifname_handled_candidate) == NM_DEVICE_TYPE_GENERIC + && nm_streq0 (nm_device_get_type_description (ifname_handled_candidate), "wifi")) { + g_string_printf (nmc->return_text, + _("Error: Device '%s' was not recognized as a Wi-Fi device, check NetworkManager Wi-Fi plugin."), + ifname); + } else { + g_string_printf (nmc->return_text, + _("Error: Device '%s' is not a Wi-Fi device."), + ifname); + } + return NMC_RESULT_ERROR_NOT_FOUND; + } + + if (!bssid_user_handled) { + g_string_printf (nmc->return_text, _("Error: Access point with bssid '%s' not found."), + bssid_user); + return NMC_RESULT_ERROR_NOT_FOUND; } return nmc->return_value; diff --git a/clients/cli/devices.h b/clients/cli/devices.h index 7a05b50b2b..0217241424 100644 --- a/clients/cli/devices.h +++ b/clients/cli/devices.h @@ -41,8 +41,8 @@ extern const NmcMetaGenericInfo *const metagen_device_detail_capabilities[]; extern const NmcMetaGenericInfo *const metagen_device_detail_wired_properties[]; extern const NmcMetaGenericInfo *const metagen_device_detail_wifi_properties[]; extern const NmcMetaGenericInfo *const metagen_device_detail_wimax_properties[]; -extern const NmcMetaGenericInfo *const nmc_fields_dev_wifi_list[]; -extern const NmcMetaGenericInfo *const nmc_fields_dev_wimax_list[]; +extern const NmcMetaGenericInfo *const metagen_device_detail_ap[]; +extern const NmcMetaGenericInfo *const metagen_device_detail_nsp[]; extern const NmcMetaGenericInfo *const nmc_fields_dev_show_master_prop[]; extern const NmcMetaGenericInfo *const nmc_fields_dev_show_team_prop[]; extern const NmcMetaGenericInfo *const nmc_fields_dev_show_vlan_prop[]; diff --git a/clients/cli/nmcli.c b/clients/cli/nmcli.c index 8e8dce8a0d..2180a9b5f4 100644 --- a/clients/cli/nmcli.c +++ b/clients/cli/nmcli.c @@ -199,8 +199,8 @@ complete_fields (const char *option, const char *prefix) complete_field (h, metagen_device_detail_wired_properties); complete_field (h, metagen_device_detail_wifi_properties); complete_field (h, metagen_device_detail_wimax_properties); - complete_field (h, nmc_fields_dev_wifi_list); - complete_field (h, nmc_fields_dev_wimax_list); + complete_field (h, metagen_device_detail_ap); + complete_field (h, metagen_device_detail_nsp); complete_field (h, nmc_fields_dev_show_master_prop); complete_field (h, nmc_fields_dev_show_team_prop); complete_field (h, nmc_fields_dev_show_vlan_prop); diff --git a/clients/cli/utils.c b/clients/cli/utils.c index 72c680d3a1..b20ed00535 100644 --- a/clients/cli/utils.c +++ b/clients/cli/utils.c @@ -738,7 +738,7 @@ _output_selection_append (GArray *cols, } else { nested = nm_meta_abstract_info_get_nested (selection_item->info, FALSE, NULL, &nested_to_free); if (nested) { - selection = nm_meta_selection_create_all (nested); + selection = nm_meta_selection_create_all (nested, "common"); nm_assert (selection && selection->num > 0); } else selection = NULL; diff --git a/clients/cli/utils.h b/clients/cli/utils.h index 6222b69fb0..cdedfb81e7 100644 --- a/clients/cli/utils.h +++ b/clients/cli/utils.h @@ -223,6 +223,24 @@ typedef enum { NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_WIFI_PROPERTIES_5GHZ, _NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_WIFI_PROPERTIES_NUM, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SSID = 0, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SSID_HEX, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_BSSID, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_MODE, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_CHAN, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_FREQ, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_RATE, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SIGNAL, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_BARS, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SECURITY, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_WPA_FLAGS, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_RSN_FLAGS, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_DEVICE, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_ACTIVE, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_IN_USE, + NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_DBUS_PATH, + _NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_NUM, + } NmcGenericInfoType; #define NMC_HANDLE_COLOR(color) \ diff --git a/clients/common/nm-meta-setting-access.c b/clients/common/nm-meta-setting-access.c index d7417ba6e0..045525a1c8 100644 --- a/clients/common/nm-meta-setting-access.c +++ b/clients/common/nm-meta-setting-access.c @@ -563,7 +563,8 @@ typedef struct { static NMMetaSelectionResultList * _output_selection_pack (const NMMetaAbstractInfo *const* fields_array, GArray *array, - GString *str) + GString *str, + const char *self_selection) { NMMetaSelectionResultList *result; guint i; @@ -587,10 +588,16 @@ _output_selection_pack (const NMMetaAbstractInfo *const* fields_array, p->info = fields_array[a->idx]; p->idx = a->idx; - if (a->self_offset_plus_1 > 0) + if (self_selection) { + nm_assert (a->self_offset_plus_1 == 0); + nm_assert (a->sub_offset_plus_1 == 0); + p->self_selection = self_selection; + } else { + nm_assert (a->self_offset_plus_1 > 0); p->self_selection = &pdata[a->self_offset_plus_1 - 1]; - if (a->sub_offset_plus_1 > 0) - p->sub_selection = &pdata[a->sub_offset_plus_1 - 1]; + if (a->sub_offset_plus_1 > 0) + p->sub_selection = &pdata[a->sub_offset_plus_1 - 1]; + } } } @@ -716,7 +723,8 @@ not_found: } NMMetaSelectionResultList * -nm_meta_selection_create_all (const NMMetaAbstractInfo *const* fields_array) +nm_meta_selection_create_all (const NMMetaAbstractInfo *const* fields_array, + const char *self_selection) { gs_unref_array GArray *array = NULL; guint i; @@ -732,7 +740,7 @@ nm_meta_selection_create_all (const NMMetaAbstractInfo *const* fields_array) } } - return _output_selection_pack (fields_array, array, NULL); + return _output_selection_pack (fields_array, array, NULL, self_selection); } NMMetaSelectionResultList * @@ -756,7 +764,7 @@ nm_meta_selection_create_parse_one (const NMMetaAbstractInfo *const* fields_arra &str, error)) return NULL; - return _output_selection_pack (fields_array, array, str); + return _output_selection_pack (fields_array, array, str, NULL); } @@ -795,13 +803,13 @@ nm_meta_selection_create_parse_list (const NMMetaAbstractInfo *const* fields_arr if (fields_len == 0 || ( fields_len == 1 && !g_ascii_strcasecmp (fields_words[0], "all"))) - return nm_meta_selection_create_all (fields_array); + return nm_meta_selection_create_all (fields_array, "all"); else if ( fields_len == 1 && !g_ascii_strcasecmp (fields_words[0], "common")) { gs_free gpointer f = NULL; fields_array = nm_meta_abstract_infos_select_included_in_common (fields_array, -1, NULL, &f); - return nm_meta_selection_create_all (fields_array); + return nm_meta_selection_create_all (fields_array, "common"); } if (fields_prefix) { @@ -823,5 +831,5 @@ nm_meta_selection_create_parse_list (const NMMetaAbstractInfo *const* fields_arr return NULL; } - return _output_selection_pack (fields_array, array, str); + return _output_selection_pack (fields_array, array, str, NULL); } diff --git a/clients/common/nm-meta-setting-access.h b/clients/common/nm-meta-setting-access.h index 5981094966..736666db2a 100644 --- a/clients/common/nm-meta-setting-access.h +++ b/clients/common/nm-meta-setting-access.h @@ -94,7 +94,8 @@ typedef struct { const NMMetaSelectionItem items[]; } NMMetaSelectionResultList; -NMMetaSelectionResultList *nm_meta_selection_create_all (const NMMetaAbstractInfo *const* fields_array); +NMMetaSelectionResultList *nm_meta_selection_create_all (const NMMetaAbstractInfo *const* fields_array, + const char *self_selection); NMMetaSelectionResultList *nm_meta_selection_create_parse_one (const NMMetaAbstractInfo *const* fields_array, const char *fields_prefix, const char *fields_str, diff --git a/clients/tests/test-client.py b/clients/tests/test-client.py index 5bd2de2393..fc410b82a4 100755 --- a/clients/tests/test-client.py +++ b/clients/tests/test-client.py @@ -983,10 +983,10 @@ class TestNmcli(NmTestBase): self.call_nmcli_l(mode + ['-f', 'ALL', 'device', 'wifi', 'list' ], replace_stdout = replace_stdout) self.call_nmcli_l(mode + ['-f', 'ALL', 'device', 'wifi', 'list', 'bssid', 'C0:E2:BE:E8:EF:B6'], - replace_stdout = replace_stdout, fatal_warnings = True, expected_stderr = _UNSTABLE_OUTPUT) + replace_stdout = replace_stdout) self.call_nmcli_l(mode + ['-f', 'NAME,SSID,SSID-HEX,BSSID,MODE,CHAN,FREQ,RATE,SIGNAL,BARS,SECURITY,WPA-FLAGS,RSN-FLAGS,DEVICE,ACTIVE,IN-USE,DBUS-PATH', 'device', 'wifi', 'list', 'bssid', 'C0:E2:BE:E8:EF:B6'], - replace_stdout = replace_stdout, fatal_warnings = True, expected_stderr = _UNSTABLE_OUTPUT) + replace_stdout = replace_stdout) ############################################################################### |