]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Release v2.0.22
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 36acf65cdbd11556ae3028e9ffaa2b1de2071802..0fa90fca5b6028ed764f94f6878d470b530320cb 100644 (file)
@@ -63,7 +63,6 @@
 #include "testsuite.h"
 
 InspIRCd* ServerInstance = NULL;
-int* mysig = NULL;
 
 /** Seperate from the other casemap tables so that code *can* still exclusively rely on RFC casemapping
  * if it must.
@@ -240,6 +239,12 @@ void InspIRCd::SetSignals()
 }
 
 void InspIRCd::QuickExit(int status)
+{
+       exit(status);
+}
+
+// Required for returning the proper value of EXIT_SUCCESS for the parent process
+static void VoidSignalHandler(int signalreceived)
 {
        exit(0);
 }
@@ -250,7 +255,8 @@ bool InspIRCd::DaemonSeed()
        std::cout << "InspIRCd Process ID: " << con_green << GetCurrentProcessId() << con_reset << std::endl;
        return true;
 #else
-       signal(SIGTERM, InspIRCd::QuickExit);
+       // Do not use QuickExit here: It will exit with status SIGTERM which would break e.g. daemon scripts
+       signal(SIGTERM, VoidSignalHandler);
 
        int childpid;
        if ((childpid = fork ()) < 0)
@@ -288,7 +294,7 @@ bool InspIRCd::DaemonSeed()
 #endif
 }
 
-void InspIRCd::WritePID(const std::string &filename)
+void InspIRCd::WritePID(const std::string& filename, bool exitonfail)
 {
 #ifndef _WIN32
        std::string fname(filename);
@@ -301,10 +307,12 @@ void InspIRCd::WritePID(const std::string &filename)
                outfile.close();
        }
        else
-       {
-               std::cout << "Failed to write PID-file '" << fname << "', exiting." << std::endl;
-               this->Logs->Log("STARTUP",DEFAULT,"Failed to write PID-file '%s', exiting.",fname.c_str());
-               Exit(EXIT_STATUS_PID);
+       {\r
+               if (exitonfail)\r
+                       std::cout << "Failed to write PID-file '" << fname << "', exiting." << std::endl;
+               this->Logs->Log("STARTUP",DEFAULT,"Failed to write PID-file '%s'%s",fname.c_str(), (exitonfail ? ", exiting." : ""));\r
+               if (exitonfail)
+                       Exit(EXIT_STATUS_PID);\r
        }
 #endif
 }
@@ -355,6 +363,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
        this->Modes = 0;
        this->Res = 0;
        this->ConfigThread = NULL;
+       this->FakeClient = NULL;
 
        UpdateTime();
        this->startup_time = TIME.tv_sec;
@@ -374,8 +383,6 @@ InspIRCd::InspIRCd(int argc, char** argv) :
        // Create base manager classes early, so nothing breaks
        this->Users = new UserManager;
 
-       this->Users->unregistered_count = 0;
-
        this->Users->clientlist = new user_hash();
        this->Users->uuidlist = new user_hash();
        this->chanlist = new chan_hash();
@@ -426,7 +433,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
        };
 
        int index;
-       while ((c = getopt_long(argc, argv, ":f:", longopts, &index)) != -1)
+       while ((c = getopt_long(argc, argv, ":c:f:", longopts, &index)) != -1)
        {
                switch (c)
                {
@@ -471,7 +478,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
        /* Set the finished argument values */
        Config->cmdline.nofork = (do_nofork != 0);
        Config->cmdline.forcedebug = (do_debug != 0);
-       Config->cmdline.writelog = (!do_nolog != 0);
+       Config->cmdline.writelog = !do_nolog;
        Config->cmdline.TestSuite = (do_testsuite != 0);
 
        if (do_debug)
@@ -510,7 +517,8 @@ InspIRCd::InspIRCd(int argc, char** argv) :
        std::cout << con_green << "(C) InspIRCd Development Team." << con_reset << std::endl << std::endl;
        std::cout << "Developers:" << std::endl;
        std::cout << con_green << "\tBrain, FrostyCoolSlug, w00t, Om, Special, peavey" << std::endl;
