changeset 881:180558179a08

fs: implement symlink For now all symlinks are created with 0 user and group, and 755 as the mode. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sat, 17 Dec 2022 20:40:39 -0500
parents 6934276850f2
children f9ea425467d3
files src/fs/nomadfs.c
diffstat 1 files changed, 45 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/fs/nomadfs.c	Sat Dec 17 20:40:16 2022 -0500
+++ b/src/fs/nomadfs.c	Sat Dec 17 20:40:39 2022 -0500
@@ -340,6 +340,50 @@
 	fuse_reply_err(req, -nerr_to_errno(ret));
 }
 
+static void nomadfs_symlink(fuse_req_t req, const char *target,
+			    fuse_ino_t parent, const char *name)
+{
+	struct fuse_entry_param e;
+	uint32_t dir_ohandle;
+	struct noid child_oid;
+	struct nattr nattr;
+	int ret;
+
+	ret = fscall_open(&state, NULL, ino_fuse2nomad(parent), &dir_ohandle);
+	if (ret)
+		goto err;
+
+	/* FIXME: use actual owner, group, and mode */
+	ret = fscall_symlink(&state, dir_ohandle, name, 0, 0, NATTR_LNK | 0755,
+			     target, &child_oid);
+	if (ret)
+		goto err_close;
+
+	ret = fscall_close(&state, dir_ohandle);
+	if (ret)
+		goto err;
+
+	ret = __getattr(&child_oid, 0, &nattr);
+	if (ret)
+		goto err;
+
+	memset(&e, 0, sizeof(e));
+	nattr_to_stat(&nattr, &e.attr);
+	e.ino = e.attr.st_ino = ino_nomad2fuse(nattr.ino);
+	e.attr_timeout = ATTR_TIMEOUT;
+	e.entry_timeout = ENTRY_TIMEOUT;
+
+	fuse_reply_entry(req, &e);
+
+	return;
+
+err_close:
+	fscall_close(&state, dir_ohandle);
+
+err:
+	fuse_reply_err(req, -nerr_to_errno(ret));
+}
+
 static void __unlink(fuse_req_t req, fuse_ino_t parent, const char *name,
 		     bool rmdir)
 {
@@ -579,6 +623,7 @@
 	.mknod		= nomadfs_mknod,
 	.mkdir		= nomadfs_mkdir,
 	.readlink	= nomadfs_readlink,
+	.symlink	= nomadfs_symlink,
 	.unlink		= nomadfs_unlink,
 	.rmdir		= nomadfs_rmdir,
 	.readdir	= nomadfs_readdir,