]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Change match direction of extbans to allow stacking
[user/henk/code/inspircd.git] / src / inspircd.cpp
index ca89e0ef318e31ee16a1f3ec5857f2d4562b730e..ce3bbc06b543508e5aa792480485bfdaf5ba724a 100644 (file)
@@ -12,8 +12,8 @@
  */
 
 /* $Core */
-/* $Install: src/inspircd $(BINPATH) */
 #include "inspircd.h"
+#include "inspircd_version.h"
 #include <signal.h>
 
 #ifndef WIN32
@@ -43,7 +43,7 @@
 #include "caller.h"
 #include "testsuite.h"
 
-InspIRCd* SI = NULL;
+InspIRCd* ServerInstance = NULL;
 int* mysig = NULL;
 
 /** Seperate from the other casemap tables so that code *can* still exclusively rely on RFC casemapping
@@ -82,7 +82,7 @@ const char* ExitCodes[] =
                "CreateEvent failed" /* 19 */
 };
 
-template<typename T> static void DeleteZero(T* n)
+template<typename T> static void DeleteZero(T*&n)
 {
        if (n != NULL)
        {
@@ -126,8 +126,6 @@ void InspIRCd::Cleanup()
                        this->Modules->Unload(k->c_str());
                }
        }
-       /* Remove core commands */
-       Parser->RemoveCommands("<core>");
 
        /* Cleanup Server Names */
        for(servernamelist::iterator itr = servernames.begin(); itr != servernames.end(); ++itr)
@@ -135,6 +133,7 @@ void InspIRCd::Cleanup()
 
        /* Delete objects dynamically allocated in constructor (destructor would be more appropriate, but we're likely exiting) */
        /* Must be deleted before modes as it decrements modelines */
+       DeleteZero(this->FakeClient);
        DeleteZero(this->Users);
        DeleteZero(this->Modes);
        DeleteZero(this->XLines);
@@ -149,6 +148,7 @@ void InspIRCd::Cleanup()
        DeleteZero(this->PI);
        DeleteZero(this->Threads);
        DeleteZero(this->Timers);
+       DeleteZero(this->SE);
        /* Close logging */
        this->Logs->CloseLogs();
        DeleteZero(this->Logs);
@@ -315,9 +315,7 @@ void InspIRCd::WritePID(const std::string &filename)
        }
 }
 
-InspIRCd::InspIRCd(int argc, char** argv)
-       : GlobalCulls(this),
-
+InspIRCd::InspIRCd(int argc, char** argv) :
         /* Functor initialisation. Note that the ordering here is very important.
          *
          * THIS MUST MATCH ORDER OF DECLARATION OF THE HandleWhateverFunc classes
@@ -352,6 +350,12 @@ InspIRCd::InspIRCd(int argc, char** argv)
        // Avoid erroneous frees on early exit
        WindowsIPC = 0;
 #endif
+
+       ServerInstance = this;
+
+       Extensible::Register(&User::NICKForced);
+       Extensible::Register(&User::OperQuit);
+
        FailedPortList pl;
        int do_version = 0, do_nofork = 0, do_debug = 0,
            do_nolog = 0, do_root = 0, do_testsuite = 0;    /* flag variables */
@@ -378,9 +382,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        // Initialise TIME
        this->TIME = time(NULL);
 
-       memset(&server, 0, sizeof(server));
-       memset(&client, 0, sizeof(client));
-
        // This must be created first, so other parts of Insp can use it while starting up
        this->Logs = new LogManager(this);
 
@@ -407,7 +408,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->Config = new ServerConfig(this);
        this->SNO = new SnomaskManager(this);
        this->BanCache = new BanCacheManager(this);
-       this->Modules = new ModuleManager(this);
+       this->Modules = new ModuleManager();
        this->stats = new serverstats();
        this->Timers = new TimerManager(this);
        this->Parser = new CommandParser(this);
@@ -464,9 +465,8 @@ InspIRCd::InspIRCd(int argc, char** argv)
                                /* Unknown parameter */
                        default:
                                /* Fall through to handle other weird values too */
