diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | bitlbee.c | 8 | ||||
| -rw-r--r-- | bitlbee.h | 4 | ||||
| -rw-r--r-- | commands.h | 2 | ||||
| -rw-r--r-- | ipc.c | 54 | ||||
| -rw-r--r-- | ipc.h | 2 | ||||
| -rw-r--r-- | irc.c | 43 | ||||
| -rw-r--r-- | irc.h | 7 | ||||
| -rw-r--r-- | irc_commands.c | 147 | ||||
| -rw-r--r-- | root_commands.c (renamed from commands.c) | 191 | ||||
| -rw-r--r-- | user.h | 2 | 
11 files changed, 180 insertions, 282 deletions
| @@ -9,7 +9,7 @@  -include Makefile.settings  # Program variables -objects = account.o bitlbee.o commands.o conf.o crypting.o help.o ini.o ipc.o irc.o irc_commands.o log.o nick.o query.o set.o storage.o storage_text.o unix.o url.o user.o util.o +objects = account.o bitlbee.o conf.o crypting.o help.o ini.o ipc.o irc.o irc_commands.o log.o nick.o query.o root_commands.o set.o storage.o storage_text.o unix.o url.o user.o util.o  subdirs = protocols  # Expansion of variables @@ -166,10 +166,12 @@ gboolean bitlbee_io_current_client_read( GIOChannel *source, GIOCondition condit  		strcpy( ( irc->readbuffer + strlen( irc->readbuffer ) ), line );  	} -	if( !irc_process( irc ) ) +	irc_process( irc ); +	 +	/* Normally, irc_process() shouldn't call irc_free() but irc_abort(). Just in case: */ +	if( !g_slist_find( irc_connection_list, irc ) )  	{ -		log_message( LOGLVL_INFO, "Destroying connection with fd %d.", irc->fd ); -		irc_abort( irc ); +		log_message( LOGLVL_WARNING, "Abnormal termination of connection with fd %d.", irc->fd );  		return FALSE;  	}  @@ -128,8 +128,8 @@ int bitlbee_inetd_init( void );  gboolean bitlbee_io_current_client_read( GIOChannel *source, GIOCondition condition, gpointer data );  gboolean bitlbee_io_current_client_write( GIOChannel *source, GIOCondition condition, gpointer data ); -int root_command_string( irc_t *irc, user_t *u, char *command, int flags ); -int root_command( irc_t *irc, char *command[] ); +void root_command_string( irc_t *irc, user_t *u, char *command, int flags ); +void root_command( irc_t *irc, char *command[] );  void bitlbee_shutdown( gpointer data );  double gettime( void );  G_MODULE_EXPORT void http_encode( char *s ); @@ -32,7 +32,7 @@ typedef struct command  {  	char *command;  	int required_parameters; -	int (*execute)(irc_t *, char **args); +	void (*execute)(irc_t *, char **args);  	int flags;  } command_t; @@ -31,7 +31,7 @@  GSList *child_list = NULL; -static int ipc_master_cmd_client( irc_t *data, char **cmd ) +static void ipc_master_cmd_client( irc_t *data, char **cmd )  {  	struct bitlbee_child *child = (void*) data; @@ -44,21 +44,17 @@ static int ipc_master_cmd_client( irc_t *data, char **cmd )  	ipc_to_children_str( "OPERMSG :Client connecting (PID=%d): %s@%s (%s)\r\n",  	                     child ? child->pid : -1, cmd[2], cmd[1], cmd[3] ); -	 -	return 1;  } -static int ipc_master_cmd_die( irc_t *data, char **cmd ) +static void ipc_master_cmd_die( irc_t *data, char **cmd )  {  	if( global.conf->runmode == RUNMODE_FORKDAEMON )  		ipc_to_children_str( "DIE\r\n" );  	bitlbee_shutdown( NULL ); -	 -	return 1;  } -int ipc_master_cmd_rehash( irc_t *data, char **cmd ) +void ipc_master_cmd_rehash( irc_t *data, char **cmd )  {  	runmode_t oldmode; @@ -75,8 +71,6 @@ int ipc_master_cmd_rehash( irc_t *data, char **cmd )  	if( global.conf->runmode == RUNMODE_FORKDAEMON )  		ipc_to_children( cmd ); -	 -	return 1;  }  static const command_t ipc_master_commands[] = { @@ -91,50 +85,39 @@ static const command_t ipc_master_commands[] = {  }; -static int ipc_child_cmd_die( irc_t *irc, char **cmd ) +static void ipc_child_cmd_die( irc_t *irc, char **cmd )  { -	if( irc->status >= USTATUS_LOGGED_IN ) -		irc_write( irc, "ERROR :Operator requested server shutdown, bye bye!" ); -	 -	irc_abort( irc ); -	 -	return 1; +	irc_abort( irc, 1, "Shutdown requested by operator" );  } -static int ipc_child_cmd_wallops( irc_t *irc, char **cmd ) +static void ipc_child_cmd_wallops( irc_t *irc, char **cmd )  {  	if( irc->status < USTATUS_LOGGED_IN ) -		return 1; +		return;  	if( strchr( irc->umode, 'w' ) )  		irc_write( irc, ":%s WALLOPS :%s", irc->myhost, cmd[1] ); -	 -	return 1;  } -static int ipc_child_cmd_lilo( irc_t *irc, char **cmd ) +static void ipc_child_cmd_lilo( irc_t *irc, char **cmd )  {  	if( irc->status < USTATUS_LOGGED_IN ) -		return 1; +		return;  	if( strchr( irc->umode, 's' ) )  		irc_write( irc, ":%s NOTICE %s :%s", irc->myhost, irc->nick, cmd[1] ); -	 -	return 1;  } -static int ipc_child_cmd_opermsg( irc_t *irc, char **cmd ) +static void ipc_child_cmd_opermsg( irc_t *irc, char **cmd )  {  	if( irc->status < USTATUS_LOGGED_IN ) -		return 1; +		return;  	if( strchr( irc->umode, 'o' ) )  		irc_write( irc, ":%s NOTICE %s :*** OperMsg *** %s", irc->myhost, irc->nick, cmd[1] ); -	 -	return 1;  } -static int ipc_child_cmd_rehash( irc_t *irc, char **cmd ) +static void ipc_child_cmd_rehash( irc_t *irc, char **cmd )  {  	runmode_t oldmode; @@ -144,23 +127,18 @@ static int ipc_child_cmd_rehash( irc_t *irc, char **cmd )  	global.conf = conf_load( 0, NULL );  	global.conf->runmode = oldmode; -	 -	return 1;  } -static int ipc_child_cmd_kill( irc_t *irc, char **cmd ) +static void ipc_child_cmd_kill( irc_t *irc, char **cmd )  {  	if( irc->status < USTATUS_LOGGED_IN ) -		return 1; +		return;  	if( nick_cmp( cmd[1], irc->nick ) != 0 ) -		return 1;	/* It's not for us. */ +		return;		/* It's not for us. */  	irc_write( irc, ":%s!%s@%s KILL %s :%s", irc->mynick, irc->mynick, irc->myhost, irc->nick, cmd[2] ); -	irc_abort( irc ); -	/* g_io_channel_close( irc->io_channel ); */ -	 -	return 0; +	irc_abort( irc, 0, "Killed by operator: %s", cmd[2] );  }  static const command_t ipc_child_commands[] = { @@ -51,7 +51,7 @@ void ipc_to_children( char **cmd );  void ipc_to_children_str( char *format, ... );  /* We need this function in inetd mode, so let's just make it non-static. */ -int ipc_master_cmd_rehash( irc_t *data, char **cmd ); +void ipc_master_cmd_rehash( irc_t *data, char **cmd );  extern GSList *child_list; @@ -151,23 +151,25 @@ irc_t *irc_new( int fd )  	return( irc );  } +/* immed=1 makes this function pretty much equal to irc_free(), except that +   this one will "log". In case the connection is already broken and we +   shouldn't try to write to it. */  void irc_abort( irc_t *irc, int immed, char *format, ... )  { -	va_list params; -	  	if( format != NULL )  	{ +		va_list params;  		char *reason;  		va_start( params, format ); -		reason = g_strdup_printf( format, params ); +		reason = g_strdup_vprintf( format, params );  		va_end( params );  		if( !immed )  			irc_write( irc, "ERROR :Closing link: %s", reason );  		ipc_to_master_str( "OPERMSG :Client exiting: %s@%s [%s]\r\n", -	                           irc->nick, irc->host, reason" ); +	                           irc->nick ? irc->nick : "(NONE)", irc->host, reason );  		g_free( reason );  	} @@ -177,7 +179,7 @@ void irc_abort( irc_t *irc, int immed, char *format, ... )  			irc_write( irc, "ERROR :Closing link" );  		ipc_to_master_str( "OPERMSG :Client exiting: %s@%s [%s]\r\n", -	        	           irc->nick, irc->host, "No reason given" ); +	        	           irc->nick ? irc->nick : "(NONE)", irc->host, "No reason given" );  	}  	irc->status = USTATUS_SHUTDOWN; @@ -338,7 +340,7 @@ void irc_setpass (irc_t *irc, const char *pass)  	}  } -int irc_process( irc_t *irc ) +void irc_process( irc_t *irc )  {  	char **lines, *temp, **cmd;  	int i; @@ -360,14 +362,16 @@ int irc_process( irc_t *irc )  			if( ( cmd = irc_parse_line( lines[i] ) ) == NULL )  				continue; -			if( !irc_exec( irc, cmd ) ) +			irc_exec( irc, cmd ); +			 +			g_free( cmd ); +			 +			/* Shouldn't really happen, but just in case... */ +			if( !g_slist_find( irc_connection_list, irc ) )  			{ -				g_free( cmd );  				g_free( lines ); -				return 0; +				return;  			} -			 -			g_free( cmd );  		}  		if( lines[i] != NULL ) @@ -378,8 +382,6 @@ int irc_process( irc_t *irc )  		g_free( lines );  	} -	 -	return 1;	  }  char **irc_tokenize( char *buffer ) @@ -971,7 +973,10 @@ int irc_send( irc_t *irc, char *nick, char *s, int flags )  		}  		if( u->send_handler ) -			return( u->send_handler( irc, u, s, flags ) ); +		{ +			u->send_handler( irc, u, s, flags ); +			return 1; +		}  	}  	else if( c && c->gc && c->gc->prpl )  	{ @@ -997,9 +1002,9 @@ gboolean buddy_send_handler_delayed( gpointer data )  	return( FALSE );  } -int buddy_send_handler( irc_t *irc, user_t *u, char *msg, int flags ) +void buddy_send_handler( irc_t *irc, user_t *u, char *msg, int flags )  { -	if( !u || !u->gc ) return( 0 ); +	if( !u || !u->gc ) return;  	if( set_getint( irc, "buddy_sendbuffer" ) && set_getint( irc, "buddy_sendbuffer_delay" ) > 0 )  	{ @@ -1035,12 +1040,10 @@ int buddy_send_handler( irc_t *irc, user_t *u, char *msg, int flags )  		if( u->sendbuf_timer > 0 )  			g_source_remove( u->sendbuf_timer );  		u->sendbuf_timer = g_timeout_add( delay, buddy_send_handler_delayed, u ); -		 -		return( 1 );  	}  	else  	{ -		return( serv_send_im( irc, u, msg, flags ) ); +		serv_send_im( irc, u, msg, flags );  	}  } @@ -1145,7 +1148,7 @@ static gboolean irc_userping( gpointer _irc )  	if( rv > 0 )  	{ -		irc_abort( irc, "ERROR :Closing Link: Ping Timeout: %d seconds", rv ); +		irc_abort( irc, 0, "Ping Timeout: %d seconds", rv );  		return FALSE;  	} @@ -107,8 +107,8 @@ irc_t *irc_new( int fd );  void irc_abort( irc_t *irc, int immed, char *format, ... );  void irc_free( irc_t *irc ); -int irc_exec( irc_t *irc, char **cmd ); -int irc_process( irc_t *irc ); +void irc_exec( irc_t *irc, char **cmd ); +void irc_process( irc_t *irc );  char **irc_parse_line( char *line );  char *irc_build_line( char **cmd ); @@ -133,7 +133,6 @@ void irc_kick( irc_t *irc, user_t *u, char *channel, user_t *kicker );  void irc_kill( irc_t *irc, user_t *u );  void irc_invite( irc_t *irc, char *nick, char *channel );  void irc_whois( irc_t *irc, char *nick ); -int irc_away( irc_t *irc, char *away );  void irc_setpass( irc_t *irc, const char *pass ); /* USE WITH CAUTION! */  int irc_send( irc_t *irc, char *nick, char *s, int flags ); @@ -141,6 +140,6 @@ int irc_privmsg( irc_t *irc, user_t *u, char *type, char *to, char *prefix, char  int irc_msgfrom( irc_t *irc, char *nick, char *msg );  int irc_noticefrom( irc_t *irc, char *nick, char *msg ); -int buddy_send_handler( irc_t *irc, user_t *u, char *msg, int flags ); +void buddy_send_handler( irc_t *irc, user_t *u, char *msg, int flags );  #endif diff --git a/irc_commands.c b/irc_commands.c index e31a92e8..e4dc4f3e 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -27,7 +27,7 @@  #include "bitlbee.h"  #include "ipc.h" -static int irc_cmd_pass( irc_t *irc, char **cmd ) +static void irc_cmd_pass( irc_t *irc, char **cmd )  {  	if( global.conf->auth_pass && strcmp( cmd[1], global.conf->auth_pass ) == 0 )  	{ @@ -38,21 +38,17 @@ static int irc_cmd_pass( irc_t *irc, char **cmd )  	{  		irc_reply( irc, 464, ":Incorrect password" );  	} -	 -	return( 1 );  } -static int irc_cmd_user( irc_t *irc, char **cmd ) +static void irc_cmd_user( irc_t *irc, char **cmd )  {  	irc->user = g_strdup( cmd[1] );  	irc->realname = g_strdup( cmd[4] );  	irc_check_login( irc ); -	 -	return( 1 );  } -static int irc_cmd_nick( irc_t *irc, char **cmd ) +static void irc_cmd_nick( irc_t *irc, char **cmd )  {  	if( irc->nick )  	{ @@ -74,26 +70,22 @@ static int irc_cmd_nick( irc_t *irc, char **cmd )  		irc_check_login( irc );  	} -	 -	return( 1 );  } -static int irc_cmd_quit( irc_t *irc, char **cmd ) +static void irc_cmd_quit( irc_t *irc, char **cmd )  { -	irc_write( irc, "ERROR :%s%s", cmd[1]?"Quit: ":"", cmd[1]?cmd[1]:"Client Quit" ); -	/* g_io_channel_close( irc->io_channel ); */ -	 -	return( 0 ); +	if( cmd[1] && *cmd[1] ) +		irc_abort( irc, 0, "Quit: %s", cmd[1] ); +	else +		irc_abort( irc, 0, "Leaving..." );  } -static int irc_cmd_ping( irc_t *irc, char **cmd ) +static void irc_cmd_ping( irc_t *irc, char **cmd )  {  	irc_write( irc, ":%s PONG %s :%s", irc->myhost, irc->myhost, cmd[1]?cmd[1]:irc->myhost ); -	 -	return( 1 );  } -static int irc_cmd_oper( irc_t *irc, char **cmd ) +static void irc_cmd_oper( irc_t *irc, char **cmd )  {  	if( global.conf->oper_pass && strcmp( cmd[2], global.conf->oper_pass ) == 0 )  	{ @@ -104,11 +96,9 @@ static int irc_cmd_oper( irc_t *irc, char **cmd )  	{  		irc_reply( irc, 432, ":Incorrect password" );  	} -	 -	return( 1 );  } -static int irc_cmd_mode( irc_t *irc, char **cmd ) +static void irc_cmd_mode( irc_t *irc, char **cmd )  {  	if( *cmd[1] == '#' || *cmd[1] == '&' )  	{ @@ -132,18 +122,14 @@ static int irc_cmd_mode( irc_t *irc, char **cmd )  		else  			irc_reply( irc, 502, ":Don't touch their modes" );  	} -	 -	return( 1 );  } -static int irc_cmd_names( irc_t *irc, char **cmd ) +static void irc_cmd_names( irc_t *irc, char **cmd )  {  	irc_names( irc, cmd[1]?cmd[1]:irc->channel ); -	 -	return( 1 );  } -static int irc_cmd_part( irc_t *irc, char **cmd ) +static void irc_cmd_part( irc_t *irc, char **cmd )  {  	struct conversation *c; @@ -171,11 +157,9 @@ static int irc_cmd_part( irc_t *irc, char **cmd )  	{  		irc_reply( irc, 403, "%s :No such channel", cmd[1] );  	} -	 -	return( 1 );  } -static int irc_cmd_join( irc_t *irc, char **cmd ) +static void irc_cmd_join( irc_t *irc, char **cmd )  {  	if( g_strcasecmp( cmd[1], irc->channel ) == 0 )  		; /* Dude, you're already there... @@ -209,11 +193,9 @@ static int irc_cmd_join( irc_t *irc, char **cmd )  			irc_reply( irc, 403, "%s :No such channel", cmd[1] );  		}  	} -	 -	return( 1 );  } -static int irc_cmd_invite( irc_t *irc, char **cmd ) +static void irc_cmd_invite( irc_t *irc, char **cmd )  {  	char *nick = cmd[1], *channel = cmd[2];  	struct conversation *c = conv_findchannel( channel ); @@ -224,15 +206,13 @@ static int irc_cmd_invite( irc_t *irc, char **cmd )  		{  			c->gc->prpl->chat_invite( c->gc, c->id, "", u->handle );  			irc_reply( irc, 341, "%s %s", nick, channel ); -			return( 1 ); +			return;  		}  	irc_reply( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel ); -	 -	return( 1 );  } -static int irc_cmd_privmsg( irc_t *irc, char **cmd ) +static void irc_cmd_privmsg( irc_t *irc, char **cmd )  {  	if ( !cmd[2] )   	{ @@ -282,11 +262,9 @@ static int irc_cmd_privmsg( irc_t *irc, char **cmd )  		}  		irc_send( irc, cmd[1], cmd[2], ( g_strcasecmp( cmd[0], "NOTICE" ) == 0 ) ? IM_FLAG_AWAY : 0 );  	} -	 -	return( 1 );  } -static int irc_cmd_who( irc_t *irc, char **cmd ) +static void irc_cmd_who( irc_t *irc, char **cmd )  {  	char *channel = cmd[1];  	user_t *u = irc->users; @@ -316,11 +294,9 @@ static int irc_cmd_who( irc_t *irc, char **cmd )  		irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname );  	irc_reply( irc, 315, "%s :End of /WHO list", channel?channel:"**" ); -	 -	return( 1 );  } -static int irc_cmd_userhost( irc_t *irc, char **cmd ) +static void irc_cmd_userhost( irc_t *irc, char **cmd )  {  	user_t *u;  	int i; @@ -339,11 +315,9 @@ static int irc_cmd_userhost( irc_t *irc, char **cmd )  			else  				irc_reply( irc, 302, ":%s=+%s@%s", u->nick, u->user, u->host );  		} -	 -	return( 1 );  } -static int irc_cmd_ison( irc_t *irc, char **cmd ) +static void irc_cmd_ison( irc_t *irc, char **cmd )  {  	user_t *u;  	char buff[IRC_MAX_LINE]; @@ -382,11 +356,9 @@ static int irc_cmd_ison( irc_t *irc, char **cmd )  		buff[strlen(buff)-1] = '\0';  	irc_reply( irc, 303, ":%s", buff ); -	 -	return( 1 );  } -static int irc_cmd_watch( irc_t *irc, char **cmd ) +static void irc_cmd_watch( irc_t *irc, char **cmd )  {  	int i; @@ -429,27 +401,23 @@ static int irc_cmd_watch( irc_t *irc, char **cmd )  			}  		}  	} -	 -	return( 1 );  } -static int irc_cmd_topic( irc_t *irc, char **cmd ) +static void irc_cmd_topic( irc_t *irc, char **cmd )  {  	if( cmd[2] )  		irc_reply( irc, 482, "%s :Cannot change topic", cmd[1] );  	else  		irc_topic( irc, cmd[1] ); -	 -	return( 1 );  } -static int irc_cmd_away( irc_t *irc, char **cmd ) +static void irc_cmd_away( irc_t *irc, char **cmd )  {  	user_t *u = user_find( irc, irc->nick );  	GSList *c = get_connections();  	char *away = cmd[1]; -	if( !u ) return( 1 ); +	if( !u ) return;  	if( away && *away )  	{ @@ -481,11 +449,9 @@ static int irc_cmd_away( irc_t *irc, char **cmd )  		c = c->next;  	} -	 -	return( 1 );  } -static int irc_cmd_whois( irc_t *irc, char **cmd ) +static void irc_cmd_whois( irc_t *irc, char **cmd )  {  	char *nick = cmd[1];  	user_t *u = user_find( irc, nick ); @@ -511,11 +477,9 @@ static int irc_cmd_whois( irc_t *irc, char **cmd )  	{  		irc_reply( irc, 401, "%s :Nick does not exist", nick );  	} -	 -	return( 1 );  } -static int irc_cmd_whowas( irc_t *irc, char **cmd ) +static void irc_cmd_whowas( irc_t *irc, char **cmd )  {  	/* For some reason irssi tries a whowas when whois fails. We can  	   ignore this, but then the user never gets a "user not found" @@ -524,37 +488,29 @@ static int irc_cmd_whowas( irc_t *irc, char **cmd )  	irc_reply( irc, 406, "%s :Nick does not exist", cmd[1] );  	irc_reply( irc, 369, "%s :End of WHOWAS", cmd[1] ); -	 -	return( 1 );  } -static int irc_cmd_nickserv( irc_t *irc, char **cmd ) +static void irc_cmd_nickserv( irc_t *irc, char **cmd )  {  	/* [SH] This aliases the NickServ command to PRIVMSG root */  	/* [TV] This aliases the NS command to PRIVMSG root as well */  	root_command( irc, cmd + 1 ); -	 -	return( 1 );  } -static int irc_cmd_motd( irc_t *irc, char **cmd ) +static void irc_cmd_motd( irc_t *irc, char **cmd )  {  	irc_motd( irc ); -	 -	return( 1 );  } -static int irc_cmd_pong( irc_t *irc, char **cmd ) +static void irc_cmd_pong( irc_t *irc, char **cmd )  {  	/* We could check the value we get back from the user, but in  	   fact we don't care, we're just happy he's still alive. */  	irc->last_pong = gettime();  	irc->pinging = 0; -	 -	return( 1 );  } -static int irc_cmd_completions( irc_t *irc, char **cmd ) +static void irc_cmd_completions( irc_t *irc, char **cmd )  {  	user_t *u = user_find( irc, irc->mynick );  	help_t *h; @@ -573,11 +529,9 @@ static int irc_cmd_completions( irc_t *irc, char **cmd )  		irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS set ", s->key );  	irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "END" ); -	 -	return( 1 );  } -static int irc_cmd_rehash( irc_t *irc, char **cmd ) +static void irc_cmd_rehash( irc_t *irc, char **cmd )  {  	if( global.conf->runmode == RUNMODE_INETD )  		ipc_master_cmd_rehash( NULL, NULL ); @@ -585,8 +539,6 @@ static int irc_cmd_rehash( irc_t *irc, char **cmd )  		ipc_to_master( cmd );  	irc_reply( irc, 382, "%s :Rehashing", CONF_FILE ); -	 -	return( 1 );  }  static const command_t irc_commands[] = { @@ -624,12 +576,12 @@ static const command_t irc_commands[] = {  	{ NULL }  }; -int irc_exec( irc_t *irc, char *cmd[] ) +void irc_exec( irc_t *irc, char *cmd[] )  {	 -	int i, j; +	int i;  	if( !cmd[0] ) -		return( 1 ); +		return;  	for( i = 0; irc_commands[i].command; i++ )  		if( g_strcasecmp( irc_commands[i].command, cmd[0] ) == 0 ) @@ -637,33 +589,30 @@ int irc_exec( irc_t *irc, char *cmd[] )  			if( irc_commands[i].flags & IRC_CMD_PRE_LOGIN && irc->status >= USTATUS_LOGGED_IN )  			{  				irc_reply( irc, 462, ":Only allowed before logging in" ); -				return( 1 );  			} -			if( irc_commands[i].flags & IRC_CMD_LOGGED_IN && irc->status < USTATUS_LOGGED_IN ) +			else if( irc_commands[i].flags & IRC_CMD_LOGGED_IN && irc->status < USTATUS_LOGGED_IN )  			{  				irc_reply( irc, 451, ":Register first" ); -				return( 1 );  			} -			if( irc_commands[i].flags & IRC_CMD_OPER_ONLY && !strchr( irc->umode, 'o' ) ) +			else if( irc_commands[i].flags & IRC_CMD_OPER_ONLY && !strchr( irc->umode, 'o' ) )  			{  				irc_reply( irc, 481, ":Permission denied - You're not an IRC operator" ); -				return( 1 );  			} -			 -			for( j = 1; j <= irc_commands[i].required_parameters; j ++ ) -				if( !cmd[j] ) -				{ -					irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -					return( 1 ); -				} -			 -			if( irc_commands[i].flags & IRC_CMD_TO_MASTER ) +			else if( !cmd[irc_commands[i].required_parameters] ) +			{ +				irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); +			} +			else if( irc_commands[i].flags & IRC_CMD_TO_MASTER ) +			{  				/* IPC doesn't make sense in inetd mode,  				    but the function will catch that. */  				ipc_to_master( cmd ); +			}  			else -				return irc_commands[i].execute( irc, cmd ); +			{ +				irc_commands[i].execute( irc, cmd ); +			} +			 +			break;  		} -	 -	return( 1 );  } diff --git a/commands.c b/root_commands.c index fbe378f6..426cf6e8 100644 --- a/commands.c +++ b/root_commands.c @@ -31,7 +31,7 @@  #include <string.h> -int root_command_string( irc_t *irc, user_t *u, char *command, int flags ) +void root_command_string( irc_t *irc, user_t *u, char *command, int flags )  {  	char *cmd[IRC_MAX_ARGS];  	char *s; @@ -63,15 +63,15 @@ int root_command_string( irc_t *irc, user_t *u, char *command, int flags )  		}  	cmd[k] = NULL; -	return( root_command( irc, cmd ) ); +	root_command( irc, cmd );  } -int root_command( irc_t *irc, char *cmd[] ) +void root_command( irc_t *irc, char *cmd[] )  {	  	int i;  	if( !cmd[0] ) -		return( 0 ); +		return;  	for( i = 0; commands[i].command; i++ )  		if( g_strcasecmp( commands[i].command, cmd[0] ) == 0 ) @@ -79,18 +79,16 @@ int root_command( irc_t *irc, char *cmd[] )  			if( !cmd[commands[i].required_parameters] )  			{  				irc_usermsg( irc, "Not enough parameters given (need %d)", commands[i].required_parameters ); -				return( 0 ); +				return;  			}  			commands[i].execute( irc, cmd ); -			return( 1 ); +			return;  		}  	irc_usermsg( irc, "Unknown command: %s. Please use \x02help commands\x02 to get a list of available commands.", cmd[0] ); -	 -	return( 1 );  } -static int cmd_help( irc_t *irc, char **cmd ) +static void cmd_help( irc_t *irc, char **cmd )  {  	char param[80];  	int i; @@ -110,16 +108,14 @@ static int cmd_help( irc_t *irc, char **cmd )  	{  		irc_usermsg( irc, "%s", s );  		g_free( s ); -		return( 1 );  	}  	else  	{  		irc_usermsg( irc, "Error opening helpfile." ); -		return( 0 );  	}  } -static int cmd_identify( irc_t *irc, char **cmd ) +static void cmd_identify( irc_t *irc, char **cmd )  {  	storage_status_t status = storage_load( irc->nick, cmd[1], irc ); @@ -138,16 +134,14 @@ static int cmd_identify( irc_t *irc, char **cmd )  		irc_usermsg( irc, "Something very weird happened" );  		break;  	} - -	return( 0 );  } -static int cmd_register( irc_t *irc, char **cmd ) +static void cmd_register( irc_t *irc, char **cmd )  {  	if( global.conf->authmode == AUTHMODE_REGISTERED )  	{  		irc_usermsg( irc, "This server does not allow registering new accounts" ); -		return( 0 ); +		return;  	}  	irc_setpass( irc, cmd[1] ); @@ -165,11 +159,9 @@ static int cmd_register( irc_t *irc, char **cmd )  			irc_usermsg( irc, "Error registering" );  			break;  	} -	 -	return( 0 );  } -static int cmd_drop( irc_t *irc, char **cmd ) +static void cmd_drop( irc_t *irc, char **cmd )  {  	storage_status_t status; @@ -177,30 +169,30 @@ static int cmd_drop( irc_t *irc, char **cmd )  	switch (status) {  	case STORAGE_NO_SUCH_USER:  		irc_usermsg( irc, "That account does not exist" ); -		return( 0 ); +		break;  	case STORAGE_INVALID_PASSWORD:  		irc_usermsg( irc, "Password invalid" ); -		return( 0 ); +		break;  	case STORAGE_OK:  		irc_setpass( irc, NULL );  		irc->status = USTATUS_LOGGED_IN;  		irc_umode_set( irc, "-R", 1 );  		irc_usermsg( irc, "Account `%s' removed", irc->nick ); -		return( 0 ); +		break;  	default:  		irc_usermsg( irc, "Error: '%d'", status ); -		return( 0 ); +		break;  	}  } -static int cmd_account( irc_t *irc, char **cmd ) +static void cmd_account( irc_t *irc, char **cmd )  {  	account_t *a;  	if( global.conf->authmode == AUTHMODE_REGISTERED && irc->status < USTATUS_IDENTIFIED )  	{  		irc_usermsg( irc, "This server only accepts registered users" ); -		return( 0 ); +		return;  	}  	if( g_strcasecmp( cmd[1], "add" ) == 0 ) @@ -210,7 +202,7 @@ static int cmd_account( irc_t *irc, char **cmd )  		if( cmd[2] == NULL || cmd[3] == NULL || cmd[4] == NULL )  		{  			irc_usermsg( irc, "Not enough parameters" ); -			return( 0 ); +			return;  		}  		prpl = find_protocol(cmd[2]); @@ -218,7 +210,7 @@ static int cmd_account( irc_t *irc, char **cmd )  		if( prpl == NULL )  		{  			irc_usermsg( irc, "Unknown protocol" ); -			return( 0 ); +			return;  		}  		a = account_add( irc, prpl, cmd[3], cmd[4] ); @@ -280,7 +272,7 @@ static int cmd_account( irc_t *irc, char **cmd )  				if( a->gc )  				{  					irc_usermsg( irc, "Account already online" ); -					return( 0 ); +					return;  				}  				else  				{ @@ -290,7 +282,7 @@ static int cmd_account( irc_t *irc, char **cmd )  			else  			{  				irc_usermsg( irc, "Invalid account" ); -				return( 0 ); +				return;  			}  		}  		else @@ -336,36 +328,34 @@ static int cmd_account( irc_t *irc, char **cmd )  			else  			{  				irc_usermsg( irc, "Account already offline" ); -				return( 0 ); +				return;  			}  		}  		else  		{  			irc_usermsg( irc, "Invalid account" ); -			return( 0 ); +			return;  		}  	}  	else  	{  		irc_usermsg( irc, "Unknown command: account %s. Please use \x02help commands\x02 to get a list of available commands.", cmd[1] );  	} -	 -	return( 1 );  } -static int cmd_add( irc_t *irc, char **cmd ) +static void cmd_add( irc_t *irc, char **cmd )  {  	account_t *a;  	if( !( a = account_get( irc, cmd[1] ) ) )  	{  		irc_usermsg( irc, "Invalid account" ); -		return( 1 ); +		return;  	}  	else if( !( a->gc && ( a->gc->flags & OPT_LOGGED_IN ) ) )  	{  		irc_usermsg( irc, "That account is not on-line" ); -		return( 1 ); +		return;  	}  	if( cmd[3] ) @@ -373,12 +363,12 @@ static int cmd_add( irc_t *irc, char **cmd )  		if( !nick_ok( cmd[3] ) )  		{  			irc_usermsg( irc, "The requested nick `%s' is invalid", cmd[3] ); -			return( 0 ); +			return;  		}  		else if( user_find( irc, cmd[3] ) )  		{  			irc_usermsg( irc, "The requested nick `%s' already exists", cmd[3] ); -			return( 0 ); +			return;  		}  		else  		{ @@ -389,11 +379,9 @@ static int cmd_add( irc_t *irc, char **cmd )  	add_buddy( a->gc, NULL, cmd[2], cmd[2] );  	irc_usermsg( irc, "User `%s' added to your contact list as `%s'", cmd[2], user_findhandle( a->gc, cmd[2] )->nick ); -	 -	return( 0 );  } -static int cmd_info( irc_t *irc, char **cmd ) +static void cmd_info( irc_t *irc, char **cmd )  {  	struct gaim_connection *gc;  	account_t *a; @@ -404,7 +392,7 @@ static int cmd_info( irc_t *irc, char **cmd )  		if( !u || !u->gc )  		{  			irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] ); -			return( 1 ); +			return;  		}  		gc = u->gc;  		cmd[2] = u->handle; @@ -412,66 +400,63 @@ static int cmd_info( irc_t *irc, char **cmd )  	else if( !( a = account_get( irc, cmd[1] ) ) )  	{  		irc_usermsg( irc, "Invalid account" ); -		return( 1 ); +		return;  	}  	else if( !( ( gc = a->gc ) && ( a->gc->flags & OPT_LOGGED_IN ) ) )  	{  		irc_usermsg( irc, "That account is not on-line" ); -		return( 1 ); +		return;  	}  	if( !gc->prpl->get_info )  	{  		irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] ); -		return( 1 );  	} -	gc->prpl->get_info( gc, cmd[2] ); -	 -	return( 0 ); +	else +	{ +		gc->prpl->get_info( gc, cmd[2] ); +	}  } -static int cmd_rename( irc_t *irc, char **cmd ) +static void cmd_rename( irc_t *irc, char **cmd )  {  	user_t *u;  	if( g_strcasecmp( cmd[1], irc->nick ) == 0 )  	{  		irc_usermsg( irc, "Nick `%s' can't be changed", cmd[1] ); -		return( 1 );  	} -	if( user_find( irc, cmd[2] ) && ( nick_cmp( cmd[1], cmd[2] ) != 0 ) ) +	else if( user_find( irc, cmd[2] ) && ( nick_cmp( cmd[1], cmd[2] ) != 0 ) )  	{  		irc_usermsg( irc, "Nick `%s' already exists", cmd[2] ); -		return( 1 );  	} -	if( !nick_ok( cmd[2] ) ) +	else if( !nick_ok( cmd[2] ) )  	{  		irc_usermsg( irc, "Nick `%s' is invalid", cmd[2] ); -		return( 1 );  	} -	if( !( u = user_find( irc, cmd[1] ) ) ) +	else if( !( u = user_find( irc, cmd[1] ) ) )  	{  		irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] ); -		return( 1 ); -	} -	user_rename( irc, cmd[1], cmd[2] ); -	irc_write( irc, ":%s!%s@%s NICK %s", cmd[1], u->user, u->host, cmd[2] ); -	if( g_strcasecmp( cmd[1], irc->mynick ) == 0 ) -	{ -		g_free( irc->mynick ); -		irc->mynick = g_strdup( cmd[2] );  	} -	else if( u->send_handler == buddy_send_handler ) +	else  	{ -		nick_set( irc, u->handle, u->gc->prpl, cmd[2] ); +		user_rename( irc, cmd[1], cmd[2] ); +		irc_write( irc, ":%s!%s@%s NICK %s", cmd[1], u->user, u->host, cmd[2] ); +		if( g_strcasecmp( cmd[1], irc->mynick ) == 0 ) +		{ +			g_free( irc->mynick ); +			irc->mynick = g_strdup( cmd[2] ); +		} +		else if( u->send_handler == buddy_send_handler ) +		{ +			nick_set( irc, u->handle, u->gc->prpl, cmd[2] ); +		} +		 +		irc_usermsg( irc, "Nick successfully changed" );  	} -	 -	irc_usermsg( irc, "Nick successfully changed" ); -	 -	return( 0 );  } -static int cmd_remove( irc_t *irc, char **cmd ) +static void cmd_remove( irc_t *irc, char **cmd )  {  	user_t *u;  	char *s; @@ -479,7 +464,7 @@ static int cmd_remove( irc_t *irc, char **cmd )  	if( !( u = user_find( irc, cmd[1] ) ) || !u->gc )  	{  		irc_usermsg( irc, "Buddy `%s' not found", cmd[1] ); -		return( 1 ); +		return;  	}  	s = g_strdup( u->handle ); @@ -490,10 +475,10 @@ static int cmd_remove( irc_t *irc, char **cmd )  	irc_usermsg( irc, "Buddy `%s' (nick %s) removed from contact list", s, cmd[1] );  	g_free( s ); -	return( 0 ); +	return;  } -static int cmd_block( irc_t *irc, char **cmd ) +static void cmd_block( irc_t *irc, char **cmd )  {  	struct gaim_connection *gc;  	account_t *a; @@ -504,7 +489,7 @@ static int cmd_block( irc_t *irc, char **cmd )  		if( !u || !u->gc )  		{  			irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] ); -			return( 1 ); +			return;  		}  		gc = u->gc;  		cmd[2] = u->handle; @@ -512,12 +497,12 @@ static int cmd_block( irc_t *irc, char **cmd )  	else if( !( a = account_get( irc, cmd[1] ) ) )  	{  		irc_usermsg( irc, "Invalid account" ); -		return( 1 ); +		return;  	}  	else if( !( ( gc = a->gc ) && ( a->gc->flags & OPT_LOGGED_IN ) ) )  	{  		irc_usermsg( irc, "That account is not on-line" ); -		return( 1 ); +		return;  	}  	if( !gc->prpl->add_deny || !gc->prpl->rem_permit ) @@ -530,11 +515,9 @@ static int cmd_block( irc_t *irc, char **cmd )  		gc->prpl->add_deny( gc, cmd[2] );  		irc_usermsg( irc, "Buddy `%s' moved from your permit- to your deny-list", cmd[2] );  	} -	 -	return( 0 );  } -static int cmd_allow( irc_t *irc, char **cmd ) +static void cmd_allow( irc_t *irc, char **cmd )  {  	struct gaim_connection *gc;  	account_t *a; @@ -545,7 +528,7 @@ static int cmd_allow( irc_t *irc, char **cmd )  		if( !u || !u->gc )  		{  			irc_usermsg( irc, "Nick `%s' does not exist", cmd[1] ); -			return( 1 ); +			return;  		}  		gc = u->gc;  		cmd[2] = u->handle; @@ -553,12 +536,12 @@ static int cmd_allow( irc_t *irc, char **cmd )  	else if( !( a = account_get( irc, cmd[1] ) ) )  	{  		irc_usermsg( irc, "Invalid account" ); -		return( 1 ); +		return;  	}  	else if( !( ( gc = a->gc ) && ( a->gc->flags & OPT_LOGGED_IN ) ) )  	{  		irc_usermsg( irc, "That account is not on-line" ); -		return( 1 ); +		return;  	}  	if( !gc->prpl->rem_deny || !gc->prpl->add_permit ) @@ -572,11 +555,9 @@ static int cmd_allow( irc_t *irc, char **cmd )  		irc_usermsg( irc, "Buddy `%s' moved from your deny- to your permit-list", cmd[2] );  	} -	 -	return( 0 );  } -static int cmd_yesno( irc_t *irc, char **cmd ) +static void cmd_yesno( irc_t *irc, char **cmd )  {  	query_t *q = NULL;  	int numq = 0; @@ -584,7 +565,7 @@ static int cmd_yesno( irc_t *irc, char **cmd )  	if( irc->queries == NULL )  	{  		irc_usermsg( irc, "Did I ask you something?" ); -		return( 0 ); +		return;  	}  	/* If there's an argument, the user seems to want to answer another question than the @@ -594,7 +575,7 @@ static int cmd_yesno( irc_t *irc, char **cmd )  		if( sscanf( cmd[1], "%d", &numq ) != 1 )  		{  			irc_usermsg( irc, "Invalid query number" ); -			return( 0 ); +			return;  		}  		for( q = irc->queries; q; q = q->next, numq -- ) @@ -604,7 +585,7 @@ static int cmd_yesno( irc_t *irc, char **cmd )  		if( !q )  		{  			irc_usermsg( irc, "Uhm, I never asked you something like that..." ); -			return( 0 ); +			return;  		}  	} @@ -612,11 +593,9 @@ static int cmd_yesno( irc_t *irc, char **cmd )  		query_answer( irc, q, 1 );  	else if( g_strcasecmp( cmd[0], "no" ) == 0 )  		query_answer( irc, q, 0 ); -	 -	return( 1 );  } -static int cmd_set( irc_t *irc, char **cmd ) +static void cmd_set( irc_t *irc, char **cmd )  {  	if( cmd[1] && cmd[2] )  	{ @@ -638,21 +617,17 @@ static int cmd_set( irc_t *irc, char **cmd )  			s = s->next;  		}  	} -	 -	return( 0 );  } -static int cmd_save( irc_t *irc, char **cmd ) +static void cmd_save( irc_t *irc, char **cmd )  {  	if( storage_save( irc, TRUE ) == STORAGE_OK )  		irc_usermsg( irc, "Configuration saved" );  	else  		irc_usermsg( irc, "Configuration could not be saved!" ); -	 -	return( 0 );  } -static int cmd_blist( irc_t *irc, char **cmd ) +static void cmd_blist( irc_t *irc, char **cmd )  {  	int online = 0, away = 0, offline = 0;  	user_t *u; @@ -694,11 +669,9 @@ static int cmd_blist( irc_t *irc, char **cmd )  	}  	irc_usermsg( irc, "%d buddies (%d available, %d away, %d offline)", n_online + n_away + n_offline, n_online, n_away, n_offline ); -	 -	return( 0 );  } -static int cmd_nick( irc_t *irc, char **cmd )  +static void cmd_nick( irc_t *irc, char **cmd )   {  	account_t *a; @@ -730,11 +703,9 @@ static int cmd_nick( irc_t *irc, char **cmd )  		else  			a->gc->prpl->set_info( a->gc, cmd[2] );  	} -	 -	return( 1 );  } -static int cmd_qlist( irc_t *irc, char **cmd ) +static void cmd_qlist( irc_t *irc, char **cmd )  {  	query_t *q = irc->queries;  	int num; @@ -742,7 +713,7 @@ static int cmd_qlist( irc_t *irc, char **cmd )  	if( !q )  	{  		irc_usermsg( irc, "There are no pending questions." ); -		return( 0 ); +		return;  	}  	irc_usermsg( irc, "Pending queries:" ); @@ -752,11 +723,9 @@ static int cmd_qlist( irc_t *irc, char **cmd )  			irc_usermsg( irc, "%d, %s(%s): %s", num, q->gc->prpl->name, q->gc->username, q->question );  		else  			irc_usermsg( irc, "%d, BitlBee: %s", num, q->question ); -	 -	return( 0 );  } -static int cmd_import_buddies( irc_t *irc, char **cmd ) +static void cmd_import_buddies( irc_t *irc, char **cmd )  {  	struct gaim_connection *gc;  	account_t *a; @@ -765,12 +734,12 @@ static int cmd_import_buddies( irc_t *irc, char **cmd )  	if( !( a = account_get( irc, cmd[1] ) ) )  	{  		irc_usermsg( irc, "Invalid account" ); -		return( 0 ); +		return;  	}  	else if( !( ( gc = a->gc ) && ( a->gc->flags & OPT_LOGGED_IN ) ) )  	{  		irc_usermsg( irc, "That account is not on-line" ); -		return( 0 ); +		return;  	}  	if( cmd[2] ) @@ -791,7 +760,7 @@ static int cmd_import_buddies( irc_t *irc, char **cmd )  		else  		{  			irc_usermsg( irc, "Invalid argument: %s", cmd[2] ); -			return( 0 ); +			return;  		}  	} @@ -805,8 +774,6 @@ static int cmd_import_buddies( irc_t *irc, char **cmd )  	}  	irc_usermsg( irc, "Sent all add requests. Please wait for a while, the server needs some time to handle all the adds." ); -	 -	return( 0 );  }  const command_t commands[] = { @@ -44,7 +44,7 @@ typedef struct __USER   	guint sendbuf_timer;      	int sendbuf_flags; -	int (*send_handler) ( irc_t *irc, struct __USER *u, char *msg, int flags ); +	void (*send_handler) ( irc_t *irc, struct __USER *u, char *msg, int flags );  	struct __USER *next;  } user_t; | 
