diff --git a/configure b/configure index 7d45eb869a592a00c3cd61ae7c404812365efa2a..d6ae5799a968fd58ace0695dd72144ae0a9c09d6 100755 --- a/configure +++ b/configure @@ -18657,6 +18657,17 @@ $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext + ac_fn_c_check_member "$LINENO" "struct __res_state" "_u._ext.nsaddrs" "ac_cv_member_struct___res_state__u__ext_nsaddrs" "#include <resolv.h> +" +if test "x$ac_cv_member_struct___res_state__u__ext_nsaddrs" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT___RES_STATE__U__EXT_NSADDRS 1 +_ACEOF + + +fi + else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } diff --git a/configure.ac b/configure.ac index ea6080dd3aee3993bc34b5221aa7a7c2332fa612..e61a96fc42105962be127ff355bd13a5679a83f9 100644 --- a/configure.ac +++ b/configure.ac @@ -1459,7 +1459,8 @@ AC_LINK_IFELSE( AC_MSG_RESULT(yes) AC_DEFINE([HAVE_RES_CLOSE], 1, [Define to 1 if your system has the close resolver function.]), AC_MSG_RESULT(no) - ), + ) + AC_CHECK_MEMBERS([struct __res_state._u._ext.nsaddrs], [], [], [[#include <resolv.h>]]), AC_MSG_RESULT(no) ) diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index fc3a9bdb00bae8ed61d9670656abe7590dab0f92..776074d4ff8802730db560d2c2349e96705199ff 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -1052,6 +1052,9 @@ /* Define to 1 if `uid' is a member of `struct ucred'. */ #undef HAVE_STRUCT_UCRED_UID +/* Define to 1 if `_u._ext.nsaddrs' is a member of `struct __res_state'. */ +#undef HAVE_STRUCT___RES_STATE__U__EXT_NSADDRS + /* Define to 1 if you have the `swapctl' function. */ #undef HAVE_SWAPCTL diff --git a/main/dns.c b/main/dns.c index 782d4a8f8de2ed4d7d472daf18b2f857f864123e..9cf0cf41ded573c3b0e48c6981ee4af4cc70d5d7 100644 --- a/main/dns.c +++ b/main/dns.c @@ -605,7 +605,22 @@ struct ao2_container *ast_dns_get_nameservers(void) #endif for (i = 0; i < state->nscount; i++) { - ast_str_container_add(nameservers, ast_inet_ntoa(state->nsaddr_list[i].sin_addr)); + char addr[INET6_ADDRSTRLEN]; + const char *addrp = NULL; + + /* glibc sets sin_family to 0 when the nameserver is an IPv6 address */ + if (state->nsaddr_list[i].sin_family) { + addrp = inet_ntop(AF_INET, &state->nsaddr_list[i].sin_addr, addr, sizeof(addr)); +#if defined(HAVE_RES_NINIT) && defined(HAVE_STRUCT___RES_STATE__U__EXT_NSADDRS) + } else if (state->_u._ext.nsaddrs[i]) { + addrp = inet_ntop(AF_INET6, &state->_u._ext.nsaddrs[i]->sin6_addr, addr, sizeof(addr)); +#endif + } + + if (addrp) { + ast_debug(1, "Discovered nameserver: %s\n", addrp); + ast_str_container_add(nameservers, addrp); + } } #ifdef HAVE_RES_NINIT