Maybe want to use IFG_EGRESS instead of "egress" but otherwise reads fine and works great, ok nicm.
On Fri, Jan 07, 2011 at 09:36:23PM -0500, Ted Unangst wrote: > On Sat, 8 Jan 2011, Nicholas Marriott wrote: > > > Nice idea, but maybe it could pick the same one that the interface group > > "egress" defaults to? > > You're lucky that gives me the same answer. :) > > Index: if.c > =================================================================== > RCS file: /home/tedu/cvs/src/usr.bin/netstat/if.c,v > retrieving revision 1.62 > diff -u -r1.62 if.c > --- if.c 22 Nov 2009 22:22:14 -0000 1.62 > +++ if.c 8 Jan 2011 02:34:33 -0000 > @@ -32,6 +32,7 @@ > > #include <sys/param.h> > #include <sys/types.h> > +#include <sys/ioctl.h> > #include <sys/protosw.h> > #include <sys/socket.h> > #include <sys/sysctl.h> > @@ -488,6 +489,46 @@ > } > } > > + > +static int > +isegress(char *name) > +{ > + static int s = -1; > + int len; > + struct ifgroupreq ifgr; > + struct ifg_req *ifg; > + int rv = 0; > + > + if (s == -1) { > + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) > + return 0; > + } > + > + memset(&ifgr, 0, sizeof(ifgr)); > + strlcpy(ifgr.ifgr_name, name, IFNAMSIZ); > + > + if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) { > + return 0; > + } > + > + len = ifgr.ifgr_len; > + ifgr.ifgr_groups = calloc(len, 1); > + if (ifgr.ifgr_groups == NULL) > + err(1, "getifgroups"); > + if (ioctl(s, SIOCGIFGROUP, (caddr_t)&ifgr) == -1) > + err(1, "SIOCGIFGROUP"); > + > + ifg = ifgr.ifgr_groups; > + for (; ifg && len >= sizeof(struct ifg_req); ifg++) { > + len -= sizeof(struct ifg_req); > + if (strcmp(ifg->ifgrq_group, "egress") == 0) > + rv = 1; > + } > + > + free(ifgr.ifgr_groups); > + return rv; > +} > + > static void > fetchifs(void) > { > @@ -500,6 +541,8 @@ > char *buf, *next, *lim; > char name[IFNAMSIZ]; > size_t len; > + int takeit = 0; > + int foundone = 0; > > if (sysctl(mib, 6, NULL, &len, NULL, 0) == -1) > err(1, "sysctl"); > @@ -508,6 +551,7 @@ > if (sysctl(mib, 6, buf, &len, NULL, 0) == -1) > err(1, "sysctl"); > > + memset(&ip_cur, 0, sizeof(ip_cur)); > lim = buf + len; > for (next = buf; next < lim; next += rtm->rtm_msglen) { > rtm = (struct rt_msghdr *)next; > @@ -531,6 +575,14 @@ > memcpy(name, sdl->sdl_data, sdl->sdl_nlen); > > if (interface != NULL && !strcmp(name, interface)) { > + takeit = 1; > + } else if (interface == NULL && foundone == 0 && > + isegress(name)) { > + takeit = 1; > + foundone = 1; > + } else > + takeit = 0; > + if (takeit) { > strlcpy(ip_cur.ift_name, name, > sizeof(ip_cur.ift_name)); > ip_cur.ift_ip = ifd->ifi_ipackets; > @@ -555,7 +607,7 @@ > break; > } > } > - if (interface == NULL) { > + if (interface == NULL && foundone == 0) { > strlcpy(ip_cur.ift_name, name, > sizeof(ip_cur.ift_name)); > ip_cur.ift_ip = ifd->ifi_ipackets;