X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd.cpp;h=54c3aa0abdbae606d71402bc179b5efb1af7b784;hb=e2322b3feb0b70a5c5d74fff4a9ab2bd7c85bcac;hp=cd99e63b6571ae757d27ac3804eab811074b95a6;hpb=1fbd75d645e2b4243ebec65bb8952069b24253b9;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index cd99e63b6..54c3aa0ab 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -1,30 +1,14 @@ -/* --------------------------------------------------------------------- - * - * +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ * - * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. - * E-mail: - * - * - * - * Written by Craig Edwards, Craig McLure, and others. - * This program is free but copyrighted software; you can redistribute - * it and/or modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation, version 2 - * (two) ONLY. + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is free but copyrighted software; see + * the file COPYING for details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * --------------------------------------------------------------------- + * --------------------------------------------------- */ #include "inspircd.h" @@ -85,10 +69,9 @@ void InspIRCd::Exit(int status) void InspIRCd::Start() { printf("\033[1;32mInspire Internet Relay Chat Server, compiled %s at %s\n",__DATE__,__TIME__); - printf("(C) ChatSpike Development team.\033[0m\n\n"); - printf("Developers:\t\t\033[1;32mBrain, FrostyCoolSlug, w00t, Om, Special, pippijn, jamie\033[0m\n"); + printf("(C) InspIRCd Development Team.\033[0m\n\n"); + printf("Developers:\t\t\033[1;32mBrain, FrostyCoolSlug, w00t, Om, Special, pippijn, peavey\033[0m\n"); printf("Others:\t\t\t\033[1;32mSee /INFO Output\033[0m\n"); - printf("Name concept:\t\t\033[1;32mLord_Zathras\033[0m\n\n"); } void InspIRCd::Rehash(int status) @@ -183,6 +166,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : ModCount(-1), duration_m(60), duration_h(60*60), duration_d(60*60*24), duration_w(60*60*24*7), duration_y(60*60*24*365) { int found_ports = 0; + FailedPortList pl; modules.resize(255); factory.resize(255); @@ -260,7 +244,7 @@ InspIRCd::InspIRCd(int argc, char** argv) this->AddServerName(Config->ServerName); CheckDie(); InitializeDisabledCommands(Config->DisabledCommands, this); - stats->BoundPortCount = BindPorts(true, found_ports); + stats->BoundPortCount = BindPorts(true, found_ports, pl); for(int t = 0; t < 255; t++) Config->global_implementation[t] = 0; @@ -299,7 +283,13 @@ InspIRCd::InspIRCd(int argc, char** argv) if (stats->BoundPortCount != (unsigned int)found_ports) { - printf("\nWARNING: Not all your ports could be bound -- starting anyway with %ld of %d ports bound.\n", stats->BoundPortCount, found_ports); + printf("\nWARNING: Not all your client ports could be bound --\nstarting anyway with %ld of %d client ports bound.\n\n", stats->BoundPortCount, found_ports); + printf("The following port%s failed to bind:\n", found_ports - stats->BoundPortCount != 1 ? "s" : ""); + 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); + } } /* Add the listening sockets used for client inbound connections @@ -483,6 +473,7 @@ void InspIRCd::BuildISupport() v << MAXAWAY << " CHANMODES=" << this->Modes->ChanModes() << " FNC NETWORK=" << Config->Network << " MAXPARA=32"; Config->data005 = v.str(); FOREACH_MOD_I(this,I_On005Numeric,On005Numeric(Config->data005)); + Config->Update005(); } bool InspIRCd::UnloadModule(const char* filename) @@ -498,6 +489,17 @@ bool InspIRCd::UnloadModule(const char* filename) snprintf(MODERR,MAXBUF,"Module not unloadable (marked static)"); return false; } + std::pair intercount = GetInterfaceInstanceCount(modules[j]); + if (intercount.first > 0) + { + this->Log(DEFAULT,"Failed to unload module %s, being used by %d other(s) via interface '%s'",filename, intercount.first, intercount.second.c_str()); + snprintf(MODERR,MAXBUF,"Module not unloadable (Still in use by %d other module%s which %s using its interface '%s') -- unload dependent modules first!", + intercount.first, + intercount.first > 1 ? "s" : "", + intercount.first > 1 ? "are" : "is", + intercount.second.c_str()); + return false; + } /* Give the module a chance to tidy out all its metadata */ for (chan_hash::iterator c = this->chanlist.begin(); c != this->chanlist.end(); c++) { @@ -508,6 +510,9 @@ bool InspIRCd::UnloadModule(const char* filename) modules[j]->OnCleanup(TYPE_USER,u->second); } + /* Tidy up any dangling resolvers */ + this->Res->CleanResolvers(modules[j]); + FOREACH_MOD_I(this,I_OnUnloadModule,OnUnloadModule(modules[j],Config->module_names[j])); for(int t = 0; t < 255; t++) @@ -648,10 +653,10 @@ bool InspIRCd::LoadModule(const char* filename) return false; } } - catch (ModuleException& modexcept) + catch (CoreException& modexcept) { this->Log(DEFAULT,"Unable to load %s: ",modfile,modexcept.GetReason()); - snprintf(MODERR,MAXBUF,"Factory function threw an exception: %s",modexcept.GetReason()); + snprintf(MODERR,MAXBUF,"Factory function of %s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason()); return false; } } @@ -694,6 +699,8 @@ bool InspIRCd::LoadModule(const char* filename) void InspIRCd::DoOneIteration(bool process_module_sockets) { + static rusage ru; + /* time() seems to be a pretty expensive syscall, so avoid calling it too much. * Once per loop iteration is pleanty. */ @@ -722,6 +729,12 @@ void InspIRCd::DoOneIteration(bool process_module_sockets) FOREACH_MOD_I(this,I_OnBackgroundTimer,OnBackgroundTimer(TIME)); Timers->TickMissedTimers(TIME); } + + if (!getrusage(0, &ru)) + { + gettimeofday(&this->stats->LastSampled, NULL); + this->stats->LastCPU = ru.ru_utime; + } } /* Call the socket engine to wait on the active @@ -820,6 +833,29 @@ int InspIRCd::SetTimeDelta(int delta) return old; } +void InspIRCd::AddLocalClone(userrec* user) +{ + clonemap::iterator x = local_clones.find(user->GetIPString()); + if (x != local_clones.end()) + x->second++; + else + local_clones[user->GetIPString()] = 1; +} + +void InspIRCd::AddGlobalClone(userrec* user) +{ + clonemap::iterator y = global_clones.find(user->GetIPString()); + if (y != global_clones.end()) + y->second++; + else + global_clones[user->GetIPString()] = 1; +} + +int InspIRCd::GetTimeDelta() +{ + return time_delta; +} + bool FileLogger::Readable() { return false;