[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] feature/aptel/dynamic-modules-rc4 66b912c 2/6: Add portabl
From: |
Teodor Zlatanov |
Subject: |
[Emacs-diffs] feature/aptel/dynamic-modules-rc4 66b912c 2/6: Add portable layer for dynamic loading |
Date: |
Wed, 18 Nov 2015 19:14:45 +0000 |
branch: feature/aptel/dynamic-modules-rc4
commit 66b912c17a7a82612d22766cf9d7dd77e1725d0e
Author: Aurélien Aptel <address@hidden>
Commit: Ted Zlatanov <address@hidden>
Add portable layer for dynamic loading
* src/dynlib.h: New file.
* src/dynlib.c: New file.
Co-authored-by: Philipp Stephani <address@hidden>
---
src/dynlib.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/dynlib.h | 14 +++++++++
2 files changed, 107 insertions(+), 0 deletions(-)
diff --git a/src/dynlib.c b/src/dynlib.c
new file mode 100644
index 0000000..f947809
--- /dev/null
+++ b/src/dynlib.c
@@ -0,0 +1,93 @@
+/*
+ * Portable API for dynamic loading
+ *
+ * Assuming modules are enabled on modern systems... *Yes*, the
+ * preprocessor macro checks could be more precise. I don't care.
+ *
+ * If you think the abstraction is too leaky use libltdl (libtool),
+ * don't reinvent the wheel by fixing this one.
+ */
+
+#include "dynlib.h"
+
+/*
+ * Windows systems
+ */
+#if defined(_WIN32)
+
+#include <windows.h>
+
+dynlib_handle_ptr dynlib_open (const char * path)
+{
+
+ return (dynlib_handle_ptr) LoadLibrary (path);
+}
+
+void * dynlib_sym (dynlib_handle_ptr h, const char * sym)
+{
+ return GetProcAddress ((HMODULE) h, sym);
+}
+
+bool dynlib_addr (void *ptr, const char **path, const char **sym)
+{
+ return false; /* not implemented */
+}
+
+const char * dynlib_error (void)
+{
+ /* TODO: use GetLastError(), FormatMessage(), ... */
+ return "Can't load DLL";
+}
+
+int dynlib_close (dynlib_handle_ptr h)
+{
+ return FreeLibrary ((HMODULE) h) != 0;
+}
+
+
+/*
+ * POSIX systems
+ */
+#elif defined(HAVE_UNISTD_H)
+
+#include <dlfcn.h>
+
+dynlib_handle_ptr dynlib_open (const char * path)
+{
+ return dlopen (path, RTLD_LAZY);
+}
+
+void * dynlib_sym (dynlib_handle_ptr h, const char * sym)
+{
+ return dlsym (h, sym);
+}
+
+bool dynlib_addr (void *ptr, const char **path, const char **sym)
+{
+#ifdef HAVE_DLADDR
+ Dl_info info;
+ if (dladdr (ptr, &info) != 0 && info.dli_fname != NULL && info.dli_sname !=
NULL)
+ {
+ *path = info.dli_fname;
+ *sym = info.dli_sname;
+ return true;
+ }
+#endif
+ return false;
+}
+
+const char * dynlib_error (void)
+{
+ return dlerror ();
+}
+
+int dynlib_close (dynlib_handle_ptr h)
+{
+ return dlclose (h) == 0;
+}
+
+#else
+
+#error "No dynamic loading for this system"
+
+#endif
diff --git a/src/dynlib.h b/src/dynlib.h
new file mode 100644
index 0000000..229fc96
--- /dev/null
+++ b/src/dynlib.h
@@ -0,0 +1,14 @@
+#ifndef DYNLIB_H
+#define DYNLIB_H
+
+#include <config.h>
+#include <stdbool.h>
+
+typedef void* dynlib_handle_ptr;
+dynlib_handle_ptr dynlib_open (const char * path);
+void * dynlib_sym (dynlib_handle_ptr h, const char * sym);
+bool dynlib_addr (void *ptr, const char **path, const char **sym);
+const char * dynlib_error (void);
+int dynlib_close (dynlib_handle_ptr h);
+
+#endif /* DYNLIB_H */
- [Emacs-diffs] branch feature/aptel/dynamic-modules-rc4 created (now 13f8d6e), Teodor Zlatanov, 2015/11/18
- [Emacs-diffs] feature/aptel/dynamic-modules-rc4 66b912c 2/6: Add portable layer for dynamic loading,
Teodor Zlatanov <=
- [Emacs-diffs] feature/aptel/dynamic-modules-rc4 fca8155 1/6: Add catch-all & no-signal version of PUSH_HANDLER, Teodor Zlatanov, 2015/11/18
- [Emacs-diffs] feature/aptel/dynamic-modules-rc4 3e72e7a 3/6: Add new User Pointer (User_Ptr) type, Teodor Zlatanov, 2015/11/18
- [Emacs-diffs] feature/aptel/dynamic-modules-rc4 d6f405b 5/6: Make 'Fload' look for modules, Teodor Zlatanov, 2015/11/18
- [Emacs-diffs] feature/aptel/dynamic-modules-rc4 13f8d6e 6/6: Add dynamic module test and helper script, Teodor Zlatanov, 2015/11/18
- [Emacs-diffs] feature/aptel/dynamic-modules-rc4 037abb0 4/6: Add dynamic module module support, Teodor Zlatanov, 2015/11/18