diff options
author | Glenn L McGrath | 2003-01-19 13:31:41 +0000 |
---|---|---|
committer | Glenn L McGrath | 2003-01-19 13:31:41 +0000 |
commit | e6ae6e3d39443606f9f101b9c6ef0070f3c863a1 (patch) | |
tree | 8872c356470717444ddf0c1ee43ee22d3a8d974d /networking | |
parent | f2ba45e339a8adc589704217409684f7f6d1d214 (diff) | |
download | busybox-e6ae6e3d39443606f9f101b9c6ef0070f3c863a1.zip busybox-e6ae6e3d39443606f9f101b9c6ef0070f3c863a1.tar.gz |
fix missed option argument for -I <device>, interface name checks
redesigned, patch by Nick Fedchik
Diffstat (limited to 'networking')
-rw-r--r-- | networking/arping.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/networking/arping.c b/networking/arping.c index a0bfdaa..af44f92 100644 --- a/networking/arping.c +++ b/networking/arping.c @@ -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; @@ -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) + show_usage(); + if (xstrlen(optarg) > IF_NAMESIZE) { + error_msg("Interface name `%s' must be less than %d", optarg, + IF_NAMESIZE); + exit(2); + } device = optarg; break; case 'f': @@ -322,10 +330,6 @@ int arping_main(int argc, char **argv) target = *argv; - if (device == NULL) { - error_msg("-I <interface> is required!"); - exit(1); - } if (s < 0) { error_msg("socket"); @@ -338,7 +342,7 @@ int arping_main(int argc, char **argv) memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, device, IFNAMSIZ - 1); if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) { - error_msg("unknown interface %s", device); + error_msg("Interface %s not found", device); exit(2); } ifindex = ifr.ifr_ifindex; @@ -348,11 +352,11 @@ int arping_main(int argc, char **argv) exit(2); } if (!(ifr.ifr_flags & IFF_UP)) { - error_msg("Interface \"%s\" is down", device); + 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); + error_msg("Interface %s is not ARPable", device); exit(dad ? 0 : 2); } } @@ -388,7 +392,7 @@ int arping_main(int argc, char **argv) if (setsockopt (probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device) + 1) == -1) - perror("WARNING: interface is ignored"); + error_msg("WARNING: interface %s is ignored", device); } memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; @@ -458,6 +462,7 @@ int arping_main(int argc, char **argv) { struct sigaction sa; + memset(&sa, 0, sizeof(sa)); sa.sa_flags = SA_RESTART; |