A hack to implement vncconnect (http://www.tightvnc.com/doc/man/vncconnect.1.html) Notes: Wed Sep 7 10:34:59 EDT 2005 rsc This might be a generically useful utility. It has nothing to do with vnc. Wed Sep 7 10:55:15 EDT 2005 rsc I added a -a option to trampoline instead. Use that. Reference: /n/sources/patch/sorry/vncconnect Date: Wed Sep 7 04:52:51 CES 2005 Reviewed-by: rsc --- /sys/src/cmd/vncc.c Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/vncc.c Wed Sep 7 04:52:17 2005 @@ -0,0 +1,74 @@ +#include +#include + +int dflag; + +int dialerr(char*, char*); +void xfer(int, int); + +void +usage(void) +{ + fprint(2, "usage: %s server client\n", argv0); + exits("usage"); +} + +void +main(int argc, char **argv) +{ + int sfd, cfd; + + ARGBEGIN{ + case 'd': + dflag ++; + }ARGEND; + + if(argc != 2) + usage(); + + sfd = dialerr(argv[0], "server"); + cfd = dialerr(argv[1], "client"); + + rfork(RFNOTEG); + switch(fork()){ + case -1: + fprint(2, "%s: fork: %r\n", argv0); + exits("fork"); + case 0: + xfer(sfd, cfd); + break; + default: + xfer(cfd, sfd); + break; + } + postnote(PNGROUP, getpid(), "die yankee pig dog"); + exits(0); +} + +int +dialerr(char *dstr, char *msg) +{ + int fd; + + fd = dial(dstr, 0, 0, 0); + if(fd < 0){ + fprint(2, "%s: dialing %s: %r\n", argv0, dstr); + exits(smprint("dial %s", msg)); + } + return fd; +} + +/* + * borrowed from /sys/src/cmd/aux/trampoline.c + */ +void +xfer(int from, int to) +{ + + char buf[12*1024]; + int n; + + while((n = read(from, buf, sizeof buf)) > 0) + if(write(to, buf, n) < 0) + break; +}