aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-10 12:57:29 +0200
committerHimbeer <himbeer@disroot.org>2024-07-10 12:57:29 +0200
commitad198f401be990b30e7756daef33b58e3ad28868 (patch)
tree82bd3b4c9d209f089c993fa1dcf4df944e1fd80c /src/lib
parent1224390526a195f464838d6550110691e40809e9 (diff)
syscall: Implement remove
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/interrupts.zig2
-rw-r--r--src/lib/syscall.zig24
2 files changed, 20 insertions, 6 deletions
diff --git a/src/lib/interrupts.zig b/src/lib/interrupts.zig
index 72718bd..1f45ce3 100644
--- a/src/lib/interrupts.zig
+++ b/src/lib/interrupts.zig
@@ -163,7 +163,7 @@ export fn handleTrap(epc: usize, tval: usize, cause_bits: usize, frame: *trap.Fr
.ecall => {
const proc = &process.list.last.?.data;
syscall.handler(proc, frame) catch |err| switch (err) {
- syscall.Error.UnknownSyscall => {
+ syscall.HandleError.UnknownSyscall => {
const a7 = frame.general_purpose_registers[17];
w.print("Hart {d}, PID = {d}: Unknown syscall, a7 = 0x{x:0>16}\r\n", .{ frame.hart_id, pid, a7 }) catch unreachable;
},
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)