Blob Blame History Raw
From 94bb83a370648dd5e3cd815e0d48125d7a491e30 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
Date: Tue, 10 Dec 2013 12:00:53 +0100
Subject: [PATCH 1/4] cli: allow specifying 'group.name' syntax for '--fields'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

and use it for 'nmcli device show'.

This allows filtering output not only for whole groups, but also for individual
fields in commands that print data in groups (sections).

Example:
$ nmcli -f general.device,general.driver,ipv4,ipv6.address device show eth0
GENERAL.DEVICE:                         eth0
GENERAL.DRIVER:                         e1000e
IP4.ADDRESS[1]:                         ip = 10.0.5.228/23, gw = 10.0.5.254
IP4.ADDRESS[2]:                         ip = 5.5.5.5/32, gw = 5.5.5.1
IP4.DNS[1]:                             192.168.122.1
IP4.DNS[2]:                             8.8.8.8
IP4.DOMAIN[1]:                          mycompany.com

Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
---
 cli/src/common.c          |  40 ++++++++++----
 cli/src/common.h          |   8 +--
 cli/src/connections.c     |  47 ++++++----------
 cli/src/devices.c         | 136 ++++++++++++++++++++++++----------------------
 cli/src/network-manager.c |  23 ++------
 cli/src/nmcli.h           |  17 +++---
 cli/src/settings.c        |  50 ++++++++---------
 cli/src/utils.c           | 113 +++++++++++++++++++++++++++++++++-----
 cli/src/utils.h           |   6 +-
 9 files changed, 262 insertions(+), 178 deletions(-)

diff --git a/cli/src/common.c b/cli/src/common.c
index 33c42b5..8fadbc1 100644
--- a/cli/src/common.c
+++ b/cli/src/common.c
@@ -30,7 +30,7 @@
 #include "utils.h"
 
 /* Available fields for IPv4 group */
-static NmcOutputField nmc_fields_ip4_config[] = {
+NmcOutputField nmc_fields_ip4_config[] = {
 	{"GROUP",      N_("GROUP"),       15},  /* 0 */
 	{"ADDRESS",    N_("ADDRESS"),     68},  /* 1 */
 	{"ROUTE",      N_("ROUTE"),       68},  /* 2 */
@@ -42,7 +42,7 @@ static NmcOutputField nmc_fields_ip4_config[] = {
 #define NMC_FIELDS_IP4_CONFIG_ALL     "GROUP,ADDRESS,ROUTE,DNS,DOMAIN,WINS"
 
 /* Available fields for DHCPv4 group */
-static NmcOutputField nmc_fields_dhcp4_config[] = {
+NmcOutputField nmc_fields_dhcp4_config[] = {
 	{"GROUP",      N_("GROUP"),       15},  /* 0 */
 	{"OPTION",     N_("OPTION"),      80},  /* 1 */
 	{NULL,         NULL,               0}
@@ -50,7 +50,7 @@ static NmcOutputField nmc_fields_dhcp4_config[] = {
 #define NMC_FIELDS_DHCP4_CONFIG_ALL     "GROUP,OPTION"
 
 /* Available fields for IPv6 group */
-static NmcOutputField nmc_fields_ip6_config[] = {
+NmcOutputField nmc_fields_ip6_config[] = {
 	{"GROUP",      N_("GROUP"),       15},  /* 0 */
 	{"ADDRESS",    N_("ADDRESS"),     95},  /* 1 */
 	{"ROUTE",      N_("ROUTE"),       95},  /* 2 */
@@ -61,7 +61,7 @@ static NmcOutputField nmc_fields_ip6_config[] = {
 #define NMC_FIELDS_IP6_CONFIG_ALL     "GROUP,ADDRESS,ROUTE,DNS,DOMAIN"
 
 /* Available fields for DHCPv6 group */
-static NmcOutputField nmc_fields_dhcp6_config[] = {
+NmcOutputField nmc_fields_dhcp6_config[] = {
 	{"GROUP",      N_("GROUP"),       15},  /* 0 */
 	{"OPTION",     N_("OPTION"),      80},  /* 1 */
 	{NULL,         NULL,               0}
@@ -70,7 +70,10 @@ static NmcOutputField nmc_fields_dhcp6_config[] = {
 
 
 gboolean
-print_ip4_config (NMIP4Config *cfg4, NmCli *nmc, const char *group_prefix)
+print_ip4_config (NMIP4Config *cfg4,
+                  NmCli *nmc,
+                  const char *group_prefix,
+                  const char *one_field)
 {
 	GSList *list, *iter;
 	const GArray *array;
@@ -89,7 +92,8 @@ print_ip4_config (NMIP4Config *cfg4, NmCli *nmc, const char *group_prefix)
 
 	tmpl = nmc_fields_ip4_config;
 	tmpl_len = sizeof (nmc_fields_ip4_config);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_IP4_CONFIG_ALL, tmpl, NULL);
+	nmc->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);
 
@@ -179,7 +183,10 @@ print_ip4_config (NMIP4Config *cfg4, NmCli *nmc, const char *group_prefix)
 }
 
 gboolean
-print_ip6_config (NMIP6Config *cfg6, NmCli *nmc, const char *group_prefix)
+print_ip6_config (NMIP6Config *cfg6,
+                  NmCli *nmc,
+                  const char *group_prefix,
+                  const char *one_field)
 {
 	GSList *list, *iter;
 	const GPtrArray *ptr_array;
@@ -196,7 +203,8 @@ print_ip6_config (NMIP6Config *cfg6, NmCli *nmc, const char *group_prefix)
 
 	tmpl = nmc_fields_ip6_config;
 	tmpl_len = sizeof (nmc_fields_ip6_config);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_IP6_CONFIG_ALL, tmpl, NULL);
+	nmc->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);
 
@@ -274,7 +282,10 @@ print_ip6_config (NMIP6Config *cfg6, NmCli *nmc, const char *group_prefix)
 }
 
 gboolean
-print_dhcp4_config (NMDHCP4Config *dhcp4, NmCli *nmc, const char *group_prefix)
+print_dhcp4_config (NMDHCP4Config *dhcp4,
+                    NmCli *nmc,
+                    const char *group_prefix,
+                    const char *one_field)
 {
 	GHashTable *table;
 	NmcOutputField *tmpl, *arr;
@@ -292,7 +303,8 @@ print_dhcp4_config (NMDHCP4Config *dhcp4, NmCli *nmc, const char *group_prefix)
 
 		tmpl = nmc_fields_dhcp4_config;
 		tmpl_len = sizeof (nmc_fields_dhcp4_config);
-		nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DHCP4_CONFIG_ALL, tmpl, NULL);
+		nmc->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);
 
@@ -318,7 +330,10 @@ print_dhcp4_config (NMDHCP4Config *dhcp4, NmCli *nmc, const char *group_prefix)
 }
 
 gboolean
-print_dhcp6_config (NMDHCP6Config *dhcp6, NmCli *nmc, const char *group_prefix)
+print_dhcp6_config (NMDHCP6Config *dhcp6,
+                    NmCli *nmc,
+                    const char *group_prefix,
+                    const char *one_field)
 {
 	GHashTable *table;
 	NmcOutputField *tmpl, *arr;
@@ -336,7 +351,8 @@ print_dhcp6_config (NMDHCP6Config *dhcp6, NmCli *nmc, const char *group_prefix)
 
 		tmpl = nmc_fields_dhcp6_config;
 		tmpl_len = sizeof (nmc_fields_dhcp6_config);
-		nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DHCP6_CONFIG_ALL, tmpl, NULL);
+		nmc->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);
 
diff --git a/cli/src/common.h b/cli/src/common.h
index 6683502..bb5ea5a 100644
--- a/cli/src/common.h
+++ b/cli/src/common.h
@@ -32,10 +32,10 @@
 
 #include "nmcli.h"
 
-gboolean print_ip4_config (NMIP4Config *cfg4, NmCli *nmc, const char *group_prefix);
-gboolean print_ip6_config (NMIP6Config *cfg6, NmCli *nmc, const char *group_prefix);
-gboolean print_dhcp4_config (NMDHCP4Config *dhcp4, NmCli *nmc, const char *group_prefix);
-gboolean print_dhcp6_config (NMDHCP6Config *dhcp6, NmCli *nmc, const char *group_prefix);
+gboolean print_ip4_config (NMIP4Config *cfg4, NmCli *nmc, const char *group_prefix, const char *one_field);
+gboolean print_ip6_config (NMIP6Config *cfg6, NmCli *nmc, const char *group_prefix, const char *one_field);
+gboolean print_dhcp4_config (NMDHCP4Config *dhcp4, NmCli *nmc, const char *group_prefix, const char *one_field);
+gboolean print_dhcp6_config (NMDHCP6Config *dhcp6, NmCli *nmc, const char *group_prefix, const char *one_field);
 
 NMIP4Address *nmc_parse_and_build_ip4_address (const char *ip_str, const char *gw_str, GError **error);
 NMIP6Address *nmc_parse_and_build_ip6_address (const char *ip_str, const char *gw_str, GError **error);
diff --git a/cli/src/connections.c b/cli/src/connections.c
index 0141b36..f837d00 100644
--- a/cli/src/connections.c
+++ b/cli/src/connections.c
@@ -351,13 +351,9 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
 	else
 		fields_str = nmc->required_fields;
 
-	print_settings_array = parse_output_fields (fields_str, nmc_fields_settings_names, &error);
+	print_settings_array = parse_output_fields (fields_str, nmc_fields_settings_names, FALSE, NULL, &error);
 	if (error) {
-		if (error->code == 0)
-			g_string_printf (nmc->return_text, _("Error: 'list configured': %s"), error->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: 'list configured': %s; allowed fields: %s"),
-			                 error->message, NMC_FIELDS_SETTINGS_NAMES_ALL);
+		g_string_printf (nmc->return_text, _("Error: 'list configured': %s"), error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 		return FALSE;
@@ -367,7 +363,7 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
 	/* Main header */
 	nmc->print_fields.header_name = _("Connection details");
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTINGS_NAMES_ALL,
-	                                                 nmc_fields_settings_names, NULL);
+	                                                 nmc_fields_settings_names, FALSE, NULL, NULL);
 
 	nmc_fields_settings_names[0].flags = NMC_OF_FLAG_MAIN_HEADER_ONLY;
 	print_required_fields (nmc, nmc_fields_settings_names);
@@ -499,7 +495,7 @@ 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, &error1);
+	nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error1);
	/* error1 is checked later - it's not valid for connection details */
 
 	if (argc == 0) {
@@ -549,11 +545,7 @@ do_connections_show (NmCli *nmc, int argc, char **argv)
 
 error:
 	if (error1) {
-		if (error1->code == 0)
-			g_string_printf (nmc->return_text, _("Error: 'show configured': %s"), error1->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: 'show configured': %s; allowed fields: %s"),
-			                 error1->message, NMC_FIELDS_CON_SHOW_ALL);
+		g_string_printf (nmc->return_text, _("Error: 'show configured': %s"), error1->message);
 		g_error_free (error1);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 	}
@@ -852,13 +844,9 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 	else
 		fields_str = nmc->required_fields;
 
-	print_groups = parse_output_fields (fields_str, nmc_fields_con_active_details_groups, &error);
+	print_groups = parse_output_fields (fields_str, nmc_fields_con_active_details_groups, FALSE, NULL, &error);
 	if (error) {
-		if (error->code == 0)
-			g_string_printf (nmc->return_text, _("Error: 'list active': %s"), error->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: 'list active': %s; allowed fields: %s"),
-			                 error->message, NMC_FIELDS_CON_ACTIVE_DETAILS_ALL);
+		g_string_printf (nmc->return_text, _("Error: 'list active': %s"), error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 		return FALSE;
@@ -868,7 +856,7 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 	/* Main header */
 	nmc->print_fields.header_name = _("Active connection details");
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_CON_ACTIVE_DETAILS_ALL,
-	                                                 nmc_fields_con_active_details_groups, NULL);
+	                                                 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_fields_con_active_details_groups);
@@ -890,7 +878,7 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 			/* Add field names */
 			tmpl = nmc_fields_con_show_active;
 			tmpl_len = sizeof (nmc_fields_con_show_active);
-			nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_CON_ACTIVE_DETAILS_GENERAL_ALL, tmpl, NULL);
+			nmc->print_fields.indices = parse_output_fields (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);
 
@@ -916,10 +904,10 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 				NMDHCP4Config *dhcp4 = nm_device_get_dhcp4_config (device);
 				NMDHCP6Config *dhcp6 = nm_device_get_dhcp6_config (device);
 
-				b1 = print_ip4_config (cfg4, nmc, "IP4");
-				b2 = print_dhcp4_config (dhcp4, nmc, "DHCP4");
-				b3 = print_ip6_config (cfg6, nmc, "IP6");
-				b4 = print_dhcp6_config (dhcp6, nmc, "DHCP6");
+				b1 = print_ip4_config (cfg4, nmc, "IP4", NULL);
+				b2 = print_dhcp4_config (dhcp4, nmc, "DHCP4", NULL);
+				b3 = print_ip6_config (cfg6, nmc, "IP6", NULL);
+				b4 = print_dhcp6_config (dhcp6, nmc, "DHCP6", NULL);
 				was_output = was_output || b1 || b2 || b3 || b4;
 			}
 		}
@@ -943,7 +931,7 @@ nmc_active_connection_detail (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 (NMC_FIELDS_CON_ACTIVE_DETAILS_VPN_ALL, tmpl, NULL);
+			nmc->print_fields.indices = parse_output_fields (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);
 
@@ -1025,7 +1013,7 @@ do_connections_show_active (NmCli *nmc, int argc, char **argv)
 
 		tmpl = nmc_fields_con_show_active + 1;
 		tmpl_len = sizeof (nmc_fields_con_show_active) - sizeof (NmcOutputField);
-		nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, &err1);
+		nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &err1);
 		if (err1)
 			goto error;
 
