about summary refs log tree commit diff
path: root/cli/src/common.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2012-03-24 01:37:02 +0100
committerMichael Biebl <biebl@debian.org>2012-03-24 01:37:02 +0100
commitde06e5715e780baade318f3490ac7a4c9ce84e32 (patch)
tree23fbc3fafc12072476eff98bee60100eb54c29db /cli/src/common.c
parentb436a68a20ff3114ded32a7a3d70cdd4954039f9 (diff)
Imported Upstream version 0.9.4.0 upstream/0.9.4.0
Diffstat (limited to 'cli/src/common.c')
-rw-r--r--cli/src/common.c360
1 files changed, 360 insertions, 0 deletions
diff --git a/cli/src/common.c b/cli/src/common.c
new file mode 100644
index 00000000..e9a5d760
--- /dev/null
+++ b/cli/src/common.c
@@ -0,0 +1,360 @@
+/*
+ *  nmcli - command-line tool for controlling NetworkManager
+ *  Common functions and data shared between files.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2012 Red Hat, Inc.
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include "common.h"
+#include "utils.h"
+
+/* Available fields for IPv4 group */
+static NmcOutputField nmc_fields_ip4_config[] = {
+	{"GROUP",      N_("GROUP"),       15, NULL, 0},  /* 0 */
+	{"ADDRESS",    N_("ADDRESS"),     68, NULL, 0},  /* 1 */
+	{"ROUTE",      N_("ROUTE"),       68, NULL, 0},  /* 2 */
+	{"DNS",        N_("DNS"),         35, NULL, 0},  /* 3 */
+	{"DOMAIN",     N_("DOMAIN"),      35, NULL, 0},  /* 4 */
+	{"WINS",       N_("WINS"),        20, NULL, 0},  /* 5 */
+	{NULL,         NULL,               0, NULL, 0}
+};
+#define NMC_FIELDS_IP4_CONFIG_ALL     "GROUP,ADDRESS,ROUTE,DNS,DOMAIN,WINS"
+
+/* Available fields for DHCPv4 group */
+static NmcOutputField nmc_fields_dhcp4_config[] = {
+	{"GROUP",      N_("GROUP"),       15, NULL, 0},  /* 0 */
+	{"OPTION",     N_("OPTION"),      80, NULL, 0},  /* 1 */
+	{NULL,         NULL,               0, NULL, 0}
+};
+#define NMC_FIELDS_DHCP4_CONFIG_ALL     "GROUP,OPTION"
+
+/* Available fields for IPv6 group */
+static NmcOutputField nmc_fields_ip6_config[] = {
+	{"GROUP",      N_("GROUP"),       15, NULL, 0},  /* 0 */
+	{"ADDRESS",    N_("ADDRESS"),     95, NULL, 0},  /* 1 */
+	{"ROUTE",      N_("ROUTE"),       95, NULL, 0},  /* 2 */
+	{"DNS",        N_("DNS"),         60, NULL, 0},  /* 3 */
+	{"DOMAIN",     N_("DOMAIN"),      35, NULL, 0},  /* 4 */
+	{NULL,         NULL,               0, NULL, 0}
+};
+#define NMC_FIELDS_IP6_CONFIG_ALL     "GROUP,ADDRESS,ROUTE,DNS,DOMAIN"
+
+/* Available fields for DHCPv6 group */
+static NmcOutputField nmc_fields_dhcp6_config[] = {
+	{"GROUP",      N_("GROUP"),       15, NULL, 0},  /* 0 */
+	{"OPTION",     N_("OPTION"),      80, NULL, 0},  /* 1 */
+	{NULL,         NULL,               0, NULL, 0}
+};
+#define NMC_FIELDS_DHCP6_CONFIG_ALL     "GROUP,OPTION"
+
+
+gboolean
+print_ip4_config (NMIP4Config *cfg4, NmCli *nmc, const char *group_prefix)
+{
+	GSList *list, *iter;
+	const GArray *array;
+	const GPtrArray *ptr_array;
+	char **addr_arr = NULL;
+	char **route_arr = NULL;
+	char **dns_arr = NULL;
+	char **domain_arr = NULL;
+	char **wins_arr = NULL;
+	int i = 0;
+	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
+	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
+	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
+
+	if (cfg4 == NULL)
+		return FALSE;
+
+	nmc->allowed_fields = nmc_fields_ip4_config;
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_IP4_CONFIG_ALL, nmc->allowed_fields, NULL);
+	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+
+	/* addresses */
+	list = (GSList *) nm_ip4_config_get_addresses (cfg4);
+	addr_arr = g_new (char *, g_slist_length (list) + 1);
+	for (iter = list; iter; iter = g_slist_next (iter)) {
+		NMIP4Address *addr = (NMIP4Address *) iter->data;
+		guint32 prefix;
+		char *ip_str, *gw_str;
+
+		ip_str = nmc_ip4_address_as_string (nm_ip4_address_get_address (addr), NULL);
+		prefix = nm_ip4_address_get_prefix (addr);
+		gw_str = nmc_ip4_address_as_string (nm_ip4_address_get_gateway (addr), NULL);
+
+		addr_arr[i++] = g_strdup_printf ("ip = %s/%u, gw = %s", ip_str, prefix, gw_str);
+		g_free (ip_str);
+		g_free (gw_str);
+	}
+	addr_arr[i] = NULL;
+
+	/* routes */
+	list = (GSList *) nm_ip4_config_get_routes (cfg4);
+	route_arr = g_new (char *, g_slist_length (list) + 1);
+	i = 0;
+	for (iter = list; iter; iter = g_slist_next (iter)) {
+		NMIP4Route *route = (NMIP4Route *) iter->data;
+		guint32 prefix, metric;
+		char *dest_str, *nexthop_str;
+
+		dest_str = nmc_ip4_address_as_string (nm_ip4_route_get_dest (route), NULL);
+		nexthop_str = nmc_ip4_address_as_string (nm_ip4_route_get_next_hop (route), NULL);
+		prefix = nm_ip4_route_get_prefix (route);
+		metric = nm_ip4_route_get_metric (route);
+
+		route_arr[i++] = g_strdup_printf ("dst = %s/%u, nh = %s, mt = %u", dest_str, prefix, nexthop_str, metric);
+		g_free (dest_str);
+		g_free (nexthop_str);
+	}
+	route_arr[i] = NULL;
+
+	/* DNS */
+	array = nm_ip4_config_get_nameservers (cfg4);
+	if (array) {
+		dns_arr = g_new (char *, array->len + 1);
+		for (i = 0; i < array->len; i++)
+			dns_arr[i] = nmc_ip4_address_as_string (g_array_index (array, guint32, i), NULL);
+
+		dns_arr[i] = NULL;
+	}
+
+	/* domains */
+	ptr_array = nm_ip4_config_get_domains (cfg4);
+	if (ptr_array) {
+		domain_arr = g_new (char *, ptr_array->len + 1);
+		for (i = 0; i < ptr_array->len; i++)
+			domain_arr[i] = g_ptr_array_index (ptr_array, i);
+
+		domain_arr[i] = NULL;
+	}
+
+	/* WINS */
+	array = nm_ip4_config_get_wins_servers (cfg4);
+	if (array) {
+		wins_arr = g_new (char *, array->len + 1);
+		for (i = 0; i < array->len; i++)
+			wins_arr[i] = nmc_ip4_address_as_string (g_array_index (array, guint32, i), NULL);
+
+		wins_arr[i] = NULL;
+	}
+
+	set_val_str (nmc->allowed_fields, 0, group_prefix);
+	set_val_arr (nmc->allowed_fields, 1, (const char **) addr_arr);
+	set_val_arr (nmc->allowed_fields, 2, (const char **) route_arr);
+	set_val_arr (nmc->allowed_fields, 3, (const char **) dns_arr);
+	set_val_arr (nmc->allowed_fields, 4, (const char **) domain_arr);
+	set_val_arr (nmc->allowed_fields, 5, (const char **) wins_arr);
+
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
+	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
+
+	g_strfreev (addr_arr);
+	g_strfreev (route_arr);
+	g_strfreev (dns_arr);
+	g_free (domain_arr);
+	g_strfreev (wins_arr);
+
+	return TRUE;
+}
+
+gboolean
+print_ip6_config (NMIP6Config *cfg6, NmCli *nmc, const char *group_prefix)
+{
+	GSList *list, *iter;
+	const GPtrArray *ptr_array;
+	char **addr_arr = NULL;
+	char **route_arr = NULL;
+	char **dns_arr = NULL;
+	char **domain_arr = NULL;
+	int i = 0;
+	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
+	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
+	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
+
+	if (cfg6 == NULL)
+		return FALSE;
+
+	nmc->allowed_fields = nmc_fields_ip6_config;
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_IP6_CONFIG_ALL, nmc->allowed_fields, NULL);
+	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+
+	/* addresses */
+	list = (GSList *) nm_ip6_config_get_addresses (cfg6);
+	addr_arr = g_new (char *, g_slist_length (list) + 1);
+	for (iter = list; iter; iter = g_slist_next (iter)) {
+		NMIP6Address *addr = (NMIP6Address *) iter->data;
+		guint32 prefix;
+		char *ip_str, *gw_str;
+
+		ip_str = nmc_ip6_address_as_string (nm_ip6_address_get_address (addr), NULL);
+		prefix = nm_ip6_address_get_prefix (addr);
+		gw_str = nmc_ip6_address_as_string (nm_ip6_address_get_gateway (addr), NULL);
+
+		addr_arr[i++] = g_strdup_printf ("ip = %s/%u, gw = %s", ip_str, prefix, gw_str);
+		g_free (ip_str);
+		g_free (gw_str);
+	}
+	addr_arr[i] = NULL;
+
+	/* routes */
+	list = (GSList *) nm_ip6_config_get_routes (cfg6);
+	route_arr = g_new (char *, g_slist_length (list) + 1);
+	i = 0;
+	for (iter = list; iter; iter = g_slist_next (iter)) {
+		NMIP6Route *route = (NMIP6Route *) iter->data;
+		guint32 prefix, metric;
+		char *dest_str, *nexthop_str;
+
+		dest_str = nmc_ip6_address_as_string (nm_ip6_route_get_dest (route), NULL);
+		nexthop_str = nmc_ip6_address_as_string (nm_ip6_route_get_next_hop (route), NULL);
+		prefix = nm_ip6_route_get_prefix (route);
+		metric = nm_ip6_route_get_metric (route);
+
+		route_arr[i++] = g_strdup_printf ("dst = %s/%u, nh = %s, mt = %u", dest_str, prefix, nexthop_str, metric);
+		g_free (dest_str);
+		g_free (nexthop_str);
+	}
+	route_arr[i] = NULL;
+
+	/* DNS */
+	list = (GSList *) nm_ip6_config_get_nameservers (cfg6);
+	dns_arr = g_new (char *, g_slist_length (list) + 1);
+	i = 0;
+	for (iter = list; iter; iter = g_slist_next (iter))
+		dns_arr[i++] = nmc_ip6_address_as_string (iter->data, NULL);
+
+	dns_arr[i] = NULL;
+
+	/* domains */
+	ptr_array = nm_ip6_config_get_domains (cfg6);
+	if (ptr_array) {
+		domain_arr = g_new (char *, ptr_array->len + 1);
+		for (i = 0; i < ptr_array->len; i++)
+			domain_arr[i] = g_ptr_array_index (ptr_array, i);
+
+		domain_arr[i] = NULL;
+	}
+
+	set_val_str (nmc->allowed_fields, 0, group_prefix);
+	set_val_arr (nmc->allowed_fields, 1, (const char **) addr_arr);
+	set_val_arr (nmc->allowed_fields, 2, (const char **) route_arr);
+	set_val_arr (nmc->allowed_fields, 3, (const char **) dns_arr);
+	set_val_arr (nmc->allowed_fields, 4, (const char **) domain_arr);
+
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
+	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
+
+	g_strfreev (addr_arr);
+	g_strfreev (route_arr);
+	g_strfreev (dns_arr);
+	g_free (domain_arr);
+
+	return TRUE;
+}
+
+gboolean
+print_dhcp4_config (NMDHCP4Config *dhcp4, NmCli *nmc, const char *group_prefix)
+{
+	GHashTable *table;
+	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
+	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
+	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
+
+	if (dhcp4 == NULL)
+		return FALSE;
+
+	table = nm_dhcp4_config_get_options (dhcp4);
+	if (table) {
+		GHashTableIter table_iter;
+		gpointer key, value;
+		char **options_arr = NULL;
+		int i = 0;
+
+		nmc->allowed_fields = nmc_fields_dhcp4_config;
+		nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
+		nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DHCP4_CONFIG_ALL, nmc->allowed_fields, NULL);
+		print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+
+		options_arr = g_new (char *, g_hash_table_size (table) + 1);
+		g_hash_table_iter_init (&table_iter, table);
+		while (g_hash_table_iter_next (&table_iter, &key, &value))
+			options_arr[i++] = g_strdup_printf ("%s = %s", (char *) key, (char *) value);
+		options_arr[i] = NULL;
+
+		set_val_str (nmc->allowed_fields, 0, group_prefix);
+		set_val_arr (nmc->allowed_fields, 1, (const char **) options_arr);
+
+		nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
+		print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
+
+		g_strfreev (options_arr);
+
+		return TRUE;
+	}
+	return FALSE;
+}
+
+gboolean
+print_dhcp6_config (NMDHCP6Config *dhcp6, NmCli *nmc, const char *group_prefix)
+{
+	GHashTable *table;
+	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
+	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
+	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
+
+	if (dhcp6 == NULL)
+		return FALSE;
+
+	table = nm_dhcp6_config_get_options (dhcp6);
+	if (table) {
+		GHashTableIter table_iter;
+		gpointer key, value;
+		char **options_arr = NULL;
+		int i = 0;
+
+		nmc->allowed_fields = nmc_fields_dhcp6_config;
+		nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
+		nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DHCP6_CONFIG_ALL, nmc->allowed_fields, NULL);
+		print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+
+		options_arr = g_new (char *, g_hash_table_size (table) + 1);
+		g_hash_table_iter_init (&table_iter, table);
+		while (g_hash_table_iter_next (&table_iter, &key, &value))
+			options_arr[i++] = g_strdup_printf ("%s = %s", (char *) key, (char *) value);
+		options_arr[i] = NULL;
+
+		set_val_str (nmc->allowed_fields, 0, group_prefix);
+		set_val_arr (nmc->allowed_fields, 1, (const char **) options_arr);
+
+		nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
+		print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
+
+		g_strfreev (options_arr);
+
+		return TRUE;
+	}
+	return FALSE;
+}
+