Huw Davies : iphlpapi: Move dns server enumeration to a single function.

Alexandre Julliard julliard at winehq.org
Fri Sep 13 10:15:51 CDT 2013


Module: wine
Branch: master
Commit: 334875f38ed2b810be9f190c8c691de4c7e9b3cb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=334875f38ed2b810be9f190c8c691de4c7e9b3cb

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Sep 13 12:52:53 2013 +0100

iphlpapi: Move dns server enumeration to a single function.

---

 dlls/iphlpapi/iphlpapi_main.c |   76 +++++++++++++++++++++++++---------------
 1 files changed, 47 insertions(+), 29 deletions(-)

diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 670713f..fe24738 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -933,45 +933,59 @@ static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index
     return ERROR_SUCCESS;
 }
 
+static int get_dns_servers( SOCKADDR_STORAGE *servers, int num )
+{
+    int i;
+    SOCKADDR_STORAGE *addr;
+
+    initialise_resolver();
+
+    /* AF_INET6 not yet enumerated */
+    if (!servers || !num)
+    {
+        num = _res.nscount;
+        return num;
+    }
+
+    for (i = 0, addr = servers; addr < (servers + num) && i < _res.nscount; i++)
+    {
+        *(struct sockaddr_in *)addr = _res.nsaddr_list[i];
+        memset( (char *)addr + sizeof(struct sockaddr_in), 0,
+                sizeof(SOCKADDR_STORAGE) - sizeof(struct sockaddr_in) );
+        addr++;
+    }
+    return addr - servers;
+}
+
 static ULONG get_dns_server_addresses(PIP_ADAPTER_DNS_SERVER_ADDRESS address, ULONG *len)
 {
+    int num = get_dns_servers( NULL, 0 );
     DWORD size;
 
-    initialise_resolver();
-    /* FIXME: no support for IPv6 DNS server addresses.  Doing so requires
-     * sizeof SOCKADDR_STORAGE instead, and using _res._u._ext.nsaddrs when
-     * available.
-     */
-    size = _res.nscount * (sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS) + sizeof(SOCKADDR));
+    size = num * (sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS) + sizeof(SOCKADDR_STORAGE));
     if (!address || *len < size)
     {
         *len = size;
         return ERROR_BUFFER_OVERFLOW;
     }
     *len = size;
-    if (_res.nscount > 0)
+    if (num > 0)
     {
-        PIP_ADAPTER_DNS_SERVER_ADDRESS addr;
+        PIP_ADAPTER_DNS_SERVER_ADDRESS addr = address;
+        SOCKADDR_STORAGE *sock_addrs = (SOCKADDR_STORAGE *)(address + num);
         int i;
 
-        for (i = 0, addr = address; i < _res.nscount && addr;
-             i++, addr = addr->Next)
+        get_dns_servers( sock_addrs, num );
+
+        for (i = 0; i < num; i++, addr = addr->Next)
         {
-            SOCKADDR_IN *sin;
-
-            addr->Address.iSockaddrLength = sizeof(SOCKADDR);
-            addr->Address.lpSockaddr =
-             (LPSOCKADDR)((PBYTE)addr + sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS));
-            sin = (SOCKADDR_IN *)addr->Address.lpSockaddr;
-            sin->sin_family = WS_AF_INET;
-            sin->sin_port = _res.nsaddr_list[i].sin_port;
-            memcpy(&sin->sin_addr, &_res.nsaddr_list[i].sin_addr, sizeof(sin->sin_addr));
-            if (i == _res.nscount - 1)
+            addr->u.s.Length = sizeof(*addr);
+            addr->Address.iSockaddrLength = sizeof(SOCKADDR_IN);
+            addr->Address.lpSockaddr = (SOCKADDR *)(sock_addrs + i);
+            if (i == num - 1)
                 addr->Next = NULL;
             else
-                addr->Next =
-                 (PIP_ADAPTER_DNS_SERVER_ADDRESS)((PBYTE)addr +
-                 sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS) + sizeof(SOCKADDR));
+                addr->Next = addr + 1;
         }
     }
     return ERROR_SUCCESS;
@@ -1623,28 +1637,32 @@ static DWORD get_dns_server_list(PIP_ADDR_STRING list,
  PIP_ADDR_STRING firstDynamic, DWORD *len)
 {
   DWORD size;
+  int num = get_dns_servers( NULL, 0 );
 
-  initialise_resolver();
-  size = _res.nscount * sizeof(IP_ADDR_STRING);
+  size = num * sizeof(IP_ADDR_STRING);
   if (!list || *len < size) {
     *len = size;
     return ERROR_BUFFER_OVERFLOW;
   }
   *len = size;
-  if (_res.nscount > 0) {
+  if (num > 0) {
     PIP_ADDR_STRING ptr;
     int i;
+    SOCKADDR_STORAGE *addr = HeapAlloc( GetProcessHeap(), 0, num * sizeof(SOCKADDR_STORAGE) );
+
+    get_dns_servers( addr, num );
 
-    for (i = 0, ptr = list; i < _res.nscount && ptr; i++, ptr = ptr->Next) {
-      toIPAddressString(_res.nsaddr_list[i].sin_addr.s_addr,
+    for (i = 0, ptr = list; i < num; i++, ptr = ptr->Next) {
+        toIPAddressString(((struct sockaddr_in *)(addr + i))->sin_addr.s_addr,
        ptr->IpAddress.String);
-      if (i == _res.nscount - 1)
+      if (i == num - 1)
         ptr->Next = NULL;
       else if (i == 0)
         ptr->Next = firstDynamic;
       else
         ptr->Next = (PIP_ADDR_STRING)((PBYTE)ptr + sizeof(IP_ADDR_STRING));
     }
+    HeapFree( GetProcessHeap(), 0, addr );
   }
   return ERROR_SUCCESS;
 }




More information about the wine-cvs mailing list