about summary refs log tree commit diff
path: root/clients/cli/common.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2018-09-08 17:44:06 +0200
committerMichael Biebl <biebl@debian.org>2018-09-08 17:44:06 +0200
commit8f7a3cbbdd0c0a48277c341dd3a8ec8743ae9735 (patch)
tree4353551fcb59cc822c3cadf2f4888f70601e8fbf /clients/cli/common.c
parentcaf1db9d6fbc056cc6c76a24574890f6c7895f3d (diff)
New upstream version 1.13.90 upstream/1.13.90
Diffstat (limited to 'clients/cli/common.c')
-rw-r--r--clients/cli/common.c191
1 files changed, 103 insertions, 88 deletions
diff --git a/clients/cli/common.c b/clients/cli/common.c
index 09c86334..ede447ba 100644
--- a/clients/cli/common.c
+++ b/clients/cli/common.c
@@ -102,6 +102,8 @@ _ip_config_get_routes (NMIPConfig *cfg)
 	return arr;
 }
 
+/*****************************************************************************/
+
 static gconstpointer
 _metagen_ip4_config_get_fcn (NMC_META_GENERIC_INFO_GET_FCN_ARGS)
 {
@@ -177,6 +179,19 @@ arr_out:
 	return arr;
 }
 
+const NmcMetaGenericInfo *const metagen_ip4_config[_NMC_GENERIC_INFO_TYPE_IP4_CONFIG_NUM + 1] = {
+#define _METAGEN_IP4_CONFIG(type, name) \
+	[type] = NMC_META_GENERIC(name, .info_type = type, .get_fcn = _metagen_ip4_config_get_fcn)
+	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_ADDRESS, "ADDRESS"),
+	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_GATEWAY, "GATEWAY"),
+	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_ROUTE,   "ROUTE"),
+	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DNS,     "DNS"),
+	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DOMAIN,  "DOMAIN"),
+	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_WINS,    "WINS"),
+};
+
+/*****************************************************************************/
+
 static gconstpointer
 _metagen_ip6_config_get_fcn (NMC_META_GENERIC_INFO_GET_FCN_ARGS)
 {
@@ -247,17 +262,6 @@ arr_out:
 	return arr;
 }
 
