Fix a few races. [rsc] --rw-rw-r-- M 118305 glenda sys 5708 Nov 12 08:42 sys/src/cmd/ip/ping.c /n/sourcesdump/2005/1112/plan9/sys/src/cmd/ip/ping.c:81,86 - /n/sourcesdump/2005/1113/plan9/sys/src/cmd/ip/ping.c:81,88 USED(a); if(strstr(msg, "alarm")) noted(NCONT); + else if(strstr(msg, "die")) + exits("errors"); else noted(NDFLT); } /n/sourcesdump/2005/1112/plan9/sys/src/cmd/ip/ping.c:94,100 - /n/sourcesdump/2005/1113/plan9/sys/src/cmd/ip/ping.c:96,102 for(l = &first; *l; ){ r = *l; - if(r->seq == seq){ + if(ip && r->seq == seq){ r->rtt = now-r->time; r->ttl = ip->ttl; reply(r, ip); /n/sourcesdump/2005/1112/plan9/sys/src/cmd/ip/ping.c:103,109 - /n/sourcesdump/2005/1113/plan9/sys/src/cmd/ip/ping.c:105,112 if(now-r->time > MINUTE){ *l = r->next; r->rtt = now-r->time; - r->ttl = ip->ttl; + if(ip) + r->ttl = ip->ttl; if(r->replied == 0) lost(r, ip); free(r); /n/sourcesdump/2005/1112/plan9/sys/src/cmd/ip/ping.c:177,190 - /n/sourcesdump/2005/1113/plan9/sys/src/cmd/ip/ping.c:180,194 ip = (Icmp*)buf; sum = 0; - while(!done || first != nil){ + while(lostmsgs+rcvdmsgs < nmsg){ alarm((nmsg-lostmsgs-rcvdmsgs)*interval+5000); n = read(fd, buf, sizeof(buf)); alarm(0); now = nsec(); - if(n <= 0){ - print("read: %r\n"); - break; + if(n <= 0){ /* read interrupted - time to go */ + fprint(2, "clean\n"); + clean(0, now+MINUTE, nil); + continue; } if(n < msglen){ print("bad len %d/%d\n", n, msglen); /n/sourcesdump/2005/1112/plan9/sys/src/cmd/ip/ping.c:213,219 - /n/sourcesdump/2005/1113/plan9/sys/src/cmd/ip/ping.c:217,222 if(lostmsgs) print("%d out of %d messages lost\n", lostmsgs, lostmsgs+rcvdmsgs); - postnote(PNPROC, senderpid, "die"); } void /n/sourcesdump/2005/1112/plan9/sys/src/cmd/ip/ping.c:229,234 - /n/sourcesdump/2005/1113/plan9/sys/src/cmd/ip/ping.c:232,238 int fd; int msglen, interval, nmsg; int pid; + char err[ERRMAX]; nsec(); /* make sure time file is already open */ /n/sourcesdump/2005/1112/plan9/sys/src/cmd/ip/ping.c:299,307 - /n/sourcesdump/2005/1113/plan9/sys/src/cmd/ip/ping.c:303,312 void reply(Req *r, Icmp *ip) { - rcvdmsgs++; r->rtt /= 1000LL; sum += r->rtt; + if(!r->replied) + rcvdmsgs++; if(!quiet && !lostonly){ if(addresses) print("%ud: %V->%V rtt %lld µs, avg rtt %lld µs, ttl = %d\n", /n/sourcesdump/2005/1112/plan9/sys/src/cmd/ip/ping.c:321,334 - /n/sourcesdump/2005/1113/plan9/sys/src/cmd/ip/ping.c:326,336 { if(!quiet){ if(addresses) - print("lost %ud: %V->%V avg rtt %lld µs\n", - r->seq-firstseq, - ip->src, ip->dst, - sum/rcvdmsgs); + print("lost %ud: %V->%V\n", r->seq-firstseq, + ip->src, ip->dst); else - print("lost %ud: avg rtt %lld µs\n", - r->seq-firstseq, - sum/rcvdmsgs); + print("lost %ud\n", r->seq-firstseq); } lostmsgs++; } +