Module: wine Branch: master Commit: 40cc236b6b49e3f04b50167338834fc2ab01b4d1 URL: https://source.winehq.org/git/wine.git/?a=commit;h=40cc236b6b49e3f04b5016733...
Author: Alex Henrie alexhenrie24@gmail.com Date: Wed May 13 08:52:54 2020 -0600
iphlpapi: Implement ParseNetworkString for IPv6 addresses and services.
Signed-off-by: Alex Henrie alexhenrie24@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/iphlpapi/iphlpapi_main.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index e65eff82e2..ff9d0d3a53 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -3415,6 +3415,8 @@ DWORD WINAPI ParseNetworkString(const WCHAR *str, DWORD type, NET_ADDRESS_INFO *info, USHORT *port, BYTE *prefix_len) { IN_ADDR temp_addr4; + IN6_ADDR temp_addr6; + ULONG temp_scope; USHORT temp_port = 0; NTSTATUS status;
@@ -3455,10 +3457,44 @@ DWORD WINAPI ParseNetworkString(const WCHAR *str, DWORD type, return ERROR_SUCCESS; } } + if (type & NET_STRING_IPV6_ADDRESS) + { + status = RtlIpv6StringToAddressExW(str, &temp_addr6, &temp_scope, &temp_port); + if (SUCCEEDED(status) && !temp_port) + { + if (info) + { + info->Format = NET_ADDRESS_IPV6; + info->u.Ipv6Address.sin6_addr = temp_addr6; + info->u.Ipv6Address.sin6_scope_id = temp_scope; + info->u.Ipv6Address.sin6_port = 0; + } + if (port) *port = 0; + if (prefix_len) *prefix_len = 255; + return ERROR_SUCCESS; + } + } + if (type & NET_STRING_IPV6_SERVICE) + { + status = RtlIpv6StringToAddressExW(str, &temp_addr6, &temp_scope, &temp_port); + if (SUCCEEDED(status) && temp_port) + { + if (info) + { + info->Format = NET_ADDRESS_IPV6; + info->u.Ipv6Address.sin6_addr = temp_addr6; + info->u.Ipv6Address.sin6_scope_id = temp_scope; + info->u.Ipv6Address.sin6_port = temp_port; + } + if (port) *port = ntohs(temp_port); + if (prefix_len) *prefix_len = 255; + return ERROR_SUCCESS; + } + }
if (info) info->Format = NET_ADDRESS_FORMAT_UNSPECIFIED;
- if (type & ~(NET_STRING_IPV4_ADDRESS|NET_STRING_IPV4_SERVICE)) + if (type & ~(NET_STRING_IPV4_ADDRESS|NET_STRING_IPV4_SERVICE|NET_STRING_IPV6_ADDRESS|NET_STRING_IPV6_SERVICE)) { FIXME("Unimplemented type 0x%x\n", type); return ERROR_NOT_SUPPORTED;