shithub: riscv

Download patch

ref: 15b5a980d7c2055a10567292055747b6251704f8
parent: 718f3358bb382e67a51d5f0a66bb89c1e8559a07
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Aug 3 13:09:28 EDT 2014

iostats: properly distribute exit status and give usefull error messages

--- a/sys/src/cmd/iostats.c
+++ b/sys/src/cmd/iostats.c
@@ -262,10 +262,11 @@
 	char *dbfile;
 	char buf[64*1024];
 	float brpsec, bwpsec, bppsec;
-	int cpid, fspid, rspid, dbg, n, mflag;
+	int cpid, fspid, expid, rspid, dbg, n, mflag;
 	char *fds[3];
+	Waitmsg *w;
 	File *fs;
-	Req *r, **rr;
+	Req *r;
 
 	dbg = 0;
 	mflag = MREPL;
@@ -291,7 +292,7 @@
 		usage();
 
 	if(pipe(pfd) < 0)
-		sysfatal("pipe");
+		sysfatal("pipe: %r");
 
 	/* dup std fds to be inherited to exportfs */
 	fds[0] = smprint("/fd/%d", dup(0, -1));
@@ -300,7 +301,7 @@
 
 	switch(cpid = fork()) {
 	case -1:
-		sysfatal("fork");
+		sysfatal("fork: %r");
 	case 0:
 		close(pfd[1]);
 		close(atoi(strrchr(fds[0], '/')+1));
@@ -308,12 +309,12 @@
 		close(atoi(strrchr(fds[2], '/')+1));
 
 		if(getwd(buf, sizeof(buf)) == 0)
-			sysfatal("no working directory");
+			sysfatal("no working directory: %r");
 
 		rfork(RFENVG|RFNAMEG);
 
 		if(mount(pfd[0], -1, "/", mflag, "") < 0)
-			sysfatal("mount /");
+			sysfatal("mount /: %r");
 
 		/* replace std fds with the exported ones */
 		close(0); open(fds[0], OREAD);
@@ -326,7 +327,7 @@
 		bind("#d", "/fd", MREPL);
 
 		if(chdir(buf) < 0)
-			sysfatal("chdir");
+			sysfatal("chdir: %r");
 
 		exec(*argv, argv);
 		if(**argv != '/' && strncmp(*argv, "./", 2) != 0 && strncmp(*argv, "../", 3) != 0)
@@ -339,10 +340,10 @@
 	/* isolate us from interrupts */
 	rfork(RFNOTEG);
 	if(pipe(efd) < 0)
-		sysfatal("pipe");
+		sysfatal("pipe: %r");
 
 	/* spawn exportfs */
-	switch(fork()) {
+	switch(expid = fork()) {
 	default:
 		close(efd[0]);
 		close(atoi(strrchr(fds[0], '/')+1));
@@ -350,7 +351,7 @@
 		close(atoi(strrchr(fds[2], '/')+1));
 		break;
 	case -1:
-		sysfatal("fork");
+		sysfatal("fork: %r");
 	case 0:
 		dup(efd[0], 0);
 		close(efd[0]);
@@ -361,7 +362,7 @@
 		} else {
 			execl("/bin/exportfs", "exportfs", "-r", "/", nil);
 		}
-		exits(0);
+		sysfatal("exec: %r");
 	}
 
 	switch(fspid = fork()) {
@@ -368,14 +369,26 @@
 	default:
 		close(pfd[1]);
 		close(efd[1]);
-		while(cpid != waitpid())
-			;
-		postnote(PNPROC, fspid, DONESTR);
-		while(fspid != waitpid())
-			;
-		exits(0);
+
+		buf[0] = '\0';
+		while((w = wait()) != nil && (cpid != -1 || fspid != -1 || expid != -1)){
+			if(w->pid == fspid)
+				fspid = -1;
+			else if(w->pid == expid)
+				expid = -1;
+			else if(w->pid == cpid){
+				cpid = -1;
+				strcpy(buf, w->msg);
+				if(fspid != -1)
+					postnote(PNPROC, fspid, DONESTR);
+			}
+			if(buf[0] == '\0')
+				strcpy(buf, w->msg);
+			free(w);
+		}
+		exits(buf);
 	case -1:
-		sysfatal("fork");
+		sysfatal("fork: %r");
 	case 0:
 		notify(catcher);
 		break;
@@ -404,6 +417,7 @@
 		while(!done){
 			uchar tmp[sizeof(buf)];
 			Fcall f;
+			Req **rr;
 
 			n = read(efd[1], buf, sizeof(buf));
 			if(n < 0)
@@ -458,7 +472,7 @@
 			if(write(pfd[1], buf, n) != n)
 				break;
 		}
-		exits(0);
+		exits(nil);
 	default:
 		/* read request from mount and pass to exportfs */
 		while(!done){
@@ -556,5 +570,5 @@
 			fs->path);
 	}
 
-	exits(0);
+	exits(nil);
 }