-const NmcMetaGenericInfo *const metagen_ip4_config[_NMC_GENERIC_INFO_TYPE_IP4_CONFIG_NUM + 1] = {
-#define _METAGEN_IP4_CONFIG(type, name) \
-	[type] = NMC_META_GENERIC(name, .info_type = type, .get_fcn = _metagen_ip4_config_get_fcn)
-	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_ADDRESS, "ADDRESS"),
-	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_GATEWAY, "GATEWAY"),
-	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_ROUTE,   "ROUTE"),
-	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DNS,     "DNS"),
-	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DOMAIN,  "DOMAIN"),
-	_METAGEN_IP4_CONFIG (NMC_GENERIC_INFO_TYPE_IP4_CONFIG_WINS,    "WINS"),
-};
-
 const NmcMetaGenericInfo *const metagen_ip6_config[_NMC_GENERIC_INFO_TYPE_IP6_CONFIG_NUM + 1] = {
 #define _METAGEN_IP6_CONFIG(type, name) \
 	[type] = NMC_META_GENERIC(name, .info_type = type, .get_fcn = _metagen_ip6_config_get_fcn)
@@ -270,40 +274,92 @@ const NmcMetaGenericInfo *const metagen_ip6_config[_NMC_GENERIC_INFO_TYPE_IP6_CO
 
 /*****************************************************************************/
 
-const NmcMetaGenericInfo *const nmc_fields_dhcp_config[] = {
-	NMC_META_GENERIC ("GROUP"),    /* 0 */
-	NMC_META_GENERIC ("OPTION"),   /* 1 */
-	NULL,
-};
+static gconstpointer
+_metagen_dhcp_config_get_fcn (NMC_META_GENERIC_INFO_GET_FCN_ARGS)
+{
+	NMDhcpConfig *dhcp = target;
+	guint i;
+	char **arr = NULL;
+
+	NMC_HANDLE_COLOR (NM_META_COLOR_NONE);
 
-const NmcMetaGenericInfo *const nmc_fields_ip6_config[] = {
-	NMC_META_GENERIC ("GROUP"),     /* 0 */
-	NMC_META_GENERIC ("ADDRESS"),   /* 1 */
-	NMC_META_GENERIC ("GATEWAY"),   /* 2 */
-	NMC_META_GENERIC ("ROUTE"),     /* 3 */
-	NMC_META_GENERIC ("DNS"),       /* 4 */
-	NMC_META_GENERIC ("DOMAIN"),    /* 5 */
-	NULL,
+	switch (info->info_type) {
+	case NMC_GENERIC_INFO_TYPE_DHCP_CONFIG_OPTION:
+		{
+			GHashTable *table;
+			gs_free char **arr2 = NULL;
+			guint n;
+
+			if (!NM_FLAGS_HAS (get_flags, NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV))
+				return NULL;
+
+			table = nm_dhcp_config_get_options (dhcp);
+			if (!table)
+				goto arr_out;
+
+			arr2 = (char **) nm_utils_strdict_get_keys (table, TRUE, &n);
+			if (!n)
+				goto arr_out;
+
+			nm_assert (arr2 && !arr2[n] && n == NM_PTRARRAY_LEN (arr2));
+			for (i = 0; i < n; i++) {
+				const char *k = arr2[i];
+				const char *v;
+
+				nm_assert (k);
+				v = g_hash_table_lookup (table, k);
+				arr2[i] = g_strdup_printf ("%s = %s", k, v);
+			}
+
+			arr = g_steal_pointer (&arr2);
+			goto arr_out;
+		}
+	default:
+		break;
+	}
+
+	g_return_val_if_reached (NULL);
+
+arr_out:
+	NM_SET_OUT (out_is_default, !arr || !arr[0]);
+	*out_flags |= NM_META_ACCESSOR_GET_OUT_FLAGS_STRV;
+	*out_to_free = arr;
+	return arr;
+}
+
+const NmcMetaGenericInfo *const metagen_dhcp_config[_NMC_GENERIC_INFO_TYPE_DHCP_CONFIG_NUM + 1] = {
+#define _METAGEN_DHCP_CONFIG(type, name) \
+	[type] = NMC_META_GENERIC(name, .info_type = type, .get_fcn = _metagen_dhcp_config_get_fcn)
+	_METAGEN_DHCP_CONFIG (NMC_GENERIC_INFO_TYPE_DHCP_CONFIG_OPTION, "OPTION"),
 };
 
+/*****************************************************************************/
+
 gboolean
-print_ip4_config (NMIPConfig *cfg4,
-                  const NmcConfig *nmc_config,
-                  const char *one_field)
+print_ip_config (NMIPConfig *cfg,
+                 int addr_family,
+                 const NmcConfig *nmc_config,
+                 const char *one_field)
 {
 	gs_free_error GError *error = NULL;
 	gs_free char *field_str = NULL;
 
-	if (cfg4 == NULL)
+	if (!cfg)
 		return FALSE;
 
-	if (one_field)
-		field_str = g_strdup_printf ("IP4.%s", one_field);
+	if (one_field) {
+		field_str = g_strdup_printf ("IP%c.%s",
+		                             nm_utils_addr_family_to_char (addr_family),
+		                             one_field);
+	}
 
 	if (!nmc_print (nmc_config,
-	                (gpointer[]) { cfg4, NULL },
+	                (gpointer[]) { cfg, NULL },
+	                NULL,
 	                NULL,
-	                NMC_META_GENERIC_GROUP ("IP4", metagen_ip4_config, N_("GROUP")),
+	                addr_family == AF_INET
+	                  ? NMC_META_GENERIC_GROUP ("IP4", metagen_ip4_config, N_("GROUP"))
+	                  : NMC_META_GENERIC_GROUP ("IP6", metagen_ip6_config, N_("GROUP")),
 	                field_str,
 	                &error)) {
 		return FALSE;
@@ -312,24 +368,30 @@ print_ip4_config (NMIPConfig *cfg4,
 }
 
 gboolean
-print_ip6_config (NMIPConfig *cfg6,
-                  const NmcConfig *nmc_config,
-                  const char *group_prefix,
-                  const char *one_field)
+print_dhcp_config (NMDhcpConfig *dhcp,
+                   int addr_family,
+                   const NmcConfig *nmc_config,
+                   const char *one_field)
 {
 	gs_free_error GError *error = NULL;
 	gs_free char *field_str = NULL;
 
-	if (cfg6 == NULL)
+	if (!dhcp)
 		return FALSE;
 
-	if (one_field)
-		field_str = g_strdup_printf ("IP6.%s", one_field);
+	if (one_field) {
+		field_str = g_strdup_printf ("DHCP%c.%s",
+		                             nm_utils_addr_family_to_char (addr_family),
+		                             one_field);
+	}
 
 	if (!nmc_print (nmc_config,
-	                (gpointer[]) { cfg6, NULL },
+	                (gpointer[]) { dhcp, NULL },
 	                NULL,
-	                NMC_META_GENERIC_GROUP ("IP6", metagen_ip6_config, N_("GROUP")),
+	                NULL,
+	                addr_family == AF_INET
+	                  ? NMC_META_GENERIC_GROUP ("DHCP4", metagen_dhcp_config, N_("GROUP"))
+	                  : NMC_META_GENERIC_GROUP ("DHCP6", metagen_dhcp_config, N_("GROUP")),
 	                field_str,
 	                &error)) {
 		return FALSE;
@@ -337,53 +399,6 @@ print_ip6_config (NMIPConfig *cfg6,
 	return TRUE;
 }
 
-gboolean
-print_dhcp_config (NMDhcpConfig *dhcp,
-                   const NmcConfig *nmc_config,
-                   const char *group_prefix,
-                   const char *one_field)
-{
-	GHashTable *table;
-	const NMMetaAbstractInfo *const*tmpl;
-	NmcOutputField *arr;
-
-	if (dhcp == NULL)
-		return FALSE;
-
-	table = nm_dhcp_config_get_options (dhcp);
-	if (table) {
-		char **options_arr = NULL;
-		NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
-		gs_free const char **keys = NULL;
-		guint i, nkeys;
-
-		tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dhcp_config;
-		out_indices = parse_output_fields (one_field,
-		                                   tmpl, FALSE, NULL, NULL);
-		arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
-		g_ptr_array_add (out.output_data, arr);
-
-		keys = (const char **) g_hash_table_get_keys_as_array (table, &nkeys);
-		nm_utils_strv_sort (keys, nkeys);
-
-		options_arr = g_new (char *, nkeys + 1);
-		for (i = 0; i < nkeys; i++)
-			options_arr[i] = g_strdup_printf ("%s = %s", keys[i], (const char *) g_hash_table_lookup (table, keys[i]));
-		options_arr[i] = NULL;
-
-		arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
-		set_val_strc (arr, 0, group_prefix);
-		set_val_arr  (arr, 1, options_arr);
-		g_ptr_array_add (out.output_data, arr);
-
-		print_data_prepare_width (out.output_data);
-		print_data (nmc_config, out_indices, NULL, 0, &out);
-
-		return TRUE;
-	}
-	return FALSE;
-}
-
 /*
  * nmc_find_connection:
  * @connections: array of NMConnections to search in