diff --git a/clients/cli/common.c b/clients/cli/common.c index 9be3c9525d..3f158513a4 100644 --- a/clients/cli/common.c +++ b/clients/cli/common.c @@ -37,49 +37,38 @@ extern GMainLoop *loop; -#define OUTPUT_FIELD_WITH_NAME(n) { .name = N_ (n), } - -/* Available fields for IPv4 group */ -NmcOutputField nmc_fields_ip4_config[] = { - OUTPUT_FIELD_WITH_NAME ("GROUP"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("ADDRESS"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("GATEWAY"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("ROUTE"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("DNS"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("DOMAIN"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("WINS"), /* 6 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_ip4_config[] = { + NMC_META_GENERIC ("GROUP"), /* 0 */ + NMC_META_GENERIC ("ADDRESS"), /* 1 */ + NMC_META_GENERIC ("GATEWAY"), /* 2 */ + NMC_META_GENERIC ("ROUTE"), /* 3 */ + NMC_META_GENERIC ("DNS"), /* 4 */ + NMC_META_GENERIC ("DOMAIN"), /* 5 */ + NMC_META_GENERIC ("WINS"), /* 6 */ + NULL, }; -#define NMC_FIELDS_IP4_CONFIG_ALL "GROUP,ADDRESS,GATEWAY,ROUTE,DNS,DOMAIN,WINS" -/* Available fields for DHCPv4 group */ -NmcOutputField nmc_fields_dhcp4_config[] = { - OUTPUT_FIELD_WITH_NAME ("GROUP"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("OPTION"), /* 1 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dhcp4_config[] = { + NMC_META_GENERIC ("GROUP"), /* 0 */ + NMC_META_GENERIC ("OPTION"), /* 1 */ + NULL, }; -#define NMC_FIELDS_DHCP4_CONFIG_ALL "GROUP,OPTION" -/* Available fields for IPv6 group */ -NmcOutputField nmc_fields_ip6_config[] = { - OUTPUT_FIELD_WITH_NAME ("GROUP"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("ADDRESS"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("GATEWAY"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("ROUTE"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("DNS"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("DOMAIN"), /* 5 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_ip6_config[] = { + NMC_META_GENERIC ("GROUP"), /* 0 */ + NMC_META_GENERIC ("ADDRESS"), /* 1 */ + NMC_META_GENERIC ("GATEWAY"), /* 2 */ + NMC_META_GENERIC ("ROUTE"), /* 3 */ + NMC_META_GENERIC ("DNS"), /* 4 */ + NMC_META_GENERIC ("DOMAIN"), /* 5 */ + NULL, }; -#define NMC_FIELDS_IP6_CONFIG_ALL "GROUP,ADDRESS,GATEWAY,ROUTE,DNS,DOMAIN" -/* Available fields for DHCPv6 group */ -NmcOutputField nmc_fields_dhcp6_config[] = { - OUTPUT_FIELD_WITH_NAME ("GROUP"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("OPTION"), /* 1 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dhcp6_config[] = { + NMC_META_GENERIC ("GROUP"), /* 0 */ + NMC_META_GENERIC ("OPTION"), /* 1 */ + NULL, }; -#define NMC_FIELDS_DHCP6_CONFIG_ALL "GROUP,OPTION" - gboolean print_ip4_config (NMIPConfig *cfg4, @@ -94,18 +83,17 @@ print_ip4_config (NMIPConfig *cfg4, char **domain_arr = NULL; char **wins_arr = NULL; int i = 0; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (cfg4 == NULL) return FALSE; - tmpl = nmc_fields_ip4_config; - tmpl_len = sizeof (nmc_fields_ip4_config); - out_indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_IP4_CONFIG_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_ip4_config; + out_indices = parse_output_fields (one_field, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); /* addresses */ @@ -153,7 +141,7 @@ print_ip4_config (NMIPConfig *cfg4, /* WINS */ wins_arr = g_strdupv ((char **) nm_ip_config_get_wins_servers (cfg4)); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc (arr, 0, group_prefix); set_val_arr (arr, 1, addr_arr); set_val_strc (arr, 2, nm_ip_config_get_gateway (cfg4)); @@ -181,18 +169,17 @@ print_ip6_config (NMIPConfig *cfg6, char **dns_arr = NULL; char **domain_arr = NULL; int i = 0; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (cfg6 == NULL) return FALSE; - tmpl = nmc_fields_ip6_config; - tmpl_len = sizeof (nmc_fields_ip6_config); - out_indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_IP6_CONFIG_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_ip6_config; + out_indices = parse_output_fields (one_field, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); /* addresses */ @@ -237,7 +224,7 @@ print_ip6_config (NMIPConfig *cfg6, /* domains */ domain_arr = g_strdupv ((char **) nm_ip_config_get_domains (cfg6)); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc (arr, 0, group_prefix); set_val_arr (arr, 1, addr_arr); set_val_strc (arr, 2, nm_ip_config_get_gateway (cfg6)); @@ -259,8 +246,8 @@ print_dhcp4_config (NMDhcpConfig *dhcp4, const char *one_field) { GHashTable *table; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; if (dhcp4 == NULL) return FALSE; @@ -273,11 +260,10 @@ print_dhcp4_config (NMDhcpConfig *dhcp4, int i = 0; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - tmpl = nmc_fields_dhcp4_config; - tmpl_len = sizeof (nmc_fields_dhcp4_config); - out_indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DHCP4_CONFIG_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dhcp4_config; + out_indices = parse_output_fields (one_field, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); options_arr = g_new (char *, g_hash_table_size (table) + 1); @@ -286,7 +272,7 @@ print_dhcp4_config (NMDhcpConfig *dhcp4, options_arr[i++] = g_strdup_printf ("%s = %s", (char *) key, (char *) value); options_arr[i] = NULL; - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc (arr, 0, group_prefix); set_val_arr (arr, 1, options_arr); g_ptr_array_add (out.output_data, arr); @@ -306,8 +292,8 @@ print_dhcp6_config (NMDhcpConfig *dhcp6, const char *one_field) { GHashTable *table; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; if (dhcp6 == NULL) return FALSE; @@ -320,11 +306,10 @@ print_dhcp6_config (NMDhcpConfig *dhcp6, int i = 0; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - tmpl = nmc_fields_dhcp6_config; - tmpl_len = sizeof (nmc_fields_dhcp6_config); - out_indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DHCP6_CONFIG_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dhcp6_config; + out_indices = parse_output_fields (one_field, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); options_arr = g_new (char *, g_hash_table_size (table) + 1); @@ -333,7 +318,7 @@ print_dhcp6_config (NMDhcpConfig *dhcp6, options_arr[i++] = g_strdup_printf ("%s = %s", (char *) key, (char *) value); options_arr[i] = NULL; - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc (arr, 0, group_prefix); set_val_arr (arr, 1, options_arr); g_ptr_array_add (out.output_data, arr); diff --git a/clients/cli/common.h b/clients/cli/common.h index ca4b030820..2534c4f73f 100644 --- a/clients/cli/common.h +++ b/clients/cli/common.h @@ -80,9 +80,9 @@ void nmc_complete_bool (const char *prefix); const char *nmc_error_get_simple_message (GError *error); -extern NmcOutputField nmc_fields_ip4_config[]; -extern NmcOutputField nmc_fields_dhcp4_config[]; -extern NmcOutputField nmc_fields_ip6_config[]; -extern NmcOutputField nmc_fields_dhcp6_config[]; +extern const NmcMetaGenericInfo *const nmc_fields_ip4_config[]; +extern const NmcMetaGenericInfo *const nmc_fields_dhcp4_config[]; +extern const NmcMetaGenericInfo *const nmc_fields_ip6_config[]; +extern const NmcMetaGenericInfo *const nmc_fields_dhcp6_config[]; #endif /* NMC_COMMON_H */ diff --git a/clients/cli/connections.c b/clients/cli/connections.c index 7bfa8fcf8c..0f7d48e843 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -39,9 +39,7 @@ #include "nm-secret-agent-simple.h" #include "polkit-agent.h" #include "nm-vpn-helpers.h" - -#define OUTPUT_FIELD_WITH_NAME(n) { .name = N_ (n), } -#define OUTPUT_FIELD_WITH_FIELDS(n, fields) { .name = N_ (n), .group_list = fields + 1, } +#include "nm-meta-setting-access.h" typedef struct _OptionInfo OptionInfo; struct _OptionInfo { @@ -130,70 +128,42 @@ struct _OptionInfo { #define BASE_PROMPT "nmcli> " -/* Available fields for 'connection show' */ -NmcOutputField nmc_fields_con_show[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("UUID"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("TYPE"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("TIMESTAMP"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("TIMESTAMP-REAL"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("AUTOCONNECT"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("AUTOCONNECT-PRIORITY"), /* 6 */ - OUTPUT_FIELD_WITH_NAME ("READONLY"), /* 7 */ - OUTPUT_FIELD_WITH_NAME ("DBUS-PATH"), /* 8 */ - OUTPUT_FIELD_WITH_NAME ("ACTIVE"), /* 9 */ - OUTPUT_FIELD_WITH_NAME ("DEVICE"), /* 10 */ - OUTPUT_FIELD_WITH_NAME ("STATE"), /* 11 */ - OUTPUT_FIELD_WITH_NAME ("ACTIVE-PATH"), /* 12 */ - OUTPUT_FIELD_WITH_NAME ("SLAVE"), /* 13 */ - { 0 } +/*****************************************************************************/ + +const NmcMetaGenericInfo *const nmc_fields_con_show[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("UUID"), /* 1 */ + NMC_META_GENERIC ("TYPE"), /* 2 */ + NMC_META_GENERIC ("TIMESTAMP"), /* 3 */ + NMC_META_GENERIC ("TIMESTAMP-REAL"), /* 4 */ + NMC_META_GENERIC ("AUTOCONNECT"), /* 5 */ + NMC_META_GENERIC ("AUTOCONNECT-PRIORITY"), /* 6 */ + NMC_META_GENERIC ("READONLY"), /* 7 */ + NMC_META_GENERIC ("DBUS-PATH"), /* 8 */ + NMC_META_GENERIC ("ACTIVE"), /* 9 */ + NMC_META_GENERIC ("DEVICE"), /* 10 */ + NMC_META_GENERIC ("STATE"), /* 11 */ + NMC_META_GENERIC ("ACTIVE-PATH"), /* 12 */ + NMC_META_GENERIC ("SLAVE"), /* 13 */ + NULL, }; -#define NMC_FIELDS_CON_SHOW_ALL "NAME,UUID,TYPE,TIMESTAMP,TIMESTAMP-REAL,AUTOCONNECT,AUTOCONNECT-PRIORITY,READONLY,DBUS-PATH,"\ - "ACTIVE,DEVICE,STATE,ACTIVE-PATH,SLAVE" #define NMC_FIELDS_CON_SHOW_COMMON "NAME,UUID,TYPE,DEVICE" -/* Helper macro to define fields */ -#define OUTPUT_FIELD_WITH_SETTING(setting, setting_type) \ - { \ - .name = setting, \ - .setting_info = &nm_meta_setting_infos_editor[setting_type], \ - } - -/* Available settings for 'connection show ' - profile part */ -NmcOutputField nmc_fields_settings_names[] = { - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_CONNECTION_SETTING_NAME, NM_META_SETTING_TYPE_CONNECTION), /* 0 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_WIRED_SETTING_NAME, NM_META_SETTING_TYPE_WIRED), /* 1 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_802_1X_SETTING_NAME, NM_META_SETTING_TYPE_802_1X), /* 2 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_WIRELESS_SETTING_NAME, NM_META_SETTING_TYPE_WIRELESS), /* 3 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, NM_META_SETTING_TYPE_WIRELESS_SECURITY), /* 4 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_IP4_CONFIG_SETTING_NAME, NM_META_SETTING_TYPE_IP4_CONFIG), /* 5 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_IP6_CONFIG_SETTING_NAME, NM_META_SETTING_TYPE_IP6_CONFIG), /* 6 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_SERIAL_SETTING_NAME, NM_META_SETTING_TYPE_SERIAL), /* 7 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_PPP_SETTING_NAME, NM_META_SETTING_TYPE_PPP), /* 8 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_PPPOE_SETTING_NAME, NM_META_SETTING_TYPE_PPPOE), /* 9 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_GSM_SETTING_NAME, NM_META_SETTING_TYPE_GSM), /* 10 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_CDMA_SETTING_NAME, NM_META_SETTING_TYPE_CDMA), /* 11 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_BLUETOOTH_SETTING_NAME, NM_META_SETTING_TYPE_BLUETOOTH), /* 12 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_OLPC_MESH_SETTING_NAME, NM_META_SETTING_TYPE_OLPC_MESH), /* 13 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_VPN_SETTING_NAME, NM_META_SETTING_TYPE_VPN), /* 14 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_WIMAX_SETTING_NAME, NM_META_SETTING_TYPE_WIMAX), /* 15 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_INFINIBAND_SETTING_NAME, NM_META_SETTING_TYPE_INFINIBAND), /* 16 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_BOND_SETTING_NAME, NM_META_SETTING_TYPE_BOND), /* 17 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_VLAN_SETTING_NAME, NM_META_SETTING_TYPE_VLAN), /* 18 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_ADSL_SETTING_NAME, NM_META_SETTING_TYPE_ADSL), /* 19 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_BRIDGE_SETTING_NAME, NM_META_SETTING_TYPE_BRIDGE), /* 20 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_BRIDGE_PORT_SETTING_NAME, NM_META_SETTING_TYPE_BRIDGE_PORT), /* 21 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_TEAM_SETTING_NAME, NM_META_SETTING_TYPE_TEAM), /* 22 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_TEAM_PORT_SETTING_NAME, NM_META_SETTING_TYPE_TEAM_PORT), /* 23 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_DCB_SETTING_NAME, NM_META_SETTING_TYPE_DCB), /* 24 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_TUN_SETTING_NAME, NM_META_SETTING_TYPE_TUN), /* 25 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_IP_TUNNEL_SETTING_NAME, NM_META_SETTING_TYPE_IP_TUNNEL), /* 26 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_MACSEC_SETTING_NAME, NM_META_SETTING_TYPE_MACSEC), /* 27 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_MACVLAN_SETTING_NAME, NM_META_SETTING_TYPE_MACVLAN), /* 28 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_VXLAN_SETTING_NAME, NM_META_SETTING_TYPE_VXLAN), /* 29 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_PROXY_SETTING_NAME, NM_META_SETTING_TYPE_PROXY), /* 30 */ - OUTPUT_FIELD_WITH_SETTING (NM_SETTING_DUMMY_SETTING_NAME, NM_META_SETTING_TYPE_DUMMY), /* 31 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_con_active_details_general[] = { + NMC_META_GENERIC ("GROUP"), /* 0 */ + NMC_META_GENERIC ("NAME"), /* 1 */ + NMC_META_GENERIC ("UUID"), /* 2 */ + NMC_META_GENERIC ("DEVICES"), /* 3 */ + NMC_META_GENERIC ("STATE"), /* 4 */ + NMC_META_GENERIC ("DEFAULT"), /* 5 */ + NMC_META_GENERIC ("DEFAULT6"), /* 6 */ + NMC_META_GENERIC ("SPEC-OBJECT"), /* 7 */ + NMC_META_GENERIC ("VPN"), /* 8 */ + NMC_META_GENERIC ("DBUS-PATH"), /* 9 */ + NMC_META_GENERIC ("CON-PATH"), /* 10 */ + NMC_META_GENERIC ("ZONE"), /* 11 */ + NMC_META_GENERIC ("MASTER-PATH"), /* 12 */ + NULL, }; #define NMC_FIELDS_SETTINGS_NAMES_ALL NM_SETTING_CONNECTION_SETTING_NAME","\ NM_SETTING_WIRED_SETTING_NAME","\ @@ -228,59 +198,27 @@ NmcOutputField nmc_fields_settings_names[] = { // NM_SETTING_DUMMY_SETTING_NAME // NM_SETTING_WIMAX_SETTING_NAME -/* Active connection data */ -/* Available fields for GENERAL group */ -NmcOutputField nmc_fields_con_active_details_general[] = { - OUTPUT_FIELD_WITH_NAME ("GROUP"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("UUID"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("DEVICES"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("STATE"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("DEFAULT"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("DEFAULT6"), /* 6 */ - OUTPUT_FIELD_WITH_NAME ("SPEC-OBJECT"), /* 7 */ - OUTPUT_FIELD_WITH_NAME ("VPN"), /* 8 */ - OUTPUT_FIELD_WITH_NAME ("DBUS-PATH"), /* 9 */ - OUTPUT_FIELD_WITH_NAME ("CON-PATH"), /* 10 */ - OUTPUT_FIELD_WITH_NAME ("ZONE"), /* 11 */ - OUTPUT_FIELD_WITH_NAME ("MASTER-PATH"), /* 12 */ - { 0 } + +const NmcMetaGenericInfo *const nmc_fields_con_active_details_vpn[] = { + NMC_META_GENERIC ("GROUP"), /* 0 */ + NMC_META_GENERIC ("TYPE"), /* 1 */ + NMC_META_GENERIC ("USERNAME"), /* 2 */ + NMC_META_GENERIC ("GATEWAY"), /* 3 */ + NMC_META_GENERIC ("BANNER"), /* 4 */ + NMC_META_GENERIC ("VPN-STATE"), /* 5 */ + NMC_META_GENERIC ("CFG"), /* 6 */ + NULL, }; -#define NMC_FIELDS_CON_ACTIVE_DETAILS_GENERAL_ALL "GROUP,NAME,UUID,DEVICES,STATE,DEFAULT,DEFAULT6,"\ - "VPN,ZONE,DBUS-PATH,CON-PATH,SPEC-OBJECT,MASTER-PATH" -/* IP group is handled by common.c */ - -/* Available fields for VPN group */ -NmcOutputField nmc_fields_con_active_details_vpn[] = { - OUTPUT_FIELD_WITH_NAME ("GROUP"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("TYPE"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("USERNAME"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("GATEWAY"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("BANNER"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("VPN-STATE"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("CFG"), /* 6 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_con_active_details_groups[] = { + NMC_META_GENERIC_WITH_NESTED ("GENERAL", nmc_fields_con_active_details_general + 1), /* 0 */ + NMC_META_GENERIC_WITH_NESTED ("IP4", nmc_fields_ip4_config + 1), /* 1 */ + NMC_META_GENERIC_WITH_NESTED ("DHCP4", nmc_fields_dhcp4_config + 1), /* 2 */ + NMC_META_GENERIC_WITH_NESTED ("IP6", nmc_fields_ip6_config + 1), /* 3 */ + NMC_META_GENERIC_WITH_NESTED ("DHCP6", nmc_fields_dhcp6_config + 1), /* 4 */ + NMC_META_GENERIC_WITH_NESTED ("VPN", nmc_fields_con_active_details_vpn + 1), /* 5 */ + NULL, }; -#define NMC_FIELDS_CON_ACTIVE_DETAILS_VPN_ALL "GROUP,TYPE,USERNAME,GATEWAY,BANNER,VPN-STATE,CFG" - -/* defined in common.c */ -extern NmcOutputField nmc_fields_ip4_config[]; -extern NmcOutputField nmc_fields_ip6_config[]; -extern NmcOutputField nmc_fields_dhcp4_config[]; -extern NmcOutputField nmc_fields_dhcp6_config[]; - -/* Available fields for 'connection show ' - active part */ -NmcOutputField nmc_fields_con_active_details_groups[] = { - OUTPUT_FIELD_WITH_FIELDS ("GENERAL", nmc_fields_con_active_details_general), /* 0 */ - OUTPUT_FIELD_WITH_FIELDS ("IP4", nmc_fields_ip4_config), /* 1 */ - OUTPUT_FIELD_WITH_FIELDS ("DHCP4", nmc_fields_dhcp4_config), /* 2 */ - OUTPUT_FIELD_WITH_FIELDS ("IP6", nmc_fields_ip6_config), /* 3 */ - OUTPUT_FIELD_WITH_FIELDS ("DHCP6", nmc_fields_dhcp6_config), /* 4 */ - OUTPUT_FIELD_WITH_FIELDS ("VPN", nmc_fields_con_active_details_vpn), /* 5 */ - { 0 } -}; -#define NMC_FIELDS_CON_ACTIVE_DETAILS_ALL "GENERAL,IP4,DHCP4,IP6,DHCP6,VPN" /* Pseudo group names for 'connection show ' */ /* e.g.: nmcli -f profile con show my-eth0 */ @@ -755,12 +693,12 @@ update_secrets_in_connection (NMRemoteConnection *remote, NMConnection *local) int i; GError *error = NULL; - for (i = 0; nmc_fields_settings_names[i].name; i++) { - secrets = nm_remote_connection_get_secrets (remote, nmc_fields_settings_names[i].name, NULL, NULL); + for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) { + secrets = nm_remote_connection_get_secrets (remote, nm_meta_setting_infos[i].setting_name, NULL, NULL); if (secrets) { if (!nm_connection_update_secrets (local, NULL, secrets, &error) && error) { g_printerr (_("Error updating secrets for %s: %s\n"), - nmc_fields_settings_names[i].name, + nm_meta_setting_infos[i].setting_name, error->message); g_clear_error (&error); } @@ -789,7 +727,8 @@ nmc_connection_profile_details (NMConnection *connection, NmCli *nmc, gboolean s else fields_str = nmc->required_fields; - print_settings_array = parse_output_fields (fields_str, nmc_fields_settings_names, TRUE, &prop_array, &error); + print_settings_array = parse_output_fields (fields_str, (const NMMetaAbstractInfo *const*) nm_meta_setting_infos_editor_p (), + TRUE, &prop_array, &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'connection show': %s"), error->message); g_error_free (error); @@ -800,17 +739,22 @@ nmc_connection_profile_details (NMConnection *connection, NmCli *nmc, gboolean s /* Main header */ { - NMC_OUTPUT_DATA_DEFINE_SCOPED (out); gs_free char *header_name = NULL; + gs_free NmcOutputField *row = NULL; + gs_unref_array GArray *out_indices = NULL; header_name = construct_header_name (base_hdr, nm_connection_get_id (connection)); out_indices = parse_output_fields (NMC_FIELDS_SETTINGS_NAMES_ALL, - nmc_fields_settings_names, FALSE, NULL, NULL); + (const NMMetaAbstractInfo *const*) nm_meta_setting_infos_editor_p (), + FALSE, NULL, NULL); + + row = g_new0 (NmcOutputField, _NM_META_SETTING_TYPE_NUM + 1); + for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) + row[i].info = (const NMMetaAbstractInfo *) &nm_meta_setting_infos_editor[i]; - nmc_fields_settings_names[0].flags = NMC_OF_FLAG_MAIN_HEADER_ONLY; print_required_fields (&nmc->nmc_config, NMC_OF_FLAG_MAIN_HEADER_ONLY, out_indices, header_name, - 0, nmc_fields_settings_names); + 0, row); } /* Loop through the required settings and print them. */ @@ -824,7 +768,7 @@ nmc_connection_profile_details (NMConnection *connection, NmCli *nmc, gboolean s was_output = FALSE; - setting = nm_connection_get_setting_by_name (connection, nmc_fields_settings_names[section_idx].name); + setting = nm_connection_get_setting_by_name (connection, nm_meta_setting_infos_editor[section_idx].general->setting_name); if (setting) { setting_details (setting, nmc, prop_name, secrets); was_output = TRUE; @@ -969,9 +913,7 @@ fill_output_connection (NMConnection *connection, NMClient *client, GPtrArray *o } prio_str = g_strdup_printf ("%u", nm_setting_connection_get_autoconnect_priority (s_con)); - arr = nmc_dup_fields_array (nmc_fields_con_show, - sizeof (nmc_fields_con_show), - 0); + arr = nmc_dup_fields_array ((const NMMetaAbstractInfo *const*) nmc_fields_con_show, 0); /* Show active connections in color */ nmc_active_connection_state_to_color (ac_state_int, &color); @@ -1008,9 +950,7 @@ fill_output_connection_for_invisible (NMActiveConnection *ac, GPtrArray *output_ ac_state = active_connection_state_to_string (nm_active_connection_get_state (ac)); ac_dev = get_ac_device_string (ac); - arr = nmc_dup_fields_array (nmc_fields_con_show, - sizeof (nmc_fields_con_show), - 0); + arr = nmc_dup_fields_array ((const NMMetaAbstractInfo *const*) nmc_fields_con_show, 0); set_val_str (arr, 0, name); set_val_strc (arr, 1, nm_active_connection_get_uuid (ac)); @@ -1046,8 +986,8 @@ fill_output_active_connection (NMActiveConnection *active, NMDevice *master; const char *con_path = NULL, *con_zone = NULL; int i; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; int idx_start = with_group ? 0 : 1; con = nm_active_connection_get_connection (active); @@ -1076,17 +1016,14 @@ fill_output_active_connection (NMActiveConnection *active, if (dev_str->len > 0) g_string_truncate (dev_str, dev_str->len - 1); /* Cut off last ',' */ - tmpl = nmc_fields_con_active_details_general; - tmpl_len = sizeof (nmc_fields_con_active_details_general); - if (!with_group) { + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_con_active_details_general; + if (!with_group) tmpl++; - tmpl_len -= sizeof (NmcOutputField); - } /* Fill field values */ - arr = nmc_dup_fields_array (tmpl, tmpl_len, o_flags); + arr = nmc_dup_fields_array (tmpl, o_flags); if (with_group) - set_val_strc (arr, 0, nmc_fields_con_active_details_groups[0].name); + set_val_strc (arr, 0, nmc_fields_con_active_details_groups[0]->name); set_val_strc (arr, 1-idx_start, nm_active_connection_get_id (active)); set_val_strc (arr, 2-idx_start, nm_active_connection_get_uuid (active)); set_val_str (arr, 3-idx_start, dev_str->str); @@ -1204,22 +1141,19 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) GArray *print_groups; GPtrArray *group_fields = NULL; int i; - char *fields_str; - char *fields_all = NMC_FIELDS_CON_ACTIVE_DETAILS_ALL; - char *fields_common = NMC_FIELDS_CON_ACTIVE_DETAILS_ALL; - NmcOutputField *tmpl, *arr; + const char *fields_str = NULL; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; size_t tmpl_len; const char *base_hdr = _("Activate connection details"); gboolean was_output = FALSE; - if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) - fields_str = fields_common; - else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) - fields_str = fields_all; - else + if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) { + } else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) { + } else fields_str = nmc->required_fields; - print_groups = parse_output_fields (fields_str, nmc_fields_con_active_details_groups, TRUE, &group_fields, &error); + print_groups = parse_output_fields (fields_str, (const NMMetaAbstractInfo *const*) nmc_fields_con_active_details_groups, TRUE, &group_fields, &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'connection show': %s"), error->message); g_error_free (error); @@ -1230,17 +1164,22 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) /* Main header */ { - NMC_OUTPUT_DATA_DEFINE_SCOPED (out); gs_free char *header_name = NULL; + gs_free NmcOutputField *row = NULL; + gs_unref_array GArray *out_indices = NULL; header_name = construct_header_name (base_hdr, nm_active_connection_get_uuid (acon)); - out_indices = parse_output_fields (NMC_FIELDS_CON_ACTIVE_DETAILS_ALL, - nmc_fields_con_active_details_groups, FALSE, NULL, NULL); + out_indices = parse_output_fields (NULL, + (const NMMetaAbstractInfo *const*) nmc_fields_con_active_details_groups, + FALSE, NULL, NULL); + + row = g_new0 (NmcOutputField, G_N_ELEMENTS (nmc_fields_con_active_details_groups) + 1); + for (i = 0; nmc_fields_con_active_details_groups[i]; i++) + row[i].info = (const NMMetaAbstractInfo *) nmc_fields_con_active_details_groups[i]; - nmc_fields_con_active_details_groups[0].flags = NMC_OF_FLAG_MAIN_HEADER_ONLY; print_required_fields (&nmc->nmc_config, NMC_OF_FLAG_MAIN_HEADER_ONLY, out_indices, header_name, - 0, nmc_fields_con_active_details_groups); + 0, row); } /* Loop through the groups and print them. */ @@ -1254,15 +1193,15 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) was_output = FALSE; /* GENERAL */ - if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name, nmc_fields_con_active_details_groups[0].name) == 0) { + if (strcasecmp (nmc_fields_con_active_details_groups[group_idx]->name, nmc_fields_con_active_details_groups[0]->name) == 0) { NMC_OUTPUT_DATA_DEFINE_SCOPED (out); /* Add field names */ - tmpl = nmc_fields_con_active_details_general; + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_con_active_details_general; tmpl_len = sizeof (nmc_fields_con_active_details_general); - out_indices = parse_output_fields (group_fld ? group_fld : NMC_FIELDS_CON_ACTIVE_DETAILS_GENERAL_ALL, - tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + out_indices = parse_output_fields (group_fld, + tmpl, FALSE, NULL, NULL); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); /* Fill in values */ @@ -1275,7 +1214,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) } /* IP4 */ - if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name, nmc_fields_con_active_details_groups[1].name) == 0) { + if (strcasecmp (nmc_fields_con_active_details_groups[group_idx]->name, nmc_fields_con_active_details_groups[1]->name) == 0) { gboolean b1 = FALSE; NMIPConfig *cfg4 = nm_active_connection_get_ip4_config (acon); @@ -1284,7 +1223,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) } /* DHCP4 */ - if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name, nmc_fields_con_active_details_groups[2].name) == 0) { + if (strcasecmp (nmc_fields_con_active_details_groups[group_idx]->name, nmc_fields_con_active_details_groups[2]->name) == 0) { gboolean b1 = FALSE; NMDhcpConfig *dhcp4 = nm_active_connection_get_dhcp4_config (acon); @@ -1293,7 +1232,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) } /* IP6 */ - if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name, nmc_fields_con_active_details_groups[3].name) == 0) { + if (strcasecmp (nmc_fields_con_active_details_groups[group_idx]->name, nmc_fields_con_active_details_groups[3]->name) == 0) { gboolean b1 = FALSE; NMIPConfig *cfg6 = nm_active_connection_get_ip6_config (acon); @@ -1302,7 +1241,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) } /* DHCP6 */ - if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name, nmc_fields_con_active_details_groups[4].name) == 0) { + if (strcasecmp (nmc_fields_con_active_details_groups[group_idx]->name, nmc_fields_con_active_details_groups[4]->name) == 0) { gboolean b1 = FALSE; NMDhcpConfig *dhcp6 = nm_active_connection_get_dhcp6_config (acon); @@ -1312,7 +1251,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) /* VPN */ if (NM_IS_VPN_CONNECTION (acon) && - strcasecmp (nmc_fields_con_active_details_groups[group_idx].name, nmc_fields_con_active_details_groups[5].name) == 0) { + strcasecmp (nmc_fields_con_active_details_groups[group_idx]->name, nmc_fields_con_active_details_groups[5]->name) == 0) { NMConnection *con; NMSettingConnection *s_con; NMSettingVpn *s_vpn; @@ -1329,11 +1268,10 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) s_con = nm_connection_get_setting_connection (con); g_assert (s_con != NULL); - tmpl = nmc_fields_con_active_details_vpn; - tmpl_len = sizeof (nmc_fields_con_active_details_vpn); - out_indices = parse_output_fields (group_fld ? group_fld : NMC_FIELDS_CON_ACTIVE_DETAILS_VPN_ALL, - tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_con_active_details_vpn; + out_indices = parse_output_fields (group_fld, + tmpl, FALSE, NULL, NULL); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); s_vpn = nm_connection_get_setting_vpn (con); @@ -1359,8 +1297,8 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) vpn_state_str = g_strdup_printf ("%d - %s", vpn_state, vpn_connection_state_to_string (vpn_state)); /* Add values */ - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); - set_val_strc (arr, 0, nmc_fields_con_active_details_groups[5].name); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); + set_val_strc (arr, 0, nmc_fields_con_active_details_groups[5]->name); set_val_str (arr, 1, type_str); set_val_strc (arr, 2, username ? username : get_vpn_data_item (con, VPN_DATA_ITEM_USERNAME)); set_val_strc (arr, 3, get_vpn_data_item (con, VPN_DATA_ITEM_GATEWAY)); @@ -1420,9 +1358,9 @@ split_required_fields_for_con_show (const char *input, found = FALSE; - for (i = 0; nmc_fields_settings_names[i].name; i++) { + for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) { if ( is_all || is_common - || !strcasecmp (*iter, nmc_fields_settings_names[i].name)) { + || !strcasecmp (*iter, nm_meta_setting_infos[i].setting_name)) { if (dot) *dot = '.'; g_string_append (str1, *iter); @@ -1433,9 +1371,9 @@ split_required_fields_for_con_show (const char *input, } if (found) continue; - for (i = 0; nmc_fields_con_active_details_groups[i].name; i++) { + for (i = 0; nmc_fields_con_active_details_groups[i]; i++) { if ( is_all || is_common - || !strcasecmp (*iter, nmc_fields_con_active_details_groups[i].name)) { + || !strcasecmp (*iter, nmc_fields_con_active_details_groups[i]->name)) { if (dot) *dot = '.'; g_string_append (str2, *iter); @@ -1452,8 +1390,8 @@ split_required_fields_for_con_show (const char *input, else if (!strcasecmp (*iter, CON_SHOW_DETAIL_GROUP_ACTIVE)) group_active = TRUE; else { - char *allowed1 = nmc_get_allowed_fields (nmc_fields_settings_names, -1); - char *allowed2 = nmc_get_allowed_fields (nmc_fields_con_active_details_groups, -1); + char *allowed1 = nmc_get_allowed_fields ((const NMMetaAbstractInfo *const*) nm_meta_setting_infos_editor_p (), -1); + char *allowed2 = nmc_get_allowed_fields ((const NMMetaAbstractInfo *const*) nmc_fields_con_active_details_groups, -1); g_set_error (error, NMCLI_ERROR, 0, _("invalid field '%s'; allowed fields: %s and %s, or %s,%s"), *iter, allowed1, allowed2, CON_SHOW_DETAIL_GROUP_PROFILE, CON_SHOW_DETAIL_GROUP_ACTIVE); g_free (allowed1); @@ -1806,11 +1744,10 @@ do_connections_show (NmCli *nmc, int argc, char **argv) if (argc == 0) { const GPtrArray *connections; - char *fields_str; - char *fields_all = NMC_FIELDS_CON_SHOW_ALL; + const char *fields_str = NULL; char *fields_common = NMC_FIELDS_CON_SHOW_COMMON; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (nmc->complete) @@ -1818,19 +1755,17 @@ do_connections_show (NmCli *nmc, int argc, char **argv) if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) fields_str = fields_common; - else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) - fields_str = fields_all; - else + else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) { + } else fields_str = nmc->required_fields; - tmpl = nmc_fields_con_show; - tmpl_len = sizeof (nmc_fields_con_show); + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_con_show; out_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &err); if (err) goto finish; /* Add headers */ - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_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); /* There might be active connections not present in connection list @@ -3079,7 +3014,6 @@ static const NameItem nmc_dummy_settings [] = { { NULL, NULL, NULL, FALSE } }; -/* Available connection types */ static const NameItem nmc_valid_connection_types[] = { { NM_SETTING_GENERIC_SETTING_NAME, NULL, nmc_generic_settings }, /* Needs to be first. */ { NM_SETTING_WIRED_SETTING_NAME, "ethernet", nmc_ethernet_settings }, @@ -3215,7 +3149,6 @@ get_valid_properties_string (const NameItem *array, const char *postfix) { const NameItem *iter = array; - const NmcOutputField *field_iter; const NMMetaSettingInfoEditor *setting_info; const char *prop_name = NULL; GString *str; @@ -3252,28 +3185,15 @@ get_valid_properties_string (const NameItem *array, } /* Search the array with the arguments of the current property */ - j = 0; - while (!nm_streq0 (iter->name, nmc_fields_settings_names[j].name)) { - g_assert (nmc_fields_settings_names[j].name); - j++; - } - field_iter = nmc_fields_settings_names[j].group_list; - setting_info = nmc_fields_settings_names[j].setting_info; - + setting_info = nm_meta_setting_info_editor_find_by_name (iter->name); j = 0; while (TRUE) { gchar *new; const char *arg_name; - if (field_iter) { - arg_name = field_iter[j].name; - if (!arg_name) - break; - } else { - if (j + 1 >= setting_info->properties_num) - break; - arg_name = setting_info->properties[j + 1].property_name; - } + if (j + 1 >= setting_info->properties_num) + break; + arg_name = setting_info->properties[j + 1].property_name; /* If required, expand the alias too */ if (!postfix && iter->alias) { diff --git a/clients/cli/connections.h b/clients/cli/connections.h index c73178e24e..2991004de5 100644 --- a/clients/cli/connections.h +++ b/clients/cli/connections.h @@ -35,10 +35,9 @@ nmc_read_connection_properties (NmCli *nmc, void nmc_active_connection_state_to_color (NMActiveConnectionState state, NmcTermColor *color); -extern NmcOutputField nmc_fields_con_show[]; -extern NmcOutputField nmc_fields_settings_names[]; -extern NmcOutputField nmc_fields_con_active_details_general[]; -extern NmcOutputField nmc_fields_con_active_details_vpn[]; -extern NmcOutputField nmc_fields_con_active_details_groups[]; +extern const NmcMetaGenericInfo *const nmc_fields_con_show[]; +extern const NmcMetaGenericInfo *const nmc_fields_con_active_details_general[]; +extern const NmcMetaGenericInfo *const nmc_fields_con_active_details_vpn[]; +extern const NmcMetaGenericInfo *const nmc_fields_con_active_details_groups[]; #endif /* NMC_CONNECTIONS_H */ diff --git a/clients/cli/devices.c b/clients/cli/devices.c index cd0e326d3b..9a85a33e43 100644 --- a/clients/cli/devices.c +++ b/clients/cli/devices.c @@ -38,253 +38,209 @@ #define PROMPT_INTERFACE _("Interface: ") #define PROMPT_INTERFACES _("Interface(s): ") -#define OUTPUT_FIELD_WITH_NAME(n) { .name = N_ (n), } -#define OUTPUT_FIELD_WITH_FIELDS(n, fields) { .name = N_ (n), .group_list = fields + 1, } - -/* Available fields for 'device status' */ -NmcOutputField nmc_fields_dev_status[] = { - OUTPUT_FIELD_WITH_NAME ("DEVICE"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("TYPE"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("STATE"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("DBUS-PATH"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("CONNECTION"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("CON-UUID"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("CON-PATH"), /* 6 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_status[] = { + NMC_META_GENERIC ("DEVICE"), /* 0 */ + NMC_META_GENERIC ("TYPE"), /* 1 */ + NMC_META_GENERIC ("STATE"), /* 2 */ + NMC_META_GENERIC ("DBUS-PATH"), /* 3 */ + NMC_META_GENERIC ("CONNECTION"), /* 4 */ + NMC_META_GENERIC ("CON-UUID"), /* 5 */ + NMC_META_GENERIC ("CON-PATH"), /* 6 */ + NULL, }; -#define NMC_FIELDS_DEV_STATUS_ALL "DEVICE,TYPE,STATE,DBUS-PATH,CONNECTION,CON-UUID,CON-PATH" #define NMC_FIELDS_DEV_STATUS_COMMON "DEVICE,TYPE,STATE,CONNECTION" -/* Available fields for 'device show' - GENERAL part */ -NmcOutputField nmc_fields_dev_show_general[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("DEVICE"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("TYPE"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("NM-TYPE"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("VENDOR"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("PRODUCT"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("DRIVER"), /* 6 */ - OUTPUT_FIELD_WITH_NAME ("DRIVER-VERSION"), /* 7 */ - OUTPUT_FIELD_WITH_NAME ("FIRMWARE-VERSION"), /* 8 */ - OUTPUT_FIELD_WITH_NAME ("HWADDR"), /* 9 */ - OUTPUT_FIELD_WITH_NAME ("MTU"), /* 10 */ - OUTPUT_FIELD_WITH_NAME ("STATE"), /* 11 */ - OUTPUT_FIELD_WITH_NAME ("REASON"), /* 12 */ - OUTPUT_FIELD_WITH_NAME ("UDI"), /* 13 */ - OUTPUT_FIELD_WITH_NAME ("IP-IFACE"), /* 14 */ - OUTPUT_FIELD_WITH_NAME ("IS-SOFTWARE"), /* 15 */ - OUTPUT_FIELD_WITH_NAME ("NM-MANAGED"), /* 16 */ - OUTPUT_FIELD_WITH_NAME ("AUTOCONNECT"), /* 17 */ - OUTPUT_FIELD_WITH_NAME ("FIRMWARE-MISSING"), /* 18 */ - OUTPUT_FIELD_WITH_NAME ("NM-PLUGIN-MISSING"), /* 19 */ - OUTPUT_FIELD_WITH_NAME ("PHYS-PORT-ID"), /* 20 */ - OUTPUT_FIELD_WITH_NAME ("CONNECTION"), /* 21 */ - OUTPUT_FIELD_WITH_NAME ("CON-UUID"), /* 22 */ - OUTPUT_FIELD_WITH_NAME ("CON-PATH"), /* 23 */ - OUTPUT_FIELD_WITH_NAME ("METERED"), /* 24 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_general[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("DEVICE"), /* 1 */ + NMC_META_GENERIC ("TYPE"), /* 2 */ + NMC_META_GENERIC ("NM-TYPE"), /* 3 */ + NMC_META_GENERIC ("VENDOR"), /* 4 */ + NMC_META_GENERIC ("PRODUCT"), /* 5 */ + NMC_META_GENERIC ("DRIVER"), /* 6 */ + NMC_META_GENERIC ("DRIVER-VERSION"), /* 7 */ + NMC_META_GENERIC ("FIRMWARE-VERSION"), /* 8 */ + NMC_META_GENERIC ("HWADDR"), /* 9 */ + NMC_META_GENERIC ("MTU"), /* 10 */ + NMC_META_GENERIC ("STATE"), /* 11 */ + NMC_META_GENERIC ("REASON"), /* 12 */ + NMC_META_GENERIC ("UDI"), /* 13 */ + NMC_META_GENERIC ("IP-IFACE"), /* 14 */ + NMC_META_GENERIC ("IS-SOFTWARE"), /* 15 */ + NMC_META_GENERIC ("NM-MANAGED"), /* 16 */ + NMC_META_GENERIC ("AUTOCONNECT"), /* 17 */ + NMC_META_GENERIC ("FIRMWARE-MISSING"), /* 18 */ + NMC_META_GENERIC ("NM-PLUGIN-MISSING"), /* 19 */ + NMC_META_GENERIC ("PHYS-PORT-ID"), /* 20 */ + NMC_META_GENERIC ("CONNECTION"), /* 21 */ + NMC_META_GENERIC ("CON-UUID"), /* 22 */ + NMC_META_GENERIC ("CON-PATH"), /* 23 */ + NMC_META_GENERIC ("METERED"), /* 24 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_GENERAL_ALL "NAME,DEVICE,TYPE,NM-TYPE,VENDOR,PRODUCT,DRIVER,DRIVER-VERSION,FIRMWARE-VERSION,HWADDR,MTU,"\ - "STATE,REASON,UDI,IP-IFACE,IS-SOFTWARE,NM-MANAGED,AUTOCONNECT,FIRMWARE-MISSING,NM-PLUGIN-MISSING,"\ - "PHYS-PORT-ID,CONNECTION,CON-UUID,CON-PATH,METERED" #define NMC_FIELDS_DEV_SHOW_GENERAL_COMMON "NAME,DEVICE,TYPE,VENDOR,PRODUCT,DRIVER,HWADDR,STATE" -/* Available fields for 'device show' - CONNECTIONS part */ -NmcOutputField nmc_fields_dev_show_connections[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("AVAILABLE-CONNECTION-PATHS"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("AVAILABLE-CONNECTIONS"), /* 2 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_connections[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("AVAILABLE-CONNECTION-PATHS"), /* 1 */ + NMC_META_GENERIC ("AVAILABLE-CONNECTIONS"), /* 2 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_CONNECTIONS_ALL "NAME,AVAILABLE-CONNECTION-PATHS,AVAILABLE-CONNECTIONS" #define NMC_FIELDS_DEV_SHOW_CONNECTIONS_COMMON "NAME,AVAILABLE-CONNECTION-PATHS,AVAILABLE-CONNECTIONS" -/* Available fields for 'device show' - CAPABILITIES part */ -NmcOutputField nmc_fields_dev_show_cap[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("CARRIER-DETECT"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("SPEED"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("IS-SOFTWARE"), /* 3 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_cap[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("CARRIER-DETECT"), /* 1 */ + NMC_META_GENERIC ("SPEED"), /* 2 */ + NMC_META_GENERIC ("IS-SOFTWARE"), /* 3 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_CAP_ALL "NAME,CARRIER-DETECT,SPEED,IS-SOFTWARE" #define NMC_FIELDS_DEV_SHOW_CAP_COMMON "NAME,CARRIER-DETECT,SPEED,IS-SOFTWARE" -/* Available fields for 'device show' - wired properties part */ -NmcOutputField nmc_fields_dev_show_wired_prop[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("CARRIER"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("S390-SUBCHANNELS"), /* 2 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_wired_prop[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("CARRIER"), /* 1 */ + NMC_META_GENERIC ("S390-SUBCHANNELS"), /* 2 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_WIRED_PROP_ALL "NAME,CARRIER,S390-SUBCHANNELS" #define NMC_FIELDS_DEV_SHOW_WIRED_PROP_COMMON "NAME,CARRIER,S390-SUBCHANNELS" -/* Available fields for 'device show' - wireless properties part */ -NmcOutputField nmc_fields_dev_show_wifi_prop[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("WEP"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("WPA"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("WPA2"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("TKIP"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("CCMP"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("AP"), /* 6 */ - OUTPUT_FIELD_WITH_NAME ("ADHOC"), /* 7 */ - OUTPUT_FIELD_WITH_NAME ("2GHZ"), /* 8 */ - OUTPUT_FIELD_WITH_NAME ("5GHZ"), /* 9 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_wifi_prop[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("WEP"), /* 1 */ + NMC_META_GENERIC ("WPA"), /* 2 */ + NMC_META_GENERIC ("WPA2"), /* 3 */ + NMC_META_GENERIC ("TKIP"), /* 4 */ + NMC_META_GENERIC ("CCMP"), /* 5 */ + NMC_META_GENERIC ("AP"), /* 6 */ + NMC_META_GENERIC ("ADHOC"), /* 7 */ + NMC_META_GENERIC ("2GHZ"), /* 8 */ + NMC_META_GENERIC ("5GHZ"), /* 9 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_WIFI_PROP_ALL "NAME,WEP,WPA,WPA2,TKIP,CCMP,AP,ADHOC,2GHZ,5GHZ" #define NMC_FIELDS_DEV_SHOW_WIFI_PROP_COMMON "NAME,WEP,WPA,WPA2,TKIP,CCMP,AP,ADHOC" -/* Available fields for 'device show' - wimax properties part */ -NmcOutputField nmc_fields_dev_show_wimax_prop[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("CTR-FREQ"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("RSSI"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("CINR"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("TX-POW"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("BSID"), /* 5 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_wimax_prop[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("CTR-FREQ"), /* 1 */ + NMC_META_GENERIC ("RSSI"), /* 2 */ + NMC_META_GENERIC ("CINR"), /* 3 */ + NMC_META_GENERIC ("TX-POW"), /* 4 */ + NMC_META_GENERIC ("BSID"), /* 5 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_WIMAX_PROP_ALL "NAME,CTR-FREQ,RSSI,CINR,TX-POW,BSID" #define NMC_FIELDS_DEV_SHOW_WIMAX_PROP_COMMON "NAME,CTR-FREQ,RSSI,CINR,TX-POW,BSID" -/* Available fields for 'device wifi list' */ -NmcOutputField nmc_fields_dev_wifi_list[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("SSID"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("SSID-HEX"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("BSSID"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("MODE"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("CHAN"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("FREQ"), /* 6 */ - OUTPUT_FIELD_WITH_NAME ("RATE"), /* 7 */ - OUTPUT_FIELD_WITH_NAME ("SIGNAL"), /* 8 */ - OUTPUT_FIELD_WITH_NAME ("BARS"), /* 9 */ - OUTPUT_FIELD_WITH_NAME ("SECURITY"), /* 10 */ - OUTPUT_FIELD_WITH_NAME ("WPA-FLAGS"), /* 11 */ - OUTPUT_FIELD_WITH_NAME ("RSN-FLAGS"), /* 12 */ - OUTPUT_FIELD_WITH_NAME ("DEVICE"), /* 13 */ - OUTPUT_FIELD_WITH_NAME ("ACTIVE"), /* 14 */ - OUTPUT_FIELD_WITH_NAME ("IN-USE"), /* 15 */ - OUTPUT_FIELD_WITH_NAME ("DBUS-PATH"), /* 16 */ - { 0 } +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, }; -#define NMC_FIELDS_DEV_WIFI_LIST_ALL "SSID,SSID-HEX,BSSID,MODE,CHAN,FREQ,RATE,SIGNAL,BARS,SECURITY,"\ - "WPA-FLAGS,RSN-FLAGS,DEVICE,ACTIVE,IN-USE,DBUS-PATH" #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 -/* Available fields for 'device wimax list' */ -NmcOutputField nmc_fields_dev_wimax_list[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("NSP"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("SIGNAL"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("TYPE"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("DEVICE"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("ACTIVE"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("DBUS-PATH"), /* 6 */ - { 0 } +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 */ + NULL, }; -#define NMC_FIELDS_DEV_WIMAX_LIST_ALL "NSP,SIGNAL,TYPE,DEVICE,ACTIVE,DBUS-PATH" #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 -/* Available fields for 'device show' - BOND, BRIDGE part */ -NmcOutputField nmc_fields_dev_show_master_prop[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("SLAVES"), /* 1 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_master_prop[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("SLAVES"), /* 1 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_MASTER_PROP_ALL "NAME,SLAVES" #define NMC_FIELDS_DEV_SHOW_MASTER_PROP_COMMON "NAME,SLAVES" -/* Available fields for 'device show' - TEAM part */ -NmcOutputField nmc_fields_dev_show_team_prop[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("SLAVES"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("CONFIG"), /* 2 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_team_prop[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("SLAVES"), /* 1 */ + NMC_META_GENERIC ("CONFIG"), /* 2 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_TEAM_PROP_ALL "NAME,SLAVES,CONFIG" #define NMC_FIELDS_DEV_SHOW_TEAM_PROP_COMMON "NAME,SLAVES,CONFIG" -/* Available fields for 'device show' - VLAN part */ -NmcOutputField nmc_fields_dev_show_vlan_prop[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("PARENT"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("ID"), /* 2 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_vlan_prop[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("PARENT"), /* 1 */ + NMC_META_GENERIC ("ID"), /* 2 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_VLAN_PROP_ALL "NAME,PARENT,ID" #define NMC_FIELDS_DEV_SHOW_VLAN_PROP_COMMON "NAME,PARENT,ID" -/* Available fields for 'device show' - BLUETOOTH part */ -NmcOutputField nmc_fields_dev_show_bluetooth[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("CAPABILITIES"), /* 1 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_bluetooth[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("CAPABILITIES"), /* 1 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_BLUETOOTH_ALL "NAME,CAPABILITIES" #define NMC_FIELDS_DEV_SHOW_BLUETOOTH_COMMON "NAME,CAPABILITIES" -/* defined in common.c */ -extern NmcOutputField nmc_fields_ip4_config[]; -extern NmcOutputField nmc_fields_ip6_config[]; -extern NmcOutputField nmc_fields_dhcp4_config[]; -extern NmcOutputField nmc_fields_dhcp6_config[]; - /* Available sections for 'device show' */ -NmcOutputField nmc_fields_dev_show_sections[] = { - OUTPUT_FIELD_WITH_FIELDS ("GENERAL", nmc_fields_dev_show_general), /* 0 */ - OUTPUT_FIELD_WITH_FIELDS ("CAPABILITIES", nmc_fields_dev_show_cap), /* 1 */ - OUTPUT_FIELD_WITH_FIELDS ("WIFI-PROPERTIES", nmc_fields_dev_show_wifi_prop), /* 2 */ - OUTPUT_FIELD_WITH_FIELDS ("AP", nmc_fields_dev_wifi_list), /* 3 */ - OUTPUT_FIELD_WITH_FIELDS ("WIRED-PROPERTIES", nmc_fields_dev_show_wired_prop), /* 4 */ - OUTPUT_FIELD_WITH_FIELDS ("WIMAX-PROPERTIES", nmc_fields_dev_show_wimax_prop), /* 5 */ - OUTPUT_FIELD_WITH_FIELDS ("NSP", nmc_fields_dev_wimax_list), /* 6 */ - OUTPUT_FIELD_WITH_FIELDS ("IP4", nmc_fields_ip4_config), /* 7 */ - OUTPUT_FIELD_WITH_FIELDS ("DHCP4", nmc_fields_dhcp4_config), /* 8 */ - OUTPUT_FIELD_WITH_FIELDS ("IP6", nmc_fields_ip6_config), /* 9 */ - OUTPUT_FIELD_WITH_FIELDS ("DHCP6", nmc_fields_dhcp6_config), /* 10 */ - OUTPUT_FIELD_WITH_FIELDS ("BOND", nmc_fields_dev_show_master_prop), /* 11 */ - OUTPUT_FIELD_WITH_FIELDS ("TEAM", nmc_fields_dev_show_team_prop), /* 12 */ - OUTPUT_FIELD_WITH_FIELDS ("BRIDGE", nmc_fields_dev_show_master_prop), /* 13 */ - OUTPUT_FIELD_WITH_FIELDS ("VLAN", nmc_fields_dev_show_vlan_prop), /* 14 */ - OUTPUT_FIELD_WITH_FIELDS ("BLUETOOTH", nmc_fields_dev_show_bluetooth), /* 15 */ - OUTPUT_FIELD_WITH_FIELDS ("CONNECTIONS", nmc_fields_dev_show_connections), /* 16 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_show_sections[] = { + NMC_META_GENERIC_WITH_NESTED ("GENERAL", nmc_fields_dev_show_general + 1), /* 0 */ + NMC_META_GENERIC_WITH_NESTED ("CAPABILITIES", nmc_fields_dev_show_cap + 1), /* 1 */ + NMC_META_GENERIC_WITH_NESTED ("WIFI-PROPERTIES", nmc_fields_dev_show_wifi_prop + 1), /* 2 */ + NMC_META_GENERIC_WITH_NESTED ("AP", nmc_fields_dev_wifi_list + 1), /* 3 */ + NMC_META_GENERIC_WITH_NESTED ("WIRED-PROPERTIES", nmc_fields_dev_show_wired_prop + 1), /* 4 */ + NMC_META_GENERIC_WITH_NESTED ("WIMAX-PROPERTIES", nmc_fields_dev_show_wimax_prop + 1), /* 5 */ + NMC_META_GENERIC_WITH_NESTED ("NSP", nmc_fields_dev_wimax_list + 1), /* 6 */ + NMC_META_GENERIC_WITH_NESTED ("IP4", nmc_fields_ip4_config + 1), /* 7 */ + NMC_META_GENERIC_WITH_NESTED ("DHCP4", nmc_fields_dhcp4_config + 1), /* 8 */ + NMC_META_GENERIC_WITH_NESTED ("IP6", nmc_fields_ip6_config + 1), /* 9 */ + NMC_META_GENERIC_WITH_NESTED ("DHCP6", nmc_fields_dhcp6_config + 1), /* 10 */ + NMC_META_GENERIC_WITH_NESTED ("BOND", nmc_fields_dev_show_master_prop + 1), /* 11 */ + NMC_META_GENERIC_WITH_NESTED ("TEAM", nmc_fields_dev_show_team_prop + 1), /* 12 */ + NMC_META_GENERIC_WITH_NESTED ("BRIDGE", nmc_fields_dev_show_master_prop + 1), /* 13 */ + NMC_META_GENERIC_WITH_NESTED ("VLAN", nmc_fields_dev_show_vlan_prop + 1), /* 14 */ + NMC_META_GENERIC_WITH_NESTED ("BLUETOOTH", nmc_fields_dev_show_bluetooth + 1), /* 15 */ + NMC_META_GENERIC_WITH_NESTED ("CONNECTIONS", nmc_fields_dev_show_connections + 1), /* 16 */ + NULL, }; -#define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL "GENERAL,CAPABILITIES,BOND,TEAM,BRIDGE,VLAN,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,"\ - "BLUETOOTH,CONNECTIONS,IP4,DHCP4,IP6,DHCP6" #define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON "GENERAL.DEVICE,GENERAL.TYPE,GENERAL.HWADDR,GENERAL.MTU,GENERAL.STATE,"\ "GENERAL.CONNECTION,GENERAL.CON-PATH,WIRED-PROPERTIES,IP4,IP6" -/* Available fields for 'device lldp' */ -NmcOutputField nmc_fields_dev_lldp_list[] = { - OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("DEVICE"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("CHASSIS-ID"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("PORT-ID"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("PORT-DESCRIPTION"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("SYSTEM-NAME"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("SYSTEM-DESCRIPTION"), /* 6 */ - OUTPUT_FIELD_WITH_NAME ("SYSTEM-CAPABILITIES"), /* 7 */ - OUTPUT_FIELD_WITH_NAME ("IEEE-802-1-PVID"), /* 8 */ - OUTPUT_FIELD_WITH_NAME ("IEEE-802-1-PPVID"), /* 9 */ - OUTPUT_FIELD_WITH_NAME ("IEEE-802-1-PPVID-FLAGS"), /* 10 */ - OUTPUT_FIELD_WITH_NAME ("IEEE-802-1-VID"), /* 11 */ - OUTPUT_FIELD_WITH_NAME ("IEEE-802-1-VLAN-NAME"), /* 12 */ - OUTPUT_FIELD_WITH_NAME ("DESTINATION"), /* 13 */ - OUTPUT_FIELD_WITH_NAME ("CHASSIS-ID-TYPE"), /* 14 */ - OUTPUT_FIELD_WITH_NAME ("PORT-ID-TYPE"), /* 15 */ - { 0 } +const NmcMetaGenericInfo *const nmc_fields_dev_lldp_list[] = { + NMC_META_GENERIC ("NAME"), /* 0 */ + NMC_META_GENERIC ("DEVICE"), /* 1 */ + NMC_META_GENERIC ("CHASSIS-ID"), /* 2 */ + NMC_META_GENERIC ("PORT-ID"), /* 3 */ + NMC_META_GENERIC ("PORT-DESCRIPTION"), /* 4 */ + NMC_META_GENERIC ("SYSTEM-NAME"), /* 5 */ + NMC_META_GENERIC ("SYSTEM-DESCRIPTION"), /* 6 */ + NMC_META_GENERIC ("SYSTEM-CAPABILITIES"), /* 7 */ + NMC_META_GENERIC ("IEEE-802-1-PVID"), /* 8 */ + NMC_META_GENERIC ("IEEE-802-1-PPVID"), /* 9 */ + NMC_META_GENERIC ("IEEE-802-1-PPVID-FLAGS"), /* 10 */ + NMC_META_GENERIC ("IEEE-802-1-VID"), /* 11 */ + NMC_META_GENERIC ("IEEE-802-1-VLAN-NAME"), /* 12 */ + NMC_META_GENERIC ("DESTINATION"), /* 13 */ + NMC_META_GENERIC ("CHASSIS-ID-TYPE"), /* 14 */ + NMC_META_GENERIC ("PORT-ID-TYPE"), /* 15 */ + NULL, }; -#define NMC_FIELDS_DEV_LLDP_LIST_ALL "DEVICE,CHASSIS-ID,PORT-ID,PORT-DESCRIPTION,SYSTEM-NAME,SYSTEM-DESCRIPTION," \ - "SYSTEM-CAPABILITIES,IEEE-802-1-PVID,IEEE-802-1-PPVID,IEEE-802-1-PPVID-FLAGS," \ - "IEEE-802-1-VID,IEEE-802-1-VLAN-NAME,DESTINATION,CHASSIS-ID-TYPE,PORT-ID-TYPE" #define NMC_FIELDS_DEV_LLDP_LIST_COMMON "DEVICE,CHASSIS-ID,PORT-ID,PORT-DESCRIPTION,SYSTEM-NAME,SYSTEM-DESCRIPTION," \ "SYSTEM-CAPABILITIES" @@ -850,8 +806,7 @@ fill_output_access_point (gpointer data, gpointer user_data) if (security_str->len > 0) g_string_truncate (security_str, security_str->len-1); /* Chop off last space */ - arr = nmc_dup_fields_array (nmc_fields_dev_wifi_list, - sizeof (nmc_fields_dev_wifi_list), + 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 */ @@ -943,8 +898,8 @@ print_bond_bridge_info (NMDevice *device, const GPtrArray *slaves = NULL; GString *slaves_str; int idx; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (NM_IS_DEVICE_BOND (device)) @@ -967,14 +922,13 @@ print_bond_bridge_info (NMDevice *device, if (slaves_str->len > 0) g_string_truncate (slaves_str, slaves_str->len-1); /* Chop off last space */ - tmpl = nmc_fields_dev_show_master_prop; - tmpl_len = sizeof (nmc_fields_dev_show_master_prop); - out_indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DEV_SHOW_MASTER_PROP_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_master_prop; + out_indices = parse_output_fields (one_field, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc (arr, 0, group_prefix); /* i.e. BOND, TEAM, BRIDGE */ set_val_str (arr, 1, slaves_str->str); g_ptr_array_add (out.output_data, arr); @@ -1015,8 +969,8 @@ print_team_info (NMDevice *device, const GPtrArray *slaves = NULL; GString *slaves_str; int idx; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const* tmpl; + NmcOutputField *arr; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (NM_IS_DEVICE_TEAM (device)) @@ -1037,14 +991,13 @@ print_team_info (NMDevice *device, if (slaves_str->len > 0) g_string_truncate (slaves_str, slaves_str->len-1); /* Chop off last space */ - tmpl = nmc_fields_dev_show_team_prop; - tmpl_len = sizeof (nmc_fields_dev_show_team_prop); - out_indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DEV_SHOW_TEAM_PROP_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_team_prop; + out_indices = parse_output_fields (one_field, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc (arr, 0, group_prefix); /* TEAM */ set_val_str (arr, 1, slaves_str->str); set_val_str (arr, 2, sanitize_team_config (nm_device_team_get_config (NM_DEVICE_TEAM (device)))); @@ -1071,11 +1024,9 @@ show_device_info (NMDevice *device, NmCli *nmc) char *speed_str, *state_str, *reason_str, *mtu_str; GArray *sections_array; int k; - char *fields_str; - char *fields_all = NMC_FIELDS_DEV_SHOW_SECTIONS_ALL; - char *fields_common = NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const char *fields_str = NULL; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; gboolean was_output = FALSE; NMIPConfig *cfg4, *cfg6; NMDhcpConfig *dhcp4, *dhcp6; @@ -1083,13 +1034,12 @@ show_device_info (NMDevice *device, NmCli *nmc) GPtrArray *fields_in_section = NULL; if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) - fields_str = fields_common; - else if (strcasecmp (nmc->required_fields, "all") == 0) - fields_str = fields_all; - else + fields_str = NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON; + else if (strcasecmp (nmc->required_fields, "all") == 0) { + } else fields_str = nmc->required_fields; - sections_array = parse_output_fields (fields_str, nmc_fields_dev_show_sections, TRUE, &fields_in_section, &error); + sections_array = parse_output_fields (fields_str, (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_sections, TRUE, &fields_in_section, &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'device show': %s"), error->message); g_error_free (error); @@ -1098,20 +1048,26 @@ show_device_info (NMDevice *device, NmCli *nmc) } { - NMC_OUTPUT_DATA_DEFINE_SCOPED (out); + gs_unref_array GArray *out_indices = NULL; gs_free char *header_name = NULL; + gs_free NmcOutputField *row = NULL; + int i; /* Main header (pretty only) */ header_name = construct_header_name (base_hdr, nm_device_get_iface (device)); /* Lazy way to retrieve sorted array from 0 to the number of dev fields */ - out_indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_GENERAL_ALL, - nmc_fields_dev_show_general, FALSE, NULL, NULL); + out_indices = parse_output_fields (NULL, + (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_general, + FALSE, NULL, NULL); + + row = g_new0 (NmcOutputField, _NM_META_SETTING_TYPE_NUM + 1); + for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) + row[i].info = (const NMMetaAbstractInfo *) &nmc_fields_dev_show_general[i]; - nmc_fields_dev_show_general[0].flags = NMC_OF_FLAG_MAIN_HEADER_ONLY; print_required_fields (&nmc->nmc_config, NMC_OF_FLAG_MAIN_HEADER_ONLY, out_indices, header_name, - 0, nmc_fields_dev_show_general); + 0, row); } /* Loop through the required sections and print them. */ @@ -1128,14 +1084,13 @@ show_device_info (NMDevice *device, NmCli *nmc) reason = nm_device_get_state_reason (device); /* section GENERAL */ - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[0].name)) { + if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[0]->name)) { NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - tmpl = nmc_fields_dev_show_general; - tmpl_len = sizeof (nmc_fields_dev_show_general); - out_indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_GENERAL_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_general; + out_indices = parse_output_fields (section_fld, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); state_str = g_strdup_printf ("%d (%s)", state, nmc_device_state_to_string (state)); @@ -1144,8 +1099,8 @@ show_device_info (NMDevice *device, NmCli *nmc) mtu_str = g_strdup_printf ("%u", nm_device_get_mtu (device)); acon = nm_device_get_active_connection (device); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); - set_val_strc (arr, 0, nmc_fields_dev_show_sections[0].name); /* "GENERAL"*/ + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); + set_val_strc (arr, 0, nmc_fields_dev_show_sections[0]->name); /* "GENERAL"*/ set_val_strc (arr, 1, nm_device_get_iface (device)); set_val_strc (arr, 2, nm_device_get_type_description (device)); set_val_strc (arr, 3, G_OBJECT_TYPE_NAME (device)); @@ -1178,14 +1133,13 @@ show_device_info (NMDevice *device, NmCli *nmc) } /* section CAPABILITIES */ - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[1].name)) { + if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[1]->name)) { NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - tmpl = nmc_fields_dev_show_cap; - tmpl_len = sizeof (nmc_fields_dev_show_cap); - out_indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_CAP_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_cap; + out_indices = parse_output_fields (section_fld, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); caps = nm_device_get_capabilities (device); @@ -1200,8 +1154,8 @@ show_device_info (NMDevice *device, NmCli *nmc) } speed_str = speed ? g_strdup_printf (_("%u Mb/s"), speed) : g_strdup (_("unknown")); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); - set_val_strc (arr, 0, nmc_fields_dev_show_sections[1].name); /* "CAPABILITIES" */ + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); + set_val_strc (arr, 0, nmc_fields_dev_show_sections[1]->name); /* "CAPABILITIES" */ set_val_strc (arr, 1, (caps & NM_DEVICE_CAP_CARRIER_DETECT) ? _("yes") : _("no")); set_val_str (arr, 2, speed_str); set_val_strc (arr, 3, (caps & NM_DEVICE_CAP_IS_SOFTWARE) ? _("yes") : _("no")); @@ -1220,20 +1174,19 @@ show_device_info (NMDevice *device, NmCli *nmc) GPtrArray *aps; /* section WIFI-PROPERTIES */ - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[2].name)) { + if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[2]->name)) { NMC_OUTPUT_DATA_DEFINE_SCOPED (out); wcaps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (device)); - tmpl = nmc_fields_dev_show_wifi_prop; - tmpl_len = sizeof (nmc_fields_dev_show_wifi_prop); - out_indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_WIFI_PROP_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_wifi_prop; + out_indices = parse_output_fields (section_fld, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); - set_val_strc (arr, 0, nmc_fields_dev_show_sections[2].name); /* "WIFI-PROPERTIES" */ + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); + set_val_strc (arr, 0, nmc_fields_dev_show_sections[2]->name); /* "WIFI-PROPERTIES" */ set_val_strc (arr, 1, (wcaps & (NM_WIFI_DEVICE_CAP_CIPHER_WEP40 | NM_WIFI_DEVICE_CAP_CIPHER_WEP104)) ? _("yes") : _("no")); set_val_strc (arr, 2, (wcaps & NM_WIFI_DEVICE_CAP_WPA) ? _("yes") : _("no")); @@ -1254,7 +1207,7 @@ show_device_info (NMDevice *device, NmCli *nmc) } /* section AP */ - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[3].name)) { + 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) { @@ -1262,11 +1215,10 @@ show_device_info (NMDevice *device, NmCli *nmc) active_bssid = active_ap ? nm_access_point_get_bssid (active_ap) : NULL; } - tmpl = nmc_fields_dev_wifi_list; - tmpl_len = sizeof (nmc_fields_dev_wifi_list); + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_wifi_list; out_indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); { @@ -1290,18 +1242,17 @@ show_device_info (NMDevice *device, NmCli *nmc) } } else if (NM_IS_DEVICE_ETHERNET (device)) { /* WIRED-PROPERTIES */ - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[4].name)) { + if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[4]->name)) { NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - tmpl = nmc_fields_dev_show_wired_prop; - tmpl_len = sizeof (nmc_fields_dev_show_wired_prop); - out_indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_WIRED_PROP_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_wired_prop; + out_indices = parse_output_fields (section_fld, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); - set_val_strc (arr, 0, nmc_fields_dev_show_sections[4].name); /* "WIRED-PROPERTIES" */ + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); + set_val_strc (arr, 0, nmc_fields_dev_show_sections[4]->name); /* "WIRED-PROPERTIES" */ set_val_strc (arr, 1, (nm_device_ethernet_get_carrier (NM_DEVICE_ETHERNET (device))) ? _("on") : _("off")); set_val_arrc (arr, 2, ((const char **) nm_device_ethernet_get_s390_subchannels (NM_DEVICE_ETHERNET (device)))); @@ -1320,55 +1271,54 @@ show_device_info (NMDevice *device, NmCli *nmc) dhcp6 = nm_device_get_dhcp6_config (device); /* IP4 */ - if (cfg4 && !strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[7].name)) - was_output = print_ip4_config (cfg4, &nmc->nmc_config, nmc_fields_dev_show_sections[7].name, section_fld); + if (cfg4 && !strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[7]->name)) + was_output = print_ip4_config (cfg4, &nmc->nmc_config, nmc_fields_dev_show_sections[7]->name, section_fld); /* DHCP4 */ - if (dhcp4 && !strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[8].name)) - was_output = print_dhcp4_config (dhcp4, &nmc->nmc_config, nmc_fields_dev_show_sections[8].name, section_fld); + if (dhcp4 && !strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[8]->name)) + was_output = print_dhcp4_config (dhcp4, &nmc->nmc_config, nmc_fields_dev_show_sections[8]->name, section_fld); /* IP6 */ - if (cfg6 && !strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[9].name)) - was_output = print_ip6_config (cfg6, &nmc->nmc_config, nmc_fields_dev_show_sections[9].name, section_fld); + if (cfg6 && !strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[9]->name)) + was_output = print_ip6_config (cfg6, &nmc->nmc_config, nmc_fields_dev_show_sections[9]->name, section_fld); /* DHCP6 */ - if (dhcp6 && !strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[10].name)) - was_output = print_dhcp6_config (dhcp6, &nmc->nmc_config, nmc_fields_dev_show_sections[10].name, section_fld); + if (dhcp6 && !strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[10]->name)) + was_output = print_dhcp6_config (dhcp6, &nmc->nmc_config, nmc_fields_dev_show_sections[10]->name, section_fld); /* Bond specific information */ if (NM_IS_DEVICE_BOND (device)) { - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[11].name)) - was_output = print_bond_bridge_info (device, nmc, nmc_fields_dev_show_sections[11].name, section_fld); + if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[11]->name)) + was_output = print_bond_bridge_info (device, nmc, nmc_fields_dev_show_sections[11]->name, section_fld); } /* Team specific information */ if (NM_IS_DEVICE_TEAM (device)) { - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[12].name)) - was_output = print_team_info (device, nmc, nmc_fields_dev_show_sections[12].name, section_fld); + if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[12]->name)) + was_output = print_team_info (device, nmc, nmc_fields_dev_show_sections[12]->name, section_fld); } /* Bridge specific information */ if (NM_IS_DEVICE_BRIDGE (device)) { - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[13].name)) - was_output = print_bond_bridge_info (device, nmc, nmc_fields_dev_show_sections[13].name, section_fld); + if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[13]->name)) + was_output = print_bond_bridge_info (device, nmc, nmc_fields_dev_show_sections[13]->name, section_fld); } /* VLAN-specific information */ if ((NM_IS_DEVICE_VLAN (device))) { - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[14].name)) { + if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[14]->name)) { char * vlan_id_str = g_strdup_printf ("%u", nm_device_vlan_get_vlan_id (NM_DEVICE_VLAN (device))); NMDevice *parent = nm_device_vlan_get_parent (NM_DEVICE_VLAN (device)); NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - tmpl = nmc_fields_dev_show_vlan_prop; - tmpl_len = sizeof (nmc_fields_dev_show_vlan_prop); - out_indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_VLAN_PROP_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_vlan_prop; + out_indices = parse_output_fields (section_fld, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); - set_val_strc (arr, 0, nmc_fields_dev_show_sections[14].name); /* "VLAN" */ + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); + set_val_strc (arr, 0, nmc_fields_dev_show_sections[14]->name); /* "VLAN" */ set_val_strc (arr, 1, parent ? nm_device_get_iface (parent) : NULL); set_val_str (arr, 2, vlan_id_str); g_ptr_array_add (out.output_data, arr); @@ -1381,18 +1331,17 @@ show_device_info (NMDevice *device, NmCli *nmc) } if (NM_IS_DEVICE_BT (device)) { - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[15].name)) { + if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[15]->name)) { NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - tmpl = nmc_fields_dev_show_bluetooth; - tmpl_len = sizeof (nmc_fields_dev_show_bluetooth); - out_indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_BLUETOOTH_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_bluetooth; + out_indices = parse_output_fields (section_fld, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); - set_val_strc (arr, 0, nmc_fields_dev_show_sections[15].name); /* "BLUETOOTH" */ + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); + set_val_strc (arr, 0, nmc_fields_dev_show_sections[15]->name); /* "BLUETOOTH" */ set_val_str (arr, 1, bluetooth_caps_to_string (nm_device_bt_get_capabilities (NM_DEVICE_BT (device)))); g_ptr_array_add (out.output_data, arr); @@ -1403,18 +1352,17 @@ show_device_info (NMDevice *device, NmCli *nmc) } /* section CONNECTIONS */ - if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[16].name)) { + if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[16]->name)) { const GPtrArray *avail_cons; GString *ac_paths_str; char **ac_arr = NULL; int i; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - tmpl = nmc_fields_dev_show_connections; - tmpl_len = sizeof (nmc_fields_dev_show_connections); - out_indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_CONNECTIONS_ALL, + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_connections; + out_indices = parse_output_fields (section_fld, tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); /* available-connections */ @@ -1441,8 +1389,8 @@ show_device_info (NMDevice *device, NmCli *nmc) if (ac_paths_str->len > 0) g_string_append_c (ac_paths_str, '}'); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); - set_val_strc (arr, 0, nmc_fields_dev_show_sections[16].name); /* "CONNECTIONS" */ + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); + set_val_strc (arr, 0, nmc_fields_dev_show_sections[16]->name); /* "CONNECTIONS" */ set_val_str (arr, 1, ac_paths_str->str); set_val_arr (arr, 2, (ac_arr)); g_ptr_array_add (out.output_data, arr); @@ -1486,8 +1434,7 @@ fill_output_device_status (NMDevice *device, GPtrArray *output_data) NMDeviceState state; NmcTermColor color; NmcTermFormat color_fmt; - NmcOutputField *arr = nmc_dup_fields_array (nmc_fields_dev_status, - sizeof (nmc_fields_dev_status), + NmcOutputField *arr = nmc_dup_fields_array ((const NMMetaAbstractInfo *const*) nmc_fields_dev_status, 0); state = nm_device_get_state (device); @@ -1515,11 +1462,9 @@ do_devices_status (NmCli *nmc, int argc, char **argv) GError *error = NULL; NMDevice **devices; int i; - char *fields_str; - char *fields_all = NMC_FIELDS_DEV_STATUS_ALL; - char *fields_common = NMC_FIELDS_DEV_STATUS_COMMON; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const char *fields_str = NULL; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); next_arg (nmc, &argc, &argv, NULL); @@ -1534,14 +1479,12 @@ do_devices_status (NmCli *nmc, int argc, char **argv) } if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) - fields_str = fields_common; - else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) - fields_str = fields_all; - else + fields_str = NMC_FIELDS_DEV_STATUS_COMMON; + else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) { + } else fields_str = nmc->required_fields; - tmpl = nmc_fields_dev_status; - tmpl_len = sizeof (nmc_fields_dev_status); + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_status; out_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); if (error) { @@ -1551,7 +1494,7 @@ do_devices_status (NmCli *nmc, int argc, char **argv) } /* Add headers */ - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_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); devices = nmc_get_devices_sorted (nmc->client); @@ -2515,7 +2458,7 @@ show_access_point_info (NMDevice *device, NmCli *nmc, NmcOutputData *out) active_bssid = active_ap ? nm_access_point_get_bssid (active_ap) : NULL; } - arr = nmc_dup_fields_array (nmc_fields_dev_wifi_list, sizeof (nmc_fields_dev_wifi_list), + 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); @@ -2661,11 +2604,9 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) const GPtrArray *aps; APInfo *info; int i, j; - char *fields_str; - char *fields_all = NMC_FIELDS_DEV_WIFI_LIST_ALL; - char *fields_common = NMC_FIELDS_DEV_WIFI_LIST_COMMON; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + 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; @@ -2705,14 +2646,12 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) } if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) - fields_str = fields_common; - else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) - fields_str = fields_all; - else + 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 = nmc_fields_dev_wifi_list; - tmpl_len = sizeof (nmc_fields_dev_wifi_list); + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_wifi_list; out_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); if (error) { @@ -2754,7 +2693,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) return NMC_RESULT_ERROR_NOT_FOUND; } /* Add headers (field names) */ - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_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)); @@ -2804,7 +2743,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) 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, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); + 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)); @@ -3708,11 +3647,11 @@ do_device_wifi (NmCli *nmc, int argc, char **argv) } static int -show_device_lldp_list (NMDevice *device, NmCli *nmc, char *fields_str, int *counter) +show_device_lldp_list (NMDevice *device, NmCli *nmc, const char *fields_str, int *counter) { - NmcOutputField *tmpl, *arr; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; GPtrArray *neighbors; - size_t tmpl_len; const char *str; int i; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); @@ -3723,21 +3662,20 @@ show_device_lldp_list (NMDevice *device, NmCli *nmc, char *fields_str, int *coun if (!neighbors || !neighbors->len) return 0; - tmpl = nmc_fields_dev_lldp_list; - tmpl_len = sizeof (nmc_fields_dev_lldp_list); + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_lldp_list; /* Main header name */ header_name = construct_header_name (_("Device LLDP neighbors"), nm_device_get_iface (device)); - out_indices = parse_output_fields (fields_str, nmc_fields_dev_lldp_list, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); + out_indices = parse_output_fields (fields_str, (const NMMetaAbstractInfo *const*) nmc_fields_dev_lldp_list, FALSE, NULL, NULL); + 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); for (i = 0; i < neighbors->len; i++) { NMLldpNeighbor *neighbor = neighbors->pdata[i]; guint value; - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); + arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX); set_val_str (arr, 0, g_strdup_printf ("NEIGHBOR[%d]", (*counter)++)); set_val_strc (arr, 1, nm_device_get_iface (device)); @@ -3798,9 +3736,9 @@ do_device_lldp_list (NmCli *nmc, int argc, char **argv) { NMDevice *device = NULL; gs_free_error GError *error = NULL; - char *fields_str; + const char *fields_str = NULL; int counter = 0; - NMC_OUTPUT_DATA_DEFINE_SCOPED (out); + gs_unref_array GArray *out_indices = NULL; next_arg (nmc, &argc, &argv, NULL); while (argc > 0) { @@ -3830,12 +3768,11 @@ do_device_lldp_list (NmCli *nmc, int argc, char **argv) if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) fields_str = NMC_FIELDS_DEV_LLDP_LIST_COMMON; - else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) - fields_str = NMC_FIELDS_DEV_LLDP_LIST_ALL; - else + else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) { + } else fields_str = nmc->required_fields; - out_indices = parse_output_fields (fields_str, nmc_fields_dev_lldp_list, FALSE, NULL, &error); + out_indices = parse_output_fields (fields_str, (const NMMetaAbstractInfo *const*) nmc_fields_dev_lldp_list, FALSE, NULL, &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'device lldp list': %s"), error->message); diff --git a/clients/cli/devices.h b/clients/cli/devices.h index 672944beda..10c2da27a5 100644 --- a/clients/cli/devices.h +++ b/clients/cli/devices.h @@ -34,20 +34,20 @@ NMDevice ** nmc_get_devices_sorted (NMClient *client); void nmc_device_state_to_color (NMDeviceState state, NmcTermColor *color, NmcTermFormat *color_fmt); -extern NmcOutputField nmc_fields_dev_status[]; -extern NmcOutputField nmc_fields_dev_show_general[]; -extern NmcOutputField nmc_fields_dev_show_connections[]; -extern NmcOutputField nmc_fields_dev_show_cap[]; -extern NmcOutputField nmc_fields_dev_show_wired_prop[]; -extern NmcOutputField nmc_fields_dev_show_wifi_prop[]; -extern NmcOutputField nmc_fields_dev_show_wimax_prop[]; -extern NmcOutputField nmc_fields_dev_wifi_list[]; -extern NmcOutputField nmc_fields_dev_wimax_list[]; -extern NmcOutputField nmc_fields_dev_show_master_prop[]; -extern NmcOutputField nmc_fields_dev_show_team_prop[]; -extern NmcOutputField nmc_fields_dev_show_vlan_prop[]; -extern NmcOutputField nmc_fields_dev_show_bluetooth[]; -extern NmcOutputField nmc_fields_dev_show_sections[]; -extern NmcOutputField nmc_fields_dev_lldp_list[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_status[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_show_general[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_show_connections[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_show_cap[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_show_wired_prop[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_show_wifi_prop[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_show_wimax_prop[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_wifi_list[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_wimax_list[]; +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[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_show_bluetooth[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_show_sections[]; +extern const NmcMetaGenericInfo *const nmc_fields_dev_lldp_list[]; #endif /* NMC_DEVICES_H */ diff --git a/clients/cli/general.c b/clients/cli/general.c index 732476d25d..b610fb18b6 100644 --- a/clients/cli/general.c +++ b/clients/cli/general.c @@ -34,23 +34,20 @@ #include "devices.h" #include "connections.h" -#define OUTPUT_FIELD_WITH_NAME(n) { .name = N_ (n), } - -/* Available fields for 'general status' */ -static NmcOutputField nmc_fields_nm_status[] = { - OUTPUT_FIELD_WITH_NAME ("RUNNING"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("VERSION"), /* 1 */ - OUTPUT_FIELD_WITH_NAME ("STATE"), /* 2 */ - OUTPUT_FIELD_WITH_NAME ("STARTUP"), /* 3 */ - OUTPUT_FIELD_WITH_NAME ("CONNECTIVITY"), /* 4 */ - OUTPUT_FIELD_WITH_NAME ("NETWORKING"), /* 5 */ - OUTPUT_FIELD_WITH_NAME ("WIFI-HW"), /* 6 */ - OUTPUT_FIELD_WITH_NAME ("WIFI"), /* 7 */ - OUTPUT_FIELD_WITH_NAME ("WWAN-HW"), /* 8 */ - OUTPUT_FIELD_WITH_NAME ("WWAN"), /* 9 */ - OUTPUT_FIELD_WITH_NAME ("WIMAX-HW"), /* 10 */ - OUTPUT_FIELD_WITH_NAME ("WIMAX"), /* 11 */ - { 0 } +static const NmcMetaGenericInfo *const nmc_fields_nm_status[] = { + NMC_META_GENERIC ("RUNNING"), /* 0 */ + NMC_META_GENERIC ("VERSION"), /* 1 */ + NMC_META_GENERIC ("STATE"), /* 2 */ + NMC_META_GENERIC ("STARTUP"), /* 3 */ + NMC_META_GENERIC ("CONNECTIVITY"), /* 4 */ + NMC_META_GENERIC ("NETWORKING"), /* 5 */ + NMC_META_GENERIC ("WIFI-HW"), /* 6 */ + NMC_META_GENERIC ("WIFI"), /* 7 */ + NMC_META_GENERIC ("WWAN-HW"), /* 8 */ + NMC_META_GENERIC ("WWAN"), /* 9 */ + NMC_META_GENERIC ("WIMAX-HW"), /* 10 */ + NMC_META_GENERIC ("WIMAX"), /* 11 */ + NULL, }; #define NMC_FIELDS_NM_STATUS_ALL "RUNNING,VERSION,STATE,STARTUP,CONNECTIVITY,NETWORKING,WIFI-HW,WIFI,WWAN-HW,WWAN" #define NMC_FIELDS_NM_STATUS_SWITCH "NETWORKING,WIFI-HW,WIFI,WWAN-HW,WWAN" @@ -64,19 +61,19 @@ static NmcOutputField nmc_fields_nm_status[] = { /* Available fields for 'general permissions' */ -static NmcOutputField nmc_fields_nm_permissions[] = { - OUTPUT_FIELD_WITH_NAME ("PERMISSION"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("VALUE"), /* 1 */ - { 0 } +static const NmcMetaGenericInfo *const nmc_fields_nm_permissions[] = { + NMC_META_GENERIC ("PERMISSION"), /* 0 */ + NMC_META_GENERIC ("VALUE"), /* 1 */ + NULL, }; #define NMC_FIELDS_NM_PERMISSIONS_ALL "PERMISSION,VALUE" #define NMC_FIELDS_NM_PERMISSIONS_COMMON "PERMISSION,VALUE" /* Available fields for 'general logging' */ -static NmcOutputField nmc_fields_nm_logging[] = { - OUTPUT_FIELD_WITH_NAME ("LEVEL"), /* 0 */ - OUTPUT_FIELD_WITH_NAME ("DOMAINS"), /* 1 */ - { 0 } +static const NmcMetaGenericInfo *const nmc_fields_nm_logging[] = { + NMC_META_GENERIC ("LEVEL"), /* 0 */ + NMC_META_GENERIC ("DOMAINS"), /* 1 */ + NULL, }; #define NMC_FIELDS_NM_LOGGING_ALL "LEVEL,DOMAINS" #define NMC_FIELDS_NM_LOGGING_COMMON "LEVEL,DOMAINS" @@ -323,8 +320,8 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl const char *fields_str; const char *fields_all = print_flds ? print_flds : NMC_FIELDS_NM_STATUS_ALL; const char *fields_common = print_flds ? print_flds : NMC_FIELDS_NM_STATUS_COMMON; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) @@ -334,8 +331,7 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl else fields_str = nmc->required_fields; - tmpl = nmc_fields_nm_status; - tmpl_len = sizeof (nmc_fields_nm_status); + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_nm_status; out_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); if (error) { @@ -354,10 +350,10 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl wwan_hw_enabled = nm_client_wwan_hardware_get_enabled (nmc->client); wwan_enabled = nm_client_wwan_get_enabled (nmc->client); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_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); - arr = nmc_dup_fields_array (tmpl, tmpl_len, 0); + arr = nmc_dup_fields_array (tmpl, 0); set_val_strc (arr, 0, _("running")); set_val_strc (arr, 1, nm_client_get_version (nmc->client)); set_val_strc (arr, 2, nm_state_to_string (state)); @@ -474,8 +470,8 @@ print_permissions (void *user_data) const char *fields_str; const char *fields_all = NMC_FIELDS_NM_PERMISSIONS_ALL; const char *fields_common = NMC_FIELDS_NM_PERMISSIONS_COMMON; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) @@ -485,8 +481,7 @@ print_permissions (void *user_data) else fields_str = nmc->required_fields; - tmpl = nmc_fields_nm_permissions; - tmpl_len = sizeof (nmc_fields_nm_permissions); + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_nm_permissions; out_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); if (error) { @@ -496,14 +491,14 @@ print_permissions (void *user_data) return FALSE; } - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_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); for (perm = NM_CLIENT_PERMISSION_NONE + 1; perm <= NM_CLIENT_PERMISSION_LAST; perm++) { NMClientPermissionResult perm_result = nm_client_get_permission_result (nmc->client, perm); - arr = nmc_dup_fields_array (tmpl, tmpl_len, 0); + arr = nmc_dup_fields_array (tmpl, 0); set_val_strc (arr, 0, permission_to_string (perm)); set_val_strc (arr, 1, permission_result_to_string (perm_result)); g_ptr_array_add (out.output_data, arr); @@ -588,8 +583,8 @@ show_general_logging (NmCli *nmc) const char *fields_str; const char *fields_all = NMC_FIELDS_NM_LOGGING_ALL; const char *fields_common = NMC_FIELDS_NM_LOGGING_COMMON; - NmcOutputField *tmpl, *arr; - size_t tmpl_len; + const NMMetaAbstractInfo *const*tmpl; + NmcOutputField *arr; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) @@ -599,8 +594,7 @@ show_general_logging (NmCli *nmc) else fields_str = nmc->required_fields; - tmpl = nmc_fields_nm_logging; - tmpl_len = sizeof (nmc_fields_nm_logging); + tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_nm_logging; out_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); if (error) { @@ -618,10 +612,10 @@ show_general_logging (NmCli *nmc) return FALSE; } - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_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); - arr = nmc_dup_fields_array (tmpl, tmpl_len, 0); + arr = nmc_dup_fields_array (tmpl, 0); set_val_str (arr, 0, level); set_val_str (arr, 1, domains); g_ptr_array_add (out.output_data, arr); diff --git a/clients/cli/nmcli.c b/clients/cli/nmcli.c index 3c01828a71..8ec4b42cd1 100644 --- a/clients/cli/nmcli.c +++ b/clients/cli/nmcli.c @@ -51,10 +51,23 @@ #endif /* Global NmCli object */ -// FIXME: Currently, we pass NmCli over in most APIs, but we might refactor -// that and use the global variable directly instead. NmCli nm_cli; +/*****************************************************************************/ + +static const char * +_meta_type_nmc_generic_info_get_name (const NMMetaAbstractInfo *abstract_info) +{ + return ((const NmcMetaGenericInfo *) abstract_info)->name; +} + +const NMMetaType nmc_meta_type_generic_info = { + .type_name = "nmc-generic-info", + .get_name = _meta_type_nmc_generic_info_get_name, +}; + +/*****************************************************************************/ + typedef struct { NmCli *nmc; int argc; @@ -83,16 +96,12 @@ complete_field_setting (GHashTable *h, NMMetaSettingType setting_type) } static void -complete_field (GHashTable *h, const char *setting, const NmcOutputField *field) +complete_field (GHashTable *h, const NmcMetaGenericInfo *const*field) { int i; - for (i = 0; field[i].name; i++) { - if (setting) - g_hash_table_add (h, g_strdup_printf ("%s.%s", setting, field[i].name)); - else - g_hash_table_add (h, g_strdup (field[i].name)); - } + for (i = 0; field[i]; i++) + g_hash_table_add (h, g_strdup (field[i]->name)); } static void @@ -122,30 +131,29 @@ complete_fields (const char *prefix) h = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - complete_field (h, NULL, nmc_fields_ip4_config); - complete_field (h, NULL, nmc_fields_dhcp4_config); - complete_field (h, NULL, nmc_fields_ip6_config); - complete_field (h, NULL, nmc_fields_dhcp6_config); - complete_field (h, NULL, nmc_fields_con_show); - complete_field (h, NULL, nmc_fields_settings_names); - complete_field (h, NULL, nmc_fields_con_active_details_general); - complete_field (h, NULL, nmc_fields_con_active_details_vpn); - complete_field (h, NULL, nmc_fields_con_active_details_groups); - complete_field (h, NULL, nmc_fields_dev_status); - complete_field (h, NULL, nmc_fields_dev_show_general); - complete_field (h, NULL, nmc_fields_dev_show_connections); - complete_field (h, NULL, nmc_fields_dev_show_cap); - complete_field (h, NULL, nmc_fields_dev_show_wired_prop); - complete_field (h, NULL, nmc_fields_dev_show_wifi_prop); - complete_field (h, NULL, nmc_fields_dev_show_wimax_prop); - complete_field (h, NULL, nmc_fields_dev_wifi_list); - complete_field (h, NULL, nmc_fields_dev_wimax_list); - complete_field (h, NULL, nmc_fields_dev_show_master_prop); - complete_field (h, NULL, nmc_fields_dev_show_team_prop); - complete_field (h, NULL, nmc_fields_dev_show_vlan_prop); - complete_field (h, NULL, nmc_fields_dev_show_bluetooth); - complete_field (h, NULL, nmc_fields_dev_show_sections); - complete_field (h, NULL, nmc_fields_dev_lldp_list); + complete_field (h, nmc_fields_ip4_config); + complete_field (h, nmc_fields_dhcp4_config); + complete_field (h, nmc_fields_ip6_config); + complete_field (h, nmc_fields_dhcp6_config); + complete_field (h, nmc_fields_con_show); + complete_field (h, nmc_fields_con_active_details_general); + complete_field (h, nmc_fields_con_active_details_vpn); + complete_field (h, nmc_fields_con_active_details_groups); + complete_field (h, nmc_fields_dev_status); + complete_field (h, nmc_fields_dev_show_general); + complete_field (h, nmc_fields_dev_show_connections); + complete_field (h, nmc_fields_dev_show_cap); + complete_field (h, nmc_fields_dev_show_wired_prop); + complete_field (h, nmc_fields_dev_show_wifi_prop); + complete_field (h, nmc_fields_dev_show_wimax_prop); + complete_field (h, nmc_fields_dev_wifi_list); + complete_field (h, nmc_fields_dev_wimax_list); + 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); + complete_field (h, nmc_fields_dev_show_bluetooth); + complete_field (h, nmc_fields_dev_show_sections); + complete_field (h, nmc_fields_dev_lldp_list); for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) complete_field_setting (h, i); diff --git a/clients/cli/nmcli.h b/clients/cli/nmcli.h index a06e3d8eaf..6d8edf9269 100644 --- a/clients/cli/nmcli.h +++ b/clients/cli/nmcli.h @@ -23,6 +23,8 @@ #include "NetworkManager.h" #include "nm-secret-agent-old.h" +#include "nm-meta-setting-desc.h" + #if WITH_POLKIT_AGENT #include "nm-polkit-listener.h" #else @@ -106,27 +108,37 @@ typedef enum { NMC_OF_FLAG_MAIN_HEADER_ONLY = 0x00000008, /* Print main header only */ } NmcOfFlags; -struct _NMMetaSettingInfoEditor; +extern const const NMMetaType nmc_meta_type_generic_info; -typedef struct _NmcOutputField { - const char *name; /* Field's name */ +typedef struct _NmcOutputField NmcOutputField; +typedef struct _NmcMetaGenericInfo NmcMetaGenericInfo; + +struct _NmcMetaGenericInfo { + const NMMetaType *meta_type; + const char *name; + const NmcMetaGenericInfo *const*nested; +}; + +#define NMC_META_GENERIC(n, ...) \ + (&((NmcMetaGenericInfo) { \ + .meta_type = &nmc_meta_type_generic_info, \ + .name = N_ (n), \ + __VA_ARGS__ \ + })) + +#define NMC_META_GENERIC_WITH_NESTED(n, nest) \ + NMC_META_GENERIC (n, .nested = (nest)) + +struct _NmcOutputField { + const NMMetaAbstractInfo *info; int width; /* Width in screen columns */ - const struct _NmcOutputField *group_list; /* Points to an array with available section field names if this is a section (group) field */ void *value; /* Value of current field - char* or char** (NULL-terminated array) */ gboolean value_is_array; /* Whether value is char** instead of char* */ gboolean free_value; /* Whether to free the value */ NmcOfFlags flags; /* Flags - whether and how to print values/field names/headers */ NmcTermColor color; /* Use this color to print value */ NmcTermFormat color_fmt; /* Use this terminal format to print value */ - - /* in a very particular case NmcOutputField is used in combination with - * the @group_list above. That list will go away (and the entire NmcOutputField - * should separate formatting-options, setting-metadata and output. - * - * For now, hack around that by alternatively providing a @setting_info instead - * of @group_list. */ - const struct _NMMetaSettingInfoEditor *setting_info; -} NmcOutputField; +}; typedef enum { NMC_USE_COLOR_AUTO, diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 1fe644be85..110b8e0122 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -35,32 +35,6 @@ /*****************************************************************************/ -static const NmcOutputField * -_get_nmc_output_fields (const NMMetaSettingInfoEditor *setting_info) -{ - static NmcOutputField *fields[_NM_META_SETTING_TYPE_NUM + 1] = { }; - NmcOutputField **field; - guint i; - - g_return_val_if_fail (setting_info, NULL); - g_return_val_if_fail (setting_info->general->meta_type < _NM_META_SETTING_TYPE_NUM, NULL); - - field = &fields[setting_info->general->meta_type]; - - if (G_UNLIKELY (!*field)) { - *field = g_new0 (NmcOutputField, setting_info->properties_num + 1); - for (i = 0; i < setting_info->properties_num; i++) { - NmcOutputField *f = &(*field)[i]; - - f->name = setting_info->properties[i].property_name; - } - } - - return *field; -} - -/*****************************************************************************/ - static gboolean get_answer (const char *prop, const char *value) { @@ -833,40 +807,33 @@ nmc_property_set_gvalue (NMSetting *setting, const char *prop, GValue *value) /*****************************************************************************/ -static char * -_all_properties (const NMMetaSettingInfoEditor *setting_info) +static NmcOutputField * +_dup_fields_array (const NMMetaSettingInfoEditor *setting_info, NmcOfFlags flags) { - GString *str; - guint i; + NmcOutputField *row; + gsize l; - str = g_string_sized_new (250); - for (i = 0; i < setting_info->properties_num; i++) { - if (str->len) - g_string_append_c (str, ','); - g_string_append (str, setting_info->properties[i].property_name); - } - return g_string_free (str, FALSE); + l = setting_info->properties_num; + + row = g_malloc0 ((l + 1) * sizeof (NmcOutputField)); + for (l = 0; l < setting_info->properties_num; l++) + row[l].info = (const NMMetaAbstractInfo *) &setting_info->properties[l]; + row[0].flags = flags; + return row; } gboolean setting_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboolean show_secrets) { - const NMMetaSettingInfo *meta_setting_info; const NMMetaSettingInfoEditor *setting_info; - gs_free NmcOutputField *tmpl = NULL; NmcOutputField *arr; guint i; - size_t tmpl_len; - gs_free char *s_all = NULL; NMMetaAccessorGetType type = NM_META_ACCESSOR_GET_TYPE_PRETTY; NMC_OUTPUT_DATA_DEFINE_SCOPED (out); g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - meta_setting_info = nm_meta_setting_infos_by_gtype (G_OBJECT_TYPE (setting)); - g_return_val_if_fail (meta_setting_info, FALSE); - - setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type]; + setting_info = nm_meta_setting_info_editor_find_by_setting (setting); g_return_val_if_fail (setting_info, FALSE); g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (setting, setting_info->general->get_setting_gtype ()), FALSE); @@ -874,15 +841,13 @@ setting_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboolean if (nmc->nmc_config.print_output == NMC_PRINT_TERSE) type = NM_META_ACCESSOR_GET_TYPE_PARSABLE; - tmpl_len = sizeof (NmcOutputField) * (setting_info->properties_num + 1); - tmpl = g_memdup (_get_nmc_output_fields (setting_info), tmpl_len); - - out_indices = parse_output_fields (one_prop ?: (s_all = _all_properties (setting_info)), - tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); + out_indices = parse_output_fields (one_prop, + (const NMMetaAbstractInfo *const*) nm_property_infos_for_setting_type (setting_info->general->meta_type), + FALSE, NULL, NULL); + arr = _dup_fields_array (setting_info, NMC_OF_FLAG_FIELD_NAMES); g_ptr_array_add (out.output_data, arr); - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); + arr = _dup_fields_array (setting_info, NMC_OF_FLAG_SECTION_PREFIX); for (i = 0; i < setting_info->properties_num; i++) { const NMMetaPropertyInfo *property_info = &setting_info->properties[i]; diff --git a/clients/cli/utils.c b/clients/cli/utils.c index 68cf81c01a..3fc5777639 100644 --- a/clients/cli/utils.c +++ b/clients/cli/utils.c @@ -613,7 +613,7 @@ set_val_color_all (NmcOutputField fields_array[], NmcTermColor color) { int i; - for (i = 0; fields_array[i].name; i++) { + for (i = 0; fields_array[i].info; i++) { fields_array[i].color = color; } } @@ -623,7 +623,7 @@ set_val_color_fmt_all (NmcOutputField fields_array[], NmcTermFormat format) { int i; - for (i = 0; fields_array[i].name; i++) { + for (i = 0; fields_array[i].info; i++) { fields_array[i].color_fmt = format; } } @@ -636,7 +636,7 @@ nmc_free_output_field_values (NmcOutputField fields_array[]) { NmcOutputField *iter = fields_array; - while (iter && iter->name) { + while (iter && iter->info) { if (iter->free_value) { if (iter->value_is_array) g_strfreev ((char **) iter->value); @@ -648,6 +648,19 @@ nmc_free_output_field_values (NmcOutputField fields_array[]) } } +static const char * +_abstract_info_get_name (const NMMetaAbstractInfo *abstract_info) +{ + const char *n; + + nm_assert (abstract_info); + nm_assert (abstract_info->meta_type); + nm_assert (abstract_info->meta_type->get_name); + n = abstract_info->meta_type->get_name (abstract_info); + nm_assert (n && n[0]); + return n; +} + /** * parse_output_fields: * @field_str: comma-separated field names to parse @@ -670,110 +683,107 @@ nmc_free_output_field_values (NmcOutputField fields_array[]) */ GArray * parse_output_fields (const char *fields_str, - const NmcOutputField fields_array[], + const NMMetaAbstractInfo *const*fields_array, gboolean parse_groups, - GPtrArray **group_fields, + GPtrArray **out_group_fields, GError **error) { - char **fields, **iter; - GArray *array; + gs_strfreev char **fields = NULL; + const char *const*iter = NULL; + gs_unref_ptrarray GPtrArray *group_fields = NULL; + gs_unref_array GArray *array = NULL; int i, j; - g_return_val_if_fail (error == NULL || *error == NULL, NULL); - g_return_val_if_fail (group_fields == NULL || *group_fields == NULL, NULL); + g_return_val_if_fail (!error || !*error, NULL); + g_return_val_if_fail (!out_group_fields || !*out_group_fields, NULL); array = g_array_new (FALSE, FALSE, sizeof (int)); - if (parse_groups && group_fields) - *group_fields = g_ptr_array_new_full (20, (GDestroyNotify) g_free); + if (parse_groups && out_group_fields) + group_fields = g_ptr_array_new_full (20, g_free); - /* Split supplied fields string */ - fields = g_strsplit_set (fields_str, ",", -1); - for (iter = fields; iter && *iter; iter++) { + if (!fields_str) { + for (i = 0; fields_array[i]; i++) { + g_array_append_val (array, i); + if (group_fields) + g_ptr_array_add (group_fields, NULL); + } + goto out; + } + + fields = _nm_utils_strv_cleanup (g_strsplit_set (fields_str, ",", -1), + TRUE, + TRUE, + FALSE); + for (iter = (const char *const*) fields; *iter; iter++) { + gs_free char *tmp = NULL; int idx = -1; + const char *i_name = *iter; + char *right = NULL; - g_strstrip (*iter); - if (parse_groups) { - /* e.g. "general.device,general.driver,ip4,ip6" */ - gboolean found = FALSE; - char *left = *iter; - char *right = strchr (*iter, '.'); - + if (group_fields) { + tmp = g_strdup (i_name); + i_name = tmp; + right = strchr (tmp, '.'); if (right) *right++ = '\0'; - - for (i = 0; fields_array[i].name; i++) { - if (strcasecmp (left, fields_array[i].name) == 0) { - const NmcOutputField *valid_names = fields_array[i].group_list; - const NMMetaSettingInfoEditor *setting_info = fields_array[i].setting_info; - - idx = i; - if (!right && !valid_names && !setting_info) { - found = TRUE; - break; - } - if (valid_names) { - for (j = 0; valid_names[j].name; j++) { - if (!right || strcasecmp (right, valid_names[j].name) == 0) { - found = TRUE; - break; - } - } - } else if (setting_info) { - for (j = 1; j < setting_info->properties_num; j++) { - if (!right || strcasecmp (right, setting_info->properties[j].property_name) == 0) { - found = TRUE; - break; - } - } - } - if (found) - break; - } - } - if (found) { - /* Add index to array, and field name (or NULL) to group_fields array */ - g_array_append_val (array, idx); - if (group_fields && *group_fields) - g_ptr_array_add (*group_fields, g_strdup (right)); - } - if (right) - *(right-1) = '.'; /* Restore the original string */ - } else { - /* e.g. "general,ip4,ip6" */ - for (i = 0; fields_array[i].name; i++) { - if (strcasecmp (*iter, fields_array[i].name) == 0) { - g_array_append_val (array, i); - break; - } - } } - /* Field was not found - error case */ - if (fields_array[i].name == NULL) { - /* Set GError */ - if (!strcasecmp (*iter, "all") || !strcasecmp (*iter, "common")) - g_set_error (error, NMCLI_ERROR, 0, _("field '%s' has to be alone"), *iter); + for (i = 0; fields_array[i]; i++) { + const NMMetaAbstractInfo *fi = fields_array[i]; + gboolean found; + + if (g_ascii_strcasecmp (i_name, _abstract_info_get_name (fi)) != 0) + continue; + + if (!right) + found = TRUE; else { - char *allowed_fields = nmc_get_allowed_fields (fields_array, idx); - g_set_error (error, NMCLI_ERROR, 1, _("invalid field '%s'; allowed fields: %s"), - *iter, allowed_fields); - g_free (allowed_fields); + found = FALSE; + if (fi->meta_type == &nm_meta_type_setting_info_editor) { + const NMMetaSettingInfoEditor *fi_s = &fi->as.setting_info; + + for (j = 1; j < fi_s->properties_num; j++) { + if (g_ascii_strcasecmp (right, fi_s->properties[j].property_name) == 0) { + found = TRUE; + break; + } + } + } else if (fi->meta_type == &nmc_meta_type_generic_info) { + const NmcMetaGenericInfo *fi_g = (const NmcMetaGenericInfo *) fi; + + for (j = 0; fi_g->nested && fi_g->nested[j]; j++) { + if (g_ascii_strcasecmp (right, _abstract_info_get_name ((const NMMetaAbstractInfo *) fi_g->nested[j])) == 0) { + found = TRUE; + break; + } + } + } } - /* Free arrays on error */ - g_array_free (array, TRUE); - array = NULL; - if (group_fields && *group_fields) { - g_ptr_array_free (*group_fields, TRUE); - *group_fields = NULL; + if (found) { + g_array_append_val (array, i); + if (group_fields) + g_ptr_array_add (group_fields, g_strdup (right)); + break; } - goto done; + + if ( !g_ascii_strcasecmp (i_name, "all") + || !g_ascii_strcasecmp (i_name, "common")) + g_set_error (error, NMCLI_ERROR, 0, _("field '%s' has to be alone"), i_name); + else { + gs_free char *allowed_fields = nmc_get_allowed_fields (fields_array, idx); + + g_set_error (error, NMCLI_ERROR, 1, _("invalid field '%s'; allowed fields: %s"), + i_name, allowed_fields); + } + NM_SET_OUT (out_group_fields, NULL); + return NULL; } } -done: - if (fields) - g_strfreev (fields); - return array; + +out: + NM_SET_OUT (out_group_fields, g_steal_pointer (&group_fields)); + return g_steal_pointer (&array); } /** @@ -786,28 +796,30 @@ done: * Caller is responsible for freeing the array. */ char * -nmc_get_allowed_fields (const NmcOutputField fields_array[], int group_idx) +nmc_get_allowed_fields (const NMMetaAbstractInfo *const*fields_array, int group_idx) { GString *allowed_fields = g_string_sized_new (256); int i; - if (group_idx != -1 && fields_array[group_idx].group_list) { - const NmcOutputField *second_level = fields_array[group_idx].group_list; + if (group_idx != -1 && fields_array[group_idx]->meta_type == &nmc_meta_type_generic_info) { + const NmcMetaGenericInfo *const*nested = ((const NmcMetaGenericInfo *) fields_array[group_idx])->nested; + const char *name = _abstract_info_get_name (fields_array[group_idx]); - for (i = 0; second_level[i].name; i++) { + for (i = 0; nested && nested[i]; i++) { g_string_append_printf (allowed_fields, "%s.%s,", - fields_array[group_idx].name, second_level[i].name); + name, _abstract_info_get_name ((const NMMetaAbstractInfo *) nested[i])); } - } else if (group_idx != -1 && fields_array[group_idx].setting_info) { - const NMMetaSettingInfoEditor *second_level = fields_array[group_idx].setting_info; + } else if (group_idx != -1 && fields_array[group_idx]->meta_type == &nm_meta_type_setting_info_editor) { + const NMMetaSettingInfoEditor *fi = &fields_array[group_idx]->as.setting_info; + const char *name = _abstract_info_get_name (fields_array[group_idx]); - for (i = 1; i < second_level->properties_num; i++) { + for (i = 1; i < fi->properties_num; i++) { g_string_append_printf (allowed_fields, "%s.%s,", - fields_array[group_idx].name, second_level->properties[i].property_name); + name, fi->properties[i].property_name); } } else { - for (i = 0; fields_array[i].name; i++) - g_string_append_printf (allowed_fields, "%s,", fields_array[i].name); + for (i = 0; fields_array[i]; i++) + g_string_append_printf (allowed_fields, "%s,", _abstract_info_get_name (fields_array[i])); } g_string_truncate (allowed_fields, allowed_fields->len - 1); @@ -815,14 +827,18 @@ nmc_get_allowed_fields (const NmcOutputField fields_array[], int group_idx) } NmcOutputField * -nmc_dup_fields_array (NmcOutputField fields[], size_t size, NmcOfFlags flags) +nmc_dup_fields_array (const NMMetaAbstractInfo *const*fields, NmcOfFlags flags) { NmcOutputField *row; + gsize l; - row = g_malloc0 (size); - memcpy (row, fields, size); + for (l = 0; fields[l]; l++) { + } + + row = g_new0 (NmcOutputField, l + 1); + for (l = 0; fields[l]; l++) + row[l].info = fields[l]; row[0].flags = flags; - return row; } @@ -875,7 +891,7 @@ get_value_to_print (NmcColorOption color_option, nm_assert (out_to_free && !*out_to_free); if (field_name) - value = _(field->name); + value = _(_abstract_info_get_name (field->info)); else { value = field->value ? (is_array @@ -989,7 +1005,7 @@ print_required_fields (const NmcConfig *nmc_config, tmp = g_strdup_printf ("%s%s%s[%d]:", section_prefix ? (const char*) field_values[0].value : "", section_prefix ? "." : "", - _(field_values[idx].name), + _(_abstract_info_get_name (field_values[idx].info)), j); width1 = strlen (tmp); width2 = nmc_string_screen_width (tmp, NULL); @@ -1009,7 +1025,7 @@ print_required_fields (const NmcConfig *nmc_config, tmp = g_strdup_printf ("%s%s%s:", section_prefix ? hdr_name : "", section_prefix ? "." : "", - _(field_values[idx].name)); + _(_abstract_info_get_name (field_values[idx].info))); width1 = strlen (tmp); width2 = nmc_string_screen_width (tmp, NULL); g_print ("%-*s%s\n", terse ? 0 : ML_VALUE_INDENT+width1-width2, tmp, print_val); @@ -1091,7 +1107,7 @@ print_data_prepare_width (GPtrArray *output_data) /* How many fields? */ row = g_ptr_array_index (output_data, 0); - while (row->name) { + while (row->info) { num_fields++; row++; } diff --git a/clients/cli/utils.h b/clients/cli/utils.h index c5ef0713ee..17f3af8860 100644 --- a/clients/cli/utils.h +++ b/clients/cli/utils.h @@ -61,12 +61,12 @@ void set_val_color_all (NmcOutputField fields_array[], NmcTermColor color); void set_val_color_fmt_all (NmcOutputField fields_array[], NmcTermFormat format); void nmc_free_output_field_values (NmcOutputField fields_array[]); GArray *parse_output_fields (const char *fields_str, - const NmcOutputField fields_array[], + const NMMetaAbstractInfo *const* fields_array, gboolean parse_groups, GPtrArray **group_fields, GError **error); -char *nmc_get_allowed_fields (const NmcOutputField fields_array[], int group_idx); -NmcOutputField *nmc_dup_fields_array (NmcOutputField fields[], size_t size, guint32 flags); +char *nmc_get_allowed_fields (const NMMetaAbstractInfo *const*fields_array, int group_idx); +NmcOutputField *nmc_dup_fields_array (const NMMetaAbstractInfo *const*fields, NmcOfFlags flags); void nmc_empty_output_fields (NmcOutputData *output_data); void print_required_fields (const NmcConfig *nmc_config, NmcOfFlags of_flags, diff --git a/clients/common/nm-meta-setting-access.c b/clients/common/nm-meta-setting-access.c index a28fd75cfd..2bce358ce8 100644 --- a/clients/common/nm-meta-setting-access.c +++ b/clients/common/nm-meta-setting-access.c @@ -72,7 +72,7 @@ nm_meta_setting_info_editor_find_by_gtype (GType gtype) return setting_info; } -static const NMMetaSettingInfoEditor * +const NMMetaSettingInfoEditor * nm_meta_setting_info_editor_find_by_setting (NMSetting *setting) { const NMMetaSettingInfoEditor *setting_info; @@ -81,10 +81,7 @@ nm_meta_setting_info_editor_find_by_setting (NMSetting *setting) setting_info = nm_meta_setting_info_editor_find_by_gtype (G_OBJECT_TYPE (setting)); - if (!setting_info) - return NULL; - - g_return_val_if_fail (setting_info == nm_meta_setting_info_editor_find_by_name (nm_setting_get_name (setting)), NULL); + nm_assert (setting_info == nm_meta_setting_info_editor_find_by_name (nm_setting_get_name (setting))); return setting_info; } @@ -140,3 +137,44 @@ nm_meta_property_info_find_by_setting (NMSetting *setting, const char *property_ return property_info; } + +/*****************************************************************************/ + +/* this basically returns NMMetaSettingType.properties, but with type + * (NMMetaPropertyInfo **) instead of (NMMetaPropertyInfo *), which is + * required by some APIs. */ +const NMMetaPropertyInfo *const* +nm_property_infos_for_setting_type (NMMetaSettingType setting_type) +{ + static const NMMetaPropertyInfo **cache[_NM_META_SETTING_TYPE_NUM] = { NULL }; + const NMMetaPropertyInfo **p; + guint i; + + nm_assert (setting_type < _NM_META_SETTING_TYPE_NUM); + nm_assert (setting_type == 0 || setting_type > 0); + + if (G_UNLIKELY (!(p = cache[setting_type]))) { + const NMMetaSettingInfoEditor *setting_info = &nm_meta_setting_infos_editor[setting_type]; + + p = g_new (const NMMetaPropertyInfo *, setting_info->properties_num + 1); + for (i = 0; i < setting_info->properties_num; i++) + p[i] = &setting_info->properties[i]; + p[i] = NULL; + cache[setting_type] = p; + } + return (const NMMetaPropertyInfo *const*) p; +} + +const NMMetaSettingInfoEditor *const* +nm_meta_setting_infos_editor_p (void) +{ + static const NMMetaSettingInfoEditor *cache[_NM_META_SETTING_TYPE_NUM + 1] = { NULL }; + guint i; + + if (G_UNLIKELY (!cache[0])) { + for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) + cache[i] = &nm_meta_setting_infos_editor[i]; + } + return cache; +} + diff --git a/clients/common/nm-meta-setting-access.h b/clients/common/nm-meta-setting-access.h index c7e4f3bd2f..88264ac0d2 100644 --- a/clients/common/nm-meta-setting-access.h +++ b/clients/common/nm-meta-setting-access.h @@ -27,6 +27,7 @@ const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_name (const char *setting_name); const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_gtype (GType gtype); +const NMMetaSettingInfoEditor *nm_meta_setting_info_editor_find_by_setting (NMSetting *setting); const NMMetaPropertyInfo *nm_meta_setting_info_editor_get_property_info (const NMMetaSettingInfoEditor *setting_info, const char *property_name); @@ -37,4 +38,10 @@ const NMMetaPropertyInfo *nm_meta_property_info_find_by_setting (NMSetting *sett /*****************************************************************************/ +const NMMetaPropertyInfo *const*nm_property_infos_for_setting_type (NMMetaSettingType setting_type); + +const NMMetaSettingInfoEditor *const*nm_meta_setting_infos_editor_p (void); + +/*****************************************************************************/ + #endif /* _NM_META_SETTING_ACCESS_H__ */ diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c index 5fa8df4a37..1454e5f494 100644 --- a/clients/common/nm-meta-setting-desc.c +++ b/clients/common/nm-meta-setting-desc.c @@ -6580,7 +6580,7 @@ static const NMMetaPropertyInfo property_infos_WIRELESS_SECURITY[] = { }, }; -const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[_NM_META_SETTING_TYPE_NUM] = { +const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = { #define SETTING_INFO(type) \ [NM_META_SETTING_TYPE_##type] = { \ .meta_type = &nm_meta_type_setting_info_editor, \ @@ -6623,10 +6623,26 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[_NM_META_SETTING_TYPE SETTING_INFO (WIRELESS_SECURITY), }; +/*****************************************************************************/ + +static const char * +_meta_type_setting_info_editor_get_name (const NMMetaAbstractInfo *abstract_info) +{ + return ((const NMMetaSettingInfoEditor *) abstract_info)->general->setting_name; +} + +static const char * +_meta_type_property_info_get_name (const NMMetaAbstractInfo *abstract_info) +{ + return ((const NMMetaPropertyInfo *) abstract_info)->property_name; +} + const NMMetaType nm_meta_type_setting_info_editor = { - .type_name = "setting_info_editor", + .type_name = "setting_info_editor", + .get_name = _meta_type_setting_info_editor_get_name, }; const NMMetaType nm_meta_type_property_info = { - .type_name = "property_info", + .type_name = "property_info", + .get_name = _meta_type_property_info_get_name, }; diff --git a/clients/common/nm-meta-setting-desc.h b/clients/common/nm-meta-setting-desc.h index 8951631225..bcf7efd796 100644 --- a/clients/common/nm-meta-setting-desc.h +++ b/clients/common/nm-meta-setting-desc.h @@ -138,6 +138,7 @@ struct _NMMetaSettingInfoEditor { struct _NMMetaType { const char *type_name; + const char *(*get_name) (const NMMetaAbstractInfo *abstract_info); }; struct _NMMetaAbstractInfo {