diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-21 19:47:27 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-21 19:47:27 +0200 |
commit | fe0a01276bcf77a733e9b844ca368df39cd2ea7b (patch) | |
tree | 375122e783e8e5e3acd13824264964fa7b0b9ffd /src | |
parent | c5987318456269e0f224e32a3090b6ed90fcfb0a (diff) |
vfs: Don't set FileContext.inner initially but provide FileContext.initializer
This allows file providers to know whether an interaction is the first one made with a specific resource descriptor.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/resources.zig | 10 | ||||
-rw-r--r-- | src/lib/vfs.zig | 4 |
2 files changed, 8 insertions, 6 deletions
diff --git a/src/lib/resources.zig b/src/lib/resources.zig index e02e96c..4a2ae7b 100644 --- a/src/lib/resources.zig +++ b/src/lib/resources.zig @@ -348,21 +348,21 @@ fn addDir(path: []const u8) !void { }); } -fn open(context: *vfs.FileContext) !void { +fn open(context: *vfs.FileContext, initializer: ?*anyopaque) !void { const allocator = vfs.treeRoot().allocator; - const inner = context.inner orelse return Error.NoTarFileInitializer; - const old_context: *FileContext = @alignCast(@ptrCast(inner)); + const init_to = initializer orelse return Error.NoTarFileInitializer; + const init_context: *FileContext = @alignCast(@ptrCast(init_to)); const new_context = try allocator.create(FileContext); - new_context.* = old_context.*; + new_context.* = init_context.*; context.inner = new_context; } fn read(context: *vfs.FileContext, ptr: [*]u8, len: usize) callconv(.C) Result(usize) { if (context.inner == null) { - open(context) catch |err| { + open(context, context.initializer) catch |err| { return Result(usize).fromAnyTypeOrError(err); }; } diff --git a/src/lib/vfs.zig b/src/lib/vfs.zig index 951c666..47d631a 100644 --- a/src/lib/vfs.zig +++ b/src/lib/vfs.zig @@ -91,6 +91,7 @@ pub const DirHook = extern struct { pub const FileContext = extern struct { inner: ?*anyopaque, + initializer: ?*anyopaque, }; pub const ResourceKind = enum(u32) { @@ -185,7 +186,8 @@ pub const ResourceDescriptor = struct { if (inode.resource.tag == .file) { const context = try allocator.create(FileContext); - context.inner = inode.resource.data.file.initializer; + context.inner = null; + context.initializer = inode.resource.data.file.initializer; return .{ .inode = inode, |