@@ -1078,10 +1066,7 @@ do_connections_show_active (NmCli *nmc, int argc, char **argv)
 
 error:
 	if (err1) {
-		if (err1->code == 0)
-			g_string_printf (nmc->return_text, _("Error: 'show active': %s"), err1->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: 'show active': %s; allowed fields: %s"), err1->message, NMC_FIELDS_CON_ACTIVE_ALL);
+		g_string_printf (nmc->return_text, _("Error: 'show active': %s"), err1->message);
 		g_error_free (err1);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 	}
diff --git a/cli/src/devices.c b/cli/src/devices.c
index 39802b6..037d880 100644
--- a/cli/src/devices.c
+++ b/cli/src/devices.c
@@ -81,32 +81,6 @@ static NmcOutputField nmc_fields_dev_status[] = {
 #define NMC_FIELDS_DEV_STATUS_COMMON  "DEVICE,TYPE,STATE"
 
 
-/* Available sections for 'device show' */
-static NmcOutputField nmc_fields_dev_show_sections[] = {
-	{"GENERAL",           N_("GENERAL"),           0},  /* 0 */
-	{"CAPABILITIES",      N_("CAPABILITIES"),      0},  /* 1 */
-	{"WIFI-PROPERTIES",   N_("WIFI-PROPERTIES"),   0},  /* 2 */
-	{"AP",                N_("AP"),                0},  /* 3 */
-	{"WIRED-PROPERTIES",  N_("WIRED-PROPERTIES"),  0},  /* 4 */
-	{"WIMAX-PROPERTIES",  N_("WIMAX-PROPERTIES"),  0},  /* 5 */
-	{"NSP",               N_("NSP"),               0},  /* 6 */
-	{"IP4",               N_("IP4"),               0},  /* 7 */
-	{"DHCP4",             N_("DHCP4"),             0},  /* 8 */
-	{"IP6",               N_("IP6"),               0},  /* 9 */
-	{"DHCP6",             N_("DHCP6"),             0},  /* 10 */
-	{"BOND",              N_("BOND"),              0},  /* 11 */
-	{"VLAN",              N_("VLAN"),              0},  /* 12 */
-	{"CONNECTIONS",       N_("CONNECTIONS"),       0},  /* 13 */
-	{NULL,                NULL,                    0}
-};
-#if WITH_WIMAX
-#define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL     "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,WIMAX-PROPERTIES,NSP,IP4,DHCP4,IP6,DHCP6"
-#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON  "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,WIMAX-PROPERTIES,NSP,IP4,DHCP4,IP6,DHCP6"
-#else
-#define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL     "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,IP4,DHCP4,IP6,DHCP6"
-#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON  "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,IP4,DHCP4,IP6,DHCP6"
-#endif
-
 /* Available fields for 'device show' - GENERAL part */
 static NmcOutputField nmc_fields_dev_show_general[] = {
 	{"NAME",              N_("NAME"),              10},  /* 0 */
@@ -161,7 +135,6 @@ static NmcOutputField nmc_fields_dev_show_wired_prop[] = {
 #define NMC_FIELDS_DEV_SHOW_WIRED_PROP_ALL     "NAME,CARRIER"
 #define NMC_FIELDS_DEV_SHOW_WIRED_PROP_COMMON  "NAME,CARRIER"
 
-
 /* Available fields for 'device show' - wireless properties part */
 static NmcOutputField nmc_fields_dev_show_wifi_prop[] = {
 	{"NAME",       N_("NAME"),   18},  /* 0 */
@@ -192,6 +165,7 @@ static NmcOutputField nmc_fields_dev_show_wimax_prop[] = {
 #define NMC_FIELDS_DEV_SHOW_WIMAX_PROP_COMMON  "NAME,CTR-FREQ,RSSI,CINR,TX-POW,BSID"
 #endif
 
+
 /* Available fields for 'device wifi list' */
 static NmcOutputField nmc_fields_dev_wifi_list[] = {
 	{"NAME",       N_("NAME"),       15},  /* 0 */
@@ -253,6 +227,38 @@ static NmcOutputField nmc_fields_dev_show_vlan_prop[] = {
 #define NMC_FIELDS_DEV_SHOW_VLAN_PROP_ALL     "NAME,ID"
 #define NMC_FIELDS_DEV_SHOW_VLAN_PROP_COMMON  "NAME,ID"
 
+/* defined in common.c */
+extern NmcOutputField nmc_fields_ip4_config[];
+extern NmcOutputField nmc_fields_ip6_config[];
+extern NmcOutputField nmc_fields_dhcp4_config[];
+extern NmcOutputField nmc_fields_dhcp6_config[];
+
+/* Available sections for 'device show' */
+static 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_bond_prop + 1   },  /* 11 */
+	{"VLAN",              N_("VLAN"),              0, nmc_fields_dev_show_vlan_prop  + 1  },  /* 12 */
+	{"CONNECTIONS",       N_("CONNECTIONS"),       0, nmc_fields_dev_show_connections + 1 },  /* 13 */
+	{NULL,                NULL,                    0, NULL                                }
+};
+#if WITH_WIMAX
+#define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL     "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,WIMAX-PROPERTIES,NSP,IP4,DHCP4,IP6,DHCP6"
+#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON  "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,WIMAX-PROPERTIES,NSP,IP4,DHCP4,IP6,DHCP6"
+#else
+#define NMC_FIELDS_DEV_SHOW_SECTIONS_ALL     "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,IP4,DHCP4,IP6,DHCP6"
+#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON  "GENERAL,CAPABILITIES,BOND,VLAN,CONNECTIONS,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,IP4,DHCP4,IP6,DHCP6"
+#endif
+
 
 /* glib main loop variable - defined in nmcli.c */
 extern GMainLoop *loop;
@@ -590,6 +596,7 @@ show_device_info (NMDevice *device, NmCli *nmc)
 	NMDHCP4Config *dhcp4;
 	NMDHCP6Config *dhcp6;
 	const char *base_hdr = _("Device details");
+	GPtrArray *fields_in_section = NULL;
 
 	if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0)
 		fields_str = fields_common;
@@ -598,13 +605,9 @@ show_device_info (NMDevice *device, NmCli *nmc)
 	else
 		fields_str = nmc->required_fields;
 
-	sections_array = parse_output_fields (fields_str, nmc_fields_dev_show_sections, &error);
+	sections_array = parse_output_fields (fields_str, nmc_fields_dev_show_sections, TRUE, &fields_in_section, &error);
 	if (error) {
-		if (error->code == 0)
-			g_string_printf (nmc->return_text, _("Error: 'device show': %s"), error->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: 'device show': %s; allowed fields: %s"),
-			                 error->message, NMC_FIELDS_DEV_SHOW_SECTIONS_ALL);
+		g_string_printf (nmc->return_text, _("Error: 'device show': %s"), error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 		return;
@@ -613,7 +616,7 @@ show_device_info (NMDevice *device, NmCli *nmc)
 	/* Main header */
 	nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, nm_device_get_iface (device));
 	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_GENERAL_ALL,
-	                                                 nmc_fields_dev_show_general, NULL);
+	                                                 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_fields_dev_show_general);
@@ -621,6 +624,7 @@ show_device_info (NMDevice *device, NmCli *nmc)
 	/* 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)
 			printf ("\n"); /* Print empty line between groups in tabular mode */
@@ -636,7 +640,8 @@ show_device_info (NMDevice *device, NmCli *nmc)
 		if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[0].name)) {
 			tmpl = nmc_fields_dev_show_general;
 			tmpl_len = sizeof (nmc_fields_dev_show_general);
-			nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_GENERAL_ALL, tmpl, NULL);
+			nmc->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);
 
@@ -689,7 +694,8 @@ show_device_info (NMDevice *device, NmCli *nmc)
 		if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[1].name)) {
 			tmpl = nmc_fields_dev_show_cap;
 			tmpl_len = sizeof (nmc_fields_dev_show_cap);
-			nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_CAP_ALL, tmpl, NULL);
+			nmc->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);
 
@@ -728,7 +734,8 @@ show_device_info (NMDevice *device, NmCli *nmc)
 
 				tmpl = nmc_fields_dev_show_wifi_prop;
 				tmpl_len = sizeof (nmc_fields_dev_show_wifi_prop);
