summaryrefslogtreecommitdiff
path: root/sys/src/cmd/rio/xfid.c
diff options
context:
space:
mode:
authorJacob Moody <moody@posixcafe.org>2022-08-19 23:35:41 +0000
committerJacob Moody <moody@posixcafe.org>2022-08-19 23:35:41 +0000
commit4009eb2feecfa4722d5cb22be4f5db9f26d15be3 (patch)
tree70861cb2df8a4a881110d1b57973fa23499095a0 /sys/src/cmd/rio/xfid.c
parenta36f997368057fe298524de52310cc4e98bddba8 (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.c36
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);