summaryrefslogtreecommitdiff
path: root/src/modulemanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modulemanager.cpp')
-rw-r--r--src/modulemanager.cpp34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp
index 9e27eec26..d11585791 100644
--- a/src/modulemanager.cpp
+++ b/src/modulemanager.cpp
@@ -158,25 +158,25 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u)
dlerror();
void *handle = dlopen(pbuf.c_str(), RTLD_NOW);
const char *err = dlerror();
- if (!handle && err && *err)
+ if (!handle)
{
- Log() << err;
+ if (err && *err)
+ Log() << err;
return MOD_ERR_NOLOAD;
}
dlerror();
Module *(*func)(const Anope::string &, const Anope::string &) = function_cast<Module *(*)(const Anope::string &, const Anope::string &)>(dlsym(handle, "AnopeInit"));
err = dlerror();
- if (!func && err && *err)
+ if (!func)
{
Log() << "No init function found, not an Anope module";
+ if (err && *err)
+ Log(LOG_DEBUG) << err;
dlclose(handle);
return MOD_ERR_NOLOAD;
}
-
- if (!func)
- throw CoreException("Couldn't find constructor, yet moderror wasn't set?");
-
+
/* Create module. */
Anope::string nick;
if (u)
@@ -184,6 +184,7 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u)
Module *m;
+ ModuleReturn moderr = MOD_ERR_OK;
try
{
m = func(modname, nick);
@@ -191,7 +192,14 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u)
catch (const ModuleException &ex)
{
Log() << "Error while loading " << modname << ": " << ex.GetReason();
- return MOD_ERR_EXCEPTION;
+ moderr = MOD_ERR_EXCEPTION;
+ }
+
+ if (moderr != MOD_ERR_OK)
+ {
+ if (dlclose(handle))
+ Log() << dlerror();
+ return moderr;
}
m->filename = pbuf;
@@ -233,14 +241,18 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u)
catch (const ModuleException &ex)
{
Log() << "Module " << modname << " couldn't load:" << ex.GetReason();
- DeleteModule(m);
- return MOD_ERR_EXCEPTION;
+ moderr = MOD_ERR_EXCEPTION;
}
catch (const ConfigException &ex)
{
Log() << "Module " << modname << " couldn't load due to configuration problems: " << ex.GetReason();
+ moderr = MOD_ERR_EXCEPTION;
+ }
+
+ if (moderr != MOD_ERR_OK)
+ {
DeleteModule(m);
- return MOD_ERR_EXCEPTION;
+ return moderr;
}
Log(LOG_DEBUG) << "Module " << modname << " loaded.";