From d5f4328efd5f4eaa7c89cad9773124959195430a Mon Sep 17 00:00:00 2001 From: David du Colombier Date: Thu, 17 Mar 2011 10:40:16 +0100 Subject: [PATCH] [MEDIUM] use getaddrinfo to resolve names if gethostbyname fail Function gethostbyname is deprecated since IEEE Std 1003.1-2008 and was replaced by getaddrinfo (available since IEEE Std 1003.1-2004). Contrary to gethostbyname, getaddrinfo is specified to support both IPv4 and IPv4 addresses. Since some libc doesn't handle getaddrinfo properly, constant USE_GETADDRINFO must be defined at compile time to enable use of getaddrinfo. --- src/standard.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/standard.c b/src/standard.c index 033ece7bd..0e5c71ea3 100644 --- a/src/standard.c +++ b/src/standard.c @@ -265,8 +265,34 @@ struct sockaddr_storage *str2ip(const char *str) ((struct sockaddr_in6 *)&sa)->sin6_addr = *(struct in6_addr *) *(he->h_addr_list); return &sa; } - /* unsupported address family */ } +#ifdef USE_GETADDRINFO + else { + struct addrinfo hints, *result; + + memset(&result, 0, sizeof(result)); + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = AI_PASSIVE; + hints.ai_protocol = 0; + + if (getaddrinfo(str, NULL, &hints, &result) == 0) { + sa.ss_family = result->ai_family; + switch (result->ai_family) { + case AF_INET: + memcpy((struct sockaddr_in *)&sa, result->ai_addr, result->ai_addrlen); + return &sa; + case AF_INET6: + memcpy((struct sockaddr_in6 *)&sa, result->ai_addr, result->ai_addrlen); + return &sa; + } + } + + freeaddrinfo(result); + } +#endif + /* unsupported address family */ return NULL; }