Mercurial > nomad
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,