From 9ec57f8b9e8a243ca94fbdef0ed571b823a095b7 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 4 Jul 2008 12:16:53 -0400 Subject: 9pfuse: always return . and .. --- src/cmd/9pfuse/main.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'src/cmd/9pfuse/main.c') diff --git a/src/cmd/9pfuse/main.c b/src/cmd/9pfuse/main.c index c9d4f55d..45041e66 100644 --- a/src/cmd/9pfuse/main.c +++ b/src/cmd/9pfuse/main.c @@ -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) { @@ -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) @@ -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) { -- cgit v1.2.3