plan9port

[fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port # fast
git clone https://src.adamsgaard.dk/plan9port.git # slow
Log | Files | Refs | README | LICENSE Back to index

commit 941c9f36a9230690989f495313a399af5192ef5c
parent 079d45c20eb7fc6ec398c602798888a39000da68
Author: rsc <devnull@localhost>
Date:   Sat, 11 Oct 2003 02:45:02 +0000

Tweaks to make it work on Unix.

Diffstat:
Msrc/cmd/samterm/Makefile | 2++
Msrc/cmd/samterm/io.c | 9++-------
Msrc/cmd/samterm/main.c | 14++++++++++++++
Msrc/cmd/samterm/mesg.c | 5+++--
Msrc/cmd/samterm/plan9.c | 116++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/cmd/samterm/samterm.h | 6++++++
6 files changed, 86 insertions(+), 66 deletions(-)

diff --git a/src/cmd/samterm/Makefile b/src/cmd/samterm/Makefile @@ -24,4 +24,6 @@ HFILES=\ CFLAGS+=-I../sam LDFLAGS+=-lframe -ldraw -lthread -l9 -lregexp9 -lbio -lfmt -lutf -L$(X11)/lib -lX11 -lm +samterm: $(9SRC)/lib/libdraw.a + include ../Makeone diff --git a/src/cmd/samterm/io.c b/src/cmd/samterm/io.c @@ -74,10 +74,10 @@ button(int but) return mousep->buttons&(1<<(but-1)); } -/* void externload(int i) { + drawtopwindow(); plumbbase = malloc(plumbbuf[i].n); if(plumbbase == 0) return; @@ -86,7 +86,6 @@ externload(int i) plumbstop = plumbbase + plumbbuf[i].n; got |= 1<<RPlumb; } -*/ int waitforio(void) @@ -140,11 +139,9 @@ again: hoststop = hostbuf[i].data + hostbuf[i].n; block = 0; break; -/* case RPlumb: externload(i); break; -*/ case RKeyboard: kbdc = r; break; @@ -250,7 +247,7 @@ ekbd(void) int kbdchar(void) { - int c, i; + int i, c; c = externchar(); if(c > 0) @@ -261,14 +258,12 @@ kbdchar(void) got &= ~(1<<RKeyboard); return c; } -#if 0 while(plumbc!=nil && nbrecv(plumbc, &i)>0){ externload(i); c = externchar(); if(c > 0) return c; } -#endif if(!ecankbd()) return -1; return ekbd(); diff --git a/src/cmd/samterm/main.c b/src/cmd/samterm/main.c @@ -32,6 +32,20 @@ threadmain(int argc, char *argv[]) Rectangle r; Flayer *nwhich; + /* + * sam is talking to us on fd 0 and 1. + * move these elsewhere so that if we accidentally + * use 0 and 1 in other code, nothing bad happens. + */ + dup(0, 3); + dup(1, 4); + hostfd[0] = 3; + hostfd[1] = 4; + close(0); + close(1); + open("/dev/null", OREAD); + dup(2, 1); + getscreen(argc, argv); iconinit(); initio(); diff --git a/src/cmd/samterm/mesg.c b/src/cmd/samterm/mesg.c @@ -16,6 +16,7 @@ uchar indata[DATASIZE+1]; /* room for NUL */ uchar outdata[DATASIZE]; short outcount; int hversion; +int hostfd[2]; void inmesg(Hmesg, int); int inshort(int); @@ -510,7 +511,7 @@ outsend(void) panic("outcount>sizeof outdata"); outdata[1]=outcount; outdata[2]=outcount>>8; - if(write(1, (char *)outdata, outcount+HSIZE)!=outcount+HSIZE) + if(write(hostfd[1], (char *)outdata, outcount+HSIZE)!=outcount+HSIZE) panic("write error"); } @@ -651,7 +652,7 @@ hsetsnarf(int nc) s1[n] = 0; snarflen = n; outTs(Tsetsnarf, n); - if(n>0 && write(1, s1, n)!=n) + if(n>0 && write(hostfd[1], s1, n)!=n) panic("snarf write error"); free(s1); }else diff --git a/src/cmd/samterm/plan9.c b/src/cmd/samterm/plan9.c @@ -1,3 +1,7 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <errno.h> + #include <u.h> #include <libc.h> #include <draw.h> @@ -9,7 +13,7 @@ #include "flayer.h" #include "samterm.h" -static char exname[64]; +static char *exname; void getscreen(int argc, char **argv) @@ -19,7 +23,7 @@ getscreen(int argc, char **argv) USED(argc); USED(argv); if(initdraw(panic1, nil, "sam") < 0){ - fprint(2, "samterm: initimage: %r\n"); + fprint(2, "samterm: initdraw: %r\n"); threadexitsall("init"); } t = getenv("tabstop"); @@ -58,33 +62,13 @@ screensize(int *w, int *h) int snarfswap(char *fromsam, int nc, char **tosam) { - char *s1; - int f, n, ss; + char *s; - f = open("/dev/snarf", 0); - if(f < 0) - return -1; - ss = SNARFSIZE; - if(hversion < 2) - ss = 4096; - *tosam = s1 = alloc(ss); - n = read(f, s1, ss-1); - close(f); - if(n < 0) - n = 0; - if (n == 0) { - *tosam = 0; - free(s1); - } else - s1[n] = 0; -/* - f = create("/dev/snarf", 1, 0666); - if(f >= 0){ - write(f, fromsam, nc); - close(f); - } -*/ - return n; +fprint(2, "snarfswap\n"); + s = getsnarf(); + putsnarf(fromsam); + *tosam = s; + return s ? strlen(s) : 0; } void @@ -101,68 +85,86 @@ removeextern(void) } Readbuf hostbuf[2]; -/* Readbuf plumbbuf[2]; void extproc(void *argv) { Channel *c; - int i, n, which, *fdp; + int i, n, which, fd; void **arg; arg = argv; c = arg[0]; - fdp = arg[1]; + fd = (int)arg[1]; i = 0; for(;;){ - i = 1-i; / * toggle * / - n = read(*fdp, plumbbuf[i].data, sizeof plumbbuf[i].data); + i = 1-i; /* toggle */ + n = read(fd, plumbbuf[i].data, sizeof plumbbuf[i].data); if(n <= 0){ fprint(2, "samterm: extern read error: %r\n"); - threadexits("extern"); / * not a fatal error * / + threadexits("extern"); /* not a fatal error */ } plumbbuf[i].n = n; which = i; send(c, &which); } } -*/ void extstart(void) { - char buf[32]; - int fd; - static int p[2]; + char *user, *disp; + int fd, flags; static void *arg[2]; -return; - if(pipe(p) < 0) + user = getenv("USER"); + if(user == nil) return; - sprint(exname, "/srv/sam.%s", "rsc"/*getuser()*/); - fd = open(exname, 1, 0600);/* BUG was create */ - if(fd < 0){ /* assume existing guy is more important */ - Err: - close(p[0]); - close(p[1]); + disp = getenv("DISPLAY"); + if(disp) + exname = smprint("/tmp/.sam.%s.%s", user, disp); + else + exname = smprint("/tmp/.sam.%s", user); + if(exname == nil){ + fprint(2, "not posting for B: out of memory\n"); return; } - sprint(buf, "%d", p[0]); - if(write(fd, buf, strlen(buf)) <= 0) - goto Err; - close(fd); + + if(mkfifo(exname, 0600) < 0){ + struct stat st; + if(errno != EEXIST || stat(exname, &st) < 0) + return; + if(!S_ISFIFO(st.st_mode)){ + removeextern(); + if(mkfifo(exname, 0600) < 0) + return; + } + } + + fd = open(exname, OREAD|O_NONBLOCK); + if(fd == -1){ + removeextern(); + return; + } + /* - * leave p[0] open so if the file is removed the event - * library won't get an error + * Turn off no-delay and provide ourselves as a lingering + * writer so as not to get end of file on read. */ -#if 0 + flags = fcntl(fd, F_GETFL, 0); + if(flags<0 || fcntl(fd, F_SETFL, flags&~O_NONBLOCK)<0 + ||open(exname, OWRITE) < 0){ + close(fd); + removeextern(); + return; + } + plumbc = chancreate(sizeof(int), 0); arg[0] = plumbc; - arg[1] = &p[1]; - proccreate(extproc, arg, 1024); -#endif + arg[1] = (void*)fd; + proccreate(extproc, arg, 8192); atexit(removeextern); } @@ -277,7 +279,7 @@ hostproc(void *arg) i = 0; for(;;){ i = 1-i; /* toggle */ - n = read(0, hostbuf[i].data, sizeof hostbuf[i].data); + n = read(hostfd[0], hostbuf[i].data, sizeof hostbuf[i].data); if(n <= 0){ fprint(2, "samterm: host read error: %r\n"); threadexitsall("host"); diff --git a/src/cmd/samterm/samterm.h b/src/cmd/samterm/samterm.h @@ -84,6 +84,7 @@ extern Channel *plumbc; extern Channel *hostc; extern int hversion; extern int plumbfd; +extern int hostfd[2]; Rune *gettext(Flayer*, long, ulong*); void *alloc(ulong n); @@ -175,3 +176,8 @@ void outshort(int); void outlong(long); void outvlong(void*); void outsend(void); + +int perror(char*); +int remove(char*); +int create(char*, int, ulong); +