-				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_WIFI_PROP_ALL, tmpl, NULL);
+				nmc->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);
 
@@ -757,7 +764,8 @@ 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 (NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST, tmpl, NULL);
+				nmc->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);
 
@@ -779,7 +787,8 @@ show_device_info (NMDevice *device, NmCli *nmc)
 			if (!strcasecmp (nmc_fields_dev_show_sections[section_idx].name, nmc_fields_dev_show_sections[4].name)) {
 				tmpl = nmc_fields_dev_show_wired_prop;
 				tmpl_len = sizeof (nmc_fields_dev_show_wired_prop);
-				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_WIRED_PROP_ALL, tmpl, NULL);
+				nmc->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);
 
@@ -804,7 +813,8 @@ show_device_info (NMDevice *device, NmCli *nmc)
 				/* Field names */
 				tmpl = nmc_fields_dev_show_wimax_prop;
 				tmpl_len = sizeof (nmc_fields_dev_show_wimax_prop);
-				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_WIMAX_PROP_ALL, tmpl, NULL);
+				nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_WIMAX_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);
 
@@ -848,7 +858,8 @@ show_device_info (NMDevice *device, NmCli *nmc)
 
 				tmpl = nmc_fields_dev_wimax_list;
 				tmpl_len = sizeof (nmc_fields_dev_wimax_list);
-				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_WIMAX_LIST_FOR_DEV_LIST, tmpl, NULL);
+				nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_WIMAX_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);
 
@@ -872,19 +883,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);
+			was_output = print_ip4_config (cfg4, nmc, 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);
+			was_output = print_dhcp4_config (dhcp4, nmc, 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);
+			was_output = print_ip6_config (cfg6, nmc, 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);
+			was_output = print_dhcp6_config (dhcp6, nmc, nmc_fields_dev_show_sections[10].name, section_fld);
 
 		/* Bond-specific information */
 		if ((NM_IS_DEVICE_BOND (device))) {
@@ -909,7 +920,8 @@ show_device_info (NMDevice *device, NmCli *nmc)
 
 				tmpl = nmc_fields_dev_show_bond_prop;
 				tmpl_len = sizeof (nmc_fields_dev_show_bond_prop);
-				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_BOND_PROP_ALL, tmpl, NULL);
+				nmc->print_fields.indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_SHOW_BOND_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);
 
@@ -932,7 +944,8 @@ show_device_info (NMDevice *device, NmCli *nmc)
 
 				tmpl = nmc_fields_dev_show_vlan_prop;
 				tmpl_len = sizeof (nmc_fields_dev_show_vlan_prop);
-				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_VLAN_PROP_ALL, tmpl, NULL);
+				nmc->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);
 
@@ -956,7 +969,8 @@ show_device_info (NMDevice *device, NmCli *nmc)
 
 			tmpl = nmc_fields_dev_show_connections;
 			tmpl_len = sizeof (nmc_fields_dev_show_connections);
-			nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_SHOW_CONNECTIONS_ALL, tmpl, NULL);
+			nmc->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);
 
@@ -999,6 +1013,8 @@ show_device_info (NMDevice *device, NmCli *nmc)
 
 	if (sections_array)
 		g_array_free (sections_array, TRUE);
+	if (fields_in_section)
+		g_ptr_array_free (fields_in_section, TRUE);
 }
 
 static void
@@ -1073,14 +1089,10 @@ 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, &error);
+	nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error);
 
 	if (error) {
-		if (error->code == 0)
-			g_string_printf (nmc->return_text, _("Error: 'device status': %s"), error->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: 'device status': %s; allowed fields: %s"),
-			                 error->message, NMC_FIELDS_DEV_STATUS_ALL);
+		g_string_printf (nmc->return_text, _("Error: 'device status': %s"), error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 		goto error;
@@ -1552,14 +1564,10 @@ 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, &error);
+	nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error);
 
 	if (error) {
-		if (error->code == 0)
-			g_string_printf (nmc->return_text, _("Error: 'device wifi': %s"), error->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: 'device wifi': %s; allowed fields: %s"),
-			                 error->message, NMC_FIELDS_DEV_WIFI_LIST_ALL);
+		g_string_printf (nmc->return_text, _("Error: 'device wifi': %s"), error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 		goto error;
@@ -2295,14 +2303,10 @@ do_device_wimax_list (NmCli *nmc, int argc, char **argv)
 
 	tmpl = nmc_fields_dev_wimax_list;
 	tmpl_len = sizeof (nmc_fields_dev_wimax_list);
-	nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, &error);
+	nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error);
 
 	if (error) {
-		if (error->code == 0)
-			g_string_printf (nmc->return_text, _("Error: 'device wimax': %s"), error->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: 'device wimax': %s; allowed fields: %s"),
-			                 error->message, NMC_FIELDS_DEV_WIMAX_LIST_ALL);
+		g_string_printf (nmc->return_text, _("Error: 'device wimax': %s"), error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 		goto error;
diff --git a/cli/src/network-manager.c b/cli/src/network-manager.c
index 8d59566..20df4dd 100644
--- a/cli/src/network-manager.c
+++ b/cli/src/network-manager.c
@@ -205,13 +205,10 @@ 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, &error);
+	nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error);
 
 	if (error) {
-		if (error->code == 0)
-			g_string_printf (nmc->return_text, _("Error: %s"), error->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: %s (allowed fields: %s)"), error->message, fields_all);
+		g_string_printf (nmc->return_text, _("Error: only these fields are allowed: %s"), fields_all);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 		return FALSE;
@@ -351,14 +348,10 @@ show_nm_permissions (NmCli *nmc)
 
 	tmpl = nmc_fields_nm_permissions;
 	tmpl_len = sizeof (nmc_fields_nm_permissions);
-	nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, &error);
+	nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error);
 
 	if (error) {
-		if (error->code == 0)
-			g_string_printf (nmc->return_text, _("Error: 'general permissions': %s"), error->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: 'general permissions': %s; allowed fields: %s"),
-			                 error->message, NMC_FIELDS_NM_PERMISSIONS_ALL);
+		g_string_printf (nmc->return_text, _("Error: 'general permissions': %s"), error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 		return FALSE;
@@ -410,14 +403,10 @@ 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, &error);
+	nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error);
 
 	if (error) {
-		if (error->code == 0)
-			g_string_printf (nmc->return_text, _("Error: 'general logging': %s"), error->message);
-		else
-			g_string_printf (nmc->return_text, _("Error: 'general logging': %s; allowed fields: %s"),
-			                 error->message, NMC_FIELDS_NM_LOGGING_ALL);
+		g_string_printf (nmc->return_text, _("Error: 'general logging': %s"), error->message);
 		g_error_free (error);
 		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
 		return FALSE;
diff --git a/cli/src/nmcli.h b/cli/src/nmcli.h
index c80c4fd..b300c6d 100644
--- a/cli/src/nmcli.h
+++ b/cli/src/nmcli.h
@@ -74,14 +74,15 @@ 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 */
 
-typedef struct {
-	const char *name;         /* Field's name */
-	const char *name_l10n;    /* Field's name for translation */
-	int width;                /* Width in screen columns */
-	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 */
+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 */
+	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 */
 } NmcOutputField;
 
 typedef struct {
diff --git a/cli/src/settings.c b/cli/src/settings.c
index cf56cfb..baee672 100644
--- a/cli/src/settings.c
+++ b/cli/src/settings.c
@@ -5840,7 +5840,7 @@ setting_connection_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_connection;
 	tmpl_len = sizeof (nmc_fields_setting_connection);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_CONNECTION_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_CONNECTION_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);
 
@@ -5877,7 +5877,7 @@ setting_wired_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_wired;
 	tmpl_len = sizeof (nmc_fields_setting_wired);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRED_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRED_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);
 
@@ -5912,7 +5912,7 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_8021X;
 	tmpl_len = sizeof (nmc_fields_setting_8021X);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_802_1X_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_802_1X_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);
 
@@ -5968,7 +5968,7 @@ setting_wireless_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_wireless;
 	tmpl_len = sizeof (nmc_fields_setting_wireless);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRELESS_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRELESS_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);
 
@@ -6005,7 +6005,7 @@ setting_wireless_security_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_wireless_security;
 	tmpl_len = sizeof (nmc_fields_setting_wireless_security);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRELESS_SECURITY_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRELESS_SECURITY_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);
 
@@ -6046,7 +6046,7 @@ setting_ip4_config_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_ip4_config;
 	tmpl_len = sizeof (nmc_fields_setting_ip4_config);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_IP4_CONFIG_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_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);
 
@@ -6082,7 +6082,7 @@ setting_ip6_config_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_ip6_config;
 	tmpl_len = sizeof (nmc_fields_setting_ip6_config);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_IP6_CONFIG_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_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);
 
@@ -6117,7 +6117,7 @@ setting_serial_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_serial;
 	tmpl_len = sizeof (nmc_fields_setting_serial);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_SERIAL_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_SERIAL_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);
 
@@ -6146,7 +6146,7 @@ setting_ppp_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_ppp;
 	tmpl_len = sizeof (nmc_fields_setting_ppp);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_PPP_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_PPP_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);
 
@@ -6188,7 +6188,7 @@ setting_pppoe_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_pppoe;
 	tmpl_len = sizeof (nmc_fields_setting_pppoe);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_PPPOE_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_PPPOE_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);
 
@@ -6216,7 +6216,7 @@ setting_gsm_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_gsm;
 	tmpl_len = sizeof (nmc_fields_setting_gsm);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_GSM_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_GSM_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);
 
@@ -6251,7 +6251,7 @@ setting_cdma_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_cdma;
 	tmpl_len = sizeof (nmc_fields_setting_cdma);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_CDMA_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_CDMA_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);
 
@@ -6279,7 +6279,7 @@ setting_bluetooth_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_bluetooth;
 	tmpl_len = sizeof (nmc_fields_setting_bluetooth);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BLUETOOTH_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_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);
 
@@ -6305,7 +6305,7 @@ setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_olpc_mesh;
 	tmpl_len = sizeof (nmc_fields_setting_olpc_mesh);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_OLPC_MESH_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_OLPC_MESH_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);
 
@@ -6332,7 +6332,7 @@ setting_vpn_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_vpn;
 	tmpl_len = sizeof (nmc_fields_setting_vpn);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_VPN_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_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);
 
@@ -6360,7 +6360,7 @@ setting_wimax_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_wimax;
 	tmpl_len = sizeof (nmc_fields_setting_wimax);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIMAX_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIMAX_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);
 
@@ -6386,7 +6386,7 @@ setting_infiniband_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_infiniband;
 	tmpl_len = sizeof (nmc_fields_setting_infiniband);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_INFINIBAND_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_INFINIBAND_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);
 
@@ -6415,7 +6415,7 @@ setting_bond_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_bond;
 	tmpl_len = sizeof (nmc_fields_setting_bond);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BOND_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BOND_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);
 
@@ -6441,7 +6441,7 @@ setting_vlan_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_vlan;
 	tmpl_len = sizeof (nmc_fields_setting_vlan);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_VLAN_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_VLAN_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);
 
