zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit f4eecf8d7d4026a9e0ab8986b1c049ad2a0e01fc (tree)
parent 6cdd576d4176c2581f796c2066ca0f92bda03c9e
Author: Jonathan Marler <johnnymarler@gmail.com>
Date:   Sat, 21 Mar 2026 09:57:05 -0600

handle EROFS in create/open file

I hit an unexpected errno 30 on macos attempting to call createFile on a
directory in PATH.  errno 30 is EROFS, this change propagates that error
as error.ReadOnlyFileSystem.


Diffstat:
Mlib/std/Io/Dispatch.zig | 2++
Mlib/std/Io/File.zig | 1+
Mlib/std/Io/Threaded.zig | 2++
Mlib/std/Io/Uring.zig | 1+
Mlib/std/debug/SelfInfo/Windows.zig | 1+
Mlib/std/zig/system.zig | 2++
6 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/lib/std/Io/Dispatch.zig b/lib/std/Io/Dispatch.zig @@ -2512,6 +2512,7 @@ fn dirCreateFile( .OPNOTSUPP => return error.FileLocksUnsupported, .AGAIN => return error.WouldBlock, .TXTBSY => return error.FileBusy, + .ROFS => return error.ReadOnlyFileSystem, .NXIO => return error.NoDevice, .ILSEQ => return error.BadPathName, else => |err| return unexpectedErrno(err), @@ -2647,6 +2648,7 @@ fn dirOpenFile( .AGAIN => return error.WouldBlock, .TXTBSY => return error.FileBusy, .NXIO => return error.NoDevice, + .ROFS => return error.ReadOnlyFileSystem, .ILSEQ => return error.BadPathName, else => |err| return unexpectedErrno(err), } diff --git a/lib/std/Io/File.zig b/lib/std/Io/File.zig @@ -202,6 +202,7 @@ pub const OpenError = error{ NotDir, /// The path already exists and the `CREAT` and `EXCL` flags were provided. PathAlreadyExists, + ReadOnlyFileSystem, DeviceBusy, FileLocksUnsupported, /// One of these three things: diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig @@ -4290,6 +4290,7 @@ fn dirCreateFilePosix( .AGAIN => return error.WouldBlock, .TXTBSY => return error.FileBusy, .NXIO => return error.NoDevice, + .ROFS => return error.ReadOnlyFileSystem, .ILSEQ => return error.BadPathName, else => |err| return posix.unexpectedErrno(err), } @@ -4871,6 +4872,7 @@ fn dirOpenFilePosix( .AGAIN => return error.WouldBlock, .TXTBSY => return error.FileBusy, .NXIO => return error.NoDevice, + .ROFS => return error.ReadOnlyFileSystem, .ILSEQ => return error.BadPathName, else => |err| return posix.unexpectedErrno(err), } diff --git a/lib/std/Io/Uring.zig b/lib/std/Io/Uring.zig @@ -5673,6 +5673,7 @@ fn openat( .AGAIN => return error.WouldBlock, .TXTBSY => return error.FileBusy, .NXIO => return error.NoDevice, + .ROFS => return error.ReadOnlyFileSystem, .ILSEQ => return error.BadPathName, else => |err| return unexpectedErrno(err), } diff --git a/lib/std/debug/SelfInfo/Windows.zig b/lib/std/debug/SelfInfo/Windows.zig @@ -360,6 +360,7 @@ const Module = struct { error.SystemFdQuotaExceeded, error.FileLocksUnsupported, error.FileBusy, + error.ReadOnlyFileSystem, => return error.ReadFailed, }; errdefer coff_file.close(io); diff --git a/lib/std/zig/system.zig b/lib/std/zig/system.zig @@ -423,6 +423,7 @@ pub fn resolveTargetQuery(io: Io, query: Target.Query) DetectError!Target { error.ConnectionResetByPeer => return error.Unexpected, error.NotOpenForReading => return error.Unexpected, error.SocketUnconnected => return error.Unexpected, + error.ReadOnlyFileSystem => return error.Unexpected, error.AccessDenied, error.SymLinkLoop, @@ -853,6 +854,7 @@ fn glibcVerFromRPath(io: Io, rpath: []const u8) !std.SemanticVersion { error.PathAlreadyExists => return error.Unexpected, // read-only error.DeviceBusy => return error.Unexpected, // read-only error.FileBusy => return error.Unexpected, // read-only + error.ReadOnlyFileSystem => return error.Unexpected, // read-only error.NoDevice => return error.Unexpected, // not asking for a special device error.FileTooBig => return error.Unexpected, error.WouldBlock => return error.Unexpected, // not opened in non-blocking