X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd.cpp;h=11ea679e791d839306c3efc0d4f0a3c21973b152;hb=3df81381bcfee4531599ddb417a31e7efca2528e;hp=ec33812933279f9017226c2d1465d413e936214f;hpb=bbce9d1247c32f34292faa0df1a3f4316b8c5a42;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index ec3381293..11ea679e7 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -3,7 +3,7 @@ * +------------------------------------+ * * InspIRCd: (C) 2002-2009 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -151,8 +151,6 @@ void InspIRCd::Cleanup() /* Close logging */ this->Logs->CloseLogs(); DeleteZero(this->Logs); - - delete RehashFinishMutex; } void InspIRCd::Restart(const std::string &reason) @@ -230,6 +228,8 @@ void InspIRCd::SetSignals() signal(SIGHUP, InspIRCd::SetSignal); signal(SIGPIPE, SIG_IGN); signal(SIGCHLD, SIG_IGN); + /* We want E2BIG not a signal! */ + signal(SIGXFSZ, SIG_IGN); #endif signal(SIGTERM, InspIRCd::SetSignal); } @@ -317,7 +317,7 @@ void InspIRCd::WritePID(const std::string &filename) InspIRCd::InspIRCd(int argc, char** argv) : GlobalCulls(this), - /* Functor initialisation. Note that the ordering here is very important. + /* Functor initialisation. Note that the ordering here is very important. * * THIS MUST MATCH ORDER OF DECLARATION OF THE HandleWhateverFunc classes * within class InspIRCd. @@ -349,7 +349,7 @@ InspIRCd::InspIRCd(int argc, char** argv) #ifdef WIN32 // Strict, frequent checking of memory on debug builds _CrtSetDbgFlag ( _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); - + // Avoid erroneous frees on early exit WindowsIPC = 0; #endif @@ -357,7 +357,7 @@ InspIRCd::InspIRCd(int argc, char** argv) FailedPortList pl; int do_version = 0, do_nofork = 0, do_debug = 0, do_nolog = 0, do_root = 0, do_testsuite = 0; /* flag variables */ - char c = 0; + int c = 0; // Initialize so that if we exit before proper initialization they're not deleted this->Logs = 0; @@ -389,19 +389,16 @@ InspIRCd::InspIRCd(int argc, char** argv) SE = SEF->Create(this); delete SEF; - ThreadEngineFactory* tef = new ThreadEngineFactory(); - this->Threads = tef->Create(this); - delete tef; - this->Mutexes = new MutexFactory(this); + this->Threads = new ThreadEngine(this); /* Default implementation does nothing */ this->PI = new ProtocolInterface(this); this->s_signal = 0; - + // Create base manager classes early, so nothing breaks this->Users = new UserManager(this); - + this->Users->unregistered_count = 0; this->Users->clientlist = new user_hash(); @@ -448,7 +445,8 @@ InspIRCd::InspIRCd(int argc, char** argv) { 0, 0, 0, 0 } }; - while ((c = getopt_long_only(argc, argv, ":f:", longopts, NULL)) != -1) + int index; + while ((c = getopt_long_only(argc, argv, ":f:", longopts, &index)) != -1) { switch (c) { @@ -463,8 +461,11 @@ InspIRCd::InspIRCd(int argc, char** argv) case 0: /* getopt_long_only() set an int variable, just keep going */ break; + case '?': + /* Unknown parameter */ default: - /* Unknown parameter! DANGER, INTRUDER.... err.... yeah. */ + /* 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]); Exit(EXIT_STATUS_ARGV); @@ -516,7 +517,7 @@ InspIRCd::InspIRCd(int argc, char** argv) /* 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"); - i + if (ServerConfig::FileExists(txtconf.c_str())) { strlcat(this->ConfigFileName, ".txt", MAXBUF); @@ -534,7 +535,7 @@ InspIRCd::InspIRCd(int argc, char** argv) printf_c("(C) InspIRCd Development Team.\033[0m\n\n"); printf_c("Developers:\n"); printf_c("\t\033[1;32mBrain, FrostyCoolSlug, w00t, Om, Special\n"); - printf_c("\t\033[1;32mpippijn, peavey, aquanight, fez, psychon, dz\033[0m\n\n"); + 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(); @@ -623,7 +624,7 @@ InspIRCd::InspIRCd(int argc, char** argv) printf("\n"); this->Modules->LoadAll(); - + /* Just in case no modules were loaded - fix for bug #101 */ this->BuildISupport(); InitializeDisabledCommands(Config->DisabledCommands, this); @@ -641,7 +642,7 @@ InspIRCd::InspIRCd(int argc, char** argv) } printf("\nInspIRCd is now running as '%s'[%s] with %d max open sockets\n", Config->ServerName,Config->GetSID().c_str(), SE->GetMaxFds()); - + #ifndef WINDOWS if (!Config->nofork) { @@ -754,8 +755,6 @@ int InspIRCd::Run() Exit(0); } - RehashFinishMutex = Mutexes->CreateMutex(); - while (true) { #ifndef WIN32 @@ -767,8 +766,7 @@ int InspIRCd::Run() #endif /* Check if there is a config thread which has finished executing but has not yet been freed */ - RehashFinishMutex->Lock(); - if (this->ConfigThread && this->ConfigThread->GetExitFlag()) + if (this->ConfigThread && this->ConfigThread->IsDone()) { /* Rehash has completed */ @@ -803,7 +801,6 @@ int InspIRCd::Run() delete ConfigThread; ConfigThread = NULL; } - RehashFinishMutex->Unlock(); /* time() seems to be a pretty expensive syscall, so avoid calling it too much. * Once per loop iteration is pleanty. @@ -850,7 +847,7 @@ int InspIRCd::Run() this->stats->LastCPU = ru.ru_utime; } #else - WindowsIPC->Check(); + WindowsIPC->Check(); #endif }