X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-mode.c;h=aac8769512ac87eaf252feecb305ea8303aedf44;hb=c9540015c88c280a19ebbd872e7dcba47d5707ae;hp=05664949a6a968283b1df72b18cbda7796cf42f2;hpb=8841d87365ae75fdc5aea398554a6f08cbb2ce79;p=ngircd-alex.git diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c index 05664949..aac87695 100644 --- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-mode.c,v 1.24 2002/12/18 14:16:21 alex Exp $"; +static char UNUSED id[] = "$Id: irc-mode.c,v 1.28 2003/01/02 17:57:09 alex Exp $"; #include "imp.h" #include @@ -142,7 +142,8 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) else { /* Append modifier character to result string */ - x[0] = *mode_ptr; strcat( the_modes, x ); + x[0] = *mode_ptr; + strlcat( the_modes, x, sizeof( the_modes )); } if( *mode_ptr == '+' ) set = TRUE; else set = FALSE; @@ -156,7 +157,11 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) { case 'a': /* Away */ - if( Client_Type( Client ) == CLIENT_SERVER ) x[0] = 'a'; + if( Client_Type( Client ) == CLIENT_SERVER ) + { + x[0] = 'a'; + Client_SetAway( Client, DEFAULT_AWAY_MSG ); + } else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin )); break; case 'i': @@ -195,13 +200,13 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) if( set ) { /* Set mode */ - if( Client_ModeAdd( Target, x[0] )) strcat( the_modes, x ); + if( Client_ModeAdd( Target, x[0] )) strlcat( the_modes, x, sizeof( the_modes )); } else { /* Unset mode */ - if( Client_ModeDel( Target, x[0] )) strcat( the_modes, x ); + if( Client_ModeDel( Target, x[0] )) strlcat( the_modes, x, sizeof( the_modes )); } } client_exit: @@ -305,7 +310,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) else { /* Append modifier character to result string */ - x[0] = *mode_ptr; strcat( the_modes, x ); + x[0] = *mode_ptr; + strlcat( the_modes, x, sizeof( the_modes )); } if( *mode_ptr == '+' ) set = TRUE; else set = FALSE; @@ -390,7 +396,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) { Channel_ModeDel( Channel, 'k' ); Channel_SetKey( Channel, Req->argv[arg_arg] ); - strcpy( argadd, Channel_Key( Channel )); + strlcpy( argadd, Channel_Key( Channel ), sizeof( argadd )); x[0] = *mode_ptr; } else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); @@ -416,7 +422,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) { Channel_ModeDel( Channel, 'l' ); Channel_SetMaxUsers( Channel, l ); - sprintf( argadd, "%ld", l ); + snprintf( argadd, sizeof( argadd ), "%ld", l ); x[0] = *mode_ptr; } } @@ -480,8 +486,9 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) /* Channel-User-Mode */ if( Channel_UserModeAdd( Channel, client, x[0] )) { - strcat( the_args, Client_ID( client )); - strcat( the_args, " " ); strcat( the_modes, x ); + strlcat( the_args, Client_ID( client ), sizeof( the_args )); + strlcat( the_args, " ", sizeof( the_args )); + strlcat( the_modes, x, sizeof( the_modes )); Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client )); } } @@ -490,7 +497,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) /* Channel-Mode */ if( Channel_ModeAdd( Channel, x[0] )) { - strcat( the_modes, x ); + strlcat( the_modes, x, sizeof( the_modes )); Log( LOG_DEBUG, "Channel %s: Mode change, now \"%s\".", Channel_Name( Channel ), Channel_Modes( Channel )); } } @@ -503,8 +510,9 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) /* Channel-User-Mode */ if( Channel_UserModeDel( Channel, client, x[0] )) { - strcat( the_args, Client_ID( client )); - strcat( the_args, " " ); strcat( the_modes, x ); + strlcat( the_args, Client_ID( client ), sizeof( the_args )); + strlcat( the_args, " ", sizeof( the_args )); + strlcat( the_modes, x, sizeof( the_modes )); Log( LOG_DEBUG, "User \"%s\": Mode change on %s, now \"%s\"", Client_Mask( client ), Channel_Name( Channel ), Channel_UserModes( Channel, client )); } } @@ -513,7 +521,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) /* Channel-Mode */ if( Channel_ModeDel( Channel, x[0] )) { - strcat( the_modes, x ); + strlcat( the_modes, x, sizeof( the_modes )); Log( LOG_DEBUG, "Channel %s: Mode change, now \"%s\".", Channel_Name( Channel ), Channel_Modes( Channel )); } } @@ -522,8 +530,8 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) /* Are there additional arguments to add? */ if( argadd[0] ) { - if( the_args[strlen( the_args ) - 1] != ' ' ) strcat( the_args, " " ); - strcat( the_args, argadd ); + if( the_args[strlen( the_args ) - 1] != ' ' ) strlcat( the_args, " ", sizeof( the_args )); + strlcat( the_args, argadd, sizeof( the_args )); } } chan_exit: @@ -569,13 +577,14 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req ) { /* AWAY setzen */ Client_SetAway( Client, Req->argv[0] ); + Client_ModeAdd( Client, 'a' ); IRC_WriteStrServersPrefix( Client, Client, "MODE %s :+a", Client_ID( Client )); return IRC_WriteStrClient( Client, RPL_NOWAWAY_MSG, Client_ID( Client )); } else { /* AWAY loeschen */ - Client_SetAway( Client, NULL ); + Client_ModeDel( Client, 'a' ); IRC_WriteStrServersPrefix( Client, Client, "MODE %s :-a", Client_ID( Client )); return IRC_WriteStrClient( Client, RPL_UNAWAY_MSG, Client_ID( Client )); }