void srv(Srv *srv) { Req *r; fmtinstall('D', dirfmt); fmtinstall('F', fcallfmt); if(srv->fpool == nil) srv->fpool = allocfidpool(srv->destroyfid); if(srv->rpool == nil) srv->rpool = allocreqpool(srv->destroyreq); if(srv->msize == 0) srv->msize = 8192+IOHDRSZ; changemsize(srv, srv->msize); srv->fpool->srv = srv; srv->rpool->srv = srv; while(r = getreq(srv)){ if(r->error){ respond(r, r->error); continue; } switch(r->ifcall.type){ default: respond(r, "unknown message"); break; case Tversion: sversion(srv, r); break; case Tauth: sauth(srv, r); break; case Tattach: sattach(srv, r); break; case Tflush: sflush(srv, r); break; case Twalk: swalk(srv, r); break; case Topen: sopen(srv, r); break; case Tcreate: screate(srv, r); break; case Tread: sread(srv, r); break; case Twrite: swrite(srv, r); break; case Tclunk: sclunk(srv, r); break; case Tremove: sremove(srv, r); break; case Tstat: sstat(srv, r); break; case Twstat: swstat(srv, r); break; } } free(srv->rbuf); srv->rbuf = nil; free(srv->wbuf); srv->wbuf = nil; srv->msize = 0; freefidpool(srv->fpool); srv->fpool = nil; freereqpool(srv->rpool); srv->rpool = nil; if(srv->end) srv->end(srv); }
static void service(int cfd, int sfd, int dfd) { Fcall f; int r; Fid* fp; fidpool = allocfidpool(nop); for(;;){ fp = nil; r = getfcall(cfd, &f); if (r <= 0){ fprint(dfd, "trfs: getfcall %r\n"); break; } if(verbose) fprint(dfd , "c→s %F\n", &f); switch(f.type){ case Tclunk: case Tremove: // BUG in lib9p? removefid leaks fid. // is that what it should do? fp = lookupfid(fidpool, f.fid); if (fp != nil){ removefid(fidpool, f.fid); closefid(fp); closefid(fp); fp = nil; } break; case Tcreate: tcreate(&f); // and also... case Topen: fp = allocfid(fidpool, f.fid); fp->aux = 0; break; case Tread: tread(&f); break; case Twalk: twalk(&f); break; case Twstat: twstat(&f); break; } if(verbose && debug) fprint(dfd , "c→s %F\n", &f); if (putfcall(sfd, &f) < 0) fprint(dfd , "can't putfcall: %r\n"); r = getfcall(sfd, &f); if (r <= 0){ fprint(dfd, "trfs: 2nd getfcall %r\n"); break; } if (verbose) fprint(dfd, "c←s %F\n", &f); switch(f.type){ case Ropen: case Rcreate: fp->qid = f.qid; break; case Rread: rread(&f); break; case Rstat: rstat(&f); break; } if(verbose && debug) fprint(dfd , "c←s %F\n", &f); if (putfcall(cfd, &f) < 0) fprint(dfd , "can't 2n dputfcall: %r\n"); if (fp != nil) closefid(fp); } }