-       std::cout << "\taquanight, psychon, dz, danieldg, jackmcbarn" << con_reset << std::endl << std::endl;
+       std::cout << "\taquanight, psychon, dz, danieldg, jackmcbarn" << std::endl;\r
+       std::cout << "\tAttila" << con_reset << std::endl << std::endl;
        std::cout << "Others:\t\t\t" << con_green << "See /INFO Output" << con_reset << std::endl;
 
        this->Modes = new ModeParser;
@@ -687,7 +695,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
 
                if (!g)
                {
-                       this->Logs->Log("SETGUID", DEFAULT, "getgrnam() failed (bad user?): %s", strerror(errno));
+                       this->Logs->Log("SETGUID", DEFAULT, "getgrnam(%s) failed (wrong group?): %s", SetGroup.c_str(), strerror(errno));
                        this->QuickExit(0);
                }
 
@@ -695,7 +703,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
 
                if (ret == -1)
                {
-                       this->Logs->Log("SETGUID", DEFAULT, "setgid() failed (bad user?): %s", strerror(errno));
+                       this->Logs->Log("SETGUID", DEFAULT, "setgid() failed (wrong group?): %s", strerror(errno));
                        this->QuickExit(0);
                }
        }
@@ -710,7 +718,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
 
                if (!u)
                {
-                       this->Logs->Log("SETGUID", DEFAULT, "getpwnam() failed (bad user?): %s", strerror(errno));
+                       this->Logs->Log("SETGUID", DEFAULT, "getpwnam(%s) failed (wrong user?): %s", SetUser.c_str(), strerror(errno));
                        this->QuickExit(0);
                }
 
@@ -718,7 +726,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
 
                if (ret == -1)
                {
-                       this->Logs->Log("SETGUID", DEFAULT, "setuid() failed (bad user?): %s", strerror(errno));
+                       this->Logs->Log("SETGUID", DEFAULT, "setuid() failed (wrong user?): %s", strerror(errno));
                        this->QuickExit(0);
                }
        }
@@ -788,7 +796,6 @@ int InspIRCd::Run()
                 */
                if (TIME.tv_sec != OLDTIME)
                {
-                       OLDTIME = TIME.tv_sec;
 #ifndef _WIN32
                        getrusage(RUSAGE_SELF, &ru);
                        stats->LastSampled = TIME;
@@ -809,12 +816,14 @@ int InspIRCd::Run()
                        /* Allow a buffer of two seconds drift on this so that ntpdate etc dont harass admins */
                        if (TIME.tv_sec < OLDTIME - 2)
                        {
-                               SNO->WriteToSnoMask('d', "\002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %lu secs.", (unsigned long)OLDTIME-TIME.tv_sec);
+                               SNO->WriteToSnoMask('d', "\002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %lu secs.", (unsigned long)(OLDTIME-TIME.tv_sec));
                        }
                        else if (TIME.tv_sec > OLDTIME + 2)
                        {
-                               SNO->WriteToSnoMask('d', "\002EH?!\002 -- Time is jumping FORWARDS! Clock skipped %lu secs.", (unsigned long)TIME.tv_sec - OLDTIME);
+                               SNO->WriteToSnoMask('d', "\002EH?!\002 -- Time is jumping FORWARDS! Clock skipped %lu secs.", (unsigned long)(TIME.tv_sec - OLDTIME));
                        }
+\r
+                       OLDTIME = TIME.tv_sec;
 
                        if ((TIME.tv_sec % 3600) == 0)
                        {
@@ -846,10 +855,10 @@ int InspIRCd::Run()
                GlobalCulls.Apply();
                AtomicActions.Run();
 
-               if (this->s_signal)
+               if (s_signal)
                {
                        this->SignalHandler(s_signal);
-                       this->s_signal = 0;
+                       s_signal = 0;
                }
        }
 
@@ -873,9 +882,11 @@ bool InspIRCd::AllModulesReportReady(LocalUser* user)
        return (res == MOD_RES_PASSTHRU);
 }
 
+sig_atomic_t InspIRCd::s_signal = 0;
+
 void InspIRCd::SetSignal(int signal)
 {
-       *mysig = signal;
+       s_signal = signal;
 }
 
 /* On posix systems, the flow of the program starts right here, with
@@ -887,7 +898,6 @@ void InspIRCd::SetSignal(int signal)
 ENTRYPOINT
 {
        new InspIRCd(argc, argv);
-       mysig = &ServerInstance->s_signal;
        ServerInstance->Run();
        delete ServerInstance;
        return 0;