Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • irc.c

    rbbb6ffb r3f9440d  
    3333GSList *irc_connection_list = NULL;
    3434
    35 static 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;
     35static char *passchange (irc_t *irc, void *set, char *value)
     36{
     37        irc_setpass (irc, value);
     38        return (NULL);
    4239}
    4340
     
    4946        char buf[128];
    5047#ifdef IPV6
    51         struct sockaddr_in6 sock6[1];
    52         unsigned int i6;
     48        struct sockaddr_in6 sock[1];
     49#else
     50        struct sockaddr_in sock[1];
    5351#endif
    54         struct sockaddr_in sock[1];
    5552       
    5653        irc = g_new0( irc_t, 1 );
     
    7269       
    7370        i = sizeof( *sock );
    74 #ifdef IPV6
    75         i6 = sizeof( *sock6 );
    76 #endif
    7771       
    7872        if( global.conf->hostname )
    7973                irc->myhost = g_strdup( global.conf->hostname );
    8074#ifdef IPV6
    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 ) ) )
     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 ) ) )
    8478                        irc->myhost = g_strdup( peer->h_name );
    85                 else if( inet_ntop( AF_INET6, &sock6->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
     79                else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
    8680                        irc->myhost = g_strdup( ipv6_unwrap( buf ) );
    8781        }
     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 ) ) )
     86                        irc->myhost = g_strdup( peer->h_name );
     87                else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
     88                        irc->myhost = g_strdup( buf );
     89        }
    8890#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 ) ) )
    92                         irc->myhost = g_strdup( peer->h_name );
    93                 else if( inet_ntop( AF_INET, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
    94                         irc->myhost = g_strdup( buf );
    95         }
    9691       
    9792        i = sizeof( *sock );
    9893#ifdef IPV6
    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 ) ) )
     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 ) ) )
    10397                        irc->host = g_strdup( peer->h_name );
    104                 else if( inet_ntop( AF_INET6, &sock6->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
     98                else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
    10599                        irc->host = g_strdup( ipv6_unwrap( buf ) );
    106100        }
    107         else
     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 ) ) )
     105                        irc->host = g_strdup( peer->h_name );
     106                else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
     107                        irc->host = g_strdup( buf );
     108        }
    108109#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 ) ) )
    112                         irc->host = g_strdup( peer->h_name );
    113                 else if( inet_ntop( AF_INET, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
    114                         irc->host = g_strdup( buf );
    115         }
    116110       
    117111        /* Rare, but possible. */
     
    126120        irc_connection_list = g_slist_append( irc_connection_list, irc );
    127121       
    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 );
     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);
    148142       
    149143        conf_loaddefaults( irc );
     
    209203void irc_free(irc_t * irc)
    210204{
    211         account_t *account;
     205        account_t *account, *accounttmp;
    212206        user_t *user, *usertmp;
     207        nick_t *nick, *nicktmp;
    213208        help_t *helpnode, *helpnodetmp;
     209        set_t *setnode, *setnodetmp;
    214210       
    215211        log_message( LOGLVL_INFO, "Destroying connection with fd %d", irc->fd );
    216212       
    217         if( irc->status & USTATUS_IDENTIFIED && set_getbool( &irc->set, "save_on_quit" ) )
     213        if( irc->status & USTATUS_IDENTIFIED && set_getint( irc, "save_on_quit" ) )
    218214                if( storage_save( irc, TRUE ) != STORAGE_OK )
    219215                        irc_usermsg( irc, "Error while saving settings!" );
     
    255251                query_del(irc, irc->queries);
    256252       
    257         while (irc->accounts)
    258                 account_del(irc, irc->accounts);
    259        
    260         while (irc->set)
    261                 set_del(&irc->set, irc->set->key);
     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        }
    262264       
    263265        if (irc->users != NULL) {
     
    284286        g_hash_table_destroy(irc->watches);
    285287       
     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        }
    286299        if (irc->help != NULL) {
    287300                helpnode = irc->help;
     
    294307                }
    295308        }
     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        }
    296321        g_free(irc);
    297322       
     
    304329void irc_setpass (irc_t *irc, const char *pass)
    305330{
    306         g_free (irc->password);
     331        if (irc->password) g_free (irc->password);
    307332       
    308333        if (pass) {
    309334                irc->password = g_strdup (pass);
     335                irc_usermsg (irc, "Password successfully changed");
    310336        } else {
    311337                irc->password = NULL;
     
    338364                        }
    339365                       
    340                         if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
     366                        if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
    341367                        {
    342368                                conv[IRC_MAX_LINE] = 0;
     
    558584       
    559585        strip_newlines( line );
    560         if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
     586        if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
    561587        {
    562588                char conv[IRC_MAX_LINE+1];
     
    585611                   the queue. If it's FALSE, we emptied the buffer and saved ourselves some work
    586612                   in the event queue. */
    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 );
     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 );
    592615        }
    593616       
     
    629652        char namelist[385] = "";
    630653        struct conversation *c = NULL;
    631         char *ops = set_getstr( &irc->set, "ops" );
    632654       
    633655        /* RFCs say there is no error reply allowed on NAMES, so when the
     
    644666                        }
    645667                       
    646                         if( u->gc && !u->away && set_getbool( &irc->set, "away_devoice" ) )
     668                        if( u->gc && !u->away && set_getint( irc, "away_devoice" ) )
    647669                                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, "@" );
    651670                       
    652671                        strcat( namelist, u->nick );
     
    657676        {
    658677                GList *l;
     678                char *ops = set_getstr( irc, "ops" );
    659679               
    660680                /* root and the user aren't in the channel userlist but should
     
    904924{
    905925        char *nick, *s;
    906         char reason[128];
     926        char reason[64];
    907927       
    908928        if( u->gc && u->gc->flags & OPT_LOGGING_OUT )
    909929        {
    910                 if( u->gc->acc->server )
     930                if( u->gc->user->proto_opt[0][0] )
    911931                        g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost,
    912                                     u->gc->acc->server );
     932                                    u->gc->user->proto_opt[0] );
    913933                else if( ( s = strchr( u->gc->username, '@' ) ) )
    914934                        g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost,
     
    916936                else
    917937                        g_snprintf( reason, sizeof( reason ), "%s %s.%s", irc->myhost,
    918                                     u->gc->acc->prpl->name, irc->myhost );
     938                                    u->gc->prpl->name, irc->myhost );
    919939               
    920940                /* proto_opt might contain garbage after the : */
     
    9921012                else if( g_strncasecmp( s + 1, "TYPING", 6 ) == 0 )
    9931013                {
    994                         if( u && u->gc && u->gc->acc->prpl->send_typing && strlen( s ) >= 10 )
     1014                        if( u && u->gc && u->gc->prpl->send_typing && strlen( s ) >= 10 )
    9951015                        {
    9961016                                time_t current_typing_notice = time( NULL );
     
    9981018                                if( current_typing_notice - u->last_typing_notice >= 5 )
    9991019                                {
    1000                                         u->gc->acc->prpl->send_typing( u->gc, u->handle, s[8] == '1' );
     1020                                        u->gc->prpl->send_typing( u->gc, u->handle, s[8] == '1' );
    10011021                                        u->last_typing_notice = current_typing_notice;
    10021022                                }
     
    10311051                }
    10321052        }
    1033         else if( c && c->gc && c->gc->acc && c->gc->acc->prpl )
     1053        else if( c && c->gc && c->gc->prpl )
    10341054        {
    10351055                return( bim_chat_msg( c->gc, c->id, s ) );
     
    10631083        if( !u || !u->gc ) return;
    10641084       
    1065         if( set_getbool( &irc->set, "buddy_sendbuffer" ) && set_getint( &irc->set, "buddy_sendbuffer_delay" ) > 0 )
     1085        if( set_getint( irc, "buddy_sendbuffer" ) && set_getint( irc, "buddy_sendbuffer_delay" ) > 0 )
    10661086        {
    10671087                int delay;
     
    10901110                strcat( u->sendbuf, "\n" );
    10911111               
    1092                 delay = set_getint( &irc->set, "buddy_sendbuffer_delay" );
     1112                delay = set_getint( irc, "buddy_sendbuffer_delay" );
    10931113                if( delay <= 5 )
    10941114                        delay *= 1000;
     
    11551175                int len = strlen( irc->nick) + 3;
    11561176                prefix = g_new (char, len );
    1157                 g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( &irc->set, "to_char" ) );
     1177                g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( irc, "to_char" ) );
    11581178                prefix[len-1] = 0;
    11591179        }
Note: See TracChangeset for help on using the changeset viewer.