]> granicus.if.org Git - postgresql/commitdiff
Per discussion earlier today, here is a fix that lets ereport() on win32
authorBruce Momjian <bruce@momjian.us>
Thu, 22 Apr 2004 03:51:24 +0000 (03:51 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 22 Apr 2004 03:51:24 +0000 (03:51 +0000)
report socket errors.

Magnus Hagander

src/backend/port/win32/socket.c
src/backend/utils/error/elog.c
src/include/port/win32.h

index 878e7a276f40a14b5538e14a252ce4f6abe7c0a2..5eb308236389085d0b9a261aede29eb9892894cb 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/port/win32/socket.c,v 1.1 2004/04/12 16:19:18 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/port/win32/socket.c,v 1.2 2004/04/22 03:50:54 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -432,3 +432,35 @@ int pgwin32_select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfd
        return nummatches;
 }
 
+
+/* 
+ * Return win32 error string, since strerror can't
+ * handle winsock codes 
+ */
+static char wserrbuf[256];
+const char *
+pgwin32_socket_strerror(int err)
+{
+       static HANDLE handleDLL = INVALID_HANDLE_VALUE;
+
+       if (handleDLL == INVALID_HANDLE_VALUE) {
+               handleDLL = LoadLibraryEx("netmsg.dll", NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE);
+               if (handleDLL ==  NULL)
+                       ereport(FATAL,
+                                       (errmsg_internal("Failed to load netmsg.dll: %i",(int)GetLastError())));
+       }
+
+       ZeroMemory(&wserrbuf, sizeof(wserrbuf));
+       if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE,
+                                         handleDLL,
+                                         err,
+                                         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                                         wserrbuf,
+                                         sizeof(wserrbuf)-1,
+                                         NULL) == 0) {
+               /* Failed to get id */
+               sprintf(wserrbuf,"Unknown winsock error %i",err);
+       }
+       return wserrbuf;
+}
+
index 42650a1f7e5e33d9cb31dd4248c25ba66c7ce418..234bc4af39f39f1d34e4f8837a2e1035407198a8 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.134 2004/04/16 12:59:05 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.135 2004/04/22 03:51:09 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1661,6 +1661,11 @@ useful_strerror(int errnum)
        static char errorstr_buf[48];
        const char *str;
 
+#ifdef WIN32
+       /* Winsock error code range, per WinError.h */
+       if (errnum >= 10000 && errnum <= 11999)
+               return pgwin32_socket_strerror(errnum);
+#endif
        str = strerror(errnum);
 
        /*
index fb91e66468bc08c7f98927ffcec68b9c0ea84cf8..03bc7a75b989c16c64dda4c2f9f876b6e254e2d7 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/include/port/win32.h,v 1.22 2004/04/19 17:42:59 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/include/port/win32.h,v 1.23 2004/04/22 03:51:24 momjian Exp $ */
 
 /* undefine and redefine after #include */
 #undef mkdir
@@ -139,6 +139,8 @@ int pgwin32_connect(SOCKET s, const struct sockaddr* name, int namelen);
 int pgwin32_select(int nfds, fd_set* readfs, fd_set* writefds, fd_set* exceptfds, const struct timeval* timeout);
 int pgwin32_recv(SOCKET s, char* buf, int len, int flags);
 int pgwin32_send(SOCKET s, char* buf, int len, int flags);
+
+const char *pgwin32_socket_strerror(int err);
 #endif