Browse Source

Plan 9 from Bell Labs 2003-08-22

David du Colombier 20 years ago
parent
commit
9a0e37e2cb
3 changed files with 42 additions and 21 deletions
  1. 1 1
      dist/replica/plan9.db
  2. 1 0
      dist/replica/plan9.log
  3. 40 20
      sys/src/cmd/ip/ping.c

+ 1 - 1
dist/replica/plan9.db

@@ -9175,7 +9175,7 @@ sys/src/cmd/ip/imap4d/utils.c - 664 sys sys 1015013077 2481
 sys/src/cmd/ip/ipconfig.c - 664 sys sys 1060189236 29311
 sys/src/cmd/ip/measure.c - 664 sys sys 944961011 3733
 sys/src/cmd/ip/mkfile - 664 sys sys 1038443023 1222
-sys/src/cmd/ip/ping.c - 664 sys sys 1056550715 5076
+sys/src/cmd/ip/ping.c - 664 sys sys 1061496964 5552
 sys/src/cmd/ip/ppp - 20000000775 sys sys 988249980 0
 sys/src/cmd/ip/ppp/block.c - 664 sys sys 1015090266 5353
 sys/src/cmd/ip/ppp/compress.c - 664 sys sys 1015090266 11743

+ 1 - 0
dist/replica/plan9.log

@@ -13055,3 +13055,4 @@
 1060664570 0 c 386/bin/ndb/dnsdebug - 775 sys sys 1060663186 190607
 1060664570 1 c sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1060663185 8430
 1060876871 0 c sys/src/cmd/htmlfmt/html.c - 664 sys sys 1060876449 6032
+1061497867 0 c sys/src/cmd/ip/ping.c - 664 sys sys 1061496964 5552

+ 40 - 20
sys/src/cmd/ip/ping.c

@@ -45,7 +45,7 @@ enum
 typedef struct Req Req;
 struct Req
 {
-	int	seq;	// sequence number
+	ushort	seq;	// sequence number
 	vlong	time;	// time sent
 	vlong	rtt;
 	int	ttl;
@@ -59,6 +59,7 @@ Lock	listlock;
 char *argv0;
 int debug;
 int quiet;
+int lostonly;
 int lostmsgs;
 int rcvdmsgs;
 int done;
@@ -67,19 +68,12 @@ ushort firstseq;
 int addresses;
 
 void usage(void);
-void lost(Req*);
+void lost(Req*, Icmp*);
 void reply(Req*, Icmp*);
 
 #define SECOND 1000000000LL
 #define MINUTE (60LL*SECOND)
 
-void
-usage(void)
-{
-	fprint(2, "usage: %s destination\n", argv0);
-	exits("usage");
-}
-
 static void
 catch(void *a, char *msg)
 {
@@ -110,7 +104,7 @@ clean(ushort seq, vlong now, Icmp *ip)
 			r->rtt = now-r->time;
 			r->ttl = ip->ttl;
 			if(r->replied == 0)
-				lost(r);
+				lost(r, ip);
 			free(r);
 		} else {
 			last = r;
@@ -168,7 +162,7 @@ sender(int fd, int msglen, int interval, int n)
 }
 
 void
-rcvr(int fd, int msglen, int interval, int nmsg)
+rcvr(int fd, int msglen, int interval, int nmsg, int senderpid)
 {
 	uchar buf[64*1024+512];
 	Icmp *ip;
@@ -185,8 +179,10 @@ rcvr(int fd, int msglen, int interval, int nmsg)
 		n = read(fd, buf, sizeof(buf));
 		alarm(0);
 		now = nsec();
-		if(n <= 0)
+		if(n <= 0){
+			print("read: %r\n");
 			break;
+		}
 		if(n < msglen){
 			print("bad len %d/%d\n", n, msglen);
 			continue;
@@ -214,6 +210,14 @@ rcvr(int fd, int msglen, int interval, int nmsg)
 
 	if(lostmsgs)
 		print("%d out of %d messages lost\n", lostmsgs, lostmsgs+rcvdmsgs);
+	postnote(PNPROC, senderpid, "die");
+}
+
+void
+usage(void)
+{
+	fprint(2, "usage: %s [-alq] [-s msgsize] [-i millisecs] [-n #pings] destination\n", argv0);
+	exits("usage");
 }
 
 void
@@ -221,6 +225,7 @@ main(int argc, char **argv)
 {
 	int fd;
 	int msglen, interval, nmsg;
+	int pid;
 
 	nsec();		/* make sure time file is already open */
 
@@ -229,6 +234,9 @@ main(int argc, char **argv)
 	msglen = interval = 0;
 	nmsg = MAXMSG;
 	ARGBEGIN {
+	case 'l':
+		lostonly++;
+		break;
 	case 'd':
 		debug++;
 		break;
@@ -268,11 +276,12 @@ main(int argc, char **argv)
 
 	print("sending %d %d byte messages %d ms apart\n", nmsg, msglen, interval);
 
+	pid = getpid();
 	switch(rfork(RFPROC|RFMEM|RFFDG)){
 	case -1:
 		fprint(2, "%s: can't fork: %r\n", argv0);
 	case 0:
-		rcvr(fd, msglen, interval, nmsg);
+		rcvr(fd, msglen, interval, nmsg, pid);
 		exits(0);
 	default:
 		sender(fd, msglen, interval, nmsg);
@@ -281,19 +290,13 @@ main(int argc, char **argv)
 	}
 }
 
-void
-lost(Req *)
-{
-	lostmsgs++;
-}
-
 void
 reply(Req *r, Icmp *ip)
 {
 	rcvdmsgs++;
 	r->rtt /= 1000LL;
 	sum += r->rtt;
-	if(!quiet){
+	if(!quiet && !lostonly){
 		if(addresses)
 			print("%ud: %V->%V rtt %lld µs, avg rtt %lld µs, ttl = %d\n",
 				r->seq-firstseq,
@@ -306,3 +309,20 @@ reply(Req *r, Icmp *ip)
 	}
 	r->replied = 1;
 }
+
+void
+lost(Req *r, Icmp *ip)
+{
+	if(!quiet){
+		if(addresses)
+			print("lost %ud: %V->%V avg rtt %lld µs\n",
+				r->seq-firstseq,
+				ip->src, ip->dst,
+				sum/rcvdmsgs);
+		else
+			print("lost %ud: avg rtt %lld µs\n",
+				r->seq-firstseq,
+				sum/rcvdmsgs);
+	}
+	lostmsgs++;
+}