From 93702c87726ac9f29df41e192c105e2f030d1d80 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 10 Mar 2020 13:07:25 +0100 Subject: [PATCH] rwrap: split out rwrap_{get,log}_nameservers() functions This will make it easier to add support for ipv6 nameservers on FreeBSD in the next step. Signed-off-by: Stefan Metzmacher Reviewed-by: Andreas Schneider --- src/resolv_wrapper.c | 98 ++++++++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 26 deletions(-) diff --git a/src/resolv_wrapper.c b/src/resolv_wrapper.c index 7c5bf81..c97ad26 100644 --- a/src/resolv_wrapper.c +++ b/src/resolv_wrapper.c @@ -177,6 +177,12 @@ static void rwrap_log(enum rwrap_dbglvl_e dbglvl, #define RWRAP_MAX_RECURSION 64 +union rwrap_sockaddr { + struct sockaddr sa; + struct sockaddr_in in; + struct sockaddr_in6 in6; +}; + /* Priority and weight can be omitted from the hosts file, but need to be part * of the output */ @@ -1606,6 +1612,70 @@ static int libc_res_nsearch(struct __res_state *state, * RES_HELPER ***************************************************************************/ +static size_t rwrap_get_nameservers(struct __res_state *state, + size_t nserv, + union rwrap_sockaddr *nsaddrs) +{ + size_t i; + + memset(nsaddrs, 0, sizeof(*nsaddrs) * nserv); + + if (nserv > (size_t)state->nscount) { + nserv = (size_t)state->nscount; + } + + for (i = 0; i < nserv; i++) { +#ifdef HAVE_RES_STATE_U_EXT_NSADDRS + if (state->_u._ext.nsaddrs[i] != NULL) { + nsaddrs[i] = (union rwrap_sockaddr) { + .in6 = *state->_u._ext.nsaddrs[i], + }; + } else +#endif /* HAVE_RES_STATE_U_EXT_NSADDRS */ + { + nsaddrs[i] = (union rwrap_sockaddr) { + .in = state->nsaddr_list[i], + }; + } + } + + return nserv; +} + +static void rwrap_log_nameservers(enum rwrap_dbglvl_e dbglvl, + const char *func, + struct __res_state *state) +{ + union rwrap_sockaddr nsaddrs[MAXNS]; + size_t nserv = MAXNS; + size_t i; + + memset(nsaddrs, 0, sizeof(nsaddrs)); + nserv = rwrap_get_nameservers(state, nserv, nsaddrs); + for (i = 0; i < nserv; i++) { + char ip[INET6_ADDRSTRLEN]; + + switch (nsaddrs[i].sa.sa_family) { + case AF_INET: + inet_ntop(AF_INET, &(nsaddrs[i].in.sin_addr), + ip, sizeof(ip)); + break; + case AF_INET6: + inet_ntop(AF_INET6, &(nsaddrs[i].in6.sin6_addr), + ip, sizeof(ip)); + break; + default: + snprintf(ip, sizeof(ip), "nscount; i++) { - char ip[INET6_ADDRSTRLEN]; - - inet_ntop(AF_INET, &state->nsaddr_list[i].sin_addr, ip, sizeof(ip)); - RWRAP_LOG(RWRAP_LOG_TRACE, - " nameserver: %s", - ip); - } -#endif + rwrap_log_nameservers(RWRAP_LOG_TRACE, __func__, state); fake_hosts = getenv("RESOLV_WRAPPER_HOSTS"); if (fake_hosts != NULL) { @@ -1959,23 +2017,11 @@ static int rwrap_res_nsearch(struct __res_state *state, { int rc; const char *fake_hosts; -#ifndef NDEBUG - int i; -#endif RWRAP_LOG(RWRAP_LOG_TRACE, "Resolve the domain name [%s] - class=%d, type=%d", dname, class, type); -#ifndef NDEBUG - for (i = 0; i < state->nscount; i++) { - char ip[INET6_ADDRSTRLEN]; - - inet_ntop(AF_INET, &state->nsaddr_list[i].sin_addr, ip, sizeof(ip)); - RWRAP_LOG(RWRAP_LOG_TRACE, - " nameserver: %s", - ip); - } -#endif + rwrap_log_nameservers(RWRAP_LOG_TRACE, __func__, state); fake_hosts = getenv("RESOLV_WRAPPER_HOSTS"); if (fake_hosts != NULL) { -- 2.34.1