]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Remove m_foobar. This has no practical purpose, except as a module basis,
[user/henk/code/inspircd.git] / src / inspircd.cpp
index f53484b74e6fc83b5fe93b1e79a5a19a9ca327f7..a1a5d2d032d1fee1b2a6ab3062c893ecc0916b73 100644 (file)
@@ -11,6 +11,7 @@
  * ---------------------------------------------------
  */
 
+/* $Core */
 /* $Install: src/inspircd $(BINPATH) */
 #include "inspircd.h"
 #include <signal.h>
@@ -94,13 +95,13 @@ void InspIRCd::Cleanup()
 {
        if (Config)
        {
-               for (unsigned int i = 0; i < Config->ports.size(); i++)
+               for (unsigned int i = 0; i < ports.size(); i++)
                {
                        /* This calls the constructor and closes the listening socket */
-                       delete Config->ports[i];
+                       delete ports[i];
                }
 
-               Config->ports.clear();
+               ports.clear();
        }
 
        /* Close all client sockets, or the new process inherits them */
@@ -325,7 +326,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
         HandleProcessUser(this),
         HandleIsNick(this),
         HandleIsIdent(this),
-        HandleFindDescriptor(this),
         HandleFloodQuitUser(this),
         HandleIsChannel(this),
         HandleIsSID(this),
@@ -342,7 +342,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
         Rehash(&HandleRehash),
         IsNick(&HandleIsNick),
         IsIdent(&HandleIsIdent),
-        FindDescriptor(&HandleFindDescriptor),
         FloodQuitUser(&HandleFloodQuitUser)
 
 {
@@ -353,7 +352,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        // Avoid erroneous frees on early exit
        WindowsIPC = 0;
 #endif
-       int found_ports = 0;
        FailedPortList pl;
        int do_version = 0, do_nofork = 0, do_debug = 0,
            do_nolog = 0, do_root = 0, do_testsuite = 0;    /* flag variables */
@@ -375,6 +373,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->XLines = 0;
        this->Modes = 0;
        this->Res = 0;
+       this->ConfigThread = NULL;
 
        // Initialise TIME
        this->TIME = time(NULL);
@@ -463,9 +462,10 @@ InspIRCd::InspIRCd(int argc, char** argv)
                        break;
                        case '?':
                                /* Unknown parameter */
-                               printf("Uknown parameter '%s'\n", argv[index]);
-                               printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>]\n\
-                                                 [--runasroot] [--version] [--config <config>] [--testsuite]\n", argv[0]);
+                       default:
+                               /* Fall through to handle other weird values too */
+                               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], 8+strlen(argv[0]), " ");
                                Exit(EXIT_STATUS_ARGV);
                        break;
                }
@@ -572,11 +572,8 @@ InspIRCd::InspIRCd(int argc, char** argv)
        /* During startup we don't actually initialize this
         * in the thread engine.
         */
-       this->ConfigThread = new ConfigReaderThread(this, true, "");
-       ConfigThread->Run();
-       delete ConfigThread;
-       this->ConfigThread = NULL;
-        /* Switch over logfiles */
+       this->Config->Read();
+       this->Config->Apply(NULL, "");
        Logs->OpenFileLogs();
 
        /** Note: This is safe, the method checks for user == NULL */
@@ -609,15 +606,15 @@ InspIRCd::InspIRCd(int argc, char** argv)
        }
 
        /* set up fake client again this time with the correct uid */
-       this->FakeClient = new User(this, "#INVALID");
-       this->FakeClient->SetFd(FD_MAGIC_NUMBER);
+       this->FakeClient = new FakeUser(this, "!");
+       this->FakeClient->SetFakeServer(Config->ServerName);
 
        // Get XLine to do it's thing.
        this->XLines->CheckELines();
        this->XLines->ApplyLines();
 
        CheckDie();
-       int bounditems = BindPorts(true, found_ports, pl);
+       int bounditems = BindPorts(pl);
 
        printf("\n");
 
@@ -627,9 +624,10 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->BuildISupport();
        InitializeDisabledCommands(Config->DisabledCommands, this);
 
-       if (Config->ports.size() != (unsigned int)found_ports)
+       if (!pl.empty())
        {
-               printf("\nWARNING: Not all your client ports could be bound --\nstarting anyway with %d of %d client ports bound.\n\n", bounditems, found_ports);
+               printf("\nWARNING: Not all your client ports could be bound --\nstarting anyway with %d of %d client ports bound.\n\n",
+                       bounditems, bounditems + (int)pl.size());
                printf("The following port(s) failed to bind:\n");
                printf("Hint: Try using a public IP instead of blank or *\n\n");
                int j = 1;
@@ -767,35 +765,29 @@ int InspIRCd::Run()
                if (this->ConfigThread && this->ConfigThread->IsDone())
                {
                        /* Rehash has completed */
+                       this->Logs->Log("CONFIG",DEBUG,"Detected ConfigThread exiting, tidying up...");
 
                        /* Switch over logfiles */
                        Logs->CloseLogs();
                        Logs->OpenFileLogs();
 
-                       this->Logs->Log("CONFIG",DEBUG,"Detected ConfigThread exiting, tidying up...");
-
-                       /* These are currently not known to be threadsafe, so they are executed outside
-                        * of the thread. It would be pretty simple to move them to the thread Run method
-                        * once they are known threadsafe with all the correct mutexes in place. This might
-                        * not be worth the effort however as these functions execute relatively quickly
-                        * and would not benefit from being within the config read thread.
+                       /*
+                        * 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 = !Config->RehashUserUID.empty() ? FindNick(Config->RehashUserUID) : NULL;
-                       FOREACH_MOD_I(this, I_OnRehash, OnRehash(user, Config->RehashParameter));
+                       User* user = ConfigThread->TheUserUID.empty() ? FindNick(ConfigThread->TheUserUID) : NULL;
+                       FOREACH_MOD_I(this, I_OnRehash, OnRehash(user));
                        this->BuildISupport();
 
-                       /* IMPORTANT: This delete may hang if you fuck up your thread syncronization.
-                        * It will hang waiting for the ConfigThread to 'join' to avoid race conditons,
-                        * until the other thread is completed.
-                        */
                        delete ConfigThread;
                        ConfigThread = NULL;
                }