@@ -6471,7 +6471,7 @@ setting_adsl_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_adsl;
 	tmpl_len = sizeof (nmc_fields_setting_adsl);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_ADSL_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_ADSL_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);
 
@@ -6502,7 +6502,7 @@ setting_bridge_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_bridge;
 	tmpl_len = sizeof (nmc_fields_setting_bridge);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BRIDGE_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BRIDGE_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);
 
@@ -6533,7 +6533,7 @@ setting_bridge_port_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_bridge_port;
 	tmpl_len = sizeof (nmc_fields_setting_bridge_port);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BRIDGE_PORT_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BRIDGE_PORT_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);
 
@@ -6560,7 +6560,7 @@ setting_team_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_team;
 	tmpl_len = sizeof (nmc_fields_setting_team);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_TEAM_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_TEAM_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);
 
@@ -6586,7 +6586,7 @@ setting_team_port_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_team_port;
 	tmpl_len = sizeof (nmc_fields_setting_team_port);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_TEAM_PORT_ALL, tmpl, NULL);
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_TEAM_PORT_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);
 
diff --git a/cli/src/utils.c b/cli/src/utils.c
index de246d6..4ea6253 100644
--- a/cli/src/utils.c
+++ b/cli/src/utils.c
@@ -608,41 +608,126 @@ nmc_free_output_field_values (NmcOutputField fields_array[])
 	}
 }
 
-/*
- * Parse comma separated fields in 'fields_str' according to 'fields_array'.
- * IN:  'field_str':    comma-separated fields names
- *      'fields_array': array of allowed fields
- * RETURN: GArray with indices representing fields in 'fields_array'.
- *         Caller is responsible to free it.
+/**
+ * parse_output_fields:
+ * @field_str: comma-separated field names to parse
+ * @fields_array: array of allowed fields
+ * @parse_groups: whether the fields can contain group prefix (e.g. general.driver)
+ * @group_fields: (out) (allow-none): array of field names for particular groups
+ * @error: (out) (allow-none): location to store error, or %NULL
+ *
+ * Parses comma separated fields in @fields_str according to @fields_array.
+ * When @parse_groups is %TRUE, fields can be in the form 'group.field'. Then
+ * @group_fields will be filled with the required field for particular group.
+ * @group_fields array corresponds to the returned array.
+ * Examples:
+ *   @field_str:     "type,name,uuid" | "ip4,general.device" | "ip4.address,ip6"
+ *   returned array:   2    0    1    |   7         0        |     7         9
+ *   @group_fields:   NULL NULL NULL  |  NULL    "device"    | "address"    NULL
+ *
+ * Returns: #GArray with indices representing fields in @fields_array.
+ *   Caller is responsible for freeing the array.
  */
 GArray *
-parse_output_fields (const char *fields_str, const NmcOutputField fields_array[], GError **error)
+parse_output_fields (const char *fields_str,
+                     const NmcOutputField fields_array[],
+                     gboolean parse_groups,
+                     GPtrArray **group_fields,
+                     GError **error)
 {
 	char **fields, **iter;
 	GArray *array;
-	int i;
+	int i, j;
 
 	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+	g_return_val_if_fail (group_fields == NULL || *group_fields == NULL, NULL);
 
 	array = g_array_new (FALSE, FALSE, sizeof (int));
+	if (parse_groups && group_fields)
+		*group_fields = g_ptr_array_new_full (20, (GDestroyNotify) g_free);
 
 	/* Split supplied fields string */
 	fields = g_strsplit_set (fields_str, ",", -1);
 	for (iter = fields; iter && *iter; iter++) {
-		for (i = 0; fields_array[i].name; i++) {
-			if (strcasecmp (*iter, fields_array[i].name) == 0) {
-				g_array_append_val (array, i);
-				break;
+		int idx = -1;
+
+		g_strstrip (*iter);
+		if (parse_groups) {
+			/* e.g. "general.device,general.driver,ip4,ip6" */
+			gboolean found = FALSE;
+			char *left = *iter;
+			char *right = strchr (*iter, '.');
+
+			if (right)
+				*right++ = '\0';
+
+			for (i = 0; fields_array[i].name; i++) {
+				if (strcasecmp (left, fields_array[i].name) == 0) {
+					NmcOutputField *valid_names = fields_array[i].group;
+					idx = i;
+					if (!right && !valid_names) {
+						found = TRUE;
+						break;
+					}
+					for (j = 0; valid_names && valid_names[j].name; j++) {
+						if (!right || strcasecmp (right, valid_names[j].name) == 0) {
+							found = TRUE;
+							break;
+						}
+					}
+				}
+				if (found)
+					break;
+			}
+			if (found) {
+				/* Add index to array, and field name (or NULL) to group_fields array */
+				g_array_append_val (array, idx);
+				if (*group_fields)
+					g_ptr_array_add (*group_fields, g_strdup (right));
+			}
+			if (right)
+				*(right-1) = '.';  /* Restore the original string */
+		} else {
+			/* e.g. "general,ip4,ip6" */
+			for (i = 0; fields_array[i].name; i++) {
+				if (strcasecmp (*iter, fields_array[i].name) == 0) {
+					g_array_append_val (array, i);
+					break;
+				}
 			}
 		}
+
+		/* Field was not found - error case */
 		if (fields_array[i].name == NULL) {
+			GString *allowed_fields = g_string_sized_new (256);
+			int k;
+
+			/* Set GError */
+			if (idx != -1 && fields_array[idx].group) {
+				NmcOutputField *second_level = fields_array[idx].group;
+				for (k = 0; second_level[k].name; k++)
+					g_string_append_printf (allowed_fields, "%s.%s,",
+					                        fields_array[idx].name, second_level[k].name);
+			} else {
+				for (k = 0; fields_array[k].name; k++)
+					g_string_append_printf (allowed_fields, "%s,", fields_array[k].name);
+			}
+			g_string_truncate (allowed_fields, allowed_fields->len - 1);
+
 			if (!strcasecmp (*iter, "all") || !strcasecmp (*iter, "common"))
 				g_set_error (error, NMCLI_ERROR, 0, _("field '%s' has to be alone"), *iter);
-
 			else
-				g_set_error (error, NMCLI_ERROR, 1, _("invalid field '%s'"), *iter);
+				g_set_error (error, NMCLI_ERROR, 1, _("invalid field '%s'; allowed fields: %s"),
+				             *iter, allowed_fields->str);
+			g_string_free (allowed_fields, TRUE);
+
+			/* Free arrays on error */
 			g_array_free (array, TRUE);
 			array = NULL;
+			if (group_fields && *group_fields) {
+				g_ptr_array_free (*group_fields, TRUE);
+				*group_fields = NULL;
+			}
 			goto done;
 		}
 	}
diff --git a/cli/src/utils.h b/cli/src/utils.h
index c1c8824..2d3292b 100644
--- a/cli/src/utils.h
+++ b/cli/src/utils.h
@@ -80,7 +80,11 @@ void set_val_strc (NmcOutputField fields_array[], guint32 index, const char *val
 void set_val_arr  (NmcOutputField fields_array[], guint32 index, char **value);
 void set_val_arrc (NmcOutputField fields_array[], guint32 index, const char **value);
 void nmc_free_output_field_values (NmcOutputField fields_array[]);
-GArray *parse_output_fields (const char *fields_str, const NmcOutputField fields_array[], GError **error);
+GArray *parse_output_fields (const char *fields_str,
+                             const NmcOutputField fields_array[],
+                             gboolean parse_groups,
+                             GPtrArray **group_fields,
+                             GError **error);
 gboolean nmc_terse_option_check (NMCPrintOutput print_output, const char *fields, GError **error);
 NmcOutputField *nmc_dup_fields_array (NmcOutputField fields[], size_t size, guint32 flags);
 void nmc_empty_output_fields (NmCli *nmc);
-- 
1.7.11.7


From 990f83b7d39b1e228e11d9f5ec24b696da7b5342 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
Date: Tue, 10 Dec 2013 15:33:53 +0100
Subject: [PATCH 2/4] cli: allow '--field group.field' for nmcli con show
 active <bla>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Example:
$ nmcli -f general.name,ip4.address c s a myeth
GENERAL.NAME:                           myeth
IP4.ADDRESS[1]:                         ip = 10.34.25.228/23, gw = 10.34.25.254

Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
---
 cli/src/connections.c | 100 +++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 79 insertions(+), 21 deletions(-)

diff --git a/cli/src/connections.c b/cli/src/connections.c
index f837d00..8a5b8f2 100644
--- a/cli/src/connections.c
+++ b/cli/src/connections.c
@@ -162,14 +162,6 @@ static NmcOutputField nmc_fields_con_show_active[] = {
 #define NMC_FIELDS_CON_ACTIVE_ALL     "NAME,UUID,DEVICES,STATE,DEFAULT,DEFAULT6,VPN,ZONE,DBUS-PATH,CON-PATH,SPEC-OBJECT,MASTER-PATH"
 #define NMC_FIELDS_CON_ACTIVE_COMMON  "NAME,UUID,DEVICES,DEFAULT,VPN,MASTER-PATH"
 
-/* Available fields for 'connection show active <con>' */
-static NmcOutputField nmc_fields_con_active_details_groups[] = {
-	{"GENERAL",  N_("GENERAL"), 9},  /* 0 */
-	{"IP",       N_("IP"),      5},  /* 1 */
-	{"VPN",      N_("VPN"),     5},  /* 2 */
-	{NULL, NULL, 0}
-};
-#define NMC_FIELDS_CON_ACTIVE_DETAILS_ALL  "GENERAL,IP,VPN"
 
 /* GENERAL group is the same as nmc_fields_con_show_active */
 #define NMC_FIELDS_CON_ACTIVE_DETAILS_GENERAL_ALL  "GROUP,"NMC_FIELDS_CON_ACTIVE_ALL
@@ -189,6 +181,24 @@ static NmcOutputField nmc_fields_con_active_details_vpn[] = {
 };
 #define NMC_FIELDS_CON_ACTIVE_DETAILS_VPN_ALL  "GROUP,TYPE,USERNAME,GATEWAY,BANNER,VPN-STATE,CFG"
 
+/* defined in common.c */
+extern NmcOutputField nmc_fields_ip4_config[];
+extern NmcOutputField nmc_fields_ip6_config[];
+extern NmcOutputField nmc_fields_dhcp4_config[];
+extern NmcOutputField nmc_fields_dhcp6_config[];
+
+/* Available fields for 'connection show active <con>' */
+static NmcOutputField nmc_fields_con_active_details_groups[] = {
+	{"GENERAL",  N_("GENERAL"), 0, nmc_fields_con_show_active + 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}
+};
+#define NMC_FIELDS_CON_ACTIVE_DETAILS_ALL  "GENERAL,IP4,DHCP4,IP6,DHCP6,VPN"
+
 
 typedef struct {
 	NmCli *nmc;
@@ -829,6 +839,7 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 {
 	GError *error = NULL;
 	GArray *print_groups;
+	GPtrArray *group_fields = NULL;
 	int i;
 	char *fields_str;
 	char *fields_all =    NMC_FIELDS_CON_ACTIVE_DETAILS_ALL;
@@ -844,7 +855,7 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 	else
 		fields_str = nmc->required_fields;
 
-	print_groups = parse_output_fields (fields_str, nmc_fields_con_active_details_groups, FALSE, NULL, &error);
+	print_groups = parse_output_fields (fields_str, nmc_fields_con_active_details_groups, TRUE, &group_fields, &error);
 	if (error) {
 		g_string_printf (nmc->return_text, _("Error: 'list active': %s"), error->message);
 		g_error_free (error);
@@ -864,6 +875,7 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 	/* 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)
 			printf ("\n"); /* Empty line */
@@ -878,7 +890,8 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 			/* Add field names */
 			tmpl = nmc_fields_con_show_active;
 			tmpl_len = sizeof (nmc_fields_con_show_active);
-			nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_CON_ACTIVE_DETAILS_GENERAL_ALL, tmpl, FALSE, NULL, NULL);
+			nmc->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);
 
@@ -890,31 +903,73 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 			was_output = TRUE;
 		}
 
-		/* IP */
+		/* IP4 */
 		if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name,  nmc_fields_con_active_details_groups[1].name) == 0) {
 			const GPtrArray *devices;
 			int j;
 
 			devices = nm_active_connection_get_devices (acon);
 			for (j = 0; devices && (j < devices->len); j++) {
-				gboolean b1 = FALSE, b2 = FALSE, b3 = FALSE, b4 = FALSE;
+				gboolean b1 = FALSE;
 				NMDevice *device = g_ptr_array_index (devices, j);
 				NMIP4Config *cfg4 = nm_device_get_ip4_config (device);
-				NMIP6Config *cfg6 = nm_device_get_ip6_config (device);
+
+				b1 = print_ip4_config (cfg4, nmc, "IP4", group_fld);
+				was_output = was_output || b1;
+			}
+		}
+
+		/* DHCP4 */
+		if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name,  nmc_fields_con_active_details_groups[2].name) == 0) {
+			const GPtrArray *devices;
+			int j;
+
+			devices = nm_active_connection_get_devices (acon);
+			for (j = 0; devices && (j < devices->len); j++) {
+				gboolean b1 = FALSE;
+				NMDevice *device = g_ptr_array_index (devices, j);
 				NMDHCP4Config *dhcp4 = nm_device_get_dhcp4_config (device);
+
+				b1 = print_dhcp4_config (dhcp4, nmc, "DHCP4", group_fld);
+				was_output = was_output || b1;
+			}
+		}
+
+		/* IP6 */
+		if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name,  nmc_fields_con_active_details_groups[3].name) == 0) {
+			const GPtrArray *devices;
+			int j;
+
+			devices = nm_active_connection_get_devices (acon);
+			for (j = 0; devices && (j < devices->len); j++) {
+				gboolean b1 = FALSE;
+				NMDevice *device = g_ptr_array_index (devices, j);
+				NMIP6Config *cfg6 = nm_device_get_ip6_config (device);
+
+				b1 = print_ip6_config (cfg6, nmc, "IP6", group_fld);
+				was_output = was_output || b1;
+			}
+		}
+
+		/* DHCP6 */
+		if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name,  nmc_fields_con_active_details_groups[4].name) == 0) {
+			const GPtrArray *devices;
+			int j;
+
+			devices = nm_active_connection_get_devices (acon);
+			for (j = 0; devices && (j < devices->len); j++) {
+				gboolean b1 = FALSE;
+				NMDevice *device = g_ptr_array_index (devices, j);
 				NMDHCP6Config *dhcp6 = nm_device_get_dhcp6_config (device);
 
-				b1 = print_ip4_config (cfg4, nmc, "IP4", NULL);
-				b2 = print_dhcp4_config (dhcp4, nmc, "DHCP4", NULL);
-				b3 = print_ip6_config (cfg6, nmc, "IP6", NULL);
-				b4 = print_dhcp6_config (dhcp6, nmc, "DHCP6", NULL);
-				was_output = was_output || b1 || b2 || b3 || b4;
+				b1 = print_dhcp6_config (dhcp6, nmc, "DHCP6", group_fld);
+				was_output = was_output || b1;
 			}
 		}
 
 		/* VPN */
 		if (NM_IS_VPN_CONNECTION (acon) &&
-		    strcasecmp (nmc_fields_con_active_details_groups[group_idx].name,  nmc_fields_con_active_details_groups[2].name) == 0) {
+		    strcasecmp (nmc_fields_con_active_details_groups[group_idx].name,  nmc_fields_con_active_details_groups[5].name) == 0) {
 			NMConnection *con;
 			NMSettingConnection *s_con;
 			NMSettingVPN *s_vpn;
@@ -931,7 +986,8 @@ nmc_active_connection_detail (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 (NMC_FIELDS_CON_ACTIVE_DETAILS_VPN_ALL, tmpl, FALSE, NULL, NULL);
+			nmc->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);
 
@@ -957,7 +1013,7 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 
 			/* Add values */
 			arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
-			set_val_strc (arr, 0, nmc_fields_con_active_details_groups[2].name);
+			set_val_strc (arr, 0, nmc_fields_con_active_details_groups[5].name);
 			set_val_str  (arr, 1, type_str);
 			set_val_strc (arr, 2, username ? username : get_vpn_data_item (con, VPN_DATA_ITEM_USERNAME));
 			set_val_strc (arr, 3, get_vpn_data_item (con, VPN_DATA_ITEM_GATEWAY));
@@ -972,6 +1028,8 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc)
 
 	if (print_groups)
 		g_array_free (print_groups, FALSE);
