summaryrefslogtreecommitdiff
path: root/src/dltools.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dltools.c')
-rw-r--r--src/dltools.c58
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
+}