diff options
author | Thomas Haller <thaller@redhat.com> | 2017-09-18 12:29:06 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-09-26 19:36:51 +0200 |
commit | ccb83e34a346dea518ce76140ff44b1ac0cba531 (patch) | |
tree | a00f6791116988301a97aa8d62dfd42d10d6b505 | |
parent | 6aed608011d84d87c8bf96f3c73db8806c6a739a (diff) | |
download | NetworkManager-ccb83e34a346dea518ce76140ff44b1ac0cba531.tar.gz |
cli: refactor printing IP6 device info
-rw-r--r-- | clients/cli/common.c | 184 | ||||
-rw-r--r-- | clients/cli/utils.h | 7 |
2 files changed, 124 insertions, 67 deletions
diff --git a/clients/cli/common.c b/clients/cli/common.c index 46b426d344..d3d83d474d 100644 --- a/clients/cli/common.c +++ b/clients/cli/common.c @@ -134,6 +134,97 @@ arr_out: 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] = { #define _METAGEN_IP4_CONFIG(type, name) \ [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, }; +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[] = { @@ -205,79 +311,23 @@ print_ip6_config (NMIPConfig *cfg6, const char *group_prefix, const char *one_field) { - GPtrArray *ptr_array; - char **addr_arr = NULL; - char **route_arr = NULL; - char **dns_arr = NULL; - char **domain_arr = NULL; - int i = 0; - const NMMetaAbstractInfo *const*tmpl; - NmcOutputField *arr; - NMC_OUTPUT_DATA_DEFINE_SCOPED (out); + gs_free_error GError *error = NULL; + gs_free char *field_str = NULL; if (cfg6 == NULL) return FALSE; - tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_ip6_config; - out_indices = parse_output_fields (one_field, - tmpl, FALSE, NULL, NULL); - arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (out.output_data, arr); - - /* addresses */ - ptr_array = nm_ip_config_get_addresses (cfg6); - if (ptr_array) { - addr_arr = g_new (char *, ptr_array->len + 1); - for (i = 0; i < ptr_array->len; i++) { - NMIPAddress *addr = (NMIPAddress *) g_ptr_array_index (ptr_array, i); - - addr_arr[i] = g_strdup_printf ("%s/%u", - nm_ip_address_get_address (addr), - nm_ip_address_get_prefix (addr)); - } - addr_arr[i] = NULL; - } + if (one_field) + field_str = g_strdup_printf ("IP6.%s", one_field); - /* 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; + if (!nmc_print (nmc_config, + (gpointer[]) { cfg6, NULL }, + NULL, + (const NMMetaAbstractInfo *const*) metagen_ip6_config_group, + field_str, + &error)) { + return FALSE; } - - /* 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; } diff --git a/clients/cli/utils.h b/clients/cli/utils.h index 19145974ea..ffc5b6f312 100644 --- a/clients/cli/utils.h +++ b/clients/cli/utils.h @@ -120,6 +120,13 @@ typedef enum { NMC_GENERIC_INFO_TYPE_IP4_CONFIG_WINS, _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; #define NMC_HANDLE_TERMFORMAT(color) \ |