1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-01-19 03:52:52 +00:00

Slightly change (and document!) IRC_KILL() calling convention

This commit is contained in:
Alexander Barton 2011-07-30 19:47:59 +02:00
parent 6cbe13085d
commit 456e55921d
2 changed files with 54 additions and 52 deletions

View File

@ -1103,12 +1103,14 @@ Kill_Nick( char *Nick, char *Reason )
assert (Nick != NULL); assert (Nick != NULL);
assert (Reason != NULL); assert (Reason != NULL);
r.prefix = (char *)Client_ThisServer( ); r.prefix = NULL;
r.argv[0] = Nick; r.argv[0] = Nick;
r.argv[1] = Reason; r.argv[1] = Reason;
r.argc = 2; r.argc = 2;
Log( LOG_ERR, "User(s) with nick \"%s\" will be disconnected: %s", Nick, Reason ); Log(LOG_ERR, "User(s) with nick \"%s\" will be disconnected: %s",
Nick, Reason);
IRC_KILL(Client_ThisServer(), &r); IRC_KILL(Client_ThisServer(), &r);
} /* Kill_Nick */ } /* Kill_Nick */

View File

@ -63,13 +63,21 @@ IRC_ERROR( CLIENT *Client, REQUEST *Req )
/** /**
* Kill client on request. * Handler for the IRC "KILL" command.
*
* This function implements the IRC command "KILL" wich is used to selectively * This function implements the IRC command "KILL" wich is used to selectively
* disconnect clients. It can be used by IRC operators and servers, for example * disconnect clients. It can be used by IRC operators and servers, for example
* to "solve" nick collisions after netsplits. * to "solve" nick collisions after netsplits. See RFC 2812 section 3.7.1.
*
* Please note that this function is also called internally, without a real * Please note that this function is also called internally, without a real
* KILL command being received over the network! Client is Client_ThisServer() * KILL command being received over the network! Client is Client_ThisServer()
* in this case. */ * in this case, and the prefix in Req is NULL.
*
* @param Client The client from which this command has been received
* or Client_ThisServer() when generated interanlly.
* @param Req Request structure with prefix and all parameters.
* @returns CONNECTED or DISCONNECTED.
*/
GLOBAL bool GLOBAL bool
IRC_KILL( CLIENT *Client, REQUEST *Req ) IRC_KILL( CLIENT *Client, REQUEST *Req )
{ {
@ -80,46 +88,38 @@ IRC_KILL( CLIENT *Client, REQUEST *Req )
assert (Client != NULL); assert (Client != NULL);
assert (Req != NULL); assert (Req != NULL);
if(( Client_Type( Client ) != CLIENT_SERVER ) && if (Client_Type(Client) != CLIENT_SERVER && !Client_OperByMe(Client))
( ! Client_OperByMe( Client )))
{
/* The originator of the KILL is neither an IRC operator of
* this server nor a server. */
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG, return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
Client_ID(Client)); Client_ID(Client));
}
if (Req->argc != 2) if (Req->argc != 2)
{
/* This command requires exactly 2 parameters! */
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command); Client_ID(Client), Req->command);
}
if( Req->prefix ) prefix = Client_Search( Req->prefix ); /* Get prefix (origin); use the client if no prefix is given. */
else prefix = Client; if (Req->prefix)
if( ! prefix ) prefix = Client_Search(Req->prefix);
{ else
prefix = Client;
/* Log a warning message and use this server as origin when the
* prefix (origin) is invalid. */
if (!prefix) {
Log(LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!", Log(LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!",
Req->prefix ); Req->prefix );
prefix = Client_ThisServer(); prefix = Client_ThisServer();
} }
if (Client != Client_ThisServer()) if (Client != Client_ThisServer())
{ Log(LOG_NOTICE|LOG_snotice,
/* This is a "real" KILL received from the network. */ "Got KILL command from \"%s\" for \"%s\": %s",
Log( LOG_NOTICE|LOG_snotice, "Got KILL command from \"%s\" for \"%s\": %s",
Client_Mask(prefix), Req->argv[0], Req->argv[1]); Client_Mask(prefix), Req->argv[0], Req->argv[1]);
}
/* Build reason string */ /* Build reason string: Prefix the "reason" if the originator is a
* regular user, so users can't spoof KILLs of servers. */
if (Client_Type(Client) == CLIENT_USER) if (Client_Type(Client) == CLIENT_USER)
{
/* Prefix the "reason" if the originator is a regular user,
* so users can't spoof KILLs of servers. */
snprintf(reason, sizeof(reason), "KILLed by %s: %s", snprintf(reason, sizeof(reason), "KILLed by %s: %s",
Client_ID(Client), Req->argv[1]); Client_ID(Client), Req->argv[1]);
}
else else
strlcpy(reason, Req->argv[1], sizeof(reason)); strlcpy(reason, Req->argv[1], sizeof(reason));