cli: refactor printing IP6 device info

This commit is contained in:
Thomas Haller
2017-09-18 12:29:06 +02:00
parent 6aed608011
commit ccb83e34a3
2 changed files with 124 additions and 67 deletions

View File

@@ -134,6 +134,97 @@ arr_out:
return arr; return arr;
} }
static gconstpointer
_metagen_ip6_config_get_fcn (const NMMetaEnvironment *environment,
gpointer environment_user_data,
const NmcMetaGenericInfo *info,
gpointer target,
NMMetaAccessorGetType get_type,
NMMetaAccessorGetFlags get_flags,
NMMetaAccessorGetOutFlags *out_flags,
gpointer *out_to_free)
{
NMIPConfig *cfg6 = target;
GPtrArray *ptr_array;
char **arr;
const char *const*arrc;
guint i = 0;
nm_assert (info->info_type < _NMC_GENERIC_INFO_TYPE_IP6_CONFIG_NUM);
NMC_HANDLE_TERMFORMAT (NM_META_TERM_COLOR_NORMAL);
switch (info->info_type) {
case NMC_GENERIC_INFO_TYPE_IP6_CONFIG_ADDRESS:
if (!NM_FLAGS_HAS (get_flags, NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV))
return NULL;
ptr_array = nm_ip_config_get_addresses (cfg6);
if (ptr_array) {
arr = g_new (char *, ptr_array->len + 1);
for (i = 0; i < ptr_array->len; i++) {
NMIPAddress *addr = g_ptr_array_index (ptr_array, i);
arr[i] = g_strdup_printf ("%s/%u",
nm_ip_address_get_address (addr),
nm_ip_address_get_prefix (addr));
}
arr[i] = NULL;
} else
arr = NULL;
goto arr_out;
case NMC_GENERIC_INFO_TYPE_IP6_CONFIG_GATEWAY:
return nm_ip_config_get_gateway (cfg6);
case NMC_GENERIC_INFO_TYPE_IP6_CONFIG_ROUTE:
if (!NM_FLAGS_HAS (get_flags, NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV))
return NULL;
ptr_array = nm_ip_config_get_routes (cfg6);
if (ptr_array) {
arr = g_new (char *, ptr_array->len + 1);
for (i = 0; i < ptr_array->len; i++) {
NMIPRoute *route = g_ptr_array_index (ptr_array, i);
const char *next_hop;
next_hop = nm_ip_route_get_next_hop (route);
if (!next_hop)
next_hop = "::";
arr[i] = g_strdup_printf ("dst = %s/%u, nh = %s%c mt = %u",
nm_ip_route_get_dest (route),
nm_ip_route_get_prefix (route),
next_hop,
nm_ip_route_get_metric (route) == -1 ? '\0' : ',',
(guint32) nm_ip_route_get_metric (route));
}
arr[i] = NULL;
} else
arr = NULL;
goto arr_out;
case NMC_GENERIC_INFO_TYPE_IP6_CONFIG_DNS:
if (!NM_FLAGS_HAS (get_flags, NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV))
return NULL;
arrc = nm_ip_config_get_nameservers (cfg6);
goto arrc_out;
case NMC_GENERIC_INFO_TYPE_IP6_CONFIG_DOMAIN:
if (!NM_FLAGS_HAS (get_flags, NM_META_ACCESSOR_GET_FLAGS_ACCEPT_STRV))
return NULL;
arrc = nm_ip_config_get_domains (cfg6);
goto arrc_out;
default:
break;
}
g_return_val_if_reached (NULL);
arrc_out:
*out_flags |= NM_META_ACCESSOR_GET_OUT_FLAGS_STRV;
return arrc;
arr_out:
*out_flags |= NM_META_ACCESSOR_GET_OUT_FLAGS_STRV;
*out_to_free = arr;
return arr;
}
const NmcMetaGenericInfo *const metagen_ip4_config[_NMC_GENERIC_INFO_TYPE_IP4_CONFIG_NUM + 1] = { const NmcMetaGenericInfo *const metagen_ip4_config[_NMC_GENERIC_INFO_TYPE_IP4_CONFIG_NUM + 1] = {
#define _METAGEN_IP4_CONFIG(type, name) \ #define _METAGEN_IP4_CONFIG(type, name) \
[type] = NMC_META_GENERIC(name, .info_type = type, .get_fcn = _metagen_ip4_config_get_fcn) [type] = NMC_META_GENERIC(name, .info_type = type, .get_fcn = _metagen_ip4_config_get_fcn)
@@ -150,6 +241,21 @@ static const NmcMetaGenericInfo *const metagen_ip4_config_group[] = {
NULL, NULL,
}; };
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)
_METAGEN_IP6_CONFIG (NMC_GENERIC_INFO_TYPE_IP6_CONFIG_ADDRESS, "ADDRESS"),
_METAGEN_IP6_CONFIG (NMC_GENERIC_INFO_TYPE_IP6_CONFIG_GATEWAY, "GATEWAY"),
_METAGEN_IP6_CONFIG (NMC_GENERIC_INFO_TYPE_IP6_CONFIG_ROUTE, "ROUTE"),
_METAGEN_IP6_CONFIG (NMC_GENERIC_INFO_TYPE_IP6_CONFIG_DNS, "DNS"),
_METAGEN_IP6_CONFIG (NMC_GENERIC_INFO_TYPE_IP6_CONFIG_DOMAIN, "DOMAIN"),
};
static const NmcMetaGenericInfo *const metagen_ip6_config_group[] = {
NMC_META_GENERIC_WITH_NESTED ("IP6", metagen_ip6_config, .name_header = N_("GROUP")),
NULL,
};
/*****************************************************************************/ /*****************************************************************************/
const NmcMetaGenericInfo *const nmc_fields_dhcp4_config[] = { const NmcMetaGenericInfo *const nmc_fields_dhcp4_config[] = {
@@ -205,79 +311,23 @@ print_ip6_config (NMIPConfig *cfg6,
const char *group_prefix, const char *group_prefix,
const char *one_field) const char *one_field)
{ {
GPtrArray *ptr_array; gs_free_error GError *error = NULL;
char **addr_arr = NULL; gs_free char *field_str = NULL;
char **route_arr = NULL;
char **dns_arr = NULL;
char **domain_arr = NULL;
int i = 0;
const NMMetaAbstractInfo *const*tmpl;
NmcOutputField *arr;
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
if (cfg6 == NULL) if (cfg6 == NULL)
return FALSE; return FALSE;
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_ip6_config; if (one_field)
out_indices = parse_output_fields (one_field, field_str = g_strdup_printf ("IP6.%s", one_field);
tmpl, FALSE, NULL, NULL);
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
g_ptr_array_add (out.output_data, arr);
/* addresses */ if (!nmc_print (nmc_config,
ptr_array = nm_ip_config_get_addresses (cfg6); (gpointer[]) { cfg6, NULL },
if (ptr_array) { NULL,
addr_arr = g_new (char *, ptr_array->len + 1); (const NMMetaAbstractInfo *const*) metagen_ip6_config_group,
for (i = 0; i < ptr_array->len; i++) { field_str,
NMIPAddress *addr = (NMIPAddress *) g_ptr_array_index (ptr_array, i); &error)) {
return FALSE;
addr_arr[i] = g_strdup_printf ("%s/%u",
nm_ip_address_get_address (addr),
nm_ip_address_get_prefix (addr));
} }
addr_arr[i] = NULL;
}
/* routes */
ptr_array = nm_ip_config_get_routes (cfg6);
if (ptr_array) {
route_arr = g_new (char *, ptr_array->len + 1);
for (i = 0; i < ptr_array->len; i++) {
NMIPRoute *route = (NMIPRoute *) g_ptr_array_index (ptr_array, i);
const char *next_hop;
next_hop = nm_ip_route_get_next_hop (route);
if (!next_hop)
next_hop = "::";
route_arr[i] = g_strdup_printf ("dst = %s/%u, nh = %s%c mt = %u",
nm_ip_route_get_dest (route),
nm_ip_route_get_prefix (route),
next_hop,
nm_ip_route_get_metric (route) == -1 ? '\0' : ',',
(guint32) nm_ip_route_get_metric (route));
}
route_arr[i] = NULL;
}
/* DNS */
dns_arr = g_strdupv ((char **) nm_ip_config_get_nameservers (cfg6));
/* domains */
domain_arr = g_strdupv ((char **) nm_ip_config_get_domains (cfg6));
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
set_val_strc (arr, 0, group_prefix);
set_val_arr (arr, 1, addr_arr);
set_val_strc (arr, 2, nm_ip_config_get_gateway (cfg6));
set_val_arr (arr, 3, route_arr);
set_val_arr (arr, 4, dns_arr);
set_val_arr (arr, 5, domain_arr);
g_ptr_array_add (out.output_data, arr);
print_data_prepare_width (out.output_data);
print_data (nmc_config, out_indices, NULL, 0, &out);
return TRUE; return TRUE;
} }

View File

@@ -120,6 +120,13 @@ typedef enum {
NMC_GENERIC_INFO_TYPE_IP4_CONFIG_WINS, NMC_GENERIC_INFO_TYPE_IP4_CONFIG_WINS,
_NMC_GENERIC_INFO_TYPE_IP4_CONFIG_NUM, _NMC_GENERIC_INFO_TYPE_IP4_CONFIG_NUM,
NMC_GENERIC_INFO_TYPE_IP6_CONFIG_ADDRESS = 0,
NMC_GENERIC_INFO_TYPE_IP6_CONFIG_GATEWAY,
NMC_GENERIC_INFO_TYPE_IP6_CONFIG_ROUTE,
NMC_GENERIC_INFO_TYPE_IP6_CONFIG_DNS,
NMC_GENERIC_INFO_TYPE_IP6_CONFIG_DOMAIN,
_NMC_GENERIC_INFO_TYPE_IP6_CONFIG_NUM,
} NmcGenericInfoType; } NmcGenericInfoType;
#define NMC_HANDLE_TERMFORMAT(color) \ #define NMC_HANDLE_TERMFORMAT(color) \