commit - 382ae73f24c4566b2948d72f65ff68dc35857556
commit + d07db89b00a55db3ca9c3577422cbd9be722dae6
blob - a6c1df2f55bc969fb9c0edc930cdcaf58279fc9c
blob + c9d4f55dd5ac8ab0f213d029a322fac434ea1be3
--- src/cmd/9pfuse/main.c
+++ src/cmd/9pfuse/main.c
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 */
replyfuse(m, buf, n);
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.
{ 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 },