plan9port

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

commit d07db89b00a55db3ca9c3577422cbd9be722dae6
parent 382ae73f24c4566b2948d72f65ff68dc35857556
Author: Russ Cox <rsc@swtch.com>
Date:   Fri,  4 Jul 2008 02:52:01 -0400

9pfuse: add symlink support

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

diff --git a/src/cmd/9pfuse/main.c b/src/cmd/9pfuse/main.c @@ -320,6 +320,8 @@ dir2attr(Dir *d, struct fuse_attr *attr) attr->mode = d->mode&0777; if(d->mode&DMDIR) attr->mode |= S_IFDIR; + else if(d->mode&DMSYMLINK) + attr->mode |= S_IFLNK; else attr->mode |= S_IFREG; attr->nlink = 1; /* works for directories! - see FUSE FAQ */ @@ -815,6 +817,32 @@ fuseread(FuseMsg *m) free(buf); } +/* + * Readlink. + */ +void +fusereadlink(FuseMsg *m) +{ + Dir *d; + CFid *fid; + + if((fid = nodeid2fid(m->hdr->nodeid)) == nil){ + replyfuseerrno(m, ESTALE); + return; + } + if((d = fsdirfstat(fid)) == nil){ + replyfuseerrstr(m); + return; + } + if(!(d->mode&DMSYMLINK)){ + replyfuseerrno(m, EINVAL); + return; + } + replyfuse(m, d->ext, strlen(d->ext)); + free(d); + return; +} + /* * Readdir. * Read from file handle in->fh at offset in->offset for size in->size. @@ -1123,8 +1151,9 @@ struct { { FUSE_GETATTR, fusegetattr }, { FUSE_SETATTR, fusesetattr }, /* - * FUSE_READLINK, FUSE_SYMLINK, FUSE_MKNOD are unimplemented. + * FUSE_SYMLINK, FUSE_MKNOD are unimplemented. */ + { FUSE_READLINK, fusereadlink }, { FUSE_MKDIR, fusemkdir }, { FUSE_UNLINK, fuseunlink }, { FUSE_RMDIR, fusermdir },