Juan Lang : iphlpapi: Set DNS servers in the IP_PER_ADAPTER_INFO returned for non-loopback addresses .
Alexandre Julliard
julliard at winehq.org
Tue Oct 12 11:26:59 CDT 2010
Module: wine
Branch: master
Commit: 112f878975659c2d3700efd377c5bbc00beb66d8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=112f878975659c2d3700efd377c5bbc00beb66d8
Author: Juan Lang <juan.lang at gmail.com>
Date: Tue Mar 23 14:56:34 2010 -0700
iphlpapi: Set DNS servers in the IP_PER_ADAPTER_INFO returned for non-loopback addresses.
---
dlls/iphlpapi/ifenum.c | 15 +++++++++++++++
dlls/iphlpapi/ifenum.h | 1 +
dlls/iphlpapi/iphlpapi_main.c | 20 +++++++++++++++-----
3 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/dlls/iphlpapi/ifenum.c b/dlls/iphlpapi/ifenum.c
index 4628b21..c998b93 100644
--- a/dlls/iphlpapi/ifenum.c
+++ b/dlls/iphlpapi/ifenum.c
@@ -158,6 +158,21 @@ DWORD getInterfaceIndexByName(const char *name, PDWORD index)
return ret;
}
+BOOL isIfIndexLoopback(ULONG idx)
+{
+ BOOL ret = FALSE;
+ char name[IFNAMSIZ];
+ int fd;
+
+ getInterfaceNameByIndex(idx, name);
+ fd = socket(PF_INET, SOCK_DGRAM, 0);
+ if (fd != -1) {
+ ret = isLoopbackInterface(fd, name);
+ close(fd);
+ }
+ return ret;
+}
+
DWORD getNumNonLoopbackInterfaces(void)
{
DWORD numInterfaces;
diff --git a/dlls/iphlpapi/ifenum.h b/dlls/iphlpapi/ifenum.h
index 79e484b..be5c9c1 100644
--- a/dlls/iphlpapi/ifenum.h
+++ b/dlls/iphlpapi/ifenum.h
@@ -46,6 +46,7 @@
DWORD getNumInterfaces(void);
DWORD getNumNonLoopbackInterfaces(void);
+BOOL isIfIndexLoopback(ULONG idx);
/* A table of interface indexes, see get*InterfaceTable(). */
typedef struct _InterfaceIndexTable {
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 2869ce3..5cefd4a 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -1688,18 +1688,21 @@ DWORD WINAPI GetNumberOfInterfaces(PDWORD pdwNumIf)
* RETURNS
* Success: NO_ERROR
* Failure: error code from winerror.h
- *
- * FIXME
- * Stub, returns empty IP_PER_ADAPTER_INFO in every case.
*/
DWORD WINAPI GetPerAdapterInfo(ULONG IfIndex, PIP_PER_ADAPTER_INFO pPerAdapterInfo, PULONG pOutBufLen)
{
- ULONG bytesNeeded = sizeof(IP_PER_ADAPTER_INFO);
+ ULONG bytesNeeded = sizeof(IP_PER_ADAPTER_INFO), serverListSize = 0;
+ DWORD ret = NO_ERROR;
TRACE("(IfIndex %d, pPerAdapterInfo %p, pOutBufLen %p)\n", IfIndex, pPerAdapterInfo, pOutBufLen);
if (!pOutBufLen) return ERROR_INVALID_PARAMETER;
+ if (!isIfIndexLoopback(IfIndex)) {
+ get_dns_server_list(NULL, NULL, &serverListSize);
+ if (serverListSize > sizeof(IP_ADDR_STRING))
+ bytesNeeded += serverListSize - sizeof(IP_ADDR_STRING);
+ }
if (!pPerAdapterInfo || *pOutBufLen < bytesNeeded)
{
*pOutBufLen = bytesNeeded;
@@ -1707,7 +1710,14 @@ DWORD WINAPI GetPerAdapterInfo(ULONG IfIndex, PIP_PER_ADAPTER_INFO pPerAdapterIn
}
memset(pPerAdapterInfo, 0, bytesNeeded);
- return NO_ERROR;
+ if (!isIfIndexLoopback(IfIndex)) {
+ ret = get_dns_server_list(&pPerAdapterInfo->DnsServerList,
+ (PIP_ADDR_STRING)((PBYTE)pPerAdapterInfo + sizeof(IP_PER_ADAPTER_INFO)),
+ &serverListSize);
+ /* Assume the first DNS server in the list is the "current" DNS server: */
+ pPerAdapterInfo->CurrentDnsServer = &pPerAdapterInfo->DnsServerList;
+ }
+ return ret;
}
More information about the wine-cvs
mailing list