aboutsummaryrefslogtreecommitdiff
path: root/src/lib/vfs.zig
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-02 12:30:34 +0200
committerHimbeer <himbeer@disroot.org>2024-07-02 12:30:34 +0200
commit45b6b8cf87d78675e6685923bbdac0d1d954d525 (patch)
tree7b513851032fb7d84109b30e10b20bb8d7c0ba84 /src/lib/vfs.zig
parent3a0d5757265feff947519f0798a642cde5f08fc6 (diff)
syscall: Add read and write for stream resources
Diffstat (limited to 'src/lib/vfs.zig')
-rw-r--r--src/lib/vfs.zig28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/lib/vfs.zig b/src/lib/vfs.zig
index 56834d6..3a1fbff 100644
--- a/src/lib/vfs.zig
+++ b/src/lib/vfs.zig
@@ -16,6 +16,8 @@ pub const Error = error{
NotADirectory,
NoAbsoluteContainingDirectory,
TooManyReferences,
+ ReadNotSupported,
+ WriteNotSupported,
};
// A stream is a resource that provides a shared data stream with a driver.
@@ -127,6 +129,32 @@ pub const ResourceDescriptor = struct {
pub fn deinit(self: ResourceDescriptor) void {
self.inode.refs -|= 1;
}
+
+ pub fn read(self: ResourceDescriptor, buffer: []u8) sysexchange.Result(usize) {
+ const err_unsupported = sysexchange.Result(usize).fromAnyTypeOrError(Error.ReadNotSupported);
+
+ return switch (self.inode.resource) {
+ .stream => |stream| blk: {
+ const readFn = stream.readFn orelse return err_unsupported;
+ break :blk readFn(buffer);
+ },
+ .hook => err_unsupported,
+ else => err_unsupported,
+ };
+ }
+
+ pub fn write(self: ResourceDescriptor, bytes: []const u8) sysexchange.Result(usize) {
+ const err_unsupported = sysexchange.Result(usize).fromAnyTypeOrError(Error.WriteNotSupported);
+
+ return switch (self.inode.resource) {
+ .stream => |stream| blk: {
+ const writeFn = stream.writeFn orelse return err_unsupported;
+ break :blk writeFn(bytes);
+ },
+ .hook => err_unsupported,
+ else => err_unsupported,
+ };
+ }
};
pub const UserInfo = union(enum) {