[PATCH 2/4] nl-monitor: All user to specify line format

David Ahern dsahern at gmail.com
Wed May 3 14:05:07 PDT 2017


From: David Ahern <dsa at cumulusnetworks.com>

nl-monitor defaults to stats. Allow user to select brief and details.

The known_groups is moved up to a global to allow a proper print_usage
function.

Signed-off-by: David Ahern <dsa at cumulusnetworks.com>
---
 src/nl-monitor.c | 110 +++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 70 insertions(+), 40 deletions(-)

diff --git a/src/nl-monitor.c b/src/nl-monitor.c
index 754f8dca038c..830bd74b370c 100644
--- a/src/nl-monitor.c
+++ b/src/nl-monitor.c
@@ -14,70 +14,100 @@
 
 #include <linux/rtnetlink.h>
 
+static const struct {
+	enum rtnetlink_groups gr_id;
+	const char* gr_name;
+} known_groups[] = {
+	{ RTNLGRP_LINK, "link" },
+	{ RTNLGRP_NOTIFY, "notify" },
+	{ RTNLGRP_NEIGH, "neigh" },
+	{ RTNLGRP_TC, "tc" },
+	{ RTNLGRP_IPV4_IFADDR, "ipv4-ifaddr" },
+	{ RTNLGRP_IPV4_MROUTE, "ipv4-mroute" },
+	{ RTNLGRP_IPV4_ROUTE, "ipv4-route" },
+	{ RTNLGRP_IPV6_IFADDR, "ipv6-ifaddr" },
+	{ RTNLGRP_IPV6_MROUTE, "ipv6-mroute" },
+	{ RTNLGRP_IPV6_ROUTE, "ipv6-route" },
+	{ RTNLGRP_IPV6_IFINFO, "ipv6-ifinfo" },
+	{ RTNLGRP_DECnet_IFADDR, "decnet-ifaddr" },
+	{ RTNLGRP_DECnet_ROUTE, "decnet-route" },
+	{ RTNLGRP_IPV6_PREFIX, "ipv6-prefix" },
+	{ RTNLGRP_NONE, NULL }
+};
+
 static void obj_input(struct nl_object *obj, void *arg)
 {
-	struct nl_dump_params dp = {
-		.dp_type = NL_DUMP_STATS,
-		.dp_fd = stdout,
-		.dp_dump_msgtype = 1,
-	};
-
-	nl_object_dump(obj, &dp);
+	nl_object_dump(obj, arg);
 }
 
 static int event_input(struct nl_msg *msg, void *arg)
 {
-	if (nl_msg_parse(msg, &obj_input, NULL) < 0)
+	if (nl_msg_parse(msg, &obj_input, arg) < 0)
 		fprintf(stderr, "<<EVENT>> Unknown message type\n");
 
 	/* Exit nl_recvmsgs_def() and return to the main select() */
 	return NL_STOP;
 }
 
+static void print_usage(void)
+{
+	int i;
+
+        printf(
+	"Usage: nl-monitor [OPTION] [<groups>]\n"
+	"\n"
+	"Options\n"
+	" -f, --format=TYPE     Output format { brief | details | stats }\n"
+	" -h, --help            Show this help.\n"
+	"\n"
+        );
+	printf("Known groups:");
+	for (i = 0; known_groups[i].gr_id != RTNLGRP_NONE; i++)
+		printf(" %s", known_groups[i].gr_name);
+	printf("\n");
+        exit(0);
+}
+
 int main(int argc, char *argv[])
 {
+	struct nl_dump_params dp = {
+		.dp_type = NL_DUMP_STATS,
+		.dp_fd = stdout,
+		.dp_dump_msgtype = 1,
+	};
+
 	struct nl_sock *sock;
 	int err = 1;
 	int i, idx;
 
-	static const struct {
-		enum rtnetlink_groups gr_id;
-		const char* gr_name;
-	} known_groups[] = {
-		{ RTNLGRP_LINK, "link" },
-		{ RTNLGRP_NOTIFY, "notify" },
-		{ RTNLGRP_NEIGH, "neigh" },
-		{ RTNLGRP_TC, "tc" },
-		{ RTNLGRP_IPV4_IFADDR, "ipv4-ifaddr" },
-		{ RTNLGRP_IPV4_MROUTE, "ipv4-mroute" },
-		{ RTNLGRP_IPV4_ROUTE, "ipv4-route" },
-		{ RTNLGRP_IPV6_IFADDR, "ipv6-ifaddr" },
-		{ RTNLGRP_IPV6_MROUTE, "ipv6-mroute" },
-		{ RTNLGRP_IPV6_ROUTE, "ipv6-route" },
-		{ RTNLGRP_IPV6_IFINFO, "ipv6-ifinfo" },
-		{ RTNLGRP_DECnet_IFADDR, "decnet-ifaddr" },
-		{ RTNLGRP_DECnet_ROUTE, "decnet-route" },
-		{ RTNLGRP_IPV6_PREFIX, "ipv6-prefix" },
-		{ RTNLGRP_NONE, NULL }
-	};
-
 	sock = nl_cli_alloc_socket();
 	nl_socket_disable_seq_check(sock);
-	nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, event_input, NULL);
-
-	if (argc > 1 && !strcasecmp(argv[1], "-h")) {
-		printf("Usage: nl-monitor [<groups>]\n");
-
-		printf("Known groups:");
-		for (i = 0; known_groups[i].gr_id != RTNLGRP_NONE; i++)
-			printf(" %s", known_groups[i].gr_name);
-		printf("\n");
-		return 2;
+	nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, event_input, &dp);
+
+	for (;;) {
+		int c, optidx = 0;
+		static struct option long_opts[] = {
+			{ "format", 1, 0, 'f' },
+			{ 0, 0, 0, 0 }
+		};
+
+		c = getopt_long(argc, argv, "f:h", long_opts, &optidx);
+		if (c == -1)
+                        break;
+
+                switch (c) {
+                case 'f':
+			dp.dp_type = nl_cli_parse_dumptype(optarg);
+			break;
+		default:
+			print_usage();
+			break;
+		}
 	}
 
 	nl_cli_connect(sock, NETLINK_ROUTE);
 
-	for (idx = 1; argc > idx; idx++) {
+	for (idx = optind; argc > idx; idx++) {
 		for (i = 0; known_groups[i].gr_id != RTNLGRP_NONE; i++) {
 			if (!strcmp(argv[idx], known_groups[i].gr_name)) {
 
-- 
2.1.4




More information about the libnl mailing list