diff options
Diffstat (limited to 'src/lib/vfs.zig')
-rw-r--r-- | src/lib/vfs.zig | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/lib/vfs.zig b/src/lib/vfs.zig index c8cc552..71dda98 100644 --- a/src/lib/vfs.zig +++ b/src/lib/vfs.zig @@ -42,6 +42,7 @@ pub const Error = error{ InUse, Detached, Orphaned, + AlreadyExists, }; // A stream is a resource that provides a shared data stream with a driver. @@ -307,6 +308,18 @@ pub fn provideResource(path: []const u8, resource: Resource, pid: u16, options: .dir => blk: { const dir = inode.resource.data.dir; + if (dir.find(basename)) |node| { + if (node.data.inode.flags.detached and node.data.inode.options.reclaimable) { + node.data.inode = .{ + .resource = resource, + .pid = pid, + .options = options, + .flags = .{}, + }; + break :blk; + } else break :blk Error.AlreadyExists; + } + break :blk dir.provideResource(.{ .name = basename, .inode = .{ @@ -320,6 +333,8 @@ pub fn provideResource(path: []const u8, resource: Resource, pid: u16, options: .dir_hook => blk: { const dir_hook = inode.resource.data.dir_hook; + // fixme: Check for duplicate resources with the same path + break :blk dir_hook.provideFn(basename.ptr, basename.len, .{ .resource = resource, .pid = pid, |