commit da60264750d28c7d38959be051691a8025ce4b6f
parent e4eb4d1bea49eb3b450477aed72ab474b882ae0a
Author: Hugo Osvaldo Barrera <hugo@whynothugo.nl>
Date: Wed, 26 Jun 2024 12:20:11 +0200
os: add wrappers for xattr syscalls
Diffstat:
1 file changed, 51 insertions(+), 0 deletions(-)
diff --git a/os/+linux/fs.ha b/os/+linux/fs.ha
@@ -7,6 +7,12 @@ use path;
use rt;
use types::c;
+export type setxattr_flag = enum int {
+ NONE = 0,
+ XATTR_CREATE = 0x1,
+ XATTR_REPLACE = 0x2,
+};
+
@init fn init_cwd() void = {
static let cwd_fs = os_filesystem { ... };
cwd = static_dirfdopen(rt::AT_FDCWD, &cwd_fs);
@@ -128,3 +134,48 @@ export fn access(path: str, mode: amode) (bool | fs::error) = {
return errno_to_fs(err);
};
};
+
+// Sets an extended file attribute.
+export fn setxattr(
+ path: str,
+ name: str,
+ value: []u8,
+ flags: setxattr_flag = setxattr_flag::NONE,
+) (void | fs::error) = {
+ match (rt::setxattr(path, name, value, flags)) {
+ case let err: rt::errno =>
+ return errno_to_fs(err);
+ case void =>
+ return void;
+ };
+};
+
+// Gets an extended file attribute.
+// The caller is responsible for freeing the returned slice.
+export fn getxattr(path: str, name: str) ([]u8 | fs::error) = {
+ let empty: []u8 = [];
+ let attr_size = match (rt::getxattr(path, name, empty)) {
+ case let err: rt::errno =>
+ return errno_to_fs(err);
+ case let s: u64 =>
+ yield s;
+ };
+
+ let buf: []u8 = alloc([0...], attr_size);
+ match (rt::getxattr(path, name, buf)) {
+ case let err: rt::errno =>
+ return errno_to_fs(err);
+ case let s: u64 =>
+ return buf;
+ };
+};
+
+// Removes an extended file attribute.
+export fn removexattr(path: str, name: str) (void | fs::error) = {
+ match (rt::removexattr(path, name)) {
+ case let err: rt::errno =>
+ return errno_to_fs(err);
+ case void =>
+ return void;
+ };
+};