hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

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:
Mos/+linux/fs.ha | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
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; + }; +};