summaryrefslogtreecommitdiff
path: root/src/modulemanager.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2014-06-23 09:45:15 -0400
committerAdam <Adam@anope.org>2014-06-23 09:45:15 -0400
commitfd9bb0ea7e3c8a39f1632c2ebbdc25d0fac192a0 (patch)
tree1d68e86065e0b012aee41533d4f9b289ee0707ac /src/modulemanager.cpp
parent148b26f687ce85dc01e852a2358b03d493757ada (diff)
parent9a947fa4359c667be58ebae4634d9ac0e53d5db4 (diff)
Merge branch '2.0' into 2.1
Conflicts: cmake/Anope.cmake cmake/FindGettext.cmake include/access.h include/messages.h include/modes.h include/modules.h include/users.h modules/CMakeLists.txt modules/commands/bs_bot.cpp modules/commands/cs_access.cpp modules/commands/cs_ban.cpp modules/commands/cs_clone.cpp modules/commands/cs_flags.cpp modules/commands/cs_info.cpp modules/commands/cs_list.cpp modules/commands/cs_log.cpp modules/commands/cs_mode.cpp modules/commands/cs_status.cpp modules/commands/cs_suspend.cpp modules/commands/cs_updown.cpp modules/commands/cs_xop.cpp modules/commands/ms_check.cpp modules/commands/ns_access.cpp modules/commands/ns_cert.cpp modules/commands/ns_group.cpp modules/commands/ns_register.cpp modules/commands/ns_set.cpp modules/commands/ns_suspend.cpp modules/commands/os_session.cpp modules/commands/os_svs.cpp modules/extra/m_ldap_authentication.cpp modules/extra/m_regex_pcre.cpp modules/extra/m_sql_authentication.cpp modules/extra/stats/m_chanstats.cpp modules/protocol/bahamut.cpp modules/protocol/hybrid.cpp modules/protocol/inspircd12.cpp modules/protocol/inspircd20.cpp modules/protocol/unreal.cpp modules/pseudoclients/chanserv.cpp modules/pseudoclients/chanserv/channel.cpp modules/pseudoclients/nickserv/nickserv.cpp modules/webcpanel/pages/chanserv/access.cpp src/access.cpp src/bots.cpp src/channels.cpp src/language.cpp src/modes.cpp src/modulemanager.cpp src/process.cpp src/users.cpp src/version.sh
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.";