tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: netstat -finet,inet6



Actually, I broke the case where -f address_family is not present.
This one works correctly, AFAICT.

--chris
Index: main.c
===================================================================
RCS file: /cvsroot/src/usr.bin/netstat/main.c,v
retrieving revision 1.86
diff -u -r1.86 main.c
--- main.c      19 Jun 2013 21:12:03 -0000      1.86
+++ main.c      14 Oct 2013 23:09:34 -0000
@@ -395,6 +395,7 @@
        struct protox *tp;      /* for printing cblocks & stats */
        int ch;
        char *cp;
+       char *afname, *afnames;
        u_long pcbaddr;
 
        if (prog_init) {
@@ -407,6 +408,7 @@
        (void)setegid(getgid());
        tp = NULL;
        af = AF_UNSPEC;
+       afnames = NULL;
        pcbaddr = 0;
 
        while ((ch = getopt(argc, argv,
@@ -428,24 +430,7 @@
                        dflag = 1;
                        break;
                case 'f':
-                       if (strcmp(optarg, "inet") == 0)
-                               af = AF_INET;
-                       else if (strcmp(optarg, "inet6") == 0)
-                               af = AF_INET6;
-                       else if (strcmp(optarg, "arp") == 0)
-                               af = AF_ARP;
-                       else if (strcmp(optarg, "pfkey") == 0)
-                               af = PF_KEY;
-                       else if (strcmp(optarg, "unix") == 0
-                           || strcmp(optarg, "local") == 0)
-                               af = AF_LOCAL;
-                       else if (strcmp(optarg, "atalk") == 0)
-                               af = AF_APPLETALK;
-                       else if (strcmp(optarg, "mpls") == 0)
-                               af = AF_MPLS;
-                       else
-                               errx(1, "%s: unknown address family",
-                                   optarg);
+                       afnames = optarg;
                        break;
 #ifndef SMALL
                case 'g':
@@ -603,91 +588,120 @@
         */
        sethostent(1);
        setnetent(1);
-       if (iflag) {
-               if (af != AF_UNSPEC)
-                       goto protostat;
+       do {
+               afname = NULL;
+               if (afnames != NULL) {
+                       afname = strsep(&afnames, ",");
+                       if (afname == NULL)
+                               break;          /* exit early */
+                       if (strcmp(afname, "inet") == 0)
+                               af = AF_INET;
+                       else if (strcmp(afname, "inet6") == 0)
+                               af = AF_INET6;
+                       else if (strcmp(afname, "arp") == 0)
+                               af = AF_ARP;
+                       else if (strcmp(afname, "pfkey") == 0)
+                               af = PF_KEY;
+                       else if (strcmp(afname, "unix") == 0
+                           || strcmp(afname, "local") == 0)
+                               af = AF_LOCAL;
+                       else if (strcmp(afname, "atalk") == 0)
+                               af = AF_APPLETALK;
+                       else if (strcmp(afname, "mpls") == 0)
+                               af = AF_MPLS;
+                       else {
+                               warnx("%s: unknown address family",
+                                   afname);
+                               continue;
+                       }
+               }
 
-               intpr(interval, nl[N_IFNET].n_value, NULL);
-               exit(0);
-       }
-       if (rflag) {
-               if (sflag)
-                       rt_stats(use_sysctl ? 0 : nl[N_RTSTAT].n_value);
-               else {
-                       if (!use_sysctl)
-                               err(1, "-r is not supported "
-                                   "for post-mortem analysis.");
-                       p_rttables(af);
+               if (iflag) {
+                       if (af != AF_UNSPEC)
+                               goto protostat;
+
+                       intpr(interval, nl[N_IFNET].n_value, NULL);
+                       break;
+               }
+               if (rflag) {
+                       if (sflag)
+                               rt_stats(use_sysctl ? 0 : nl[N_RTSTAT].n_value);
+                       else {
+                               if (!use_sysctl)
+                                       err(1, "-r is not supported "
+                                           "for post-mortem analysis.");
+                               p_rttables(af);
+                       }
+                       break;
                }
-               exit(0);
-       }
 #ifndef SMALL
-       if (gflag) {
-               if (sflag) {
-                       if (af == AF_INET || af == AF_UNSPEC)
-                               mrt_stats(nl[N_MRTPROTO].n_value,
-                                         nl[N_MRTSTAT].n_value);
+               if (gflag) {
+                       if (sflag) {
+                               if (af == AF_INET || af == AF_UNSPEC)
+                                       mrt_stats(nl[N_MRTPROTO].n_value,
+                                                 nl[N_MRTSTAT].n_value);
 #ifdef INET6
-                       if (af == AF_INET6 || af == AF_UNSPEC)
-                               mrt6_stats(nl[N_MRT6PROTO].n_value,
-                                          nl[N_MRT6STAT].n_value);
+                               if (af == AF_INET6 || af == AF_UNSPEC)
+                                       mrt6_stats(nl[N_MRT6PROTO].n_value,
+                                                  nl[N_MRT6STAT].n_value);
 #endif
-               }
-               else {
-                       if (af == AF_INET || af == AF_UNSPEC)
-                               mroutepr(nl[N_MRTPROTO].n_value,
-                                        nl[N_MFCHASHTBL].n_value,
-                                        nl[N_MFCHASH].n_value,
-                                        nl[N_VIFTABLE].n_value);
+                       }
+                       else {
+                               if (af == AF_INET || af == AF_UNSPEC)
+                                       mroutepr(nl[N_MRTPROTO].n_value,
+                                                nl[N_MFCHASHTBL].n_value,
+                                                nl[N_MFCHASH].n_value,
+                                                nl[N_VIFTABLE].n_value);
 #ifdef INET6
-                       if (af == AF_INET6 || af == AF_UNSPEC)
-                               mroute6pr(nl[N_MRT6PROTO].n_value,
-                                         nl[N_MF6CTABLE].n_value,
-                                         nl[N_MIF6TABLE].n_value);
+                               if (af == AF_INET6 || af == AF_UNSPEC)
+                                       mroute6pr(nl[N_MRT6PROTO].n_value,
+                                                 nl[N_MF6CTABLE].n_value,
+                                                 nl[N_MIF6TABLE].n_value);
 #endif
+                       }
+                       break;
                }
-               exit(0);
-       }
 #endif
-  protostat:
-       if (af == AF_INET || af == AF_UNSPEC) {
-               setprotoent(1);
-               setservent(1);
-               /* ugh, this is O(MN) ... why do we do this? */
-               while ((p = getprotoent()) != NULL) {
+         protostat:
+               if (af == AF_INET || af == AF_UNSPEC) {
+                       setprotoent(1);
+                       setservent(1);
+                       /* ugh, this is O(MN) ... why do we do this? */
+                       while ((p = getprotoent()) != NULL) {
+                               for (tp = protox; tp->pr_name; tp++)
+                                       if (strcmp(tp->pr_name, p->p_name) == 0)
+                                               break;
+                               if (tp->pr_name == 0 || tp->pr_wanted == 0)
+                                       continue;
+                               printproto(tp, p->p_name);
+                               tp->pr_wanted = 0;
+                       }
+                       endprotoent();
                        for (tp = protox; tp->pr_name; tp++)
-                               if (strcmp(tp->pr_name, p->p_name) == 0)
-                                       break;
-                       if (tp->pr_name == 0 || tp->pr_wanted == 0)
-                               continue;
-                       printproto(tp, p->p_name);
-                       tp->pr_wanted = 0;
+                               if (tp->pr_wanted)
+                                       printproto(tp, tp->pr_name);
                }
-               endprotoent();
-               for (tp = protox; tp->pr_name; tp++)
-                       if (tp->pr_wanted)
-                               printproto(tp, tp->pr_name);
-       }
 #ifdef INET6
-       if (af == AF_INET6 || af == AF_UNSPEC)
-               for (tp = ip6protox; tp->pr_name; tp++)
-                       printproto(tp, tp->pr_name);
+               if (af == AF_INET6 || af == AF_UNSPEC)
+                       for (tp = ip6protox; tp->pr_name; tp++)
+                               printproto(tp, tp->pr_name);
 #endif
-       if (af == AF_ARP || af == AF_UNSPEC)
-               for (tp = arpprotox; tp->pr_name; tp++)
-                       printproto(tp, tp->pr_name);
+               if (af == AF_ARP || af == AF_UNSPEC)
+                       for (tp = arpprotox; tp->pr_name; tp++)
+                               printproto(tp, tp->pr_name);
 #ifdef IPSEC
-       if (af == PF_KEY || af == AF_UNSPEC)
-               for (tp = pfkeyprotox; tp->pr_name; tp++)
-                       printproto(tp, tp->pr_name);
+               if (af == PF_KEY || af == AF_UNSPEC)
+                       for (tp = pfkeyprotox; tp->pr_name; tp++)
+                               printproto(tp, tp->pr_name);
 #endif
 #ifndef SMALL
-       if (af == AF_APPLETALK || af == AF_UNSPEC)
-               for (tp = atalkprotox; tp->pr_name; tp++)
-                       printproto(tp, tp->pr_name);
-       if ((af == AF_LOCAL || af == AF_UNSPEC) && !sflag)
-               unixpr(nl[N_UNIXSW].n_value);
+               if (af == AF_APPLETALK || af == AF_UNSPEC)
+                       for (tp = atalkprotox; tp->pr_name; tp++)
+                               printproto(tp, tp->pr_name);
+               if ((af == AF_LOCAL || af == AF_UNSPEC) && !sflag)
+                       unixpr(nl[N_UNIXSW].n_value);
 #endif
+       } while (afnames != NULL && afname != NULL);
        exit(0);
 }
 
Index: netstat.1
===================================================================
RCS file: /cvsroot/src/usr.bin/netstat/netstat.1,v
retrieving revision 1.66
diff -u -r1.66 netstat.1
--- netstat.1   1 Mar 2013 18:26:11 -0000       1.66
+++ netstat.1   14 Oct 2013 23:09:34 -0000
@@ -36,14 +36,15 @@
 .Nm netstat
 .Nd show network status
 .Sh SYNOPSIS
+.ds address_family Fl f Ar address_family Ns Op , Ns Ar family ...
 .Nm
 .Op Fl Aan
-.Op Fl f Ar address_family
+.Op \*[address_family]
 .Op Fl M Ar core
 .Op Fl N Ar system
 .Nm
 .Op Fl bdghiLlmnqrSsTtv
-.Op Fl f Ar address_family
+.Op \*[address_family]
 .Op Fl M Ar core
 .Op Fl N Ar system
 .Nm
@@ -67,7 +68,7 @@
 .Op Fl p Ar protocol
 .Nm
 .Op Fl is
-.Op Fl f Ar address_family
+.Op \*[address_family]
 .Op Fl I Ar Interface
 .Nm
 .Op Fl s
@@ -127,10 +128,10 @@
 .Fl i
 or an interval, as described below),
 show the number of dropped packets.
-.It Fl f Ar address_family
+.It \*[address_family]
 Limit statistics or address control block reports to those
 of the specified
-.Ar address_family  .
+.Ar address_families  .
 The following address families
 are recognized:
 .Ar inet ,


Home | Main Index | Thread Index | Old Index