aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-12 09:33:32 +0200
committerHimbeer <himbeer@disroot.org>2024-07-12 09:33:32 +0200
commit8e53aa60ed37583fe0c670e653afd1934d113e4f (patch)
treecc0fccd1d07b877271d8325671cd7aa7adf7f9c4 /src/lib
parentdb88bc3b0a31c4ca447940e2b97a7156ed70db21 (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.zig16
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,