summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vnc/vncs.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-09-15 16:04:32 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-09-15 16:04:32 +0200
commit319bb17e1c1349ffb3c51c4b7654142050984772 (patch)
tree1578e0e908f46fe62a3049755e55352a4fe6a416 /sys/src/cmd/vnc/vncs.c
parente220636fd305f378a27cfa485d39e7588d6dc03c (diff)
vncs: fix cmdpid fork bug
we cannot do: cmdpid = rfork(... RFMEM); because cmdpid is a global variable in the data segment and hence shared between parent and child process. use a temporary variable on the stack.
Diffstat (limited to 'sys/src/cmd/vnc/vncs.c')
-rw-r--r--sys/src/cmd/vnc/vncs.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/sys/src/cmd/vnc/vncs.c b/sys/src/cmd/vnc/vncs.c
index f191db7e2..7de384de4 100644
--- a/sys/src/cmd/vnc/vncs.c
+++ b/sys/src/cmd/vnc/vncs.c
@@ -87,7 +87,7 @@ usage(void)
void
main(int argc, char **argv)
{
- int altnet, baseport, cfd, display, exnum, fd, h, killing, w;
+ int altnet, baseport, cfd, display, exnum, fd, pid, h, killing, w;
char adir[NETPATHLEN], ldir[NETPATHLEN];
char net[NETPATHLEN], *p;
char *kbdfs[] = { "/bin/aux/kbdfs", "-dq", nil };
@@ -197,8 +197,8 @@ main(int argc, char **argv)
sysfatal("mounter: %r");
close(fd);
- cmdpid = rfork(RFPROC|RFMEM|RFFDG|RFNOTEG);
- switch(cmdpid){
+ pid = rfork(RFPROC|RFMEM|RFFDG|RFNOTEG);
+ switch(pid){
case -1:
sysfatal("rfork: %r");
break;
@@ -211,8 +211,8 @@ main(int argc, char **argv)
open("/dev/cons", OWRITE);
/* start and mount kbdfs */
- cmdpid = rfork(RFPROC|RFMEM|RFFDG|RFREND);
- switch(cmdpid){
+ pid = rfork(RFPROC|RFMEM|RFFDG|RFREND);
+ switch(pid){
case -1:
sysfatal("rfork: %r");
break;
@@ -221,9 +221,9 @@ main(int argc, char **argv)
fprint(2, "exec %s: %r\n", kbdfs[0]);
_exits("kbdfs");
}
- if(waitpid() != cmdpid){
+ if(waitpid() != pid){
rendezvous(&kbdin, nil);
- sysfatal("%s: %r", kbdfs[0]);
+ sysfatal("waitpid: %s: %r", kbdfs[0]);
}
rendezvous(&kbdin, nil);
@@ -240,6 +240,7 @@ main(int argc, char **argv)
fprint(2, "exec %s: %r\n", argv[0]);
_exits(nil);
}
+ cmdpid = pid;
/* wait for kbdfs to get mounted */
rendezvous(&kbdin, nil);