aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
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,