Module Name: src Committed By: bad Date: Fri Oct 18 22:18:14 UTC 2013
Modified Files: src/usr.bin/netstat: main.c netstat.1 Log Message: Make the -f option accept multiple address families. Bump man page date. To generate a diff of this commit: cvs rdiff -u -r1.86 -r1.87 src/usr.bin/netstat/main.c cvs rdiff -u -r1.66 -r1.67 src/usr.bin/netstat/netstat.1 Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/netstat/main.c diff -u src/usr.bin/netstat/main.c:1.86 src/usr.bin/netstat/main.c:1.87 --- src/usr.bin/netstat/main.c:1.86 Wed Jun 19 21:12:03 2013 +++ src/usr.bin/netstat/main.c Fri Oct 18 22:18:14 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.86 2013/06/19 21:12:03 christos Exp $ */ +/* $NetBSD: main.c,v 1.87 2013/10/18 22:18:14 bad Exp $ */ /* * Copyright (c) 1983, 1988, 1993 @@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 19 #if 0 static char sccsid[] = "from: @(#)main.c 8.4 (Berkeley) 3/1/94"; #else -__RCSID("$NetBSD: main.c,v 1.86 2013/06/19 21:12:03 christos Exp $"); +__RCSID("$NetBSD: main.c,v 1.87 2013/10/18 22:18:14 bad Exp $"); #endif #endif /* not lint */ @@ -395,6 +395,7 @@ main(int argc, char *argv[]) struct protox *tp; /* for printing cblocks & stats */ int ch; char *cp; + char *afname, *afnames; u_long pcbaddr; if (prog_init) { @@ -407,6 +408,7 @@ main(int argc, char *argv[]) (void)setegid(getgid()); tp = NULL; af = AF_UNSPEC; + afnames = NULL; pcbaddr = 0; while ((ch = getopt(argc, argv, @@ -428,24 +430,7 @@ main(int argc, char *argv[]) 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,124 @@ main(int argc, char *argv[]) */ sethostent(1); setnetent(1); - if (iflag) { - if (af != AF_UNSPEC) - goto protostat; + /* + * If -f was used afnames != NULL, loop over the address families. + * Otherwise do this at least once (with af == AF_UNSPEC). + */ + afname = NULL; + do { + 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); -#endif - if (af == AF_ARP || af == AF_UNSPEC) - for (tp = arpprotox; 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); #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); } @@ -834,9 +852,9 @@ usage(void) const char *progname = getprogname(); (void)fprintf(stderr, -"usage: %s [-Aan] [-f address_family] [-M core] [-N system]\n", progname); +"usage: %s [-Aan] [-f address_family[,family ...]] [-M core] [-N system]\n", progname); (void)fprintf(stderr, -" %s [-bdgiLmnqrsSv] [-f address_family] [-M core] [-N system]\n", +" %s [-bdgiLmnqrsSv] [-f address_family[,family ...]] [-M core] [-N system]\n", progname); (void)fprintf(stderr, " %s [-dn] [-I interface] [-M core] [-N system] [-w wait]\n", progname); @@ -847,7 +865,7 @@ usage(void) (void)fprintf(stderr, " %s [-p protocol] [-i] [-I Interface] \n", progname); (void)fprintf(stderr, -" %s [-s] [-f address_family] [-i] [-I Interface]\n", progname); +" %s [-s] [-f address_family[,family ...]] [-i] [-I Interface]\n", progname); (void)fprintf(stderr, " %s [-s] [-B] [-I interface]\n", progname); exit(1); Index: src/usr.bin/netstat/netstat.1 diff -u src/usr.bin/netstat/netstat.1:1.66 src/usr.bin/netstat/netstat.1:1.67 --- src/usr.bin/netstat/netstat.1:1.66 Fri Mar 1 18:26:11 2013 +++ src/usr.bin/netstat/netstat.1 Fri Oct 18 22:18:14 2013 @@ -1,4 +1,4 @@ -.\" $NetBSD: netstat.1,v 1.66 2013/03/01 18:26:11 joerg Exp $ +.\" $NetBSD: netstat.1,v 1.67 2013/10/18 22:18:14 bad Exp $ .\" .\" Copyright (c) 1983, 1990, 1992, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,21 +29,22 @@ .\" .\" @(#)netstat.1 8.8 (Berkeley) 4/18/94 .\" -.Dd February 5, 2013 +.Dd October 19, 2013 .Dt NETSTAT 1 .Os .Sh NAME .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 @@ With either interface display (option .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 ,