mirror of
https://github.com/cesanta/mongoose.git
synced 2024-12-27 23:21: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;
|
typedef HANDLE pid_t;
|
||||||
#else ////////////// UNIX specific defines and includes
|
#else ////////////// UNIX specific defines and includes
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#define O_BINARY 0
|
#define O_BINARY 0
|
||||||
@ -1251,8 +1252,7 @@ void *mg_start_thread(void *(*f)(void *), void *p) {
|
|||||||
}
|
}
|
||||||
#endif // MONGOOSE_NO_THREADS
|
#endif // MONGOOSE_NO_THREADS
|
||||||
|
|
||||||
#ifdef _WIN32
|
#if defined(_WIN32) && !defined(MONGOOSE_NO_FILESYSTEM)
|
||||||
#ifndef MONGOOSE_NO_FILESYSTEM
|
|
||||||
// Encode 'path' which is assumed UTF-8 string, into UNICODE string.
|
// Encode 'path' which is assumed UTF-8 string, into UNICODE string.
|
||||||
// wbuf and wbuf_len is a target buffer and its length.
|
// 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) {
|
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));
|
to_wchar(path, wpath, ARRAY_SIZE(wpath));
|
||||||
return _wopen(wpath, flag);
|
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
|
||||||
#endif // MONGOOSE_NO_FILESYSTEM
|
|
||||||
|
|
||||||
// A helper function for traversing a comma separated list of values.
|
// 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
|
// 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], ...);
|
char *mg_md5(char buf[33], ...);
|
||||||
int mg_authorize_digest(struct mg_connection *c, FILE *fp);
|
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
|
// Lua utility functions
|
||||||
#ifdef MONGOOSE_USE_LUA
|
#ifdef MONGOOSE_USE_LUA
|
||||||
#include <lua.h>
|
#include <lua.h>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user