]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/treesocket1.cpp
Merge pull request #708 from SaberUK/master+development-branch
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / treesocket1.cpp
index ad3a6390df1ee8b5bd236ae0dc9f74f15290202c..3c838177d11ceb4c0ba68740c8337c3a4e482a9a 100644 (file)
@@ -179,10 +179,10 @@ void TreeSocket::Squit(TreeServer* Current, const std::string &reason)
                        LocalSquit = true;
                        if (Current->GetSocket()->Introduced())
                        {
-                               parameterlist params;
+                               CmdBuilder params("SQUIT");
                                params.push_back(Current->GetID());
-                               params.push_back(":"+reason);
-                               Utils->DoOneToMany(Utils->TreeRoot->GetID(), "SQUIT", params);
+                               params.push_last(reason);
+                               params.Broadcast();
                        }
                }
                else
@@ -207,7 +207,7 @@ void TreeSocket::Squit(TreeServer* Current, const std::string &reason)
        }
 }
 
-CmdResult CommandSQuit::Handle(User* user, std::vector<std::string>& params)
+CmdResult CommandSQuit::HandleServer(TreeServer* server, std::vector<std::string>& params)
 {
        TreeServer* quitting = Utils->FindServer(params[0]);
        if (!quitting)
@@ -216,9 +216,15 @@ CmdResult CommandSQuit::Handle(User* user, std::vector<std::string>& params)
                return CMD_FAILURE;
        }
 
-       TreeSocket* sock = Utils->FindServer(user->server)->GetSocket();
+       TreeSocket* sock = server->GetSocket();
        sock->Squit(quitting, params[1]);
-       return CMD_SUCCESS;
+
+       // XXX: Return CMD_FAILURE when servers SQUIT themselves (i.e. :00S SQUIT 00S :Shutting down)
+       // to avoid RouteCommand() being called. RouteCommand() requires a valid command source but we
+       // do not have one because the server user is deleted when its TreeServer is destructed.
+       // We generate a SQUIT in TreeSocket::Squit(), with our sid as the source and send it to the
+       // remaining servers.
+       return ((quitting == server) ? CMD_FAILURE : CMD_SUCCESS);
 }
 
 /** This function is called when we receive data from a remote