+#if HAVE_GETADDRINFO
+const char *resolv_host(int family, const char *host, dlist *addr_list)
+{
+ int res;
+ struct addrinfo hints;
+ struct addrinfo *ai, *rp;
+ IPADDR *addr;
+
+ memset(&hints, 0, sizeof(struct addrinfo));
+ hints.ai_family = family;
+ hints.ai_socktype = 0;
+ hints.ai_protocol = 0;
+ hints.ai_flags = 0;
+
+ res = getaddrinfo(host, NULL, &hints, &ai);
+ if (res != 0) {
+ return gai_strerror(res);
+ }
+
+ for (rp = ai; rp != NULL; rp = rp->ai_next) {
+ switch (rp->ai_addr->sa_family) {
+ case AF_INET:
+ addr = New(IPADDR(rp->ai_addr->sa_family));
+ addr->set_type(IPADDR::R_MULTIPLE);
+ /*
+ * Some serious casting to get the struct in_addr *
+ * rp->ai_addr == struct sockaddr
+ * as this is AF_INET family we can cast that
+ * to struct_sockaddr_in. Of that we need the
+ * address of the sin_addr member which contains a
+ * struct in_addr
+ */
+ addr->set_addr4(&(((struct sockaddr_in *)rp->ai_addr)->sin_addr));
+ break;
+#ifdef HAVE_IPV6
+ case AF_INET6:
+ addr = New(IPADDR(rp->ai_addr->sa_family));
+ addr->set_type(IPADDR::R_MULTIPLE);
+ /*
+ * Some serious casting to get the struct in6_addr *
+ * rp->ai_addr == struct sockaddr
+ * as this is AF_INET6 family we can cast that
+ * to struct_sockaddr_in6. Of that we need the
+ * address of the sin6_addr member which contains a
+ * struct in6_addr
+ */
+ addr->set_addr6(&(((struct sockaddr_in6 *)rp->ai_addr)->sin6_addr));
+ break;
+#endif
+ default:
+ continue;
+ }
+ addr_list->append(addr);
+ }
+ freeaddrinfo(ai);
+ return NULL;
+}
+#else