X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fp2_modules.cpp;fp=src%2Fp2_modules.cpp;h=6f1778b6bd855ae58fb094ad7d12c1d6f6fb04d7;hb=42cd2c5dddd315dd85b626b125a750e8203c739a;hp=0000000000000000000000000000000000000000;hpb=5108598ba9fe27a03aad0371d28bb7062b6463fc;p=yazproxy-moved-to-github.git diff --git a/src/p2_modules.cpp b/src/p2_modules.cpp new file mode 100644 index 0000000..6f1778b --- /dev/null +++ b/src/p2_modules.cpp @@ -0,0 +1,77 @@ + +#include + +#include "p2_modules.h" + +class P2_ModuleDLEntry { +public: + void *m_dl_handle; + P2_ModuleEntry *m_entry; + P2_ModuleDLEntry(); + ~P2_ModuleDLEntry(); +}; + +P2_ModuleDLEntry::P2_ModuleDLEntry() +{ + m_dl_handle = 0; + m_entry = 0; +} + +P2_ModuleDLEntry::~P2_ModuleDLEntry() +{ + if (m_dl_handle) + dlclose(m_dl_handle); +} + +P2_ModuleFactory::P2_ModuleFactory() +{ +} + +P2_ModuleFactory::~P2_ModuleFactory() +{ +} + +bool P2_ModuleFactory::add(P2_ModuleEntry *entry) +{ + P2_ModuleDLEntry *m = new P2_ModuleDLEntry(); + m->m_entry = entry; + m_modules.push_back(m); + return true; +} + +bool P2_ModuleFactory::add(const char *fname) +{ + void *dl_handle = dlopen(fname, RTLD_NOW|RTLD_GLOBAL); + if (!dl_handle) + return false; + + P2_ModuleEntry *entry = + reinterpret_cast + (dlsym(dl_handle, "p2_module_entry")); + if (!entry) + { + dlclose(dl_handle); + return false; + } + P2_ModuleDLEntry *m = new P2_ModuleDLEntry(); + m->m_dl_handle = dl_handle; + m->m_entry = entry; + m_modules.push_back(m); + return true; +} + +void *P2_ModuleFactory::get_interface(const char *name, int version) +{ + std::list::const_iterator it; + for (it = m_modules.begin(); it != m_modules.end(); it++) + { + P2_ModuleDLEntry *ent = *it; + if (!strcmp(ent->m_entry->name, name) && + ent->m_entry->version == version) + { + return ent->m_entry->interface_ptr; + } + } + return 0; +} +