2010-09-20 22:08:53 +02:00
|
|
|
/* src/backend/port/dynloader/win32.c */
|
2003-03-21 18:18:34 +01:00
|
|
|
|
2006-06-08 00:24:46 +02:00
|
|
|
#include "postgres.h"
|
2003-03-21 18:18:34 +01:00
|
|
|
|
2005-10-15 04:49:52 +02:00
|
|
|
char *dlerror(void);
|
|
|
|
int dlclose(void *handle);
|
|
|
|
void *dlsym(void *handle, const char *symbol);
|
|
|
|
void *dlopen(const char *path, int mode);
|
2004-11-17 09:30:11 +01:00
|
|
|
|
2005-08-12 23:23:10 +02:00
|
|
|
static char last_dyn_error[512];
|
|
|
|
|
2005-10-15 04:49:52 +02:00
|
|
|
static void
|
|
|
|
set_dl_error(void)
|
2005-08-12 23:23:10 +02:00
|
|
|
{
|
2005-10-15 04:49:52 +02:00
|
|
|
DWORD err = GetLastError();
|
2005-08-12 23:23:10 +02:00
|
|
|
|
|
|
|
if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS |
|
2005-10-15 04:49:52 +02:00
|
|
|
FORMAT_MESSAGE_FROM_SYSTEM,
|
|
|
|
NULL,
|
|
|
|
err,
|
2006-12-04 23:23:40 +01:00
|
|
|
MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
|
2005-10-15 04:49:52 +02:00
|
|
|
last_dyn_error,
|
|
|
|
sizeof(last_dyn_error) - 1,
|
|
|
|
NULL) == 0)
|
2005-08-12 23:23:10 +02:00
|
|
|
{
|
2005-10-15 04:49:52 +02:00
|
|
|
snprintf(last_dyn_error, sizeof(last_dyn_error) - 1,
|
|
|
|
"unknown error %lu", err);
|
|
|
|
}
|
2005-08-12 23:23:10 +02:00
|
|
|
}
|
|
|
|
|
2003-03-21 18:18:34 +01:00
|
|
|
char *
|
|
|
|
dlerror(void)
|
|
|
|
{
|
2005-08-12 23:23:10 +02:00
|
|
|
if (last_dyn_error[0])
|
|
|
|
return last_dyn_error;
|
|
|
|
else
|
|
|
|
return NULL;
|
2003-03-21 18:18:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
dlclose(void *handle)
|
|
|
|
{
|
2005-08-12 23:23:10 +02:00
|
|
|
if (!FreeLibrary((HMODULE) handle))
|
|
|
|
{
|
|
|
|
set_dl_error();
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
last_dyn_error[0] = 0;
|
|
|
|
return 0;
|
2003-03-21 18:18:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void *
|
|
|
|
dlsym(void *handle, const char *symbol)
|
|
|
|
{
|
2005-10-15 04:49:52 +02:00
|
|
|
void *ptr;
|
|
|
|
|
2005-08-12 23:23:10 +02:00
|
|
|
ptr = GetProcAddress((HMODULE) handle, symbol);
|
2005-10-15 04:49:52 +02:00
|
|
|
if (!ptr)
|
2005-08-12 23:23:10 +02:00
|
|
|
{
|
|
|
|
set_dl_error();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
last_dyn_error[0] = 0;
|
|
|
|
return ptr;
|
2003-03-21 18:18:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void *
|
|
|
|
dlopen(const char *path, int mode)
|
|
|
|
{
|
2005-10-15 04:49:52 +02:00
|
|
|
HMODULE h;
|
|
|
|
int prevmode;
|
2005-08-12 23:23:10 +02:00
|
|
|
|
|
|
|
/* Disable popup error messages when loading DLLs */
|
|
|
|
prevmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
|
|
|
|
h = LoadLibrary(path);
|
|
|
|
SetErrorMode(prevmode);
|
2005-10-15 04:49:52 +02:00
|
|
|
|
|
|
|
if (!h)
|
2005-08-12 23:23:10 +02:00
|
|
|
{
|
|
|
|
set_dl_error();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
last_dyn_error[0] = 0;
|
|
|
|
return (void *) h;
|
2003-03-21 18:18:34 +01:00
|
|
|
}
|