diff options
author | Thomas Haller <thaller@redhat.com> | 2020-03-10 20:04:48 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-03-16 13:46:33 +0100 |
commit | fe0c916ec7156c9cfd94602de09982c69a744cad (patch) | |
tree | 565a35a9fed201f2e5a9fba2d3967cfd8ece7d01 | |
parent | 10eaa7ad474475ebd3b5b2662b86f9cb11b2c288 (diff) | |
download | NetworkManager-fe0c916ec7156c9cfd94602de09982c69a744cad.tar.gz |
WIP: cli: rework printing of "ap" device detailsth/cli-connection-handling-6
-rw-r--r-- | clients/cli/devices.c | 584 | ||||
-rw-r--r-- | clients/cli/devices.h | 4 | ||||
-rw-r--r-- | clients/cli/nmcli.c | 4 | ||||
-rw-r--r-- | clients/cli/utils.h | 18 |
4 files changed, 304 insertions, 306 deletions
diff --git a/clients/cli/devices.c b/clients/cli/devices.c index 3ea7bd2808..c46577d91c 100644 --- a/clients/cli/devices.c +++ b/clients/cli/devices.c @@ -13,6 +13,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" @@ -611,41 +612,210 @@ 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_INFRA ? N_("Infra") + : mode == NM_802_11_MODE_ADHOC ? N_("Ad-Hoc") + : mode == NM_802_11_MODE_MESH ? N_("Mesh") + : 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 (nm_gstring_add_space_delimiter (str), + "WEP"); + } + if (wpa_flags != NM_802_11_AP_SEC_NONE) { + g_string_append (nm_gstring_add_space_delimiter (str), + "WPA1"); + } + if ( (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) + || (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) { + g_string_append (nm_gstring_add_space_delimiter (str), + "WPA2"); + } + if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_SAE) { + g_string_append (nm_gstring_add_space_delimiter (str), + "WPA3"); + } + if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_OWE) { + g_string_append (nm_gstring_add_space_delimiter (str), + "OWE"); + } + 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 (nm_gstring_add_space_delimiter (str), + "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 = 3), + _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 = 2), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_MODE, "MODE", .common_priority = 4), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_CHAN, "CHAN", .common_priority = 5), + _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 = 6), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SIGNAL, "SIGNAL", .common_priority = 7), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_BARS, "BARS", .common_priority = 8), + _METAGEN_DEVICE_DETAIL_AP (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_AP_SECURITY, "SECURITY", .common_priority = 9), + _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,BSSID,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 */ + +static const NMMetaAbstractInfo *const*_metagen_device_detail_ap_group = + NMC_META_GENERIC_GROUP ("AP", + metagen_device_detail_ap, + N_("NAME"), + .with_indexed_header = TRUE, + .is_common_parent = TRUE, + .common_priority = -1); + +/*****************************************************************************/ + +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 */ @@ -683,10 +853,10 @@ const NmcMetaGenericInfo *const nmc_fields_dev_show_sections[] = { NMC_META_GENERIC_WITH_NESTED ("CAPABILITIES", metagen_device_detail_capabilities), /* 1 */ NMC_META_GENERIC_WITH_NESTED ("INTERFACE-FLAGS", metagen_device_detail_interface_flags), /* 2 */ NMC_META_GENERIC_WITH_NESTED ("WIFI-PROPERTIES", metagen_device_detail_wifi_properties), /* 3 */ - NMC_META_GENERIC_WITH_NESTED ("AP", nmc_fields_dev_wifi_list + 1), /* 4 */ + NMC_META_GENERIC_WITH_NESTED ("AP", metagen_device_detail_ap), /* 4 */ NMC_META_GENERIC_WITH_NESTED ("WIRED-PROPERTIES", metagen_device_detail_wired_properties), /* 5 */ NMC_META_GENERIC_WITH_NESTED ("WIMAX-PROPERTIES", metagen_device_detail_wimax_properties), /* 6 */ - NMC_META_GENERIC_WITH_NESTED ("NSP", nmc_fields_dev_wimax_list + 1), /* 7 */ + NMC_META_GENERIC_WITH_NESTED ("NSP", metagen_device_detail_nsp), /* 7 */ NMC_META_GENERIC_WITH_NESTED ("IP4", metagen_ip4_config), /* 8 */ NMC_META_GENERIC_WITH_NESTED ("DHCP4", metagen_dhcp_config), /* 9 */ NMC_META_GENERIC_WITH_NESTED ("IP6", metagen_ip6_config), /* 10 */ @@ -1142,125 +1312,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, NM_META_ACCESSOR_GET_TYPE_PRETTY); - rsn_flags_str = ap_wpa_rsn_flags_to_string (rsn_flags, NM_META_ACCESSOR_GET_TYPE_PRETTY); - 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 "); - } - if (wpa_flags != NM_802_11_AP_SEC_NONE) { - g_string_append (security_str, "WPA1 "); - } - if ( (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) - || (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) { - g_string_append (security_str, "WPA2 "); - } - if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_SAE) { - g_string_append (security_str, "WPA3 "); - } - if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_OWE) { - g_string_append (security_str, "OWE "); - } - 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 "); - } - - 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") - : mode == NM_802_11_MODE_MESH ? _("Mesh") - : _("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) { @@ -1422,7 +1473,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; @@ -1483,8 +1533,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 }, @@ -1539,44 +1587,34 @@ 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; - - /* section AP */ - if (!g_ascii_strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[4]->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); - - { - gs_unref_ptrarray GPtrArray *aps = NULL; - 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_ptrarray 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); + 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 ?: "common", + NULL); + was_output = TRUE; } - - print_data_prepare_width (out.output_data); - print_data (&nmc->nmc_config, out_indices, NULL, 0, &out); - was_output = TRUE; } } @@ -2779,112 +2817,65 @@ find_ap_on_device (NMDevice *device, const char *bssid, const char *ssid, gboole } static void -show_access_point_info (NMDeviceWifi *wifi, NmCli *nmc, NmcOutputData *out) -{ - NMAccessPoint *active_ap = NULL; - const char *active_bssid = NULL; - NmcOutputField *arr; - - if (nm_device_get_state (NM_DEVICE (wifi)) == NM_DEVICE_STATE_ACTIVATED) { - active_ap = nm_device_wifi_get_active_access_point (wifi); - 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); - - { - gs_unref_ptrarray GPtrArray *aps = NULL; - APInfo info = { - .nmc = nmc, - .index = 1, - .output_flags = 0, - .active_bssid = active_bssid, - .device = nm_device_get_iface (NM_DEVICE (wifi)), - .output_data = out->output_data, - }; - - aps = sort_access_points (nm_device_wifi_get_access_points (wifi)); - g_ptr_array_foreach (aps, fill_output_access_point, &info); - } - - print_data_prepare_width (out->output_data); -} - -static void -wifi_print_aps (NMDeviceWifi *wifi, +wifi_print_aps (NMDeviceWifi *device, NmCli *nmc, - GArray *_out_indices, - const NMMetaAbstractInfo *const*tmpl, const char *bssid_user) { - NMAccessPoint *ap = NULL; const GPtrArray *aps; - APInfo *info; + gs_unref_ptrarray GPtrArray *aps_sorted = NULL; + gs_unref_ptrarray GPtrArray *aps_selected = NULL; guint i; - NmcOutputField *arr; - const char *base_hdr = _("Wi-Fi scan list"); - NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - gs_free char *header_name = NULL; - static gboolean empty_line = FALSE; - - if (empty_line) - g_print ("\n"); /* Empty line between devices' APs */ - - /* Main header name */ - header_name = construct_header_name (base_hdr, nm_device_get_iface (NM_DEVICE (wifi))); - - out_indices = g_array_ref (_out_indices); + aps_sorted = sort_access_points (nm_device_wifi_get_access_points (device)); if (bssid_user) { - /* Specific AP requested - list only that */ - aps = nm_device_wifi_get_access_points (wifi); - for (i = 0; i < aps->len; i++) { - char *bssid_up; - NMAccessPoint *candidate_ap = g_ptr_array_index (aps, i); + for (i = 0; i < aps_sorted->len; i++) { + NMAccessPoint *candidate_ap = aps_sorted->pdata[i]; 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) { - /* 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 (NM_DEVICE (wifi)); - info->output_data = out.output_data; - - fill_output_access_point (ap, info); - - print_data_prepare_width (out.output_data); - print_data (&nmc->nmc_config, out_indices, header_name, 0, &out); - g_free (info); - - nmc->return_value = NMC_RESULT_SUCCESS; - empty_line = TRUE; + 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)); } - } else { - show_access_point_info (wifi, nmc, &out); - print_data (&nmc->nmc_config, out_indices, header_name, 0, &out); - empty_line = TRUE; + if (!aps_selected) + return; + aps = aps_selected; + } else + aps = aps_sorted; + + if (aps->len > 0) { + const char *iface = nm_device_get_iface (NM_DEVICE (device)); + gs_free const MetagenDeviceDetailApRowData **aps_row = NULL; + gs_free char *header_name = NULL; + const MetagenDeviceDetailApTableData table_data = { + .device_name = iface, + .active_ap = (nm_device_get_state (NM_DEVICE (device)) == NM_DEVICE_STATE_ACTIVATED) + ? nm_device_wifi_get_active_access_point (device) + : NULL, + }; + + header_name = construct_header_name (_("Wi-Fi scan list"), iface); + + aps_row = _aps_to_row_data ((NMAccessPoint **) aps->pdata, aps->len); + + nmc_print (&nmc->nmc_config, + (gpointer *) aps_row, + (gpointer *) &table_data, + header_name, + _metagen_device_detail_ap_group, + "AP", + nmc->required_fields, + NULL); } } typedef struct { NmCli *nmc; NMDevice **devices; - const NMMetaAbstractInfo *const *tmpl; const char *bssid_user; - GArray *out_indices; } ScanInfo; typedef struct { @@ -2906,8 +2897,6 @@ wifi_list_finish (WifiListData *data) for (i = 0; info->devices[i]; i++) { wifi_print_aps (NM_DEVICE_WIFI (info->devices[i]), info->nmc, - info->out_indices, - info->tmpl, info->bssid_user); } if (nmc->return_value == NMC_RESULT_ERROR_NOT_FOUND) { @@ -2926,7 +2915,6 @@ wifi_list_finish (WifiListData *data) for (i = 0; info->devices[i]; i++) g_object_unref (info->devices[i]); g_free (info->devices); - g_array_unref (info->out_indices); nm_g_slice_free (info); } } @@ -3001,9 +2989,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) const char *bssid_user = NULL; const char *rescan = NULL; gs_free NMDevice **devices = NULL; - const char *fields_str = NULL; - const NMMetaAbstractInfo *const*tmpl; - gs_unref_array GArray *out_indices = NULL; + gs_free NMMetaSelectionResultList *selection = NULL; int option; guint64 rescan_cutoff; NMDeviceWifi *wifi; @@ -3062,15 +3048,11 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) if (nmc->complete) return nmc->return_value; - if (!nmc->required_fields || g_ascii_strcasecmp (nmc->required_fields, "common") == 0) - fields_str = NMC_FIELDS_DEV_WIFI_LIST_COMMON; - else if (!nmc->required_fields || g_ascii_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); - + selection = nm_meta_selection_create_parse_list (_metagen_device_detail_ap_group, + "AP", + nmc->required_fields, + FALSE, + &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'device wifi': %s"), error->message); g_error_free (error); @@ -3155,10 +3137,8 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) if (!scan_info) { scan_info = g_slice_new (ScanInfo); *scan_info = (ScanInfo) { - .out_indices = g_array_ref (out_indices), - .tmpl = tmpl, - .bssid_user = bssid_user, - .nmc = nmc, + .bssid_user = bssid_user, + .nmc = nmc, }; } @@ -3187,8 +3167,8 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) /* Print results right away if no scan is pending */ for (i = 0; devices[i]; i++) { wifi_print_aps (NM_DEVICE_WIFI (devices[i]), - nmc, out_indices, - tmpl, bssid_user); + nmc, + bssid_user); g_object_unref (devices[i]); } } diff --git a/clients/cli/devices.h b/clients/cli/devices.h index 055d56e717..8e2bb55be7 100644 --- a/clients/cli/devices.h +++ b/clients/cli/devices.h @@ -27,8 +27,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 5fbd6d7261..1c2c4711b3 100644 --- a/clients/cli/nmcli.c +++ b/clients/cli/nmcli.c @@ -187,8 +187,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.h b/clients/cli/utils.h index 72b1aa0144..ea97216568 100644 --- a/clients/cli/utils.h +++ b/clients/cli/utils.h @@ -222,6 +222,24 @@ typedef enum { NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_CARRIER, _NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_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) \ |