diff --git a/configure b/configure index 116825768c4..6db27258075 100755 --- a/configure +++ b/configure @@ -14203,6 +14203,45 @@ $as_echo "#define HAVE_RESOLV 1" >>confdefs.h RESOLV_LIBS=$ac_cv_have_resolv ;; esac + + if test "x$ac_cv_have_resolv" != "xnot found" + then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_getservers" >&5 +$as_echo_n "checking for res_getservers... " >&6; } +if ${ac_cv_have_res_getservers+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_LIBS="$LIBS" + LIBS="$RESOLV_LIBS $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +res_getservers(NULL, NULL, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_have_res_getservers=yes +else + ac_cv_have_res_getservers=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_res_getservers" >&5 +$as_echo "$ac_cv_have_res_getservers" >&6; } + if test "$ac_cv_have_res_getservers" = "yes" + then + +$as_echo "#define HAVE_RES_GETSERVERS 1" >>confdefs.h + + fi + fi fi if test "x$with_cms" != "xno" diff --git a/configure.ac b/configure.ac index 76d5d5ed727..9e29234b428 100644 --- a/configure.ac +++ b/configure.ac @@ -1535,6 +1535,20 @@ then AC_DEFINE(HAVE_RESOLV, 1) AC_SUBST(RESOLV_LIBS,$ac_cv_have_resolv) ;; esac + + if test "x$ac_cv_have_resolv" != "xnot found" + then + AC_CACHE_CHECK([for res_getservers], ac_cv_have_res_getservers, + [ac_save_LIBS="$LIBS" + LIBS="$RESOLV_LIBS $LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM( + [[#include ]],[[res_getservers(NULL, NULL, 0);]])],[ac_cv_have_res_getservers=yes],[ac_cv_have_res_getservers=no]) + LIBS="$ac_save_LIBS"]) + if test "$ac_cv_have_res_getservers" = "yes" + then + AC_DEFINE(HAVE_RES_GETSERVERS, 1, [Define to 1 if you have the `res_getservers' function.]) + fi + fi fi dnl **** Check for LittleCMS *** diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index b8ae327a134..e3ce21c44b2 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -1249,7 +1249,8 @@ static void sockaddr_in_to_WS_storage( SOCKADDR_STORAGE *dst, const struct socka } #if defined(HAVE_STRUCT___RES_STATE__U__EXT_NSCOUNT6) || \ - (defined(HAVE___RES_GET_STATE) && defined(HAVE___RES_GETSERVERS)) + (defined(HAVE___RES_GET_STATE) && defined(HAVE___RES_GETSERVERS)) || \ + defined(HAVE_RES_GETSERVERS) static void sockaddr_in6_to_WS_storage( SOCKADDR_STORAGE *dst, const struct sockaddr_in6 *src ) { SOCKADDR_IN6 *s = (SOCKADDR_IN6 *)dst; @@ -1284,6 +1285,47 @@ static void initialise_resolver(void) LeaveCriticalSection(&res_init_cs); } +#ifdef HAVE_RES_GETSERVERS +static int get_dns_servers( SOCKADDR_STORAGE *servers, int num, BOOL ip4_only ) +{ + struct __res_state *state = &_res; + int i, found = 0, total; + SOCKADDR_STORAGE *addr = servers; + union res_sockaddr_union *buf; + + initialise_resolver(); + + total = res_getservers( state, NULL, 0 ); + + if ((!servers || !num) && !ip4_only) return total; + + buf = HeapAlloc( GetProcessHeap(), 0, total * sizeof(union res_sockaddr_union) ); + total = res_getservers( state, buf, total ); + + for (i = 0; i < total; i++) + { + if (buf[i].sin6.sin6_family == AF_INET6 && ip4_only) continue; + if (buf[i].sin.sin_family != AF_INET && buf[i].sin6.sin6_family != AF_INET6) continue; + + found++; + if (!servers || !num) continue; + + if (buf[i].sin6.sin6_family == AF_INET6) + { + sockaddr_in6_to_WS_storage( addr, &buf[i].sin6 ); + } + else + { + sockaddr_in_to_WS_storage( addr, &buf[i].sin ); + } + 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 ) { int i, ip6_count = 0; @@ -1319,6 +1361,7 @@ static int get_dns_servers( SOCKADDR_STORAGE *servers, int num, BOOL ip4_only ) } return addr - servers; } +#endif #elif defined(HAVE___RES_GET_STATE) && defined(HAVE___RES_GETSERVERS) static int get_dns_servers( SOCKADDR_STORAGE *servers, int num, BOOL ip4_only ) diff --git a/include/config.h.in b/include/config.h.in index db9c7a1e7d9..8ccbf0e7e5f 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -761,6 +761,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_RESOLV_H +/* Define to 1 if you have the `res_getservers' function. */ +#undef HAVE_RES_GETSERVERS + /* Define to 1 if you have the `rint' function. */ #undef HAVE_RINT