summaryrefslogtreecommitdiff
path: root/src/core/dltools.c
diff options
context:
space:
mode:
author0scar <qgt268@alumni.ku.dk>2024-02-05 16:36:47 +0000
committer0scar <qgt268@alumni.ku.dk>2024-02-05 16:48:20 +0000
commite85f81ec109782a01f1f741d4c2ed5f21af0c124 (patch)
tree8708c742b296de20e2d54ef9fa8ea7c2036d3d82 /src/core/dltools.c
parent457a4a3b1f00bf4d6c31b693085aa7150d2dcded (diff)
Organize the sourcefiles
Diffstat (limited to 'src/core/dltools.c')
-rw-r--r--src/core/dltools.c57
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
+}