aboutsummaryrefslogtreecommitdiff
path: root/src/lib/syscall.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r--src/lib/syscall.zig44
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);
},