3 static char *tnames[] = {
19 int messagesize = IOHDRSZ+Maxfdata;
22 xmesg(Session *s, int t)
27 if(0 <= t && t < nelem(tnames) && tnames[t])
28 chat("T%s...", tnames[t]);
35 fprint(2, "xmseg\tsend %F\n", &s->f);
36 n = convS2M(&s->f, s->data, messagesize);
37 if(niwrite(s->fd, s->data, n) != n){
38 clog("xmesg write error on %d: %r\n", s->fd);
42 n = read9pmsg(s->fd, s->data, messagesize);
46 clog("xmesg read error: %r\n");
49 if(convM2S(s->data, n, &s->f) != n){
50 clog("xmesg bad convM2S %d %.2x %.2x %.2x %.2x\n",
51 n, ((uchar*)s->data)[0], ((uchar*)s->data)[1],
52 ((uchar*)s->data)[2], ((uchar*)s->data)[3]);
56 fprint(2, "\trecv %F\n", &s->f);
57 if(s->f.tag != s->tag){
58 clog("xmesg tag %d for %d\n", s->f.tag, s->tag);
61 if(s->f.type == Rerror){
63 clog("xmesg clunk: %s", s->f.ename);
64 chat("xmesg %d error %s...", t, s->f.ename);
68 clog("xmesg type mismatch: %d, expected %d\n", s->f.type, t+1);
75 clunkfid(Session *s, Fid *f)
80 s->f.fid = f - s->fids;
81 return xmesg(s, Tclunk);
84 #define UNLINK(p) ((p)->prev->next = (p)->next, (p)->next->prev = (p)->prev)
86 #define LINK(h, p) ((p)->next = (h)->next, (p)->prev = (h), \
87 (h)->next->prev = (p), (h)->next = (p))
89 #define TOFRONT(h, p) ((h)->next != (p) ? (UNLINK(p), LINK(h,p)) : 0)
97 if(s->list.prev == 0){
99 s->list.prev = &s->list;
100 s->list.next = &s->list;
105 fN = &s->fids[nelem(s->fids)];
106 for(f=s->fids; f<fN; f++){
118 for(f=s->list.prev; f!=&s->list; f=f->prev)
126 if(xmesg(s, Tclunk) < 0){
127 clog("clunk failed, no fids?");
133 chat("%zd...", f - s->fids);
134 f->tstale = nfstime + staletime;
139 setfid(Session *s, Fid *f)
142 * TOFRONT(&s->list, f);
144 if(s->list.next != f){
149 f->tstale = nfstime + staletime;
150 s->f.fid = f - s->fids;
154 putfid(Session *s, Fid *f)
156 chat("putfid %zd...", f-s->fids);
157 if(s == 0 || f == 0){
158 clog("putfid(0x%p, 0x%p) %s", s, f, (s ? s->service : "?"));
171 fidtimer(Session *s, long now)
178 while(f != &s->list){
181 if(t->owner && now >= t->tstale)
185 chat("fidtimer %s\n", s->service);