1054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart/* 2054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * src/idiag-socket-details.c List socket details 3054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * 4054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * This library is free software; you can redistribute it and/or 5054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * modify it under the terms of the GNU General Public License as 6054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * published by the Free Software Foundation version 2 of the License. 7054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * 8054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * Copyright (c) 2013 Sassano Systems LLC <joe@sassanosystems.com> 9054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart */ 10054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 11054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/cli/utils.h> 12054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/idiag/idiagnl.h> 13054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/idiag/msg.h> 14054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <linux/netlink.h> 15054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 16054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartstatic void print_usage(void) 17054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{ 18054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart printf( 19054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"Usage: idiag-socket-details [OPTION]\n" 20054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"\n" 21054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"Options\n" 22054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" --summary Show socket detail summary.\n" 23054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" --details Show socket details on multiple lines.\n" 24054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" --stats Show full socket statistics.\n" 25054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" -h, --help Show this help.\n" 26054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" -v, --version Show versioning information.\n" 27054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart ); 28054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart exit(0); 29054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart} 30054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 31054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartint main(int argc, char *argv[]) 32054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{ 33054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart struct nl_sock *sock; 34054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart struct nl_cache *idiag_cache; 35054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart struct nl_dump_params params = { 36054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart .dp_type = NL_DUMP_LINE, 37054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart .dp_nl_cb = NULL, 38054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart .dp_fd = stdout, 39054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart }; 40054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart int err = 0; 41054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 42054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart sock = nl_cli_alloc_socket(); 43054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_cli_connect(sock, NETLINK_INET_DIAG); 44054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart for (;;) { 45054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart int c, optidx = 0; 46054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart enum { 47054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart ARG_SUMMARY = 257, 48054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart ARG_DETAILS = 258, 49054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart ARG_STATS = 259, 50054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart ARG_FAMILY, 51054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart }; 52054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart static struct option long_opts[] = { 53054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart { "details", 0, 0, ARG_DETAILS }, 54054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart { "summary", 0, 0, ARG_SUMMARY }, 55054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart { "stats", 0, 0, ARG_STATS}, 56054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart { "help", 0, 0, 'h' }, 57054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart { "version", 0, 0, 'v' }, 58054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart { 0, 0, 0, 0 } 59054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart }; 60054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 61054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart c = getopt_long(argc, argv, "hv", long_opts, &optidx); 62054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if (c == -1) 63054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart break; 64054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 65054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart switch (c) { 66054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case '?': exit(NLE_INVAL); 67054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case ARG_SUMMARY: params.dp_type = NL_DUMP_LINE; break; 68054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case ARG_DETAILS: params.dp_type = NL_DUMP_DETAILS; break; 69054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case ARG_STATS: params.dp_type = NL_DUMP_STATS; break; 70054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case 'h': print_usage(); break; 71054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case 'v': nl_cli_print_version(); break; 72054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart } 73054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart } 74054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 75054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if ((err = idiagnl_msg_alloc_cache(sock, AF_INET, IDIAG_SS_ALL, 76054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart &idiag_cache))) { 77054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_cli_fatal(err, "Unable to allocate idiag msg cache: %s", 78054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_geterror(err)); 79054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart } 80054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 81054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_cache_mngt_provide(idiag_cache); 82054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 83054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_cache_dump_filter(idiag_cache, ¶ms, NULL); 84054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 85054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_cache_mngt_unprovide(idiag_cache); 86054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_cache_free(idiag_cache); 87054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_socket_free(sock); 88054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 89054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart return 0; 90054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart} 91