[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.
diff --git a/src/standard.c b/src/standard.c
index 033ece7..0e5c71e 100644
--- a/src/standard.c
+++ b/src/standard.c
@@ -265,8 +265,34 @@
 			((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;
 }