diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-11-06 17:19:41 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-11-06 17:19:41 +0100 |
commit | 599dd1c34f1d4e62ee29b2de42eaba7143590347 (patch) | |
tree | a7cc4f9983f42263a0b6b02ebcdb3268c60dce1e /sys/src/cmd/vnc/vncs.c | |
parent | 120412a6a2bddf3ae01f4e10bb4173021e802a84 (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.c | 46 |
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); |