diff options
author | cinap_lenrek <cinap_lenrek@rei2.9hal> | 2012-02-25 23:47:09 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@rei2.9hal> | 2012-02-25 23:47:09 +0100 |
commit | ce6b942ff12cbb7fe7da634004b8f7eed76eee3d (patch) | |
tree | ba230e02aae16a07ce7fa8d8b066876ec742d902 /sys/src/cmd/vnc/vncs.c | |
parent | f2b6ec3140935d88d065359619c04992939a1ddc (diff) |
vncs: /dev/kbd support by running kbdfs and forwarding keycodes thru kbdin
Diffstat (limited to 'sys/src/cmd/vnc/vncs.c')
-rw-r--r-- | sys/src/cmd/vnc/vncs.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/sys/src/cmd/vnc/vncs.c b/sys/src/cmd/vnc/vncs.c index cb4bbd66f..2b3f7b0ac 100644 --- a/sys/src/cmd/vnc/vncs.c +++ b/sys/src/cmd/vnc/vncs.c @@ -55,6 +55,8 @@ struct { int shared; int sleeptime = 5; int verbose = 0; +int kbdin = -1; + char *cert; char *pixchan = "r5g6b5"; static int cmdpid; @@ -88,6 +90,7 @@ main(int argc, char **argv) int altnet, baseport, cfd, display, exnum, fd, h, killing, w; char adir[NETPATHLEN], ldir[NETPATHLEN]; char net[NETPATHLEN], *p; + char *kbdfs[] = { "/bin/aux/kbdfs", "-dq", nil }; char *rc[] = { "/bin/rc", "-i", nil }; Vncs *v; @@ -190,7 +193,7 @@ main(int argc, char **argv) bind("#c", "/dev", MREPL); /* run the command */ - switch(cmdpid = rfork(RFPROC|RFFDG|RFNOTEG|RFNAMEG|RFREND)){ + switch(cmdpid = rfork(RFPROC|RFFDG|RFNOTEG)){ case -1: sysfatal("rfork: %r"); break; @@ -198,12 +201,20 @@ main(int argc, char **argv) if(mounter("/dev", MBEFORE, fd, exnum) < 0) sysfatal("mounter: %r"); close(exportfd); - close(0); close(1); close(2); - open("/dev/cons", OREAD); open("/dev/cons", OWRITE); open("/dev/cons", OWRITE); + if(rfork(RFPROC|RFMEM|RFFDG) == 0){ + exec(kbdfs[0], kbdfs); + _exits("kbdfs"); + } + waitpid(); + rfork(RFNAMEG); + rendezvous(&cmdpid, 0); + rfork(RFREND); + close(0); + open("/dev/cons", OREAD); exec(argv[0], argv); fprint(2, "exec %s: %r\n", argv[0]); _exits(nil); @@ -212,6 +223,11 @@ main(int argc, char **argv) break; } + rendezvous(&cmdpid, 0); + kbdin = open("/dev/kbdin", OWRITE); + unmount(nil, "/dev"); + bind("#c", "/dev", MREPL); + /* run the service */ srvfd = vncannounce(net, display, adir, baseport); if(srvfd < 0) @@ -385,6 +401,8 @@ killall(void) srvfd = -1; close(exportfd); exportfd = -1; + close(kbdin); + kbdin = -1; postnote(PNGROUP, getpid(), killkin); } |