summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vnc/vncs.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-11-06 17:19:41 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2012-11-06 17:19:41 +0100
commit599dd1c34f1d4e62ee29b2de42eaba7143590347 (patch)
treea7cc4f9983f42263a0b6b02ebcdb3268c60dce1e /sys/src/cmd/vnc/vncs.c
parent120412a6a2bddf3ae01f4e10bb4173021e802a84 (diff)
make interrupt key (Del) just work in the console
these changes make the interrupt key available in the console (before rio is started). kbdfs: will now send a "interrupt" note to its invoking process group in cooked mode. bootrc: is now prepared to handle interrupts, mainly to not accidently spawn a new bootargs prompt. init: forwards the interrupt to the cpurc/termrc pgrp. vncs: shields itself from kbdfs notegroup so interrrupt wont kill the whole vnc session.
Diffstat (limited to 'sys/src/cmd/vnc/vncs.c')
-rw-r--r--sys/src/cmd/vnc/vncs.c46
1 files changed, 27 insertions, 19 deletions
diff --git a/sys/src/cmd/vnc/vncs.c b/sys/src/cmd/vnc/vncs.c
index 9e983dcc0..ee36d0c7b 100644
--- a/sys/src/cmd/vnc/vncs.c
+++ b/sys/src/cmd/vnc/vncs.c
@@ -197,46 +197,54 @@ main(int argc, char **argv)
sysfatal("mounter: %r");
close(fd);
- /* start and mount kbdfs */
- switch(cmdpid = rfork(RFPROC|RFMEM|RFFDG|RFREND)){
+ cmdpid = rfork(RFPROC|RFMEM|RFFDG|RFNOTEG);
+ switch(cmdpid){
case -1:
sysfatal("rfork: %r");
break;
case 0:
close(exportfd);
+
close(1);
open("/dev/cons", OWRITE);
close(2);
open("/dev/cons", OWRITE);
- exec(kbdfs[0], kbdfs);
- _exits("kbdfs");
- }
- if(waitpid() != cmdpid)
- sysfatal("%s: %r", kbdfs[0]);
- if((kbdin = open("/dev/kbdin", OWRITE)) < 0)
- 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);
+ /* start and mount kbdfs */
+ cmdpid = rfork(RFPROC|RFMEM|RFFDG|RFREND);
+ switch(cmdpid){
+ case -1:
+ sysfatal("rfork: %r");
+ break;
+ case 0:
+ exec(kbdfs[0], kbdfs);
+ fprint(2, "exec %s: %r\n", kbdfs[0]);
+ _exits("kbdfs");
+ }
+ if(waitpid() != cmdpid){
+ rendezvous(&kbdin, nil);
+ sysfatal("%s: %r", kbdfs[0]);
+ }
+ rendezvous(&kbdin, nil);
+
+ rfork(RFNAMEG|RFREND);
+
close(0);
open("/dev/cons", OREAD);
close(1);
open("/dev/cons", OWRITE);
close(2);
open("/dev/cons", OWRITE);
+
exec(argv[0], argv);
fprint(2, "exec %s: %r\n", argv[0]);
_exits(nil);
}
- unmount(nil, "/dev");
- bind("#c", "/dev", MREPL);
+ /* wait for kbdfs to get mounted */
+ rendezvous(&kbdin, nil);
+ if((kbdin = open("/dev/kbdin", OWRITE)) < 0)
+ sysfatal("open /dev/kbdin: %r");
/* run the service */
srvfd = vncannounce(net, display, adir, baseport);