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