summaryrefslogtreecommitdiff
path: root/src/rofiles-fuse/main.c
diff options
context:
space:
mode:
authorStefan Berger <stefanb@linux.ibm.com>2021-03-31 16:41:32 -0400
committerColin Walters <walters@verbum.org>2021-04-05 17:01:58 -0400
commit81d3017463492f69b0e07a7496e70135da01bac9 (patch)
tree6c4072fcbb419f489d35b2e985cd4e5f47cc714f /src/rofiles-fuse/main.c
parent57270db9a1c75daa4ec11ab9f1bb41609c29214b (diff)
downloadostree-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.c36
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 = {