fix missed option argument for -I <device>, interface name checks
redesigned, patch by Nick Fedchik
This commit is contained in:
parent
f2ba45e339
commit
e6ae6e3d39
@ -63,8 +63,9 @@ static void set_signal(int signo, void (*handler) (void))
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int send_pack(int sock, struct in_addr *src_addr, struct in_addr *dst_addr,
|
static int send_pack(int sock, struct in_addr *src_addr,
|
||||||
struct sockaddr_ll *ME, struct sockaddr_ll *HE)
|
struct in_addr *dst_addr, struct sockaddr_ll *ME,
|
||||||
|
struct sockaddr_ll *HE)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
@ -274,7 +275,7 @@ int arping_main(int argc, char **argv)
|
|||||||
|
|
||||||
setuid(uid);
|
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) {
|
switch (ch) {
|
||||||
case 'b':
|
case 'b':
|
||||||
broadcast_only = 1;
|
broadcast_only = 1;
|
||||||
@ -300,6 +301,13 @@ int arping_main(int argc, char **argv)
|
|||||||
timeout = atoi(optarg);
|
timeout = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'I':
|
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;
|
device = optarg;
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
@ -322,10 +330,6 @@ int arping_main(int argc, char **argv)
|
|||||||
|
|
||||||
target = *argv;
|
target = *argv;
|
||||||
|
|
||||||
if (device == NULL) {
|
|
||||||
error_msg("-I <interface> is required!");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s < 0) {
|
if (s < 0) {
|
||||||
error_msg("socket");
|
error_msg("socket");
|
||||||
@ -338,7 +342,7 @@ int arping_main(int argc, char **argv)
|
|||||||
memset(&ifr, 0, sizeof(ifr));
|
memset(&ifr, 0, sizeof(ifr));
|
||||||
strncpy(ifr.ifr_name, device, IFNAMSIZ - 1);
|
strncpy(ifr.ifr_name, device, IFNAMSIZ - 1);
|
||||||
if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
|
if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
|
||||||
error_msg("unknown interface %s", device);
|
error_msg("Interface %s not found", device);
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
ifindex = ifr.ifr_ifindex;
|
ifindex = ifr.ifr_ifindex;
|
||||||
@ -348,11 +352,11 @@ int arping_main(int argc, char **argv)
|
|||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
if (!(ifr.ifr_flags & IFF_UP)) {
|
if (!(ifr.ifr_flags & IFF_UP)) {
|
||||||
error_msg("Interface \"%s\" is down", device);
|
error_msg("Interface %s is down", device);
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
if (ifr.ifr_flags & (IFF_NOARP | IFF_LOOPBACK)) {
|
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);
|
exit(dad ? 0 : 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -388,7 +392,7 @@ int arping_main(int argc, char **argv)
|
|||||||
if (setsockopt
|
if (setsockopt
|
||||||
(probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device,
|
(probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device,
|
||||||
strlen(device) + 1) == -1)
|
strlen(device) + 1) == -1)
|
||||||
perror("WARNING: interface is ignored");
|
error_msg("WARNING: interface %s is ignored", device);
|
||||||
}
|
}
|
||||||
memset(&saddr, 0, sizeof(saddr));
|
memset(&saddr, 0, sizeof(saddr));
|
||||||
saddr.sin_family = AF_INET;
|
saddr.sin_family = AF_INET;
|
||||||
@ -458,6 +462,7 @@ int arping_main(int argc, char **argv)
|
|||||||
|
|
||||||
{
|
{
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
|
|
||||||
memset(&sa, 0, sizeof(sa));
|
memset(&sa, 0, sizeof(sa));
|
||||||
sa.sa_flags = SA_RESTART;
|
sa.sa_flags = SA_RESTART;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user