Zig Version
0.16.0
Steps to Reproduce and Observed Behavior
I forgot to unmount a usbstick and when trying to walk '/' to produce the dir size, i got this error:
unexpected errno: 5
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/posix.zig:1672:40: 0x1029c90 in unexpectedErrno (std.zig)
std.debug.dumpCurrentStackTrace(.{});
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Threaded.zig:1446:37: 0x112ce18 in unexpectedErrno (std.zig)
return posix.unexpectedErrno(err);
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Threaded.zig:5301:57: 0x118ae59 in dirOpenDirPosix (std.zig)
else => |err| return syscall.unexpectedErrno(err),
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:482:32: 0x119127a in openDir (std.zig)
return io.vtable.dirOpenDir(io.userdata, dir, sub_path, options);
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:284:40: 0x11d21bb in enter (std.zig)
var new_dir = entry.dir.openDir(io, entry.basename, .{ .iterate = true }) catch |err| {
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:368:33: 0x11d26e4 in next (std.zig)
try self.inner.enter(io, entry.?);
^
/home/martin/Documents/dug/src/main.zig:25:31: 0x11d2c4e in main (main.zig)
var next = walker.next(io);
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/start.zig:737:30: 0x11d3dae in callMain (std.zig)
return wrapMain(root.main(.{
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/start.zig:190:5: 0x11d20e1 in _start (std.zig)
asm volatile (switch (native_arch) {
^
unexpected errno: 5
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/posix.zig:1672:40: 0x1029c90 in unexpectedErrno (std.zig)
std.debug.dumpCurrentStackTrace(.{});
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Threaded.zig:1446:37: 0x112ce18 in unexpectedErrno (std.zig)
return posix.unexpectedErrno(err);
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Threaded.zig:5301:57: 0x118ae59 in dirOpenDirPosix (std.zig)
else => |err| return syscall.unexpectedErrno(err),
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:482:32: 0x119127a in openDir (std.zig)
return io.vtable.dirOpenDir(io.userdata, dir, sub_path, options);
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:284:40: 0x11d21bb in enter (std.zig)
var new_dir = entry.dir.openDir(io, entry.basename, .{ .iterate = true }) catch |err| {
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:368:33: 0x11d26e4 in next (std.zig)
try self.inner.enter(io, entry.?);
^
/home/martin/Documents/dug/src/main.zig:27:28: 0x11d2cb3 in main (main.zig)
if (walker.next(io)) |res| break :blk res else |err| switch (err) {
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/start.zig:737:30: 0x11d3dae in callMain (std.zig)
return wrapMain(root.main(.{
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/start.zig:190:5: 0x11d20e1 in _start (std.zig)
asm volatile (switch (native_arch) {
^
digging a bit you can see that the IO linux error isn't handled here:
constrc=openat_sym(dir.handle,sub_path_posix,flags,mode);switch(posix.errno(rc)){.SUCCESS=>{syscall.finish();return.{.handle=@intCast(rc)};},.INTR=>{trysyscall.checkCancel();continue;},.INVAL=>returnsyscall.fail(error.BadPathName),.ACCES=>returnsyscall.fail(error.AccessDenied),.LOOP=>returnsyscall.fail(error.SymLinkLoop),.MFILE=>returnsyscall.fail(error.ProcessFdQuotaExceeded),.NAMETOOLONG=>returnsyscall.fail(error.NameTooLong),.NFILE=>returnsyscall.fail(error.SystemFdQuotaExceeded),.NODEV=>returnsyscall.fail(error.NoDevice),.NOENT=>returnsyscall.fail(error.FileNotFound),.NOMEM=>returnsyscall.fail(error.SystemResources),.NOTDIR=>returnsyscall.fail(error.NotDir),.PERM=>returnsyscall.fail(error.PermissionDenied),.NXIO=>returnsyscall.fail(error.NoDevice),.ILSEQ=>returnsyscall.fail(error.BadPathName),.FAULT=>|err|returnsyscall.errnoBug(err),.BADF=>|err|returnsyscall.errnoBug(err),// File descriptor used after closed..BUSY=>|err|returnsyscall.errnoBug(err),// O_EXCL not passedelse=>|err|returnsyscall.unexpectedErrno(err),
Expected Behavior
I would expect the IO error to be expected here.
### Zig Version
0.16.0
### Steps to Reproduce and Observed Behavior
I forgot to unmount a usbstick and when trying to walk '/' to produce the dir size, i got this error:
```
unexpected errno: 5
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/posix.zig:1672:40: 0x1029c90 in unexpectedErrno (std.zig)
std.debug.dumpCurrentStackTrace(.{});
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Threaded.zig:1446:37: 0x112ce18 in unexpectedErrno (std.zig)
return posix.unexpectedErrno(err);
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Threaded.zig:5301:57: 0x118ae59 in dirOpenDirPosix (std.zig)
else => |err| return syscall.unexpectedErrno(err),
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:482:32: 0x119127a in openDir (std.zig)
return io.vtable.dirOpenDir(io.userdata, dir, sub_path, options);
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:284:40: 0x11d21bb in enter (std.zig)
var new_dir = entry.dir.openDir(io, entry.basename, .{ .iterate = true }) catch |err| {
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:368:33: 0x11d26e4 in next (std.zig)
try self.inner.enter(io, entry.?);
^
/home/martin/Documents/dug/src/main.zig:25:31: 0x11d2c4e in main (main.zig)
var next = walker.next(io);
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/start.zig:737:30: 0x11d3dae in callMain (std.zig)
return wrapMain(root.main(.{
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/start.zig:190:5: 0x11d20e1 in _start (std.zig)
asm volatile (switch (native_arch) {
^
unexpected errno: 5
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/posix.zig:1672:40: 0x1029c90 in unexpectedErrno (std.zig)
std.debug.dumpCurrentStackTrace(.{});
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Threaded.zig:1446:37: 0x112ce18 in unexpectedErrno (std.zig)
return posix.unexpectedErrno(err);
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Threaded.zig:5301:57: 0x118ae59 in dirOpenDirPosix (std.zig)
else => |err| return syscall.unexpectedErrno(err),
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:482:32: 0x119127a in openDir (std.zig)
return io.vtable.dirOpenDir(io.userdata, dir, sub_path, options);
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:284:40: 0x11d21bb in enter (std.zig)
var new_dir = entry.dir.openDir(io, entry.basename, .{ .iterate = true }) catch |err| {
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/Io/Dir.zig:368:33: 0x11d26e4 in next (std.zig)
try self.inner.enter(io, entry.?);
^
/home/martin/Documents/dug/src/main.zig:27:28: 0x11d2cb3 in main (main.zig)
if (walker.next(io)) |res| break :blk res else |err| switch (err) {
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/start.zig:737:30: 0x11d3dae in callMain (std.zig)
return wrapMain(root.main(.{
^
/nix/store/5x5y75rc3l43ic0lwal6wzk7wi1ga3m1-zig-0.16.0/lib/zig/std/start.zig:190:5: 0x11d20e1 in _start (std.zig)
asm volatile (switch (native_arch) {
^
```
digging a bit you can see that the `IO` linux error isn't handled here:
```zig
const rc = openat_sym(dir.handle, sub_path_posix, flags, mode);
switch (posix.errno(rc)) {
.SUCCESS => {
syscall.finish();
return .{ .handle = @intCast(rc) };
},
.INTR => {
try syscall.checkCancel();
continue;
},
.INVAL => return syscall.fail(error.BadPathName),
.ACCES => return syscall.fail(error.AccessDenied),
.LOOP => return syscall.fail(error.SymLinkLoop),
.MFILE => return syscall.fail(error.ProcessFdQuotaExceeded),
.NAMETOOLONG => return syscall.fail(error.NameTooLong),
.NFILE => return syscall.fail(error.SystemFdQuotaExceeded),
.NODEV => return syscall.fail(error.NoDevice),
.NOENT => return syscall.fail(error.FileNotFound),
.NOMEM => return syscall.fail(error.SystemResources),
.NOTDIR => return syscall.fail(error.NotDir),
.PERM => return syscall.fail(error.PermissionDenied),
.NXIO => return syscall.fail(error.NoDevice),
.ILSEQ => return syscall.fail(error.BadPathName),
.FAULT => |err| return syscall.errnoBug(err),
.BADF => |err| return syscall.errnoBug(err), // File descriptor used after closed.
.BUSY => |err| return syscall.errnoBug(err), // O_EXCL not passed
else => |err| return syscall.unexpectedErrno(err),
```
### Expected Behavior
I would expect the `IO` error to be expected here.