emacs-diffs
[Top][All Lists]
Advanced

[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 */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]