summaryrefslogtreecommitdiff
path: root/src/dynamic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dynamic.cpp')
-rw-r--r--src/dynamic.cpp90
1 files changed, 89 insertions, 1 deletions
diff --git a/src/dynamic.cpp b/src/dynamic.cpp
index 5d7759b47..179113cae 100644
--- a/src/dynamic.cpp
+++ b/src/dynamic.cpp
@@ -1 +1,89 @@
-/* +------------------------------------+ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * * InspIRCd: (C) 2002-2007 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see * the file COPYING for details. * * --------------------------------------------------- */ #include "inspircd.h" #include "configreader.h" #include "dynamic.h" #ifndef WIN32 #include <dlfcn.h> #endif DLLManager::DLLManager(InspIRCd* ServerInstance, const char *fname) { err = NULL; if (!strstr(fname,".so")) { err = "This doesn't look like a module file to me..."; return; } h = dlopen(fname, RTLD_NOW|RTLD_LOCAL); if (!h) { err = (char*)dlerror(); return; } } DLLManager::~DLLManager() { // close the library if it isn't null if (h) dlclose(h); } bool DLLManager::GetSymbol(void** v, const char* sym_name) { // try extract a symbol from the library // get any error message is there is any if (h) { dlerror(); // clear value *v = dlsym(h, sym_name); err = (char*)dlerror(); if (!*v || err) return false; } if (err) { return false; } else { return true; } } DLLFactoryBase::DLLFactoryBase(InspIRCd* Instance, const char* fname, const char* symbol) : DLLManager(Instance, fname) { // try get the factory function if there is no error yet factory_func = 0; if (!LastError()) { if (!GetSymbol( (void **)&factory_func, symbol ? symbol : "init_module")) { throw ModuleException("Missing init_module() entrypoint!"); } } } DLLFactoryBase::~DLLFactoryBase() { } \ No newline at end of file
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include "inspircd.h"
+#include "configreader.h"
+#include "dynamic.h"
+#ifndef WIN32
+#include <dlfcn.h>
+#endif
+
+DLLManager::DLLManager(InspIRCd* ServerInstance, const char *fname)
+{
+ err = NULL;
+
+ if (!strstr(fname,".so"))
+ {
+ err = "This doesn't look like a module file to me...";
+ return;
+ }
+
+ h = dlopen(fname, RTLD_NOW|RTLD_LOCAL);
+ if (!h)
+ {
+ err = (char*)dlerror();
+ return;
+ }
+}
+
+DLLManager::~DLLManager()
+{
+ // close the library if it isn't null
+ if (h)
+ dlclose(h);
+}
+
+
+
+bool DLLManager::GetSymbol(void** v, const char* sym_name)
+{
+ // try extract a symbol from the library
+ // get any error message is there is any
+
+ if (h)
+ {
+ dlerror(); // clear value
+ *v = dlsym(h, sym_name);
+ err = (char*)dlerror();
+ if (!*v || err)
+ return false;
+ }
+
+ if (err)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+DLLFactoryBase::DLLFactoryBase(InspIRCd* Instance, const char* fname, const char* symbol) : DLLManager(Instance, fname)
+{
+ // try get the factory function if there is no error yet
+ factory_func = 0;
+
+ if (!LastError())
+ {
+ if (!GetSymbol( (void **)&factory_func, symbol ? symbol : "init_module"))
+ {
+ throw ModuleException("Missing init_module() entrypoint!");
+ }
+ }
+}
+
+DLLFactoryBase::~DLLFactoryBase()
+{
+}
+