diff options
| author | 0scar <qgt268@alumni.ku.dk> | 2024-02-05 16:36:47 +0000 |
|---|---|---|
| committer | 0scar <qgt268@alumni.ku.dk> | 2024-02-05 16:48:20 +0000 |
| commit | e85f81ec109782a01f1f741d4c2ed5f21af0c124 (patch) | |
| tree | 8708c742b296de20e2d54ef9fa8ea7c2036d3d82 /src/core/dltools.c | |
| parent | 457a4a3b1f00bf4d6c31b693085aa7150d2dcded (diff) | |
Organize the sourcefiles
Diffstat (limited to 'src/core/dltools.c')
| -rw-r--r-- | src/core/dltools.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/core/dltools.c b/src/core/dltools.c new file mode 100644 index 0000000..1e43b79 --- /dev/null +++ b/src/core/dltools.c @@ -0,0 +1,57 @@ +#include <stdlib.h> + +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +/* include winapi */ +#else +#include <dlfcn.h> +#endif + +#include <engine/dltools.h> +#include <engine/logging.h> + +bool dynamic_library_close(void* shared_library) { +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + return true; +#else + return dlclose(shared_library) == 0; +#endif +} + +void* dynamic_library_open(const char* library_path) { +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + return NULL; +#else + return dlopen(library_path, RTLD_NOW); +#endif +} + +char* dynamic_library_get_error(void) { +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + return "unsupported on windows"; +#else + return dlerror(); +#endif +} + +void* dynamic_library_reload(void* shared_library, const char* library_path) { + void* library_address = NULL; + if (!dynamic_library_close(shared_library)) { + ERROR("Failed to close shared library: %s", dynamic_library_get_error()); + ERROR("Reloading dynamic library failed."); + return library_address; + } + if ((library_address = dynamic_library_open(library_path)) == NULL) { + ERROR("Failed to open shared library: %s", dynamic_library_get_error()); + ERROR("Reloading dynamic library %s failed.", library_path); + } + return library_address; +} + +void* dynamic_library_get_symbol(void* restrict shared_library, + const char* symbol) { +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + return NULL; +#else + return dlsym(shared_library, symbol); +#endif +} |
