commit f494023b0d99be0e4b07701b983b71ecf4920465 from: Alexander Barton date: Tue Jul 30 19:18:42 2013 UTC Update irc-login.c to use irc-macros.h This includes code cleanups, too :-) commit - 659d1264607e780708ace76181b0dc556b54e39a commit + f494023b0d99be0e4b07701b983b71ecf4920465 blob - 6969fa338c22018643c5b08aa976bb0b2257fb7c blob + 27e11c4032c96eeabc8adcf2461e1acc48dec639 --- src/ngircd/irc-login.c +++ src/ngircd/irc-login.c @@ -33,6 +33,7 @@ #include "parse.h" #include "irc.h" #include "irc-info.h" +#include "irc-macros.h" #include "irc-write.h" #include "exp.h" @@ -42,15 +43,12 @@ static void Kill_Nick PARAMS((char *Nick, char *Reason static void Change_Nick PARAMS((CLIENT * Origin, CLIENT * Target, char *NewNick, bool InformClient)); - /** * Handler for the IRC "PASS" command. * - * See RFC 2813 section 4.1.1, and RFC 2812 section 3.1.1. - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @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 IRC_PASS( CLIENT *Client, REQUEST *Req ) @@ -167,19 +165,12 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) return CONNECTED; } /* IRC_PASS */ - /** * Handler for the IRC "NICK" command. * - * See RFC 2812, 3.1.2 "Nick message", and RFC 2813, 4.1.3 "Nick". - * - * This function implements the IRC command "NICK" which is used to register - * with the server, to change already registered nicknames and to introduce - * new users which are connected to other servers. - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @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 IRC_NICK( CLIENT *Client, REQUEST *Req ) @@ -204,25 +195,17 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) || (Client_Type(Client) == CLIENT_SERVER && Req->argc == 1)) { /* User registration or change of nickname */ + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 1) - /* Wrong number of arguments? */ - if( Req->argc != 1 ) - return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID( Client ), - Req->command ); - /* Search "target" client */ - if( Client_Type( Client ) == CLIENT_SERVER ) - { - target = Client_Search( Req->prefix ); - if( ! target ) + if (Client_Type(Client) == CLIENT_SERVER) { + target = Client_Search(Req->prefix); + if (!target) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] ); - } - else - { + } else { /* Is this a restricted client? */ if( Client_HasMode( Client, 'r' )) return IRC_WriteStrClient( Client, @@ -237,15 +220,14 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) * do anything. This is how the original ircd behaves and some * clients (for example Snak) expect it to be like this. * But I doubt that this is "really the right thing" ... */ - if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) + if (strcmp(Client_ID(target), Req->argv[0]) == 0) return CONNECTED; #endif /* Check that the new nickname is available. Special case: * the client only changes from/to upper to lower case. */ - if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 ) - { - if( ! Client_CheckNick( target, Req->argv[0] )) + if (strcasecmp(Client_ID(target), Req->argv[0]) != 0) { + if (!Client_CheckNick(target, Req->argv[0])) return CONNECTED; } @@ -326,8 +308,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) /* Find the Server this client is connected to */ intr_c = Client_GetFromToken(Client, token); - if( ! intr_c ) - { + if (!intr_c) { Log( LOG_ERR, "Server %s introduces nick \"%s\" on unknown server!?", Client_ID( Client ), Req->argv[0] ); Kill_Nick( Req->argv[0], "Unknown server" ); return CONNECTED; @@ -335,11 +316,13 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) c = Client_NewRemoteUser(intr_c, nick, hops, user, hostname, token, modes, info, true); - if( ! c ) - { - /* out of memory, need to disconnect client to keep network state consistent */ - Log( LOG_ALERT, "Can't create client structure! (on connection %d)", Client_Conn( Client )); - Kill_Nick( Req->argv[0], "Server error" ); + if (!c) { + /* Out of memory, we need to disconnect client to keep + * network state consistent! */ + Log(LOG_ALERT, + "Can't create client structure! (on connection %d)", + Client_Conn(Client)); + Kill_Nick(Req->argv[0], "Server error"); return CONNECTED; } @@ -356,10 +339,11 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) return CONNECTED; } - else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client )); + else + return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG, + Client_ID(Client)); } /* IRC_NICK */ - /** * Handler for the IRC "SVSNICK" command. * @@ -375,9 +359,7 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); - if (Req->argc != 2) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2) /* Search the originator */ from = Client_Search(Req->prefix); @@ -411,11 +393,9 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req) /** * Handler for the IRC "USER" command. * - * See RFC 2812, 3.1.3 "User message". - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @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 IRC_USER(CLIENT * Client, REQUEST * Req) @@ -433,11 +413,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req) Client_Type(Client) == CLIENT_GOTPASS) { /* New connection */ - if (Req->argc != 4) - return IRC_WriteStrClient(Client, - ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), - Req->command); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4) /* User name: only alphanumeric characters and limited punctuation is allowed.*/ @@ -487,11 +463,8 @@ IRC_USER(CLIENT * Client, REQUEST * Req) } else if (Client_Type(Client) == CLIENT_SERVER || Client_Type(Client) == CLIENT_SERVICE) { /* Server/service updating an user */ - if (Req->argc != 4) - return IRC_WriteStrClient(Client, - ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), - Req->command); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4) + c = Client_Search(Req->prefix); if (!c) return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, @@ -523,20 +496,16 @@ IRC_USER(CLIENT * Client, REQUEST * Req) } } /* IRC_USER */ - /** * Handler for the IRC "SERVICE" command. * - * This function implements IRC Services registration using the SERVICE command - * defined in RFC 2812 3.1.6 and RFC 2813 4.1.4. - * * At the moment ngIRCd doesn't support directly linked services, so this * function returns ERR_ERRONEUSNICKNAME when the SERVICE command has not been * received from a peer server. * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED.. + * @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 IRC_SERVICE(CLIENT *Client, REQUEST *Req) @@ -553,19 +522,12 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req) return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG, Client_ID(Client)); - if (Req->argc != 6) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 6) if (Client_Type(Client) != CLIENT_SERVER) return IRC_WriteStrClient(Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID(Client), Req->argv[0]); - /* Bad number of parameters? */ - if (Req->argc != 6) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); - nick = Req->argv[0]; user = NULL; host = NULL; token = atoi(Req->argv[1]); @@ -627,24 +589,17 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req) return CONNECTED; } /* IRC_SERVICE */ - /** * Handler for the IRC "WEBIRC" command. * - * See doc/Protocol.txt, section II.4: - * "Update webchat/proxy client information". - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @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 IRC_WEBIRC(CLIENT *Client, REQUEST *Req) { - /* Exactly 4 parameters are requited */ - if (Req->argc != 4) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4) if (!Conf_WebircPwd[0] || strcmp(Req->argv[0], Conf_WebircPwd) != 0) return IRC_WriteStrClient(Client, ERR_PASSWDMISMATCH_MSG, @@ -659,15 +614,12 @@ IRC_WEBIRC(CLIENT *Client, REQUEST *Req) return CONNECTED; } /* IRC_WEBIRC */ - /** * Handler for the IRC "QUIT" command. * - * See RFC 2812, 3.1.7 "Quit", and RFC 2813, 4.1.5 "Quit". - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @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 IRC_QUIT( CLIENT *Client, REQUEST *Req ) @@ -678,10 +630,7 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) 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); + _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) if (Req->argc == 1) strlcpy(quitmsg, Req->argv[0], sizeof quitmsg); @@ -721,7 +670,6 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) } } /* IRC_QUIT */ - #ifndef STRICT_RFC /** @@ -730,9 +678,9 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) * We handle these commands here to avoid the quite long timeout when * some user tries to access this IRC daemon using an web browser ... * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @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 IRC_QUIT_HTTP( CLIENT *Client, REQUEST *Req ) @@ -744,15 +692,12 @@ IRC_QUIT_HTTP( CLIENT *Client, REQUEST *Req ) #endif - /** * Handler for the IRC "PING" command. * - * See RFC 2812, 3.7.2 "Ping message". - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @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 IRC_PING(CLIENT *Client, REQUEST *Req) @@ -767,9 +712,7 @@ IRC_PING(CLIENT *Client, REQUEST *Req) Client_ID(Client)); #ifdef STRICT_RFC /* Don't ignore additional arguments when in "strict" mode */ - if (Req->argc > 2) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) #endif if (Req->argc > 1) { @@ -822,15 +765,12 @@ IRC_PING(CLIENT *Client, REQUEST *Req) #endif } /* IRC_PING */ - /** * Handler for the IRC "PONG" command. - * - * See RFC 2812, 3.7.3 "Pong message". * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @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 IRC_PONG(CLIENT *Client, REQUEST *Req) @@ -853,14 +793,8 @@ IRC_PONG(CLIENT *Client, REQUEST *Req) else return CONNECTED; } - if (Req->argc > 2) { - if (Client_Type(Client) == CLIENT_USER) - return IRC_WriteStrClient(Client, - ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), - Req->command); - else - return CONNECTED; + if (Client_Type(Client) == CLIENT_USER) { + _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) } /* Forward? */ @@ -925,12 +859,11 @@ IRC_PONG(CLIENT *Client, REQUEST *Req) return CONNECTED; } /* IRC_PONG */ - /** * Kill all users with a specific nickname in the network. * - * @param Nick Nickname. - * @param Reason Reason for the KILL. + * @param Nick Nickname. + * @param Reason Reason for the KILL. */ static void Kill_Nick(char *Nick, char *Reason) @@ -951,7 +884,6 @@ Kill_Nick(char *Nick, char *Reason) IRC_KILL(Client_ThisServer(), &r); } /* Kill_Nick */ - /** * Change the nickname of a client. * @@ -991,5 +923,4 @@ Change_Nick(CLIENT *Origin, CLIENT *Target, char *NewN Client_SetID(Target, NewNick); } - /* -eof- */