diff options
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/Io/Threaded.zig | 19 | ||||
| -rw-r--r-- | lib/std/posix.zig | 3 | ||||
| -rw-r--r-- | lib/std/process/Child.zig | 16 |
3 files changed, 22 insertions, 16 deletions
diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index fbbd9a985c..a567878b82 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -211,7 +211,6 @@ pub fn io(t: *Threaded) Io { else => dirOpenFilePosix, }, .dirOpenDir = switch (builtin.os.tag) { - .windows => dirOpenDirWindows, .wasi => dirOpenDirWasi, .haiku => dirOpenDirHaiku, else => dirOpenDirPosix, @@ -2035,6 +2034,11 @@ fn dirOpenDirPosix( ) Io.Dir.OpenError!Io.Dir { const t: *Threaded = @ptrCast(@alignCast(userdata)); + if (is_windows) { + const sub_path_w = try windows.sliceToPrefixedFileW(dir.handle, sub_path); + return dirOpenDirWindows(t, dir, sub_path_w.span(), options); + } + var path_buffer: [posix.PATH_MAX]u8 = undefined; const sub_path_posix = try pathToPosix(sub_path, &path_buffer); @@ -2123,19 +2127,13 @@ fn dirOpenDirHaiku( } } -fn dirOpenDirWindows( - userdata: ?*anyopaque, +pub fn dirOpenDirWindows( + t: *Io.Threaded, dir: Io.Dir, - sub_path: []const u8, + sub_path_w: [:0]const u16, options: Io.Dir.OpenOptions, ) Io.Dir.OpenError!Io.Dir { - const t: *Threaded = @ptrCast(@alignCast(userdata)); - try t.checkCancel(); - const w = windows; - const sub_path_w_array = try w.sliceToPrefixedFileW(dir.handle, sub_path); - const sub_path_w = sub_path_w_array.span(); - // TODO remove some of these flags if options.access_sub_paths is false const base_flags = w.STANDARD_RIGHTS_READ | w.FILE_READ_ATTRIBUTES | w.FILE_READ_EA | w.SYNCHRONIZE | w.FILE_TRAVERSE; @@ -2158,6 +2156,7 @@ fn dirOpenDirWindows( const open_reparse_point: w.DWORD = if (!options.follow_symlinks) w.FILE_OPEN_REPARSE_POINT else 0x0; var io_status_block: w.IO_STATUS_BLOCK = undefined; var result: Io.Dir = .{ .handle = undefined }; + try t.checkCancel(); const rc = w.ntdll.NtCreateFile( &result.handle, access_mask, diff --git a/lib/std/posix.zig b/lib/std/posix.zig index bb556be133..f708dfeaba 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -3769,7 +3769,6 @@ pub fn connect(sock: socket_t, sock_addr: *const sockaddr, len: socklen_t) Conne .SUCCESS => return, .ACCES => return error.AccessDenied, .PERM => return error.PermissionDenied, - .ADDRINUSE => return error.AddressInUse, .ADDRNOTAVAIL => return error.AddressUnavailable, .AFNOSUPPORT => return error.AddressFamilyUnsupported, .AGAIN, .INPROGRESS => return error.WouldBlock, @@ -3779,7 +3778,7 @@ pub fn connect(sock: socket_t, sock_addr: *const sockaddr, len: socklen_t) Conne .CONNRESET => return error.ConnectionResetByPeer, .FAULT => unreachable, // The socket structure address is outside the user's address space. .INTR => continue, - .ISCONN => return error.AlreadyConnected, // The socket is already connected. + .ISCONN => @panic("AlreadyConnected"), // The socket is already connected. .HOSTUNREACH => return error.NetworkUnreachable, .NETUNREACH => return error.NetworkUnreachable, .NOTSOCK => unreachable, // The file descriptor sockfd does not refer to a socket. diff --git a/lib/std/process/Child.zig b/lib/std/process/Child.zig index 7ca919ca46..e49c5c4532 100644 --- a/lib/std/process/Child.zig +++ b/lib/std/process/Child.zig @@ -1084,16 +1084,24 @@ fn windowsCreateProcessPathExt( // or a version with a supported PATHEXT appended. We then try calling CreateProcessW // with the found versions in the appropriate order. + // In the future, child process execution needs to move to Io implementation. + // Under those conditions, here we will have access to lower level directory + // opening function knowing which implementation we are in. Here, we imitate + // that scenario. + var threaded: std.Io.Threaded = .init_single_threaded; + const io = threaded.io(); + var dir = dir: { // needs to be null-terminated try dir_buf.append(allocator, 0); defer dir_buf.shrinkRetainingCapacity(dir_path_len); const dir_path_z = dir_buf.items[0 .. dir_buf.items.len - 1 :0]; const prefixed_path = try windows.wToPrefixedFileW(null, dir_path_z); - break :dir fs.cwd().openDirW(prefixed_path.span().ptr, .{ .iterate = true }) catch - return error.FileNotFound; + break :dir threaded.dirOpenDirWindows(.cwd(), prefixed_path.span(), .{ + .iterate = true, + }) catch return error.FileNotFound; }; - defer dir.close(); + defer dir.close(io); // Add wildcard and null-terminator try app_buf.append(allocator, '*'); @@ -1127,7 +1135,7 @@ fn windowsCreateProcessPathExt( .Buffer = @constCast(app_name_wildcard.ptr), }; const rc = windows.ntdll.NtQueryDirectoryFile( - dir.fd, + dir.handle, null, null, null, |
