]> git.ipfire.org Git - thirdparty/libnl.git/commitdiff
Add idiag-socket-details
authorJoe Damato <ice799@gmail.com>
Thu, 25 Jul 2013 23:36:16 +0000 (16:36 -0700)
committerJoe Damato <ice799@gmail.com>
Thu, 25 Jul 2013 23:36:16 +0000 (16:36 -0700)
This small program lists all sockets on the system seen by netlink and serves
as a simple example showing how to alloc an idiag msg cache and dump the
objects in it.

src/.gitignore
src/Makefile.am
src/idiag-socket-details.c [new file with mode: 0644]

index 3e091cb588e78821465b9c8cc12194f9a845b3d6..0b99435b1e26f4e02cd5cf23dcc78749e848aa56 100644 (file)
@@ -42,3 +42,4 @@ nl-classid-lookup
 nl-pktloc-lookup
 nl-link-enslave
 nl-link-release
+idiag-socket-details
index 6541f6dc4db0539402531195a4d1abffcb63ea50..87dd871288a915317913d1820bcb079b1638c53c 100644 (file)
@@ -37,7 +37,8 @@ noinst_PROGRAMS = \
        nl-list-caches nl-list-sockets \
        nl-util-addr \
        nl-link-enslave \
-       nl-link-release
+       nl-link-release \
+       idiag-socket-details
 
 genl_ctrl_list_SOURCES = genl-ctrl-list.c 
 
@@ -99,3 +100,5 @@ nl_util_addr_SOURCES = nl-util-addr.c
 nl_pktloc_lookup_SOURCES = nl-pktloc-lookup.c
 
 nl_classid_lookup_SOURCES = nl-classid-lookup.c
+
+idiag_socket_details_SOURCES = idiag-socket-details.c
diff --git a/src/idiag-socket-details.c b/src/idiag-socket-details.c
new file mode 100644 (file)
index 0000000..9568676
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * src/idiag-socket-details.c     List socket details
+ *
+ *     This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation version 2 of the License.
+ *
+ * Copyright (c) 2013 Sassano Systems LLC <joe@sassanosystems.com>
+ */
+
+#include <netlink/cli/utils.h>
+#include <netlink/idiag/idiagnl.h>
+#include <netlink/idiag/msg.h>
+#include <linux/netlink.h>
+
+static void print_usage(void)
+{
+       printf(
+"Usage: idiag-socket-details [OPTION]\n"
+"\n"
+"Options\n"
+"     --summary                    Show socket detail summary.\n"
+"     --details             Show socket details on multiple lines.\n"
+"     --stats               Show full socket statistics.\n"
+" -h, --help                Show this help.\n"
+" -v, --version             Show versioning information.\n"
+       );
+       exit(0);
+}
+
+int main(int argc, char *argv[])
+{
+       struct nl_sock *sock;
+       struct nl_cache *idiag_cache;
+       struct nl_dump_params params = {
+               .dp_type = NL_DUMP_LINE,
+               .dp_nl_cb = NULL,
+               .dp_fd = stdout,
+       };
+       int err = 0;
+
+       sock = nl_cli_alloc_socket();
+       nl_cli_connect(sock, NETLINK_INET_DIAG);
+       for (;;) {
+               int c, optidx = 0;
+               enum {
+                       ARG_SUMMARY = 257,
+                       ARG_DETAILS = 258,
+                       ARG_STATS = 259,
+                       ARG_FAMILY,
+               };
+               static struct option long_opts[] = {
+                       { "details", 0, 0, ARG_DETAILS },
+                       { "summary", 0, 0, ARG_SUMMARY },
+                       { "stats", 0, 0, ARG_STATS},
+                       { "help", 0, 0, 'h' },
+                       { "version", 0, 0, 'v' },
+                       { 0, 0, 0, 0 }
+               };
+
+               c = getopt_long(argc, argv, "hv", long_opts, &optidx);
+               if (c == -1)
+                       break;
+
+               switch (c) {
+               case '?': exit(NLE_INVAL);
+               case ARG_SUMMARY: params.dp_type = NL_DUMP_LINE; break;
+               case ARG_DETAILS: params.dp_type = NL_DUMP_DETAILS; break;
+               case ARG_STATS:   params.dp_type = NL_DUMP_STATS; break;
+               case 'h': print_usage(); break;
+               case 'v': nl_cli_print_version(); break;
+               }
+       }
+
+       if ((err = idiagnl_msg_alloc_cache(sock, AF_INET, IDIAG_SS_ALL,
+                                       &idiag_cache))) {
+               nl_cli_fatal(err, "Unable to allocate idiag msg cache: %s",
+                               nl_geterror(err));
+       }
+
+       nl_cache_mngt_provide(idiag_cache);
+
+       nl_cache_dump_filter(idiag_cache, &params, NULL);
+
+       nl_cache_mngt_unprovide(idiag_cache);
+       nl_cache_free(idiag_cache);
+       nl_socket_free(sock);
+
+       return 0;
+}