Changeset c1826c6


Ignore:
Timestamp:
2006-01-18T18:25:31Z (14 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
4c266f2, 92ad3d4
Parents:
ac9f0e9
Message:

BitlBee now tries to empty sendbuffer before closing the connection.

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • bitlbee.c

    rac9f0e9 rc1826c6  
    200200        {
    201201                log_message( LOGLVL_INFO, "Destroying connection with fd %d.", irc->fd );
    202                 irc_free( irc );
     202                irc_abort( irc );
    203203                return FALSE;
    204204        }
     
    208208        {
    209209                log_message( LOGLVL_ERROR, "Maximum line length exceeded." );
    210                 irc_free( irc );
     210                irc_abort( irc );
    211211                return FALSE;
    212212        }
     
    227227        st = write( irc->fd, irc->sendbuffer, size );
    228228       
    229         if( st <= 0 )
    230         {
    231                 if( sockerr_again() )
    232                 {
    233                         return TRUE;
    234                 }
    235                 else
    236                 {
    237                         irc_free( irc );
    238                         return FALSE;
    239                 }
     229        if( st == 0 || ( st < 0 && !sockerr_again() ) )
     230        {
     231                irc_free( irc );
     232                return FALSE;
     233        }
     234        else if( st < 0 ) /* && sockerr_again() */
     235        {
     236                return TRUE;
    240237        }
    241238       
     
    244241                g_free( irc->sendbuffer );
    245242                irc->sendbuffer = NULL;
    246                
    247243                irc->w_watch_source_id = 0;
     244               
     245                if( irc->status == USTATUS_SHUTDOWN )
     246                        irc_free( irc );
     247               
    248248                return( FALSE );
    249249        }
  • irc.c

    rac9f0e9 rc1826c6  
    151151}
    152152
     153void irc_abort( irc_t *irc )
     154{
     155        irc->status = USTATUS_SHUTDOWN;
     156        if( irc->sendbuffer )
     157        {
     158                g_source_remove( irc->r_watch_source_id );
     159                irc->r_watch_source_id = g_timeout_add_full( G_PRIORITY_HIGH, 1000, (GSourceFunc) irc_free, irc, NULL );
     160        }
     161        else
     162        {
     163                irc_free( irc );
     164        }
     165}
     166
    153167static gboolean irc_free_userhash( gpointer key, gpointer value, gpointer data )
    154168{
     
    159173
    160174/* Because we have no garbage collection, this is quite annoying */
    161 void irc_free(irc_t * irc)
     175void irc_free( irc_t * irc )
    162176{
    163177        account_t *account, *accounttmp;
     
    496510        {
    497511                irc_write( irc, "ERROR :%s%s", cmd[1]?"Quit: ":"", cmd[1]?cmd[1]:"Client Quit" );
    498                 g_io_channel_close( irc->io_channel );
     512                /* g_io_channel_close( irc->io_channel ); */
    499513                return( 0 );
    500514        }
  • irc.h

    rac9f0e9 rc1826c6  
    4444        USTATUS_AUTHORIZED,
    4545        USTATUS_LOGGED_IN,
    46         USTATUS_IDENTIFIED
     46        USTATUS_IDENTIFIED,
     47        USTATUS_SHUTDOWN
    4748} irc_status_t;
    4849
     
    104105
    105106irc_t *irc_new( int fd );
     107void irc_abort( irc_t *irc );
    106108void irc_free( irc_t *irc );
    107109
Note: See TracChangeset for help on using the changeset viewer.