X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Finspircd.cpp;h=c878138fe4154475f4cfaf0591439a12aa486cce;hb=caa0c27a5a485151a0de21e700680c1e46ab85b4;hp=f2095c4a2d17bdd9b5bb1d091a0b4676ebf2670d;hpb=29822a263b3b408559257e9ef2bd29167e7573fa;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index f2095c4a2..c878138fe 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -52,7 +52,6 @@ #include #include #include "xline.h" -#include "bancache.h" #include "socketengine.h" #include "socket.h" #include "command_parse.h" @@ -89,6 +88,13 @@ const char* ExitCodes[] = "Received SIGTERM" // 10 }; +#ifdef INSPIRCD_ENABLE_TESTSUITE +/** True if we have been told to run the testsuite from the commandline, + * rather than entering the mainloop. + */ +static int do_testsuite = 0; +#endif + template static void DeleteZero(T*&n) { T* t = n; @@ -107,12 +113,9 @@ void InspIRCd::Cleanup() ports.clear(); /* Close all client sockets, or the new process inherits them */ - LocalUserList::reverse_iterator i = Users->local_users.rbegin(); - while (i != this->Users->local_users.rend()) - { - User* u = *i++; - Users->QuitUser(u, "Server shutdown"); - } + LocalUserList& list = Users->local_users; + for (LocalUserList::iterator i = list.begin(); i != list.end(); ++i) + Users->QuitUser(*i, "Server shutdown"); GlobalCulls.Apply(); Modules->UnloadAll(); @@ -120,22 +123,21 @@ 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 */ if (FakeClient) + { + delete FakeClient->server; FakeClient->cull(); + } DeleteZero(this->FakeClient); DeleteZero(this->Users); DeleteZero(this->Modes); DeleteZero(this->XLines); DeleteZero(this->Parser); - DeleteZero(this->stats); DeleteZero(this->Modules); DeleteZero(this->BanCache); DeleteZero(this->SNO); DeleteZero(this->Config); - DeleteZero(this->chanlist); DeleteZero(this->PI); - DeleteZero(this->Threads); - DeleteZero(this->Timers); - DeleteZero(this->SE); + SocketEngine::Deinit(); Logs->CloseLogs(); DeleteZero(this->Logs); } @@ -154,6 +156,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); } @@ -164,7 +172,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 = fork(); if (childpid < 0) @@ -224,17 +233,16 @@ void InspIRCd::WritePID(const std::string &filename) } InspIRCd::InspIRCd(int argc, char** argv) : - ConfigFileName(CONFIG_PATH "/inspircd.conf"), + ConfigFileName(INSPIRCD_CONFIG_PATH "/inspircd.conf"), /* Functor pointer initialisation. * * THIS MUST MATCH THE ORDER OF DECLARATION OF THE FUNCTORS, e.g. the methods * themselves within the class. */ - OperQuit("OperQuit", NULL), + OperQuit("operquit", NULL), GenRandom(&HandleGenRandom), IsChannel(&HandleIsChannel), - Rehash(&HandleRehash), IsNick(&HandleIsNick), IsIdent(&HandleIsIdent), OnCheckExemption(&HandleOnCheckExemption) @@ -244,21 +252,18 @@ InspIRCd::InspIRCd(int argc, char** argv) : Extensions.Register(&OperQuit); FailedPortList pl; + // Flag variables passed to getopt_long() later int do_version = 0, do_nofork = 0, do_debug = 0, - do_nolog = 0, do_root = 0, do_testsuite = 0; /* flag variables */ + do_nolog = 0, do_root = 0; // Initialize so that if we exit before proper initialization they're not deleted this->Logs = 0; - this->Threads = 0; this->PI = 0; this->Users = 0; - this->chanlist = 0; this->Config = 0; this->SNO = 0; this->BanCache = 0; this->Modules = 0; - this->stats = 0; - this->Timers = 0; this->Parser = 0; this->XLines = 0; this->Modes = 0; @@ -271,9 +276,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : // This must be created first, so other parts of Insp can use it while starting up this->Logs = new LogManager; - SE = CreateSocketEngine(); - - this->Threads = new ThreadEngine; + SocketEngine::Init(); /* Default implementation does nothing */ this->PI = new ProtocolInterface; @@ -281,15 +284,11 @@ InspIRCd::InspIRCd(int argc, char** argv) : // Create base manager classes early, so nothing breaks this->Users = new UserManager; - this->chanlist = new chan_hash(); - this->Config = new ServerConfig; this->SNO = new SnomaskManager; this->BanCache = new BanCacheManager; this->Modules = new ModuleManager(); dynamic_reference_base::reset_all(); - this->stats = new serverstats(); - this->Timers = new TimerManager; this->Parser = new CommandParser; this->XLines = new XLineManager; @@ -324,7 +323,9 @@ InspIRCd::InspIRCd(int argc, char** argv) : { "nolog", no_argument, &do_nolog, 1 }, { "runasroot", no_argument, &do_root, 1 }, { "version", no_argument, &do_version, 1 }, +#ifdef INSPIRCD_ENABLE_TESTSUITE { "testsuite", no_argument, &do_testsuite, 1 }, +#endif { 0, 0, 0, 0 } }; @@ -336,7 +337,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : { case 'c': /* Config filename was set */ - ConfigFileName = optarg; + ConfigFileName = ServerInstance->Config->Paths.PrependConfig(optarg); break; case 0: /* getopt_long_only() set an int variable, just keep going */ @@ -347,18 +348,20 @@ InspIRCd::InspIRCd(int argc, char** argv) : /* Fall through to handle other weird values too */ std::cout << "Unknown parameter '" << argv[optind-1] << "'" << std::endl; std::cout << "Usage: " << argv[0] << " [--nofork] [--nolog] [--debug] [--config ]" << std::endl << - std::string(static_cast(8+strlen(argv[0])), ' ') << "[--runasroot] [--version] [--testsuite]" << std::endl; + std::string(static_cast(8+strlen(argv[0])), ' ') << "[--runasroot] [--version]" << std::endl; Exit(EXIT_STATUS_ARGV); break; } } +#ifdef INSPIRCD_ENABLE_TESTSUITE if (do_testsuite) do_nofork = do_debug = true; +#endif if (do_version) { - std::cout << std::endl << VERSION << " " << REVISION << std::endl; + std::cout << std::endl << INSPIRCD_VERSION << " " << INSPIRCD_REVISION << std::endl; Exit(EXIT_STATUS_NOERROR); } @@ -371,8 +374,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.TestSuite = (do_testsuite != 0); + Config->cmdline.writelog = !do_nolog; if (do_debug) { @@ -381,14 +383,14 @@ InspIRCd::InspIRCd(int argc, char** argv) : Logs->AddLogTypes("*", fls, true); } - if (!ServerConfig::FileExists(ConfigFileName.c_str())) + if (!FileSystem::FileExists(ConfigFileName)) { #ifdef _WIN32 /* Windows can (and defaults to) hide file extensions, so let's play a bit nice for windows users. */ std::string txtconf = this->ConfigFileName; txtconf.append(".txt"); - if (ServerConfig::FileExists(txtconf.c_str())) + if (FileSystem::FileExists(txtconf)) { ConfigFileName = txtconf; } @@ -440,7 +442,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : } } - SE->RecoverFromFork(); + SocketEngine::RecoverFromFork(); /* During startup we read the configuration now, not in * a seperate thread @@ -458,7 +460,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : this->UIDGen.init(Config->sid); // Create the server user for this server - this->FakeClient = new FakeUser(Config->sid, Config->ServerName); + this->FakeClient = new FakeUser(Config->sid, Config->ServerName, Config->ServerDesc); // This is needed as all new XLines are marked pending until ApplyLines() is called this->XLines->ApplyLines(); @@ -487,7 +489,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : std::cout << std::endl << "Hint: Try using a public IP instead of blank or *" << std::endl; } - std::cout << "InspIRCd is now running as '" << Config->ServerName << "'[" << Config->GetSID() << "] with " << SE->GetMaxFds() << " max open sockets" << std::endl; + std::cout << "InspIRCd is now running as '" << Config->ServerName << "'[" << Config->GetSID() << "] with " << SocketEngine::GetMaxFds() << " max open sockets" << std::endl; #ifndef _WIN32 if (!Config->cmdline.nofork) @@ -509,7 +511,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : * * -- nenolod */ - if ((!do_nofork) && (!do_testsuite) && (!Config->cmdline.forcedebug)) + if ((!do_nofork) && (!Config->cmdline.forcedebug)) { int fd = open("/dev/null", O_RDWR); @@ -539,10 +541,10 @@ InspIRCd::InspIRCd(int argc, char** argv) : FreeConsole(); } - QueryPerformanceFrequency(&stats->QPFrequency); + QueryPerformanceFrequency(&stats.QPFrequency); #endif - Logs->Log("STARTUP", LOG_DEFAULT, "Startup complete as '%s'[%s], %d max open sockets", Config->ServerName.c_str(),Config->GetSID().c_str(), SE->GetMaxFds()); + Logs->Log("STARTUP", LOG_DEFAULT, "Startup complete as '%s'[%s], %d max open sockets", Config->ServerName.c_str(),Config->GetSID().c_str(), SocketEngine::GetMaxFds()); #ifndef _WIN32 std::string SetUser = Config->ConfValue("security")->getString("runasuser"); @@ -568,7 +570,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : if (!g) { - this->Logs->Log("STARTUP", LOG_DEFAULT, "getgrnam() failed (bad user?): %s", strerror(errno)); + this->Logs->Log("STARTUP", LOG_DEFAULT, "getgrnam(%s) failed (wrong group?): %s", SetGroup.c_str(), strerror(errno)); this->QuickExit(0); } @@ -576,7 +578,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : if (ret == -1) { - this->Logs->Log("STARTUP", LOG_DEFAULT, "setgid() failed (bad user?): %s", strerror(errno)); + this->Logs->Log("STARTUP", LOG_DEFAULT, "setgid() failed (wrong group?): %s", strerror(errno)); this->QuickExit(0); } } @@ -591,7 +593,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : if (!u) { - this->Logs->Log("STARTUP", LOG_DEFAULT, "getpwnam() failed (bad user?): %s", strerror(errno)); + this->Logs->Log("STARTUP", LOG_DEFAULT, "getpwnam(%s) failed (wrong user?): %s", SetUser.c_str(), strerror(errno)); this->QuickExit(0); } @@ -599,7 +601,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : if (ret == -1) { - this->Logs->Log("STARTUP", LOG_DEFAULT, "setuid() failed (bad user?): %s", strerror(errno)); + this->Logs->Log("STARTUP", LOG_DEFAULT, "setuid() failed (wrong user?): %s", strerror(errno)); this->QuickExit(0); } } @@ -630,13 +632,15 @@ void InspIRCd::UpdateTime() void InspIRCd::Run() { +#ifdef INSPIRCD_ENABLE_TESTSUITE /* See if we're supposed to be running the test suite rather than entering the mainloop */ - if (Config->cmdline.TestSuite) + if (do_testsuite) { TestSuite* ts = new TestSuite; delete ts; return; } +#endif UpdateTime(); time_t OLDTIME = TIME.tv_sec; @@ -671,18 +675,18 @@ void InspIRCd::Run() { #ifndef _WIN32 getrusage(RUSAGE_SELF, &ru); - stats->LastSampled = TIME; - stats->LastCPU = ru.ru_utime; + stats.LastSampled = TIME; + stats.LastCPU = ru.ru_utime; #else - if(QueryPerformanceCounter(&stats->LastSampled)) + if(QueryPerformanceCounter(&stats.LastSampled)) { FILETIME CreationTime; FILETIME ExitTime; FILETIME KernelTime; FILETIME UserTime; GetProcessTimes(GetCurrentProcess(), &CreationTime, &ExitTime, &KernelTime, &UserTime); - stats->LastCPU.dwHighDateTime = KernelTime.dwHighDateTime + UserTime.dwHighDateTime; - stats->LastCPU.dwLowDateTime = KernelTime.dwLowDateTime + UserTime.dwLowDateTime; + stats.LastCPU.dwHighDateTime = KernelTime.dwHighDateTime + UserTime.dwHighDateTime; + stats.LastCPU.dwLowDateTime = KernelTime.dwLowDateTime + UserTime.dwLowDateTime; } #endif @@ -704,7 +708,7 @@ void InspIRCd::Run() FOREACH_MOD(OnGarbageCollect, ()); } - Timers->TickTimers(TIME.tv_sec); + Timers.TickTimers(TIME.tv_sec); Users->DoBackgroundUserStuff(); if ((TIME.tv_sec % 5) == 0) @@ -721,8 +725,8 @@ void InspIRCd::Run() * This will cause any read or write events to be * dispatched to their handlers. */ - this->SE->DispatchTrialWrites(); - this->SE->DispatchEvents(); + SocketEngine::DispatchTrialWrites(); + SocketEngine::DispatchEvents(); /* if any users were quit, take them out */ GlobalCulls.Apply();