X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules.cpp;h=ab8ff37d4d693aee4b3c131c9ee175cefd79d2fd;hb=da1010f4077eae5d1602c9fe7d74a2426387b8b2;hp=87e2de705c5c71b350458669cf4ebaf694451458;hpb=c384697c88aa54b5a532cd2edce3c063c70d7868;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules.cpp b/src/modules.cpp index 87e2de705..ab8ff37d4 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -159,7 +159,7 @@ void Module::OnGlobalOper(User*) { } void Module::OnPostConnect(User*) { } int Module::OnAddBan(User*, Channel*, const std::string &) { return 0; } int Module::OnDelBan(User*, Channel*, const std::string &) { return 0; } -void Module::OnRawSocketAccept(int, const std::string&, int) { } +void Module::OnRawSocketAccept(int, irc::sockets::sockaddrs*, irc::sockets::sockaddrs*) { } int Module::OnRawSocketWrite(int, const char*, int) { return 0; } void Module::OnRawSocketClose(int) { } void Module::OnRawSocketConnect(int) { } @@ -197,7 +197,7 @@ void Module::OnText(User*, void*, int, const std::string&, char, CUList&) { } void Module::OnRunTestSuite() { } void Module::OnNamesListItem(User*, User*, Channel*, std::string&, std::string&) { } int Module::OnNumeric(User*, unsigned int, const std::string&) { return 0; } -void Module::OnHookUserIO(User*, const std::string&) { } +void Module::OnHookUserIO(User*) { } bool Module::OnHostCycle(User* user) { return false; } ModuleManager::ModuleManager(InspIRCd* Ins) : ModCount(0), Instance(Ins) @@ -288,11 +288,16 @@ bool ModuleManager::SetPriority(Module* mod, Implementation i, Priority s, Modul break; /* Module wants to be first, sod everything else */ case PRIORITY_FIRST: - swap_pos = 0; + if (prioritizationState != PRIO_STATE_FIRST) + swap = false; + else + swap_pos = 0; break; - /* Module is submissive and wants to be last... awww. */ + /* Module wants to be last. */ case PRIORITY_LAST: - if (EventHandlers[i].empty()) + if (prioritizationState != PRIO_STATE_FIRST) + swap = false; + else if (EventHandlers[i].empty()) swap_pos = 0; else swap_pos = EventHandlers[i].size() - 1; @@ -339,6 +344,9 @@ bool ModuleManager::SetPriority(Module* mod, Implementation i, Priority s, Modul /* Do we need to swap? */ if (swap && (swap_pos != source)) { + // We are going to change positions; we'll need to run again to verify all requirements + if (prioritizationState == PRIO_STATE_LAST) + prioritizationState = PRIO_STATE_AGAIN; /* Suggestion from Phoenix, "shuffle" the modules to better retain call order */ int incrmnt = 1; @@ -371,7 +379,7 @@ bool ModuleManager::Load(const char* filename) if (strchr(filename,'*') || (strchr(filename,'?'))) { int n_match = 0; - DIR* library = opendir(Instance->Config->ModPath); + DIR* library = opendir(Instance->Config->ModPath.c_str()); if (library) { /* Try and locate and load all modules matching the pattern */ @@ -394,7 +402,7 @@ bool ModuleManager::Load(const char* filename) } char modfile[MAXBUF]; - snprintf(modfile,MAXBUF,"%s/%s",Instance->Config->ModPath,filename); + snprintf(modfile,MAXBUF,"%s/%s",Instance->Config->ModPath.c_str(),filename); std::string filename_str = filename; if (!ServerConfig::FileExists(modfile)) @@ -492,8 +500,17 @@ bool ModuleManager::Load(const char* filename) * not just the one thats loading, as the new module could affect the preference * of others */ - for (std::map >::iterator n = Modules.begin(); n != Modules.end(); ++n) - n->second.second->Prioritize(); + for(int tries = 0; tries < 20; tries++) + { + prioritizationState = tries > 0 ? PRIO_STATE_LAST : PRIO_STATE_FIRST; + for (std::map >::iterator n = Modules.begin(); n != Modules.end(); ++n) + n->second.second->Prioritize(); + + if (prioritizationState == PRIO_STATE_LAST) + break; + if (tries == 19) + Instance->Logs->Log("MODULE", DEFAULT, "Hook priority dependency loop detected while loading " + filename_str); + } Instance->BuildISupport(); return true;