1 /* +------------------------------------+
\r * | Inspire Internet Relay Chat Daemon |
\r * +------------------------------------+
\r *
\r * InspIRCd: (C) 2002-2007 InspIRCd Development Team
\r * See: http://www.inspircd.org/wiki/index.php/Credits
\r *
\r * This program is free but copyrighted software; see
\r * the file COPYING for details.
\r *
\r * ---------------------------------------------------
\r */
\r\r#include "inspircd.h"
\r#include "configreader.h"
\r#include "dynamic.h"
\r#ifndef WIN32
\r#include <dlfcn.h>
\r#endif
\r\rDLLManager::DLLManager(InspIRCd* ServerInstance, const char *fname)
\r{
\r err = NULL;
\r\r if (!strstr(fname,".so"))
\r {
\r err = "This doesn't look like a module file to me...";
\r return;
\r }
\r\r h = dlopen(fname, RTLD_NOW|RTLD_LOCAL);
\r if (!h)
\r {
\r err = (char*)dlerror();
\r return;
\r }
\r}
\r\rDLLManager::~DLLManager()
\r{
\r // close the library if it isn't null
\r if (h)
\r dlclose(h);
\r}
\r\r\r\rbool DLLManager::GetSymbol(void** v, const char* sym_name)
\r{
\r // try extract a symbol from the library
\r // get any error message is there is any
\r \r if (h)
\r {
\r dlerror(); // clear value
\r *v = dlsym(h, sym_name);
\r err = (char*)dlerror();
\r if (!*v || err)
\r return false;
\r }
\r \r if (err)
\r {
\r return false;
\r }
\r else
\r {
\r return true;
\r }
\r}
\r\rDLLFactoryBase::DLLFactoryBase(InspIRCd* Instance, const char* fname, const char* symbol) : DLLManager(Instance, fname)
\r{
\r // try get the factory function if there is no error yet
\r factory_func = 0;
\r \r if (!LastError())
\r {
\r if (!GetSymbol( (void **)&factory_func, symbol ? symbol : "init_module"))
\r {
\r throw ModuleException("Missing init_module() entrypoint!");
\r }
\r }
\r}
\r\rDLLFactoryBase::~DLLFactoryBase()
\r{
\r}
\r\r