diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-12 09:33:32 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-12 09:33:32 +0200 |
commit | 8e53aa60ed37583fe0c670e653afd1934d113e4f (patch) | |
tree | cc0fccd1d07b877271d8325671cd7aa7adf7f9c4 /src/lib | |
parent | db88bc3b0a31c4ca447940e2b97a7156ed70db21 (diff) |
vfs: Fix read and write operations panicking for kernel-provided resources
Fixes #48.
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/vfs.zig | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/lib/vfs.zig b/src/lib/vfs.zig index c70a375..f3520be 100644 --- a/src/lib/vfs.zig +++ b/src/lib/vfs.zig @@ -150,15 +150,19 @@ pub const ResourceDescriptor = struct { self.inode.refs -|= 1; } - pub fn read(self: ResourceDescriptor, proc: *process.Info, buffer: []u8) !noreturn { + pub fn read(self: ResourceDescriptor, proc: *process.Info, buffer: []u8) !usize { return switch (self.inode.resource.tag) { .stream => { const stream = self.inode.resource.data.stream; + const readFn = stream.readFn orelse return Error.ReadNotSupported; + if (self.inode.pid == 0) { + return readFn(buffer.ptr, buffer.len).toErrorUnion(); + } + const driver = process.latestThread(self.inode.pid).?; const copy = try driver.copyBuffer(buffer); - const readFn = stream.readFn orelse return Error.ReadNotSupported; proc.state = .suspended; try call(driver, readFn, .{ copy.ptr, copy.len }, .{ .cleanupFn = moveBack, @@ -174,15 +178,19 @@ pub const ResourceDescriptor = struct { }; } - pub fn write(self: ResourceDescriptor, proc: *process.Info, bytes: []const u8) !noreturn { + pub fn write(self: ResourceDescriptor, proc: *process.Info, bytes: []const u8) !usize { return switch (self.inode.resource.tag) { .stream => { const stream = self.inode.resource.data.stream; + const writeFn = stream.writeFn orelse return Error.WriteNotSupported; + if (self.inode.pid == 0) { + return writeFn(bytes.ptr, bytes.len).toErrorUnion(); + } + const driver = process.latestThread(self.inode.pid).?; const copy = try driver.copyBytes(bytes); - const writeFn = stream.writeFn orelse return Error.WriteNotSupported; proc.state = .suspended; try call(driver, writeFn, .{ copy.ptr, copy.len }, null, .{ .hookFn = crossProcessReturn, |