diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c
index 81af3be753277770883c9e8408a1ee67de31fc3c..411b839be477f36cdaf3b18010752dc61eedd924 100644
--- a/src/interfaces/libpq/fe-misc.c
+++ b/src/interfaces/libpq/fe-misc.c
@@ -25,7 +25,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.54 2001/08/21 20:39:54 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.55 2001/09/06 02:52:00 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -855,23 +855,46 @@ libpq_gettext(const char *msgid)
 #ifdef WIN32
 /*
  * strerror replacement for windows:
+ *
+ * We dont't know a fix for win9x yet, but this whould work for nt4 and win2k.
+ * If you can verify this working on win9x or have a solution, let us know, ok?
+ *
  */
 const char*
 winsock_strerror(DWORD eno)
 {
-	if (!FormatMessage( 
-		FORMAT_MESSAGE_IGNORE_INSERTS |
-        FORMAT_MESSAGE_FROM_SYSTEM | /* always consider system table */
-        ((netmsgModule != NULL) ? FORMAT_MESSAGE_FROM_HMODULE : 0),
-        netmsgModule, /* module to get message from (NULL == system) */
-		eno,
-        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-        winsock_strerror_buf,sizeof(winsock_strerror_buf)-1,
-        NULL
-       )){
-      sprintf(winsock_strerror_buf,"Unknown socket error(%u)",eno);
-    }
-    winsock_strerror_buf[sizeof(winsock_strerror_buf)-1]='\0';
-    return winsock_strerror_buf;
+  #define WSSE_MAXLEN (sizeof(winsock_strerror_buf)-1-12) /* 12 == "(0x00000000)" */
+  int length;
+
+  /* First try the "system table", this works on Win2k pro */
+
+  if (FormatMessage(
+	   FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM,
+	   0,eno,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+	   winsock_strerror_buf,WSSE_MAXLEN,NULL
+	 ))
+    goto WSSE_GOODEXIT;
+
+  /* That didn't work, let's try the netmsg.dll */
+
+  if (netmsgModule && 
+      FormatMessage(
+	   FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_HMODULE,
+	   0,eno,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+	   winsock_strerror_buf,WSSE_MAXLEN,NULL 
+	   ))
+    goto WSSE_GOODEXIT;
+
+  /* Everything failed, just tell the user that we don't know the desc */
+  
+  strcat(winsock_strerror_buf,"Socket error, no description available.");
+
+WSSE_GOODEXIT:
+
+  length = strlen(winsock_strerror_buf);
+  sprintf(winsock_strerror_buf + length<WSSE_MAXLEN?length:WSSE_MAXLEN,
+	  "(0x%08X)",eno);
+
+  return winsock_strerror_buf;
 }
 #endif