X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd.cpp;h=96b7792716942c6984e657ea4d2bb4f8a3c846b7;hb=9183ebd28c79b12ddf29b3847f59679e480af70a;hp=50e76b2a2427ee9dd3e24e2b58c1bd23580bd72d;hpb=9f33bf7fc83cffccae96eb622bf39e8f4838b809;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 50e76b2a2..96b779271 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -11,6 +11,8 @@ * --------------------------------------------------- */ +/* w00t was here. ;p */ + /* $Install: src/inspircd $(BINPATH) */ #include "inspircd.h" #include @@ -75,6 +77,10 @@ const char* ExitCodes[] = "Couldn't load module on startup", /* 13 */ "Could not create windows forked process", /* 14 */ "Received SIGTERM", /* 15 */ + "Bad command handler loaded", /* 16 */ + "RegisterServiceCtrlHandler failed", /* 17 */ + "UpdateSCMStatus failed", /* 18 */ + "CreateEvent failed" /* 19 */ }; void InspIRCd::Cleanup() @@ -93,7 +99,7 @@ void InspIRCd::Cleanup() /* Close all client sockets, or the new process inherits them */ for (std::vector::const_iterator i = this->Users->local_users.begin(); i != this->Users->local_users.end(); i++) { - (*i)->SetWriteError("Server shutdown"); + this->Users->QuitUser((*i), "Server shutdown"); (*i)->CloseSocket(); } @@ -452,6 +458,7 @@ InspIRCd::InspIRCd(int argc, char** argv) ThreadEngineFactory* tef = new ThreadEngineFactory(); this->Threads = tef->Create(this); delete tef; + this->Mutexes = new MutexFactory(this); /* Default implementation does nothing */ this->PI = new ProtocolInterface(this); @@ -669,22 +676,15 @@ InspIRCd::InspIRCd(int argc, char** argv) this->BuildISupport(); InitializeDisabledCommands(Config->DisabledCommands, this); - /*if ((Config->ports.size() == 0) && (found_ports > 0)) - { - printf("\nERROR: I couldn't bind any ports! Are you sure you didn't start InspIRCd twice?\n"); - Logs->Log("STARTUP", DEFAULT,"ERROR: I couldn't bind any ports! Something else is bound to those ports!"); - Exit(EXIT_STATUS_BIND); - }*/ - if (Config->ports.size() != (unsigned int)found_ports) { 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("The following port(s) failed to bind:\n"); - printf("Hint: Try using an IP instead of blank or *\n\n"); + printf("Hint: Try using a public IP instead of blank or *\n\n"); int j = 1; for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++) { - printf("%d.\tIP: %s\tPort: %lu\n", j, i->first.empty() ? "" : i->first.c_str(), (unsigned long)i->second); + printf("%d.\tAddress: %s\tReason: %s\n", j, i->first.empty() ? "" : i->first.c_str(), i->second.c_str()); } } @@ -724,6 +724,8 @@ InspIRCd::InspIRCd(int argc, char** argv) WindowsForkKillOwner(this); FreeConsole(); } + /* Set win32 service as running, if we are running as a service */ + SetServiceRunning(); #endif Logs->Log("STARTUP", DEFAULT, "Startup complete as '%s'[%s], %d max open sockets", Config->ServerName,Config->GetSID().c_str(), SE->GetMaxFds()); @@ -793,9 +795,14 @@ int InspIRCd::Run() */ if (TIME != OLDTIME) { - if (TIME < OLDTIME) + /* Allow a buffer of two seconds drift on this so that ntpdate etc dont harass admins */ + if (TIME < OLDTIME - 2) { - SNO->WriteToSnoMask('A', "\002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %lu secs.", (unsigned long)OLDTIME-TIME); + SNO->WriteToSnoMask('d', "\002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %lu secs.", (unsigned long)OLDTIME-TIME); + } + else if (TIME > OLDTIME + 2) + { + SNO->WriteToSnoMask('d', "\002EH?!\002 -- Time is jumping FORWARDS! Clock skipped %lu secs.", (unsigned long)TIME - OLDTIME); } if ((TIME % 3600) == 0) @@ -867,15 +874,6 @@ void InspIRCd::BufferedSocketCull() * An ircd in five lines! bwahahaha. ahahahahaha. ahahah *cough*. */ -int main(int argc, char ** argv) -{ - SI = new InspIRCd(argc, argv); - mysig = &SI->s_signal; - SI->Run(); - delete SI; - return 0; -} - /* this returns true when all modules are satisfied that the user should be allowed onto the irc server * (until this returns true, a user will block in the waiting state, waiting to connect up to the * registration timeout maximum seconds) @@ -899,3 +897,18 @@ void InspIRCd::SetSignal(int signal) { *mysig = signal; } + +/* On posix systems, the flow of the program starts right here, with + * ENTRYPOINT being a #define that defines main(). On Windows, ENTRYPOINT + * defines smain() and the real main() is in the service code under + * win32service.cpp. This allows the service control manager to control + * the process where we are running as a windows service. + */ +ENTRYPOINT +{ + SI = new InspIRCd(argc, argv); + mysig = &SI->s_signal; + SI->Run(); + delete SI; + return 0; +}