X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-channel.c;h=aa41b7de4af527bd3bd774b122867a29c7b00c3c;hb=3cf845fbfb0d4f8063d127afab51876b8627a537;hp=4eb5b861b932439344882f99a4fef8f7ce90dc10;hpb=1f9ba7b326d05a681129f67f3f65853bb4969e76;p=ngircd-alex.git diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c index 4eb5b861..aa41b7de 100644 --- a/src/ngircd/irc-channel.c +++ b/src/ngircd/irc-channel.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: irc-channel.c,v 1.13 2002/09/03 23:56:55 alex Exp $ + * $Id: irc-channel.c,v 1.15 2002/09/16 09:16:17 alex Exp $ * * irc-channel.c: IRC-Channel-Befehle */ @@ -41,7 +41,7 @@ GLOBAL BOOLEAN IRC_JOIN( CLIENT *Client, REQUEST *Req ) { CHAR *channame, *flags, *topic, modes[8]; - BOOLEAN is_new_chan; + BOOLEAN is_new_chan, is_invited, is_banned; CLIENT *target; CHANNEL *chan; @@ -96,10 +96,13 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) chan = Channel_Search( channame ); assert( chan != NULL ); + is_banned = Lists_CheckBanned( target, chan ); + is_invited = Lists_CheckInvited( target, chan ); + /* Testen, ob Client gebanned ist */ - if( Lists_CheckBanned( target, chan )) + if(( is_banned == TRUE ) && ( is_invited == FALSE )) { - /* Client ist gebanned: */ + /* Client ist gebanned (und nicht invited): */ IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame ); /* naechsten Namen ermitteln */ @@ -108,18 +111,14 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) } /* Ist der Channel "invite-only"? */ - if( strchr( Channel_Modes( chan ), 'i' )) + if(( strchr( Channel_Modes( chan ), 'i' ) != NULL ) && ( is_invited == FALSE )) { - /* Wurde der Client invited? */ - if( ! Lists_CheckInvited( target, chan )) - { - /* Client wurde nicht invited: */ - IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame ); - - /* naechsten Namen ermitteln */ - channame = strtok( NULL, "," ); - continue; - } + /* Channel ist "invite-only" und Client wurde nicht invited: */ + IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame ); + + /* naechsten Namen ermitteln */ + channame = strtok( NULL, "," ); + continue; } } } @@ -276,17 +275,36 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) { CHAR *pattern; CHANNEL *chan; + CLIENT *from, *target; assert( Client != NULL ); assert( Req != NULL ); - if( Client_Type( Client ) != CLIENT_USER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client )); + if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client )); /* Falsche Anzahl Parameter? */ - if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); + if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); if( Req->argc > 0 ) pattern = strtok( Req->argv[0], "," ); else pattern = "*"; + + /* From aus Prefix ermitteln */ + if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); + else from = Client; + if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); + + if( Req->argc == 2 ) + { + /* an anderen Server forwarden */ + target = Client_Search( Req->argv[1] ); + if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] ); + + if( target != Client_ThisServer( )) + { + /* Ok, anderer Server ist das Ziel: forwarden */ + return IRC_WriteStrClientPrefix( target, from, "LIST %s :%s", from, Req->argv[1] ); + } + } while( pattern ) { @@ -298,7 +316,7 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) if( Match( pattern, Channel_Name( chan ))) { /* Treffer! */ - if( ! IRC_WriteStrClient( Client, RPL_LIST_MSG, Client_ID( Client), Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED; + if( ! IRC_WriteStrClient( from, RPL_LIST_MSG, from, Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED; } chan = Channel_Next( chan ); } @@ -308,7 +326,7 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) else pattern = NULL; } - return IRC_WriteStrClient( Client, RPL_LISTEND_MSG, Client_ID( Client )); + return IRC_WriteStrClient( from, RPL_LISTEND_MSG, from ); } /* IRC_LIST */