+	if (group_fields)
+		g_ptr_array_free (group_fields, TRUE);
 
 	return TRUE;
 }
-- 
1.7.11.7


From 4ef8696c77725a25cea2bc585f0579b86cfe779a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
Date: Tue, 10 Dec 2013 16:23:31 +0100
Subject: [PATCH 3/4] cli: allow '--field group.field' for nmcli con show conf
 <bla>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

That means you can display single property.

Example:
$ nmcli -f connection.id,802-3-ethernet.mtu s c my-eth-profile
connection.id:                          my-eth-profile
802-3-ethernet.mtu:                     auto

Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
---
 cli/src/connections.c |  91 ++++++++++++++++---------
 cli/src/settings.c    | 181 ++++++++++++++++++++++++++++----------------------
 cli/src/settings.h    |   4 +-
 3 files changed, 166 insertions(+), 110 deletions(-)

diff --git a/cli/src/connections.c b/cli/src/connections.c
index 8a5b8f2..f4bc017 100644
--- a/cli/src/connections.c
+++ b/cli/src/connections.c
@@ -79,35 +79,61 @@ static NmcOutputField nmc_fields_con_show[] = {
 #define NMC_FIELDS_CON_SHOW_COMMON  "NAME,UUID,TYPE,TIMESTAMP-REAL"
 
 /* Helper macro to define fields */
-#define SETTING_FIELD(setting, width) { setting, N_(setting), width, NULL, FALSE, FALSE, 0 }
+#define SETTING_FIELD(setting, props) { setting, N_(setting), 0, props, NULL, FALSE, FALSE, 0 }
+
+/* defined in settings.c */
+extern NmcOutputField nmc_fields_setting_connection[];
+extern NmcOutputField nmc_fields_setting_wired[];
+extern NmcOutputField nmc_fields_setting_8021X[];
+extern NmcOutputField nmc_fields_setting_wireless[];
+extern NmcOutputField nmc_fields_setting_wireless_security[];
+extern NmcOutputField nmc_fields_setting_ip4_config[];
+extern NmcOutputField nmc_fields_setting_ip6_config[];
+extern NmcOutputField nmc_fields_setting_serial[];
+extern NmcOutputField nmc_fields_setting_ppp[];
+extern NmcOutputField nmc_fields_setting_pppoe[];
+extern NmcOutputField nmc_fields_setting_adsl[];
+extern NmcOutputField nmc_fields_setting_gsm[];
+extern NmcOutputField nmc_fields_setting_cdma[];
+extern NmcOutputField nmc_fields_setting_bluetooth[];
+extern NmcOutputField nmc_fields_setting_olpc_mesh[];
+extern NmcOutputField nmc_fields_setting_vpn[];
+extern NmcOutputField nmc_fields_setting_wimax[];
+extern NmcOutputField nmc_fields_setting_infiniband[];
+extern NmcOutputField nmc_fields_setting_bond[];
+extern NmcOutputField nmc_fields_setting_vlan[];
+extern NmcOutputField nmc_fields_setting_bridge[];
+extern NmcOutputField nmc_fields_setting_bridge_port[];
+extern NmcOutputField nmc_fields_setting_team[];
+extern NmcOutputField nmc_fields_setting_team_port[];
 
 /* Available settings for 'connection show configured <con>' */
 static NmcOutputField nmc_fields_settings_names[] = {
-	SETTING_FIELD (NM_SETTING_CONNECTION_SETTING_NAME, 0),            /* 0 */
-	SETTING_FIELD (NM_SETTING_WIRED_SETTING_NAME, 0),                 /* 1 */
-	SETTING_FIELD (NM_SETTING_802_1X_SETTING_NAME, 0),                /* 2 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SETTING_NAME, 0),              /* 3 */
-	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, 0),     /* 4 */
-	SETTING_FIELD (NM_SETTING_IP4_CONFIG_SETTING_NAME, 0),            /* 5 */
-	SETTING_FIELD (NM_SETTING_IP6_CONFIG_SETTING_NAME, 0),            /* 6 */
-	SETTING_FIELD (NM_SETTING_SERIAL_SETTING_NAME, 0),                /* 7 */
-	SETTING_FIELD (NM_SETTING_PPP_SETTING_NAME, 0),                   /* 8 */
-	SETTING_FIELD (NM_SETTING_PPPOE_SETTING_NAME, 0),                 /* 9 */
-	SETTING_FIELD (NM_SETTING_GSM_SETTING_NAME, 0),                   /* 10 */
-	SETTING_FIELD (NM_SETTING_CDMA_SETTING_NAME, 0),                  /* 11 */
-	SETTING_FIELD (NM_SETTING_BLUETOOTH_SETTING_NAME, 0),             /* 12 */
-	SETTING_FIELD (NM_SETTING_OLPC_MESH_SETTING_NAME, 0),             /* 13 */
-	SETTING_FIELD (NM_SETTING_VPN_SETTING_NAME, 0),                   /* 14 */
-	SETTING_FIELD (NM_SETTING_WIMAX_SETTING_NAME, 0),                 /* 15 */
-	SETTING_FIELD (NM_SETTING_INFINIBAND_SETTING_NAME, 0),            /* 16 */
-	SETTING_FIELD (NM_SETTING_BOND_SETTING_NAME, 0),                  /* 17 */
-	SETTING_FIELD (NM_SETTING_VLAN_SETTING_NAME, 0),                  /* 18 */
-	SETTING_FIELD (NM_SETTING_ADSL_SETTING_NAME, 0),                  /* 19 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_SETTING_NAME, 0),                /* 20 */
-	SETTING_FIELD (NM_SETTING_BRIDGE_PORT_SETTING_NAME, 0),           /* 21 */
-	SETTING_FIELD (NM_SETTING_TEAM_SETTING_NAME, 0),                  /* 22 */
-	SETTING_FIELD (NM_SETTING_TEAM_PORT_SETTING_NAME, 0),             /* 23 */
-	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
+	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 */
+	{NULL, NULL, 0, NULL, NULL, FALSE, FALSE, 0}
 };
 #define NMC_FIELDS_SETTINGS_NAMES_ALL_X  NM_SETTING_CONNECTION_SETTING_NAME","\
                                          NM_SETTING_WIRED_SETTING_NAME","\
