diff -up iputils-s20070202/arping.c.arping_timeout iputils-s20070202/arping.c --- iputils-s20070202/arping.c.arping_timeout 2008-02-18 16:51:36.000000000 +0100 +++ iputils-s20070202/arping.c 2008-02-18 16:54:03.000000000 +0100 @@ -45,7 +45,8 @@ struct in_addr src, dst; char *target; int dad, unsolicited, advert; int quiet; -int count=-1; +int count; +int forever = 1; int timeout; int unicasting; int s; @@ -59,7 +60,7 @@ int broadcast_only; struct sockaddr_ll me[2]; struct sockaddr_ll he[2]; -struct timeval start, last; +struct timeval last; int sent, brd_sent; int received, brd_recv, req_recv; @@ -172,13 +173,15 @@ void catcher(void) gettimeofday(&tv, NULL); - if (start.tv_sec==0) - start = tv; - - if (count-- == 0 || (timeout && MS_TDIFF(tv,start) > timeout*1000 + 500)) - finish(); + if (!forever && count == 0) { + if (timeout && MS_TDIFF(tv, last) > timeout * 1000 + 500) + finish(); + else if (!timeout) + finish(); + } - if (last.tv_sec==0 || MS_TDIFF(tv,last) > 500) { + if ((count > 0 || forever) && (last.tv_sec == 0 || MS_TDIFF(tv, last) > 500)) { + count--; send_pack(s, src, dst, &me[0], &he[0]); if (count == 0 && unsolicited) finish(); @@ -339,6 +342,10 @@ main(int argc, char **argv) break; case 'c': count = atoi(optarg); + if (count > 0) + forever = 0; + else + forever = 1; break; case 'w': timeout = atoi(optarg); @@ -544,7 +551,8 @@ main(int argc, char **argv) sigaddset(&sset, SIGALRM); sigaddset(&sset, SIGINT); sigprocmask(SIG_BLOCK, &sset, &osset); - recv_pack(packet, cc, &from[0]); + if (recv_pack(packet, cc, from) && count == 0 && !forever) + finish(); sigprocmask(SIG_SETMASK, &osset, NULL); } }