Rework check for number of parameters

Move most of the checks that return numeric 461 into Handle_Request().
This commit is contained in:
Federico G. Schwindt 2013-09-05 17:01:49 +01:00
parent 37609d6a4f
commit 08f9d31d60
13 changed files with 73 additions and 134 deletions

View File

@ -250,8 +250,6 @@ IRC_CAP(CLIENT *Client, REQUEST *Req)
assert(Client != NULL);
assert(Req != NULL);
_IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, 1, 2)
LogDebug("Got \"%s %s\" command from \"%s\" ...",
Req->command, Req->argv[0], Client_ID(Client));

View File

@ -309,7 +309,6 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
assert (Client != NULL);
assert (Req != NULL);
_IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, 1, 2)
_IRC_GET_SENDER_OR_RETURN_(target, Req, Client)
/* Is argument "0"? */
@ -440,7 +439,6 @@ IRC_PART(CLIENT * Client, REQUEST * Req)
assert(Client != NULL);
assert(Req != NULL);
_IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, 1, 2)
_IRC_GET_SENDER_OR_RETURN_(target, Req, Client)
/* Loop over all the given channel names */
@ -484,7 +482,6 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
IRC_SetPenalty(Client, 1);
_IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, 1, 2)
_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
chan = Channel_Search(Req->argv[0]);
@ -583,7 +580,6 @@ IRC_LIST( CLIENT *Client, REQUEST *Req )
IRC_SetPenalty(Client, 2);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 2)
_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
if (Req->argc > 0)

View File

@ -48,10 +48,6 @@ IRC_CHARCONV(CLIENT *Client, REQUEST *Req)
assert (Client != NULL);
assert (Req != NULL);
if (Req->argc != 1)
return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
strlcpy(encoding, Req->argv[0], sizeof(encoding));
ngt_UpperStr(encoding);

View File

@ -501,7 +501,6 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req )
IRC_SetPenalty(Client, 1);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
_IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client)
_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix)
@ -546,7 +545,6 @@ IRC_INFO(CLIENT * Client, REQUEST * Req)
IRC_SetPenalty(Client, 2);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
_IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client)
_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix)
@ -596,8 +594,6 @@ IRC_ISON( CLIENT *Client, REQUEST *Req )
assert(Client != NULL);
assert(Req != NULL);
_IRC_ARGC_GE_OR_RETURN_(Client, Req, 1)
strlcpy(rpl, RPL_ISON_MSG, sizeof rpl);
for (i = 0; i < Req->argc; i++) {
/* "All" ircd even parse ":<x> <y> ..." arguments and split
@ -636,7 +632,6 @@ IRC_LINKS(CLIENT *Client, REQUEST *Req)
IRC_SetPenalty(Client, 1);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 2)
_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
/* Get pointer to server mask or "*", if none given */
@ -691,7 +686,6 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req )
IRC_SetPenalty(Client, 1);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 2)
_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from)
@ -723,8 +717,6 @@ IRC_SERVLIST(CLIENT *Client, REQUEST *Req)
IRC_SetPenalty(Client, 1);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 2)
if (Req->argc < 2 || strcmp(Req->argv[1], "0") == 0) {
for (c = Client_First(); c!= NULL; c = Client_Next(c)) {
if (Client_Type(c) != CLIENT_SERVICE)
@ -762,7 +754,6 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req )
IRC_SetPenalty(Client, 3);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from)
@ -795,7 +786,6 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
IRC_SetPenalty(Client, 1);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 2)
_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from)
@ -881,7 +871,6 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
IRC_SetPenalty(Client, 2);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 2)
_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 1, from)
@ -1020,7 +1009,6 @@ IRC_TIME( CLIENT *Client, REQUEST *Req )
IRC_SetPenalty(Client, 1);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from)
@ -1056,8 +1044,6 @@ IRC_USERHOST(CLIENT *Client, REQUEST *Req)
IRC_SetPenalty(Client, 1);
_IRC_ARGC_GE_OR_RETURN_(Client, Req, 1)
if (Req->argc > 5)
max = 5;
else
@ -1120,7 +1106,6 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req )
IRC_SetPenalty(Client, 1);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
_IRC_GET_SENDER_OR_RETURN_(prefix, Req, Client)
_IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, prefix)
@ -1156,8 +1141,6 @@ IRC_WHO(CLIENT *Client, REQUEST *Req)
IRC_SetPenalty(Client, 1);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 2)
only_ops = false;
if (Req->argc == 2) {
if (strcmp(Req->argv[1], "o") == 0)

View File

@ -358,8 +358,6 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req)
assert(Client != NULL);
assert(Req != NULL);
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2)
/* Search the originator */
from = Client_Search(Req->prefix);
if (!from)
@ -521,8 +519,6 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req)
return IRC_WriteErrClient(Client, ERR_ALREADYREGISTRED_MSG,
Client_ID(Client));
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 6)
if (Client_Type(Client) != CLIENT_SERVER)
return IRC_WriteErrClient(Client, ERR_ERRONEUSNICKNAME_MSG,
Client_ID(Client), Req->argv[0]);
@ -598,8 +594,6 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req)
GLOBAL bool
IRC_WEBIRC(CLIENT *Client, REQUEST *Req)
{
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4)
if (!Conf_WebircPwd[0] || strcmp(Req->argv[0], Conf_WebircPwd) != 0)
return IRC_WriteErrClient(Client, ERR_PASSWDMISMATCH_MSG,
Client_ID(Client));
@ -631,8 +625,6 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
assert(Client != NULL);
assert(Req != NULL);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
if (Req->argc == 1)
strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);