@@ -348,6 +375,7 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
 {
 	GError *error = NULL;
 	GArray *print_settings_array;
+	GPtrArray *prop_array = NULL;
 	int i;
 	char *fields_str;
 	char *fields_all =    NMC_FIELDS_SETTINGS_NAMES_ALL;
@@ -361,7 +389,7 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
 	else
 		fields_str = nmc->required_fields;
 
-	print_settings_array = parse_output_fields (fields_str, nmc_fields_settings_names, FALSE, NULL, &error);
+	print_settings_array = parse_output_fields (fields_str, nmc_fields_settings_names, TRUE, &prop_array, &error);
 	if (error) {
 		g_string_printf (nmc->return_text, _("Error: 'list configured': %s"), error->message);
 		g_error_free (error);
@@ -382,6 +410,7 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
 	for (i = 0; i < print_settings_array->len; i++) {
 		NMSetting *setting;
 		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)
 			printf ("\n"); /* Empty line */
@@ -393,14 +422,16 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
 
 		setting = nm_connection_get_setting_by_name (connection, nmc_fields_settings_names[section_idx].name);
 		if (setting) {
-			setting_details (setting, nmc);
+			setting_details (setting, nmc, prop_name);
 			was_output = TRUE;
 			continue;
 		}
 	}
 
 	if (print_settings_array)
 		g_array_free (print_settings_array, FALSE);
+	if (prop_array)
+		g_ptr_array_free (prop_array, TRUE);
 
 	return TRUE;
 }
@@ -5382,7 +5413,7 @@ editor_show_setting (NMSetting *setting, NmCli *nmc)
 	/* Remove any previous data */
 	nmc_empty_output_fields (nmc);
 
