diff options
| author | Jelmer Vernooij <jelmer@samba.org> | 2006-01-24 12:28:13 +1300 | 
|---|---|---|
| committer | Jelmer Vernooij <jelmer@samba.org> | 2006-01-24 12:28:13 +1300 | 
| commit | 9fae35c9cf2d5a319623946705e5d7179ea5c338 (patch) | |
| tree | c489bfe332588c4fb918b4759c3f89f8b4c0a75f | |
| parent | 7308b63f3300d5b2a326edfde6c50a18bc05e3e5 (diff) | |
| parent | 68c7c145c281fe3ae734b345bf133d70d1ef8652 (diff) | |
Merge from Wilmer
40 files changed, 2136 insertions, 1816 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 irc.o log.o nick.o query.o set.o storage.o storage_text.o unix.o url.o user.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 @@ -28,61 +28,70 @@  #include "commands.h"  #include "protocols/nogaim.h"  #include "help.h" +#include "ipc.h"  #include <signal.h>  #include <stdio.h>  #include <errno.h> -gboolean bitlbee_io_new_client( GIOChannel *source, GIOCondition condition, gpointer data ) -{ -	size_t size = sizeof( struct sockaddr_in ); -	struct sockaddr_in conn_info; -	int new_socket = accept( global.listen_socket, (struct sockaddr *) &conn_info,  -		                     &size ); -	 -	log_message( LOGLVL_INFO, "Creating new connection with fd %d.", new_socket ); -	irc_new( new_socket ); - -	return TRUE; -} -  - +gboolean bitlbee_io_new_client( GIOChannel *source, GIOCondition condition, gpointer data );  int bitlbee_daemon_init()  { +#ifdef IPV6 +	struct sockaddr_in6 listen_addr; +#else  	struct sockaddr_in listen_addr; +#endif  	int i;  	GIOChannel *ch;  	log_link( LOGLVL_ERROR, LOGOUTPUT_SYSLOG );  	log_link( LOGLVL_WARNING, LOGOUTPUT_SYSLOG ); -	global.listen_socket = socket( AF_INET, SOCK_STREAM, 0 ); +	global.listen_socket = socket( AF_INETx, SOCK_STREAM, 0 );  	if( global.listen_socket == -1 )  	{  		log_error( "socket" );  		return( -1 );  	} -	listen_addr.sin_family = AF_INET; +	 +	/* TIME_WAIT (?) sucks.. */ +	i = 1; +	setsockopt( global.listen_socket, SOL_SOCKET, SO_REUSEADDR, &i, sizeof( i ) ); +	 +#ifdef IPV6 +	listen_addr.sin6_family = AF_INETx; +	listen_addr.sin6_port = htons( global.conf->port ); +	i = inet_pton( AF_INETx, ipv6_wrap( global.conf->iface ), &listen_addr.sin6_addr ); +#else +	listen_addr.sin_family = AF_INETx;  	listen_addr.sin_port = htons( global.conf->port ); -	listen_addr.sin_addr.s_addr = inet_addr( global.conf->iface ); - -	i = bind( global.listen_socket, (struct sockaddr *) &listen_addr, sizeof( struct sockaddr ) ); +	i = inet_pton( AF_INETx, global.conf->iface, &listen_addr.sin_addr ); +#endif +	 +	if( i != 1 ) +	{ +		log_message( LOGLVL_ERROR, "Couldn't parse address `%s'", global.conf->iface ); +		return( -1 ); +	} +	 +	i = bind( global.listen_socket, (struct sockaddr *) &listen_addr, sizeof( listen_addr ) );  	if( i == -1 )  	{  		log_error( "bind" );  		return( -1 );  	} - +	  	i = listen( global.listen_socket, 10 );  	if( i == -1 )  	{  		log_error( "listen" );  		return( -1 );  	} - +	  	ch = g_io_channel_unix_new( global.listen_socket ); -	g_io_add_watch( ch, G_IO_IN, bitlbee_io_new_client, NULL ); - +	global.listen_watch_source_id = g_io_add_watch( ch, G_IO_IN, bitlbee_io_new_client, NULL ); +	  #ifndef _WIN32  	if( !global.conf->nofork )  	{ @@ -123,14 +132,14 @@ gboolean bitlbee_io_current_client_read( GIOChannel *source, GIOCondition condit  	if( condition & G_IO_ERR || condition & G_IO_HUP )  	{ -		irc_free( irc ); +		irc_abort( irc, 1, "Read error" );  		return FALSE;  	}  	st = read( irc->fd, line, sizeof( line ) - 1 );  	if( st == 0 )  	{ -		irc_free( irc ); +		irc_abort( irc, 1, "Connection reset by peer" );  		return FALSE;  	}  	else if( st < 0 ) @@ -141,7 +150,7 @@ gboolean bitlbee_io_current_client_read( GIOChannel *source, GIOCondition condit  		}  		else  		{ -			irc_free( irc ); +			irc_abort( irc, 1, "Read error: %s", strerror( errno ) );  			return FALSE;  		}  	} @@ -157,18 +166,19 @@ 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_free( irc ); +		log_message( LOGLVL_WARNING, "Abnormal termination of connection with fd %d.", irc->fd );  		return FALSE;  	}   	/* Very naughty, go read the RFCs! >:) */  	if( irc->readbuffer && ( strlen( irc->readbuffer ) > 1024 ) )  	{ -		log_message( LOGLVL_ERROR, "Maximum line length exceeded." ); -		irc_free( irc ); +		irc_abort( irc, 0, "Maximum line length exceeded" );  		return FALSE;  	} @@ -180,56 +190,32 @@ gboolean bitlbee_io_current_client_write( GIOChannel *source, GIOCondition condi  	irc_t *irc = data;  	int st, size;  	char *temp; -#ifdef FLOOD_SEND -	time_t newtime; -#endif -#ifdef FLOOD_SEND	 -	newtime = time( NULL ); -	if( ( newtime - irc->oldtime ) > FLOOD_SEND_INTERVAL ) -	{ -		irc->sentbytes = 0; -		irc->oldtime = newtime; -	} -#endif -	  	if( irc->sendbuffer == NULL )  		return( FALSE );  	size = strlen( irc->sendbuffer ); -	 -#ifdef FLOOD_SEND -	if( ( FLOOD_SEND_BYTES - irc->sentbytes ) > size ) -		st = write( irc->fd, irc->sendbuffer, size ); -	else -		st = write( irc->fd, irc->sendbuffer, ( FLOOD_SEND_BYTES - irc->sentbytes ) ); -#else  	st = write( irc->fd, irc->sendbuffer, size ); -#endif -	if( st <= 0 ) +	if( st == 0 || ( st < 0 && !sockerr_again() ) )  	{ -		if( sockerr_again() ) -		{ -			return TRUE; -		} -		else -		{ -			irc_free( irc ); -			return FALSE; -		} +		irc_abort( irc, 1, "Write error: %s", strerror( errno ) ); +		return FALSE; +	} +	else if( st < 0 ) /* && sockerr_again() */ +	{ +		return TRUE;  	} -	 -#ifdef FLOOD_SEND -	irc->sentbytes += st; -#endif		  	if( st == size )  	{  		g_free( irc->sendbuffer );  		irc->sendbuffer = NULL; -		  		irc->w_watch_source_id = 0; +		 +		if( irc->status == USTATUS_SHUTDOWN ) +			irc_free( irc ); +		  		return( FALSE );  	}  	else @@ -242,143 +228,79 @@ gboolean bitlbee_io_current_client_write( GIOChannel *source, GIOCondition condi  	}  } -void bitlbee_shutdown( gpointer data ) -{ -	/* Try to save data for all active connections (if desired). */ -	while( irc_connection_list != NULL ) -		irc_free( irc_connection_list->data ); -	 -	/* We'll only reach this point when not running in inetd mode: */ -	g_main_quit( global.loop ); -} - -int root_command_string( irc_t *irc, user_t *u, char *command, int flags ) +gboolean bitlbee_io_new_client( GIOChannel *source, GIOCondition condition, gpointer data )  { -	char *cmd[IRC_MAX_ARGS]; -	char *s; -	int k; -	char q = 0; -	 -	memset( cmd, 0, sizeof( cmd ) ); -	cmd[0] = command; -	k = 1; -	for( s = command; *s && k < ( IRC_MAX_ARGS - 1 ); s ++ ) -		if( *s == ' ' && !q ) -		{ -			*s = 0; -			while( *++s == ' ' ); -			if( *s == '"' || *s == '\'' ) -			{ -				q = *s; -				s ++; -			} -			if( *s ) -			{ -				cmd[k++] = s; -				s --; -			} -		} -		else if( *s == q ) -		{ -			q = *s = 0; -		} -	cmd[k] = NULL; -	 -	return( root_command( irc, cmd ) ); -} - -int root_command( irc_t *irc, char *cmd[] ) -{	 -	int i; -	 -	if( !cmd[0] ) -		return( 0 ); +	size_t size = sizeof( struct sockaddr_in ); +	struct sockaddr_in conn_info; +	int new_socket = accept( global.listen_socket, (struct sockaddr *) &conn_info, &size ); +	pid_t client_pid = 0; -	for( i = 0; commands[i].command; i++ ) -		if( g_strcasecmp( commands[i].command, cmd[0] ) == 0 ) +	if( global.conf->runmode == RUNMODE_FORKDAEMON ) +	{ +		int fds[2]; +		 +		if( socketpair( AF_UNIX, SOCK_STREAM, 0, fds ) == -1 )  		{ -			if( !cmd[commands[i].required_parameters] ) -			{ -				irc_usermsg( irc, "Not enough parameters given (need %d)", commands[i].required_parameters ); -				return( 0 ); -			} -			commands[i].execute( irc, cmd ); -			return( 1 ); +			log_message( LOGLVL_WARNING, "Could not create IPC socket for client: %s", strerror( errno ) ); +			fds[0] = fds[1] = -1;  		} -	 -	irc_usermsg( irc, "Unknown command: %s. Please use \x02help commands\x02 to get a list of available commands.", cmd[0] ); -	 -	return( 1 ); -} - -/* Decode%20a%20file%20name						*/ -void http_decode( char *s ) -{ -	char *t; -	int i, j, k; -	 -	t = g_new( char, strlen( s ) + 1 ); -	 -	for( i = j = 0; s[i]; i ++, j ++ ) -	{ -		if( s[i] == '%' ) +		 +		sock_make_nonblocking( fds[0] ); +		sock_make_nonblocking( fds[1] ); +		 +		client_pid = fork(); +		 +		if( client_pid > 0 && fds[0] != -1 )  		{ -			if( sscanf( s + i + 1, "%2x", &k ) ) -			{ -				t[j] = k; -				i += 2; -			} -			else -			{ -				*t = 0; -				break; -			} +			struct bitlbee_child *child; +			 +			child = g_new0( struct bitlbee_child, 1 ); +			child->pid = client_pid; +			child->ipc_fd = fds[0]; +			child->ipc_inpa = gaim_input_add( child->ipc_fd, GAIM_INPUT_READ, ipc_master_read, child ); +			child_list = g_slist_append( child_list, child ); +			 +			log_message( LOGLVL_INFO, "Creating new subprocess with pid %d.", client_pid ); +			 +			/* Close some things we don't need in the parent process. */ +			close( new_socket ); +			close( fds[1] );  		} -		else +		else if( client_pid == 0 )  		{ -			t[j] = s[i]; +			irc_t *irc; +			 +			/* Close the listening socket, we're a client. */ +			close( global.listen_socket ); +			g_source_remove( global.listen_watch_source_id ); +			 +			/* Make the connection. */ +			irc = irc_new( new_socket ); +			 +			/* We can store the IPC fd there now. */ +			global.listen_socket = fds[1]; +			global.listen_watch_source_id = gaim_input_add( fds[1], GAIM_INPUT_READ, ipc_child_read, irc ); +			 +			close( fds[0] ); +			 +			ipc_master_free_all();  		}  	} -	t[j] = 0; -	 -	strcpy( s, t ); -	g_free( t ); -} - -/* Warning: This one explodes the string. Worst-cases can make the string 3x its original size! */ -/* This fuction is safe, but make sure you call it safely as well! */ -void http_encode( char *s ) -{ -	char *t; -	int i, j; -	 -	t = g_strdup( s ); -	 -	for( i = j = 0; t[i]; i ++, j ++ ) +	else  	{ -		if( t[i] <= ' ' || ((unsigned char *)t)[i] >= 128 || t[i] == '%' ) -		{ -			sprintf( s + j, "%%%02X", ((unsigned char*)t)[i] ); -			j += 2; -		} -		else -		{ -			s[j] = t[i]; -		} +		log_message( LOGLVL_INFO, "Creating new connection with fd %d.", new_socket ); +		irc_new( new_socket );  	} -	s[j] = 0; -	g_free( t ); +	return TRUE;  } -/* Strip newlines from a string. Modifies the string passed to it. */  -char *strip_newlines( char *source ) +void bitlbee_shutdown( gpointer data )  { -	int i;	 - -	for( i = 0; source[i] != '\0'; i ++ ) -		if( source[i] == '\n' || source[i] == '\r' ) -			source[i] = 32; +	/* Try to save data for all active connections (if desired). */ +	while( irc_connection_list != NULL ) +		irc_free( irc_connection_list->data ); -	return source; +	/* We'll only reach this point when not running in inetd mode: */ +	g_main_quit( global.loop );  } diff --git a/bitlbee.conf b/bitlbee.conf index b0de328d..e5e0f7de 100644 --- a/bitlbee.conf +++ b/bitlbee.conf @@ -13,13 +13,16 @@  ##    stable enough to serve lots of users from one process. Because of this  ##    and other reasons, the use of daemon-mode is *STRONGLY* discouraged,  ##    don't even *think* of reporting bugs when you use this. +##  ForkDaemon -- Run as a stand-alone daemon, but keep all clients in separate +##    child processes. This should be pretty safe and reliable to use instead +##    of inetd mode.  ##  # RunMode = Inetd  ## DaemonPort/DaemonInterface:  ## -## For RunMode=Daemon, here you can specify on what interface and port the -## daemon should be listening for connections. +## For daemon mode, you can specify on what interface and port the daemon +## should be listening for connections.  ##  # DaemonInterface = 0.0.0.0  # DaemonPort = 6667 @@ -41,12 +44,17 @@  ##  # AuthPassword = ItllBeBitlBee   ## Heh.. Our slogan. ;-) +## OperPassword +## +## Password that unlocks access to special operator commands. +## +# OperPassword = ChangeMe! +  ## HostName  ##  ## Normally, BitlBee gets a hostname using getsockname(). If you have a nicer  ## alias for your BitlBee daemon, you can set it here and BitlBee will identify -## itself with that name instead. Leave it commented out if you want BitlBee to -## use getsockname() to get a hostname. +## itself with that name instead.  ##  # HostName = localhost @@ -111,8 +111,10 @@ extern char *CONF_FILE;  #include "query.h"  #include "sock.h" -typedef struct global_t { +typedef struct global { +	/* In forked mode, child processes store the fd of the IPC socket here. */  	int listen_socket; +	gint listen_watch_source_id;  	help_t *help;  	conf_t *conf;  	GList *storage; /* The first backend in the list will be used for saving */ @@ -126,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 ); @@ -28,37 +28,21 @@  #include "bitlbee.h" -/* Hmm... Linked list? Plleeeeaaase?? ;-) */ - -typedef struct command_t +typedef struct command  {  	char *command;  	int required_parameters; -	int (*execute)(irc_t *, char **args); +	void (*execute)(irc_t *, char **args); +	int flags;  } command_t; -int cmd_account( irc_t *irc, char **cmd ); -int cmd_help( irc_t *irc, char **args); -int cmd_info( irc_t *irc, char **args); -int cmd_add( irc_t *irc, char **args) ; -int cmd_rename( irc_t *irc, char **args ); -int cmd_remove( irc_t *irc, char **args ); -int cmd_block( irc_t *irc, char **args ); -int cmd_allow( irc_t *irc, char **args ); -int cmd_save( irc_t *irc, char **args ); -int cmd_set( irc_t *irc, char **args ); -int cmd_yesno( irc_t *irc, char **args ); -int cmd_identify( irc_t *irc, char **args ); -int cmd_register( irc_t *irc, char **args ); -int cmd_drop( irc_t *irc, char **args ); -int cmd_blist( irc_t *irc, char **cmd ); -int cmd_nick( irc_t *irc, char **cmd ); -int cmd_qlist( irc_t *irc, char **cmd ); -int cmd_import_buddies( irc_t *irc, char **cmd ); -int cmd_dump( irc_t *irc, char **cmd ); - +extern const command_t commands[]; +#define IRC_CMD_PRE_LOGIN	1 +#define IRC_CMD_LOGGED_IN	2 +#define IRC_CMD_OPER_ONLY	4 +#define IRC_CMD_TO_MASTER	8 -extern command_t commands[]; +#define IPC_CMD_TO_CHILDREN	1  #endif @@ -45,19 +45,25 @@ conf_t *conf_load( int argc, char *argv[] )  	conf = g_new0( conf_t, 1 ); +#ifdef IPV6 +	conf->iface = "::"; +#else  	conf->iface = "0.0.0.0"; +#endif  	conf->port = 6667;  	conf->nofork = 0;  	conf->verbose = 0;  	conf->primary_storage = "text";  	conf->runmode = RUNMODE_INETD;  	conf->authmode = AUTHMODE_OPEN; -	conf->password = NULL; +	conf->auth_pass = NULL; +	conf->oper_pass = NULL;  	conf->configdir = g_strdup( CONFIG );  	conf->plugindir = g_strdup( PLUGINDIR );  	conf->motdfile = g_strdup( ETCDIR "/motd.txt" );  	conf->ping_interval = 180;  	conf->ping_timeout = 300; +	proxytype = 0;  	i = conf_loadini( conf, CONF_FILE );  	if( i == 0 ) @@ -70,7 +76,8 @@ conf_t *conf_load( int argc, char *argv[] )  		fprintf( stderr, "Warning: Unable to read configuration file `%s'.\n", CONF_FILE );  	} -	while( ( opt = getopt( argc, argv, "i:p:nvIDc:d:h" ) ) >= 0 ) +	while( argc > 0 && ( opt = getopt( argc, argv, "i:p:nvIDFc:d:h" ) ) >= 0 ) +	/*     ^^^^ Just to make sure we skip this step from the REHASH handler. */  	{  		if( opt == 'i' )  		{ @@ -86,13 +93,15 @@ conf_t *conf_load( int argc, char *argv[] )  			conf->port = i;  		}  		else if( opt == 'n' ) -			conf->nofork=1; +			conf->nofork = 1;  		else if( opt == 'v' ) -			conf->verbose=1; +			conf->verbose = 1;  		else if( opt == 'I' ) -			conf->runmode=RUNMODE_INETD; +			conf->runmode = RUNMODE_INETD;  		else if( opt == 'D' ) -			conf->runmode=RUNMODE_DAEMON; +			conf->runmode = RUNMODE_DAEMON; +		else if( opt == 'F' ) +			conf->runmode = RUNMODE_FORKDAEMON;  		else if( opt == 'c' )  		{  			if( strcmp( CONF_FILE, optarg ) != 0 ) @@ -100,6 +109,10 @@ conf_t *conf_load( int argc, char *argv[] )  				g_free( CONF_FILE );  				CONF_FILE = g_strdup( optarg );  				g_free( conf ); +				/* Re-evaluate arguments. Don't use this option twice,  +				   you'll end up in an infinite loop! Hope this trick +				   works with all libcs BTW.. */ +				optind = 1;  				return( conf_load( argc, argv ) );  			}  		} @@ -117,6 +130,7 @@ conf_t *conf_load( int argc, char *argv[] )  			        "\n"  			        "  -I  Classic/InetD mode. (Default)\n"  			        "  -D  Daemon mode. (Still EXPERIMENTAL!)\n" +			        "  -F  Forking daemon. (one process per client)\n"  			        "  -i  Specify the interface (by IP address) to listen on.\n"  			        "      (Default: 0.0.0.0 (any interface))\n"  			        "  -p  Port number to listen on. (Default: 6667)\n" @@ -156,6 +170,8 @@ static int conf_loadini( conf_t *conf, char *file )  			{  				if( g_strcasecmp( ini->value, "daemon" ) == 0 )  					conf->runmode = RUNMODE_DAEMON; +				else if( g_strcasecmp( ini->value, "forkdaemon" ) == 0 ) +					conf->runmode = RUNMODE_FORKDAEMON;  				else  					conf->runmode = RUNMODE_INETD;  			} @@ -183,7 +199,11 @@ static int conf_loadini( conf_t *conf, char *file )  			}  			else if( g_strcasecmp( ini->key, "authpassword" ) == 0 )  			{ -				conf->password = g_strdup( ini->value ); +				conf->auth_pass = g_strdup( ini->value ); +			} +			else if( g_strcasecmp( ini->key, "operpassword" ) == 0 ) +			{ +				conf->oper_pass = g_strdup( ini->value );  			}  			else if( g_strcasecmp( ini->key, "hostname" ) == 0 )  			{ @@ -26,7 +26,7 @@  #ifndef __CONF_H  #define __CONF_H -typedef enum runmode { RUNMODE_DAEMON, RUNMODE_INETD } runmode_t; +typedef enum runmode { RUNMODE_DAEMON, RUNMODE_FORKDAEMON, RUNMODE_INETD } runmode_t;  typedef enum authmode { AUTHMODE_OPEN, AUTHMODE_CLOSED, AUTHMODE_REGISTERED } authmode_t;  typedef struct conf @@ -37,7 +37,8 @@ typedef struct conf  	int verbose;  	runmode_t runmode;  	authmode_t authmode; -	char *password; +	char *auth_pass; +	char *oper_pass;  	char *hostname;  	char *configdir;  	char *plugindir; @@ -22,7 +22,6 @@ yahoo=1  debug=0  strip=1 -flood=0  ipv6=1  ssl=auto @@ -288,19 +287,18 @@ else  	fi;  fi -if [ "$flood" = 1 ]; then -	# echo '#define FLOOD_SEND' >> config.h -	echo 'Flood protection is disabled in this release because of too many bugs.' 2> /dev/stderr -	rm config.h -	rm Makefile.settings -	exit 1 +echo +if [ -z "$BITLBEE_VERSION" -a -d .bzr -a -x "`which bzr`" ]; then +	rev=`bzr revno` +	echo 'Using bzr revision #'$rev' as version number' +	BITLBEE_VERSION=\"bzr-$rev\"  fi  if [ -n "$BITLBEE_VERSION" ]; then -	echo  	echo 'Spoofing version number: '$BITLBEE_VERSION  	echo '#undef BITLBEE_VERSION' >> config.h -	echo '#define BITLBEE_VERSION '$BITLBEE_VERSION >> config.h; +	echo '#define BITLBEE_VERSION '$BITLBEE_VERSION >> config.h +	echo  fi  protocols='' @@ -339,7 +337,6 @@ else  fi  if [ "$protocols" = "PROTOCOLS = " ]; then -	echo  	echo "WARNING: You haven't selected any communication protocol to compile!"  	echo "         Bitlbee will run, but you will be unable to connect to IM servers!"  fi @@ -347,7 +344,6 @@ fi  echo "PROTOCOLS = $protocols" >> Makefile.settings  echo "PROTOOBJS = $protoobjs" >> Makefile.settings -echo  echo Architecture: $arch  case "$arch" in  Linux ) @@ -0,0 +1,386 @@ +  /********************************************************************\ +  * BitlBee -- An IRC to other IM-networks gateway                     * +  *                                                                    * +  * Copyright 2002-2004 Wilmer van der Gaast and others                * +  \********************************************************************/ + +/* IPC - communication between BitlBee processes                        */ + +/* +  This program is free software; you can redistribute it and/or modify +  it under the terms of the GNU General Public License as published by +  the Free Software Foundation; either version 2 of the License, or +  (at your option) any later version. + +  This program is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +  GNU General Public License for more details. + +  You should have received a copy of the GNU General Public License with +  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; +  if not, write to the Free Software Foundation, Inc., 59 Temple Place, +  Suite 330, Boston, MA  02111-1307  USA +*/ + +#define BITLBEE_CORE +#include "bitlbee.h" +#include "ipc.h" +#include "commands.h" + +GSList *child_list = NULL; + + +static void ipc_master_cmd_client( irc_t *data, char **cmd ) +{ +	struct bitlbee_child *child = (void*) data; +	 +	if( child ) +	{ +		child->host = g_strdup( cmd[1] ); +		child->nick = g_strdup( cmd[2] ); +		child->realname = g_strdup( cmd[3] ); +	} +	 +	ipc_to_children_str( "OPERMSG :Client connecting (PID=%d): %s@%s (%s)\r\n", +	                     child ? child->pid : -1, cmd[2], cmd[1], cmd[3] ); +} + +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 ); +} + +void ipc_master_cmd_rehash( irc_t *data, char **cmd ) +{ +	runmode_t oldmode; +	 +	oldmode = global.conf->runmode; +	 +	g_free( global.conf ); +	global.conf = conf_load( 0, NULL ); +	 +	if( global.conf->runmode != oldmode ) +	{ +		log_message( LOGLVL_WARNING, "Can't change RunMode setting at runtime, restoring original setting" ); +		global.conf->runmode = oldmode; +	} +	 +	if( global.conf->runmode == RUNMODE_FORKDAEMON ) +		ipc_to_children( cmd ); +} + +static const command_t ipc_master_commands[] = { +	{ "client",     3, ipc_master_cmd_client,     0 }, +	{ "die",        0, ipc_master_cmd_die,        0 }, +	{ "wallops",    1, NULL,                      IPC_CMD_TO_CHILDREN }, +	{ "lilo",       1, NULL,                      IPC_CMD_TO_CHILDREN }, +	{ "opermsg",    1, NULL,                      IPC_CMD_TO_CHILDREN }, +	{ "rehash",     0, ipc_master_cmd_rehash,     0 }, +	{ "kill",       2, NULL,                      IPC_CMD_TO_CHILDREN }, +	{ NULL } +}; + + +static void ipc_child_cmd_die( irc_t *irc, char **cmd ) +{ +	irc_abort( irc, 0, "Shutdown requested by operator" ); +} + +static void ipc_child_cmd_wallops( irc_t *irc, char **cmd ) +{ +	if( irc->status < USTATUS_LOGGED_IN ) +		return; +	 +	if( strchr( irc->umode, 'w' ) ) +		irc_write( irc, ":%s WALLOPS :%s", irc->myhost, cmd[1] ); +} + +static void ipc_child_cmd_lilo( irc_t *irc, char **cmd ) +{ +	if( irc->status < USTATUS_LOGGED_IN ) +		return; +	 +	if( strchr( irc->umode, 's' ) ) +		irc_write( irc, ":%s NOTICE %s :%s", irc->myhost, irc->nick, cmd[1] ); +} + +static void ipc_child_cmd_opermsg( irc_t *irc, char **cmd ) +{ +	if( irc->status < USTATUS_LOGGED_IN ) +		return; +	 +	if( strchr( irc->umode, 'o' ) ) +		irc_write( irc, ":%s NOTICE %s :*** OperMsg *** %s", irc->myhost, irc->nick, cmd[1] ); +} + +static void ipc_child_cmd_rehash( irc_t *irc, char **cmd ) +{ +	runmode_t oldmode; +	 +	oldmode = global.conf->runmode; +	 +	g_free( global.conf ); +	global.conf = conf_load( 0, NULL ); +	 +	global.conf->runmode = oldmode; +} + +static void ipc_child_cmd_kill( irc_t *irc, char **cmd ) +{ +	if( irc->status < USTATUS_LOGGED_IN ) +		return; +	 +	if( nick_cmp( cmd[1], irc->nick ) != 0 ) +		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, 0, "Killed by operator: %s", cmd[2] ); +} + +static const command_t ipc_child_commands[] = { +	{ "die",        0, ipc_child_cmd_die,         0 }, +	{ "wallops",    1, ipc_child_cmd_wallops,     0 }, +	{ "lilo",       1, ipc_child_cmd_lilo,        0 }, +	{ "opermsg",    1, ipc_child_cmd_opermsg,     0 }, +	{ "rehash",     0, ipc_child_cmd_rehash,      0 }, +	{ "kill",       2, ipc_child_cmd_kill,        0 }, +	{ NULL } +}; + + +static void ipc_command_exec( void *data, char **cmd, const command_t *commands ) +{ +	int i, j; +	 +	if( !cmd[0] ) +		return; +	 +	for( i = 0; commands[i].command; i ++ ) +		if( g_strcasecmp( commands[i].command, cmd[0] ) == 0 ) +		{ +			/* There is no typo in this line: */ +			for( j = 1; cmd[j]; j ++ ); j --; +			 +			if( j < commands[i].required_parameters ) +				break; +			 +			if( commands[i].flags & IPC_CMD_TO_CHILDREN ) +				ipc_to_children( cmd ); +			else +				commands[i].execute( data, cmd ); +			 +			break; +		} +} + +static char *ipc_readline( int fd ) +{ +	char *buf, *eol; +	int size; +	 +	buf = g_new0( char, 513 ); +	 +	/* Because this is internal communication, it should be pretty safe +	   to just peek at the message, find its length (by searching for the +	   end-of-line) and then just read that message. With internal +	   sockets and limites message length, messages should always be +	   complete. Saves us quite a lot of code and buffering. */ +	size = recv( fd, buf, 512, MSG_PEEK ); +	if( size == 0 || ( size < 0 && !sockerr_again() ) ) +		return NULL; +	else if( size < 0 ) /* && sockerr_again() */ +		return( g_strdup( "" ) ); +	else +		buf[size] = 0; +	 +	eol = strstr( buf, "\r\n" ); +	if( eol == NULL ) +		return NULL; +	else +		size = eol - buf + 2; +	 +	g_free( buf ); +	buf = g_new0( char, size + 1 ); +	 +	if( recv( fd, buf, size, 0 ) != size ) +		return NULL; +	else +		buf[size-2] = 0; +	 +	return buf; +} + +void ipc_master_read( gpointer data, gint source, GaimInputCondition cond ) +{ +	char *buf, **cmd; +	 +	if( ( buf = ipc_readline( source ) ) ) +	{ +		cmd = irc_parse_line( buf ); +		if( cmd ) +			ipc_command_exec( data, cmd, ipc_master_commands ); +	} +	else +	{ +		GSList *l; +		struct bitlbee_child *c; +		 +		for( l = child_list; l; l = l->next ) +		{ +			c = l->data; +			if( c->ipc_fd == source ) +			{ +				ipc_master_free_one( c ); +				child_list = g_slist_remove( child_list, c ); +				break; +			} +		} +	} +} + +void ipc_child_read( gpointer data, gint source, GaimInputCondition cond ) +{ +	char *buf, **cmd; +	 +	if( ( buf = ipc_readline( source ) ) ) +	{ +		cmd = irc_parse_line( buf ); +		if( cmd ) +			ipc_command_exec( data, cmd, ipc_child_commands ); +	} +	else +	{ +		gaim_input_remove( global.listen_watch_source_id ); +		close( global.listen_socket ); +		 +		global.listen_socket = -1; +	} +} + +void ipc_to_master( char **cmd ) +{ +	if( global.conf->runmode == RUNMODE_FORKDAEMON ) +	{ +		char *s = irc_build_line( cmd ); +		ipc_to_master_str( "%s", s ); +		g_free( s ); +	} +	else if( global.conf->runmode == RUNMODE_DAEMON ) +	{ +		ipc_command_exec( NULL, cmd, ipc_master_commands ); +	} +} + +void ipc_to_master_str( char *format, ... ) +{ +	char *msg_buf; +	va_list params; + +	va_start( params, format ); +	msg_buf = g_strdup_vprintf( format, params ); +	va_end( params ); +	 +	if( strlen( msg_buf ) > 512 ) +	{ +		/* Don't send it, it's too long... */ +	} +	else if( global.conf->runmode == RUNMODE_FORKDAEMON ) +	{ +		write( global.listen_socket, msg_buf, strlen( msg_buf ) ); +	} +	else if( global.conf->runmode == RUNMODE_DAEMON ) +	{ +		char **cmd, *s; +		 +		if( ( s = strchr( msg_buf, '\r' ) ) ) +			*s = 0; +		 +		cmd = irc_parse_line( msg_buf ); +		ipc_command_exec( NULL, cmd, ipc_master_commands ); +		g_free( cmd ); +	} +	 +	g_free( msg_buf ); +} + +void ipc_to_children( char **cmd ) +{ +	if( global.conf->runmode == RUNMODE_FORKDAEMON ) +	{ +		char *msg_buf = irc_build_line( cmd ); +		ipc_to_children_str( "%s", msg_buf ); +		g_free( msg_buf ); +	} +	else if( global.conf->runmode == RUNMODE_DAEMON ) +	{ +		GSList *l; +		 +		for( l = irc_connection_list; l; l = l->next ) +			ipc_command_exec( l->data, cmd, ipc_child_commands ); +	} +} + +void ipc_to_children_str( char *format, ... ) +{ +	char *msg_buf; +	va_list params; + +	va_start( params, format ); +	msg_buf = g_strdup_vprintf( format, params ); +	va_end( params ); +	 +	if( strlen( msg_buf ) > 512 ) +	{ +		/* Don't send it, it's too long... */ +	} +	else if( global.conf->runmode == RUNMODE_FORKDAEMON ) +	{ +		int msg_len = strlen( msg_buf ); +		GSList *l; +		 +		for( l = child_list; l; l = l->next ) +		{ +			struct bitlbee_child *c = l->data; +			write( c->ipc_fd, msg_buf, msg_len ); +		} +	} +	else if( global.conf->runmode == RUNMODE_DAEMON ) +	{ +		char **cmd, *s; +		 +		if( ( s = strchr( msg_buf, '\r' ) ) ) +			*s = 0; +		 +		cmd = irc_parse_line( msg_buf ); +		ipc_to_children( cmd ); +		g_free( cmd ); +	} +	 +	g_free( msg_buf ); +} + +void ipc_master_free_one( struct bitlbee_child *c ) +{ +	gaim_input_remove( c->ipc_inpa ); +	closesocket( c->ipc_fd ); +	 +	g_free( c->host ); +	g_free( c->nick ); +	g_free( c->realname ); +	g_free( c ); +} + +void ipc_master_free_all() +{ +	GSList *l; +	 +	for( l = child_list; l; l = l->next ) +		ipc_master_free_one( l->data ); +	 +	g_slist_free( child_list ); +	child_list = NULL; +} @@ -0,0 +1,57 @@ +  /********************************************************************\ +  * BitlBee -- An IRC to other IM-networks gateway                     * +  *                                                                    * +  * Copyright 2002-2004 Wilmer van der Gaast and others                * +  \********************************************************************/ + +/* IPC - communication between BitlBee processes                        */ + +/* +  This program is free software; you can redistribute it and/or modify +  it under the terms of the GNU General Public License as published by +  the Free Software Foundation; either version 2 of the License, or +  (at your option) any later version. + +  This program is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +  GNU General Public License for more details. + +  You should have received a copy of the GNU General Public License with +  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; +  if not, write to the Free Software Foundation, Inc., 59 Temple Place, +  Suite 330, Boston, MA  02111-1307  USA +*/ + +#define BITLBEE_CORE +#include "bitlbee.h" + + +struct bitlbee_child +{ +	pid_t pid; +	int ipc_fd; +	gint ipc_inpa; +	 +	char *host; +	char *nick; +	char *realname; +}; + + +void ipc_master_read( gpointer data, gint source, GaimInputCondition cond ); +void ipc_child_read( gpointer data, gint source, GaimInputCondition cond ); + +void ipc_master_free_one( struct bitlbee_child *child ); +void ipc_master_free_all(); + +void ipc_to_master( char **cmd ); +void ipc_to_master_str( char *format, ... ); +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. */ +void ipc_master_cmd_rehash( irc_t *data, char **cmd ); + + +extern GSList *child_list; @@ -26,6 +26,7 @@  #define BITLBEE_CORE  #include "bitlbee.h"  #include "crypting.h" +#include "ipc.h"  static gboolean irc_userping( gpointer _irc ); @@ -39,14 +40,17 @@ static char *passchange (irc_t *irc, void *set, char *value)  irc_t *irc_new( int fd )  { -	irc_t *irc = g_new0( irc_t, 1 ); -	 -	struct sockaddr_in sock[1]; +	irc_t *irc; +	struct hostent *peer; +	unsigned int i; +	char buf[128];  #ifdef IPV6 -	struct sockaddr_in6 sock6[1]; +	struct sockaddr_in6 sock[1]; +#else +	struct sockaddr_in sock[1];  #endif -	struct hostent *peer; -	unsigned int i, j; +	 +	irc = g_new0( irc_t, 1 );  	irc->fd = fd;  	irc->io_channel = g_io_channel_unix_new( fd ); @@ -70,41 +74,47 @@ irc_t *irc_new( int fd )  	irc->channel = g_strdup( ROOT_CHAN );  	i = sizeof( *sock ); -#ifdef IPV6 -	j = sizeof( *sock6 ); -#endif +	  	if( global.conf->hostname )  		irc->myhost = g_strdup( global.conf->hostname ); -	else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET ) +#ifdef IPV6 +	else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx )  	{ -		if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) ) +		if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) )  			irc->myhost = g_strdup( peer->h_name ); +		else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL ) +			irc->myhost = g_strdup( ipv6_unwrap( buf ) );  	} -#ifdef IPV6 -	else if( getsockname( irc->fd, (struct sockaddr*) sock6, &j ) == 0 && sock6->sin6_family == AF_INET6 ) +#else +	else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx )  	{ -		if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) ) +		if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) )  			irc->myhost = g_strdup( peer->h_name ); +		else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL ) +			irc->myhost = g_strdup( buf );  	}  #endif  	i = sizeof( *sock );  #ifdef IPV6 -	j = sizeof( *sock6 ); -#endif -	if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET ) +	if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx )  	{ -		if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) ) +		if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) )  			irc->host = g_strdup( peer->h_name ); +		else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL ) +			irc->host = g_strdup( ipv6_unwrap( buf ) );  	} -#ifdef IPV6 -	else if( getpeername( irc->fd, (struct sockaddr*) sock6, &j ) == 0 && sock6->sin6_family == AF_INET6 ) +#else +	if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx )  	{ -		if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) ) +		if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) )  			irc->host = g_strdup( peer->h_name ); +		else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL ) +			irc->host = g_strdup( buf );  	}  #endif +	/* Rare, but possible. */  	if( !irc->host ) irc->host = g_strdup( "localhost." );  	if( !irc->myhost ) irc->myhost = g_strdup( "localhost." ); @@ -141,6 +151,53 @@ 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, ... ) +{ +	if( format != NULL ) +	{ +		va_list params; +		char *reason; +		 +		va_start( params, format ); +		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->nick : "(NONE)", irc->host, reason ); +	     	 +		g_free( reason ); +	} +	else +	{ +		if( !immed ) +			irc_write( irc, "ERROR :Closing link" ); +		 +		ipc_to_master_str( "OPERMSG :Client exiting: %s@%s [%s]\r\n", +	        	           irc->nick ? irc->nick : "(NONE)", irc->host, "No reason given" ); +	} +	 +	irc->status = USTATUS_SHUTDOWN; +	if( irc->sendbuffer && !immed ) +	{ +		/* We won't read from this socket anymore. Instead, we'll connect a timer +		   to it that should shut down the connection in a second, just in case +		   bitlbee_.._write doesn't do it first. */ +		 +		g_source_remove( irc->r_watch_source_id ); +		irc->r_watch_source_id = g_timeout_add_full( G_PRIORITY_HIGH, 1000, (GSourceFunc) irc_free, irc, NULL ); +	} +	else +	{ +		irc_free( irc ); +	} +} +  static gboolean irc_free_userhash( gpointer key, gpointer value, gpointer data )  {  	g_free( key ); @@ -163,6 +220,8 @@ void irc_free(irc_t * irc)  		if( storage_save( irc, TRUE ) != STORAGE_OK )  			irc_usermsg( irc, "Error while saving settings!" ); +	closesocket( irc->fd ); +	  	if( irc->ping_source_id > 0 )  		g_source_remove( irc->ping_source_id );  	g_source_remove( irc->r_watch_source_id ); @@ -263,7 +322,7 @@ void irc_free(irc_t * irc)  	}  	g_free(irc); -	if( global.conf->runmode == RUNMODE_INETD ) +	if( global.conf->runmode == RUNMODE_INETD || global.conf->runmode == RUNMODE_FORKDAEMON )  		g_main_quit( global.loop );  } @@ -281,33 +340,48 @@ void irc_setpass (irc_t *irc, const char *pass)  	}  } -int irc_process( irc_t *irc ) +void irc_process( irc_t *irc )  { -	char **lines, *temp;	 +	char **lines, *temp, **cmd;  	int i; -	if( irc->readbuffer != NULL ) { -		lines = irc_tokenize(irc->readbuffer ); -		for( i = 0; *lines[i] != '\0'; i++ ) { -			if( lines[i+1] == NULL ) { +	if( irc->readbuffer != NULL ) +	{ +		lines = irc_tokenize( irc->readbuffer ); +		 +		for( i = 0; *lines[i] != '\0'; i ++ ) +		{ +			if( lines[i+1] == NULL ) +			{  				temp = g_strdup( lines[i] );  				g_free( irc->readbuffer );  				irc->readbuffer = temp; -				i++; +				i ++;  				break;  			}			 -			if (!irc_process_line(irc, lines[i])) { +			 +			if( ( cmd = irc_parse_line( lines[i] ) ) == NULL ) +				continue; +			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( lines ); -				return 0; +				return;  			}  		} -		if(lines[i]!=NULL) { -			g_free(irc->readbuffer); -			irc->readbuffer=NULL;	 +		 +		if( lines[i] != NULL ) +		{ +			g_free( irc->readbuffer ); +			irc->readbuffer = NULL;  		} +		  		g_free( lines );  	} -	return 1;	  }  char **irc_tokenize( char *buffer ) @@ -316,553 +390,128 @@ char **irc_tokenize( char *buffer )  	char **lines;  	/* Count the number of elements we're gonna need. */ -	for(i=0, j=1; buffer[i]!='\0'; i++ ) { -		if(buffer[i]=='\n' ) -			if(buffer[i+1]!='\r' && buffer[i+1]!='\n') -				j++; +	for( i = 0, j = 1; buffer[i] != '\0'; i ++ ) +	{ +		if( buffer[i] == '\n' ) +			if( buffer[i+1] != '\r' && buffer[i+1] != '\n' ) +				j ++;  	}  	/* Allocate j+1 elements. */ -	lines=g_new (char *, j+1); +	lines = g_new( char *, j + 1 );  	/* NULL terminate our list. */  -	lines[j]=NULL; +	lines[j] = NULL; -	lines[0]=buffer; +	lines[0] = buffer;  	/* Split the buffer in several strings, using \r\n as our seperator, where \r is optional.  	 * Although this is not in the RFC, some braindead ircds (newnet's) use this, so some clients might too.   	 */ -	for( i=0, j=0; buffer[i]!='\0'; i++) { -		if(buffer[i]=='\n') { -			buffer[i]='\0'; - -			/* We dont want to read 1 byte before our buffer -			 * and (in rare cases) generate a SIGSEGV. -			 */ -			if(i!=0) -				if(buffer[i-1]=='\r') -					buffer[i-1]='\0'; -			if(buffer[i+1]!='\r'&&buffer[i+1]!='\n') -				lines[++j]=buffer+i+1; +	for( i = 0, j = 0; buffer[i] != '\0'; i ++) +	{ +		if( buffer[i] == '\n' ) +		{ +			buffer[i] = '\0'; +			 +			if( i > 0 && buffer[i-1] == '\r' ) +				buffer[i-1] = '\0'; +			if( buffer[i+1] != '\r' && buffer[i+1] != '\n' ) +				lines[++j] = buffer + i + 1;  		}  	} - -	return(lines); +	 +	return( lines );  } -int irc_process_line( irc_t *irc, char *line ) +char **irc_parse_line( char *line )  {  	int i, j;  	char **cmd;  	/* Move the line pointer to the start of the command, skipping spaces and the optional prefix. */ -	if(line[0]==':') { -		for(i=0; line[i]!=32; i++); -		line=line+i; +	if( line[0] == ':' ) +	{ +		for( i = 0; line[i] != ' '; i ++ ); +		line = line + i;  	} -	for(i=0; line[i]==32; i++); -	line=line+i; - +	for( i = 0; line[i] == ' '; i ++ ); +	line = line + i; +	  	/* If we're already at the end of the line, return. If not, we're going to need at least one element. */ -	if(line[0]=='\0') -		return 1; -	else -		j=1;	 -	 -	/* Count the number of char **cmd elements we're going to need. */	 -	for(i=0; line[i]!='\0'; i++) { -		if((line[i]==32) && (line[i+1]!=32) && (line[i+1]!='\0') && (line[i+1]!=':'))		 -			j++; -		else if((line[i]==':') && (line[i+1]!='\0') && (line[i-1]==32)) { -			j++; -			break; -		} +	if( line[0] == '\0') +		return NULL; +	 +	/* Count the number of char **cmd elements we're going to need. */ +	j = 1; +	for( i = 0; line[i] != '\0'; i ++ ) +	{ +		if( line[i] == ' ' ) +		{ +			j ++; +			if( line[i+1] == ':' ) +				break; +		}  	}	  	/* Allocate the space we need. */ -	cmd=g_new(char *, j+1); -	cmd[j]=NULL; +	cmd = g_new( char *, j + 1 ); +	cmd[j] = NULL;  	/* Do the actual line splitting, format is:  	 * Input: "PRIVMSG #bitlbee :foo bar"  	 * Output: cmd[0]=="PRIVMSG", cmd[1]=="#bitlbee", cmd[2]=="foo bar", cmd[3]==NULL  	 */ -	cmd[0]=line; -	for(i=0, j=0; line[i]!='\0'; i++) { -		if((line[i]==32)) { -			line[i]='\0'; -			if((line[i+1]!=32) && (line[i+1]!='\0') && (line[i+1]!=':')) 		 -				cmd[++j]=line+i+1; -		} -		else if((line[i]==':') && (line[i+1]!='\0') && (line[i-1]=='\0')) { -			cmd[++j]=line+i+1; -			break; -		} -	} -	 -	i=irc_exec(irc, cmd); -	g_free(cmd); - -	return(i);	 -} - -int irc_exec( irc_t *irc, char **cmd ) -{	 -	int i; - -	if( (global.conf)->authmode == AUTHMODE_CLOSED && irc->status < USTATUS_AUTHORIZED ) +	cmd[0] = line; +	for( i = 0, j = 0; line[i] != '\0'; i ++ )  	{ -		if( g_strcasecmp( cmd[0], "PASS" ) == 0 ) +		if( line[i] == ' ' )  		{ -			if( !cmd[1] ) -			{ -				irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -			} -			else if( strcmp( cmd[1], (global.conf)->password ) == 0 ) -			{ -				irc->status = USTATUS_AUTHORIZED; -			} -			else +			line[i] = '\0'; +			cmd[++j] = line + i + 1; +			 +			if( line[i+1] == ':' )  			{ -				irc_reply( irc, 464, ":Nope, maybe you should try it again..." ); +				cmd[j] ++; +				break;  			}  		} -		else -		{ -			irc_reply( irc, 464, ":Uhh, fine, but I want the password first." ); -		} -		 -		return( 1 );  	} -	if( g_strcasecmp( cmd[0], "USER" ) == 0 ) -	{ -		if( !( cmd[1] && cmd[2] && cmd[3] && cmd[4] ) ) -		{ -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -		} -		else if( irc->user ) -		{ -			irc_reply( irc, 462, ":You can't change your nick/userinfo" ); -		} -		else -		{ -			irc->user = g_strdup( cmd[1] ); -			irc->realname = g_strdup( cmd[4] ); -			if( irc->nick ) irc_login( irc ); -		} -		return( 1 ); -	} -	else if( g_strcasecmp( cmd[0], "NICK" ) == 0 ) -	{ -		if( !cmd[1] ) -		{ -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -		} -		else if( irc->nick ) -		{ -			irc_reply( irc, 438, ":The hand of the deity is upon thee, thy nick may not change" ); -		} -		/* This is not clean, but for now it'll have to be like this... */ -		else if( ( nick_cmp( cmd[1], irc->mynick ) == 0 ) || ( nick_cmp( cmd[1], NS_NICK ) == 0 ) ) -		{ -			irc_reply( irc, 433, ":This nick is already in use" ); -		} -		else if( !nick_ok( cmd[1] ) ) -		{ -			/* [SH] Invalid characters. */ -			irc_reply( irc, 432, ":This nick contains invalid characters" ); -		} -		else -		{ -			irc->nick = g_strdup( cmd[1] ); -			if( irc->user ) irc_login( irc ); -		} -		return( 1 ); -	} -	else if( g_strcasecmp( cmd[0], "QUIT" ) == 0 ) -	{ -		irc_write( irc, "ERROR :%s%s", cmd[1]?"Quit: ":"", cmd[1]?cmd[1]:"Client Quit" ); -		g_io_channel_close( irc->io_channel ); -		return( 0 ); -	} +	return cmd; +} + +char *irc_build_line( char **cmd ) +{ +	int i, len; +	char *s; -	if( !irc->user || !irc->nick ) -	{ -		irc_reply( irc, 451, ":Register first" ); -		return( 1 ); -	} +	if( cmd[0] == NULL ) +		return NULL; -	if( g_strcasecmp( cmd[0], "PING" ) == 0 ) -	{ -		irc_write( irc, ":%s PONG %s :%s", irc->myhost, irc->myhost, cmd[1]?cmd[1]:irc->myhost ); -	} -	else if( g_strcasecmp( cmd[0], "MODE" ) == 0 ) -	{ -		if( !cmd[1] ) -		{ -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -		} -		else if( *cmd[1] == '#' || *cmd[1] == '&' ) -		{ -			if( cmd[2] ) -			{ -				if( *cmd[2] == '+' || *cmd[2] == '-' ) -					irc_reply( irc, 477, "%s :Can't change channel modes", cmd[1] ); -				else if( *cmd[2] == 'b' ) -					irc_reply( irc, 368, "%s :No bans possible", cmd[1] ); -			} -			else -				irc_reply( irc, 324, "%s +%s", cmd[1], CMODE ); -		} -		else -		{ -			if( nick_cmp( cmd[1], irc->nick ) == 0 ) -			{ -				if( cmd[2] ) -					irc_umode_set( irc, irc->nick, cmd[2] ); -			} -			else -				irc_reply( irc, 502, ":Don't touch their modes" ); -		} -	} -	else if( g_strcasecmp( cmd[0], "NAMES" ) == 0 ) -	{ -		irc_names( irc, cmd[1]?cmd[1]:irc->channel ); -	} -	else if( g_strcasecmp( cmd[0], "PART" ) == 0 ) -	{ -		struct conversation *c; -		 -		if( !cmd[1] ) -		{ -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -		} -		else if( g_strcasecmp( cmd[1], irc->channel ) == 0 ) -		{ -			user_t *u = user_find( irc, irc->nick ); -			 -			/* Not allowed to leave control channel */ -			irc_part( irc, u, irc->channel ); -			irc_join( irc, u, irc->channel ); -		} -		else if( ( c = conv_findchannel( cmd[1] ) ) ) -		{ -			user_t *u = user_find( irc, irc->nick ); -			 -			irc_part( irc, u, c->channel ); -			 -			if( c->gc && c->gc->prpl ) -			{ -				c->joined = 0; -				c->gc->prpl->chat_leave( c->gc, c->id ); -			} -		} -		else -		{ -			irc_reply( irc, 403, "%s :No such channel", cmd[1] ); -		} -	} -	else if( g_strcasecmp( cmd[0], "JOIN" ) == 0 ) -	{ -		if( !cmd[1] ) -		{ -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -		} -		else if( g_strcasecmp( cmd[1], irc->channel ) == 0 ) -			; /* Dude, you're already there... -			     RFC doesn't have any reply for that though? */ -		else if( cmd[1] ) -		{ -			if( ( cmd[1][0] == '#' || cmd[1][0] == '&' ) && cmd[1][1] ) -			{ -				user_t *u = user_find( irc, cmd[1] + 1 ); -				 -				if( u && u->gc && u->gc->prpl && u->gc->prpl->chat_open ) -				{ -					irc_reply( irc, 403, "%s :Initializing groupchat in a different channel", cmd[1] ); -					 -					if( !u->gc->prpl->chat_open( u->gc, u->handle ) ) -					{ -						irc_usermsg( irc, "Could not open a groupchat with %s, maybe you don't have a connection to him/her yet?", u->nick ); -					} -				} -				else -				{ -					irc_reply( irc, 403, "%s :Groupchats are not possible with %s", cmd[1], cmd[1]+1 ); -				} -			} -			else -			{ -				irc_reply( irc, 403, "%s :No such channel", cmd[1] ); -			} -		} -	} -	else if( g_strcasecmp( cmd[0], "INVITE" ) == 0 ) -	{ -		if( cmd[1] && cmd[2] ) -			irc_invite( irc, cmd[1], cmd[2] ); -		else -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -	} -	else if( g_strcasecmp( cmd[0], "PRIVMSG" ) == 0 || g_strcasecmp( cmd[0], "NOTICE" ) == 0 ) -	{ -		if( !cmd[1] ) -		{ -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -		}  -		else if ( !cmd[2] )  -		{ -			irc_reply( irc, 412, ":No text to send" ); -		} -		else if ( irc->nick && g_strcasecmp( cmd[1], irc->nick ) == 0 )  -		{ -			irc_write( irc, ":%s!%s@%s %s %s :%s", irc->nick, irc->user, irc->host, cmd[0], cmd[1], cmd[2] );  -		} -		else  -		{ -			if( g_strcasecmp( cmd[1], irc->channel ) == 0 ) -			{ -				unsigned int i; -				char *t = set_getstr( irc, "default_target" ); -				 -				if( g_strcasecmp( t, "last" ) == 0 && irc->last_target ) -					cmd[1] = irc->last_target; -				else if( g_strcasecmp( t, "root" ) == 0 ) -					cmd[1] = irc->mynick; -				 -				for( i = 0; i < strlen( cmd[2] ); i ++ ) -				{ -					if( cmd[2][i] == ' ' ) break; -					if( cmd[2][i] == ':' || cmd[2][i] == ',' ) -					{ -						cmd[1] = cmd[2]; -						cmd[2] += i; -						*cmd[2] = 0; -						while( *(++cmd[2]) == ' ' ); -						break; -					} -				} -				 -				irc->is_private = 0; -				 -				if( cmd[1] != irc->last_target ) -				{ -					if( irc->last_target ) -						g_free( irc->last_target ); -					irc->last_target = g_strdup( cmd[1] ); -				} -			} -			else -			{ -				irc->is_private = 1; -			} -			irc_send( irc, cmd[1], cmd[2], ( g_strcasecmp( cmd[0], "NOTICE" ) == 0 ) ? IM_FLAG_AWAY : 0 ); -		} -	} -	else if( g_strcasecmp( cmd[0], "WHO" ) == 0 ) -	{ -		irc_who( irc, cmd[1] ); -	} -	else if( g_strcasecmp( cmd[0], "USERHOST" ) == 0 ) -	{ -		user_t *u; -		 -		if( !cmd[1] ) -		{ -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -		} -		/* [TV] Usable USERHOST-implementation according to -			RFC1459. Without this, mIRC shows an error -			while connecting, and the used way of rejecting -			breaks standards. -		*/ -		 -		for( i = 1; cmd[i]; i ++ ) -			if( ( u = user_find( irc, cmd[i] ) ) ) -			{ -				if( u->online && u->away ) -					irc_reply( irc, 302, ":%s=-%s@%s", u->nick, u->user, u->host ); -				else -					irc_reply( irc, 302, ":%s=+%s@%s", u->nick, u->user, u->host ); -			} -	} -	else if( g_strcasecmp( cmd[0], "ISON" ) == 0 ) -	{ -		user_t *u; -		char buff[IRC_MAX_LINE]; -		int lenleft; -		 -		buff[0] = '\0'; -		 -		/* [SH] Leave room for : and \0 */ -		lenleft = IRC_MAX_LINE - 2; -		 -		for( i = 1; cmd[i]; i ++ ) -		{ -			if( ( u = user_find( irc, cmd[i] ) ) && u->online ) -			{ -				/* [SH] Make sure we don't use too much buffer space. */ -				lenleft -= strlen( u->nick ) + 1; -				 -				if( lenleft < 0 ) -				{ -					break; -				} -				 -				/* [SH] Add the nick to the buffer. Note -				 * that an extra space is always added. Even -				 * if it's the last nick in the list. Who -				 * cares? -				 */ -				 -				strcat( buff, u->nick ); -				strcat( buff, " " ); -			} -		} -		 -		/* [WvG] Well, maybe someone cares, so why not remove it? */ -		if( strlen( buff ) > 0 ) -			buff[strlen(buff)-1] = '\0'; -		 -		/* [SH] By the way, that really *was* WvG talking. */ -		/* [WvG] Really? */ -		/* [SH] Yeah... But *this* is WvG talking too. ;-P */ -		/* [WvG] *sigh* */ -		 -		irc_reply( irc, 303, ":%s", buff ); -	} -	else if( g_strcasecmp( cmd[0], "WATCH" ) == 0 ) -	{ -		/* Obviously we could also mark a user structure as being -		   watched, but what if the WATCH command is sent right -		   after connecting? The user won't exist yet then... */ -		for( i = 1; cmd[i]; i ++ ) -		{ -			char *nick; -			user_t *u; -			 -			if( !cmd[i][0] || !cmd[i][1] ) -				break; -			 -			nick = g_strdup( cmd[i] + 1 ); -			nick_lc( nick ); -			 -			u = user_find( irc, nick ); -			 -			if( cmd[i][0] == '+' ) -			{ -				if( !g_hash_table_lookup( irc->watches, nick ) ) -					g_hash_table_insert( irc->watches, nick, nick ); -				 -				if( u && u->online ) -					irc_reply( irc, 604, "%s %s %s %d :%s", u->nick, u->user, u->host, time( NULL ), "is online" ); -				else -					irc_reply( irc, 605, "%s %s %s %d :%s", nick, "*", "*", time( NULL ), "is offline" ); -			} -			else if( cmd[i][0] == '-' ) -			{ -				gpointer okey, ovalue; -				 -				if( g_hash_table_lookup_extended( irc->watches, nick, &okey, &ovalue ) ) -				{ -					g_free( okey ); -					g_hash_table_remove( irc->watches, okey ); -					 -					irc_reply( irc, 602, "%s %s %s %d :%s", nick, "*", "*", 0, "Stopped watching" ); -				} -			} -		} -	} -	else if( g_strcasecmp( cmd[0], "TOPIC" ) == 0 ) -	{ -		if( cmd[1] && cmd[2] ) -			irc_reply( irc, 482, "%s :Cannot change topic", cmd[1] ); -		else if( cmd[1] ) -			irc_topic( irc, cmd[1] ); -		else -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -	} -	else if( g_strcasecmp( cmd[0], "AWAY" ) == 0 ) -	{ -		irc_away( irc, cmd[1] ); -	} -	else if( g_strcasecmp( cmd[0], "WHOIS" ) == 0 ) -	{ -		if( cmd[1] ) -		{ -			irc_whois( irc, cmd[1] ); -		} -		else -		{ -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -		} -	} -	else if( g_strcasecmp( cmd[0], "WHOWAS" ) == 0 ) -	{ -		/* For some reason irssi tries a whowas when whois fails. We can -		   ignore this, but then the user never gets a "user not found" -		   message from irssi which is a bit annoying. So just respond -		   with not-found and irssi users will get better error messages */ -		 -		if( cmd[1] ) -		{ -			irc_reply( irc, 406, "%s :Nick does not exist", cmd[1] ); -			irc_reply( irc, 369, "%s :End of WHOWAS", cmd[1] ); -		} -		else -		{ -			irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); -		} -	} -	else if( ( g_strcasecmp( cmd[0], "NICKSERV" ) == 0 ) || ( g_strcasecmp( cmd[0], "NS" ) == 0 ) ) -	{ -		/* [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 ); -	} -	else if( g_strcasecmp( cmd[0], "MOTD" ) == 0 ) -	{ -		irc_motd( irc ); -	} -	else if( g_strcasecmp( cmd[0], "PONG" ) == 0 ) -	{ -		/* 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; -	} -	else if( g_strcasecmp( cmd[0], "COMPLETIONS" ) == 0 ) +	len = 1; +	for( i = 0; cmd[i]; i ++ ) +		len += strlen( cmd[i] ) + 1; +	 +	if( strchr( cmd[i-1], ' ' ) != NULL ) +		len ++; +	 +	s = g_new0( char, len + 1 ); +	for( i = 0; cmd[i]; i ++ )  	{ -		user_t *u = user_find( irc, irc->mynick ); -		help_t *h; -		set_t *s; -		int i; -		 -		irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "OK" ); -		 -		for( i = 0; commands[i].command; i ++ ) -			irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", commands[i].command ); +		if( cmd[i+1] == NULL && strchr( cmd[i], ' ' ) != NULL ) +			strcat( s, ":" ); -		for( h = global.help; h; h = h->next ) -			irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS help ", h->string ); +		strcat( s, cmd[i] ); -		for( s = irc->set; s; s = s->next ) -			irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS set ", s->key ); -		 -		irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "END" ); -	} -	else if( set_getint( irc, "debug" ) ) -	{ -		irc_usermsg( irc, "\002--- Unknown command:" ); -		for( i = 0; cmd[i]; i ++ ) irc_usermsg( irc, "%s", cmd[i] ); -		irc_usermsg( irc, "\002--------------------" ); +		if( cmd[i+1] ) +			strcat( s, " " );  	} +	strcat( s, "\r\n" ); -	return( 1 ); +	return s;  }  void irc_reply( irc_t *irc, int code, char *format, ... ) @@ -922,21 +571,6 @@ void irc_vawrite( irc_t *irc, char *format, va_list params )  	if( irc->sendbuffer != NULL ) {  		size = strlen( irc->sendbuffer ) + strlen( line ); -#ifdef FLOOD_SEND -		if( size > FLOOD_SEND_MAXBUFFER ) { -			/* Die flooder, die! >:) */ - -			g_free(irc->sendbuffer); -			 -			/* We need the \r\n at the start because else we might append our string to a half -			 * sent line. A bit hackish, but it works. -			 */ -			irc->sendbuffer = g_strdup( "\r\nERROR :Sendq Exceeded\r\n" ); -			irc->quit = 1; -			 -			return; -		} -#endif  		irc->sendbuffer = g_renew ( char, irc->sendbuffer, size + 1 );  		strcpy( ( irc->sendbuffer + strlen( irc->sendbuffer ) ), line );  	} @@ -1036,35 +670,26 @@ void irc_names( irc_t *irc, char *channel )  	irc_reply( irc, 366, "%s :End of /NAMES list", channel );  } -void irc_who( irc_t *irc, char *channel ) +int irc_check_login( irc_t *irc )  { -	user_t *u = irc->users; -	struct conversation *c; -	GList *l; -	 -	if( !channel || *channel == '0' || *channel == '*' || !*channel ) -		while( u ) -		{ -			irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", u->online ? irc->channel : "*", u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname ); -			u = u->next; -		} -	else if( g_strcasecmp( channel, irc->channel ) == 0 ) -		while( u ) +	if( irc->user && irc->nick ) +	{ +		if( global.conf->authmode == AUTHMODE_CLOSED && irc->status < USTATUS_AUTHORIZED )  		{ -			if( u->online ) -				irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname ); -			u = u->next; +			irc_reply( irc, 464, ":This server is password-protected." ); +			return 0;  		} -	else if( ( c = conv_findchannel( channel ) ) ) -		for( l = c->in_room; l; l = l->next ) +		else  		{ -			if( ( u = user_findhandle( c->gc, l->data ) ) ) -				irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname ); +			irc_login( irc ); +			return 1;  		} -	else if( ( u = user_find( irc, channel ) ) ) -		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:"**" ); +	} +	else +	{ +		/* More information needed. */ +		return 0; +	}  }  void irc_login( irc_t *irc ) @@ -1074,10 +699,10 @@ void irc_login( irc_t *irc )  	irc_reply( irc,   1, ":Welcome to the BitlBee gateway, %s", irc->nick );  	irc_reply( irc,   2, ":Host %s is running BitlBee " BITLBEE_VERSION " " ARCH "/" CPU ".", irc->myhost );  	irc_reply( irc,   3, ":%s", IRCD_INFO ); -	irc_reply( irc,   4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES, CMODES ); +	irc_reply( irc,   4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES );  	irc_reply( irc,   5, "PREFIX=(ov)@+ CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 );  	irc_motd( irc ); -	irc_umode_set( irc, irc->myhost, "+" UMODE ); +	irc_umode_set( irc, "+" UMODE, 1 );  	u = user_add( irc, irc->mynick );  	u->host = g_strdup( irc->myhost ); @@ -1099,11 +724,13 @@ void irc_login( irc_t *irc )  	u->host = g_strdup( irc->host );  	u->realname = g_strdup( irc->realname );  	u->online = 1; -//	u->send_handler = msg_echo;  	irc_spawn( irc, u );  	irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\nIf you've never used BitlBee before, please do read the help information using the \x02help\x02 command. Lots of FAQ's are answered there." ); +	if( global.conf->runmode == RUNMODE_FORKDAEMON || global.conf->runmode == RUNMODE_DAEMON ) +		ipc_to_master_str( "CLIENT %s %s :%s\r\n", irc->host, irc->nick, irc->realname ); +	  	irc->status = USTATUS_LOGGED_IN;  } @@ -1155,7 +782,7 @@ void irc_motd( irc_t *irc )  			}  		}  		irc_reply( irc, 376, ":End of MOTD" ); -		closesocket( fd ); +		close( fd );  	}  } @@ -1176,36 +803,10 @@ void irc_topic( irc_t *irc, char *channel )  	}  } -void irc_whois( irc_t *irc, char *nick ) -{ -	user_t *u = user_find( irc, nick ); -	 -	if( u ) -	{ -		irc_reply( irc, 311, "%s %s %s * :%s", u->nick, u->user, u->host, u->realname ); -		 -		if( u->gc ) -			irc_reply( irc, 312, "%s %s.%s :%s network", u->nick, u->gc->user->username, -			           *u->gc->user->proto_opt[0] ? u->gc->user->proto_opt[0] : "", u->gc->prpl->name ); -		else -			irc_reply( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO ); -		 -		if( !u->online ) -			irc_reply( irc, 301, "%s :%s", u->nick, "User is offline" ); -		else if( u->away ) -			irc_reply( irc, 301, "%s :%s", u->nick, u->away ); -		 -		irc_reply( irc, 318, "%s :End of /WHOIS list", nick ); -	} -	else -	{ -		irc_reply( irc, 401, "%s :Nick does not exist", nick ); -	} -} - - -void irc_umode_set( irc_t *irc, char *who, char *s ) +void irc_umode_set( irc_t *irc, char *s, int allow_priv )  { +	/* allow_priv: Set to 0 if s contains user input, 1 if you want +	   to set a "privileged" mode (+o, +R, etc). */  	char m[256], st = 1, *t;  	int i; @@ -1218,60 +819,19 @@ void irc_umode_set( irc_t *irc, char *who, char *s )  	{  		if( *t == '+' || *t == '-' )  			st = *t == '+'; -		else +		else if( st == 0 || ( strchr( UMODES, *t ) || ( allow_priv && strchr( UMODES_PRIV, *t ) ) ) )  			m[(int)*t] = st;  	}  	memset( irc->umode, 0, sizeof( irc->umode ) );  	for( i = 0; i < 256 && strlen( irc->umode ) < ( sizeof( irc->umode ) - 1 ); i ++ ) -		if( m[i] && strchr( UMODES, i ) ) +		if( m[i] )  			irc->umode[strlen(irc->umode)] = i;  	irc_reply( irc, 221, "+%s", irc->umode );  } -int irc_away( irc_t *irc, char *away ) -{ -	user_t *u = user_find( irc, irc->nick ); -	GSList *c = get_connections(); -	 -	if( !u ) return( 0 ); -	 -	if( away && *away ) -	{ -		int i, j; -		 -		/* Copy away string, but skip control chars. Mainly because -		   Jabber really doesn't like them. */ -		u->away = g_malloc( strlen( away ) + 1 ); -		for( i = j = 0; away[i]; i ++ ) -			if( ( u->away[j] = away[i] ) >= ' ' ) -				j ++; -		u->away[j] = 0; -		 -		irc_reply( irc, 306, ":You're now away: %s", u->away ); -		/* irc_umode_set( irc, irc->myhost, "+a" ); */ -	} -	else -	{ -		if( u->away ) g_free( u->away ); -		u->away = NULL; -		/* irc_umode_set( irc, irc->myhost, "-a" ); */ -		irc_reply( irc, 305, ":Welcome back" ); -	} -	 -	while( c ) -	{ -		if( ((struct gaim_connection *)c->data)->flags & OPT_LOGGED_IN ) -			proto_away( c->data, u->away ); -		 -		c = c->next; -	} -	 -	return( 1 ); -} -  void irc_spawn( irc_t *irc, user_t *u )  {  	irc_join( irc, u, irc->channel ); @@ -1325,22 +885,6 @@ void irc_kill( irc_t *irc, user_t *u )  	g_free( nick );  } -void irc_invite( irc_t *irc, char *nick, char *channel ) -{ -	struct conversation *c = conv_findchannel( channel ); -	user_t *u = user_find( irc, nick ); -	 -	if( u && c && ( u->gc == c->gc ) ) -		if( c->gc && c->gc->prpl && c->gc->prpl->chat_invite ) -		{ -			c->gc->prpl->chat_invite( c->gc, c->id, "", u->handle ); -			irc_reply( irc, 341, "%s %s", nick, channel ); -			return; -		} -	 -	irc_reply( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel ); -} -  int irc_send( irc_t *irc, char *nick, char *s, int flags )  {  	struct conversation *c = NULL; @@ -1429,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 )  	{ @@ -1455,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 )  	{ @@ -1493,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 );  	}  } @@ -1603,8 +1148,7 @@ static gboolean irc_userping( gpointer _irc )  	if( rv > 0 )  	{ -		irc_write( irc, "ERROR :Closing Link: Ping Timeout: %d seconds", rv ); -		irc_free( irc ); +		irc_abort( irc, 0, "Ping Timeout: %d seconds", rv );  		return FALSE;  	} @@ -32,24 +32,19 @@  #define IRC_LOGIN_TIMEOUT 60  #define IRC_PING_STRING "PinglBee" -/* #define FLOOD_SEND  - * Not yet enabled by default due to some problems. - */ -#define FLOOD_SEND_INTERVAL 30 -#define FLOOD_SEND_BYTES (1024*10) -#define FLOOD_SEND_MAXBUFFER (1024*20) - -#define UMODES "ais" +#define UMODES "iasw" +#define UMODES_PRIV "Ro"  #define CMODES "nt"  #define CMODE "t"  #define UMODE "s"  typedef enum  { -	USTATUS_OFFLINE, +	USTATUS_OFFLINE = 0,  	USTATUS_AUTHORIZED,  	USTATUS_LOGGED_IN, -	USTATUS_IDENTIFIED +	USTATUS_IDENTIFIED, +	USTATUS_SHUTDOWN = -1  } irc_status_t;  typedef struct channel @@ -109,11 +104,13 @@ typedef struct irc  extern GSList *irc_connection_list;  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 ); -int irc_process_line( irc_t *irc, char *line ); +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 );  void irc_vawrite( irc_t *irc, char *format, va_list params );  void irc_write( irc_t *irc, char *format, ... ); @@ -123,10 +120,11 @@ G_MODULE_EXPORT int irc_usermsg( irc_t *irc, char *format, ... );  char **irc_tokenize( char *buffer );  void irc_login( irc_t *irc ); +int irc_check_login( irc_t *irc );  void irc_motd( irc_t *irc );  void irc_names( irc_t *irc, char *channel );  void irc_topic( irc_t *irc, char *channel ); -void irc_umode_set( irc_t *irc, char *who, char *s ); +void irc_umode_set( irc_t *irc, char *s, int allow_priv );  void irc_who( irc_t *irc, char *channel );  void irc_spawn( irc_t *irc, user_t *u );  void irc_join( irc_t *irc, user_t *u, char *channel ); @@ -135,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 ); @@ -143,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 new file mode 100644 index 00000000..66c39bc5 --- /dev/null +++ b/irc_commands.c @@ -0,0 +1,621 @@ +  /********************************************************************\ +  * BitlBee -- An IRC to other IM-networks gateway                     * +  *                                                                    * +  * Copyright 2002-2006 Wilmer van der Gaast and others                * +  \********************************************************************/ + +/* IRC commands                                                         */ + +/* +  This program is free software; you can redistribute it and/or modify +  it under the terms of the GNU General Public License as published by +  the Free Software Foundation; either version 2 of the License, or +  (at your option) any later version. + +  This program is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +  GNU General Public License for more details. + +  You should have received a copy of the GNU General Public License with +  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; +  if not, write to the Free Software Foundation, Inc., 59 Temple Place, +  Suite 330, Boston, MA  02111-1307  USA +*/ + +#define BITLBEE_CORE +#include "bitlbee.h" +#include "ipc.h" + +static void irc_cmd_pass( irc_t *irc, char **cmd ) +{ +	if( global.conf->auth_pass && strcmp( cmd[1], global.conf->auth_pass ) == 0 ) +	{ +		irc->status = USTATUS_AUTHORIZED; +		irc_check_login( irc ); +	} +	else +	{ +		irc_reply( irc, 464, ":Incorrect password" ); +	} +} + +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 ); +} + +static void irc_cmd_nick( irc_t *irc, char **cmd ) +{ +	if( irc->nick ) +	{ +		irc_reply( irc, 438, ":The hand of the deity is upon thee, thy nick may not change" ); +	} +	/* This is not clean, but for now it'll have to be like this... */ +	else if( ( nick_cmp( cmd[1], irc->mynick ) == 0 ) || ( nick_cmp( cmd[1], NS_NICK ) == 0 ) ) +	{ +		irc_reply( irc, 433, ":This nick is already in use" ); +	} +	else if( !nick_ok( cmd[1] ) ) +	{ +		/* [SH] Invalid characters. */ +		irc_reply( irc, 432, ":This nick contains invalid characters" ); +	} +	else +	{ +		irc->nick = g_strdup( cmd[1] ); +		 +		irc_check_login( irc ); +	} +} + +static void irc_cmd_quit( irc_t *irc, char **cmd ) +{ +	if( cmd[1] && *cmd[1] ) +		irc_abort( irc, 0, "Quit: %s", cmd[1] ); +	else +		irc_abort( irc, 0, "Leaving..." ); +} + +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 ); +} + +static void irc_cmd_oper( irc_t *irc, char **cmd ) +{ +	if( global.conf->oper_pass && strcmp( cmd[2], global.conf->oper_pass ) == 0 ) +	{ +		irc_umode_set( irc, "+o", 1 ); +		irc_reply( irc, 381, ":Password accepted" ); +	} +	else +	{ +		irc_reply( irc, 432, ":Incorrect password" ); +	} +} + +static void irc_cmd_mode( irc_t *irc, char **cmd ) +{ +	if( *cmd[1] == '#' || *cmd[1] == '&' ) +	{ +		if( cmd[2] ) +		{ +			if( *cmd[2] == '+' || *cmd[2] == '-' ) +				irc_reply( irc, 477, "%s :Can't change channel modes", cmd[1] ); +			else if( *cmd[2] == 'b' ) +				irc_reply( irc, 368, "%s :No bans possible", cmd[1] ); +		} +		else +			irc_reply( irc, 324, "%s +%s", cmd[1], CMODE ); +	} +	else +	{ +		if( nick_cmp( cmd[1], irc->nick ) == 0 ) +		{ +			if( cmd[2] ) +				irc_umode_set( irc, cmd[2], 0 ); +		} +		else +			irc_reply( irc, 502, ":Don't touch their modes" ); +	} +} + +static void irc_cmd_names( irc_t *irc, char **cmd ) +{ +	irc_names( irc, cmd[1]?cmd[1]:irc->channel ); +} + +static void irc_cmd_part( irc_t *irc, char **cmd ) +{ +	struct conversation *c; +	 +	if( g_strcasecmp( cmd[1], irc->channel ) == 0 ) +	{ +		user_t *u = user_find( irc, irc->nick ); +		 +		/* Not allowed to leave control channel */ +		irc_part( irc, u, irc->channel ); +		irc_join( irc, u, irc->channel ); +	} +	else if( ( c = conv_findchannel( cmd[1] ) ) ) +	{ +		user_t *u = user_find( irc, irc->nick ); +		 +		irc_part( irc, u, c->channel ); +		 +		if( c->gc && c->gc->prpl ) +		{ +			c->joined = 0; +			c->gc->prpl->chat_leave( c->gc, c->id ); +		} +	} +	else +	{ +		irc_reply( irc, 403, "%s :No such channel", cmd[1] ); +	} +} + +static void irc_cmd_join( irc_t *irc, char **cmd ) +{ +	if( g_strcasecmp( cmd[1], irc->channel ) == 0 ) +		; /* Dude, you're already there... +		     RFC doesn't have any reply for that though? */ +	else if( cmd[1] ) +	{ +		if( ( cmd[1][0] == '#' || cmd[1][0] == '&' ) && cmd[1][1] ) +		{ +			user_t *u = user_find( irc, cmd[1] + 1 ); +			 +			if( u && u->gc && u->gc->prpl && u->gc->prpl->chat_open ) +			{ +				irc_reply( irc, 403, "%s :Initializing groupchat in a different channel", cmd[1] ); +				 +				if( !u->gc->prpl->chat_open( u->gc, u->handle ) ) +				{ +					irc_usermsg( irc, "Could not open a groupchat with %s, maybe you don't have a connection to him/her yet?", u->nick ); +				} +			} +			else if( u ) +			{ +				irc_reply( irc, 403, "%s :Groupchats are not possible with %s", cmd[1], cmd[1]+1 ); +			} +			else +			{ +				irc_reply( irc, 403, "%s :No such nick", cmd[1] ); +			} +		} +		else +		{ +			irc_reply( irc, 403, "%s :No such channel", cmd[1] ); +		} +	} +} + +static void irc_cmd_invite( irc_t *irc, char **cmd ) +{ +	char *nick = cmd[1], *channel = cmd[2]; +	struct conversation *c = conv_findchannel( channel ); +	user_t *u = user_find( irc, nick ); +	 +	if( u && c && ( u->gc == c->gc ) ) +		if( c->gc && c->gc->prpl && c->gc->prpl->chat_invite ) +		{ +			c->gc->prpl->chat_invite( c->gc, c->id, "", u->handle ); +			irc_reply( irc, 341, "%s %s", nick, channel ); +			return; +		} +	 +	irc_reply( irc, 482, "%s :Invite impossible; User/Channel non-existent or incompatible", channel ); +} + +static void irc_cmd_privmsg( irc_t *irc, char **cmd ) +{ +	if ( !cmd[2] )  +	{ +		irc_reply( irc, 412, ":No text to send" ); +	} +	else if ( irc->nick && g_strcasecmp( cmd[1], irc->nick ) == 0 )  +	{ +		irc_write( irc, ":%s!%s@%s %s %s :%s", irc->nick, irc->user, irc->host, cmd[0], cmd[1], cmd[2] );  +	} +	else  +	{ +		if( g_strcasecmp( cmd[1], irc->channel ) == 0 ) +		{ +			unsigned int i; +			char *t = set_getstr( irc, "default_target" ); +			 +			if( g_strcasecmp( t, "last" ) == 0 && irc->last_target ) +				cmd[1] = irc->last_target; +			else if( g_strcasecmp( t, "root" ) == 0 ) +				cmd[1] = irc->mynick; +			 +			for( i = 0; i < strlen( cmd[2] ); i ++ ) +			{ +				if( cmd[2][i] == ' ' ) break; +				if( cmd[2][i] == ':' || cmd[2][i] == ',' ) +				{ +					cmd[1] = cmd[2]; +					cmd[2] += i; +					*cmd[2] = 0; +					while( *(++cmd[2]) == ' ' ); +					break; +				} +			} +			 +			irc->is_private = 0; +			 +			if( cmd[1] != irc->last_target ) +			{ +				if( irc->last_target ) +					g_free( irc->last_target ); +				irc->last_target = g_strdup( cmd[1] ); +			} +		} +		else +		{ +			irc->is_private = 1; +		} +		irc_send( irc, cmd[1], cmd[2], ( g_strcasecmp( cmd[0], "NOTICE" ) == 0 ) ? IM_FLAG_AWAY : 0 ); +	} +} + +static void irc_cmd_who( irc_t *irc, char **cmd ) +{ +	char *channel = cmd[1]; +	user_t *u = irc->users; +	struct conversation *c; +	GList *l; +	 +	if( !channel || *channel == '0' || *channel == '*' || !*channel ) +		while( u ) +		{ +			irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", u->online ? irc->channel : "*", u->user, u->host, irc->myhost, u->nick, u->online ? ( u->away ? 'G' : 'H' ) : 'G', u->realname ); +			u = u->next; +		} +	else if( g_strcasecmp( channel, irc->channel ) == 0 ) +		while( u ) +		{ +			if( u->online ) +				irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname ); +			u = u->next; +		} +	else if( ( c = conv_findchannel( channel ) ) ) +		for( l = c->in_room; l; l = l->next ) +		{ +			if( ( u = user_findhandle( c->gc, l->data ) ) ) +				irc_reply( irc, 352, "%s %s %s %s %s %c :0 %s", channel, u->user, u->host, irc->myhost, u->nick, u->away ? 'G' : 'H', u->realname ); +		} +	else if( ( u = user_find( irc, channel ) ) ) +		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:"**" ); +} + +static void irc_cmd_userhost( irc_t *irc, char **cmd ) +{ +	user_t *u; +	int i; +	 +	/* [TV] Usable USERHOST-implementation according to +		RFC1459. Without this, mIRC shows an error +		while connecting, and the used way of rejecting +		breaks standards. +	*/ +	 +	for( i = 1; cmd[i]; i ++ ) +		if( ( u = user_find( irc, cmd[i] ) ) ) +		{ +			if( u->online && u->away ) +				irc_reply( irc, 302, ":%s=-%s@%s", u->nick, u->user, u->host ); +			else +				irc_reply( irc, 302, ":%s=+%s@%s", u->nick, u->user, u->host ); +		} +} + +static void irc_cmd_ison( irc_t *irc, char **cmd ) +{ +	user_t *u; +	char buff[IRC_MAX_LINE]; +	int lenleft, i; +	 +	buff[0] = '\0'; +	 +	/* [SH] Leave room for : and \0 */ +	lenleft = IRC_MAX_LINE - 2; +	 +	for( i = 1; cmd[i]; i ++ ) +	{ +		if( ( u = user_find( irc, cmd[i] ) ) && u->online ) +		{ +			/* [SH] Make sure we don't use too much buffer space. */ +			lenleft -= strlen( u->nick ) + 1; +			 +			if( lenleft < 0 ) +			{ +				break; +			} +			 +			/* [SH] Add the nick to the buffer. Note +			 * that an extra space is always added. Even +			 * if it's the last nick in the list. Who +			 * cares? +			 */ +			 +			strcat( buff, u->nick ); +			strcat( buff, " " ); +		} +	} +	 +	/* [WvG] Well, maybe someone cares, so why not remove it? */ +	if( strlen( buff ) > 0 ) +		buff[strlen(buff)-1] = '\0'; +	 +	irc_reply( irc, 303, ":%s", buff ); +} + +static void irc_cmd_watch( irc_t *irc, char **cmd ) +{ +	int i; +	 +	/* Obviously we could also mark a user structure as being +	   watched, but what if the WATCH command is sent right +	   after connecting? The user won't exist yet then... */ +	for( i = 1; cmd[i]; i ++ ) +	{ +		char *nick; +		user_t *u; +		 +		if( !cmd[i][0] || !cmd[i][1] ) +			break; +		 +		nick = g_strdup( cmd[i] + 1 ); +		nick_lc( nick ); +		 +		u = user_find( irc, nick ); +		 +		if( cmd[i][0] == '+' ) +		{ +			if( !g_hash_table_lookup( irc->watches, nick ) ) +				g_hash_table_insert( irc->watches, nick, nick ); +			 +			if( u && u->online ) +				irc_reply( irc, 604, "%s %s %s %d :%s", u->nick, u->user, u->host, time( NULL ), "is online" ); +			else +				irc_reply( irc, 605, "%s %s %s %d :%s", nick, "*", "*", time( NULL ), "is offline" ); +		} +		else if( cmd[i][0] == '-' ) +		{ +			gpointer okey, ovalue; +			 +			if( g_hash_table_lookup_extended( irc->watches, nick, &okey, &ovalue ) ) +			{ +				g_free( okey ); +				g_hash_table_remove( irc->watches, okey ); +				 +				irc_reply( irc, 602, "%s %s %s %d :%s", nick, "*", "*", 0, "Stopped watching" ); +			} +		} +	} +} + +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] ); +} + +static void irc_cmd_away( irc_t *irc, char **cmd ) +{ +	user_t *u = user_find( irc, irc->nick ); +	char *away = cmd[1]; +	account_t *a; +	 +	if( !u ) return; +	 +	if( away && *away ) +	{ +		int i, j; +		 +		/* Copy away string, but skip control chars. Mainly because +		   Jabber really doesn't like them. */ +		u->away = g_malloc( strlen( away ) + 1 ); +		for( i = j = 0; away[i]; i ++ ) +			if( ( u->away[j] = away[i] ) >= ' ' ) +				j ++; +		u->away[j] = 0; +		 +		irc_reply( irc, 306, ":You're now away: %s", u->away ); +		/* irc_umode_set( irc, irc->myhost, "+a" ); */ +	} +	else +	{ +		if( u->away ) g_free( u->away ); +		u->away = NULL; +		/* irc_umode_set( irc, irc->myhost, "-a" ); */ +		irc_reply( irc, 305, ":Welcome back" ); +	} +	 +	for( a = irc->accounts; a; a = a->next ) +	{ +		struct gaim_connection *gc = a->gc; +		 +		if( gc && gc->flags & OPT_LOGGED_IN ) +			proto_away( gc, u->away ); +	} +} + +static void irc_cmd_whois( irc_t *irc, char **cmd ) +{ +	char *nick = cmd[1]; +	user_t *u = user_find( irc, nick ); +	 +	if( u ) +	{ +		irc_reply( irc, 311, "%s %s %s * :%s", u->nick, u->user, u->host, u->realname ); +		 +		if( u->gc ) +			irc_reply( irc, 312, "%s %s.%s :%s network", u->nick, u->gc->user->username, +			           *u->gc->user->proto_opt[0] ? u->gc->user->proto_opt[0] : "", u->gc->prpl->name ); +		else +			irc_reply( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO ); +		 +		if( !u->online ) +			irc_reply( irc, 301, "%s :%s", u->nick, "User is offline" ); +		else if( u->away ) +			irc_reply( irc, 301, "%s :%s", u->nick, u->away ); +		 +		irc_reply( irc, 318, "%s :End of /WHOIS list", nick ); +	} +	else +	{ +		irc_reply( irc, 401, "%s :Nick does not exist", nick ); +	} +} + +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" +	   message from irssi which is a bit annoying. So just respond +	   with not-found and irssi users will get better error messages */ +	 +	irc_reply( irc, 406, "%s :Nick does not exist", cmd[1] ); +	irc_reply( irc, 369, "%s :End of WHOWAS", cmd[1] ); +} + +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 ); +} + +static void irc_cmd_motd( irc_t *irc, char **cmd ) +{ +	irc_motd( irc ); +} + +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; +} + +static void irc_cmd_completions( irc_t *irc, char **cmd ) +{ +	user_t *u = user_find( irc, irc->mynick ); +	help_t *h; +	set_t *s; +	int i; +	 +	irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "OK" ); +	 +	for( i = 0; commands[i].command; i ++ ) +		irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", commands[i].command ); +	 +	for( h = global.help; h; h = h->next ) +		irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS help ", h->string ); +	 +	for( s = irc->set; s; s = s->next ) +		irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS set ", s->key ); +	 +	irc_privmsg( irc, u, "NOTICE", irc->nick, "COMPLETIONS ", "END" ); +} + +static void irc_cmd_rehash( irc_t *irc, char **cmd ) +{ +	if( global.conf->runmode == RUNMODE_INETD ) +		ipc_master_cmd_rehash( NULL, NULL ); +	else +		ipc_to_master( cmd ); +	 +	irc_reply( irc, 382, "%s :Rehashing", CONF_FILE ); +} + +static const command_t irc_commands[] = { +	{ "pass",        1, irc_cmd_pass,        IRC_CMD_PRE_LOGIN }, +	{ "user",        4, irc_cmd_user,        IRC_CMD_PRE_LOGIN }, +	{ "nick",        1, irc_cmd_nick,        0 }, +	{ "quit",        0, irc_cmd_quit,        0 }, +	{ "ping",        0, irc_cmd_ping,        0 }, +	{ "oper",        2, irc_cmd_oper,        IRC_CMD_LOGGED_IN }, +	{ "mode",        1, irc_cmd_mode,        IRC_CMD_LOGGED_IN }, +	{ "names",       0, irc_cmd_names,       IRC_CMD_LOGGED_IN }, +	{ "part",        1, irc_cmd_part,        IRC_CMD_LOGGED_IN }, +	{ "join",        1, irc_cmd_join,        IRC_CMD_LOGGED_IN }, +	{ "invite",      2, irc_cmd_invite,      IRC_CMD_LOGGED_IN }, +	{ "privmsg",     1, irc_cmd_privmsg,     IRC_CMD_LOGGED_IN }, +	{ "notice",      1, irc_cmd_privmsg,     IRC_CMD_LOGGED_IN }, +	{ "who",         0, irc_cmd_who,         IRC_CMD_LOGGED_IN }, +	{ "userhost",    1, irc_cmd_userhost,    IRC_CMD_LOGGED_IN }, +	{ "ison",        1, irc_cmd_ison,        IRC_CMD_LOGGED_IN }, +	{ "watch",       1, irc_cmd_watch,       IRC_CMD_LOGGED_IN }, +	{ "topic",       1, irc_cmd_topic,       IRC_CMD_LOGGED_IN }, +	{ "away",        0, irc_cmd_away,        IRC_CMD_LOGGED_IN }, +	{ "whois",       1, irc_cmd_whois,       IRC_CMD_LOGGED_IN }, +	{ "whowas",      1, irc_cmd_whowas,      IRC_CMD_LOGGED_IN }, +	{ "nickserv",    1, irc_cmd_nickserv,    IRC_CMD_LOGGED_IN }, +	{ "ns",          1, irc_cmd_nickserv,    IRC_CMD_LOGGED_IN }, +	{ "motd",        0, irc_cmd_motd,        IRC_CMD_LOGGED_IN }, +	{ "pong",        0, irc_cmd_pong,        IRC_CMD_LOGGED_IN }, +	{ "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN }, +	{ "die",         0, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, +	{ "wallops",     1, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, +	{ "lilo",        1, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, +	{ "rehash",      0, irc_cmd_rehash,      IRC_CMD_OPER_ONLY }, +	{ "kill",        2, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER }, +	{ NULL } +}; + +void irc_exec( irc_t *irc, char *cmd[] ) +{	 +	int i, n_arg; +	 +	if( !cmd[0] ) +		return; +	 +	for( i = 0; irc_commands[i].command; i++ ) +		if( g_strcasecmp( irc_commands[i].command, cmd[0] ) == 0 ) +		{ +			/* There should be no typo in the next line: */ +			for( n_arg = 0; cmd[n_arg]; n_arg ++ ); n_arg --; +			 +			if( irc_commands[i].flags & IRC_CMD_PRE_LOGIN && irc->status >= USTATUS_LOGGED_IN ) +			{ +				irc_reply( irc, 462, ":Only allowed before logging in" ); +			} +			else if( irc_commands[i].flags & IRC_CMD_LOGGED_IN && irc->status < USTATUS_LOGGED_IN ) +			{ +				irc_reply( irc, 451, ":Register first" ); +			} +			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" ); +			} +			else if( n_arg < 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 +			{ +				irc_commands[i].execute( irc, cmd ); +			} +			 +			break; +		} +} @@ -37,11 +37,11 @@ static void log_console(int level, char *logmessage);  void log_init(void) {  	openlog("bitlbee", LOG_PID, LOG_DAEMON);	 -	logoutput.informational=&log_null; -	logoutput.warning=&log_null; -	logoutput.error=&log_null; +	logoutput.informational = &log_null; +	logoutput.warning = &log_null; +	logoutput.error = &log_null;  #ifdef DEBUG -	logoutput.debug=&log_null; +	logoutput.debug = &log_null;  #endif  	return; @@ -50,46 +50,46 @@ void log_init(void) {  void log_link(int level, int output) {  	/* I know it's ugly, but it works and I didn't feel like messing with pointer to function pointers */ -	if(level==LOGLVL_INFO) { -		if(output==LOGOUTPUT_NULL) -			logoutput.informational=&log_null;	 -		else if(output==LOGOUTPUT_IRC) -			logoutput.informational=&log_irc;	 -		else if(output==LOGOUTPUT_SYSLOG) -			logoutput.informational=&log_syslog;	 -		else if(output==LOGOUTPUT_CONSOLE)  -			logoutput.informational=&log_console;	 +	if(level == LOGLVL_INFO) { +		if(output == LOGOUTPUT_NULL) +			logoutput.informational = &log_null;	 +		else if(output == LOGOUTPUT_IRC) +			logoutput.informational = &log_irc;	 +		else if(output == LOGOUTPUT_SYSLOG) +			logoutput.informational = &log_syslog;	 +		else if(output == LOGOUTPUT_CONSOLE)  +			logoutput.informational = &log_console;	  	} -	else if(level==LOGLVL_WARNING) { -		if(output==LOGOUTPUT_NULL) -			logoutput.warning=&log_null; -		else if(output==LOGOUTPUT_IRC) -			logoutput.warning=&log_irc; -		else if(output==LOGOUTPUT_SYSLOG) -			logoutput.warning=&log_syslog; -		else if(output==LOGOUTPUT_CONSOLE) -			logoutput.warning=&log_console; +	else if(level == LOGLVL_WARNING) { +		if(output == LOGOUTPUT_NULL) +			logoutput.warning = &log_null; +		else if(output == LOGOUTPUT_IRC) +			logoutput.warning = &log_irc; +		else if(output == LOGOUTPUT_SYSLOG) +			logoutput.warning = &log_syslog; +		else if(output == LOGOUTPUT_CONSOLE) +			logoutput.warning = &log_console;  	} -	else if(level==LOGLVL_ERROR) { -		if(output==LOGOUTPUT_NULL) -			logoutput.error=&log_null; -		else if(output==LOGOUTPUT_IRC) -			logoutput.error=&log_irc; -		else if(output==LOGOUTPUT_SYSLOG) -			logoutput.error=&log_syslog; -		else if(output==LOGOUTPUT_CONSOLE) -			logoutput.error=&log_console; +	else if(level == LOGLVL_ERROR) { +		if(output == LOGOUTPUT_NULL) +			logoutput.error = &log_null; +		else if(output == LOGOUTPUT_IRC) +			logoutput.error = &log_irc; +		else if(output == LOGOUTPUT_SYSLOG) +			logoutput.error = &log_syslog; +		else if(output == LOGOUTPUT_CONSOLE) +			logoutput.error = &log_console;  	}  #ifdef DEBUG -	else if(level==LOGLVL_DEBUG) { -		if(output==LOGOUTPUT_NULL) -			logoutput.debug=&log_null; -		else if(output==LOGOUTPUT_IRC) -			logoutput.debug=&log_irc; -		else if(output==LOGOUTPUT_SYSLOG) -			logoutput.debug=&log_syslog; -		else if(output==LOGOUTPUT_CONSOLE) -			logoutput.debug=&log_console; +	else if(level == LOGLVL_DEBUG) { +		if(output == LOGOUTPUT_NULL) +			logoutput.debug = &log_null; +		else if(output == LOGOUTPUT_IRC) +			logoutput.debug = &log_irc; +		else if(output == LOGOUTPUT_SYSLOG) +			logoutput.debug = &log_syslog; +		else if(output == LOGOUTPUT_CONSOLE) +			logoutput.debug = &log_console;  	}  #endif  	return;	 @@ -105,14 +105,14 @@ void log_message(int level, char *message, ... ) {  	msgstring = g_strdup_vprintf(message, ap);  	va_end(ap); -	if(level==LOGLVL_INFO) +	if(level == LOGLVL_INFO)  		(*(logoutput.informational))(level, msgstring); -	if(level==LOGLVL_WARNING)  +	if(level == LOGLVL_WARNING)   		(*(logoutput.warning))(level, msgstring); -	if(level==LOGLVL_ERROR) +	if(level == LOGLVL_ERROR)  		(*(logoutput.error))(level, msgstring);  #ifdef DEBUG -	if(level==LOGLVL_DEBUG) +	if(level == LOGLVL_DEBUG)  		(*(logoutput.debug))(level, msgstring);  #endif @@ -132,14 +132,14 @@ static void log_null(int level, char *message) {  }  static void log_irc(int level, char *message) { -	if(level==LOGLVL_ERROR) +	if(level == LOGLVL_ERROR)  		irc_write_all(1, "ERROR :Error: %s", message); -	if(level==LOGLVL_WARNING) +	if(level == LOGLVL_WARNING)  		irc_write_all(0, "ERROR :Warning: %s", message); -	if(level==LOGLVL_INFO) +	if(level == LOGLVL_INFO)  		irc_write_all(0, "ERROR :Informational: %s", message);	  #ifdef DEBUG -	if(level==LOGLVL_DEBUG) +	if(level == LOGLVL_DEBUG)  		irc_write_all(0, "ERROR :Debug: %s", message);	  #endif	 @@ -147,28 +147,28 @@ static void log_irc(int level, char *message) {  }  static void log_syslog(int level, char *message) { -	if(level==LOGLVL_ERROR) +	if(level == LOGLVL_ERROR)  		syslog(LOG_ERR, "%s", message); -	if(level==LOGLVL_WARNING) +	if(level == LOGLVL_WARNING)  		syslog(LOG_WARNING, "%s", message); -	if(level==LOGLVL_INFO) +	if(level == LOGLVL_INFO)  		syslog(LOG_INFO, "%s", message);  #ifdef DEBUG -	if(level==LOGLVL_DEBUG) +	if(level == LOGLVL_DEBUG)  		syslog(LOG_DEBUG, "%s", message);  #endif  	return;  }  static void log_console(int level, char *message) { -	if(level==LOGLVL_ERROR) +	if(level == LOGLVL_ERROR)  		fprintf(stderr, "Error: %s\n", message); -	if(level==LOGLVL_WARNING) +	if(level == LOGLVL_WARNING)  		fprintf(stderr, "Warning: %s\n", message); -	if(level==LOGLVL_INFO) +	if(level == LOGLVL_INFO)  		fprintf(stdout, "Informational: %s\n", message);  #ifdef DEBUG -	if(level==LOGLVL_DEBUG) +	if(level == LOGLVL_DEBUG)  		fprintf(stdout, "Debug: %s\n", message);  #endif  	return; diff --git a/protocols/Makefile b/protocols/Makefile index 1ed6b52e..4016e7fd 100644 --- a/protocols/Makefile +++ b/protocols/Makefile @@ -9,7 +9,7 @@  -include ../Makefile.settings  # [SH] Program variables -objects = http_client.o md5.o nogaim.o proxy.o sha.o $(SSL_CLIENT) util.o +objects = http_client.o md5.o nogaim.o proxy.o sha.o $(SSL_CLIENT)  # [SH] The next two lines should contain the directory name (in $(subdirs))  #      and the name of the object file, which should be linked into diff --git a/protocols/http_client.c b/protocols/http_client.c index 51424e1c..9417e200 100644 --- a/protocols/http_client.c +++ b/protocols/http_client.c @@ -26,9 +26,9 @@  #include <string.h>  #include <stdio.h> -#include "sock.h"  #include "http_client.h"  #include "url.h" +#include "sock.h"  static void http_connected( gpointer data, int source, GaimInputCondition cond ); diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c index fc419124..ba652b8a 100644 --- a/protocols/jabber/jabber.c +++ b/protocols/jabber/jabber.c @@ -412,7 +412,7 @@ static void gjab_recv(gjconn gjc)  		XML_Parse(gjc->parser, buf, len, 0);  		if (jd->die)  			signoff(GJ_GC(gjc)); -	} else if (len < 0 || errno != EAGAIN) { +	} else if (len == 0 || (len < 0 && (!sockerr_again() || gjc->ssl))) {  		STATE_EVT(JCONN_STATE_OFF)  	}  } @@ -1248,14 +1248,10 @@ static void jabber_handleauthresp(gjconn gjc, jpacket p)  			}  			gjab_auth(gjc);  		} else { +			gjab_reqroster(gjc);  			account_online(GJ_GC(gjc)); - -			if (bud_list_cache_exists(GJ_GC(gjc))) -				do_import(GJ_GC(gjc), NULL); - +			  			((struct jabber_data *)GJ_GC(gjc)->proto_data)->did_import = TRUE; - -			gjab_reqroster(gjc);  		}  	} else {  		xmlnode xerr; @@ -1859,11 +1855,7 @@ static void jabber_set_away(struct gaim_connection *gc, char *state, char *messa  			y = xmlnode_insert_tag(x, "show");  			xmlnode_insert_cdata(y, "away", -1);  			y = xmlnode_insert_tag(x, "status"); -			{ -				char *utf8 = str_to_utf8(message); -				xmlnode_insert_cdata(y, utf8, -1); -				g_free(utf8); -			} +			xmlnode_insert_cdata(y, message, -1);  			gc->away = "";  		} else {  			/* Gaim wants us to not be away */ diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c index b828d31c..b03c898e 100644 --- a/protocols/msn/msn.c +++ b/protocols/msn/msn.c @@ -169,17 +169,17 @@ static GList *msn_away_states( struct gaim_connection *gc )  	int i;  	for( i = 0; msn_away_state_list[i].number > -1; i ++ ) -		l = g_list_append( l, msn_away_state_list[i].name ); +		l = g_list_append( l, (void*) msn_away_state_list[i].name );  	return( l );  }  static char *msn_get_status_string( struct gaim_connection *gc, int number )  { -	struct msn_away_state *st = msn_away_state_by_number( number ); +	const struct msn_away_state *st = msn_away_state_by_number( number );  	if( st ) -		return( st->name ); +		return( (char*) st->name );  	else  		return( "" );  } @@ -188,7 +188,7 @@ static void msn_set_away( struct gaim_connection *gc, char *state, char *message  {  	char buf[1024];  	struct msn_data *md = gc->proto_data; -	struct msn_away_state *st; +	const struct msn_away_state *st;  	if( strcmp( state, GAIM_AWAY_CUSTOM ) == 0 )  		st = msn_away_state_by_name( "Away" ); diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h index c8c7a788..9727c537 100644 --- a/protocols/msn/msn.h +++ b/protocols/msn/msn.h @@ -66,7 +66,7 @@ struct msn_data  	GSList *msgq;  	GSList *switchboards;  	int buddycount; -	struct msn_away_state *away_state; +	const struct msn_away_state *away_state;  };  struct msn_switchboard @@ -130,8 +130,8 @@ struct msn_handler_data  #define STATUS_SB_CHAT_SPARE	8	/* Same, but also for groupchats (not used yet). */  int msn_chat_id; -extern struct msn_away_state msn_away_state_list[]; -extern struct msn_status_code msn_status_code_list[]; +extern const struct msn_away_state msn_away_state_list[]; +extern const struct msn_status_code msn_status_code_list[];  /* Keep a list of all the active connections. We need these lists because     "connected" callbacks might be called when the connection they belong too @@ -155,10 +155,10 @@ char **msn_linesplit( char *line );  int msn_handler( struct msn_handler_data *h );  /* tables.c */ -struct msn_away_state *msn_away_state_by_number( int number ); -struct msn_away_state *msn_away_state_by_code( char *code ); -struct msn_away_state *msn_away_state_by_name( char *name ); -struct msn_status_code *msn_status_by_number( int number ); +const struct msn_away_state *msn_away_state_by_number( int number ); +const struct msn_away_state *msn_away_state_by_code( char *code ); +const struct msn_away_state *msn_away_state_by_name( char *name ); +const struct msn_status_code *msn_status_by_number( int number );  /* sb.c */  int msn_sb_write( struct msn_switchboard *sb, char *s, int len ); diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c index 2d90b2f3..4ced58a0 100644 --- a/protocols/msn/ns.c +++ b/protocols/msn/ns.c @@ -364,7 +364,7 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  	}  	else if( strcmp( cmd[0], "ILN" ) == 0 )  	{ -		struct msn_away_state *st; +		const struct msn_away_state *st;  		if( num_parts != 6 )  		{ @@ -392,7 +392,7 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  	}  	else if( strcmp( cmd[0], "NLN" ) == 0 )  	{ -		struct msn_away_state *st; +		const struct msn_away_state *st;  		if( num_parts != 5 )  		{ @@ -538,7 +538,7 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )  	else if( isdigit( cmd[0][0] ) )  	{  		int num = atoi( cmd[0] ); -		struct msn_status_code *err = msn_status_by_number( num ); +		const struct msn_status_code *err = msn_status_by_number( num );  		g_snprintf( buf, sizeof( buf ), "Error reported by MSN server: %s", err->text );  		do_error_dialog( gc, buf, "MSN" ); diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c index 11728f03..9e7ef841 100644 --- a/protocols/msn/sb.c +++ b/protocols/msn/sb.c @@ -511,7 +511,7 @@ static int msn_sb_command( gpointer data, char **cmd, int num_parts )  	else if( isdigit( cmd[0][0] ) )  	{  		int num = atoi( cmd[0] ); -		struct msn_status_code *err = msn_status_by_number( num ); +		const struct msn_status_code *err = msn_status_by_number( num );  		g_snprintf( buf, sizeof( buf ), "Error reported by switchboard server: %s", err->text );  		do_error_dialog( gc, buf, "MSN" ); diff --git a/protocols/msn/tables.c b/protocols/msn/tables.c index 2741048a..f8e98350 100644 --- a/protocols/msn/tables.c +++ b/protocols/msn/tables.c @@ -26,7 +26,7 @@  #include "nogaim.h"  #include "msn.h" -struct msn_away_state msn_away_state_list[] = +const struct msn_away_state msn_away_state_list[] =  {  	{  0, "NLN", "Available" },  	{  1, "BSY", "Busy" }, @@ -39,7 +39,7 @@ struct msn_away_state msn_away_state_list[] =  	{ -1, "",    "" }  }; -struct msn_away_state *msn_away_state_by_number( int number ) +const struct msn_away_state *msn_away_state_by_number( int number )  {  	int i; @@ -50,7 +50,7 @@ struct msn_away_state *msn_away_state_by_number( int number )  	return( NULL );  } -struct msn_away_state *msn_away_state_by_code( char *code ) +const struct msn_away_state *msn_away_state_by_code( char *code )  {  	int i; @@ -61,7 +61,7 @@ struct msn_away_state *msn_away_state_by_code( char *code )  	return( NULL );  } -struct msn_away_state *msn_away_state_by_name( char *name ) +const struct msn_away_state *msn_away_state_by_name( char *name )  {  	int i; @@ -72,7 +72,7 @@ struct msn_away_state *msn_away_state_by_name( char *name )  	return( NULL );  } -struct msn_status_code msn_status_code_list[] = +const struct msn_status_code msn_status_code_list[] =  {  	{ 200, "Invalid syntax",                                        0 },  	{ 201, "Invalid parameter",                                     0 }, @@ -143,7 +143,7 @@ struct msn_status_code msn_status_code_list[] =  	{  -1, NULL,                                                    0 }  }; -struct msn_status_code *msn_status_by_number( int number ) +const struct msn_status_code *msn_status_by_number( int number )  {  	static struct msn_status_code *unknown = NULL;  	int i; diff --git a/protocols/nogaim.h b/protocols/nogaim.h index 607a67de..3d45d0a0 100644 --- a/protocols/nogaim.h +++ b/protocols/nogaim.h @@ -287,19 +287,18 @@ G_MODULE_EXPORT void serv_got_chat_invite( struct gaim_connection *gc, char *han  G_MODULE_EXPORT struct conversation *serv_got_joined_chat( struct gaim_connection *gc, int id, char *handle );  G_MODULE_EXPORT void serv_got_chat_in( struct gaim_connection *gc, int id, char *who, int whisper, char *msg, time_t mtime );  G_MODULE_EXPORT void serv_got_chat_left( struct gaim_connection *gc, int id ); -/* void serv_finish_login( struct gaim_connection *gc ); */  /* util.c */ -G_MODULE_EXPORT char *utf8_to_str( const char *in ); -G_MODULE_EXPORT char *str_to_utf8( const char *in );  G_MODULE_EXPORT void strip_linefeed( gchar *text );  G_MODULE_EXPORT char *add_cr( char *text );  G_MODULE_EXPORT char *tobase64( const char *text );  G_MODULE_EXPORT char *normalize( const char *s );  G_MODULE_EXPORT time_t get_time( int year, int month, int day, int hour, int min, int sec );  G_MODULE_EXPORT void strip_html( char *msg ); -G_MODULE_EXPORT char * escape_html(const char *html); +G_MODULE_EXPORT char *escape_html( const char *html );  G_MODULE_EXPORT void info_string_append(GString *str, char *newline, char *name, char *value); +G_MODULE_EXPORT char *ipv6_wrap( char *src ); +G_MODULE_EXPORT char *ipv6_unwrap( char *src );  /* prefs.c */  G_MODULE_EXPORT void build_block_list(); diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c index 5f19f12b..4e552bce 100644 --- a/protocols/oscar/oscar.c +++ b/protocols/oscar/oscar.c @@ -20,7 +20,6 @@   *   */ -#include "sock.h"  #include <errno.h>  #include <ctype.h>  #include <string.h> @@ -32,6 +31,7 @@  #include "nogaim.h"  #include "bitlbee.h"  #include "proxy.h" +#include "sock.h"  #include "aim.h"  #include "icq.h" @@ -607,6 +607,7 @@ static void damn_you(gpointer data, gint source, GaimInputCondition c)  		g_free(pos);  		return;  	} +	/* [WvG] Wheeeee! Who needs error checking anyway? ;-) */  	read(pos->fd, m, 16);  	m[16] = '\0';  	gaim_input_remove(pos->inpa); diff --git a/protocols/oscar/rxqueue.c b/protocols/oscar/rxqueue.c index d8adaa73..6e8dd29c 100644 --- a/protocols/oscar/rxqueue.c +++ b/protocols/oscar/rxqueue.c @@ -352,8 +352,15 @@ int aim_get_command(aim_session_t *sess, aim_conn_t *conn)  	if (conn->fd == -1)  		return -1; /* its a aim_conn_close()'d connection */ -	if (conn->fd < 3)  /* can happen when people abuse the interface */ +	/* KIDS, THIS IS WHAT HAPPENS IF YOU USE CODE WRITTEN FOR GUIS IN A DAEMON! +	    +	   And wouldn't it make sense to return something that prevents this function +	   from being called again IMMEDIATELY (and making the program suck up all +	   CPU time)?... +	    +	if (conn->fd < 3)  		return 0; +	*/  	if (conn->status & AIM_CONN_STATUS_INPROGRESS)  		return aim_conn_completeconnect(sess, conn); diff --git a/protocols/oscar/service.c b/protocols/oscar/service.c index 875a2eb0..573e1983 100644 --- a/protocols/oscar/service.c +++ b/protocols/oscar/service.c @@ -736,8 +736,6 @@ int aim_setextstatus(aim_session_t *sess, aim_conn_t *conn, guint32 status)  	tlvlen = aim_addtlvtochain32(&tl, 0x0006, data); -	printf("%d\n", tlvlen); -  	if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 8)))  		return -ENOMEM; diff --git a/protocols/ssl_bogus.c b/protocols/ssl_bogus.c index 3766baaa..52406b75 100644 --- a/protocols/ssl_bogus.c +++ b/protocols/ssl_bogus.c @@ -50,3 +50,8 @@ int ssl_getfd( void *conn )  {  	return( -1 );  } + +GaimInputCondition ssl_getdirection( void *conn ) +{ +	return GAIM_INPUT_READ; +} diff --git a/protocols/yahoo/Makefile b/protocols/yahoo/Makefile index e594cc1f..b4014f8a 100644 --- a/protocols/yahoo/Makefile +++ b/protocols/yahoo/Makefile @@ -9,7 +9,7 @@  -include ../../Makefile.settings  # [SH] Program variables -objects = yahoo.o crypt.o libyahoo2.o yahoo_fn.o yahoo_httplib.o yahoo_list.o yahoo_util.o +objects = yahoo.o crypt.o libyahoo2.o yahoo_fn.o yahoo_httplib.o yahoo_util.o  CFLAGS += -Wall -DSTDC_HEADERS -DHAVE_STRING_H -DHAVE_STRCHR -DHAVE_MEMCPY -DHAVE_GLIB  LFLAGS += -r diff --git a/protocols/yahoo/yahoo.c b/protocols/yahoo/yahoo.c index 832d1ab4..4f257d99 100644 --- a/protocols/yahoo/yahoo.c +++ b/protocols/yahoo/yahoo.c @@ -188,18 +188,18 @@ static int byahoo_send_typing( struct gaim_connection *gc, char *who, int typing  static void byahoo_set_away( struct gaim_connection *gc, char *state, char *msg )  {  	struct byahoo_data *yd = (struct byahoo_data *) gc->proto_data; - +	  	gc->away = NULL; - -	if (msg) +	 +	if( msg )  	{  		yd->current_status = YAHOO_STATUS_CUSTOM;  		gc->away = "";  	} -	else if (state) +	if( state )  	{  		gc->away = ""; -		if( g_strcasecmp(state, "Available" ) == 0 ) +		if( g_strcasecmp( state, "Available" ) == 0 )  		{  			yd->current_status = YAHOO_STATUS_AVAILABLE;  			gc->away = NULL; @@ -234,12 +234,15 @@ static void byahoo_set_away( struct gaim_connection *gc, char *state, char *msg  			gc->away = NULL;  		}  	} -	else if ( gc->is_idle ) +	else if( gc->is_idle )  		yd->current_status = YAHOO_STATUS_IDLE;  	else  		yd->current_status = YAHOO_STATUS_AVAILABLE; -	yahoo_set_away( yd->y2_id, yd->current_status, msg, gc->away != NULL ); +	if( yd->current_status == YAHOO_STATUS_INVISIBLE ) +		yahoo_set_away( yd->y2_id, yd->current_status, NULL, gc->away != NULL ); +	else +		yahoo_set_away( yd->y2_id, yd->current_status, msg, gc->away != NULL );  }  static GList *byahoo_away_states( struct gaim_connection *gc ) diff --git a/protocols/yahoo/yahoo_fn.c b/protocols/yahoo/yahoo_fn.c index 6f14c263..9544999d 100644 --- a/protocols/yahoo/yahoo_fn.c +++ b/protocols/yahoo/yahoo_fn.c @@ -24,7 +24,7 @@  #include "yahoo_fn.h" -unsigned char table_0[256] = { +static const unsigned char table_0[256] = {     0x5A, 0x41, 0x11, 0x77, 0x29, 0x9C, 0x31, 0xAD,     0x4A, 0x32, 0x1A, 0x6D, 0x56, 0x9F, 0x39, 0xA6,     0x0C, 0xE8, 0x49, 0x40, 0xA4, 0x21, 0xE9, 0x01, @@ -58,7 +58,7 @@ unsigned char table_0[256] = {     0x0E, 0x8B, 0xAA, 0x3A, 0xB4, 0xFC, 0xA9, 0x94,     0x7B, 0xBE, 0xF9, 0xAF, 0x82, 0x63, 0x47, 0x23 }; -unsigned char table_1[256] = { +static const unsigned char table_1[256] = {     0x08, 0xCB, 0x54, 0xCF, 0x97, 0x53, 0x59, 0xF1,     0x66, 0xEC, 0xDB, 0x1B, 0xB1, 0xE2, 0x36, 0xEB,     0xB3, 0x8F, 0x71, 0xA8, 0x90, 0x7D, 0xDA, 0xDC, @@ -92,13 +92,13 @@ unsigned char table_1[256] = {     0x39, 0x80, 0x98, 0xFA, 0x25, 0x92, 0x30, 0x5B,     0x05, 0x95, 0xBB, 0x79, 0x61, 0x3E, 0x81, 0xF7 }; -unsigned char table_2[32] = { +static const unsigned char table_2[32] = {     0x19, 0x05, 0x09, 0x1C, 0x0B, 0x1A, 0x12, 0x03,     0x06, 0x04, 0x0D, 0x1D, 0x15, 0x0E, 0x1B, 0x18,     0x00, 0x07, 0x08, 0x02, 0x13, 0x1F, 0x0C, 0x1E,     0x16, 0x0A, 0x10, 0x0F, 0x01, 0x14, 0x11, 0x17 }; -unsigned char table_3[256] = { +static const unsigned char table_3[256] = {     0xBC, 0x1B, 0xCC, 0x1E, 0x5B, 0x59, 0x4F, 0xA8,     0x62, 0xC6, 0xC1, 0xBB, 0x83, 0x2D, 0xA3, 0xA6,     0x5A, 0xDC, 0xE5, 0x93, 0xFB, 0x5C, 0xD6, 0x2A, @@ -132,13 +132,13 @@ unsigned char table_3[256] = {     0xEA, 0x49, 0x23, 0x4D, 0xB3, 0x8E, 0xC3, 0x1F,     0x7C, 0xEF, 0xE0, 0x99, 0x09, 0xA0, 0x01, 0x7E }; -unsigned char table_4[32] = { +static const unsigned char table_4[32] = {     0x1F, 0x0B, 0x00, 0x1E, 0x03, 0x0E, 0x15, 0x01,     0x1A, 0x17, 0x1D, 0x1B, 0x11, 0x0F, 0x0A, 0x12,     0x13, 0x18, 0x02, 0x04, 0x09, 0x06, 0x0D, 0x07,     0x08, 0x05, 0x10, 0x19, 0x0C, 0x14, 0x16, 0x1C }; -unsigned char table_5[256] = { +static const unsigned char table_5[256] = {     0x9A, 0xAB, 0x61, 0x28, 0x0A, 0x23, 0xFC, 0xBA,     0x90, 0x22, 0xB7, 0x62, 0xD9, 0x09, 0x91, 0xF4,     0x7B, 0x5D, 0x6B, 0x80, 0xAC, 0x9E, 0x21, 0x72, @@ -172,13 +172,13 @@ unsigned char table_5[256] = {     0xDC, 0x0B, 0xCF, 0x31, 0xEA, 0xB2, 0x70, 0x4B,     0x46, 0x73, 0x69, 0xD5, 0x10, 0xEE, 0x02, 0xEF }; -unsigned char table_6[32] = { +static const unsigned char table_6[32] = {     0x1A, 0x1C, 0x0F, 0x0C, 0x00, 0x02, 0x13, 0x09,     0x11, 0x05, 0x0D, 0x12, 0x18, 0x0B, 0x04, 0x10,     0x14, 0x1B, 0x1E, 0x16, 0x07, 0x08, 0x03, 0x17,     0x19, 0x1F, 0x01, 0x0E, 0x15, 0x06, 0x0A, 0x1D }; -unsigned char table_7[256] = { +static const unsigned char table_7[256] = {     0x52, 0x11, 0x72, 0xD0, 0x76, 0xD7, 0xAE, 0x03,     0x7F, 0x19, 0xF4, 0xB8, 0xB3, 0x5D, 0xCA, 0x2D,     0x5C, 0x30, 0x53, 0x1A, 0x57, 0xF6, 0xAD, 0x83, @@ -212,13 +212,13 @@ unsigned char table_7[256] = {     0x36, 0xE6, 0x78, 0x4F, 0xC9, 0xE9, 0x2C, 0x43,     0x88, 0x9E, 0x9C, 0x5B, 0x4D, 0x3A, 0x39, 0xEF }; -unsigned char table_8[32] = { +static const unsigned char table_8[32] = {     0x13, 0x08, 0x1E, 0x1D, 0x17, 0x16, 0x07, 0x1F,     0x0E, 0x03, 0x1A, 0x19, 0x01, 0x12, 0x11, 0x10,     0x09, 0x0C, 0x0F, 0x14, 0x0B, 0x05, 0x00, 0x04,     0x1C, 0x18, 0x0A, 0x15, 0x02, 0x1B, 0x06, 0x0D }; -unsigned char table_9[256] = { +static const unsigned char table_9[256] = {     0x20, 0x2A, 0xDA, 0xFE, 0x76, 0x0D, 0xED, 0x39,     0x51, 0x4C, 0x46, 0x9A, 0xF1, 0xB0, 0x10, 0xC7,     0xD1, 0x6F, 0x18, 0x24, 0xB9, 0x7A, 0x4F, 0x47, @@ -252,13 +252,13 @@ unsigned char table_9[256] = {     0xEF, 0xB7, 0x31, 0xD0, 0xBF, 0x3A, 0x79, 0xE5,     0xF9, 0xF0, 0x2C, 0x74, 0xE9, 0x71, 0xC0, 0x2D }; -unsigned char table_10[32] = { +static const unsigned char table_10[32] = {     0x1D, 0x12, 0x11, 0x0D, 0x1E, 0x19, 0x16, 0x1B,     0x18, 0x13, 0x07, 0x17, 0x0C, 0x02, 0x00, 0x15,     0x0E, 0x08, 0x05, 0x01, 0x10, 0x06, 0x04, 0x0F,     0x1F, 0x1A, 0x0B, 0x09, 0x0A, 0x14, 0x1C, 0x03 }; -unsigned char table_11[256] = { +static const unsigned char table_11[256] = {     0x6B, 0x1D, 0xC6, 0x0A, 0xB7, 0xAC, 0xB2, 0x11,     0x29, 0xD3, 0xA2, 0x4D, 0xCB, 0x03, 0xEF, 0xA6,     0xC1, 0x5D, 0x75, 0x48, 0x35, 0x6C, 0xE2, 0x84, @@ -292,13 +292,13 @@ unsigned char table_11[256] = {     0xBF, 0xC7, 0x20, 0x7E, 0x6A, 0xC5, 0x88, 0xFC,     0x64, 0x76, 0xFF, 0x9F, 0x2E, 0x02, 0xCC, 0x57 }; -unsigned char table_12[32] = { +static const unsigned char table_12[32] = {     0x14, 0x1B, 0x18, 0x00, 0x1F, 0x15, 0x17, 0x07,     0x11, 0x1A, 0x0E, 0x13, 0x12, 0x06, 0x01, 0x03,     0x1C, 0x0C, 0x0B, 0x1D, 0x10, 0x0F, 0x09, 0x19,     0x0D, 0x1E, 0x04, 0x05, 0x08, 0x16, 0x0A, 0x02 }; -unsigned char table_13[256] = { +static const unsigned char table_13[256] = {     0x37, 0x8A, 0x1B, 0x91, 0xA5, 0x2B, 0x2D, 0x88,     0x8E, 0xFE, 0x0E, 0xD3, 0xF3, 0xE9, 0x7D, 0xD1,     0x24, 0xEA, 0xB1, 0x8B, 0x5C, 0xA4, 0x44, 0x7E, @@ -332,13 +332,13 @@ unsigned char table_13[256] = {     0x75, 0x93, 0x9F, 0x3A, 0x07, 0xE5, 0x89, 0xDF,     0x97, 0x4A, 0xB8, 0x7A, 0xF4, 0xFB, 0x04, 0xA8 }; -unsigned char table_14[32] = { +static const unsigned char table_14[32] = {     0x04, 0x14, 0x13, 0x15, 0x1A, 0x1B, 0x0F, 0x16,     0x02, 0x0D, 0x0C, 0x06, 0x10, 0x17, 0x01, 0x0B,     0x1E, 0x08, 0x1C, 0x18, 0x19, 0x0A, 0x1F, 0x05,     0x11, 0x09, 0x1D, 0x07, 0x0E, 0x12, 0x03, 0x00 }; -unsigned char table_15[256] = { +static const unsigned char table_15[256] = {     0x61, 0x48, 0x58, 0x41, 0x7F, 0x88, 0x43, 0x42,     0xD9, 0x80, 0x81, 0xFE, 0xC6, 0x49, 0xD7, 0x2C,     0xE6, 0x5B, 0xEE, 0xFF, 0x2A, 0x6F, 0xBF, 0x98, @@ -372,7 +372,7 @@ unsigned char table_15[256] = {     0xA1, 0x35, 0xAE, 0xB6, 0x10, 0x5C, 0x17, 0xBC,     0xAB, 0x8D, 0x02, 0x74, 0xBD, 0x3D, 0x8E, 0xDD }; -unsigned char table_16[256] = { +static const unsigned char table_16[256] = {     0x3F, 0x9C, 0x17, 0xC1, 0x59, 0xC6, 0x23, 0x93,     0x4B, 0xDF, 0xCB, 0x55, 0x2B, 0xDE, 0xCD, 0xAD,     0xB3, 0xE7, 0x42, 0x2F, 0x02, 0x5A, 0x7B, 0x5C, @@ -406,7 +406,7 @@ unsigned char table_16[256] = {     0x70, 0xDA, 0x7E, 0x47, 0x94, 0x61, 0xB0, 0x78,     0xF4, 0xBE, 0xEA, 0x19, 0x43, 0x01, 0xB1, 0x96 }; -unsigned char table_17[256] = { +static const unsigned char table_17[256] = {     0x7E, 0xF1, 0xD3, 0x75, 0x87, 0xA6, 0xED, 0x9E,     0xA9, 0xD5, 0xC6, 0xBF, 0xE6, 0x6A, 0xEE, 0x4B,     0x34, 0xDF, 0x4C, 0x7D, 0xDD, 0xFE, 0x3F, 0xAF, @@ -440,7 +440,7 @@ unsigned char table_17[256] = {     0xCA, 0x83, 0x26, 0x5C, 0xA5, 0x44, 0x64, 0x6D,     0x9F, 0x99, 0x62, 0xAA, 0xFA, 0x11, 0x0C, 0x52 }; -unsigned char table_18[256] = { +static const unsigned char table_18[256] = {     0x0F, 0x42, 0x3D, 0x86, 0x3E, 0x66, 0xFE, 0x5C,     0x52, 0xE2, 0xA3, 0xB3, 0xCE, 0x16, 0xCC, 0x95,     0xB0, 0x8B, 0x82, 0x3B, 0x93, 0x7D, 0x62, 0x08, @@ -474,7 +474,7 @@ unsigned char table_18[256] = {     0xF4, 0xBD, 0xA4, 0x29, 0x60, 0x03, 0xB9, 0x50,     0xFA, 0x4E, 0xEF, 0x54, 0xE6, 0x7F, 0xC0, 0x67 }; -unsigned char table_19[256] = { +static const unsigned char table_19[256] = {     0xEA, 0xE7, 0x13, 0x14, 0xB9, 0xC0, 0xC4, 0x42,     0x49, 0x6E, 0x2A, 0xA6, 0x65, 0x3C, 0x6A, 0x40,     0x07, 0xCD, 0x4F, 0xFE, 0xF2, 0x2D, 0xC8, 0x30, @@ -508,13 +508,13 @@ unsigned char table_19[256] = {     0xFD, 0x1F, 0xDE, 0x53, 0xA3, 0x2C, 0x20, 0xF6,     0x1E, 0x0D, 0xAE, 0x7B, 0x5E, 0x61, 0xE9, 0x63 }; -unsigned char table_20[32] = { +static const unsigned char table_20[32] = {     0x0D, 0x0B, 0x11, 0x02, 0x05, 0x1B, 0x08, 0x1D,     0x04, 0x14, 0x01, 0x09, 0x00, 0x19, 0x1E, 0x15,     0x1F, 0x0A, 0x0F, 0x1C, 0x10, 0x16, 0x0C, 0x07,     0x13, 0x1A, 0x06, 0x17, 0x0E, 0x12, 0x18, 0x03 }; -unsigned char table_21[256] = { +static const unsigned char table_21[256] = {     0x4C, 0x94, 0xAD, 0x66, 0x9E, 0x69, 0x04, 0xA8,     0x61, 0xE0, 0xE1, 0x3D, 0xFD, 0x9C, 0xFB, 0x19,     0x1E, 0x80, 0x8C, 0xA0, 0xFC, 0x27, 0x26, 0x3B, @@ -548,13 +548,13 @@ unsigned char table_21[256] = {     0x56, 0xBA, 0x86, 0x28, 0x6A, 0x20, 0x51, 0xF7,     0xFF, 0xD8, 0xE7, 0xDD, 0xBB, 0x78, 0xD5, 0x81 }; -unsigned char table_22[32] = { +static const unsigned char table_22[32] = {     0x0B, 0x15, 0x1C, 0x0C, 0x06, 0x0A, 0x1D, 0x16,     0x12, 0x0E, 0x04, 0x11, 0x1F, 0x0F, 0x07, 0x02,     0x17, 0x13, 0x19, 0x18, 0x0D, 0x10, 0x1A, 0x05,     0x03, 0x00, 0x01, 0x08, 0x09, 0x14, 0x1B, 0x1E }; -unsigned char table_23[256] = { +static const unsigned char table_23[256] = {     0x36, 0x53, 0x2D, 0xD0, 0x7A, 0xF0, 0xD5, 0x1C,     0x50, 0x61, 0x9A, 0x90, 0x0B, 0x29, 0x20, 0x77,     0xF1, 0x82, 0xFE, 0xC1, 0xA7, 0xB6, 0x78, 0x87, @@ -588,7 +588,7 @@ unsigned char table_23[256] = {     0xA4, 0xBE, 0x96, 0x5E, 0x97, 0xD3, 0xA5, 0x55,     0x1D, 0x15, 0xC6, 0xBF, 0xA9, 0x43, 0xC0, 0x49 }; -unsigned char table_24[256] = { +static const unsigned char table_24[256] = {     0xDC, 0x5A, 0xE6, 0x59, 0x64, 0xDA, 0x58, 0x40,     0x95, 0xF8, 0x2A, 0xE0, 0x39, 0x7E, 0x32, 0x89,     0x09, 0x93, 0xED, 0x55, 0xC3, 0x5B, 0x1A, 0xD1, @@ -622,19 +622,19 @@ unsigned char table_24[256] = {     0xCD, 0x20, 0x74, 0x08, 0x1D, 0xC4, 0xF9, 0x4D,     0xEA, 0x8D, 0x2D, 0x5F, 0xF6, 0xA7, 0x80, 0x3A }; -unsigned char table_25[32] = { +static const unsigned char table_25[32] = {     0x0A, 0x11, 0x17, 0x03, 0x05, 0x0B, 0x18, 0x13,     0x09, 0x02, 0x00, 0x1C, 0x0C, 0x08, 0x1B, 0x14,     0x06, 0x0E, 0x01, 0x0D, 0x16, 0x1E, 0x1D, 0x19,     0x0F, 0x1A, 0x10, 0x04, 0x12, 0x15, 0x07, 0x1F }; -unsigned char table_26[32] = { +static const unsigned char table_26[32] = {     0x19, 0x13, 0x1B, 0x01, 0x1C, 0x0D, 0x0C, 0x15,     0x0B, 0x00, 0x1A, 0x0F, 0x12, 0x16, 0x08, 0x0A,     0x03, 0x06, 0x14, 0x10, 0x18, 0x04, 0x11, 0x1D,     0x1F, 0x07, 0x17, 0x05, 0x02, 0x0E, 0x1E, 0x09 }; -unsigned char table_27[256] = { +static const unsigned char table_27[256] = {     0x72, 0xF0, 0x14, 0xCB, 0x61, 0xA5, 0xB2, 0x02,     0x75, 0x22, 0xC3, 0x9D, 0x5A, 0x63, 0xFA, 0x5F,     0xD9, 0x55, 0x58, 0x43, 0x24, 0x7D, 0x77, 0x93, @@ -668,13 +668,13 @@ unsigned char table_27[256] = {     0x4E, 0xB9, 0x66, 0xF2, 0x62, 0x36, 0x4C, 0x83,     0x5E, 0x6F, 0x47, 0x64, 0xBC, 0x9A, 0x60, 0x7E }; -unsigned char table_28[32] = { +static const unsigned char table_28[32] = {     0x15, 0x05, 0x08, 0x19, 0x02, 0x18, 0x1E, 0x07,     0x0D, 0x0C, 0x1A, 0x06, 0x17, 0x03, 0x10, 0x09,     0x01, 0x11, 0x1C, 0x04, 0x0F, 0x1F, 0x12, 0x0B,     0x1B, 0x13, 0x0A, 0x16, 0x0E, 0x00, 0x1D, 0x14 }; -unsigned char table_29[256] = { +static const unsigned char table_29[256] = {     0x34, 0x59, 0x05, 0x13, 0x09, 0x1D, 0xDF, 0x77,     0x11, 0xA5, 0x92, 0x27, 0xCD, 0x7B, 0x5E, 0x80,     0xF9, 0x50, 0x18, 0x24, 0xD4, 0x70, 0x4A, 0x39, @@ -708,13 +708,13 @@ unsigned char table_29[256] = {     0xD6, 0x60, 0x76, 0x55, 0x0B, 0x4E, 0xFF, 0x1A,     0x46, 0x62, 0xB6, 0xB0, 0x15, 0x04, 0x95, 0x4D }; -unsigned char table_30[32] = { +static const unsigned char table_30[32] = {     0x00, 0x1C, 0x0E, 0x0C, 0x06, 0x16, 0x09, 0x12,     0x01, 0x13, 0x0B, 0x14, 0x11, 0x08, 0x04, 0x18,     0x10, 0x1B, 0x15, 0x03, 0x02, 0x19, 0x1A, 0x17,     0x1E, 0x1F, 0x0F, 0x07, 0x0D, 0x05, 0x1D, 0x0A }; -unsigned char table_31[256] = { +static const unsigned char table_31[256] = {     0xDF, 0xD8, 0x3F, 0xBC, 0x5F, 0xC9, 0x8E, 0x4C,     0x0B, 0x3C, 0xE5, 0xBF, 0x39, 0xD5, 0x30, 0xDD,     0x23, 0xC7, 0x72, 0x63, 0x1F, 0xF8, 0x96, 0x31, @@ -748,7 +748,7 @@ unsigned char table_31[256] = {     0x6F, 0x07, 0xE9, 0xEE, 0x21, 0x98, 0x5A, 0xC5,     0x92, 0x48, 0xF7, 0x0A, 0xF6, 0xE2, 0x4B, 0x56 }; -unsigned char table_32[256] = { +static const unsigned char table_32[256] = {     0x7B, 0x0F, 0x56, 0x2F, 0x1E, 0x2A, 0x7A, 0xD1,     0x02, 0x91, 0x4E, 0x37, 0x6C, 0x10, 0xA7, 0xF2,     0x38, 0xAC, 0x9E, 0x2B, 0x5E, 0x23, 0xE3, 0x19, @@ -782,7 +782,7 @@ unsigned char table_32[256] = {     0x81, 0x4C, 0x0B, 0x3F, 0xB7, 0x0E, 0x39, 0xAE,     0x47, 0x6B, 0x8A, 0xA2, 0x9A, 0xA3, 0x45, 0x41 }; -unsigned char table_33[256] = { +static const unsigned char table_33[256] = {     0xDE, 0xD3, 0x79, 0x67, 0x13, 0x5C, 0x04, 0xF2,     0xD9, 0x9F, 0x65, 0x56, 0xCC, 0x3B, 0xA4, 0x9A,     0x08, 0xBF, 0x26, 0xB2, 0xA7, 0x5E, 0xAA, 0xCA, @@ -816,7 +816,7 @@ unsigned char table_33[256] = {     0xF3, 0xE9, 0x91, 0x63, 0xA5, 0xB9, 0xE8, 0x14,     0x80, 0x3C, 0xEE, 0x47, 0xC6, 0x3A, 0x53, 0xF6 }; -unsigned char table_34[256] = { +static const unsigned char table_34[256] = {     0xF0, 0xE9, 0x3E, 0xD6, 0x89, 0xC8, 0xC7, 0x23,     0x75, 0x26, 0x5F, 0x9C, 0x57, 0xB8, 0x2A, 0x29,     0xE5, 0xB5, 0x68, 0xA4, 0x92, 0x46, 0x40, 0x7F, @@ -850,7 +850,7 @@ unsigned char table_34[256] = {     0xF3, 0x7D, 0xC6, 0xCE, 0x8A, 0xB2, 0x33, 0x4C,     0x03, 0x05, 0xBF, 0x06, 0x1B, 0xC0, 0x1A, 0x60 }; -unsigned char table_35[256] = { +static const unsigned char table_35[256] = {     0xCC, 0x40, 0xEF, 0x1F, 0xDB, 0xE5, 0x71, 0x51,     0x3B, 0x0F, 0x7D, 0x9C, 0x83, 0x17, 0x6F, 0x8F,     0x13, 0xDC, 0x7F, 0xA9, 0xA5, 0xA2, 0x9D, 0xDF, @@ -884,7 +884,7 @@ unsigned char table_35[256] = {     0x7C, 0x8D, 0x72, 0x0B, 0x52, 0xE8, 0xA7, 0x3A,     0x59, 0xC4, 0x9F, 0xD0, 0x66, 0x7B, 0x33, 0xB5 }; -unsigned char table_36[256] = { +static const unsigned char table_36[256] = {     0xDB, 0x6F, 0xFE, 0xB3, 0x5C, 0x1F, 0xB8, 0xBF,     0xA3, 0x71, 0x11, 0x56, 0x90, 0xE2, 0x63, 0x18,     0x83, 0x51, 0x21, 0xEB, 0x66, 0x08, 0xA6, 0xA5, @@ -918,7 +918,7 @@ unsigned char table_36[256] = {     0x74, 0xA0, 0x73, 0x5A, 0x2A, 0x98, 0x75, 0x47,     0x4B, 0xB6, 0x7B, 0x4D, 0xCF, 0x7E, 0x48, 0xE3 }; -unsigned char table_37[256] = { +static const unsigned char table_37[256] = {     0x1F, 0xD6, 0xB1, 0xB3, 0x40, 0xAD, 0xDE, 0xB7,     0x19, 0xB4, 0xE7, 0x0B, 0x9C, 0x2D, 0xE0, 0xF5,     0xCF, 0x2C, 0x30, 0x65, 0x2F, 0xCD, 0x02, 0x91, @@ -952,7 +952,7 @@ unsigned char table_37[256] = {     0x98, 0x9F, 0x23, 0xD1, 0x6B, 0x59, 0x3E, 0xCA,     0x73, 0xC8, 0x86, 0x47, 0xDB, 0xAB, 0x6F, 0x8C }; -unsigned char table_38[256] = { +static const unsigned char table_38[256] = {     0xAA, 0x8D, 0x37, 0x94, 0x99, 0xDD, 0x70, 0x77,     0x78, 0xC9, 0x0F, 0xFA, 0xE2, 0x05, 0xC2, 0x16,     0x02, 0x4D, 0x44, 0x65, 0xAC, 0xB0, 0x39, 0xF8, @@ -986,31 +986,31 @@ unsigned char table_38[256] = {     0x89, 0x58, 0x79, 0xFB, 0x6E, 0xA5, 0x42, 0x25,     0x09, 0x76, 0x00, 0x46, 0x4E, 0x53, 0xCE, 0x4A }; -unsigned char table_39[32] = { +static const unsigned char table_39[32] = {     0x12, 0x18, 0x0E, 0x08, 0x16, 0x05, 0x06, 0x00,     0x11, 0x17, 0x15, 0x1B, 0x14, 0x01, 0x1F, 0x19,     0x04, 0x0D, 0x0A, 0x0F, 0x10, 0x07, 0x1D, 0x03,     0x0B, 0x13, 0x0C, 0x09, 0x1E, 0x02, 0x1A, 0x1C }; -unsigned char table_40[32] = { +static const unsigned char table_40[32] = {     0x16, 0x02, 0x06, 0x0E, 0x0D, 0x1C, 0x08, 0x0A,     0x0F, 0x13, 0x0B, 0x18, 0x07, 0x04, 0x14, 0x01,     0x1B, 0x05, 0x17, 0x1E, 0x11, 0x1A, 0x10, 0x1F,     0x12, 0x19, 0x1D, 0x03, 0x0C, 0x00, 0x09, 0x15 }; -unsigned char table_41[32] = { +static const unsigned char table_41[32] = {     0x13, 0x18, 0x04, 0x1F, 0x1D, 0x11, 0x03, 0x00,     0x10, 0x12, 0x06, 0x0A, 0x1C, 0x07, 0x15, 0x0E,     0x08, 0x05, 0x0C, 0x09, 0x01, 0x02, 0x16, 0x0B,     0x1A, 0x17, 0x14, 0x1E, 0x0D, 0x0F, 0x19, 0x1B }; -unsigned char table_42[32] = { +static const unsigned char table_42[32] = {     0x00, 0x08, 0x15, 0x1D, 0x05, 0x18, 0x06, 0x07,     0x1F, 0x01, 0x0B, 0x03, 0x19, 0x13, 0x02, 0x1C,     0x17, 0x11, 0x0E, 0x1E, 0x0C, 0x0F, 0x09, 0x1A,     0x1B, 0x16, 0x10, 0x0D, 0x0A, 0x14, 0x12, 0x04 }; -unsigned char table_43[256] = { +static const unsigned char table_43[256] = {     0x34, 0xB7, 0x36, 0x85, 0x5F, 0x93, 0x98, 0x70,     0x1E, 0x59, 0x83, 0x60, 0x6F, 0xBF, 0xF9, 0xD0,     0xB3, 0x22, 0x12, 0x38, 0xF5, 0x01, 0xC9, 0x5B, @@ -1044,13 +1044,13 @@ unsigned char table_43[256] = {     0x0A, 0x69, 0xC5, 0xA5, 0xC1, 0x8A, 0x2A, 0xEE,     0x73, 0x76, 0x3A, 0x21, 0x53, 0xA4, 0x50, 0x6A }; -unsigned char table_44[32] = { +static const unsigned char table_44[32] = {     0x1A, 0x0E, 0x0A, 0x17, 0x1F, 0x08, 0x10, 0x14,     0x0C, 0x0F, 0x09, 0x1C, 0x06, 0x18, 0x1E, 0x12,     0x15, 0x00, 0x11, 0x13, 0x0D, 0x01, 0x0B, 0x03,     0x16, 0x19, 0x05, 0x1D, 0x02, 0x07, 0x04, 0x1B }; -unsigned char table_45[256] = { +static const unsigned char table_45[256] = {     0x5E, 0xD6, 0xE2, 0x54, 0x35, 0xC2, 0xAC, 0x9D,     0x92, 0x64, 0x57, 0x65, 0xC8, 0xAE, 0x21, 0xA9,     0x89, 0x48, 0x12, 0x59, 0xEC, 0xEF, 0x9F, 0xF7, @@ -1084,7 +1084,7 @@ unsigned char table_45[256] = {     0xD8, 0xE4, 0xC4, 0xA8, 0x4B, 0x61, 0x2E, 0x3D,     0xF9, 0x2B, 0x32, 0x8F, 0xFB, 0xC7, 0x07, 0x82 }; -unsigned char table_46[256] = { +static const unsigned char table_46[256] = {     0x85, 0x78, 0xFE, 0x6C, 0x61, 0xA0, 0x71, 0xCC,     0x45, 0x54, 0x7A, 0xE6, 0x82, 0x1D, 0xA6, 0x02,     0x47, 0xD0, 0x23, 0x55, 0x62, 0xFA, 0x76, 0x3E, @@ -1118,37 +1118,37 @@ unsigned char table_46[256] = {     0x8B, 0x42, 0x29, 0x8C, 0x33, 0x59, 0xE8, 0xF8,     0xC7, 0xE4, 0x37, 0xE5, 0xFC, 0xBD, 0x99, 0x41 }; -unsigned char table_47[32] = { +static const unsigned char table_47[32] = {     0x18, 0x1D, 0x16, 0x10, 0x11, 0x04, 0x1E, 0x08,     0x19, 0x0E, 0x0F, 0x02, 0x14, 0x1C, 0x07, 0x17,     0x0D, 0x09, 0x12, 0x1A, 0x05, 0x01, 0x0B, 0x0A,     0x13, 0x15, 0x0C, 0x00, 0x06, 0x1F, 0x03, 0x1B }; -unsigned char table_48[32] = { +static const unsigned char table_48[32] = {     0x13, 0x08, 0x15, 0x01, 0x17, 0x10, 0x0F, 0x1F,     0x1D, 0x0D, 0x12, 0x03, 0x06, 0x0A, 0x1C, 0x19,     0x1A, 0x04, 0x1B, 0x02, 0x16, 0x1E, 0x11, 0x00,     0x14, 0x09, 0x0C, 0x18, 0x05, 0x07, 0x0E, 0x0B }; -unsigned char table_49[32] = { +static const unsigned char table_49[32] = {     0x1F, 0x0F, 0x19, 0x07, 0x18, 0x05, 0x1E, 0x1D,     0x15, 0x08, 0x17, 0x10, 0x0A, 0x0E, 0x0C, 0x1B,     0x02, 0x13, 0x03, 0x0D, 0x04, 0x1A, 0x06, 0x09,     0x12, 0x1C, 0x0B, 0x16, 0x14, 0x01, 0x11, 0x00 }; -unsigned char table_50[32] = { +static const unsigned char table_50[32] = {     0x16, 0x18, 0x1C, 0x0E, 0x12, 0x00, 0x04, 0x1B,     0x1F, 0x13, 0x17, 0x0A, 0x1E, 0x03, 0x0C, 0x01,     0x0F, 0x10, 0x02, 0x08, 0x14, 0x09, 0x19, 0x15,     0x06, 0x0D, 0x0B, 0x1D, 0x05, 0x07, 0x11, 0x1A }; -unsigned char table_51[32] = { +static const unsigned char table_51[32] = {     0x1C, 0x0D, 0x1B, 0x07, 0x17, 0x0E, 0x06, 0x01,     0x12, 0x19, 0x03, 0x0B, 0x10, 0x08, 0x00, 0x1E,     0x0A, 0x04, 0x1A, 0x1D, 0x0C, 0x18, 0x02, 0x13,     0x0F, 0x11, 0x05, 0x09, 0x15, 0x16, 0x1F, 0x14 }; -unsigned char table_52[256] = { +static const unsigned char table_52[256] = {     0x34, 0x0B, 0x47, 0xA3, 0x56, 0x30, 0x73, 0xD4,     0x4B, 0xF6, 0xA6, 0x80, 0x22, 0x95, 0xA5, 0xBB,     0xFE, 0xCD, 0x27, 0x88, 0x87, 0x18, 0x86, 0x6E, @@ -1182,7 +1182,7 @@ unsigned char table_52[256] = {     0x9B, 0xC2, 0x38, 0xD0, 0xEE, 0x81, 0x46, 0xE2,     0x01, 0x0C, 0x5D, 0x7D, 0xB8, 0xBE, 0x6A, 0x16 }; -unsigned char table_53[256] = { +static const unsigned char table_53[256] = {     0xE3, 0xF4, 0x8D, 0x72, 0x45, 0x32, 0x9D, 0xCE,     0x1F, 0x6B, 0xBC, 0xDC, 0xF1, 0xEC, 0x5A, 0x3B,     0xA5, 0xA2, 0x2B, 0xDD, 0x8A, 0xA3, 0x76, 0xE4, @@ -1216,19 +1216,19 @@ unsigned char table_53[256] = {     0x39, 0x6A, 0xC8, 0xA0, 0xB2, 0xC1, 0x84, 0xFC,     0xAB, 0x64, 0xE0, 0xBE, 0xDA, 0xBD, 0x96, 0x94 }; -unsigned char table_54[32] = { +static const unsigned char table_54[32] = {     0x01, 0x02, 0x1D, 0x10, 0x0E, 0x11, 0x08, 0x14,     0x12, 0x09, 0x15, 0x17, 0x16, 0x04, 0x06, 0x1B,     0x07, 0x1A, 0x18, 0x13, 0x0A, 0x1E, 0x1C, 0x1F,     0x0C, 0x0B, 0x0D, 0x05, 0x0F, 0x00, 0x19, 0x03 }; -unsigned char table_55[32] = { +static const unsigned char table_55[32] = {     0x01, 0x12, 0x13, 0x09, 0x0B, 0x19, 0x03, 0x0E,     0x02, 0x1F, 0x1D, 0x1B, 0x1E, 0x11, 0x06, 0x05,     0x00, 0x16, 0x07, 0x0C, 0x15, 0x0D, 0x1A, 0x08,     0x18, 0x10, 0x0F, 0x17, 0x1C, 0x0A, 0x04, 0x14 }; -unsigned char table_56[256] = { +static const unsigned char table_56[256] = {     0xEF, 0x06, 0x5F, 0x11, 0x4B, 0x60, 0x13, 0xBB,     0x79, 0xD7, 0xE4, 0x6D, 0x22, 0xB4, 0x15, 0x50,     0x29, 0x17, 0xD2, 0xE3, 0x37, 0x8C, 0x46, 0x7C, @@ -1262,7 +1262,7 @@ unsigned char table_56[256] = {     0x67, 0xA4, 0x55, 0x10, 0x0F, 0xD9, 0x52, 0x32,     0x96, 0xD5, 0xEB, 0x64, 0x8A, 0xC8, 0x7A, 0xBE }; -unsigned char table_57[256] = { +static const unsigned char table_57[256] = {     0xD1, 0x9B, 0x15, 0x06, 0xB4, 0xF6, 0x97, 0xF0,     0xC6, 0x5B, 0x88, 0x12, 0x25, 0xFA, 0x7B, 0x79,     0xD6, 0xAB, 0xDC, 0x47, 0x85, 0x61, 0x67, 0x0B, @@ -1296,7 +1296,7 @@ unsigned char table_57[256] = {     0x75, 0x02, 0x2B, 0x92, 0x21, 0x7D, 0xF5, 0x5E,     0x4E, 0x3C, 0x84, 0x14, 0x28, 0x3A, 0xE9, 0xC0 }; -unsigned char table_58[256] = { +static const unsigned char table_58[256] = {     0xE9, 0x81, 0x60, 0xA7, 0x18, 0xA0, 0x0F, 0x55,     0x2B, 0x52, 0xE0, 0x8B, 0x9D, 0x85, 0xD2, 0xA3,     0x3F, 0x6E, 0xB1, 0xAF, 0xE3, 0x36, 0xE2, 0x19, @@ -1330,7 +1330,7 @@ unsigned char table_58[256] = {     0xF1, 0xC8, 0x9F, 0xED, 0x50, 0x20, 0x15, 0x11,     0x68, 0x1E, 0xF6, 0xA6, 0x6C, 0xB2, 0xD1, 0x58 }; -unsigned char table_59[256] = { +static const unsigned char table_59[256] = {     0x4C, 0x85, 0x2B, 0x14, 0xCC, 0x4D, 0x5F, 0xD7,     0xCE, 0x28, 0xC5, 0x0B, 0xA1, 0x99, 0x08, 0xDE,     0x42, 0xD1, 0x82, 0x5C, 0xC9, 0x8F, 0x72, 0x12, @@ -1364,13 +1364,13 @@ unsigned char table_59[256] = {     0x0C, 0x46, 0xBD, 0xE9, 0x68, 0x18, 0xAB, 0x2E,     0x5D, 0x1A, 0x8D, 0xC1, 0x58, 0x48, 0xAD, 0x0F }; -unsigned char table_60[32] = { +static const unsigned char table_60[32] = {     0x1C, 0x06, 0x1E, 0x10, 0x1D, 0x05, 0x00, 0x0E,     0x0C, 0x02, 0x11, 0x19, 0x15, 0x18, 0x16, 0x07,     0x1F, 0x0B, 0x14, 0x01, 0x0F, 0x09, 0x0D, 0x13,     0x03, 0x08, 0x12, 0x04, 0x1B, 0x0A, 0x17, 0x1A }; -unsigned char table_61[256] = { +static const unsigned char table_61[256] = {     0xC5, 0xA6, 0xF2, 0x6B, 0x4B, 0x58, 0xE0, 0x41,     0xC6, 0x2F, 0x13, 0xFE, 0xC1, 0x34, 0x3F, 0x24,     0x10, 0xBF, 0x8B, 0xC9, 0x26, 0x2E, 0x68, 0xBE, @@ -1404,7 +1404,7 @@ unsigned char table_61[256] = {     0xA9, 0x1F, 0x06, 0x27, 0xC7, 0x04, 0xE2, 0xBA,     0xCF, 0x60, 0xAA, 0xA4, 0xEB, 0xC4, 0x4E, 0xC2 }; -unsigned char table_62[256] = { +static const unsigned char table_62[256] = {     0x01, 0x59, 0xEC, 0xFC, 0x51, 0xD2, 0xE4, 0x9D,     0xAA, 0x61, 0xD5, 0xCA, 0x63, 0x5D, 0xCE, 0x36,     0xB9, 0x49, 0x76, 0xA9, 0x14, 0x4C, 0x90, 0x28, @@ -1438,7 +1438,7 @@ unsigned char table_62[256] = {     0x35, 0xDF, 0xEF, 0xA7, 0x7F, 0x24, 0xF8, 0xE3,     0xCF, 0xE9, 0xDB, 0xD3, 0x02, 0x9A, 0x0E, 0x5F }; -unsigned char table_63[256] = { +static const unsigned char table_63[256] = {     0x0C, 0x02, 0xEE, 0x94, 0x2D, 0x76, 0x96, 0x75,     0x21, 0xDC, 0x37, 0x03, 0xC0, 0xF7, 0xDF, 0xEF,     0xB1, 0x1D, 0xCF, 0x15, 0x5A, 0xB4, 0xCC, 0x81, @@ -1472,25 +1472,25 @@ unsigned char table_63[256] = {     0x1C, 0x55, 0x6F, 0x9C, 0x56, 0x38, 0xC6, 0x5B,     0x8C, 0xE2, 0x83, 0xA7, 0xD6, 0x0E, 0xB3, 0xDD }; -unsigned char table_64[32] = { +static const unsigned char table_64[32] = {     0x03, 0x05, 0x0D, 0x09, 0x1A, 0x16, 0x08, 0x10,     0x06, 0x1E, 0x1C, 0x15, 0x02, 0x04, 0x17, 0x0C,     0x18, 0x0B, 0x19, 0x11, 0x1B, 0x14, 0x13, 0x0A,     0x0E, 0x00, 0x1D, 0x1F, 0x01, 0x0F, 0x07, 0x12 }; -unsigned char table_65[32] = { +static const unsigned char table_65[32] = {     0x01, 0x0A, 0x1E, 0x14, 0x10, 0x1D, 0x0D, 0x17,     0x0E, 0x0C, 0x0F, 0x12, 0x04, 0x1A, 0x05, 0x02,     0x08, 0x1C, 0x09, 0x1F, 0x0B, 0x13, 0x19, 0x1B,     0x11, 0x00, 0x16, 0x06, 0x03, 0x18, 0x15, 0x07 }; -unsigned char table_66[32] = { +static const unsigned char table_66[32] = {     0x1C, 0x18, 0x0C, 0x09, 0x05, 0x03, 0x15, 0x12,     0x0D, 0x02, 0x08, 0x0E, 0x19, 0x07, 0x13, 0x17,     0x1E, 0x1D, 0x1F, 0x11, 0x06, 0x0A, 0x0B, 0x14,     0x0F, 0x10, 0x01, 0x1B, 0x00, 0x04, 0x1A, 0x16 }; -unsigned char table_67[256] = { +static const unsigned char table_67[256] = {     0x6B, 0x49, 0xC8, 0x86, 0xFF, 0xC0, 0x5D, 0xEF,     0xF7, 0x06, 0xE0, 0x98, 0xA9, 0x72, 0x71, 0xD5,     0xBA, 0x7F, 0x10, 0xD1, 0xBE, 0x41, 0x9C, 0x40, @@ -1524,7 +1524,7 @@ unsigned char table_67[256] = {     0x9D, 0xD2, 0xC3, 0x0A, 0x7D, 0x70, 0xF6, 0x63,     0x24, 0x43, 0x21, 0x83, 0xFB, 0xFD, 0x8B, 0x96 }; -unsigned char table_68[256] = { +static const unsigned char table_68[256] = {     0x93, 0xFF, 0x83, 0x70, 0x12, 0x2D, 0x1C, 0xD6,     0xF9, 0xEE, 0xCF, 0x94, 0x7B, 0xB5, 0xA4, 0x84,     0x99, 0xF7, 0x67, 0x32, 0xFC, 0x8A, 0xE3, 0xE4, @@ -1558,7 +1558,7 @@ unsigned char table_68[256] = {     0x33, 0x86, 0x76, 0x80, 0xE5, 0xC8, 0xD8, 0xA9,     0x8C, 0x6D, 0x91, 0x63, 0x3A, 0x4D, 0xC1, 0x01 }; -unsigned char table_69[256] = { +static const unsigned char table_69[256] = {     0x21, 0x6B, 0x9B, 0xAE, 0x11, 0x5A, 0x91, 0xC2,     0x47, 0x8E, 0x87, 0x86, 0x4F, 0xFC, 0x8F, 0x66,     0x97, 0x2F, 0x61, 0x9C, 0x5B, 0x4C, 0xB3, 0x14, @@ -1592,7 +1592,7 @@ unsigned char table_69[256] = {     0xD0, 0x0F, 0x6D, 0xD7, 0x92, 0x7B, 0x0C, 0xA3,     0x73, 0xDB, 0xB6, 0x83, 0xCE, 0x1E, 0xC1, 0x3C }; -unsigned char table_70[256] = { +static const unsigned char table_70[256] = {     0x54, 0x23, 0xF1, 0x09, 0x9D, 0xEB, 0x26, 0xD9,     0x6C, 0xC1, 0xBC, 0x3D, 0x6E, 0xB0, 0x5F, 0xE2,     0x59, 0x4D, 0x95, 0xFA, 0xD8, 0x29, 0xAA, 0x8E, @@ -1626,13 +1626,13 @@ unsigned char table_70[256] = {     0x74, 0xCE, 0xDC, 0x90, 0x3E, 0xF3, 0x7F, 0xC4,     0x49, 0x84, 0x38, 0xC7, 0xE3, 0xD4, 0x1A, 0xBF }; -unsigned char table_71[32] = { +static const unsigned char table_71[32] = {     0x17, 0x13, 0x0E, 0x1A, 0x0D, 0x18, 0x19, 0x10,     0x14, 0x11, 0x16, 0x05, 0x04, 0x00, 0x12, 0x0A,     0x02, 0x07, 0x03, 0x0B, 0x09, 0x1F, 0x1C, 0x0F,     0x0C, 0x06, 0x1B, 0x08, 0x1D, 0x01, 0x15, 0x1E }; -unsigned char table_72[256] = { +static const unsigned char table_72[256] = {     0xC9, 0xA7, 0x1B, 0xEC, 0x2B, 0x8B, 0xB0, 0xEB,     0x7F, 0x39, 0x25, 0xD9, 0x1D, 0xD5, 0x67, 0xA0,     0xB3, 0xAC, 0x3B, 0xC8, 0x82, 0xC0, 0xE3, 0x9E, @@ -1666,7 +1666,7 @@ unsigned char table_72[256] = {     0xB5, 0xC5, 0xD4, 0x47, 0x8E, 0xE7, 0x58, 0x8F,     0x08, 0x53, 0xF2, 0xB9, 0x5A, 0x3E, 0xE9, 0xD2 }; -unsigned char table_73[256] = { +static const unsigned char table_73[256] = {     0x36, 0x37, 0xED, 0xD8, 0xBF, 0xD7, 0x12, 0xB7,     0x40, 0x32, 0x19, 0x4A, 0x44, 0x2A, 0xCE, 0xA5,     0x29, 0x13, 0x43, 0x51, 0x5C, 0xD0, 0x76, 0x6E, @@ -1700,7 +1700,7 @@ unsigned char table_73[256] = {     0x26, 0x38, 0x71, 0x0E, 0x45, 0xDF, 0xB4, 0x99,     0xFF, 0x90, 0x6B, 0xBC, 0x54, 0x95, 0xBD, 0x07 }; -unsigned char table_74[256] = { +static const unsigned char table_74[256] = {     0xA7, 0xCF, 0x99, 0x1A, 0x13, 0xC7, 0xE9, 0xC4,     0xB6, 0x0E, 0x15, 0x09, 0xFF, 0xDF, 0xBE, 0x03,     0xAD, 0xF1, 0xB0, 0x3C, 0x4A, 0x9B, 0xF5, 0x12, @@ -1734,7 +1734,7 @@ unsigned char table_74[256] = {     0x6E, 0xF3, 0x23, 0x3D, 0x85, 0x82, 0x78, 0xF6,     0x2F, 0xD8, 0xC3, 0x7C, 0x9C, 0x98, 0xEA, 0x71 }; -unsigned char table_75[256] = { +static const unsigned char table_75[256] = {     0xE7, 0xA5, 0x30, 0xE1, 0x9D, 0x81, 0xBE, 0x83,     0xB2, 0x1E, 0xE4, 0x69, 0x2F, 0x2B, 0x0D, 0xEB,     0x7C, 0x59, 0x2D, 0xAA, 0x01, 0x0C, 0xDB, 0xED, @@ -1768,7 +1768,7 @@ unsigned char table_75[256] = {     0xA9, 0x34, 0x94, 0x3B, 0xB9, 0x9C, 0xA2, 0x13,     0x89, 0x46, 0x78, 0xDC, 0x32, 0x8B, 0x67, 0x36 }; -unsigned char table_76[256] = { +static const unsigned char table_76[256] = {     0x3D, 0x66, 0x40, 0xC5, 0x1D, 0xF5, 0xE7, 0xB7,     0x2C, 0x23, 0x09, 0xC2, 0x68, 0xE6, 0xD3, 0x8D,     0x35, 0x94, 0x93, 0xF0, 0x43, 0x97, 0x2B, 0x4B, @@ -1802,25 +1802,25 @@ unsigned char table_76[256] = {     0x13, 0x56, 0x6C, 0x89, 0x33, 0x6E, 0x2A, 0xA5,     0xD1, 0x95, 0xC3, 0xA0, 0x0F, 0xCA, 0xAC, 0xFC }; -unsigned char table_77[32] = { +static const unsigned char table_77[32] = {     0x1C, 0x0D, 0x1E, 0x01, 0x06, 0x16, 0x18, 0x17,     0x0B, 0x1F, 0x04, 0x0F, 0x00, 0x19, 0x08, 0x0A,     0x11, 0x03, 0x05, 0x07, 0x09, 0x0C, 0x15, 0x14,     0x1A, 0x12, 0x13, 0x0E, 0x1D, 0x10, 0x02, 0x1B }; -unsigned char table_78[32] = { +static const unsigned char table_78[32] = {     0x0E, 0x02, 0x17, 0x12, 0x1E, 0x09, 0x15, 0x03,     0x01, 0x0B, 0x0F, 0x11, 0x10, 0x0A, 0x16, 0x06,     0x07, 0x00, 0x1C, 0x1D, 0x1F, 0x0C, 0x18, 0x04,     0x13, 0x0D, 0x1B, 0x08, 0x19, 0x14, 0x05, 0x1A }; -unsigned char table_79[32] = { +static const unsigned char table_79[32] = {     0x12, 0x0B, 0x11, 0x01, 0x07, 0x0E, 0x1A, 0x0D,     0x1E, 0x18, 0x14, 0x1F, 0x0A, 0x17, 0x19, 0x1B,     0x00, 0x10, 0x0C, 0x08, 0x13, 0x02, 0x0F, 0x1D,     0x09, 0x06, 0x04, 0x16, 0x15, 0x1C, 0x05, 0x03 }; -unsigned char table_80[256] = { +static const unsigned char table_80[256] = {     0x14, 0xE7, 0x31, 0x0F, 0xD1, 0x5F, 0xED, 0x1E,     0xA6, 0x77, 0x20, 0x57, 0x34, 0x64, 0x33, 0x0B,     0x5A, 0xB4, 0x83, 0x62, 0xFD, 0x8E, 0xE4, 0xF3, @@ -1854,13 +1854,13 @@ unsigned char table_80[256] = {     0x2F, 0x50, 0x2E, 0x95, 0xAE, 0x1B, 0x56, 0x7B,     0x39, 0xB9, 0xC0, 0x22, 0xF1, 0x4D, 0x90, 0xFC }; -unsigned char table_81[32] = { +static const unsigned char table_81[32] = {     0x03, 0x02, 0x1D, 0x0E, 0x09, 0x1A, 0x0C, 0x11,     0x1C, 0x0D, 0x08, 0x12, 0x19, 0x10, 0x04, 0x17,     0x15, 0x05, 0x0A, 0x00, 0x13, 0x16, 0x1B, 0x18,     0x1E, 0x0B, 0x0F, 0x01, 0x07, 0x14, 0x1F, 0x06 }; -unsigned char table_82[256] = { +static const unsigned char table_82[256] = {     0x53, 0xD3, 0x64, 0x89, 0x7D, 0xA5, 0x66, 0xA4,     0x09, 0x46, 0x17, 0x2C, 0xAF, 0x8C, 0x21, 0x5F,     0x3B, 0x22, 0xE3, 0x05, 0x07, 0x28, 0x2F, 0xAB, @@ -1894,19 +1894,19 @@ unsigned char table_82[256] = {     0x5E, 0x33, 0x5B, 0xA6, 0xC2, 0xB0, 0xBA, 0x30,     0x6A, 0x78, 0xB5, 0x71, 0x56, 0x87, 0x7F, 0x86 }; -unsigned char table_83[32] = { +static const unsigned char table_83[32] = {     0x1B, 0x0A, 0x1F, 0x01, 0x10, 0x08, 0x0E, 0x18,     0x06, 0x04, 0x00, 0x1C, 0x0C, 0x19, 0x0D, 0x16,     0x02, 0x03, 0x09, 0x07, 0x13, 0x0F, 0x05, 0x12,     0x17, 0x1E, 0x1A, 0x1D, 0x0B, 0x11, 0x14, 0x15 }; -unsigned char table_84[32] = { +static const unsigned char table_84[32] = {     0x02, 0x1A, 0x0D, 0x15, 0x01, 0x16, 0x1E, 0x00,     0x08, 0x1B, 0x04, 0x10, 0x1C, 0x18, 0x19, 0x14,     0x0C, 0x11, 0x0B, 0x0E, 0x03, 0x0A, 0x07, 0x12,     0x1D, 0x17, 0x13, 0x06, 0x0F, 0x05, 0x09, 0x1F }; -unsigned char table_85[256] = { +static const unsigned char table_85[256] = {     0xC6, 0x7C, 0xCE, 0xBD, 0x84, 0x3E, 0x0B, 0xD8,     0xFE, 0xCC, 0x46, 0x50, 0xD1, 0xFB, 0xA0, 0x6D,     0xEA, 0xE2, 0x40, 0x51, 0x13, 0xB0, 0xD6, 0xB1, @@ -1940,31 +1940,31 @@ unsigned char table_85[256] = {     0x8E, 0x1B, 0xEF, 0xBF, 0x94, 0xC4, 0x0D, 0xB8,     0x2D, 0x57, 0xE7, 0x82, 0x1E, 0x37, 0x63, 0x43 }; -unsigned char table_86[32] = { +static const unsigned char table_86[32] = {     0x11, 0x07, 0x0F, 0x0A, 0x19, 0x1D, 0x0B, 0x09,     0x1C, 0x1E, 0x14, 0x06, 0x0C, 0x16, 0x13, 0x04,     0x15, 0x18, 0x00, 0x0D, 0x12, 0x05, 0x08, 0x02,     0x10, 0x1A, 0x1F, 0x01, 0x17, 0x0E, 0x03, 0x1B }; -unsigned char table_87[32] = { +static const unsigned char table_87[32] = {     0x17, 0x0E, 0x1D, 0x13, 0x0B, 0x19, 0x03, 0x06,     0x09, 0x01, 0x0D, 0x15, 0x1C, 0x16, 0x18, 0x1B,     0x11, 0x10, 0x00, 0x1E, 0x1F, 0x08, 0x12, 0x0F,     0x02, 0x04, 0x07, 0x1A, 0x14, 0x0A, 0x0C, 0x05 }; -unsigned char table_88[32] = { +static const unsigned char table_88[32] = {     0x09, 0x08, 0x17, 0x10, 0x0A, 0x07, 0x1C, 0x1F,     0x04, 0x0E, 0x01, 0x0C, 0x0D, 0x1B, 0x03, 0x15,     0x02, 0x1E, 0x18, 0x19, 0x0F, 0x06, 0x1A, 0x0B,     0x05, 0x11, 0x14, 0x00, 0x16, 0x1D, 0x12, 0x13 }; -unsigned char table_89[32] = { +static const unsigned char table_89[32] = {     0x15, 0x1C, 0x1D, 0x14, 0x0F, 0x1A, 0x05, 0x02,     0x07, 0x09, 0x06, 0x08, 0x1F, 0x00, 0x10, 0x13,     0x0D, 0x03, 0x0C, 0x18, 0x0E, 0x16, 0x1B, 0x1E,     0x12, 0x04, 0x11, 0x0A, 0x01, 0x0B, 0x17, 0x19 }; -unsigned char table_90[256] = { +static const unsigned char table_90[256] = {     0x62, 0x36, 0x64, 0x0E, 0x4C, 0x6C, 0xBE, 0xCF,     0x25, 0x5A, 0x3D, 0x12, 0x54, 0x9F, 0xE7, 0xA5,     0xDE, 0xD7, 0xB2, 0x60, 0x18, 0x8D, 0x89, 0x70, @@ -1998,19 +1998,19 @@ unsigned char table_90[256] = {     0x29, 0x0A, 0x08, 0xE4, 0x27, 0x19, 0x31, 0xC9,     0x20, 0x94, 0x45, 0xED, 0xDC, 0xBD, 0x7E, 0x50 }; -unsigned char table_91[32] = { +static const unsigned char table_91[32] = {     0x03, 0x04, 0x0C, 0x18, 0x10, 0x0D, 0x13, 0x1B,     0x1F, 0x07, 0x11, 0x17, 0x1C, 0x1D, 0x05, 0x06,     0x0A, 0x12, 0x02, 0x1A, 0x0B, 0x01, 0x0E, 0x08,     0x14, 0x16, 0x00, 0x15, 0x19, 0x09, 0x0F, 0x1E }; -unsigned char table_92[32] = { +static const unsigned char table_92[32] = {     0x1E, 0x10, 0x01, 0x07, 0x11, 0x16, 0x15, 0x17,     0x1F, 0x14, 0x0C, 0x1C, 0x06, 0x03, 0x00, 0x18,     0x08, 0x0E, 0x02, 0x1B, 0x09, 0x0D, 0x19, 0x05,     0x0F, 0x12, 0x0B, 0x13, 0x0A, 0x04, 0x1D, 0x1A }; -unsigned char table_93[256] = { +static const unsigned char table_93[256] = {     0x76, 0x78, 0xA2, 0x94, 0x0E, 0x7F, 0xDF, 0xC1,     0xB9, 0xE1, 0x3D, 0x59, 0x6F, 0x1E, 0x53, 0x99,     0x80, 0xE3, 0x21, 0xF8, 0x65, 0xB8, 0x08, 0xBC, @@ -2044,19 +2044,19 @@ unsigned char table_93[256] = {     0x6E, 0x3B, 0x7D, 0x77, 0x36, 0xAA, 0x39, 0xDE,     0x24, 0x34, 0xE2, 0xEC, 0x85, 0x47, 0xF4, 0xB2 }; -unsigned char table_94[32] = { +static const unsigned char table_94[32] = {     0x1C, 0x07, 0x05, 0x1A, 0x10, 0x1D, 0x14, 0x12,     0x08, 0x0F, 0x0C, 0x01, 0x04, 0x1B, 0x16, 0x0A,     0x11, 0x02, 0x1F, 0x13, 0x0D, 0x1E, 0x17, 0x06,     0x0E, 0x09, 0x15, 0x19, 0x03, 0x18, 0x00, 0x0B }; -unsigned char table_95[32] = { +static const unsigned char table_95[32] = {     0x12, 0x10, 0x11, 0x15, 0x03, 0x0A, 0x14, 0x05,     0x1D, 0x07, 0x17, 0x0D, 0x09, 0x08, 0x1B, 0x1F,     0x0B, 0x06, 0x19, 0x0E, 0x18, 0x04, 0x00, 0x02,     0x1E, 0x1C, 0x01, 0x0C, 0x1A, 0x0F, 0x13, 0x16 }; -unsigned char table_96[256] = { +static const unsigned char table_96[256] = {     0x1C, 0x6E, 0xCD, 0xB4, 0xB3, 0x93, 0xA8, 0x2E,     0x4F, 0x09, 0xE3, 0x72, 0x64, 0x13, 0x21, 0xF5,     0x89, 0xB2, 0xD2, 0x22, 0x5D, 0x63, 0x90, 0xC4, @@ -2090,7 +2090,7 @@ unsigned char table_96[256] = {     0x7E, 0x7C, 0x06, 0x3B, 0xEB, 0x60, 0x7A, 0x8C,     0x59, 0xCE, 0xE1, 0x57, 0x20, 0x58, 0x51, 0xD8 }; -unsigned char table_97[256] = { +static const unsigned char table_97[256] = {     0x15, 0x2D, 0xAF, 0x36, 0xCF, 0xD3, 0xD0, 0xED,     0xB2, 0x1B, 0xFE, 0x92, 0xBD, 0xAD, 0x58, 0x0F,     0x76, 0x3C, 0x47, 0x03, 0x2E, 0x4C, 0x40, 0xF7, @@ -2124,7 +2124,7 @@ unsigned char table_97[256] = {     0x80, 0x88, 0xE8, 0x5F, 0x04, 0xDA, 0xE4, 0xBC,     0x83, 0x25, 0x9F, 0xD9, 0x99, 0xC1, 0xFD, 0xB3 }; -unsigned char table_98[256] = { +static const unsigned char table_98[256] = {     0xC8, 0xE6, 0x38, 0x93, 0xE5, 0x03, 0x18, 0x1F,     0xE9, 0x5A, 0xB6, 0xAF, 0xC3, 0x95, 0x00, 0x51,     0xC0, 0xFD, 0x32, 0xE8, 0x96, 0x57, 0xF0, 0xAA, @@ -2158,13 +2158,13 @@ unsigned char table_98[256] = {     0x88, 0xFE, 0x24, 0x2F, 0x76, 0x3F, 0x59, 0x21,     0x54, 0x3A, 0x13, 0x09, 0x2C, 0xB5, 0xC7, 0x63 }; -unsigned char table_99[32] = { +static const unsigned char table_99[32] = {     0x19, 0x00, 0x10, 0x18, 0x09, 0x11, 0x13, 0x1D,     0x08, 0x1A, 0x02, 0x05, 0x03, 0x17, 0x12, 0x01,     0x1F, 0x14, 0x06, 0x07, 0x15, 0x0D, 0x0F, 0x0B,     0x0E, 0x16, 0x1E, 0x04, 0x1B, 0x0A, 0x0C, 0x1C }; -unsigned char table_100[256] = { +static const unsigned char table_100[256] = {     0x9B, 0x3A, 0xAE, 0x60, 0x27, 0x67, 0x1E, 0x4E,     0x91, 0xDA, 0x85, 0x43, 0x5C, 0xCC, 0x89, 0x55,     0x75, 0x56, 0xF2, 0x86, 0xEB, 0xC4, 0x0D, 0xE6, @@ -2198,25 +2198,25 @@ unsigned char table_100[256] = {     0x87, 0xB3, 0x7E, 0xDE, 0xD7, 0x71, 0x65, 0xF1,     0x30, 0x0C, 0xB2, 0x7B, 0xBE, 0xFB, 0x23, 0x2C }; -unsigned char table_101[32] = { +static const unsigned char table_101[32] = {     0x18, 0x08, 0x14, 0x17, 0x03, 0x10, 0x19, 0x04,     0x0D, 0x1C, 0x06, 0x1D, 0x1E, 0x12, 0x11, 0x0B,     0x0F, 0x02, 0x0E, 0x1B, 0x13, 0x05, 0x07, 0x16,     0x15, 0x0A, 0x0C, 0x1A, 0x00, 0x01, 0x1F, 0x09 }; -unsigned char table_102[32] = { +static const unsigned char table_102[32] = {     0x17, 0x1F, 0x0E, 0x05, 0x13, 0x0C, 0x14, 0x1A,     0x0F, 0x01, 0x12, 0x1C, 0x00, 0x07, 0x0D, 0x02,     0x10, 0x16, 0x04, 0x11, 0x1D, 0x03, 0x1E, 0x18,     0x06, 0x15, 0x0A, 0x19, 0x09, 0x08, 0x1B, 0x0B }; -unsigned char table_103[32] = { +static const unsigned char table_103[32] = {     0x0F, 0x09, 0x1E, 0x11, 0x0D, 0x08, 0x10, 0x00,     0x01, 0x1F, 0x1D, 0x1C, 0x12, 0x04, 0x07, 0x05,     0x19, 0x14, 0x1B, 0x02, 0x1A, 0x15, 0x17, 0x16,     0x18, 0x0B, 0x0A, 0x13, 0x0C, 0x0E, 0x03, 0x06 }; -unsigned char table_104[256] = { +static const unsigned char table_104[256] = {     0xA4, 0x9F, 0x78, 0x39, 0x3D, 0x81, 0x51, 0x24,     0x46, 0x2A, 0x56, 0xE8, 0xDF, 0x73, 0xA8, 0xA2,     0x0D, 0xDC, 0xA5, 0x4F, 0xF0, 0x93, 0xC0, 0x76, @@ -2250,7 +2250,7 @@ unsigned char table_104[256] = {     0x69, 0x9B, 0x84, 0xA0, 0xB3, 0x6F, 0xFE, 0x52,     0x97, 0xBB, 0x37, 0x8C, 0x54, 0x53, 0x9E, 0x8F }; -unsigned char table_105[256] = { +static const unsigned char table_105[256] = {     0x7B, 0x35, 0x11, 0x79, 0x07, 0x2F, 0xF6, 0x82,     0x8E, 0xB4, 0x6E, 0xD2, 0x6D, 0xC5, 0x8C, 0x1C,     0xE0, 0xD6, 0x34, 0xF0, 0x4F, 0x25, 0x59, 0xE8, @@ -2284,19 +2284,19 @@ unsigned char table_105[256] = {     0x90, 0x0A, 0x2A, 0x5D, 0x96, 0x08, 0x6B, 0x83,     0xBA, 0x1E, 0x44, 0x87, 0x45, 0x9F, 0xC9, 0x94 }; -unsigned char table_106[32] = { +static const unsigned char table_106[32] = {     0x03, 0x11, 0x07, 0x1B, 0x0F, 0x14, 0x0C, 0x01,     0x04, 0x02, 0x09, 0x0A, 0x05, 0x12, 0x06, 0x1F,     0x1C, 0x0E, 0x0D, 0x15, 0x18, 0x08, 0x00, 0x10,     0x1E, 0x1D, 0x17, 0x19, 0x13, 0x16, 0x0B, 0x1A }; -unsigned char table_107[32] = { +static const unsigned char table_107[32] = {     0x13, 0x1B, 0x06, 0x11, 0x1C, 0x07, 0x08, 0x0E,     0x10, 0x05, 0x09, 0x18, 0x04, 0x15, 0x1E, 0x0F,     0x1F, 0x12, 0x02, 0x00, 0x17, 0x19, 0x1A, 0x0D,     0x03, 0x0C, 0x0A, 0x1D, 0x14, 0x01, 0x16, 0x0B }; -unsigned char table_108[256] = { +static const unsigned char table_108[256] = {     0x99, 0xA3, 0x48, 0xE8, 0x5A, 0x7D, 0x97, 0xCA,     0x7F, 0x06, 0x9B, 0x04, 0xE0, 0xF3, 0x18, 0xAE,     0x59, 0xA0, 0x2B, 0x15, 0x85, 0x3E, 0x12, 0x93, @@ -2330,7 +2330,7 @@ unsigned char table_108[256] = {     0x4B, 0x9C, 0x70, 0x65, 0x4A, 0xE4, 0x42, 0xDD,     0xCC, 0xE2, 0x44, 0x73, 0xBE, 0x26, 0x8C, 0x5B }; -unsigned char table_109[256] = { +static const unsigned char table_109[256] = {     0xE3, 0x95, 0xDB, 0x09, 0x82, 0x0A, 0x8F, 0x9E,     0xC9, 0xDC, 0x28, 0x35, 0x0F, 0x8B, 0xA8, 0xA5,     0x7F, 0x3D, 0x8C, 0xD1, 0x93, 0x57, 0x04, 0xAA, @@ -2364,7 +2364,7 @@ unsigned char table_109[256] = {     0x9A, 0xCD, 0x24, 0xEC, 0x7C, 0x97, 0x61, 0xCB,     0x1E, 0xF4, 0xD5, 0xB1, 0x5C, 0x25, 0xE8, 0x1C }; -unsigned char table_110[256] = { +static const unsigned char table_110[256] = {     0xC3, 0x06, 0x3C, 0xCB, 0xD2, 0x44, 0x9D, 0x48,     0x28, 0xAA, 0xA9, 0xD0, 0x64, 0x25, 0x56, 0xCA,     0xC2, 0xF8, 0x5C, 0xAE, 0x4E, 0x63, 0xB2, 0xE9, @@ -2398,13 +2398,13 @@ unsigned char table_110[256] = {     0x67, 0xDC, 0x0B, 0xF4, 0x20, 0xAB, 0x6B, 0x9E,     0x4B, 0xCF, 0xB4, 0x2F, 0xBB, 0xEF, 0xDB, 0x33 }; -unsigned char table_111[32] = { +static const unsigned char table_111[32] = {     0x09, 0x0F, 0x00, 0x15, 0x12, 0x17, 0x1A, 0x0D,     0x1C, 0x0B, 0x01, 0x0A, 0x05, 0x1E, 0x1D, 0x0C,     0x1B, 0x08, 0x19, 0x18, 0x14, 0x07, 0x0E, 0x03,     0x10, 0x16, 0x11, 0x1F, 0x04, 0x06, 0x02, 0x13 }; -unsigned char table_112[256] = { +static const unsigned char table_112[256] = {     0xF9, 0x7D, 0xBE, 0xD5, 0x9F, 0xB8, 0x95, 0x43,     0xDB, 0xAE, 0x7E, 0xEC, 0x5B, 0x58, 0x18, 0x49,     0x4B, 0x9D, 0x1C, 0x3E, 0x61, 0xD1, 0xF6, 0x2F, @@ -2438,7 +2438,7 @@ unsigned char table_112[256] = {     0xA9, 0x8B, 0x75, 0x01, 0xA0, 0xE4, 0x35, 0x8D,     0xA1, 0xCC, 0xDF, 0x60, 0xD8, 0x5A, 0xE6, 0xD4 }; -unsigned char table_113[256] = { +static const unsigned char table_113[256] = {     0x46, 0x9D, 0x39, 0xB2, 0x8D, 0x3B, 0x59, 0x5A,     0xD0, 0x9C, 0xE4, 0x04, 0x01, 0xE2, 0xB3, 0xD2,     0xD7, 0x18, 0x40, 0xD8, 0xF1, 0xEF, 0x3A, 0x1D, @@ -2472,13 +2472,13 @@ unsigned char table_113[256] = {     0x6A, 0x19, 0xCE, 0xAB, 0x51, 0xD5, 0x6B, 0xBB,     0xFE, 0x7B, 0x67, 0xFF, 0x10, 0xEC, 0xC6, 0x86 }; -unsigned char table_114[32] = { +static const unsigned char table_114[32] = {     0x11, 0x10, 0x04, 0x1D, 0x08, 0x15, 0x1A, 0x1B,     0x14, 0x18, 0x0F, 0x17, 0x16, 0x07, 0x1E, 0x0E,     0x12, 0x0A, 0x13, 0x0B, 0x0C, 0x00, 0x06, 0x02,     0x1F, 0x19, 0x09, 0x1C, 0x01, 0x0D, 0x03, 0x05 }; -unsigned char table_115[256] = { +static const unsigned char table_115[256] = {     0xB7, 0xBB, 0x63, 0x0D, 0xF0, 0x33, 0x5A, 0x05,     0xF2, 0x7F, 0x64, 0xDB, 0x51, 0xC9, 0x2C, 0x85,     0x4F, 0x41, 0xA4, 0x42, 0xCF, 0xA6, 0x52, 0x2F, @@ -2512,13 +2512,13 @@ unsigned char table_115[256] = {     0x5E, 0xFC, 0xC7, 0x0F, 0x2E, 0x81, 0x7E, 0xA1,     0x8C, 0x17, 0xB5, 0xEB, 0xD5, 0xF3, 0x0B, 0x3C }; -unsigned char table_116[32] = { +static const unsigned char table_116[32] = {     0x00, 0x05, 0x10, 0x1C, 0x0C, 0x1A, 0x04, 0x1B,     0x0A, 0x0D, 0x14, 0x0B, 0x07, 0x03, 0x12, 0x1E,     0x06, 0x11, 0x01, 0x08, 0x15, 0x09, 0x1F, 0x0F,     0x19, 0x18, 0x16, 0x02, 0x13, 0x0E, 0x17, 0x1D }; -unsigned char table_117[256] = { +static const unsigned char table_117[256] = {     0xD0, 0x9A, 0xAB, 0xA8, 0xA7, 0xDF, 0x28, 0xCE,     0x3E, 0x51, 0xBF, 0x76, 0x03, 0xA0, 0x53, 0x3F,     0x90, 0x93, 0x87, 0x67, 0x98, 0x3D, 0xEA, 0x8B, @@ -2552,7 +2552,7 @@ unsigned char table_117[256] = {     0x7E, 0x08, 0x15, 0xB9, 0x7C, 0xAD, 0x84, 0xDD,     0xC1, 0xFD, 0x92, 0xA1, 0xF7, 0xAE, 0xDC, 0x58 }; -unsigned char table_118[256] = { +static const unsigned char table_118[256] = {     0x38, 0xA0, 0xA6, 0xFC, 0x7C, 0x5A, 0x97, 0x1D,     0xFD, 0x00, 0x20, 0xA2, 0x72, 0x10, 0x1F, 0x48,     0x98, 0x7E, 0xDF, 0x2D, 0x80, 0x0A, 0x27, 0xDC, @@ -2586,13 +2586,13 @@ unsigned char table_118[256] = {     0xE8, 0x06, 0x7A, 0x78, 0x0D, 0x81, 0xF7, 0xEA,     0xD9, 0x2F, 0x02, 0xAC, 0x30, 0x6A, 0xD6, 0x95 }; -unsigned char table_119[32] = { +static const unsigned char table_119[32] = {     0x14, 0x0A, 0x1C, 0x00, 0x0C, 0x1F, 0x1E, 0x0B,     0x12, 0x1D, 0x17, 0x08, 0x07, 0x04, 0x09, 0x10,     0x03, 0x1B, 0x0E, 0x1A, 0x05, 0x0D, 0x11, 0x15,     0x18, 0x02, 0x06, 0x01, 0x19, 0x16, 0x13, 0x0F }; -unsigned char table_120[256] = { +static const unsigned char table_120[256] = {     0xCE, 0x89, 0xB2, 0x72, 0x04, 0x77, 0x64, 0xAE,     0x80, 0x99, 0xB5, 0x00, 0x7B, 0x50, 0x9D, 0xE3,     0x87, 0x37, 0x6D, 0x3D, 0x32, 0xBA, 0x20, 0xF0, @@ -2626,13 +2626,13 @@ unsigned char table_120[256] = {     0xD9, 0x29, 0x3C, 0x0C, 0xF1, 0x0B, 0x28, 0x84,     0x5E, 0xCA, 0xFD, 0x11, 0xA3, 0xC7, 0xC0, 0x91 }; -unsigned char table_121[32] = { +static const unsigned char table_121[32] = {     0x1E, 0x12, 0x06, 0x1D, 0x15, 0x1F, 0x13, 0x0B,     0x10, 0x0D, 0x1C, 0x01, 0x0A, 0x0E, 0x02, 0x19,     0x04, 0x1A, 0x03, 0x11, 0x00, 0x16, 0x0C, 0x17,     0x14, 0x08, 0x18, 0x05, 0x09, 0x0F, 0x1B, 0x07 }; -unsigned char table_122[256] = { +static const unsigned char table_122[256] = {     0x85, 0xDF, 0x7F, 0x7C, 0x56, 0xF0, 0x0C, 0x7D,     0x76, 0xA8, 0x58, 0x31, 0x25, 0x8A, 0x0D, 0x23,     0x05, 0x0F, 0x12, 0x64, 0x8E, 0x5D, 0xF4, 0x2C, @@ -2666,7 +2666,7 @@ unsigned char table_122[256] = {     0x89, 0xC7, 0xC1, 0xCF, 0xBE, 0xAA, 0xEC, 0xBA,     0xCE, 0x2D, 0x4E, 0x83, 0xC3, 0x69, 0xEE, 0xB2 }; -unsigned char table_123[256] = { +static const unsigned char table_123[256] = {     0x9D, 0xFB, 0x3C, 0x81, 0xAA, 0x05, 0xB2, 0xBE,     0xD1, 0x5F, 0x4C, 0xE0, 0xA3, 0xF4, 0xDE, 0x35,     0xFE, 0x1B, 0x37, 0x99, 0x94, 0x7A, 0x10, 0xAB, @@ -2700,7 +2700,7 @@ unsigned char table_123[256] = {     0xE5, 0xE4, 0x74, 0x66, 0x1C, 0x68, 0xEC, 0x40,     0x48, 0x77, 0xD0, 0x0A, 0x8A, 0x3A, 0x43, 0x79 }; -unsigned char table_124[256] = { +static const unsigned char table_124[256] = {     0x6C, 0xC3, 0x28, 0x2F, 0x42, 0x4B, 0x7C, 0x3C,     0xCE, 0x24, 0xC8, 0x51, 0x25, 0x3F, 0x49, 0x8D,     0x1E, 0x5C, 0x89, 0x3A, 0x98, 0x47, 0x0B, 0x12, @@ -2734,19 +2734,19 @@ unsigned char table_124[256] = {     0xA2, 0xAD, 0xF2, 0x23, 0xBB, 0x72, 0xF3, 0x94,     0x62, 0x1B, 0xDE, 0x91, 0x87, 0x97, 0x05, 0x2E }; -unsigned char table_125[32] = { +static const unsigned char table_125[32] = {     0x1A, 0x18, 0x12, 0x15, 0x00, 0x1C, 0x01, 0x0B,     0x19, 0x1B, 0x1F, 0x11, 0x07, 0x10, 0x1E, 0x06,     0x17, 0x04, 0x0A, 0x0E, 0x0D, 0x0C, 0x16, 0x08,     0x02, 0x03, 0x13, 0x14, 0x09, 0x1D, 0x05, 0x0F }; -unsigned char table_126[32] = { +static const unsigned char table_126[32] = {     0x1C, 0x1D, 0x07, 0x12, 0x18, 0x1A, 0x19, 0x09,     0x0F, 0x14, 0x1F, 0x0B, 0x13, 0x04, 0x0E, 0x1E,     0x0C, 0x0D, 0x01, 0x17, 0x1B, 0x16, 0x0A, 0x05,     0x15, 0x10, 0x11, 0x08, 0x00, 0x03, 0x06, 0x02 }; -unsigned char table_127[256] = { +static const unsigned char table_127[256] = {     0xA0, 0x66, 0xD8, 0x08, 0xEA, 0x39, 0x78, 0xAB,     0x61, 0x4E, 0xC7, 0xD1, 0xA3, 0x1C, 0x9F, 0xCB,     0x19, 0x51, 0x15, 0x92, 0x23, 0xFD, 0x7D, 0x1D, @@ -2780,13 +2780,13 @@ unsigned char table_127[256] = {     0xD2, 0xD0, 0xD6, 0x3B, 0xC2, 0x2F, 0xE1, 0x2B,     0x70, 0xF8, 0x17, 0xCD, 0xB0, 0xCC, 0x82, 0x2D }; -unsigned char table_128[32] = { +static const unsigned char table_128[32] = {     0x1A, 0x1C, 0x09, 0x17, 0x1B, 0x0B, 0x16, 0x1E,     0x14, 0x0C, 0x12, 0x0E, 0x05, 0x03, 0x1F, 0x15,     0x19, 0x0D, 0x10, 0x13, 0x0A, 0x01, 0x00, 0x11,     0x02, 0x08, 0x0F, 0x18, 0x07, 0x04, 0x1D, 0x06 }; -unsigned char table_129[256] = { +static const unsigned char table_129[256] = {     0x9D, 0x5F, 0xE8, 0x99, 0x57, 0x07, 0x16, 0xA6,     0x9F, 0xB6, 0xDE, 0xED, 0x2D, 0xB3, 0xC0, 0x8E,     0xCC, 0x49, 0xCE, 0xB0, 0x1B, 0xB1, 0x7A, 0xE0, @@ -2820,19 +2820,19 @@ unsigned char table_129[256] = {     0x23, 0x73, 0x92, 0xB5, 0x01, 0x83, 0x82, 0xAA,     0x09, 0x45, 0x6B, 0xD7, 0x0B, 0x89, 0x4F, 0x2A }; -unsigned char table_130[32] = { +static const unsigned char table_130[32] = {     0x07, 0x03, 0x15, 0x0B, 0x02, 0x11, 0x17, 0x14,     0x05, 0x10, 0x0A, 0x0F, 0x01, 0x1C, 0x1D, 0x0E,     0x12, 0x06, 0x18, 0x16, 0x1A, 0x09, 0x13, 0x19,     0x1B, 0x00, 0x08, 0x0D, 0x0C, 0x1E, 0x04, 0x1F }; -unsigned char table_131[32] = { +static const unsigned char table_131[32] = {     0x1D, 0x13, 0x1B, 0x10, 0x07, 0x03, 0x0A, 0x02,     0x00, 0x0C, 0x0E, 0x0B, 0x0D, 0x18, 0x12, 0x1F,     0x1A, 0x04, 0x15, 0x11, 0x1E, 0x08, 0x1C, 0x14,     0x19, 0x05, 0x0F, 0x17, 0x06, 0x01, 0x09, 0x16 }; -unsigned char table_132[256] = { +static const unsigned char table_132[256] = {     0x33, 0x8D, 0x45, 0x6F, 0xFF, 0xF5, 0xB6, 0x53,     0x3B, 0xF3, 0x07, 0xA4, 0x97, 0xEB, 0x6B, 0xA5,     0xD3, 0xDC, 0x7B, 0x79, 0x93, 0xE7, 0xF7, 0x67, @@ -2866,7 +2866,7 @@ unsigned char table_132[256] = {     0x25, 0x96, 0x6C, 0x39, 0x82, 0xE6, 0x2C, 0x9B,     0xC4, 0x7F, 0xA0, 0xD8, 0xEF, 0x03, 0x70, 0xF6 }; -unsigned char table_133[256] = { +static const unsigned char table_133[256] = {     0x02, 0xF0, 0xED, 0xC4, 0xE4, 0x67, 0x60, 0x8B,     0xF3, 0x77, 0x92, 0xE0, 0x85, 0x93, 0x1E, 0x8E,     0x9A, 0x38, 0x61, 0x20, 0xB7, 0x68, 0xE1, 0x5E, @@ -2900,13 +2900,13 @@ unsigned char table_133[256] = {     0x4A, 0x2D, 0x8F, 0x4C, 0x97, 0x28, 0x3E, 0xE5,     0x5A, 0x35, 0xB0, 0xAE, 0x82, 0x79, 0x1D, 0x52 }; -unsigned char table_134[32] = { +static const unsigned char table_134[32] = {     0x09, 0x0F, 0x10, 0x0C, 0x03, 0x15, 0x07, 0x17,     0x0E, 0x0B, 0x1D, 0x08, 0x19, 0x11, 0x00, 0x0A,     0x01, 0x06, 0x18, 0x16, 0x0D, 0x13, 0x14, 0x12,     0x02, 0x1B, 0x1A, 0x04, 0x05, 0x1F, 0x1C, 0x1E }; -unsigned char table_135[256] = { +static const unsigned char table_135[256] = {     0x14, 0x34, 0xEA, 0x02, 0x2B, 0x5A, 0x10, 0x51,     0xF3, 0x8F, 0x28, 0xB2, 0x50, 0x8B, 0x01, 0xCC,     0x80, 0x15, 0x29, 0x42, 0xF4, 0x1D, 0xFB, 0xBB, @@ -2940,7 +2940,7 @@ unsigned char table_135[256] = {     0x96, 0x4E, 0x08, 0xC6, 0x0B, 0xDF, 0x3A, 0xB0,     0x00, 0x63, 0xD9, 0xBE, 0xF2, 0x60, 0x25, 0x62 }; -unsigned char table_136[256] = { +static const unsigned char table_136[256] = {     0xD3, 0x1A, 0x00, 0xED, 0x59, 0x24, 0xA3, 0xF2,     0xBA, 0x58, 0x4C, 0x5C, 0x75, 0x48, 0x98, 0xB0,     0xCF, 0xC3, 0xF7, 0x88, 0x70, 0xB3, 0x3D, 0x3E, @@ -2974,31 +2974,31 @@ unsigned char table_136[256] = {     0x60, 0xD7, 0xE9, 0x17, 0xEB, 0x9C, 0x84, 0x0C,     0x93, 0x1D, 0x9B, 0x5B, 0x40, 0xEE, 0x42, 0x19 }; -unsigned char table_137[32] = { +static const unsigned char table_137[32] = {     0x0F, 0x09, 0x02, 0x06, 0x18, 0x0B, 0x1E, 0x05,     0x11, 0x1D, 0x16, 0x01, 0x13, 0x10, 0x0E, 0x1A,     0x1B, 0x00, 0x0D, 0x08, 0x15, 0x14, 0x19, 0x17,     0x03, 0x1F, 0x0A, 0x12, 0x0C, 0x07, 0x04, 0x1C }; -unsigned char table_138[32] = { +static const unsigned char table_138[32] = {     0x0D, 0x1C, 0x1F, 0x15, 0x0F, 0x14, 0x1B, 0x12,     0x09, 0x0B, 0x19, 0x07, 0x11, 0x16, 0x0C, 0x04,     0x13, 0x05, 0x1D, 0x03, 0x0E, 0x0A, 0x08, 0x1E,     0x01, 0x06, 0x18, 0x17, 0x10, 0x1A, 0x02, 0x00 }; -unsigned char table_139[32] = { +static const unsigned char table_139[32] = {     0x05, 0x15, 0x1D, 0x02, 0x0F, 0x03, 0x17, 0x1A,     0x0A, 0x00, 0x1F, 0x12, 0x0E, 0x11, 0x1B, 0x13,     0x0B, 0x0D, 0x09, 0x18, 0x1E, 0x08, 0x14, 0x07,     0x0C, 0x04, 0x16, 0x19, 0x1C, 0x06, 0x10, 0x01 }; -unsigned char table_140[32] = { +static const unsigned char table_140[32] = {     0x06, 0x1E, 0x0C, 0x11, 0x13, 0x08, 0x15, 0x01,     0x1D, 0x03, 0x0F, 0x19, 0x18, 0x04, 0x00, 0x14,     0x12, 0x1A, 0x0B, 0x0E, 0x02, 0x1B, 0x07, 0x05,     0x1F, 0x17, 0x09, 0x0A, 0x0D, 0x16, 0x10, 0x1C }; -unsigned char table_141[256] = { +static const unsigned char table_141[256] = {     0xE1, 0x0A, 0x28, 0xCD, 0x8A, 0x1E, 0x26, 0x10,     0xC0, 0x6F, 0x06, 0x2C, 0xF8, 0x51, 0x6C, 0x8F,     0xA8, 0x8C, 0x41, 0xF4, 0xED, 0x36, 0xAC, 0x89, @@ -3032,7 +3032,7 @@ unsigned char table_141[256] = {     0xD1, 0x48, 0x92, 0x1D, 0x52, 0x5E, 0x45, 0x70,     0x98, 0x54, 0xB8, 0xDC, 0x46, 0xDF, 0x87, 0xE5 }; -unsigned char table_142[256] = { +static const unsigned char table_142[256] = {     0x90, 0x94, 0xBE, 0x14, 0x99, 0xEB, 0x45, 0x0F,     0x34, 0x4A, 0xE3, 0x79, 0xD2, 0x64, 0x4D, 0x69,     0x91, 0xDE, 0xB9, 0x1C, 0x59, 0x20, 0x6C, 0x0B, @@ -3066,19 +3066,19 @@ unsigned char table_142[256] = {     0xBA, 0x7A, 0x76, 0x41, 0x50, 0x66, 0x05, 0x8E,     0xCC, 0x1E, 0x87, 0xD7, 0x01, 0x1F, 0x51, 0x95 }; -unsigned char table_143[32] = { +static const unsigned char table_143[32] = {     0x0E, 0x16, 0x18, 0x11, 0x0C, 0x01, 0x12, 0x1F,     0x08, 0x15, 0x0A, 0x06, 0x1C, 0x1E, 0x02, 0x1A,     0x17, 0x03, 0x07, 0x13, 0x05, 0x19, 0x10, 0x0F,     0x0D, 0x14, 0x09, 0x0B, 0x1B, 0x00, 0x1D, 0x04 }; -unsigned char table_144[32] = { +static const unsigned char table_144[32] = {     0x00, 0x1B, 0x17, 0x19, 0x1D, 0x11, 0x0D, 0x1A,     0x13, 0x03, 0x1E, 0x09, 0x10, 0x0E, 0x15, 0x05,     0x0B, 0x1C, 0x1F, 0x08, 0x0A, 0x06, 0x01, 0x0F,     0x16, 0x14, 0x02, 0x04, 0x07, 0x18, 0x12, 0x0C }; -unsigned char table_145[256] = { +static const unsigned char table_145[256] = {     0xF9, 0x2C, 0x38, 0x74, 0xDA, 0x65, 0x85, 0x0E,     0xBA, 0x64, 0xDB, 0xE3, 0xB6, 0x8B, 0x0B, 0x5E,     0x01, 0x0F, 0x12, 0x8C, 0xD4, 0xCC, 0xB1, 0x7B, @@ -3112,7 +3112,7 @@ unsigned char table_145[256] = {     0xED, 0x1A, 0x9E, 0x99, 0xEA, 0x40, 0x94, 0x4D,     0x69, 0xF6, 0xEF, 0xC2, 0xAD, 0x03, 0xB3, 0x1E }; -unsigned char table_146[256] = { +static const unsigned char table_146[256] = {     0x1C, 0xF5, 0x16, 0xD2, 0xCC, 0xDC, 0x1E, 0x29,     0xE3, 0x17, 0x3B, 0x66, 0x6A, 0xF7, 0x03, 0xB2,     0x92, 0x45, 0x4D, 0xD6, 0x0C, 0x5E, 0xE6, 0x01, @@ -3146,13 +3146,13 @@ unsigned char table_146[256] = {     0x4A, 0x9F, 0x3D, 0x31, 0x36, 0x5D, 0xA0, 0x2C,     0x7D, 0x96, 0x76, 0x99, 0xB5, 0x48, 0x98, 0x10 }; -unsigned char table_147[32] = { +static const unsigned char table_147[32] = {     0x17, 0x07, 0x0D, 0x16, 0x00, 0x1B, 0x1F, 0x09,     0x10, 0x11, 0x14, 0x0A, 0x02, 0x06, 0x13, 0x0C,     0x08, 0x1E, 0x0F, 0x12, 0x05, 0x15, 0x19, 0x01,     0x1C, 0x1A, 0x03, 0x18, 0x04, 0x0B, 0x1D, 0x0E }; -unsigned char table_148[256] = { +static const unsigned char table_148[256] = {     0xFB, 0x23, 0xBC, 0x5A, 0x8C, 0x02, 0x42, 0x3B,     0x95, 0x0C, 0x21, 0x0E, 0x14, 0xDF, 0x11, 0xC0,     0xDB, 0x5E, 0xD3, 0xEA, 0xCE, 0xB4, 0x32, 0x12, @@ -3186,13 +3186,13 @@ unsigned char table_148[256] = {     0x40, 0x45, 0x9F, 0x44, 0x63, 0x35, 0x77, 0xFF,     0x09, 0x43, 0xBF, 0xD0, 0x55, 0xDD, 0x3F, 0x24 }; -unsigned char table_149[32] = { +static const unsigned char table_149[32] = {     0x1B, 0x0B, 0x0C, 0x06, 0x1F, 0x17, 0x04, 0x1A,     0x1E, 0x02, 0x0F, 0x16, 0x0E, 0x09, 0x10, 0x01,     0x13, 0x19, 0x11, 0x00, 0x0A, 0x05, 0x03, 0x1C,     0x18, 0x1D, 0x14, 0x0D, 0x07, 0x08, 0x15, 0x12 }; -unsigned char table_150[256] = { +static const unsigned char table_150[256] = {     0x57, 0xBC, 0x9D, 0x46, 0x14, 0xD0, 0x94, 0x95,     0x1B, 0x12, 0xB8, 0xD4, 0x53, 0x73, 0x83, 0xE6,     0x75, 0xE1, 0xD1, 0x0D, 0xDF, 0x23, 0x13, 0x40, @@ -3226,7 +3226,7 @@ unsigned char table_150[256] = {     0xAA, 0x8A, 0xF2, 0x69, 0x39, 0x6F, 0x77, 0xDD,     0x97, 0xC9, 0xF3, 0x04, 0xD8, 0xF4, 0x80, 0x44 }; -unsigned char table_151[256] = { +static const unsigned char table_151[256] = {     0x78, 0x6C, 0xC5, 0x0C, 0x2D, 0xA7, 0x97, 0x9C,     0x22, 0x76, 0x3E, 0x81, 0x51, 0x47, 0x59, 0x71,     0xB1, 0xA2, 0x4A, 0x3C, 0xB5, 0x16, 0x06, 0x95, @@ -3260,19 +3260,19 @@ unsigned char table_151[256] = {     0x8B, 0x5D, 0xB0, 0xB7, 0xD9, 0x58, 0x2F, 0x08,     0x43, 0x3A, 0x53, 0x9E, 0x80, 0x88, 0x07, 0x9D }; -unsigned char table_152[32] = { +static const unsigned char table_152[32] = {     0x02, 0x1A, 0x17, 0x1D, 0x01, 0x03, 0x13, 0x1E,     0x05, 0x18, 0x06, 0x0A, 0x0C, 0x04, 0x1B, 0x00,     0x1C, 0x09, 0x1F, 0x16, 0x07, 0x0F, 0x0B, 0x0E,     0x14, 0x12, 0x0D, 0x10, 0x19, 0x11, 0x08, 0x15 }; -unsigned char table_153[32] = { +static const unsigned char table_153[32] = {     0x0E, 0x14, 0x12, 0x1E, 0x1C, 0x02, 0x06, 0x16,     0x18, 0x0D, 0x17, 0x0C, 0x1D, 0x11, 0x08, 0x19,     0x07, 0x0F, 0x13, 0x04, 0x03, 0x1B, 0x0B, 0x1F,     0x1A, 0x0A, 0x05, 0x10, 0x00, 0x01, 0x15, 0x09 }; -unsigned char table_154[256] = { +static const unsigned char table_154[256] = {     0x27, 0x5A, 0x08, 0x5B, 0xF4, 0x39, 0x13, 0x6F,     0x67, 0xEA, 0x22, 0xCA, 0x5C, 0xCF, 0x18, 0x7C,     0x05, 0x87, 0x60, 0xCC, 0x40, 0xC6, 0xE8, 0x6D, @@ -3306,7 +3306,7 @@ unsigned char table_154[256] = {     0xCB, 0xAA, 0xBF, 0x89, 0x1F, 0xA7, 0xBC, 0x9F,     0x53, 0xE1, 0xDD, 0x72, 0x95, 0x52, 0x34, 0xB5 }; -unsigned char table_155[256] = { +static const unsigned char table_155[256] = {     0x75, 0x58, 0xC5, 0xA5, 0x83, 0x16, 0xF3, 0x7F,     0x94, 0xDE, 0xA0, 0xF6, 0xFD, 0x89, 0xA8, 0x06,     0x98, 0x01, 0xD9, 0x69, 0xB7, 0x0F, 0xEA, 0x73, @@ -3340,7 +3340,7 @@ unsigned char table_155[256] = {     0xD0, 0xC4, 0xF7, 0x7B, 0x9E, 0xCB, 0xED, 0x0E,     0x8B, 0x33, 0xFC, 0xBB, 0x00, 0xA2, 0xDF, 0xDA }; -unsigned char table_156[256] = { +static const unsigned char table_156[256] = {     0x31, 0x25, 0xB1, 0xD3, 0xAF, 0xAE, 0x84, 0x2C,     0x71, 0x5E, 0xD8, 0x80, 0x6F, 0x3E, 0x48, 0x86,     0xED, 0x54, 0x6A, 0xC3, 0xBC, 0xBF, 0x0E, 0xEA, @@ -3374,13 +3374,13 @@ unsigned char table_156[256] = {     0x11, 0xC7, 0xB8, 0x4A, 0x33, 0xB0, 0x99, 0xE7,     0xF1, 0x68, 0xBE, 0x35, 0x40, 0x8C, 0xD4, 0x47 }; -unsigned char table_157[32] = { +static const unsigned char table_157[32] = {     0x00, 0x0D, 0x03, 0x02, 0x11, 0x04, 0x18, 0x0B,     0x14, 0x1D, 0x1C, 0x13, 0x1B, 0x17, 0x10, 0x15,     0x01, 0x19, 0x07, 0x09, 0x1A, 0x16, 0x12, 0x1E,     0x08, 0x06, 0x0C, 0x0E, 0x1F, 0x0F, 0x0A, 0x05 }; -unsigned char table_158[256] = { +static const unsigned char table_158[256] = {     0x68, 0x26, 0x80, 0x0B, 0xB8, 0xD5, 0x8C, 0xB7,     0x65, 0xEF, 0xBC, 0x94, 0x28, 0xB9, 0xB2, 0xD2,     0x92, 0xA4, 0x55, 0x27, 0xE0, 0x40, 0x6C, 0x41, @@ -3414,7 +3414,7 @@ unsigned char table_158[256] = {     0xD1, 0x1F, 0x0A, 0x21, 0xA9, 0x6E, 0xC4, 0xBA,     0x9A, 0x57, 0xA2, 0x74, 0xC6, 0xFE, 0x9B, 0x58 }; -unsigned char table_159[256] = { +static const unsigned char table_159[256] = {     0xE5, 0xBF, 0x84, 0x56, 0xD6, 0x43, 0x3E, 0xA5,     0x64, 0x87, 0x44, 0x63, 0x4A, 0x4C, 0x8D, 0x24,     0x1C, 0xDA, 0x89, 0x52, 0x80, 0x4F, 0xE4, 0xBC, @@ -3448,7 +3448,7 @@ unsigned char table_159[256] = {     0xAA, 0x0E, 0x61, 0x5D, 0x95, 0x4E, 0xD7, 0x74,     0xCB, 0x9B, 0x13, 0x8F, 0xA4, 0x28, 0x23, 0x85 }; -unsigned char table_160[256] = { +static const unsigned char table_160[256] = {     0x35, 0x44, 0x0E, 0x92, 0x75, 0x83, 0x9D, 0x53,     0xA5, 0x90, 0xF8, 0xF7, 0x54, 0x74, 0xDF, 0x3D,     0x5A, 0xAA, 0xC6, 0x26, 0x7A, 0xFC, 0x79, 0x6C, @@ -3482,7 +3482,7 @@ unsigned char table_160[256] = {     0x57, 0x61, 0x81, 0xEF, 0x06, 0xDE, 0x48, 0x31,     0xBB, 0x2C, 0xE5, 0xC3, 0x67, 0xA1, 0x10, 0xB9 }; -unsigned char table_161[256] = { +static const unsigned char table_161[256] = {     0x8F, 0x1A, 0x81, 0xA2, 0x2C, 0x56, 0x6D, 0xCD,     0x4A, 0x33, 0x50, 0xE9, 0xE0, 0x12, 0x5A, 0x43,     0x2D, 0x4F, 0xEA, 0x95, 0xFD, 0x49, 0xAB, 0xA3, @@ -3516,7 +3516,7 @@ unsigned char table_161[256] = {     0x52, 0x2E, 0xA8, 0x60, 0x5E, 0x29, 0x21, 0x7E,     0xBE, 0x0A, 0x36, 0x41, 0xC0, 0x8C, 0xE4, 0xAA }; -unsigned char table_162[256] = { +static const unsigned char table_162[256] = {     0xF7, 0x1B, 0xC0, 0x31, 0x5A, 0x23, 0xEA, 0xE9,     0xFB, 0x14, 0x6A, 0xE8, 0x04, 0x65, 0x5B, 0x2C,     0x41, 0xD9, 0xEB, 0xE4, 0x8D, 0x1D, 0xCA, 0x8F, @@ -3550,19 +3550,19 @@ unsigned char table_162[256] = {     0xD4, 0x02, 0x8E, 0x37, 0xF4, 0xB3, 0xA2, 0x53,     0x38, 0xCC, 0x58, 0x44, 0xBF, 0x93, 0x5D, 0xC7 }; -unsigned char table_163[32] = { +static const unsigned char table_163[32] = {     0x1B, 0x14, 0x12, 0x15, 0x11, 0x1D, 0x17, 0x19,     0x10, 0x09, 0x08, 0x06, 0x1A, 0x16, 0x07, 0x13,     0x1F, 0x0B, 0x1C, 0x05, 0x0E, 0x00, 0x18, 0x0A,     0x04, 0x01, 0x03, 0x0C, 0x0D, 0x1E, 0x02, 0x0F }; -unsigned char table_164[32] = { +static const unsigned char table_164[32] = {     0x15, 0x00, 0x10, 0x0B, 0x1D, 0x0A, 0x06, 0x1C,     0x0D, 0x1F, 0x17, 0x0F, 0x03, 0x14, 0x13, 0x12,     0x1B, 0x18, 0x08, 0x1E, 0x16, 0x09, 0x1A, 0x04,     0x02, 0x0C, 0x0E, 0x01, 0x07, 0x19, 0x11, 0x05 }; -unsigned char table_165[256] = { +static const unsigned char table_165[256] = {     0x98, 0xF5, 0x1D, 0xFB, 0x13, 0x20, 0x41, 0xA3,     0xE3, 0x76, 0x49, 0x7E, 0x60, 0xD8, 0x68, 0x30,     0x88, 0x45, 0xD5, 0x77, 0x00, 0xC3, 0x09, 0x31, @@ -3596,7 +3596,7 @@ unsigned char table_165[256] = {     0x0B, 0x78, 0xF1, 0xE6, 0x59, 0x27, 0xC2, 0xE0,     0x1A, 0x26, 0xCC, 0xB1, 0xF9, 0xFA, 0x97, 0xE9 }; -unsigned char table_166[256] = { +static const unsigned char table_166[256] = {     0xCB, 0xEA, 0x2A, 0x36, 0x6D, 0x93, 0x4E, 0xD5,     0xBC, 0x6A, 0xD4, 0x68, 0xF7, 0x18, 0xAB, 0x8B,     0x66, 0x95, 0x94, 0x64, 0xB7, 0x00, 0x4D, 0x97, @@ -3630,7 +3630,7 @@ unsigned char table_166[256] = {     0x20, 0x31, 0x9B, 0xEC, 0xB4, 0xCF, 0x54, 0x22,     0x1C, 0xE0, 0x51, 0x16, 0x43, 0x07, 0x0A, 0x3F }; -unsigned char table_167[256] = { +static const unsigned char table_167[256] = {     0x91, 0xEA, 0x4F, 0x6A, 0x6E, 0x2D, 0x27, 0x22,     0x44, 0xA5, 0x6D, 0xE3, 0x45, 0x06, 0xE2, 0x87,     0x9A, 0xC9, 0x2C, 0x4A, 0x93, 0x6F, 0x00, 0xEB, @@ -3664,7 +3664,7 @@ unsigned char table_167[256] = {     0xB6, 0xAB, 0x89, 0xBD, 0x8F, 0xEF, 0x7D, 0xB2,     0x14, 0x15, 0x25, 0x32, 0x6C, 0x69, 0x1A, 0xCF }; -unsigned char table_168[256] = { +static const unsigned char table_168[256] = {     0x28, 0xEE, 0xB1, 0xFD, 0xB3, 0xEF, 0x36, 0x8E,     0x85, 0x5D, 0x1C, 0x53, 0x1E, 0xDA, 0xBA, 0x3C,     0xA8, 0x90, 0x99, 0x49, 0x45, 0xE0, 0x27, 0x8D, @@ -3698,7 +3698,7 @@ unsigned char table_168[256] = {     0xEB, 0xF7, 0x71, 0x39, 0x30, 0xA5, 0x87, 0xD2,     0x66, 0x2E, 0x08, 0x32, 0x4C, 0x33, 0x7E, 0xE1 }; -unsigned char table_169[256] = { +static const unsigned char table_169[256] = {     0xA4, 0x31, 0xA9, 0x3F, 0x13, 0x4D, 0x1B, 0x29,     0x73, 0x43, 0xF1, 0xE7, 0x9C, 0xC2, 0xF6, 0xCD,     0xA1, 0x94, 0x0D, 0x27, 0xFE, 0x7B, 0x9B, 0x0B, @@ -3732,7 +3732,7 @@ unsigned char table_169[256] = {     0x6F, 0x9A, 0x65, 0xB9, 0x41, 0xBE, 0x8A, 0xA2,     0x6B, 0x0A, 0x59, 0x9E, 0x5E, 0x38, 0x45, 0x80 }; -unsigned char table_170[256] = { +static const unsigned char table_170[256] = {     0xE3, 0x00, 0x99, 0x03, 0xF6, 0xDD, 0xD1, 0x41,     0x58, 0x7E, 0xD9, 0x46, 0x04, 0xAF, 0x5C, 0x43,     0xDE, 0x5E, 0xFC, 0x97, 0x3D, 0x68, 0xC8, 0x37, @@ -3766,43 +3766,43 @@ unsigned char table_170[256] = {     0x8C, 0x3E, 0x61, 0x6E, 0xE9, 0x63, 0xF9, 0xEC,     0x48, 0x30, 0x87, 0x83, 0x12, 0x4D, 0x65, 0xDF }; -unsigned char table_171[32] = { +static const unsigned char table_171[32] = {     0x07, 0x06, 0x11, 0x08, 0x0C, 0x1F, 0x19, 0x02,     0x14, 0x04, 0x0D, 0x18, 0x1A, 0x05, 0x17, 0x13,     0x1C, 0x1B, 0x15, 0x03, 0x01, 0x0F, 0x16, 0x1E,     0x1D, 0x10, 0x00, 0x12, 0x0B, 0x0E, 0x09, 0x0A }; -unsigned char table_172[32] = { +static const unsigned char table_172[32] = {     0x11, 0x01, 0x1F, 0x06, 0x1A, 0x04, 0x02, 0x09,     0x05, 0x0D, 0x0B, 0x18, 0x0E, 0x12, 0x1B, 0x17,     0x07, 0x08, 0x1D, 0x1E, 0x14, 0x19, 0x16, 0x15,     0x03, 0x0C, 0x00, 0x10, 0x0A, 0x1C, 0x0F, 0x13 }; -unsigned char table_173[32] = { +static const unsigned char table_173[32] = {     0x1F, 0x0B, 0x13, 0x00, 0x16, 0x15, 0x14, 0x0A,     0x1D, 0x05, 0x1E, 0x1A, 0x0F, 0x04, 0x0E, 0x01,     0x19, 0x07, 0x02, 0x12, 0x0C, 0x17, 0x08, 0x09,     0x03, 0x11, 0x18, 0x10, 0x1C, 0x1B, 0x06, 0x0D }; -unsigned char table_174[32] = { +static const unsigned char table_174[32] = {     0x02, 0x1B, 0x0C, 0x17, 0x1F, 0x05, 0x15, 0x1E,     0x16, 0x09, 0x1A, 0x12, 0x0F, 0x1C, 0x18, 0x0A,     0x19, 0x10, 0x0D, 0x13, 0x04, 0x11, 0x08, 0x14,     0x1D, 0x0E, 0x06, 0x00, 0x01, 0x07, 0x0B, 0x03 }; -unsigned char table_175[32] = { +static const unsigned char table_175[32] = {     0x00, 0x06, 0x0B, 0x08, 0x0C, 0x04, 0x1A, 0x1C,     0x05, 0x1E, 0x14, 0x03, 0x0A, 0x18, 0x12, 0x1D,     0x16, 0x1F, 0x07, 0x09, 0x0F, 0x0E, 0x17, 0x13,     0x11, 0x19, 0x10, 0x0D, 0x1B, 0x02, 0x01, 0x15 }; -unsigned char table_176[32] = { +static const unsigned char table_176[32] = {     0x12, 0x03, 0x1A, 0x15, 0x04, 0x19, 0x0B, 0x1B,     0x17, 0x1E, 0x0D, 0x05, 0x11, 0x14, 0x1C, 0x00,     0x18, 0x10, 0x0A, 0x06, 0x0E, 0x08, 0x02, 0x07,     0x13, 0x09, 0x16, 0x1D, 0x0F, 0x0C, 0x01, 0x1F }; -unsigned char table_177[256] = { +static const unsigned char table_177[256] = {     0x5E, 0x4D, 0x76, 0xFE, 0xB5, 0x50, 0x83, 0x23,     0x72, 0xDD, 0x93, 0x08, 0x69, 0xAD, 0xEC, 0x3B,     0x0B, 0x9A, 0x36, 0xC9, 0xCA, 0xBE, 0xF7, 0x30, @@ -3836,7 +3836,7 @@ unsigned char table_177[256] = {     0xB4, 0x67, 0xA9, 0x81, 0xB1, 0x12, 0xD3, 0x85,     0x5A, 0xC5, 0xE0, 0x58, 0x41, 0x4E, 0x4A, 0xAF }; -unsigned char table_178[256] = { +static const unsigned char table_178[256] = {     0x33, 0xBA, 0x98, 0xDA, 0x07, 0x2C, 0x22, 0x9B,     0xE0, 0xED, 0xB7, 0xA1, 0x93, 0xEB, 0xDC, 0x49,     0xDF, 0xE1, 0x6C, 0xC2, 0x64, 0x52, 0xD0, 0x8F, @@ -3870,7 +3870,7 @@ unsigned char table_178[256] = {     0x10, 0x23, 0xB6, 0xF3, 0x19, 0x30, 0x20, 0x4D,     0x95, 0x9E, 0xBF, 0xEF, 0xF8, 0x45, 0x00, 0xB4 }; -unsigned char table_179[256] = { +static const unsigned char table_179[256] = {     0x50, 0x3D, 0x41, 0x42, 0x06, 0x5B, 0xD6, 0x34,     0x9D, 0x3C, 0x7B, 0x14, 0xE2, 0x9B, 0x80, 0x15,     0x51, 0x01, 0x6A, 0x30, 0xD7, 0xFC, 0x61, 0x4B, @@ -3904,7 +3904,7 @@ unsigned char table_179[256] = {     0x5D, 0xAC, 0x1A, 0x36, 0x63, 0x99, 0x31, 0xF3,     0x2A, 0x04, 0x18, 0xA5, 0xA2, 0x6E, 0x07, 0xE3 }; -unsigned char table_180[256] = { +static const unsigned char table_180[256] = {     0xDA, 0xCC, 0x72, 0xA6, 0xE7, 0x07, 0xFD, 0x25,     0x92, 0x39, 0x49, 0x02, 0xD6, 0x09, 0xA8, 0x65,     0x2E, 0x6C, 0xA1, 0x19, 0xBF, 0x21, 0x11, 0xC7, @@ -3938,7 +3938,7 @@ unsigned char table_180[256] = {     0x6F, 0x20, 0x54, 0xFB, 0x93, 0xFC, 0x6B, 0x38,     0x62, 0x4F, 0xCF, 0xB2, 0xC2, 0x59, 0xDB, 0x67 }; -unsigned char table_181[256] = { +static const unsigned char table_181[256] = {     0x2B, 0xED, 0x14, 0x05, 0x80, 0xCC, 0x5A, 0xF8,     0x43, 0xB7, 0x86, 0xC6, 0xEE, 0xA6, 0xD7, 0xD6,     0xA0, 0xC4, 0x21, 0x34, 0xB1, 0x8C, 0xF9, 0xF4, @@ -3972,7 +3972,7 @@ unsigned char table_181[256] = {     0x85, 0xA8, 0x95, 0x6D, 0x16, 0x78, 0xB5, 0xF6,     0x32, 0x24, 0x7D, 0x9B, 0xD2, 0x83, 0x35, 0xCD }; -unsigned char table_182[256] = { +static const unsigned char table_182[256] = {     0x06, 0x7F, 0x66, 0xB5, 0xBA, 0x1E, 0xFD, 0x51,     0x81, 0x8D, 0x28, 0xA3, 0x15, 0x37, 0xDC, 0x58,     0xE6, 0x3D, 0xB4, 0xB9, 0x2E, 0xA0, 0x2F, 0xC4, @@ -4006,19 +4006,19 @@ unsigned char table_182[256] = {     0xA4, 0xE2, 0x45, 0x8F, 0x21, 0xE0, 0x49, 0x22,     0x7B, 0x17, 0x0B, 0x0A, 0x41, 0x03, 0xD4, 0x4B }; -unsigned char table_183[32] = { +static const unsigned char table_183[32] = {     0x1E, 0x1B, 0x11, 0x07, 0x08, 0x06, 0x18, 0x17,     0x0D, 0x0F, 0x12, 0x03, 0x1D, 0x04, 0x0A, 0x1A,     0x0C, 0x13, 0x14, 0x1F, 0x0B, 0x19, 0x10, 0x01,     0x16, 0x05, 0x1C, 0x0E, 0x02, 0x00, 0x09, 0x15 }; -unsigned char table_184[32] = { +static const unsigned char table_184[32] = {     0x0F, 0x1D, 0x17, 0x16, 0x0D, 0x05, 0x13, 0x1F,     0x1B, 0x09, 0x1C, 0x1E, 0x15, 0x01, 0x06, 0x08,     0x0C, 0x10, 0x0B, 0x02, 0x04, 0x0A, 0x07, 0x1A,     0x18, 0x0E, 0x03, 0x11, 0x12, 0x14, 0x19, 0x00 }; -unsigned char table_185[256] = { +static const unsigned char table_185[256] = {     0xA5, 0xEE, 0x2E, 0x28, 0xA7, 0xAC, 0xD9, 0xB2,     0x6E, 0x04, 0xB4, 0x03, 0xE8, 0x92, 0x5F, 0x4D,     0x73, 0x20, 0x71, 0xE0, 0x43, 0x53, 0x3F, 0xF8, @@ -4052,7 +4052,7 @@ unsigned char table_185[256] = {     0x60, 0xCA, 0x26, 0xFD, 0x33, 0x46, 0x21, 0xBB,     0x2B, 0xC5, 0x98, 0x18, 0x66, 0x15, 0x9C, 0xBC }; -unsigned char table_186[256] = { +static const unsigned char table_186[256] = {     0xB7, 0xFA, 0x03, 0x7C, 0x76, 0x43, 0xA7, 0x15,     0x4B, 0x4F, 0x04, 0xAA, 0x4E, 0xD2, 0x52, 0xC8,     0x79, 0x16, 0xF6, 0x61, 0x01, 0x5D, 0xD6, 0x47, @@ -4086,13 +4086,13 @@ unsigned char table_186[256] = {     0x64, 0x82, 0xC6, 0x05, 0xD8, 0xAC, 0x99, 0x9F,     0x11, 0x3B, 0x94, 0xE8, 0x7D, 0x7B, 0xD9, 0x5A }; -unsigned char table_187[32] = { +static const unsigned char table_187[32] = {     0x0F, 0x04, 0x1D, 0x1B, 0x15, 0x10, 0x01, 0x0B,     0x00, 0x17, 0x13, 0x07, 0x1E, 0x1F, 0x08, 0x0A,     0x19, 0x09, 0x05, 0x06, 0x0C, 0x1A, 0x14, 0x16,     0x0E, 0x18, 0x03, 0x1C, 0x12, 0x11, 0x0D, 0x02 }; -struct yahoo_fn yahoo_fntable[5][96] =  +static const struct yahoo_fn yahoo_fntable[5][96] =      {{{ IDENT, 0, 0 },       { IDENT, 0, 0 },       { IDENT, 0, 0 }, @@ -4581,7 +4581,7 @@ struct yahoo_fn yahoo_fntable[5][96] =  int yahoo_xfrm( int table, int depth, int seed )  { -   struct yahoo_fn *xfrm; +   const struct yahoo_fn *xfrm;     int i, j, z;     unsigned int n = seed;     unsigned char *arg; diff --git a/protocols/yahoo/yahoo_list.c b/protocols/yahoo/yahoo_list.c deleted file mode 100644 index cda631c6..00000000 --- a/protocols/yahoo/yahoo_list.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * yahoo_list.c: linked list routines - * - * Some code copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * Other code copyright Meredydd Luff <meredydd AT everybuddy.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA - * - * Some of this code was borrowed from elist.c in the eb-lite sources - * - */ - -#include <stdlib.h> - -#include "yahoo_list.h" - -YList *y_list_append(YList * list, void *data) -{ -	YList *n; -	YList *new_list = malloc(sizeof(YList)); -	YList *attach_to = NULL; - -	new_list->next = NULL; -	new_list->data = data; - -	for (n = list; n != NULL; n = n->next) { -		attach_to = n; -	} - -	if (attach_to == NULL) { -		new_list->prev = NULL; -		return new_list; -	} else { -		new_list->prev = attach_to; -		attach_to->next = new_list; -		return list; -	} -} - -YList *y_list_prepend(YList * list, void *data) -{ -	YList *n = malloc(sizeof(YList)); - -	n->next = list; -	n->prev = NULL; -	n->data = data; -	if (list) -		list->prev = n; - -	return n; -} - -YList *y_list_concat(YList * list, YList * add) -{ -	YList *l; - -	if(!list) -		return add; - -	if(!add) -		return list; - -	for (l = list; l->next; l = l->next) -		; - -	l->next = add; -	add->prev = l; - -	return list; -} - -YList *y_list_remove(YList * list, void *data) -{ -	YList *n; - -	for (n = list; n != NULL; n = n->next) { -		if (n->data == data) { -			list=y_list_remove_link(list, n); -			y_list_free_1(n); -			break; -		} -	} - -	return list; -} - -/* Warning */ -/* link MUST be part of list */ -/* caller must free link using y_list_free_1 */ -YList *y_list_remove_link(YList * list, const YList * link) -{ -	if (!link) -		return list; - -	if (link->next) -		link->next->prev = link->prev; -	if (link->prev) -		link->prev->next = link->next; - -	if (link == list) -		list = link->next; -	 -	return list; -} - -int y_list_length(const YList * list) -{ -	int retval = 0; -	const YList *n = list; - -	for (n = list; n != NULL; n = n->next) { -		retval++; -	} - -	return retval; -} - -/* well, you could just check for list == NULL, but that would be - * implementation dependent - */ -int y_list_empty(const YList * list) -{ -	if(!list) -		return 1; -	else -		return 0; -} - -int y_list_singleton(const YList * list) -{ -	if(!list || list->next) -		return 0; -	return 1; -} - -YList *y_list_copy(YList * list) -{ -	YList *n; -	YList *copy = NULL; - -	for (n = list; n != NULL; n = n->next) { -		copy = y_list_append(copy, n->data); -	} - -	return copy; -} - -void y_list_free_1(YList * list) -{ -	free(list); -} - -void y_list_free(YList * list) -{ -	YList *n = list; - -	while (n != NULL) { -		YList *next = n->next; -		free(n); -		n = next; -	} -} - -YList *y_list_find(YList * list, const void *data) -{ -	YList *l; -	for (l = list; l && l->data != data; l = l->next) -		; - -	return l; -} - -void y_list_foreach(YList * list, YListFunc fn, void * user_data) -{ -	for (; list; list = list->next) -		fn(list->data, user_data); -} - -YList *y_list_find_custom(YList * list, const void *data, YListCompFunc comp) -{ -	YList *l; -	for (l = list; l; l = l->next) -		if (comp(l->data, data) == 0) -			return l; - -	return NULL; -} - -YList *y_list_nth(YList * list, int n) -{ -	int i=n; -	for ( ; list && i; list = list->next, i--) -		; - -	return list; -} - -YList *y_list_insert_sorted(YList * list, void *data, YListCompFunc comp) -{ -	YList *l, *n, *prev = NULL; -	if (!list) -		return y_list_append(list, data); - -       	n = malloc(sizeof(YList)); -	n->data = data; -	for (l = list; l && comp(l->data, n->data) <= 0; l = l->next) -		prev = l; - -	if (l) { -		n->prev = l->prev; -		l->prev = n; -	} else -		n->prev = prev; - -	n->next = l; - -	if(n->prev) { -		n->prev->next = n; -		return list; -	} else { -		return n; -	} -		 -} diff --git a/protocols/yahoo/yahoo_list.h b/protocols/yahoo/yahoo_list.h index a7a69635..0d335acd 100644 --- a/protocols/yahoo/yahoo_list.h +++ b/protocols/yahoo/yahoo_list.h @@ -20,55 +20,29 @@   *   */ -/* - * This is a replacement for the GList.  It only provides functions that  - * we use in Ayttm.  Thanks to Meredyyd from everybuddy dev for doing  - * most of it. - */ -  #ifndef __YLIST_H__  #define __YLIST_H__ -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _YList { -	struct _YList *next; -	struct _YList *prev; -	void *data; -} YList; - -typedef int (*YListCompFunc) (const void *, const void *); -typedef void (*YListFunc) (void *, void *); - -YList *y_list_append(YList * list, void *data); -YList *y_list_prepend(YList * list, void *data); -YList *y_list_remove_link(YList * list, const YList * link); -YList *y_list_remove(YList * list, void *data); - -YList *y_list_insert_sorted(YList * list, void * data, YListCompFunc comp); +/* GLib has linked list already, so I don't see why libyahoo2 has to copy this... */ + +typedef GList YList; + +#define y_list_append g_list_append +#define y_list_concat g_list_concat +#define y_list_copy g_list_copy +#define y_list_empty g_list_empty +#define y_list_find g_list_find +#define y_list_find_custom g_list_find_custom +#define y_list_foreach g_list_foreach +#define y_list_free g_list_free +#define y_list_free_1 g_list_free_1 +#define y_list_insert_sorted g_list_insert_sorted +#define y_list_length g_list_length +#define y_list_next g_list_next +#define y_list_nth g_list_nth +#define y_list_prepend g_list_prepend +#define y_list_remove g_list_remove +#define y_list_remove_link g_list_remove_link +#define y_list_singleton g_list_singleton -YList *y_list_copy(YList * list); - -YList *y_list_concat(YList * list, YList * add); - -YList *y_list_find(YList * list, const void *data); -YList *y_list_find_custom(YList * list, const void *data, YListCompFunc comp); - -YList *y_list_nth(YList * list, int n); - -void y_list_foreach(YList * list, YListFunc fn, void *user_data); - -void y_list_free_1(YList * list); -void y_list_free(YList * list); -int  y_list_length(const YList * list); -int  y_list_empty(const YList * list); -int  y_list_singleton(const YList * list); - -#define y_list_next(list)	list->next - -#ifdef __cplusplus -} -#endif  #endif diff --git a/protocols/yahoo/yahoo_util.c b/protocols/yahoo/yahoo_util.c index 3c99cf44..7babfa49 100644 --- a/protocols/yahoo/yahoo_util.c +++ b/protocols/yahoo/yahoo_util.c @@ -51,56 +51,6 @@ char * y_string_append(char * string, char * append)  	return new_string;  } -char * y_str_to_utf8(const char *in) -{ -	unsigned int n, i = 0; -	char *result = NULL; - -	if(in == NULL || *in == '\0') -		return ""; -	 -	result = y_new(char, strlen(in) * 2 + 1); - -	/* convert a string to UTF-8 Format */ -	for (n = 0; n < strlen(in); n++) { -		unsigned char c = (unsigned char)in[n]; - -		if (c < 128) { -			result[i++] = (char) c; -		} else { -			result[i++] = (char) ((c >> 6) | 192); -			result[i++] = (char) ((c & 63) | 128); -		} -	} -	result[i] = '\0'; -	return result; -} - -char * y_utf8_to_str(const char *in) -{ -	int i = 0; -	unsigned int n; -	char *result = NULL; - -	if(in == NULL || *in == '\0') -		return ""; -	 -	result = y_new(char, strlen(in) + 1); - -	/* convert a string from UTF-8 Format */ -	for (n = 0; n < strlen(in); n++) { -		unsigned char c = in[n]; - -		if (c < 128) { -			result[i++] = (char) c; -		} else { -			result[i++] = (c << 6) | (in[++n] & 63); -		} -	} -	result[i] = '\0'; -	return result; -} -  #if !HAVE_GLIB  void y_strfreev(char ** vector) diff --git a/commands.c b/root_commands.c index fe1607c4..426cf6e8 100644 --- a/commands.c +++ b/root_commands.c @@ -31,30 +31,64 @@  #include <string.h> -command_t commands[] = { -	{ "help",           0, cmd_help },  -	{ "identify",       1, cmd_identify }, -	{ "register",       1, cmd_register }, -	{ "drop",           1, cmd_drop }, -	{ "account",        1, cmd_account }, -	{ "add",            2, cmd_add }, -	{ "info",           1, cmd_info }, -	{ "rename",         2, cmd_rename }, -	{ "remove",         1, cmd_remove }, -	{ "block",          1, cmd_block }, -	{ "allow",          1, cmd_allow }, -	{ "save",           0, cmd_save }, -	{ "set",            0, cmd_set }, -	{ "yes",            0, cmd_yesno }, -	{ "no",             0, cmd_yesno }, -	{ "blist",          0, cmd_blist }, -	{ "nick",           1, cmd_nick }, -	{ "import_buddies", 1, cmd_import_buddies }, -	{ "qlist",          0, cmd_qlist }, -	{ NULL } -}; +void root_command_string( irc_t *irc, user_t *u, char *command, int flags ) +{ +	char *cmd[IRC_MAX_ARGS]; +	char *s; +	int k; +	char q = 0; +	 +	memset( cmd, 0, sizeof( cmd ) ); +	cmd[0] = command; +	k = 1; +	for( s = command; *s && k < ( IRC_MAX_ARGS - 1 ); s ++ ) +		if( *s == ' ' && !q ) +		{ +			*s = 0; +			while( *++s == ' ' ); +			if( *s == '"' || *s == '\'' ) +			{ +				q = *s; +				s ++; +			} +			if( *s ) +			{ +				cmd[k++] = s; +				s --; +			} +		} +		else if( *s == q ) +		{ +			q = *s = 0; +		} +	cmd[k] = NULL; +	 +	root_command( irc, cmd ); +} -int cmd_help( irc_t *irc, char **cmd ) +void root_command( irc_t *irc, char *cmd[] ) +{	 +	int i; +	 +	if( !cmd[0] ) +		return; +	 +	for( i = 0; commands[i].command; i++ ) +		if( g_strcasecmp( commands[i].command, cmd[0] ) == 0 ) +		{ +			if( !cmd[commands[i].required_parameters] ) +			{ +				irc_usermsg( irc, "Not enough parameters given (need %d)", commands[i].required_parameters ); +				return; +			} +			commands[i].execute( irc, cmd ); +			return; +		} +	 +	irc_usermsg( irc, "Unknown command: %s. Please use \x02help commands\x02 to get a list of available commands.", cmd[0] ); +} + +static void cmd_help( irc_t *irc, char **cmd )  {  	char param[80];  	int i; @@ -74,16 +108,14 @@ 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 );  	}  } -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 ); @@ -96,21 +128,20 @@ int cmd_identify( irc_t *irc, char **cmd )  		break;  	case STORAGE_OK:  		irc_usermsg( irc, "Password accepted" ); +		irc_umode_set( irc, "+R", 1 );  		break;  	default:  		irc_usermsg( irc, "Something very weird happened" );  		break;  	} - -	return( 0 );  } -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] ); @@ -121,17 +152,16 @@ int cmd_register( irc_t *irc, char **cmd )  		case STORAGE_OK:  			irc->status = USTATUS_IDENTIFIED; +			irc_umode_set( irc, "+R", 1 );  			break;  		default:  			irc_usermsg( irc, "Error registering" );  			break;  	} -	 -	return( 0 );  } -int cmd_drop( irc_t *irc, char **cmd ) +static void cmd_drop( irc_t *irc, char **cmd )  {  	storage_status_t status; @@ -139,28 +169,30 @@ 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;  	}  } -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 ) @@ -170,7 +202,7 @@ 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]); @@ -178,7 +210,7 @@ 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] ); @@ -240,7 +272,7 @@ int cmd_account( irc_t *irc, char **cmd )  				if( a->gc )  				{  					irc_usermsg( irc, "Account already online" ); -					return( 0 ); +					return;  				}  				else  				{ @@ -250,7 +282,7 @@ int cmd_account( irc_t *irc, char **cmd )  			else  			{  				irc_usermsg( irc, "Invalid account" ); -				return( 0 ); +				return;  			}  		}  		else @@ -296,36 +328,34 @@ 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 );  } -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] ) @@ -333,12 +363,12 @@ 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  		{ @@ -349,11 +379,9 @@ 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 );  } -int cmd_info( irc_t *irc, char **cmd ) +static void cmd_info( irc_t *irc, char **cmd )  {  	struct gaim_connection *gc;  	account_t *a; @@ -364,7 +392,7 @@ 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; @@ -372,66 +400,63 @@ 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] ); +	}  } -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 );  } -int cmd_remove( irc_t *irc, char **cmd ) +static void cmd_remove( irc_t *irc, char **cmd )  {  	user_t *u;  	char *s; @@ -439,7 +464,7 @@ 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 ); @@ -450,10 +475,10 @@ 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;  } -int cmd_block( irc_t *irc, char **cmd ) +static void cmd_block( irc_t *irc, char **cmd )  {  	struct gaim_connection *gc;  	account_t *a; @@ -464,7 +489,7 @@ 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; @@ -472,12 +497,12 @@ 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 ) @@ -490,11 +515,9 @@ 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 );  } -int cmd_allow( irc_t *irc, char **cmd ) +static void cmd_allow( irc_t *irc, char **cmd )  {  	struct gaim_connection *gc;  	account_t *a; @@ -505,7 +528,7 @@ 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; @@ -513,12 +536,12 @@ 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 ) @@ -532,11 +555,9 @@ 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 );  } -int cmd_yesno( irc_t *irc, char **cmd ) +static void cmd_yesno( irc_t *irc, char **cmd )  {  	query_t *q = NULL;  	int numq = 0; @@ -544,7 +565,7 @@ 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 @@ -554,7 +575,7 @@ 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 -- ) @@ -564,7 +585,7 @@ int cmd_yesno( irc_t *irc, char **cmd )  		if( !q )  		{  			irc_usermsg( irc, "Uhm, I never asked you something like that..." ); -			return( 0 ); +			return;  		}  	} @@ -572,11 +593,9 @@ 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 );  } -int cmd_set( irc_t *irc, char **cmd ) +static void cmd_set( irc_t *irc, char **cmd )  {  	if( cmd[1] && cmd[2] )  	{ @@ -598,21 +617,17 @@ int cmd_set( irc_t *irc, char **cmd )  			s = s->next;  		}  	} -	 -	return( 0 );  } -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 );  } -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; @@ -654,11 +669,9 @@ 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 );  } -int cmd_nick( irc_t *irc, char **cmd )  +static void cmd_nick( irc_t *irc, char **cmd )   {  	account_t *a; @@ -690,11 +703,9 @@ int cmd_nick( irc_t *irc, char **cmd )  		else  			a->gc->prpl->set_info( a->gc, cmd[2] );  	} -	 -	return( 1 );  } -int cmd_qlist( irc_t *irc, char **cmd ) +static void cmd_qlist( irc_t *irc, char **cmd )  {  	query_t *q = irc->queries;  	int num; @@ -702,7 +713,7 @@ 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:" ); @@ -712,11 +723,9 @@ 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 );  } -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; @@ -725,12 +734,12 @@ 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] ) @@ -751,7 +760,7 @@ int cmd_import_buddies( irc_t *irc, char **cmd )  		else  		{  			irc_usermsg( irc, "Invalid argument: %s", cmd[2] ); -			return( 0 ); +			return;  		}  	} @@ -765,6 +774,27 @@ 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[] = { +	{ "help",           0, cmd_help,           0 },  +	{ "identify",       1, cmd_identify,       0 }, +	{ "register",       1, cmd_register,       0 }, +	{ "drop",           1, cmd_drop,           0 }, +	{ "account",        1, cmd_account,        0 }, +	{ "add",            2, cmd_add,            0 }, +	{ "info",           1, cmd_info,           0 }, +	{ "rename",         2, cmd_rename,         0 }, +	{ "remove",         1, cmd_remove,         0 }, +	{ "block",          1, cmd_block,          0 }, +	{ "allow",          1, cmd_allow,          0 }, +	{ "save",           0, cmd_save,           0 }, +	{ "set",            0, cmd_set,            0 }, +	{ "yes",            0, cmd_yesno,          0 }, +	{ "no",             0, cmd_yesno,          0 }, +	{ "blist",          0, cmd_blist,          0 }, +	{ "nick",           1, cmd_nick,           0 }, +	{ "import_buddies", 1, cmd_import_buddies, 0 }, +	{ "qlist",          0, cmd_qlist,          0 }, +	{ NULL } +}; @@ -1,6 +1,13 @@  #include <errno.h>  #include <fcntl.h> +/* To cut down on the ifdef stuff a little bit in other places */ +#ifdef IPV6 +#define AF_INETx AF_INET6 +#else +#define AF_INETx AF_INET +#endif +  #ifndef _WIN32  #include <unistd.h>  #include <sys/socket.h> diff --git a/storage_text.c b/storage_text.c index 1bf2dcf3..f807cb3e 100644 --- a/storage_text.c +++ b/storage_text.c @@ -70,7 +70,7 @@ static storage_status_t text_load ( const char *my_nick, const char* password, i  	FILE *fp;  	user_t *ru = user_find( irc, ROOT_NICK ); -	if( irc->status == USTATUS_IDENTIFIED ) +	if( irc->status >= USTATUS_IDENTIFIED )  		return( 1 );  	g_snprintf( s, 511, "%s%s%s", global.conf->configdir, my_nick, ".accounts" ); @@ -31,6 +31,7 @@  #include <signal.h>  #include <unistd.h>  #include <sys/time.h> +#include <sys/wait.h>  global_t global;	/* Against global namespace pollution */ @@ -45,7 +46,7 @@ int main( int argc, char *argv[] )  	global.loop = g_main_new( FALSE ); -	log_init( ); +	log_init();  	nogaim_init(); @@ -69,11 +70,15 @@ int main( int argc, char *argv[] )  		i = bitlbee_daemon_init();  		log_message( LOGLVL_INFO, "Bitlbee %s starting in daemon mode.", BITLBEE_VERSION );  	} +	else if( global.conf->runmode == RUNMODE_FORKDAEMON ) +	{ +		i = bitlbee_daemon_init(); +		log_message( LOGLVL_INFO, "Bitlbee %s starting in forking daemon mode.", BITLBEE_VERSION ); +	}  	if( i != 0 )  		return( i ); -	global.storage = storage_init( global.conf->primary_storage,  -								   global.conf->migrate_storage ); +	global.storage = storage_init( global.conf->primary_storage, global.conf->migrate_storage );  	if ( global.storage == NULL) {  		log_message( LOGLVL_ERROR, "Unable to load storage backend '%s'", global.conf->primary_storage );  		return( 1 ); @@ -83,6 +88,7 @@ int main( int argc, char *argv[] )  	/* Catch some signals to tell the user what's happening before quitting */  	memset( &sig, 0, sizeof( sig ) );  	sig.sa_handler = sighandler; +	sigaction( SIGCHLD, &sig, &old );  	sigaction( SIGPIPE, &sig, &old );  	sig.sa_flags = SA_RESETHAND;  	sigaction( SIGINT,  &sig, &old ); @@ -106,7 +112,7 @@ int main( int argc, char *argv[] )  static void sighandler( int signal )  { -	/* FIXME: In fact, calling log_message() here can be dangerous. But well, let's take the risk for now. */ +	/* FIXME: Calling log_message() here is not a very good idea! */  	if( signal == SIGTERM )  	{ @@ -132,6 +138,19 @@ static void sighandler( int signal )  			raise( signal );  		}  	} +	else if( signal == SIGCHLD ) +	{ +		pid_t pid; +		int st; +		 +		while( ( pid = waitpid( 0, &st, WNOHANG ) ) > 0 ) +		{ +			if( WIFSIGNALED( st ) ) +				log_message( LOGLVL_INFO, "Client %d terminated normally. (status = %d)", pid, WEXITSTATUS( st ) ); +			else if( WIFEXITED( st ) ) +				log_message( LOGLVL_INFO, "Client %d killed by signal %d.", pid, WTERMSIG( st ) ); +		} +	}  	else if( signal != SIGPIPE )  	{  		log_message( LOGLVL_ERROR, "Fatal signal received: %d. That's probably a bug.", signal ); @@ -39,10 +39,10 @@ int url_set( url_t *url, char *set_url )  	}  	else  	{ -		if( g_strncasecmp( set_url, "https", i - set_url ) == 0 ) -			url->proto = PROTO_HTTPS; -		else if( g_strncasecmp( set_url, "http", i - set_url ) == 0 ) +		if( g_strncasecmp( set_url, "http", i - set_url ) == 0 )  			url->proto = PROTO_HTTP; +		else if( g_strncasecmp( set_url, "https", i - set_url ) == 0 ) +			url->proto = PROTO_HTTPS;  		else if( g_strncasecmp( set_url, "socks4", i - set_url ) == 0 )  			url->proto = PROTO_SOCKS4;  		else if( g_strncasecmp( set_url, "socks5", i - set_url ) == 0 ) @@ -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; diff --git a/protocols/util.c b/util.c index 6a2f2e46..db783fe0 100644 --- a/protocols/util.c +++ b/util.c @@ -5,13 +5,12 @@    \********************************************************************/  /* - * nogaim - * - * Gaim without gaim - for BitlBee + * Various utility functions. Some are copied from Gaim to support the + * IM-modules, most are from BitlBee.   *   * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net>   *                          (and possibly other members of the Gaim team) - * Copyright 2002-2004 Wilmer van der Gaast <lintux@lintux.cx> + * Copyright 2002-2005 Wilmer van der Gaast <wilmer@gaast.net>   */  /* @@ -31,103 +30,15 @@    Suite 330, Boston, MA  02111-1307  USA  */ -/* Parts from util.c from gaim needed by nogaim */  #define BITLBEE_CORE  #include "nogaim.h"  #include <stdio.h>  #include <stdlib.h>  #include <string.h> +#include <ctype.h>  #include <glib.h>  #include <time.h> -char *utf8_to_str(const char *in) -{ -	int n = 0, i = 0; -	int inlen; -	char *result; - -	if (!in) -		return NULL; - -	inlen = strlen(in); - -	result = g_malloc(inlen + 1); - -	while (n <= inlen - 1) { -		long c = (long)in[n]; -		if (c < 0x80) -			result[i++] = (char)c; -		else { -			if ((c & 0xC0) == 0xC0) -				result[i++] = -				    (char)(((c & 0x03) << 6) | (((unsigned char)in[++n]) & 0x3F)); -			else if ((c & 0xE0) == 0xE0) { -				if (n + 2 <= inlen) { -					result[i] = -					    (char)(((c & 0xF) << 4) | (((unsigned char)in[++n]) & 0x3F)); -					result[i] = -					    (char)(((unsigned char)result[i]) | -						   (((unsigned char)in[++n]) & 0x3F)); -					i++; -				} else -					n += 2; -			} else if ((c & 0xF0) == 0xF0) -				n += 3; -			else if ((c & 0xF8) == 0xF8) -				n += 4; -			else if ((c & 0xFC) == 0xFC) -				n += 5; -		} -		n++; -	} -	result[i] = '\0'; - -	return result; -} - -char *str_to_utf8(const char *in) -{ -	int n = 0, i = 0; -	int inlen; -	char *result = NULL; - -	if (!in) -		return NULL; - -	inlen = strlen(in); - -	result = g_malloc(inlen * 2 + 1); - -	while (n < inlen) { -		long c = (long)in[n]; -		if (c == 27) { -			n += 2; -			if (in[n] == 'x') -				n++; -			if (in[n] == '3') -				n++; -			n += 2; -			continue; -		} -		/* why are we removing newlines and carriage returns? -		if ((c == 0x0D) || (c == 0x0A)) { -			n++; -			continue; -		} -		*/ -		if (c < 128) -			result[i++] = (char)c; -		else { -			result[i++] = (char)((c >> 6) | 192); -			result[i++] = (char)((c & 63) | 128); -		} -		n++; -	} -	result[i] = '\0'; - -	return result; -} -  void strip_linefeed(gchar *text)  {  	int i, j; @@ -270,34 +181,39 @@ time_t get_time(int year, int month, int day, int hour, int min, int sec)  typedef struct htmlentity  {  	char code[8]; -	char is; +	char is[4];  } htmlentity_t;  /* FIXME: This is ISO8859-1(5) centric, so might cause problems with other charsets. */ -static htmlentity_t ent[] = +static const htmlentity_t ent[] =  { -	{ "lt",     '<' }, -	{ "gt",     '>' }, -	{ "amp",    '&' }, -	{ "quot",   '"' }, -	{ "aacute", 'á' }, -	{ "eacute", 'é' }, -	{ "iacute", 'é' }, -	{ "oacute", 'ó' }, -	{ "uacute", 'ú' }, -	{ "agrave", 'à' }, -	{ "egrave", 'è' }, -	{ "igrave", 'ì' }, -	{ "ograve", 'ò' }, -	{ "ugrave", 'ù' }, -	{ "acirc",  'â' }, -	{ "ecirc",  'ê' }, -	{ "icirc",  'î' }, -	{ "ocirc",  'ô' }, -	{ "ucirc",  'û' }, -	{ "nbsp",   ' ' }, -	{ "",        0  } +	{ "lt",     "<" }, +	{ "gt",     ">" }, +	{ "amp",    "&" }, +	{ "quot",   "\"" }, +	{ "aacute", "á" }, +	{ "eacute", "é" }, +	{ "iacute", "é" }, +	{ "oacute", "ó" }, +	{ "uacute", "ú" }, +	{ "agrave", "à" }, +	{ "egrave", "è" }, +	{ "igrave", "ì" }, +	{ "ograve", "ò" }, +	{ "ugrave", "ù" }, +	{ "acirc",  "â" }, +	{ "ecirc",  "ê" }, +	{ "icirc",  "î" }, +	{ "ocirc",  "ô" }, +	{ "ucirc",  "û" }, +	{ "auml",   "ä" }, +	{ "euml",   "ë" }, +	{ "iuml",   "ï" }, +	{ "ouml",   "ö" }, +	{ "uuml",   "ü" }, +	{ "nbsp",   " " }, +	{ "",        ""  }  };  void strip_html( char *in ) @@ -346,7 +262,11 @@ void strip_html( char *in )  			for( i = 0; *ent[i].code; i ++ )  				if( g_strncasecmp( ent[i].code, cs, strlen( ent[i].code ) ) == 0 )  				{ -					*(s++) = ent[i].is; +					int j; +					 +					for( j = 0; ent[i].is[j]; j ++ ) +						*(s++) = ent[i].is[j]; +					  					matched = 1;  					break;  				} @@ -411,3 +331,116 @@ void info_string_append(GString *str, char *newline, char *name, char *value)  	if( value && value[0] )  		g_string_sprintfa( str, "%s%s: %s", newline, name, value );  } + +/* Decode%20a%20file%20name						*/ +void http_decode( char *s ) +{ +	char *t; +	int i, j, k; +	 +	t = g_new( char, strlen( s ) + 1 ); +	 +	for( i = j = 0; s[i]; i ++, j ++ ) +	{ +		if( s[i] == '%' ) +		{ +			if( sscanf( s + i + 1, "%2x", &k ) ) +			{ +				t[j] = k; +				i += 2; +			} +			else +			{ +				*t = 0; +				break; +			} +		} +		else +		{ +			t[j] = s[i]; +		} +	} +	t[j] = 0; +	 +	strcpy( s, t ); +	g_free( t ); +} + +/* Warning: This one explodes the string. Worst-cases can make the string 3x its original size! */ +/* This fuction is safe, but make sure you call it safely as well! */ +void http_encode( char *s ) +{ +	char *t; +	int i, j; +	 +	t = g_strdup( s ); +	 +	for( i = j = 0; t[i]; i ++, j ++ ) +	{ +		/* if( t[i] <= ' ' || ((unsigned char *)t)[i] >= 128 || t[i] == '%' ) */ +		if( !isalnum( t[i] ) ) +		{ +			sprintf( s + j, "%%%02X", ((unsigned char*)t)[i] ); +			j += 2; +		} +		else +		{ +			s[j] = t[i]; +		} +	} +	s[j] = 0; +	 +	g_free( t ); +} + +/* Strip newlines from a string. Modifies the string passed to it. */  +char *strip_newlines( char *source ) +{ +	int i;	 + +	for( i = 0; source[i] != '\0'; i ++ ) +		if( source[i] == '\n' || source[i] == '\r' ) +			source[i] = ' '; +	 +	return source; +} + +#ifdef IPV6 +/* Wrap an IPv4 address into IPv6 space. Not thread-safe... */ +char *ipv6_wrap( char *src ) +{ +	static char dst[64]; +	int i; +	 +	for( i = 0; src[i]; i ++ ) +		if( ( src[i] < '0' || src[i] > '9' ) && src[i] != '.' ) +			break; +	 +	/* Hmm, it's not even an IP... */ +	if( src[i] ) +		return src; +	 +	g_snprintf( dst, sizeof( dst ), "::ffff:%s", src ); +	 +	return dst; +} + +/* Unwrap an IPv4 address into IPv6 space. Thread-safe, because it's very simple. :-) */ +char *ipv6_unwrap( char *src ) +{ +	int i; +	 +	if( g_strncasecmp( src, "::ffff:", 7 ) != 0 ) +		return src; +	 +	for( i = 7; src[i]; i ++ ) +		if( ( src[i] < '0' || src[i] > '9' ) && src[i] != '.' ) +			break; +	 +	/* Hmm, it's not even an IP... */ +	if( src[i] ) +		return src; +	 +	return ( src + 7 ); +} +#endif | 
