diff options
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r-- | src/lib/syscall.zig | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig index 3d60776..5e9105b 100644 --- a/src/lib/syscall.zig +++ b/src/lib/syscall.zig @@ -12,6 +12,10 @@ const trap = @import("trap.zig"); const vfs = @import("vfs.zig"); pub const Error = error{ + Unimplemented, +}; + +pub const HandleError = error{ UnknownSyscall, }; @@ -29,7 +33,7 @@ pub fn handler(proc: *process.Info, trap_frame: *trap.Frame) !void { 100009 => read(proc, trap_frame), 100010 => write(proc, trap_frame), 100011 => terminate(proc), - else => return Error.UnknownSyscall, + else => return HandleError.UnknownSyscall, } } @@ -169,11 +173,21 @@ fn provideDirHook(proc: *const process.Info, trap_frame: *trap.Frame) void { } // remove(path_c: [*:0]const u8) Result(void) // fixme: Kernel panic if null pointer -fn remove(trap_frame: *const trap.Frame) void { +fn remove(trap_frame: *trap.Frame) void { const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); - - _ = path_c; - unreachable; + const path = std.mem.sliceTo(path_c, 0); + const dirname = std.fs.path.dirnamePosix(path) orelse "/"; + + if (vfs.find(dirname)) |node| { + const basename = std.fs.path.basenamePosix(path); + sysexchange.frameReturn(null, trap_frame, switch (node.data.resource) { + .dir => |*dir| dir.remove(basename), + .dir_hook => Error.Unimplemented, + else => vfs.Error.NotADirectory, + }); + } else { + sysexchange.frameReturn(void, trap_frame, vfs.Error.NotFound); + } } // read(handle: usize, buffer: [*]u8, len: usize) Result(usize) |