URI: 
       t9pfuse: always return . and .. - 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 9ec57f8b9e8a243ca94fbdef0ed571b823a095b7
   DIR parent 869875b48b4455937fdddb7c98fbff7699c1effb
  HTML Author: Russ Cox <rsc@swtch.com>
       Date:   Fri,  4 Jul 2008 12:16:53 -0400
       
       9pfuse: always return . and ..
       
       Diffstat:
         M src/cmd/9pfuse/main.c               |      31 ++++++++++++++++++++++++++++---
       
       1 file changed, 28 insertions(+), 3 deletions(-)
       ---
   DIR diff --git a/src/cmd/9pfuse/main.c b/src/cmd/9pfuse/main.c
       t@@ -855,6 +855,7 @@ fusereadlink(FuseMsg *m)
         * are stored in m->d,nd,d0.
         */
        int canpack(Dir*, uvlong, uchar**, uchar*);
       +Dir *dotdirs(CFid*);
        void
        fusereaddir(FuseMsg *m)
        {
       t@@ -871,9 +872,8 @@ fusereaddir(FuseMsg *m)
                if(in->offset == 0){
                        fsseek(ff->fid, 0, 0);
                        free(ff->d0);
       -                ff->d0 = nil;
       -                ff->d = nil;
       -                ff->nd = 0;
       +                ff->d0 = ff->d = dotdirs(ff->fid);
       +                ff->nd = 2;
                }
                n = in->size;
                if(n > fusemaxwrite)
       t@@ -906,6 +906,31 @@ out:
                free(buf);
        }
        
       +/*
       + * Fuse assumes that it can always read two directory entries.
       + * If it gets just one, it will double it in the dirread results.
       + * Thus if a directory contains just "a", you see "a" twice.
       + * Adding . as the first directory entry works around this.
       + * We could add .. too, but it isn't necessary.
       + */
       +Dir*
       +dotdirs(CFid *f)
       +{
       +        Dir *d;
       +        CFid *f1;
       +
       +        d = emalloc(2*sizeof *d);
       +        d[0].name = ".";
       +        d[0].qid = fsqid(f);
       +        d[1].name = "..";
       +        f1 = fswalk(f, "..");
       +        if(f1){
       +                d[1].qid = fsqid(f1);
       +                fsclose(f1);
       +        }
       +        return d;
       +}
       +
        int
        canpack(Dir *d, uvlong off, uchar **pp, uchar *ep)
        {