Changes in / [3f9440d:fef6116]


Ignore:
Files:
30 added
22 deleted
27 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    r3f9440d rfef6116  
    1010
    1111# Program variables
    12 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
     12objects = account.o bitlbee.o conf.o crypting.o help.o ipc.o irc.o irc_commands.o log.o nick.o query.o root_commands.o set.o storage.o $(STORAGE_OBJS) unix.o user.o
    1313headers = account.h bitlbee.h commands.h conf.h config.h crypting.h help.h ini.h ipc.h irc.h log.h nick.h query.h set.h sock.h storage.h url.h user.h protocols/http_client.h protocols/md5.h protocols/nogaim.h protocols/proxy.h protocols/sha.h protocols/ssl_client.h
    14 subdirs = protocols
     14subdirs = protocols lib
    1515
    1616# Expansion of variables
     
    4242
    4343distclean: clean $(subdirs)
    44         rm -f Makefile.settings config.h
     44        rm -f Makefile.settings config.h bitlbee.pc
    4545        find . -name 'DEADJOE' -o -name '*.orig' -o -name '*.rej' -o -name '*~' -exec rm -f {} \;
    4646
  • account.c

    r3f9440d rfef6116  
    2828#include "account.h"
    2929
     30char *set_eval_account( set_t *set, char *value );
     31
    3032account_t *account_add( irc_t *irc, struct prpl *prpl, char *user, char *pass )
    3133{
    3234        account_t *a;
     35        set_t *s;
    3336       
    3437        if( irc->accounts )
    3538        {
    3639                for( a = irc->accounts; a->next; a = a->next );
    37                 a = a->next = g_new0 ( account_t, 1 );
     40                a = a->next = g_new0( account_t, 1 );
    3841        }
    3942        else
     
    4548        a->user = g_strdup( user );
    4649        a->pass = g_strdup( pass );
     50        a->auto_connect = 1;
    4751        a->irc = irc;
    4852       
     53        s = set_add( &a->set, "auto_connect", NULL, set_eval_account, a );
     54        s->flags |= ACC_SET_NOSAVE;
     55       
     56        s = set_add( &a->set, "password", NULL, set_eval_account, a );
     57        s->flags |= ACC_SET_NOSAVE;
     58       
     59        s = set_add( &a->set, "server", NULL, set_eval_account, a );
     60        s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
     61       
     62        s = set_add( &a->set, "username", NULL, set_eval_account, a );
     63        s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
     64        set_setstr( &a->set, "username", user );
     65       
    4966        return( a );
     67}
     68
     69char *set_eval_account( set_t *set, char *value )
     70{
     71        account_t *acc = set->data;
     72       
     73        /* Double-check: We refuse to edit on-line accounts. */
     74        if( set->flags & ACC_SET_OFFLINE_ONLY && acc->gc )
     75                return NULL;
     76       
     77        if( strcmp( set->key, "username" ) == 0 )
     78        {
     79                g_free( acc->user );
     80                acc->user = g_strdup( value );
     81                return value;
     82        }
     83        else if( strcmp( set->key, "password" ) == 0 )
     84        {
     85                g_free( acc->pass );
     86                acc->pass = g_strdup( value );
     87                return NULL;    /* password shouldn't be visible in plaintext! */
     88        }
     89        else if( strcmp( set->key, "server" ) == 0 )
     90        {
     91                g_free( acc->server );
     92                if( *value )
     93                        acc->server = g_strdup( value );
     94                else
     95                        acc->server = NULL;
     96                return value;
     97        }
     98        else if( strcmp( set->key, "auto_connect" ) == 0 )
     99        {
     100                if( !is_bool( value ) )
     101                        return NULL;
     102               
     103                acc->auto_connect = bool2int( value );
     104                return value;
     105        }
     106       
     107        return NULL;
    50108}
    51109
     
    129187                        }
    130188                       
     189                        while( a->set )
     190                                set_del( &a->set, a->set->key );
     191                       
    131192                        g_free( a->user );
    132193                        g_free( a->pass );
     
    142203void account_on( irc_t *irc, account_t *a )
    143204{
    144         struct aim_user *u;
    145        
    146205        if( a->gc )
    147206        {
     
    152211        cancel_auto_reconnect( a );
    153212       
    154         u = g_new0 ( struct aim_user, 1 );
    155         u->irc = irc;
    156         u->prpl = a->prpl;
    157         strncpy( u->username, a->user, sizeof( u->username ) - 1 );
    158         strncpy( u->password, a->pass, sizeof( u->password ) - 1 );
    159         if( a->server) strncpy( u->proto_opt[0], a->server, sizeof( u->proto_opt[0] ) - 1 );
    160        
    161         a->gc = (struct gaim_connection *) u; /* Bit hackish :-/ */
    162213        a->reconnect = 0;
    163        
    164         a->prpl->login( u );
     214        a->prpl->login( a );
    165215}
    166216
  • account.h

    r3f9440d rfef6116  
    3434        char *server;
    3535       
     36        int auto_connect;
    3637        int reconnect;
     38       
     39        set_t *set;
    3740       
    3841        struct irc *irc;
     
    4750void account_off( irc_t *irc, account_t *a );
    4851
     52#define ACC_SET_NOSAVE          1
     53#define ACC_SET_OFFLINE_ONLY    2
     54
    4955#endif
  • bitlbee.c

    r3f9440d rfef6116  
    291291                        irc_t *irc;
    292292                       
     293                        /* Since we're fork()ing here, let's make sure we won't
     294                           get the same random numbers as the parent/siblings. */
     295                        srand( time( NULL ) ^ getpid() );
     296                       
    293297                        /* Close the listening socket, we're a client. */
    294298                        close( global.listen_socket );
  • bitlbee.h

    r3f9440d rfef6116  
    130130#include "query.h"
    131131#include "sock.h"
    132 #include "util.h"
     132#include "misc.h"
    133133#include "proxy.h"
    134134
  • conf.c

    r3f9440d rfef6116  
    3434#include "ipc.h"
    3535
    36 #include "protocols/proxy.h"
     36#include "proxy.h"
    3737
    3838char *CONF_FILE;
     
    5555        conf->nofork = 0;
    5656        conf->verbose = 0;
    57         conf->primary_storage = "text";
     57        conf->primary_storage = "xml";
     58        conf->migrate_storage = g_strsplit( "text", ",", -1 );
    5859        conf->runmode = RUNMODE_INETD;
    5960        conf->authmode = AUTHMODE_OPEN;
     
    322323                if( g_strcasecmp( ini->section, "defaults" ) == 0 )
    323324                {
    324                         set_t *s = set_find( irc, ini->key );
     325                        set_t *s = set_find( &irc->set, ini->key );
    325326                       
    326327                        if( s )
  • configure

    r3f9440d rfef6116  
    3131
    3232events=glib
     33ldap=auto
    3334ssl=auto
    3435
     
    6667
    6768--ipv6=0/1      IPv6 socket support                     $ipv6
     69
     70--ldap=0/1/auto LDAP support                            $ldap
    6871
    6972--events=...    Event handler (glib, libevent)          $events
     
    141144fi
    142145
    143 echo CFLAGS+=-I`pwd` -I`pwd`/protocols -I. >> Makefile.settings
     146echo CFLAGS+=-I`pwd` -I`pwd`/lib -I`pwd`/protocols -I. >> Makefile.settings
    144147
    145148echo CFLAGS+=-DHAVE_CONFIG_H >> Makefile.settings
    146149
    147150if [ -n "$CC" ]; then
    148         echo "CC=$CC" >> Makefile.settings;
     151        CC=$CC
    149152elif type gcc > /dev/null 2> /dev/null; then
    150         echo "CC=gcc" >> Makefile.settings;
     153        CC=gcc
    151154elif type cc > /dev/null 2> /dev/null; then
    152         echo "CC=cc" >> Makefile.settings;
     155        CC=cc
    153156else
    154157        echo 'Cannot find a C compiler, aborting.'
    155158        exit 1;
    156159fi
     160
     161echo "CC=$CC" >> Makefile.settings;
    157162
    158163if [ -n "$LD" ]; then
     
    232237}
    233238
    234 if [ "$msn" = 1 -o "$jabber" = 1 ]; then
    235         if [ "$ssl" = "auto" ]; then
    236                 detect_gnutls
    237                 if [ "$ret" = "0" ]; then
    238                         detect_nss
    239                 fi;
    240         elif [ "$ssl" = "gnutls" ]; then
    241                 detect_gnutls;
    242         elif [ "$ssl" = "nss" ]; then
    243                 detect_nss;
    244         elif [ "$ssl" = "openssl" ]; then
     239detect_ldap()
     240{
     241        TMPFILE=`mktemp`
     242        if $CC -o $TMPFILE -shared -lldap 2>/dev/null >/dev/null; then
     243                cat<<EOF>>Makefile.settings
     244EFLAGS+=-lldap
     245CFLAGS+=
     246EOF
     247                ldap=1
     248                rm -f $TMPFILE
     249                ret=1
     250        else
     251                ldap=0
     252                ret=0
     253        fi
     254}
     255
     256if [ "$ssl" = "auto" ]; then
     257        detect_gnutls
     258        if [ "$ret" = "0" ]; then
     259                detect_nss
     260        fi
     261elif [ "$ssl" = "gnutls" ]; then
     262        detect_gnutls
     263elif [ "$ssl" = "nss" ]; then
     264        detect_nss
     265elif [ "$ssl" = "openssl" ]; then
     266        echo
     267        echo 'No detection code exists for OpenSSL. Make sure that you have a complete'
     268        echo 'install of OpenSSL (including devel/header files) before reporting'
     269        echo 'compilation problems.'
     270        echo
     271        echo 'Also, keep in mind that the OpenSSL is, according to some people, not'
     272        echo 'completely GPL-compatible. Using GnuTLS or NSS is recommended and better'
     273        echo 'supported by us. However, on many BSD machines, OpenSSL can be considered'
     274        echo 'part of the operating system, which makes it GPL-compatible.'
     275        echo
     276        echo 'For more info, see: http://www.openssl.org/support/faq.html#LEGAL2'
     277        echo '                    http://www.gnome.org/~markmc/openssl-and-the-gpl.html'
     278        echo
     279        echo 'Please note that distributing a BitlBee binary which links to OpenSSL is'
     280        echo 'probably illegal. If you want to create and distribute a binary BitlBee'
     281        echo 'package, you really should use GnuTLS or NSS instead.'
     282        echo
     283        echo 'Also, the OpenSSL license requires us to say this:'
     284        echo ' *    "This product includes software developed by the OpenSSL Project'
     285        echo ' *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"'
     286       
     287        echo 'EFLAGS+=-lssl -lcrypto' >> Makefile.settings
     288       
     289        ret=1
     290elif [ "$ssl" = "bogus" ]; then
     291        echo
     292        echo 'Using bogus SSL code. This means some features have to be disabled.'
     293       
     294        ## Yes, you, at the console! How can you authenticate if you don't have any SSL!?
     295        if [ "$msn" = "1" ]; then
    245296                echo
    246                 echo 'No detection code exists for OpenSSL. Make sure that you have a complete'
    247                 echo 'install of OpenSSL (including devel/header files) before reporting'
    248                 echo 'compilation problems.'
    249                 echo
    250                 echo 'Also, keep in mind that the OpenSSL is, according to some people, not'
    251                 echo 'completely GPL-compatible. Using GnuTLS or NSS is recommended and better'
    252                 echo 'supported by us. However, on many BSD machines, OpenSSL can be considered'
    253                 echo 'part of the operating system, which makes it GPL-compatible.'
    254                 echo
    255                 echo 'For more info, see: http://www.openssl.org/support/faq.html#LEGAL2'
    256                 echo '                    http://www.gnome.org/~markmc/openssl-and-the-gpl.html'
    257                 echo
    258                 echo 'Please note that distributing a BitlBee binary which links to OpenSSL is'
    259                 echo 'probably illegal. If you want to create and distribute a binary BitlBee'
    260                 echo 'package, you really should use GnuTLS or NSS instead.'
    261                 echo
    262                 echo 'Also, the OpenSSL license requires us to say this:'
    263                 echo ' *    "This product includes software developed by the OpenSSL Project'
    264                 echo ' *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"'
    265                
    266                 echo 'EFLAGS+=-lssl -lcrypto' >> Makefile.settings
    267                
    268                 ret=1;
    269         elif [ "$ssl" = "bogus" ]; then
    270                 echo
    271                 echo 'Using bogus SSL code. This will not make the MSN module work, but it will'
    272                 echo 'allow you to use the Jabber module - although without working SSL support.'
    273                
    274                 ret=1;
    275         else
    276                 echo
    277                 echo 'ERROR: Unknown SSL library specified.'
    278                 exit 1;
    279         fi
    280        
    281         if [ "$ret" = "0" ]; then
    282                 echo
    283                 echo 'ERROR: Could not find a suitable SSL library (GnuTLS, libnss or OpenSSL).'
    284                 echo '       This is necessary for MSN and full Jabber support. To continue,'
    285                 echo '       install a suitable SSL library or disable MSN support (--msn=0).'
    286                 echo '       If you want Jabber without SSL support you can try --ssl=bogus.'
    287                
    288                 exit 1;
    289         fi;
    290        
    291         echo 'SSL_CLIENT=ssl_'$ssl'.o' >> Makefile.settings
    292 fi
     297                echo 'Real SSL support is necessary for MSN authentication, will build without'
     298                echo 'MSN protocol support.'
     299                msn=0
     300        fi
     301       
     302        ret=1
     303else
     304        echo
     305        echo 'ERROR: Unknown SSL library specified.'
     306        exit 1
     307fi
     308
     309if [ "$ret" = "0" ]; then
     310        echo
     311        echo 'ERROR: Could not find a suitable SSL library (GnuTLS, libnss or OpenSSL).'
     312        echo '       Please note that this script doesn'\''t have detection code for OpenSSL,'
     313        echo '       so if you want to use that, you have to select it by hand. If you don'\''t'
     314        echo '       need SSL support, you can select the "bogus" SSL library. (--ssl=bogus)'
     315       
     316        exit 1
     317fi;
     318
     319echo 'SSL_CLIENT=ssl_'$ssl'.o' >> Makefile.settings
     320
     321STORAGES="text xml"
     322
     323if [ "$ldap" = "auto" ]; then
     324        detect_ldap
     325fi
     326
     327if [ "$ldap" = 0 ]; then
     328        echo "#undef WITH_LDAP" >> config.h
     329elif [ "$ldap" = 1 ]; then
     330        echo "#define WITH_LDAP 1" >> config.h
     331        STORAGES="$STORAGES ldap"
     332fi
     333
     334for i in $STORAGES; do
     335        STORAGE_OBJS="$STORAGE_OBJS storage_$i.o"
     336done
     337echo "STORAGE_OBJS="$STORAGE_OBJS >> Makefile.settings
    293338
    294339if [ "$strip" = 0 ]; then
     
    304349        elif type strip > /dev/null 2> /dev/null; then
    305350                echo "STRIP=strip" >> Makefile.settings;
    306         elif /bin/test -x /usr/ccs/bin/strip; then
    307                 echo "STRIP=/usr/ccs/bin/strip" >> Makefile.settings;
    308351        else
    309352                echo
     
    384427if [ "$protocols" = "PROTOCOLS = " ]; then
    385428        echo "WARNING: You haven't selected any communication protocol to compile!"
    386         echo "         Bitlbee will run, but you will be unable to connect to IM servers!"
     429        echo "         BitlBee will run, but you will be unable to connect to IM servers!"
    387430fi
    388431
     
    419462
    420463if [ "$debug" = "1" ]; then
    421         echo '  Debugging enabled.';
    422 else
    423         echo '  Debugging disabled.';
     464        echo '  Debugging enabled.'
     465else
     466        echo '  Debugging disabled.'
    424467fi
    425468
    426469if [ "$strip" = "1" ]; then
    427         echo '  Binary stripping enabled.';
    428 else
    429         echo '  Binary stripping disabled.';
    430 fi
    431 
    432 echo '  Using event handler: '$events;
    433 echo '  Using SSL library: '$ssl;
    434 
    435 #if [ "$flood" = "0" ]; then
    436 #       echo '  Flood protection disabled.';
    437 #else
    438 #       echo '  Flood protection enabled.';
    439 #fi
     470        echo '  Binary stripping enabled.'
     471else
     472        echo '  Binary stripping disabled.'
     473fi
     474
     475echo '  Using event handler: '$events
     476echo '  Using SSL library: '$ssl
     477echo '  Building with these storage backends: '$STORAGES
    440478
    441479if [ -n "$protocols" ]; then
    442         echo '  Building with these protocols:' $protocols;
    443 else
    444         echo '  Building without IM-protocol support. We wish you a lot of fun...';
    445 fi
     480        echo '  Building with these protocols:' $protocols
     481else
     482        echo '  Building without IM-protocol support. We wish you a lot of fun...'
     483fi
  • irc.c

    r3f9440d rfef6116  
    3333GSList *irc_connection_list = NULL;
    3434
    35 static char *passchange (irc_t *irc, void *set, char *value)
    36 {
    37         irc_setpass (irc, value);
    38         return (NULL);
     35static char *passchange( irc_t *irc, void *set, char *value )
     36{
     37        irc_setpass( irc, value );
     38        irc_usermsg( irc, "Password successfully changed" );
     39        return NULL;
    3940}
    4041
     
    120121        irc_connection_list = g_slist_append( irc_connection_list, irc );
    121122       
    122         set_add( irc, "away_devoice", "true",  set_eval_away_devoice );
    123         set_add( irc, "auto_connect", "true", set_eval_bool );
    124         set_add( irc, "auto_reconnect", "false", set_eval_bool );
    125         set_add( irc, "auto_reconnect_delay", "300", set_eval_int );
    126         set_add( irc, "buddy_sendbuffer", "false", set_eval_bool );
    127         set_add( irc, "buddy_sendbuffer_delay", "200", set_eval_int );
    128         set_add( irc, "charset", "iso8859-1", set_eval_charset );
    129         set_add( irc, "debug", "false", set_eval_bool );
    130         set_add( irc, "default_target", "root", NULL );
    131         set_add( irc, "display_namechanges", "false", set_eval_bool );
    132         set_add( irc, "handle_unknown", "root", NULL );
    133         set_add( irc, "lcnicks", "true", set_eval_bool );
    134         set_add( irc, "ops", "both", set_eval_ops );
    135         set_add( irc, "private", "true", set_eval_bool );
    136         set_add( irc, "query_order", "lifo", NULL );
    137         set_add( irc, "save_on_quit", "true", set_eval_bool );
    138         set_add( irc, "strip_html", "true", NULL );
    139         set_add( irc, "to_char", ": ", set_eval_to_char );
    140         set_add( irc, "typing_notice", "false", set_eval_bool );
    141         set_add( irc, "password", NULL, passchange);
     123        set_add( &irc->set, "away_devoice", "true",  set_eval_away_devoice, irc );
     124        set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc );
     125        set_add( &irc->set, "auto_reconnect", "false", set_eval_bool, irc );
     126        set_add( &irc->set, "auto_reconnect_delay", "300", set_eval_int, irc );
     127        set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc );
     128        set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc );
     129        set_add( &irc->set, "charset", "iso8859-1", set_eval_charset, irc );
     130        set_add( &irc->set, "debug", "false", set_eval_bool, irc );
     131        set_add( &irc->set, "default_target", "root", NULL, irc );
     132        set_add( &irc->set, "display_namechanges", "false", set_eval_bool, irc );
     133        set_add( &irc->set, "handle_unknown", "root", NULL, irc );
     134        set_add( &irc->set, "lcnicks", "true", set_eval_bool, irc );
     135        set_add( &irc->set, "ops", "both", set_eval_ops, irc );
     136        set_add( &irc->set, "password", NULL, passchange, irc );
     137        set_add( &irc->set, "private", "true", set_eval_bool, irc );
     138        set_add( &irc->set, "query_order", "lifo", NULL, irc );
     139        set_add( &irc->set, "save_on_quit", "true", set_eval_bool, irc );
     140        set_add( &irc->set, "strip_html", "true", NULL, irc );
     141        set_add( &irc->set, "to_char", ": ", set_eval_to_char, irc );
     142        set_add( &irc->set, "typing_notice", "false", set_eval_bool, irc );
    142143       
    143144        conf_loaddefaults( irc );
     
    211212        log_message( LOGLVL_INFO, "Destroying connection with fd %d", irc->fd );
    212213       
    213         if( irc->status & USTATUS_IDENTIFIED && set_getint( irc, "save_on_quit" ) )
     214        if( irc->status & USTATUS_IDENTIFIED && set_getint( &irc->set, "save_on_quit" ) )
    214215                if( storage_save( irc, TRUE ) != STORAGE_OK )
    215216                        irc_usermsg( irc, "Error while saving settings!" );
     
    329330void irc_setpass (irc_t *irc, const char *pass)
    330331{
    331         if (irc->password) g_free (irc->password);
     332        g_free (irc->password);
    332333       
    333334        if (pass) {
    334335                irc->password = g_strdup (pass);
    335                 irc_usermsg (irc, "Password successfully changed");
    336336        } else {
    337337                irc->password = NULL;
     
    364364                        }
    365365                       
    366                         if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
     366                        if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
    367367                        {
    368368                                conv[IRC_MAX_LINE] = 0;
     
    584584       
    585585        strip_newlines( line );
    586         if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
     586        if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
    587587        {
    588588                char conv[IRC_MAX_LINE+1];
     
    666666                        }
    667667                       
    668                         if( u->gc && !u->away && set_getint( irc, "away_devoice" ) )
     668                        if( u->gc && !u->away && set_getbool( &irc->set, "away_devoice" ) )
    669669                                strcat( namelist, "+" );
    670670                       
     
    676676        {
    677677                GList *l;
    678                 char *ops = set_getstr( irc, "ops" );
     678                char *ops = set_getstr( &irc->set, "ops" );
    679679               
    680680                /* root and the user aren't in the channel userlist but should
     
    924924{
    925925        char *nick, *s;
    926         char reason[64];
     926        char reason[128];
    927927       
    928928        if( u->gc && u->gc->flags & OPT_LOGGING_OUT )
    929929        {
    930                 if( u->gc->user->proto_opt[0][0] )
     930                if( u->gc->acc->server )
    931931                        g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost,
    932                                     u->gc->user->proto_opt[0] );
     932                                    u->gc->acc->server );
    933933                else if( ( s = strchr( u->gc->username, '@' ) ) )
    934934                        g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost,
     
    936936                else
    937937                        g_snprintf( reason, sizeof( reason ), "%s %s.%s", irc->myhost,
    938                                     u->gc->prpl->name, irc->myhost );
     938                                    u->gc->acc->prpl->name, irc->myhost );
    939939               
    940940                /* proto_opt might contain garbage after the : */
     
    10121012                else if( g_strncasecmp( s + 1, "TYPING", 6 ) == 0 )
    10131013                {
    1014                         if( u && u->gc && u->gc->prpl->send_typing && strlen( s ) >= 10 )
     1014                        if( u && u->gc && u->gc->acc->prpl->send_typing && strlen( s ) >= 10 )
    10151015                        {
    10161016                                time_t current_typing_notice = time( NULL );
     
    10181018                                if( current_typing_notice - u->last_typing_notice >= 5 )
    10191019                                {
    1020                                         u->gc->prpl->send_typing( u->gc, u->handle, s[8] == '1' );
     1020                                        u->gc->acc->prpl->send_typing( u->gc, u->handle, s[8] == '1' );
    10211021                                        u->last_typing_notice = current_typing_notice;
    10221022                                }
     
    10511051                }
    10521052        }
    1053         else if( c && c->gc && c->gc->prpl )
     1053        else if( c && c->gc && c->gc->acc && c->gc->acc->prpl )
    10541054        {
    10551055                return( bim_chat_msg( c->gc, c->id, s ) );
     
    10831083        if( !u || !u->gc ) return;
    10841084       
    1085         if( set_getint( irc, "buddy_sendbuffer" ) && set_getint( irc, "buddy_sendbuffer_delay" ) > 0 )
     1085        if( set_getint( &irc->set, "buddy_sendbuffer" ) && set_getint( &irc->set, "buddy_sendbuffer_delay" ) > 0 )
    10861086        {
    10871087                int delay;
     
    11101110                strcat( u->sendbuf, "\n" );
    11111111               
    1112                 delay = set_getint( irc, "buddy_sendbuffer_delay" );
     1112                delay = set_getint( &irc->set, "buddy_sendbuffer_delay" );
    11131113                if( delay <= 5 )
    11141114                        delay *= 1000;
     
    11751175                int len = strlen( irc->nick) + 3;
    11761176                prefix = g_new (char, len );
    1177                 g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( irc, "to_char" ) );
     1177                g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( &irc->set, "to_char" ) );
    11781178                prefix[len-1] = 0;
    11791179        }
  • irc_commands.c

    r3f9440d rfef6116  
    150150                irc_part( irc, u, c->channel );
    151151               
    152                 if( c->gc && c->gc->prpl )
     152                if( c->gc )
    153153                {
    154154                        c->joined = 0;
    155                         c->gc->prpl->chat_leave( c->gc, c->id );
     155                        c->gc->acc->prpl->chat_leave( c->gc, c->id );
    156156                }
    157157        }
     
    173173                        user_t *u = user_find( irc, cmd[1] + 1 );
    174174                       
    175                         if( u && u->gc && u->gc->prpl && u->gc->prpl->chat_open )
     175                        if( u && u->gc && u->gc->acc->prpl->chat_open )
    176176                        {
    177177                                irc_reply( irc, 403, "%s :Initializing groupchat in a different channel", cmd[1] );
    178178                               
    179                                 if( !u->gc->prpl->chat_open( u->gc, u->handle ) )
     179                                if( !u->gc->acc->prpl->chat_open( u->gc, u->handle ) )
    180180                                {
    181181                                        irc_usermsg( irc, "Could not open a groupchat with %s.", u->nick );
     
    205205       
    206206        if( u && c && ( u->gc == c->gc ) )
    207                 if( c->gc && c->gc->prpl && c->gc->prpl->chat_invite )
    208                 {
    209                         c->gc->prpl->chat_invite( c->gc, c->id, "", u->handle );
     207                if( c->gc && c->gc->acc->prpl->chat_invite )
     208                {
     209                        c->gc->acc->prpl->chat_invite( c->gc, c->id, "", u->handle );
    210210                        irc_reply( irc, 341, "%s %s", nick, channel );
    211211                        return;
     
    230230                {
    231231                        unsigned int i;
    232                         char *t = set_getstr( irc, "default_target" );
     232                        char *t = set_getstr( &irc->set, "default_target" );
    233233                       
    234234                        if( g_strcasecmp( t, "last" ) == 0 && irc->last_target )
     
    477477               
    478478                if( u->gc )
    479                         irc_reply( irc, 312, "%s %s.%s :%s network", u->nick, u->gc->user->username,
    480                                    *u->gc->user->proto_opt[0] ? u->gc->user->proto_opt[0] : "", u->gc->prpl->name );
     479                        irc_reply( irc, 312, "%s %s.%s :%s network", u->nick, u->gc->acc->user,
     480                                   *u->gc->acc->server ? u->gc->acc->server : "", u->gc->acc->prpl->name );
    481481                else
    482482                        irc_reply( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO );
  • nick.c

    r3f9440d rfef6116  
    8686               
    8787                nick_strip( nick );
    88                 if (set_getint(irc, "lcnicks"))
     88                if( set_getint( &irc->set, "lcnicks" ) )
    8989                        nick_lc( nick );
    9090        }
  • protocols/Makefile

    r3f9440d rfef6116  
    1010
    1111# [SH] Program variables
    12 objects = $(EVENT_HANDLER) http_client.o md5.o nogaim.o proxy.o sha.o $(SSL_CLIENT)
     12objects = nogaim.o
    1313
    1414# [SH] The next two lines should contain the directory name (in $(subdirs))
  • protocols/jabber/jabber.c

    r3f9440d rfef6116  
    561561static void gjab_start(gjconn gjc)
    562562{
    563         struct aim_user *user;
     563        account_t *acc;
    564564        int port = -1, ssl = 0;
    565565        char *server = NULL, *s;
     
    568568                return;
    569569
    570         user = GJ_GC(gjc)->user;
    571         if (*user->proto_opt[0]) {
     570        acc = GJ_GC(gjc)->acc;
     571        if (acc->server) {
    572572                /* If there's a dot, assume there's a hostname in the beginning */
    573                 if (strchr(user->proto_opt[0], '.')) {
    574                         server = g_strdup(user->proto_opt[0]);
     573                if (strchr(acc->server, '.')) {
     574                        server = g_strdup(acc->server);
    575575                        if ((s = strchr(server, ':')))
    576576                                *s = 0;
     
    578578               
    579579                /* After the hostname, there can be a port number */
    580                 s = strchr(user->proto_opt[0], ':');
     580                s = strchr(acc->server, ':');
    581581                if (s && isdigit(s[1]))
    582582                        sscanf(s + 1, "%d", &port);
    583583               
    584584                /* And if there's the string ssl, the user wants an SSL-connection */
    585                 if (strstr(user->proto_opt[0], ":ssl") || g_strcasecmp(user->proto_opt[0], "ssl") == 0)
     585                if (strstr(acc->server, ":ssl") || g_strcasecmp(acc->server, "ssl") == 0)
    586586                        ssl = 1;
    587587        }
     
    616616        g_free(server);
    617617       
    618         if (!user->gc || (gjc->fd < 0)) {
     618        if (!acc->gc || (gjc->fd < 0)) {
    619619                STATE_EVT(JCONN_STATE_OFF)
    620620                return;
     
    15161516}
    15171517
    1518 static void jabber_login(struct aim_user *user)
    1519 {
    1520         struct gaim_connection *gc = new_gaim_conn(user);
     1518static void jabber_login(account_t *acc)
     1519{
     1520        struct gaim_connection *gc = new_gaim_conn(acc);
    15211521        struct jabber_data *jd = gc->proto_data = g_new0(struct jabber_data, 1);
    1522         char *loginname = create_valid_jid(user->username, DEFAULT_SERVER, "BitlBee");
     1522        char *loginname = create_valid_jid(acc->user, DEFAULT_SERVER, "BitlBee");
    15231523
    15241524        jd->hash = g_hash_table_new(g_str_hash, g_str_equal);
     
    15271527        set_login_progress(gc, 1, _("Connecting"));
    15281528
    1529         if (!(jd->gjc = gjab_new(loginname, user->password, gc))) {
     1529        if (!(jd->gjc = gjab_new(loginname, acc->pass, gc))) {
    15301530                g_free(loginname);
    15311531                hide_login_progress(gc, _("Unable to connect"));
  • protocols/msn/msn.c

    r3f9440d rfef6116  
    2727#include "msn.h"
    2828
    29 static void msn_login( struct aim_user *acct )
    30 {
    31         struct gaim_connection *gc = new_gaim_conn( acct );
     29static void msn_login( account_t *acc )
     30{
     31        struct gaim_connection *gc = new_gaim_conn( acc );
    3232        struct msn_data *md = g_new0( struct msn_data, 1 );
    3333       
     
    3737        md->fd = -1;
    3838       
    39         if( strchr( acct->username, '@' ) == NULL )
     39        if( strchr( acc->user, '@' ) == NULL )
    4040        {
    4141                hide_login_progress( gc, "Invalid account name" );
  • protocols/nogaim.c

    r3f9440d rfef6116  
    145145/* multi.c */
    146146
    147 struct gaim_connection *new_gaim_conn( struct aim_user *user )
     147struct gaim_connection *new_gaim_conn( account_t *acc )
    148148{
    149149        struct gaim_connection *gc;
    150         account_t *a;
    151150       
    152151        gc = g_new0( struct gaim_connection, 1 );
    153152       
    154         gc->prpl = user->prpl;
    155         g_snprintf( gc->username, sizeof( gc->username ), "%s", user->username );
    156         g_snprintf( gc->password, sizeof( gc->password ), "%s", user->password );
    157         /* [MD] BUGFIX: don't set gc->irc to the global IRC, but use the one from the struct aim_user.
    158          * This fixes daemon mode breakage where IRC doesn't point to the currently active connection.
    159          */
    160         gc->irc = user->irc;
     153        /* Maybe we should get rid of this memory waste later. ;-) */
     154        g_snprintf( gc->username, sizeof( gc->username ), "%s", acc->user );
     155        g_snprintf( gc->password, sizeof( gc->password ), "%s", acc->pass );
     156       
     157        gc->irc = acc->irc;
     158        gc->acc = acc;
     159        acc->gc = gc;
    161160       
    162161        connections = g_slist_append( connections, gc );
    163        
    164         user->gc = gc;
    165         gc->user = user;
    166        
    167         // Find the account_t so we can set its gc pointer
    168         for( a = gc->irc->accounts; a; a = a->next )
    169                 if( ( struct aim_user * ) a->gc == user )
    170                 {
    171                         a->gc = gc;
    172                         break;
    173                 }
    174162       
    175163        return( gc );
     
    189177       
    190178        connections = g_slist_remove( connections, gc );
    191         g_free( gc->user );
    192179        g_free( gc );
    193180}
     
    220207        va_end( params );
    221208
    222         if( ( g_strcasecmp( set_getstr( gc->irc, "strip_html" ), "always" ) == 0 ) ||
    223             ( ( gc->flags & OPT_CONN_HTML ) && set_getint( gc->irc, "strip_html" ) ) )
     209        if( ( g_strcasecmp( set_getstr( &gc->irc->set, "strip_html" ), "always" ) == 0 ) ||
     210            ( ( gc->flags & OPT_CONN_HTML ) && set_getint( &gc->irc->set, "strip_html" ) ) )
    224211                strip_html( text );
    225212       
    226213        /* Try to find a different connection on the same protocol. */
    227214        for( a = gc->irc->accounts; a; a = a->next )
    228                 if( a->prpl == gc->prpl && a->gc != gc )
     215                if( a->prpl == gc->acc->prpl && a->gc != gc )
    229216                        break;
    230217       
    231218        /* If we found one, include the screenname in the message. */
    232219        if( a )
    233                 irc_usermsg( gc->irc, "%s(%s) - %s", gc->prpl->name, gc->username, text );
     220                irc_usermsg( gc->irc, "%s(%s) - %s", gc->acc->prpl->name, gc->username, text );
    234221        else
    235                 irc_usermsg( gc->irc, "%s - %s", gc->prpl->name, text );
     222                irc_usermsg( gc->irc, "%s - %s", gc->acc->prpl->name, text );
    236223       
    237224        g_free( text );
     
    242229        struct gaim_connection *gc = d;
    243230       
    244         if( gc->prpl && gc->prpl->keepalive )
    245                 gc->prpl->keepalive( gc );
     231        if( gc->acc->prpl->keepalive )
     232                gc->acc->prpl->keepalive( gc );
    246233       
    247234        return TRUE;
     
    297284        b_event_remove( gc->keepalive );
    298285        gc->flags |= OPT_LOGGING_OUT;
     286       
    299287        gc->keepalive = 0;
    300         gc->prpl->close( gc );
     288        gc->acc->prpl->close( gc );
    301289        b_event_remove( gc->inpa );
    302290       
     
    323311                /* Uhm... This is very sick. */
    324312        }
    325         else if( !gc->wants_to_die && set_getint( irc, "auto_reconnect" ) )
    326         {
    327                 int delay = set_getint( irc, "auto_reconnect_delay" );
     313        else if( !gc->wants_to_die && set_getint( &irc->set, "auto_reconnect" ) )
     314        {
     315                int delay = set_getint( &irc->set, "auto_reconnect_delay" );
    328316               
    329317                serv_got_crap( gc, "Reconnecting in %d seconds..", delay );
     
    364352        irc_t *irc = gc->irc;
    365353       
    366         if( set_getint( irc, "debug" ) && 0 ) /* This message is too useless */
     354        if( set_getint( &irc->set, "debug" ) && 0 ) /* This message is too useless */
    367355                serv_got_crap( gc, "Receiving user add from handle: %s", handle );
    368356       
    369357        if( user_findhandle( gc, handle ) )
    370358        {
    371                 if( set_getint( irc, "debug" ) )
     359                if( set_getint( &irc->set, "debug" ) )
    372360                        serv_got_crap( gc, "User already exists, ignoring add request: %s", handle );
    373361               
     
    378366       
    379367        memset( nick, 0, MAX_NICK_LENGTH + 1 );
    380         strcpy( nick, nick_get( gc->irc, handle, gc->prpl, realname ) );
     368        strcpy( nick, nick_get( gc->irc, handle, gc->acc->prpl, realname ) );
    381369       
    382370        u = user_add( gc->irc, nick );
     
    390378                u->user = g_strndup( handle, s - handle );
    391379        }
    392         else if( gc->user->proto_opt[0] && *gc->user->proto_opt[0] )
     380        else if( *gc->acc->server )
    393381        {
    394382                char *colon;
    395383               
    396                 if( ( colon = strchr( gc->user->proto_opt[0], ':' ) ) )
    397                         u->host = g_strndup( gc->user->proto_opt[0],
    398                                              colon - gc->user->proto_opt[0] );
     384                if( ( colon = strchr( gc->acc->server, ':' ) ) )
     385                        u->host = g_strndup( gc->acc->server,
     386                                             colon - gc->acc->server );
    399387                else
    400                         u->host = g_strdup( gc->user->proto_opt[0] );
     388                        u->host = g_strdup( gc->acc->server );
    401389               
    402390                u->user = g_strdup( handle );
     
    409397        else
    410398        {
    411                 u->host = g_strdup( gc->user->prpl->name );
     399                u->host = g_strdup( gc->acc->prpl->name );
    412400                u->user = g_strdup( handle );
    413401        }
     
    457445                u->realname = g_strdup( realname );
    458446               
    459                 if( ( gc->flags & OPT_LOGGED_IN ) && set_getint( gc->irc, "display_namechanges" ) )
     447                if( ( gc->flags & OPT_LOGGED_IN ) && set_getint( &gc->irc->set, "display_namechanges" ) )
    460448                        serv_got_crap( gc, "User `%s' changed name to `%s'", u->nick, u->realname );
    461449        }
     
    479467void show_got_added_yes( gpointer w, struct show_got_added_data *data )
    480468{
    481         data->gc->prpl->add_buddy( data->gc, data->handle );
     469        data->gc->acc->prpl->add_buddy( data->gc, data->handle );
    482470        add_buddy( data->gc, NULL, data->handle, data->handle );
    483471       
     
    513501        if( !u )
    514502        {
    515                 if( g_strcasecmp( set_getstr( gc->irc, "handle_unknown" ), "add" ) == 0 )
     503                if( g_strcasecmp( set_getstr( &gc->irc->set, "handle_unknown" ), "add" ) == 0 )
    516504                {
    517505                        add_buddy( gc, NULL, handle, NULL );
     
    520508                else
    521509                {
    522                         if( set_getint( gc->irc, "debug" ) || g_strcasecmp( set_getstr( gc->irc, "handle_unknown" ), "ignore" ) != 0 )
     510                        if( set_getint( &gc->irc->set, "debug" ) || g_strcasecmp( set_getstr( &gc->irc->set, "handle_unknown" ), "ignore" ) != 0 )
    523511                        {
    524512                                serv_got_crap( gc, "serv_got_update() for handle %s:", handle );
     
    558546        }
    559547       
    560         if( ( type & UC_UNAVAILABLE ) && ( !strcmp(gc->prpl->name, "oscar") || !strcmp(gc->prpl->name, "icq")) )
     548        if( ( type & UC_UNAVAILABLE ) && ( strcmp( gc->acc->prpl->name, "oscar" ) == 0 || strcmp( gc->acc->prpl->name, "icq" ) == 0 ) )
    561549        {
    562550                u->away = g_strdup( "Away" );
    563551        }
    564         else if( ( type & UC_UNAVAILABLE ) && ( !strcmp(gc->prpl->name, "jabber") ) )
     552        else if( ( type & UC_UNAVAILABLE ) && ( strcmp( gc->acc->prpl->name, "jabber" ) == 0 ) )
    565553        {
    566554                if( type & UC_DND )
     
    571559                        u->away = g_strdup( "Away" );
    572560        }
    573         else if( ( type & UC_UNAVAILABLE ) && gc->prpl->get_status_string )
    574         {
    575                 u->away = g_strdup( gc->prpl->get_status_string( gc, type ) );
     561        else if( ( type & UC_UNAVAILABLE ) && gc->acc->prpl->get_status_string )
     562        {
     563                u->away = g_strdup( gc->acc->prpl->get_status_string( gc, type ) );
    576564        }
    577565        else
     
    579567       
    580568        /* LISPy... */
    581         if( ( set_getint( gc->irc, "away_devoice" ) ) &&                /* Don't do a thing when user doesn't want it */
     569        if( ( set_getint( &gc->irc->set, "away_devoice" ) ) &&          /* Don't do a thing when user doesn't want it */
    582570            ( u->online ) &&                                            /* Don't touch offline people */
    583571            ( ( ( u->online != oo ) && !u->away ) ||                    /* Voice joining people */
     
    598586        if( !u )
    599587        {
    600                 char *h = set_getstr( irc, "handle_unknown" );
     588                char *h = set_getstr( &irc->set, "handle_unknown" );
    601589               
    602590                if( g_strcasecmp( h, "ignore" ) == 0 )
    603591                {
    604                         if( set_getint( irc, "debug" ) )
     592                        if( set_getint( &irc->set, "debug" ) )
    605593                                serv_got_crap( gc, "Ignoring message from unknown handle %s", handle );
    606594                       
     
    609597                else if( g_strncasecmp( h, "add", 3 ) == 0 )
    610598                {
    611                         int private = set_getint( irc, "private" );
     599                        int private = set_getint( &irc->set, "private" );
    612600                       
    613601                        if( h[3] )
     
    630618        }
    631619       
    632         if( ( g_strcasecmp( set_getstr( gc->irc, "strip_html" ), "always" ) == 0 ) ||
    633             ( ( gc->flags & OPT_CONN_HTML ) && set_getint( gc->irc, "strip_html" ) ) )
     620        if( ( g_strcasecmp( set_getstr( &gc->irc->set, "strip_html" ), "always" ) == 0 ) ||
     621            ( ( gc->flags & OPT_CONN_HTML ) && set_getint( &gc->irc->set, "strip_html" ) ) )
    634622                strip_html( msg );
    635623
     
    671659        user_t *u;
    672660       
    673         if( !set_getint( gc->irc, "typing_notice" ) )
     661        if( !set_getint( &gc->irc->set, "typing_notice" ) )
    674662                return;
    675663       
     
    693681        GList *ir;
    694682       
    695         if( set_getint( gc->irc, "debug" ) )
     683        if( set_getint( &gc->irc->set, "debug" ) )
    696684                serv_got_crap( gc, "You were removed from conversation %d", (int) id );
    697685       
     
    732720       
    733721        /* Gaim sends own messages through this too. IRC doesn't want this, so kill them */
    734         if( g_strcasecmp( who, gc->user->username ) == 0 )
     722        if( g_strcasecmp( who, gc->username ) == 0 )
    735723                return;
    736724       
     
    738726        for( c = gc->conversations; c && c->id != id; c = c->next );
    739727       
    740         if( ( g_strcasecmp( set_getstr( gc->irc, "strip_html" ), "always" ) == 0 ) ||
    741             ( ( gc->flags & OPT_CONN_HTML ) && set_getint( gc->irc, "strip_html" ) ) )
     728        if( ( g_strcasecmp( set_getstr( &gc->irc->set, "strip_html" ), "always" ) == 0 ) ||
     729            ( ( gc->flags & OPT_CONN_HTML ) && set_getint( &gc->irc->set, "strip_html" ) ) )
    742730                strip_html( msg );
    743731       
     
    772760        g_free( s );
    773761       
    774         if( set_getint( gc->irc, "debug" ) )
     762        if( set_getint( &gc->irc->set, "debug" ) )
    775763                serv_got_crap( gc, "Creating new conversation: (id=%d,handle=%s)", id, handle );
    776764       
     
    786774        int me = 0;
    787775       
    788         if( set_getint( b->gc->irc, "debug" ) )
     776        if( set_getint( &b->gc->irc->set, "debug" ) )
    789777                serv_got_crap( b->gc, "User %s added to conversation %d", handle, b->id );
    790778       
    791779        /* It might be yourself! */
    792         if( b->gc->prpl->cmp_buddynames( handle, b->gc->user->username ) == 0 )
     780        if( b->gc->acc->prpl->cmp_buddynames( handle, b->gc->username ) == 0 )
    793781        {
    794782                u = user_find( b->gc->irc, b->gc->irc->nick );
     
    820808        int me = 0;
    821809       
    822         if( set_getint( b->gc->irc, "debug" ) )
     810        if( set_getint( &b->gc->irc->set, "debug" ) )
    823811                serv_got_crap( b->gc, "User %s removed from conversation %d (%s)", handle, b->id, reason ? reason : "" );
    824812       
    825813        /* It might be yourself! */
    826         if( g_strcasecmp( handle, b->gc->user->username ) == 0 )
     814        if( g_strcasecmp( handle, b->gc->username ) == 0 )
    827815        {
    828816                u = user_find( b->gc->irc, b->gc->irc->nick );
     
    882870}
    883871
    884 char *set_eval_away_devoice( irc_t *irc, set_t *set, char *value )
    885 {
     872char *set_eval_away_devoice( set_t *set, char *value )
     873{
     874        irc_t *irc = set->data;
    886875        int st;
    887876       
     
    897886        /* Horror.... */
    898887       
    899         if( st != set_getint( irc, "away_devoice" ) )
     888        if( st != set_getint( &irc->set, "away_devoice" ) )
    900889        {
    901890                char list[80] = "";
     
    937926        }
    938927       
    939         return( set_eval_bool( irc, set, value ) );
     928        return( set_eval_bool( set, value ) );
    940929}
    941930
     
    957946        }
    958947       
    959         st = gc->prpl->send_im( gc, handle, msg, strlen( msg ), flags );
     948        st = gc->acc->prpl->send_im( gc, handle, msg, strlen( msg ), flags );
    960949        g_free( buf );
    961950       
     
    974963        }
    975964       
    976         st = gc->prpl->chat_send( gc, id, msg );
     965        st = gc->acc->prpl->chat_send( gc, id, msg );
    977966        g_free( buf );
    978967       
     
    988977       
    989978        if( !away ) away = "";
    990         ms = m = gc->prpl->away_states( gc );
     979        ms = m = gc->acc->prpl->away_states( gc );
    991980       
    992981        while( m )
     
    1009998        if( m )
    1010999        {
    1011                 gc->prpl->set_away( gc, m->data, *away ? away : NULL );
     1000                gc->acc->prpl->set_away( gc, m->data, *away ? away : NULL );
    10121001        }
    10131002        else
     
    10161005                if( s )
    10171006                {
    1018                         gc->prpl->set_away( gc, s, away );
    1019                         if( set_getint( gc->irc, "debug" ) )
     1007                        gc->acc->prpl->set_away( gc, s, away );
     1008                        if( set_getint( &gc->irc->set, "debug" ) )
    10201009                                serv_got_crap( gc, "Setting away state to %s", s );
    10211010                }
    10221011                else
    1023                         gc->prpl->set_away( gc, GAIM_AWAY_CUSTOM, away );
     1012                        gc->acc->prpl->set_away( gc, GAIM_AWAY_CUSTOM, away );
    10241013        }
    10251014       
     
    10731062void bim_add_allow( struct gaim_connection *gc, char *handle )
    10741063{
    1075         if( g_slist_find_custom( gc->permit, handle, (GCompareFunc) gc->prpl->cmp_buddynames ) == NULL )
     1064        if( g_slist_find_custom( gc->permit, handle, (GCompareFunc) gc->acc->prpl->cmp_buddynames ) == NULL )
    10761065        {
    10771066                gc->permit = g_slist_prepend( gc->permit, g_strdup( handle ) );
    10781067        }
    10791068       
    1080         gc->prpl->add_permit( gc, handle );
     1069        gc->acc->prpl->add_permit( gc, handle );
    10811070}
    10821071
     
    10851074        GSList *l;
    10861075       
    1087         if( ( l = g_slist_find_custom( gc->permit, handle, (GCompareFunc) gc->prpl->cmp_buddynames ) ) )
     1076        if( ( l = g_slist_find_custom( gc->permit, handle, (GCompareFunc) gc->acc->prpl->cmp_buddynames ) ) )
    10881077        {
    10891078                g_free( l->data );
     
    10911080        }
    10921081       
    1093         gc->prpl->rem_permit( gc, handle );
     1082        gc->acc->prpl->rem_permit( gc, handle );
    10941083}
    10951084
    10961085void bim_add_block( struct gaim_connection *gc, char *handle )
    10971086{
    1098         if( g_slist_find_custom( gc->deny, handle, (GCompareFunc) gc->prpl->cmp_buddynames ) == NULL )
     1087        if( g_slist_find_custom( gc->deny, handle, (GCompareFunc) gc->acc->prpl->cmp_buddynames ) == NULL )
    10991088        {
    11001089                gc->deny = g_slist_prepend( gc->deny, g_strdup( handle ) );
    11011090        }
    11021091       
    1103         gc->prpl->add_deny( gc, handle );
     1092        gc->acc->prpl->add_deny( gc, handle );
    11041093}
    11051094
     
    11081097        GSList *l;
    11091098       
    1110         if( ( l = g_slist_find_custom( gc->deny, handle, (GCompareFunc) gc->prpl->cmp_buddynames ) ) )
     1099        if( ( l = g_slist_find_custom( gc->deny, handle, (GCompareFunc) gc->acc->prpl->cmp_buddynames ) ) )
    11111100        {
    11121101                g_free( l->data );
     
    11141103        }
    11151104       
    1116         gc->prpl->rem_deny( gc, handle );
    1117 }
     1105        gc->acc->prpl->rem_deny( gc, handle );
     1106}
  • protocols/nogaim.h

    r3f9440d rfef6116  
    3939
    4040#include "bitlbee.h"
     41#include "account.h"
    4142#include "proxy.h"
    4243#include "md5.h"
     
    6364struct gaim_connection
    6465{
    65         struct prpl *prpl;
     66        account_t *acc;
    6667        guint32 flags;
    6768       
     
    7879        GSList *deny;
    7980        int permdeny;
    80        
    81         struct aim_user *user;
    8281       
    8382        char username[64];
     
    126125};
    127126
    128 struct aim_user {
    129         char username[64];
    130         char alias[SELF_ALIAS_LEN];
    131         char password[32];
    132         char user_info[2048];
    133         int options;
    134         struct prpl *prpl;
    135         /* prpls can use this to save information about the user,
    136          * like which server to connect to, etc */
    137         char proto_opt[7][256];
    138 
    139         struct gaim_connection *gc;
    140         irc_t *irc;
    141 };
    142 
    143127struct prpl {
    144128        int options;
    145129        const char *name;
    146130
    147         void (* login)          (struct aim_user *);
     131        void (* login)          (account_t *);
    148132        void (* keepalive)      (struct gaim_connection *);
    149133        void (* close)          (struct gaim_connection *);
     
    206190
    207191void nogaim_init();
    208 char *set_eval_away_devoice( irc_t *irc, set_t *set, char *value );
     192char *set_eval_away_devoice( set_t *set, char *value );
    209193
    210194gboolean auto_reconnect( gpointer data, gint fd, b_input_condition cond );
     
    212196
    213197/* multi.c */
    214 G_MODULE_EXPORT struct gaim_connection *new_gaim_conn( struct aim_user *user );
     198G_MODULE_EXPORT struct gaim_connection *new_gaim_conn( account_t *acc );
    215199G_MODULE_EXPORT void destroy_gaim_conn( struct gaim_connection *gc );
    216200G_MODULE_EXPORT void set_login_progress( struct gaim_connection *gc, int step, char *msg );
  • protocols/oscar/oscar.c

    r3f9440d rfef6116  
    356356}
    357357
    358 static void oscar_login(struct aim_user *user) {
     358static void oscar_login(account_t *acc) {
    359359        aim_session_t *sess;
    360360        aim_conn_t *conn;
    361361        char buf[256];
    362         struct gaim_connection *gc = new_gaim_conn(user);
     362        struct gaim_connection *gc = new_gaim_conn(acc);
    363363        struct oscar_data *odata = gc->proto_data = g_new0(struct oscar_data, 1);
    364364
    365         if (isdigit(*user->username)) {
     365        if (isdigit(acc->user[0])) {
    366366                odata->icq = TRUE;
    367367                /* This is odd but it's necessary for a proper do_import and do_export.
    368368                   We don't do those anymore, but let's stick with it, just in case
    369                    it accidentally fixes something else too... */
     369                   it accidentally fixes something else too... </bitlbee> */
    370370                gc->password[8] = 0;
    371371        } else {
     
    390390        }
    391391       
    392         if (g_strcasecmp(user->proto_opt[USEROPT_AUTH], "login.icq.com") != 0 &&
    393             g_strcasecmp(user->proto_opt[USEROPT_AUTH], "login.oscar.aol.com") != 0) {
    394                 serv_got_crap(gc, "Warning: Unknown OSCAR server: `%s'. Please review your configuration if the connection fails.",user->proto_opt[USEROPT_AUTH]);
     392        if (g_strcasecmp(acc->server, "login.icq.com") != 0 &&
     393            g_strcasecmp(acc->server, "login.oscar.aol.com") != 0) {
     394                serv_got_crap(gc, "Warning: Unknown OSCAR server: `%s'. Please review your configuration if the connection fails.",acc->server);
    395395        }
    396396       
     
    402402
    403403        conn->status |= AIM_CONN_STATUS_INPROGRESS;
    404         conn->fd = proxy_connect(user->proto_opt[USEROPT_AUTH][0] ?
    405                                         user->proto_opt[USEROPT_AUTH] : AIM_DEFAULT_LOGIN_SERVER,
    406                                  user->proto_opt[USEROPT_AUTHPORT][0] ?
    407                                         atoi(user->proto_opt[USEROPT_AUTHPORT]) : AIM_LOGIN_PORT,
    408                                  oscar_login_connect, gc);
     404        conn->fd = proxy_connect(acc->server, AIM_LOGIN_PORT, oscar_login_connect, gc);
    409405        if (conn->fd < 0) {
    410406                hide_login_progress(gc, _("Couldn't connect to host"));
     
    485481        struct aim_authresp_info *info;
    486482        int i; char *host; int port;
    487         struct aim_user *user;
    488483        aim_conn_t *bosconn;
    489484
    490485        struct gaim_connection *gc = sess->aux_data;
    491486        struct oscar_data *od = gc->proto_data;
    492         user = gc->user;
    493         port = user->proto_opt[USEROPT_AUTHPORT][0] ?
    494                 atoi(user->proto_opt[USEROPT_AUTHPORT]) : AIM_LOGIN_PORT,
     487        port = AIM_LOGIN_PORT;
    495488
    496489        va_start(ap, fr);
     
    871864        struct aim_redirect_data *redir;
    872865        struct gaim_connection *gc = sess->aux_data;
    873         struct aim_user *user = gc->user;
    874866        aim_conn_t *tstconn;
    875867        int i;
     
    877869        int port;
    878870
    879         port = user->proto_opt[USEROPT_AUTHPORT][0] ?
    880                 atoi(user->proto_opt[USEROPT_AUTHPORT]) : AIM_LOGIN_PORT,
    881 
    882871        va_start(ap, fr);
    883872        redir = va_arg(ap, struct aim_redirect_data *);
    884873        va_end(ap);
    885874
     875        port = AIM_LOGIN_PORT;
    886876        for (i = 0; i < (int)strlen(redir->ip); i++) {
    887877                if (redir->ip[i] == ':') {
     
    17231713        odata->rights.maxsiglen = odata->rights.maxawaymsglen = (guint)maxsiglen;
    17241714
     1715        /* FIXME: It seems we're not really using this, and it broke now that
     1716           struct aim_user is dead.
    17251717        aim_bos_setprofile(sess, fr->conn, gc->user->user_info, NULL, gaim_caps);
    1726 
     1718        */
     1719       
    17271720        return 1;
    17281721}
  • protocols/yahoo/libyahoo2.c

    r3f9440d rfef6116  
    8989#define vsnprintf _vsnprintf
    9090#endif
     91
     92#include "base64.h"
    9193
    9294#ifdef USE_STRUCT_CALLBACKS
     
    695697}
    696698
    697 static char base64digits[] =    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    698                                 "abcdefghijklmnopqrstuvwxyz"
    699                                 "0123456789._";
     699/* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */
    700700static void to_y64(unsigned char *out, const unsigned char *in, int inlen)
    701 /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */
    702 {
    703         for (; inlen >= 3; inlen -= 3)
    704                 {
    705                         *out++ = base64digits[in[0] >> 2];
    706                         *out++ = base64digits[((in[0]<<4) & 0x30) | (in[1]>>4)];
    707                         *out++ = base64digits[((in[1]<<2) & 0x3c) | (in[2]>>6)];
    708                         *out++ = base64digits[in[2] & 0x3f];
    709                         in += 3;
    710                 }
    711         if (inlen > 0)
    712                 {
    713                         unsigned char fragment;
    714 
    715                         *out++ = base64digits[in[0] >> 2];
    716                         fragment = (in[0] << 4) & 0x30;
    717                         if (inlen > 1)
    718                                 fragment |= in[1] >> 4;
    719                         *out++ = base64digits[fragment];
    720                         *out++ = (inlen < 2) ? '-'
    721                                         : base64digits[(in[1] << 2) & 0x3c];
    722                         *out++ = '-';
    723                 }
    724         *out = '\0';
     701{
     702        base64_encode_real(in, inlen, out, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-");
    725703}
    726704
  • protocols/yahoo/yahoo.c

    r3f9440d rfef6116  
    121121}
    122122
    123 static void byahoo_login( struct aim_user *user )
    124 {
    125         struct gaim_connection *gc = new_gaim_conn( user );
     123static void byahoo_login( account_t *acc )
     124{
     125        struct gaim_connection *gc = new_gaim_conn( acc );
    126126        struct byahoo_data *yd = gc->proto_data = g_new0( struct byahoo_data, 1 );
    127127       
     
    130130       
    131131        set_login_progress( gc, 1, "Connecting" );
    132         yd->y2_id = yahoo_init( user->username, user->password );
     132        yd->y2_id = yahoo_init( acc->user, acc->pass );
    133133        yahoo_login( yd->y2_id, yd->current_status );
    134134}
     
    425425                yd = gc->proto_data;
    426426               
    427                 if( !strcmp(gc->prpl->name, "yahoo") && yd->y2_id == id )
     427                if( strcmp( gc->acc->prpl->name, "yahoo" ) == 0 && yd->y2_id == id )
    428428                        return( gc );
    429429        }
  • query.c

    r3f9440d rfef6116  
    6363        }
    6464       
    65         if( g_strcasecmp( set_getstr( irc, "query_order" ), "lifo" ) == 0 || irc->queries == q )
     65        if( g_strcasecmp( set_getstr( &irc->set, "query_order" ), "lifo" ) == 0 || irc->queries == q )
    6666                query_display( irc, q );
    6767       
     
    172172        query_t *q;
    173173       
    174         if( g_strcasecmp( set_getstr( irc, "query_order" ), "fifo" ) == 0 )
     174        if( g_strcasecmp( set_getstr( &irc->set, "query_order" ), "fifo" ) == 0 )
    175175                q = irc->queries;
    176176        else
  • root_commands.c

    r3f9440d rfef6116  
    127127}
    128128
     129static void cmd_account( irc_t *irc, char **cmd );
     130
    129131static void cmd_identify( irc_t *irc, char **cmd )
    130132{
    131133        storage_status_t status = storage_load( irc->nick, cmd[1], irc );
     134        char *account_on[] = { "account", "on", NULL };
    132135       
    133136        switch (status) {
     
    139142                break;
    140143        case STORAGE_OK:
    141                 irc_usermsg( irc, "Password accepted" );
     144                irc_usermsg( irc, "Password accepted, settings and accounts loaded" );
    142145                irc_umode_set( irc, "+R", 1 );
     146                if( set_getint( &irc->set, "auto_connect" ) )
     147                        cmd_account( irc, account_on );
    143148                break;
     149        case STORAGE_OTHER_ERROR:
    144150        default:
    145                 irc_usermsg( irc, "Something very weird happened" );
     151                irc_usermsg( irc, "Unknown error while loading configuration" );
    146152                break;
    147153        }
     
    226232
    227233                a = account_add( irc, prpl, cmd[3], cmd[4] );
    228                
    229234                if( cmd[5] )
    230                         a->server = g_strdup( cmd[5] );
     235                        set_setstr( &a->set, "server", cmd[5] );
    231236               
    232237                irc_usermsg( irc, "Account successfully added" );
     
    306311                       
    307312                                for( a = irc->accounts; a; a = a->next )
    308                                         if( !a->gc )
     313                                        if( !a->gc && a->auto_connect )
    309314                                                account_on( irc, a );
    310315                        }
     
    352357                }
    353358        }
     359        else if( g_strcasecmp( cmd[1], "set" ) == 0 )
     360        {
     361                char *acc_handle, *set_name = NULL, *tmp;
     362               
     363                if( !cmd[2] )
     364                {
     365                        irc_usermsg( irc, "Not enough parameters given (need %d)", 2 );
     366                        return;
     367                }
     368               
     369                acc_handle = g_strdup( cmd[2] );
     370                if( ( tmp = strchr( acc_handle, '/' ) ) )
     371                {
     372                        *tmp = 0;
     373                        set_name = tmp + 1;
     374                }
     375                a = account_get( irc, acc_handle );
     376               
     377                if( a == NULL )
     378                {
     379                        irc_usermsg( irc, "Invalid account" );
     380                        return;
     381                }
     382               
     383                if( cmd[3] )
     384                {
     385                        set_t *s = set_find( &a->set, set_name );
     386                       
     387                        if( a->gc && s && s->flags & ACC_SET_OFFLINE_ONLY )
     388                        {
     389                                irc_usermsg( irc, "This setting can only be changed when the account is off-line" );
     390                                return;
     391                        }
     392                       
     393                        set_setstr( &a->set, set_name, cmd[3] );
     394                       
     395                        if( ( strcmp( cmd[3], "=" ) ) == 0 && cmd[4] )
     396                                irc_usermsg( irc, "Warning: Correct syntax: \002account set <variable> <value>\002 (without =)" );
     397                }
     398                if( set_name ) /* else 'forgotten' on purpose.. Must show new value after changing */
     399                {
     400                        char *s = set_getstr( &a->set, set_name );
     401                        if( s )
     402                                irc_usermsg( irc, "%s = `%s'", set_name, s );
     403                        else
     404                                irc_usermsg( irc, "%s is empty", set_name );
     405                }
     406                else
     407                {
     408                        set_t *s = a->set;
     409                        while( s )
     410                        {
     411                                if( s->value || s->def )
     412                                        irc_usermsg( irc, "%s = `%s'", s->key, s->value?s->value:s->def );
     413                                else
     414                                        irc_usermsg( irc, "%s is empty", s->key );
     415                                s = s->next;
     416                        }
     417                }
     418               
     419                g_free( acc_handle );
     420        }
    354421        else
    355422        {
     
    394461                else
    395462                {
    396                         nick_set( irc, cmd[2], a->gc->prpl, cmd[3] );
     463                        nick_set( irc, cmd[2], a->gc->acc->prpl, cmd[3] );
    397464                }
    398465        }
     
    401468           add them to your *real* (server-side) contact list. */
    402469        if( add_for_real )
    403                 a->gc->prpl->add_buddy( a->gc, cmd[2] );
     470                a->gc->acc->prpl->add_buddy( a->gc, cmd[2] );
    404471               
    405472        add_buddy( a->gc, NULL, cmd[2], cmd[2] );
     
    435502        }
    436503       
    437         if( !gc->prpl->get_info )
     504        if( !gc->acc->prpl->get_info )
    438505        {
    439506                irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
     
    441508        else
    442509        {
    443                 gc->prpl->get_info( gc, cmd[2] );
     510                gc->acc->prpl->get_info( gc, cmd[2] );
    444511        }
    445512}
     
    476543                else if( u->send_handler == buddy_send_handler )
    477544                {
    478                         nick_set( irc, u->handle, u->gc->prpl, cmd[2] );
     545                        nick_set( irc, u->handle, u->gc->acc->prpl, cmd[2] );
    479546                }
    480547               
     
    495562        s = g_strdup( u->handle );
    496563       
    497         u->gc->prpl->remove_buddy( u->gc, u->handle, NULL );
     564        u->gc->acc->prpl->remove_buddy( u->gc, u->handle, NULL );
    498565        user_del( irc, cmd[1] );
    499566        nick_del( irc, cmd[1] );
     
    552619        }
    553620       
    554         if( !gc->prpl->add_deny || !gc->prpl->rem_permit )
     621        if( !gc->acc->prpl->add_deny || !gc->acc->prpl->rem_permit )
    555622        {
    556623                irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
     
    611678        }
    612679       
    613         if( !gc->prpl->rem_deny || !gc->prpl->add_permit )
     680        if( !gc->acc->prpl->rem_deny || !gc->acc->prpl->add_permit )
    614681        {
    615682                irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
     
    666733        if( cmd[1] && cmd[2] )
    667734        {
    668                 set_setstr( irc, cmd[1], cmd[2] );
     735                set_setstr( &irc->set, cmd[1], cmd[2] );
    669736               
    670737                if( ( strcmp( cmd[2], "=" ) ) == 0 && cmd[3] )
     
    673740        if( cmd[1] ) /* else 'forgotten' on purpose.. Must show new value after changing */
    674741        {
    675                 char *s = set_getstr( irc, cmd[1] );
     742                char *s = set_getstr( &irc->set, cmd[1] );
    676743                if( s )
    677744                        irc_usermsg( irc, "%s = `%s'", cmd[1], s );
     745                else
     746                        irc_usermsg( irc, "%s is empty", cmd[1] );
    678747        }
    679748        else
     
    684753                        if( s->value || s->def )
    685754                                irc_usermsg( irc, "%s = `%s'", s->key, s->value?s->value:s->def );
     755                        else
     756                                irc_usermsg( irc, "%s is empty", s->key );
    686757                        s = s->next;
    687758                }
     
    727798                if( online == 1 )
    728799                {
    729                         g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
     800                        g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->acc->prpl->name );
    730801                        irc_usermsg( irc, format, u->nick, s, "Online" );
    731802                }
     
    738809                if( away == 1 )
    739810                {
    740                         g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
     811                        g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->acc->prpl->name );
    741812                        irc_usermsg( irc, format, u->nick, s, u->away );
    742813                }
     
    748819                if( offline == 1 )
    749820                {
    750                         g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
     821                        g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->acc->prpl->name );
    751822                        irc_usermsg( irc, format, u->nick, s, "Offline" );
    752823                }
     
    773844                irc_usermsg( irc, "Your name is `%s'" , a->gc->displayname ? a->gc->displayname : "NULL" );
    774845        }
    775         else if ( !a->gc->prpl->set_info )
     846        else if ( !a->prpl->set_info )
    776847        {
    777848                irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] );
     
    781852                irc_usermsg( irc, "Setting your name to `%s'", cmd[2] );
    782853               
    783                 a->gc->prpl->set_info( a->gc, cmd[2] );
     854                a->prpl->set_info( a->gc, cmd[2] );
    784855        }
    785856}
     
    800871        for( num = 0; q; q = q->next, num ++ )
    801872                if( q->gc ) /* Not necessary yet, but it might come later */
    802                         irc_usermsg( irc, "%d, %s(%s): %s", num, q->gc->prpl->name, q->gc->username, q->question );
     873                        irc_usermsg( irc, "%d, %s(%s): %s", num, q->gc->acc->prpl->name, q->gc->username, q->question );
    803874                else
    804875                        irc_usermsg( irc, "%d, BitlBee: %s", num, q->question );
     
    828899                        user_t *u;
    829900                       
     901                        /* FIXME: Hmmm, this is actually pretty dangerous code... REMOVEME? :-) */
    830902                        for( u = irc->users; u; u = u->next )
    831903                                if( u->gc == gc )
    832904                                {
    833                                         u->gc->prpl->remove_buddy( u->gc, u->handle, NULL );
     905                                        u->gc->acc->prpl->remove_buddy( u->gc, u->handle, NULL );
    834906                                        user_del( irc, u->nick );
    835907                                }
     
    846918        for( n = gc->irc->nicks; n; n = n->next )
    847919        {
    848                 if( n->proto == gc->prpl && !user_findhandle( gc, n->handle ) )
    849                 {
    850                         gc->prpl->add_buddy( gc, n->handle );
     920                if( n->proto == gc->acc->prpl && !user_findhandle( gc, n->handle ) )
     921                {
     922                        gc->acc->prpl->add_buddy( gc, n->handle );
    851923                        add_buddy( gc, NULL, n->handle, NULL );
    852924                }
  • set.c

    r3f9440d rfef6116  
    2626#include "bitlbee.h"
    2727
    28 set_t *set_add( irc_t *irc, char *key, char *def, void *eval )
    29 {
    30         set_t *s = set_find( irc, key );
    31        
    32         if( !s )
    33         {
    34                 if( ( s = irc->set ) )
     28set_t *set_add( set_t **head, char *key, char *def, void *eval, void *data )
     29{
     30        set_t *s = set_find( head, key );
     31       
     32        /* Possibly the setting already exists. If it doesn't exist yet,
     33           we create it. If it does, we'll just change the default. */
     34        if( !s )
     35        {
     36                if( ( s = *head ) )
    3537                {
    3638                        while( s->next ) s = s->next;
    37                         s->next = g_new ( set_t, 1 );
     39                        s->next = g_new0( set_t, 1 );
    3840                        s = s->next;
    3941                }
    4042                else
    4143                {
    42                         s = irc->set = g_new( set_t, 1 );
     44                        s = *head = g_new0( set_t, 1 );
    4345                }
    44                 memset( s, 0, sizeof( set_t ) );
    4546                s->key = g_strdup( key );
    4647        }
     
    5354        if( def ) s->def = g_strdup( def );
    5455       
    55         if( s->eval )
    56         {
    57                 g_free( s->eval );
    58                 s->eval = NULL;
    59         }
    60         if( eval ) s->eval = eval;
    61        
    62         return( s );
    63 }
    64 
    65 set_t *set_find( irc_t *irc, char *key )
    66 {
    67         set_t *s = irc->set;
     56        s->eval = eval;
     57        s->data = data;
     58       
     59        return s;
     60}
     61
     62set_t *set_find( set_t **head, char *key )
     63{
     64        set_t *s = *head;
    6865       
    6966        while( s )
     
    7471        }
    7572       
    76         return( s );
    77 }
    78 
    79 char *set_getstr( irc_t *irc, char *key )
    80 {
    81         set_t *s = set_find( irc, key );
     73        return s;
     74}
     75
     76char *set_getstr( set_t **head, char *key )
     77{
     78        set_t *s = set_find( head, key );
    8279       
    8380        if( !s || ( !s->value && !s->def ) )
    84                 return( NULL );
    85        
    86         return( s->value?s->value:s->def );
    87 }
    88 
    89 int set_getint( irc_t *irc, char *key )
    90 {
    91         char *s = set_getstr( irc, key );
     81                return NULL;
     82       
     83        return s->value ? s->value : s->def;
     84}
     85
     86int set_getint( set_t **head, char *key )
     87{
     88        char *s = set_getstr( head, key );
    9289        int i = 0;
    9390       
    9491        if( !s )
    95                 return( 0 );
     92                return 0;
    9693       
    9794        if( ( g_strcasecmp( s, "true" ) == 0 ) || ( g_strcasecmp( s, "yes" ) == 0 ) || ( g_strcasecmp( s, "on" ) == 0 ) )
    98                 return( 1 );
     95                return 1;
    9996       
    10097        if( sscanf( s, "%d", &i ) != 1 )
    101                 return( 0 );
    102        
    103         return( i );
    104 }
    105 
    106 int set_setstr( irc_t *irc, char *key, char *value )
    107 {
    108         set_t *s = set_find( irc, key );
     98                return 0;
     99       
     100        return i;
     101}
     102
     103int set_getbool( set_t **head, char *key )
     104{
     105        char *s = set_getstr( head, key );
     106       
     107        if( !s )
     108                return 0;
     109       
     110        return bool2int( s );
     111}
     112
     113int set_setstr( set_t **head, char *key, char *value )
     114{
     115        set_t *s = set_find( head, key );
    109116        char *nv = value;
    110117       
    111118        if( !s )
    112                 s = set_add( irc, key, NULL, NULL );
    113        
    114         if( s->eval && !( nv = s->eval( irc, s, value ) ) )
    115                 return( 0 );
     119                s = set_add( head, key, NULL, NULL, NULL );
     120       
     121        if( s->eval && !( nv = s->eval( s, value ) ) )
     122                return 0;
    116123       
    117124        if( s->value )
     
    121128        }
    122129       
     130        /* If there's a default setting and it's equal to what we're trying to
     131           set, stick with s->value = NULL. Otherwise, remember the setting. */
    123132        if( !s->def || ( strcmp( nv, s->def ) != 0 ) )
    124133                s->value = g_strdup( nv );
     
    127136                g_free( nv );
    128137       
    129         return( 1 );
    130 }
    131 
    132 int set_setint( irc_t *irc, char *key, int value )
     138        return 1;
     139}
     140
     141int set_setint( set_t **head, char *key, int value )
    133142{
    134143        char s[24];     /* Not quite 128-bit clean eh? ;-) */
    135144       
    136         sprintf( s, "%d", value );
    137         return( set_setstr( irc, key, s ) );
    138 }
    139 
    140 void set_del( irc_t *irc, char *key )
    141 {
    142         set_t *s = irc->set, *t = NULL;
     145        g_snprintf( s, sizeof( s ), "%d", value );
     146        return set_setstr( head, key, s );
     147}
     148
     149void set_del( set_t **head, char *key )
     150{
     151        set_t *s = *head, *t = NULL;
    143152       
    144153        while( s )
     
    153162                        t->next = s->next;
    154163                else
    155                         irc->set = s->next;
     164                        *head = s->next;
    156165               
    157166                g_free( s->key );
     
    162171}
    163172
    164 char *set_eval_int( irc_t *irc, set_t *set, char *value )
    165 {
    166         char *s = value;
    167        
    168         for( ; *s; s ++ )
    169                 if( *s < '0' || *s > '9' )
    170                         return( NULL );
    171        
    172         return( value );
    173 }
    174 
    175 char *set_eval_bool( irc_t *irc, set_t *set, char *value )
    176 {
    177         if( ( g_strcasecmp( value, "true" ) == 0 ) || ( g_strcasecmp( value, "yes" ) == 0 ) || ( g_strcasecmp( value, "on" ) == 0 ) )
    178                 return( value );
    179         if( ( g_strcasecmp( value, "false" ) == 0 ) || ( g_strcasecmp( value, "no" ) == 0 ) || ( g_strcasecmp( value, "off" ) == 0 ) )
    180                 return( value );
    181         return( set_eval_int( irc, set, value ) );
    182 }
    183 
    184 char *set_eval_to_char( irc_t *irc, set_t *set, char *value )
     173char *set_eval_int( set_t *set, char *value )
     174{
     175        char *s;
     176       
     177        for( s = value; *s; s ++ )
     178                if( !isdigit( *s ) )
     179                        return NULL;
     180       
     181        return value;
     182}
     183
     184char *set_eval_bool( set_t *set, char *value )
     185{
     186        return is_bool( value ) ? value : NULL;
     187}
     188
     189char *set_eval_to_char( set_t *set, char *value )
    185190{
    186191        char *s = g_new( char, 3 );
     
    191196                sprintf( s, "%c ", *value );
    192197       
    193         return( s );
    194 }
    195 
    196 char *set_eval_ops( irc_t *irc, set_t *set, char *value )
    197 {
     198        return s;
     199}
     200
     201char *set_eval_ops( set_t *set, char *value )
     202{
     203        irc_t *irc = set->data;
     204       
    198205        if( g_strcasecmp( value, "user" ) == 0 )
    199         {
    200206                irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    201207                                                              irc->channel, "+o-o", irc->nick, irc->mynick );
    202                 return( value );
    203         }
    204208        else if( g_strcasecmp( value, "root" ) == 0 )
    205         {
    206209                irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    207210                                                              irc->channel, "-o+o", irc->nick, irc->mynick );
    208                 return( value );
    209         }
    210211        else if( g_strcasecmp( value, "both" ) == 0 )
    211         {
    212212                irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    213213                                                              irc->channel, "+oo", irc->nick, irc->mynick );
    214                 return( value );
    215         }
    216214        else if( g_strcasecmp( value, "none" ) == 0 )
    217         {
    218215                irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    219216                                                              irc->channel, "-oo", irc->nick, irc->mynick );
    220                 return( value );
    221         }
    222        
    223         return( NULL );
    224 }
    225 
     217        else
     218                return NULL;
     219       
     220        return value;
     221}
     222
     223char *set_eval_charset( set_t *set, char *value )
     224{
     225        GIConv cd;
     226
     227        if ( g_strncasecmp( value, "none", 4 ) == 0 )
     228                return value;
     229
     230        cd = g_iconv_open( "UTF-8", value );
     231        if( cd == (GIConv) -1 )
     232                return NULL;
     233
     234        g_iconv_close( cd );
     235        return value;
     236}
  • set.h

    r3f9440d rfef6116  
    22  * BitlBee -- An IRC to other IM-networks gateway                     *
    33  *                                                                    *
    4   * Copyright 2002-2004 Wilmer van der Gaast and others                *
     4  * Copyright 2002-2006 Wilmer van der Gaast and others                *
    55  \********************************************************************/
    66
     
    2626typedef struct set
    2727{
     28        void *data;
     29       
    2830        char *key;
    2931        char *value;
    3032        char *def;      /* Default */
    3133       
    32         /* Eval: Returns NULL if the value is incorrect. Can return a
    33            corrected value. set_setstr() should be able to free() the
    34            returned string! */
    35         char *(*eval) ( irc_t *irc, struct set *set, char *value );
     34        int flags;
     35       
     36        /* Eval: Returns NULL if the value is incorrect or exactly the
     37           passed value variable. When returning a corrected value,
     38           set_setstr() should be able to free() the returned string! */
     39        char *(*eval) ( struct set *set, char *value );
    3640        struct set *next;
    3741} set_t;
    3842
    39 set_t *set_add( irc_t *irc, char *key, char *def, void *eval );
    40 G_MODULE_EXPORT set_t *set_find( irc_t *irc, char *key );
    41 G_MODULE_EXPORT char *set_getstr( irc_t *irc, char *key );
    42 G_MODULE_EXPORT int set_getint( irc_t *irc, char *key );
    43 int set_setstr( irc_t *irc, char *key, char *value );
    44 int set_setint( irc_t *irc, char *key, int value );
    45 void set_del( irc_t *irc, char *key );
     43set_t *set_add( set_t **head, char *key, char *def, void *eval, void *data );
     44set_t *set_find( set_t **head, char *key );
     45G_MODULE_EXPORT char *set_getstr( set_t **head, char *key );
     46G_MODULE_EXPORT int set_getint( set_t **head, char *key );
     47G_MODULE_EXPORT int set_getbool( set_t **head, char *key );
     48int set_setstr( set_t **head, char *key, char *value );
     49int set_setint( set_t **head, char *key, int value );
     50void set_del( set_t **head, char *key );
    4651
    47 char *set_eval_int( irc_t *irc, set_t *set, char *value );
    48 char *set_eval_bool( irc_t *irc, set_t *set, char *value );
    49 char *set_eval_to_char( irc_t *irc, set_t *set, char *value );
    50 char *set_eval_ops( irc_t *irc, set_t *set, char *value );
     52char *set_eval_int( set_t *set, char *value );
     53char *set_eval_bool( set_t *set, char *value );
    5154
    52 
     55char *set_eval_to_char( set_t *set, char *value );
     56char *set_eval_ops( set_t *set, char *value );
     57char *set_eval_charset( set_t *set, char *value );
  • storage.c

    r3f9440d rfef6116  
    66
    77/* Support for multiple storage backends */
     8
     9/* Copyright (C) 2005 Jelmer Vernooij <jelmer@samba.org> */
    810
    911/*
     
    2931
    3032extern storage_t storage_text;
     33extern storage_t storage_xml;
    3134
    32 static GList text_entry = { &storage_text, NULL, NULL };
    33 static GList *storage_backends = &text_entry;
     35static GList *storage_backends = NULL;
    3436
    3537void register_storage_backend(storage_t *backend)
     
    4143{
    4244        GList *gl;
    43         storage_t *st;
     45        storage_t *st = NULL;
    4446
    4547        for (gl = storage_backends; gl; gl = gl->next) {
     
    6365        int i;
    6466        storage_t *storage;
    65 
     67       
     68        register_storage_backend(&storage_text);
     69        register_storage_backend(&storage_xml);
     70       
    6671        storage = storage_init_single(primary);
    6772        if (storage == NULL)
  • storage.h

    r3f9440d rfef6116  
    3333        STORAGE_ALREADY_EXISTS,
    3434        STORAGE_OTHER_ERROR /* Error that isn't caused by user input, such as
    35                                                    a database that is unreachable. log() will be
    36                                                    used for the exact error message */
     35                               a database that is unreachable. log() will be
     36                               used for the exact error message */
    3737} storage_status_t;
    3838
  • storage_text.c

    r3f9440d rfef6116  
    116116        }
    117117        fclose( fp );
    118        
    119         if( set_getint( irc, "auto_connect" ) )
    120         {
    121                 strcpy( s, "account on" );      /* Can't do this directly because r_c_s alters the string */
    122                 root_command_string( irc, ru, s, 0 );
    123         }
    124118       
    125119        return STORAGE_OK;
  • unix.c

    r3f9440d rfef6116  
    4848       
    4949        b_main_init();
    50        
    5150        log_init();
    52 
    5351        nogaim_init();
    54 
     52       
     53        srand( time( NULL ) ^ getpid() );
     54       
    5555        CONF_FILE = g_strdup( CONF_FILE_DEF );
    56        
    5756        global.helpfile = g_strdup( HELP_FILE );
    58 
     57       
    5958        global.conf = conf_load( argc, argv );
    6059        if( global.conf == NULL )
    6160                return( 1 );
    62 
    63 
     61       
    6462        if( global.conf->runmode == RUNMODE_INETD )
    6563        {
     
    8987        if( i != 0 )
    9088                return( i );
    91 
     89       
    9290        global.storage = storage_init( global.conf->primary_storage, global.conf->migrate_storage );
    9391        if ( global.storage == NULL) {
  • user.c

    r3f9440d rfef6116  
    6767       
    6868        u->user = u->realname = u->host = u->nick = g_strdup( nick );
    69         u->is_private = set_getint( irc, "private" );
     69        u->is_private = set_getint( &irc->set, "private" );
    7070       
    7171        key = g_strdup( nick );
     
    147147        while( u )
    148148        {
    149                 if( u->gc == gc && u->handle && gc->prpl->cmp_buddynames ( u->handle, handle ) == 0 )
     149                if( u->gc == gc && u->handle && gc->acc->prpl->cmp_buddynames ( u->handle, handle ) == 0 )
    150150                        break;
    151151                u = u->next;
Note: See TracChangeset for help on using the changeset viewer.