]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modmanager_static.cpp
Mark +P mode as oper-only now that it no longer requires an explicit permission string
[user/henk/code/inspircd.git] / src / modmanager_static.cpp
index 3227036795a9b0015b87df8c7fda926ec47b9ab9..d9ee07a257a7190754c299a76e4986b9da42da6e 100644 (file)
@@ -64,15 +64,20 @@ bool ModuleManager::Load(const char* name)
        {
                if ((**i).name == name)
                {
+                       Module* c = NULL;
                        try
                        {
-                               Module* c = (*(**i).init)();
+                               c = (*(**i).init)();
                                Modules[name] = c;
+                               c->init();
                                FOREACH_MOD(I_OnLoadModule,OnLoadModule(c));
                                return true;
                        }
                        catch (CoreException& modexcept)
                        {
+                               if (c)
+                                       DoSafeUnload(c);
+                               delete c;
                                ServerInstance->Logs->Log("MODULE", DEFAULT, "Unable to load " + (**i).name + ": " + modexcept.GetReason());
                        }
                }
@@ -80,12 +85,19 @@ bool ModuleManager::Load(const char* name)
        return false;
 }
 
-bool ModuleManager::Unload(Module* mod)
-{
-       return false;
-}
-
 namespace {
+       struct UnloadAction : public HandlerBase0<void>
+       {
+               Module* const mod;
+               UnloadAction(Module* m) : mod(m) {}
+               void Call()
+               {
+                       ServerInstance->Modules->DoSafeUnload(mod);
+                       ServerInstance->GlobalCulls.Apply();
+                       ServerInstance->GlobalCulls.AddItem(this);
+               }
+       };
+
        struct ReloadAction : public HandlerBase0<void>
        {
                Module* const mod;
@@ -104,6 +116,14 @@ namespace {
        };
 }
 
+bool ModuleManager::Unload(Module* mod)
+{
+       if (!CanUnload(mod))
+               return false;
+       ServerInstance->AtomicActions.AddAction(new UnloadAction(mod));
+       return true;
+}
+
 void ModuleManager::Reload(Module* mod, HandlerBase1<void, bool>* callback)
 {
        if (CanUnload(mod))
@@ -117,15 +137,21 @@ void ModuleManager::LoadAll()
        ModCount = 0;
        for(std::vector<AllModuleList*>::iterator i = modlist->begin(); i != modlist->end(); ++i)
        {
+               Module* c = NULL;
                try
                {
-                       Module* c = (*(**i).init)();
+                       c = (*(**i).init)();
                        c->ModuleSourceFile = (**i).name;
+                       c->ModuleDLLManager = NULL;
                        Modules[(**i).name] = c;
+                       c->init();
                        FOREACH_MOD(I_OnLoadModule,OnLoadModule(c));
                }
                catch (CoreException& modexcept)
                {
+                       if (c)
+                               DoSafeUnload(c);
+                       delete c;
                        ServerInstance->Logs->Log("MODULE", DEFAULT, "Unable to load " + (**i).name + ": " + modexcept.GetReason());
                }
        }