X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd.cpp;h=6ff5bfb301921317f9d0649334eec522ac3a7ca9;hb=ee465c20b6841bce724fa5e1402b1c9ee60b788e;hp=b8eced5f4ce70fecbf7c5aff50284bfc9883a81e;hpb=6dd331262aa8f989657891e27b8891ee6a00016c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index b8eced5f4..6ff5bfb30 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -11,6 +11,7 @@ * --------------------------------------------------- */ +/* $Core */ /* $Install: src/inspircd $(BINPATH) */ #include "inspircd.h" #include @@ -94,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 */ @@ -351,7 +352,6 @@ InspIRCd::InspIRCd(int argc, char** argv) // Avoid erroneous frees on early exit WindowsIPC = 0; #endif - int found_ports = 0; FailedPortList pl; int do_version = 0, do_nofork = 0, do_debug = 0, do_nolog = 0, do_root = 0, do_testsuite = 0; /* flag variables */ @@ -373,6 +373,7 @@ InspIRCd::InspIRCd(int argc, char** argv) this->XLines = 0; this->Modes = 0; this->Res = 0; + this->ConfigThread = NULL; // Initialise TIME this->TIME = time(NULL); @@ -463,7 +464,7 @@ 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("Unknown parameter '%s'\n", argv[optind-1]); printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile ]\n\ [--runasroot] [--version] [--config ] [--testsuite]\n", argv[0]); Exit(EXIT_STATUS_ARGV); @@ -572,11 +573,8 @@ 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 */ @@ -609,14 +607,15 @@ InspIRCd::InspIRCd(int argc, char** argv) } /* set up fake client again this time with the correct uid */ - this->FakeClient = new FakeUser(this); + this->FakeClient = new FakeUser(this, "!"); + this->FakeClient->SetFakeServer(Config->ServerName); // Get XLine to do it's thing. this->XLines->CheckELines(); this->XLines->ApplyLines(); CheckDie(); - int bounditems = BindPorts(true, found_ports, pl); + int bounditems = BindPorts(pl); printf("\n"); @@ -626,9 +625,10 @@ InspIRCd::InspIRCd(int argc, char** argv) this->BuildISupport(); InitializeDisabledCommands(Config->DisabledCommands, this); - 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; @@ -766,35 +766,29 @@ int InspIRCd::Run() if (this->ConfigThread && this->ConfigThread->IsDone()) { /* Rehash has completed */ + this->Logs->Log("CONFIG",DEBUG,"Detected ConfigThread exiting, tidying up..."); /* Switch over logfiles */ Logs->CloseLogs(); Logs->OpenFileLogs(); - this->Logs->Log("CONFIG",DEBUG,"Detected ConfigThread exiting, tidying up..."); - - /* These are currently not known to be threadsafe, so they are executed outside - * of the thread. It would be pretty simple to move them to the thread Run method - * once they are known threadsafe with all the correct mutexes in place. This might - * not be worth the effort however as these functions execute relatively quickly - * and would not benefit from being within the config read thread. + /* + * 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->ConfigThread->Finish(); 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, Config->RehashParameter)); + User* user = ConfigThread->TheUserUID.empty() ? FindNick(ConfigThread->TheUserUID) : NULL; + FOREACH_MOD_I(this, I_OnRehash, OnRehash(user)); this->BuildISupport(); - /* IMPORTANT: This delete may hang if you fuck up your thread syncronization. - * It will hang waiting for the ConfigThread to 'join' to avoid race conditons, - * until the other thread is completed. - */ delete ConfigThread; ConfigThread = NULL; }