aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--bitlbee.c300
-rw-r--r--bitlbee.conf16
-rw-r--r--bitlbee.h8
-rw-r--r--commands.h34
-rw-r--r--conf.c34
-rw-r--r--conf.h5
-rwxr-xr-xconfigure18
-rw-r--r--ipc.c386
-rw-r--r--ipc.h57
-rw-r--r--irc.c896
-rw-r--r--irc.h29
-rw-r--r--irc_commands.c621
-rw-r--r--log.c112
-rw-r--r--protocols/Makefile2
-rw-r--r--protocols/http_client.c2
-rw-r--r--protocols/jabber/jabber.c16
-rw-r--r--protocols/msn/msn.c8
-rw-r--r--protocols/msn/msn.h14
-rw-r--r--protocols/msn/ns.c6
-rw-r--r--protocols/msn/sb.c2
-rw-r--r--protocols/msn/tables.c12
-rw-r--r--protocols/nogaim.h7
-rw-r--r--protocols/oscar/oscar.c3
-rw-r--r--protocols/oscar/rxqueue.c9
-rw-r--r--protocols/oscar/service.c2
-rw-r--r--protocols/ssl_bogus.c5
-rw-r--r--protocols/yahoo/Makefile2
-rw-r--r--protocols/yahoo/yahoo.c17
-rw-r--r--protocols/yahoo/yahoo_fn.c380
-rw-r--r--protocols/yahoo/yahoo_list.c236
-rw-r--r--protocols/yahoo/yahoo_list.h68
-rw-r--r--protocols/yahoo/yahoo_util.c50
-rw-r--r--root_commands.c (renamed from commands.c)282
-rw-r--r--sock.h7
-rw-r--r--storage_text.c2
-rw-r--r--unix.c27
-rw-r--r--url.c6
-rw-r--r--user.h2
-rw-r--r--util.c (renamed from protocols/util.c)267
40 files changed, 2136 insertions, 1816 deletions
diff --git a/Makefile b/Makefile
index cc5757dc..295fe69e 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/bitlbee.c b/bitlbee.c
index e920f2cb..9a4688d8 100644
--- a/bitlbee.c
+++ b/bitlbee.c
@@ -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
diff --git a/bitlbee.h b/bitlbee.h
index 41247270..e459f07d 100644
--- a/bitlbee.h
+++ b/bitlbee.h
@@ -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 );
diff --git a/commands.h b/commands.h
index b878f211..38572360 100644
--- a/commands.h
+++ b/commands.h
@@ -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
diff --git a/conf.c b/conf.c
index 15055ca3..ae4b77a2 100644
--- a/conf.c
+++ b/conf.c
@@ -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 )
{
diff --git a/conf.h b/conf.h
index c5b2455f..d6460901 100644
--- a/conf.h
+++ b/conf.h
@@ -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;
diff --git a/configure b/configure
index d5ad1c56..7900967b 100755
--- a/configure
+++ b/configure
@@ -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 )
diff --git a/ipc.c b/ipc.c
new file mode 100644
index 00000000..aba59bda
--- /dev/null
+++ b/ipc.c
@@ -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;
+}
diff --git a/ipc.h b/ipc.h
new file mode 100644
index 00000000..b69a6ae5
--- /dev/null
+++ b/ipc.h
@@ -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;
diff --git a/irc.c b/irc.c
index 19b14668..93cbc293 100644
--- a/irc.c
+++ b/irc.c
@@ -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;
}
diff --git a/irc.h b/irc.h
index 9e0500f9..5c53273a 100644
--- a/irc.h
+++ b/irc.h
@@ -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;
+ }
+}
diff --git a/log.c b/log.c
index ad39d775..4606fb88 100644
--- a/log.c
+++ b/log.c
@@ -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 }
+};
diff --git a/sock.h b/sock.h
index 23a08bb4..28d31de9 100644
--- a/sock.h
+++ b/sock.h
@@ -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" );
diff --git a/unix.c b/unix.c
index a1f39753..fafa828e 100644
--- a/unix.c
+++ b/unix.c
@@ -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 );
diff --git a/url.c b/url.c
index 816f4ef3..e4deac78 100644
--- a/url.c
+++ b/url.c
@@ -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 )
diff --git a/user.h b/user.h
index 79b5ed0e..da657a4d 100644
--- a/user.h
+++ b/user.h
@@ -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