diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-08-26 21:07:59 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-08-26 21:07:59 +0200 |
commit | dbf165e1bdcc65d94ed9c0d70e5d24df5ad4fc8f (patch) | |
tree | 03573681fdfa3259ab52651cd532bbf26b2ac3a2 /sys/src/cmd/ip | |
parent | 6031dd83b632651013a7e7e707632ebabb68367f (diff) |
ping: don't spin when we get error reading icmp connection, print error and sleep
Diffstat (limited to 'sys/src/cmd/ip')
-rw-r--r-- | sys/src/cmd/ip/ping.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/src/cmd/ip/ping.c b/sys/src/cmd/ip/ping.c index 9c83754f4..c69c50e5e 100644 --- a/sys/src/cmd/ip/ping.c +++ b/sys/src/cmd/ip/ping.c @@ -303,6 +303,7 @@ rcvr(int fd, int msglen, int interval, int nmsg) int i, n, munged; ushort x; vlong now; + char err[ERRMAX]; uchar buf[64*1024+512]; Icmphdr *icmp; Req *r; @@ -312,9 +313,16 @@ rcvr(int fd, int msglen, int interval, int nmsg) alarm((nmsg-lostmsgs-rcvdmsgs)*interval+waittime); n = read(fd, buf, sizeof buf); alarm(0); + if(n == 0) + strcpy(err, "got eof"); + else if(n < 0) + rerrstr(err, sizeof(err)); now = nsec(); - if(n <= 0){ /* read interrupted - time to go */ + if(n <= 0){ + print("%s\n", err); clean(0, now+MINUTE, nil); + if(strstr(err, "interrupted") == nil) + sleep(waittime); continue; } if(n < msglen){ @@ -572,7 +580,7 @@ main(int argc, char **argv) switch(rfork(RFPROC|RFMEM|RFFDG)){ case -1: fprint(2, "%s: can't fork: %r\n", argv0); - /* fallthrough */ + exits("forking"); case 0: rcvr(fd, msglen, interval, nmsg); exits(0); |