commit 387ae1dbb89dba0fc03ba5210b90bbde70a8cb86 from: rsc date: Thu Feb 02 16:40:25 2006 UTC fix fid handling commit - 40a2ff6f5d6291046a2bdeaa64de403a885a3a35 commit + 387ae1dbb89dba0fc03ba5210b90bbde70a8cb86 blob - 5f509f24f722f78d991f6e57b3cc20aacae8338b blob + 17cde8592459dd1487dab4cd8130ba46a8adff28 --- src/cmd/ndb/dns.c +++ src/cmd/ndb/dns.c @@ -192,8 +192,8 @@ main(int argc, char *argv[]) srand(now*getpid()); db2cache(1); - if(serve) - proccreate(dnudpserver, mntpt, STACK); +// if(serve) +// proccreate(dnudpserver, mntpt, STACK); if(sendnotifies) notifyproc(); @@ -267,6 +267,10 @@ newfid(int fid, int needunused) return mf; } } + if(!needunused){ + unlock(&mfalloc.lk); + return nil; + } mf = emalloc(sizeof(*mf)); if(mf == nil) sysfatal("out of memory"); @@ -282,6 +286,7 @@ freefid(Mfile *mf) { Mfile **l; +fprint(2, "freefid %d\n", mf->fid); lock(&mfalloc.lk); for(l = &mfalloc.inuse; *l != nil; l = &(*l)->next){ if(*l == mf){ @@ -385,12 +390,33 @@ io(void) freejob(job); continue; } - mf = newfid(job->request.fid, 0); if(debug) syslog(0, logfile, "%F", &job->request); getactivity(&req); req.aborttime = now + 60; /* don't spend more than 60 seconds */ + + mf = nil; + switch(job->request.type){ + case Tversion: + case Tauth: + case Tflush: + break; + case Tattach: + mf = newfid(job->request.fid, 1); + if(mf == nil){ + sendmsg(job, "fid in use"); + goto skip; + } + break; + default: + mf = newfid(job->request.fid, 0); + if(mf == nil){ + sendmsg(job, "unknown fid"); + goto skip; + } + break; + } switch(job->request.type){ default: @@ -436,7 +462,7 @@ io(void) rwstat(job, mf); break; } - +skip: freejob(job); /* blob - bfaaa68d08dc7a7238ad6db1a2ee574adc938e4f blob + 0987f26497b6dd1940b591120bf65f0165da5789 --- src/cmd/ndb/dns.h +++ src/cmd/ndb/dns.h @@ -364,7 +364,6 @@ extern int mkreq(DN *dp, int type, uchar *buf, int fla /* dnserver.c */ extern void dnserver(DNSmsg*, DNSmsg*, Request*); -extern void dnudpserver(void*); extern void dntcpserver(char*); /* dnnotify.c */