]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Read multiple GnuTLS records in one RawSocketRead operation
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 630216d6e7505c09fc23cc984acff87156ee278c..d7239e0b4e515d2c5e498e88cdec4e8d48c86f33 100644 (file)
@@ -12,8 +12,8 @@
  */
 
 /* $Core */
-/* $Install: src/inspircd $(BINPATH) */
 #include "inspircd.h"
+#include "inspircd_version.h"
 #include <signal.h>
 
 #ifndef WIN32
@@ -352,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 */
@@ -374,13 +373,11 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->XLines = 0;
        this->Modes = 0;
        this->Res = 0;
+       this->ConfigThread = NULL;
 
        // 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);
 
@@ -464,9 +461,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 +492,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 +533,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)
@@ -573,11 +567,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 */
@@ -617,8 +608,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->XLines->CheckELines();
        this->XLines->ApplyLines();
 
-       CheckDie();
-       int bounditems = BindPorts(true, found_ports, pl);
+       int bounditems = BindPorts(pl);
 
        printf("\n");
 
@@ -626,11 +616,12 @@ 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 (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;
@@ -768,29 +759,11 @@ int InspIRCd::Run()
                if (this->ConfigThread && this->ConfigThread->IsDone())
                {
                        /* Rehash has completed */
-
-                       /* Switch over logfiles */
-                       Logs->CloseLogs();
-                       Logs->OpenFileLogs();
-
                        this->Logs->Log("CONFIG",DEBUG,"Detected ConfigThread exiting, tidying up...");
 
-                       /*
-                        * 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->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));
-                       this->BuildISupport();
+                       this->ConfigThread->Finish();
 
+                       ConfigThread->join();
                        delete ConfigThread;
                        ConfigThread = NULL;
                }