Alex Henrie : iphlpapi: Implement ParseNetworkString for IPv6 addresses and services.

Alexandre Julliard julliard at winehq.org
Thu May 14 16:17:44 CDT 2020


Module: wine
Branch: master
Commit: 40cc236b6b49e3f04b50167338834fc2ab01b4d1
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=40cc236b6b49e3f04b50167338834fc2ab01b4d1

Author: Alex Henrie <alexhenrie24 at 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 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list