aboutsummaryrefslogtreecommitdiff
path: root/src/modules/m_spanningtree/treesocket2.cpp
diff options
context:
space:
mode:
authorGravatar peavey2007-06-13 22:04:14 +0000
committerGravatar peavey2007-06-13 22:04:14 +0000
commitd7ecb6198658cca6f79383f80e560c55527ab986 (patch)
treedca4ed5ddc2a4068d2d071a23344852f67204c18 /src/modules/m_spanningtree/treesocket2.cpp
parentHave the installer install cert.pem and key.pem to the conf/ dir only if they... (diff)
This is not, not routing of SQUIT, nothing to see here, move along :>
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7301 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/m_spanningtree/treesocket2.cpp')
-rw-r--r--src/modules/m_spanningtree/treesocket2.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/modules/m_spanningtree/treesocket2.cpp b/src/modules/m_spanningtree/treesocket2.cpp
index d13ea0d89..fadb1ef9c 100644
--- a/src/modules/m_spanningtree/treesocket2.cpp
+++ b/src/modules/m_spanningtree/treesocket2.cpp
@@ -294,6 +294,55 @@ bool TreeSocket::OperQuit(const std::string &prefix, std::deque<std::string> &pa
return true;
}
+/* to be removed after 1.1.9 */
+/*
+ * Remote SQUIT (RSQUIT). Routing works similar to SVSNICK: Route it to the server that the target is connected to locally,
+ * then let that server do the dirty work (squit it!). Example:
+ * A -> B -> C -> D: oper on A squits D, A routes to B, B routes to C, C notices D connected locally, kills it. -- w00t
+ */
+bool TreeSocket::RemoteSquit(const std::string &prefix, std::deque<std::string> &params)
+{
+ /* ok.. :w00t RSQUIT jupe.barafranca.com :reason here */
+ if (params.size() < 2)
+ return true;
+
+ TreeServer* s = Utils->FindServerMask(params[0]);
+
+ if (s)
+ {
+ if (s == Utils->TreeRoot)
+ {
+ this->Instance->SNO->WriteToSnoMask('l',"What the fuck, I recieved a remote SQUIT for myself? :< (from %s", prefix.c_str());
+ return true;
+ }
+
+ TreeSocket* sock = s->GetSocket();
+
+ if (sock)
+ {
+ /* it's locally connected, KILL IT! */
+ Instance->SNO->WriteToSnoMask('l',"RSQUIT: Server \002%s\002 removed from network by %s: %s", params[0].c_str(), prefix.c_str(), params[1].c_str());
+ sock->Squit(s,"Server quit by " + prefix + ": " + params[1]);
+ Instance->SE->DelFd(sock);
+ sock->Close();
+ delete sock;
+ }
+ else
+ {
+ /* route the rsquit */
+ params[1] = ":" + params[1];
+ Utils->DoOneToOne(prefix, "RSQUIT2", params, params[0]);
+ }
+ }
+ else
+ {
+ /* mother fucker! it doesn't exist */
+ }
+
+ return true;
+}
+/* end to be removed after 1.1.9 */
+
bool TreeSocket::ServiceJoin(const std::string &prefix, std::deque<std::string> &params)
{
if (params.size() < 2)
@@ -1280,6 +1329,12 @@ bool TreeSocket::ProcessLine(std::string &line)
{
return this->OperQuit(prefix,params);
}
+ /* to be removed after 1.1.9 */
+ else if (command == "RSQUIT2")
+ {
+ return this->RemoteSquit(prefix, params);
+ }
+ /* end to be removed after 1.1.9 */
else if (command == "IDLE")
{
return this->Whois(prefix,params);