plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

commit 9ec57f8b9e8a243ca94fbdef0ed571b823a095b7
parent 869875b48b4455937fdddb7c98fbff7699c1effb
Author: Russ Cox <rsc@swtch.com>
Date:   Fri,  4 Jul 2008 12:16:53 -0400

9pfuse: always return . and ..

Diffstat:
Msrc/cmd/9pfuse/main.c | 31++++++++++++++++++++++++++++---
1 file changed, 28 insertions(+), 3 deletions(-)

diff --git 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) {