From ca5d2708e08d1c24e92639895199c3e835eb54d5 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sat, 17 Feb 2018 19:30:05 +0100 Subject: [PATCH] wg: FreeBSD doesn't have EAI_NODATA Signed-off-by: Jason A. Donenfeld --- src/config.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 93c39fa..b07aa46 100644 --- a/src/config.c +++ b/src/config.c @@ -224,8 +224,21 @@ static inline bool parse_endpoint(struct sockaddr *endpoint, const char *value) if (!ret) break; timeout = timeout * 3 / 2; - /* The set of return codes that are "permanent failures". All other possibilities are potentially transient. */ - if (ret == EAI_NONAME || ret == EAI_FAIL || ret == EAI_NODATA || timeout >= 90000000) { + /* The set of return codes that are "permanent failures". All other possibilities are potentially transient. + * + * This is according to https://sourceware.org/glibc/wiki/NameResolver which states: + * "From the perspective of the application that calls getaddrinfo() it perhaps + * doesn't matter that much since EAI_FAIL, EAI_NONAME and EAI_NODATA are all + * permanent failure codes and the causes are all permanent failures in the + * sense that there is no point in retrying later." + * + * So this is what we do, except FreeBSD removed EAI_NODATA some time ago, so that's conditional. + */ + if (ret == EAI_NONAME || ret == EAI_FAIL || + #ifdef EAI_NODATA + ret == EAI_NODATA || + #endif + timeout >= 90000000) { free(mutable); fprintf(stderr, "%s: `%s'\n", ret == EAI_SYSTEM ? strerror(errno) : gai_strerror(ret), value); return false;