]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/treeserver.cpp
m_spanningtree Throw an exception on protocol violations instead of returning CMD_INVALID
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / treeserver.cpp
index 7d8abf4bf4b9a855dff1d1e44b02ba4e54c8e30c..3d57b1314f15ff15a3be5d3b6b1159b9bbc66339 100644 (file)
@@ -33,7 +33,8 @@
  * no socket associated with it. Its version string is our own local version.
  */
 TreeServer::TreeServer()
-       : Parent(NULL), Route(NULL), ServerName(ServerInstance->Config->ServerName), ServerDesc(ServerInstance->Config->ServerDesc)
+       : Server(ServerInstance->Config->ServerName, ServerInstance->Config->ServerDesc)
+       , Parent(NULL), Route(NULL)
        , VersionString(ServerInstance->GetVersionString()), Socket(NULL), sid(ServerInstance->Config->GetSID()), ServerUser(ServerInstance->FakeClient)
        , age(ServerInstance->Time()), Warned(false), bursting(false), UserCount(0), OperCount(0), rtt(0), StartBurst(0), Hidden(false)
 {
@@ -45,9 +46,11 @@ TreeServer::TreeServer()
  * its ping counters so that it will be pinged one minute from now.
  */
 TreeServer::TreeServer(const std::string& Name, const std::string& Desc, const std::string& id, TreeServer* Above, TreeSocket* Sock, bool Hide)
-       : Parent(Above), ServerName(Name), ServerDesc(Desc), Socket(Sock), sid(id), ServerUser(new FakeUser(id, Name))
+       : Server(Name, Desc)
+       , Parent(Above), Socket(Sock), sid(id), ServerUser(new FakeUser(id, this))
        , age(ServerInstance->Time()), Warned(false), bursting(true), UserCount(0), OperCount(0), rtt(0), Hidden(Hide)
 {
+       CheckULine();
        SetNextPingTime(ServerInstance->Time() + Utils->PingFreq);
        SetPingFlag();
 
@@ -133,34 +136,58 @@ void TreeServer::FinishBurst()
        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"));
-       AddServerEvent(Utils->Creator, ServerName);
+               GetName().c_str(), (bursttime > 10000 ? bursttime / 1000 : bursttime), (bursttime > 10000 ? "secs" : "msecs"));
+       AddServerEvent(Utils->Creator, GetName());
 }
 
 int TreeServer::QuitUsers(const std::string &reason)
 {
        std::string publicreason = ServerInstance->Config->HideSplits ? "*.net *.split" : reason;
 
-       const user_hash& users = *ServerInstance->Users->clientlist;
+       const user_hash& users = ServerInstance->Users->GetUsers();
        unsigned int original_size = users.size();
        for (user_hash::const_iterator i = users.begin(); i != users.end(); )
        {
                User* user = i->second;
                // Increment the iterator now because QuitUser() removes the user from the container
                ++i;
-               if (user->server == ServerName)
+               if (user->server == this)
                        ServerInstance->Users->QuitUser(user, publicreason, &reason);
        }
        return original_size - users.size();
 }
 
+void TreeServer::CheckULine()
+{
+       uline = silentuline = false;
+
+       ConfigTagList tags = ServerInstance->Config->ConfTags("uline");
+       for (ConfigIter i = tags.first; i != tags.second; ++i)
+       {
+               ConfigTag* tag = i->second;
+               std::string server = tag->getString("server");
+               if (!strcasecmp(server.c_str(), GetName().c_str()))
+               {
+                       if (this->IsRoot())
+                       {
+                               ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Servers should not uline themselves (at " + tag->getTagLocation() + ")");
+                               return;
+                       }
+
+                       uline = true;
+                       silentuline = tag->getBool("silent");
+                       break;
+               }
+       }
+}
+
 /** This method is used to add the structure to the
  * hash_map for linear searches. It is only called
  * by the constructors.
  */
 void TreeServer::AddHashEntry()
 {
-       Utils->serverlist[ServerName] = this;
+       Utils->serverlist[GetName()] = this;
        Utils->sidlist[sid] = this;
 }
 
@@ -172,11 +199,6 @@ TreeServer* TreeServer::GetRoute()
        return Route;
 }
 
-const std::string& TreeServer::GetDesc()
-{
-       return ServerDesc;
-}
-
 const std::string& TreeServer::GetVersion()
 {
        return VersionString;
@@ -267,5 +289,5 @@ TreeServer::~TreeServer()
                delete ServerUser;
 
        Utils->sidlist.erase(sid);
-       Utils->serverlist.erase(ServerName);
+       Utils->serverlist.erase(GetName());
 }