Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compatibility with OSes where sin_len has to be set #21

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 28 additions & 2 deletions src/dns.c
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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;
Expand All @@ -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:
Expand Down Expand Up @@ -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]))
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);

Expand All @@ -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);

Expand Down Expand Up @@ -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));
Expand Down