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);
}