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.
> 

Reply via email to