Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • irc.c

    r5b52a48 rb0a33a5  
    3333GSList *irc_connection_list = NULL;
    3434
    35 static 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;
     35static char *passchange (irc_t *irc, void *set, char *value)
     36{
     37        irc_setpass (irc, value);
     38        return (NULL);
    4039}
    4140
     
    4746        char buf[128];
    4847#ifdef IPV6
    49         struct sockaddr_in6 sock[1];
    50 #else
     48        struct sockaddr_in6 sock6[1];
     49        unsigned int i6;
     50#endif
    5151        struct sockaddr_in sock[1];
    52 #endif
    5352       
    5453        irc = g_new0( irc_t, 1 );
     
    7069       
    7170        i = sizeof( *sock );
     71#ifdef IPV6
     72        i6 = sizeof( *sock6 );
     73#endif
    7274       
    7375        if( global.conf->hostname )
    7476                irc->myhost = g_strdup( global.conf->hostname );
    7577#ifdef IPV6
    76         else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx )
    77         {
    78                 if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) )
     78        else if( getsockname( irc->fd, (struct sockaddr*) sock6, &i6 ) == 0 && sock6->sin6_family == AF_INET6 )
     79        {
     80                if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) )
    7981                        irc->myhost = g_strdup( peer->h_name );
    80                 else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
     82                else if( inet_ntop( AF_INET6, &sock6->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
    8183                        irc->myhost = g_strdup( ipv6_unwrap( buf ) );
    8284        }
    83 #else
    84         else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx )
    85         {
    86                 if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) )
     85#endif
     86        else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET )
     87        {
     88                if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) )
    8789                        irc->myhost = g_strdup( peer->h_name );
    88                 else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
     90                else if( inet_ntop( AF_INET, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
    8991                        irc->myhost = g_strdup( buf );
    9092        }
    91 #endif
    9293       
    9394        i = sizeof( *sock );
    9495#ifdef IPV6
    95         if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx )
    96         {
    97                 if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) )
     96        i6 = sizeof( *sock6 );
     97        if( getpeername( irc->fd, (struct sockaddr*) sock6, &i6 ) == 0 && sock6->sin6_family == AF_INET6 )
     98        {
     99                if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) )
    98100                        irc->host = g_strdup( peer->h_name );
    99                 else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
     101                else if( inet_ntop( AF_INET6, &sock6->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL )
    100102                        irc->host = g_strdup( ipv6_unwrap( buf ) );
    101103        }
    102 #else
    103         if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx )
    104         {
    105                 if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) )
     104        else
     105#endif
     106        if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET )
     107        {
     108                if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) )
    106109                        irc->host = g_strdup( peer->h_name );
    107                 else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
     110                else if( inet_ntop( AF_INET, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL )
    108111                        irc->host = g_strdup( buf );
    109112        }
    110 #endif
    111113       
    112114        /* Rare, but possible. */
     
    121123        irc_connection_list = g_slist_append( irc_connection_list, irc );
    122124       
    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 );
     125        set_add( irc, "away_devoice", "true",  set_eval_away_devoice );
     126        set_add( irc, "auto_connect", "true", set_eval_bool );
     127        set_add( irc, "auto_reconnect", "false", set_eval_bool );
     128        set_add( irc, "auto_reconnect_delay", "300", set_eval_int );
     129        set_add( irc, "buddy_sendbuffer", "false", set_eval_bool );
     130        set_add( irc, "buddy_sendbuffer_delay", "200", set_eval_int );
     131        set_add( irc, "charset", "iso8859-1", set_eval_charset );
     132        set_add( irc, "debug", "false", set_eval_bool );
     133        set_add( irc, "default_target", "root", NULL );
     134        set_add( irc, "display_namechanges", "false", set_eval_bool );
     135        set_add( irc, "handle_unknown", "root", NULL );
     136        set_add( irc, "lcnicks", "true", set_eval_bool );
     137        set_add( irc, "ops", "both", set_eval_ops );
     138        set_add( irc, "private", "true", set_eval_bool );
     139        set_add( irc, "query_order", "lifo", NULL );
     140        set_add( irc, "save_on_quit", "true", set_eval_bool );
     141        set_add( irc, "strip_html", "true", NULL );
     142        set_add( irc, "to_char", ": ", set_eval_to_char );
     143        set_add( irc, "typing_notice", "false", set_eval_bool );
     144        set_add( irc, "password", NULL, passchange);
    143145       
    144146        conf_loaddefaults( irc );
     
    204206void irc_free(irc_t * irc)
    205207{
    206         account_t *account;
     208        account_t *account, *accounttmp;
    207209        user_t *user, *usertmp;
     210        nick_t *nick, *nicktmp;
    208211        help_t *helpnode, *helpnodetmp;
     212        set_t *setnode, *setnodetmp;
    209213       
    210214        log_message( LOGLVL_INFO, "Destroying connection with fd %d", irc->fd );
    211215       
    212         if( irc->status & USTATUS_IDENTIFIED && set_getint( &irc->set, "save_on_quit" ) )
     216        if( irc->status & USTATUS_IDENTIFIED && set_getint( irc, "save_on_quit" ) )
    213217                if( storage_save( irc, TRUE ) != STORAGE_OK )
    214218                        irc_usermsg( irc, "Error while saving settings!" );
     
    250254                query_del(irc, irc->queries);
    251255       
    252         while (irc->accounts)
    253                 account_del(irc, irc->accounts);
    254        
    255         while (irc->set)
    256                 set_del(&irc->set, irc->set->key);
     256        if (irc->accounts != NULL) {
     257                account = irc->accounts;
     258                while (account != NULL) {
     259                        g_free(account->user);
     260                        g_free(account->pass);
     261                        g_free(account->server);
     262                        accounttmp = account;
     263                        account = account->next;
     264                        g_free(accounttmp);
     265                }
     266        }
    257267       
    258268        if (irc->users != NULL) {
     
    279289        g_hash_table_destroy(irc->watches);
    280290       
     291        if (irc->nicks != NULL) {
     292                nick = irc->nicks;
     293                while (nick != NULL) {
     294                        g_free(nick->nick);
     295                        g_free(nick->handle);
     296                                       
     297                        nicktmp = nick;
     298                        nick = nick->next;
     299                        g_free(nicktmp);
     300                }
     301        }
    281302        if (irc->help != NULL) {
    282303                helpnode = irc->help;
     
    289310                }
    290311        }
     312        if (irc->set != NULL) {
     313                setnode = irc->set;
     314                while (setnode != NULL) {
     315                        g_free(setnode->key);
     316                        g_free(setnode->def);
     317                        g_free(setnode->value);
     318                       
     319                        setnodetmp = setnode;
     320                        setnode = setnode->next;
     321                        g_free(setnodetmp);
     322                }
     323        }
    291324        g_free(irc);
    292325       
     
    299332void irc_setpass (irc_t *irc, const char *pass)
    300333{
    301         g_free (irc->password);
     334        if (irc->password) g_free (irc->password);
    302335       
    303336        if (pass) {
    304337                irc->password = g_strdup (pass);
     338                irc_usermsg (irc, "Password successfully changed");
    305339        } else {
    306340                irc->password = NULL;
     
    333367                        }
    334368                       
    335                         if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
     369                        if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
    336370                        {
    337371                                conv[IRC_MAX_LINE] = 0;
     
    553587       
    554588        strip_newlines( line );
    555         if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
     589        if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
    556590        {
    557591                char conv[IRC_MAX_LINE+1];
     
    621655        char namelist[385] = "";
    622656        struct conversation *c = NULL;
     657        char *ops = set_getstr( irc, "ops" );
    623658       
    624659        /* RFCs say there is no error reply allowed on NAMES, so when the
     
    635670                        }
    636671                       
    637                         if( u->gc && !u->away && set_getbool( &irc->set, "away_devoice" ) )
     672                        if( u->gc && !u->away && set_getint( irc, "away_devoice" ) )
    638673                                strcat( namelist, "+" );
     674                        else if( ( strcmp( u->nick, irc->mynick ) == 0 && ( strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) == 0 ) ) ||
     675                                 ( strcmp( u->nick, irc->nick ) == 0 && ( strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) == 0 ) ) )
     676                                strcat( namelist, "@" );
    639677                       
    640678                        strcat( namelist, u->nick );
     
    645683        {
    646684                GList *l;
    647                 char *ops = set_getstr( &irc->set, "ops" );
    648685               
    649686                /* root and the user aren't in the channel userlist but should
     
    893930{
    894931        char *nick, *s;
    895         char reason[128];
     932        char reason[64];
    896933       
    897934        if( u->gc && u->gc->flags & OPT_LOGGING_OUT )
    898935        {
    899                 if( u->gc->acc->server )
     936                if( u->gc->user->proto_opt[0][0] )
    900937                        g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost,
    901                                     u->gc->acc->server );
     938                                    u->gc->user->proto_opt[0] );
    902939                else if( ( s = strchr( u->gc->username, '@' ) ) )
    903940                        g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost,
     
    905942                else
    906943                        g_snprintf( reason, sizeof( reason ), "%s %s.%s", irc->myhost,
    907                                     u->gc->acc->prpl->name, irc->myhost );
     944                                    u->gc->prpl->name, irc->myhost );
    908945               
    909946                /* proto_opt might contain garbage after the : */
     
    9811018                else if( g_strncasecmp( s + 1, "TYPING", 6 ) == 0 )
    9821019                {
    983                         if( u && u->gc && u->gc->acc->prpl->send_typing && strlen( s ) >= 10 )
     1020                        if( u && u->gc && u->gc->prpl->send_typing && strlen( s ) >= 10 )
    9841021                        {
    9851022                                time_t current_typing_notice = time( NULL );
     
    9871024                                if( current_typing_notice - u->last_typing_notice >= 5 )
    9881025                                {
    989                                         u->gc->acc->prpl->send_typing( u->gc, u->handle, s[8] == '1' );
     1026                                        u->gc->prpl->send_typing( u->gc, u->handle, s[8] == '1' );
    9901027                                        u->last_typing_notice = current_typing_notice;
    9911028                                }
     
    10201057                }
    10211058        }
    1022         else if( c && c->gc && c->gc->acc && c->gc->acc->prpl )
     1059        else if( c && c->gc && c->gc->prpl )
    10231060        {
    10241061                return( bim_chat_msg( c->gc, c->id, s ) );
     
    10521089        if( !u || !u->gc ) return;
    10531090       
    1054         if( set_getint( &irc->set, "buddy_sendbuffer" ) && set_getint( &irc->set, "buddy_sendbuffer_delay" ) > 0 )
     1091        if( set_getint( irc, "buddy_sendbuffer" ) && set_getint( irc, "buddy_sendbuffer_delay" ) > 0 )
    10551092        {
    10561093                int delay;
     
    10791116                strcat( u->sendbuf, "\n" );
    10801117               
    1081                 delay = set_getint( &irc->set, "buddy_sendbuffer_delay" );
     1118                delay = set_getint( irc, "buddy_sendbuffer_delay" );
    10821119                if( delay <= 5 )
    10831120                        delay *= 1000;
     
    11441181                int len = strlen( irc->nick) + 3;
    11451182                prefix = g_new (char, len );
    1146                 g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( &irc->set, "to_char" ) );
     1183                g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( irc, "to_char" ) );
    11471184                prefix[len-1] = 0;
    11481185        }
Note: See TracChangeset for help on using the changeset viewer.