Date: Fri, 3 Nov 2006 04:18:03 +0200 From: Giorgos Keramidas <keramida@ceid.upatras.gr> To: josh.carroll@psualum.com Cc: freebsd-hackers@freebsd.org Subject: Re: sockstat tcp/udp switches Message-ID: <20061103021803.GC8508@kobe.laptop> In-Reply-To: <8cb6106e0611021507n6315b629kad8cbbf901343c2@mail.gmail.com> References: <8cb6106e0610311058s7144d38bp2b1dafd114e2b433@mail.gmail.com> <20061102094748.G75543@mignon.ki.iif.hu> <8cb6106e0611021507n6315b629kad8cbbf901343c2@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 2006-11-02 15:07, Josh Carroll <josh.carroll@gmail.com> wrote: > > I haven't tested yet, but I think in the options structure you > >should use : > > > >+ {"ipv6", 0, NULL, '6'}, > > > >instead of: > >+ {"ipv6", 0, NULL, 0}, > > Oops, thanks for catching that. Fixed that in the new patch below. > > >also for portability you should use: > >no_argument or required_argument as a second field.... > > Thank you for the feedback, I've modified that and the new patch is below. Can we have something that doesn't need one option letter for each protocol, protocol family or socket type, please? :) I've tested this patch, and it seems to work ok -- at least much better than having to type: $ sockstat -4 | { read head; echo "$head" ; grep -i tcp; } But I don't particularly like the fact that it grabs two option letters for tcp and udp. Maybe we can add an option like: -P proto Display only sockets of _protocol_ type. Then we can use just two options, similar to the ones netstat(1) uses, to designate a protocol family and a specific protocol within that family :) > --- sockstat.c.orig Thu Nov 2 15:01:16 2006 > +++ sockstat.c Thu Nov 2 15:02:32 2006 > @@ -58,6 +58,7 @@ > #include <stdlib.h> > #include <string.h> > #include <unistd.h> > +#include <getopt.h> > > static int opt_4; /* Show IPv4 sockets */ > static int opt_6; /* Show IPv6 sockets */ > @@ -65,6 +66,8 @@ > static int opt_l; /* Show listening sockets */ > static int opt_u; /* Show Unix domain sockets */ > static int opt_v; /* Verbose mode */ > +static int opt_tcp; /* show tcp */ > +static int opt_udp; /* show udp */ > > static int *ports; > > @@ -584,8 +587,20 @@ > main(int argc, char *argv[]) > { > int o; > + static struct option options[] = { > + {"ipv4", no_argument, NULL, '4'}, > + {"ipv6", no_argument, NULL, '6'}, > + {"connected", no_argument, NULL, 'c'}, > + {"listening", no_argument, NULL, 'l'}, > + {"unix", no_argument, NULL, 'u'}, > + {"verbose", no_argument, NULL, 'v'}, > + {"port", required_argument, NULL, 'p'}, > + {"tcp", no_argument, NULL, 't'}, > + {"udp", no_argument, NULL, 'd'}, > + {NULL, 0, NULL, 0} > + }; > > - while ((o = getopt(argc, argv, "46clp:uv")) != -1) > + while ((o = getopt_long_only(argc, argv, "46clp:uvtd", options, > NULL)) != -1) > switch (o) { > case '4': > opt_4 = 1; > @@ -608,6 +623,12 @@ > case 'v': > ++opt_v; > break; > + case 't': > + opt_tcp = 1; > + break; > + case 'd': > + opt_udp = 1; > + break; > default: > usage(); > } > @@ -618,20 +639,35 @@ > if (argc > 0) > usage(); > > - if (!opt_4 && !opt_6 && !opt_u) > - opt_4 = opt_6 = opt_u = 1; > + if (!opt_4 && !opt_6) { > + opt_4 = opt_6 = 1; > + > + if(!opt_u) { > + if(opt_tcp || opt_udp) > + opt_u = 0; > + } else { > + opt_4 = opt_6 = opt_u = 1; > + } > + } > + > if (!opt_c && !opt_l) > opt_c = opt_l = 1; > > + if(!opt_tcp && !opt_udp) > + opt_tcp = opt_udp = 1; > + > if (opt_4 || opt_6) { > - gather_inet(IPPROTO_TCP); > - gather_inet(IPPROTO_UDP); > + if(opt_tcp) > + gather_inet(IPPROTO_TCP); > + if(opt_udp) > + gather_inet(IPPROTO_UDP); > gather_inet(IPPROTO_DIVERT); > } > if (opt_u) { > gather_unix(SOCK_STREAM); > gather_unix(SOCK_DGRAM); > } > + > getfiles(); > display(); > _______________________________________________ > freebsd-hackers@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers > To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20061103021803.GC8508>