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
}
}
-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)
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