View File

@ -51,10 +51,6 @@ IRC_METADATA(CLIENT *Client, REQUEST *Req)
assert(Client != NULL);
assert(Req != NULL);
if (Req->argc != 3)
return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
prefix = Client_Search(Req->prefix);
if (!prefix)
return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG,

View File

@ -69,7 +69,6 @@ IRC_MODE( CLIENT *Client, REQUEST *Req )
assert(Client != NULL);
assert(Req != NULL);
_IRC_ARGC_GE_OR_RETURN_(Client, Req, 1)
_IRC_GET_SENDER_OR_RETURN_(origin, Req, Client)
/* Channel or user mode? */
@ -945,8 +944,6 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req )
assert (Client != NULL);
assert (Req != NULL);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
if (Req->argc == 1 && Req->argv[0][0]) {
Client_SetAway(Client, Req->argv[0]);
Client_ModeAdd(Client, 'a');

View File

@ -71,7 +71,6 @@ IRC_KICK(CLIENT *Client, REQUEST *Req)
assert( Client != NULL );
assert( Req != NULL );
_IRC_ARGC_BETWEEN_OR_RETURN_(Client, Req, 2, 3)
_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
while (*itemList) {
@ -147,7 +146,6 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req)
assert( Client != NULL );
assert( Req != NULL );
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2)
_IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
/* Search user */

View File

@ -68,8 +68,6 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
assert( Client != NULL );
assert( Req != NULL );
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2)
len = array_length(&Conf_Opers, sizeof(*op));
op = array_start(&Conf_Opers);
for (i = 0; i < len && strcmp(op[i].name, Req->argv[0]); i++)
@ -119,12 +117,6 @@ IRC_DIE(CLIENT * Client, REQUEST * Req)
assert(Client != NULL);
assert(Req != NULL);
#ifdef STRICT_RFC
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 0)
#else
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
#endif
if (!Op_Check(Client, Req))
return Op_NoPrivileges(Client, Req);
@ -162,8 +154,6 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req )
assert( Client != NULL );
assert( Req != NULL );
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 0)
if (!Op_Check(Client, Req))
return Op_NoPrivileges(Client, Req);
@ -191,11 +181,6 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
assert( Client != NULL );
assert( Req != NULL );
/* Bad number of parameters? */
if (Req->argc != 0)
return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
if (!Op_Check(Client, Req))
return Op_NoPrivileges(Client, Req);
@ -325,11 +310,6 @@ IRC_DISCONNECT(CLIENT * Client, REQUEST * Req)
assert(Client != NULL);
assert(Req != NULL);
/* Bad number of parameters? */
if (Req->argc != 1)
return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
if (!Op_Check(Client, Req))
return Op_NoPrivileges(Client, Req);
@ -371,8 +351,6 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
assert( Client != NULL );
assert( Req != NULL );
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 1)
switch (Client_Type(Client)) {
case CLIENT_USER:
if (!Client_OperByMe(Client))

View File

@ -254,8 +254,6 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
assert( Client != NULL );
assert( Req != NULL );
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2)
strlcpy( nick_in, Req->argv[1], sizeof( nick_in ));
strcpy( nick_out, "" );
@ -341,8 +339,6 @@ IRC_SQUIT(CLIENT * Client, REQUEST * Req)
assert(Client != NULL);
assert(Req != NULL);
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2)
if (Client_Type(Client) != CLIENT_SERVER
&& !Client_HasMode(Client, 'o'))
return Op_NoPrivileges(Client, Req);

