diff options
author | Jacob Moody <moody@posixcafe.org> | 2022-08-19 23:35:41 +0000 |
---|---|---|
committer | Jacob Moody <moody@posixcafe.org> | 2022-08-19 23:35:41 +0000 |
commit | 4009eb2feecfa4722d5cb22be4f5db9f26d15be3 (patch) | |
tree | 70861cb2df8a4a881110d1b57973fa23499095a0 /sys/src/cmd/rio/xfid.c | |
parent | a36f997368057fe298524de52310cc4e98bddba8 (diff) |
rio: correct tap code
Remove tapmesg, allow the reads to accept
flushes, accept writes of multiple messages,
move open/close to Xfid code.
Diffstat (limited to 'sys/src/cmd/rio/xfid.c')
-rw-r--r-- | sys/src/cmd/rio/xfid.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/sys/src/cmd/rio/xfid.c b/sys/src/cmd/rio/xfid.c index 8db600089..1b7ce9db9 100644 --- a/sys/src/cmd/rio/xfid.c +++ b/sys/src/cmd/rio/xfid.c @@ -307,6 +307,9 @@ xfidopen(Xfid *x) wsendctlmesg(w, Wakeup, ZR, nil); } break; + case Qtap: + chanprint(fromtap, "%c", Tapon); + break; } t.qid = x->f->qid; t.iounit = messagesize-IOHDRSZ; @@ -361,6 +364,9 @@ xfidclose(Xfid *x) if(x->f->mode==OREAD || x->f->mode==ORDWR) w->wctlopen = FALSE; break; + case Qtap: + chanprint(fromtap, "%c", Tapoff); + break; } wclose(w); filsysrespond(x->fs, x, &t, nil); @@ -371,12 +377,11 @@ xfidwrite(Xfid *x) { Fcall fc; int cnt, qid, nb, off, nr; - char err[ERRMAX], *p; + char err[ERRMAX], *p, *e; Point pt; Window *w; Rune *r; Conswritemesg cwm; - Tapmesg fmsg; Stringpair pair; enum { CWdata, CWgone, CWflush, NCW }; Alt alts[NCW+1]; @@ -574,9 +579,9 @@ xfidwrite(Xfid *x) filsysrespond(x->fs, x, &fc, "malformed key"); return; } - fmsg.type = x->data[0]; - fmsg.s = strdup(x->data+1); - send(fromtap, &fmsg); + e = x->data + cnt; + for(p = x->data; p < e; p += strlen(p)+1) + chanprint(fromtap, "%s", p); break; default: @@ -694,7 +699,26 @@ xfidread(Xfid *x) break; case Qtap: - recv(totap, &t); + 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; + alts[Aflush].c = x->flushc; + alts[Aflush].v = nil; + alts[Aflush].op = CHANRCV; + alts[Aend].op = CHANEND; + switch(alt(alts)){ + case Adata: + break; + case Agone: + filsysrespond(x->fs, x, &fc, Edeleted); + return; + case Aflush: + filsyscancel(x); + return; + } fc.data = t; fc.count = strlen(t)+1; filsysrespond(x->fs, x, &fc, nil); |