diff options
-rw-r--r-- | include/modules.h | 4 | ||||
-rw-r--r-- | src/configreader.cpp | 4 | ||||
-rw-r--r-- | src/modules.cpp | 64 |
3 files changed, 34 insertions, 38 deletions
diff --git a/include/modules.h b/include/modules.h index a8bc9f507..b305f742b 100644 --- a/include/modules.h +++ b/include/modules.h @@ -1548,7 +1548,7 @@ class CoreExport ModuleManager : public classbase private: /** Holds a string describing the last module error to occur */ - char MODERR[MAXBUF]; + std::string LastModuleError; /** The feature names published by various modules */ @@ -1651,7 +1651,7 @@ class CoreExport ModuleManager : public classbase /** Returns text describing the last module error * @return The last error message to occur */ - const char* LastError(); + std::string& LastError(); /** Load a given module file * @param filename The file to load diff --git a/src/configreader.cpp b/src/configreader.cpp index cbf254b32..115a22eab 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -1182,7 +1182,7 @@ void ServerConfig::Read(bool bail, User* user) else { if (user) - user->WriteServ("972 %s %s :Failed to unload module %s: %s",user->nick, removing->c_str(), removing->c_str(), ServerInstance->Modules->LastError()); + user->WriteServ("972 %s %s :%s",user->nick, removing->c_str(), ServerInstance->Modules->LastError().c_str()); } } } @@ -1203,7 +1203,7 @@ void ServerConfig::Read(bool bail, User* user) else { if (user) - user->WriteServ("974 %s %s :Failed to load module %s: %s",user->nick, adding->c_str(), adding->c_str(), ServerInstance->Modules->LastError()); + user->WriteServ("974 %s %s :%s",user->nick, adding->c_str(), ServerInstance->Modules->LastError().c_str()); } } } diff --git a/src/modules.cpp b/src/modules.cpp index ef0de9471..5d52ff204 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -367,9 +367,9 @@ bool ModuleManager::SetPriority(Module* mod, Implementation i, PriorityState s, return true; } -const char* ModuleManager::LastError() +std::string& ModuleManager::LastError() { - return MODERR; + return LastModuleError; } bool ModuleManager::Load(const char* filename) @@ -409,22 +409,22 @@ bool ModuleManager::Load(const char* filename) if (!ServerConfig::DirValid(modfile)) { - snprintf(MODERR, MAXBUF,"Module %s is not within the modules directory.", modfile); - Instance->Log(DEFAULT, MODERR); + LastModuleError = "Module " + filename_str + " is not within the modules directory."; + Instance->Log(DEFAULT, LastModuleError); return false; } if (!ServerConfig::FileExists(modfile)) { - snprintf(MODERR,MAXBUF,"Module file could not be found: %s", modfile); - Instance->Log(DEFAULT, MODERR); + LastModuleError = "Module file could not be found: " + filename_str; + Instance->Log(DEFAULT, LastModuleError); return false; } if (Modules.find(filename_str) != Modules.end()) { - Instance->Log(DEFAULT,"Module %s is already loaded, cannot load a module twice!",modfile); - snprintf(MODERR, MAXBUF, "Module already loaded"); + LastModuleError = "Module " + filename_str + " is already loaded, cannot load a module twice!"; + Instance->Log(DEFAULT, LastModuleError); return false; } @@ -446,8 +446,8 @@ bool ModuleManager::Load(const char* filename) if (v.API != API_VERSION) { delete newmod; - Instance->Log(DEFAULT,"Unable to load %s: Incorrect module API version: %d (our version: %d)",modfile,v.API,API_VERSION); - snprintf(MODERR,MAXBUF,"Loader/Linker error: Incorrect module API version: %d (our version: %d)",v.API,API_VERSION); + LastModuleError = "Unable to load " + filename_str + ": Incorrect module API version: " + ConvToStr(v.API) + " (our version: " + ConvToStr(API_VERSION) + ")"; + Instance->Log(DEFAULT, LastModuleError); return false; } else @@ -459,30 +459,30 @@ bool ModuleManager::Load(const char* filename) } else { - Instance->Log(DEFAULT, "Unable to load %s",modfile); - snprintf(MODERR,MAXBUF, "Probably missing init_module() entrypoint, but dlsym() didn't notice a problem"); + LastModuleError = "Unable to load " + filename_str + ": Probably missing init_module() entrypoint, but dlsym() didn't notice a problem"; + Instance->Log(DEFAULT, LastModuleError); return false; } } catch (LoadModuleException& modexcept) { - Instance->Log(DEFAULT,"Unable to load %s: %s", modfile, modexcept.GetReason()); - snprintf(MODERR,MAXBUF,"Loader/Linker error: %s", modexcept.GetReason()); + LastModuleError = "Unable to load " + filename_str + ": Error when loading: " + modexcept.GetReason(); + Instance->Log(DEFAULT, LastModuleError); return false; } catch (FindSymbolException& modexcept) { - Instance->Log(DEFAULT,"Unable to load %s: %s", modfile, modexcept.GetReason()); - snprintf(MODERR,MAXBUF,"Loader/Linker error: %s", modexcept.GetReason()); + LastModuleError = "Unable to load " + filename_str + ": Error finding symbol: " + modexcept.GetReason(); + Instance->Log(DEFAULT, LastModuleError); return false; } catch (CoreException& modexcept) { - Instance->Log(DEFAULT,"Unable to load %s: %s",modfile,modexcept.GetReason()); - snprintf(MODERR,MAXBUF,"Factory function of %s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason()); + LastModuleError = "Unable to load " + filename_str + ": " + modexcept.GetReason(); + Instance->Log(DEFAULT, LastModuleError); return false; } - + this->ModCount++; FOREACH_MOD_I(Instance,I_OnLoadModule,OnLoadModule(newmod, filename_str)); @@ -499,26 +499,22 @@ bool ModuleManager::Load(const char* filename) bool ModuleManager::Unload(const char* filename) { - std::string filename_str = filename; + std::string filename_str(filename); std::map<std::string, std::pair<ircd_module*, Module*> >::iterator modfind = Modules.find(filename); if (modfind != Modules.end()) { if (modfind->second.second->GetVersion().Flags & VF_STATIC) { - Instance->Log(DEFAULT,"Failed to unload STATIC module %s",filename); - snprintf(MODERR,MAXBUF,"Module not unloadable (marked static)"); + LastModuleError = "Module " + filename_str + " not unloadable (marked static)"; + Instance->Log(DEFAULT, LastModuleError); return false; } std::pair<int,std::string> intercount = GetInterfaceInstanceCount(modfind->second.second); if (intercount.first > 0) { - Instance->Log(DEFAULT,"Failed to unload module %s, being used by %d other(s) via interface '%s'",filename, intercount.first, intercount.second.c_str()); - snprintf(MODERR,MAXBUF,"Module not unloadable (Still in use by %d other module%s which %s using its interface '%s') -- unload dependent modules first!", - intercount.first, - intercount.first > 1 ? "s" : "", - intercount.first > 1 ? "are" : "is", - intercount.second.c_str()); + LastModuleError = "Failed to unload module " + filename_str + ", being used by " + ConvToStr(intercount.first) + " other(s) via interface '" + intercount.second + "'"; + Instance->Log(DEFAULT, LastModuleError); return false; } @@ -552,8 +548,8 @@ bool ModuleManager::Unload(const char* filename) return true; } - Instance->Log(DEFAULT,"Module %s is not loaded, cannot unload it!",filename); - snprintf(MODERR,MAXBUF,"Module not loaded"); + LastModuleError = "Module " + filename_str + " is not loaded, cannot unload it!"; + Instance->Log(DEFAULT, LastModuleError); return false; } @@ -570,13 +566,13 @@ void ModuleManager::LoadAll() if (!this->Load(configToken)) { - Instance->Log(DEFAULT,"There was an error loading the module '%s': %s", configToken, this->LastError()); - printf_c("\n[\033[1;31m*\033[0m] There was an error loading the module '%s': %s\n\n", configToken, this->LastError()); + Instance->Log(DEFAULT, this->LastError()); + printf_c("\n[\033[1;31m*\033[0m] %s\n\n", this->LastError().c_str()); Instance->Exit(EXIT_STATUS_MODULE); } } - printf_c("\nA total of \033[1;32m%d\033[0m module%s been loaded.\n", (this->GetCount()+1), (this->GetCount()+1) == 1 ? " has" : "s have"); - Instance->Log(DEFAULT,"Total loaded modules: %d", this->GetCount()+1); + printf_c("\nA total of \033[1;32m%d\033[0m module%s been loaded.\n", (this->GetCount()), (this->GetCount()) == 1 ? " has" : "s have"); + Instance->Log(DEFAULT,"Total loaded modules: %d", this->GetCount()); } bool ModuleManager::PublishFeature(const std::string &FeatureName, Module* Mod) |