Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarDynamicLib_unix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/StarDynamicLib_unix.cpp')
-rw-r--r--source/core/StarDynamicLib_unix.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/source/core/StarDynamicLib_unix.cpp b/source/core/StarDynamicLib_unix.cpp
new file mode 100644
index 0000000..dd81d1f
--- /dev/null
+++ b/source/core/StarDynamicLib_unix.cpp
@@ -0,0 +1,46 @@
+#include "StarDynamicLib.hpp"
+
+#include <dlfcn.h>
+#include <pthread.h>
+#include <sys/time.h>
+#include <errno.h>
+
+namespace Star {
+
+struct PrivateDynLib : public DynamicLib {
+ PrivateDynLib(void* handle)
+ : m_handle(handle) {}
+
+ ~PrivateDynLib() {
+ dlclose(m_handle);
+ }
+
+ void* funcPtr(const char* name) {
+ return dlsym(m_handle, name);
+ }
+
+ void* m_handle;
+};
+
+String DynamicLib::libraryExtension() {
+#ifdef STAR_SYSTEM_MACOS
+ return ".dylib";
+#else
+ return ".so";
+#endif
+}
+
+DynamicLibUPtr DynamicLib::loadLibrary(String const& libraryName) {
+ void* handle = dlopen(libraryName.utf8Ptr(), RTLD_NOW);
+ if (handle == NULL)
+ return {};
+ return make_unique<PrivateDynLib>(handle);
+}
+
+DynamicLibUPtr DynamicLib::currentExecutable() {
+ void* handle = dlopen(NULL, 0);
+ starAssert(handle);
+ return make_unique<PrivateDynLib>(handle);
+}
+
+}