diff --git a/Makefile.am b/Makefile.am index bacc616de4..a124c9a28d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -414,9 +414,10 @@ libnm_core_lib_h_pub_real = \ libnm_core_lib_h_pub_mkenums = \ libnm-core/nm-core-enum-types.h libnm_core_lib_h_priv = \ + shared/nm-utils/nm-enum-utils.h \ shared/nm-utils/nm-shared-utils.h \ shared/nm-utils/nm-udev-utils.h \ - shared/nm-setting-metadata.h \ + shared/nm-meta-setting.h \ libnm-core/crypto.h \ libnm-core/nm-connection-private.h \ libnm-core/nm-core-internal.h \ @@ -427,9 +428,10 @@ libnm_core_lib_h_priv = \ libnm-core/nm-setting-private.h \ libnm-core/nm-utils-private.h libnm_core_lib_c_real = \ + shared/nm-utils/nm-enum-utils.c \ shared/nm-utils/nm-shared-utils.c \ shared/nm-utils/nm-udev-utils.c \ - shared/nm-setting-metadata.c \ + shared/nm-meta-setting.c \ libnm-core/crypto.c \ libnm-core/nm-connection.c \ libnm-core/nm-dbus-utils.c \ @@ -3117,6 +3119,19 @@ if BUILD_NMCLI bin_PROGRAMS += clients/cli/nmcli clients_cli_nmcli_SOURCES = \ + \ + shared/nm-utils/nm-enum-utils.c \ + shared/nm-utils/nm-enum-utils.h \ + shared/nm-utils/nm-shared-utils.c \ + shared/nm-utils/nm-shared-utils.h \ + \ + shared/nm-meta-setting.c \ + shared/nm-meta-setting.h \ + \ + clients/common/nm-client-utils.c \ + clients/common/nm-client-utils.h \ + clients/common/nm-meta-setting-desc.c \ + clients/common/nm-meta-setting-desc.h \ \ clients/cli/agent.c \ clients/cli/agent.h \ diff --git a/clients/cli/agent.c b/clients/cli/agent.c index 4cbf7d2d37..183679a48c 100644 --- a/clients/cli/agent.c +++ b/clients/cli/agent.c @@ -125,7 +125,7 @@ secrets_requested (NMSecretAgentSimple *agent, NmCli *nmc = (NmCli *) user_data; gboolean success = FALSE; - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); success = get_secrets_from_user (request_id, title, msg, secrets); diff --git a/clients/cli/common.c b/clients/cli/common.c index 3e28eee7a9..c17bc8194a 100644 --- a/clients/cli/common.c +++ b/clients/cli/common.c @@ -30,56 +30,60 @@ #include #include "nm-vpn-helpers.h" +#include "nm-client-utils.h" + #include "common.h" #include "utils.h" extern GMainLoop *loop; +#define OUTPUT_FIELD_WITH_NAME(n) { .name = N_ (n), } + /* Available fields for IPv4 group */ NmcOutputField nmc_fields_ip4_config[] = { - {"GROUP", N_("GROUP")}, /* 0 */ - {"ADDRESS", N_("ADDRESS")}, /* 1 */ - {"GATEWAY", N_("GATEWAY")}, /* 2 */ - {"ROUTE", N_("ROUTE")}, /* 3 */ - {"DNS", N_("DNS")}, /* 4 */ - {"DOMAIN", N_("DOMAIN")}, /* 5 */ - {"WINS", N_("WINS")}, /* 6 */ - {NULL, NULL} + 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 } }; #define NMC_FIELDS_IP4_CONFIG_ALL "GROUP,ADDRESS,GATEWAY,ROUTE,DNS,DOMAIN,WINS" /* Available fields for DHCPv4 group */ NmcOutputField nmc_fields_dhcp4_config[] = { - {"GROUP", N_("GROUP")}, /* 0 */ - {"OPTION", N_("OPTION")}, /* 1 */ - {NULL, NULL} + OUTPUT_FIELD_WITH_NAME ("GROUP"), /* 0 */ + OUTPUT_FIELD_WITH_NAME ("OPTION"), /* 1 */ + { 0 } }; #define NMC_FIELDS_DHCP4_CONFIG_ALL "GROUP,OPTION" /* Available fields for IPv6 group */ NmcOutputField nmc_fields_ip6_config[] = { - {"GROUP", N_("GROUP")}, /* 0 */ - {"ADDRESS", N_("ADDRESS")}, /* 1 */ - {"GATEWAY", N_("GATEWAY")}, /* 2 */ - {"ROUTE", N_("ROUTE")}, /* 3 */ - {"DNS", N_("DNS")}, /* 4 */ - {"DOMAIN", N_("DOMAIN")}, /* 5 */ - {NULL, NULL} + 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 } }; #define NMC_FIELDS_IP6_CONFIG_ALL "GROUP,ADDRESS,GATEWAY,ROUTE,DNS,DOMAIN" /* Available fields for DHCPv6 group */ NmcOutputField nmc_fields_dhcp6_config[] = { - {"GROUP", N_("GROUP")}, /* 0 */ - {"OPTION", N_("OPTION")}, /* 1 */ - {NULL, NULL} + OUTPUT_FIELD_WITH_NAME ("GROUP"), /* 0 */ + OUTPUT_FIELD_WITH_NAME ("OPTION"), /* 1 */ + { 0 } }; #define NMC_FIELDS_DHCP6_CONFIG_ALL "GROUP,OPTION" gboolean print_ip4_config (NMIPConfig *cfg4, - NmCli *nmc, + const NmcConfig *nmc_config, const char *group_prefix, const char *one_field) { @@ -92,16 +96,17 @@ print_ip4_config (NMIPConfig *cfg4, int i = 0; NmcOutputField *tmpl, *arr; size_t tmpl_len; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (cfg4 == NULL) return FALSE; tmpl = nmc_fields_ip4_config; tmpl_len = sizeof (nmc_fields_ip4_config); - nmc->print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_IP4_CONFIG_ALL, + out.print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_IP4_CONFIG_ALL, tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); /* addresses */ ptr_array = nm_ip_config_get_addresses (cfg4); @@ -156,19 +161,17 @@ print_ip4_config (NMIPConfig *cfg4, set_val_arr (arr, 4, dns_arr); set_val_arr (arr, 5, domain_arr); set_val_arr (arr, 6, wins_arr); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ - - /* Remove any previous data */ - nmc_empty_output_fields (nmc); + print_data_prepare_width (out.output_data); + print_data (nmc_config, &out); return TRUE; } gboolean print_ip6_config (NMIPConfig *cfg6, - NmCli *nmc, + const NmcConfig *nmc_config, const char *group_prefix, const char *one_field) { @@ -180,16 +183,17 @@ print_ip6_config (NMIPConfig *cfg6, int i = 0; NmcOutputField *tmpl, *arr; size_t tmpl_len; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (cfg6 == NULL) return FALSE; tmpl = nmc_fields_ip6_config; tmpl_len = sizeof (nmc_fields_ip6_config); - nmc->print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_IP6_CONFIG_ALL, + out.print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_IP6_CONFIG_ALL, tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); /* addresses */ ptr_array = nm_ip_config_get_addresses (cfg6); @@ -240,19 +244,17 @@ print_ip6_config (NMIPConfig *cfg6, set_val_arr (arr, 3, route_arr); set_val_arr (arr, 4, dns_arr); set_val_arr (arr, 5, domain_arr); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ - - /* Remove any previous data */ - nmc_empty_output_fields (nmc); + print_data_prepare_width (out.output_data); + print_data (nmc_config, &out); return TRUE; } gboolean print_dhcp4_config (NMDhcpConfig *dhcp4, - NmCli *nmc, + const NmcConfig *nmc_config, const char *group_prefix, const char *one_field) { @@ -269,13 +271,14 @@ print_dhcp4_config (NMDhcpConfig *dhcp4, gpointer key, value; char **options_arr = NULL; int i = 0; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); tmpl = nmc_fields_dhcp4_config; tmpl_len = sizeof (nmc_fields_dhcp4_config); - nmc->print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DHCP4_CONFIG_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DHCP4_CONFIG_ALL, + tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); options_arr = g_new (char *, g_hash_table_size (table) + 1); g_hash_table_iter_init (&table_iter, table); @@ -286,12 +289,10 @@ print_dhcp4_config (NMDhcpConfig *dhcp4, arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc (arr, 0, group_prefix); set_val_arr (arr, 1, options_arr); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ - - /* Remove any previous data */ - nmc_empty_output_fields (nmc); + print_data_prepare_width (out.output_data); + print_data (nmc_config, &out); return TRUE; } @@ -300,7 +301,7 @@ print_dhcp4_config (NMDhcpConfig *dhcp4, gboolean print_dhcp6_config (NMDhcpConfig *dhcp6, - NmCli *nmc, + const NmcConfig *nmc_config, const char *group_prefix, const char *one_field) { @@ -317,13 +318,14 @@ print_dhcp6_config (NMDhcpConfig *dhcp6, gpointer key, value; char **options_arr = NULL; int i = 0; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); tmpl = nmc_fields_dhcp6_config; tmpl_len = sizeof (nmc_fields_dhcp6_config); - nmc->print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DHCP6_CONFIG_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DHCP6_CONFIG_ALL, + tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); options_arr = g_new (char *, g_hash_table_size (table) + 1); g_hash_table_iter_init (&table_iter, table); @@ -334,205 +336,16 @@ print_dhcp6_config (NMDhcpConfig *dhcp6, arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX); set_val_strc (arr, 0, group_prefix); set_val_arr (arr, 1, options_arr); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ - - /* Remove any previous data */ - nmc_empty_output_fields (nmc); + print_data_prepare_width (out.output_data); + print_data (nmc_config, &out); return TRUE; } return FALSE; } -/* - * Parse IP address from string to NMIPAddress stucture. - * ip_str is the IP address in the form address/prefix - */ -NMIPAddress * -nmc_parse_and_build_address (int family, const char *ip_str, GError **error) -{ - int max_prefix = (family == AF_INET) ? 32 : 128; - NMIPAddress *addr = NULL; - const char *ip; - char *tmp; - char *plen; - long int prefix; - GError *local = NULL; - - g_return_val_if_fail (ip_str != NULL, NULL); - g_return_val_if_fail (error == NULL || *error == NULL, NULL); - - tmp = g_strdup (ip_str); - plen = strchr (tmp, '/'); /* prefix delimiter */ - if (plen) - *plen++ = '\0'; - - ip = tmp; - - prefix = max_prefix; - if (plen) { - if (!nmc_string_to_int (plen, TRUE, 1, max_prefix, &prefix)) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("invalid prefix '%s'; <1-%d> allowed"), plen, max_prefix); - goto finish; - } - } - - addr = nm_ip_address_new (family, ip, (guint32) prefix, &local); - if (!addr) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("invalid IP address: %s"), local->message); - g_clear_error (&local); - } - -finish: - g_free (tmp); - return addr; -} - -/* - * nmc_parse_and_build_route: - * @family: AF_INET or AF_INET6 - * @str: route string to be parsed - * @error: location to store GError - * - * Parse route from string and return an #NMIPRoute - * - * Returns: a new #NMIPRoute or %NULL on error - */ -NMIPRoute * -nmc_parse_and_build_route (int family, - const char *str, - GError **error) -{ - int max_prefix = (family == AF_INET) ? 32 : 128; - char *plen = NULL; - const char *next_hop = NULL; - const char *canon_dest; - long int prefix = max_prefix; - unsigned long int tmp_ulong; - NMIPRoute *route = NULL; - gboolean success = FALSE; - GError *local = NULL; - gint64 metric = -1; - guint i, len; - gs_strfreev char **routev = NULL; - gs_free char *value = NULL; - gs_free char *dest = NULL; - gs_unref_hashtable GHashTable *attrs = NULL; - GHashTable *tmp_attrs; - - g_return_val_if_fail (family == AF_INET || family == AF_INET6, FALSE); - g_return_val_if_fail (str, FALSE); - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - value = g_strdup (str); - routev = nmc_strsplit_set (g_strstrip (value), " \t", 0); - len = g_strv_length (routev); - if (len < 1) { - g_set_error (error, 1, 0, _("'%s' is not valid (the format is: ip[/prefix] [next-hop] [metric] [attr=val] [attr=val])"), - str); - goto finish; - } - - dest = g_strdup (routev[0]); - plen = strchr (dest, '/'); /* prefix delimiter */ - if (plen) - *plen++ = '\0'; - - if (plen) { - if (!nmc_string_to_int (plen, TRUE, 1, max_prefix, &prefix)) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("invalid prefix '%s'; <1-%d> allowed"), - plen, max_prefix); - goto finish; - } - } - - for (i = 1; i < len; i++) { - if (nm_utils_ipaddr_valid (family, routev[i])) { - if (metric != -1 || attrs) { - g_set_error (error, 1, 0, _("the next hop ('%s') must be first"), routev[i]); - goto finish; - } - next_hop = routev[i]; - } else if (nmc_string_to_uint (routev[i], TRUE, 0, G_MAXUINT32, &tmp_ulong)) { - if (attrs) { - g_set_error (error, 1, 0, _("the metric ('%s') must be before attributes"), routev[i]); - goto finish; - } - metric = tmp_ulong; - } else if (strchr (routev[i], '=')) { - GHashTableIter iter; - char *iter_key; - GVariant *iter_value; - - tmp_attrs = nm_utils_parse_variant_attributes (routev[i], ' ', '=', FALSE, - nm_ip_route_get_variant_attribute_spec(), - error); - if (!tmp_attrs) { - g_prefix_error (error, "invalid option '%s': ", routev[i]); - goto finish; - } - - if (!attrs) - attrs = g_hash_table_new (g_str_hash, g_str_equal); - - g_hash_table_iter_init (&iter, tmp_attrs); - while (g_hash_table_iter_next (&iter, (gpointer *) &iter_key, (gpointer *) &iter_value)) { - if (!nm_ip_route_attribute_validate (iter_key, iter_value, family, NULL, error)) { - g_prefix_error (error, "%s: ", iter_key); - g_hash_table_unref (tmp_attrs); - goto finish; - } - g_hash_table_insert (attrs, iter_key, iter_value); - g_hash_table_iter_steal (&iter); - } - g_hash_table_unref (tmp_attrs); - } else { - g_set_error (error, 1, 0, _("unrecognized option '%s'"), routev[i]); - goto finish; - } - } - - route = nm_ip_route_new (family, dest, prefix, next_hop, metric, &local); - if (!route) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("invalid route: %s"), local->message); - g_clear_error (&local); - goto finish; - } - - /* We don't accept default routes as NetworkManager handles it - * itself. But we have to check this after @route has normalized the - * dest string. - */ - canon_dest = nm_ip_route_get_dest (route); - if (!strcmp (canon_dest, "0.0.0.0") || !strcmp (canon_dest, "::")) { - g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("default route cannot be added (NetworkManager handles it by itself)")); - g_clear_pointer (&route, nm_ip_route_unref); - goto finish; - } - - if (attrs) { - GHashTableIter iter; - char *name; - GVariant *variant; - - g_hash_table_iter_init (&iter, attrs); - while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &variant)) - nm_ip_route_set_attribute (route, name, variant); - } - - success = TRUE; - -finish: - return route; -} - const char * nmc_device_state_to_string (NMDeviceState state) { @@ -782,240 +595,6 @@ nmc_device_reason_to_string (NMDeviceStateReason reason) } } - -/* Max priority values from libnm-core/nm-setting-vlan.c */ -#define MAX_SKB_PRIO G_MAXUINT32 -#define MAX_8021P_PRIO 7 /* Max 802.1p priority */ - -/* - * Parse VLAN priority mappings from the following format: 2:1,3:4,7:3 - * and verify if the priority numbers are valid - * - * Return: string array with split maps, or NULL on error - * Caller is responsible for freeing the array. - */ -char ** -nmc_vlan_parse_priority_maps (const char *priority_map, - NMVlanPriorityMap map_type, - GError **error) -{ - char **mapping = NULL, **iter; - unsigned long from, to, from_max, to_max; - - g_return_val_if_fail (priority_map != NULL, NULL); - g_return_val_if_fail (error == NULL || *error == NULL, NULL); - - if (map_type == NM_VLAN_INGRESS_MAP) { - from_max = MAX_8021P_PRIO; - to_max = MAX_SKB_PRIO; - } else { - from_max = MAX_SKB_PRIO; - to_max = MAX_8021P_PRIO; - } - - mapping = g_strsplit (priority_map, ",", 0); - for (iter = mapping; iter && *iter; iter++) { - char *left, *right; - - left = g_strstrip (*iter); - right = strchr (left, ':'); - if (!right) { - g_set_error (error, 1, 0, _("invalid priority map '%s'"), *iter); - g_strfreev (mapping); - return NULL; - } - *right++ = '\0'; - - if (!nmc_string_to_uint (left, TRUE, 0, from_max, &from)) { - g_set_error (error, 1, 0, _("priority '%s' is not valid (<0-%ld>)"), - left, from_max); - g_strfreev (mapping); - return NULL; - } - if (!nmc_string_to_uint (right, TRUE, 0, to_max, &to)) { - g_set_error (error, 1, 0, _("priority '%s' is not valid (<0-%ld>)"), - right, to_max); - g_strfreev (mapping); - return NULL; - } - *(right-1) = ':'; /* Put back ':' */ - } - return mapping; -} - -const char * -nmc_bond_validate_mode (const char *mode, GError **error) -{ - unsigned long mode_int; - static const char *valid_modes[] = { "balance-rr", - "active-backup", - "balance-xor", - "broadcast", - "802.3ad", - "balance-tlb", - "balance-alb", - NULL }; - if (nmc_string_to_uint (mode, TRUE, 0, 6, &mode_int)) { - /* Translate bonding mode numbers to mode names: - * https://www.kernel.org/doc/Documentation/networking/bonding.txt - */ - return valid_modes[mode_int]; - } else - return nmc_string_is_valid (mode, valid_modes, error); -} - -/* - * nmc_team_check_config: - * @config: file name with team config, or raw team JSON config data - * @out_config: raw team JSON config data - * The value must be freed with g_free(). - * @error: location to store error, or %NUL - * - * Check team config from @config parameter and return the checked - * config in @out_config. - * - * Returns: %TRUE if the config is valid, %FALSE if it is invalid - */ -gboolean -nmc_team_check_config (const char *config, char **out_config, GError **error) -{ - enum { - _TEAM_CONFIG_TYPE_GUESS, - _TEAM_CONFIG_TYPE_FILE, - _TEAM_CONFIG_TYPE_JSON, - } desired_type = _TEAM_CONFIG_TYPE_GUESS; - const char *filename = NULL; - size_t c_len = 0; - gs_free char *config_clone = NULL; - - *out_config = NULL; - - if (!config || !config[0]) - return TRUE; - - if (g_str_has_prefix (config, "file://")) { - config += NM_STRLEN ("file://"); - desired_type = _TEAM_CONFIG_TYPE_FILE; - } else if (g_str_has_prefix (config, "json://")) { - config += NM_STRLEN ("json://"); - desired_type = _TEAM_CONFIG_TYPE_JSON; - } - - if (NM_IN_SET (desired_type, _TEAM_CONFIG_TYPE_FILE, _TEAM_CONFIG_TYPE_GUESS)) { - gs_free char *contents = NULL; - - if (!g_file_get_contents (config, &contents, &c_len, NULL)) { - if (desired_type == _TEAM_CONFIG_TYPE_FILE) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("cannot read team config from file '%s'"), - config); - return FALSE; - } - } else { - if (c_len != strlen (contents)) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("team config file '%s' contains non-valid utf-8"), - config); - return FALSE; - } - filename = config; - config = config_clone = g_steal_pointer (&contents); - } - } - - if (!nm_utils_is_json_object (config, NULL)) { - if (filename) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("'%s' does not contain a valid team configuration"), filename); - } else { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("team configuration must be a JSON object")); - } - return FALSE; - } - - *out_config = (config == config_clone) - ? g_steal_pointer (&config_clone) - : g_strdup (config); - return TRUE; -} - -/* - * nmc_proxy_check_script: - * @script: file name with PAC script, or raw PAC Script data - * @out_script: raw PAC Script (with removed new-line characters) - * @error: location to store error, or %NULL - * - * Check PAC Script from @script parameter and return the checked/sanitized - * config in @out_script. - * - * Returns: %TRUE if the script is valid, %FALSE if it is invalid - */ -gboolean -nmc_proxy_check_script (const char *script, char **out_script, GError **error) -{ - enum { - _PAC_SCRIPT_TYPE_GUESS, - _PAC_SCRIPT_TYPE_FILE, - _PAC_SCRIPT_TYPE_JSON, - } desired_type = _PAC_SCRIPT_TYPE_GUESS; - const char *filename = NULL; - size_t c_len = 0; - gs_free char *script_clone = NULL; - - *out_script = NULL; - - if (!script || !script[0]) - return TRUE; - - if (g_str_has_prefix (script, "file://")) { - script += NM_STRLEN ("file://"); - desired_type = _PAC_SCRIPT_TYPE_FILE; - } else if (g_str_has_prefix (script, "js://")) { - script += NM_STRLEN ("js://"); - desired_type = _PAC_SCRIPT_TYPE_JSON; - } - - if (NM_IN_SET (desired_type, _PAC_SCRIPT_TYPE_FILE, _PAC_SCRIPT_TYPE_GUESS)) { - gs_free char *contents = NULL; - - if (!g_file_get_contents (script, &contents, &c_len, NULL)) { - if (desired_type == _PAC_SCRIPT_TYPE_FILE) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("cannot read pac-script from file '%s'"), - script); - return FALSE; - } - } else { - if (c_len != strlen (contents)) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("file '%s' contains non-valid utf-8"), - script); - return FALSE; - } - filename = script; - script = script_clone = g_steal_pointer (&contents); - } - } - - if ( !strstr (script, "FindProxyForURL") - || !g_utf8_validate (script, -1, NULL)) { - if (filename) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("'%s' does not contain a valid PAC Script"), filename); - } else { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("Not a valid PAC Script")); - } - return FALSE; - } - - *out_script = (script == script_clone) - ? g_steal_pointer (&script_clone) - : g_strdup (script); - return TRUE; -} - /* * nmc_find_connection: * @connections: array of NMConnections to search in @@ -1260,7 +839,7 @@ nmc_secrets_requested (NMSecretAgentSimple *agent, gboolean success = FALSE; const GPtrArray *connections; - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); /* Find the connection for the request */ @@ -1274,7 +853,7 @@ nmc_secrets_requested (NMSecretAgentSimple *agent, g_free (path); } - success = get_secrets_from_user (request_id, title, msg, connection, nmc->in_editor || nmc->ask, + success = get_secrets_from_user (request_id, title, msg, connection, nmc->nmc_config.in_editor || nmc->ask, nmc->show_secrets, nmc->pwds_hash, secrets); if (success) nm_secret_agent_simple_response (agent, request_id, secrets); @@ -1393,7 +972,7 @@ read_again: if (nmc_seen_sigint ()) { /* Ctrl-C */ nmc_clear_sigint (); - if ( nm_cli.in_editor + if ( nm_cli.nmc_config.in_editor || (rl_string && *rl_string)) { /* In editor, or the line is not empty */ /* Call readline again to get new prompt (repeat) */ @@ -1500,7 +1079,7 @@ nmc_readline_echo (gboolean echo_on, const char *prompt_fmt, ...) * See e.g. http://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC49 */ char * -nmc_rl_gen_func_basic (const char *text, int state, const char **words) +nmc_rl_gen_func_basic (const char *text, int state, const char *const*words) { static int list_idx, len; const char *name; diff --git a/clients/cli/common.h b/clients/cli/common.h index 3a598f631c..ca4b030820 100644 --- a/clients/cli/common.h +++ b/clients/cli/common.h @@ -25,27 +25,15 @@ #include "nmcli.h" #include "nm-secret-agent-simple.h" -gboolean print_ip4_config (NMIPConfig *cfg4, NmCli *nmc, const char *group_prefix, const char *one_field); -gboolean print_ip6_config (NMIPConfig *cfg6, NmCli *nmc, const char *group_prefix, const char *one_field); -gboolean print_dhcp4_config (NMDhcpConfig *dhcp4, NmCli *nmc, const char *group_prefix, const char *one_field); -gboolean print_dhcp6_config (NMDhcpConfig *dhcp6, NmCli *nmc, const char *group_prefix, const char *one_field); - -NMIPAddress *nmc_parse_and_build_address (int family, const char *ip_str, GError **error); -NMIPRoute *nmc_parse_and_build_route (int family, const char *str, GError **error); +gboolean print_ip4_config (NMIPConfig *cfg4, const NmcConfig *nmc_config, const char *group_prefix, const char *one_field); +gboolean print_ip6_config (NMIPConfig *cfg6, const NmcConfig *nmc_config, const char *group_prefix, const char *one_field); +gboolean print_dhcp4_config (NMDhcpConfig *dhcp4, const NmcConfig *nmc_config, const char *group_prefix, const char *one_field); +gboolean print_dhcp6_config (NMDhcpConfig *dhcp6, const NmcConfig *nmc_config, const char *group_prefix, const char *one_field); const char * nmc_device_state_to_string (NMDeviceState state); const char * nmc_device_reason_to_string (NMDeviceStateReason reason); const char * nmc_device_metered_to_string (NMMetered value); -char ** -nmc_vlan_parse_priority_maps (const char *priority_map, - NMVlanPriorityMap map_type, - GError **error); - -const char *nmc_bond_validate_mode (const char *mode, GError **error); -gboolean nmc_team_check_config (const char *config, char **out_config, GError **error); -gboolean nmc_proxy_check_script (const char *script, char **out_script, GError **error); - NMConnection *nmc_find_connection (const GPtrArray *connections, const char *filter_type, const char *filter_val, @@ -65,7 +53,7 @@ char *nmc_unique_connection_name (const GPtrArray *connections, void nmc_cleanup_readline (void); char *nmc_readline (const char *prompt_fmt, ...) G_GNUC_PRINTF (1, 2); char *nmc_readline_echo (gboolean echo_on, const char *prompt_fmt, ...) G_GNUC_PRINTF (2, 3); -char *nmc_rl_gen_func_basic (const char *text, int state, const char **words); +char *nmc_rl_gen_func_basic (const char *text, int state, const char *const*words); char *nmc_rl_gen_func_ifnames (const char *text, int state); gboolean nmc_get_in_readline (void); void nmc_set_in_readline (gboolean in_readline); diff --git a/clients/cli/connections.c b/clients/cli/connections.c index 07c1cd23c1..be52b75034 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -29,6 +29,8 @@ #include #include +#include "nm-client-utils.h" + #include "utils.h" #include "common.h" #include "settings.h" @@ -38,6 +40,9 @@ #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, } + typedef struct _OptionInfo OptionInfo; struct _OptionInfo { const char *setting_name; @@ -127,66 +132,70 @@ struct _OptionInfo { /* Available fields for 'connection show' */ NmcOutputField nmc_fields_con_show[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"UUID", N_("UUID")}, /* 1 */ - {"TYPE", N_("TYPE")}, /* 2 */ - {"TIMESTAMP", N_("TIMESTAMP")}, /* 3 */ - {"TIMESTAMP-REAL", N_("TIMESTAMP-REAL")}, /* 4 */ - {"AUTOCONNECT", N_("AUTOCONNECT")}, /* 5 */ - {"AUTOCONNECT-PRIORITY", N_("AUTOCONNECT-PRIORITY")}, /* 6 */ - {"READONLY", N_("READONLY")}, /* 7 */ - {"DBUS-PATH", N_("DBUS-PATH")}, /* 8 */ - {"ACTIVE", N_("ACTIVE")}, /* 9 */ - {"DEVICE", N_("DEVICE")}, /* 10 */ - {"STATE", N_("STATE")}, /* 11 */ - {"ACTIVE-PATH", N_("ACTIVE-PATH")}, /* 12 */ - {"SLAVE", N_("SLAVE")}, /* 13 */ - {NULL, NULL} + 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 } }; #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 SETTING_FIELD(setting, props) { setting, N_(setting), 0, props, NULL, FALSE, FALSE, 0 } +#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[] = { - SETTING_FIELD (NM_SETTING_CONNECTION_SETTING_NAME, nmc_fields_setting_connection + 1), /* 0 */ - SETTING_FIELD (NM_SETTING_WIRED_SETTING_NAME, nmc_fields_setting_wired + 1), /* 1 */ - SETTING_FIELD (NM_SETTING_802_1X_SETTING_NAME, nmc_fields_setting_8021X + 1), /* 2 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SETTING_NAME, nmc_fields_setting_wireless + 1), /* 3 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, nmc_fields_setting_wireless_security + 1), /* 4 */ - SETTING_FIELD (NM_SETTING_IP4_CONFIG_SETTING_NAME, nmc_fields_setting_ip4_config + 1), /* 5 */ - SETTING_FIELD (NM_SETTING_IP6_CONFIG_SETTING_NAME, nmc_fields_setting_ip6_config + 1), /* 6 */ - SETTING_FIELD (NM_SETTING_SERIAL_SETTING_NAME, nmc_fields_setting_serial + 1), /* 7 */ - SETTING_FIELD (NM_SETTING_PPP_SETTING_NAME, nmc_fields_setting_ppp + 1), /* 8 */ - SETTING_FIELD (NM_SETTING_PPPOE_SETTING_NAME, nmc_fields_setting_pppoe + 1), /* 9 */ - SETTING_FIELD (NM_SETTING_GSM_SETTING_NAME, nmc_fields_setting_gsm + 1), /* 10 */ - SETTING_FIELD (NM_SETTING_CDMA_SETTING_NAME, nmc_fields_setting_cdma + 1), /* 11 */ - SETTING_FIELD (NM_SETTING_BLUETOOTH_SETTING_NAME, nmc_fields_setting_bluetooth + 1), /* 12 */ - SETTING_FIELD (NM_SETTING_OLPC_MESH_SETTING_NAME, nmc_fields_setting_olpc_mesh + 1), /* 13 */ - SETTING_FIELD (NM_SETTING_VPN_SETTING_NAME, nmc_fields_setting_vpn + 1), /* 14 */ - SETTING_FIELD (NM_SETTING_WIMAX_SETTING_NAME, nmc_fields_setting_wimax + 1), /* 15 */ - SETTING_FIELD (NM_SETTING_INFINIBAND_SETTING_NAME, nmc_fields_setting_infiniband + 1), /* 16 */ - SETTING_FIELD (NM_SETTING_BOND_SETTING_NAME, nmc_fields_setting_bond + 1), /* 17 */ - SETTING_FIELD (NM_SETTING_VLAN_SETTING_NAME, nmc_fields_setting_vlan + 1), /* 18 */ - SETTING_FIELD (NM_SETTING_ADSL_SETTING_NAME, nmc_fields_setting_adsl + 1), /* 19 */ - SETTING_FIELD (NM_SETTING_BRIDGE_SETTING_NAME, nmc_fields_setting_bridge + 1), /* 20 */ - SETTING_FIELD (NM_SETTING_BRIDGE_PORT_SETTING_NAME, nmc_fields_setting_bridge_port + 1), /* 21 */ - SETTING_FIELD (NM_SETTING_TEAM_SETTING_NAME, nmc_fields_setting_team + 1), /* 22 */ - SETTING_FIELD (NM_SETTING_TEAM_PORT_SETTING_NAME, nmc_fields_setting_team_port + 1), /* 23 */ - SETTING_FIELD (NM_SETTING_DCB_SETTING_NAME, nmc_fields_setting_dcb + 1), /* 24 */ - SETTING_FIELD (NM_SETTING_TUN_SETTING_NAME, nmc_fields_setting_tun + 1), /* 25 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_SETTING_NAME, nmc_fields_setting_ip_tunnel + 1), /* 26 */ - SETTING_FIELD (NM_SETTING_MACSEC_SETTING_NAME, nmc_fields_setting_macsec + 1), /* 27 */ - SETTING_FIELD (NM_SETTING_MACVLAN_SETTING_NAME, nmc_fields_setting_macvlan + 1), /* 28 */ - SETTING_FIELD (NM_SETTING_VXLAN_SETTING_NAME, nmc_fields_setting_vxlan + 1), /* 29 */ - SETTING_FIELD (NM_SETTING_PROXY_SETTING_NAME, nmc_fields_setting_proxy + 1), /* 30 */ - SETTING_FIELD (NM_SETTING_DUMMY_SETTING_NAME, nmc_fields_setting_dummy + 1), /* 31 */ - {NULL, NULL, 0, NULL, NULL, FALSE, FALSE, 0} + 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 } }; -#define NMC_FIELDS_SETTINGS_NAMES_ALL_X NM_SETTING_CONNECTION_SETTING_NAME","\ +#define NMC_FIELDS_SETTINGS_NAMES_ALL NM_SETTING_CONNECTION_SETTING_NAME","\ NM_SETTING_WIRED_SETTING_NAME","\ NM_SETTING_802_1X_SETTING_NAME","\ NM_SETTING_WIRELESS_SETTING_NAME","\ @@ -216,25 +225,26 @@ NmcOutputField nmc_fields_settings_names[] = { NM_SETTING_MACVLAN_SETTING_NAME"," \ NM_SETTING_VXLAN_SETTING_NAME"," \ NM_SETTING_PROXY_SETTING_NAME -#define NMC_FIELDS_SETTINGS_NAMES_ALL NMC_FIELDS_SETTINGS_NAMES_ALL_X + // 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[] = { - {"GROUP", N_("GROUP")}, /* 0 */ - {"NAME", N_("NAME")}, /* 1 */ - {"UUID", N_("UUID")}, /* 2 */ - {"DEVICES", N_("DEVICES")}, /* 3 */ - {"STATE", N_("STATE")}, /* 4 */ - {"DEFAULT", N_("DEFAULT")}, /* 5 */ - {"DEFAULT6", N_("DEFAULT6")}, /* 6 */ - {"SPEC-OBJECT", N_("SPEC-OBJECT")}, /* 7 */ - {"VPN", N_("VPN")}, /* 8 */ - {"DBUS-PATH", N_("DBUS-PATH")}, /* 9 */ - {"CON-PATH", N_("CON-PATH")}, /* 10 */ - {"ZONE", N_("ZONE")}, /* 11 */ - {"MASTER-PATH", N_("MASTER-PATH")}, /* 12 */ - {NULL, NULL} + 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 } }; #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" @@ -243,14 +253,14 @@ NmcOutputField nmc_fields_con_active_details_general[] = { /* Available fields for VPN group */ NmcOutputField nmc_fields_con_active_details_vpn[] = { - {"GROUP", N_("GROUP")}, /* 0 */ - {"TYPE", N_("TYPE")}, /* 1 */ - {"USERNAME", N_("USERNAME")}, /* 2 */ - {"GATEWAY", N_("GATEWAY")}, /* 3 */ - {"BANNER", N_("BANNER")}, /* 4 */ - {"VPN-STATE", N_("VPN-STATE")}, /* 5 */ - {"CFG", N_("CFG")}, /* 6 */ - {NULL, NULL} + 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 } }; #define NMC_FIELDS_CON_ACTIVE_DETAILS_VPN_ALL "GROUP,TYPE,USERNAME,GATEWAY,BANNER,VPN-STATE,CFG" @@ -262,13 +272,13 @@ extern NmcOutputField nmc_fields_dhcp6_config[]; /* Available fields for 'connection show ' - active part */ NmcOutputField nmc_fields_con_active_details_groups[] = { - {"GENERAL", N_("GENERAL"), 0, nmc_fields_con_active_details_general + 1}, /* 0 */ - {"IP4", N_("IP4"), 0, nmc_fields_ip4_config + 1 }, /* 1 */ - {"DHCP4", N_("DHCP4"), 0, nmc_fields_dhcp4_config + 1 }, /* 2 */ - {"IP6", N_("IP6"), 0, nmc_fields_ip6_config + 1 }, /* 3 */ - {"DHCP6", N_("DHCP6"), 0, nmc_fields_dhcp6_config + 1 }, /* 4 */ - {"VPN", N_("VPN"), 0, nmc_fields_con_active_details_vpn + 1 }, /* 5 */ - {NULL, NULL, 0, NULL} + 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" @@ -780,12 +790,16 @@ nmc_connection_profile_details (NMConnection *connection, NmCli *nmc, gboolean s g_assert (print_settings_array); /* Main header */ - nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, nm_connection_get_id (connection)); - nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTINGS_NAMES_ALL, - nmc_fields_settings_names, FALSE, NULL, NULL); + { + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - nmc_fields_settings_names[0].flags = NMC_OF_FLAG_MAIN_HEADER_ONLY; - print_required_fields (nmc, nmc_fields_settings_names); + out.print_fields.header_name = (char *) construct_header_name (base_hdr, nm_connection_get_id (connection)); + out.print_fields.indices = parse_output_fields (NMC_FIELDS_SETTINGS_NAMES_ALL, + nmc_fields_settings_names, FALSE, NULL, NULL); + + nmc_fields_settings_names[0].flags = NMC_OF_FLAG_MAIN_HEADER_ONLY; + print_required_fields (&nmc->nmc_config, &out.print_fields, nmc_fields_settings_names); + } /* Loop through the required settings and print them. */ for (i = 0; i < print_settings_array->len; i++) { @@ -793,19 +807,15 @@ nmc_connection_profile_details (NMConnection *connection, NmCli *nmc, gboolean s int section_idx = g_array_index (print_settings_array, int, i); const char *prop_name = (const char *) g_ptr_array_index (prop_array, i); - if (nmc->print_output != NMC_PRINT_TERSE && !nmc->multiline_output && was_output) + if (nmc->nmc_config.print_output != NMC_PRINT_TERSE && !nmc->nmc_config.multiline_output && was_output) g_print ("\n"); /* Empty line */ was_output = FALSE; - /* Remove any previous data */ - nmc_empty_output_fields (nmc); - setting = nm_connection_get_setting_by_name (connection, nmc_fields_settings_names[section_idx].name); if (setting) { setting_details (setting, nmc, prop_name, secrets); was_output = TRUE; - continue; } } @@ -907,7 +917,7 @@ nmc_active_connection_state_to_color (NMActiveConnectionState state, NmcTermColo } static void -fill_output_connection (NMConnection *connection, NmCli *nmc, gboolean active_only) +fill_output_connection (NMConnection *connection, NMClient *client, GPtrArray *output_data, gboolean active_only) { NMSettingConnection *s_con; guint64 timestamp; @@ -926,7 +936,7 @@ fill_output_connection (NMConnection *connection, NmCli *nmc, gboolean active_on s_con = nm_connection_get_setting_connection (connection); g_assert (s_con); - ac = get_ac_for_connection (nm_client_get_active_connections (nmc->client), connection); + ac = get_ac_for_connection (nm_client_get_active_connections (client), connection); if (active_only && !ac) return; @@ -970,11 +980,11 @@ fill_output_connection (NMConnection *connection, NmCli *nmc, gboolean active_on set_val_strc (arr, 12, ac_path); set_val_strc (arr, 13, nm_setting_connection_get_slave_type (s_con)); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (output_data, arr); } static void -fill_output_connection_for_invisible (NMActiveConnection *ac, NmCli *nmc) +fill_output_connection_for_invisible (NMActiveConnection *ac, GPtrArray *output_data) { NmcOutputField *arr; const char *ac_path = NULL; @@ -1007,12 +1017,12 @@ fill_output_connection_for_invisible (NMActiveConnection *ac, NmCli *nmc) set_val_color_fmt_all (arr, NMC_TERM_FORMAT_DIM); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (output_data, arr); } static void fill_output_active_connection (NMActiveConnection *active, - NmCli *nmc, + GPtrArray *output_data, gboolean with_group, guint32 o_flags) { @@ -1079,7 +1089,7 @@ fill_output_active_connection (NMActiveConnection *active, set_val_strc (arr, 12-idx_start, master ? nm_object_get_path (NM_OBJECT (master)) : NULL); set_val_strc (arr, 13-idx_start, s_con ? nm_setting_connection_get_slave_type (s_con) : NULL); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (output_data, arr); g_string_free (dev_str, FALSE); } @@ -1207,40 +1217,44 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) g_assert (print_groups); /* Main header */ - nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, nm_active_connection_get_uuid (acon)); - nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_CON_ACTIVE_DETAILS_ALL, - nmc_fields_con_active_details_groups, FALSE, NULL, NULL); + { + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - nmc_fields_con_active_details_groups[0].flags = NMC_OF_FLAG_MAIN_HEADER_ONLY; - print_required_fields (nmc, nmc_fields_con_active_details_groups); + out.print_fields.header_name = (char *) construct_header_name (base_hdr, nm_active_connection_get_uuid (acon)); + out.print_fields.indices = parse_output_fields (NMC_FIELDS_CON_ACTIVE_DETAILS_ALL, + nmc_fields_con_active_details_groups, FALSE, NULL, NULL); + + nmc_fields_con_active_details_groups[0].flags = NMC_OF_FLAG_MAIN_HEADER_ONLY; + print_required_fields (&nmc->nmc_config, &out.print_fields, nmc_fields_con_active_details_groups); + } /* Loop through the groups and print them. */ for (i = 0; i < print_groups->len; i++) { int group_idx = g_array_index (print_groups, int, i); char *group_fld = (char *) g_ptr_array_index (group_fields, i); - if (nmc->print_output != NMC_PRINT_TERSE && !nmc->multiline_output && was_output) + if (nmc->nmc_config.print_output != NMC_PRINT_TERSE && !nmc->nmc_config.multiline_output && was_output) g_print ("\n"); /* Empty line */ was_output = FALSE; - /* Remove any previous data */ - nmc_empty_output_fields (nmc); - /* GENERAL */ 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_len = sizeof (nmc_fields_con_active_details_general); - nmc->print_fields.indices = parse_output_fields (group_fld ? group_fld : NMC_FIELDS_CON_ACTIVE_DETAILS_GENERAL_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.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); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); /* Fill in values */ - fill_output_active_connection (acon, nmc, TRUE, NMC_OF_FLAG_SECTION_PREFIX); + fill_output_active_connection (acon, out.output_data, TRUE, NMC_OF_FLAG_SECTION_PREFIX); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); was_output = TRUE; } @@ -1250,7 +1264,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) gboolean b1 = FALSE; NMIPConfig *cfg4 = nm_active_connection_get_ip4_config (acon); - b1 = print_ip4_config (cfg4, nmc, "IP4", group_fld); + b1 = print_ip4_config (cfg4, &nmc->nmc_config, "IP4", group_fld); was_output = was_output || b1; } @@ -1259,7 +1273,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) gboolean b1 = FALSE; NMDhcpConfig *dhcp4 = nm_active_connection_get_dhcp4_config (acon); - b1 = print_dhcp4_config (dhcp4, nmc, "DHCP4", group_fld); + b1 = print_dhcp4_config (dhcp4, &nmc->nmc_config, "DHCP4", group_fld); was_output = was_output || b1; } @@ -1268,7 +1282,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) gboolean b1 = FALSE; NMIPConfig *cfg6 = nm_active_connection_get_ip6_config (acon); - b1 = print_ip6_config (cfg6, nmc, "IP6", group_fld); + b1 = print_ip6_config (cfg6, &nmc->nmc_config, "IP6", group_fld); was_output = was_output || b1; } @@ -1277,7 +1291,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) gboolean b1 = FALSE; NMDhcpConfig *dhcp6 = nm_active_connection_get_dhcp6_config (acon); - b1 = print_dhcp6_config (dhcp6, nmc, "DHCP6", group_fld); + b1 = print_dhcp6_config (dhcp6, &nmc->nmc_config, "DHCP6", group_fld); was_output = was_output || b1; } @@ -1293,6 +1307,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) const char *username = NULL; char **vpn_data_array = NULL; guint32 items_num; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); con = NM_CONNECTION (nm_active_connection_get_connection (acon)); @@ -1301,10 +1316,10 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) tmpl = nmc_fields_con_active_details_vpn; tmpl_len = sizeof (nmc_fields_con_active_details_vpn); - nmc->print_fields.indices = parse_output_fields (group_fld ? group_fld : NMC_FIELDS_CON_ACTIVE_DETAILS_VPN_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.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); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); s_vpn = nm_connection_get_setting_vpn (con); if (s_vpn) { @@ -1337,9 +1352,10 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) set_val_str (arr, 4, banner_str); set_val_str (arr, 5, vpn_state_str); set_val_arr (arr, 6, vpn_data_array); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); was_output = TRUE; } } @@ -1784,6 +1800,7 @@ do_connections_show (NmCli *nmc, int argc, char **argv) char *fields_common = NMC_FIELDS_CON_SHOW_COMMON; NmcOutputField *tmpl, *arr; size_t tmpl_len; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (nmc->complete) goto finish; @@ -1797,31 +1814,32 @@ do_connections_show (NmCli *nmc, int argc, char **argv) tmpl = nmc_fields_con_show; tmpl_len = sizeof (nmc_fields_con_show); - nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &err); + out.print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &err); if (err) goto finish; /* Add headers */ - nmc->print_fields.header_name = active_only ? _("NetworkManager active profiles") : + out.print_fields.header_name = active_only ? _("NetworkManager active profiles") : _("NetworkManager connection profiles"); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); /* There might be active connections not present in connection list * (e.g. private connections of a different user). Show them as well. */ invisibles = get_invisible_active_connections (nmc); for (i = 0; i < invisibles->len; i++) - fill_output_connection_for_invisible (invisibles->pdata[i], nmc); + fill_output_connection_for_invisible (invisibles->pdata[i], out.output_data); g_ptr_array_free (invisibles, TRUE); /* Sort the connections and fill the output data */ connections = nm_client_get_connections (nmc->client); sorted_cons = sort_connections (connections, nmc, order); for (i = 0; i < sorted_cons->len; i++) - fill_output_connection (sorted_cons->pdata[i], nmc, active_only); + fill_output_connection (sorted_cons->pdata[i], nmc->client, out.output_data, active_only); g_ptr_array_free (sorted_cons, TRUE); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); } else { gboolean new_line = FALSE; gboolean without_fields = (nmc->required_fields == NULL); @@ -1830,7 +1848,7 @@ do_connections_show (NmCli *nmc, int argc, char **argv) /* multiline mode is default for 'connection show ' */ if (!nmc->mode_specified) - nmc->multiline_output = TRUE; + nmc->nmc_config_mutable.multiline_output = TRUE; /* Split required fields into the settings and active ones. */ if (!split_required_fields_for_con_show (nmc->required_fields, &profile_flds, &active_flds, &err)) @@ -2178,7 +2196,7 @@ check_activated (ActivateConnectionInfo *info) } if (ac_state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) { - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); g_print (_("Connection successfully activated (D-Bus active path: %s)\n"), nm_object_get_path (NM_OBJECT (active))); @@ -2218,7 +2236,7 @@ check_activated (ActivateConnectionInfo *info) || NM_IS_DEVICE_BRIDGE (device)) && dev_state >= NM_DEVICE_STATE_IP_CONFIG && dev_state <= NM_DEVICE_STATE_ACTIVATED) { - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); g_print (_("Connection successfully activated (master waiting for slaves) (D-Bus active path: %s)\n"), nm_object_get_path (NM_OBJECT (active))); @@ -2348,7 +2366,7 @@ activate_connection_cb (GObject *client, GAsyncResult *result, gpointer user_dat if (nmc->nowait_flag || state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) { /* User doesn't want to wait or already activated */ if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) { - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); g_print (_("Connection successfully activated (D-Bus active path: %s)\n"), nm_object_get_path (NM_OBJECT (active))); @@ -2368,7 +2386,7 @@ activate_connection_cb (GObject *client, GAsyncResult *result, gpointer user_dat } /* Start progress indication showing VPN states */ - if (nmc->print_output == NMC_PRINT_PRETTY) { + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) { if (progress_id) g_source_remove (progress_id); progress_id = g_timeout_add (120, progress_active_connection_cb, active); @@ -2656,7 +2674,7 @@ do_connection_up (NmCli *nmc, int argc, char **argv) } /* Start progress indication */ - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) progress_id = g_timeout_add (120, progress_cb, _("preparing")); return nmc->return_value; @@ -2691,7 +2709,7 @@ down_active_connection_state_cb (NMActiveConnection *active, if (nm_active_connection_get_state (active) < NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) return; - if (info->nmc->print_output == NMC_PRINT_PRETTY) + if (info->nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); g_print (_("Connection '%s' successfully deactivated (D-Bus active path: %s)\n"), nm_active_connection_get_id (active), nm_object_get_path (NM_OBJECT (active))); @@ -3179,6 +3197,7 @@ get_valid_properties_string (const NameItem *array, { const NameItem *iter = array; const NmcOutputField *field_iter; + const NMMetaSettingInfoEditor *setting_info; const char *prop_name = NULL; GString *str; int i, j; @@ -3219,20 +3238,31 @@ get_valid_properties_string (const NameItem *array, g_assert (nmc_fields_settings_names[j].name); j++; } - field_iter = nmc_fields_settings_names[j].group; + field_iter = nmc_fields_settings_names[j].group_list; + setting_info = nmc_fields_settings_names[j].setting_info; j = 0; - while (field_iter[j].name) { + while (TRUE) { gchar *new; - const char *arg_name = field_iter[j].name; + 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 required, expand the alias too */ if (!postfix && iter->alias) { if (modifier) g_string_append_c (str, modifier); new = g_strdup_printf ("%s.%s\n", - iter->alias, - arg_name); + iter->alias, + arg_name); g_string_append (str, new); g_free (new); } @@ -3245,8 +3275,8 @@ get_valid_properties_string (const NameItem *array, if (modifier) g_string_append_c (str, modifier); new = g_strdup_printf ("%s.%s\n", - prop_name, - arg_name); + prop_name, + arg_name); g_string_append (str, new); g_free (new); j++; @@ -5682,27 +5712,24 @@ should_complete_vpn_uuids (const char *prompt, const char *line) return _get_and_check_property (prompt, line, uuid_properties, NULL, NULL); } -static const char ** -get_allowed_property_values (void) +static const char *const* +get_allowed_property_values (char ***out_to_free) { - NMSetting *setting; - char *property; - const char **avals = NULL; + gs_unref_object NMSetting *setting = NULL; + gs_free char *property = NULL; + const char *const*avals = NULL; get_setting_and_property (rl_prompt, rl_line_buffer, &setting, &property); if (setting && property) - avals = nmc_setting_get_property_allowed_values (setting, property); - - if (setting) - g_object_unref (setting); - g_free (property); - + avals = nmc_setting_get_property_allowed_values (setting, property, out_to_free); return avals; } static gboolean should_complete_property_values (const char *prompt, const char *line, gboolean *multi) { + gs_strfreev char **to_free = NULL; + /* properties allowing multiple values */ const char *multi_props[] = { /* '802-1x' properties */ @@ -5718,10 +5745,9 @@ should_complete_property_values (const char *prompt, const char *line, gboolean NULL }; _get_and_check_property (prompt, line, NULL, multi_props, multi); - return get_allowed_property_values () != NULL; + return !!get_allowed_property_values (&to_free); } -//FIXME: this helper should go to libnm later static gboolean _setting_property_is_boolean (NMSetting *setting, const char *property_name) { @@ -5757,13 +5783,13 @@ should_complete_boolean (const char *prompt, const char *line) static char * gen_property_values (const char *text, int state) { - char *ret = NULL; - const char **avals; + gs_strfreev char **to_free = NULL; + const char *const*avals; - avals = get_allowed_property_values (); - if (avals) - ret = nmc_rl_gen_func_basic (text, state, avals); - return ret; + avals = get_allowed_property_values (&to_free); + if (!avals) + return NULL; + return nmc_rl_gen_func_basic (text, state, avals); } /* from readline */ @@ -5997,12 +6023,9 @@ save_history_cmds (const char *uuid) static void editor_show_connection (NMConnection *connection, NmCli *nmc) { - nmc->print_output = NMC_PRINT_PRETTY; - nmc->multiline_output = TRUE; - nmc->escape_values = 0; - - /* Remove any previous data */ - nmc_empty_output_fields (nmc); + nmc->nmc_config_mutable.print_output = NMC_PRINT_PRETTY; + nmc->nmc_config_mutable.multiline_output = TRUE; + nmc->nmc_config_mutable.escape_values = 0; nmc_connection_profile_details (connection, nmc, nmc->editor_show_secrets); } @@ -6013,12 +6036,9 @@ editor_show_setting (NMSetting *setting, NmCli *nmc) g_print (_("['%s' setting values]\n"), nm_setting_get_name (setting)); - nmc->print_output = NMC_PRINT_NORMAL; - nmc->multiline_output = TRUE; - nmc->escape_values = 0; - - /* Remove any previous data */ - nmc_empty_output_fields (nmc); + nmc->nmc_config_mutable.print_output = NMC_PRINT_NORMAL; + nmc->nmc_config_mutable.multiline_output = TRUE; + nmc->nmc_config_mutable.escape_values = 0; setting_details (setting, nmc, NULL, nmc->editor_show_secrets); } @@ -6606,7 +6626,7 @@ property_edit_submenu (NmCli *nmc, /* Set global variable for use in TAB completion */ nmc_tab_completion.property = prop_name; - prompt = nmc_colorize (nmc, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL, + prompt = nmc_colorize (nmc->nmc_config.use_colors, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL, "nmcli %s.%s> ", nm_setting_get_name (curr_setting), prop_name); @@ -6639,12 +6659,16 @@ property_edit_submenu (NmCli *nmc, * single values: : both SET and ADD sets the new value */ if (!cmd_property_arg) { - const char **avals = nmc_setting_get_property_allowed_values (curr_setting, prop_name); + gs_strfreev char **to_free = NULL; + const char *const*avals; + + avals = nmc_setting_get_property_allowed_values (curr_setting, prop_name, &to_free); if (avals) { - char *avals_str = nmc_util_strv_for_display (avals, FALSE); + gs_free char *avals_str = NULL; + + avals_str = nmc_util_strv_for_display (avals, FALSE); g_print (_("Allowed values for '%s' property: %s\n"), prop_name, avals_str); - g_free (avals_str); } prop_val_user = nmc_readline (_("Enter '%s' value: "), prop_name); } else @@ -6938,14 +6962,14 @@ typedef struct { } NmcEditorMenuContext; static void -menu_switch_to_level0 (NmCli *nmc, +menu_switch_to_level0 (NmcColorOption color_option, NmcEditorMenuContext *menu_ctx, const char *prompt, NmcTermColor prompt_color) { menu_ctx->level = 0; g_free (menu_ctx->main_prompt); - menu_ctx->main_prompt = nmc_colorize (nmc, prompt_color, NMC_TERM_FORMAT_NORMAL, "%s", prompt); + menu_ctx->main_prompt = nmc_colorize (color_option, prompt_color, NMC_TERM_FORMAT_NORMAL, "%s", prompt); menu_ctx->curr_setting = NULL; g_strfreev (menu_ctx->valid_props); menu_ctx->valid_props = NULL; @@ -6954,7 +6978,7 @@ menu_switch_to_level0 (NmCli *nmc, } static void -menu_switch_to_level1 (NmCli *nmc, +menu_switch_to_level1 (NmcColorOption color_option, NmcEditorMenuContext *menu_ctx, NMSetting *setting, const char *setting_name, @@ -6962,7 +6986,7 @@ menu_switch_to_level1 (NmCli *nmc, { menu_ctx->level = 1; g_free (menu_ctx->main_prompt); - menu_ctx->main_prompt = nmc_colorize (nmc, prompt_color, NMC_TERM_FORMAT_NORMAL, + menu_ctx->main_prompt = nmc_colorize (color_option, prompt_color, NMC_TERM_FORMAT_NORMAL, "nmcli %s> ", setting_name); menu_ctx->curr_setting = setting; g_strfreev (menu_ctx->valid_props); @@ -7008,7 +7032,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t g_print (_("You may edit the following settings: %s\n"), valid_settings_str); menu_ctx.level = 0; - menu_ctx.main_prompt = nmc_colorize (nmc, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL, + menu_ctx.main_prompt = nmc_colorize (nmc->nmc_config.use_colors, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL, BASE_PROMPT); menu_ctx.curr_setting = NULL; menu_ctx.valid_props = NULL; @@ -7049,9 +7073,10 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t /* Set property value */ if (!cmd_arg) { if (menu_ctx.level == 1) { + gs_strfreev char **avals_to_free = NULL; + gs_free char *prop_val_user = NULL; const char *prop_name; - char *prop_val_user = NULL; - const char **avals; + const char *const*avals; GError *tmp_err = NULL; prop_name = ask_check_property (cmd_arg, @@ -7060,12 +7085,13 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t if (!prop_name) break; - avals = nmc_setting_get_property_allowed_values (menu_ctx.curr_setting, prop_name); + avals = nmc_setting_get_property_allowed_values (menu_ctx.curr_setting, prop_name, &avals_to_free); if (avals) { - char *avals_str = nmc_util_strv_for_display (avals, FALSE); + gs_free char *avals_str = NULL; + + avals_str = nmc_util_strv_for_display (avals, FALSE); g_print (_("Allowed values for '%s' property: %s\n"), prop_name, avals_str); - g_free (avals_str); } prop_val_user = nmc_readline (_("Enter '%s' value: "), prop_name); @@ -7118,12 +7144,16 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t /* Ask for value */ if (!cmd_arg_v) { - const char **avals = nmc_setting_get_property_allowed_values (ss, prop_name); + gs_strfreev char **avals_to_free = NULL; + const char *const*avals; + + avals = nmc_setting_get_property_allowed_values (ss, prop_name, &avals_to_free); if (avals) { - char *avals_str = nmc_util_strv_for_display (avals, FALSE); + gs_free char *avals_str = NULL; + + avals_str = nmc_util_strv_for_display (avals, FALSE); g_print (_("Allowed values for '%s' property: %s\n"), prop_name, avals_str); - g_free (avals_str); } cmd_arg_v = nmc_readline (_("Enter '%s' value: "), prop_name); } @@ -7180,7 +7210,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t nmc_tab_completion.setting = setting; /* Switch to level 1 */ - menu_switch_to_level1 (nmc, &menu_ctx, setting, setting_name, nmc->editor_prompt_color); + menu_switch_to_level1 (nmc->nmc_config.use_colors, &menu_ctx, setting, setting_name, nmc->editor_prompt_color); if (!cmd_arg_s) { g_print (_("You may edit the following properties: %s\n"), menu_ctx.valid_props_str); @@ -7261,7 +7291,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t connection_remove_setting (connection, ss); if (ss == menu_ctx.curr_setting) { /* If we removed the setting we are in, go up */ - menu_switch_to_level0 (nmc, &menu_ctx, BASE_PROMPT, nmc->editor_prompt_color); + menu_switch_to_level0 (nmc->nmc_config.use_colors, &menu_ctx, BASE_PROMPT, nmc->editor_prompt_color); nmc_tab_completion.setting = NULL; /* for TAB completion */ } } else { @@ -7287,7 +7317,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t /* coverity[copy_paste_error] - suppress Coverity COPY_PASTE_ERROR defect */ if (ss == menu_ctx.curr_setting) { /* If we removed the setting we are in, go up */ - menu_switch_to_level0 (nmc, &menu_ctx, BASE_PROMPT, nmc->editor_prompt_color); + menu_switch_to_level0 (nmc->nmc_config.use_colors, &menu_ctx, BASE_PROMPT, nmc->editor_prompt_color); nmc_tab_completion.setting = NULL; /* for TAB completion */ } } else @@ -7599,7 +7629,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t nmc->nowait_flag = FALSE; nmc->should_wait++; - nmc->print_output = NMC_PRINT_PRETTY; + nmc->nmc_config_mutable.print_output = NMC_PRINT_PRETTY; if (!nmc_activate_connection (nmc, NM_CONNECTION (rem_con), ifname, ap_nsp, ap_nsp, NULL, activate_connection_editor_cb, &tmp_err)) { g_print (_("Error: Cannot activate connection: %s.\n"), tmp_err->message); @@ -7638,7 +7668,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t case NMC_EDITOR_MAIN_CMD_BACK: /* Go back (up) an the menu */ if (menu_ctx.level == 1) { - menu_switch_to_level0 (nmc, &menu_ctx, BASE_PROMPT, nmc->editor_prompt_color); + menu_switch_to_level0 (nmc->nmc_config.use_colors, &menu_ctx, BASE_PROMPT, nmc->editor_prompt_color); nmc_tab_completion.setting = NULL; /* for TAB completion */ } break; @@ -7684,10 +7714,10 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t nmc->editor_prompt_color = color; g_free (menu_ctx.main_prompt); if (menu_ctx.level == 0) - menu_ctx.main_prompt = nmc_colorize (nmc, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL, + menu_ctx.main_prompt = nmc_colorize (nmc->nmc_config.use_colors, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL, BASE_PROMPT); else - menu_ctx.main_prompt = nmc_colorize (nmc, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL, + menu_ctx.main_prompt = nmc_colorize (nmc->nmc_config.use_colors, nmc->editor_prompt_color, NMC_TERM_FORMAT_NORMAL, "nmcli %s> ", nm_setting_get_name (menu_ctx.curr_setting)); } @@ -8024,7 +8054,7 @@ do_connection_edit (NmCli *nmc, int argc, char **argv) } /* nmcli runs the editor */ - nmc->in_editor = TRUE; + nmc->nmc_config_mutable.in_editor = TRUE; g_print ("\n"); g_print (_("===| nmcli interactive connection editor |===")); @@ -8077,7 +8107,7 @@ modify_connection_cb (GObject *connection, g_error_free (error); nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; } else { - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) g_print (_("Connection '%s' (%s) successfully modified.\n"), nm_connection_get_id (NM_CONNECTION (connection)), nm_connection_get_uuid (NM_CONNECTION (connection))); diff --git a/clients/cli/devices.c b/clients/cli/devices.c index ce8febcc61..69c913a9d5 100644 --- a/clients/cli/devices.c +++ b/clients/cli/devices.c @@ -26,6 +26,8 @@ #include #include "nm-secret-agent-simple.h" +#include "nm-client-utils.h" + #include "polkit-agent.h" #include "utils.h" #include "common.h" @@ -36,16 +38,19 @@ #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[] = { - {"DEVICE", N_("DEVICE")}, /* 0 */ - {"TYPE", N_("TYPE")}, /* 1 */ - {"STATE", N_("STATE")}, /* 2 */ - {"DBUS-PATH", N_("DBUS-PATH")}, /* 3 */ - {"CONNECTION", N_("CONNECTION")}, /* 4 */ - {"CON-UUID", N_("CON-UUID")}, /* 5 */ - {"CON-PATH", N_("CON-PATH")}, /* 6 */ - {NULL, NULL} + 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 } }; #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" @@ -53,32 +58,32 @@ NmcOutputField nmc_fields_dev_status[] = { /* Available fields for 'device show' - GENERAL part */ NmcOutputField nmc_fields_dev_show_general[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"DEVICE", N_("DEVICE")}, /* 1 */ - {"TYPE", N_("TYPE")}, /* 2 */ - {"NM-TYPE", N_("NM-TYPE")}, /* 3 */ - {"VENDOR", N_("VENDOR")}, /* 4 */ - {"PRODUCT", N_("PRODUCT")}, /* 5 */ - {"DRIVER", N_("DRIVER")}, /* 6 */ - {"DRIVER-VERSION", N_("DRIVER-VERSION")}, /* 7 */ - {"FIRMWARE-VERSION", N_("FIRMWARE-VERSION")}, /* 8 */ - {"HWADDR", N_("HWADDR")}, /* 9 */ - {"MTU", N_("MTU")}, /* 10 */ - {"STATE", N_("STATE")}, /* 11 */ - {"REASON", N_("REASON")}, /* 12 */ - {"UDI", N_("UDI")}, /* 13 */ - {"IP-IFACE", N_("IP-IFACE")}, /* 14 */ - {"IS-SOFTWARE", N_("IS-SOFTWARE")}, /* 15 */ - {"NM-MANAGED", N_("NM-MANAGED")}, /* 16 */ - {"AUTOCONNECT", N_("AUTOCONNECT")}, /* 17 */ - {"FIRMWARE-MISSING", N_("FIRMWARE-MISSING")}, /* 18 */ - {"NM-PLUGIN-MISSING", N_("NM-PLUGIN-MISSING")}, /* 19 */ - {"PHYS-PORT-ID", N_("PHYS-PORT-ID")}, /* 20 */ - {"CONNECTION", N_("CONNECTION")}, /* 21 */ - {"CON-UUID", N_("CON-UUID")}, /* 22 */ - {"CON-PATH", N_("CON-PATH")}, /* 23 */ - {"METERED", N_("METERED")}, /* 24 */ - {NULL, NULL} + 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 } }; #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,"\ @@ -87,85 +92,85 @@ NmcOutputField nmc_fields_dev_show_general[] = { /* Available fields for 'device show' - CONNECTIONS part */ NmcOutputField nmc_fields_dev_show_connections[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"AVAILABLE-CONNECTION-PATHS", N_("AVAILABLE-CONNECTION-PATHS")}, /* 1 */ - {"AVAILABLE-CONNECTIONS", N_("AVAILABLE-CONNECTIONS")}, /* 2 */ - {NULL, NULL} + OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ + OUTPUT_FIELD_WITH_NAME ("AVAILABLE-CONNECTION-PATHS"), /* 1 */ + OUTPUT_FIELD_WITH_NAME ("AVAILABLE-CONNECTIONS"), /* 2 */ + { 0 } }; #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[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"CARRIER-DETECT", N_("CARRIER-DETECT")}, /* 1 */ - {"SPEED", N_("SPEED")}, /* 2 */ - {"IS-SOFTWARE", N_("IS-SOFTWARE")}, /* 3 */ - {NULL, NULL} + 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 } }; #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[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"CARRIER", N_("CARRIER")}, /* 1 */ - {"S390-SUBCHANNELS", N_("S390-SUBCHANNELS")}, /* 2 */ - {NULL, NULL} + OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ + OUTPUT_FIELD_WITH_NAME ("CARRIER"), /* 1 */ + OUTPUT_FIELD_WITH_NAME ("S390-SUBCHANNELS"), /* 2 */ + { 0 } }; #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[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"WEP", N_("WEP")}, /* 1 */ - {"WPA", N_("WPA")}, /* 2 */ - {"WPA2", N_("WPA2")}, /* 3 */ - {"TKIP", N_("TKIP")}, /* 4 */ - {"CCMP", N_("CCMP")}, /* 5 */ - {"AP", N_("AP")}, /* 6 */ - {"ADHOC", N_("ADHOC")}, /* 7 */ - {"2GHZ", N_("2GHZ")}, /* 8 */ - {"5GHZ", N_("5GHZ")}, /* 9 */ - {NULL, NULL} + 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 } }; #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[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"CTR-FREQ", N_("CTR-FREQ")}, /* 1 */ - {"RSSI", N_("RSSI")}, /* 2 */ - {"CINR", N_("CINR")}, /* 3 */ - {"TX-POW", N_("TX-POW")}, /* 4 */ - {"BSID", N_("BSID")}, /* 5 */ - {NULL, NULL} + 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 } }; #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[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"SSID", N_("SSID")}, /* 1 */ - {"SSID-HEX", N_("SSID-HEX")}, /* 2 */ - {"BSSID", N_("BSSID")}, /* 3 */ - {"MODE", N_("MODE")}, /* 4 */ - {"CHAN", N_("CHAN")}, /* 5 */ - {"FREQ", N_("FREQ")}, /* 6 */ - {"RATE", N_("RATE")}, /* 7 */ - {"SIGNAL", N_("SIGNAL")}, /* 8 */ - {"BARS", N_("BARS")}, /* 9 */ - {"SECURITY", N_("SECURITY")}, /* 10 */ - {"WPA-FLAGS", N_("WPA-FLAGS")}, /* 11 */ - {"RSN-FLAGS", N_("RSN-FLAGS")}, /* 12 */ - {"DEVICE", N_("DEVICE")}, /* 13 */ - {"ACTIVE", N_("ACTIVE")}, /* 14 */ - {"IN-USE", N_("*")}, /* 15 */ - {"DBUS-PATH", N_("DBUS-PATH")}, /* 16 */ - {NULL, NULL} + 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 ("*"), /* 15 */ + OUTPUT_FIELD_WITH_NAME ("DBUS-PATH"), /* 16 */ + { 0 } }; #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" @@ -174,14 +179,14 @@ NmcOutputField nmc_fields_dev_wifi_list[] = { /* Available fields for 'device wimax list' */ NmcOutputField nmc_fields_dev_wimax_list[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"NSP", N_("NSP")}, /* 1 */ - {"SIGNAL", N_("SIGNAL")}, /* 2 */ - {"TYPE", N_("TYPE")}, /* 3 */ - {"DEVICE", N_("DEVICE")}, /* 4 */ - {"ACTIVE", N_("ACTIVE")}, /* 5 */ - {"DBUS-PATH", N_("DBUS-PATH")}, /* 6 */ - {NULL, NULL} + 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 } }; #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" @@ -189,38 +194,38 @@ NmcOutputField nmc_fields_dev_wimax_list[] = { /* Available fields for 'device show' - BOND, BRIDGE part */ NmcOutputField nmc_fields_dev_show_master_prop[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"SLAVES", N_("SLAVES")}, /* 1 */ - {NULL, NULL} + OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ + OUTPUT_FIELD_WITH_NAME ("SLAVES"), /* 1 */ + { 0 } }; #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[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"SLAVES", N_("SLAVES")}, /* 1 */ - {"CONFIG", N_("CONFIG")}, /* 2 */ - {NULL, NULL} + OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ + OUTPUT_FIELD_WITH_NAME ("SLAVES"), /* 1 */ + OUTPUT_FIELD_WITH_NAME ("CONFIG"), /* 2 */ + { 0 } }; #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[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"PARENT", N_("PARENT")}, /* 1 */ - {"ID", N_("ID")}, /* 2 */ - {NULL, NULL} + OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ + OUTPUT_FIELD_WITH_NAME ("PARENT"), /* 1 */ + OUTPUT_FIELD_WITH_NAME ("ID"), /* 2 */ + { 0 } }; #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[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"CAPABILITIES", N_("CAPABILITIES")}, /* 1 */ - {NULL, NULL} + OUTPUT_FIELD_WITH_NAME ("NAME"), /* 0 */ + OUTPUT_FIELD_WITH_NAME ("CAPABILITIES"), /* 1 */ + { 0 } }; #define NMC_FIELDS_DEV_SHOW_BLUETOOTH_ALL "NAME,CAPABILITIES" #define NMC_FIELDS_DEV_SHOW_BLUETOOTH_COMMON "NAME,CAPABILITIES" @@ -233,24 +238,24 @@ extern NmcOutputField nmc_fields_dhcp6_config[]; /* Available sections for 'device show' */ NmcOutputField nmc_fields_dev_show_sections[] = { - {"GENERAL", N_("GENERAL"), 0, nmc_fields_dev_show_general + 1 }, /* 0 */ - {"CAPABILITIES", N_("CAPABILITIES"), 0, nmc_fields_dev_show_cap + 1 }, /* 1 */ - {"WIFI-PROPERTIES", N_("WIFI-PROPERTIES"), 0, nmc_fields_dev_show_wifi_prop + 1 }, /* 2 */ - {"AP", N_("AP"), 0, nmc_fields_dev_wifi_list + 1 }, /* 3 */ - {"WIRED-PROPERTIES", N_("WIRED-PROPERTIES"), 0, nmc_fields_dev_show_wired_prop + 1 }, /* 4 */ - {"WIMAX-PROPERTIES", N_("WIMAX-PROPERTIES"), 0, nmc_fields_dev_show_wimax_prop + 1 }, /* 5 */ - {"NSP", N_("NSP"), 0, nmc_fields_dev_wimax_list + 1 }, /* 6 */ - {"IP4", N_("IP4"), 0, nmc_fields_ip4_config + 1 }, /* 7 */ - {"DHCP4", N_("DHCP4"), 0, nmc_fields_dhcp4_config + 1 }, /* 8 */ - {"IP6", N_("IP6"), 0, nmc_fields_ip6_config + 1 }, /* 9 */ - {"DHCP6", N_("DHCP6"), 0, nmc_fields_dhcp6_config + 1 }, /* 10 */ - {"BOND", N_("BOND"), 0, nmc_fields_dev_show_master_prop + 1 }, /* 11 */ - {"TEAM", N_("TEAM"), 0, nmc_fields_dev_show_team_prop + 1 }, /* 12 */ - {"BRIDGE", N_("BRIDGE"), 0, nmc_fields_dev_show_master_prop + 1 }, /* 13 */ - {"VLAN", N_("VLAN"), 0, nmc_fields_dev_show_vlan_prop + 1 }, /* 14 */ - {"BLUETOOTH", N_("BLUETOOTH"), 0, nmc_fields_dev_show_bluetooth + 1 }, /* 15 */ - {"CONNECTIONS", N_("CONNECTIONS"), 0, nmc_fields_dev_show_connections + 1 }, /* 16 */ - {NULL, NULL, 0, NULL } + 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 } }; #define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL "GENERAL,CAPABILITIES,BOND,TEAM,BRIDGE,VLAN,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,"\ "BLUETOOTH,CONNECTIONS,IP4,DHCP4,IP6,DHCP6" @@ -259,23 +264,23 @@ NmcOutputField nmc_fields_dev_show_sections[] = { /* Available fields for 'device lldp' */ NmcOutputField nmc_fields_dev_lldp_list[] = { - {"NAME", N_("NAME")}, /* 0 */ - {"DEVICE", N_("DEVICE")}, /* 1 */ - {"CHASSIS-ID", N_("CHASSIS-ID")}, /* 2 */ - {"PORT-ID", N_("PORT-ID")}, /* 3 */ - {"PORT-DESCRIPTION", N_("PORT-DESCRIPTION")}, /* 4 */ - {"SYSTEM-NAME", N_("SYSTEM-NAME")}, /* 5 */ - {"SYSTEM-DESCRIPTION", N_("SYSTEM-DESCRIPTION")}, /* 6 */ - {"SYSTEM-CAPABILITIES", N_("SYSTEM-CAPABILITIES")}, /* 7 */ - {"IEEE-802-1-PVID", N_("IEEE-802-1-PVID")}, /* 8 */ - {"IEEE-802-1-PPVID", N_("IEEE-802-1-PPVID")}, /* 9 */ - {"IEEE-802-1-PPVID-FLAGS", N_("IEEE-802-1-PPVID-FLAGS")}, /* 10 */ - {"IEEE-802-1-VID", N_("IEEE-802-1-VID")}, /* 11 */ - {"IEEE-802-1-VLAN-NAME", N_("IEEE-802-1-VLAN-NAME")}, /* 12 */ - {"DESTINATION", N_("DESTINATION")}, /* 13 */ - {"CHASSIS-ID-TYPE", N_("CHASSIS-ID-TYPE")}, /* 14 */ - {"PORT-ID-TYPE", N_("PORT-ID-TYPE")}, /* 15 */ - {NULL, NULL} + 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 } }; #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," \ @@ -761,6 +766,7 @@ typedef struct { guint32 output_flags; const char* active_bssid; const char* device; + GPtrArray *output_data; } APInfo; static void @@ -876,7 +882,7 @@ fill_output_access_point (gpointer data, gpointer user_data) if (active) arr[15].color = NMC_TERM_COLOR_GREEN; - g_ptr_array_add (info->nmc->output_data, arr); + g_ptr_array_add (info->output_data, arr); g_string_free (security_str, FALSE); } @@ -946,6 +952,7 @@ print_bond_bridge_info (NMDevice *device, int idx; NmcOutputField *tmpl, *arr; size_t tmpl_len; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (NM_IS_DEVICE_BOND (device)) slaves = nm_device_bond_get_slaves (NM_DEVICE_BOND (device)); @@ -969,20 +976,20 @@ print_bond_bridge_info (NMDevice *device, tmpl = nmc_fields_dev_show_master_prop; tmpl_len = sizeof (nmc_fields_dev_show_master_prop); - nmc->print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DEV_SHOW_MASTER_PROP_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DEV_SHOW_MASTER_PROP_ALL, + tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + 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, group_prefix); /* i.e. BOND, TEAM, BRIDGE */ set_val_str (arr, 1, slaves_str->str); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); g_string_free (slaves_str, FALSE); - nmc_empty_output_fields (nmc); return TRUE; } @@ -1017,6 +1024,7 @@ print_team_info (NMDevice *device, int idx; NmcOutputField *tmpl, *arr; size_t tmpl_len; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (NM_IS_DEVICE_TEAM (device)) slaves = nm_device_team_get_slaves (NM_DEVICE_TEAM (device)); @@ -1038,21 +1046,22 @@ print_team_info (NMDevice *device, tmpl = nmc_fields_dev_show_team_prop; tmpl_len = sizeof (nmc_fields_dev_show_team_prop); - nmc->print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DEV_SHOW_TEAM_PROP_ALL, + out.print_fields.indices = parse_output_fields (one_field ? one_field : NMC_FIELDS_DEV_SHOW_TEAM_PROP_ALL, tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + 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, 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)))); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); g_string_free (slaves_str, FALSE); - nmc_empty_output_fields (nmc); + nmc_empty_output_fields (&out); return TRUE; } @@ -1061,7 +1070,6 @@ static gboolean show_device_info (NMDevice *device, NmCli *nmc) { GError *error = NULL; - APInfo *info; const char *hwaddr = NULL; NMDeviceState state = NM_DEVICE_STATE_UNKNOWN; NMDeviceStateReason reason = NM_DEVICE_STATE_REASON_NONE; @@ -1097,40 +1105,43 @@ show_device_info (NMDevice *device, NmCli *nmc) return FALSE; } - /* Main header (pretty only) */ - nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, nm_device_get_iface (device)); + { + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); - /* Lazy way to retrieve sorted array from 0 to the number of dev fields */ - nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_GENERAL_ALL, - nmc_fields_dev_show_general, FALSE, NULL, NULL); + /* Main header (pretty only) */ + out.print_fields.header_name = (char *) construct_header_name (base_hdr, nm_device_get_iface (device)); - nmc_fields_dev_show_general[0].flags = NMC_OF_FLAG_MAIN_HEADER_ONLY; - print_required_fields (nmc, nmc_fields_dev_show_general); + /* Lazy way to retrieve sorted array from 0 to the number of dev fields */ + out.print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_GENERAL_ALL, + nmc_fields_dev_show_general, FALSE, NULL, NULL); + + nmc_fields_dev_show_general[0].flags = NMC_OF_FLAG_MAIN_HEADER_ONLY; + print_required_fields (&nmc->nmc_config, &out.print_fields, nmc_fields_dev_show_general); + } /* Loop through the required sections and print them. */ for (k = 0; k < sections_array->len; k++) { int section_idx = g_array_index (sections_array, int, k); char *section_fld = (char *) g_ptr_array_index (fields_in_section, k); - if (nmc->print_output != NMC_PRINT_TERSE && !nmc->multiline_output && was_output) + if (nmc->nmc_config.print_output != NMC_PRINT_TERSE && !nmc->nmc_config.multiline_output && was_output) g_print ("\n"); /* Print empty line between groups in tabular mode */ was_output = FALSE; - /* Remove any previous data */ - nmc_empty_output_fields (nmc); - state = nm_device_get_state (device); 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)) { + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); + tmpl = nmc_fields_dev_show_general; tmpl_len = sizeof (nmc_fields_dev_show_general); - nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_GENERAL_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_GENERAL_ALL, + tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); state_str = g_strdup_printf ("%d (%s)", state, nmc_device_state_to_string (state)); reason_str = g_strdup_printf ("%d (%s)", reason, nmc_device_reason_to_string (reason)); @@ -1164,20 +1175,23 @@ show_device_info (NMDevice *device, NmCli *nmc) set_val_strc (arr, 22, acon ? nm_active_connection_get_uuid (acon) : NULL); set_val_strc (arr, 23, acon ? nm_object_get_path (NM_OBJECT (acon)) : NULL); set_val_strc (arr, 24, nmc_device_metered_to_string (nm_device_get_metered (device))); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); was_output = TRUE; } /* section CAPABILITIES */ 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); - nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_CAP_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_CAP_ALL, + tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); caps = nm_device_get_capabilities (device); speed = 0; @@ -1196,9 +1210,10 @@ show_device_info (NMDevice *device, NmCli *nmc) 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")); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); was_output = TRUE; } @@ -1211,14 +1226,16 @@ show_device_info (NMDevice *device, NmCli *nmc) /* section WIFI-PROPERTIES */ 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); - nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_WIFI_PROP_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_WIFI_PROP_ALL, + tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + 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" */ @@ -1234,14 +1251,17 @@ show_device_info (NMDevice *device, NmCli *nmc) ((wcaps & NM_WIFI_DEVICE_CAP_FREQ_2GHZ) ? _("yes") : _("no"))); set_val_strc (arr, 9, !(wcaps & NM_WIFI_DEVICE_CAP_FREQ_VALID) ? _("unknown") : ((wcaps & NM_WIFI_DEVICE_CAP_FREQ_5GHZ) ? _("yes") : _("no"))); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); was_output = TRUE; } /* section AP */ if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[3].name)) { + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); + if (state == NM_DEVICE_STATE_ACTIVATED) { active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (device)); active_bssid = active_ap ? nm_access_point_get_bssid (active_ap) : NULL; @@ -1249,42 +1269,51 @@ show_device_info (NMDevice *device, NmCli *nmc) tmpl = nmc_fields_dev_wifi_list; tmpl_len = sizeof (nmc_fields_dev_wifi_list); - nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST, - tmpl, FALSE, NULL, NULL); + out.print_fields.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); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - info = g_malloc0 (sizeof (APInfo)); - info->nmc = nmc; - info->index = 1; - info->output_flags = NMC_OF_FLAG_SECTION_PREFIX; - info->active_bssid = active_bssid; - info->device = nm_device_get_iface (device); - aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device))); - g_ptr_array_foreach ((GPtrArray *) aps, fill_output_access_point, (gpointer) info); - g_ptr_array_free (aps, FALSE); - g_free (info); - print_data (nmc); /* Print all data */ + { + APInfo info = { + .nmc = nmc, + .index = 1, + .output_flags = NMC_OF_FLAG_SECTION_PREFIX, + .active_bssid = active_bssid, + .device = nm_device_get_iface (device), + .output_data = out.output_data, + }; + + aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device))); + g_ptr_array_foreach (aps, fill_output_access_point, &info); + g_ptr_array_free (aps, FALSE); + } + + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); was_output = TRUE; } } 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)) { + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); + tmpl = nmc_fields_dev_show_wired_prop; tmpl_len = sizeof (nmc_fields_dev_show_wired_prop); - nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_WIRED_PROP_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_WIRED_PROP_ALL, + tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + 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" */ 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)))); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); was_output = TRUE; } } @@ -1297,19 +1326,19 @@ show_device_info (NMDevice *device, NmCli *nmc) /* 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_fields_dev_show_sections[7].name, section_fld); + 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_fields_dev_show_sections[8].name, section_fld); + 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_fields_dev_show_sections[9].name, section_fld); + 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_fields_dev_show_sections[10].name, section_fld); + 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)) { @@ -1334,21 +1363,23 @@ show_device_info (NMDevice *device, NmCli *nmc) 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); - nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_VLAN_PROP_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_VLAN_PROP_ALL, + tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + 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" */ set_val_strc (arr, 1, parent ? nm_device_get_iface (parent) : NULL); set_val_str (arr, 2, vlan_id_str); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); was_output = TRUE; } @@ -1356,19 +1387,22 @@ 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)) { + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); + tmpl = nmc_fields_dev_show_bluetooth; tmpl_len = sizeof (nmc_fields_dev_show_bluetooth); - nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_BLUETOOTH_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_BLUETOOTH_ALL, + tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + 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" */ set_val_str (arr, 1, bluetooth_caps_to_string (nm_device_bt_get_capabilities (NM_DEVICE_BT (device)))); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); was_output = TRUE; } } @@ -1379,13 +1413,14 @@ show_device_info (NMDevice *device, NmCli *nmc) 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); - nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_CONNECTIONS_ALL, - tmpl, FALSE, NULL, NULL); + out.print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_CONNECTIONS_ALL, + tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); /* available-connections */ avail_cons = nm_device_get_available_connections (device); @@ -1415,9 +1450,10 @@ show_device_info (NMDevice *device, NmCli *nmc) 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 (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); g_string_free (ac_paths_str, FALSE); was_output = TRUE; @@ -1449,7 +1485,7 @@ nmc_device_state_to_color (NMDeviceState state, NmcTermColor *color, NmcTermForm } static void -fill_output_device_status (NMDevice *device, NmCli *nmc) +fill_output_device_status (NMDevice *device, GPtrArray *output_data) { NMActiveConnection *ac; NMDeviceState state; @@ -1475,7 +1511,7 @@ fill_output_device_status (NMDevice *device, NmCli *nmc) set_val_strc (arr, 5, ac ? nm_active_connection_get_uuid (ac) : NULL); set_val_strc (arr, 6, ac ? nm_object_get_path (NM_OBJECT (ac)) : NULL); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (output_data, arr); } static NMCResultCode @@ -1489,6 +1525,7 @@ do_devices_status (NmCli *nmc, int argc, char **argv) char *fields_common = NMC_FIELDS_DEV_STATUS_COMMON; NmcOutputField *tmpl, *arr; size_t tmpl_len; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); /* Nothing to complete */ if (nmc->complete) @@ -1508,7 +1545,7 @@ do_devices_status (NmCli *nmc, int argc, char **argv) tmpl = nmc_fields_dev_status; tmpl_len = sizeof (nmc_fields_dev_status); - nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); + out.print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'device status': %s"), error->message); @@ -1517,16 +1554,16 @@ do_devices_status (NmCli *nmc, int argc, char **argv) } /* Add headers */ - nmc->print_fields.header_name = _("Status of devices"); + out.print_fields.header_name = _("Status of devices"); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); devices = nmc_get_devices_sorted (nmc->client); for (i = 0; devices[i]; i++) - fill_output_device_status (devices[i], nmc); + fill_output_device_status (devices[i], out.output_data); - /* Now print all data */ - print_data (nmc); + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); g_free (devices); @@ -1539,7 +1576,7 @@ do_device_show (NmCli *nmc, int argc, char **argv) gs_free_error GError *error = NULL; if (!nmc->mode_specified) - nmc->multiline_output = TRUE; /* multiline mode is default for 'device show' */ + nmc->nmc_config_mutable.multiline_output = TRUE; /* multiline mode is default for 'device show' */ if (argc) { NMDevice *device; @@ -1568,7 +1605,6 @@ do_device_show (NmCli *nmc, int argc, char **argv) /* Show details for all devices */ for (i = 0; devices[i]; i++) { - nmc_empty_output_fields (nmc); if (!show_device_info (devices[i], nmc)) break; if (devices[i + 1]) @@ -1703,7 +1739,7 @@ add_and_activate_cb (GObject *client, if (nmc->nowait_flag || state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) { /* User doesn't want to wait or already activated */ if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) { - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); if (info->hotspot) g_print (_("Connection with UUID '%s' created and activated on device '%s'\n"), @@ -1721,7 +1757,7 @@ add_and_activate_cb (GObject *client, g_timeout_add_seconds (nmc->timeout, timeout_cb, nmc); /* Exit if timeout expires */ - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) progress_id = g_timeout_add (120, progress_cb, device); } } @@ -1795,7 +1831,7 @@ connect_device_cb (GObject *client, GAsyncResult *result, gpointer user_data) if (nmc->nowait_flag || state == NM_DEVICE_STATE_ACTIVATED) { /* Don't want to wait or device already activated */ - if (state == NM_DEVICE_STATE_ACTIVATED && nmc->print_output == NMC_PRINT_PRETTY) { + if (state == NM_DEVICE_STATE_ACTIVATED && nmc->nmc_config.print_output == NMC_PRINT_PRETTY) { nmc_terminal_erase_line (); g_print (_("Device '%s' has been connected.\n"), nm_device_get_iface (device)); } @@ -1874,7 +1910,7 @@ do_device_connect (NmCli *nmc, int argc, char **argv) info); /* Start progress indication */ - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) progress_id = g_timeout_add (120, progress_cb, device); return nmc->return_value; @@ -1979,7 +2015,7 @@ reapply_device_cb (GObject *object, GAsyncResult *result, gpointer user_data) nmc->return_value = NMC_RESULT_ERROR_DEV_DISCONNECT; device_cb_info_finish (info, device); } else { - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); g_print (_("Connection successfully reapplied to device '%s'.\n"), nm_device_get_iface (device)); @@ -2047,7 +2083,7 @@ modify_reapply_cb (GObject *object, GAsyncResult *result, gpointer user_data) g_error_free (error); nmc->return_value = NMC_RESULT_ERROR_DEV_DISCONNECT; } else { - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); g_print (_("Connection successfully reapplied to device '%s'.\n"), nm_device_get_iface (device)); @@ -2150,7 +2186,7 @@ disconnect_device_cb (GObject *object, GAsyncResult *result, gpointer user_data) if (nmc->nowait_flag || state <= NM_DEVICE_STATE_DISCONNECTED) { /* Don't want to wait or device already disconnected */ if (state <= NM_DEVICE_STATE_DISCONNECTED) { - if (nmc->print_output == NMC_PRINT_PRETTY) + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) nmc_terminal_erase_line (); g_print (_("Device '%s' successfully disconnected.\n"), nm_device_get_iface (device)); @@ -2378,7 +2414,7 @@ device_state (NMDevice *device, GParamSpec *pspec, NmCli *nmc) char *str; nmc_device_state_to_color (state, &color, &color_fmt); - str = nmc_colorize (nmc, color, color_fmt, "%s: %s\n", + str = nmc_colorize (nmc->nmc_config.use_colors, color, color_fmt, "%s: %s\n", nm_device_get_iface (device), nmc_device_state_to_string (state)); @@ -2464,12 +2500,11 @@ do_devices_monitor (NmCli *nmc, int argc, char **argv) } static void -show_access_point_info (NMDevice *device, NmCli *nmc) +show_access_point_info (NMDevice *device, NmCli *nmc, NmcOutputData *out) { NMAccessPoint *active_ap = NULL; const char *active_bssid = NULL; GPtrArray *aps; - APInfo *info; NmcOutputField *arr; if (nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED) { @@ -2479,21 +2514,25 @@ show_access_point_info (NMDevice *device, NmCli *nmc) arr = nmc_dup_fields_array (nmc_fields_dev_wifi_list, sizeof (nmc_fields_dev_wifi_list), NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out->output_data, arr); - info = g_malloc0 (sizeof (APInfo)); - info->nmc = nmc; - info->index = 1; - info->output_flags = 0; - info->active_bssid = active_bssid; - info->device = nm_device_get_iface (device); - aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device))); - g_ptr_array_foreach ((GPtrArray *) aps, fill_output_access_point, (gpointer) info); - g_ptr_array_free (aps, FALSE); + { + APInfo info = { + .nmc = nmc, + .index = 1, + .output_flags = 0, + .active_bssid = active_bssid, + .device = nm_device_get_iface (device), + .output_data = out->output_data, + }; - print_data (nmc); /* Print all data */ - nmc_empty_output_fields (nmc); - g_free (info); + aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device))); + g_ptr_array_foreach (aps, fill_output_access_point, &info); + g_ptr_array_free (aps, FALSE); + } + + print_data_prepare_width (out->output_data); + print_data (&nmc->nmc_config, out); } /* @@ -2626,6 +2665,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) NmcOutputField *tmpl, *arr; size_t tmpl_len; const char *base_hdr = _("Wi-Fi scan list"); + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); devices = nmc_get_devices_sorted (nmc->client); @@ -2669,7 +2709,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) tmpl = nmc_fields_dev_wifi_list; tmpl_len = sizeof (nmc_fields_dev_wifi_list); - nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); + out.print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'device wifi': %s"), error->message); @@ -2687,7 +2727,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) return NMC_RESULT_ERROR_NOT_FOUND; } /* Main header name */ - nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, ifname); + out.print_fields.header_name = (char *) construct_header_name (base_hdr, ifname); if (NM_IS_DEVICE_WIFI (device)) { if (bssid_user) { @@ -2710,7 +2750,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) } /* Add headers (field names) */ arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); info = g_malloc0 (sizeof (APInfo)); info->nmc = nmc; @@ -2721,10 +2761,11 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) fill_output_access_point (ap, info); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); g_free (info); } else { - show_access_point_info (device, nmc); + show_access_point_info (device, nmc, &out); } } else { if ( nm_device_get_device_type (device) == NM_DEVICE_TYPE_GENERIC @@ -2752,11 +2793,11 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) continue; /* Main header name */ - nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, nm_device_get_iface (dev)); - nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL); + out.print_fields.header_name = (char *) construct_header_name (base_hdr, nm_device_get_iface (dev)); + out.print_fields.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); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (dev)); for (j = 0; j < aps->len; j++) { @@ -2781,8 +2822,9 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) } if (empty_line) g_print ("\n"); /* Empty line between devices' APs */ - print_data (nmc); /* Print all data */ - nmc_empty_output_fields (nmc); + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); + nmc_empty_output_fields (&out); empty_line = TRUE; } if (!ap) { @@ -2793,16 +2835,17 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) } else { for (i = 0; devices[i]; i++) { NMDevice *dev = devices[i]; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out2); /* Main header name */ - nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, + out2.print_fields.header_name = (char *) construct_header_name (base_hdr, nm_device_get_iface (dev)); - nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL); + out2.print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL); if (NM_IS_DEVICE_WIFI (dev)) { if (empty_line) g_print ("\n"); /* Empty line between devices' APs */ - show_access_point_info (dev, nmc); + show_access_point_info (dev, nmc, &out2); empty_line = TRUE; } } @@ -3659,6 +3702,7 @@ show_device_lldp_list (NMDevice *device, NmCli *nmc, char *fields_str, int *coun size_t tmpl_len; const char *str; int i; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); neighbors = nm_device_get_lldp_neighbors (device); @@ -3669,11 +3713,11 @@ show_device_lldp_list (NMDevice *device, NmCli *nmc, char *fields_str, int *coun tmpl_len = sizeof (nmc_fields_dev_lldp_list); /* Main header name */ - nmc->print_fields.header_name = (char *) construct_header_name (_("Device LLDP neighbors"), - nm_device_get_iface (device)); - nmc->print_fields.indices = parse_output_fields (fields_str, nmc_fields_dev_lldp_list, FALSE, NULL, NULL); + out.print_fields.header_name = (char *) construct_header_name (_("Device LLDP neighbors"), + nm_device_get_iface (device)); + out.print_fields.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); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); for (i = 0; i < neighbors->len; i++) { NMLldpNeighbor *neighbor = neighbors->pdata[i]; @@ -3726,11 +3770,11 @@ show_device_lldp_list (NMDevice *device, NmCli *nmc, char *fields_str, int *coun if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_PORT_ID_TYPE, &value)) set_val_strc (arr, 15, g_strdup_printf ("%u", value)); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); } - print_data (nmc); - nmc_empty_output_fields (nmc); + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); return neighbors->len; } @@ -3742,6 +3786,7 @@ do_device_lldp_list (NmCli *nmc, int argc, char **argv) gs_free_error GError *error = NULL; char *fields_str; int counter = 0; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); while (argc > 0) { if (argc == 1 && nmc->complete) @@ -3775,7 +3820,7 @@ do_device_lldp_list (NmCli *nmc, int argc, char **argv) else fields_str = nmc->required_fields; - nmc->print_fields.indices = parse_output_fields (fields_str, nmc_fields_dev_lldp_list, FALSE, NULL, &error); + out.print_fields.indices = parse_output_fields (fields_str, nmc_fields_dev_lldp_list, FALSE, NULL, &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'device lldp list': %s"), error->message); @@ -3786,16 +3831,13 @@ do_device_lldp_list (NmCli *nmc, int argc, char **argv) return nmc->return_value; if (device) { - nmc_empty_output_fields (nmc); show_device_lldp_list (device, nmc, fields_str, &counter); } else { NMDevice **devices = nmc_get_devices_sorted (nmc->client); int i; - for (i = 0; devices[i]; i++) { - nmc_empty_output_fields (nmc); + for (i = 0; devices[i]; i++) show_device_lldp_list (devices[i], nmc, fields_str, &counter); - } g_free (devices); } @@ -3812,7 +3854,7 @@ static NMCResultCode do_device_lldp (NmCli *nmc, int argc, char **argv) { if (!nmc->mode_specified) - nmc->multiline_output = TRUE; /* multiline mode is default for 'device lldp' */ + nmc->nmc_config_mutable.multiline_output = TRUE; /* multiline mode is default for 'device lldp' */ nmc_do_cmd (nmc, device_lldp_cmds, *argv, argc, argv); diff --git a/clients/cli/general.c b/clients/cli/general.c index 8e52dd29ca..5bffa92707 100644 --- a/clients/cli/general.c +++ b/clients/cli/general.c @@ -22,31 +22,35 @@ #include #include +#include "nm-common-macros.h" + +#include "nm-client-utils.h" + #include "polkit-agent.h" #include "utils.h" #include "common.h" #include "general.h" #include "common.h" -#include "nm-common-macros.h" - #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[] = { - {"RUNNING", N_("RUNNING")}, /* 0 */ - {"VERSION", N_("VERSION")}, /* 1 */ - {"STATE", N_("STATE")}, /* 2 */ - {"STARTUP", N_("STARTUP")}, /* 3 */ - {"CONNECTIVITY", N_("CONNECTIVITY")}, /* 4 */ - {"NETWORKING", N_("NETWORKING")}, /* 5 */ - {"WIFI-HW", N_("WIFI-HW")}, /* 6 */ - {"WIFI", N_("WIFI")}, /* 7 */ - {"WWAN-HW", N_("WWAN-HW")}, /* 8 */ - {"WWAN", N_("WWAN")}, /* 9 */ - {"WIMAX-HW", N_("WIMAX-HW")}, /* 10 */ - {"WIMAX", N_("WIMAX")}, /* 11 */ - {NULL, NULL} + 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 } }; #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" @@ -61,18 +65,18 @@ static NmcOutputField nmc_fields_nm_status[] = { /* Available fields for 'general permissions' */ static NmcOutputField nmc_fields_nm_permissions[] = { - {"PERMISSION", N_("PERMISSION")}, /* 0 */ - {"VALUE", N_("VALUE")}, /* 1 */ - {NULL, NULL} + OUTPUT_FIELD_WITH_NAME ("PERMISSION"), /* 0 */ + OUTPUT_FIELD_WITH_NAME ("VALUE"), /* 1 */ + { 0 } }; #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[] = { - {"LEVEL", N_("LEVEL")}, /* 0 */ - {"DOMAINS", N_("DOMAINS")}, /* 1 */ - {NULL, NULL} + OUTPUT_FIELD_WITH_NAME ("LEVEL"), /* 0 */ + OUTPUT_FIELD_WITH_NAME ("DOMAINS"), /* 1 */ + { 0 } }; #define NMC_FIELDS_NM_LOGGING_ALL "LEVEL,DOMAINS" #define NMC_FIELDS_NM_LOGGING_COMMON "LEVEL,DOMAINS" @@ -321,6 +325,7 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl const char *fields_common = print_flds ? print_flds : NMC_FIELDS_NM_STATUS_COMMON; NmcOutputField *tmpl, *arr; size_t tmpl_len; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) fields_str = fields_common; @@ -331,7 +336,7 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl tmpl = nmc_fields_nm_status; tmpl_len = sizeof (nmc_fields_nm_status); - nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); + out.print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); if (error) { g_string_printf (nmc->return_text, _("Error: only these fields are allowed: %s"), fields_all); @@ -349,9 +354,9 @@ 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); - nmc->print_fields.header_name = pretty_header_name ? (char *) pretty_header_name : _("NetworkManager status"); + out.print_fields.header_name = pretty_header_name ? (char *) pretty_header_name : _("NetworkManager status"); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); arr = nmc_dup_fields_array (tmpl, tmpl_len, 0); set_val_strc (arr, 0, _("running")); @@ -375,9 +380,10 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl arr[8].color = wwan_hw_enabled ? NMC_TERM_COLOR_GREEN : NMC_TERM_COLOR_RED; arr[9].color = wwan_enabled ? NMC_TERM_COLOR_GREEN : NMC_TERM_COLOR_RED; - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); return TRUE; } @@ -468,6 +474,7 @@ print_permissions (void *user_data) const char *fields_common = NMC_FIELDS_NM_PERMISSIONS_COMMON; NmcOutputField *tmpl, *arr; size_t tmpl_len; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) fields_str = fields_common; @@ -478,7 +485,7 @@ print_permissions (void *user_data) tmpl = nmc_fields_nm_permissions; tmpl_len = sizeof (nmc_fields_nm_permissions); - nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); + out.print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'general permissions': %s"), error->message); @@ -487,9 +494,9 @@ print_permissions (void *user_data) return FALSE; } - nmc->print_fields.header_name = _("NetworkManager permissions"); + out.print_fields.header_name = _("NetworkManager permissions"); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); for (perm = NM_CLIENT_PERMISSION_NONE + 1; perm <= NM_CLIENT_PERMISSION_LAST; perm++) { @@ -498,9 +505,10 @@ print_permissions (void *user_data) arr = nmc_dup_fields_array (tmpl, tmpl_len, 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 (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); } - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); quit (); return G_SOURCE_REMOVE; @@ -577,6 +585,7 @@ show_general_logging (NmCli *nmc) const char *fields_common = NMC_FIELDS_NM_LOGGING_COMMON; NmcOutputField *tmpl, *arr; size_t tmpl_len; + NMC_OUTPUT_DATA_DEFINE_SCOPED (out); if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) fields_str = fields_common; @@ -587,7 +596,7 @@ show_general_logging (NmCli *nmc) tmpl = nmc_fields_nm_logging; tmpl_len = sizeof (nmc_fields_nm_logging); - nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); + out.print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error); if (error) { g_string_printf (nmc->return_text, _("Error: 'general logging': %s"), error->message); @@ -604,16 +613,17 @@ show_general_logging (NmCli *nmc) return FALSE; } - nmc->print_fields.header_name = _("NetworkManager logging"); + out.print_fields.header_name = _("NetworkManager logging"); arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); arr = nmc_dup_fields_array (tmpl, tmpl_len, 0); set_val_str (arr, 0, level); set_val_str (arr, 1, domains); - g_ptr_array_add (nmc->output_data, arr); + g_ptr_array_add (out.output_data, arr); - print_data (nmc); /* Print all data */ + print_data_prepare_width (out.output_data); + print_data (&nmc->nmc_config, &out); return TRUE; } @@ -782,8 +792,8 @@ nmc_switch_show (NmCli *nmc, const char *switch_name, const char *header) nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; return FALSE; } - if (nmc->print_output == NMC_PRINT_NORMAL) - nmc->print_output = NMC_PRINT_TERSE; + if (nmc->nmc_config.print_output == NMC_PRINT_NORMAL) + nmc->nmc_config_mutable.print_output = NMC_PRINT_TERSE; if (!nmc->required_fields) nmc->required_fields = g_strdup (switch_name); @@ -1007,7 +1017,7 @@ networkmanager_running (NMClient *client, GParamSpec *param, NmCli *nmc) char *str; running = nm_client_get_nm_running (client); - str = nmc_colorize (nmc, + str = nmc_colorize (nmc->nmc_config.use_colors, running ? NMC_TERM_COLOR_GREEN : NMC_TERM_COLOR_RED, NMC_TERM_FORMAT_NORMAL, running ? _("NetworkManager has started") : _("NetworkManager has stopped")); @@ -1049,7 +1059,7 @@ client_connectivity (NMClient *client, GParamSpec *param, NmCli *nmc) char *str; g_object_get (client, NM_CLIENT_CONNECTIVITY, &connectivity, NULL); - str = nmc_colorize (nmc, connectivity_to_color (connectivity), NMC_TERM_FORMAT_NORMAL, + str = nmc_colorize (nmc->nmc_config.use_colors, connectivity_to_color (connectivity), NMC_TERM_FORMAT_NORMAL, _("Connectivity is now '%s'\n"), nm_connectivity_to_string (connectivity)); g_print ("%s", str); g_free (str); @@ -1062,7 +1072,7 @@ client_state (NMClient *client, GParamSpec *param, NmCli *nmc) char *str; g_object_get (client, NM_CLIENT_STATE, &state, NULL); - str = nmc_colorize (nmc, state_to_color (state), NMC_TERM_FORMAT_NORMAL, + str = nmc_colorize (nmc->nmc_config.use_colors, state_to_color (state), NMC_TERM_FORMAT_NORMAL, _("Networkmanager is now in the '%s' state\n"), nm_state_to_string (state)); g_print ("%s", str); @@ -1106,12 +1116,12 @@ device_overview (NmCli *nmc, NMDevice *device) if (!nm_device_get_autoconnect (device)) g_string_append_printf (outbuf, "%s, ", _("autoconnect")); if (nm_device_get_firmware_missing (device)) { - tmp = nmc_colorize (nmc, NMC_TERM_COLOR_RED, NMC_TERM_FORMAT_NORMAL, _("fw missing")); + tmp = nmc_colorize (nmc->nmc_config.use_colors, NMC_TERM_COLOR_RED, NMC_TERM_FORMAT_NORMAL, _("fw missing")); g_string_append_printf (outbuf, "%s, ", tmp); g_free (tmp); } if (nm_device_get_nm_plugin_missing (device)) { - tmp = nmc_colorize (nmc, NMC_TERM_COLOR_RED, NMC_TERM_FORMAT_NORMAL, _("plugin missing")); + tmp = nmc_colorize (nmc->nmc_config.use_colors, NMC_TERM_COLOR_RED, NMC_TERM_FORMAT_NORMAL, _("plugin missing")); g_string_append_printf (outbuf, "%s, ", tmp); g_free (tmp); } @@ -1232,7 +1242,7 @@ do_overview (NmCli *nmc, int argc, char **argv) state = nm_active_connection_get_state (ac); nmc_active_connection_state_to_color (state, &color); - tmp = nmc_colorize (nmc, color, NMC_TERM_FORMAT_NORMAL, _("%s VPN connection"), + tmp = nmc_colorize (nmc->nmc_config.use_colors, color, NMC_TERM_FORMAT_NORMAL, _("%s VPN connection"), nm_active_connection_get_id (ac)); g_print ("%s\n", tmp); g_free (tmp); @@ -1250,7 +1260,7 @@ do_overview (NmCli *nmc, int argc, char **argv) state = nm_device_get_state (devices[i]); nmc_device_state_to_color (state, &color, &color_fmt); - tmp = nmc_colorize (nmc, color, color_fmt, "%s: %s%s%s", + tmp = nmc_colorize (nmc->nmc_config.use_colors, color, color_fmt, "%s: %s%s%s", nm_device_get_iface (devices[i]), nmc_device_state_to_string (state), ac ? " to " : "", @@ -1332,7 +1342,7 @@ do_monitor (NmCli *nmc, int argc, char **argv) if (!nm_client_get_nm_running (nmc->client)) { char *str; - str = nmc_colorize (nmc, NMC_TERM_COLOR_RED, NMC_TERM_FORMAT_NORMAL, + str = nmc_colorize (nmc->nmc_config.use_colors, NMC_TERM_COLOR_RED, NMC_TERM_FORMAT_NORMAL, _("Networkmanager is not running (waiting for it)\n")); g_print ("%s", str); g_free (str); diff --git a/clients/cli/nmcli.c b/clients/cli/nmcli.c index ee3f747b46..2553596459 100644 --- a/clients/cli/nmcli.c +++ b/clients/cli/nmcli.c @@ -32,6 +32,8 @@ #include #include +#include "nm-client-utils.h" + #include "polkit-agent.h" #include "nmcli.h" #include "utils.h" @@ -66,7 +68,22 @@ struct termios termios_orig; NM_CACHED_QUARK_FCN ("nmcli-error-quark", nmcli_error_quark) static void -complete_field (GHashTable *h, const char *setting, NmcOutputField field[]) +complete_field_setting (GHashTable *h, NMMetaSettingType setting_type) +{ + const NMMetaSettingInfoEditor *setting_info = &nm_meta_setting_infos_editor[setting_type]; + guint i; + + for (i = 0; i < setting_info->properties_num; i++) { + if (setting_info->properties[i].is_name) + continue; + g_hash_table_add (h, g_strdup_printf ("%s.%s", + setting_info->general->setting_name, + setting_info->properties[i].property_name)); + } +} + +static void +complete_field (GHashTable *h, const char *setting, const NmcOutputField *field) { int i; @@ -100,7 +117,7 @@ complete_one (gpointer key, gpointer value, gpointer user_data) static void complete_fields (const char *prefix) { - + guint i; GHashTable *h; h = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); @@ -130,35 +147,8 @@ complete_fields (const char *prefix) complete_field (h, NULL, nmc_fields_dev_show_sections); complete_field (h, NULL, nmc_fields_dev_lldp_list); - complete_field (h, "connection", nmc_fields_setting_connection); - complete_field (h, "802-3-ethernet", nmc_fields_setting_wired); - complete_field (h, "802-1x", nmc_fields_setting_8021X); - complete_field (h, "802-11-wireless", nmc_fields_setting_wireless); - complete_field (h, "802-11-wireless-security", nmc_fields_setting_wireless_security); - complete_field (h, "ipv4", nmc_fields_setting_ip4_config); - complete_field (h, "ipv6", nmc_fields_setting_ip6_config); - complete_field (h, "serial", nmc_fields_setting_serial); - complete_field (h, "ppp", nmc_fields_setting_ppp); - complete_field (h, "pppoe", nmc_fields_setting_pppoe); - complete_field (h, "adsl", nmc_fields_setting_adsl); - complete_field (h, "gsm", nmc_fields_setting_gsm); - complete_field (h, "cdma", nmc_fields_setting_cdma); - complete_field (h, "bluetooth", nmc_fields_setting_bluetooth); - complete_field (h, "802-11-olpc-mesh", nmc_fields_setting_olpc_mesh); - complete_field (h, "vpn", nmc_fields_setting_vpn); - complete_field (h, "wimax", nmc_fields_setting_wimax); - complete_field (h, "infiniband", nmc_fields_setting_infiniband); - complete_field (h, "bond", nmc_fields_setting_bond); - complete_field (h, "vlan", nmc_fields_setting_vlan); - complete_field (h, "bridge", nmc_fields_setting_bridge); - complete_field (h, "bridge-port", nmc_fields_setting_bridge_port); - complete_field (h, "team", nmc_fields_setting_team); - complete_field (h, "team-port", nmc_fields_setting_team_port); - complete_field (h, "dcb", nmc_fields_setting_dcb); - complete_field (h, "tun", nmc_fields_setting_tun); - complete_field (h, "ip-tunnel", nmc_fields_setting_ip_tunnel); - complete_field (h, "macvlan", nmc_fields_setting_macvlan); - complete_field (h, "vxlan", nmc_fields_setting_vxlan); + for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) + complete_field_setting (h, i); g_hash_table_foreach (h, complete_one, (gpointer) prefix); g_hash_table_destroy (h); @@ -245,31 +235,31 @@ process_command_line (NmCli *nmc, int argc, char **argv) } if (matches (opt, "-terse")) { - if (nmc->print_output == NMC_PRINT_TERSE) { + if (nmc->nmc_config.print_output == NMC_PRINT_TERSE) { g_string_printf (nmc->return_text, _("Error: Option '--terse' is specified the second time.")); nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; return FALSE; } - else if (nmc->print_output == NMC_PRINT_PRETTY) { + else if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) { g_string_printf (nmc->return_text, _("Error: Option '--terse' is mutually exclusive with '--pretty'.")); nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; return FALSE; } else - nmc->print_output = NMC_PRINT_TERSE; + nmc->nmc_config_mutable.print_output = NMC_PRINT_TERSE; } else if (matches (opt, "-pretty")) { - if (nmc->print_output == NMC_PRINT_PRETTY) { + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) { g_string_printf (nmc->return_text, _("Error: Option '--pretty' is specified the second time.")); nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; return FALSE; } - else if (nmc->print_output == NMC_PRINT_TERSE) { + else if (nmc->nmc_config.print_output == NMC_PRINT_TERSE) { g_string_printf (nmc->return_text, _("Error: Option '--pretty' is mutually exclusive with '--terse'.")); nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; return FALSE; } else - nmc->print_output = NMC_PRINT_PRETTY; + nmc->nmc_config_mutable.print_output = NMC_PRINT_PRETTY; } else if (matches (opt, "-mode")) { nmc->mode_specified = TRUE; argc--; @@ -282,9 +272,9 @@ process_command_line (NmCli *nmc, int argc, char **argv) if (argc == 1 && nmc->complete) nmc_complete_strings (argv[0], "tabular", "multiline", NULL); if (matches (argv[0], "tabular")) - nmc->multiline_output = FALSE; + nmc->nmc_config_mutable.multiline_output = FALSE; else if (matches (argv[0], "multiline")) - nmc->multiline_output = TRUE; + nmc->nmc_config_mutable.multiline_output = TRUE; else { g_string_printf (nmc->return_text, _("Error: '%s' is not valid argument for '%s' option."), argv[0], opt); nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; @@ -301,11 +291,11 @@ process_command_line (NmCli *nmc, int argc, char **argv) if (argc == 1 && nmc->complete) nmc_complete_strings (argv[0], "yes", "no", "auto", NULL); if (matches (argv[0], "auto")) - nmc->use_colors = NMC_USE_COLOR_AUTO; + nmc->nmc_config_mutable.use_colors = NMC_USE_COLOR_AUTO; else if (matches (argv[0], "yes")) - nmc->use_colors = NMC_USE_COLOR_YES; + nmc->nmc_config_mutable.use_colors = NMC_USE_COLOR_YES; else if (matches (argv[0], "no")) - nmc->use_colors = NMC_USE_COLOR_NO; + nmc->nmc_config_mutable.use_colors = NMC_USE_COLOR_NO; else { g_string_printf (nmc->return_text, _("Error: '%s' is not valid argument for '%s' option."), argv[0], opt); nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; @@ -322,9 +312,9 @@ process_command_line (NmCli *nmc, int argc, char **argv) if (argc == 1 && nmc->complete) nmc_complete_strings (argv[0], "yes", "no", NULL); if (matches (argv[0], "yes")) - nmc->escape_values = TRUE; + nmc->nmc_config_mutable.escape_values = TRUE; else if (matches (argv[0], "no")) - nmc->escape_values = FALSE; + nmc->nmc_config_mutable.escape_values = FALSE; else { g_string_printf (nmc->return_text, _("Error: '%s' is not valid argument for '%s' option."), argv[0], opt); nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; @@ -352,7 +342,7 @@ process_command_line (NmCli *nmc, int argc, char **argv) if (argc == 1 && nmc->complete) complete_fields (argv[0]); nmc->required_fields = g_strdup (argv[0]); - nmc->print_output = NMC_PRINT_TERSE; + nmc->nmc_config_mutable.print_output = NMC_PRINT_TERSE; /* We want fixed tabular mode here, but just set the mode specified and rely on the initialization * in nmc_init: in this way we allow use of "-m multiline" to swap the output mode also if placed * before the "-g " option (-g may be still more practical and easy to remember than -t -f). @@ -545,18 +535,16 @@ nmc_init (NmCli *nmc) nmc->should_wait = 0; nmc->nowait_flag = TRUE; - nmc->print_output = NMC_PRINT_NORMAL; - nmc->multiline_output = FALSE; + nmc->nmc_config_mutable.print_output = NMC_PRINT_NORMAL; + nmc->nmc_config_mutable.multiline_output = FALSE; nmc->mode_specified = FALSE; - nmc->escape_values = TRUE; + nmc->nmc_config_mutable.escape_values = TRUE; nmc->required_fields = NULL; - nmc->output_data = g_ptr_array_new_full (20, g_free); - memset (&nmc->print_fields, '\0', sizeof (NmcPrintFields)); nmc->ask = FALSE; nmc->complete = FALSE; nmc->show_secrets = FALSE; - nmc->use_colors = NMC_USE_COLOR_AUTO; - nmc->in_editor = FALSE; + nmc->nmc_config_mutable.use_colors = NMC_USE_COLOR_AUTO; + nmc->nmc_config_mutable.in_editor = FALSE; nmc->editor_status_line = FALSE; nmc->editor_save_confirmation = TRUE; nmc->editor_show_secrets = FALSE; @@ -579,8 +567,6 @@ nmc_cleanup (NmCli *nmc) g_hash_table_destroy (nmc->pwds_hash); g_free (nmc->required_fields); - nmc_empty_output_fields (nmc); - g_ptr_array_unref (nmc->output_data); nmc_polkit_agent_fini (nmc); } diff --git a/clients/cli/nmcli.h b/clients/cli/nmcli.h index 7e33e3a70a..1b9c3e72e1 100644 --- a/clients/cli/nmcli.h +++ b/clients/cli/nmcli.h @@ -104,17 +104,26 @@ typedef enum { #define NMC_OF_FLAG_MAIN_HEADER_ADD 0x00000004 /* Print main header in addition to values/field names */ #define NMC_OF_FLAG_MAIN_HEADER_ONLY 0x00000008 /* Print main header only */ +struct _NMMetaSettingInfoEditor; + typedef struct _NmcOutputField { const char *name; /* Field's name */ - const char *name_l10n; /* Field's name for translation */ int width; /* Width in screen columns */ - struct _NmcOutputField *group; /* Points to an array with available section field names if this is a section (group) field */ + 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 */ guint32 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 struct { @@ -129,6 +138,19 @@ typedef enum { NMC_USE_COLOR_NO, } NmcColorOption; +typedef struct _NmcConfig { + NMCPrintOutput print_output; /* Output mode */ + NmcColorOption use_colors; /* Whether to use colors for output: option '--color' */ + gboolean multiline_output; /* Multiline output instead of default tabular */ + gboolean escape_values; /* Whether to escape ':' and '\' in terse tabular mode */ + gboolean in_editor; /* Whether running the editor - nmcli con edit' */ +} NmcConfig; + +typedef struct _NmcOutputData { + GPtrArray *output_data; /* GPtrArray of arrays of NmcOutputField structs - accumulates data for output */ + NmcPrintFields print_fields; /* Structure with field indices to print */ +} NmcOutputData; + /* NmCli - main structure */ typedef struct _NmCli { NMClient *client; /* Pointer to NMClient of libnm */ @@ -144,18 +166,15 @@ typedef struct _NmCli { int should_wait; /* Semaphore indicating whether nmcli should not end or not yet */ gboolean nowait_flag; /* '--nowait' option; used for passing to callbacks */ - NMCPrintOutput print_output; /* Output mode */ - gboolean multiline_output; /* Multiline output instead of default tabular */ gboolean mode_specified; /* Whether tabular/multiline mode was specified via '--mode' option */ - NmcColorOption use_colors; /* Whether to use colors for output: option '--color' */ - gboolean escape_values; /* Whether to escape ':' and '\' in terse tabular mode */ + union { + const NmcConfig nmc_config; + NmcConfig nmc_config_mutable; + }; char *required_fields; /* Required fields in output: '--fields' option */ - GPtrArray *output_data; /* GPtrArray of arrays of NmcOutputField structs - accumulates data for output */ - NmcPrintFields print_fields; /* Structure with field indices to print */ gboolean ask; /* Ask for missing parameters: option '--ask' */ gboolean complete; /* Autocomplete the command line */ gboolean show_secrets; /* Whether to display secrets (both input and output): option '--show-secrets' */ - gboolean in_editor; /* Whether running the editor - nmcli con edit' */ gboolean editor_status_line; /* Whether to display status line in connection editor */ gboolean editor_save_confirmation; /* Whether to ask for confirmation on saving connections with 'autoconnect=yes' */ gboolean editor_show_secrets; /* Whether to display secrets in the editor' */ @@ -173,4 +192,11 @@ void nmc_clear_sigint (void); void nmc_set_sigquit_internal (void); void nmc_exit (void); +void nmc_empty_output_fields (NmcOutputData *output_data); + +#define NMC_OUTPUT_DATA_DEFINE_SCOPED(out) \ + nm_auto (nmc_empty_output_fields) NmcOutputData out = { \ + .output_data = g_ptr_array_new_full (20, g_free), \ + } + #endif /* NMC_NMCLI_H */ diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 87b1f50f71..d38787e89c 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -25,5773 +25,155 @@ #include #include "nm-common-macros.h" -#include "utils.h" -#include "common.h" + +#include "nm-client-utils.h" #include "nm-vpn-helpers.h" -/* Forward declarations */ -static char *wep_key_type_to_string (NMWepKeyType type); +#include "utils.h" +#include "common.h" -typedef enum { - NMC_PROPERTY_GET_PRETTY, - NMC_PROPERTY_GET_PARSABLE, -} NmcPropertyGetType; +/*****************************************************************************/ -/* Helper macro to define fields */ -#define SETTING_FIELD(setting) { setting, N_(setting), 0, NULL, FALSE, FALSE, 0 } - -/* Available fields for NM_SETTING_CONNECTION_SETTING_NAME */ -NmcOutputField nmc_fields_setting_connection[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_CONNECTION_ID), /* 1 */ - SETTING_FIELD (NM_SETTING_CONNECTION_UUID), /* 2 */ - SETTING_FIELD (NM_SETTING_CONNECTION_STABLE_ID), /* 3 */ - SETTING_FIELD (NM_SETTING_CONNECTION_INTERFACE_NAME), /* 4 */ - SETTING_FIELD (NM_SETTING_CONNECTION_TYPE), /* 5 */ - SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT), /* 6 */ - SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY), /* 7 */ - SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT_RETRIES), /* 8 */ - SETTING_FIELD (NM_SETTING_CONNECTION_TIMESTAMP), /* 9 */ - SETTING_FIELD (NM_SETTING_CONNECTION_READ_ONLY), /* 10 */ - SETTING_FIELD (NM_SETTING_CONNECTION_PERMISSIONS), /* 11 */ - SETTING_FIELD (NM_SETTING_CONNECTION_ZONE), /* 12 */ - SETTING_FIELD (NM_SETTING_CONNECTION_MASTER), /* 13 */ - SETTING_FIELD (NM_SETTING_CONNECTION_SLAVE_TYPE), /* 14 */ - SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES), /* 15 */ - SETTING_FIELD (NM_SETTING_CONNECTION_SECONDARIES), /* 16 */ - SETTING_FIELD (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT), /* 17 */ - SETTING_FIELD (NM_SETTING_CONNECTION_METERED), /* 18 */ - SETTING_FIELD (NM_SETTING_CONNECTION_LLDP), /* 19 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_CONNECTION_ALL "name"","\ - NM_SETTING_CONNECTION_ID","\ - NM_SETTING_CONNECTION_UUID","\ - NM_SETTING_CONNECTION_STABLE_ID","\ - NM_SETTING_CONNECTION_INTERFACE_NAME","\ - NM_SETTING_CONNECTION_TYPE","\ - NM_SETTING_CONNECTION_AUTOCONNECT","\ - NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY","\ - NM_SETTING_CONNECTION_AUTOCONNECT_RETRIES","\ - NM_SETTING_CONNECTION_TIMESTAMP","\ - NM_SETTING_CONNECTION_READ_ONLY","\ - NM_SETTING_CONNECTION_PERMISSIONS","\ - NM_SETTING_CONNECTION_ZONE","\ - NM_SETTING_CONNECTION_MASTER","\ - NM_SETTING_CONNECTION_SLAVE_TYPE","\ - NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES","\ - NM_SETTING_CONNECTION_SECONDARIES","\ - NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT","\ - NM_SETTING_CONNECTION_METERED","\ - NM_SETTING_CONNECTION_LLDP - -/* Available fields for NM_SETTING_WIRED_SETTING_NAME */ -NmcOutputField nmc_fields_setting_wired[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_WIRED_PORT), /* 1 */ - SETTING_FIELD (NM_SETTING_WIRED_SPEED), /* 2 */ - SETTING_FIELD (NM_SETTING_WIRED_DUPLEX), /* 3 */ - SETTING_FIELD (NM_SETTING_WIRED_AUTO_NEGOTIATE), /* 4 */ - SETTING_FIELD (NM_SETTING_WIRED_MAC_ADDRESS), /* 5 */ - SETTING_FIELD (NM_SETTING_WIRED_CLONED_MAC_ADDRESS), /* 6 */ - SETTING_FIELD (NM_SETTING_WIRED_GENERATE_MAC_ADDRESS_MASK), /* 7 */ - SETTING_FIELD (NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST), /* 8 */ - SETTING_FIELD (NM_SETTING_WIRED_MTU), /* 9 */ - SETTING_FIELD (NM_SETTING_WIRED_S390_SUBCHANNELS), /* 10 */ - SETTING_FIELD (NM_SETTING_WIRED_S390_NETTYPE), /* 11 */ - SETTING_FIELD (NM_SETTING_WIRED_S390_OPTIONS), /* 12 */ - SETTING_FIELD (NM_SETTING_WIRED_WAKE_ON_LAN), /* 13 */ - SETTING_FIELD (NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD), /* 14 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_WIRED_ALL "name"","\ - NM_SETTING_WIRED_PORT","\ - NM_SETTING_WIRED_SPEED","\ - NM_SETTING_WIRED_DUPLEX","\ - NM_SETTING_WIRED_AUTO_NEGOTIATE","\ - NM_SETTING_WIRED_MAC_ADDRESS","\ - NM_SETTING_WIRED_CLONED_MAC_ADDRESS","\ - NM_SETTING_WIRED_GENERATE_MAC_ADDRESS_MASK","\ - NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST","\ - NM_SETTING_WIRED_MTU","\ - NM_SETTING_WIRED_S390_SUBCHANNELS","\ - NM_SETTING_WIRED_S390_NETTYPE","\ - NM_SETTING_WIRED_S390_OPTIONS","\ - NM_SETTING_WIRED_WAKE_ON_LAN","\ - NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD - -/* Available fields for NM_SETTING_802_1X_SETTING_NAME */ -NmcOutputField nmc_fields_setting_8021X[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_802_1X_EAP), /* 1 */ - SETTING_FIELD (NM_SETTING_802_1X_IDENTITY), /* 2 */ - SETTING_FIELD (NM_SETTING_802_1X_ANONYMOUS_IDENTITY), /* 3 */ - SETTING_FIELD (NM_SETTING_802_1X_PAC_FILE), /* 4 */ - SETTING_FIELD (NM_SETTING_802_1X_CA_CERT), /* 5 */ - SETTING_FIELD (NM_SETTING_802_1X_CA_CERT_PASSWORD), /* 6 */ - SETTING_FIELD (NM_SETTING_802_1X_CA_CERT_PASSWORD_FLAGS), /* 7 */ - SETTING_FIELD (NM_SETTING_802_1X_CA_PATH), /* 8 */ - SETTING_FIELD (NM_SETTING_802_1X_SUBJECT_MATCH), /* 9 */ - SETTING_FIELD (NM_SETTING_802_1X_ALTSUBJECT_MATCHES), /* 10 */ - SETTING_FIELD (NM_SETTING_802_1X_DOMAIN_SUFFIX_MATCH), /* 11 */ - SETTING_FIELD (NM_SETTING_802_1X_CLIENT_CERT), /* 12 */ - SETTING_FIELD (NM_SETTING_802_1X_CLIENT_CERT_PASSWORD), /* 13 */ - SETTING_FIELD (NM_SETTING_802_1X_CLIENT_CERT_PASSWORD_FLAGS), /* 14 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE1_PEAPVER), /* 15 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE1_PEAPLABEL), /* 16 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING), /* 17 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE1_AUTH_FLAGS), /* 18 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_AUTH), /* 19 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_AUTHEAP), /* 20 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_CERT_PASSWORD), /* 21 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_CERT_PASSWORD_FLAGS), /* 22 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_CERT), /* 23 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CA_PATH), /* 24 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH), /* 25 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES), /* 26 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_DOMAIN_SUFFIX_MATCH), /* 27 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CLIENT_CERT), /* 28 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CLIENT_CERT_PASSWORD), /* 29 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_CLIENT_CERT_PASSWORD_FLAGS), /* 30 */ - SETTING_FIELD (NM_SETTING_802_1X_PASSWORD), /* 31 */ - SETTING_FIELD (NM_SETTING_802_1X_PASSWORD_FLAGS), /* 32 */ - SETTING_FIELD (NM_SETTING_802_1X_PASSWORD_RAW), /* 33 */ - SETTING_FIELD (NM_SETTING_802_1X_PASSWORD_RAW_FLAGS), /* 34 */ - SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY), /* 35 */ - SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD), /* 36 */ - SETTING_FIELD (NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS), /* 37 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY), /* 38 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD), /* 39 */ - SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS), /* 40 */ - SETTING_FIELD (NM_SETTING_802_1X_PIN), /* 41 */ - SETTING_FIELD (NM_SETTING_802_1X_PIN_FLAGS), /* 42 */ - SETTING_FIELD (NM_SETTING_802_1X_SYSTEM_CA_CERTS), /* 43 */ - SETTING_FIELD (NM_SETTING_802_1X_AUTH_TIMEOUT), /* 44 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_802_1X_ALL "name"","\ - NM_SETTING_802_1X_EAP","\ - NM_SETTING_802_1X_IDENTITY","\ - NM_SETTING_802_1X_ANONYMOUS_IDENTITY","\ - NM_SETTING_802_1X_PAC_FILE","\ - NM_SETTING_802_1X_CA_CERT","\ - NM_SETTING_802_1X_CA_CERT_PASSWORD","\ - NM_SETTING_802_1X_CA_CERT_PASSWORD_FLAGS","\ - NM_SETTING_802_1X_CA_PATH","\ - NM_SETTING_802_1X_SUBJECT_MATCH","\ - NM_SETTING_802_1X_ALTSUBJECT_MATCHES","\ - NM_SETTING_802_1X_DOMAIN_SUFFIX_MATCH","\ - NM_SETTING_802_1X_CLIENT_CERT","\ - NM_SETTING_802_1X_CLIENT_CERT_PASSWORD","\ - NM_SETTING_802_1X_CLIENT_CERT_PASSWORD_FLAGS","\ - NM_SETTING_802_1X_PHASE1_PEAPVER","\ - NM_SETTING_802_1X_PHASE1_PEAPLABEL","\ - NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING","\ - NM_SETTING_802_1X_PHASE1_AUTH_FLAGS","\ - NM_SETTING_802_1X_PHASE2_AUTH","\ - NM_SETTING_802_1X_PHASE2_AUTHEAP","\ - NM_SETTING_802_1X_PHASE2_CA_CERT","\ - NM_SETTING_802_1X_PHASE2_CA_CERT_PASSWORD","\ - NM_SETTING_802_1X_PHASE2_CA_CERT_PASSWORD_FLAGS","\ - NM_SETTING_802_1X_PHASE2_CA_PATH","\ - NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH","\ - NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES","\ - NM_SETTING_802_1X_PHASE2_DOMAIN_SUFFIX_MATCH","\ - NM_SETTING_802_1X_PHASE2_CLIENT_CERT","\ - NM_SETTING_802_1X_PHASE2_CLIENT_CERT_PASSWORD","\ - NM_SETTING_802_1X_PHASE2_CLIENT_CERT_PASSWORD_FLAGS","\ - NM_SETTING_802_1X_PASSWORD","\ - NM_SETTING_802_1X_PASSWORD_FLAGS","\ - NM_SETTING_802_1X_PASSWORD_RAW","\ - NM_SETTING_802_1X_PASSWORD_RAW_FLAGS","\ - NM_SETTING_802_1X_PRIVATE_KEY","\ - NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD","\ - NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS","\ - NM_SETTING_802_1X_PHASE2_PRIVATE_KEY","\ - NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD","\ - NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS","\ - NM_SETTING_802_1X_PIN","\ - NM_SETTING_802_1X_PIN_FLAGS","\ - NM_SETTING_802_1X_SYSTEM_CA_CERTS","\ - NM_SETTING_802_1X_AUTH_TIMEOUT - -/* Available fields for NM_SETTING_WIRELESS_SETTING_NAME */ -NmcOutputField nmc_fields_setting_wireless[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SSID), /* 1 */ - SETTING_FIELD (NM_SETTING_WIRELESS_MODE), /* 2 */ - SETTING_FIELD (NM_SETTING_WIRELESS_BAND), /* 3 */ - SETTING_FIELD (NM_SETTING_WIRELESS_CHANNEL), /* 4 */ - SETTING_FIELD (NM_SETTING_WIRELESS_BSSID), /* 5 */ - SETTING_FIELD (NM_SETTING_WIRELESS_RATE), /* 6 */ - SETTING_FIELD (NM_SETTING_WIRELESS_TX_POWER), /* 7 */ - SETTING_FIELD (NM_SETTING_WIRELESS_MAC_ADDRESS), /* 8 */ - SETTING_FIELD (NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS), /* 9 */ - SETTING_FIELD (NM_SETTING_WIRELESS_GENERATE_MAC_ADDRESS_MASK), /* 10 */ - SETTING_FIELD (NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST), /* 11 */ - SETTING_FIELD (NM_SETTING_WIRELESS_MAC_ADDRESS_RANDOMIZATION), /* 12 */ - SETTING_FIELD (NM_SETTING_WIRELESS_MTU), /* 13 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SEEN_BSSIDS), /* 14 */ - SETTING_FIELD (NM_SETTING_WIRELESS_HIDDEN), /* 15 */ - SETTING_FIELD (NM_SETTING_WIRELESS_POWERSAVE), /* 16 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_WIRELESS_ALL "name"","\ - NM_SETTING_WIRELESS_SSID","\ - NM_SETTING_WIRELESS_MODE","\ - NM_SETTING_WIRELESS_BAND","\ - NM_SETTING_WIRELESS_CHANNEL","\ - NM_SETTING_WIRELESS_BSSID","\ - NM_SETTING_WIRELESS_RATE","\ - NM_SETTING_WIRELESS_TX_POWER","\ - NM_SETTING_WIRELESS_MAC_ADDRESS","\ - NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS","\ - NM_SETTING_WIRELESS_GENERATE_MAC_ADDRESS_MASK","\ - NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST","\ - NM_SETTING_WIRELESS_MAC_ADDRESS_RANDOMIZATION","\ - NM_SETTING_WIRELESS_MTU","\ - NM_SETTING_WIRELESS_SEEN_BSSIDS","\ - NM_SETTING_WIRELESS_HIDDEN"," \ - NM_SETTING_WIRELESS_POWERSAVE - -/* Available fields for NM_SETTING_WIRELESS_SECURITY_SETTING_NAME */ -NmcOutputField nmc_fields_setting_wireless_security[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_KEY_MGMT), /* 1 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX), /* 2 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_AUTH_ALG), /* 3 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PROTO), /* 4 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PAIRWISE), /* 5 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_GROUP), /* 6 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME), /* 7 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY0), /* 8 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY1), /* 9 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY2), /* 10 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY3), /* 11 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS), /* 12 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE), /* 13 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PSK), /* 14 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS), /* 15 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD), /* 16 */ - SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS), /* 17 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_WIRELESS_SECURITY_ALL "name"","\ - NM_SETTING_WIRELESS_SECURITY_KEY_MGMT","\ - NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX","\ - NM_SETTING_WIRELESS_SECURITY_AUTH_ALG","\ - NM_SETTING_WIRELESS_SECURITY_PROTO","\ - NM_SETTING_WIRELESS_SECURITY_PAIRWISE","\ - NM_SETTING_WIRELESS_SECURITY_GROUP","\ - NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME","\ - NM_SETTING_WIRELESS_SECURITY_WEP_KEY0","\ - NM_SETTING_WIRELESS_SECURITY_WEP_KEY1","\ - NM_SETTING_WIRELESS_SECURITY_WEP_KEY2","\ - NM_SETTING_WIRELESS_SECURITY_WEP_KEY3","\ - NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS","\ - NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE","\ - NM_SETTING_WIRELESS_SECURITY_PSK","\ - NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS","\ - NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD","\ - NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS - -/* Available fields for NM_SETTING_IP4_CONFIG_SETTING_NAME */ -NmcOutputField nmc_fields_setting_ip4_config[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_METHOD), /* 1 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS), /* 2 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_SEARCH), /* 3 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_OPTIONS), /* 4 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_PRIORITY), /* 5 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_ADDRESSES), /* 6 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_GATEWAY), /* 7 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTES), /* 8 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTE_METRIC), /* 9 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES), /* 10 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS), /* 11 */ - SETTING_FIELD (NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID), /* 12 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_TIMEOUT), /* 13 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME), /* 14 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_HOSTNAME), /* 15 */ - SETTING_FIELD (NM_SETTING_IP4_CONFIG_DHCP_FQDN), /* 16 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_NEVER_DEFAULT), /* 17 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_MAY_FAIL), /* 18 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DAD_TIMEOUT), /* 19 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_IP4_CONFIG_ALL "name"","\ - NM_SETTING_IP_CONFIG_METHOD","\ - NM_SETTING_IP_CONFIG_DNS","\ - NM_SETTING_IP_CONFIG_DNS_SEARCH","\ - NM_SETTING_IP_CONFIG_DNS_OPTIONS","\ - NM_SETTING_IP_CONFIG_DNS_PRIORITY","\ - NM_SETTING_IP_CONFIG_ADDRESSES","\ - NM_SETTING_IP_CONFIG_GATEWAY","\ - NM_SETTING_IP_CONFIG_ROUTES","\ - NM_SETTING_IP_CONFIG_ROUTE_METRIC","\ - NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES","\ - NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS","\ - NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID","\ - NM_SETTING_IP_CONFIG_DHCP_TIMEOUT","\ - NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME","\ - NM_SETTING_IP_CONFIG_DHCP_HOSTNAME","\ - NM_SETTING_IP4_CONFIG_DHCP_FQDN","\ - NM_SETTING_IP_CONFIG_NEVER_DEFAULT","\ - NM_SETTING_IP_CONFIG_MAY_FAIL","\ - NM_SETTING_IP_CONFIG_DAD_TIMEOUT - -/* Available fields for NM_SETTING_IP6_CONFIG_SETTING_NAME */ -NmcOutputField nmc_fields_setting_ip6_config[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_METHOD), /* 1 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS), /* 2 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_SEARCH), /* 3 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_OPTIONS), /* 4 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DNS_PRIORITY), /* 5 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_ADDRESSES), /* 6 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_GATEWAY), /* 7 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTES), /* 8 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_ROUTE_METRIC), /* 9 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES), /* 10 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS), /* 11 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_NEVER_DEFAULT), /* 12 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_MAY_FAIL), /* 13 */ - SETTING_FIELD (NM_SETTING_IP6_CONFIG_IP6_PRIVACY), /* 14 */ - SETTING_FIELD (NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE), /* 15 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME), /* 16 */ - SETTING_FIELD (NM_SETTING_IP_CONFIG_DHCP_HOSTNAME), /* 17 */ - SETTING_FIELD (NM_SETTING_IP6_CONFIG_TOKEN), /* 18 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_IP6_CONFIG_ALL "name"","\ - NM_SETTING_IP_CONFIG_METHOD","\ - NM_SETTING_IP_CONFIG_DNS","\ - NM_SETTING_IP_CONFIG_DNS_SEARCH","\ - NM_SETTING_IP_CONFIG_DNS_OPTIONS","\ - NM_SETTING_IP_CONFIG_DNS_PRIORITY","\ - NM_SETTING_IP_CONFIG_ADDRESSES","\ - NM_SETTING_IP_CONFIG_GATEWAY","\ - NM_SETTING_IP_CONFIG_ROUTES","\ - NM_SETTING_IP_CONFIG_ROUTE_METRIC","\ - NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES","\ - NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS","\ - NM_SETTING_IP_CONFIG_NEVER_DEFAULT","\ - NM_SETTING_IP_CONFIG_MAY_FAIL","\ - NM_SETTING_IP6_CONFIG_IP6_PRIVACY","\ - NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE","\ - NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME","\ - NM_SETTING_IP_CONFIG_DHCP_HOSTNAME","\ - NM_SETTING_IP6_CONFIG_TOKEN - -/* Available fields for NM_SETTING_SERIAL_SETTING_NAME */ -NmcOutputField nmc_fields_setting_serial[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_SERIAL_BAUD), /* 1 */ - SETTING_FIELD (NM_SETTING_SERIAL_BITS), /* 2 */ - SETTING_FIELD (NM_SETTING_SERIAL_PARITY), /* 3 */ - SETTING_FIELD (NM_SETTING_SERIAL_STOPBITS), /* 4 */ - SETTING_FIELD (NM_SETTING_SERIAL_SEND_DELAY), /* 5 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_SERIAL_ALL "name"","\ - NM_SETTING_SERIAL_BAUD","\ - NM_SETTING_SERIAL_BITS","\ - NM_SETTING_SERIAL_PARITY","\ - NM_SETTING_SERIAL_STOPBITS","\ - NM_SETTING_SERIAL_SEND_DELAY - -/* Available fields for NM_SETTING_PPP_SETTING_NAME */ -NmcOutputField nmc_fields_setting_ppp[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_PPP_NOAUTH), /* 1 */ - SETTING_FIELD (NM_SETTING_PPP_REFUSE_EAP), /* 2 */ - SETTING_FIELD (NM_SETTING_PPP_REFUSE_PAP), /* 3 */ - SETTING_FIELD (NM_SETTING_PPP_REFUSE_CHAP), /* 4 */ - SETTING_FIELD (NM_SETTING_PPP_REFUSE_MSCHAP), /* 5 */ - SETTING_FIELD (NM_SETTING_PPP_REFUSE_MSCHAPV2), /* 6 */ - SETTING_FIELD (NM_SETTING_PPP_NOBSDCOMP), /* 7 */ - SETTING_FIELD (NM_SETTING_PPP_NODEFLATE), /* 8 */ - SETTING_FIELD (NM_SETTING_PPP_NO_VJ_COMP), /* 9 */ - SETTING_FIELD (NM_SETTING_PPP_REQUIRE_MPPE), /* 10 */ - SETTING_FIELD (NM_SETTING_PPP_REQUIRE_MPPE_128), /* 11 */ - SETTING_FIELD (NM_SETTING_PPP_MPPE_STATEFUL), /* 12 */ - SETTING_FIELD (NM_SETTING_PPP_CRTSCTS), /* 13 */ - SETTING_FIELD (NM_SETTING_PPP_BAUD), /* 14 */ - SETTING_FIELD (NM_SETTING_PPP_MRU), /* 15 */ - SETTING_FIELD (NM_SETTING_PPP_MTU), /* 16 */ - SETTING_FIELD (NM_SETTING_PPP_LCP_ECHO_FAILURE), /* 17 */ - SETTING_FIELD (NM_SETTING_PPP_LCP_ECHO_INTERVAL), /* 18 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_PPP_ALL "name"","\ - NM_SETTING_PPP_NOAUTH","\ - NM_SETTING_PPP_REFUSE_EAP","\ - NM_SETTING_PPP_REFUSE_PAP","\ - NM_SETTING_PPP_REFUSE_CHAP","\ - NM_SETTING_PPP_REFUSE_MSCHAP","\ - NM_SETTING_PPP_REFUSE_MSCHAPV2","\ - NM_SETTING_PPP_NOBSDCOMP","\ - NM_SETTING_PPP_NODEFLATE","\ - NM_SETTING_PPP_NO_VJ_COMP","\ - NM_SETTING_PPP_REQUIRE_MPPE","\ - NM_SETTING_PPP_REQUIRE_MPPE_128","\ - NM_SETTING_PPP_MPPE_STATEFUL","\ - NM_SETTING_PPP_CRTSCTS","\ - NM_SETTING_PPP_BAUD","\ - NM_SETTING_PPP_MRU","\ - NM_SETTING_PPP_MTU","\ - NM_SETTING_PPP_LCP_ECHO_FAILURE","\ - NM_SETTING_PPP_LCP_ECHO_INTERVAL - -/* Available fields for NM_SETTING_PPPOE_SETTING_NAME */ -NmcOutputField nmc_fields_setting_pppoe[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_PPPOE_SERVICE), /* 1 */ - SETTING_FIELD (NM_SETTING_PPPOE_USERNAME), /* 2 */ - SETTING_FIELD (NM_SETTING_PPPOE_PASSWORD), /* 3 */ - SETTING_FIELD (NM_SETTING_PPPOE_PASSWORD_FLAGS), /* 4 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_PPPOE_ALL "name"","\ - NM_SETTING_PPPOE_SERVICE","\ - NM_SETTING_PPPOE_USERNAME","\ - NM_SETTING_PPPOE_PASSWORD","\ - NM_SETTING_PPPOE_PASSWORD_FLAGS - -/* Available fields for NM_SETTING_ADSL_SETTING_NAME */ -NmcOutputField nmc_fields_setting_adsl[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_ADSL_USERNAME), /* 1 */ - SETTING_FIELD (NM_SETTING_ADSL_PASSWORD), /* 2 */ - SETTING_FIELD (NM_SETTING_ADSL_PASSWORD_FLAGS), /* 3 */ - SETTING_FIELD (NM_SETTING_ADSL_PROTOCOL), /* 4 */ - SETTING_FIELD (NM_SETTING_ADSL_ENCAPSULATION), /* 5 */ - SETTING_FIELD (NM_SETTING_ADSL_VPI), /* 6 */ - SETTING_FIELD (NM_SETTING_ADSL_VCI), /* 7 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_ADSL_ALL "name"","\ - NM_SETTING_ADSL_USERNAME","\ - NM_SETTING_ADSL_PASSWORD","\ - NM_SETTING_ADSL_PASSWORD_FLAGS","\ - NM_SETTING_ADSL_PROTOCOL","\ - NM_SETTING_ADSL_ENCAPSULATION","\ - NM_SETTING_ADSL_VPI","\ - NM_SETTING_ADSL_VCI - -/* Available fields for NM_SETTING_GSM_SETTING_NAME */ -NmcOutputField nmc_fields_setting_gsm[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_GSM_NUMBER), /* 1 */ - SETTING_FIELD (NM_SETTING_GSM_USERNAME), /* 2 */ - SETTING_FIELD (NM_SETTING_GSM_PASSWORD), /* 3 */ - SETTING_FIELD (NM_SETTING_GSM_PASSWORD_FLAGS), /* 4 */ - SETTING_FIELD (NM_SETTING_GSM_APN), /* 5 */ - SETTING_FIELD (NM_SETTING_GSM_NETWORK_ID), /* 6 */ - SETTING_FIELD (NM_SETTING_GSM_PIN), /* 7 */ - SETTING_FIELD (NM_SETTING_GSM_PIN_FLAGS), /* 8 */ - SETTING_FIELD (NM_SETTING_GSM_HOME_ONLY), /* 9 */ - SETTING_FIELD (NM_SETTING_GSM_DEVICE_ID), /* 10 */ - SETTING_FIELD (NM_SETTING_GSM_SIM_ID), /* 11 */ - SETTING_FIELD (NM_SETTING_GSM_SIM_OPERATOR_ID), /* 12 */ - SETTING_FIELD (NM_SETTING_GSM_MTU), /* 13 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_GSM_ALL "name"","\ - NM_SETTING_GSM_NUMBER","\ - NM_SETTING_GSM_USERNAME","\ - NM_SETTING_GSM_PASSWORD","\ - NM_SETTING_GSM_PASSWORD_FLAGS","\ - NM_SETTING_GSM_APN","\ - NM_SETTING_GSM_NETWORK_ID","\ - NM_SETTING_GSM_PIN","\ - NM_SETTING_GSM_PIN_FLAGS","\ - NM_SETTING_GSM_HOME_ONLY","\ - NM_SETTING_GSM_DEVICE_ID","\ - NM_SETTING_GSM_SIM_ID","\ - NM_SETTING_GSM_SIM_OPERATOR_ID","\ - NM_SETTING_GSM_MTU - -/* Available fields for NM_SETTING_CDMA_SETTING_NAME */ -NmcOutputField nmc_fields_setting_cdma[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_CDMA_NUMBER), /* 1 */ - SETTING_FIELD (NM_SETTING_CDMA_USERNAME), /* 2 */ - SETTING_FIELD (NM_SETTING_CDMA_PASSWORD), /* 3 */ - SETTING_FIELD (NM_SETTING_CDMA_PASSWORD_FLAGS), /* 4 */ - SETTING_FIELD (NM_SETTING_CDMA_MTU), /* 5 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_CDMA_ALL "name"","\ - NM_SETTING_CDMA_NUMBER","\ - NM_SETTING_CDMA_USERNAME","\ - NM_SETTING_CDMA_PASSWORD","\ - NM_SETTING_CDMA_PASSWORD_FLAGS","\ - NM_SETTING_CDMA_MTU - -/* Available fields for NM_SETTING_BLUETOOTH_SETTING_NAME */ -NmcOutputField nmc_fields_setting_bluetooth[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_BLUETOOTH_BDADDR), /* 1 */ - SETTING_FIELD (NM_SETTING_BLUETOOTH_TYPE), /* 2 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_BLUETOOTH_ALL "name"","\ - NM_SETTING_BLUETOOTH_BDADDR","\ - NM_SETTING_BLUETOOTH_TYPE - -/* Available fields for NM_SETTING_OLPC_MESH_SETTING_NAME */ -NmcOutputField nmc_fields_setting_olpc_mesh[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_OLPC_MESH_SSID), /* 1 */ - SETTING_FIELD (NM_SETTING_OLPC_MESH_CHANNEL), /* 2 */ - SETTING_FIELD (NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS), /* 3 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_OLPC_MESH_ALL "name"","\ - NM_SETTING_OLPC_MESH_SSID","\ - NM_SETTING_OLPC_MESH_CHANNEL","\ - NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS - -/* Available fields for NM_SETTING_VPN_SETTING_NAME */ -NmcOutputField nmc_fields_setting_vpn[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_VPN_SERVICE_TYPE), /* 1 */ - SETTING_FIELD (NM_SETTING_VPN_USER_NAME), /* 2 */ - SETTING_FIELD (NM_SETTING_VPN_DATA), /* 3 */ - SETTING_FIELD (NM_SETTING_VPN_SECRETS), /* 4 */ - SETTING_FIELD (NM_SETTING_VPN_PERSISTENT), /* 5 */ - SETTING_FIELD (NM_SETTING_VPN_TIMEOUT), /* 6 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_VPN_ALL "name"","\ - NM_SETTING_VPN_SERVICE_TYPE","\ - NM_SETTING_VPN_USER_NAME","\ - NM_SETTING_VPN_DATA","\ - NM_SETTING_VPN_SECRETS","\ - NM_SETTING_VPN_PERSISTENT","\ - NM_SETTING_VPN_TIMEOUT - -/* Available fields for NM_SETTING_WIMAX_SETTING_NAME */ -NmcOutputField nmc_fields_setting_wimax[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_WIMAX_MAC_ADDRESS), /* 1 */ - SETTING_FIELD (NM_SETTING_WIMAX_NETWORK_NAME), /* 2 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_WIMAX_ALL "name"","\ - NM_SETTING_WIMAX_MAC_ADDRESS","\ - NM_SETTING_WIMAX_NETWORK_NAME - -/* Available fields for NM_SETTING_INFINIBAND_SETTING_NAME */ -NmcOutputField nmc_fields_setting_infiniband[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_INFINIBAND_MAC_ADDRESS), /* 1 */ - SETTING_FIELD (NM_SETTING_INFINIBAND_MTU), /* 2 */ - SETTING_FIELD (NM_SETTING_INFINIBAND_TRANSPORT_MODE), /* 3 */ - SETTING_FIELD (NM_SETTING_INFINIBAND_P_KEY), /* 4 */ - SETTING_FIELD (NM_SETTING_INFINIBAND_PARENT), /* 5 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_INFINIBAND_ALL "name"","\ - NM_SETTING_INFINIBAND_MAC_ADDRESS","\ - NM_SETTING_INFINIBAND_MTU"," \ - NM_SETTING_INFINIBAND_TRANSPORT_MODE"," \ - NM_SETTING_INFINIBAND_P_KEY"," \ - NM_SETTING_INFINIBAND_PARENT - -/* Available fields for NM_SETTING_BOND_SETTING_NAME */ -NmcOutputField nmc_fields_setting_bond[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_BOND_OPTIONS), /* 1 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_BOND_ALL "name"","\ - NM_SETTING_BOND_OPTIONS - -/* Available fields for NM_SETTING_VLAN_SETTING_NAME */ -NmcOutputField nmc_fields_setting_vlan[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_VLAN_PARENT), /* 1 */ - SETTING_FIELD (NM_SETTING_VLAN_ID), /* 2 */ - SETTING_FIELD (NM_SETTING_VLAN_FLAGS), /* 3 */ - SETTING_FIELD (NM_SETTING_VLAN_INGRESS_PRIORITY_MAP), /* 4 */ - SETTING_FIELD (NM_SETTING_VLAN_EGRESS_PRIORITY_MAP), /* 5 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_VLAN_ALL "name"","\ - NM_SETTING_VLAN_PARENT","\ - NM_SETTING_VLAN_ID","\ - NM_SETTING_VLAN_FLAGS","\ - NM_SETTING_VLAN_INGRESS_PRIORITY_MAP","\ - NM_SETTING_VLAN_EGRESS_PRIORITY_MAP - -/* Available fields for NM_SETTING_BRIDGE_SETTING_NAME */ -NmcOutputField nmc_fields_setting_bridge[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_BRIDGE_MAC_ADDRESS), /* 1 */ - SETTING_FIELD (NM_SETTING_BRIDGE_STP), /* 2 */ - SETTING_FIELD (NM_SETTING_BRIDGE_PRIORITY), /* 3 */ - SETTING_FIELD (NM_SETTING_BRIDGE_FORWARD_DELAY), /* 4 */ - SETTING_FIELD (NM_SETTING_BRIDGE_HELLO_TIME), /* 5 */ - SETTING_FIELD (NM_SETTING_BRIDGE_MAX_AGE), /* 6 */ - SETTING_FIELD (NM_SETTING_BRIDGE_AGEING_TIME), /* 7 */ - SETTING_FIELD (NM_SETTING_BRIDGE_MULTICAST_SNOOPING), /* 8 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_BRIDGE_ALL "name"","\ - NM_SETTING_BRIDGE_MAC_ADDRESS","\ - NM_SETTING_BRIDGE_STP","\ - NM_SETTING_BRIDGE_PRIORITY","\ - NM_SETTING_BRIDGE_FORWARD_DELAY","\ - NM_SETTING_BRIDGE_HELLO_TIME","\ - NM_SETTING_BRIDGE_MAX_AGE","\ - NM_SETTING_BRIDGE_AGEING_TIME","\ - NM_SETTING_BRIDGE_MULTICAST_SNOOPING - -/* Available fields for NM_SETTING_BRIDGE_PORT_SETTING_NAME */ -NmcOutputField nmc_fields_setting_bridge_port[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_BRIDGE_PORT_PRIORITY), /* 1 */ - SETTING_FIELD (NM_SETTING_BRIDGE_PORT_PATH_COST), /* 2 */ - SETTING_FIELD (NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE), /* 3 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_BRIDGE_PORT_ALL "name"","\ - NM_SETTING_BRIDGE_PORT_PRIORITY","\ - NM_SETTING_BRIDGE_PORT_PATH_COST","\ - NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE - -/* Available fields for NM_SETTING_TEAM_SETTING_NAME */ -NmcOutputField nmc_fields_setting_team[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_TEAM_CONFIG), /* 1 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_TEAM_ALL "name"","\ - NM_SETTING_TEAM_CONFIG - -/* Available fields for NM_SETTING_TEAM_PORT_SETTING_NAME */ -NmcOutputField nmc_fields_setting_team_port[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_TEAM_PORT_CONFIG), /* 1 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_TEAM_PORT_ALL "name"","\ - NM_SETTING_TEAM_PORT_CONFIG - -/* Available fields for NM_SETTING_DCB_SETTING_NAME */ -NmcOutputField nmc_fields_setting_dcb[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_FLAGS), /* 1 */ - SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_PRIORITY), /* 2 */ - SETTING_FIELD (NM_SETTING_DCB_APP_FCOE_MODE), /* 3 */ - SETTING_FIELD (NM_SETTING_DCB_APP_ISCSI_FLAGS), /* 4 */ - SETTING_FIELD (NM_SETTING_DCB_APP_ISCSI_PRIORITY), /* 5 */ - SETTING_FIELD (NM_SETTING_DCB_APP_FIP_FLAGS), /* 6 */ - SETTING_FIELD (NM_SETTING_DCB_APP_FIP_PRIORITY), /* 7 */ - SETTING_FIELD (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS), /* 8 */ - SETTING_FIELD (NM_SETTING_DCB_PRIORITY_FLOW_CONTROL), /* 9 */ - SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_FLAGS), /* 10 */ - SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_ID), /* 11 */ - SETTING_FIELD (NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH), /* 12 */ - SETTING_FIELD (NM_SETTING_DCB_PRIORITY_BANDWIDTH), /* 13 */ - SETTING_FIELD (NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH), /* 14 */ - SETTING_FIELD (NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS), /* 15 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_DCB_ALL "name"","\ - NM_SETTING_DCB_APP_FCOE_FLAGS","\ - NM_SETTING_DCB_APP_FCOE_PRIORITY","\ - NM_SETTING_DCB_APP_FCOE_MODE","\ - NM_SETTING_DCB_APP_ISCSI_FLAGS","\ - NM_SETTING_DCB_APP_ISCSI_PRIORITY","\ - NM_SETTING_DCB_APP_FIP_FLAGS","\ - NM_SETTING_DCB_APP_FIP_PRIORITY","\ - NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS","\ - NM_SETTING_DCB_PRIORITY_FLOW_CONTROL","\ - NM_SETTING_DCB_PRIORITY_GROUP_FLAGS","\ - NM_SETTING_DCB_PRIORITY_GROUP_ID","\ - NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH","\ - NM_SETTING_DCB_PRIORITY_BANDWIDTH","\ - NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH","\ - NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS - -/* Available fields for NM_SETTING_DUMMY_SETTING_NAME */ -NmcOutputField nmc_fields_setting_dummy[] = { - SETTING_FIELD ("name"), /* 0 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_DUMMY_ALL "name" - -/* Available fields for NM_SETTING_TUN_SETTING_NAME */ -NmcOutputField nmc_fields_setting_tun[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_TUN_MODE), /* 1 */ - SETTING_FIELD (NM_SETTING_TUN_OWNER), /* 2 */ - SETTING_FIELD (NM_SETTING_TUN_GROUP), /* 3 */ - SETTING_FIELD (NM_SETTING_TUN_PI), /* 4 */ - SETTING_FIELD (NM_SETTING_TUN_VNET_HDR), /* 5 */ - SETTING_FIELD (NM_SETTING_TUN_MULTI_QUEUE), /* 6 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_TUN_ALL "name"","\ - NM_SETTING_TUN_MODE","\ - NM_SETTING_TUN_OWNER","\ - NM_SETTING_TUN_GROUP","\ - NM_SETTING_TUN_PI","\ - NM_SETTING_TUN_VNET_HDR","\ - NM_SETTING_TUN_MULTI_QUEUE - -/* Available fields for NM_SETTING_IP_TUNNEL_SETTING_NAME */ -NmcOutputField nmc_fields_setting_ip_tunnel[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_MODE), /* 1 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_PARENT), /* 2 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_LOCAL), /* 3 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_REMOTE), /* 4 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_TTL), /* 5 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_TOS), /* 6 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_PATH_MTU_DISCOVERY), /* 7 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_INPUT_KEY), /* 8 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_OUTPUT_KEY), /* 9 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_ENCAPSULATION_LIMIT), /* 10 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_FLOW_LABEL), /* 11 */ - SETTING_FIELD (NM_SETTING_IP_TUNNEL_MTU), /* 12 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_IP_TUNNEL_ALL "name"","\ - NM_SETTING_IP_TUNNEL_MODE","\ - NM_SETTING_IP_TUNNEL_PARENT","\ - NM_SETTING_IP_TUNNEL_LOCAL","\ - NM_SETTING_IP_TUNNEL_REMOTE","\ - NM_SETTING_IP_TUNNEL_TTL","\ - NM_SETTING_IP_TUNNEL_TOS","\ - NM_SETTING_IP_TUNNEL_PATH_MTU_DISCOVERY","\ - NM_SETTING_IP_TUNNEL_INPUT_KEY","\ - NM_SETTING_IP_TUNNEL_OUTPUT_KEY","\ - NM_SETTING_IP_TUNNEL_ENCAPSULATION_LIMIT","\ - NM_SETTING_IP_TUNNEL_FLOW_LABEL","\ - NM_SETTING_IP_TUNNEL_MTU - -/* Available fields for NM_SETTING_MACSEC_SETTING_NAME */ -NmcOutputField nmc_fields_setting_macsec[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_MACSEC_PARENT), /* 1 */ - SETTING_FIELD (NM_SETTING_MACSEC_MODE), /* 2 */ - SETTING_FIELD (NM_SETTING_MACSEC_ENCRYPT), /* 3 */ - SETTING_FIELD (NM_SETTING_MACSEC_MKA_CAK), /* 4 */ - SETTING_FIELD (NM_SETTING_MACSEC_MKA_CAK_FLAGS), /* 5 */ - SETTING_FIELD (NM_SETTING_MACSEC_MKA_CKN), /* 6 */ - SETTING_FIELD (NM_SETTING_MACSEC_PORT), /* 7 */ - SETTING_FIELD (NM_SETTING_MACSEC_VALIDATION), /* 8 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_MACSEC_ALL "name"","\ - NM_SETTING_MACSEC_PARENT","\ - NM_SETTING_MACSEC_MODE","\ - NM_SETTING_MACSEC_ENCRYPT","\ - NM_SETTING_MACSEC_MKA_CAK","\ - NM_SETTING_MACSEC_MKA_CAK_FLAGS","\ - NM_SETTING_MACSEC_MKA_CKN","\ - NM_SETTING_MACSEC_PORT","\ - NM_SETTING_MACSEC_VALIDATION - -/* Available fields for NM_SETTING_MACVLAN_SETTING_NAME */ -NmcOutputField nmc_fields_setting_macvlan[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_MACVLAN_PARENT), /* 1 */ - SETTING_FIELD (NM_SETTING_MACVLAN_MODE), /* 2 */ - SETTING_FIELD (NM_SETTING_MACVLAN_PROMISCUOUS), /* 3 */ - SETTING_FIELD (NM_SETTING_MACVLAN_TAP), /* 4 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_MACVLAN_ALL "name"","\ - NM_SETTING_MACVLAN_PARENT","\ - NM_SETTING_MACVLAN_MODE","\ - NM_SETTING_MACVLAN_PROMISCUOUS","\ - NM_SETTING_MACVLAN_TAP - -/* Available fields for NM_SETTING_VXLAN_SETTING_NAME */ -NmcOutputField nmc_fields_setting_vxlan[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_VXLAN_PARENT), /* 1 */ - SETTING_FIELD (NM_SETTING_VXLAN_ID), /* 2 */ - SETTING_FIELD (NM_SETTING_VXLAN_LOCAL), /* 3 */ - SETTING_FIELD (NM_SETTING_VXLAN_REMOTE), /* 4 */ - SETTING_FIELD (NM_SETTING_VXLAN_SOURCE_PORT_MIN), /* 5 */ - SETTING_FIELD (NM_SETTING_VXLAN_SOURCE_PORT_MAX), /* 6 */ - SETTING_FIELD (NM_SETTING_VXLAN_DESTINATION_PORT), /* 7 */ - SETTING_FIELD (NM_SETTING_VXLAN_TOS), /* 8 */ - SETTING_FIELD (NM_SETTING_VXLAN_TTL), /* 9 */ - SETTING_FIELD (NM_SETTING_VXLAN_AGEING), /* 10 */ - SETTING_FIELD (NM_SETTING_VXLAN_LIMIT), /* 11 */ - SETTING_FIELD (NM_SETTING_VXLAN_LEARNING), /* 12 */ - SETTING_FIELD (NM_SETTING_VXLAN_PROXY), /* 13 */ - SETTING_FIELD (NM_SETTING_VXLAN_RSC), /* 14 */ - SETTING_FIELD (NM_SETTING_VXLAN_L2_MISS), /* 15 */ - SETTING_FIELD (NM_SETTING_VXLAN_L3_MISS), /* 16 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_VXLAN_ALL "name"","\ - NM_SETTING_VXLAN_PARENT","\ - NM_SETTING_VXLAN_ID","\ - NM_SETTING_VXLAN_LOCAL","\ - NM_SETTING_VXLAN_REMOTE","\ - NM_SETTING_VXLAN_SOURCE_PORT_MIN","\ - NM_SETTING_VXLAN_SOURCE_PORT_MAX","\ - NM_SETTING_VXLAN_DESTINATION_PORT","\ - NM_SETTING_VXLAN_TOS","\ - NM_SETTING_VXLAN_TTL","\ - NM_SETTING_VXLAN_AGEING","\ - NM_SETTING_VXLAN_LIMIT","\ - NM_SETTING_VXLAN_LEARNING","\ - NM_SETTING_VXLAN_PROXY","\ - NM_SETTING_VXLAN_RSC","\ - NM_SETTING_VXLAN_L2_MISS","\ - NM_SETTING_VXLAN_L3_MISS - -/* Available fields for NM_SETTING_PROXY_SETTING_NAME */ -NmcOutputField nmc_fields_setting_proxy[] = { - SETTING_FIELD ("name"), /* 0 */ - SETTING_FIELD (NM_SETTING_PROXY_METHOD), /* 1 */ - SETTING_FIELD (NM_SETTING_PROXY_BROWSER_ONLY), /* 2 */ - SETTING_FIELD (NM_SETTING_PROXY_PAC_URL), /* 3 */ - SETTING_FIELD (NM_SETTING_PROXY_PAC_SCRIPT), /* 4 */ - {NULL, NULL, 0, NULL, FALSE, FALSE, 0} -}; -#define NMC_FIELDS_SETTING_PROXY_ALL "name"","\ - NM_SETTING_PROXY_METHOD","\ - NM_SETTING_PROXY_BROWSER_ONLY","\ - NM_SETTING_PROXY_PAC_URL","\ - NM_SETTING_PROXY_PAC_SCRIPT -/*----------------------------------------------------------------------------*/ -static char * -wep_key_type_to_string (NMWepKeyType type) +static const NMMetaSettingInfoEditor * +_meta_find_setting_info_by_name (const char *setting_name) { - switch (type) { - case NM_WEP_KEY_TYPE_KEY: - return g_strdup_printf (_("%d (key)"), type); - case NM_WEP_KEY_TYPE_PASSPHRASE: - return g_strdup_printf (_("%d (passphrase)"), type); - case NM_WEP_KEY_TYPE_UNKNOWN: - default: - return g_strdup_printf (_("%d (unknown)"), type); - } -} + const NMMetaSettingInfo *meta_setting_info; + const NMMetaSettingInfoEditor *setting_info; -static char * -bytes_to_string (GBytes *bytes) -{ - const guint8 *data; - gsize len; - GString *cert = NULL; - int i; + g_return_val_if_fail (setting_name, NULL); - if (!bytes) + meta_setting_info = nm_meta_setting_infos_by_name (setting_name); + + if (!meta_setting_info) return NULL; - data = g_bytes_get_data (bytes, &len); - cert = g_string_new (NULL); - for (i = 0; i < len; i++) - g_string_append_printf (cert, "%02X", data[i]); + g_return_val_if_fail (nm_streq0 (meta_setting_info->setting_name, setting_name), NULL); - return g_string_free (cert, FALSE); + if (meta_setting_info->meta_type >= G_N_ELEMENTS (nm_meta_setting_infos_editor)) + return NULL; + + setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type]; + + g_return_val_if_fail (setting_info->general == meta_setting_info, NULL); + + return setting_info; } -static char * -vlan_flags_to_string (guint32 flags, NmcPropertyGetType get_type) +static const NMMetaSettingInfoEditor * +_meta_find_setting_info_by_gtype (GType gtype) { - GString *flag_str; + const NMMetaSettingInfo *meta_setting_info; + const NMMetaSettingInfoEditor *setting_info; - if (get_type == NMC_PROPERTY_GET_PARSABLE) - return g_strdup_printf ("%u", flags); + meta_setting_info = nm_meta_setting_infos_by_gtype (gtype); - if (flags == 0) - return g_strdup (_("0 (NONE)")); + if (!meta_setting_info) + return NULL; - flag_str = g_string_new (NULL); - g_string_printf (flag_str, "%d (", flags); + g_return_val_if_fail (meta_setting_info->get_setting_gtype, NULL); + g_return_val_if_fail (meta_setting_info->get_setting_gtype () == gtype, NULL); - if (flags & NM_VLAN_FLAG_REORDER_HEADERS) - g_string_append (flag_str, _("REORDER_HEADERS, ")); - if (flags & NM_VLAN_FLAG_GVRP) - g_string_append (flag_str, _("GVRP, ")); - if (flags & NM_VLAN_FLAG_LOOSE_BINDING) - g_string_append (flag_str, _("LOOSE_BINDING, ")); - if (flags & NM_VLAN_FLAG_MVRP) - g_string_append (flag_str, _("MVRP, ")); + if (meta_setting_info->meta_type >= G_N_ELEMENTS (nm_meta_setting_infos_editor)) + return NULL; - if (flag_str->str[flag_str->len-1] == '(') - g_string_append (flag_str, _("unknown")); - else - g_string_truncate (flag_str, flag_str->len-2); /* chop off trailing ', ' */ + setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type]; - g_string_append_c (flag_str, ')'); + g_return_val_if_fail (setting_info->general == meta_setting_info, NULL); - return g_string_free (flag_str, FALSE); + return setting_info; } -static char * -vlan_priorities_to_string (NMSettingVlan *s_vlan, NMVlanPriorityMap map) +static const NMMetaSettingInfoEditor * +_meta_find_setting_info_by_setting (NMSetting *setting) { - GString *priorities; - int i; + const NMMetaSettingInfoEditor *setting_info; - priorities = g_string_new (NULL); - for (i = 0; i < nm_setting_vlan_get_num_priorities (s_vlan, map); i++) { - guint32 from, to; + g_return_val_if_fail (NM_IS_SETTING (setting), NULL); - if (nm_setting_vlan_get_priority (s_vlan, map, i, &from, &to)) - g_string_append_printf (priorities, "%d:%d,", from, to); - } - if (priorities->len) - g_string_truncate (priorities, priorities->len-1); /* chop off trailing ',' */ + setting_info = _meta_find_setting_info_by_gtype (G_OBJECT_TYPE (setting)); - return g_string_free (priorities, FALSE); + if (!setting_info) + return NULL; + + g_return_val_if_fail (setting_info == _meta_find_setting_info_by_name (nm_setting_get_name (setting)), NULL); + + return setting_info; } -static char * -ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy, NmcPropertyGetType get_type) +static const NMMetaPropertyInfo * +_meta_setting_info_find_property_info (const NMMetaSettingInfoEditor *setting_info, const char *property_name) { - if (get_type == NMC_PROPERTY_GET_PARSABLE) - return g_strdup_printf ("%d", ip6_privacy); - - switch (ip6_privacy) { - case NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED: - return g_strdup_printf (_("%d (disabled)"), ip6_privacy); - case NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR: - return g_strdup_printf (_("%d (enabled, prefer public IP)"), ip6_privacy); - case NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR: - return g_strdup_printf (_("%d (enabled, prefer temporary IP)"), ip6_privacy); - default: - return g_strdup_printf (_("%d (unknown)"), ip6_privacy); - } -} - -static char * -autoconnect_slaves_to_string (NMSettingConnectionAutoconnectSlaves autoconnect_slaves, - NmcPropertyGetType get_type) -{ - if (get_type == NMC_PROPERTY_GET_PARSABLE) - return g_strdup_printf ("%d", autoconnect_slaves); - - switch (autoconnect_slaves) { - case NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO: - return g_strdup_printf (_("%d (no)"), autoconnect_slaves); - case NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES: - return g_strdup_printf (_("%d (yes)"), autoconnect_slaves); - case NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT: - default: - return g_strdup_printf (_("%d (default)"), autoconnect_slaves); - } -} - -static char * -secret_flags_to_string (guint32 flags, NmcPropertyGetType get_type) -{ - GString *flag_str; - - if (get_type == NMC_PROPERTY_GET_PARSABLE) - return g_strdup_printf ("%u", flags); - - if (flags == 0) - return g_strdup (_("0 (none)")); - - flag_str = g_string_new (NULL); - g_string_printf (flag_str, "%u (", flags); - - if (flags & NM_SETTING_SECRET_FLAG_AGENT_OWNED) - g_string_append (flag_str, _("agent-owned, ")); - if (flags & NM_SETTING_SECRET_FLAG_NOT_SAVED) - g_string_append (flag_str, _("not saved, ")); - if (flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED) - g_string_append (flag_str, _("not required, ")); - - if (flag_str->str[flag_str->len-1] == '(') - g_string_append (flag_str, _("unknown")); - else - g_string_truncate (flag_str, flag_str->len-2); /* chop off trailing ', ' */ - - g_string_append_c (flag_str, ')'); - - return g_string_free (flag_str, FALSE); -} - -static void -vpn_data_item (const char *key, const char *value, gpointer user_data) -{ - GString *ret_str = (GString *) user_data; - - if (ret_str->len != 0) - g_string_append (ret_str, ", "); - - g_string_append_printf (ret_str, "%s = %s", key, value); -} - - -/* generic helper macros for property functions */ -#define DEFINE_GETTER(func_name, property_name) \ - static char * \ - func_name (NMSetting *setting, NmcPropertyGetType get_type) \ - { \ - char *s; \ - GValue val = G_VALUE_INIT; \ - g_value_init (&val, G_TYPE_STRING); \ - g_object_get_property (G_OBJECT (setting), property_name, &val); \ - s = g_value_dup_string (&val); \ - g_value_unset (&val); \ - return s; \ - } - -#define DEFINE_GETTER_WITH_DEFAULT(func_name, property_name, check_is_default) \ - static char * \ - func_name (NMSetting *setting, NmcPropertyGetType get_type) \ - { \ - const char *s; \ - char *s_full; \ - GValue val = G_VALUE_INIT; \ - \ - if ((check_is_default)) { \ - if (get_type == NMC_PROPERTY_GET_PARSABLE) \ - return g_strdup (""); \ - return g_strdup (_("(default)")); \ - } \ - \ - g_value_init (&val, G_TYPE_STRING); \ - g_object_get_property (G_OBJECT (setting), property_name, &val); \ - s = g_value_get_string (&val); \ - if (get_type == NMC_PROPERTY_GET_PARSABLE) \ - s_full = g_strdup (s && *s ? s : " "); \ - else \ - s_full = s ? g_strdup_printf ("\"%s\"", s) : g_strdup (""); \ - g_value_unset (&val); \ - return s_full; \ - } - -#define DEFINE_SECRET_FLAGS_GETTER(func_name, property_name) \ - static char * \ - func_name (NMSetting *setting, NmcPropertyGetType get_type) \ - { \ - guint v; \ - GValue val = G_VALUE_INIT; \ - g_value_init (&val, G_TYPE_UINT); \ - g_object_get_property (G_OBJECT (setting), property_name, &val); \ - v = g_value_get_uint (&val); \ - g_value_unset (&val); \ - return secret_flags_to_string (v, get_type); \ - } - -#define DEFINE_SETTER_STR_LIST_MULTI(def_func, s_macro, set_func) \ - static gboolean \ - def_func (NMSetting *setting, \ - const char *prop, \ - const char *val, \ - const char **valid_strv, \ - GError **error) \ - { \ - char **strv = NULL, **iter; \ - const char *item; \ - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); \ - strv = nmc_strsplit_set (val, " \t,", 0); \ - for (iter = strv; iter && *iter; iter++) { \ - if (!(item = nmc_string_is_valid (g_strstrip (*iter), valid_strv, error))) { \ - g_strfreev (strv); \ - return FALSE; \ - } \ - set_func (s_macro (setting), item); \ - } \ - g_strfreev (strv); \ - return TRUE; \ - } - -#define DEFINE_SETTER_OPTIONS(def_func, s_macro, s_type, add_func, valid_func1, valid_func2) \ - static gboolean \ - def_func (NMSetting *setting, const char *prop, const char *val, GError **error) \ - { \ - char **strv = NULL, **iter; \ - const char **(*valid_func1_p) (s_type *) = valid_func1; \ - const char * (*valid_func2_p) (const char *, const char *, GError **) = valid_func2; \ - const char *opt_name, *opt_val; \ - \ - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); \ - \ - strv = nmc_strsplit_set (val, ",", 0); \ - for (iter = strv; iter && *iter; iter++) { \ - char *left = g_strstrip (*iter); \ - char *right = strchr (left, '='); \ - if (!right) { \ - g_set_error (error, 1, 0, _("'%s' is not valid; use