authorgravatar for johnnymarler@gmail.comJonathan Marler <johnnymarler@gmail.com> 2026-03-21 09:57:05-06:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-04-02 15:05:31+02:00
logf4eecf8d7d4026a9e0ab8986b1c049ad2a0e01fc
tree15bd373d3ed8ca5c036b2ab18b84f07f1db0c679
parent6cdd576d4176c2581f796c2066ca0f92bda03c9e

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.

6 files changed, 9 insertions(+), 0 deletions(-)

lib/std/Io/Dispatch.zig+2
......@@ -2512,6 +2512,7 @@ fn dirCreateFile(
25122512 .OPNOTSUPP => return error.FileLocksUnsupported,
25132513 .AGAIN => return error.WouldBlock,
25142514 .TXTBSY => return error.FileBusy,
2515 .ROFS => return error.ReadOnlyFileSystem,
25152516 .NXIO => return error.NoDevice,
25162517 .ILSEQ => return error.BadPathName,
25172518 else => |err| return unexpectedErrno(err),
......@@ -2647,6 +2648,7 @@ fn dirOpenFile(
26472648 .AGAIN => return error.WouldBlock,
26482649 .TXTBSY => return error.FileBusy,
26492650 .NXIO => return error.NoDevice,
2651 .ROFS => return error.ReadOnlyFileSystem,
26502652 .ILSEQ => return error.BadPathName,
26512653 else => |err| return unexpectedErrno(err),
26522654 }
lib/std/Io/File.zig+1
......@@ -202,6 +202,7 @@ pub const OpenError = error{
202202 NotDir,
203203 /// The path already exists and the `CREAT` and `EXCL` flags were provided.
204204 PathAlreadyExists,
205 ReadOnlyFileSystem,
205206 DeviceBusy,
206207 FileLocksUnsupported,
207208 /// One of these three things:
lib/std/Io/Threaded.zig+2
......@@ -4290,6 +4290,7 @@ fn dirCreateFilePosix(
42904290 .AGAIN => return error.WouldBlock,
42914291 .TXTBSY => return error.FileBusy,
42924292 .NXIO => return error.NoDevice,
4293 .ROFS => return error.ReadOnlyFileSystem,
42934294 .ILSEQ => return error.BadPathName,
42944295 else => |err| return posix.unexpectedErrno(err),
42954296 }
......@@ -4871,6 +4872,7 @@ fn dirOpenFilePosix(
48714872 .AGAIN => return error.WouldBlock,
48724873 .TXTBSY => return error.FileBusy,
48734874 .NXIO => return error.NoDevice,
4875 .ROFS => return error.ReadOnlyFileSystem,
48744876 .ILSEQ => return error.BadPathName,
48754877 else => |err| return posix.unexpectedErrno(err),
48764878 }
lib/std/Io/Uring.zig+1
......@@ -5673,6 +5673,7 @@ fn openat(
56735673 .AGAIN => return error.WouldBlock,
56745674 .TXTBSY => return error.FileBusy,
56755675 .NXIO => return error.NoDevice,
5676 .ROFS => return error.ReadOnlyFileSystem,
56765677 .ILSEQ => return error.BadPathName,
56775678 else => |err| return unexpectedErrno(err),
56785679 }
lib/std/debug/SelfInfo/Windows.zig+1
......@@ -360,6 +360,7 @@ const Module = struct {
360360 error.SystemFdQuotaExceeded,
361361 error.FileLocksUnsupported,
362362 error.FileBusy,
363 error.ReadOnlyFileSystem,
363364 => return error.ReadFailed,
364365 };
365366 errdefer coff_file.close(io);
lib/std/zig/system.zig+2
......@@ -423,6 +423,7 @@ pub fn resolveTargetQuery(io: Io, query: Target.Query) DetectError!Target {
423423 error.ConnectionResetByPeer => return error.Unexpected,
424424 error.NotOpenForReading => return error.Unexpected,
425425 error.SocketUnconnected => return error.Unexpected,
426 error.ReadOnlyFileSystem => return error.Unexpected,
426427
427428 error.AccessDenied,
428429 error.SymLinkLoop,
......@@ -853,6 +854,7 @@ fn glibcVerFromRPath(io: Io, rpath: []const u8) !std.SemanticVersion {
853854 error.PathAlreadyExists => return error.Unexpected, // read-only
854855 error.DeviceBusy => return error.Unexpected, // read-only
855856 error.FileBusy => return error.Unexpected, // read-only
857 error.ReadOnlyFileSystem => return error.Unexpected, // read-only
856858 error.NoDevice => return error.Unexpected, // not asking for a special device
857859 error.FileTooBig => return error.Unexpected,
858860 error.WouldBlock => return error.Unexpected, // not opened in non-blocking