From bfa17458d91fe8c6dfce77e7ba1329891673b40c Mon Sep 17 00:00:00 2001 From: cozis Date: Sat, 23 May 2026 17:22:25 +0200 Subject: [PATCH] io_interface: Implement mock of dirCreateFile --- src/io_interface.zig | 43 ++++++++++++++++++++++++++++++++++++++----- src/node.zig | 4 ++-- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/io_interface.zig b/src/io_interface.zig index de64986..aaf0bfe 100644 --- a/src/io_interface.zig +++ b/src/io_interface.zig @@ -403,11 +403,44 @@ fn dirAccess(userdata: ?*anyopaque, dir: Dir, sub_path: []const u8, options: Dir } fn dirCreateFile(userdata: ?*anyopaque, dir: Dir, sub_path: []const u8, flags: Dir.CreateFileOptions) File.OpenError!File { - _ = userdata; - _ = dir; - _ = sub_path; - _ = flags; - @panic("Not implemented yet"); + _ = flags; // TODO: Use flags + + const node: *Node = @ptrCast(@alignCast(userdata.?)); + const parent = if (dir.handle == Dir.cwd().handle) null else dir.handle; + + node.createFile(parent, sub_path) catch |e| { + return switch (e) { + Node.CreateFileError.InvalidHandle => unreachable, + Node.CreateFileError.ExistsAlready => File.OpenError.PathAlreadyExists, + Node.CreateFileError.EmptyPath => File.OpenError.BadPathName, + Node.CreateFileError.NoRootParent => File.OpenError.FileNotFound, + Node.CreateFileError.TooManyComponents => File.OpenError.NameTooLong, + Node.CreateFileError.ResolutionLimit => File.OpenError.NameTooLong, + Node.CreateFileError.ComponentNotDirectory => File.OpenError.NotDir, + Node.CreateFileError.ComponentNotFound => File.OpenError.FileNotFound, + Node.CreateFileError.OutOfMemory => File.OpenError.SystemResources, + }; + }; + + const handle = node.openFile(parent, sub_path) catch |e| { + return switch (e) { + Node.OpenFileError.InvalidHandle => unreachable, + Node.OpenFileError.DescriptorLimit => File.OpenError.ProcessFdQuotaExceeded, + Node.OpenFileError.IsDirectory => File.OpenError.IsDir, + Node.OpenFileError.NotDirectory => File.OpenError.NotDir, + Node.OpenFileError.EmptyPath => File.OpenError.BadPathName, + Node.OpenFileError.NoRootParent => File.OpenError.FileNotFound, + Node.OpenFileError.TooManyComponents => File.OpenError.NameTooLong, + Node.OpenFileError.ResolutionLimit => File.OpenError.NameTooLong, + Node.OpenFileError.ComponentNotDirectory => File.OpenError.NotDir, + Node.OpenFileError.ComponentNotFound => File.OpenError.FileNotFound, + }; + }; + + return .{ + .handle = handle, + .flags = .{ .nonblocking = false }, + }; } fn dirCreateFileAtomic(userdata: ?*anyopaque, dir: Dir, dest_path: []const u8, options: Dir.CreateFileAtomicOptions) Dir.CreateFileAtomicError!File.Atomic { diff --git a/src/node.zig b/src/node.zig index b9dd06b..f54f81a 100644 --- a/src/node.zig +++ b/src/node.zig @@ -223,9 +223,9 @@ pub fn deleteFile(self: *Node, parent: ?Handle, path: []const u8) DeleteFileErro pub const OpenFileError = error { DescriptorLimit, -} || FileSystem.OpenError; +} || HandleError || FileSystem.OpenError; -pub fn openFile(self: *Node, parent: ?Handle, path: []const u8) !Handle { +pub fn openFile(self: *Node, parent: ?Handle, path: []const u8) OpenFileError!Handle { self.scheduler.sleep(10); const desc = self.unusedDesc() orelse return OpenFileError.DescriptorLimit; try self.file_system.openFile(path, try self.handleToOpenDirOrNULL(parent), &desc.file);