summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-08-27 21:09:46 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-08-27 21:09:46 +0000
commit07c58b6fb8da655a45d4d4d17dd6d518f60b00dd (patch)
treeccc25c7c98d79f527d090ef6c9d7d60e9bf9f981
parent66d187fa55b4fdcb38ec987c269c4c1573a441b5 (diff)
This may need tidying up to make SetID internal and do this in the constructor, but for now it works.
AWOOGA AWOOGA WARNING: SetID can throw a CoreException if the id already exists! git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7919 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/modules/m_spanningtree/treeserver.cpp9
-rw-r--r--src/modules/m_spanningtree/utils.cpp9
-rw-r--r--src/modules/m_spanningtree/utils.h6
3 files changed, 24 insertions, 0 deletions
diff --git a/src/modules/m_spanningtree/treeserver.cpp b/src/modules/m_spanningtree/treeserver.cpp
index d252f2386..5f91e43b5 100644
--- a/src/modules/m_spanningtree/treeserver.cpp
+++ b/src/modules/m_spanningtree/treeserver.cpp
@@ -132,6 +132,11 @@ std::string& TreeServer::GetID()
void TreeServer::SetID(const std::string &id)
{
sid = id;
+ server_hash::iterator iter = Utils->sidlist.find(sid);
+ if (iter == Utils->sidlist.end())
+ Utils->sidlist[sid] = this;
+ else
+ throw CoreException("Server ID '"+id+"' already exists!");
}
int TreeServer::QuitUsers(const std::string &reason)
@@ -330,6 +335,10 @@ TreeServer::~TreeServer()
{
/* We'd better tidy up after ourselves, eh? */
this->DelHashEntry();
+
+ server_hash::iterator iter = Utils->sidlist.find(GetID());
+ if (iter != Utils->sidlist.end())
+ Utils->sidlist.erase(iter);
}
diff --git a/src/modules/m_spanningtree/utils.cpp b/src/modules/m_spanningtree/utils.cpp
index b8a634797..3f5a910c9 100644
--- a/src/modules/m_spanningtree/utils.cpp
+++ b/src/modules/m_spanningtree/utils.cpp
@@ -149,6 +149,15 @@ TreeServer* SpanningTreeUtilities::FindServerMask(const std::string &ServerName)
return NULL;
}
+TreeServer* SpanningTreeUtilities::FindServerID(const std::string &id)
+{
+ server_hash::iterator iter = sidlist.find(id);
+ if (iter != sidlist.end())
+ return iter->second;
+ else
+ return NULL;
+}
+
/* A convenient wrapper that returns true if a server exists */
bool SpanningTreeUtilities::IsServer(const std::string &ServerName)
{
diff --git a/src/modules/m_spanningtree/utils.h b/src/modules/m_spanningtree/utils.h
index 3a36a2e20..101714186 100644
--- a/src/modules/m_spanningtree/utils.h
+++ b/src/modules/m_spanningtree/utils.h
@@ -89,6 +89,9 @@ class SpanningTreeUtilities
/** Hash of currently connected servers by name
*/
server_hash serverlist;
+ /** Hash of currently known server ids
+ */
+ server_hash sidlist;
/** Hash of servers currently bursting but not initialized as connected
*/
std::map<irc::string,TreeSocket*> burstingserverlist;
@@ -163,6 +166,9 @@ class SpanningTreeUtilities
/** Find a server by name
*/
TreeServer* FindServer(const std::string &ServerName);
+ /** Find server by SID
+ */
+ TreeServer* FindServerID(const std::string &id);
/** Find a remote bursting server by name
*/
TreeServer* FindRemoteBurstServer(TreeServer* Server);