return len - 1;\r
}\r
\r
-static void PLD_Private_Log(const char *, const char *, int);\r
\r
#ifdef _WIN32\r
\r
#include <windows.h>\r
+typedef DWORD PLD_ErrCode;\r
+static void PLD_Private_Log(const char *, const char *, PLD_ErrCode);\r
\r
static void PLD_Private_WriteString(const char *s)\r
{\r
WriteFile(GetStdHandle(STD_ERROR_HANDLE), s, PLD_Private_strlen(s), &dummy, NULL);\r
}\r
\r
-static void PLD_Private_FormatError(int code, char *s, int len)\r
+static void PLD_Private_FormatError(DWORD code, char *s, int len)\r
{\r
DWORD_PTR arg = (DWORD_PTR)s;\r
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY,\r
static HMODULE PLD_Private_LoadLibrary_wrapper(LPCSTR lpLibFileName)\r
{\r
HMODULE hModule = GetModuleHandleA(lpLibFileName);\r
- if (hModule != NULL)\r
+ if (hModule == NULL)\r
hModule = LoadLibraryA(lpLibFileName);\r
if (hModule == NULL)\r
PLD_Private_Log("Failed to load library!", lpLibFileName, GetLastError());\r
return hModule;\r
}\r
+\r
static FARPROC PLD_Private_GetProcAddress_wrapper(HMODULE hModule, LPCSTR lpProcName)\r
{\r
FARPROC lpProc = GetProcAddress(hModule, lpProcName);\r
#define PLD(name) \\r
static HMODULE PLDH(void) { \\r
static HMODULE hModule = NULL; \\r
- if (hModule == NULL) hModule = PLD_Private_LoadLibrary_wrapper(#name); \\r
+ if (hModule == NULL) hModule = PLD_Private_LoadLibrary_wrapper(name); \\r
return hModule; \\r
} \\r
\r
-#define PFN(name) ((PLDTYPEOF(name))PLD_Private_GetProcAddress_wrapper(PLDH(), #name))\r
+#define PFN(name) ((PLDTYPEOF(&name))PLD_Private_GetProcAddress_wrapper(PLDH(), #name))\r
\r
#else\r
-#error POSIX Unimplemented!\r
+\r
+#define _GNU_SOURCE\r
+#include <unistd.h>\r
+#include <errno.h>\r
+#include <stdint.h>\r
+#include <string.h>\r
+#include <dlfcn.h>\r
+typedef intptr_t PLD_ErrCode;\r
+static void PLD_Private_Log(const char *, const char *, PLD_ErrCode);\r
+\r
+static void PLD_Private_WriteString(const char *s)\r
+{\r
+ write(2, s, PLD_Private_strlen(s));\r
+}\r
+\r
+static void PLD_Private_FormatError(intptr_t code, char *s, int len)\r
+{\r
+ *s = 0;\r
+ strncat(s, (const char *)code, len);\r
+}\r
+\r
+static void *PLD_Private_dlopen_wrapper(const char *name)\r
+{\r
+ if (name == NULL)\r
+ return (void *)RTLD_NEXT;\r
+ void *handle = dlopen(name, RTLD_NOLOAD);\r
+ if (handle == NULL)\r
+ handle = dlopen(name, RTLD_LAZY);\r
+ if (handle == NULL)\r
+ PLD_Private_Log("Failed to load library!", name, (intptr_t)dlerror());\r
+ return handle;\r
+}\r
+\r
+static void *PLD_Private_dlsym_wrapper(void *handle, const char *name)\r
+{\r
+ void *sym = dlsym(handle, name);\r
+ if (sym == NULL)\r
+ PLD_Private_Log("Failed to load procedure!", name, (intptr_t)dlerror());\r
+ return sym;\r
+}\r
+\r
+#define PLD(name) \\r
+ static void *PLDH(void) { \\r
+ static void *handle = NULL; \\r
+ if (handle == NULL) handle = PLD_Private_dlopen_wrapper(name); \\r
+ return handle; \\r
+ } \\r
+\r
+#define PFN(name) ((PLDTYPEOF(&name))PLD_Private_dlsym_wrapper(PLDH(), #name))\r
+\r
#endif\r
\r
-static void PLD_Private_Log(const char *message, const char *name, int err)\r
+static void PLD_Private_Log(const char *message, const char *name, PLD_ErrCode err)\r
{\r
PLD_Private_WriteString(message);\r
PLD_Private_WriteString(" ");\r
char errtext[256];\r
PLD_Private_FormatError(err, errtext, sizeof(errtext));\r
PLD_Private_WriteString(errtext);\r
+\r
+ // An extra newline because dlerror doesn't append one\r
+#ifndef _WIN32\r
+ PLD_Private_WriteString("\n");\r
+#endif\r
}\r
\r
#ifndef PLDLOG\r