X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd.cpp;h=54c3aa0abdbae606d71402bc179b5efb1af7b784;hb=e2322b3feb0b70a5c5d74fff4a9ab2bd7c85bcac;hp=bd5af2752a43ca7ac093f7cc1978d71a6eb0f1fa;hpb=0f620f80560644de2208c33f16cf4018780e9f43;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index bd5af2752..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("(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) @@ -490,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) @@ -505,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++) { @@ -658,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; } } @@ -704,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. */ @@ -732,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 @@ -830,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;