summaryrefslogtreecommitdiff
path: root/src/dltools.c
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2025-10-31 23:55:42 +0000
committeronelin <oscar@nelin.dk>2025-11-02 22:07:17 +0000
commitd38deeef3af2316a666f8fc0173940bd769b748e (patch)
tree6e30d4a9eea18daa5705c894f28cd99ff047e8f9 /src/dltools.c
parent6c077751982ea2c7bd2d9262b01b9f8602f80dc8 (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.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
+}