From: Stephen Hemminger Date: Fri, 9 Mar 2018 02:02:17 +0000 (-0800) Subject: ipmaddr: json and color support X-Git-Tag: v4.17.0~60^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=311dca0aa0e7e1e20ae42a7ee39df52ba2038ef6;p=thirdparty%2Fiproute2.git ipmaddr: json and color support Support printing mulitcast addresses in json and color mode. Output format is unchanged for normal use. Signed-off-by: Stephen Hemminger Signed-off-by: David Ahern --- diff --git a/ip/ipmaddr.c b/ip/ipmaddr.c index d7bf1f99f..a48499029 100644 --- a/ip/ipmaddr.c +++ b/ip/ipmaddr.c @@ -28,6 +28,7 @@ #include "rt_names.h" #include "utils.h" #include "ip_common.h" +#include "json_print.h" static struct { char *dev; @@ -193,50 +194,66 @@ static void read_igmp6(struct ma_info **result_p) static void print_maddr(FILE *fp, struct ma_info *list) { - fprintf(fp, "\t"); + print_string(PRINT_FP, NULL, "\t", NULL); + open_json_object(NULL); if (list->addr.family == AF_PACKET) { SPRINT_BUF(b1); - fprintf(fp, "link %s", ll_addr_n2a((unsigned char *)list->addr.data, - list->addr.bytelen, 0, - b1, sizeof(b1))); + + print_string(PRINT_FP, NULL, "link ", NULL); + print_color_string(PRINT_ANY, COLOR_MAC, "link", "%s", + ll_addr_n2a((void *)list->addr.data, list->addr.bytelen, + 0, b1, sizeof(b1))); } else { - switch (list->addr.family) { - case AF_INET: - fprintf(fp, "inet "); - break; - case AF_INET6: - fprintf(fp, "inet6 "); - break; - default: - fprintf(fp, "family %d ", list->addr.family); - break; - } - fprintf(fp, "%s", - format_host(list->addr.family, - -1, list->addr.data)); + print_string(PRINT_ANY, "family", "%-5s ", + family_name(list->addr.family)); + print_color_string(PRINT_ANY, ifa_family_color(list->addr.family), + "address", "%s", + format_host(list->addr.family, + -1, list->addr.data)); } + if (list->users != 1) - fprintf(fp, " users %d", list->users); + print_uint(PRINT_ANY, "users", " users %u", list->users); + if (list->features) - fprintf(fp, " %s", list->features); - fprintf(fp, "\n"); + print_string(PRINT_ANY, "features", " %s", list->features); + + print_string(PRINT_FP, NULL, "\n", NULL); + close_json_object(); } static void print_mlist(FILE *fp, struct ma_info *list) { int cur_index = 0; + new_json_obj(json); for (; list; list = list->next) { - if (oneline) { - cur_index = list->index; - fprintf(fp, "%d:\t%s%s", cur_index, list->name, _SL_); - } else if (cur_index != list->index) { + + if (list->index != cur_index || oneline) { + if (cur_index) { + close_json_array(PRINT_JSON, NULL); + close_json_object(); + } + open_json_object(NULL); + + print_uint(PRINT_ANY, "ifindex", "%d:", list->index); + print_color_string(PRINT_ANY, COLOR_IFNAME, + "ifname", "\t%s", list->name); + print_string(PRINT_FP, NULL, "%s", _SL_); cur_index = list->index; - fprintf(fp, "%d:\t%s\n", cur_index, list->name); + + open_json_array(PRINT_JSON, "maddr"); } + print_maddr(fp, list); } + if (cur_index) { + close_json_array(PRINT_JSON, NULL); + close_json_object(); + } + + delete_json_obj(); } static int multiaddr_list(int argc, char **argv)