#ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include "gai.h" /* * Set up the search[] array with the hostnames and address families * that we are to look up. */ /* include ga_nsearch1 */ int ga_nsearch(const char *hostname, const struct addrinfo *hintsp, struct search *search) { int nsearch = 0; if (hostname == NULL || hostname[0] == '\0') { if (hintsp->ai_flags & AI_PASSIVE) { /* 4no hostname and AI_PASSIVE: implies wildcard bind */ switch (hintsp->ai_family) { #ifdef IPV4 case AF_INET: search[nsearch].host = "0.0.0.0"; search[nsearch].family = AF_INET; nsearch++; break; #endif #ifdef IPV6 case AF_INET6: search[nsearch].host = "0::0"; search[nsearch].family = AF_INET6; nsearch++; break; #endif case AF_UNSPEC: #ifdef IPV6 search[nsearch].host = "0::0"; /* IPv6 first, then IPv4 */ search[nsearch].family = AF_INET6; nsearch++; #endif #ifdef IPV4 search[nsearch].host = "0.0.0.0"; search[nsearch].family = AF_INET; nsearch++; #endif break; } } else { /* no host and not AI_PASSIVE: connect to local host */ switch (hintsp->ai_family) { #ifdef IPV4 case AF_INET: search[nsearch].host = "localhost"; /* 127.0.0.1 */ search[nsearch].family = AF_INET; nsearch++; break; #endif #ifdef IPV6 case AF_INET6: search[nsearch].host = "0::1"; search[nsearch].family = AF_INET6; nsearch++; break; #endif case AF_UNSPEC: #ifdef IPV6 search[nsearch].host = "0::1"; /* IPv6 first, then IPv4 */ search[nsearch].family = AF_INET6; nsearch++; #endif #ifdef IPV4 search[nsearch].host = "localhost"; search[nsearch].family = AF_INET; nsearch++; #endif break; } } } else { /* host is specified */ switch (hintsp->ai_family) { #ifdef IPV4 case AF_INET: search[nsearch].host = hostname; search[nsearch].family = AF_INET; nsearch++; break; #endif #ifdef IPV6 case AF_INET6: search[nsearch].host = hostname; search[nsearch].family = AF_INET6; nsearch++; break; #endif case AF_UNSPEC: #ifdef IPV6 search[nsearch].host = hostname; search[nsearch].family = AF_INET6; /* IPv6 first */ nsearch++; #endif #ifdef IPV4 search[nsearch].host = hostname; search[nsearch].family = AF_INET; /* then IPv4 */ nsearch++; #endif break; } } assert(nsearch > 0); assert(nsearch < 3); return (nsearch); }