Changeset 9779c18 for irc.c


Ignore:
Timestamp:
2006-06-03T20:20:43Z (18 years ago)
Author:
Jelmer Vernooij <jelmer@…>
Branches:
master
Children:
5973412
Parents:
a15c097 (diff), fb62f81f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

[merge] Wilmer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • irc.c

    ra15c097 r9779c18  
    5555        irc->fd = fd;
    5656        irc->io_channel = g_io_channel_unix_new( fd );
    57 #ifdef GLIB2
    5857        g_io_channel_set_encoding (irc->io_channel, NULL, NULL);
    5958        g_io_channel_set_buffered (irc->io_channel, FALSE);
    6059        g_io_channel_set_flags( irc->io_channel, G_IO_FLAG_NONBLOCK, NULL );
    61 #else
    62         fcntl( irc->fd, F_SETFL, O_NONBLOCK);
    63 #endif
    6460        irc->r_watch_source_id = g_io_add_watch( irc->io_channel, G_IO_IN | G_IO_ERR | G_IO_HUP, bitlbee_io_current_client_read, irc );
    6561       
     
    199195}
    200196
    201 static gboolean irc_free_userhash( gpointer key, gpointer value, gpointer data )
     197static gboolean irc_free_hashkey( gpointer key, gpointer value, gpointer data )
    202198{
    203199        g_free( key );
     
    233229       
    234230        for (account = irc->accounts; account; account = account->next) {
    235                 if (account->gc)
    236                         account_offline(account->gc);
    237                 else if (account->reconnect)
    238                         g_source_remove(account->reconnect);
     231                if (account->gc) {
     232                        account->gc->wants_to_die = TRUE;
     233                        signoff(account->gc);
     234                } else if (account->reconnect) {
     235                        cancel_auto_reconnect(account);
     236                }
    239237        }
    240238       
     
    285283        }
    286284       
    287         g_hash_table_foreach_remove(irc->userhash, irc_free_userhash, NULL);
     285        g_hash_table_foreach_remove(irc->userhash, irc_free_hashkey, NULL);
    288286        g_hash_table_destroy(irc->userhash);
    289287       
    290         g_hash_table_foreach_remove(irc->watches, irc_free_userhash, NULL);
     288        g_hash_table_foreach_remove(irc->watches, irc_free_hashkey, NULL);
    291289        g_hash_table_destroy(irc->watches);
    292290       
     
    346344void irc_process( irc_t *irc )
    347345{
    348         char **lines, *temp, **cmd;
     346        char **lines, *temp, **cmd, *cs;
    349347        int i;
    350348
     
    355353                for( i = 0; *lines[i] != '\0'; i ++ )
    356354                {
     355                        char conv[IRC_MAX_LINE+1];
     356                       
     357                        /* [WvG] Because irc_tokenize splits at every newline, the lines[] list
     358                            should end with an empty string. This is why this actually works.
     359                            Took me a while to figure out, Maurits. :-P */
    357360                        if( lines[i+1] == NULL )
    358361                        {
     
    362365                                i ++;
    363366                                break;
    364                         }                       
     367                        }
     368                       
     369                        if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
     370                        {
     371                                conv[IRC_MAX_LINE] = 0;
     372                                if( do_iconv( cs, "UTF-8", lines[i], conv, 0, IRC_MAX_LINE - 2 ) != -1 )
     373                                        lines[i] = conv;
     374                        }
    365375                       
    366376                        if( ( cmd = irc_parse_line( lines[i] ) ) == NULL )
     
    388398}
    389399
     400/* Splits a long string into separate lines. The array is NULL-terminated and, unless the string
     401   contains an incomplete line at the end, ends with an empty string. */
    390402char **irc_tokenize( char *buffer )
    391403{
     
    428440}
    429441
     442/* Split an IRC-style line into little parts/arguments. */
    430443char **irc_parse_line( char *line )
    431444{
     
    487500}
    488501
     502/* Converts such an array back into a command string. Mainly used for the IPC code right now. */
    489503char *irc_build_line( char **cmd )
    490504{
     
    539553       
    540554        u = user_find( irc, irc->mynick );
    541         if( u ) is_private = u->is_private;
     555        is_private = u->is_private;
    542556       
    543557        va_start( params, format );
     
    563577{
    564578        int size;
    565         char line[IRC_MAX_LINE];
    566        
     579        char line[IRC_MAX_LINE+1], *cs;
     580               
    567581        if( irc->quit )
    568582                return;
    569 
    570         g_vsnprintf( line, IRC_MAX_LINE - 3, format, params );
    571 
     583       
     584        line[IRC_MAX_LINE] = 0;
     585        g_vsnprintf( line, IRC_MAX_LINE - 2, format, params );
     586       
    572587        strip_newlines( line );
     588        if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
     589        {
     590                char conv[IRC_MAX_LINE+1];
     591               
     592                conv[IRC_MAX_LINE] = 0;
     593                if( do_iconv( "UTF-8", cs, line, conv, 0, IRC_MAX_LINE - 2 ) != -1 )
     594                        strcpy( line, conv );
     595        }
    573596        strcat( line, "\r\n" );
    574 
     597       
    575598        if( irc->sendbuffer != NULL ) {
    576599                size = strlen( irc->sendbuffer ) + strlen( line );
     
    803826                        irc_reply( irc, 332, "%s :BitlBee groupchat: \"%s\". Please keep in mind that root-commands won't work here. Have fun!", channel, c->title );
    804827                else
    805                         irc_reply( irc, 331, "%s :No topic for this channel" );
     828                        irc_reply( irc, 331, "%s :No topic for this channel", channel );
    806829        }
    807830}
     
    859882        if( g_hash_table_lookup( irc->watches, nick ) )
    860883        {
    861                 irc_reply( irc, 600, "%s %s %s %d :%s", u->nick, u->user, u->host, time( NULL ), "logged online" );
     884                irc_reply( irc, 600, "%s %s %s %d :%s", u->nick, u->user, u->host, (int) time( NULL ), "logged online" );
    862885        }
    863886        g_free( nick );
     
    876899void irc_kill( irc_t *irc, user_t *u )
    877900{
    878         char *nick;
    879        
    880         irc_write( irc, ":%s!%s@%s QUIT :%s", u->nick, u->user, u->host, "Leaving..." );
     901        char *nick, *s;
     902        char reason[64];
     903       
     904        if( u->gc && u->gc->flags & OPT_LOGGING_OUT )
     905        {
     906                if( u->gc->user->proto_opt[0][0] )
     907                        g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost,
     908                                    u->gc->user->proto_opt[0] );
     909                else if( ( s = strchr( u->gc->username, '@' ) ) )
     910                        g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost,
     911                                    s + 1 );
     912                else
     913                        g_snprintf( reason, sizeof( reason ), "%s %s.%s", irc->myhost,
     914                                    u->gc->prpl->name, irc->myhost );
     915               
     916                /* proto_opt might contain garbage after the : */
     917                if( ( s = strchr( reason, ':' ) ) )
     918                        *s = 0;
     919        }
     920        else
     921        {
     922                strcpy( reason, "Leaving..." );
     923        }
     924       
     925        irc_write( irc, ":%s!%s@%s QUIT :%s", u->nick, u->user, u->host, reason );
    881926       
    882927        nick = g_strdup( u->nick );
     
    884929        if( g_hash_table_lookup( irc->watches, nick ) )
    885930        {
    886                 irc_reply( irc, 601, "%s %s %s %d :%s", u->nick, u->user, u->host, time( NULL ), "logged offline" );
     931                irc_reply( irc, 601, "%s %s %s %d :%s", u->nick, u->user, u->host, (int) time( NULL ), "logged offline" );
    887932        }
    888933        g_free( nick );
     
    9841029        else if( c && c->gc && c->gc->prpl )
    9851030        {
    986                 return( serv_send_chat( irc, c->gc, c->id, s ) );
     1031                return( bim_chat_msg( c->gc, c->id, s ) );
    9871032        }
    9881033       
     
    9941039        user_t *u = data;
    9951040       
     1041        /* Shouldn't happen, but just to be sure. */
     1042        if( u->sendbuf_len < 2 )
     1043                return FALSE;
     1044       
    9961045        u->sendbuf[u->sendbuf_len-2] = 0; /* Cut off the last newline */
    997         serv_send_im( u->gc->irc, u, u->sendbuf, u->sendbuf_flags );
     1046        bim_buddy_msg( u->gc, u->handle, u->sendbuf, u->sendbuf_flags );
    9981047       
    9991048        g_free( u->sendbuf );
     
    10031052        u->sendbuf_flags = 0;
    10041053       
    1005         return( FALSE );
     1054        return FALSE;
    10061055}
    10071056
     
    10161065                if( u->sendbuf_len > 0 && u->sendbuf_flags != flags)
    10171066                {
    1018                         //Flush the buffer
     1067                        /* Flush the buffer */
    10191068                        g_source_remove( u->sendbuf_timer );
    10201069                        buddy_send_handler_delayed( u );
     
    10241073                {
    10251074                        u->sendbuf_len = strlen( msg ) + 2;
    1026                         u->sendbuf = g_new (char, u->sendbuf_len );
     1075                        u->sendbuf = g_new( char, u->sendbuf_len );
    10271076                        u->sendbuf[0] = 0;
    10281077                        u->sendbuf_flags = flags;
     
    10311080                {
    10321081                        u->sendbuf_len += strlen( msg ) + 1;
    1033                         u->sendbuf = g_renew ( char, u->sendbuf, u->sendbuf_len );
     1082                        u->sendbuf = g_renew( char, u->sendbuf, u->sendbuf_len );
    10341083                }
    10351084               
     
    10471096        else
    10481097        {
    1049                 serv_send_im( irc, u, msg, flags );
     1098                bim_buddy_msg( u->gc, u->handle, msg, flags );
    10501099        }
    10511100}
Note: See TracChangeset for help on using the changeset viewer.