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