aboutsummaryrefslogtreecommitdiff
path: root/src/lib/vfs.zig
diff options
context:
space:
mode:
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) {