xatonum.h: add comment
[oweals/busybox.git] / networking / traceroute.c
index 9fc15d3900dd94cd3d7cb1f9676074dc67d87f14..773fc6a8b6681fce5a562da169e8c9800b14a07a 100644 (file)
@@ -346,10 +346,10 @@ static int optlen;                     /* length of ip options */
 
 
 struct globals {
-       /* last inbound (icmp) packet */
-       unsigned char packet[512];
        struct sockaddr_storage whereto;        /* Who to try to reach */
        struct sockaddr_storage wherefrom;      /* Who we are */
+       /* last inbound (icmp) packet */
+       unsigned char packet[512];
 #if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
        /* Maximum number of gateways (include room for one noop) */
 #define NGATEWAYS ((int)((MAX_IPOPTLEN - IPOPT_MINOFF - 1) / sizeof(uint32_t)))
@@ -359,7 +359,7 @@ struct globals {
 };
 
 #define G (*ptr_to_globals)
-
+#define INIT_G() PTR_TO_GLOBALS = xzalloc(sizeof(G))
 #define packet    (G.packet   )
 #define whereto   (G.whereto  )
 #define wherefrom (G.wherefrom)
@@ -397,8 +397,8 @@ ifaddrlist(struct IFADDRLIST **ipaddrp)
        ) {
                if (errno == EINVAL)
                        bb_error_msg_and_die(
-                           "SIOCGIFCONF: ifreq struct too small (%d bytes)",
-                           IFREQ_BUFSIZE * sizeof(ibuf[0]));
+                           "SIOCGIFCONF: ifreq struct too small (%u bytes)",
+                           (unsigned)(IFREQ_BUFSIZE * sizeof(ibuf[0])));
                bb_perror_msg_and_die("SIOCGIFCONF");
        }
        ifrp = ibuf;
@@ -445,8 +445,8 @@ ifaddrlist(struct IFADDRLIST **ipaddrp)
                if (strchr(al->device, ':') != NULL)
                        continue;
 #endif
-               if (ioctl(fd, SIOCGIFADDR, (char *)&ifr) < 0)
-                       bb_perror_msg_and_die("SIOCGIFADDR: %s", al->device);
+               ioctl_or_perror_and_die(fd, SIOCGIFADDR, (char *)&ifr,
+                               "SIOCGIFADDR: %s", al->device);
 
                addr_sin = (struct sockaddr_in *)&ifr.ifr_addr;
                al->addr = addr_sin->sin_addr.s_addr;
@@ -537,21 +537,15 @@ findsaddr(const struct sockaddr_in *to, struct sockaddr_in *from)
 static int
 wait_for_reply(int sock, struct sockaddr_in *fromp)
 {
-       fd_set fds;
-       struct timeval tvwait;
+       struct pollfd pfd[1];
        int cc = 0;
        socklen_t fromlen = sizeof(*fromp);
 
-       FD_ZERO(&fds);
-       FD_SET(sock, &fds);
-
-       tvwait.tv_sec = waittime;
-       tvwait.tv_usec = 0;
-
-       if (select(sock + 1, &fds, NULL, NULL, &tvwait) > 0)
-               cc = recvfrom(sock, (char *)packet, sizeof(packet), 0,
+       pfd[0].fd = sock;
+       pfd[0].events = POLLIN;
+       if (safe_poll(pfd, 1, waittime * 1000) > 0)
+               cc = recvfrom(sock, packet, sizeof(packet), 0,
                            (struct sockaddr *)fromp, &fromlen);
-
        return cc;
 }
 
@@ -700,7 +694,7 @@ send_probe(int seq, int ttl)
 static inline const char *
 pr_type(unsigned char t)
 {
-       static const char * const ttab[] = {
+       static const char *const ttab[] = {
        "Echo Reply",   "ICMP 1",       "ICMP 2",       "Dest Unreachable",
        "Source Quench", "Redirect",    "ICMP 6",       "ICMP 7",
        "Echo",         "Router Advert", "Router Solicit", "Time Exceeded",
@@ -802,22 +796,20 @@ packet_ok(unsigned char *buf, int cc, struct sockaddr_in *from, int seq)
  * numeric value, otherwise try for symbolic name.
  */
 static inline void
-inetname(struct sockaddr_in *from)
+print_inetname(struct sockaddr_in *from)
 {
-       const char *n = NULL;
        const char *ina;
-       char name[257];
 
-       if (!nflag && from->sin_addr.s_addr != INADDR_ANY) {
-               if (INET_rresolve(name, sizeof(name), from, 0x4000,
-                                               0xffffffff) >= 0)
-                       n = name;
-       }
        ina = inet_ntoa(from->sin_addr);
        if (nflag)
                printf(" %s", ina);
-       else
+       else {
+               char *n = NULL;
+               if (from->sin_addr.s_addr != INADDR_ANY)
+                       n = xmalloc_sockaddr2host_noport((struct sockaddr*)from);
                printf(" %s (%s)", (n ? n : ina), ina);
+               free(n);
+       }
 }
 
 static inline void
@@ -830,7 +822,7 @@ print(unsigned char *buf, int cc, struct sockaddr_in *from)
        hlen = ip->ip_hl << 2;
        cc -= hlen;
 
-       inetname(from);
+       print_inetname(from);
 #if ENABLE_FEATURE_TRACEROUTE_VERBOSE
        if (verbose)
                printf(" %d bytes to %s", cc, inet_ntoa(ip->ip_dst));
@@ -897,7 +889,7 @@ print_delta_ms(unsigned t1p, unsigned t2p)
        printf("  %u.%03u ms", tt/1000, tt%1000);
 }
 
-int traceroute_main(int argc, char **argv);
+int traceroute_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int traceroute_main(int argc, char **argv)
 {
        int code, n;
@@ -932,7 +924,7 @@ int traceroute_main(int argc, char **argv)
        llist_t *source_route_list = NULL;
 #endif
 
-       PTR_TO_GLOBALS = xzalloc(sizeof(G));
+       INIT_G();
        from = (struct sockaddr_in *)&wherefrom;
        to = (struct sockaddr_in *)&whereto;
 
@@ -943,7 +935,7 @@ int traceroute_main(int argc, char **argv)
        opt_complementary = "x-x";
 #endif
 
-       op = getopt32(argc, argv, "FIlnrdvxt:i:m:p:q:s:w:z:f:"
+       op = getopt32(argv, "FIlnrdvxt:i:m:p:q:s:w:z:f:"
 #if ENABLE_FEATURE_TRACEROUTE_SOURCE_ROUTE
                                        "g:"
 #endif
@@ -1330,7 +1322,7 @@ int traceroute_main(int argc, char **argv)
                                printf(" *");
                        (void)fflush(stdout);
                }
-               putchar('\n');
+               bb_putchar('\n');
                if (got_there ||
                    (unreachable > 0 && unreachable >= nprobes - 1))
                        break;