| ... | ... | @@ -746,7 +746,79 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*A |
| 746 | 746 | const arena = result.arena.allocator(); |
| 747 | 747 | errdefer result.deinit(); |
| 748 | 748 | |
| 749 | | if (builtin.target.os.tag == .windows or builtin.link_libc) { |
| 749 | if (builtin.target.os.tag == .windows) { |
| 750 | const name_c = try std.cstr.addNullByte(allocator, name); |
| 751 | defer allocator.free(name_c); |
| 752 | |
| 753 | const port_c = try std.fmt.allocPrintZ(allocator, "{}", .{port}); |
| 754 | defer allocator.free(port_c); |
| 755 | |
| 756 | const ws2_32 = os.windows.ws2_32; |
| 757 | const hints = os.addrinfo{ |
| 758 | .flags = ws2_32.AI.NUMERICSERV, |
| 759 | .family = os.AF.UNSPEC, |
| 760 | .socktype = os.SOCK.STREAM, |
| 761 | .protocol = os.IPPROTO.TCP, |
| 762 | .canonname = null, |
| 763 | .addr = null, |
| 764 | .addrlen = 0, |
| 765 | .next = null, |
| 766 | }; |
| 767 | var res: *os.addrinfo = undefined; |
| 768 | var first = true; |
| 769 | while (true) { |
| 770 | const rc = ws2_32.getaddrinfo(name_c.ptr, port_c.ptr, &hints, &res); |
| 771 | switch (@intToEnum(os.windows.ws2_32.WinsockError, @intCast(u16, rc))) { |
| 772 | @intToEnum(os.windows.ws2_32.WinsockError, 0) => break, |
| 773 | .WSATRY_AGAIN => return error.TemporaryNameServerFailure, |
| 774 | .WSANO_RECOVERY => return error.NameServerFailure, |
| 775 | .WSAEAFNOSUPPORT => return error.AddressFamilyNotSupported, |
| 776 | .WSA_NOT_ENOUGH_MEMORY => return error.OutOfMemory, |
| 777 | .WSAHOST_NOT_FOUND => return error.UnknownHostName, |
| 778 | .WSATYPE_NOT_FOUND => return error.ServiceUnavailable, |
| 779 | .WSAEINVAL => unreachable, |
| 780 | .WSAESOCKTNOSUPPORT => unreachable, |
| 781 | .WSANOTINITIALISED => { |
| 782 | if (!first) return error.Unexpected; |
| 783 | first = false; |
| 784 | try os.windows.callWSAStartup(); |
| 785 | continue; |
| 786 | }, |
| 787 | else => |err| return os.windows.unexpectedWSAError(err), |
| 788 | } |
| 789 | } |
| 790 | defer ws2_32.freeaddrinfo(res); |
| 791 | |
| 792 | const addr_count = blk: { |
| 793 | var count: usize = 0; |
| 794 | var it: ?*os.addrinfo = res; |
| 795 | while (it) |info| : (it = info.next) { |
| 796 | if (info.addr != null) { |
| 797 | count += 1; |
| 798 | } |
| 799 | } |
| 800 | break :blk count; |
| 801 | }; |
| 802 | result.addrs = try arena.alloc(Address, addr_count); |
| 803 | |
| 804 | var it: ?*os.addrinfo = res; |
| 805 | var i: usize = 0; |
| 806 | while (it) |info| : (it = info.next) { |
| 807 | const addr = info.addr orelse continue; |
| 808 | result.addrs[i] = Address.initPosix(@alignCast(4, addr)); |
| 809 | |
| 810 | if (info.canonname) |n| { |
| 811 | if (result.canon_name == null) { |
| 812 | result.canon_name = try arena.dupe(u8, mem.sliceTo(n, 0)); |
| 813 | } |
| 814 | } |
| 815 | i += 1; |
| 816 | } |
| 817 | |
| 818 | return result; |
| 819 | } |
| 820 | |
| 821 | if (builtin.link_libc) { |
| 750 | 822 | const name_c = try std.cstr.addNullByte(allocator, name); |
| 751 | 823 | defer allocator.free(name_c); |
| 752 | 824 | |
| ... | ... | @@ -765,19 +837,7 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*A |
| 765 | 837 | .next = null, |
| 766 | 838 | }; |
| 767 | 839 | var res: *os.addrinfo = undefined; |
| 768 | | const rc = sys.getaddrinfo(name_c.ptr, port_c.ptr, &hints, &res); |
| 769 | | if (builtin.target.os.tag == .windows) switch (@intToEnum(os.windows.ws2_32.WinsockError, @intCast(u16, rc))) { |
| 770 | | @intToEnum(os.windows.ws2_32.WinsockError, 0) => {}, |
| 771 | | .WSATRY_AGAIN => return error.TemporaryNameServerFailure, |
| 772 | | .WSANO_RECOVERY => return error.NameServerFailure, |
| 773 | | .WSAEAFNOSUPPORT => return error.AddressFamilyNotSupported, |
| 774 | | .WSA_NOT_ENOUGH_MEMORY => return error.OutOfMemory, |
| 775 | | .WSAHOST_NOT_FOUND => return error.UnknownHostName, |
| 776 | | .WSATYPE_NOT_FOUND => return error.ServiceUnavailable, |
| 777 | | .WSAEINVAL => unreachable, |
| 778 | | .WSAESOCKTNOSUPPORT => unreachable, |
| 779 | | else => |err| return os.windows.unexpectedWSAError(err), |
| 780 | | } else switch (rc) { |
| 840 | switch (sys.getaddrinfo(name_c.ptr, port_c.ptr, &hints, &res)) { |
| 781 | 841 | @intToEnum(sys.EAI, 0) => {}, |
| 782 | 842 | .ADDRFAMILY => return error.HostLacksNetworkAddresses, |
| 783 | 843 | .AGAIN => return error.TemporaryNameServerFailure, |
| ... | ... | @@ -824,6 +884,7 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*A |
| 824 | 884 | |
| 825 | 885 | return result; |
| 826 | 886 | } |
| 887 | |
| 827 | 888 | if (builtin.target.os.tag == .linux) { |
| 828 | 889 | const flags = std.c.AI.NUMERICSERV; |
| 829 | 890 | const family = os.AF.UNSPEC; |