commit fb9d6ce1741ef127cba00c7fa90739478a9b2b68 from: Alexander Barton date: Mon Dec 31 15:33:13 2001 UTC - neuer Befehl NAMES, kleinere Bugfixes. - Bug bei PING behoben: war zu restriktiv implementiert :-) commit - 194f18c8e69e42ea7476f21514642833e090c426 commit + fb9d6ce1741ef127cba00c7fa90739478a9b2b68 blob - ea420d6e891e6ce0ad13684719faad4e9284ac40 blob + 0ef82662720e6be76900da58f57df66f293103b6 --- src/ngircd/client.c +++ src/ngircd/client.c @@ -9,7 +9,7 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: client.c,v 1.14 2001/12/31 02:18:51 alex Exp $ + * $Id: client.c,v 1.15 2001/12/31 15:33:13 alex Exp $ * * client.c: Management aller Clients * @@ -21,6 +21,10 @@ * Server gewesen, so existiert eine entsprechende CONNECTION-Struktur. * * $Log: client.c,v $ + * Revision 1.15 2001/12/31 15:33:13 alex + * - neuer Befehl NAMES, kleinere Bugfixes. + * - Bug bei PING behoben: war zu restriktiv implementiert :-) + * * Revision 1.14 2001/12/31 02:18:51 alex * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART), * - neuen Header "defines.h" mit (fast) allen Konstanten. @@ -318,8 +322,26 @@ GLOBAL CLIENT *Client_Search( CHAR *ID ) return NULL; } /* Client_Search */ + + +GLOBAL CLIENT *Client_First( VOID ) +{ + /* Ersten Client liefern. */ + + return My_Clients; +} /* Client_First */ +GLOBAL CLIENT *Client_Next( CLIENT *c ) +{ + /* Naechsten Client liefern. Existiert keiner, + * so wird NULL geliefert. */ + + assert( c != NULL ); + return c->next; +} /* Client_Next */ + + LOCAL CLIENT *New_Client_Struct( VOID ) { /* Neue CLIENT-Struktur pre-initialisieren */ blob - 68943db3f325565cd0efd697b333117793fdda3b blob + c6314269bfb9969617d021c25c8ee22e2f2f06cb --- src/ngircd/client.h +++ src/ngircd/client.h @@ -9,11 +9,15 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: client.h,v 1.10 2001/12/31 02:18:51 alex Exp $ + * $Id: client.h,v 1.11 2001/12/31 15:33:13 alex Exp $ * * client.h: Konfiguration des ngircd (Header) * * $Log: client.h,v $ + * Revision 1.11 2001/12/31 15:33:13 alex + * - neuer Befehl NAMES, kleinere Bugfixes. + * - Bug bei PING behoben: war zu restriktiv implementiert :-) + * * Revision 1.10 2001/12/31 02:18:51 alex * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART), * - neuen Header "defines.h" mit (fast) allen Konstanten. @@ -101,6 +105,8 @@ GLOBAL CHAR *Client_Nick( CLIENT *Client ); GLOBAL BOOLEAN Client_CheckNick( CLIENT *Client, CHAR *Nick ); GLOBAL CHAR *Client_GetID( CLIENT *Client ); GLOBAL CLIENT *Client_Search( CHAR *ID ); +GLOBAL CLIENT *Client_First( VOID ); +GLOBAL CLIENT *Client_Next( CLIENT *c ); #endif blob - 4c4db01023a1feae06a11861660927256f268af4 blob + a33a9286b2a06cdd47ae1e93ccd11a067f866650 --- src/ngircd/irc.c +++ src/ngircd/irc.c @@ -9,11 +9,15 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: irc.c,v 1.16 2001/12/31 02:18:51 alex Exp $ + * $Id: irc.c,v 1.17 2001/12/31 15:33:13 alex Exp $ * * irc.c: IRC-Befehle * * $Log: irc.c,v $ + * Revision 1.17 2001/12/31 15:33:13 alex + * - neuer Befehl NAMES, kleinere Bugfixes. + * - Bug bei PING behoben: war zu restriktiv implementiert :-) + * * Revision 1.16 2001/12/31 02:18:51 alex * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART), * - neuen Header "defines.h" mit (fast) allen Konstanten. @@ -276,8 +280,6 @@ GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req ) { - CLIENT *to; - assert( Client != NULL ); assert( Req != NULL ); @@ -287,10 +289,7 @@ GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req if( Req->argc < 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NOORIGIN_MSG, Client_Nick( Client )); if( Req->argc > 1 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command ); - to = Client_Search( Req->argv[0] ); - - if( to ) return IRC_WriteStrClient( Client, This_Server, "PONG :%s", Client_Nick( Client )); - else return IRC_WriteStrClient( Client, This_Server, ERR_NOSUCHNICK_MSG, Client_Nick( Client ), Req->argv[0] ); + return IRC_WriteStrClient( Client, This_Server, "PONG %s :%s", Client_Nick( This_Server), Client_Nick( Client )); } /* IRC_PING */ @@ -543,8 +542,53 @@ GLOBAL BOOLEAN IRC_RESTART( CLIENT *Client, REQUEST *R NGIRCd_Restart = TRUE; return CONNECTED; } /* IRC_RESTART */ + + +GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req ) +{ + CHAR rpl[COMMAND_LEN]; + CLIENT *c; + + assert( Client != NULL ); + assert( Req != NULL ); + + if( ! Check_Valid_User( Client )) return CONNECTED; + + /* Falsche Anzahl Parameter? */ + if( Req->argc != 0 ) return IRC_WriteStrClient( Client, This_Server, ERR_NEEDMOREPARAMS_MSG, Client_Nick( Client ), Req->command ); + + /* Noch alle User ausgeben, die in keinem Channel sind */ + rpl[0] = '\0'; + c = Client_First( ); + while( c ) + { + if( c->type == CLIENT_USER ) + { + /* Okay, das ist ein User */ + strcat( rpl, Client_Nick( c )); + strcat( rpl, " " ); + } + /* Antwort zu lang? Splitten. */ + if( strlen( rpl ) > 480 ) + { + if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; + if( ! IRC_WriteStrClient( Client, This_Server, RPL_NAMREPLY_MSG, Client_Nick( Client ), "*", "*", rpl )) return DISCONNECTED; + rpl[0] = '\0'; + } + + c = Client_Next( c ); + } + if( rpl[0] ) + { + /* es wurden User gefunden */ + if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; + if( ! IRC_WriteStrClient( Client, This_Server, RPL_NAMREPLY_MSG, Client_Nick( Client ), "*", "*", rpl )) return DISCONNECTED; + } + return IRC_WriteStrClient( Client, This_Server, RPL_ENDOFNAMES_MSG, Client_Nick( Client ), "*" ); +} /* IRC_NAMES */ + GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req ) { CHAR rpl[COMMAND_LEN]; blob - 766095700ddfa2efd3888686f525329ba9d394ab blob + 0576b01ebe8a1b148e59dcf831a2584cd8826461 --- src/ngircd/irc.h +++ src/ngircd/irc.h @@ -9,11 +9,15 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: irc.h,v 1.10 2001/12/31 02:18:51 alex Exp $ + * $Id: irc.h,v 1.11 2001/12/31 15:33:13 alex Exp $ * * irc.h: IRC-Befehle (Header) * * $Log: irc.h,v $ + * Revision 1.11 2001/12/31 15:33:13 alex + * - neuer Befehl NAMES, kleinere Bugfixes. + * - Bug bei PING behoben: war zu restriktiv implementiert :-) + * * Revision 1.10 2001/12/31 02:18:51 alex * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART), * - neuen Header "defines.h" mit (fast) allen Konstanten. @@ -77,6 +81,7 @@ GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Re GLOBAL BOOLEAN IRC_MODE( CLIENT *Client, REQUEST *Req ); +GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req ); GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req ); GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req ); GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req ); blob - 0da26acd5041e12d78af6e7003450072e46e39fb blob + f11fe213919b545cc51a84bee15d897a0eeb6d31 --- src/ngircd/messages.h +++ src/ngircd/messages.h @@ -9,11 +9,15 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: messages.h,v 1.12 2001/12/31 02:18:51 alex Exp $ + * $Id: messages.h,v 1.13 2001/12/31 15:33:13 alex Exp $ * * irc.h: IRC-Befehle (Header) * * $Log: messages.h,v $ + * Revision 1.13 2001/12/31 15:33:13 alex + * - neuer Befehl NAMES, kleinere Bugfixes. + * - Bug bei PING behoben: war zu restriktiv implementiert :-) + * * Revision 1.12 2001/12/31 02:18:51 alex * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART), * - neuen Header "defines.h" mit (fast) allen Konstanten. @@ -109,6 +113,12 @@ #define RPL_WHOISCHANNELS "319" #define RPL_WHOISCHANNELS_MSG RPL_WHOISCHANNELS" %s :" +#define RPL_NAMREPLY "353" +#define RPL_NAMREPLY_MSG RPL_NAMREPLY" %s %s %s :%s" + +#define RPL_ENDOFNAMES "366" +#define RPL_ENDOFNAMES_MSG RPL_ENDOFNAMES" %s %s :End of NAMES list" + #define RPL_YOUREOPER "381" #define RPL_YOUREOPER_MSG RPL_YOUREOPER" %s :You are now an IRC Operator" blob - cbe01f6c69ed9a8ecff828f7c1f81fa85bd0b130 blob + fb451d026e88d19d1e2b731c0552f8e8ddf7d6d6 --- src/ngircd/parse.c +++ src/ngircd/parse.c @@ -9,11 +9,15 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: parse.c,v 1.9 2001/12/31 02:18:51 alex Exp $ + * $Id: parse.c,v 1.10 2001/12/31 15:33:13 alex Exp $ * * parse.c: Parsen der Client-Anfragen * * $Log: parse.c,v $ + * Revision 1.10 2001/12/31 15:33:13 alex + * - neuer Befehl NAMES, kleinere Bugfixes. + * - Bug bei PING behoben: war zu restriktiv implementiert :-) + * * Revision 1.9 2001/12/31 02:18:51 alex * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART), * - neuen Header "defines.h" mit (fast) allen Konstanten. @@ -244,6 +248,7 @@ LOCAL BOOLEAN Handle_Request( CONN_ID Idx, REQUEST *Re else if( strcasecmp( Req->command, "PRIVMSG" ) == 0 ) return IRC_PRIVMSG( client, Req ); else if( strcasecmp( Req->command, "NOTICE" ) == 0 ) return IRC_NOTICE( client, Req ); else if( strcasecmp( Req->command, "MODE" ) == 0 ) return IRC_MODE( client, Req ); + else if( strcasecmp( Req->command, "NAMES" ) == 0 ) return IRC_NAMES( client, Req ); else if( strcasecmp( Req->command, "ISON" ) == 0 ) return IRC_ISON( client, Req ); else if( strcasecmp( Req->command, "WHOIS" ) == 0 ) return IRC_WHOIS( client, Req ); else if( strcasecmp( Req->command, "USERHOST" ) == 0 ) return IRC_USERHOST( client, Req );