diff options
Diffstat (limited to 'src/lib/vfs.zig')
-rw-r--r-- | src/lib/vfs.zig | 28 |
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) { |