tExperiment: ignore double-responds. Also allow nil string as empty string in readstr. - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 39e5957ace14f1dcff62014fd26f368e87c79c29
 (DIR) parent eb9be70308f0397b13312e2472d7764d481e5a73
 (HTM) Author: rsc <devnull@localhost>
       Date:   Sun,  5 Feb 2006 15:34:18 +0000
       
       Experiment: ignore double-responds.
       Also allow nil string as empty string in readstr.
       
       Diffstat:
         M src/lib9p/srv.c                     |      12 ++++++++++--
         M src/lib9p/util.c                    |       5 ++++-
       
       2 files changed, 14 insertions(+), 3 deletions(-)
       ---
 (DIR) diff --git a/src/lib9p/srv.c b/src/lib9p/srv.c
       t@@ -755,6 +755,11 @@ respond(Req *r, char *error)
                srv = r->srv;
                assert(srv != nil);
        
       +        if(r->responded){
       +                assert(r->pool);
       +                goto free;
       +        }
       +                
                assert(r->responded == 0);
                r->error = error;
        
       t@@ -806,13 +811,16 @@ if(chatty9p)
                        sysfatal("lib9p srv: write %d returned %d on fd %d: %r", n, m, srv->outfd);
                qunlock(&srv->wlock);
        
       +free:
                qlock(&r->lk);        /* no one will add flushes now */
                r->responded = 1;
       -        qunlock(&r->lk);
       -
       +        
                for(i=0; i<r->nflush; i++)
                        respond(r->flush[i], nil);
                free(r->flush);
       +        r->nflush = 0;
       +        r->flush = nil;
       +        qunlock(&r->lk);
        
                if(r->pool)
                        closereq(r);
 (DIR) diff --git a/src/lib9p/util.c b/src/lib9p/util.c
       t@@ -21,5 +21,8 @@ readbuf(Req *r, void *s, long n)
        void
        readstr(Req *r, char *s)
        {
       -        readbuf(r, s, strlen(s));
       +        if(s == nil)
       +                r->ofcall.count = 0;
       +        else
       +                readbuf(r, s, strlen(s));
        }