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