diff options
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r-- | src/lib/syscall.zig | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig index 3b7ed71..51f6ff5 100644 --- a/src/lib/syscall.zig +++ b/src/lib/syscall.zig @@ -86,10 +86,11 @@ fn provideStream(proc: *const process.Info, trap_frame: *trap.Frame) void { const writeFn: ?vfs.Stream.WriteFn = @ptrFromInt(trap_frame.general_purpose_registers[12]); sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path_c, .{ - .stream = .{ + .tag = .stream, + .data = .{ .stream = .{ .readFn = readFn, .writeFn = writeFn, - }, + } }, }, proc.id)); } @@ -111,12 +112,13 @@ fn provideFile(proc: *const process.Info, trap_frame: *trap.Frame) void { const closeFn: ?vfs.File.CloseFn = @ptrFromInt(trap_frame.general_purpose_registers[14]); sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path_c, .{ - .file = .{ + .tag = .file, + .data = .{ .file = .{ .openFn = openFn, .readFn = readFn, .writeFn = writeFn, .closeFn = closeFn, - }, + } }, }, proc.id)); } @@ -132,9 +134,10 @@ fn provideHook(proc: *const process.Info, trap_frame: *trap.Frame) void { const callback: vfs.Hook.Callback = @ptrFromInt(trap_frame.general_purpose_registers[11]); sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path_c, .{ - .hook = .{ + .tag = .hook, + .data = .{ .hook = .{ .callback = callback, - }, + } }, }, proc.id)); } @@ -143,8 +146,17 @@ fn provideHook(proc: *const process.Info, trap_frame: *trap.Frame) void { // ) Result(void) fn mkdir(proc: *const process.Info, trap_frame: *trap.Frame) void { const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); + + const allocator = vfs.treeRoot().allocator; + const tree = allocator.create(vfs.Tree) catch |err| { + sysexchange.frameReturn(void, trap_frame, err); + return; + }; + tree.* = vfs.Tree.init(allocator); + sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path_c, .{ - .dir = vfs.Tree.init(vfs.treeRoot().allocator), + .tag = .dir, + .data = .{ .dir = tree }, }, proc.id)); } @@ -164,11 +176,12 @@ fn provideDirHook(proc: *const process.Info, trap_frame: *trap.Frame) void { const removeFn: vfs.DirHook.RemoveFn = @ptrFromInt(trap_frame.general_purpose_registers[13]); sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path_c, .{ - .dir_hook = .{ + .tag = .dir_hook, + .data = .{ .dir_hook = .{ .provideFn = provideFn, .findFn = findFn, .removeFn = removeFn, - }, + } }, }, proc.id)); } @@ -178,11 +191,16 @@ fn remove(trap_frame: *trap.Frame) void { const path = std.mem.sliceTo(path_c, 0); const dirname = std.fs.path.dirnamePosix(path) orelse "/"; - if (vfs.find(dirname)) |node| { + if (vfs.find(dirname)) |inode| { const basename = std.fs.path.basenamePosix(path); - switch (node.data.resource) { - .dir => |*dir| sysexchange.frameReturn(null, trap_frame, dir.remove(basename)), - .dir_hook => |dir_hook| { + switch (inode.resource.tag) { + .dir => { + const dir = inode.resource.data.dir; + sysexchange.frameReturn(null, trap_frame, dir.remove(basename)); + }, + .dir_hook => { + const dir_hook = inode.resource.data.dir_hook; + const result = dir_hook.removeFn(basename.ptr, basename.len); sysexchange.frameReturnResult(void, trap_frame, result); }, |