Juan Lang : iphlpapi: Use a helper function to get the DNS server list.

Alexandre Julliard julliard at winehq.org
Tue Oct 12 11:26:59 CDT 2010


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Mon Oct 11 09:12:45 2010 -0700

iphlpapi: Use a helper function to get the DNS server list.

---

 dlls/iphlpapi/iphlpapi_main.c |   68 +++++++++++++++++++++++++++++------------
 1 files changed, 48 insertions(+), 20 deletions(-)

diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index ae2dd76..2869ce3 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -1539,6 +1539,46 @@ DWORD WINAPI GetIpNetTable(PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize, BOOL bOr
     return ret;
 }
 
+/* Gets the DNS server list into the list beginning at list.  Assumes that
+ * a single server address may be placed at list if *len is at least
+ * sizeof(IP_ADDR_STRING) long.  Otherwise, list->Next is set to firstDynamic,
+ * and assumes that all remaining DNS servers are contiguously located
+ * beginning at firstDynamic.  On input, *len is assumed to be the total number
+ * of bytes available for all DNS servers, and is ignored if list is NULL.
+ * On return, *len is set to the total number of bytes required for all DNS
+ * servers.
+ * Returns ERROR_BUFFER_OVERFLOW if *len is insufficient,
+ * ERROR_SUCCESS otherwise.
+ */
+static DWORD get_dns_server_list(PIP_ADDR_STRING list,
+ PIP_ADDR_STRING firstDynamic, DWORD *len)
+{
+  DWORD size;
+
+  initialise_resolver();
+  size = _res.nscount * sizeof(IP_ADDR_STRING);
+  if (!list || *len < size) {
+    *len = size;
+    return ERROR_BUFFER_OVERFLOW;
+  }
+  *len = size;
+  if (_res.nscount > 0) {
+    PIP_ADDR_STRING ptr;
+    int i;
+
+    for (i = 0, ptr = list; i < _res.nscount && ptr; i++, ptr = ptr->Next) {
+      toIPAddressString(_res.nsaddr_list[i].sin_addr.s_addr,
+       ptr->IpAddress.String);
+      if (i == _res.nscount - 1)
+        ptr->Next = NULL;
+      else if (i == 0)
+        ptr->Next = firstDynamic;
+      else
+        ptr->Next = (PIP_ADDR_STRING)((PBYTE)ptr + sizeof(IP_ADDR_STRING));
+    }
+  }
+  return ERROR_SUCCESS;
+}
 
 /******************************************************************
  *    GetNetworkParams (IPHLPAPI.@)
@@ -1560,7 +1600,7 @@ DWORD WINAPI GetIpNetTable(PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize, BOOL bOr
  */
 DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
 {
-  DWORD ret, size;
+  DWORD ret, size, serverListSize;
   LONG regReturn;
   HKEY hKey;
 
@@ -1568,9 +1608,8 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
   if (!pOutBufLen)
     return ERROR_INVALID_PARAMETER;
 
-  initialise_resolver();
-  size = sizeof(FIXED_INFO) + (_res.nscount > 0 ? (_res.nscount  - 1) *
-   sizeof(IP_ADDR_STRING) : 0);
+  get_dns_server_list(NULL, NULL, &serverListSize);
+  size = sizeof(FIXED_INFO) + serverListSize - sizeof(IP_ADDR_STRING);
   if (!pFixedInfo || *pOutBufLen < size) {
     *pOutBufLen = size;
     return ERROR_BUFFER_OVERFLOW;
@@ -1581,22 +1620,11 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
   GetComputerNameExA(ComputerNameDnsHostname, pFixedInfo->HostName, &size);
   size = sizeof(pFixedInfo->DomainName);
   GetComputerNameExA(ComputerNameDnsDomain, pFixedInfo->DomainName, &size);
-  if (_res.nscount > 0) {
-    PIP_ADDR_STRING ptr;
-    int i;
-
-    for (i = 0, ptr = &pFixedInfo->DnsServerList; i < _res.nscount && ptr;
-     i++, ptr = ptr->Next) {
-      toIPAddressString(_res.nsaddr_list[i].sin_addr.s_addr,
-       ptr->IpAddress.String);
-      if (i == _res.nscount - 1)
-        ptr->Next = NULL;
-      else if (i == 0)
-        ptr->Next = (PIP_ADDR_STRING)((LPBYTE)pFixedInfo + sizeof(FIXED_INFO));
-      else
-        ptr->Next = (PIP_ADDR_STRING)((PBYTE)ptr + sizeof(IP_ADDR_STRING));
-    }
-  }
+  get_dns_server_list(&pFixedInfo->DnsServerList,
+   (PIP_ADDR_STRING)((BYTE *)pFixedInfo + sizeof(FIXED_INFO)),
+   &serverListSize);
+  /* Assume the first DNS server in the list is the "current" DNS server: */
+  pFixedInfo->CurrentDnsServer = &pFixedInfo->DnsServerList;
   pFixedInfo->NodeType = HYBRID_NODETYPE;
   regReturn = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
    "SYSTEM\\CurrentControlSet\\Services\\VxD\\MSTCP", 0, KEY_READ, &hKey);




More information about the wine-cvs mailing list