X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fparse.c;h=e0df6d8a0bc12bec26be4e13aa4d51a423c36d43;hb=162338b8c8ffe7a0a83dc0e1e5dbc5b81e9cdc42;hp=de6e696056830120a53539b11fa3e2999078b6bb;hpb=8adff5922376676c2eeb49de1cbab86cc345b887;p=ngircd-alex.git diff --git a/src/ngircd/parse.c b/src/ngircd/parse.c index de6e6960..e0df6d8a 100644 --- a/src/ngircd/parse.c +++ b/src/ngircd/parse.c @@ -7,14 +7,17 @@ * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. - * - * IRC command parser and validator */ #include "portab.h" -static char UNUSED id[] = "$Id: parse.c,v 1.61 2005/03/19 18:43:49 fw Exp $"; +static char UNUSED id[] = "$Id: parse.c,v 1.63 2005/06/24 20:56:46 alex Exp $"; + +/** + * @file + * IRC command parser and validator. + */ #include "imp.h" #include @@ -109,6 +112,12 @@ LOCAL bool Validate_Args PARAMS(( CONN_ID Idx, REQUEST *Req, bool *Closed )); LOCAL bool Handle_Request PARAMS(( CONN_ID Idx, REQUEST *Req )); +/** + * Return the pointer to the global "IRC command structure". + * This structure, an array of type "COMMAND" describes all the IRC commands + * implemented by ngIRCd and how to handle them. + * @return Pointer to the global command structure. + */ GLOBAL COMMAND * Parse_GetCommandStruct( void ) { @@ -116,13 +125,27 @@ Parse_GetCommandStruct( void ) } /* Parse_GetCommandStruct */ +/** + * Parse a command ("request") received from a client. + * + * This function is called after the connection layer received a valid CR+LF + * terminated line of text: we asume that this is a valid IRC command and + * try to do something useful with it :-) + * + * All errors are reported to the client from which the command has been + * received, and if the error is fatal this connection is closed down. + * + * This function is able to parse the syntax as described in RFC 2812, + * section 2.3. + * + * @param Idx Index of the connection from which the command has been received. + * @param Request NULL terminated line of text (the "command"). + * @return true on success (valid command or "regular" error), false if a + * fatal error occured and the connection has been shut down. + */ GLOBAL bool Parse_Request( CONN_ID Idx, char *Request ) { - /* Client-Request parsen. Bei einem schwerwiegenden Fehler wird - * die Verbindung geschlossen und false geliefert. - * Der Aufbau gueltiger Requests ist in RFC 2812, 2.3 definiert. */ - REQUEST req; char *start, *ptr; bool closed; @@ -220,6 +243,10 @@ Parse_Request( CONN_ID Idx, char *Request ) } /* Parse_Request */ +/** + * Initialize request structure. + * @param Req Request structure to be initialized. + */ LOCAL void Init_Request( REQUEST *Req ) { @@ -406,11 +433,23 @@ Handle_Request( CONN_ID Idx, REQUEST *Req ) return IRC_WriteStrClient( client, ERR_NOTREGISTERED_MSG, Client_ID( client )); } } + + if( Client_Type( client ) != CLIENT_USER && + Client_Type( client ) != CLIENT_SERVER && + Client_Type( client ) != CLIENT_SERVICE ) + return true; - /* Unbekannter Befehl */ - Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.", Client_Conn( client ), Req->command, Req->argc, Req->argc == 1 ? "parameter" : "parameters", Req->prefix ? "" : " no" ); - if( Client_Type( client ) != CLIENT_SERVER ) return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, Client_ID( client ), Req->command ); - else return true; + /* Unknown command and registered connection: generate error: */ + Log( LOG_DEBUG, "Connection %d: Unknown command \"%s\", %d %s,%s prefix.", + Client_Conn( client ), Req->command, Req->argc, + Req->argc == 1 ? "parameter" : "parameters", + Req->prefix ? "" : " no" ); + + if( Client_Type( client ) != CLIENT_SERVER ) + return IRC_WriteStrClient( client, ERR_UNKNOWNCOMMAND_MSG, + Client_ID( client ), Req->command ); + + return true; } /* Handle_Request */