X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc.c;h=f58dda6f0ded37c6323471ae9d6ad4e3cf79f0ad;hp=e01cdd1320e57193ecdccaf02cf31a69c70afde7;hb=c147ebef0dfa701922c09df6bd93d77e93c80136;hpb=b181f1bd3cc97a8e4dfe63aaecd1dd207bdff262 diff --git a/src/ngircd/irc.c b/src/ngircd/irc.c index e01cdd13..f58dda6f 100644 --- a/src/ngircd/irc.c +++ b/src/ngircd/irc.c @@ -9,11 +9,21 @@ * 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.72 2002/02/27 02:26:58 alex Exp $ + * $Id: irc.c,v 1.75 2002/02/27 15:23:27 alex Exp $ * * irc.c: IRC-Befehle * * $Log: irc.c,v $ + * Revision 1.75 2002/02/27 15:23:27 alex + * - NAMES beachtet nun das "invisible" Flag ("i") von Usern. + * + * Revision 1.74 2002/02/27 03:44:53 alex + * - gerade eben in SQUIT eingefuehrten Bug behoben: entfernte Server werden nun + * nur noch geloescht, die Verbindung, von der SQUIT kam, bleibt wieder offen. + * + * Revision 1.73 2002/02/27 03:08:05 alex + * - Log-Meldungen bei SQUIT erneut ueberarbeitet ... + * * Revision 1.72 2002/02/27 02:26:58 alex * - SQUIT wird auf jeden Fall geforwarded, zudem besseres Logging. * @@ -1048,7 +1058,7 @@ GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req ) GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req ) { CLIENT *target; - CHAR msg[128]; + CHAR msg[LINE_LEN + 64]; assert( Client != NULL ); assert( Req != NULL ); @@ -1059,36 +1069,38 @@ GLOBAL BOOLEAN IRC_SQUIT( CLIENT *Client, REQUEST *Req ) /* Falsche Anzahl Parameter? */ if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); + Log( LOG_DEBUG, "Got SQUIT from %s for \"%s\": \"%s\" ...", Client_ID( Client ), Req->argv[0], Req->argv[1] ); + /* SQUIT an alle Server weiterleiten */ IRC_WriteStrServers( Client, "SQUIT %s :%s", Req->argv[0], Req->argv[1] ); target = Client_GetFromID( Req->argv[0] ); if( ! target ) { - Log( LOG_ERR, "Got SQUIT from %s for unknown server \%s\"!?", Client_ID( Client ), Req->argv[0] ); + Log( LOG_ERR, "Got SQUIT from %s for unknown server \"%s\"!?", Client_ID( Client ), Req->argv[0] ); return CONNECTED; } - if( target == Client ) Log( LOG_DEBUG, "Got SQUIT from %s: %s", Client_ID( Client ), Req->argv[1] ); - else Log( LOG_DEBUG, "Got SQUIT from %s for %s: %s", Client_ID( Client ), Client_ID( target ), Req->argv[1] ); - if( Req->argv[1][0] ) { - strcpy( msg, "Got SQUIT: " ); - strncpy( &msg[11], Req->argv[1], 116 ); - msg[128] = '\0'; + if( strlen( Req->argv[1] ) > LINE_LEN ) Req->argv[1][LINE_LEN] = '\0'; + sprintf( msg, "%s (SQUIT from %s).", Req->argv[1], Client_ID( Client )); } - else strcpy( msg, "Got SQUIT command." ); + else sprintf( msg, "Got SQUIT from %s.", Client_ID( Client )); if( Client_Conn( target ) > NONE ) { /* dieser Server hat die Connection */ if( Req->argv[1][0] ) Conn_Close( Client_Conn( target ), msg, Req->argv[1], TRUE ); else Conn_Close( Client_Conn( target ), msg, NULL, TRUE ); + return DISCONNECTED; + } + else + { + /* Verbindung hielt anderer Server */ + Client_Destroy( target, msg, Req->argv[1] ); + return CONNECTED; } - else Client_Destroy( target, msg, Req->argv[1] ); - - return DISCONNECTED; } /* IRC_SQUIT */ @@ -1705,11 +1717,12 @@ GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req ) chan = Channel_Next( chan ); } + /* Nun noch alle Clients ausgeben, die in keinem Channel sind */ c = Client_First( ); sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" ); while( c ) { - if(( Client_Type( c ) == CLIENT_USER ) && ( Channel_FirstChannelOf( c ) == NULL )) + if(( Client_Type( c ) == CLIENT_USER ) && ( Channel_FirstChannelOf( c ) == NULL ) && ( ! strchr( Client_Modes( c ), 'i' ))) { /* Okay, das ist ein User: anhaengen */ if( rpl[strlen( rpl ) - 1] != ':' ) strcat( rpl, " " ); @@ -2289,6 +2302,7 @@ LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason ) LOCAL BOOLEAN Send_NAMES( CLIENT *Client, CHANNEL *Chan ) { + BOOLEAN is_visible, is_member; CHAR str[LINE_LEN + 1]; CL2CHAN *cl2chan; CLIENT *cl; @@ -2296,6 +2310,9 @@ LOCAL BOOLEAN Send_NAMES( CLIENT *Client, CHANNEL *Chan ) assert( Client != NULL ); assert( Chan != NULL ); + if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE; + else is_member = FALSE; + /* Alle Mitglieder suchen */ sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); cl2chan = Channel_FirstMember( Chan ); @@ -2303,17 +2320,23 @@ LOCAL BOOLEAN Send_NAMES( CLIENT *Client, CHANNEL *Chan ) { cl = Channel_GetClient( cl2chan ); - /* Nick anhaengen */ - if( str[strlen( str ) - 1] != ':' ) strcat( str, " " ); - if( strchr( Channel_UserModes( Chan, cl ), 'v' )) strcat( str, "+" ); - if( strchr( Channel_UserModes( Chan, cl ), 'o' )) strcat( str, "@" ); - strcat( str, Client_ID( cl )); + if( strchr( Client_Modes( cl ), 'i' )) is_visible = FALSE; + else is_visible = TRUE; - if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) + if( is_member || is_visible ) { - /* Zeile wird zu lang: senden! */ - if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED; - sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); + /* Nick anhaengen */ + if( str[strlen( str ) - 1] != ':' ) strcat( str, " " ); + if( strchr( Channel_UserModes( Chan, cl ), 'v' )) strcat( str, "+" ); + if( strchr( Channel_UserModes( Chan, cl ), 'o' )) strcat( str, "@" ); + strcat( str, Client_ID( cl )); + + if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) + { + /* Zeile wird zu lang: senden! */ + if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED; + sprintf( str, RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); + } } /* naechstes Mitglied suchen */