diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index 1d137ebe85..4f2582885b 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -193,7 +193,11 @@ pub fn io(t: *Threaded) Io { .wasi => dirCreateFileWasi, else => dirCreateFilePosix, }, - .dirOpenFile = dirOpenFile, + .dirOpenFile = switch (builtin.os.tag) { + .windows => @panic("TODO"), + .wasi => dirOpenFileWasi, + else => dirOpenFilePosix, + }, .fileClose = fileClose, .fileWriteStreaming = fileWriteStreaming, .fileWritePositional = fileWritePositional, @@ -1451,7 +1455,7 @@ fn dirCreateFileWasi( } } -fn dirOpenFile( +fn dirOpenFilePosix( userdata: ?*anyopaque, dir: Io.Dir, sub_path: []const u8, @@ -1584,6 +1588,74 @@ fn dirOpenFile( return .{ .handle = fd }; } +fn dirOpenFileWasi( + userdata: ?*anyopaque, + dir: Io.Dir, + sub_path: []const u8, + flags: Io.File.OpenFlags, +) Io.File.OpenError!Io.File { + if (builtin.link_libc) return dirOpenFilePosix(userdata, dir, sub_path, flags); + const t: *Threaded = @ptrCast(@alignCast(userdata)); + const wasi = std.os.wasi; + var base: std.os.wasi.rights_t = .{}; + // POLL_FD_READWRITE only grants extra rights if the corresponding FD_READ and/or FD_WRITE + // is also set. + if (flags.isRead()) { + base.FD_READ = true; + base.FD_TELL = true; + base.FD_SEEK = true; + base.FD_FILESTAT_GET = true; + base.POLL_FD_READWRITE = true; + } + if (flags.isWrite()) { + base.FD_WRITE = true; + base.FD_TELL = true; + base.FD_SEEK = true; + base.FD_DATASYNC = true; + base.FD_FDSTAT_SET_FLAGS = true; + base.FD_SYNC = true; + base.FD_ALLOCATE = true; + base.FD_ADVISE = true; + base.FD_FILESTAT_SET_TIMES = true; + base.FD_FILESTAT_SET_SIZE = true; + base.POLL_FD_READWRITE = true; + } + const lookup_flags: wasi.lookupflags_t = .{}; + const oflags: wasi.oflags_t = .{}; + const inheriting: wasi.rights_t = .{}; + const fdflags: wasi.fdflags_t = .{}; + var fd: posix.fd_t = undefined; + while (true) { + try t.checkCancel(); + switch (wasi.path_open(dir.handle, lookup_flags, sub_path.ptr, sub_path.len, oflags, base, inheriting, fdflags, &fd)) { + .SUCCESS => return .{ .handle = fd }, + .INTR => continue, + .CANCELED => return error.Canceled, + + .FAULT => |err| return errnoBug(err), + .BADF => |err| return errnoBug(err), // File descriptor used after closed. + .ACCES => return error.AccessDenied, + .FBIG => return error.FileTooBig, + .OVERFLOW => return error.FileTooBig, + .ISDIR => return error.IsDir, + .LOOP => return error.SymLinkLoop, + .MFILE => return error.ProcessFdQuotaExceeded, + .NFILE => return error.SystemFdQuotaExceeded, + .NODEV => return error.NoDevice, + .NOENT => return error.FileNotFound, + .NOMEM => return error.SystemResources, + .NOTDIR => return error.NotDir, + .PERM => return error.PermissionDenied, + .BUSY => return error.DeviceBusy, + .NOTCAPABLE => return error.AccessDenied, + .NAMETOOLONG => return error.NameTooLong, + .INVAL => return error.BadPathName, + .ILSEQ => return error.BadPathName, + else => |err| return posix.unexpectedErrno(err), + } + } +} + fn fileClose(userdata: ?*anyopaque, file: Io.File) void { const t: *Threaded = @ptrCast(@alignCast(userdata)); _ = t; @@ -3319,7 +3391,7 @@ fn clockToPosix(clock: Io.Clock) posix.clockid_t { fn clockToWasi(clock: Io.Clock) std.os.wasi.clockid_t { return switch (clock) { - .realtime => .REALTIME, + .real => .REALTIME, .awake => .MONOTONIC, .boot => .MONOTONIC, .cpu_process => .PROCESS_CPUTIME_ID, diff --git a/lib/std/fs/Dir.zig b/lib/std/fs/Dir.zig index 6da4bab684..615c63efa6 100644 --- a/lib/std/fs/Dir.zig +++ b/lib/std/fs/Dir.zig @@ -858,33 +858,6 @@ pub fn openFile(self: Dir, sub_path: []const u8, flags: File.OpenFlags) File.Ope const path_w = try windows.sliceToPrefixedFileW(self.fd, sub_path); return self.openFileW(path_w.span(), flags); } - if (native_os == .wasi and !builtin.link_libc) { - var base: std.os.wasi.rights_t = .{}; - // POLL_FD_READWRITE only grants extra rights if the corresponding FD_READ and/or FD_WRITE - // is also set. - if (flags.isRead()) { - base.FD_READ = true; - base.FD_TELL = true; - base.FD_SEEK = true; - base.FD_FILESTAT_GET = true; - base.POLL_FD_READWRITE = true; - } - if (flags.isWrite()) { - base.FD_WRITE = true; - base.FD_TELL = true; - base.FD_SEEK = true; - base.FD_DATASYNC = true; - base.FD_FDSTAT_SET_FLAGS = true; - base.FD_SYNC = true; - base.FD_ALLOCATE = true; - base.FD_ADVISE = true; - base.FD_FILESTAT_SET_TIMES = true; - base.FD_FILESTAT_SET_SIZE = true; - base.POLL_FD_READWRITE = true; - } - const fd = try posix.openatWasi(self.fd, sub_path, .{}, .{}, .{}, base, .{}); - return .{ .handle = fd }; - } var threaded: Io.Threaded = .init_single_threaded; const io = threaded.io(); return .adaptFromNewApi(try Io.Dir.openFile(self.adaptToNewApi(), io, sub_path, flags)); diff --git a/lib/std/fs/test.zig b/lib/std/fs/test.zig index 052afc3a02..a20be08fcb 100644 --- a/lib/std/fs/test.zig +++ b/lib/std/fs/test.zig @@ -1407,7 +1407,7 @@ test "setEndPos" { try f.setEndPos(initial_size); try testing.expectEqual(initial_size, try f.getEndPos()); try reader.seekTo(0); - try testing.expectEqual(initial_size, reader.interface.readSliceShort(&buffer)); + try testing.expectEqual(initial_size, try reader.interface.readSliceShort(&buffer)); try testing.expectEqualStrings("ninebytes", buffer[0..@intCast(initial_size)]); } @@ -1416,7 +1416,7 @@ test "setEndPos" { try f.setEndPos(larger); try testing.expectEqual(larger, try f.getEndPos()); try reader.seekTo(0); - try testing.expectEqual(larger, reader.interface.readSliceShort(&buffer)); + try testing.expectEqual(larger, try reader.interface.readSliceShort(&buffer)); try testing.expectEqualStrings("ninebytes\x00\x00\x00\x00", buffer[0..@intCast(larger)]); }