X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-info.c;h=3811ea73d406c7b429eaee389b575bdc78a0a726;hb=1d08d51e2eaff14b71f20d3f0898d5a86582b7e5;hp=3bc6904f5dc1efe3d5d9ee60cc9a2929ad2e8cf9;hpb=260b8e5f364ef7d2c6a40741dd361c99daecde9a;p=ngircd-alex.git diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c index 3bc6904f..3811ea73 100644 --- a/src/ngircd/irc-info.c +++ b/src/ngircd/irc-info.c @@ -14,13 +14,14 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-info.c,v 1.17 2003/06/06 20:46:11 alex Exp $"; +static char UNUSED id[] = "$Id: irc-info.c,v 1.27 2005/03/02 16:35:11 alex Exp $"; #include "imp.h" #include #include #include #include +#include #include "ngircd.h" #include "cvs-version.h" @@ -77,6 +78,7 @@ IRC_ADMIN(CLIENT *Client, REQUEST *Req ) if( ! IRC_WriteStrClient( Client, RPL_ADMINLOC2_MSG, Client_ID( prefix ), Conf_ServerAdmin2 )) return DISCONNECTED; if( ! IRC_WriteStrClient( Client, RPL_ADMINEMAIL_MSG, Client_ID( prefix ), Conf_ServerAdminMail )) return DISCONNECTED; + IRC_SetPenalty( Client, 1 ); return CONNECTED; } /* IRC_ADMIN */ @@ -112,7 +114,7 @@ IRC_ISON( CLIENT *Client, REQUEST *Req ) ptr = strtok( NULL, " " ); } } - if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; + ngt_TrimLastChr(rpl, ' '); return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) ); } /* IRC_ISON */ @@ -161,7 +163,8 @@ IRC_LINKS( CLIENT *Client, REQUEST *Req ) } c = Client_Next( c ); } - + + IRC_SetPenalty( target, 1 ); return IRC_WriteStrClient( target, RPL_ENDOFLINKS_MSG, Client_ID( target ), mask ); } /* IRC_LINKS */ @@ -197,6 +200,7 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req ) IRC_Send_LUSERS( target ); + IRC_SetPenalty( target, 1 ); return CONNECTED; } /* IRC_LUSERS */ @@ -230,6 +234,7 @@ IRC_MOTD( CLIENT *Client, REQUEST *Req ) } } + IRC_SetPenalty( from, 3 ); return IRC_Show_MOTD( from ); } /* IRC_MOTD */ @@ -324,6 +329,7 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req ) if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED; } + IRC_SetPenalty( from, 1 ); return IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), "*" ); } /* IRC_NAMES */ @@ -374,7 +380,7 @@ IRC_STATS( CLIENT *Client, REQUEST *Req ) if( cl && (( Client_Type( cl ) == CLIENT_SERVER ) || ( cl == Client ))) { /* Server link or our own connection */ -#ifdef USE_ZLIB +#ifdef ZLIB if( Conn_Options( con ) & CONN_ZIP ) { if( ! IRC_WriteStrClient( from, RPL_STATSLINKINFOZIP_MSG, Client_ID( from ), Client_Mask( cl ), Conn_SendQ( con ), Conn_SendMsg( con ), Zip_SendBytes( con ), Conn_SendBytes( con ), Conn_RecvMsg( con ), Zip_RecvBytes( con ), Conn_RecvBytes( con ), (LONG)( time( NULL ) - Conn_StartTime( con )))) return DISCONNECTED; @@ -402,6 +408,7 @@ IRC_STATS( CLIENT *Client, REQUEST *Req ) break; } + IRC_SetPenalty( from, 2 ); return IRC_WriteStrClient( from, RPL_ENDOFSTATS_MSG, Client_ID( from ), query ); } /* IRC_STATS */ @@ -477,7 +484,7 @@ IRC_USERHOST( CLIENT *Client, REQUEST *Req ) strlcat( rpl, " ", sizeof( rpl )); } } - if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0'; + ngt_TrimLastChr( rpl, ' '); return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) ); } /* IRC_USERHOST */ @@ -488,7 +495,7 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *prefix; #ifdef CVSDATE - CHAR ver[12]; + CHAR ver[12], vertxt[30]; #endif assert( Client != NULL ); @@ -517,13 +524,15 @@ IRC_VERSION( CLIENT *Client, REQUEST *Req ) } /* mit Versionsinfo antworten */ + IRC_SetPenalty( Client, 1 ); #ifdef CVSDATE strlcpy( ver, CVSDATE, sizeof( ver )); strncpy( ver + 4, ver + 5, 2 ); strncpy( ver + 6, ver + 8, 3 ); - return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, ver, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( )); + snprintf( vertxt, sizeof( vertxt ), "%s(%s)", PACKAGE_VERSION, ver ); + return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, vertxt, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition ); #else - return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( )); + return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition ); #endif } /* IRC_VERSION */ @@ -534,7 +543,7 @@ IRC_WHO( CLIENT *Client, REQUEST *Req ) BOOLEAN ok, only_ops; CHAR flags[8], *ptr; CL2CHAN *cl2chan; - CHANNEL *chan; + CHANNEL *chan, *cn; CLIENT *c; assert( Client != NULL ); @@ -582,14 +591,25 @@ IRC_WHO( CLIENT *Client, REQUEST *Req ) if( ok && (( ! only_ops ) || ( strchr( Client_Modes( c ), 'o' )))) { - /* Flags zusammenbasteln */ + /* Get flags */ strcpy( flags, "H" ); if( strchr( Client_Modes( c ), 'o' )) strlcat( flags, "*", sizeof( flags )); - /* ausgeben */ + /* Search suitable channel */ cl2chan = Channel_FirstChannelOf( c ); - if( cl2chan ) ptr = Channel_Name( Channel_GetChannel( cl2chan )); - else ptr = "*"; + while( cl2chan ) + { + cn = Channel_GetChannel( cl2chan ); + if( Channel_IsMemberOf( cn, Client ) || + ! strchr( Channel_Modes( cn ), 's' )) + { + ptr = Channel_Name( cn ); + break; + } + cl2chan = Channel_NextChannelOf( c, cl2chan ); + } + if( ! cl2chan ) ptr = "*"; + if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), ptr, Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED; } } @@ -654,6 +674,12 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) chan = Channel_GetChannel( cl2chan ); assert( chan != NULL ); + /* next */ + cl2chan = Channel_NextChannelOf( c, cl2chan ); + + /* Secret channel? */ + if( strchr( Channel_Modes( chan ), 's' ) && ! Channel_IsMemberOf( chan, Client )) continue; + /* Concatenate channel names */ if( str[strlen( str ) - 1] != ':' ) strlcat( str, " ", sizeof( str )); if( strchr( Channel_UserModes( chan, c ), 'o' )) strlcat( str, "@", sizeof( str )); @@ -666,9 +692,6 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; snprintf( str, sizeof( str ), RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c )); } - - /* next */ - cl2chan = Channel_NextChannelOf( c, cl2chan ); } if( str[strlen( str ) - 1] != ':') { @@ -764,6 +787,13 @@ IRC_Show_MOTD( CLIENT *Client ) assert( Client != NULL ); + if( Conf_MotdPhrase[0] ) + { + if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED; + if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), Conf_MotdPhrase )) return DISCONNECTED; + return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client )); + } + fd = fopen( Conf_MotdFile, "r" ); if( ! fd ) { @@ -771,11 +801,13 @@ IRC_Show_MOTD( CLIENT *Client ) return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) ); } - IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( ))); + if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED; while( TRUE ) { - if( ! fgets( line, 126, fd )) break; - if( line[strlen( line ) - 1] == '\n' ) line[strlen( line ) - 1] = '\0'; + if( ! fgets( line, sizeof( line ), fd )) break; + + ngt_TrimLastChr( line, '\n'); + if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line )) { fclose( fd ); @@ -804,6 +836,9 @@ IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan ) if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE; else is_member = FALSE; + /* Secret channel? */ + if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED; + /* Alle Mitglieder suchen */ snprintf( str, sizeof( str ), RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan )); cl2chan = Channel_FirstMember( Chan ); @@ -857,6 +892,9 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ) if( Channel_IsMemberOf( Chan, Client )) is_member = TRUE; else is_member = FALSE; + /* Secret channel? */ + if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED; + /* Alle Mitglieder suchen */ cl2chan = Channel_FirstMember( Chan ); while( cl2chan )