aboutsummaryrefslogtreecommitdiff
path: root/src/lib/vfs.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/vfs.zig')
-rw-r--r--src/lib/vfs.zig23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/lib/vfs.zig b/src/lib/vfs.zig
index 7083c7c..951c666 100644
--- a/src/lib/vfs.zig
+++ b/src/lib/vfs.zig
@@ -61,16 +61,14 @@ pub const Stream = extern struct {
// A file is a resource that creates a unique data stream with a driver.
pub const File = extern struct {
- openFn: OpenFn,
readFn: ?ReadFn,
writeFn: ?WriteFn,
closeFn: ?CloseFn,
initializer: ?*anyopaque,
- pub const OpenFn = *allowzero const fn (initializer: ?*anyopaque, pid: u16) callconv(.C) sysexchange.Result(*anyopaque);
- pub const ReadFn = *const fn (context: *anyopaque, ptr: [*]u8, len: usize) callconv(.C) sysexchange.Result(usize);
- pub const WriteFn = *const fn (context: *anyopaque, ptr: [*]const u8, len: usize) callconv(.C) sysexchange.Result(usize);
- pub const CloseFn = *const fn (context: *anyopaque) callconv(.C) void;
+ pub const ReadFn = *const fn (context: *FileContext, ptr: [*]u8, len: usize) callconv(.C) sysexchange.Result(usize);
+ pub const WriteFn = *const fn (context: *FileContext, ptr: [*]const u8, len: usize) callconv(.C) sysexchange.Result(usize);
+ pub const CloseFn = *const fn (context: *FileContext) callconv(.C) void;
};
// A hook is a resource that invokes raw driver callbacks when interacted with.
@@ -92,7 +90,7 @@ pub const DirHook = extern struct {
};
pub const FileContext = extern struct {
- inner: *allowzero anyopaque,
+ inner: ?*anyopaque,
};
pub const ResourceKind = enum(u32) {
@@ -185,10 +183,19 @@ pub const ResourceDescriptor = struct {
pub fn init(allocator: Allocator, inode: *Inode) !ResourceDescriptor {
inode.refs = std.math.add(usize, inode.refs, 1) catch return Error.TooManyReferences;
- const context = if (inode.resource.tag == .file) try allocator.create(FileContext) else null;
+ if (inode.resource.tag == .file) {
+ const context = try allocator.create(FileContext);
+ context.inner = inode.resource.data.file.initializer;
+
+ return .{
+ .inode = inode,
+ .context = context,
+ };
+ }
+
return .{
.inode = inode,
- .context = context,
+ .context = null,
};
}