ws2_32: Handle IPv6 in WSAStringToAddress.
This commit is contained in:
parent
bf6a96ca66
commit
fd133237b0
2
configure
vendored
2
configure
vendored
@ -15826,6 +15826,7 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for ac_func in \
|
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(\
|
|||||||
gettid \
|
gettid \
|
||||||
gettimeofday \
|
gettimeofday \
|
||||||
getuid \
|
getuid \
|
||||||
|
inet_pton \
|
||||||
kqueue \
|
kqueue \
|
||||||
lstat \
|
lstat \
|
||||||
memmove \
|
memmove \
|
||||||
|
@ -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,
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
/* 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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user