X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd.cpp;h=5b9ee670ac7edd27f666edfc03814011190ad342;hb=ff3b706b2506d7614bce5e54bc88657bd62ebd4d;hp=7cc66cd5fdaec66639c1a4cacec9cad82ba731e5;hpb=5b6ae9c5427b32f5bacba592fc08e1f70009aee4;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 7cc66cd5f..5b9ee670a 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -52,12 +52,7 @@ #include #include #include "xline.h" -#include "bancache.h" -#include "socketengine.h" -#include "socket.h" -#include "command_parse.h" #include "exitcodes.h" -#include "caller.h" #include "testsuite.h" InspIRCd* ServerInstance = NULL; @@ -113,11 +108,6 @@ void InspIRCd::Cleanup() } ports.clear(); - /* Close all client sockets, or the new process inherits them */ - LocalUserList& list = Users->local_users; - for (LocalUserList::iterator i = list.begin(); i != list.end(); ++i) - Users->QuitUser(*i, "Server shutdown"); - GlobalCulls.Apply(); Modules->UnloadAll(); @@ -129,22 +119,10 @@ void InspIRCd::Cleanup() 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); } void InspIRCd::SetSignals() @@ -216,7 +194,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); @@ -230,27 +208,29 @@ void InspIRCd::WritePID(const std::string &filename) } else { - std::cout << "Failed to write PID-file '" << fname << "', exiting." << std::endl; - this->Logs->Log("STARTUP", LOG_DEFAULT, "Failed to write PID-file '%s', exiting.",fname.c_str()); - Exit(EXIT_STATUS_PID); + if (exitonfail) + std::cout << "Failed to write PID-file '" << fname << "', exiting." << std::endl; + this->Logs->Log("STARTUP", LOG_DEFAULT, "Failed to write PID-file '%s'%s", fname.c_str(), (exitonfail ? ", exiting." : "")); + if (exitonfail) + Exit(EXIT_STATUS_PID); } #endif } InspIRCd::InspIRCd(int argc, char** argv) : - ConfigFileName(CONFIG_PATH "/inspircd.conf"), + ConfigFileName(INSPIRCD_CONFIG_PATH "/inspircd.conf"), + PI(&DefaultProtocolInterface), /* 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", ExtensionItem::EXT_USER, NULL), GenRandom(&HandleGenRandom), IsChannel(&HandleIsChannel), IsNick(&HandleIsNick), - IsIdent(&HandleIsIdent), - OnCheckExemption(&HandleOnCheckExemption) + IsIdent(&HandleIsIdent) { ServerInstance = this; @@ -262,49 +242,18 @@ InspIRCd::InspIRCd(int argc, char** argv) : 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; this->ConfigThread = NULL; this->FakeClient = NULL; UpdateTime(); this->startup_time = TIME.tv_sec; - // 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; - - /* Default implementation does nothing */ - this->PI = new ProtocolInterface; - - // Create base manager classes early, so nothing breaks - this->Users = new UserManager; - - this->chanlist = new chan_hash(); + SocketEngine::Init(); 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; this->Config->cmdline.argv = argv; @@ -376,7 +325,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : if (do_version) { - std::cout << std::endl << VERSION << " " << REVISION << std::endl; + std::cout << std::endl << INSPIRCD_VERSION << std::endl; Exit(EXIT_STATUS_NOERROR); } @@ -389,11 +338,11 @@ 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; if (do_debug) { - FileWriter* fw = new FileWriter(stdout); + FileWriter* fw = new FileWriter(stdout, 1); FileLogStream* fls = new FileLogStream(LOG_RAWIO, fw); Logs->AddLogTypes("*", fls, true); } @@ -418,15 +367,8 @@ InspIRCd::InspIRCd(int argc, char** argv) : } } - std::cout << con_green << "Inspire Internet Relay Chat Server" << con_reset << ", compiled on " __DATE__ " at " __TIME__ << std::endl; - 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" << std::endl; - 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; + std::cout << con_green << "InspIRCd - Internet Relay Chat Daemon" << con_reset << ", compiled on " __DATE__ " at " __TIME__ << std::endl; + std::cout << "For contributors & authors: " << con_green << "See /INFO Output" << con_reset << std::endl; #ifndef _WIN32 if (!do_root) @@ -457,7 +399,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : } } - SE->RecoverFromFork(); + SocketEngine::RecoverFromFork(); /* During startup we read the configuration now, not in * a seperate thread @@ -504,7 +446,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) @@ -556,10 +498,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"); @@ -690,40 +632,37 @@ 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 /* 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)); } OLDTIME = TIME.tv_sec; if ((TIME.tv_sec % 3600) == 0) - { - Users->GarbageCollect(); FOREACH_MOD(OnGarbageCollect, ()); - } - Timers->TickTimers(TIME.tv_sec); + Timers.TickTimers(TIME.tv_sec); Users->DoBackgroundUserStuff(); if ((TIME.tv_sec % 5) == 0) @@ -740,8 +679,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();