changeset 880:6934276850f2

fs: implement readlink Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sat, 17 Dec 2022 20:40:16 -0500
parents 0c94a9835dfd
children 180558179a08
files src/fs/nomadfs.c
diffstat 1 files changed, 44 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/fs/nomadfs.c	Sat Dec 17 16:38:59 2022 -0500
+++ b/src/fs/nomadfs.c	Sat Dec 17 20:40:16 2022 -0500
@@ -297,6 +297,49 @@
 	nomadfs_mknod(req, parent, name, mode, 0);
 }
 
+static void nomadfs_readlink(fuse_req_t req, fuse_ino_t symlink)
+{
+	struct nattr nattr;
+	uint32_t ohandle;
+	char *buf;
+	int ret;
+
+	ret = fscall_open(&state, NULL, ino_fuse2nomad(symlink), &ohandle);
+	if (ret)
+		goto err;
+
+	ret = fscall_getattr(&state, ohandle, &nattr);
+	if (ret)
+		goto err_close;
+
+	if (nattr.size >= 4096) {
+		ret = NERR_ENOMEM;
+		goto err_close;
+	}
+
+	buf = alloca(nattr.size + 1);
+
+	ret = fscall_read(&state, ohandle, buf, nattr.size, 0, &nattr.size);
+	if (ret)
+		goto err_close;
+
+	ret = fscall_close(&state, ohandle);
+	if (ret)
+		goto err;
+
+	buf[nattr.size] = '\0';
+
+	fuse_reply_readlink(req, buf);
+
+	return;
+
+err_close:
+	fscall_close(&state, 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)
 {
@@ -535,6 +578,7 @@
 	.lookup		= nomadfs_lookup,
 	.mknod		= nomadfs_mknod,
 	.mkdir		= nomadfs_mkdir,
+	.readlink	= nomadfs_readlink,
 	.unlink		= nomadfs_unlink,
 	.rmdir		= nomadfs_rmdir,
 	.readdir	= nomadfs_readdir,