1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-11-05 00:12:59 +00:00

irc-oper.c: code cleanup; more documentation

This commit is contained in:
Alexander Barton
2011-12-25 16:08:00 +01:00
parent fc82efc3e8
commit 3ca8703309

View File

@@ -1,6 +1,6 @@
/* /*
* ngIRCd -- The Next Generation IRC Daemon * ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de) * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -37,7 +37,6 @@
#include <exp.h> #include <exp.h>
#include "irc-oper.h" #include "irc-oper.h"
/** /**
* Handle invalid received OPER command. * Handle invalid received OPER command.
* Log OPER attempt and send error message to client. * Log OPER attempt and send error message to client.
@@ -52,7 +51,15 @@ Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
Client_ID(Client)); Client_ID(Client));
} /* Bad_OperPass */ } /* Bad_OperPass */
/**
* Handler for the IRC "OPER" command.
*
* See RFC 2812, 3.1.4 "Oper message".
*
* @param Client The client from which this command has been received.
* @param Req Request structure with prefix and all parameters.
* @return CONNECTED or DISCONNECTED.
*/
GLOBAL bool GLOBAL bool
IRC_OPER( CLIENT *Client, REQUEST *Req ) IRC_OPER( CLIENT *Client, REQUEST *Req )
{ {
@@ -62,7 +69,9 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
assert( Client != NULL ); assert( Client != NULL );
assert( Req != NULL ); assert( Req != NULL );
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); if (Req->argc != 2)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
len = array_length(&Conf_Opers, sizeof(*op)); len = array_length(&Conf_Opers, sizeof(*op));
op = array_start(&Conf_Opers); op = array_start(&Conf_Opers);
@@ -77,20 +86,33 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
if (op[i].mask && (!Match(op[i].mask, Client_Mask(Client)))) if (op[i].mask && (!Match(op[i].mask, Client_Mask(Client))))
return Bad_OperPass(Client, op[i].mask, "hostmask check failed"); return Bad_OperPass(Client, op[i].mask, "hostmask check failed");
if( ! Client_HasMode( Client, 'o' )) if (!Client_HasMode(Client, 'o')) {
{ Client_ModeAdd(Client, 'o');
Client_ModeAdd( Client, 'o' ); if (!IRC_WriteStrClient(Client, "MODE %s :+o",
if( ! IRC_WriteStrClient( Client, "MODE %s :+o", Client_ID( Client ))) return DISCONNECTED; Client_ID(Client)))
IRC_WriteStrServersPrefix( NULL, Client, "MODE %s :+o", Client_ID( Client )); return DISCONNECTED;
IRC_WriteStrServersPrefix(NULL, Client, "MODE %s :+o",
Client_ID(Client));
} }
if( ! Client_OperByMe( Client )) Log( LOG_NOTICE|LOG_snotice, "Got valid OPER from \"%s\", user is an IRC operator now.", Client_Mask( Client )); if (!Client_OperByMe(Client))
Log(LOG_NOTICE|LOG_snotice,
"Got valid OPER from \"%s\", user is an IRC operator now.",
Client_Mask(Client));
Client_SetOperByMe( Client, true); Client_SetOperByMe(Client, true);
return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client )); return IRC_WriteStrClient(Client, RPL_YOUREOPER_MSG, Client_ID(Client));
} /* IRC_OPER */ } /* IRC_OPER */
/**
* Handler for the IRC "DIE" command.
*
* See RFC 2812, 4.3 "Die message".
*
* @param Client The client from which this command has been received.
* @param Req Request structure with prefix and all parameters.
* @return CONNECTED or DISCONNECTED.
*/
GLOBAL bool GLOBAL bool
IRC_DIE(CLIENT * Client, REQUEST * Req) IRC_DIE(CLIENT * Client, REQUEST * Req)
{ {
@@ -133,7 +155,15 @@ IRC_DIE(CLIENT * Client, REQUEST * Req)
return CONNECTED; return CONNECTED;
} /* IRC_DIE */ } /* IRC_DIE */
/**
* Handler for the IRC "REHASH" command.
*
* See RFC 2812, 4.2 "Rehash message".
*
* @param Client The client from which this command has been received.
* @param Req Request structure with prefix and all parameters.
* @return CONNECTED or DISCONNECTED.
*/
GLOBAL bool GLOBAL bool
IRC_REHASH( CLIENT *Client, REQUEST *Req ) IRC_REHASH( CLIENT *Client, REQUEST *Req )
{ {
@@ -146,15 +176,26 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req )
return Op_NoPrivileges(Client, Req); return Op_NoPrivileges(Client, Req);
/* Bad number of parameters? */ /* Bad number of parameters? */
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); if (Req->argc != 0)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command );
Log( LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...", Client_Mask( Client )); Log(LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...",
Client_Mask(Client));
raise(SIGHUP); raise(SIGHUP);
return CONNECTED; return CONNECTED;
} /* IRC_REHASH */ } /* IRC_REHASH */
/**
* Handler for the IRC "RESTART" command.
*
* See RFC 2812, 4.4 "Restart message".
*
* @param Client The client from which this command has been received.
* @param Req Request structure with prefix and all parameters.
* @return CONNECTED or DISCONNECTED.
*/
GLOBAL bool GLOBAL bool
IRC_RESTART( CLIENT *Client, REQUEST *Req ) IRC_RESTART( CLIENT *Client, REQUEST *Req )
{ {
@@ -167,16 +208,25 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
return Op_NoPrivileges(Client, Req); return Op_NoPrivileges(Client, Req);
/* Bad number of parameters? */ /* Bad number of parameters? */
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); if (Req->argc != 0)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...", Client_Mask( Client )); Log(LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...",
Client_Mask(Client));
NGIRCd_SignalRestart = true; NGIRCd_SignalRestart = true;
return CONNECTED; return CONNECTED;
} /* IRC_RESTART */ } /* IRC_RESTART */
/** /**
* Connect configured or new server. * Handler for the IRC "CONNECT" command.
*
* See RFC 2812, 3.4.7 "Connect message".
*
* @param Client The client from which this command has been received.
* @param Req Request structure with prefix and all parameters.
* @return CONNECTED or DISCONNECTED.
*/ */
GLOBAL bool GLOBAL bool
IRC_CONNECT(CLIENT * Client, REQUEST * Req) IRC_CONNECT(CLIENT * Client, REQUEST * Req)
@@ -272,9 +322,15 @@ IRC_CONNECT(CLIENT * Client, REQUEST * Req)
return CONNECTED; return CONNECTED;
} /* IRC_CONNECT */ } /* IRC_CONNECT */
/** /**
* Disconnect (and disable) configured server. * Handler for the IRC "DISCONNECT" command.
*
* This command is not specified in the IRC RFCs, it is an extension
* of ngIRCd: it shuts down and disables a configured server connection.
*
* @param Client The client from which this command has been received.
* @param Req Request structure with prefix and all parameters.
* @return CONNECTED or DISCONNECTED.
*/ */
GLOBAL bool GLOBAL bool
IRC_DISCONNECT(CLIENT * Client, REQUEST * Req) IRC_DISCONNECT(CLIENT * Client, REQUEST * Req)
@@ -315,7 +371,15 @@ IRC_DISCONNECT(CLIENT * Client, REQUEST * Req)
return DISCONNECTED; return DISCONNECTED;
} /* IRC_DISCONNECT */ } /* IRC_DISCONNECT */
/**
* Handler for the IRC "WALLOPS" command.
*
* See RFC 2812, 4.7 "Operwall message".
*
* @param Client The client from which this command has been received.
* @param Req Request structure with prefix and all parameters.
* @return CONNECTED or DISCONNECTED.
*/
GLOBAL bool GLOBAL bool
IRC_WALLOPS( CLIENT *Client, REQUEST *Req ) IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
{ {
@@ -325,12 +389,14 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
assert( Req != NULL ); assert( Req != NULL );
if (Req->argc != 1) if (Req->argc != 1)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
switch (Client_Type(Client)) { switch (Client_Type(Client)) {
case CLIENT_USER: case CLIENT_USER:
if (!Client_OperByMe(Client)) if (!Client_OperByMe(Client))
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG, Client_ID(Client)); return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
Client_ID(Client));
from = Client; from = Client;
break; break;
case CLIENT_SERVER: case CLIENT_SERVER:
@@ -341,7 +407,8 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
} }
if (!from) if (!from)
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix); return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
Client_ID(Client), Req->prefix);
IRC_SendWallops(Client, from, "%s", Req->argv[0]); IRC_SendWallops(Client, from, "%s", Req->argv[0]);
return CONNECTED; return CONNECTED;