Fix bogus freeaddrinfo() call in WIN32 code, extend gai_strerror to
authorTom Lane
Thu, 25 Aug 2005 17:51:01 +0000 (17:51 +0000)
committerTom Lane
Thu, 25 Aug 2005 17:51:01 +0000 (17:51 +0000)
cover more error codes.  Per Petr Jelinek.

src/include/getaddrinfo.h
src/port/getaddrinfo.c

index 8c430bf5d85e4f1a0a3ec0313ec76b0303587899..3561aac09104ff2b46ecc251f1ade5963ddf0be4 100644 (file)
@@ -15,7 +15,7 @@
  *
  * Copyright (c) 2003-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/include/getaddrinfo.h,v 1.15 2005/07/27 12:44:10 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/getaddrinfo.h,v 1.16 2005/08/25 17:50:59 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -31,6 +31,7 @@
 /* Various macros that ought to be in , but might not be */
 
 #ifndef EAI_FAIL
+#ifndef WIN32
 #define EAI_BADFLAGS   (-1)
 #define EAI_NONAME     (-2)
 #define EAI_AGAIN      (-3)
 #define EAI_SERVICE        (-8)
 #define EAI_MEMORY     (-10)
 #define EAI_SYSTEM     (-11)
-#endif
+#else /* WIN32 */
+#define EAI_AGAIN      WSATRY_AGAIN
+#define EAI_BADFLAGS   WSAEINVAL
+#define EAI_FAIL       WSANO_RECOVERY
+#define EAI_FAMILY     WSAEAFNOSUPPORT
+#define EAI_MEMORY     WSA_NOT_ENOUGH_MEMORY
+#define EAI_NODATA     WSANO_DATA
+#define EAI_NONAME     WSAHOST_NOT_FOUND
+#define EAI_SERVICE        WSATYPE_NOT_FOUND
+#define EAI_SOCKTYPE   WSAESOCKTNOSUPPORT 
+#endif /* !WIN32 */
+#endif /* !EAI_FAIL */
 
 #ifndef AI_PASSIVE
 #define AI_PASSIVE     0x0001
index 77757d3a79270f5378ce6ffd76c7a6e9bfb9b1d7..1bdb60503b52add6e95aa07cd0ea9a6ba9e734fe 100644 (file)
@@ -16,7 +16,7 @@
  * Copyright (c) 2003-2005, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/port/getaddrinfo.c,v 1.18 2005/08/24 22:13:23 tgl Exp $
+ *   $PostgreSQL: pgsql/src/port/getaddrinfo.c,v 1.19 2005/08/25 17:51:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -103,9 +103,12 @@ haveNativeWindowsIPv6routines(void)
    {
        /* We found a dll, so now get the addresses of the routines */
 
-       getaddrinfo_ptr = GetProcAddress(hLibrary, "getaddrinfo");
-       freeaddrinfo_ptr = GetProcAddress(hLibrary, "freeaddrinfo");
-       getnameinfo_ptr = GetProcAddress(hLibrary, "getnameinfo");
+       getaddrinfo_ptr = (getaddrinfo_ptr_t) GetProcAddress(hLibrary,
+                                                            "getaddrinfo");
+       freeaddrinfo_ptr = (freeaddrinfo_ptr_t) GetProcAddress(hLibrary,
+                                                              "freeaddrinfo");
+       getnameinfo_ptr = (getnameinfo_ptr_t) GetProcAddress(hLibrary,
+                                                            "getnameinfo");
 
        /*
         * If any one of the routines is missing, let's play it safe and
@@ -277,7 +280,7 @@ freeaddrinfo(struct addrinfo * res)
         */
        if (haveNativeWindowsIPv6routines())
        {
-           (*freeaddrinfo_ptr) (node, service, hintp, res);
+           (*freeaddrinfo_ptr) (res);
            return;
        }
 #endif
@@ -310,7 +313,8 @@ gai_strerror(int errcode)
    }
 
    return hstrerror(hcode);
-#else                          /* !HAVE_HSTRERROR */
+
+#else  /* !HAVE_HSTRERROR */
 
    switch (errcode)
    {
@@ -318,7 +322,31 @@ gai_strerror(int errcode)
            return "Unknown host";
        case EAI_AGAIN:
            return "Host name lookup failure";
-       case EAI_FAIL:
+       /* Errors below are probably WIN32 only */
+#ifdef EAI_BADFLAGS
+       case EAI_BADFLAGS:
+           return "Invalid argument";
+#endif
+#ifdef EAI_FAMILY
+       case EAI_FAMILY:
+           return "Address family not supported";
+#endif
+#ifdef EAI_MEMORY
+       case EAI_MEMORY:
+           return "Not enough memory";
+#endif
+#ifdef EAI_NODATA
+       case EAI_NODATA:
+           return "No host data of that type was found";
+#endif
+#ifdef EAI_SERVICE
+       case EAI_SERVICE:
+           return "Class type not found";
+#endif
+#ifdef EAI_SOCKTYPE
+       case EAI_SOCKTYPE:
+           return "Socket type not supported";
+#endif
        default:
            return "Unknown server error";
    }