]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules.cpp
Read multiple GnuTLS records in one RawSocketRead operation
[user/henk/code/inspircd.git] / src / modules.cpp
index 87e2de705c5c71b350458669cf4ebaf694451458..ab8ff37d4d693aee4b3c131c9ee175cefd79d2fd 100644 (file)
@@ -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<std::string, std::pair<ircd_module*, Module*> >::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<std::string, std::pair<ircd_module*, Module*> >::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;