-                               printf("Unknown parameter '%s'\n", argv[index]);
-                               printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>]\n\
-                                                 [--runasroot] [--version] [--config <config>] [--testsuite]\n", argv[0]);
+                               printf("Unknown parameter '%s'\n", argv[optind-1]);
+                               printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>]\n%*s[--runasroot] [--version] [--config <config>] [--testsuite]\n", argv[0], static_cast<int>(8+strlen(argv[0])), " ");
                                Exit(EXIT_STATUS_ARGV);
                        break;
                }
@@ -496,7 +496,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        WSAStartup(MAKEWORD(2,0), &wsadata);
        ChangeWindowsSpecificPointers(this);
 #endif
-       strlcpy(Config->MyExecutable,argv[0],MAXBUF);
+       Config->MyExecutable = argv[0];
 
        /* Set the finished argument values */
        Config->nofork = do_nofork;
@@ -537,8 +537,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        printf_c("\t\033[1;32mpeavey, aquanight, psychon, dz, danieldg\033[0m\n\n");
        printf_c("Others:\t\t\t\033[1;32mSee /INFO Output\033[0m\n");
 
-       Config->ClearStack();
-
        this->Modes = new ModeParser(this);
 
        if (!do_root)
@@ -577,9 +575,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->Config->Apply(NULL, "");
        Logs->OpenFileLogs();
 
-       /** Note: This is safe, the method checks for user == NULL */
-       this->Parser->SetupCommandTable();
-
        this->Res = new DNS(this);
 
        this->AddServerName(Config->ServerName);
@@ -614,7 +609,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->XLines->CheckELines();
        this->XLines->ApplyLines();
 
-       CheckDie();
        int bounditems = BindPorts(pl);
 
        printf("\n");
@@ -623,7 +617,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
 
        /* Just in case no modules were loaded - fix for bug #101 */
        this->BuildISupport();
-       InitializeDisabledCommands(Config->DisabledCommands, this);
+       Config->ApplyDisabledCommands(Config->DisabledCommands);
 
        if (!pl.empty())
        {
@@ -768,27 +762,9 @@ int InspIRCd::Run()
                        /* Rehash has completed */
                        this->Logs->Log("CONFIG",DEBUG,"Detected ConfigThread exiting, tidying up...");
 
-                       /* Switch over logfiles */
-                       Logs->CloseLogs();
-                       Logs->OpenFileLogs();
-
-                       /*
-                        * Apply the changed configuration from the rehash. This is not done within the
-                        * configuration thread becasuse they may invoke functions that are not threadsafe.
-                        *
-                        * XXX: The order of these is IMPORTANT, do not reorder them without testing
-                        * thoroughly!!!
-                        */
                        this->ConfigThread->Finish();
-                       this->XLines->CheckELines();
-                       this->XLines->ApplyLines();
-                       this->Res->Rehash();
-                       this->ResetMaxBans();
-                       InitializeDisabledCommands(Config->DisabledCommands, this);
-                       User* user = ConfigThread->TheUserUID.empty() ? FindNick(ConfigThread->TheUserUID) : NULL;
-                       FOREACH_MOD_I(this, I_OnRehash, OnRehash(user));
-                       this->BuildISupport();
 
+                       ConfigThread->join();
                        delete ConfigThread;
                        ConfigThread = NULL;
                }
@@ -891,12 +867,9 @@ void InspIRCd::BufferedSocketCull()
  */
 bool InspIRCd::AllModulesReportReady(User* user)
 {
-       for (EventHandlerIter i = Modules->EventHandlers[I_OnCheckReady].begin(); i != Modules->EventHandlers[I_OnCheckReady].end(); ++i)
-       {
-               if (!(*i)->OnCheckReady(user))
-                       return false;
-       }
-       return true;
+       ModResult res;
+       FIRST_MOD_RESULT(this, OnCheckReady, res, (user));
+       return (res == MOD_RES_PASSTHRU);
 }
 
 time_t InspIRCd::Time()
@@ -917,9 +890,9 @@ void InspIRCd::SetSignal(int signal)
  */
 ENTRYPOINT
 {
-       SI = new InspIRCd(argc, argv);
-       mysig = &SI->s_signal;
-       SI->Run();
-       delete SI;
+       new InspIRCd(argc, argv);
+       mysig = &ServerInstance->s_signal;
+       ServerInstance->Run();
+       delete ServerInstance;
        return 0;
 }