diff options
author | Jacob Moody <moody@posixcafe.org> | 2022-09-11 01:49:01 +0000 |
---|---|---|
committer | Jacob Moody <moody@posixcafe.org> | 2022-09-11 01:49:01 +0000 |
commit | 87160cbfcf926fd0a9f04e8113a16c2a0c7e252d (patch) | |
tree | f1920169843f7887717549c811d9e3ba6ddf8b72 /sys/src/cmd/rio | |
parent | 63f10d4c945e3e692b589175508b95ce8dd9b50d (diff) |
rio: add 'none' attach option to wsys
This allows users to mount wsys without having
a valid window or creating a new one. In this
mode wsys only servs 'global' files, those that
apply to all windows. Providing this mount to
riostart's namespace gives us two things:
* Allows kbdtap programs(ktrans) to run in riostart
* Obsoletes $wctl and the associated named pipe by providing /dev/wctl in riostart
As such, the wctl pipe and environment variable are removed as well.
Diffstat (limited to 'sys/src/cmd/rio')
-rw-r--r-- | sys/src/cmd/rio/dat.h | 19 | ||||
-rw-r--r-- | sys/src/cmd/rio/fsys.c | 41 | ||||
-rw-r--r-- | sys/src/cmd/rio/rio.c | 12 | ||||
-rw-r--r-- | sys/src/cmd/rio/wctl.c | 63 | ||||
-rw-r--r-- | sys/src/cmd/rio/xfid.c | 26 |
5 files changed, 60 insertions, 101 deletions
diff --git a/sys/src/cmd/rio/dat.h b/sys/src/cmd/rio/dat.h index bca6cfc79..b9b882663 100644 --- a/sys/src/cmd/rio/dat.h +++ b/sys/src/cmd/rio/dat.h @@ -1,6 +1,13 @@ enum { Qdir, /* /dev for this window */ + Qscreen, + Qsnarf, + Qwctl, + Qtap, + Qwsys, /* directory of window directories */ + Qwsysdir, /* window directory, child of wsys */ + Qcons, Qconsctl, Qcursor, @@ -10,17 +17,11 @@ enum Qlabel, Qkbd, Qmouse, - Qnew, - Qscreen, - Qsnarf, Qtext, - Qwctl, Qwindow, - Qwsys, /* directory of window directories */ - Qwsysdir, /* window directory, child of wsys */ - Qtap, QMAX, + Qglobal = Qcons, /* anything >= must have non nil window */ }; #define STACK 8192 @@ -271,9 +272,6 @@ int filsysmount(Filsys*, int); Xfid* filsysrespond(Filsys*, Xfid*, Fcall*, char*); void filsyscancel(Xfid*); -void wctlproc(void*); -void wctlthread(void*); - void deletetimeoutproc(void*); struct Timer @@ -337,7 +335,6 @@ int maxtab; Channel* winclosechan; char *startdir; int sweeping; -int wctlfd; char srvpipe[]; char srvwctl[]; int errorshouldabort; diff --git a/sys/src/cmd/rio/fsys.c b/sys/src/cmd/rio/fsys.c index 601802545..cfb2b1fc9 100644 --- a/sys/src/cmd/rio/fsys.c +++ b/sys/src/cmd/rio/fsys.c @@ -22,6 +22,12 @@ int messagesize = 8192+IOHDRSZ; /* good start */ Dirtab dirtab[]= { { ".", QTDIR, Qdir, 0500|DMDIR }, + { "screen", QTFILE, Qscreen, 0400 }, + { "snarf", QTFILE, Qsnarf, 0600 }, + { "wctl", QTFILE, Qwctl, 0600 }, + { "kbdtap", QTFILE, Qtap, 0660 }, + { "wsys", QTDIR, Qwsys, 0500|DMDIR }, + { "cons", QTFILE, Qcons, 0600 }, { "cursor", QTFILE, Qcursor, 0600 }, { "consctl", QTFILE, Qconsctl, 0200 }, @@ -30,14 +36,9 @@ Dirtab dirtab[]= { "label", QTFILE, Qlabel, 0600 }, { "kbd", QTFILE, Qkbd, 0600 }, { "mouse", QTFILE, Qmouse, 0600 }, - { "screen", QTFILE, Qscreen, 0400 }, - { "snarf", QTFILE, Qsnarf, 0600 }, { "text", QTFILE, Qtext, 0600 }, { "wdir", QTFILE, Qwdir, 0600 }, - { "wctl", QTFILE, Qwctl, 0600 }, { "window", QTFILE, Qwindow, 0400 }, - { "wsys", QTDIR, Qwsys, 0500|DMDIR }, - { "kbdtap", QTFILE, Qtap, 0660 }, { nil, } }; @@ -119,9 +120,7 @@ cexecpipe(int *p0, int *p1) Filsys* filsysinit(Channel *cxfidalloc) { - int p0; Filsys *fs; - Channel *c; fs = emalloc(sizeof(Filsys)); if(cexecpipe(&fs->cfd, &fs->sfd) < 0) @@ -134,28 +133,7 @@ filsysinit(Channel *cxfidalloc) error("chancreate syncflush"); fs->cxfidalloc = cxfidalloc; - /* - * Create and post wctl pipe - */ - if(cexecpipe(&p0, &wctlfd) < 0) - goto Rescue; - snprint(srvwctl, sizeof(srvwctl), "/srv/riowctl.%s.%lud", fs->user, (ulong)getpid()); - post(srvwctl, "wctl", p0); - close(p0); - - /* - * Start server processes - */ - c = chancreate(sizeof(char*), 0); - if(c == nil) - error("wctl channel"); - proccreate(wctlproc, c, 4096); - threadcreate(wctlthread, c, 4096); proccreate(filsysproc, fs, 10000); - - /* - * Post srv pipe - */ snprint(srvpipe, sizeof(srvpipe), "/srv/rio.%s.%lud", fs->user, (ulong)getpid()); post(srvpipe, "wsys", fs->cfd); @@ -385,7 +363,8 @@ filsyswalk(Filsys *fs, Xfid *x, Fid *f) nf->dir = f->dir; nf->qid = f->qid; nf->w = f->w; - incref(f->w); + if(f->w != nil) + incref(f->w); nf->nrpart = 0; /* not open, so must be zero */ f = nf; /* walk f */ } @@ -450,6 +429,8 @@ filsyswalk(Filsys *fs, Xfid *x, Fid *f) d++; /* skip '.' */ for(; d->name; d++) if(strcmp(x->wname[i], d->name) == 0){ + if(f->w == nil && d->qid >= Qglobal) + break; path = d->qid; type = d->type; dir = d; @@ -561,6 +542,8 @@ filsysread(Filsys *fs, Xfid *x, Fid *f) for(i=0; d->name!=nil && i<e; d++){ if(skipdir(d->name)) continue; + if(f->w == nil && d->qid >= Qglobal) + continue; len = dostat(fs, WIN(x->f->qid), d, b+n, x->count-n, clock); if(len <= BIT16SZ) break; diff --git a/sys/src/cmd/rio/rio.c b/sys/src/cmd/rio/rio.c index d3cd581de..38153811c 100644 --- a/sys/src/cmd/rio/rio.c +++ b/sys/src/cmd/rio/rio.c @@ -293,9 +293,21 @@ void initcmd(void *arg) { char *cmd; + char *wsys; + int fd; cmd = arg; rfork(RFENVG|RFFDG|RFNOTEG|RFNAMEG); + wsys = getenv("wsys"); + fd = open(wsys, ORDWR); + if(fd < 0) + fprint(2, "rio: failed to open wsys: %r\n"); + if(mount(fd, -1, "/mnt/wsys", MREPL, "none") < 0) + fprint(2, "rio: failed to mount wsys: %r\n"); + if(bind("/mnt/wsys", "/dev/", MBEFORE) < 0) + fprint(2, "rio: failed to bind wsys: %r\n"); + free(wsys); + close(fd); procexecl(nil, "/bin/rc", "rc", "-c", cmd, nil); fprint(2, "rio: exec failed: %r\n"); exits("exec"); diff --git a/sys/src/cmd/rio/wctl.c b/sys/src/cmd/rio/wctl.c index eeb2a5fec..d37ca21ee 100644 --- a/sys/src/cmd/rio/wctl.c +++ b/sys/src/cmd/rio/wctl.c @@ -462,7 +462,10 @@ writewctl(Xfid *x, char *err) x->data[cnt] = '\0'; id = 0; - r = rectsubpt(w->screenr, screen->r.min); + if(w == nil) + r = ZR; + else + r = rectsubpt(w->screenr, screen->r.min); cmd = parsewctl(&arg, r, &r, &pid, &id, &hideit, &scrollit, &dir, x->data, err); if(cmd < 0) return -1; @@ -475,6 +478,11 @@ writewctl(Xfid *x, char *err) } } + if(w == nil && cmd != New){ + strcpy(err, "command needs to be run within a window"); + return -1; + } + switch(cmd){ case New: return wctlnew(r, arg, pid, hideit, scrollit, dir, err); @@ -490,56 +498,3 @@ writewctl(Xfid *x, char *err) return id; } - -void -wctlthread(void *v) -{ - char *buf, *arg, *dir; - int cmd, id, pid, hideit, scrollit; - Rectangle rect; - char err[ERRMAX]; - Channel *c; - - c = v; - - threadsetname("WCTLTHREAD"); - - for(;;){ - buf = recvp(c); - cmd = parsewctl(&arg, ZR, &rect, &pid, &id, &hideit, &scrollit, &dir, buf, err); - - switch(cmd){ - case New: - wctlnew(rect, arg, pid, hideit, scrollit, dir, err); - } - free(buf); - } -} - -void -wctlproc(void *v) -{ - char *buf; - int n, eofs; - Channel *c; - - threadsetname("WCTLPROC"); - c = v; - - eofs = 0; - for(;;){ - buf = emalloc(messagesize); - n = read(wctlfd, buf, messagesize-1); /* room for \0 */ - if(n < 0) - break; - if(n == 0){ - if(++eofs > 20) - break; - continue; - } - eofs = 0; - - buf[n] = '\0'; - sendp(c, buf); - } -} diff --git a/sys/src/cmd/rio/xfid.c b/sys/src/cmd/rio/xfid.c index cd7f57387..0477e0200 100644 --- a/sys/src/cmd/rio/xfid.c +++ b/sys/src/cmd/rio/xfid.c @@ -221,6 +221,9 @@ xfidattach(Xfid *x) err = errbuf; else goto Allocate; + }else if(strncmp(x->aname, "none", 4) == 0){ + x->f->w = nil; + goto Done; }else{ id = atoi(x->aname); w = wlookid(id); @@ -234,6 +237,7 @@ xfidattach(Xfid *x) } if(!newlymade) /* counteract dec() in winshell() */ incref(w); + Done: qunlock(&all); filsysrespond(x->fs, x, &t, nil); } @@ -245,7 +249,7 @@ xfidopen(Xfid *x) Window *w; w = x->f->w; - if(w->deleted){ + if(w != nil && w->deleted){ filsysrespond(x->fs, x, &t, Edeleted); return; } @@ -368,7 +372,8 @@ xfidclose(Xfid *x) chanprint(ctltap, "%c", Tapoff); break; } - wclose(w); + if(w) + wclose(w); filsysrespond(x->fs, x, &t, nil); } @@ -387,7 +392,7 @@ xfidwrite(Xfid *x) Alt alts[NCW+1]; w = x->f->w; - if(w->deleted){ + if(w != nil && w->deleted){ filsysrespond(x->fs, x, &fc, Edeleted); return; } @@ -642,7 +647,7 @@ xfidread(Xfid *x) Alt alts[Aend+1]; w = x->f->w; - if(w->deleted){ + if(w != nil && w->deleted){ filsysrespond(x->fs, x, &fc, Edeleted); return; } @@ -651,6 +656,10 @@ xfidread(Xfid *x) cnt = x->count; switch(qid){ case Qwctl: + if(w == nil){ + filsysrespond(x->fs, x, &fc, "no window"); + return; + } if(cnt < 4*12){ filsysrespond(x->fs, x, &fc, Etooshort); return; @@ -703,9 +712,12 @@ xfidread(Xfid *x) alts[Adata].c = totap; alts[Adata].v = &t; alts[Adata].op = CHANRCV; - alts[Agone].c = w->gone; - alts[Agone].v = nil; - alts[Agone].op = CHANRCV; + if(w != nil){ + alts[Agone].c = w->gone; + alts[Agone].v = nil; + alts[Agone].op = CHANRCV; + } else + alts[Agone].op = CHANNOP; alts[Aflush].c = x->flushc; alts[Aflush].v = nil; alts[Aflush].op = CHANRCV; |