From fc198fffe16fed4d9c8863e0571c5f314aaa5147 Mon Sep 17 00:00:00 2001 From: attilamolnar Date: Tue, 4 Jun 2013 21:43:29 +0200 Subject: Fix inet_pton on Windows with IPv6 addresses Code from Anope win32/socket.cpp by @Adam- --- win/inspircd_win32wrapper.cpp | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) (limited to 'win/inspircd_win32wrapper.cpp') diff --git a/win/inspircd_win32wrapper.cpp b/win/inspircd_win32wrapper.cpp index ebc498529..4592aa5d1 100644 --- a/win/inspircd_win32wrapper.cpp +++ b/win/inspircd_win32wrapper.cpp @@ -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) { - sockaddr_in sa; - int len = sizeof(SOCKADDR); - int rv = WSAStringToAddressA((LPSTR)src, af, NULL, (LPSOCKADDR)&sa, &len); - if(rv >= 0) + int address_length; + sockaddr_storage sa; + sockaddr_in* sin = reinterpret_cast(&sa); + sockaddr_in6* sin6 = reinterpret_cast(&sa); + + switch (af) { - if(WSAGetLastError() == WSAEINVAL) - rv = 0; - else - rv = 1; + case AF_INET: + address_length = sizeof(sockaddr_in); + break; + case AF_INET6: + address_length = sizeof(sockaddr_in6); + break; + default: + return -1; + } + + if (!WSAStringToAddress(static_cast(const_cast(src)), af, NULL, reinterpret_cast(&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; } - memcpy(dst, &sa.sin_addr, sizeof(struct in_addr)); - return rv; + + return 0; } CoreExport DIR * opendir(const char * path) -- cgit v1.2.3