X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd.cpp;h=ce3bbc06b543508e5aa792480485bfdaf5ba724a;hb=2d732f4d;hp=23ef19aef771a969ffc71039882c4efafacf0ec0;hpb=3954761f11af50ed33b88f1e6609bfa8a5dab750;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 23ef19aef..ce3bbc06b 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -12,8 +12,8 @@ */ /* $Core */ -/* $Install: src/inspircd $(BINPATH) */ #include "inspircd.h" +#include "inspircd_version.h" #include #ifndef WIN32 @@ -43,7 +43,7 @@ #include "caller.h" #include "testsuite.h" -InspIRCd* SI = NULL; +InspIRCd* ServerInstance = NULL; int* mysig = NULL; /** Seperate from the other casemap tables so that code *can* still exclusively rely on RFC casemapping @@ -82,7 +82,7 @@ const char* ExitCodes[] = "CreateEvent failed" /* 19 */ }; -template static void DeleteZero(T* n) +template static void DeleteZero(T*&n) { if (n != NULL) { @@ -95,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 */ @@ -126,8 +126,6 @@ void InspIRCd::Cleanup() this->Modules->Unload(k->c_str()); } } - /* Remove core commands */ - Parser->RemoveCommands(""); /* Cleanup Server Names */ for(servernamelist::iterator itr = servernames.begin(); itr != servernames.end(); ++itr) @@ -135,6 +133,7 @@ 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 */ + DeleteZero(this->FakeClient); DeleteZero(this->Users); DeleteZero(this->Modes); DeleteZero(this->XLines); @@ -149,6 +148,7 @@ void InspIRCd::Cleanup() DeleteZero(this->PI); DeleteZero(this->Threads); DeleteZero(this->Timers); + DeleteZero(this->SE); /* Close logging */ this->Logs->CloseLogs(); DeleteZero(this->Logs); @@ -315,9 +315,7 @@ void InspIRCd::WritePID(const std::string &filename) } } -InspIRCd::InspIRCd(int argc, char** argv) - : GlobalCulls(this), - +InspIRCd::InspIRCd(int argc, char** argv) : /* Functor initialisation. Note that the ordering here is very important. * * THIS MUST MATCH ORDER OF DECLARATION OF THE HandleWhateverFunc classes @@ -352,7 +350,12 @@ InspIRCd::InspIRCd(int argc, char** argv) // Avoid erroneous frees on early exit WindowsIPC = 0; #endif - int found_ports = 0; + + ServerInstance = this; + + Extensible::Register(&User::NICKForced); + Extensible::Register(&User::OperQuit); + 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 +377,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); @@ -407,7 +408,7 @@ InspIRCd::InspIRCd(int argc, char** argv) this->Config = new ServerConfig(this); this->SNO = new SnomaskManager(this); this->BanCache = new BanCacheManager(this); - this->Modules = new ModuleManager(this); + this->Modules = new ModuleManager(); this->stats = new serverstats(); this->Timers = new TimerManager(this); this->Parser = new CommandParser(this); @@ -464,9 +465,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 ]\n\ - [--runasroot] [--version] [--config ] [--testsuite]\n", argv[0]); + printf("Unknown parameter '%s'\n", argv[optind-1]); + printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile ]\n%*s[--runasroot] [--version] [--config ] [--testsuite]\n", argv[0], static_cast(8+strlen(argv[0])), " "); Exit(EXIT_STATUS_ARGV); break; } @@ -496,7 +496,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 +537,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,16 +571,10 @@ 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 */ - this->Parser->SetupCommandTable(); - this->Res = new DNS(this); this->AddServerName(Config->ServerName); @@ -617,8 +609,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 +617,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 (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; @@ -768,29 +760,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; } @@ -893,12 +867,9 @@ void InspIRCd::BufferedSocketCull() */ bool InspIRCd::AllModulesReportReady(User* user) { - for (EventHandlerIter i = Modules->EventHandlers[I_OnCheckReady].begin(); i != Modules->EventHandlers[I_OnCheckReady].end(); ++i) - { - if (!(*i)->OnCheckReady(user)) - return false; - } - return true; + ModResult res; + FIRST_MOD_RESULT(this, OnCheckReady, res, (user)); + return (res == MOD_RES_PASSTHRU); } time_t InspIRCd::Time() @@ -919,9 +890,9 @@ void InspIRCd::SetSignal(int signal) */ ENTRYPOINT { - SI = new InspIRCd(argc, argv); - mysig = &SI->s_signal; - SI->Run(); - delete SI; + new InspIRCd(argc, argv); + mysig = &ServerInstance->s_signal; + ServerInstance->Run(); + delete ServerInstance; return 0; }