OSDN Git Service

Load netmsg.dll locally in winsock_strerror, to avoid actual and
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 28 Nov 2001 19:40:29 +0000 (19:40 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 28 Nov 2001 19:40:29 +0000 (19:40 +0000)
potential problems discussed in pgsql-interfaces.

src/interfaces/libpq/fe-misc.c
src/interfaces/libpq/libpqdll.c
src/interfaces/libpq/win32.h

index 659b7fc..0372da3 100644 (file)
@@ -25,7 +25,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.63 2001/11/27 18:21:51 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.64 2001/11/28 19:40:29 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -37,6 +37,8 @@
 #include <time.h>
 
 #ifdef WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
 #include "win32.h"
 #else
 #include <unistd.h>
@@ -858,41 +860,59 @@ libpq_gettext(const char *msgid)
  * If you can verify this working on win9x or have a solution, let us know, ok?
  */
 const char *
-winsock_strerror(DWORD eno)
+winsock_strerror(int eno)
 {
-#define WSSE_MAXLEN (sizeof(winsock_strerror_buf)-1-12) /* 12 == "(0x00000000)" */
+       static char     err_buf[512];
+#define WSSE_MAXLEN (sizeof(err_buf)-1-13)     /* 13 == " (0x00000000)" */
+       HINSTANCE       netmsgModule;
        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
-                                         ))
+                               FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
+                                         0,
+                                         eno,
+                                         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                                         err_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;
+       netmsgModule = LoadLibraryEx("netmsg.dll",
+                                                                NULL,
+                                                                LOAD_LIBRARY_AS_DATAFILE);
+
+       if (netmsgModule != NULL)
+       {
+               if (FormatMessage(
+                               FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_HMODULE,
+                                                 netmsgModule,
+                                                 eno,
+                                                 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                                                 err_buf,
+                                                 WSSE_MAXLEN,
+                                                 NULL))
+               {
+                       FreeLibrary(netmsgModule);
+                       goto WSSE_GOODEXIT;
+               }
+               FreeLibrary(netmsgModule);
+       }
 
        /* Everything failed, just tell the user that we don't know the desc */
 
-       strcpy(winsock_strerror_buf, "Socket error, no description available.");
+       strcpy(err_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);
+       length = strlen(err_buf);
+       sprintf(err_buf + (length < WSSE_MAXLEN ? length : WSSE_MAXLEN),
+                       " (0x%08X)", eno);
 
-       return winsock_strerror_buf;
+       return err_buf;
 }
 
 #endif
index 9f9c93d..2fd6cfc 100644 (file)
@@ -1,8 +1,8 @@
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <winsock.h>
 #include "win32.h"
 
+
 BOOL           WINAPI
 DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
                LPVOID lpReserved)
@@ -20,12 +20,8 @@ DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
                                 */
                                return FALSE;
                        }
-                       if (netmsgModule == NULL)
-                               netmsgModule = LoadLibraryEx("netmsg.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
                        break;
                case DLL_PROCESS_DETACH:
-                       if (netmsgModule != NULL)
-                               FreeLibrary(netmsgModule);
                        WSACleanup();
                        break;
        }
index ac6a0ea..bf6d01b 100644 (file)
@@ -31,9 +31,6 @@
 #define EINPROGRESS WSAEINPROGRESS
 
 /*
- * Windows network messaging stuff:
+ * support for handling Windows Socket errors
  */
-static HINSTANCE netmsgModule = NULL;
-
-static char winsock_strerror_buf[512];
-const char *winsock_strerror(DWORD eno);
+extern const char *winsock_strerror(int eno);