iphlpapi: Use res_getservers() if available to get the DNS server list.
Signed-off-by: Chip Davis <cdavis@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
7814da1fd4
commit
39464e86a0
|
@ -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 <resolv.h>
|
||||
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"
|
||||
|
|
14
configure.ac
14
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 <resolv.h>]],[[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 ***
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -761,6 +761,9 @@
|
|||
/* Define to 1 if you have the <resolv.h> 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
|
||||
|
||||
|
|
Loading…
Reference in New Issue