OSDN Git Service

Fix bogus freeaddrinfo() call in WIN32 code, extend gai_strerror to
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 25 Aug 2005 17:51:01 +0000 (17:51 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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 8c430bf..3561aac 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 <netdb.h>, 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 77757d3..1bdb605 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";
        }