summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-04-06 15:14:23 +0200
committerThomas Haller <thaller@redhat.com>2017-04-12 14:00:00 +0200
commit41b31051f2b99535dfeac064f718c51fd7941d05 (patch)
tree320481eb2b97432e31c039ce77f9c83ec21a7d72
parentc5c48d4f5f4a071a31198cd43a8a7355e5d3e782 (diff)
downloadNetworkManager-41b31051f2b99535dfeac064f718c51fd7941d05.tar.gz
cli: use nmc_print() to output device's IP4 info
The IP4 info adds a new type: to expose strv arguments for addresses, etc.
-rw-r--r--clients/cli/common.c205
-rw-r--r--clients/cli/common.h4
-rw-r--r--clients/cli/connections.c4
-rw-r--r--clients/cli/devices.c4
-rw-r--r--clients/cli/general.c27
-rw-r--r--clients/cli/nmcli.c2
-rw-r--r--clients/cli/utils.c284
-rw-r--r--clients/cli/utils.h20
-rw-r--r--clients/common/nm-meta-setting-access.c9
-rw-r--r--clients/common/nm-meta-setting-access.h3
-rw-r--r--clients/common/nm-meta-setting-desc.c10
-rw-r--r--clients/common/nm-meta-setting-desc.h11
-rw-r--r--clients/common/tests/test-general.c9
13 files changed, 385 insertions, 207 deletions
diff --git a/clients/cli/common.c b/clients/cli/common.c
index 6209b15d8f..8738cef7b6 100644
--- a/clients/cli/common.c
+++ b/clients/cli/common.c
@@ -36,17 +36,122 @@
#include "utils.h"
-const NmcMetaGenericInfo *const nmc_fields_ip4_config[] = {
- NMC_META_GENERIC ("GROUP"), /* 0 */
- NMC_META_GENERIC ("ADDRESS"), /* 1 */
- NMC_META_GENERIC ("GATEWAY"), /* 2 */
- NMC_META_GENERIC ("ROUTE"), /* 3 */
- NMC_META_GENERIC ("DNS"), /* 4 */
- NMC_META_GENERIC ("DOMAIN"), /* 5 */
- NMC_META_GENERIC ("WINS"), /* 6 */
+/*****************************************************************************/
+
+static gconstpointer
+_metagen_ip4_config_get_fcn (const NMMetaEnvironment *environment,
+ gpointer environment_user_data,
+ const NmcMetaGenericInfo *info,
+ gpointer target,
+ NMMetaAccessorGetType get_type,
+ NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
+ gpointer *out_to_free)
+{
+ NMIPConfig *cfg4 = target;
+ GPtrArray *ptr_array;
+ char **arr;
+ const char *const*arrc;
+ guint i = 0;
+
+ nm_assert (info->info_type < _NMC_GENERIC_INFO_TYPE_IP4_CONFIG_NUM);
+
+ NMC_HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
+
+ switch (info->info_type) {
+ case NMC_GENERIC_INFO_TYPE_IP4_CONFIG_ADDRESS:
+ if (!NM_FLAGS_HAS (get_flags, NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV))
+ return NULL;
+ ptr_array = nm_ip_config_get_addresses (cfg4);
+ if (ptr_array) {
+ arr = g_new (char *, ptr_array->len + 1);
+ for (i = 0; i < ptr_array->len; i++) {
+ NMIPAddress *addr = g_ptr_array_index (ptr_array, i);
+
+ arr[i] = g_strdup_printf ("%s/%u",
+ nm_ip_address_get_address (addr),
+ nm_ip_address_get_prefix (addr));
+ }
+ arr[i] = NULL;
+ } else
+ arr = NULL;
+ goto arr_out;
+ case NMC_GENERIC_INFO_TYPE_IP4_CONFIG_GATEWAY:
+ return nm_ip_config_get_gateway (cfg4);
+ case NMC_GENERIC_INFO_TYPE_IP4_CONFIG_ROUTE:
+ if (!NM_FLAGS_HAS (get_flags, NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV))
+ return NULL;
+ ptr_array = nm_ip_config_get_routes (cfg4);
+ if (ptr_array) {
+ arr = g_new (char *, ptr_array->len + 1);
+ for (i = 0; i < ptr_array->len; i++) {
+ NMIPRoute *route = g_ptr_array_index (ptr_array, i);
+ const char *next_hop;
+
+ next_hop = nm_ip_route_get_next_hop (route);
+ if (!next_hop)
+ next_hop = "0.0.0.0";
+
+ arr[i] = g_strdup_printf ("dst = %s/%u, nh = %s%c mt = %u",
+ nm_ip_route_get_dest (route),
+ nm_ip_route_get_prefix (route),
+ next_hop,
+ nm_ip_route_get_metric (route) == -1 ? '\0' : ',',
+ (guint32) nm_ip_route_get_metric (route));
+ }
+ arr[i] = NULL;
+ } else
+ arr = NULL;
+ goto arr_out;
+ case NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DNS:
+ if (!NM_FLAGS_HAS (get_flags, NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV))
+ return NULL;
+ arrc = nm_ip_config_get_nameservers (cfg4);
+ goto arrc_out;
+ case NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DOMAIN:
+ if (!NM_FLAGS_HAS (get_flags, NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV))
+ return NULL;
+ arrc = nm_ip_config_get_domains (cfg4);
+ goto arrc_out;
+ case NMC_GENERIC_INFO_TYPE_IP4_CONFIG_WINS:
+ if (!NM_FLAGS_HAS (get_flags, NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV))
+ return NULL;
+ arrc = nm_ip_config_get_wins_servers (cfg4);
+ goto arrc_out;
+ default:
+ break;
+ }
+
+ g_return_val_if_reached (NULL);
+
+arrc_out:
+ *out_flags |= NM_META_ACCESSOR_GET_OUT_FLAGS_STRV;
+ return arrc;
+
+arr_out:
+ *out_flags |= NM_META_ACCESSOR_GET_OUT_FLAGS_STRV;
+ *out_to_free = arr;
+ return arr;
+}
+
+const NmcMetaGenericInfo *const metagen_ip4_config[_NMC_GENERIC_INFO_TYPE_IP4_CONFIG_NUM + 1] = {
+#define _METAGEN_IP4_CONFIG(type, name) \
+ [type] = NMC_META_GENERIC(name, .info_type = type, .get_fcn = _metagen_ip4_config_get_fcn)
+ _METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_ADDRESS, "ADDRESS"),
+ _METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_GATEWAY, "GATEWAY"),
+ _METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_ROUTE, "ROUTE"),
+ _METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DNS, "DNS"),
+ _METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DOMAIN, "DOMAIN"),
+ _METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_WINS, "WINS"),
+};
+
+static const NmcMetaGenericInfo *const metagen_ip4_config_group[] = {
+ NMC_META_GENERIC_WITH_NESTED ("IP4", metagen_ip4_config, .name_header = N_("GROUP")),
NULL,
};
+/*****************************************************************************/
+
const NmcMetaGenericInfo *const nmc_fields_dhcp4_config[] = {
NMC_META_GENERIC ("GROUP"), /* 0 */
NMC_META_GENERIC ("OPTION"), /* 1 */
@@ -72,87 +177,25 @@ const NmcMetaGenericInfo *const nmc_fields_dhcp6_config[] = {
gboolean
print_ip4_config (NMIPConfig *cfg4,
const NmcConfig *nmc_config,
- const char *group_prefix,
const char *one_field)
{
- GPtrArray *ptr_array;
- char **addr_arr = NULL;
- char **route_arr = NULL;
- char **dns_arr = NULL;
- char **domain_arr = NULL;
- char **wins_arr = NULL;
- int i = 0;
- const NMMetaAbstractInfo *const*tmpl;
- NmcOutputField *arr;
- NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
+ gs_free_error GError *error = NULL;
+ gs_free char *field_str = NULL;
if (cfg4 == NULL)
return FALSE;
- tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_ip4_config;
- out_indices = parse_output_fields (one_field,
- tmpl, FALSE, NULL, NULL);
- arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
- g_ptr_array_add (out.output_data, arr);
-
- /* addresses */
- ptr_array = nm_ip_config_get_addresses (cfg4);
- if (ptr_array) {
- addr_arr = g_new (char *, ptr_array->len + 1);
- for (i = 0; i < ptr_array->len; i++) {
- NMIPAddress *addr = (NMIPAddress *) g_ptr_array_index (ptr_array, i);
+ if (one_field)
+ field_str = g_strdup_printf ("IP4.%s", one_field);
- addr_arr[i] = g_strdup_printf ("%s/%u",
- nm_ip_address_get_address (addr),
- nm_ip_address_get_prefix (addr));
- }
- addr_arr[i] = NULL;
- }
-
- /* routes */
- ptr_array = nm_ip_config_get_routes (cfg4);
- if (ptr_array) {
- route_arr = g_new (char *, ptr_array->len + 1);
- for (i = 0; i < ptr_array->len; i++) {
- NMIPRoute *route = (NMIPRoute *) g_ptr_array_index (ptr_array, i);
- const char *next_hop;
-
- next_hop = nm_ip_route_get_next_hop (route);
- if (!next_hop)
- next_hop = "0.0.0.0";
-
- route_arr[i] = g_strdup_printf ("dst = %s/%u, nh = %s%c mt = %u",
- nm_ip_route_get_dest (route),
- nm_ip_route_get_prefix (route),
- next_hop,
- nm_ip_route_get_metric (route) == -1 ? '\0' : ',',
- (guint32) nm_ip_route_get_metric (route));
- }
- route_arr[i] = NULL;
+ if (!nmc_print (nmc_config,
+ (gpointer[]) { cfg4, NULL },
+ NULL,
+ (const NMMetaAbstractInfo *const*) metagen_ip4_config_group,
+ field_str,
+ &error)) {
+ return FALSE;
}
-
- /* DNS */
- dns_arr = g_strdupv ((char **) nm_ip_config_get_nameservers (cfg4));
-
- /* domains */
- domain_arr = g_strdupv ((char **) nm_ip_config_get_domains (cfg4));
-
- /* WINS */
- wins_arr = g_strdupv ((char **) nm_ip_config_get_wins_servers (cfg4));
-
- arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
- set_val_strc (arr, 0, group_prefix);
- set_val_arr (arr, 1, addr_arr);
- set_val_strc (arr, 2, nm_ip_config_get_gateway (cfg4));
- set_val_arr (arr, 3, route_arr);
- 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 (out.output_data, arr);
-
- print_data_prepare_width (out.output_data);
- print_data (nmc_config, out_indices, NULL, 0, &out);
-
return TRUE;
}
diff --git a/clients/cli/common.h b/clients/cli/common.h
index 2534c4f73f..4f0f1b1ddb 100644
--- a/clients/cli/common.h
+++ b/clients/cli/common.h
@@ -25,7 +25,7 @@
#include "nmcli.h"
#include "nm-secret-agent-simple.h"
-gboolean print_ip4_config (NMIPConfig *cfg4, const NmcConfig *nmc_config, const char *group_prefix, const char *one_field);
+gboolean print_ip4_config (NMIPConfig *cfg4, const NmcConfig *nmc_config, 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);
@@ -80,7 +80,7 @@ void nmc_complete_bool (const char *prefix);
const char *nmc_error_get_simple_message (GError *error);
-extern const NmcMetaGenericInfo *const nmc_fields_ip4_config[];
+extern const NmcMetaGenericInfo *const metagen_ip4_config[];
extern const NmcMetaGenericInfo *const nmc_fields_dhcp4_config[];
extern const NmcMetaGenericInfo *const nmc_fields_ip6_config[];
extern const NmcMetaGenericInfo *const nmc_fields_dhcp6_config[];
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index c0661c9c41..e842d2ba12 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -213,7 +213,7 @@ const NmcMetaGenericInfo *const nmc_fields_con_active_details_vpn[] = {
const NmcMetaGenericInfo *const nmc_fields_con_active_details_groups[] = {
NMC_META_GENERIC_WITH_NESTED ("GENERAL", nmc_fields_con_active_details_general + 1), /* 0 */
- NMC_META_GENERIC_WITH_NESTED ("IP4", nmc_fields_ip4_config + 1), /* 1 */
+ NMC_META_GENERIC_WITH_NESTED ("IP4", metagen_ip4_config), /* 1 */
NMC_META_GENERIC_WITH_NESTED ("DHCP4", nmc_fields_dhcp4_config + 1), /* 2 */
NMC_META_GENERIC_WITH_NESTED ("IP6", nmc_fields_ip6_config + 1), /* 3 */
NMC_META_GENERIC_WITH_NESTED ("DHCP6", nmc_fields_dhcp6_config + 1), /* 4 */
@@ -1215,7 +1215,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->nmc_config, "IP4", group_fld);
+ b1 = print_ip4_config (cfg4, &nmc->nmc_config, group_fld);
was_output = was_output || b1;
}
diff --git a/clients/cli/devices.c b/clients/cli/devices.c
index 8d8457520a..da5650f45e 100644
--- a/clients/cli/devices.c
+++ b/clients/cli/devices.c
@@ -208,7 +208,7 @@ const NmcMetaGenericInfo *const nmc_fields_dev_show_sections[] = {
NMC_META_GENERIC_WITH_NESTED ("WIRED-PROPERTIES", nmc_fields_dev_show_wired_prop + 1), /* 4 */
NMC_META_GENERIC_WITH_NESTED ("WIMAX-PROPERTIES", nmc_fields_dev_show_wimax_prop + 1), /* 5 */
NMC_META_GENERIC_WITH_NESTED ("NSP", nmc_fields_dev_wimax_list + 1), /* 6 */
- NMC_META_GENERIC_WITH_NESTED ("IP4", nmc_fields_ip4_config + 1), /* 7 */
+ NMC_META_GENERIC_WITH_NESTED ("IP4", metagen_ip4_config), /* 7 */
NMC_META_GENERIC_WITH_NESTED ("DHCP4", nmc_fields_dhcp4_config + 1), /* 8 */
NMC_META_GENERIC_WITH_NESTED ("IP6", nmc_fields_ip6_config + 1), /* 9 */
NMC_META_GENERIC_WITH_NESTED ("DHCP6", nmc_fields_dhcp6_config + 1), /* 10 */
@@ -1269,7 +1269,7 @@ 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_config, nmc_fields_dev_show_sections[7]->name, section_fld);
+ was_output = print_ip4_config (cfg4, &nmc->nmc_config, section_fld);
/* DHCP4 */
if (dhcp4 && !strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[8]->name))
diff --git a/clients/cli/general.c b/clients/cli/general.c
index 1a32086e08..84c853aef0 100644
--- a/clients/cli/general.c
+++ b/clients/cli/general.c
@@ -161,12 +161,6 @@ _NM_UTILS_LOOKUP_DEFINE (static, permission_result_to_color, NMClientPermissionR
NM_UTILS_LOOKUP_ITEM_IGNORE (NM_CLIENT_PERMISSION_RESULT_UNKNOWN),
);
-#define HANDLE_TERMFORMAT(color) \
- G_STMT_START { \
- if (get_type == NM_META_ACCESSOR_GET_TYPE_TERMFORMAT) \
- return nm_meta_termformat_pack ((color), NM_META_TERM_FORMAT_NORMAL); \
- } G_STMT_END
-
/*****************************************************************************/
static const NmcMetaGenericInfo *const metagen_general_status[];
@@ -178,6 +172,7 @@ _metagen_general_status_get_fcn (const NMMetaEnvironment *environment,
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free)
{
NmCli *nmc = target;
@@ -188,26 +183,26 @@ _metagen_general_status_get_fcn (const NMMetaEnvironment *environment,
switch (info->info_type) {
case NMC_GENERIC_INFO_TYPE_GENERAL_STATUS_RUNNING:
- HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
+ NMC_HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
value = N_("running");
goto translate_and_out;
case NMC_GENERIC_INFO_TYPE_GENERAL_STATUS_VERSION:
- HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
+ NMC_HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
value = nm_client_get_version (nmc->client);
goto clone_and_out;
case NMC_GENERIC_INFO_TYPE_GENERAL_STATUS_STATE:
state = nm_client_get_state (nmc->client);
- HANDLE_TERMFORMAT (state_to_color (state));
+ NMC_HANDLE_TERMFORMAT (state_to_color (state));
value = nm_state_to_string_no_l10n (state);
goto translate_and_out;
case NMC_GENERIC_INFO_TYPE_GENERAL_STATUS_STARTUP:
v_bool = nm_client_get_startup (nmc->client);
- HANDLE_TERMFORMAT (v_bool ? NM_META_TERM_COLOR_YELLOW : NM_META_TERM_COLOR_GREEN);
+ NMC_HANDLE_TERMFORMAT (v_bool ? NM_META_TERM_COLOR_YELLOW : NM_META_TERM_COLOR_GREEN);
value = v_bool ? N_("starting") : N_("started");
goto translate_and_out;
case NMC_GENERIC_INFO_TYPE_GENERAL_STATUS_CONNECTIVITY:
connectivity = nm_client_get_connectivity (nmc->client);
- HANDLE_TERMFORMAT (connectivity_to_color (connectivity));
+ NMC_HANDLE_TERMFORMAT (connectivity_to_color (connectivity));
value = nm_connectivity_to_string_no_l10n (connectivity);
goto translate_and_out;
case NMC_GENERIC_INFO_TYPE_GENERAL_STATUS_NETWORKING:
@@ -236,7 +231,7 @@ _metagen_general_status_get_fcn (const NMMetaEnvironment *environment,
g_return_val_if_reached (NULL);
enabled_out:
- HANDLE_TERMFORMAT (v_bool ? NM_META_TERM_COLOR_GREEN : NM_META_TERM_COLOR_RED);
+ NMC_HANDLE_TERMFORMAT (v_bool ? NM_META_TERM_COLOR_GREEN : NM_META_TERM_COLOR_RED);
value = v_bool ? N_("enabled") : N_("disabled");
goto translate_and_out;
@@ -284,6 +279,7 @@ _metagen_general_permissions_get_fcn (const NMMetaEnvironment *environment,
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free)
{
NMClientPermission perm = GPOINTER_TO_UINT (target);
@@ -293,11 +289,11 @@ _metagen_general_permissions_get_fcn (const NMMetaEnvironment *environment,
switch (info->info_type) {
case NMC_GENERIC_INFO_TYPE_GENERAL_PERMISSIONS_PERMISSION:
- HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
+ NMC_HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
return permission_to_string (perm);
case NMC_GENERIC_INFO_TYPE_GENERAL_PERMISSIONS_VALUE:
perm_result = nm_client_get_permission_result (nmc->client, perm);
- HANDLE_TERMFORMAT (permission_result_to_color (perm_result));
+ NMC_HANDLE_TERMFORMAT (permission_result_to_color (perm_result));
s = permission_result_to_string_no_l10n (perm_result);
if (get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
return _(s);
@@ -331,6 +327,7 @@ _metagen_general_logging_get_fcn (const NMMetaEnvironment *environment,
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free)
{
NmCli *nmc = environment_user_data;
@@ -338,7 +335,7 @@ _metagen_general_logging_get_fcn (const NMMetaEnvironment *environment,
nm_assert (info->info_type < _NMC_GENERIC_INFO_TYPE_GENERAL_LOGGING_NUM);
- HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
+ NMC_HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
if (!d->initialized) {
d->initialized = TRUE;
diff --git a/clients/cli/nmcli.c b/clients/cli/nmcli.c
index df1c59810c..4420291719 100644
--- a/clients/cli/nmcli.c
+++ b/clients/cli/nmcli.c
@@ -117,7 +117,7 @@ complete_fields (const char *prefix)
h = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
- complete_field (h, nmc_fields_ip4_config);
+ complete_field (h, metagen_ip4_config);
complete_field (h, nmc_fields_dhcp4_config);
complete_field (h, nmc_fields_ip6_config);
complete_field (h, nmc_fields_dhcp6_config);
diff --git a/clients/cli/utils.c b/clients/cli/utils.c
index fab1cc0fb1..b98d8d19cb 100644
--- a/clients/cli/utils.c
+++ b/clients/cli/utils.c
@@ -41,9 +41,13 @@
/*****************************************************************************/
static const char *
-_meta_type_nmc_generic_info_get_name (const NMMetaAbstractInfo *abstract_info)
+_meta_type_nmc_generic_info_get_name (const NMMetaAbstractInfo *abstract_info, gboolean for_header)
{
- return ((const NmcMetaGenericInfo *) abstract_info)->name;
+ const NmcMetaGenericInfo *info = (const NmcMetaGenericInfo *) abstract_info;
+
+ if (for_header)
+ return info->name_header ?: info->name;
+ return info->name;
}
static const NMMetaAbstractInfo *const*
@@ -75,14 +79,14 @@ _meta_type_nmc_generic_info_get_fcn (const NMMetaEnvironment *environment,
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free)
{
const NmcMetaGenericInfo *info = (const NmcMetaGenericInfo *) abstract_info;
nm_assert (!out_to_free || !*out_to_free);
+ nm_assert (out_flags && !*out_flags);
- if (!info->get_fcn)
- g_return_val_if_reached (NULL);
if (!NM_IN_SET (get_type,
NM_META_ACCESSOR_GET_TYPE_PARSABLE,
NM_META_ACCESSOR_GET_TYPE_PRETTY,
@@ -92,10 +96,26 @@ _meta_type_nmc_generic_info_get_fcn (const NMMetaEnvironment *environment,
/* omitting the out_to_free value is only allowed for TERMFORMAT. */
nm_assert (out_to_free || NM_IN_SET (get_type, NM_META_ACCESSOR_GET_TYPE_TERMFORMAT));
- return info->get_fcn (environment, environment_user_data,
- info, target,
- get_type, get_flags,
- out_to_free);
+ if (info->get_fcn) {
+ return info->get_fcn (environment, environment_user_data,
+ info, target,
+ get_type,
+ get_flags,
+ out_flags,
+ out_to_free);
+ }
+
+ if (info->nested) {
+ const char *s;
+
+ NMC_HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
+ s = info->name;
+ if (get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
+ return _(s);
+ return s;
+ }
+
+ g_return_val_if_reached (NULL);
}
const NMMetaType nmc_meta_type_generic_info = {
@@ -823,7 +843,7 @@ _output_selection_select_one (const NMMetaAbstractInfo *const* fields_array,
for (i = 0; fields_array[i]; i++) {
const NMMetaAbstractInfo *fi = fields_array[i];
- if (g_ascii_strcasecmp (i_name, nm_meta_abstract_info_get_name (fi)) != 0)
+ if (g_ascii_strcasecmp (i_name, nm_meta_abstract_info_get_name (fi, FALSE)) != 0)
continue;
if (!right || !validate_nested) {
@@ -844,7 +864,7 @@ _output_selection_select_one (const NMMetaAbstractInfo *const* fields_array,
const NmcMetaGenericInfo *fi_g = (const NmcMetaGenericInfo *) fi;
for (j = 0; fi_g->nested && fi_g->nested[j]; j++) {
- if (g_ascii_strcasecmp (right, nm_meta_abstract_info_get_name ((const NMMetaAbstractInfo *) fi_g->nested[j])) == 0) {
+ if (g_ascii_strcasecmp (right, nm_meta_abstract_info_get_name ((const NMMetaAbstractInfo *) fi_g->nested[j], FALSE)) == 0) {
found = TRUE;
break;
}
@@ -869,7 +889,7 @@ not_found:
if (fields_prefix) {
p = g_strdup_printf ("%s.%s", fields_prefix,
- nm_meta_abstract_info_get_name (fields_array_failure));
+ nm_meta_abstract_info_get_name (fields_array_failure, FALSE));
}
allowed_fields = nmc_get_allowed_fields_nested (fields_array_failure, p);
} else
@@ -1038,7 +1058,9 @@ _output_selection_append (GArray *cols,
return FALSE;
}
- if (selection_item->info->meta_type != &nm_meta_type_setting_info_editor)
+ if (!NM_IN_SET(selection_item->info->meta_type,
+ &nm_meta_type_setting_info_editor,
+ &nmc_meta_type_generic_info))
g_array_index (cols, PrintDataCol, col_idx).is_leaf = FALSE;
}
@@ -1216,11 +1238,11 @@ nmc_get_allowed_fields_nested (const NMMetaAbstractInfo *abstract_info, const ch
allowed_fields = g_string_sized_new (256);
if (!name_prefix)
- name_prefix = nm_meta_abstract_info_get_name (abstract_info);
+ name_prefix = nm_meta_abstract_info_get_name (abstract_info, FALSE);
for (i = 0; nested[i]; i++) {
g_string_append_printf (allowed_fields, "%s.%s,",
- name_prefix, nm_meta_abstract_info_get_name (nested[i]));
+ name_prefix, nm_meta_abstract_info_get_name (nested[i], FALSE));
}
g_string_truncate (allowed_fields, allowed_fields->len - 1);
return g_string_free (allowed_fields, FALSE);
@@ -1239,7 +1261,7 @@ nmc_get_allowed_fields (const NMMetaAbstractInfo *const*fields_array, const char
for (i = 0; fields_array[i]; i++) {
if (name_prefix)
g_string_append_printf (allowed_fields, "%s.", name_prefix);
- g_string_append_printf (allowed_fields, "%s,", nm_meta_abstract_info_get_name (fields_array[i]));
+ g_string_append_printf (allowed_fields, "%s,", nm_meta_abstract_info_get_name (fields_array[i], FALSE));
}
g_string_truncate (allowed_fields, allowed_fields->len - 1);
return g_string_free (allowed_fields, FALSE);
@@ -1282,18 +1304,26 @@ nmc_empty_output_fields (NmcOutputData *output_data)
typedef struct {
guint col_idx;
const PrintDataCol *col;
- bool is_nested;
const char *title;
bool title_to_free:1;
int width;
} PrintDataHeaderCell;
+typedef enum {
+ PRINT_DATA_CELL_FORMAT_TYPE_PLAIN = 0,
+ PRINT_DATA_CELL_FORMAT_TYPE_STRV,
+} PrintDataCellFormatType;
+
typedef struct {
guint row_idx;
const PrintDataHeaderCell *header_cell;
NMMetaTermColor term_color;
NMMetaTermFormat term_format;
- const char *text;
+ union {
+ const char *plain;
+ const char *const*strv;
+ } text;
+ PrintDataCellFormatType text_format:3;
bool text_to_free:1;
} PrintDataCell;
@@ -1313,10 +1343,17 @@ static void
_print_data_cell_clear_text (PrintDataCell *cell)
{
if (cell->text_to_free) {
- g_free ((char *) cell->text);
+ switch (cell->text_format) {
+ case PRINT_DATA_CELL_FORMAT_TYPE_PLAIN:
+ g_free ((char *) cell->text.plain);
+ break;
+ case PRINT_DATA_CELL_FORMAT_TYPE_STRV:
+ g_strfreev ((char **) cell->text.strv);
+ break;
+ };
cell->text_to_free = FALSE;
}
- cell->text = NULL;
+ memset (&cell->text, 0, sizeof (cell->text));
}
static void
@@ -1368,25 +1405,23 @@ _print_fill (const NmcConfig *nmc_config,
header_cell->col_idx = col_idx;
header_cell->col = col;
- header_cell->is_nested = FALSE;
translate_title = pretty;
- if (info->meta_type == &nm_meta_type_property_info) {
- header_cell->title = nm_meta_abstract_info_get_name (info);
- if (nmc_config->multiline_output) {
- header_cell->title = g_strdup_printf ("%s.%s",
- ((const NMMetaPropertyInfo *) info)->setting_info->general->setting_name,
- header_cell->title);
- header_cell->title_to_free = TRUE;
- }
- } else if (info->meta_type == &nm_meta_type_setting_info_editor)
- header_cell->title = N_("name");
- else
- header_cell->title = nm_meta_abstract_info_get_name (info);
-
- if (translate_title)
- header_cell->title = _(header_cell->title);
+ header_cell->title = nm_meta_abstract_info_get_name (info, TRUE);
+ if ( nmc_config->multiline_output
+ && col->parent_idx != PRINT_DATA_COL_PARENT_NIL
+ && NM_IN_SET (info->meta_type,
+ &nm_meta_type_property_info,
+ &nmc_meta_type_generic_info)) {
+ header_cell->title = g_strdup_printf ("%s.%s",
+ nm_meta_abstract_info_get_name (cols[col->parent_idx].selection_item->info, FALSE),
+ header_cell->title);
+ header_cell->title_to_free = TRUE;
+ } else {
+ if (translate_title)
+ header_cell->title = _(header_cell->title);
+ }
}
targets_len = NM_PTRARRAY_LEN (targets);
@@ -1398,7 +1433,7 @@ _print_fill (const NmcConfig *nmc_config,
text_get_type = pretty
? NM_META_ACCESSOR_GET_TYPE_PRETTY
: NM_META_ACCESSOR_GET_TYPE_PARSABLE;
- text_get_flags = NM_META_ACCESSOR_GET_FLAGS_NONE;
+ text_get_flags = NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV;
if (nmc_config->show_secrets)
text_get_flags |= NM_META_ACCESSOR_GET_FLAGS_SHOW_SECRETS;
@@ -1411,20 +1446,40 @@ _print_fill (const NmcConfig *nmc_config,
PrintDataCell *cell = &cells_line[i_col];
const PrintDataHeaderCell *header_cell;
const NMMetaAbstractInfo *info;
+ NMMetaAccessorGetOutFlags text_out_flags, color_out_flags;
+ gconstpointer value;
header_cell = &g_array_index (header_row, PrintDataHeaderCell, i_col);
info = header_cell->col->selection_item->info;
cell->row_idx = i_row;
cell->header_cell = header_cell;
- cell->text = nm_meta_abstract_info_get (info,
- NULL,
- &nm_cli,
- target,
- text_get_type,
- text_get_flags,
- (gpointer *) &to_free);
- cell->text_to_free = !!to_free;
+
+ value = nm_meta_abstract_info_get (info,
+ NULL,
+ &nm_cli,
+ target,
+ text_get_type,
+ text_get_flags,
+ &text_out_flags,
+ (gpointer *) &to_free);
+ if (NM_FLAGS_HAS (text_out_flags, NM_META_ACCESSOR_GET_OUT_FLAGS_STRV)) {
+ if (value) {
+ if (nmc_config->multiline_output) {
+ cell->text_format = PRINT_DATA_CELL_FORMAT_TYPE_STRV;
+ cell->text.strv = value;
+ cell->text_to_free = !!to_free;
+ } else {
+ cell->text.plain = g_strjoinv (" | ", (char **) value);
+ cell->text_to_free = TRUE;
+ if (to_free)
+ g_strfreev ((char **) to_free);
+ }
+ }
+ } else {
+ cell->text.plain = value;
+ cell->text_to_free = !!to_free;
+ }
nm_meta_termformat_unpack (nm_meta_abstract_info_get (info,
NULL,
@@ -1432,15 +1487,18 @@ _print_fill (const NmcConfig *nmc_config,
target,
NM_META_ACCESSOR_GET_TYPE_TERMFORMAT,
NM_META_ACCESSOR_GET_FLAGS_NONE,
+ &color_out_flags,
NULL),
&cell->term_color,
&cell->term_format);
- if (pretty && (!cell->text || !cell->text[0])) {
- _print_data_cell_clear_text (cell);
- cell->text = "--";
- } else if (!cell->text)
- cell->text = "";
+ if (cell->text_format == PRINT_DATA_CELL_FORMAT_TYPE_PLAIN) {
+ if (pretty && (!cell->text.plain|| !cell->text.plain[0])) {
+ _print_data_cell_clear_text (cell);
+ cell->text.plain = "--";
+ } else if (!cell->text.plain)
+ cell->text.plain = "";
+ }
}
}
@@ -1451,12 +1509,22 @@ _print_fill (const NmcConfig *nmc_config,
for (i_row = 0; i_row < targets_len; i_row++) {
const PrintDataCell *cell = &g_array_index (cells, PrintDataCell, i_row * cols_len + i_col);
+ const char *const*i_strv;
- if (header_cell->is_nested) {
- g_assert_not_reached (/*TODO*/);
- } else {
+ switch (cell->text_format) {
+ case PRINT_DATA_CELL_FORMAT_TYPE_PLAIN:
header_cell->width = NM_MAX (header_cell->width,
- nmc_string_screen_width (cell->text, NULL));
+ nmc_string_screen_width (cell->text.plain, NULL));
+ break;
+ case PRINT_DATA_CELL_FORMAT_TYPE_STRV:
+ i_strv = cell->text.strv;
+ if (i_strv) {
+ for (; *i_strv; i_strv++) {
+ header_cell->width = NM_MAX (header_cell->width,
+ nmc_string_screen_width (*i_strv, NULL));
+ }
+ }
+ break;
}
}
@@ -1471,14 +1539,27 @@ static gboolean
_print_skip_column (const NmcConfig *nmc_config,
const PrintDataHeaderCell *header_cell)
{
+ const NmcOutputSelectionItem *selection_item;
+ const NMMetaAbstractInfo *info;
+
+ selection_item = header_cell->col->selection_item;
+ info = selection_item->info;
+
if (nmc_config->multiline_output) {
- if (header_cell->col->selection_item->info->meta_type == &nm_meta_type_setting_info_editor) {
+ if (info->meta_type == &nm_meta_type_setting_info_editor) {
/* we skip the "name" entry for the setting in multiline output. */
return TRUE;
}
+ if ( info->meta_type == &nmc_meta_type_generic_info
+ && ((const NmcMetaGenericInfo *) info)->nested) {
+ /* skip the "name" entry for parent generic-infos */
+ return TRUE;
+ }
} else {
- if ( header_cell->col->selection_item->info->meta_type == &nm_meta_type_setting_info_editor
- && header_cell->col->selection_item->sub_selection) {
+ if ( NM_IN_SET (info->meta_type,
+ &nm_meta_type_setting_info_editor,
+ &nmc_meta_type_generic_info)
+ && selection_item->sub_selection) {
/* in tabular form, we skip the "name" entry for sections that have sub-selections.
* That is, for "ipv4.may-fail", but not for "ipv4". */
return TRUE;
@@ -1568,49 +1649,66 @@ _print_do (const NmcConfig *nmc_config,
for (i_col = 0; i_col < col_len; i_col++) {
const PrintDataCell *cell = &current_line[i_col];
- gs_free char *text_to_free = NULL;
- const char *text;
+ const char *const*lines = NULL;
+ guint i_lines, lines_len;
if (_print_skip_column (nmc_config, cell->header_cell))
continue;
- if (cell->header_cell->is_nested) {
- g_assert_not_reached (/*TODO*/);
- } else {
+ lines_len = 0;
+ switch (cell->text_format) {
+ case PRINT_DATA_CELL_FORMAT_TYPE_PLAIN:
+ lines = &cell->text.plain;
+ lines_len = 1;
+ break;
+ case PRINT_DATA_CELL_FORMAT_TYPE_STRV:
+ nm_assert (multiline);
+ lines = cell->text.strv;
+ lines_len = NM_PTRARRAY_LEN (lines);
+ break;
+ }
+
+ for (i_lines = 0; i_lines < lines_len; i_lines++) {
+ gs_free char *text_to_free = NULL;
+ const char *text;
+
text = colorize_string (nmc_config->use_colors,
cell->term_color, cell->term_format,
- cell->text, &text_to_free);
- }
- if (multiline) {
- gs_free char *prefix = NULL;
+ lines[i_lines], &text_to_free);
+ if (multiline) {
+ gs_free char *prefix = NULL;
- prefix = g_strdup_printf ("%s:", cell->header_cell->title);
- width1 = strlen (prefix);
- width2 = nmc_string_screen_width (prefix, NULL);
- g_print ("%-*s%s\n", (int) (terse ? 0 : ML_VALUE_INDENT+width1-width2), prefix, text);
- } else {
- nm_assert (str);
- if (terse) {
- if (nmc_config->escape_values) {
- const char *p = text;
- while (*p) {
- if (*p == ':' || *p == '\\')
- g_string_append_c (str, '\\'); /* Escaping by '\' */
- g_string_append_c (str, *p);
- p++;
- }
- }
+ if (cell->text_format == PRINT_DATA_CELL_FORMAT_TYPE_STRV)
+ prefix = g_strdup_printf ("%s[%u]:", cell->header_cell->title, i_lines + 1);
else
- g_string_append_printf (str, "%s", text);
- g_string_append_c (str, ':'); /* Column separator */
+ prefix = g_strdup_printf ("%s:", cell->header_cell->title);
+ width1 = strlen (prefix);
+ width2 = nmc_string_screen_width (prefix, NULL);
+ g_print ("%-*s%s\n", (int) (terse ? 0 : ML_VALUE_INDENT+width1-width2), prefix, text);
} else {
- const PrintDataHeaderCell *header_cell = &header_row[i_col];
-
- width1 = strlen (text);
- width2 = nmc_string_screen_width (text, NULL); /* Width of the string (in screen colums) */
- g_string_append_printf (str, "%-*s", (int) (header_cell->width + width1 - width2), text);
- g_string_append_c (str, ' '); /* Column separator */
- table_width += header_cell->width + width1 - width2 + 1;
+ nm_assert (str);
+ if (terse) {
+ if (nmc_config->escape_values) {
+ const char *p = text;
+ while (*p) {
+ if (*p == ':' || *p == '\\')
+ g_string_append_c (str, '\\'); /* Escaping by '\' */
+ g_string_append_c (str, *p);
+ p++;
+ }
+ }
+ else
+ g_string_append_printf (str, "%s", text);
+ g_string_append_c (str, ':'); /* Column separator */
+ } else {
+ const PrintDataHeaderCell *header_cell = &header_row[i_col];
+
+ width1 = strlen (text);
+ width2 = nmc_string_screen_width (text, NULL); /* Width of the string (in screen colums) */
+ g_string_append_printf (str, "%-*s", (int) (header_cell->width + width1 - width2), text);
+ g_string_append_c (str, ' '); /* Column separator */
+ table_width += header_cell->width + width1 - width2 + 1;
+ }
}
}
}
@@ -1685,7 +1783,7 @@ get_value_to_print (NmcColorOption color_option,
nm_assert (out_to_free && !*out_to_free);
if (field_name)
- value = _(nm_meta_abstract_info_get_name (field->info));
+ value = _(nm_meta_abstract_info_get_name (field->info, FALSE));
else {
value = field->value
? (is_array
@@ -1793,7 +1891,7 @@ print_required_fields (const NmcConfig *nmc_config,
tmp = g_strdup_printf ("%s%s%s[%d]:",
section_prefix ? (const char*) field_values[0].value : "",
section_prefix ? "." : "",
- _(nm_meta_abstract_info_get_name (field_values[idx].info)),
+ _(nm_meta_abstract_info_get_name (field_values[idx].info, FALSE)),
j);
width1 = strlen (tmp);
width2 = nmc_string_screen_width (tmp, NULL);
@@ -1814,7 +1912,7 @@ print_required_fields (const NmcConfig *nmc_config,
tmp = g_strdup_printf ("%s%s%s:",
section_prefix ? hdr_name : "",
section_prefix ? "." : "",
- _(nm_meta_abstract_info_get_name (field_values[idx].info)));
+ _(nm_meta_abstract_info_get_name (field_values[idx].info, FALSE)));
width1 = strlen (tmp);
width2 = nmc_string_screen_width (tmp, NULL);
g_print ("%-*s%s\n", (int) (terse ? 0 : ML_VALUE_INDENT+width1-width2), tmp, print_val);
diff --git a/clients/cli/utils.h b/clients/cli/utils.h
index cbed4a16fd..2f8fd0f69c 100644
--- a/clients/cli/utils.h
+++ b/clients/cli/utils.h
@@ -127,12 +127,27 @@ typedef enum {
NMC_GENERIC_INFO_TYPE_GENERAL_LOGGING_DOMAINS,
_NMC_GENERIC_INFO_TYPE_GENERAL_LOGGING_NUM,
+ NMC_GENERIC_INFO_TYPE_IP4_CONFIG_ADDRESS = 0,
+ NMC_GENERIC_INFO_TYPE_IP4_CONFIG_GATEWAY,
+ NMC_GENERIC_INFO_TYPE_IP4_CONFIG_ROUTE,
+ NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DNS,
+ NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DOMAIN,
+ NMC_GENERIC_INFO_TYPE_IP4_CONFIG_WINS,
+ _NMC_GENERIC_INFO_TYPE_IP4_CONFIG_NUM,
+
} NmcGenericInfoType;
+#define NMC_HANDLE_TERMFORMAT(color) \
+ G_STMT_START { \
+ if (get_type == NM_META_ACCESSOR_GET_TYPE_TERMFORMAT) \
+ return nm_meta_termformat_pack ((color), NM_META_TERM_FORMAT_NORMAL); \
+ } G_STMT_END
+
struct _NmcMetaGenericInfo {
const NMMetaType *meta_type;
NmcGenericInfoType info_type;
const char *name;
+ const char *name_header;
const NmcMetaGenericInfo *const*nested;
gconstpointer (*get_fcn) (const NMMetaEnvironment *environment,
gpointer environment_user_data,
@@ -140,6 +155,7 @@ struct _NmcMetaGenericInfo {
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free);
};
@@ -150,8 +166,8 @@ struct _NmcMetaGenericInfo {
__VA_ARGS__ \
}))
-#define NMC_META_GENERIC_WITH_NESTED(n, nest) \
- NMC_META_GENERIC (n, .nested = (nest))
+#define NMC_META_GENERIC_WITH_NESTED(n, nest, ...) \
+ NMC_META_GENERIC (n, .nested = (nest), __VA_ARGS__)
/*****************************************************************************/
diff --git a/clients/common/nm-meta-setting-access.c b/clients/common/nm-meta-setting-access.c
index 5af55b377b..5960c57103 100644
--- a/clients/common/nm-meta-setting-access.c
+++ b/clients/common/nm-meta-setting-access.c
@@ -186,14 +186,14 @@ nm_meta_setting_infos_editor_p (void)
/*****************************************************************************/
const char *
-nm_meta_abstract_info_get_name (const NMMetaAbstractInfo *abstract_info)
+nm_meta_abstract_info_get_name (const NMMetaAbstractInfo *abstract_info, gboolean for_header)
{
const char *n;
nm_assert (abstract_info);
nm_assert (abstract_info->meta_type);
nm_assert (abstract_info->meta_type->get_name);
- n = abstract_info->meta_type->get_name (abstract_info);
+ n = abstract_info->meta_type->get_name (abstract_info, for_header);
nm_assert (n && n[0]);
return n;
}
@@ -231,11 +231,15 @@ nm_meta_abstract_info_get (const NMMetaAbstractInfo *abstract_info,
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free)
{
nm_assert (abstract_info);
nm_assert (abstract_info->meta_type);
nm_assert (!out_to_free || !*out_to_free);
+ nm_assert (out_flags);
+
+ *out_flags = NM_META_ACCESSOR_GET_OUT_FLAGS_NONE;
if (!abstract_info->meta_type->get_fcn)
g_return_val_if_reached (NULL);
@@ -245,5 +249,6 @@ nm_meta_abstract_info_get (const NMMetaAbstractInfo *abstract_info,
target,
get_type,
get_flags,
+ out_flags,
out_to_free);
}
diff --git a/clients/common/nm-meta-setting-access.h b/clients/common/nm-meta-setting-access.h
index 8ed69b29dd..8aec04aced 100644
--- a/clients/common/nm-meta-setting-access.h
+++ b/clients/common/nm-meta-setting-access.h
@@ -44,7 +44,7 @@ const NMMetaSettingInfoEditor *const*nm_meta_setting_infos_editor_p (void);
/*****************************************************************************/
-const char *nm_meta_abstract_info_get_name (const NMMetaAbstractInfo *abstract_info);
+const char *nm_meta_abstract_info_get_name (const NMMetaAbstractInfo *abstract_info, gboolean for_header);
const NMMetaAbstractInfo *const*nm_meta_abstract_info_get_nested (const NMMetaAbstractInfo *abstract_info,
guint *out_len,
@@ -56,6 +56,7 @@ gconstpointer nm_meta_abstract_info_get (const NMMetaAbstractInfo *abstract_info
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free);
/*****************************************************************************/
diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c
index 1ba417a4e0..17246f4c56 100644
--- a/clients/common/nm-meta-setting-desc.c
+++ b/clients/common/nm-meta-setting-desc.c
@@ -6560,13 +6560,15 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
/*****************************************************************************/
static const char *
-_meta_type_setting_info_editor_get_name (const NMMetaAbstractInfo *abstract_info)
+_meta_type_setting_info_editor_get_name (const NMMetaAbstractInfo *abstract_info, gboolean for_header)
{
+ if (for_header)
+ return N_("name");
return ((const NMMetaSettingInfoEditor *) abstract_info)->general->setting_name;
}
static const char *
-_meta_type_property_info_get_name (const NMMetaAbstractInfo *abstract_info)
+_meta_type_property_info_get_name (const NMMetaAbstractInfo *abstract_info, gboolean for_header)
{
return ((const NMMetaPropertyInfo *) abstract_info)->property_name;
}
@@ -6578,11 +6580,13 @@ _meta_type_setting_info_editor_get_fcn (const NMMetaEnvironment *environment,
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free)
{
const NMMetaSettingInfoEditor *info = (const NMMetaSettingInfoEditor *) abstract_info;
nm_assert (!out_to_free || !*out_to_free);
+ nm_assert (out_flags && !*out_flags);
if (!NM_IN_SET (get_type,
NM_META_ACCESSOR_GET_TYPE_PARSABLE,
@@ -6603,11 +6607,13 @@ _meta_type_property_info_get_fcn (const NMMetaEnvironment *environment,
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free)
{
const NMMetaPropertyInfo *info = (const NMMetaPropertyInfo *) abstract_info;
nm_assert (!out_to_free || !*out_to_free);
+ nm_assert (out_flags && !*out_flags);
if (!NM_IN_SET (get_type,
NM_META_ACCESSOR_GET_TYPE_PARSABLE,
diff --git a/clients/common/nm-meta-setting-desc.h b/clients/common/nm-meta-setting-desc.h
index 6f582949f7..46a4376165 100644
--- a/clients/common/nm-meta-setting-desc.h
+++ b/clients/common/nm-meta-setting-desc.h
@@ -80,10 +80,16 @@ nm_meta_termformat_pack (NMMetaTermColor color, NMMetaTermFormat format)
typedef enum {
NM_META_ACCESSOR_GET_FLAGS_NONE = 0,
- NM_META_ACCESSOR_GET_FLAGS_SHOW_SECRETS = (1LL << 0),
+ NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV = (1LL << 0),
+ NM_META_ACCESSOR_GET_FLAGS_SHOW_SECRETS = (1LL << 1),
} NMMetaAccessorGetFlags;
typedef enum {
+ NM_META_ACCESSOR_GET_OUT_FLAGS_NONE = 0,
+ NM_META_ACCESSOR_GET_OUT_FLAGS_STRV = (1LL << 0),
+} NMMetaAccessorGetOutFlags;
+
+typedef enum {
NM_META_PROPERTY_TYP_FLAG_ENUM_GET_PRETTY_NUMERIC = (1LL << 0),
NM_META_PROPERTY_TYP_FLAG_ENUM_GET_PRETTY_NUMERIC_HEX = (1LL << 1),
NM_META_PROPERTY_TYP_FLAG_ENUM_GET_PRETTY_TEXT = (1LL << 2),
@@ -188,7 +194,7 @@ struct _NMMetaSettingInfoEditor {
struct _NMMetaType {
const char *type_name;
- const char *(*get_name) (const NMMetaAbstractInfo *abstract_info);
+ const char *(*get_name) (const NMMetaAbstractInfo *abstract_info, gboolean for_header);
const NMMetaAbstractInfo *const*(*get_nested) (const NMMetaAbstractInfo *abstract_info,
guint *out_len,
gpointer *out_to_free);
@@ -198,6 +204,7 @@ struct _NMMetaType {
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
+ NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free);
};
diff --git a/clients/common/tests/test-general.c b/clients/common/tests/test-general.c
index b66262e8de..b5f9af75de 100644
--- a/clients/common/tests/test-general.c
+++ b/clients/common/tests/test-general.c
@@ -34,6 +34,9 @@ test_client_meta_check (void)
NMMetaSettingType m;
guint p;
+ G_STATIC_ASSERT (G_STRUCT_OFFSET (NMMetaAbstractInfo, meta_type) == G_STRUCT_OFFSET (NMMetaSettingInfoEditor, meta_type));
+ G_STATIC_ASSERT (G_STRUCT_OFFSET (NMMetaAbstractInfo, meta_type) == G_STRUCT_OFFSET (NMMetaPropertyInfo, meta_type));
+
for (m = 0; m < _NM_META_SETTING_TYPE_NUM; m++) {
const NMMetaSettingInfo *info = &nm_meta_setting_infos[m];
GType gtype;
@@ -68,7 +71,8 @@ test_client_meta_check (void)
g_assert (info->general);
g_assert (info->general == &nm_meta_setting_infos[m]);
- g_assert (info->general->setting_name == info->meta_type->get_name ((const NMMetaAbstractInfo *) info));
+ g_assert_cmpstr (info->general->setting_name, ==, info->meta_type->get_name ((const NMMetaAbstractInfo *) info, FALSE));
+ g_assert_cmpstr ("name", ==, info->meta_type->get_name ((const NMMetaAbstractInfo *) info, TRUE));
if (info->properties_num) {
gs_unref_hashtable GHashTable *property_names = g_hash_table_new (g_str_hash, g_str_equal);
@@ -83,7 +87,8 @@ test_client_meta_check (void)
g_assert (nm_g_hash_table_add (property_names, (gpointer) pi->property_name));
- g_assert (pi->property_name == pi->meta_type->get_name ((const NMMetaAbstractInfo *) pi));
+ g_assert_cmpstr (pi->property_name, ==, pi->meta_type->get_name ((const NMMetaAbstractInfo *) pi, FALSE));
+ g_assert_cmpstr (pi->property_name, ==, pi->meta_type->get_name ((const NMMetaAbstractInfo *) pi, TRUE));
g_assert (pi->property_type);
g_assert (pi->property_type->get_fcn);