| ... | ... | @@ -1496,6 +1496,18 @@ const AlertableSyscall = struct { |
| 1496 | 1496 | s.finish(); |
| 1497 | 1497 | return windows.unexpectedStatus(status); |
| 1498 | 1498 | } |
| 1499 | |
| 1500 | fn unexpectedWsaError(s: AlertableSyscall, err: ws2_32.WinsockError) Io.UnexpectedError { |
| 1501 | @branchHint(.cold); |
| 1502 | s.finish(); |
| 1503 | return windows.unexpectedWsaError(err); |
| 1504 | } |
| 1505 | |
| 1506 | fn wsaErrorBug(s: AlertableSyscall, err: ws2_32.WinsockError) Io.UnexpectedError { |
| 1507 | @branchHint(.cold); |
| 1508 | s.finish(); |
| 1509 | return windows.wsaErrorBug(err); |
| 1510 | } |
| 1499 | 1511 | }; |
| 1500 | 1512 | |
| 1501 | 1513 | pub fn waitForApcOrAlert() void { |
| ... | ... | @@ -11692,7 +11704,7 @@ fn netListenIpWindows( |
| 11692 | 11704 | var storage: WsaAddress = undefined; |
| 11693 | 11705 | var addr_len = addressToWsa(&address, &storage); |
| 11694 | 11706 | |
| 11695 | | var syscall: Syscall = try .start(); |
| 11707 | var syscall: AlertableSyscall = try .start(); |
| 11696 | 11708 | while (true) { |
| 11697 | 11709 | const rc = ws2_32.bind(socket_handle, &storage.any, addr_len); |
| 11698 | 11710 | if (rc != ws2_32.SOCKET_ERROR) { |
| ... | ... | @@ -11710,19 +11722,14 @@ fn netListenIpWindows( |
| 11710 | 11722 | try syscall.checkCancel(); |
| 11711 | 11723 | continue; |
| 11712 | 11724 | }, |
| 11713 | | else => |e| { |
| 11714 | | syscall.finish(); |
| 11715 | | switch (e) { |
| 11716 | | .EADDRINUSE => return error.AddressInUse, |
| 11717 | | .EADDRNOTAVAIL => return error.AddressUnavailable, |
| 11718 | | .ENOTSOCK => |err| return wsaErrorBug(err), |
| 11719 | | .EFAULT => |err| return wsaErrorBug(err), |
| 11720 | | .EINVAL => |err| return wsaErrorBug(err), |
| 11721 | | .ENOBUFS => return error.SystemResources, |
| 11722 | | .ENETDOWN => return error.NetworkDown, |
| 11723 | | else => |err| return windows.unexpectedWSAError(err), |
| 11724 | | } |
| 11725 | | }, |
| 11725 | .EADDRINUSE => return syscall.fail(error.AddressInUse), |
| 11726 | .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable), |
| 11727 | .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 11728 | .EFAULT => |err| return syscall.wsaErrorBug(err), |
| 11729 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 11730 | .ENOBUFS => return syscall.fail(error.SystemResources), |
| 11731 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 11732 | else => |err| return syscall.unexpectedWsaError(err), |
| 11726 | 11733 | } |
| 11727 | 11734 | } |
| 11728 | 11735 | |
| ... | ... | @@ -11744,20 +11751,15 @@ fn netListenIpWindows( |
| 11744 | 11751 | try syscall.checkCancel(); |
| 11745 | 11752 | continue; |
| 11746 | 11753 | }, |
| 11747 | | else => |e| { |
| 11748 | | syscall.finish(); |
| 11749 | | switch (e) { |
| 11750 | | .ENETDOWN => return error.NetworkDown, |
| 11751 | | .EADDRINUSE => return error.AddressInUse, |
| 11752 | | .EISCONN => |err| return wsaErrorBug(err), |
| 11753 | | .EINVAL => |err| return wsaErrorBug(err), |
| 11754 | | .EMFILE, .ENOBUFS => return error.SystemResources, |
| 11755 | | .ENOTSOCK => |err| return wsaErrorBug(err), |
| 11756 | | .EOPNOTSUPP => |err| return wsaErrorBug(err), |
| 11757 | | .EINPROGRESS => |err| return wsaErrorBug(err), |
| 11758 | | else => |err| return windows.unexpectedWSAError(err), |
| 11759 | | } |
| 11760 | | }, |
| 11754 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 11755 | .EADDRINUSE => return syscall.fail(error.AddressInUse), |
| 11756 | .EMFILE, .ENOBUFS => return syscall.fail(error.SystemResources), |
| 11757 | .EISCONN => |err| return syscall.wsaErrorBug(err), |
| 11758 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 11759 | .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 11760 | .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err), |
| 11761 | .EINPROGRESS => |err| return syscall.wsaErrorBug(err), |
| 11762 | else => |err| return syscall.unexpectedWsaError(err), |
| 11761 | 11763 | } |
| 11762 | 11764 | } |
| 11763 | 11765 | |
| ... | ... | @@ -11841,7 +11843,7 @@ fn netListenUnixWindows( |
| 11841 | 11843 | var storage: WsaAddress = undefined; |
| 11842 | 11844 | const addr_len = addressUnixToWsa(address, &storage); |
| 11843 | 11845 | |
| 11844 | | var syscall: Syscall = try .start(); |
| 11846 | var syscall: AlertableSyscall = try .start(); |
| 11845 | 11847 | while (true) { |
| 11846 | 11848 | const rc = ws2_32.bind(socket_handle, &storage.any, addr_len); |
| 11847 | 11849 | if (rc != ws2_32.SOCKET_ERROR) break; |
| ... | ... | @@ -11856,19 +11858,14 @@ fn netListenUnixWindows( |
| 11856 | 11858 | try syscall.checkCancel(); |
| 11857 | 11859 | continue; |
| 11858 | 11860 | }, |
| 11859 | | else => |e| { |
| 11860 | | syscall.finish(); |
| 11861 | | switch (e) { |
| 11862 | | .EADDRINUSE => return error.AddressInUse, |
| 11863 | | .EADDRNOTAVAIL => return error.AddressUnavailable, |
| 11864 | | .ENOTSOCK => |err| return wsaErrorBug(err), |
| 11865 | | .EFAULT => |err| return wsaErrorBug(err), |
| 11866 | | .EINVAL => |err| return wsaErrorBug(err), |
| 11867 | | .ENOBUFS => return error.SystemResources, |
| 11868 | | .ENETDOWN => return error.NetworkDown, |
| 11869 | | else => |err| return windows.unexpectedWSAError(err), |
| 11870 | | } |
| 11871 | | }, |
| 11861 | .EADDRINUSE => return syscall.fail(error.AddressInUse), |
| 11862 | .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable), |
| 11863 | .ENOBUFS => return syscall.fail(error.SystemResources), |
| 11864 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 11865 | .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 11866 | .EFAULT => |err| return syscall.wsaErrorBug(err), |
| 11867 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 11868 | else => |err| return syscall.unexpectedWsaError(err), |
| 11872 | 11869 | } |
| 11873 | 11870 | } |
| 11874 | 11871 | |
| ... | ... | @@ -11887,20 +11884,15 @@ fn netListenUnixWindows( |
| 11887 | 11884 | syscall = try .start(); |
| 11888 | 11885 | continue; |
| 11889 | 11886 | }, |
| 11890 | | else => |e| { |
| 11891 | | syscall.finish(); |
| 11892 | | switch (e) { |
| 11893 | | .ENETDOWN => return error.NetworkDown, |
| 11894 | | .EADDRINUSE => return error.AddressInUse, |
| 11895 | | .EISCONN => |err| return wsaErrorBug(err), |
| 11896 | | .EINVAL => |err| return wsaErrorBug(err), |
| 11897 | | .EMFILE, .ENOBUFS => return error.SystemResources, |
| 11898 | | .ENOTSOCK => |err| return wsaErrorBug(err), |
| 11899 | | .EOPNOTSUPP => |err| return wsaErrorBug(err), |
| 11900 | | .EINPROGRESS => |err| return wsaErrorBug(err), |
| 11901 | | else => |err| return windows.unexpectedWSAError(err), |
| 11902 | | } |
| 11903 | | }, |
| 11887 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 11888 | .EADDRINUSE => return syscall.fail(error.AddressInUse), |
| 11889 | .EMFILE, .ENOBUFS => return syscall.fail(error.SystemResources), |
| 11890 | .EISCONN => |err| return syscall.wsaErrorBug(err), |
| 11891 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 11892 | .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 11893 | .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err), |
| 11894 | .EINPROGRESS => |err| return syscall.wsaErrorBug(err), |
| 11895 | else => |err| return syscall.unexpectedWsaError(err), |
| 11904 | 11896 | } |
| 11905 | 11897 | } |
| 11906 | 11898 | } |
| ... | ... | @@ -12111,7 +12103,7 @@ fn wsaGetSockName( |
| 12111 | 12103 | addr: *ws2_32.sockaddr, |
| 12112 | 12104 | addr_len: *i32, |
| 12113 | 12105 | ) !void { |
| 12114 | | var syscall: Syscall = try .start(); |
| 12106 | var syscall: AlertableSyscall = try .start(); |
| 12115 | 12107 | while (true) { |
| 12116 | 12108 | const rc = ws2_32.getsockname(handle, addr, addr_len); |
| 12117 | 12109 | if (rc != ws2_32.SOCKET_ERROR) { |
| ... | ... | @@ -12129,16 +12121,11 @@ fn wsaGetSockName( |
| 12129 | 12121 | syscall = try .start(); |
| 12130 | 12122 | continue; |
| 12131 | 12123 | }, |
| 12132 | | else => |e| { |
| 12133 | | syscall.finish(); |
| 12134 | | switch (e) { |
| 12135 | | .ENETDOWN => return error.NetworkDown, |
| 12136 | | .EFAULT => |err| return wsaErrorBug(err), |
| 12137 | | .ENOTSOCK => |err| return wsaErrorBug(err), |
| 12138 | | .EINVAL => |err| return wsaErrorBug(err), |
| 12139 | | else => |err| return windows.unexpectedWSAError(err), |
| 12140 | | } |
| 12141 | | }, |
| 12124 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 12125 | .EFAULT => |err| return syscall.wsaErrorBug(err), |
| 12126 | .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 12127 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 12128 | else => |err| return syscall.unexpectedWsaError(err), |
| 12142 | 12129 | } |
| 12143 | 12130 | } |
| 12144 | 12131 | } |
| ... | ... | @@ -12172,7 +12159,7 @@ fn setSocketOption(fd: posix.fd_t, level: i32, opt_name: u32, option: u32) !void |
| 12172 | 12159 | |
| 12173 | 12160 | fn setSocketOptionWsa(t: *Threaded, socket: Io.net.Socket.Handle, level: i32, opt_name: u32, option: u32) !void { |
| 12174 | 12161 | const o: []const u8 = @ptrCast(&option); |
| 12175 | | var syscall: Syscall = try .start(); |
| 12162 | var syscall: AlertableSyscall = try .start(); |
| 12176 | 12163 | const rc = ws2_32.setsockopt(socket, level, @bitCast(opt_name), o.ptr, @intCast(o.len)); |
| 12177 | 12164 | while (true) { |
| 12178 | 12165 | if (rc != ws2_32.SOCKET_ERROR) return syscall.finish(); |
| ... | ... | @@ -12188,14 +12175,8 @@ fn setSocketOptionWsa(t: *Threaded, socket: Io.net.Socket.Handle, level: i32, op |
| 12188 | 12175 | continue; |
| 12189 | 12176 | }, |
| 12190 | 12177 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 12191 | | .EFAULT, .ENOTSOCK, .EINVAL => |err| { |
| 12192 | | syscall.finish(); |
| 12193 | | return wsaErrorBug(err); |
| 12194 | | }, |
| 12195 | | else => |err| { |
| 12196 | | syscall.finish(); |
| 12197 | | return windows.unexpectedWSAError(err); |
| 12198 | | }, |
| 12178 | .EFAULT, .ENOTSOCK, .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 12179 | else => |err| return syscall.unexpectedWsaError(err), |
| 12199 | 12180 | } |
| 12200 | 12181 | } |
| 12201 | 12182 | } |
| ... | ... | @@ -12243,7 +12224,7 @@ fn netConnectIpWindows( |
| 12243 | 12224 | var storage: WsaAddress = undefined; |
| 12244 | 12225 | var addr_len = addressToWsa(address, &storage); |
| 12245 | 12226 | |
| 12246 | | var syscall: Syscall = try .start(); |
| 12227 | var syscall: AlertableSyscall = try .start(); |
| 12247 | 12228 | while (true) { |
| 12248 | 12229 | const rc = ws2_32.connect(socket_handle, &storage.any, addr_len); |
| 12249 | 12230 | if (rc != ws2_32.SOCKET_ERROR) { |
| ... | ... | @@ -12261,26 +12242,21 @@ fn netConnectIpWindows( |
| 12261 | 12242 | syscall = try .start(); |
| 12262 | 12243 | continue; |
| 12263 | 12244 | }, |
| 12264 | | else => |e| { |
| 12265 | | syscall.finish(); |
| 12266 | | switch (e) { |
| 12267 | | .EADDRNOTAVAIL => return error.AddressUnavailable, |
| 12268 | | .ECONNREFUSED => return error.ConnectionRefused, |
| 12269 | | .ECONNRESET => return error.ConnectionResetByPeer, |
| 12270 | | .ETIMEDOUT => return error.Timeout, |
| 12271 | | .EHOSTUNREACH => return error.HostUnreachable, |
| 12272 | | .ENETUNREACH => return error.NetworkUnreachable, |
| 12273 | | .EFAULT => |err| return wsaErrorBug(err), |
| 12274 | | .EINVAL => |err| return wsaErrorBug(err), |
| 12275 | | .EISCONN => |err| return wsaErrorBug(err), |
| 12276 | | .ENOTSOCK => |err| return wsaErrorBug(err), |
| 12277 | | .EWOULDBLOCK => return error.WouldBlock, |
| 12278 | | .EACCES => return error.AccessDenied, |
| 12279 | | .ENOBUFS => return error.SystemResources, |
| 12280 | | .EAFNOSUPPORT => return error.AddressFamilyUnsupported, |
| 12281 | | else => |err| return windows.unexpectedWSAError(err), |
| 12282 | | } |
| 12283 | | }, |
| 12245 | .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable), |
| 12246 | .ECONNREFUSED => return syscall.fail(error.ConnectionRefused), |
| 12247 | .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer), |
| 12248 | .ETIMEDOUT => return syscall.fail(error.Timeout), |
| 12249 | .EHOSTUNREACH => return syscall.fail(error.HostUnreachable), |
| 12250 | .ENETUNREACH => return syscall.fail(error.NetworkUnreachable), |
| 12251 | .EFAULT => |err| return syscall.wsaErrorBug(err), |
| 12252 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 12253 | .EISCONN => |err| return syscall.wsaErrorBug(err), |
| 12254 | .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 12255 | .EWOULDBLOCK => return syscall.fail(error.WouldBlock), |
| 12256 | .EACCES => return syscall.fail(error.AccessDenied), |
| 12257 | .ENOBUFS => return syscall.fail(error.SystemResources), |
| 12258 | .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported), |
| 12259 | else => |err| return syscall.unexpectedWsaError(err), |
| 12284 | 12260 | } |
| 12285 | 12261 | } |
| 12286 | 12262 | |
| ... | ... | @@ -12334,7 +12310,7 @@ fn netConnectUnixWindows( |
| 12334 | 12310 | var storage: WsaAddress = undefined; |
| 12335 | 12311 | const addr_len = addressUnixToWsa(address, &storage); |
| 12336 | 12312 | |
| 12337 | | var syscall: Syscall = try .start(); |
| 12313 | var syscall: AlertableSyscall = try .start(); |
| 12338 | 12314 | while (true) { |
| 12339 | 12315 | const rc = ws2_32.connect(socket_handle, &storage.any, addr_len); |
| 12340 | 12316 | if (rc != ws2_32.SOCKET_ERROR) break; |
| ... | ... | @@ -12349,21 +12325,16 @@ fn netConnectUnixWindows( |
| 12349 | 12325 | syscall = try .start(); |
| 12350 | 12326 | continue; |
| 12351 | 12327 | }, |
| 12352 | | else => |e| { |
| 12353 | | syscall.finish(); |
| 12354 | | switch (e) { |
| 12355 | | .ECONNREFUSED => return error.FileNotFound, |
| 12356 | | .EFAULT => |err| return wsaErrorBug(err), |
| 12357 | | .EINVAL => |err| return wsaErrorBug(err), |
| 12358 | | .EISCONN => |err| return wsaErrorBug(err), |
| 12359 | | .ENOTSOCK => |err| return wsaErrorBug(err), |
| 12360 | | .EWOULDBLOCK => return error.WouldBlock, |
| 12361 | | .EACCES => return error.AccessDenied, |
| 12362 | | .ENOBUFS => return error.SystemResources, |
| 12363 | | .EAFNOSUPPORT => return error.AddressFamilyUnsupported, |
| 12364 | | else => |err| return windows.unexpectedWSAError(err), |
| 12365 | | } |
| 12366 | | }, |
| 12328 | .ECONNREFUSED => return syscall.fail(error.FileNotFound), |
| 12329 | .EFAULT => |err| return syscall.wsaErrorBug(err), |
| 12330 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 12331 | .EISCONN => |err| return syscall.wsaErrorBug(err), |
| 12332 | .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 12333 | .EWOULDBLOCK => return syscall.fail(error.WouldBlock), |
| 12334 | .EACCES => return syscall.fail(error.AccessDenied), |
| 12335 | .ENOBUFS => return syscall.fail(error.SystemResources), |
| 12336 | .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported), |
| 12337 | else => |err| return syscall.unexpectedWsaError(err), |
| 12367 | 12338 | } |
| 12368 | 12339 | } |
| 12369 | 12340 | |
| ... | ... | @@ -12417,7 +12388,7 @@ fn netBindIpWindows( |
| 12417 | 12388 | var storage: WsaAddress = undefined; |
| 12418 | 12389 | var addr_len = addressToWsa(address, &storage); |
| 12419 | 12390 | |
| 12420 | | var syscall: Syscall = try .start(); |
| 12391 | var syscall: AlertableSyscall = try .start(); |
| 12421 | 12392 | while (true) { |
| 12422 | 12393 | const rc = ws2_32.bind(socket_handle, &storage.any, addr_len); |
| 12423 | 12394 | if (rc != ws2_32.SOCKET_ERROR) { |
| ... | ... | @@ -12435,19 +12406,14 @@ fn netBindIpWindows( |
| 12435 | 12406 | syscall = try .start(); |
| 12436 | 12407 | continue; |
| 12437 | 12408 | }, |
| 12438 | | else => |e| { |
| 12439 | | syscall.finish(); |
| 12440 | | switch (e) { |
| 12441 | | .EADDRINUSE => return error.AddressInUse, |
| 12442 | | .EADDRNOTAVAIL => return error.AddressUnavailable, |
| 12443 | | .ENOTSOCK => |err| return wsaErrorBug(err), |
| 12444 | | .EFAULT => |err| return wsaErrorBug(err), |
| 12445 | | .EINVAL => |err| return wsaErrorBug(err), |
| 12446 | | .ENOBUFS => return error.SystemResources, |
| 12447 | | .ENETDOWN => return error.NetworkDown, |
| 12448 | | else => |err| return windows.unexpectedWSAError(err), |
| 12449 | | } |
| 12450 | | }, |
| 12409 | .EADDRINUSE => return syscall.fail(error.AddressInUse), |
| 12410 | .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable), |
| 12411 | .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 12412 | .EFAULT => |err| return syscall.wsaErrorBug(err), |
| 12413 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 12414 | .ENOBUFS => return syscall.fail(error.SystemResources), |
| 12415 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 12416 | else => |err| return syscall.unexpectedWsaError(err), |
| 12451 | 12417 | } |
| 12452 | 12418 | } |
| 12453 | 12419 | |
| ... | ... | @@ -12611,10 +12577,8 @@ fn openSocketWsa( |
| 12611 | 12577 | const protocol = posixProtocol(options.protocol); |
| 12612 | 12578 | // WSA_FLAG_OVERLAPPED is chosen here because without this different |
| 12613 | 12579 | // threads cannot use the same open socket handle. |
| 12614 | | // TODO: the below code needs to use the AlertableSyscall mechanism instead in |
| 12615 | | // order to make cancelation work. |
| 12616 | 12580 | const flags: u32 = ws2_32.WSA_FLAG_OVERLAPPED | ws2_32.WSA_FLAG_NO_HANDLE_INHERIT; |
| 12617 | | var syscall: Syscall = try .start(); |
| 12581 | var syscall: AlertableSyscall = try .start(); |
| 12618 | 12582 | while (true) { |
| 12619 | 12583 | const rc = ws2_32.WSASocketW(family, @bitCast(mode), @bitCast(protocol), null, 0, flags); |
| 12620 | 12584 | if (rc != ws2_32.INVALID_SOCKET) { |
| ... | ... | @@ -12632,16 +12596,11 @@ fn openSocketWsa( |
| 12632 | 12596 | syscall = try .start(); |
| 12633 | 12597 | continue; |
| 12634 | 12598 | }, |
| 12635 | | else => |e| { |
| 12636 | | syscall.finish(); |
| 12637 | | switch (e) { |
| 12638 | | .EAFNOSUPPORT => return error.AddressFamilyUnsupported, |
| 12639 | | .EMFILE => return error.ProcessFdQuotaExceeded, |
| 12640 | | .ENOBUFS => return error.SystemResources, |
| 12641 | | .EPROTONOSUPPORT => return error.ProtocolUnsupportedByAddressFamily, |
| 12642 | | else => |err| return windows.unexpectedWSAError(err), |
| 12643 | | } |
| 12644 | | }, |
| 12599 | .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported), |
| 12600 | .EMFILE => return syscall.fail(error.ProcessFdQuotaExceeded), |
| 12601 | .ENOBUFS => return syscall.fail(error.SystemResources), |
| 12602 | .EPROTONOSUPPORT => return syscall.fail(error.ProtocolUnsupportedByAddressFamily), |
| 12603 | else => |err| return syscall.unexpectedWsaError(err), |
| 12645 | 12604 | } |
| 12646 | 12605 | } |
| 12647 | 12606 | } |
| ... | ... | @@ -12702,7 +12661,7 @@ fn netAcceptWindows(userdata: ?*anyopaque, listen_handle: net.Socket.Handle) net |
| 12702 | 12661 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 12703 | 12662 | var storage: WsaAddress = undefined; |
| 12704 | 12663 | var addr_len: i32 = @sizeOf(WsaAddress); |
| 12705 | | var syscall: Syscall = try .start(); |
| 12664 | var syscall: AlertableSyscall = try .start(); |
| 12706 | 12665 | while (true) { |
| 12707 | 12666 | const rc = ws2_32.accept(listen_handle, &storage.any, &addr_len); |
| 12708 | 12667 | if (rc != ws2_32.INVALID_SOCKET) { |
| ... | ... | @@ -12723,20 +12682,15 @@ fn netAcceptWindows(userdata: ?*anyopaque, listen_handle: net.Socket.Handle) net |
| 12723 | 12682 | syscall = try .start(); |
| 12724 | 12683 | continue; |
| 12725 | 12684 | }, |
| 12726 | | else => |e| { |
| 12727 | | syscall.finish(); |
| 12728 | | switch (e) { |
| 12729 | | .ECONNRESET => return error.ConnectionAborted, |
| 12730 | | .EFAULT => |err| return wsaErrorBug(err), |
| 12731 | | .ENOTSOCK => |err| return wsaErrorBug(err), |
| 12732 | | .EINVAL => |err| return wsaErrorBug(err), |
| 12733 | | .EMFILE => return error.ProcessFdQuotaExceeded, |
| 12734 | | .ENETDOWN => return error.NetworkDown, |
| 12735 | | .ENOBUFS => return error.SystemResources, |
| 12736 | | .EOPNOTSUPP => |err| return wsaErrorBug(err), |
| 12737 | | else => |err| return windows.unexpectedWSAError(err), |
| 12738 | | } |
| 12739 | | }, |
| 12685 | .ECONNRESET => return syscall.fail(error.ConnectionAborted), |
| 12686 | .EMFILE => return syscall.fail(error.ProcessFdQuotaExceeded), |
| 12687 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 12688 | .ENOBUFS => return syscall.fail(error.SystemResources), |
| 12689 | .EFAULT => |err| return syscall.wsaErrorBug(err), |
| 12690 | .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 12691 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 12692 | .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err), |
| 12693 | else => |err| return syscall.unexpectedWsaError(err), |
| 12740 | 12694 | } |
| 12741 | 12695 | } |
| 12742 | 12696 | } |
| ... | ... | @@ -12859,7 +12813,7 @@ fn netReadWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, data: [][]u8 |
| 12859 | 12813 | break :b bufs; |
| 12860 | 12814 | }; |
| 12861 | 12815 | |
| 12862 | | var syscall: Syscall = try .start(); |
| 12816 | var syscall: AlertableSyscall = try .start(); |
| 12863 | 12817 | while (true) { |
| 12864 | 12818 | var flags: u32 = 0; |
| 12865 | 12819 | var n: u32 = undefined; |
| ... | ... | @@ -12885,15 +12839,9 @@ fn netReadWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, data: [][]u8 |
| 12885 | 12839 | .ENETRESET => return syscall.fail(error.ConnectionResetByPeer), |
| 12886 | 12840 | .ENOTCONN => return syscall.fail(error.SocketUnconnected), |
| 12887 | 12841 | .EFAULT => unreachable, // a pointer is not completely contained in user address space. |
| 12888 | | |
| 12889 | | else => |err| { |
| 12890 | | syscall.finish(); |
| 12891 | | switch (err) { |
| 12892 | | .EINVAL => return wsaErrorBug(err), |
| 12893 | | .EMSGSIZE => return wsaErrorBug(err), |
| 12894 | | else => return windows.unexpectedWSAError(err), |
| 12895 | | } |
| 12896 | | }, |
| 12842 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 12843 | .EMSGSIZE => |err| return syscall.wsaErrorBug(err), |
| 12844 | else => |err| return syscall.unexpectedWsaError(err), |
| 12897 | 12845 | } |
| 12898 | 12846 | } |
| 12899 | 12847 | } |
| ... | ... | @@ -12967,7 +12915,7 @@ fn netSendWindowsOne( |
| 12967 | 12915 | var n: u32 = undefined; |
| 12968 | 12916 | var address: WsaAddress = undefined; |
| 12969 | 12917 | const address_size = addressToWsa(message.address, &address); |
| 12970 | | var syscall: Syscall = try .start(); |
| 12918 | var syscall: AlertableSyscall = try .start(); |
| 12971 | 12919 | while (true) { |
| 12972 | 12920 | const rc = ws2_32.WSASendTo( |
| 12973 | 12921 | handle, |
| ... | ... | @@ -13001,15 +12949,9 @@ fn netSendWindowsOne( |
| 13001 | 12949 | .ENETRESET => return syscall.fail(error.ConnectionResetByPeer), |
| 13002 | 12950 | .ENOTCONN => return syscall.fail(error.SocketUnconnected), |
| 13003 | 12951 | .EFAULT => unreachable, // a pointer is not completely contained in user address space. |
| 13004 | | |
| 13005 | | else => |err| { |
| 13006 | | syscall.finish(); |
| 13007 | | switch (err) { |
| 13008 | | .EINVAL => return wsaErrorBug(err), |
| 13009 | | .EMSGSIZE => return wsaErrorBug(err), |
| 13010 | | else => return windows.unexpectedWSAError(err), |
| 13011 | | } |
| 13012 | | }, |
| 12952 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 12953 | .EMSGSIZE => |err| return syscall.wsaErrorBug(err), |
| 12954 | else => |err| return syscall.unexpectedWsaError(err), |
| 13013 | 12955 | } |
| 13014 | 12956 | } |
| 13015 | 12957 | } |
| ... | ... | @@ -13045,7 +12987,7 @@ fn netSendOne( |
| 13045 | 12987 | .controllen = @intCast(message.control.len), |
| 13046 | 12988 | .flags = 0, |
| 13047 | 12989 | }; |
| 13048 | | var syscall: Syscall = try .start(); |
| 12990 | var syscall: if (is_windows) AlertableSyscall else Syscall = try .start(); |
| 13049 | 12991 | while (true) { |
| 13050 | 12992 | const rc = posix.system.sendmsg(handle, &msg, flags); |
| 13051 | 12993 | if (is_windows) { |
| ... | ... | @@ -13065,28 +13007,23 @@ fn netSendOne( |
| 13065 | 13007 | syscall = try .start(); |
| 13066 | 13008 | continue; |
| 13067 | 13009 | }, |
| 13068 | | else => |e| { |
| 13069 | | syscall.finish(); |
| 13070 | | switch (e) { |
| 13071 | | .EACCES => return error.AccessDenied, |
| 13072 | | .EADDRNOTAVAIL => return error.AddressUnavailable, |
| 13073 | | .ECONNRESET => return error.ConnectionResetByPeer, |
| 13074 | | .EMSGSIZE => return error.MessageOversize, |
| 13075 | | .ENOBUFS => return error.SystemResources, |
| 13076 | | .ENOTSOCK => return error.FileDescriptorNotASocket, |
| 13077 | | .EAFNOSUPPORT => return error.AddressFamilyUnsupported, |
| 13078 | | .EDESTADDRREQ => unreachable, // A destination address is required. |
| 13079 | | .EFAULT => unreachable, // The lpBuffers, lpTo, lpOverlapped, lpNumberOfBytesSent, or lpCompletionRoutine parameters are not part of the user address space, or the lpTo parameter is too small. |
| 13080 | | .EHOSTUNREACH => return error.NetworkUnreachable, |
| 13081 | | .EINVAL => unreachable, |
| 13082 | | .ENETDOWN => return error.NetworkDown, |
| 13083 | | .ENETRESET => return error.ConnectionResetByPeer, |
| 13084 | | .ENETUNREACH => return error.NetworkUnreachable, |
| 13085 | | .ENOTCONN => return error.SocketUnconnected, |
| 13086 | | .ESHUTDOWN => |err| return wsaErrorBug(err), |
| 13087 | | else => |err| return windows.unexpectedWSAError(err), |
| 13088 | | } |
| 13089 | | }, |
| 13010 | .EACCES => return syscall.fail(error.AccessDenied), |
| 13011 | .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable), |
| 13012 | .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer), |
| 13013 | .EMSGSIZE => return syscall.fail(error.MessageOversize), |
| 13014 | .ENOBUFS => return syscall.fail(error.SystemResources), |
| 13015 | .ENOTSOCK => return syscall.fail(error.FileDescriptorNotASocket), |
| 13016 | .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported), |
| 13017 | .EHOSTUNREACH => return syscall.fail(error.NetworkUnreachable), |
| 13018 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 13019 | .ENETRESET => return syscall.fail(error.ConnectionResetByPeer), |
| 13020 | .ENETUNREACH => return syscall.fail(error.NetworkUnreachable), |
| 13021 | .ENOTCONN => return syscall.fail(error.SocketUnconnected), |
| 13022 | .EDESTADDRREQ => unreachable, // A destination address is required. |
| 13023 | .EFAULT => unreachable, // The lpBuffers, lpTo, lpOverlapped, lpNumberOfBytesSent, or lpCompletionRoutine parameters are not part of the user address space, or the lpTo parameter is too small. |
| 13024 | .EINVAL => unreachable, |
| 13025 | .ESHUTDOWN => |err| return syscall.wsaErrorBug(err), |
| 13026 | else => |err| return syscall.unexpectedWsaError(err), |
| 13090 | 13027 | } |
| 13091 | 13028 | } |
| 13092 | 13029 | switch (posix.errno(rc)) { |
| ... | ... | @@ -13099,31 +13036,26 @@ fn netSendOne( |
| 13099 | 13036 | try syscall.checkCancel(); |
| 13100 | 13037 | continue; |
| 13101 | 13038 | }, |
| 13102 | | else => |e| { |
| 13103 | | syscall.finish(); |
| 13104 | | switch (e) { |
| 13105 | | .ACCES => return error.AccessDenied, |
| 13106 | | .ALREADY => return error.FastOpenAlreadyInProgress, |
| 13107 | | .BADF => |err| return errnoBug(err), // File descriptor used after closed. |
| 13108 | | .CONNRESET => return error.ConnectionResetByPeer, |
| 13109 | | .DESTADDRREQ => |err| return errnoBug(err), |
| 13110 | | .FAULT => |err| return errnoBug(err), |
| 13111 | | .INVAL => |err| return errnoBug(err), |
| 13112 | | .ISCONN => |err| return errnoBug(err), |
| 13113 | | .MSGSIZE => return error.MessageOversize, |
| 13114 | | .NOBUFS => return error.SystemResources, |
| 13115 | | .NOMEM => return error.SystemResources, |
| 13116 | | .NOTSOCK => |err| return errnoBug(err), |
| 13117 | | .OPNOTSUPP => |err| return errnoBug(err), |
| 13118 | | .PIPE => return error.SocketUnconnected, |
| 13119 | | .AFNOSUPPORT => return error.AddressFamilyUnsupported, |
| 13120 | | .HOSTUNREACH => return error.HostUnreachable, |
| 13121 | | .NETUNREACH => return error.NetworkUnreachable, |
| 13122 | | .NOTCONN => return error.SocketUnconnected, |
| 13123 | | .NETDOWN => return error.NetworkDown, |
| 13124 | | else => |err| return posix.unexpectedErrno(err), |
| 13125 | | } |
| 13126 | | }, |
| 13039 | .ACCES => return syscall.fail(error.AccessDenied), |
| 13040 | .ALREADY => return syscall.fail(error.FastOpenAlreadyInProgress), |
| 13041 | .CONNRESET => return syscall.fail(error.ConnectionResetByPeer), |
| 13042 | .MSGSIZE => return syscall.fail(error.MessageOversize), |
| 13043 | .NOBUFS => return syscall.fail(error.SystemResources), |
| 13044 | .NOMEM => return syscall.fail(error.SystemResources), |
| 13045 | .PIPE => return syscall.fail(error.SocketUnconnected), |
| 13046 | .AFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported), |
| 13047 | .HOSTUNREACH => return syscall.fail(error.HostUnreachable), |
| 13048 | .NETUNREACH => return syscall.fail(error.NetworkUnreachable), |
| 13049 | .NOTCONN => return syscall.fail(error.SocketUnconnected), |
| 13050 | .NETDOWN => return syscall.fail(error.NetworkDown), |
| 13051 | .BADF => |err| return syscall.errnoBug(err), // File descriptor used after closed. |
| 13052 | .DESTADDRREQ => |err| return syscall.errnoBug(err), |
| 13053 | .FAULT => |err| return syscall.errnoBug(err), |
| 13054 | .INVAL => |err| return syscall.errnoBug(err), |
| 13055 | .ISCONN => |err| return syscall.errnoBug(err), |
| 13056 | .NOTSOCK => |err| return syscall.errnoBug(err), |
| 13057 | .OPNOTSUPP => |err| return syscall.errnoBug(err), |
| 13058 | else => |err| return syscall.unexpectedErrno(err), |
| 13127 | 13059 | } |
| 13128 | 13060 | } |
| 13129 | 13061 | } |
| ... | ... | @@ -13308,9 +13240,9 @@ fn netReceiveWindowsOne( |
| 13308 | 13240 | .len = std.math.cast(u32, data_buffer.len) orelse return error.MessageOversize, |
| 13309 | 13241 | }; |
| 13310 | 13242 | var n: u32 = undefined; |
| 13311 | | var syscall: Syscall = try .start(); |
| 13312 | 13243 | var from_storage: WsaAddress = undefined; |
| 13313 | 13244 | var from_storage_len: i32 = @sizeOf(WsaAddress); |
| 13245 | var syscall: AlertableSyscall = try .start(); |
| 13314 | 13246 | |
| 13315 | 13247 | while (true) { |
| 13316 | 13248 | const rc = ws2_32.WSARecvFrom( |
| ... | ... | @@ -13351,21 +13283,14 @@ fn netReceiveWindowsOne( |
| 13351 | 13283 | syscall = try .start(); |
| 13352 | 13284 | continue; |
| 13353 | 13285 | }, |
| 13354 | | |
| 13355 | 13286 | .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer), |
| 13356 | 13287 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 13357 | 13288 | .ENETRESET => return syscall.fail(error.ConnectionResetByPeer), |
| 13358 | 13289 | .ENOTCONN => return syscall.fail(error.SocketUnconnected), |
| 13359 | 13290 | .EFAULT => unreachable, // a pointer is not completely contained in user address space. |
| 13360 | | |
| 13361 | | else => |err| { |
| 13362 | | syscall.finish(); |
| 13363 | | switch (err) { |
| 13364 | | .EINVAL => return wsaErrorBug(err), |
| 13365 | | .EMSGSIZE => return wsaErrorBug(err), |
| 13366 | | else => return windows.unexpectedWSAError(err), |
| 13367 | | } |
| 13368 | | }, |
| 13291 | .EINVAL => |err| return syscall.wsaErrorBug(err), |
| 13292 | .EMSGSIZE => |err| return syscall.wsaErrorBug(err), |
| 13293 | else => |err| return syscall.unexpectedWsaError(err), |
| 13369 | 13294 | } |
| 13370 | 13295 | } |
| 13371 | 13296 | } |
| ... | ... | @@ -13505,7 +13430,7 @@ fn netWriteWindows( |
| 13505 | 13430 | }, |
| 13506 | 13431 | }; |
| 13507 | 13432 | |
| 13508 | | var syscall: Syscall = try .start(); |
| 13433 | var syscall: AlertableSyscall = try .start(); |
| 13509 | 13434 | while (true) { |
| 13510 | 13435 | var n: u32 = undefined; |
| 13511 | 13436 | const rc = ws2_32.WSASend(handle, &iovecs, len, &n, 0, null, null); |
| ... | ... | @@ -13533,16 +13458,10 @@ fn netWriteWindows( |
| 13533 | 13458 | .ENETRESET => return syscall.fail(error.ConnectionResetByPeer), |
| 13534 | 13459 | .ENOBUFS => return syscall.fail(error.SystemResources), |
| 13535 | 13460 | .ENOTCONN => return syscall.fail(error.SocketUnconnected), |
| 13536 | | |
| 13537 | | else => |err| { |
| 13538 | | syscall.finish(); |
| 13539 | | switch (err) { |
| 13540 | | .ENOTSOCK => return wsaErrorBug(err), |
| 13541 | | .EOPNOTSUPP => return wsaErrorBug(err), |
| 13542 | | .ESHUTDOWN => return wsaErrorBug(err), |
| 13543 | | else => return windows.unexpectedWSAError(err), |
| 13544 | | } |
| 13545 | | }, |
| 13461 | .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 13462 | .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err), |
| 13463 | .ESHUTDOWN => |err| return syscall.wsaErrorBug(err), |
| 13464 | else => |err| return syscall.unexpectedWsaError(err), |
| 13546 | 13465 | } |
| 13547 | 13466 | } |
| 13548 | 13467 | } |
| ... | ... | @@ -13651,7 +13570,7 @@ fn netShutdownWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, how: net |
| 13651 | 13570 | .both => ws2_32.SD_BOTH, |
| 13652 | 13571 | }; |
| 13653 | 13572 | |
| 13654 | | var syscall: Syscall = try .start(); |
| 13573 | var syscall: AlertableSyscall = try .start(); |
| 13655 | 13574 | while (true) { |
| 13656 | 13575 | const rc = ws2_32.shutdown(handle, wsa_how); |
| 13657 | 13576 | if (rc != ws2_32.SOCKET_ERROR) { |
| ... | ... | @@ -13669,17 +13588,12 @@ fn netShutdownWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, how: net |
| 13669 | 13588 | syscall = try .start(); |
| 13670 | 13589 | continue; |
| 13671 | 13590 | }, |
| 13672 | | else => |e| { |
| 13673 | | syscall.finish(); |
| 13674 | | switch (e) { |
| 13675 | | .ECONNABORTED => return error.ConnectionAborted, |
| 13676 | | .ECONNRESET => return error.ConnectionResetByPeer, |
| 13677 | | .ENETDOWN => return error.NetworkDown, |
| 13678 | | .ENOTCONN => return error.SocketUnconnected, |
| 13679 | | .EINVAL, .ENOTSOCK => |err| return wsaErrorBug(err), |
| 13680 | | else => |err| return windows.unexpectedWSAError(err), |
| 13681 | | } |
| 13682 | | }, |
| 13591 | .ECONNABORTED => return syscall.fail(error.ConnectionAborted), |
| 13592 | .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer), |
| 13593 | .ENETDOWN => return syscall.fail(error.NetworkDown), |
| 13594 | .ENOTCONN => return syscall.fail(error.SocketUnconnected), |
| 13595 | .EINVAL, .ENOTSOCK => |err| return syscall.wsaErrorBug(err), |
| 13596 | else => |err| return syscall.unexpectedWsaError(err), |
| 13683 | 13597 | } |
| 13684 | 13598 | } |
| 13685 | 13599 | } |
| ... | ... | @@ -13866,14 +13780,14 @@ fn netLookupFallible( |
| 13866 | 13780 | continue; |
| 13867 | 13781 | }, |
| 13868 | 13782 | .TRY_AGAIN => return error.NameServerFailure, |
| 13869 | | .EINVAL => |err| return wsaErrorBug(err), |
| 13870 | 13783 | .NO_RECOVERY => return error.NameServerFailure, |
| 13871 | 13784 | .EAFNOSUPPORT => return error.AddressFamilyUnsupported, |
| 13872 | 13785 | .NOT_ENOUGH_MEMORY => return error.SystemResources, |
| 13873 | 13786 | .HOST_NOT_FOUND => return error.UnknownHostName, |
| 13874 | 13787 | .TYPE_NOT_FOUND => return error.ProtocolUnsupportedByAddressFamily, |
| 13875 | 13788 | .ESOCKTNOSUPPORT => return error.ProtocolUnsupportedBySystem, |
| 13876 | | else => |err| return windows.unexpectedWSAError(err), |
| 13789 | .EINVAL => |err| return windows.wsaErrorBug(err), |
| 13790 | else => |err| return windows.unexpectedWsaError(err), |
| 13877 | 13791 | } |
| 13878 | 13792 | } |
| 13879 | 13793 | defer ws2_32.FreeAddrInfoExW(res); |
| ... | ... | @@ -14363,11 +14277,6 @@ pub fn errnoBug(err: posix.E) Io.UnexpectedError { |
| 14363 | 14277 | return error.Unexpected; |
| 14364 | 14278 | } |
| 14365 | 14279 | |
| 14366 | | fn wsaErrorBug(err: ws2_32.WinsockError) Io.UnexpectedError { |
| 14367 | | if (is_debug) std.debug.panic("programmer bug caused syscall error: {t}", .{err}); |
| 14368 | | return error.Unexpected; |
| 14369 | | } |
| 14370 | | |
| 14371 | 14280 | pub fn posixSocketMode(mode: net.Socket.Mode) u32 { |
| 14372 | 14281 | return switch (mode) { |
| 14373 | 14282 | .stream => posix.SOCK.STREAM, |
| ... | ... | @@ -15003,7 +14912,7 @@ fn initializeWsa(t: *Threaded) error{ NetworkDown, Canceled }!void { |
| 15003 | 14912 | .VERNOTSUPPORTED => error.VersionUnsupported, |
| 15004 | 14913 | .EINPROGRESS => error.BlockingOperationInProgress, |
| 15005 | 14914 | .EPROCLIM => error.ProcessFdQuotaExceeded, |
| 15006 | | else => |err| windows.unexpectedWSAError(err), |
| 14915 | else => |err| windows.unexpectedWsaError(err), |
| 15007 | 14916 | }; |
| 15008 | 14917 | }, |
| 15009 | 14918 | } |