X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Ftreeserver.cpp;h=493b05ebf78f6dda096e3c8b3ab04f86200dc16e;hb=4b8f3dd68f7c3a273c1a892c0de54ea01e48db3e;hp=5c7162094738724e5f8832e1be4260b645f7bf08;hpb=7e843c22e16c81054bad18073d24fe1a07026431;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/treeserver.cpp b/src/modules/m_spanningtree/treeserver.cpp index 5c7162094..493b05ebf 100644 --- a/src/modules/m_spanningtree/treeserver.cpp +++ b/src/modules/m_spanningtree/treeserver.cpp @@ -1,16 +1,25 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team - * See: http://wiki.inspircd.org/Credits + * Copyright (C) 2009 Daniel De Graaf + * Copyright (C) 2007-2008 Craig Edwards + * Copyright (C) 2008 Robin Burchell + * Copyright (C) 2007 Dennis Friis * - * This program is free but copyrighted software; see - * the file COPYING for details. + * This file is part of InspIRCd. InspIRCd is free 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. * - * --------------------------------------------------- + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + #include "inspircd.h" #include "socket.h" #include "xline.h" @@ -27,7 +36,7 @@ * no socket associated with it. Its version string is our own local version. */ TreeServer::TreeServer(SpanningTreeUtilities* Util, std::string Name, std::string Desc, const std::string &id) - : ServerName(Name.c_str()), ServerDesc(Desc), Utils(Util) + : ServerName(Name.c_str()), ServerDesc(Desc), Utils(Util), ServerUser(ServerInstance->FakeClient) { age = ServerInstance->Time(); bursting = false; @@ -48,7 +57,7 @@ TreeServer::TreeServer(SpanningTreeUtilities* Util, std::string Name, std::strin * its ping counters so that it will be pinged one minute from now. */ TreeServer::TreeServer(SpanningTreeUtilities* Util, std::string Name, std::string Desc, const std::string &id, TreeServer* Above, TreeSocket* Sock, bool Hide) - : Parent(Above), ServerName(Name.c_str()), ServerDesc(Desc), Socket(Sock), Utils(Util), Hidden(Hide) + : Parent(Above), ServerName(Name.c_str()), ServerDesc(Desc), Socket(Sock), Utils(Util), ServerUser(new FakeUser(id, Name)), Hidden(Hide) { age = ServerInstance->Time(); bursting = true; @@ -59,9 +68,7 @@ TreeServer::TreeServer(SpanningTreeUtilities* Util, std::string Name, std::strin Warned = false; rtt = 0; - timeval t; - gettimeofday(&t, NULL); - long ts = (t.tv_sec * 1000) + (t.tv_usec / 1000); + long ts = ServerInstance->Time() * 1000 + (ServerInstance->Time_ns() / 1000000); this->StartBurst = ts; ServerInstance->Logs->Log("m_spanningtree",DEBUG, "Started bursting at time %lu", ts); @@ -121,7 +128,7 @@ TreeServer::TreeServer(SpanningTreeUtilities* Util, std::string Name, std::strin SetID(id); } -std::string& TreeServer::GetID() +const std::string& TreeServer::GetID() { return sid; } @@ -142,9 +149,7 @@ void TreeServer::FinishBurst() { FinishBurstInternal(); ServerInstance->XLines->ApplyLines(); - timeval t; - gettimeofday(&t, NULL); - long ts = (t.tv_sec * 1000) + (t.tv_usec / 1000); + long ts = ServerInstance->Time() * 1000 + (ServerInstance->Time_ns() / 1000000); unsigned long bursttime = ts - this->StartBurst; ServerInstance->SNO->WriteToSnoMask(Parent == Utils->TreeRoot ? 'l' : 'L', "Received end of netburst from \2%s\2 (burst time: %lu %s)", ServerName.c_str(), (bursttime > 10000 ? bursttime / 1000 : bursttime), (bursttime > 10000 ? "secs" : "msecs")); @@ -221,12 +226,12 @@ std::string TreeServer::GetName() return ServerName.c_str(); } -std::string TreeServer::GetDesc() +const std::string& TreeServer::GetDesc() { return ServerDesc; } -std::string TreeServer::GetVersion() +const std::string& TreeServer::GetVersion() { return VersionString; } @@ -316,13 +321,11 @@ void TreeServer::AddChild(TreeServer* Child) bool TreeServer::DelChild(TreeServer* Child) { - for (std::vector::iterator a = Children.begin(); a != Children.end(); a++) + std::vector::iterator it = std::find(Children.begin(), Children.end(), Child); + if (it != Children.end()) { - if (*a == Child) - { - Children.erase(a); - return true; - } + Children.erase(it); + return true; } return false; } @@ -333,27 +336,32 @@ bool TreeServer::DelChild(TreeServer* Child) */ bool TreeServer::Tidy() { - bool stillchildren = true; - while (stillchildren) + while (1) { - stillchildren = false; - for (std::vector::iterator a = Children.begin(); a != Children.end(); a++) - { - TreeServer* s = (TreeServer*)*a; - s->Tidy(); - Children.erase(a); - delete s; - stillchildren = true; - break; - } + std::vector::iterator a = Children.begin(); + if (a == Children.end()) + return true; + TreeServer* s = *a; + s->Tidy(); + s->cull(); + Children.erase(a); + delete s; } - return true; +} + +CullResult TreeServer::cull() +{ + if (ServerUser != ServerInstance->FakeClient) + ServerUser->cull(); + return classbase::cull(); } TreeServer::~TreeServer() { /* We'd better tidy up after ourselves, eh? */ this->DelHashEntry(); + if (ServerUser != ServerInstance->FakeClient) + delete ServerUser; server_hash::iterator iter = Utils->sidlist.find(GetID()); if (iter != Utils->sidlist.end())