start_stop_daemon: NOMMU fixes, round 2 by Alex Landau <landau_alex@yahoo.com>
[oweals/busybox.git] / networking / route.c
index dfb8ee56f4bf336ca3a58d1daf0b6b6904a021b2..530c51b1017c42aca2aa5656f2f6e7b820cae2ee 100644 (file)
  * remove ridiculous amounts of bloat.
  */
 
-#include "busybox.h"
-#include "inet_common.h"
 #include <getopt.h>
 #include <net/route.h>
 #include <net/if.h>
 
+#include "libbb.h"
+#include "inet_common.h"
+
 
 #ifndef RTF_UP
 /* Keep this in sync with /usr/src/linux/include/linux/route.h */
@@ -326,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);
 }
@@ -422,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);
 }
@@ -477,8 +477,8 @@ 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];
-       unsigned long int d, g, m;
+       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;
        struct in_addr mask;
@@ -519,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 {
@@ -540,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
@@ -580,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;
@@ -605,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);