ash: use bbox wrappers for malloc etc instead of homegrown ones
[oweals/busybox.git] / networking / ping.c
index c3a71071c2d0b900f49019e1d44017906df82d69..71b2a4be8812e47dcb3c54346974ea47a654ecd5 100644 (file)
@@ -80,7 +80,7 @@ static int in_cksum(unsigned short *buf, int sz)
 
 static char *hostname;
 
-static void noresp(int ign ATTRIBUTE_UNUSED)
+static void noresp(int ign UNUSED_PARAM)
 {
        printf("No response from %s\n", hostname);
        exit(EXIT_FAILURE);
@@ -174,7 +174,7 @@ static void ping6(len_and_sockaddr *lsa)
 #endif
 
 int ping_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int ping_main(int argc ATTRIBUTE_UNUSED, char **argv)
+int ping_main(int argc UNUSED_PARAM, char **argv)
 {
        len_and_sockaddr *lsa;
 #if ENABLE_PING6
@@ -224,7 +224,7 @@ int ping_main(int argc ATTRIBUTE_UNUSED, char **argv)
 
 /* full(er) version */
 
-#define OPT_STRING ("qvc:s:w:W:I:4" USE_PING6("6"))
+#define OPT_STRING ("qvc:s:w:W:I:4" IF_PING6("6"))
 enum {
        OPT_QUIET = 1 << 0,
        OPT_VERBOSE = 1 << 1,
@@ -241,10 +241,11 @@ enum {
 struct globals {
        int pingsock;
        int if_index;
-       char *opt_I;
+       char *str_I;
        len_and_sockaddr *source_lsa;
        unsigned datalen;
-       unsigned long ntransmitted, nreceived, nrepeats, pingcount;
+       unsigned pingcount; /* must be int-sized */
+       unsigned long ntransmitted, nreceived, nrepeats;
        uint16_t myid;
        unsigned tmin, tmax; /* in us */
        unsigned long long tsum; /* in us, sum of all times */
@@ -266,7 +267,7 @@ struct globals {
 #define pingsock     (G.pingsock    )
 #define if_index     (G.if_index    )
 #define source_lsa   (G.source_lsa  )
-#define opt_I        (G.opt_I       )
+#define str_I        (G.str_I       )
 #define datalen      (G.datalen     )
 #define ntransmitted (G.ntransmitted)
 #define nreceived    (G.nreceived   )
@@ -302,8 +303,8 @@ void BUG_ping_globals_too_big(void);
 
 /**************************************************************************/
 
-static void print_stats_and_exit(int junk) ATTRIBUTE_NORETURN;
-static void print_stats_and_exit(int junk ATTRIBUTE_UNUSED)
+static void print_stats_and_exit(int junk) NORETURN;
+static void print_stats_and_exit(int junk UNUSED_PARAM)
 {
        signal(SIGINT, SIG_IGN);
 
@@ -366,7 +367,7 @@ static void sendping_tail(void (*sp)(int), const void *pkt, int size_pkt)
        }
 }
 
-static void sendping4(int junk ATTRIBUTE_UNUSED)
+static void sendping4(int junk UNUSED_PARAM)
 {
        /* +4 reserves a place for timestamp, which may end up sitting
         * *after* packet. Saves one if() */
@@ -388,7 +389,7 @@ static void sendping4(int junk ATTRIBUTE_UNUSED)
        sendping_tail(sendping4, pkt, datalen + ICMP_MINLEN);
 }
 #if ENABLE_PING6
-static void sendping6(int junk ATTRIBUTE_UNUSED)
+static void sendping6(int junk UNUSED_PARAM)
 {
        struct icmp6_hdr *pkt = alloca(datalen + sizeof(struct icmp6_hdr) + 4);
 
@@ -570,14 +571,15 @@ static void ping4(len_and_sockaddr *lsa)
                        bb_error_msg_and_die("can't set multicast source interface");
                xbind(pingsock, &source_lsa->u.sa, source_lsa->len);
        }
-       if (opt_I)
-               setsockopt(pingsock, SOL_SOCKET, SO_BINDTODEVICE, opt_I, strlen(opt_I) + 1);
+       if (str_I)
+               setsockopt_bindtodevice(pingsock, str_I);
 
        /* enable broadcast pings */
        setsockopt_broadcast(pingsock);
 
-       /* set recv buf for broadcast pings */
-       sockopt = 48 * 1024; /* explain why 48k? */
+       /* set recv buf (needed if we can get lots of responses: flood ping,
+        * broadcast ping etc) */
+       sockopt = (datalen * 2) + 7 * 1024; /* giving it a bit of extra room */
        setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, &sockopt, sizeof(sockopt));
 
        signal(SIGINT, print_stats_and_exit);
@@ -619,8 +621,8 @@ static void ping6(len_and_sockaddr *lsa)
        /* untested whether "-I addr" really works for IPv6: */
        if (source_lsa)
                xbind(pingsock, &source_lsa->u.sa, source_lsa->len);
-       if (opt_I)
-               setsockopt(pingsock, SOL_SOCKET, SO_BINDTODEVICE, opt_I, strlen(opt_I) + 1);
+       if (str_I)
+               setsockopt_bindtodevice(pingsock, str_I);
 
 #ifdef ICMP6_FILTER
        {
@@ -640,8 +642,9 @@ static void ping6(len_and_sockaddr *lsa)
        /* enable broadcast pings */
        setsockopt_broadcast(pingsock);
 
-       /* set recv buf for broadcast pings */
-       sockopt = 48 * 1024; /* explain why 48k? */
+       /* set recv buf (needed if we can get lots of responses: flood ping,
+        * broadcast ping etc) */
+       sockopt = (datalen * 2) + 7 * 1024; /* giving it a bit of extra room */
        setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, &sockopt, sizeof(sockopt));
 
        sockopt = offsetof(struct icmp6_hdr, icmp6_cksum);
@@ -714,37 +717,38 @@ static void ping(len_and_sockaddr *lsa)
 }
 
 int ping_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int ping_main(int argc ATTRIBUTE_UNUSED, char **argv)
+int ping_main(int argc UNUSED_PARAM, char **argv)
 {
        len_and_sockaddr *lsa;
-       char *opt_c, *opt_s;
-       USE_PING6(sa_family_t af = AF_UNSPEC;)
+       char *str_s;
+       int opt;
 
        INIT_G();
 
-       /* exactly one argument needed; -v and -q don't mix; -w NUM, -W NUM */
-       opt_complementary = "=1:q--v:v--q:w+:W+";
-       getopt32(argv, OPT_STRING, &opt_c, &opt_s, &deadline, &timeout, &opt_I);
-       if (option_mask32 & OPT_c)
-               pingcount = xatoul(opt_c); // -c
-       if (option_mask32 & OPT_s)
-               datalen = xatou16(opt_s); // -s
-       if (option_mask32 & OPT_I) { // -I
-               if_index = if_nametoindex(opt_I);
+       /* exactly one argument needed; -v and -q don't mix; -c NUM, -w NUM, -W NUM */
+       opt_complementary = "=1:q--v:v--q:c+:w+:W+";
+       opt = getopt32(argv, OPT_STRING, &pingcount, &str_s, &deadline, &timeout, &str_I);
+       if (opt & OPT_s)
+               datalen = xatou16(str_s); // -s
+       if (opt & OPT_I) { // -I
+               if_index = if_nametoindex(str_I);
                if (!if_index) {
                        /* TODO: I'm not sure it takes IPv6 unless in [XX:XX..] format */
-                       source_lsa = xdotted2sockaddr(opt_I, 0);
-                       opt_I = NULL; /* don't try to bind to device later */
+                       source_lsa = xdotted2sockaddr(str_I, 0);
+                       str_I = NULL; /* don't try to bind to device later */
                }
        }
        myid = (uint16_t) getpid();
        hostname = argv[optind];
 #if ENABLE_PING6
-       if (option_mask32 & OPT_IPV4)
-               af = AF_INET;
-       if (option_mask32 & OPT_IPV6)
-               af = AF_INET6;
-       lsa = xhost_and_af2sockaddr(hostname, 0, af);
+       {
+               sa_family_t af = AF_UNSPEC;
+               if (opt & OPT_IPV4)
+                       af = AF_INET;
+               if (opt & OPT_IPV6)
+                       af = AF_INET6;
+               lsa = xhost_and_af2sockaddr(hostname, 0, af);
+       }
 #else
        lsa = xhost_and_af2sockaddr(hostname, 0, AF_INET);
 #endif
@@ -755,7 +759,7 @@ int ping_main(int argc ATTRIBUTE_UNUSED, char **argv)
 
        dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa);
        ping(lsa);
-       print_stats_and_exit(0);
+       print_stats_and_exit(EXIT_SUCCESS);
        /*return EXIT_SUCCESS;*/
 }
 #endif /* FEATURE_FANCY_PING */
@@ -763,10 +767,11 @@ int ping_main(int argc ATTRIBUTE_UNUSED, char **argv)
 
 #if ENABLE_PING6
 int ping6_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int ping6_main(int argc, char **argv)
+int ping6_main(int argc UNUSED_PARAM, char **argv)
 {
        argv[0] = (char*)"-6";
-       return ping_main(argc + 1, argv - 1);
+       return ping_main(0 /* argc+1 - but it's unused anyway */,
+                       argv - 1);
 }
 #endif