X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc-mode.c;h=cde573bf83faa98db98e9702bdd234f5fbe21203;hp=a51369f0086f189fba6f2ebf8a90db65a0f1ef26;hb=81b81c818cb60abe8bcfb1cd22769ae831b942e7;hpb=69ce65bacb0155be5fb9159a3dfc5c8e3390cc0d diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c index a51369f0..cde573bf 100644 --- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -16,13 +16,11 @@ * IRC commands for mode changes (like MODE, AWAY, etc.) */ -#include "imp.h" #include #include #include #include -#include "defines.h" #include "conn.h" #include "channel.h" #include "irc-macros.h" @@ -33,7 +31,6 @@ #include "messages.h" #include "conf.h" -#include "exp.h" #include "irc-mode.h" static bool Client_Mode PARAMS((CLIENT *Client, REQUEST *Req, CLIENT *Origin, @@ -54,7 +51,7 @@ static bool Send_ListChange PARAMS((const bool IsAdd, const char ModeChar, * Handler for the IRC "MODE" command. * * This function detects whether user or channel modes should be modified - * and calls the apropriate sub-functions. + * and calls the appropriate sub-functions. * * @param Client The client from which this command has been received. * @param Req Request structure with prefix and all parameters. @@ -69,9 +66,15 @@ 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) + /* Test for "fake" MODE commands injected by this local instance, + * for example when handling the "DefaultUserModes" settings. + * This doesn't harm real commands, because prefixes of regular + * clients are checked in Validate_Prefix() and can't be faked. */ + if (Req->prefix && Client_Search(Req->prefix) == Client_ThisServer()) + Client = Client_Search(Req->prefix); + /* Channel or user mode? */ cl = NULL; chan = NULL; if (Client_IsValidNick(Req->argv[0])) @@ -85,7 +88,7 @@ IRC_MODE( CLIENT *Client, REQUEST *Req ) return Channel_Mode(Client, Req, origin, chan); /* No target found! */ - return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, + return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->argv[0]); } /* IRC_MODE */ @@ -131,7 +134,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) if (Client_Type(Client) == CLIENT_USER) { /* Users are only allowed to manipulate their own modes! */ if (Target != Client) - return IRC_WriteStrClient(Client, + return IRC_WriteErrClient(Client, ERR_USERSDONTMATCH_MSG, Client_ID(Client)); } @@ -153,7 +156,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) set = false; strcpy(the_modes, "-"); } else - return IRC_WriteStrClient(Origin, ERR_UMODEUNKNOWNFLAG_MSG, + return IRC_WriteErrClient(Origin, ERR_UMODEUNKNOWNFLAG_MSG, Client_ID(Origin)); x[1] = '\0'; @@ -212,43 +215,35 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) x[0] = 'a'; Client_SetAway(Origin, DEFAULT_AWAY_MSG); } else - ok = IRC_WriteStrClient(Origin, + ok = IRC_WriteErrClient(Origin, ERR_NOPRIVILEGES_MSG, Client_ID(Origin)); break; case 'B': /* Bot */ if (Client_HasMode(Client, 'r')) - ok = IRC_WriteStrClient(Origin, + ok = IRC_WriteErrClient(Origin, ERR_RESTRICTED_MSG, Client_ID(Origin)); else x[0] = 'B'; break; - case 'c': /* Receive connect notices - * (only settable by IRC operators!) */ + case 'c': /* Receive connect notices */ + case 'q': /* KICK-protected user */ + case 'F': /* disable flood protection */ + /* (only settable by IRC operators!) */ if (!set || Client_Type(Client) == CLIENT_SERVER - || Client_OperByMe(Origin)) - x[0] = 'c'; + || Client_HasMode(Origin, 'o')) + x[0] = *mode_ptr; else - ok = IRC_WriteStrClient(Origin, + ok = IRC_WriteErrClient(Origin, ERR_NOPRIVILEGES_MSG, Client_ID(Origin)); break; case 'o': /* IRC operator (only unsettable!) */ if (!set || Client_Type(Client) == CLIENT_SERVER) { - Client_SetOperByMe(Target, false); x[0] = 'o'; } else - ok = IRC_WriteStrClient(Origin, - ERR_NOPRIVILEGES_MSG, - Client_ID(Origin)); - break; - case 'q': /* KICK-protected user */ - if (!set || Client_Type(Client) == CLIENT_SERVER - || Client_OperByMe(Origin)) - x[0] = 'q'; - else - ok = IRC_WriteStrClient(Origin, + ok = IRC_WriteErrClient(Origin, ERR_NOPRIVILEGES_MSG, Client_ID(Origin)); break; @@ -256,7 +251,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) if (set || Client_Type(Client) == CLIENT_SERVER) x[0] = 'r'; else - ok = IRC_WriteStrClient(Origin, + ok = IRC_WriteErrClient(Origin, ERR_RESTRICTED_MSG, Client_ID(Origin)); break; @@ -264,22 +259,22 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) if (Client_Type(Client) == CLIENT_SERVER) x[0] = 'R'; else - ok = IRC_WriteStrClient(Origin, + ok = IRC_WriteErrClient(Origin, ERR_NICKREGISTER_MSG, Client_ID(Origin)); break; case 'x': /* Cloak hostname */ if (Client_HasMode(Client, 'r')) - ok = IRC_WriteStrClient(Origin, + ok = IRC_WriteErrClient(Origin, ERR_RESTRICTED_MSG, Client_ID(Origin)); else if (!set || Conf_CloakHostModeX[0] || Client_Type(Client) == CLIENT_SERVER - || Client_OperByMe(Client)) { + || Client_HasMode(Origin, 'o')) { x[0] = 'x'; send_RPL_HOSTHIDDEN_MSG = true; } else - ok = IRC_WriteStrClient(Origin, + ok = IRC_WriteErrClient(Origin, ERR_NOPRIVILEGES_MSG, Client_ID(Origin)); break; @@ -289,7 +284,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) "Unknown mode \"%c%c\" from \"%s\"!?", set ? '+' : '-', *mode_ptr, Client_ID(Origin)); - ok = IRC_WriteStrClient(Origin, + ok = IRC_WriteErrClient(Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID(Origin), set ? '+' : '-', @@ -354,7 +349,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) } if (send_RPL_HOSTHIDDEN_MSG && Client_Conn(Target) > NONE) { - /* A new (cloaked) hostname must be annoucned */ + /* A new (cloaked) hostname must be announced */ IRC_WriteStrClientPrefix(Target, Origin, RPL_HOSTHIDDEN_MSG, Client_ID(Target), @@ -367,7 +362,6 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) Client_Modes(Target)); } - IRC_SetPenalty(Client, 1); return ok; } /* Client_Mode */ @@ -384,37 +378,44 @@ Channel_Mode_Answer_Request(CLIENT *Origin, CHANNEL *Channel) char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], argadd[CLIENT_PASS_LEN]; const char *mode_ptr; - /* Member or not? -- That's the question! */ - if (!Channel_IsMemberOf(Channel, Origin)) - return IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG, - Client_ID(Origin), Channel_Name(Channel), Channel_Modes(Channel)); - - /* The sender is a member: generate extended reply */ - strlcpy(the_modes, Channel_Modes(Channel), sizeof(the_modes)); - mode_ptr = the_modes; - the_args[0] = '\0'; - - while(*mode_ptr) { - switch(*mode_ptr) { - case 'l': - snprintf(argadd, sizeof(argadd), " %lu", Channel_MaxUsers(Channel)); - strlcat(the_args, argadd, sizeof(the_args)); - break; - case 'k': - strlcat(the_args, " ", sizeof(the_args)); - strlcat(the_args, Channel_Key(Channel), sizeof(the_args)); - break; + if (!Channel_IsMemberOf(Channel, Origin)) { + /* Not a member: "simple" mode reply */ + if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG, + Client_ID(Origin), Channel_Name(Channel), + Channel_Modes(Channel))) + return DISCONNECTED; + } else { + /* The sender is a member: generate extended reply */ + strlcpy(the_modes, Channel_Modes(Channel), sizeof(the_modes)); + mode_ptr = the_modes; + the_args[0] = '\0'; + + while(*mode_ptr) { + switch(*mode_ptr) { + case 'l': + snprintf(argadd, sizeof(argadd), " %lu", + Channel_MaxUsers(Channel)); + strlcat(the_args, argadd, sizeof(the_args)); + break; + case 'k': + strlcat(the_args, " ", sizeof(the_args)); + strlcat(the_args, Channel_Key(Channel), + sizeof(the_args)); + break; + } + mode_ptr++; } - mode_ptr++; + if (the_args[0]) + strlcat(the_modes, the_args, sizeof(the_modes)); + + if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG, + Client_ID(Origin), Channel_Name(Channel), + the_modes)) + return DISCONNECTED; } - if (the_args[0]) - strlcat(the_modes, the_args, sizeof(the_modes)); - if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG, - Client_ID(Origin), Channel_Name(Channel), - the_modes)) - return DISCONNECTED; #ifndef STRICT_RFC + /* Channel creation time */ if (!IRC_WriteStrClient(Origin, RPL_CREATIONTIME_MSG, Client_ID(Origin), Channel_Name(Channel), Channel_CreationTime(Channel))) @@ -436,7 +437,7 @@ static bool Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) { char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], - argadd[CLIENT_PASS_LEN], *mode_ptr, *o_mode_ptr; + argadd[CLIENT_PASS_LEN], *mode_ptr; bool connected, set, skiponce, retval, use_servermode, is_halfop, is_op, is_admin, is_owner, is_machine, is_oper; int mode_arg, arg_arg, mode_arg_count = 0; @@ -447,7 +448,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) is_halfop = is_op = is_admin = is_owner = is_machine = is_oper = false; if (Channel_IsModeless(Channel)) - return IRC_WriteStrClient(Client, ERR_NOCHANMODES_MSG, + return IRC_WriteErrClient(Client, ERR_NOCHANMODES_MSG, Client_ID(Client), Channel_Name(Channel)); /* Mode request: let's answer it :-) */ @@ -456,7 +457,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) /* Check if origin is oper and opers can use mode */ use_servermode = Conf_OperServerMode; - if(Client_OperByMe(Client) && Conf_OperCanMode) { + if(Client_HasMode(Client, 'o') && Conf_OperCanMode) { is_oper = true; } @@ -468,7 +469,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) /* Check if client is member of channel or an oper or an server/service */ if(!Channel_IsMemberOf(Channel, Client) && !is_oper && !is_machine) - return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG, + return IRC_WriteErrClient(Origin, ERR_NOTONCHANNEL_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -547,18 +548,14 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) arg_arg = -1; if(!is_machine && !is_oper) { - o_mode_ptr = Channel_UserModes(Channel, Client); - while( *o_mode_ptr ) { - if ( *o_mode_ptr == 'q') - is_owner = true; - if ( *o_mode_ptr == 'a') - is_admin = true; - if ( *o_mode_ptr == 'o') - is_op = true; - if ( *o_mode_ptr == 'h') - is_halfop = true; - o_mode_ptr++; - } + if (Channel_UserHasMode(Channel, Client, 'q')) + is_owner = true; + if (Channel_UserHasMode(Channel, Client, 'a')) + is_admin = true; + if (Channel_UserHasMode(Channel, Client, 'o')) + is_op = true; + if (Channel_UserHasMode(Channel, Client, 'h')) + is_halfop = true; } /* Validate modes */ @@ -572,7 +569,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) case 'z': /* Secure connections only */ if(!is_oper && !is_machine && !is_owner && !is_admin && !is_op) { - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); goto chan_exit; @@ -588,7 +585,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) is_admin || is_op || is_halfop) x[0] = *mode_ptr; else - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); break; @@ -597,10 +594,14 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) goto chan_exit; if (!set) { if (is_oper || is_machine || is_owner || - is_admin || is_op || is_halfop) + is_admin || is_op || is_halfop) { x[0] = *mode_ptr; - else - connected = IRC_WriteStrClient(Origin, + if (Channel_HasMode(Channel, 'k')) + strlcpy(argadd, "*", sizeof(argadd)); + if (arg_arg > mode_arg) + arg_arg++; + } else + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -616,7 +617,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) sizeof(argadd)); x[0] = *mode_ptr; } else { - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -627,7 +628,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) #ifdef STRICT_RFC /* Only send error message in "strict" mode, * this is how ircd2.11 and others behave ... */ - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); #endif @@ -642,7 +643,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) is_admin || is_op || is_halfop) x[0] = *mode_ptr; else - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -660,7 +661,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) x[0] = *mode_ptr; } } else { - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -671,7 +672,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) #ifdef STRICT_RFC /* Only send error message in "strict" mode, * this is how ircd2.11 and others behave ... */ - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); #endif @@ -685,14 +686,14 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) if(is_oper || is_machine) x[0] = 'O'; else - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_NOPRIVILEGES_MSG, Client_ID(Origin)); } else if(is_oper || is_machine || is_owner || is_admin || is_op) x[0] = 'O'; else - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -704,14 +705,14 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) if(is_oper || is_machine) x[0] = 'P'; else - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_NOPRIVILEGES_MSG, Client_ID(Origin)); } else if(is_oper || is_machine || is_owner || is_admin || is_op) x[0] = 'P'; else - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -720,7 +721,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) case 'q': /* Owner */ case 'a': /* Channel admin */ if(!is_oper && !is_machine && !is_owner && !is_admin) { - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPPRIVTOOLOW_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -729,7 +730,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) case 'o': /* Channel operator */ if(!is_oper && !is_machine && !is_owner && !is_admin && !is_op) { - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -738,7 +739,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) case 'h': /* Half Op */ if(!is_oper && !is_machine && !is_owner && !is_admin && !is_op) { - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -752,12 +753,12 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) if (client) x[0] = *mode_ptr; else - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_NOSUCHNICK_MSG, Client_ID(Origin), Req->argv[arg_arg]); } else { - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -772,7 +773,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) * mode, because most other servers don't do * it as well and some clients send "wired" * MODE commands like "MODE #chan -ooo nick". */ - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); #endif @@ -797,7 +798,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) Client, Channel, Req->argv[arg_arg]); } else { - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(Origin), Channel_Name(Channel)); @@ -824,7 +825,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) "Unknown mode \"%c%c\" from \"%s\" on %s!?", set ? '+' : '-', *mode_ptr, Client_ID(Origin), Channel_Name(Channel)); - connected = IRC_WriteStrClient(Origin, + connected = IRC_WriteErrClient(Origin, ERR_UNKNOWNMODE_MSG, Client_ID(Origin), *mode_ptr, Channel_Name(Channel)); @@ -847,12 +848,11 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) /* Validate target client */ if (client && (!Channel_IsMemberOf(Channel, client))) { - if (!IRC_WriteStrClient - (Origin, ERR_USERNOTINCHANNEL_MSG, - Client_ID(Origin), Client_ID(client), - Channel_Name(Channel))) + if (!IRC_WriteErrClient(Origin, ERR_USERNOTINCHANNEL_MSG, + Client_ID(Origin), + Client_ID(client), + Channel_Name(Channel))) break; - continue; } @@ -933,7 +933,6 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) } } - IRC_SetPenalty(Client, 1); return connected; } /* Channel_Mode */ @@ -950,8 +949,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'); @@ -1012,7 +1009,7 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, return CONNECTED; if (Client_Type(Client) == CLIENT_USER && current_count >= MAX_HNDL_CHANNEL_LISTS) - return IRC_WriteStrClient(Client, ERR_LISTFULL_MSG, + return IRC_WriteErrClient(Client, ERR_LISTFULL_MSG, Client_ID(Client), Channel_Name(Channel), mask, MAX_HNDL_CHANNEL_LISTS); @@ -1035,7 +1032,7 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, } /** - * Delete entries from channel invite, ban and exeption lists. + * Delete entries from channel invite, ban and exception lists. * * @param what Can be 'I' for invite, 'b' for ban, and 'e' for exception list. * @param Prefix The originator of the command.