diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/vfs.zig | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/lib/vfs.zig b/src/lib/vfs.zig index 12c40a2..d9a7b90 100644 --- a/src/lib/vfs.zig +++ b/src/lib/vfs.zig @@ -132,9 +132,11 @@ pub const ResourceDescriptor = struct { pub fn read(self: ResourceDescriptor, proc: *process.Info, buffer: []u8) !noreturn { return switch (self.inode.resource) { .stream => |stream| { + const driver = process.latestThread(self.inode.pid).?; + const readFn = stream.readFn orelse return Error.ReadNotSupported; proc.state = .suspended; - try call(self.inode.pid, readFn, .{ buffer.ptr, buffer.len }, .{ + try call(driver, readFn, .{ buffer.ptr, buffer.len }, .{ .hookFn = crossProcessReturn, .context = proc, }); @@ -147,9 +149,11 @@ pub const ResourceDescriptor = struct { pub fn write(self: ResourceDescriptor, proc: *process.Info, bytes: []const u8) !noreturn { return switch (self.inode.resource) { .stream => |stream| { + const driver = process.latestThread(self.inode.pid).?; + const writeFn = stream.writeFn orelse return Error.WriteNotSupported; proc.state = .suspended; - try call(self.inode.pid, writeFn, .{ bytes.ptr, bytes.len }, .{ + try call(driver, writeFn, .{ bytes.ptr, bytes.len }, .{ .hookFn = crossProcessReturn, .context = proc, }); @@ -215,8 +219,10 @@ pub fn open(proc: *process.Info, path: []const u8, pid: u16, data: usize) !Resou const node = find(path) orelse return Error.NotFound; return switch (node.data.resource) { .hook => |hook| { + const driver = process.latestThread(node.data.pid).?; + proc.state = .suspended; - try call(node.data.pid, hook.callback, .{ pid, data }, .{ + try call(driver, hook.callback, .{ pid, data }, .{ .hookFn = crossProcessReturn, .context = proc, }); @@ -229,10 +235,8 @@ pub fn openZ(proc: *process.Info, path_c: [*:0]const u8, pid: u16, data: usize) return open(proc, mem.sliceTo(path_c, 0), pid, data); } -fn call(pid: u16, function: *const anyopaque, args: anytype, termHook: ?process.Info.TermHook) !noreturn { - const proc = process.latestThread(pid).?; +fn call(proc: *process.Info, function: *const anyopaque, args: anytype, termHook: ?process.Info.TermHook) !noreturn { const callback_thread = try proc.createThread(null); - callback_thread.call(@intFromPtr(function), args, termHook); } |