summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ip
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-08-26 21:07:59 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2014-08-26 21:07:59 +0200
commitdbf165e1bdcc65d94ed9c0d70e5d24df5ad4fc8f (patch)
tree03573681fdfa3259ab52651cd532bbf26b2ac3a2 /sys/src/cmd/ip
parent6031dd83b632651013a7e7e707632ebabb68367f (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.c12
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);