From: Martin Willi Date: Fri, 11 Oct 2013 14:58:02 +0000 (+0200) Subject: windows: Provide wrappers for dlopen() function family X-Git-Tag: 5.2.0dr6~24^2~133 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e6c203bad2b1c7f05584ab6f91eedc23c880b6d;p=thirdparty%2Fstrongswan.git windows: Provide wrappers for dlopen() function family --- diff --git a/src/libstrongswan/plugins/plugin_loader.c b/src/libstrongswan/plugins/plugin_loader.c index 487fafa014..c23f2f03f7 100644 --- a/src/libstrongswan/plugins/plugin_loader.c +++ b/src/libstrongswan/plugins/plugin_loader.c @@ -21,7 +21,9 @@ #include #include #include +#ifdef HAVE_DLADDR #include +#endif #include #include diff --git a/src/libstrongswan/utils/windows.h b/src/libstrongswan/utils/windows.h index 5306cbc421..2457cff326 100644 --- a/src/libstrongswan/utils/windows.h +++ b/src/libstrongswan/utils/windows.h @@ -150,4 +150,85 @@ static inline struct tm *localtime_r(const time_t *timep, struct tm *result) return NULL; } +/** + * dlerror(3) from , printing error to an alloca() buffer + */ +#define dlerror() \ +({ \ + char buf[128], *out;\ + ssize_t len; \ + DWORD err; \ + err = GetLastError(); \ + len = FormatMessage(0, NULL, err, 0, buf, sizeof(buf), NULL); \ + if (len <= 0) \ + { \ + len = snprintf(buf, sizeof(buf), "(%u)", err); \ + } \ + len++; \ + out = alloca(len); \ + memcpy(out, buf, len); \ + out; \ +}) + +/** + * Lazy binding, ignored on Windows + */ +#define RTLD_LAZY 1 + +/** + * dlopen(3) from + */ +static inline void *dlopen(const char *filename, int flag) +{ + return LoadLibrary(filename); +} + +/** + * Default handle targeting .exe + */ +#define RTLD_DEFAULT (NULL) + +/** + * Find symbol in next library + */ +#define RTLD_NEXT ((void*)~(uintptr_t)0) + +/** + * dlsym() from + */ +static inline void *dlsym(void *handle, const char *symbol) +{ + if (handle == RTLD_DEFAULT) + { + handle = GetModuleHandle(NULL); + } + else if (handle == RTLD_NEXT) + { + if (strcmp(symbol, "malloc") == 0 || + strcmp(symbol, "realloc") == 0 || + strcmp(symbol, "free") == 0) + { + /* for leak-detective */ + handle = GetModuleHandle("msvcrt"); + } + else + { + return NULL; + } + } + if (handle) + { + return GetProcAddress((HMODULE)handle, symbol); + } + return NULL; +} + +/** + * dlclose() from + */ +static inline int dlclose(void *handle) +{ + return FreeLibrary((HMODULE)handle); +} + #endif /** WINDOWS_H_ @}*/