X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fgetaddrinfo.c;h=9003abf60ac7e145ac755153de2897df22e7837c;hb=318cd4fb068ae9332577a181f8cbb51a457a0bce;hp=c54d407d06980999c7a4621e3c7a6cf14dc022bf;hpb=8e97d8dc6772e6237cf2fca361e1f6d04be30585;p=gnulib.git diff --git a/lib/getaddrinfo.c b/lib/getaddrinfo.c index c54d407d0..9003abf60 100644 --- a/lib/getaddrinfo.c +++ b/lib/getaddrinfo.c @@ -47,11 +47,11 @@ #endif #ifdef WIN32_NATIVE -typedef int WSAAPI (*getaddrinfo_func) (const char*, const char*, +typedef int (WSAAPI *getaddrinfo_func) (const char*, const char*, const struct addrinfo*, struct addrinfo**); -typedef void WSAAPI (*freeaddrinfo_func) (struct addrinfo*); -typedef int WSAAPI (*getnameinfo_func) (const struct sockaddr*, +typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo*); +typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr*, socklen_t, char*, DWORD, char*, DWORD, int); @@ -74,9 +74,9 @@ use_win32_p (void) if (h) { - getaddrinfo_ptr = GetProcAddress (h, "getaddrinfo"); - freeaddrinfo_ptr = GetProcAddress (h, "freeaddrinfo"); - getnameinfo_ptr = GetProcAddress (h, "getnameinfo"); + getaddrinfo_ptr = (getaddrinfo_func) GetProcAddress (h, "getaddrinfo"); + freeaddrinfo_ptr = (freeaddrinfo_func) GetProcAddress (h, "freeaddrinfo"); + getnameinfo_ptr = (getnameinfo_func) GetProcAddress (h, "getnameinfo"); } /* If either is missing, something is odd. */ @@ -140,7 +140,7 @@ getaddrinfo (const char *restrict nodename, return getaddrinfo_ptr (nodename, servname, hints, res); #endif - if (hints && (hints->ai_flags & ~AI_CANONNAME)) + if (hints && (hints->ai_flags & ~(AI_CANONNAME|AI_PASSIVE))) /* FIXME: Support more flags. */ return EAI_BADFLAGS; @@ -153,8 +153,16 @@ getaddrinfo (const char *restrict nodename, return EAI_SOCKTYPE; /* FIXME: Better return code? */ if (!nodename) - /* FIXME: Support server bind mode. */ - return EAI_NONAME; + { + if (!(hints->ai_flags & AI_PASSIVE)) + return EAI_NONAME; + +#ifdef HAVE_IPV6 + nodename = (hint->ai_family == AF_INET6) ? "::" : "0.0.0.0"; +#else + nodename = "0.0.0.0"; +#endif + } if (servname) { @@ -296,7 +304,10 @@ freeaddrinfo (struct addrinfo *ai) { #ifdef WIN32_NATIVE if (use_win32_p ()) - return freeaddrinfo_ptr (ai); + { + freeaddrinfo_ptr (ai); + return; + } #endif while (ai) @@ -316,7 +327,7 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, char *restrict service, socklen_t servicelen, int flags) { -#if WIN32_NATIVE +#ifdef WIN32_NATIVE if (use_win32_p ()) return getnameinfo_ptr (sa, salen, node, nodelen, service, servicelen, flags);