Author: hrs
Date: Sat Jul 20 16:46:51 2013
New Revision: 253504
URL: http://svnweb.freebsd.org/changeset/base/253504

Log:
  - Simplify getaddr() and print_getmsg() by using RTAX_* instead of RTA_*
    as the argument.
  - Reduce unnecessary loop in print_getmsg().

Modified:
  head/sbin/route/route.c

Modified: head/sbin/route/route.c
==============================================================================
--- head/sbin/route/route.c     Sat Jul 20 15:58:43 2013        (r253503)
+++ head/sbin/route/route.c     Sat Jul 20 16:46:51 2013        (r253504)
@@ -825,35 +825,35 @@ newroute(int argc, char **argv)
                        case K_IFA:
                                if (!--argc)
                                        usage(NULL);
-                               getaddr(RTA_IFA, *++argv, 0, nrflags);
+                               getaddr(RTAX_IFA, *++argv, 0, nrflags);
                                break;
                        case K_IFP:
                                if (!--argc)
                                        usage(NULL);
-                               getaddr(RTA_IFP, *++argv, 0, nrflags);
+                               getaddr(RTAX_IFP, *++argv, 0, nrflags);
                                break;
                        case K_GENMASK:
                                if (!--argc)
                                        usage(NULL);
-                               getaddr(RTA_GENMASK, *++argv, 0, nrflags);
+                               getaddr(RTAX_GENMASK, *++argv, 0, nrflags);
                                break;
                        case K_GATEWAY:
                                if (!--argc)
                                        usage(NULL);
-                               getaddr(RTA_GATEWAY, *++argv, 0, nrflags);
+                               getaddr(RTAX_GATEWAY, *++argv, 0, nrflags);
                                gateway = *argv;
                                break;
                        case K_DST:
                                if (!--argc)
                                        usage(NULL);
-                               if (getaddr(RTA_DST, *++argv, &hp, nrflags))
+                               if (getaddr(RTAX_DST, *++argv, &hp, nrflags))
                                        nrflags |= F_ISHOST;
                                dest = *argv;
                                break;
                        case K_NETMASK:
                                if (!--argc)
                                        usage(NULL);
-                               getaddr(RTA_NETMASK, *++argv, 0, nrflags);
+                               getaddr(RTAX_NETMASK, *++argv, 0, nrflags);
                                /* FALLTHROUGH */
                        case K_NET:
                                nrflags |= F_FORCENET;
@@ -888,13 +888,13 @@ newroute(int argc, char **argv)
                } else {
                        if ((rtm_addrs & RTA_DST) == 0) {
                                dest = *argv;
-                               if (getaddr(RTA_DST, *argv, &hp, nrflags))
+                               if (getaddr(RTAX_DST, *argv, &hp, nrflags))
                                        nrflags |= F_ISHOST;
                        } else if ((rtm_addrs & RTA_GATEWAY) == 0) {
                                gateway = *argv;
-                               getaddr(RTA_GATEWAY, *argv, &hp, nrflags);
+                               getaddr(RTAX_GATEWAY, *argv, &hp, nrflags);
                        } else {
-                               getaddr(RTA_NETMASK, *argv, 0, nrflags);
+                               getaddr(RTAX_NETMASK, *argv, 0, nrflags);
                                nrflags |= F_FORCENET;
                        }
                }
