Commit fd133237 authored by Kai Blin's avatar Kai Blin Committed by Alexandre Julliard

ws2_32: Handle IPv6 in WSAStringToAddress.

parent bf6a96ca
...@@ -15828,6 +15828,7 @@ fi ...@@ -15828,6 +15828,7 @@ fi
for ac_func in \ for ac_func in \
_pclose \ _pclose \
_popen \ _popen \
...@@ -15857,6 +15858,7 @@ for ac_func in \ ...@@ -15857,6 +15858,7 @@ for ac_func in \
gettid \ gettid \
gettimeofday \ gettimeofday \
getuid \ getuid \
inet_pton \
kqueue \ kqueue \
lstat \ lstat \
memmove \ memmove \
......
...@@ -1151,6 +1151,7 @@ AC_CHECK_FUNCS(\ ...@@ -1151,6 +1151,7 @@ AC_CHECK_FUNCS(\
gettid \ gettid \
gettimeofday \ gettimeofday \
getuid \ getuid \
inet_pton \
kqueue \ kqueue \
lstat \ lstat \
memmove \ memmove \
......
...@@ -4457,7 +4457,7 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, ...@@ -4457,7 +4457,7 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString,
switch(AddressFamily) switch(AddressFamily)
{ {
case AF_INET: case WS_AF_INET:
{ {
struct in_addr inetaddr; struct in_addr inetaddr;
...@@ -4494,8 +4494,9 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, ...@@ -4494,8 +4494,9 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString,
break; break;
} }
case AF_INET6: case WS_AF_INET6:
{ {
struct in6_addr inetaddr;
/* If lpAddressLength is too small, tell caller the size we need */ /* If lpAddressLength is too small, tell caller the size we need */
if (*lpAddressLength < sizeof(SOCKADDR_IN6)) if (*lpAddressLength < sizeof(SOCKADDR_IN6))
{ {
...@@ -4503,8 +4504,38 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, ...@@ -4503,8 +4504,38 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString,
res = WSAEFAULT; res = WSAEFAULT;
break; break;
} }
FIXME("We don't support IPv6 yet.\n"); #ifdef HAVE_INET_PTON
res = WSAEINVAL; memset(lpAddress, 0, sizeof(SOCKADDR_IN6));
((LPSOCKADDR_IN6)lpAddress)->sin6_family = WS_AF_INET6;
/* This one is a bit tricky. An IPv6 address contains colons, so the
* check from IPv4 doesn't work like that. However, IPv6 addresses that
* contain a port are written with braces like [fd12:3456:7890::1]:12345
* so what we will do is to look for ']', check if the next char is a
* colon, and if it is, parse the port as in IPv4. */
ptrPort = strchr(workBuffer, ']');
if(ptrPort && *(++ptrPort) == ':')
{
((LPSOCKADDR_IN6)lpAddress)->sin6_port = (WS_u_short)atoi(ptrPort+1);
*ptrPort = '\0';
}
else
{
((LPSOCKADDR_IN6)lpAddress)->sin6_port = 0;
}
if(inet_pton(AF_INET6, workBuffer, &inetaddr) > 0)
{
memcpy(&((LPSOCKADDR_IN6)lpAddress)->sin6_addr, &inetaddr,
sizeof(struct in6_addr));
res = 0;
}
else
#endif /* HAVE_INET_PTON */
res = WSAEINVAL;
break; break;
} }
default: default:
......
...@@ -240,6 +240,9 @@ ...@@ -240,6 +240,9 @@
/* Define to 1 if you have the `inet_network' function. */ /* Define to 1 if you have the `inet_network' function. */
#undef HAVE_INET_NETWORK #undef HAVE_INET_NETWORK
/* Define to 1 if you have the `inet_pton' function. */
#undef HAVE_INET_PTON
/* Define to 1 if you have the <inttypes.h> header file. */ /* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H #undef HAVE_INTTYPES_H
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment