Update from GNU gettext 0.15.
[gnulib.git] / lib / getaddrinfo.c
index c54d407..9003abf 100644 (file)
 #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);