diff options
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, |