mirror of
https://github.com/cesanta/mongoose.git
synced 2024-12-27 06:51:04 +08:00
Added mg_load_dll()
This commit is contained in:
parent
c658a54d18
commit
ace8c1736c
44
mongoose.c
44
mongoose.c
@ -1009,6 +1009,7 @@ typedef struct _stati64 file_stat_t;
|
||||
typedef HANDLE pid_t;
|
||||
#else ////////////// UNIX specific defines and includes
|
||||
#include <dirent.h>
|
||||
#include <dlfcn.h>
|
||||
#include <inttypes.h>
|
||||
#include <pwd.h>
|
||||
#define O_BINARY 0
|
||||
@ -1251,8 +1252,7 @@ void *mg_start_thread(void *(*f)(void *), void *p) {
|
||||
}
|
||||
#endif // MONGOOSE_NO_THREADS
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifndef MONGOOSE_NO_FILESYSTEM
|
||||
#if defined(_WIN32) && !defined(MONGOOSE_NO_FILESYSTEM)
|
||||
// Encode 'path' which is assumed UTF-8 string, into UNICODE string.
|
||||
// wbuf and wbuf_len is a target buffer and its length.
|
||||
static void to_wchar(const char *path, wchar_t *wbuf, size_t wbuf_len) {
|
||||
@ -1295,8 +1295,46 @@ static int mg_open(const char *path, int flag) {
|
||||
to_wchar(path, wpath, ARRAY_SIZE(wpath));
|
||||
return _wopen(wpath, flag);
|
||||
}
|
||||
#endif // _WIN32 && !MONGOOSE_NO_FILESYSTEM
|
||||
|
||||
#ifndef MONGOOSE_NO_DL
|
||||
void *mg_open_dll(const char *dll_name) {
|
||||
#ifdef _WIN32
|
||||
wchar_t wbuf[MAX_PATH_SIZE];
|
||||
to_wchar(dll_name, wbuf, ARRAY_SIZE(wbuf));
|
||||
return LoadLibraryW(wbuf);
|
||||
#else
|
||||
return dlopen(dll_name, RTLD_LAZY);
|
||||
#endif
|
||||
}
|
||||
|
||||
void *mg_find_dll_sym(void *dll_handle, const char *name) {
|
||||
#ifdef _WIN32
|
||||
return GetProcAddress((HINSTANCE) dll_handle, name);
|
||||
#else
|
||||
return dlsym(dll_handle, name);
|
||||
#endif
|
||||
}
|
||||
|
||||
const char *mg_load_dll(const char *dll_name, struct mg_dll_symbol *syms) {
|
||||
void *dll_handle;
|
||||
int i;
|
||||
|
||||
if ((dll_handle = mg_open_dll(dll_name)) == NULL) {
|
||||
return dll_name;
|
||||
} else {
|
||||
for (i = 0; syms != NULL && syms[i].symbol_name != NULL; i++) {
|
||||
syms[i].symbol_address.ptr = mg_find_dll_sym(dll_handle,
|
||||
syms[i].symbol_name);
|
||||
if (syms[i].symbol_address.ptr == NULL) {
|
||||
return syms[i].symbol_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
#endif // MONGOOSE_NO_FILESYSTEM
|
||||
|
||||
// A helper function for traversing a comma separated list of values.
|
||||
// It returns a list pointer shifted to the next value, or NULL if the end
|
||||
|
@ -112,6 +112,12 @@ void *mg_start_thread(void *(*func)(void *), void *param);
|
||||
char *mg_md5(char buf[33], ...);
|
||||
int mg_authorize_digest(struct mg_connection *c, FILE *fp);
|
||||
|
||||
struct mg_dll_symbol {
|
||||
const char *symbol_name;
|
||||
union { void *ptr; void (*func_ptr)(void); } symbol_address;
|
||||
};
|
||||
const char *mg_load_dll(const char *dll_path, struct mg_dll_symbol *symbols);
|
||||
|
||||
// Lua utility functions
|
||||
#ifdef MONGOOSE_USE_LUA
|
||||
#include <lua.h>
|
||||
|
Loading…
x
Reference in New Issue
Block a user