In Bug 78, shortkey points out:
[oweals/busybox.git] / networking / arping.c
index a0bfdaaf647646c6ec30721f11ec099345a925b5..7279e8653733d09fbd1a218ee40567e0a37ae9d5 100644 (file)
 
 #define APPLET_NAME "arping"
 
-struct in_addr src;
-struct in_addr dst;
-struct sockaddr_ll me;
-struct sockaddr_ll he;
-struct timeval last;
-int dad;
-int unsolicited;
-int advert;
-int quiet;
-int quit_on_reply = 0;
-int count = -1;
-int timeout;
-int unicasting;
-int s;
-int broadcast_only;
-int sent;
-int brd_sent;
-int received;
-int brd_recv;
-int req_recv;
+static struct in_addr src;
+static struct in_addr dst;
+static struct sockaddr_ll me;
+static struct sockaddr_ll he;
+static struct timeval last;
+static int dad;
+static int unsolicited;
+static int advert;
+static int quiet;
+static int quit_on_reply = 0;
+static int count = -1;
+static int timeout;
+static int unicasting;
+static int s;
+static int broadcast_only;
+static int sent;
+static int brd_sent;
+static int received;
+static int brd_recv;
+static int req_recv;
 
 #define MS_TDIFF(tv1,tv2) ( ((tv1).tv_sec-(tv2).tv_sec)*1000 + \
                           ((tv1).tv_usec-(tv2).tv_usec)/1000 )
@@ -63,8 +63,9 @@ static void set_signal(int signo, void (*handler) (void))
 }
 #endif
 
