aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-08-25 17:51:01 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-08-25 17:51:01 +0000
commit09a6c909458b44c51d0c8a8b58ae2590c7815b9f (patch)
tree876e5a59499c577581158bb3e177c4d2467cf9f3 /src
parent1a33436224146fc1091a7eca2e87fde3c5463767 (diff)
downloadpostgresql-09a6c909458b44c51d0c8a8b58ae2590c7815b9f.tar.gz
postgresql-09a6c909458b44c51d0c8a8b58ae2590c7815b9f.zip
Fix bogus freeaddrinfo() call in WIN32 code, extend gai_strerror to
cover more error codes. Per Petr Jelinek.
Diffstat (limited to 'src')
-rw-r--r--src/include/getaddrinfo.h16
-rw-r--r--src/port/getaddrinfo.c42
2 files changed, 49 insertions, 9 deletions
diff --git a/src/include/getaddrinfo.h b/src/include/getaddrinfo.h
index 8c430bf5d85..3561aac0910 100644
--- a/src/include/getaddrinfo.h
+++ b/src/include/getaddrinfo.h
@@ -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)
@@ -40,7 +41,18 @@
#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
diff --git a/src/port/getaddrinfo.c b/src/port/getaddrinfo.c
index 77757d3a792..1bdb60503b5 100644
--- a/src/port/getaddrinfo.c
+++ b/src/port/getaddrinfo.c
@@ -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";
}