IRC_QUIT(): disconnect directly linked servers sending QUIT

Without this patch, the server becomes removed from the network and
the client structures, but the connection isn't shut down at all ...
This commit is contained in:
Alexander Barton 2011-08-02 00:56:49 +02:00
parent da897a2a14
commit 88f6fc5fd8
1 changed files with 23 additions and 17 deletions

View File

@ -653,32 +653,37 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
CLIENT *target;
char quitmsg[LINE_LEN];
assert( Client != NULL );
assert( Req != NULL );
assert(Client != NULL);
assert(Req != NULL);
/* Wrong number of arguments? */
if( Req->argc > 1 )
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
if (Req->argc > 1)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
if (Req->argc == 1)
strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);
if ( Client_Type( Client ) == CLIENT_SERVER )
{
if (Client_Type(Client) == CLIENT_SERVER) {
/* Server */
target = Client_Search( Req->prefix );
if( ! target )
{
Log( LOG_WARNING, "Got QUIT from %s for unknown client!?", Client_ID( Client ));
target = Client_Search(Req->prefix);
if (!target) {
Log(LOG_WARNING,
"Got QUIT from %s for unknown client!?",
Client_ID(Client));
return CONNECTED;
}
Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
return CONNECTED;
}
else
{
if (target != Client) {
Client_Destroy(target, "Got QUIT command.",
Req->argc == 1 ? quitmsg : NULL, true);
return CONNECTED;
} else {
Conn_Close(Client_Conn(Client), "Got QUIT command.",
Req->argc == 1 ? quitmsg : NULL, true);
return DISCONNECTED;
}
} else {
if (Req->argc == 1 && quitmsg[0] != '\"') {
/* " " to avoid confusion */
strlcpy(quitmsg, "\"", sizeof quitmsg);
@ -687,7 +692,8 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
}
/* User, Service, or not yet registered */
Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
Conn_Close(Client_Conn(Client), "Got QUIT command.",
Req->argc == 1 ? quitmsg : NULL, true);
return DISCONNECTED;
}