start_stop_daemon: NOMMU fixes, round 2 by Alex Landau <landau_alex@yahoo.com>
[oweals/busybox.git] / networking / route.c
index 881332b9f7bf89a8a2c9f8db7f12c15c4946e9a7..530c51b1017c42aca2aa5656f2f6e7b820cae2ee 100644 (file)
@@ -327,9 +327,10 @@ static void INET_setroute(int action, char **args)
        /* Create a socket to the INET kernel. */
        skfd = xsocket(AF_INET, SOCK_DGRAM, 0);
 
-       if (ioctl(skfd, ((action==RTACTION_ADD) ? SIOCADDRT : SIOCDELRT), &rt)<0) {
-               bb_perror_msg_and_die("SIOC[ADD|DEL]RT");
-       }
+       if (action == RTACTION_ADD)
+               xioctl(skfd, SIOCADDRT, &rt);
+       else
+               xioctl(skfd, SIOCDELRT, &rt);
 
        if (ENABLE_FEATURE_CLEAN_UP) close(skfd);
 }
@@ -423,17 +424,15 @@ static void INET6_setroute(int action, char **args)
                struct ifreq ifr;
                memset(&ifr, 0, sizeof(ifr));
                strncpy(ifr.ifr_name, devname, sizeof(ifr.ifr_name));
-
-               if (ioctl(skfd, SIOGIFINDEX, &ifr) < 0) {
-                       bb_perror_msg_and_die("SIOGIFINDEX");
-               }
+               xioctl(skfd, SIOGIFINDEX, &ifr);
                rt.rtmsg_ifindex = ifr.ifr_ifindex;
        }
 
        /* Tell the kernel to accept this route. */
-       if (ioctl(skfd, ((action==RTACTION_ADD) ? SIOCADDRT : SIOCDELRT), &rt)<0) {
-               bb_perror_msg_and_die("SIOC[ADD|DEL]RT");
-       }
+       if (action == RTACTION_ADD)
+               xioctl(skfd, SIOCADDRT, &rt);
+       else
+               xioctl(skfd, SIOCDELRT, &rt);
 
        if (ENABLE_FEATURE_CLEAN_UP) close(skfd);
 }
@@ -478,7 +477,7 @@ static void set_flags(char *flagstr, int flags)
 /* also used in netstat */
 void bb_displayroutes(int noresolve, int netstatfmt)
 {
-       char devname[64], flags[16], sdest[16], sgw[16];
+       char devname[64], flags[16], *sdest, *sgw;
        unsigned long d, g, m;
        int flgs, ref, use, metric, mtu, win, ir;
        struct sockaddr_in s_addr;
@@ -520,15 +519,14 @@ void bb_displayroutes(int noresolve, int netstatfmt)
                memset(&s_addr, 0, sizeof(struct sockaddr_in));
                s_addr.sin_family = AF_INET;
                s_addr.sin_addr.s_addr = d;
-               INET_rresolve(sdest, sizeof(sdest), &s_addr,
-                                         (noresolve | 0x8000), m);     /* Default instead of *. */
-
+               sdest = INET_rresolve(&s_addr, (noresolve | 0x8000), m); /* 'default' instead of '*' */
                s_addr.sin_addr.s_addr = g;
-               INET_rresolve(sgw, sizeof(sgw), &s_addr,
-                                         (noresolve | 0x4000), m);     /* Host instead of net. */
-
+               sgw = INET_rresolve(&s_addr, (noresolve | 0x4000), m); /* Host instead of net */
                mask.s_addr = m;
-               printf("%-16s%-16s%-16s%-6s", sdest, sgw, inet_ntoa(mask), flags);
+               /* "%15.15s" truncates hostnames, do we really want that? */
+               printf("%-15.15s %-15.15s %-16s%-6s", sdest, sgw, inet_ntoa(mask), flags);
+               free(sdest);
+               free(sgw);
                if (netstatfmt) {
                        printf("%5d %-5d %6d %s\n", mtu, win, ir, devname);
                } else {
@@ -541,7 +539,7 @@ void bb_displayroutes(int noresolve, int netstatfmt)
 
 static void INET6_displayroutes(int noresolve)
 {
-       char addr6[128], naddr6[128];
+       char addr6[128], *naddr6;
        /* In addr6x, we store both 40-byte ':'-delimited ipv6 addresses.
         * We read the non-delimited strings into the tail of the buffer
         * using fscanf and then modify the buffer by shifting forward
@@ -581,7 +579,7 @@ static void INET6_displayroutes(int noresolve)
 
                        do {
                                if (!*p) {
-                                       if (i==40) { /* nul terminator for 1st address? */
+                                       if (i == 40) { /* nul terminator for 1st address? */
                                                addr6x[39] = 0; /* Fixup... need 0 instead of ':'. */
                                                ++p;    /* Skip and continue. */
                                                continue;
@@ -606,18 +604,19 @@ static void INET6_displayroutes(int noresolve)
                        inet_pton(AF_INET6, addr6x + r,
                                          (struct sockaddr *) &snaddr6.sin6_addr);
                        snaddr6.sin6_family = AF_INET6;
-                       INET6_rresolve(naddr6, sizeof(naddr6),
-                                                  (struct sockaddr_in6 *) &snaddr6,
+                       naddr6 = INET6_rresolve((struct sockaddr_in6 *) &snaddr6,
                                                   0x0fff /* Apparently, upstream never resolves. */
                                                   );
 
                        if (!r) {                       /* 1st pass */
                                snprintf(addr6, sizeof(addr6), "%s/%d", naddr6, prefix_len);
                                r += 40;
+                               free(naddr6);
                        } else {                        /* 2nd pass */
                                /* Print the info. */
                                printf("%-43s %-39s %-5s %-6d %-2d %7d %-8s\n",
-                                                 addr6, naddr6, flags, metric, refcnt, use, iface);
+                                               addr6, naddr6, flags, metric, refcnt, use, iface);
+                               free(naddr6);
                                break;
                        }
                } while (1);