Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • irc.c

    r3f9440d rbbb6ffb  
    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( set_t *set, char *value )
     36{
     37        irc_t *irc = set->data;
     38       
     39        irc_setpass( irc, value );
     40        irc_usermsg( irc, "Password successfully changed" );
     41        return NULL;
    3942}
    4043
     
    4649        char buf[128];
    4750#ifdef IPV6
    48         struct sockaddr_in6 sock[1];
    49 #else
     51        struct sockaddr_in6 sock6[1];
     52        unsigned int i6;
     53#endif
    5054        struct sockaddr_in sock[1];
    51 #endif
    5255       
    5356        irc = g_new0( irc_t, 1 );
     
    6972       
    7073        i = sizeof( *sock );
     74#ifdef IPV6
     75        i6 = sizeof( *sock6 );
     76#endif
    7177       
    7278        if( global.conf->hostname )
    7379                irc->myhost = g_strdup( global.conf->hostname );
    7480#ifdef IPV6
    75         else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx )
    76         {
    77                 if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) )
     81        else if( getsockname( irc->fd, (struct sockaddr*) sock6, &i6 ) == 0 && sock6->sin6_family == AF_INET6 )
     82        {
     83                if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) )
    7884                        irc->myhost = g_strdup( peer->h_name );
    79                 else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
     85                else if( inet_ntop( AF_INET6, &sock6->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
    8086                        irc->myhost = g_strdup( ipv6_unwrap( buf ) );
    8187        }
    82 #else
    83         else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx )
    84         {
    85                 if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) )
     88#endif
     89        else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET )
     90        {
     91                if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) )
    8692                        irc->myhost = g_strdup( peer->h_name );
    87                 else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
     93                else if( inet_ntop( AF_INET, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
    8894                        irc->myhost = g_strdup( buf );
    8995        }
    90 #endif
    9196       
    9297        i = sizeof( *sock );
    9398#ifdef IPV6
    94         if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx )
    95         {
    96                 if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) )
     99        i6 = sizeof( *sock6 );
     100        if( getpeername( irc->fd, (struct sockaddr*) sock6, &i6 ) == 0 && sock6->sin6_family == AF_INET6 )
     101        {
     102                if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) )
    97103                        irc->host = g_strdup( peer->h_name );
    98                 else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
     104                else if( inet_ntop( AF_INET6, &sock6->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
    99105                        irc->host = g_strdup( ipv6_unwrap( buf ) );
    100106        }
    101 #else
    102         if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx )
    103         {
    104                 if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) )
     107        else
     108#endif
     109        if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET )
     110        {
     111                if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) )
    105112                        irc->host = g_strdup( peer->h_name );
    106                 else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
     113                else if( inet_ntop( AF_INET, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
    107114                        irc->host = g_strdup( buf );
    108115        }
    109 #endif
    110116       
    111117        /* Rare, but possible. */
     
    120126        irc_connection_list = g_slist_append( irc_connection_list, irc );
    121127       
    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);
     128        set_add( &irc->set, "away_devoice", "true",  set_eval_away_devoice, irc );
     129        set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc );
     130        set_add( &irc->set, "auto_reconnect", "false", set_eval_bool, irc );
     131        set_add( &irc->set, "auto_reconnect_delay", "300", set_eval_int, irc );
     132        set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc );
     133        set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc );
     134        set_add( &irc->set, "charset", "iso8859-1", set_eval_charset, irc );
     135        set_add( &irc->set, "debug", "false", set_eval_bool, irc );
     136        set_add( &irc->set, "default_target", "root", NULL, irc );
     137        set_add( &irc->set, "display_namechanges", "false", set_eval_bool, irc );
     138        set_add( &irc->set, "handle_unknown", "root", NULL, irc );
     139        set_add( &irc->set, "lcnicks", "true", set_eval_bool, irc );
     140        set_add( &irc->set, "ops", "both", set_eval_ops, irc );
     141        set_add( &irc->set, "password", NULL, passchange, irc );
     142        set_add( &irc->set, "private", "true", set_eval_bool, irc );
     143        set_add( &irc->set, "query_order", "lifo", NULL, irc );
     144        set_add( &irc->set, "save_on_quit", "true", set_eval_bool, irc );
     145        set_add( &irc->set, "strip_html", "true", NULL, irc );
     146        set_add( &irc->set, "to_char", ": ", set_eval_to_char, irc );
     147        set_add( &irc->set, "typing_notice", "false", set_eval_bool, irc );
    142148       
    143149        conf_loaddefaults( irc );
     
    203209void irc_free(irc_t * irc)
    204210{
    205         account_t *account, *accounttmp;
     211        account_t *account;
    206212        user_t *user, *usertmp;
    207         nick_t *nick, *nicktmp;
    208213        help_t *helpnode, *helpnodetmp;
    209         set_t *setnode, *setnodetmp;
    210214       
    211215        log_message( LOGLVL_INFO, "Destroying connection with fd %d", irc->fd );
    212216       
    213         if( irc->status & USTATUS_IDENTIFIED && set_getint( irc, "save_on_quit" ) )
     217        if( irc->status & USTATUS_IDENTIFIED && set_getbool( &irc->set, "save_on_quit" ) )
    214218                if( storage_save( irc, TRUE ) != STORAGE_OK )
    215219                        irc_usermsg( irc, "Error while saving settings!" );
     
    251255                query_del(irc, irc->queries);
    252256       
    253         if (irc->accounts != NULL) {
    254                 account = irc->accounts;
    255                 while (account != NULL) {
    256                         g_free(account->user);
    257                         g_free(account->pass);
    258                         g_free(account->server);
    259                         accounttmp = account;
    260                         account = account->next;
    261                         g_free(accounttmp);
    262                 }
    263         }
     257        while (irc->accounts)
     258                account_del(irc, irc->accounts);
     259       
     260        while (irc->set)
     261                set_del(&irc->set, irc->set->key);
    264262       
    265263        if (irc->users != NULL) {
     
    286284        g_hash_table_destroy(irc->watches);
    287285       
    288         if (irc->nicks != NULL) {
    289                 nick = irc->nicks;
    290                 while (nick != NULL) {
    291                         g_free(nick->nick);
    292                         g_free(nick->handle);
    293                                        
    294                         nicktmp = nick;
    295                         nick = nick->next;
    296                         g_free(nicktmp);
    297                 }
    298         }
    299286        if (irc->help != NULL) {
    300287                helpnode = irc->help;
     
    307294                }
    308295        }
    309         if (irc->set != NULL) {
    310                 setnode = irc->set;
    311                 while (setnode != NULL) {
    312                         g_free(setnode->key);
    313                         g_free(setnode->def);
    314                         g_free(setnode->value);
    315                        
    316                         setnodetmp = setnode;
    317                         setnode = setnode->next;
    318                         g_free(setnodetmp);
    319                 }
    320         }
    321296        g_free(irc);
    322297       
     
    329304void irc_setpass (irc_t *irc, const char *pass)
    330305{
    331         if (irc->password) g_free (irc->password);
     306        g_free (irc->password);
    332307       
    333308        if (pass) {
    334309                irc->password = g_strdup (pass);
    335                 irc_usermsg (irc, "Password successfully changed");
    336310        } else {
    337311                irc->password = NULL;
     
    364338                        }
    365339                       
    366                         if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
     340                        if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
    367341                        {
    368342                                conv[IRC_MAX_LINE] = 0;
     
    584558       
    585559        strip_newlines( line );
    586         if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
     560        if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
    587561        {
    588562                char conv[IRC_MAX_LINE+1];
     
    611585                   the queue. If it's FALSE, we emptied the buffer and saved ourselves some work
    612586                   in the event queue. */
    613                 if( bitlbee_io_current_client_write( irc, irc->fd, GAIM_INPUT_WRITE ) )
    614                         irc->w_watch_source_id = b_input_add( irc->fd, GAIM_INPUT_WRITE, bitlbee_io_current_client_write, irc );
     587                /* Really can't be done as long as the code doesn't do error checking very well:
     588                if( bitlbee_io_current_client_write( irc, irc->fd, GAIM_INPUT_WRITE ) ) */
     589               
     590                /* So just always do it via the event handler. */
     591                irc->w_watch_source_id = b_input_add( irc->fd, GAIM_INPUT_WRITE, bitlbee_io_current_client_write, irc );
    615592        }
    616593       
     
    652629        char namelist[385] = "";
    653630        struct conversation *c = NULL;
     631        char *ops = set_getstr( &irc->set, "ops" );
    654632       
    655633        /* RFCs say there is no error reply allowed on NAMES, so when the
     
    666644                        }
    667645                       
    668                         if( u->gc && !u->away && set_getint( irc, "away_devoice" ) )
     646                        if( u->gc && !u->away && set_getbool( &irc->set, "away_devoice" ) )
    669647                                strcat( namelist, "+" );
     648                        else if( ( strcmp( u->nick, irc->mynick ) == 0 && ( strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) == 0 ) ) ||
     649                                 ( strcmp( u->nick, irc->nick ) == 0 && ( strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) == 0 ) ) )
     650                                strcat( namelist, "@" );
    670651                       
    671652                        strcat( namelist, u->nick );
     
    676657        {
    677658                GList *l;
    678                 char *ops = set_getstr( irc, "ops" );
    679659               
    680660                /* root and the user aren't in the channel userlist but should
     
    924904{
    925905        char *nick, *s;
    926         char reason[64];
     906        char reason[128];
    927907       
    928908        if( u->gc && u->gc->flags & OPT_LOGGING_OUT )
    929909        {
    930                 if( u->gc->user->proto_opt[0][0] )
     910                if( u->gc->acc->server )
    931911                        g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost,
    932                                     u->gc->user->proto_opt[0] );
     912                                    u->gc->acc->server );
    933913                else if( ( s = strchr( u->gc->username, '@' ) ) )
    934914                        g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost,
     
    936916                else
    937917                        g_snprintf( reason, sizeof( reason ), "%s %s.%s", irc->myhost,
    938                                     u->gc->prpl->name, irc->myhost );
     918                                    u->gc->acc->prpl->name, irc->myhost );
    939919               
    940920                /* proto_opt might contain garbage after the : */
     
    1012992                else if( g_strncasecmp( s + 1, "TYPING", 6 ) == 0 )
    1013993                {
    1014                         if( u && u->gc && u->gc->prpl->send_typing && strlen( s ) >= 10 )
     994                        if( u && u->gc && u->gc->acc->prpl->send_typing && strlen( s ) >= 10 )
    1015995                        {
    1016996                                time_t current_typing_notice = time( NULL );
     
    1018998                                if( current_typing_notice - u->last_typing_notice >= 5 )
    1019999                                {
    1020                                         u->gc->prpl->send_typing( u->gc, u->handle, s[8] == '1' );
     1000                                        u->gc->acc->prpl->send_typing( u->gc, u->handle, s[8] == '1' );
    10211001                                        u->last_typing_notice = current_typing_notice;
    10221002                                }
     
    10511031                }
    10521032        }
    1053         else if( c && c->gc && c->gc->prpl )
     1033        else if( c && c->gc && c->gc->acc && c->gc->acc->prpl )
    10541034        {
    10551035                return( bim_chat_msg( c->gc, c->id, s ) );
     
    10831063        if( !u || !u->gc ) return;
    10841064       
    1085         if( set_getint( irc, "buddy_sendbuffer" ) && set_getint( irc, "buddy_sendbuffer_delay" ) > 0 )
     1065        if( set_getbool( &irc->set, "buddy_sendbuffer" ) && set_getint( &irc->set, "buddy_sendbuffer_delay" ) > 0 )
    10861066        {
    10871067                int delay;
     
    11101090                strcat( u->sendbuf, "\n" );
    11111091               
    1112                 delay = set_getint( irc, "buddy_sendbuffer_delay" );
     1092                delay = set_getint( &irc->set, "buddy_sendbuffer_delay" );
    11131093                if( delay <= 5 )
    11141094                        delay *= 1000;
     
    11751155                int len = strlen( irc->nick) + 3;
    11761156                prefix = g_new (char, len );
    1177                 g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( irc, "to_char" ) );
     1157                g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( &irc->set, "to_char" ) );
    11781158                prefix[len-1] = 0;
    11791159        }
Note: See TracChangeset for help on using the changeset viewer.