Module: wine Branch: master Commit: 208eae73ae8fda6ffd34688a0f64c3456d2010ba URL: http://source.winehq.org/git/wine.git/?a=commit;h=208eae73ae8fda6ffd34688a0f...
Author: Huw Davies huw@codeweavers.com Date: Tue Sep 17 13:09:16 2013 +0100
iphlpapi: Add a version of get_dns_servers for Android.
---
configure | 2 + configure.ac | 2 + dlls/iphlpapi/iphlpapi_main.c | 49 +++++++++++++++++++++++++++++++++++++++++ include/config.h.in | 6 +++++ 4 files changed, 59 insertions(+), 0 deletions(-)
diff --git a/configure b/configure index a01bee0..e6f6971 100755 --- a/configure +++ b/configure @@ -13370,6 +13370,8 @@ esac ac_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $BUILTINFLAG" for ac_func in \ + __res_get_state \ + __res_getservers \ _finite \ _isnan \ _pclose \ diff --git a/configure.ac b/configure.ac index b69c379..e03928c 100644 --- a/configure.ac +++ b/configure.ac @@ -1997,6 +1997,8 @@ dnl **** Check for functions **** ac_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $BUILTINFLAG" AC_CHECK_FUNCS(\ + __res_get_state \ + __res_getservers \ _finite \ _isnan \ _pclose \ diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index 6ce2c94..f84c700 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -978,7 +978,56 @@ static int get_dns_servers( SOCKADDR_STORAGE *servers, int num, BOOL ip4_only ) } return addr - servers; } +#elif defined(HAVE___RES_GET_STATE) && defined(HAVE___RES_GETSERVERS) + +static int get_dns_servers( SOCKADDR_STORAGE *servers, int num, BOOL ip4_only ) +{ + extern struct res_state *__res_get_state( void ); + extern int __res_getservers( struct res_state *, struct sockaddr_storage *, int ); + struct res_state *state = __res_get_state(); + int i, found = 0, total = __res_getservers( state, NULL, 0 ); + SOCKADDR_STORAGE *addr = servers; + struct sockaddr_storage *buf; + + if ((!servers || !num) && !ip4_only) return total; + + buf = HeapAlloc( GetProcessHeap(), 0, total * sizeof(struct sockaddr_storage) ); + total = __res_getservers( state, buf, total ); + + for (i = 0; i < total; i++) + { + if (buf[i].ss_family == AF_INET6 && ip4_only) continue; + if (buf[i].ss_family != AF_INET && buf[i].ss_family != AF_INET6) continue; + + found++; + if (!servers || !num) continue; + + if (buf[i].ss_family == AF_INET6) + { + SOCKADDR_IN6 *s = (SOCKADDR_IN6 *)addr; + struct sockaddr_in6 *ptr = (struct sockaddr_in6 *)(buf + i); + s->sin6_family = WS_AF_INET6; + s->sin6_port = ptr->sin6_port; + s->sin6_flowinfo = ptr->sin6_flowinfo; + memcpy( &s->sin6_addr, &ptr->sin6_addr, sizeof(IN6_ADDR) ); + s->sin6_scope_id = ptr->sin6_scope_id; + memset( (char *)s + sizeof(SOCKADDR_IN6), 0, + sizeof(SOCKADDR_STORAGE) - sizeof(SOCKADDR_IN6) ); + } + else + { + *(struct sockaddr_in *)addr = *(struct sockaddr_in *)(buf + i); + memset( (char *)addr + sizeof(struct sockaddr_in), 0, + sizeof(SOCKADDR_STORAGE) - sizeof(struct sockaddr_in) ); + } + if (++addr >= servers + num) break; + } + + HeapFree( GetProcessHeap(), 0, buf ); + return found; +} #else + static int get_dns_servers( SOCKADDR_STORAGE *servers, int num, BOOL ip4_only ) { FIXME("Unimplemented on this system\n"); diff --git a/include/config.h.in b/include/config.h.in index 505dd28..62bee90 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -1233,6 +1233,12 @@ /* Define to 1 if you have the `_vsnprintf' function. */ #undef HAVE__VSNPRINTF
+/* Define to 1 if you have the `__res_getservers' function. */ +#undef HAVE___RES_GETSERVERS + +/* Define to 1 if you have the `__res_get_state' function. */ +#undef HAVE___RES_GET_STATE + /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT