Req *r;
qlock(&s->rlock);
- while((n = read9pmsg(s->infd, s->rbuf, s->msize)) == 0)
- ;
- if(n < 0){
+ n = read9pmsg(s->infd, s->rbuf, s->msize);
+ if(n <= 0){
qunlock(&s->rlock);
return nil;
}
}
if(strncmp(r->ifcall.version, "9P", 2) != 0){
r->ofcall.version = "unknown";
+ r->ofcall.msize = 256;
respond(r, nil);
return;
}
return;
}
if((r->fid->qid.type&QTDIR) && r->fid->file){
- r->ofcall.count = readdirfile(r->fid->rdir, r->rbuf, r->ifcall.count);
+ r->ofcall.count = readdirfile(r->fid->rdir, r->rbuf, r->ifcall.count, r->ifcall.offset);
respond(r, nil);
return;
}
rread(Req *r, char *error)
{
if(error==nil && (r->fid->qid.type&QTDIR))
- r->fid->diroffset += r->ofcall.count;
+ r->fid->diroffset = r->ifcall.offset + r->ofcall.count;
}
static void
case Tstat: sstat(srv, r); break;
case Twstat: swstat(srv, r); break;
}
+ if(srv->sref.ref > 8 && srv->spid != getpid()){
+ decref(&srv->sref);
+ qunlock(&srv->slock);
+ return;
+ }
qunlock(&srv->slock);
}
fmtinstall('D', dirfmt);
fmtinstall('F', fcallfmt);
+ srv->spid = getpid();
srv->sref.ref = 0;
srv->rref.ref = 0;