Fixed Windows ip resolve.
This commit is contained in:
parent
f5ceb25a44
commit
0acadf994d
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user