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:
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