summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vnc/vncs.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@rei2.9hal>2012-02-25 23:47:09 +0100
committercinap_lenrek <cinap_lenrek@rei2.9hal>2012-02-25 23:47:09 +0100
commitce6b942ff12cbb7fe7da634004b8f7eed76eee3d (patch)
treeba230e02aae16a07ce7fa8d8b066876ec742d902 /sys/src/cmd/vnc/vncs.c
parentf2b6ec3140935d88d065359619c04992939a1ddc (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.c24
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);
}