@@ -1105,7 +1105,7 @@ inet6_makenetandmask(struct sockaddr_in6
  * returning 1 if a host address, 0 if a network address.
  */
 static int
-getaddr(int which, char *str, struct hostent **hpp, int nrflags)
+getaddr(int idx, char *str, struct hostent **hpp, int nrflags)
 {
        struct sockaddr *sa;
 #if defined(INET)
@@ -1130,36 +1130,16 @@ getaddr(int which, char *str, struct hos
                aflen = sizeof(struct sockaddr_dl);
 #endif
        }
-       rtm_addrs |= which;
+       rtm_addrs |= (1 << idx);
 
-       switch (which) {
-       case RTA_DST:
-               sa = (struct sockaddr *)&so[RTAX_DST];
-               break;
-       case RTA_GATEWAY:
-               sa = (struct sockaddr *)&so[RTAX_GATEWAY];
-               break;
-       case RTA_NETMASK:
-               sa = (struct sockaddr *)&so[RTAX_NETMASK];
-               break;
-       case RTA_GENMASK:
-               sa = (struct sockaddr *)&so[RTAX_GENMASK];
-               break;
-       case RTA_IFA:
-               sa = (struct sockaddr *)&so[RTAX_IFA];
-               break;
-       case RTA_IFP:
-               sa = (struct sockaddr *)&so[RTAX_IFP];
-               break;
-       default:
+       if (idx > RTAX_MAX)
                usage("internal error");
-               /*NOTREACHED*/
-       }
+       sa = (struct sockaddr *)&so[idx];
        sa->sa_family = af;
        sa->sa_len = aflen;
 
-       switch (which) {
-       case RTA_GATEWAY:
+       switch (idx) {
+       case RTAX_GATEWAY:
                if (nrflags & F_INTERFACE) {
                        struct ifaddrs *ifap, *ifa;
                        struct sockaddr_dl *sdl0 = (struct sockaddr_dl *)(void 
*)sa;
@@ -1190,7 +1170,7 @@ getaddr(int which, char *str, struct hos
                                return(1);
                }
                break;
-       case RTA_IFP:
+       case RTAX_IFP:
                sa->sa_family = AF_LINK;
                break;
        }
@@ -1198,10 +1178,10 @@ getaddr(int which, char *str, struct hos
                /*
                 * Default is net 0.0.0.0/0
                 */
-               switch (which) {
-               case RTA_DST:
+               switch (idx) {
+               case RTAX_DST:
                        forcenet++;
-                       getaddr(RTA_NETMASK, str, 0, nrflags);
+                       getaddr(RTAX_NETMASK, str, 0, nrflags);
                        break;
                }
                return (0);
@@ -1214,7 +1194,7 @@ getaddr(int which, char *str, struct hos
                int ecode;
 
                q = NULL;
-               if (which == RTA_DST && (q = strchr(str, '/')) != NULL)
+               if (idx == RTAX_DST && (q = strchr(str, '/')) != NULL)
                        *q = '\0';
                memset(&hints, 0, sizeof(hints));
                hints.ai_family = sa->sa_family;
@@ -1227,7 +1207,7 @@ getaddr(int which, char *str, struct hos
                freeaddrinfo(res);
                if (q != NULL)
                        *q++ = '/';
-               if (which == RTA_DST)
+               if (idx == RTAX_DST)
                        return (inet6_makenetandmask((struct sockaddr_in6 
*)(void *)sa, q));
                return (0);
        }
@@ -1263,7 +1243,7 @@ getaddr(int which, char *str, struct hos
        *hpp = NULL;
 
        q = strchr(str,'/');
-       if (q != NULL && which == RTA_DST) {
+       if (q != NULL && idx == RTAX_DST) {
                *q = '\0';
                if ((val = inet_network(str)) != INADDR_NONE) {
                        inet_makenetandmask(val, sin,
@@ -1273,10 +1253,10 @@ getaddr(int which, char *str, struct hos
                }
                *q = '/';
        }
-       if ((which != RTA_DST || forcenet == 0) &&
+       if ((idx != RTAX_DST || forcenet == 0) &&
            inet_aton(str, &sin->sin_addr)) {
                val = sin->sin_addr.s_addr;
-               if (which != RTA_DST || forcehost ||
+               if (idx != RTAX_DST || forcehost ||
                    inet_lnaof(sin->sin_addr) != INADDR_ANY)
                        return (1);
                else {
@@ -1284,7 +1264,7 @@ getaddr(int which, char *str, struct hos
                        goto netdone;
                }
        }
-       if (which == RTA_DST && forcehost == 0 &&
+       if (idx == RTAX_DST && forcehost == 0 &&
            ((val = inet_network(str)) != INADDR_NONE ||
            ((np = getnetbyname(str)) != NULL && (val = np->n_net) != 0))) {
 netdone:
@@ -1665,12 +1645,11 @@ badlen:
 static void
 print_getmsg(struct rt_msghdr *rtm, int msglen, int fib)
 {
-       struct sockaddr *dst = NULL, *gate = NULL, *mask = NULL;
-       struct sockaddr_dl *ifp = NULL;
-       struct sockaddr *sa;
+       struct sockaddr *sp[RTAX_MAX];
        char *cp;
        int i;
 
+       memset(sp, 0, sizeof(sp));
        (void)printf("   route to: %s\n",
            routename((struct sockaddr *)&so[RTAX_DST]));
        if (rtm->rtm_version != RTM_VERSION) {
@@ -1688,41 +1667,30 @@ print_getmsg(struct rt_msghdr *rtm, int 
                return;
        }
        cp = ((char *)(rtm + 1));
-       if (rtm->rtm_addrs)
-               for (i = 1; i; i <<= 1)
-                       if (i & rtm->rtm_addrs) {
-                               sa = (struct sockaddr *)cp;
-                               switch (i) {
-                               case RTA_DST:
-                                       dst = sa;
-                                       break;
-                               case RTA_GATEWAY:
-                                       gate = sa;
-                                       break;
-                               case RTA_NETMASK:
-                                       mask = sa;
-                                       break;
-                               case RTA_IFP:
-                                       if (sa->sa_family == AF_LINK &&
-                                          ((struct sockaddr_dl *)(void 
*)sa)->sdl_nlen)
-                                               ifp = (struct sockaddr_dl 
*)(void *)sa;
-                                       break;
-                               }
-                               cp += SA_SIZE(sa);
-                       }
-       if (dst && mask)
-               mask->sa_family = dst->sa_family;       /* XXX */
-       if (dst)
-               (void)printf("destination: %s\n", routename(dst));
-       if (mask)
-               (void)printf("       mask: %s\n", routename(mask));
-       if (gate && rtm->rtm_flags & RTF_GATEWAY)
-               (void)printf("    gateway: %s\n", routename(gate));
+       for (i = 0; i < RTAX_MAX; i++) {
+               if (rtm->rtm_addrs & (1 << i))
+                       sp[i] = (struct sockaddr *)cp;
+               cp += SA_SIZE((struct sockaddr *)cp);
+       }
+       if (rtm->rtm_addrs & RTA_IFP) {
+               if (sp[RTAX_IFP]->sa_family != AF_LINK ||
+                  ((struct sockaddr_dl *)(void *)sp[RTAX_IFP])->sdl_nlen == 0)
+                       sp[RTAX_IFP] = NULL;
+       }
+       if (sp[RTAX_DST] && sp[RTAX_NETMASK])
+               sp[RTAX_NETMASK]->sa_family = sp[RTAX_DST]->sa_family; /* XXX */
+       if (sp[RTAX_DST])
+               (void)printf("destination: %s\n", routename(sp[RTAX_DST]));
+       if (sp[RTAX_NETMASK])
+               (void)printf("       mask: %s\n", routename(sp[RTAX_NETMASK]));
+       if (sp[RTAX_GATEWAY] && (rtm->rtm_flags & RTF_GATEWAY))
+               (void)printf("    gateway: %s\n", routename(sp[RTAX_GATEWAY]));
        if (fib >= 0)
                (void)printf("        fib: %u\n", (unsigned int)fib);
-       if (ifp)
+       if (sp[RTAX_IFP])
                (void)printf("  interface: %.*s\n",
-                   ifp->sdl_nlen, ifp->sdl_data);
+                   ((struct sockaddr_dl *)(void *)sp[RTAX_IFP])->sdl_nlen,
+                   ((struct sockaddr_dl *)(void *)sp[RTAX_IFP])->sdl_data);
        (void)printf("      flags: ");
        printb(rtm->rtm_flags, routeflags);
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to