View File

@ -138,8 +138,6 @@ IRC_KILL(CLIENT *Client, REQUEST *Req)
return IRC_WriteErrClient(Client, ERR_NOPRIVILEGES_MSG,
Client_ID(Client));
_IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2)
/* Get prefix (origin); use the client if no prefix is given. */
if (Req->prefix)
prefix = Client_Search(Req->prefix);
@ -362,8 +360,6 @@ IRC_HELP(CLIENT *Client, REQUEST *Req)
IRC_SetPenalty(Client, 2);
_IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
if ((Req->argc == 0 && array_bytes(&Conf_Helptext) > 0)
|| (Req->argc >= 1 && strcasecmp(Req->argv[0], "Commands") != 0)) {
/* Help text available and requested */

View File

@ -60,74 +60,78 @@ struct _NUMERIC {
static COMMAND My_Commands[] =
{
{ "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "AWAY", IRC_AWAY, CLIENT_USER, 0, 0, 0 },
{ "CAP", IRC_CAP, CLIENT_ANY, 0, 0, 0 },
{ "CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0 },
{ "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 0, 0, 0 },
{ "ERROR", IRC_ERROR, CLIENT_ANY, 0, 0, 0 },
{ "GLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "HELP", IRC_HELP, CLIENT_USER, 0, 0, 0 },
{ "INFO", IRC_INFO, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "ISON", IRC_ISON, CLIENT_USER, 0, 0, 0 },
{ "JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "KLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "METADATA", IRC_METADATA, CLIENT_SERVER, 0, 0, 0 },
{ "MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "NICK", IRC_NICK, CLIENT_ANY, 0, 0, 0 },
{ "NJOIN", IRC_NJOIN, CLIENT_SERVER, 0, 0, 0 },
{ "NOTICE", IRC_NOTICE, CLIENT_ANY, 0, 0, 0 },
{ "OPER", IRC_OPER, CLIENT_USER, 0, 0, 0 },
{ "PART", IRC_PART, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "PASS", IRC_PASS, CLIENT_ANY, 0, 0, 0 },
{ "PING", IRC_PING, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "PONG", IRC_PONG, CLIENT_ANY, 0, 0, 0 },
{ "PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "QUIT", IRC_QUIT, CLIENT_ANY, 0, 0, 0 },
{ "REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0 },
{ "RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0 },
{ "SERVER", IRC_SERVER, CLIENT_ANY, 0, 0, 0 },
{ "SERVICE", IRC_SERVICE, CLIENT_ANY, 0, 0, 0 },
{ "SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 0, 0 },
{ "SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "SVSNICK", IRC_SVSNICK, CLIENT_SERVER, 0, 0, 0 },
{ "SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "TRACE", IRC_TRACE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "USER", IRC_USER, CLIENT_ANY, 0, 0, 0 },
{ "USERHOST", IRC_USERHOST, CLIENT_USER, 0, 0, 0 },
{ "USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "WEBIRC", IRC_WEBIRC, CLIENT_UNKNOWN, 0, 0, 0 },
{ "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 },
{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
{ "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
{ "AWAY", IRC_AWAY, CLIENT_USER, 0, 1, 0, 0, 0 },
{ "CAP", IRC_CAP, CLIENT_ANY, 1, 2, 0, 0, 0 },
{ "CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
#ifdef STRICT_RFC
{ "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0, 0, 0 },
#else
{ "DIE", IRC_DIE, CLIENT_USER, 0, 1, 0, 0, 0 },
#endif
{ "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 1, 1, 0, 0, 0 },
{ "ERROR", IRC_ERROR, CLIENT_ANY, 0, -1, 0, 0, 0 },
{ "GLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
{ "HELP", IRC_HELP, CLIENT_USER, 0, 1, 0, 0, 0 },
{ "INFO", IRC_INFO, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
{ "INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 },
{ "ISON", IRC_ISON, CLIENT_USER, 1, -1, 0, 0, 0 },
{ "JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 },
{ "KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 2, 3, 0, 0, 0 },
{ "KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 },
{ "KLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
{ "LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
{ "LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
{ "LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
{ "METADATA", IRC_METADATA, CLIENT_SERVER, 3, 3, 0, 0, 0 },
{ "MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 1, -1, 0, 0, 0 },
{ "MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
{ "NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
{ "NICK", IRC_NICK, CLIENT_ANY, 0, -1, 0, 0, 0 },
{ "NJOIN", IRC_NJOIN, CLIENT_SERVER, 2, 2, 0, 0, 0 },
{ "NOTICE", IRC_NOTICE, CLIENT_ANY, 0, -1, 0, 0, 0 },
{ "OPER", IRC_OPER, CLIENT_USER, 2, 2, 0, 0, 0 },
{ "PART", IRC_PART, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 },
{ "PASS", IRC_PASS, CLIENT_ANY, 0, -1, 0, 0, 0 },
{ "PING", IRC_PING, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
{ "PONG", IRC_PONG, CLIENT_ANY, 0, -1, 0, 0, 0 },
{ "PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
{ "QUIT", IRC_QUIT, CLIENT_ANY, 0, 1, 0, 0, 0 },
{ "REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0, 0, 0 },
{ "RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0, 0, 0 },
{ "SERVER", IRC_SERVER, CLIENT_ANY, 0, -1, 0, 0, 0 },
{ "SERVICE", IRC_SERVICE, CLIENT_ANY, 6, 6, 0, 0, 0 },
{ "SERVLIST", IRC_SERVLIST, CLIENT_USER, 0, 2, 0, 0, 0 },
{ "SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
{ "SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 2, 2, 0, 0, 0 },
{ "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 2, 0, 0, 0 },
{ "SVSNICK", IRC_SVSNICK, CLIENT_SERVER, 2, 2, 0, 0, 0 },
{ "SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
{ "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 1, 2, 0, 0, 0 },
{ "TRACE", IRC_TRACE, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
{ "USER", IRC_USER, CLIENT_ANY, 0, -1, 0, 0, 0 },
{ "USERHOST", IRC_USERHOST, CLIENT_USER, 1, -1, 0, 0, 0 },
{ "USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
{ "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 1, 0, 0, 0 },
{ "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 1, 1, 0, 0, 0 },
{ "WEBIRC", IRC_WEBIRC, CLIENT_UNKNOWN, 4, 4, 0, 0, 0 },
{ "WHO", IRC_WHO, CLIENT_USER, 0, 2, 0, 0, 0 },
{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, -1, 0, 0, 0 },
#ifdef IRCPLUS
{ "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, 0, 0 },
{ "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, -1, 0, 0, 0 },
# ifdef ICONV
{ "CHARCONV", IRC_CHARCONV, CLIENT_USER, 0, 0, 0 },
{ "CHARCONV", IRC_CHARCONV, CLIENT_USER, 1, 1, 0, 0, 0 },
# endif
#endif
#ifndef STRICT_RFC
{ "GET", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 },
{ "POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 },
{ "GET", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0, 0, 0 },
{ "POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, -1, 0, 0, 0 },
#endif
{ NULL, NULL, 0x0, 0, 0, 0 } /* End-Mark */
{ NULL, NULL, 0x0, 0, 0, 0, 0, 0 } /* End-Mark */
};
static void Init_Request PARAMS(( REQUEST *Req ));
@ -524,6 +528,13 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
Client_ID(client));
}
if (Req->argc < cmd->min_argc ||
(cmd->max_argc != -1 && Req->argc > cmd->max_argc)) {
IRC_SetPenalty(client, 2);
return IRC_WriteStrClient(client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(client), Req->command);
}
/* Command is allowed for this client: call it and count
* generated bytes in output */
Conn_ResetWCounter();

View File

@ -35,6 +35,8 @@ typedef struct _COMMAND
bool (*function) PARAMS(( CLIENT *Client, REQUEST *Request ));
/**< Function to handle this command */
CLIENT_TYPE type; /**< Valid client types (bit mask) */
int min_argc; /**< Min parameters */
int max_argc; /**< Max parameters */
long lcount, rcount; /**< Number of local and remote calls */
long bytes; /**< Number of bytes created */
} COMMAND;