mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
Fix inet_pton on Windows with IPv6 addresses
Code from Anope win32/socket.cpp by @Adam-
This commit is contained in:
parent
9b08c60495
commit
fc198fffe1
@ -55,18 +55,38 @@ CoreExport const char *insp_inet_ntop(int af, const void *src, char *dst, sockle
|
|||||||
|
|
||||||
CoreExport int insp_inet_pton(int af, const char *src, void *dst)
|
CoreExport int insp_inet_pton(int af, const char *src, void *dst)
|
||||||
{
|
{
|
||||||
sockaddr_in sa;
|
int address_length;
|
||||||
int len = sizeof(SOCKADDR);
|
sockaddr_storage sa;
|
||||||
int rv = WSAStringToAddressA((LPSTR)src, af, NULL, (LPSOCKADDR)&sa, &len);
|
sockaddr_in* sin = reinterpret_cast<sockaddr_in*>(&sa);
|
||||||
if(rv >= 0)
|
sockaddr_in6* sin6 = reinterpret_cast<sockaddr_in6*>(&sa);
|
||||||
|
|
||||||
|
switch (af)
|
||||||
{
|
{
|
||||||
if(WSAGetLastError() == WSAEINVAL)
|
case AF_INET:
|
||||||
rv = 0;
|
address_length = sizeof(sockaddr_in);
|
||||||
else
|
break;
|
||||||
rv = 1;
|
case AF_INET6:
|
||||||
|
address_length = sizeof(sockaddr_in6);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
memcpy(dst, &sa.sin_addr, sizeof(struct in_addr));
|
|
||||||
return rv;
|
if (!WSAStringToAddress(static_cast<LPSTR>(const_cast<char *>(src)), af, NULL, reinterpret_cast<LPSOCKADDR>(&sa), &address_length))
|
||||||
|
{
|
||||||
|
switch (af)
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
memcpy(dst, &sin->sin_addr, sizeof(in_addr));
|
||||||
|
break;
|
||||||
|
case AF_INET6:
|
||||||
|
memcpy(dst, &sin6->sin6_addr, sizeof(in6_addr));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CoreExport DIR * opendir(const char * path)
|
CoreExport DIR * opendir(const char * path)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user