diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-08 13:19:52 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-08 13:19:52 +0200 |
commit | 862678c2323a57005a2ed55417a0d2b00bcf1d7c (patch) | |
tree | 4465a62a71c0f4e645feba1654030dd30ea25a40 /src/lib | |
parent | 4094f81d71ff2fd5379a3b91a366abb46dffc6a3 (diff) |
vfs: Make call function accept process info instead of PID
This makes it possible to interact with the newly created driver thread beforehand (to copy memory etc.)
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); } |