| ... | ... | @@ -220,8 +220,14 @@ pub fn io(t: *Threaded) Io { |
| 220 | 220 | .fileClose = fileClose, |
| 221 | 221 | .fileWriteStreaming = fileWriteStreaming, |
| 222 | 222 | .fileWritePositional = fileWritePositional, |
| 223 | | .fileReadStreaming = fileReadStreaming, |
| 224 | | .fileReadPositional = fileReadPositional, |
| 223 | .fileReadStreaming = switch (builtin.os.tag) { |
| 224 | .windows => fileReadStreamingWindows, |
| 225 | else => fileReadStreamingPosix, |
| 226 | }, |
| 227 | .fileReadPositional = switch (builtin.os.tag) { |
| 228 | .windows => fileReadPositionalWindows, |
| 229 | else => fileReadPositionalPosix, |
| 230 | }, |
| 225 | 231 | .fileSeekBy = fileSeekBy, |
| 226 | 232 | .fileSeekTo = fileSeekTo, |
| 227 | 233 | .openSelfExe = openSelfExe, |
| ... | ... | @@ -258,15 +264,21 @@ pub fn io(t: *Threaded) Io { |
| 258 | 264 | .netConnectUnix = netConnectUnix, |
| 259 | 265 | .netClose = netClose, |
| 260 | 266 | .netRead = switch (builtin.os.tag) { |
| 261 | | .windows => @panic("TODO"), |
| 267 | .windows => netReadWindows, |
| 262 | 268 | else => netReadPosix, |
| 263 | 269 | }, |
| 264 | 270 | .netWrite = switch (builtin.os.tag) { |
| 265 | | .windows => @panic("TODO"), |
| 271 | .windows => netWriteWindows, |
| 266 | 272 | else => netWritePosix, |
| 267 | 273 | }, |
| 268 | | .netSend = netSend, |
| 269 | | .netReceive = netReceive, |
| 274 | .netSend = switch (builtin.os.tag) { |
| 275 | .windows => netSendWindows, |
| 276 | else => netSendPosix, |
| 277 | }, |
| 278 | .netReceive = switch (builtin.os.tag) { |
| 279 | .windows => netReceiveWindows, |
| 280 | else => netReceivePosix, |
| 281 | }, |
| 270 | 282 | .netInterfaceNameResolve = netInterfaceNameResolve, |
| 271 | 283 | .netInterfaceName = netInterfaceName, |
| 272 | 284 | .netLookup = netLookup, |
| ... | ... | @@ -284,6 +296,10 @@ const have_futex = switch (builtin.cpu.arch) { |
| 284 | 296 | .wasm32, .wasm64 => builtin.cpu.has(.wasm, .atomics), |
| 285 | 297 | else => true, |
| 286 | 298 | }; |
| 299 | const have_preadv = switch (native_os) { |
| 300 | .windows, .haiku, .serenity => false, // 💩💩💩 |
| 301 | else => true, |
| 302 | }; |
| 287 | 303 | |
| 288 | 304 | const openat_sym = if (posix.lfs64_abi) posix.system.openat64 else posix.system.openat; |
| 289 | 305 | const fstat_sym = if (posix.lfs64_abi) posix.system.fstat64 else posix.system.fstat; |
| ... | ... | @@ -1899,12 +1915,19 @@ fn dirOpenFileWindows( |
| 1899 | 1915 | flags: Io.File.OpenFlags, |
| 1900 | 1916 | ) Io.File.OpenError!Io.File { |
| 1901 | 1917 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 1902 | | try t.checkCancel(); |
| 1903 | | |
| 1904 | | const w = windows; |
| 1905 | | const sub_path_w_array = try w.sliceToPrefixedFileW(dir.handle, sub_path); |
| 1918 | const sub_path_w_array = try windows.sliceToPrefixedFileW(dir.handle, sub_path); |
| 1906 | 1919 | const sub_path_w = sub_path_w_array.span(); |
| 1920 | return dirOpenFileWindowsInner(t, dir, sub_path_w, flags); |
| 1921 | } |
| 1907 | 1922 | |
| 1923 | fn dirOpenFileWindowsInner( |
| 1924 | t: *Threaded, |
| 1925 | dir: Io.Dir, |
| 1926 | sub_path_w: [:0]const u16, |
| 1927 | flags: Io.File.OpenFlags, |
| 1928 | ) Io.File.OpenError!Io.File { |
| 1929 | try t.checkCancel(); |
| 1930 | const w = windows; |
| 1908 | 1931 | const handle = try w.OpenFile(sub_path_w, .{ |
| 1909 | 1932 | .dir = dir.handle, |
| 1910 | 1933 | .access_mask = w.SYNCHRONIZE | |
| ... | ... | @@ -2247,47 +2270,9 @@ fn fileClose(userdata: ?*anyopaque, file: Io.File) void { |
| 2247 | 2270 | posix.close(file.handle); |
| 2248 | 2271 | } |
| 2249 | 2272 | |
| 2250 | | fn fileReadStreaming(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File.ReadStreamingError!usize { |
| 2273 | fn fileReadStreamingPosix(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File.ReadStreamingError!usize { |
| 2251 | 2274 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 2252 | 2275 | |
| 2253 | | if (is_windows) { |
| 2254 | | const DWORD = windows.DWORD; |
| 2255 | | var index: usize = 0; |
| 2256 | | var truncate: usize = 0; |
| 2257 | | var total: usize = 0; |
| 2258 | | while (index < data.len) { |
| 2259 | | try t.checkCancel(); |
| 2260 | | { |
| 2261 | | const untruncated = data[index]; |
| 2262 | | data[index] = untruncated[truncate..]; |
| 2263 | | defer data[index] = untruncated; |
| 2264 | | const buffer = data[index..]; |
| 2265 | | const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len); |
| 2266 | | var n: DWORD = undefined; |
| 2267 | | if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, null) == 0) { |
| 2268 | | switch (windows.GetLastError()) { |
| 2269 | | .IO_PENDING => |err| return windows.statusBug(err), |
| 2270 | | .OPERATION_ABORTED => continue, |
| 2271 | | .BROKEN_PIPE => return 0, |
| 2272 | | .HANDLE_EOF => return 0, |
| 2273 | | .NETNAME_DELETED => return error.ConnectionResetByPeer, |
| 2274 | | .LOCK_VIOLATION => return error.LockViolation, |
| 2275 | | .ACCESS_DENIED => return error.AccessDenied, |
| 2276 | | .INVALID_HANDLE => return error.NotOpenForReading, |
| 2277 | | else => |err| return windows.unexpectedError(err), |
| 2278 | | } |
| 2279 | | } |
| 2280 | | total += n; |
| 2281 | | truncate += n; |
| 2282 | | } |
| 2283 | | while (index < data.len and truncate >= data[index].len) { |
| 2284 | | truncate -= data[index].len; |
| 2285 | | index += 1; |
| 2286 | | } |
| 2287 | | } |
| 2288 | | return total; |
| 2289 | | } |
| 2290 | | |
| 2291 | 2276 | var iovecs_buffer: [max_iovecs_len]posix.iovec = undefined; |
| 2292 | 2277 | var i: usize = 0; |
| 2293 | 2278 | for (data) |buf| { |
| ... | ... | @@ -2348,70 +2333,37 @@ fn fileReadStreaming(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File |
| 2348 | 2333 | } |
| 2349 | 2334 | } |
| 2350 | 2335 | |
| 2351 | | fn fileReadPositional(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize { |
| 2336 | fn fileReadStreamingWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8) Io.File.ReadStreamingError!usize { |
| 2352 | 2337 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 2338 | try t.checkCancel(); |
| 2353 | 2339 | |
| 2354 | | if (is_windows) { |
| 2355 | | const DWORD = windows.DWORD; |
| 2356 | | const OVERLAPPED = windows.OVERLAPPED; |
| 2357 | | var index: usize = 0; |
| 2358 | | var truncate: usize = 0; |
| 2359 | | var total: usize = 0; |
| 2360 | | while (true) { |
| 2361 | | try t.checkCancel(); |
| 2362 | | { |
| 2363 | | const untruncated = data[index]; |
| 2364 | | data[index] = untruncated[truncate..]; |
| 2365 | | defer data[index] = untruncated; |
| 2366 | | const buffer = data[index..]; |
| 2367 | | const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len); |
| 2368 | | var n: DWORD = undefined; |
| 2369 | | var overlapped_data: OVERLAPPED = undefined; |
| 2370 | | const overlapped: ?*OVERLAPPED = if (offset) |off| blk: { |
| 2371 | | overlapped_data = .{ |
| 2372 | | .Internal = 0, |
| 2373 | | .InternalHigh = 0, |
| 2374 | | .DUMMYUNIONNAME = .{ |
| 2375 | | .DUMMYSTRUCTNAME = .{ |
| 2376 | | .Offset = @as(u32, @truncate(off)), |
| 2377 | | .OffsetHigh = @as(u32, @truncate(off >> 32)), |
| 2378 | | }, |
| 2379 | | }, |
| 2380 | | .hEvent = null, |
| 2381 | | }; |
| 2382 | | break :blk &overlapped_data; |
| 2383 | | } else null; |
| 2384 | | if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, overlapped) == 0) { |
| 2385 | | switch (windows.GetLastError()) { |
| 2386 | | .IO_PENDING => |err| return windows.statusBug(err), |
| 2387 | | .OPERATION_ABORTED => continue, |
| 2388 | | .BROKEN_PIPE => return 0, |
| 2389 | | .HANDLE_EOF => return 0, |
| 2390 | | .NETNAME_DELETED => return error.ConnectionResetByPeer, |
| 2391 | | .LOCK_VIOLATION => return error.LockViolation, |
| 2392 | | .ACCESS_DENIED => return error.AccessDenied, |
| 2393 | | .INVALID_HANDLE => return error.NotOpenForReading, |
| 2394 | | else => |err| return windows.unexpectedError(err), |
| 2395 | | } |
| 2396 | | } |
| 2397 | | total += n; |
| 2398 | | truncate += n; |
| 2399 | | } |
| 2400 | | while (index < data.len and truncate >= data[index].len) { |
| 2401 | | truncate -= data[index].len; |
| 2402 | | index += 1; |
| 2403 | | } |
| 2340 | const DWORD = windows.DWORD; |
| 2341 | var index: usize = 0; |
| 2342 | while (data[index].len == 0) index += 1; |
| 2343 | |
| 2344 | const buffer = data[index]; |
| 2345 | const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len); |
| 2346 | var n: DWORD = undefined; |
| 2347 | if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, null) == 0) { |
| 2348 | switch (windows.GetLastError()) { |
| 2349 | .IO_PENDING => |err| return windows.errorBug(err), |
| 2350 | .OPERATION_ABORTED => return error.Canceled, |
| 2351 | .BROKEN_PIPE => return 0, |
| 2352 | .HANDLE_EOF => return 0, |
| 2353 | .NETNAME_DELETED => return error.ConnectionResetByPeer, |
| 2354 | .LOCK_VIOLATION => return error.LockViolation, |
| 2355 | .ACCESS_DENIED => return error.AccessDenied, |
| 2356 | .INVALID_HANDLE => return error.NotOpenForReading, |
| 2357 | else => |err| return windows.unexpectedError(err), |
| 2404 | 2358 | } |
| 2405 | | return total; |
| 2406 | 2359 | } |
| 2360 | return n; |
| 2361 | } |
| 2407 | 2362 | |
| 2408 | | const have_pread_but_not_preadv = switch (native_os) { |
| 2409 | | .windows, .haiku, .serenity => true, |
| 2410 | | else => false, |
| 2411 | | }; |
| 2412 | | if (have_pread_but_not_preadv) { |
| 2413 | | @compileError("TODO"); |
| 2414 | | } |
| 2363 | fn fileReadPositionalPosix(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize { |
| 2364 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 2365 | |
| 2366 | if (!have_preadv) @compileError("TODO"); |
| 2415 | 2367 | |
| 2416 | 2368 | var iovecs_buffer: [max_iovecs_len]posix.iovec = undefined; |
| 2417 | 2369 | var i: usize = 0; |
| ... | ... | @@ -2480,6 +2432,48 @@ fn fileReadPositional(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset |
| 2480 | 2432 | } |
| 2481 | 2433 | } |
| 2482 | 2434 | |
| 2435 | fn fileReadPositionalWindows(userdata: ?*anyopaque, file: Io.File, data: [][]u8, offset: u64) Io.File.ReadPositionalError!usize { |
| 2436 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 2437 | try t.checkCancel(); |
| 2438 | |
| 2439 | const DWORD = windows.DWORD; |
| 2440 | const OVERLAPPED = windows.OVERLAPPED; |
| 2441 | |
| 2442 | var index: usize = 0; |
| 2443 | while (data[index].len == 0) index += 1; |
| 2444 | |
| 2445 | const buffer = data[index]; |
| 2446 | const want_read_count: DWORD = @min(std.math.maxInt(DWORD), buffer.len); |
| 2447 | var n: DWORD = undefined; |
| 2448 | var overlapped: OVERLAPPED = .{ |
| 2449 | .Internal = 0, |
| 2450 | .InternalHigh = 0, |
| 2451 | .DUMMYUNIONNAME = .{ |
| 2452 | .DUMMYSTRUCTNAME = .{ |
| 2453 | .Offset = @as(u32, @truncate(offset)), |
| 2454 | .OffsetHigh = @as(u32, @truncate(offset >> 32)), |
| 2455 | }, |
| 2456 | }, |
| 2457 | .hEvent = null, |
| 2458 | }; |
| 2459 | |
| 2460 | if (windows.kernel32.ReadFile(file.handle, buffer.ptr, want_read_count, &n, &overlapped) == 0) { |
| 2461 | switch (windows.GetLastError()) { |
| 2462 | .IO_PENDING => |err| return windows.errorBug(err), |
| 2463 | .OPERATION_ABORTED => return error.Canceled, |
| 2464 | .BROKEN_PIPE => return 0, |
| 2465 | .HANDLE_EOF => return 0, |
| 2466 | .NETNAME_DELETED => return error.ConnectionResetByPeer, |
| 2467 | .LOCK_VIOLATION => return error.LockViolation, |
| 2468 | .ACCESS_DENIED => return error.AccessDenied, |
| 2469 | .INVALID_HANDLE => return error.NotOpenForReading, |
| 2470 | else => |err| return windows.unexpectedError(err), |
| 2471 | } |
| 2472 | } |
| 2473 | |
| 2474 | return n; |
| 2475 | } |
| 2476 | |
| 2483 | 2477 | fn fileSeekBy(userdata: ?*anyopaque, file: Io.File, offset: i64) Io.File.SeekError!void { |
| 2484 | 2478 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 2485 | 2479 | try t.checkCancel(); |
| ... | ... | @@ -2563,11 +2557,9 @@ fn openSelfExe(userdata: ?*anyopaque, flags: Io.File.OpenFlags) Io.File.OpenSelf |
| 2563 | 2557 | // the file, we can let the openFileW call follow the symlink for us. |
| 2564 | 2558 | const image_path_unicode_string = &windows.peb().ProcessParameters.ImagePathName; |
| 2565 | 2559 | const image_path_name = image_path_unicode_string.Buffer.?[0 .. image_path_unicode_string.Length / 2 :0]; |
| 2566 | | const prefixed_path_w_array = try windows.wToPrefixedFileW(null, image_path_name); |
| 2567 | | const prefixed_path_w = prefixed_path_w_array.span(); |
| 2568 | 2560 | const cwd_handle = std.os.windows.peb().ProcessParameters.CurrentDirectory.Handle; |
| 2569 | 2561 | |
| 2570 | | return dirOpenFileWindows(t, .{ .handle = cwd_handle }, prefixed_path_w, flags); |
| 2562 | return dirOpenFileWindowsInner(t, .{ .handle = cwd_handle }, image_path_name, flags); |
| 2571 | 2563 | } |
| 2572 | 2564 | @panic("TODO"); |
| 2573 | 2565 | } |
| ... | ... | @@ -3493,7 +3485,16 @@ fn netReadPosix(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net. |
| 3493 | 3485 | } |
| 3494 | 3486 | } |
| 3495 | 3487 | |
| 3496 | | fn netSend( |
| 3488 | fn netReadWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, data: [][]u8) net.Stream.Reader.Error!usize { |
| 3489 | if (!have_networking) return .{ error.NetworkDown, 0 }; |
| 3490 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 3491 | _ = t; |
| 3492 | _ = handle; |
| 3493 | _ = data; |
| 3494 | @panic("TODO"); |
| 3495 | } |
| 3496 | |
| 3497 | fn netSendPosix( |
| 3497 | 3498 | userdata: ?*anyopaque, |
| 3498 | 3499 | handle: net.Socket.Handle, |
| 3499 | 3500 | messages: []net.OutgoingMessage, |
| ... | ... | @@ -3504,9 +3505,9 @@ fn netSend( |
| 3504 | 3505 | |
| 3505 | 3506 | const posix_flags: u32 = |
| 3506 | 3507 | @as(u32, if (@hasDecl(posix.MSG, "CONFIRM") and flags.confirm) posix.MSG.CONFIRM else 0) | |
| 3507 | | @as(u32, if (flags.dont_route) posix.MSG.DONTROUTE else 0) | |
| 3508 | | @as(u32, if (flags.eor) posix.MSG.EOR else 0) | |
| 3509 | | @as(u32, if (flags.oob) posix.MSG.OOB else 0) | |
| 3508 | @as(u32, if (@hasDecl(posix.MSG, "DONTROUTE") and flags.dont_route) posix.MSG.DONTROUTE else 0) | |
| 3509 | @as(u32, if (@hasDecl(posix.MSG, "EOR") and flags.eor) posix.MSG.EOR else 0) | |
| 3510 | @as(u32, if (@hasDecl(posix.MSG, "OOB") and flags.oob) posix.MSG.OOB else 0) | |
| 3510 | 3511 | @as(u32, if (@hasDecl(posix.MSG, "FASTOPEN") and flags.fastopen) posix.MSG.FASTOPEN else 0) | |
| 3511 | 3512 | posix.MSG.NOSIGNAL; |
| 3512 | 3513 | |
| ... | ... | @@ -3522,6 +3523,21 @@ fn netSend( |
| 3522 | 3523 | return .{ null, i }; |
| 3523 | 3524 | } |
| 3524 | 3525 | |
| 3526 | fn netSendWindows( |
| 3527 | userdata: ?*anyopaque, |
| 3528 | handle: net.Socket.Handle, |
| 3529 | messages: []net.OutgoingMessage, |
| 3530 | flags: net.SendFlags, |
| 3531 | ) struct { ?net.Socket.SendError, usize } { |
| 3532 | if (!have_networking) return .{ error.NetworkDown, 0 }; |
| 3533 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 3534 | _ = t; |
| 3535 | _ = handle; |
| 3536 | _ = messages; |
| 3537 | _ = flags; |
| 3538 | @panic("TODO"); |
| 3539 | } |
| 3540 | |
| 3525 | 3541 | fn netSendOne( |
| 3526 | 3542 | t: *Threaded, |
| 3527 | 3543 | handle: net.Socket.Handle, |
| ... | ... | @@ -3676,7 +3692,7 @@ fn netSendMany( |
| 3676 | 3692 | } |
| 3677 | 3693 | } |
| 3678 | 3694 | |
| 3679 | | fn netReceive( |
| 3695 | fn netReceivePosix( |
| 3680 | 3696 | userdata: ?*anyopaque, |
| 3681 | 3697 | handle: net.Socket.Handle, |
| 3682 | 3698 | message_buffer: []net.IncomingMessage, |
| ... | ... | @@ -3805,6 +3821,25 @@ fn netReceive( |
| 3805 | 3821 | } |
| 3806 | 3822 | } |
| 3807 | 3823 | |
| 3824 | fn netReceiveWindows( |
| 3825 | userdata: ?*anyopaque, |
| 3826 | handle: net.Socket.Handle, |
| 3827 | message_buffer: []net.IncomingMessage, |
| 3828 | data_buffer: []u8, |
| 3829 | flags: net.ReceiveFlags, |
| 3830 | timeout: Io.Timeout, |
| 3831 | ) struct { ?net.Socket.ReceiveTimeoutError, usize } { |
| 3832 | if (!have_networking) return .{ error.NetworkDown, 0 }; |
| 3833 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 3834 | _ = t; |
| 3835 | _ = handle; |
| 3836 | _ = message_buffer; |
| 3837 | _ = data_buffer; |
| 3838 | _ = flags; |
| 3839 | _ = timeout; |
| 3840 | @panic("TODO"); |
| 3841 | } |
| 3842 | |
| 3808 | 3843 | fn netWritePosix( |
| 3809 | 3844 | userdata: ?*anyopaque, |
| 3810 | 3845 | fd: net.Socket.Handle, |
| ... | ... | @@ -3887,6 +3922,22 @@ fn netWritePosix( |
| 3887 | 3922 | } |
| 3888 | 3923 | } |
| 3889 | 3924 | |
| 3925 | fn netWriteWindows( |
| 3926 | userdata: ?*anyopaque, |
| 3927 | handle: net.Socket.Handle, |
| 3928 | header: []const u8, |
| 3929 | data: []const []const u8, |
| 3930 | splat: usize, |
| 3931 | ) net.Stream.Writer.Error!usize { |
| 3932 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 3933 | _ = t; |
| 3934 | _ = handle; |
| 3935 | _ = header; |
| 3936 | _ = data; |
| 3937 | _ = splat; |
| 3938 | @panic("TODO"); |
| 3939 | } |
| 3940 | |
| 3890 | 3941 | fn addBuf(v: []posix.iovec_const, i: *@FieldType(posix.msghdr_const, "iovlen"), bytes: []const u8) void { |
| 3891 | 3942 | // OS checks ptr addr before length so zero length vectors must be omitted. |
| 3892 | 3943 | if (bytes.len == 0) return; |
| ... | ... | @@ -3899,7 +3950,7 @@ fn netClose(userdata: ?*anyopaque, handle: net.Socket.Handle) void { |
| 3899 | 3950 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 3900 | 3951 | _ = t; |
| 3901 | 3952 | switch (native_os) { |
| 3902 | | .windows => closeSocketWindows(handle) catch recoverableOsBugDetected(), |
| 3953 | .windows => closeSocketWindows(handle), |
| 3903 | 3954 | else => posix.close(handle), |
| 3904 | 3955 | } |
| 3905 | 3956 | } |
| ... | ... | @@ -4559,7 +4610,7 @@ fn lookupDns( |
| 4559 | 4610 | message_i += 1; |
| 4560 | 4611 | } |
| 4561 | 4612 | } |
| 4562 | | _ = netSend(t, socket.handle, message_buffer[0..message_i], .{}); |
| 4613 | _ = netSendPosix(t, socket.handle, message_buffer[0..message_i], .{}); |
| 4563 | 4614 | } |
| 4564 | 4615 | |
| 4565 | 4616 | const timeout: Io.Timeout = .{ .deadline = .{ |
| ... | ... | @@ -4607,7 +4658,7 @@ fn lookupDns( |
| 4607 | 4658 | .data_ptr = query.ptr, |
| 4608 | 4659 | .data_len = query.len, |
| 4609 | 4660 | }; |
| 4610 | | _ = netSend(t, socket.handle, (&retry_message)[0..1], .{}); |
| 4661 | _ = netSendPosix(t, socket.handle, (&retry_message)[0..1], .{}); |
| 4611 | 4662 | continue; |
| 4612 | 4663 | }, |
| 4613 | 4664 | else => continue, |
| ... | ... | @@ -5157,9 +5208,9 @@ fn closeSocketWindows(s: ws2_32.SOCKET) void { |
| 5157 | 5208 | if (builtin.mode == .Debug) switch (rc) { |
| 5158 | 5209 | 0 => {}, |
| 5159 | 5210 | ws2_32.SOCKET_ERROR => switch (ws2_32.WSAGetLastError()) { |
| 5160 | | else => unreachable, |
| 5211 | else => recoverableOsBugDetected(), |
| 5161 | 5212 | }, |
| 5162 | | else => unreachable, |
| 5213 | else => recoverableOsBugDetected(), |
| 5163 | 5214 | }; |
| 5164 | 5215 | } |
| 5165 | 5216 | |