vncs: cleanup and error handling
This commit is contained in:
parent
7bb4a790d6
commit
62f5a7e2b7
1 changed files with 28 additions and 18 deletions
|
@ -192,39 +192,49 @@ main(int argc, char **argv)
|
||||||
unmount(nil, "/dev");
|
unmount(nil, "/dev");
|
||||||
bind("#c", "/dev", MREPL);
|
bind("#c", "/dev", MREPL);
|
||||||
|
|
||||||
/* run the command */
|
/* mount exporter */
|
||||||
switch(cmdpid = rfork(RFPROC|RFFDG|RFNOTEG)){
|
if(mounter("/dev", MBEFORE, fd, exnum) < 0)
|
||||||
|
sysfatal("mounter: %r");
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
/* start and mount kbdfs */
|
||||||
|
switch(cmdpid = rfork(RFPROC|RFMEM|RFFDG|RFREND)){
|
||||||
case -1:
|
case -1:
|
||||||
sysfatal("rfork: %r");
|
sysfatal("rfork: %r");
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
if(mounter("/dev", MBEFORE, fd, exnum) < 0)
|
|
||||||
sysfatal("mounter: %r");
|
|
||||||
close(exportfd);
|
close(exportfd);
|
||||||
close(1);
|
close(1);
|
||||||
|
open("/dev/cons", OWRITE);
|
||||||
close(2);
|
close(2);
|
||||||
open("/dev/cons", OWRITE);
|
open("/dev/cons", OWRITE);
|
||||||
open("/dev/cons", OWRITE);
|
|
||||||
if(rfork(RFPROC|RFMEM|RFFDG) == 0){
|
|
||||||
exec(kbdfs[0], kbdfs);
|
exec(kbdfs[0], kbdfs);
|
||||||
_exits("kbdfs");
|
_exits("kbdfs");
|
||||||
}
|
}
|
||||||
waitpid();
|
if(waitpid() != cmdpid)
|
||||||
rfork(RFNAMEG);
|
sysfatal("%s: %r", kbdfs[0]);
|
||||||
rendezvous(&cmdpid, 0);
|
if((kbdin = open("/dev/kbdin", OWRITE)) < 0)
|
||||||
rfork(RFREND);
|
sysfatal("open /dev/kbdin: %r");
|
||||||
|
|
||||||
|
/* run the command */
|
||||||
|
switch(cmdpid = rfork(RFPROC|RFMEM|RFFDG|RFNAMEG|RFREND|RFNOTEG)){
|
||||||
|
case -1:
|
||||||
|
sysfatal("rfork: %r");
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
close(exportfd);
|
||||||
|
close(kbdin);
|
||||||
close(0);
|
close(0);
|
||||||
open("/dev/cons", OREAD);
|
open("/dev/cons", OREAD);
|
||||||
|
close(1);
|
||||||
|
open("/dev/cons", OWRITE);
|
||||||
|
close(2);
|
||||||
|
open("/dev/cons", OWRITE);
|
||||||
exec(argv[0], argv);
|
exec(argv[0], argv);
|
||||||
fprint(2, "exec %s: %r\n", argv[0]);
|
fprint(2, "exec %s: %r\n", argv[0]);
|
||||||
_exits(nil);
|
_exits(nil);
|
||||||
default:
|
|
||||||
close(fd);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rendezvous(&cmdpid, 0);
|
|
||||||
kbdin = open("/dev/kbdin", OWRITE);
|
|
||||||
unmount(nil, "/dev");
|
unmount(nil, "/dev");
|
||||||
bind("#c", "/dev", MREPL);
|
bind("#c", "/dev", MREPL);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue