diff options
| author | onelin <oscar@nelin.dk> | 2025-10-31 23:55:42 +0000 |
|---|---|---|
| committer | onelin <oscar@nelin.dk> | 2025-11-02 22:07:17 +0000 |
| commit | d38deeef3af2316a666f8fc0173940bd769b748e (patch) | |
| tree | 6e30d4a9eea18daa5705c894f28cd99ff047e8f9 /src/dltools.c | |
| parent | 6c077751982ea2c7bd2d9262b01b9f8602f80dc8 (diff) | |
Flatten project structure
This will make it easier to break up the code into smaller chunks again
later.
One would think doing this seems fun to me at this point.
Diffstat (limited to 'src/dltools.c')
| -rw-r--r-- | src/dltools.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/dltools.c b/src/dltools.c new file mode 100644 index 0000000..6a0653a --- /dev/null +++ b/src/dltools.c @@ -0,0 +1,58 @@ +#include <stdlib.h> +#include <stdbool.h> + +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +/* include winapi */ +#else +#include <dlfcn.h> +#endif + +#include <daw/dltools.h> +#include <daw/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 +} |
