Fixed Windows ip resolve.

This commit is contained in:
Patrick 2024-08-20 17:05:04 +02:00
parent f5ceb25a44
commit 0acadf994d

View File

@ -103,8 +103,8 @@ StreamResult<std::vector<ip_address_t>> osResolveResult(os_resolve_handle_t& han
struct WSAQueryContext struct WSAQueryContext
{ {
// WSA stuff // WSA stuff
OVERLAPPED overlapped; OVERLAPPED overlapped = {};
PADDRINFOEXA results; PADDRINFOEX results;
HANDLE cancelHandle = nullptr; HANDLE cancelHandle = nullptr;
// my stuff // my stuff
@ -122,7 +122,7 @@ void WINAPI getAddrComplete(DWORD error, DWORD bytes, LPOVERLAPPED overlapped) n
queryContext.result = detail::translateWinError(error); queryContext.result = detail::translateWinError(error);
} }
std::vector<ip_address_t> resultAddresses; std::vector<ip_address_t> resultAddresses;
for (PADDRINFOEXA result = queryContext.results; result != nullptr; result = result->ai_next) for (PADDRINFOEX result = queryContext.results; result != nullptr; result = result->ai_next)
{ {
switch (result->ai_family) switch (result->ai_family)
{ {
@ -135,7 +135,12 @@ void WINAPI getAddrComplete(DWORD error, DWORD bytes, LPOVERLAPPED overlapped) n
case AF_INET6: case AF_INET6:
{ {
sockaddr_in6& addr = *reinterpret_cast<sockaddr_in6*>(result->ai_addr); sockaddr_in6& addr = *reinterpret_cast<sockaddr_in6*>(result->ai_addr);
resultAddresses.emplace_back(std::bit_cast<IPv6Address>(addr.sin6_addr)); IPv6Address addr6 = std::bit_cast<IPv6Address>(addr.sin6_addr);
for (std::uint16_t& hextet : addr6.hextets)
{
hextet = ntohs(hextet);
}
resultAddresses.emplace_back(addr6);
} }
break; break;
default: break; default: break;
@ -143,13 +148,9 @@ void WINAPI getAddrComplete(DWORD error, DWORD bytes, LPOVERLAPPED overlapped) n
} }
if (queryContext.results != nullptr) if (queryContext.results != nullptr)
{ {
// WTF is wrong with people at MS? FreeAddrInfoEx(queryContext.results);
// you can't access FreeAddrInfoExA otherwise...
#if defined(FreeAddrInfoEx)
#undef FreeAddrInfoEx
#endif
FreeAddrInfoExA(queryContext.results);
} }
queryContext.result = std::move(resultAddresses);
} }
StreamError osBeginResolve(const std::string& hostname, os_resolve_handle_t& queryContext) noexcept StreamError osBeginResolve(const std::string& hostname, os_resolve_handle_t& queryContext) noexcept
@ -158,10 +159,11 @@ StreamError osBeginResolve(const std::string& hostname, os_resolve_handle_t& que
{ {
return detail::translateWSAError(); return detail::translateWSAError();
} }
ADDRINFOEXA hints = {.ai_family = AF_UNSPEC}; ADDRINFOEX hints = {.ai_family = AF_UNSPEC};
const int error = GetAddrInfoExA( std::wstring hostnameW(hostname.begin(), hostname.end());
/* pName = */ hostname.c_str(), const int error = GetAddrInfoEx(
/* pName = */ hostnameW.c_str(),
/* pServiceName = */ nullptr, /* pServiceName = */ nullptr,
/* dwNameSpace = */ NS_DNS, /* dwNameSpace = */ NS_DNS,
/* lpNspId = */ nullptr, /* lpNspId = */ nullptr,