diff --git a/src/dns.c b/src/dns.c index 15ff335..f87da3c 100644 --- a/src/dns.c +++ b/src/dns.c @@ -23,11 +23,19 @@ * USE OR OTHER DEALINGS IN THE SOFTWARE. * ========================================================================== */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #if !defined(__FreeBSD__) && !defined(__sun) #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 #endif +#if defined(__FreeBSD__) +#define HAVE_STRUCT_SOCKADDR_SA_LEN +#endif + #undef _BSD_SOURCE #define _BSD_SOURCE @@ -927,6 +935,9 @@ static int dns_inet_pton(int af, const void *src, void *dst) { union { struct sockaddr_in sin; struct sockaddr_in6 sin6; } u; u.sin.sin_family = af; +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + u.sin.sin_len = dns_af_len(af); +#endif if (0 != WSAStringToAddressA((void *)src, af, (void *)0, (struct sockaddr *)&u, &(int){ sizeof u })) return -1; @@ -952,6 +963,9 @@ static const char *dns_inet_ntop(int af, const void *src, void *dst, unsigned lo memset(&u, 0, sizeof u); u.sin.sin_family = af; +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + u.sin.sin_len = dns_af_len(af); +#endif switch (af) { case AF_INET6: @@ -4429,8 +4443,8 @@ struct dns_resolv_conf *dns_resconf_open(int *error) { sin->sin_family = AF_INET; sin->sin_addr.s_addr = INADDR_ANY; sin->sin_port = htons(53); -#if defined(SA_LEN) - sin->sin_len = sizeof *sin; +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + sin->sin_len = dns_af_len(sin->sin_family); #endif if (0 != gethostname(resconf->search[0], sizeof resconf->search[0])) @@ -7516,6 +7530,9 @@ static int dns_res_exec(struct dns_resolver *R) { sin.sin_family = AF_INET; sin.sin_addr = a.addr; +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + sin.sin_len = dns_af_len(sin.sin_family); +#endif if (R->sp == 0) sin.sin_port = dns_hints_port(R->hints, AF_INET, &sin.sin_addr); else @@ -8207,6 +8224,9 @@ static int dns_ai_setent(struct addrinfo **ent, union dns_any *any, enum dns_typ sin.sin_family = AF_INET; sin.sin_port = htons(ai->port); +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + sin.sin_len = dns_af_len(sin.sin_family); +#endif memcpy(&sin.sin_addr, any, sizeof sin.sin_addr); @@ -8216,6 +8236,9 @@ static int dns_ai_setent(struct addrinfo **ent, union dns_any *any, enum dns_typ sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(ai->port); +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + sin6.sin6_len = dns_af_len(sin6.sin6_family); +#endif memcpy(&sin6.sin6_addr, any, sizeof sin6.sin6_addr); @@ -9613,6 +9636,9 @@ static int echo_port(int argc DNS_NOTUSED, char *argv[] DNS_NOTUSED) { port.sin.sin_family = AF_INET; port.sin.sin_port = htons(5354); port.sin.sin_addr.s_addr = inet_addr("127.0.0.1"); +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + port.sin.sin_len = dns_af_len(port.sin.sin_family); +#endif if (-1 == (fd = socket(PF_INET, SOCK_DGRAM, 0))) panic("socket: %s", strerror(errno));