-static int send_pack(int sock, struct in_addr *src_addr, struct in_addr *dst_addr,
-                         struct sockaddr_ll *ME, struct sockaddr_ll *HE)
+static int send_pack(int sock, struct in_addr *src_addr,
+                                        struct in_addr *dst_addr, struct sockaddr_ll *ME,
+                                        struct sockaddr_ll *HE)
 {
        int err;
        struct timeval now;
@@ -131,7 +132,7 @@ void finish(void)
 void catcher(void)
 {
        struct timeval tv;
-       struct timeval start;
+       static struct timeval start;
 
        gettimeofday(&tv, NULL);
 
@@ -274,7 +275,7 @@ int arping_main(int argc, char **argv)
 
        setuid(uid);
 
-       while ((ch = getopt(argc, argv, "h?bfDUAqc:w:s:I")) != EOF) {
+       while ((ch = getopt(argc, argv, "h?bfDUAqc:w:s:I:")) != EOF) {
                switch (ch) {
                case 'b':
                        broadcast_only = 1;
@@ -300,6 +301,13 @@ int arping_main(int argc, char **argv)
                        timeout = atoi(optarg);
                        break;
                case 'I':
+                       if (optarg == NULL)
+                               bb_show_usage();
+                       if (bb_strlen(optarg) > IF_NAMESIZE) {
+                               bb_error_msg("Interface name `%s' must be less than %d", optarg,
+                                                 IF_NAMESIZE);
+                               exit(2);
+                       }
                        device = optarg;
                        break;
                case 'f':
@@ -311,65 +319,61 @@ int arping_main(int argc, char **argv)
                case 'h':
                case '?':
                default:
-                       show_usage();
+                       bb_show_usage();
                }
        }
        argc -= optind;
        argv += optind;
 
        if (argc != 1)
-               show_usage();
+               bb_show_usage();
 
        target = *argv;
 
-       if (device == NULL) {
-               error_msg("-I <interface> is required!");
-               exit(1);
-       }
 
        if (s < 0) {
-               error_msg("socket");
+               bb_error_msg("socket");
                exit(socket_errno);
        }
 
-       if (1) {
+       {
                struct ifreq ifr;
 
                memset(&ifr, 0, sizeof(ifr));
                strncpy(ifr.ifr_name, device, IFNAMSIZ - 1);
                if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
-                       error_msg("unknown interface %s", device);
+                       bb_error_msg("Interface %s not found", device);
                        exit(2);
                }
                ifindex = ifr.ifr_ifindex;
 
                if (ioctl(s, SIOCGIFFLAGS, (char *) &ifr)) {
-                       error_msg("SIOCGIFFLAGS");
+                       bb_error_msg("SIOCGIFFLAGS");
                        exit(2);
                }
                if (!(ifr.ifr_flags & IFF_UP)) {
-                       error_msg("Interface \"%s\" is down", device);
+                       bb_error_msg("Interface %s is down", device);
                        exit(2);
                }
                if (ifr.ifr_flags & (IFF_NOARP | IFF_LOOPBACK)) {
-                       error_msg("Interface \"%s\" is not ARPable", device);
+                       bb_error_msg("Interface %s is not ARPable", device);
                        exit(dad ? 0 : 2);
                }
        }
 
-       if (inet_aton(target, &dst) != 1) {
+       if (!inet_aton(target, &dst)) {
                struct hostent *hp;
 
                hp = gethostbyname2(target, AF_INET);
                if (!hp) {
-                       error_msg("invalid or unknown target %s", target);
+                       bb_error_msg("invalid or unknown target %s", target);
                        exit(2);
                }
                memcpy(&dst, hp->h_addr, 4);
        }
 
-       if (source && inet_aton(source, &src) != 1) {
-               error_msg("invalid source address %s", source);
+       if (source && !inet_aton(source, &src)) {
+               bb_error_msg("invalid source address %s", source);
                exit(2);
        }
 
@@ -381,21 +385,21 @@ int arping_main(int argc, char **argv)
                int probe_fd = socket(AF_INET, SOCK_DGRAM, 0);
 
                if (probe_fd < 0) {
-                       error_msg("socket");
+                       bb_error_msg("socket");
                        exit(2);
                }
                if (device) {
                        if (setsockopt
                                (probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device,
                                 strlen(device) + 1) == -1)
-                               perror("WARNING: interface is ignored");
+                               bb_error_msg("WARNING: interface %s is ignored", device);
                }
                memset(&saddr, 0, sizeof(saddr));
                saddr.sin_family = AF_INET;
                if (src.s_addr) {
                        saddr.sin_addr = src;
                        if (bind(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)) == -1) {
-                               error_msg("bind");
+                               bb_error_msg("bind");
                                exit(2);
                        }
                } else if (!dad) {
@@ -411,12 +415,12 @@ int arping_main(int argc, char **argv)
                                perror("WARNING: setsockopt(SO_DONTROUTE)");
                        if (connect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr))
                                == -1) {
-                               error_msg("connect");
+                               bb_error_msg("connect");
                                exit(2);
                        }
                        if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) ==
                                -1) {
-                               error_msg("getsockname");
+                               bb_error_msg("getsockname");
                                exit(2);
                        }
                        src = saddr.sin_addr;
@@ -428,36 +432,39 @@ int arping_main(int argc, char **argv)
        me.sll_ifindex = ifindex;
        me.sll_protocol = htons(ETH_P_ARP);
        if (bind(s, (struct sockaddr *) &me, sizeof(me)) == -1) {
-               error_msg("bind");
+               bb_error_msg("bind");
                exit(2);
        }
 
-       if (1) {
+       {
                int alen = sizeof(me);
 
                if (getsockname(s, (struct sockaddr *) &me, &alen) == -1) {
-                       error_msg("getsockname");
+                       bb_error_msg("getsockname");
                        exit(2);
                }
        }
        if (me.sll_halen == 0) {
-               error_msg("Interface \"%s\" is not ARPable (no ll address)", device);
+               bb_error_msg("Interface \"%s\" is not ARPable (no ll address)", device);
                exit(dad ? 0 : 2);
        }
        he = me;
        memset(he.sll_addr, -1, he.sll_halen);
 
-       if (!quiet)
-               printf("ARPING to %s from %s via %s\n", inet_ntoa(dst),
-                          inet_ntoa(src), device ? device : "unknown");
+       if (!quiet) {
+               printf("ARPING to %s", inet_ntoa(dst));
+               printf(" from %s via %s\n", inet_ntoa(src),
+                          device ? device : "unknown");
+       }
 
        if (!src.s_addr && !dad) {
-               error_msg("no src address in the non-DAD mode");
+               bb_error_msg("no src address in the non-DAD mode");
                exit(2);
        }
 
        {
                struct sigaction sa;
+
                memset(&sa, 0, sizeof(sa));
                sa.sa_flags = SA_RESTART;