Florian Obser(flor...@openbsd.org) on 2018.04.29 17:10:46 +0200: > in the pledge refactoring in 2015 we lost the ability to filter on > address family when running route monitor. > i.e. route monitor -inet6 would only show IPv6 route messages. > > This restores that functionality. To see that I'm not globbering some > global state I (more or less) machanically turned int af into a local > variable. > > I should probably commit this in two steps. > > OK?
i think that getaddr(int which, int af, ... would be more readable than af as first argument. i.e. getaddr(af, RTA_GATEWAY, *++argv, NULL); would be getaddr(RTA_GATEWAY, af, *++argv, NULL); but i dont want to bikeshed this. so ok benno@ > diff --git route.c route.c > index 6a3b6e82f82..5bcc465eea4 100644 > --- route.c > +++ route.c > @@ -73,7 +73,7 @@ union sockunion so_dst, so_gate, so_mask, so_ifa, so_ifp, > so_label, so_src; > typedef union sockunion *sup; > pid_t pid; > int rtm_addrs, s; > -int forcehost, forcenet, Fflag, nflag, af, qflag, tflag, Tflag; > +int forcehost, forcenet, Fflag, nflag, qflag, tflag, Tflag; > int iflag, verbose, aflen = sizeof(struct sockaddr_in); > int locking, lockrest, debugonly; > u_long mpls_flags = MPLS_OP_LOCAL; > @@ -89,7 +89,7 @@ int show(int, char *[]); > int keycmp(const void *, const void *); > int keyword(char *); > void monitor(int, char *[]); > -int prefixlen(char *); > +int prefixlen(int, char *); > void sockaddr(char *, struct sockaddr *); > void sodump(sup, char *); > char *priorityname(uint8_t); > @@ -109,7 +109,7 @@ void pmsg_addrs(char *, int); > void bprintf(FILE *, int, char *); > void mask_addr(union sockunion *, union sockunion *, int); > int inet6_makenetandmask(struct sockaddr_in6 *, char *); > -int getaddr(int, char *, struct hostent **); > +int getaddr(int, int, char *, struct hostent **); > void getmplslabel(char *, int); > int rtmsg(int, int, int, uint8_t); > __dead void usage(char *); > @@ -145,10 +145,12 @@ usage(char *cp) > int > main(int argc, char **argv) > { > + unsigned int filter = 0; > int ch; > int rval = 0; > int kw; > int Terr = 0; > + int af = AF_UNSPEC; > > if (argc < 2) > usage(NULL); > @@ -195,13 +197,7 @@ main(int argc, char **argv) > if (kw == K_EXEC) > exit(rdomain(argc - 1, argv + 1)); > > - s = socket(PF_ROUTE, SOCK_RAW, 0); > - if (s == -1) > - err(1, "socket"); > if (kw == K_MONITOR) { > - unsigned int filter = 0; > - int af = 0; > - > while (--argc > 0) { > if (**(++argv)== '-') > switch (keyword(*argv + 1)) { > @@ -223,10 +219,18 @@ main(int argc, char **argv) > else > usage(*argv); > } > + } > + > + s = socket(PF_ROUTE, SOCK_RAW, af); > + if (s == -1) > + err(1, "socket"); > + > + if (filter != 0) { > if (setsockopt(s, AF_ROUTE, ROUTE_MSGFILTER, &filter, > sizeof(filter)) == -1) > err(1, "setsockopt(ROUTE_MSGFILTER)"); > } > + > /* force socket onto table user requested */ > if (Tflag == 1 && Terr == 0 && > setsockopt(s, AF_ROUTE, ROUTE_TABLEFILTER, > @@ -277,7 +281,7 @@ int > flushroutes(int argc, char **argv) > { > size_t needed; > - int mib[7], rlen, seqno; > + int mib[7], rlen, seqno, af = AF_UNSPEC; > char *buf = NULL, *next, *lim = NULL; > struct rt_msghdr *rtm; > struct sockaddr *sa; > @@ -456,7 +460,7 @@ newroute(int argc, char **argv) > { > char *cmd, *dest = "", *gateway = "", *error; > int ishost = 0, ret = 0, attempts, oerrno, flags = RTF_STATIC; > - int fmask = 0; > + int fmask = 0, af = AF_UNSPEC; > int key; > uint8_t prio = 0; > struct hostent *hp = NULL; > @@ -573,23 +577,23 @@ newroute(int argc, char **argv) > case K_IFA: > if (!--argc) > usage(1+*argv); > - getaddr(RTA_IFA, *++argv, NULL); > + getaddr(af, RTA_IFA, *++argv, NULL); > break; > case K_IFP: > if (!--argc) > usage(1+*argv); > - getaddr(RTA_IFP, *++argv, NULL); > + getaddr(af, RTA_IFP, *++argv, NULL); > break; > case K_GATEWAY: > if (!--argc) > usage(1+*argv); > - getaddr(RTA_GATEWAY, *++argv, NULL); > + getaddr(af, RTA_GATEWAY, *++argv, NULL); > gateway = *argv; > break; > case K_DST: > if (!--argc) > usage(1+*argv); > - ishost = getaddr(RTA_DST, *++argv, &hp); > + ishost = getaddr(af, RTA_DST, *++argv, &hp); > dest = *argv; > break; > case K_LABEL: > @@ -600,7 +604,7 @@ newroute(int argc, char **argv) > case K_NETMASK: > if (!--argc) > usage(1+*argv); > - getaddr(RTA_NETMASK, *++argv, NULL); > + getaddr(af, RTA_NETMASK, *++argv, NULL); > /* FALLTHROUGH */ > case K_NET: > forcenet++; > @@ -608,7 +612,7 @@ newroute(int argc, char **argv) > case K_PREFIXLEN: > if (!--argc) > usage(1+*argv); > - ishost = prefixlen(*++argv); > + ishost = prefixlen(af, *++argv); > break; > case K_MPATH: > flags |= RTF_MPATH; > @@ -645,10 +649,10 @@ newroute(int argc, char **argv) > } else { > if ((rtm_addrs & RTA_DST) == 0) { > dest = *argv; > - ishost = getaddr(RTA_DST, *argv, &hp); > + ishost = getaddr(af, RTA_DST, *argv, &hp); > } else if ((rtm_addrs & RTA_GATEWAY) == 0) { > gateway = *argv; > - getaddr(RTA_GATEWAY, *argv, &hp); > + getaddr(af, RTA_GATEWAY, *argv, &hp); > } else > usage(NULL); > } > @@ -711,7 +715,7 @@ newroute(int argc, char **argv) > int > show(int argc, char *argv[]) > { > - int af = 0; > + int af = AF_UNSPEC; > char prio = 0; > > while (--argc > 0) { > @@ -825,7 +829,7 @@ inet6_makenetandmask(struct sockaddr_in6 *sin6, char > *plen) > return (1); > else { > rtm_addrs |= RTA_NETMASK; > - prefixlen(plen); > + prefixlen(AF_INET6, plen); > > len = strtonum(plen, 0, 128, &errstr); > if (errstr) > @@ -849,7 +853,7 @@ inet6_makenetandmask(struct sockaddr_in6 *sin6, char > *plen) > * returning 1 if a host address, 0 if a network address. > */ > int > -getaddr(int which, char *s, struct hostent **hpp) > +getaddr(int af, int which, char *s, struct hostent **hpp) > { > sup su = NULL; > struct hostent *hp; > @@ -896,7 +900,7 @@ getaddr(int which, char *s, struct hostent **hpp) > switch (which) { > case RTA_DST: > forcenet++; > - getaddr(RTA_NETMASK, s, NULL); > + getaddr(af, RTA_NETMASK, s, NULL); > break; > case RTA_NETMASK: > su->sa.sa_len = 0; > @@ -1027,7 +1031,7 @@ getmplslabel(char *s, int in) > } > > int > -prefixlen(char *s) > +prefixlen(int af, char *s) > { > const char *errstr; > int len, q, r; > > > -- > I'm not entirely sure you are real. >