diff options
author | Stefan Berger <stefanb@linux.ibm.com> | 2021-03-31 16:41:32 -0400 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2021-04-05 17:01:58 -0400 |
commit | 81d3017463492f69b0e07a7496e70135da01bac9 (patch) | |
tree | 6c4072fcbb419f489d35b2e985cd4e5f47cc714f /src/rofiles-fuse/main.c | |
parent | 57270db9a1c75daa4ec11ab9f1bb41609c29214b (diff) | |
download | ostree-81d3017463492f69b0e07a7496e70135da01bac9.tar.gz |
rofiles-fuse: Enable support for setting and getting xattrs
Enable support for setting and getting xattrs. Allow modifications
to xattrs only on user.ima xattr.
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Co-authored-by: Colin Walters <walters@verbum.org>
Diffstat (limited to 'src/rofiles-fuse/main.c')
-rw-r--r-- | src/rofiles-fuse/main.c | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/src/rofiles-fuse/main.c b/src/rofiles-fuse/main.c index 4033caa4..7ace1af0 100644 --- a/src/rofiles-fuse/main.c +++ b/src/rofiles-fuse/main.c @@ -533,14 +533,29 @@ static int callback_setxattr (const char *path, const char *name, const char *value, size_t size, int flags) { - return -ENOTSUP; + PATH_WRITE_ENTRYPOINT (path); + + char buf[PATH_MAX]; + snprintf (buf, sizeof (buf), "/proc/self/fd/%d/%s", basefd, path); + + if (setxattr (buf, name, value, size, flags) == -1) + return -errno; + return 0; } static int callback_getxattr (const char *path, const char *name, char *value, size_t size) { - return -ENOTSUP; + path = ENSURE_RELPATH (path); + + char buf[PATH_MAX]; + snprintf (buf, sizeof (buf), "/proc/self/fd/%d/%s", basefd, path); + + ssize_t n = getxattr (buf, name, value, size); + if (n == -1) + return -errno; + return n; } /* @@ -549,8 +564,15 @@ callback_getxattr (const char *path, const char *name, char *value, static int callback_listxattr (const char *path, char *list, size_t size) { - return -ENOTSUP; + path = ENSURE_RELPATH (path); + char buf[PATH_MAX]; + snprintf (buf, sizeof (buf), "/proc/self/fd/%d/%s", basefd, path); + + ssize_t n = llistxattr (buf, list, size); + if (n == -1) + return -errno; + return n; } /* @@ -559,8 +581,14 @@ callback_listxattr (const char *path, char *list, size_t size) static int callback_removexattr (const char *path, const char *name) { - return -ENOTSUP; + path = ENSURE_RELPATH (path); + + char buf[PATH_MAX]; + snprintf (buf, sizeof (buf), "/proc/self/fd/%d/%s", basefd, path); + if (lremovexattr (buf, name) == -1) + return -errno; + return 0; } struct fuse_operations callback_oper = { |