summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Ahern <dsa@cumulusnetworks.com>2017-05-03 14:05:07 -0700
committerThomas Haller <thaller@redhat.com>2017-05-12 10:09:15 +0200
commit92b96a48ecd08c650bd038bbb0c7e0d640734d2e (patch)
tree9b0b58a8b87f20afe49cbea821b05226b605c67c /src
parentd55f004c5ad4b202cab5593551554cdad4f1a444 (diff)
downloadlibnl-92b96a48ecd08c650bd038bbb0c7e0d640734d2e.tar.gz
nl-monitor: All user to specify line format
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@cumulusnetworks.com> Signed-off-by: Thomas Haller <thaller@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/nl-monitor.c110
1 files changed, 70 insertions, 40 deletions
diff --git a/src/nl-monitor.c b/src/nl-monitor.c
index 754f8dca..830bd74b 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)) {