URI: 
       tfix fid handling - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 387ae1dbb89dba0fc03ba5210b90bbde70a8cb86
   DIR parent 40a2ff6f5d6291046a2bdeaa64de403a885a3a35
  HTML Author: rsc <devnull@localhost>
       Date:   Thu,  2 Feb 2006 16:40:25 +0000
       
       fix fid handling
       
       Diffstat:
         M src/cmd/ndb/dns.c                   |      34 +++++++++++++++++++++++++++----
         M src/cmd/ndb/dns.h                   |       1 -
       
       2 files changed, 30 insertions(+), 5 deletions(-)
       ---
   DIR diff --git a/src/cmd/ndb/dns.c b/src/cmd/ndb/dns.c
       t@@ -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();
        
       t@@ -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");
       t@@ -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){
       t@@ -385,13 +390,34 @@ 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:
                                syslog(1, logfile, "unknown request type %d", job->request.type);
       t@@ -436,7 +462,7 @@ io(void)
                                rwstat(job, mf);
                                break;
                        }
       -
       +skip:
                        freejob(job);
                
                        /*
   DIR diff --git a/src/cmd/ndb/dns.h b/src/cmd/ndb/dns.h
       t@@ -364,7 +364,6 @@ extern int        mkreq(DN *dp, int type, uchar *buf, int flags, ushort reqno);
        
        /* dnserver.c */
        extern void        dnserver(DNSmsg*, DNSmsg*, Request*);
       -extern void        dnudpserver(void*);
        extern void        dntcpserver(char*);
        
        /* dnnotify.c */