-	setting_details (setting, nmc);
+	setting_details (setting, nmc, NULL);
 }
 
 typedef enum {
diff --git a/cli/src/settings.c b/cli/src/settings.c
index baee672..c4d0fec 100644
--- a/cli/src/settings.c
+++ b/cli/src/settings.c
@@ -37,7 +37,7 @@ static char *wep_key_type_to_string (NMWepKeyType type);
 #define SETTING_FIELD(setting, width) { setting, N_(setting), width, NULL, FALSE, FALSE, 0 }
 
 /* Available fields for NM_SETTING_CONNECTION_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_connection[] = {
+NmcOutputField nmc_fields_setting_connection[] = {
 	SETTING_FIELD ("name",  15),                                     /* 0 */
 	SETTING_FIELD (NM_SETTING_CONNECTION_ID, 25),                    /* 1 */
 	SETTING_FIELD (NM_SETTING_CONNECTION_UUID, 38),                  /* 2 */
@@ -71,7 +71,7 @@ static NmcOutputField nmc_fields_setting_connection[] = {
 #define NMC_FIELDS_SETTING_CONNECTION_COMMON  NMC_FIELDS_SETTING_CONNECTION_ALL
 
 /* Available fields for NM_SETTING_WIRED_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_wired[] = {
+NmcOutputField nmc_fields_setting_wired[] = {
 	SETTING_FIELD ("name",  17),                                  /* 0 */
 	SETTING_FIELD (NM_SETTING_WIRED_PORT, 8),                     /* 1 */
 	SETTING_FIELD (NM_SETTING_WIRED_SPEED, 10),                   /* 2 */
@@ -101,7 +101,7 @@ static NmcOutputField nmc_fields_setting_wired[] = {
 #define NMC_FIELDS_SETTING_WIRED_COMMON  NMC_FIELDS_SETTING_WIRED_ALL
 
 /* Available fields for NM_SETTING_802_1X_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_8021X[] = {
+NmcOutputField nmc_fields_setting_8021X[] = {
 	SETTING_FIELD ("name", 10),                                              /* 0 */
 	SETTING_FIELD (NM_SETTING_802_1X_EAP, 10),                               /* 1 */
 	SETTING_FIELD (NM_SETTING_802_1X_IDENTITY, 15),                          /* 2 */
@@ -173,7 +173,7 @@ static NmcOutputField nmc_fields_setting_8021X[] = {
 #define NMC_FIELDS_SETTING_802_1X_COMMON  NMC_FIELDS_SETTING_802_1X_ALL
 
 /* Available fields for NM_SETTING_WIRELESS_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_wireless[] = {
+NmcOutputField nmc_fields_setting_wireless[] = {
 	SETTING_FIELD ("name", 17),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_WIRELESS_SSID, 34),                      /* 1 */
 	SETTING_FIELD (NM_SETTING_WIRELESS_MODE, 15),                      /* 2 */
@@ -207,7 +207,7 @@ static NmcOutputField nmc_fields_setting_wireless[] = {
 #define NMC_FIELDS_SETTING_WIRELESS_COMMON  NMC_FIELDS_SETTING_WIRELESS_ALL
 
 /* Available fields for NM_SETTING_WIRELESS_SECURITY_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_wireless_security[] = {
+NmcOutputField nmc_fields_setting_wireless_security[] = {
 	SETTING_FIELD ("name", 25),                                           /* 0 */
 	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, 10),            /* 1 */
 	SETTING_FIELD (NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX, 15),       /* 2 */
@@ -249,7 +249,7 @@ static NmcOutputField nmc_fields_setting_wireless_security[] = {
 #define NMC_FIELDS_SETTING_WIRELESS_SECURITY_COMMON  NMC_FIELDS_SETTING_WIRELESS_SECURITY_ALL
 
 /* Available fields for NM_SETTING_IP4_CONFIG_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_ip4_config[] = {
+NmcOutputField nmc_fields_setting_ip4_config[] = {
 	SETTING_FIELD ("name", 8),                                         /* 0 */
 	SETTING_FIELD (NM_SETTING_IP4_CONFIG_METHOD, 10),                  /* 1 */
 	SETTING_FIELD (NM_SETTING_IP4_CONFIG_DNS, 20),                     /* 2 */
@@ -281,7 +281,7 @@ static NmcOutputField nmc_fields_setting_ip4_config[] = {
 #define NMC_FIELDS_SETTING_IP4_CONFIG_COMMON  NMC_FIELDS_SETTING_IP4_CONFIG_ALL
 
 /* Available fields for NM_SETTING_IP6_CONFIG_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_ip6_config[] = {
+NmcOutputField nmc_fields_setting_ip6_config[] = {
 	SETTING_FIELD ("name", 8),                                         /* 0 */
 	SETTING_FIELD (NM_SETTING_IP6_CONFIG_METHOD, 10),                  /* 1 */
 	SETTING_FIELD (NM_SETTING_IP6_CONFIG_DNS, 20),                     /* 2 */
@@ -311,7 +311,7 @@ static NmcOutputField nmc_fields_setting_ip6_config[] = {
 #define NMC_FIELDS_SETTING_IP6_CONFIG_COMMON  NMC_FIELDS_SETTING_IP4_CONFIG_ALL
 
 /* Available fields for NM_SETTING_SERIAL_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_serial[] = {
+NmcOutputField nmc_fields_setting_serial[] = {
 	SETTING_FIELD ("name", 10),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_SERIAL_BAUD, 10),                        /* 1 */
 	SETTING_FIELD (NM_SETTING_SERIAL_BITS, 10),                        /* 2 */
@@ -329,7 +329,7 @@ static NmcOutputField nmc_fields_setting_serial[] = {
 #define NMC_FIELDS_SETTING_SERIAL_COMMON  NMC_FIELDS_SETTING_SERIAL_ALL
 
 /* Available fields for NM_SETTING_PPP_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_ppp[] = {
+NmcOutputField nmc_fields_setting_ppp[] = {
 	SETTING_FIELD ("name", 10),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_PPP_NOAUTH, 10),                         /* 1 */
 	SETTING_FIELD (NM_SETTING_PPP_REFUSE_EAP, 10),                     /* 2 */
@@ -373,7 +373,7 @@ static NmcOutputField nmc_fields_setting_ppp[] = {
 #define NMC_FIELDS_SETTING_PPP_COMMON  NMC_FIELDS_SETTING_PPP_ALL
 
 /* Available fields for NM_SETTING_PPPOE_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_pppoe[] = {
+NmcOutputField nmc_fields_setting_pppoe[] = {
 	SETTING_FIELD ("name", 10),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_PPPOE_SERVICE, 12),                      /* 1 */
 	SETTING_FIELD (NM_SETTING_PPPOE_USERNAME, 15),                     /* 2 */
@@ -389,7 +389,7 @@ static NmcOutputField nmc_fields_setting_pppoe[] = {
 #define NMC_FIELDS_SETTING_PPPOE_COMMON  NMC_FIELDS_SETTING_PPPOE_ALL
 
 /* Available fields for NM_SETTING_ADSL_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_adsl[] = {
+NmcOutputField nmc_fields_setting_adsl[] = {
 	SETTING_FIELD ("name", 10),                                /* 0 */
 	SETTING_FIELD (NM_SETTING_ADSL_USERNAME, 15),              /* 1 */
 	SETTING_FIELD (NM_SETTING_ADSL_PASSWORD, 15),              /* 2 */
@@ -411,7 +411,7 @@ static NmcOutputField nmc_fields_setting_adsl[] = {
 #define NMC_FIELDS_SETTING_ADSL_COMMON  NMC_FIELDS_SETTING_ADSL_ALL
 
 /* Available fields for NM_SETTING_GSM_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_gsm[] = {
+NmcOutputField nmc_fields_setting_gsm[] = {
 	SETTING_FIELD ("name", 10),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_GSM_NUMBER, 10),                         /* 1 */
 	SETTING_FIELD (NM_SETTING_GSM_USERNAME, 15),                       /* 2 */
@@ -441,7 +441,7 @@ static NmcOutputField nmc_fields_setting_gsm[] = {
 #define NMC_FIELDS_SETTING_GSM_COMMON  NMC_FIELDS_SETTING_GSM_ALL
 
 /* Available fields for NM_SETTING_CDMA_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_cdma[] = {
+NmcOutputField nmc_fields_setting_cdma[] = {
 	SETTING_FIELD ("name", 10),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_CDMA_NUMBER, 15),                        /* 1 */
 	SETTING_FIELD (NM_SETTING_CDMA_USERNAME, 15),                      /* 2 */
@@ -457,7 +457,7 @@ static NmcOutputField nmc_fields_setting_cdma[] = {
 #define NMC_FIELDS_SETTING_CDMA_COMMON  NMC_FIELDS_SETTING_CDMA_ALL
 
 /* Available fields for NM_SETTING_BLUETOOTH_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_bluetooth[] = {
+NmcOutputField nmc_fields_setting_bluetooth[] = {
 	SETTING_FIELD ("name", 11),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_BLUETOOTH_BDADDR, 19),                   /* 1 */
 	SETTING_FIELD (NM_SETTING_BLUETOOTH_TYPE, 10),                     /* 2 */
@@ -469,7 +469,7 @@ static NmcOutputField nmc_fields_setting_bluetooth[] = {
 #define NMC_FIELDS_SETTING_BLUETOOTH_COMMON  NMC_FIELDS_SETTING_BLUETOOTH_ALL
 
 /* Available fields for NM_SETTING_OLPC_MESH_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_olpc_mesh[] = {
+NmcOutputField nmc_fields_setting_olpc_mesh[] = {
 	SETTING_FIELD ("name", 18),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_OLPC_MESH_SSID, 34),                     /* 1 */
 	SETTING_FIELD (NM_SETTING_OLPC_MESH_CHANNEL, 12),                  /* 2 */
@@ -483,7 +483,7 @@ static NmcOutputField nmc_fields_setting_olpc_mesh[] = {
 #define NMC_FIELDS_SETTING_OLPC_MESH_COMMON  NMC_FIELDS_SETTING_OLPC_MESH_ALL
 
 /* Available fields for NM_SETTING_VPN_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_vpn[] = {
+NmcOutputField nmc_fields_setting_vpn[] = {
 	SETTING_FIELD ("name", 6),                                         /* 0 */
 	SETTING_FIELD (NM_SETTING_VPN_SERVICE_TYPE, 40),                   /* 1 */
 	SETTING_FIELD (NM_SETTING_VPN_USER_NAME, 12),                      /* 2 */
@@ -499,7 +499,7 @@ static NmcOutputField nmc_fields_setting_vpn[] = {
 #define NMC_FIELDS_SETTING_VPN_COMMON  NMC_FIELDS_SETTING_VPN_ALL
 
 /* Available fields for NM_SETTING_WIMAX_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_wimax[] = {
+NmcOutputField nmc_fields_setting_wimax[] = {
 	SETTING_FIELD ("name", 6),                                         /* 0 */
 	SETTING_FIELD (NM_SETTING_WIMAX_MAC_ADDRESS, 19),                  /* 1 */
 	SETTING_FIELD (NM_SETTING_WIMAX_NETWORK_NAME, 40),                 /* 2 */
@@ -511,7 +511,7 @@ static NmcOutputField nmc_fields_setting_wimax[] = {
 #define NMC_FIELDS_SETTING_WIMAX_COMMON  NMC_FIELDS_SETTING_WIMAX_ALL
 
 /* Available fields for NM_SETTING_INFINIBAND_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_infiniband[] = {
+NmcOutputField nmc_fields_setting_infiniband[] = {
 	SETTING_FIELD ("name",  12),                                       /* 0 */
 	SETTING_FIELD (NM_SETTING_INFINIBAND_MAC_ADDRESS, 61),             /* 1 */
 	SETTING_FIELD (NM_SETTING_INFINIBAND_MTU, 6),                      /* 2 */
@@ -529,7 +529,7 @@ static NmcOutputField nmc_fields_setting_infiniband[] = {
 #define NMC_FIELDS_SETTING_INFINIBAND_COMMON  NMC_FIELDS_SETTING_INFINIBAND_ALL \
 
 /* Available fields for NM_SETTING_BOND_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_bond[] = {
+NmcOutputField nmc_fields_setting_bond[] = {
 	SETTING_FIELD ("name",  8),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_BOND_INTERFACE_NAME, 15),                /* 1 */
 	SETTING_FIELD (NM_SETTING_BOND_OPTIONS, 30),                       /* 2 */
@@ -541,7 +541,7 @@ static NmcOutputField nmc_fields_setting_bond[] = {
 #define NMC_FIELDS_SETTING_BOND_COMMON  NMC_FIELDS_SETTING_BOND_ALL
 
 /* Available fields for NM_SETTING_VLAN_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_vlan[] = {
+NmcOutputField nmc_fields_setting_vlan[] = {
 	SETTING_FIELD ("name",  6),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_VLAN_INTERFACE_NAME, 15),                /* 1 */
 	SETTING_FIELD (NM_SETTING_VLAN_PARENT, 8),                         /* 2 */
@@ -561,7 +561,7 @@ static NmcOutputField nmc_fields_setting_vlan[] = {
 #define NMC_FIELDS_SETTING_VLAN_COMMON  NMC_FIELDS_SETTING_VLAN_ALL
 
 /* Available fields for NM_SETTING_BRIDGE_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_bridge[] = {
+NmcOutputField nmc_fields_setting_bridge[] = {
 	SETTING_FIELD ("name",  8),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_BRIDGE_INTERFACE_NAME, 15),              /* 1 */
 	SETTING_FIELD (NM_SETTING_BRIDGE_STP, 5),                          /* 2 */
@@ -583,7 +583,7 @@ static NmcOutputField nmc_fields_setting_bridge[] = {
 #define NMC_FIELDS_SETTING_BRIDGE_COMMON NMC_FIELDS_SETTING_BRIDGE_ALL
 
 /* Available fields for NM_SETTING_BRIDGE_PORT_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_bridge_port[] = {
+NmcOutputField nmc_fields_setting_bridge_port[] = {
 	SETTING_FIELD ("name",  8),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_BRIDGE_PORT_PRIORITY, 10),               /* 1 */
 	SETTING_FIELD (NM_SETTING_BRIDGE_PORT_PATH_COST, 12),              /* 2 */
@@ -597,7 +597,7 @@ static NmcOutputField nmc_fields_setting_bridge_port[] = {
 #define NMC_FIELDS_SETTING_BRIDGE_PORT_COMMON NMC_FIELDS_SETTING_BRIDGE_PORT_ALL
 
 /* Available fields for NM_SETTING_TEAM_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_team[] = {
+NmcOutputField nmc_fields_setting_team[] = {
 	SETTING_FIELD ("name",  8),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_TEAM_INTERFACE_NAME, 15),                /* 1 */
 	SETTING_FIELD (NM_SETTING_TEAM_CONFIG, 30),                        /* 2 */
@@ -609,7 +609,7 @@ static NmcOutputField nmc_fields_setting_team[] = {
 #define NMC_FIELDS_SETTING_TEAM_COMMON  NMC_FIELDS_SETTING_TEAM_ALL
 
 /* Available fields for NM_SETTING_TEAM_PORT_SETTING_NAME */
-static NmcOutputField nmc_fields_setting_team_port[] = {
+NmcOutputField nmc_fields_setting_team_port[] = {
 	SETTING_FIELD ("name",  8),                                        /* 0 */
 	SETTING_FIELD (NM_SETTING_TEAM_PORT_CONFIG, 30),                   /* 1 */
 	{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
@@ -5830,7 +5830,7 @@ nmc_property_set_gvalue (NMSetting *setting, const char *prop, GValue *value)
 /*----------------------------------------------------------------------------*/
 
 static gboolean
-setting_connection_details (NMSetting *setting, NmCli *nmc)
+setting_connection_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingConnection *s_con = NM_SETTING_CONNECTION (setting);
 	NmcOutputField *tmpl, *arr;
@@ -5840,7 +5840,8 @@ setting_connection_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_connection;
 	tmpl_len = sizeof (nmc_fields_setting_connection);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_CONNECTION_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_CONNECTION_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);
 
@@ -5867,7 +5868,7 @@ setting_connection_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_wired_details (NMSetting *setting, NmCli *nmc)
+setting_wired_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingWired *s_wired = NM_SETTING_WIRED (setting);
 	NmcOutputField *tmpl, *arr;
@@ -5877,7 +5878,8 @@ setting_wired_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_wired;
 	tmpl_len = sizeof (nmc_fields_setting_wired);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRED_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_WIRED_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);
 
@@ -5902,7 +5904,7 @@ setting_wired_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_802_1X_details (NMSetting *setting, NmCli *nmc)
+setting_802_1X_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSetting8021x *s_8021x = NM_SETTING_802_1X (setting);
 	NmcOutputField *tmpl, *arr;
@@ -5912,7 +5914,8 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_8021X;
 	tmpl_len = sizeof (nmc_fields_setting_8021X);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_802_1X_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_802_1X_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);
 
@@ -5958,7 +5961,7 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_wireless_details (NMSetting *setting, NmCli *nmc)
+setting_wireless_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (setting);
 	NmcOutputField *tmpl, *arr;
@@ -5968,7 +5971,8 @@ setting_wireless_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_wireless;
 	tmpl_len = sizeof (nmc_fields_setting_wireless);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRELESS_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_WIRELESS_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);
 
@@ -5995,7 +5999,7 @@ setting_wireless_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_wireless_security_details (NMSetting *setting, NmCli *nmc)
+setting_wireless_security_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6005,7 +6009,8 @@ setting_wireless_security_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_wireless_security;
 	tmpl_len = sizeof (nmc_fields_setting_wireless_security);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIRELESS_SECURITY_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_WIRELESS_SECURITY_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);
 
@@ -6036,7 +6041,7 @@ setting_wireless_security_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_ip4_config_details (NMSetting *setting, NmCli *nmc)
+setting_ip4_config_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingIP4Config *s_ip4 = NM_SETTING_IP4_CONFIG (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6046,7 +6051,8 @@ setting_ip4_config_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_ip4_config;
 	tmpl_len = sizeof (nmc_fields_setting_ip4_config);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_IP4_CONFIG_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_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);
 
@@ -6072,7 +6078,7 @@ setting_ip4_config_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_ip6_config_details (NMSetting *setting, NmCli *nmc)
+setting_ip6_config_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingIP6Config *s_ip6 = NM_SETTING_IP6_CONFIG (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6082,7 +6088,8 @@ setting_ip6_config_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_ip6_config;
 	tmpl_len = sizeof (nmc_fields_setting_ip6_config);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_IP6_CONFIG_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_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);
 
@@ -6107,7 +6114,7 @@ setting_ip6_config_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_serial_details (NMSetting *setting, NmCli *nmc)
+setting_serial_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingSerial *s_serial = NM_SETTING_SERIAL (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6117,7 +6124,8 @@ setting_serial_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_serial;
 	tmpl_len = sizeof (nmc_fields_setting_serial);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_SERIAL_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_SERIAL_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);
 
@@ -6136,7 +6144,7 @@ setting_serial_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_ppp_details (NMSetting *setting, NmCli *nmc)
+setting_ppp_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingPPP *s_ppp = NM_SETTING_PPP (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6146,7 +6154,8 @@ setting_ppp_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_ppp;
 	tmpl_len = sizeof (nmc_fields_setting_ppp);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_PPP_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_PPP_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);
 
@@ -6178,7 +6187,7 @@ setting_ppp_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_pppoe_details (NMSetting *setting, NmCli *nmc)
+setting_pppoe_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingPPPOE *s_pppoe = NM_SETTING_PPPOE (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6188,7 +6197,8 @@ setting_pppoe_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_pppoe;
 	tmpl_len = sizeof (nmc_fields_setting_pppoe);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_PPPOE_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_PPPOE_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);
 
@@ -6206,7 +6216,7 @@ setting_pppoe_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_gsm_details (NMSetting *setting, NmCli *nmc)
+setting_gsm_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingGsm *s_gsm = NM_SETTING_GSM (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6216,7 +6226,8 @@ setting_gsm_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_gsm;
 	tmpl_len = sizeof (nmc_fields_setting_gsm);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_GSM_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_GSM_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);
 
@@ -6241,7 +6252,7 @@ setting_gsm_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_cdma_details (NMSetting *setting, NmCli *nmc)
+setting_cdma_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingCdma *s_cdma = NM_SETTING_CDMA (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6251,7 +6262,8 @@ setting_cdma_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_cdma;
 	tmpl_len = sizeof (nmc_fields_setting_cdma);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_CDMA_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_CDMA_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);
 
@@ -6269,7 +6281,7 @@ setting_cdma_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_bluetooth_details (NMSetting *setting, NmCli *nmc)
+setting_bluetooth_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingBluetooth *s_bluetooth = NM_SETTING_BLUETOOTH (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6279,7 +6291,8 @@ setting_bluetooth_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_bluetooth;
 	tmpl_len = sizeof (nmc_fields_setting_bluetooth);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BLUETOOTH_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_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);
 
@@ -6295,7 +6308,7 @@ setting_bluetooth_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc)
+setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingOlpcMesh *s_olpc_mesh = NM_SETTING_OLPC_MESH (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6305,7 +6318,8 @@ setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_olpc_mesh;
 	tmpl_len = sizeof (nmc_fields_setting_olpc_mesh);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_OLPC_MESH_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_OLPC_MESH_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);
 
@@ -6322,7 +6336,7 @@ setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_vpn_details (NMSetting *setting, NmCli *nmc)
+setting_vpn_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingVPN *s_vpn = NM_SETTING_VPN (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6332,7 +6346,8 @@ setting_vpn_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_vpn;
 	tmpl_len = sizeof (nmc_fields_setting_vpn);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_VPN_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_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);
 
@@ -6350,7 +6365,7 @@ setting_vpn_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_wimax_details (NMSetting *setting, NmCli *nmc)
+setting_wimax_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingWimax *s_wimax = NM_SETTING_WIMAX (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6360,7 +6375,8 @@ setting_wimax_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_wimax;
 	tmpl_len = sizeof (nmc_fields_setting_wimax);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIMAX_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_WIMAX_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);
 
@@ -6376,7 +6392,7 @@ setting_wimax_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_infiniband_details (NMSetting *setting, NmCli *nmc)
+setting_infiniband_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingInfiniband *s_infiniband = NM_SETTING_INFINIBAND (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6386,7 +6402,8 @@ setting_infiniband_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_infiniband;
 	tmpl_len = sizeof (nmc_fields_setting_infiniband);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_INFINIBAND_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_INFINIBAND_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);
 
@@ -6405,7 +6422,7 @@ setting_infiniband_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_bond_details (NMSetting *setting, NmCli *nmc)
+setting_bond_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingBond *s_bond = NM_SETTING_BOND (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6415,7 +6432,8 @@ setting_bond_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_bond;
 	tmpl_len = sizeof (nmc_fields_setting_bond);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BOND_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_BOND_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);
 
@@ -6431,7 +6449,7 @@ setting_bond_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_vlan_details (NMSetting *setting, NmCli *nmc)
+setting_vlan_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingVlan *s_vlan = NM_SETTING_VLAN (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6441,7 +6459,8 @@ setting_vlan_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_vlan;
 	tmpl_len = sizeof (nmc_fields_setting_vlan);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_VLAN_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_VLAN_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);
 
@@ -6461,7 +6480,7 @@ setting_vlan_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_adsl_details (NMSetting *setting, NmCli *nmc)
+setting_adsl_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingAdsl *s_adsl = NM_SETTING_ADSL (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6471,7 +6490,8 @@ setting_adsl_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_adsl;
 	tmpl_len = sizeof (nmc_fields_setting_adsl);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_ADSL_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_ADSL_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);
 
@@ -6492,7 +6512,7 @@ setting_adsl_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_bridge_details (NMSetting *setting, NmCli *nmc)
+setting_bridge_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingBridge *s_bridge = NM_SETTING_BRIDGE (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6502,7 +6522,8 @@ setting_bridge_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_bridge;
 	tmpl_len = sizeof (nmc_fields_setting_bridge);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BRIDGE_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_BRIDGE_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);
 
@@ -6523,7 +6544,7 @@ setting_bridge_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_bridge_port_details (NMSetting *setting, NmCli *nmc)
+setting_bridge_port_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingBridgePort *s_bridge_port = NM_SETTING_BRIDGE_PORT (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6533,7 +6554,8 @@ setting_bridge_port_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_bridge_port;
 	tmpl_len = sizeof (nmc_fields_setting_bridge_port);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_BRIDGE_PORT_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_BRIDGE_PORT_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);
 
@@ -6550,7 +6572,7 @@ setting_bridge_port_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_team_details (NMSetting *setting, NmCli *nmc)
+setting_team_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingTeam *s_team = NM_SETTING_TEAM (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6560,7 +6582,8 @@ setting_team_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_team;
 	tmpl_len = sizeof (nmc_fields_setting_team);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_TEAM_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_TEAM_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);
 
@@ -6576,7 +6599,7 @@ setting_team_details (NMSetting *setting, NmCli *nmc)
 }
 
 static gboolean
-setting_team_port_details (NMSetting *setting, NmCli *nmc)
+setting_team_port_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	NMSettingTeamPort *s_team_port = NM_SETTING_TEAM_PORT (setting);
 	NmcOutputField *tmpl, *arr;
@@ -6586,7 +6609,8 @@ setting_team_port_details (NMSetting *setting, NmCli *nmc)
 
 	tmpl = nmc_fields_setting_team_port;
 	tmpl_len = sizeof (nmc_fields_setting_team_port);
-	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_TEAM_PORT_ALL, tmpl, FALSE, NULL, NULL);
+	nmc->print_fields.indices = parse_output_fields (one_prop ? one_prop : NMC_FIELDS_SETTING_TEAM_PORT_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);
 
@@ -6641,7 +6666,7 @@ setting_dcb_details (NMSetting *setting, NmCli *nmc)
 
 typedef struct {
 	const char *sname;
-	gboolean (*func) (NMSetting *setting, NmCli *nmc);
+	gboolean (*func) (NMSetting *setting, NmCli *nmc, const char *one_prop);
 } SettingDetails;
 
 static const SettingDetails detail_printers[] = {
@@ -6674,7 +6699,7 @@ static const SettingDetails detail_printers[] = {
 };
 
 gboolean
-setting_details (NMSetting *setting, NmCli *nmc)
+setting_details (NMSetting *setting, NmCli *nmc, const char *one_prop)
 {
 	const SettingDetails *iter = &detail_printers[0];
 
@@ -6682,7 +6707,7 @@ setting_details (NMSetting *setting, NmCli *nmc)
 
 	while (iter->sname) {
 		if (nm_connection_lookup_setting_type (iter->sname) == G_OBJECT_TYPE (setting))
-			return iter->func (setting, nmc);
+			return iter->func (setting, nmc, one_prop);
 		iter++;
 	}
 
diff --git a/cli/src/settings.h b/cli/src/settings.h
index d172ac9..e60cabd 100644
--- a/cli/src/settings.h
+++ b/cli/src/settings.h
@@ -14,7 +14,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * (C) Copyright 2010 - 2012 Red Hat, Inc.
+ * (C) Copyright 2010 - 2013 Red Hat, Inc.
  */
 
 #ifndef NMC_SETTINGS_H
@@ -83,6 +83,6 @@ void nmc_property_set_default_value (NMSetting *setting, const char *prop);
 gboolean nmc_property_get_gvalue (NMSetting *setting, const char *prop, GValue *value);
 gboolean nmc_property_set_gvalue (NMSetting *setting, const char *prop, GValue *value);
 
-gboolean setting_details (NMSetting *ssetting, NmCli *nmc);
+gboolean setting_details (NMSetting *ssetting, NmCli *nmc, const char *one_prop);
 
 #endif /* NMC_SETTINGS_H */
-- 
1.7.11.7


From abaa17edb9a1d80caaca635734db2b90a294ccd2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
Date: Tue, 17 Dec 2013 14:55:13 +0100
Subject: [PATCH 4/4] cli: fix compilation without WiMAX
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit


Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
---
 cli/src/devices.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/cli/src/devices.c b/cli/src/devices.c
index 037d880..f21e063 100644
--- a/cli/src/devices.c
+++ b/cli/src/devices.c
@@ -150,7 +150,6 @@ static NmcOutputField nmc_fields_dev_show_wifi_prop[] = {
 #define NMC_FIELDS_DEV_SHOW_WIFI_PROP_ALL     "NAME,WEP,WPA,WPA2,TKIP,CCMP,AP,ADHOC"
 #define NMC_FIELDS_DEV_SHOW_WIFI_PROP_COMMON  "NAME,WEP,WPA,WPA2,TKIP,CCMP,AP,ADHOC"
 
-#if WITH_WIMAX
 /* Available fields for 'device show' - wimax properties part */
 static NmcOutputField nmc_fields_dev_show_wimax_prop[] = {
 	{"NAME",       N_("NAME"),     18},  /* 0 */
@@ -163,8 +162,6 @@ static NmcOutputField nmc_fields_dev_show_wimax_prop[] = {
 };
 #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"
-#endif
-
 
 /* Available fields for 'device wifi list' */
 static NmcOutputField nmc_fields_dev_wifi_list[] = {
@@ -192,7 +189,6 @@ static NmcOutputField nmc_fields_dev_wifi_list[] = {
 #define NMC_FIELDS_DEV_WIFI_LIST_COMMON        "IN-USE,SSID,MODE,CHAN,RATE,SIGNAL,BARS,SECURITY"
 #define NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST  "NAME,"NMC_FIELDS_DEV_WIFI_LIST_COMMON
 
-#if WITH_WIMAX
 /* Available fields for 'device wimax list' */
 static NmcOutputField nmc_fields_dev_wimax_list[] = {
 	{"NAME",       N_("NAME"),        15},  /* 0 */
@@ -207,7 +203,6 @@ static NmcOutputField nmc_fields_dev_wimax_list[] = {
 #define NMC_FIELDS_DEV_WIMAX_LIST_ALL           "NSP,SIGNAL,TYPE,DEVICE,ACTIVE,DBUS-PATH"
 #define NMC_FIELDS_DEV_WIMAX_LIST_COMMON        "NSP,SIGNAL,TYPE,DEVICE,ACTIVE"
 #define NMC_FIELDS_DEV_WIMAX_LIST_FOR_DEV_LIST  "NAME,"NMC_FIELDS_DEV_WIMAX_LIST_COMMON
-#endif
 
 /* Available fields for 'device show' - BOND part */
 static NmcOutputField nmc_fields_dev_show_bond_prop[] = {
-- 
1.7.11.7