diff --git a/SConstruct b/SConstruct index e8b7cc4b0..2910bf8e4 100644 --- a/SConstruct +++ b/SConstruct @@ -1743,6 +1743,28 @@ help:always wipe certain freed memory return !strcasecmp(argv[0], argv[0] + 1) && !strncasecmp(argv[0] + 1, argv[0], 1); ''' self.Compile(context, text='#include ', main=main, msg='for strcasecmp', successflags=_successflags) + @_custom_test + def check_getaddrinfo_present(self,context,_successflags={'CPPDEFINES' : ['DXX_HAVE_GETADDRINFO']}): + self.Compile(context, text=''' +#ifdef WIN32 +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif +#include +#include +#else +#include +#include +#include +#endif +''', main=''' + addrinfo *res = nullptr; + const addrinfo *hints = nullptr; + int i = getaddrinfo("", "", hints, &res); + (void)i; + freeaddrinfo(res); + return 0; +''', msg='for getaddrinfo', successflags=_successflags) __preferred_compiler_options = ( '-fvisibility=hidden', '-Wsuggest-attribute=noreturn', diff --git a/similar/main/net_udp.cpp b/similar/main/net_udp.cpp index bdd3694c4..3cce1d670 100644 --- a/similar/main/net_udp.cpp +++ b/similar/main/net_udp.cpp @@ -523,6 +523,7 @@ public: // Resolve address int udp_dns_filladdr_t::apply(sockaddr &addr, socklen_t addrlen, int ai_family, const char *host, uint16_t port) { +#ifdef DXX_HAVE_GETADDRINFO // Variables addrinfo hints{}; char sPort[6]; @@ -568,6 +569,23 @@ int udp_dns_filladdr_t::apply(sockaddr &addr, socklen_t addrlen, int ai_family, */ // Free memory +#else + sockaddr_in &sai = reinterpret_cast(addr); + if (addrlen < sizeof(sai)) + return -1; + const auto he = gethostbyname(host); + if (!he) + { + con_printf(CON_URGENT, "udp_dns_filladdr (gethostbyname) failed for host %s", host); + nm_messagebox(TXT_ERROR, 1, TXT_OK, "Could not resolve IPv4 address\n%s", host); + addr.sa_family = AF_UNSPEC; + return -1; + } + sai = {}; + sai.sin_family = ai_family; + sai.sin_port = htons(port); + sai.sin_addr = *reinterpret_cast(he->h_addr); +#endif return 0; }