summaryrefslogtreecommitdiff
path: root/src/dltools.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dltools.c')
-rw-r--r--src/dltools.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/dltools.c b/src/dltools.c
new file mode 100644
index 0000000..de7c83b
--- /dev/null
+++ b/src/dltools.c
@@ -0,0 +1,62 @@
+#include <stdbool.h>
+#include <stdlib.h>
+
+#if defined (_WIN32) || defined (__WIN32__) || defined (WIN32)
+ /* include winapi */
+#else
+#include <dlfcn.h>
+#endif
+
+#include <engine/logging.h>
+#include <engine/dltools.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
+}