#include "portab.h"
-static char UNUSED id[] = "$Id: irc-mode.c,v 1.37 2005/03/02 16:35:11 alex Exp $";
+static char UNUSED id[] = "$Id: irc-mode.c,v 1.39 2005/03/15 16:56:18 alex Exp $";
#include "imp.h"
#include <assert.h>
CHAR the_modes[COMMAND_LEN], x[2], *mode_ptr;
BOOLEAN ok, set;
INT mode_arg;
+ size_t len;
/* Is the client allowed to request or change the modes? */
if( Client_Type( Client ) == CLIENT_USER )
if((( *mode_ptr == '+' ) && ( ! set )) || (( *mode_ptr == '-' ) && ( set )))
{
/* Action modifier ("+"/"-") must be changed ... */
- if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' ))
+ len = strlen( the_modes ) - 1;
+ if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' ))
{
/* Adjust last action modifier in result */
- the_modes[strlen( the_modes ) - 1] = *mode_ptr;
+ the_modes[len] = *mode_ptr;
}
else
{
if( the_modes[1] )
{
/* Remoce needless action modifier characters */
- if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) the_modes[strlen( the_modes ) - 1] = '\0';
+ len = strlen( the_modes ) - 1;
+ if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
if( Client_Type( Client ) == CLIENT_SERVER )
{
/* Handle channel and channel-user modes */
CHAR the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr;
- BOOLEAN ok, set, modeok, skiponce;
+ BOOLEAN ok, set, modeok = FALSE, skiponce, use_servermode = FALSE;
INT mode_arg, arg_arg;
CLIENT *client;
LONG l;
+ size_t len;
/* Mode request: let's answer it :-) */
if( Req->argc == 1 )
/* Is he channel operator? */
if( strchr( Channel_UserModes( Channel, Origin ), 'o' )) modeok = TRUE;
- else modeok = FALSE;
- if( Conf_OperCanMode )
+ else if( Conf_OperCanMode )
{
- /* auch IRC-Operatoren duerfen MODE verwenden */
- if( Client_OperByMe( Origin )) modeok = TRUE;
+ /* IRC-Operators can use MODE as well */
+ if( Client_OperByMe( Origin )) {
+ modeok = TRUE;
+ if ( Conf_OperServerMode ) use_servermode = TRUE; /* Change Origin to Server */
+ }
}
}
else modeok = TRUE;
if((( *mode_ptr == '+' ) && ( ! set )) || (( *mode_ptr == '-' ) && ( set )))
{
/* Action modifier ("+"/"-") must be changed ... */
- if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' ))
+ len = strlen( the_modes ) - 1;
+ if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' ))
{
/* Adjust last action modifier in result */
- the_modes[strlen( the_modes ) - 1] = *mode_ptr;
+ the_modes[len] = *mode_ptr;
}
else
{
/* Are there additional arguments to add? */
if( argadd[0] )
{
- if( the_args[strlen( the_args ) - 1] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
+ len = strlen( the_args ) - 1;
+ if( the_args[len] != ' ' ) strlcat( the_args, " ", sizeof( the_args ));
strlcat( the_args, argadd, sizeof( the_args ));
}
}
if( the_modes[1] )
{
/* Clean up mode string */
- if(( the_modes[strlen( the_modes ) - 1] == '+' ) || ( the_modes[strlen( the_modes ) - 1] == '-' )) the_modes[strlen( the_modes ) - 1] = '\0';
+ len = strlen( the_modes ) - 1;
+ if(( the_modes[len] == '+' ) || ( the_modes[len] == '-' )) the_modes[len] = '\0';
/* Clean up argument string if there are none */
if( ! the_args[1] ) the_args[0] = '\0';
}
else
{
+ if ( use_servermode ) Origin = Client_ThisServer();
+
/* Send reply to client and inform other servers and channel users */
ok = IRC_WriteStrClientPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );
IRC_WriteStrServersPrefix( Client, Origin, "MODE %s %s%s", Channel_Name( Channel ), the_modes, the_args );