Commit Diff


commit - 382ae73f24c4566b2948d72f65ff68dc35857556
commit + d07db89b00a55db3ca9c3577422cbd9be722dae6
blob - a6c1df2f55bc969fb9c0edc930cdcaf58279fc9c
blob + c9d4f55dd5ac8ab0f213d029a322fac434ea1be3
--- src/cmd/9pfuse/main.c
+++ 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 */
@@ -814,7 +816,33 @@ fuseread(FuseMsg *m)
 	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.
@@ -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 },