Changeset 92ad3d4


Ignore:
Timestamp:
2006-01-18T22:15:09Z (14 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
e8f8b18
Parents:
d990997 (diff), c1826c6 (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:

Merging changes from laptop: Now tries to empty sendbuffer before closing the connection,
and fixed some error checking flaw in bitlbee_io_current_client_write() that was also
present in the _read() version before 0.99 (and actually caused the 100% CPU bug that kept
us from releasing 1.0).

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • bitlbee.c

    rd990997 r92ad3d4  
    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

    rd990997 r92ad3d4  
    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

    rd990997 r92ad3d4  
    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
  • log.c

    rd990997 r92ad3d4  
    3838        openlog("bitlbee", LOG_PID, LOG_DAEMON);       
    3939
    40         logoutput.informational=&log_null;
    41         logoutput.warning=&log_null;
    42         logoutput.error=&log_null;
     40        logoutput.informational = &log_null;
     41        logoutput.warning = &log_null;
     42        logoutput.error = &log_null;
    4343#ifdef DEBUG
    44         logoutput.debug=&log_null;
     44        logoutput.debug = &log_null;
    4545#endif
    4646
     
    5151        /* I know it's ugly, but it works and I didn't feel like messing with pointer to function pointers */
    5252
    53         if(level==LOGLVL_INFO) {
    54                 if(output==LOGOUTPUT_NULL)
    55                         logoutput.informational=&log_null;     
    56                 else if(output==LOGOUTPUT_IRC)
    57                         logoutput.informational=&log_irc;       
    58                 else if(output==LOGOUTPUT_SYSLOG)
    59                         logoutput.informational=&log_syslog;   
    60                 else if(output==LOGOUTPUT_CONSOLE)
    61                         logoutput.informational=&log_console;   
     53        if(level == LOGLVL_INFO) {
     54                if(output == LOGOUTPUT_NULL)
     55                        logoutput.informational = &log_null;   
     56                else if(output == LOGOUTPUT_IRC)
     57                        logoutput.informational = &log_irc;     
     58                else if(output == LOGOUTPUT_SYSLOG)
     59                        logoutput.informational = &log_syslog; 
     60                else if(output == LOGOUTPUT_CONSOLE)
     61                        logoutput.informational = &log_console;
    6262        }
    63         else if(level==LOGLVL_WARNING) {
    64                 if(output==LOGOUTPUT_NULL)
    65                         logoutput.warning=&log_null;
    66                 else if(output==LOGOUTPUT_IRC)
    67                         logoutput.warning=&log_irc;
    68                 else if(output==LOGOUTPUT_SYSLOG)
    69                         logoutput.warning=&log_syslog;
    70                 else if(output==LOGOUTPUT_CONSOLE)
    71                         logoutput.warning=&log_console;
     63        else if(level == LOGLVL_WARNING) {
     64                if(output == LOGOUTPUT_NULL)
     65                        logoutput.warning = &log_null;
     66                else if(output == LOGOUTPUT_IRC)
     67                        logoutput.warning = &log_irc;
     68                else if(output == LOGOUTPUT_SYSLOG)
     69                        logoutput.warning = &log_syslog;
     70                else if(output == LOGOUTPUT_CONSOLE)
     71                        logoutput.warning = &log_console;
    7272        }
    73         else if(level==LOGLVL_ERROR) {
    74                 if(output==LOGOUTPUT_NULL)
    75                         logoutput.error=&log_null;
    76                 else if(output==LOGOUTPUT_IRC)
    77                         logoutput.error=&log_irc;
    78                 else if(output==LOGOUTPUT_SYSLOG)
    79                         logoutput.error=&log_syslog;
    80                 else if(output==LOGOUTPUT_CONSOLE)
    81                         logoutput.error=&log_console;
     73        else if(level == LOGLVL_ERROR) {
     74                if(output == LOGOUTPUT_NULL)
     75                        logoutput.error = &log_null;
     76                else if(output == LOGOUTPUT_IRC)
     77                        logoutput.error = &log_irc;
     78                else if(output == LOGOUTPUT_SYSLOG)
     79                        logoutput.error = &log_syslog;
     80                else if(output == LOGOUTPUT_CONSOLE)
     81                        logoutput.error = &log_console;
    8282        }
    8383#ifdef DEBUG
    84         else if(level==LOGLVL_DEBUG) {
    85                 if(output==LOGOUTPUT_NULL)
    86                         logoutput.debug=&log_null;
    87                 else if(output==LOGOUTPUT_IRC)
    88                         logoutput.debug=&log_irc;
    89                 else if(output==LOGOUTPUT_SYSLOG)
    90                         logoutput.debug=&log_syslog;
    91                 else if(output==LOGOUTPUT_CONSOLE)
    92                         logoutput.debug=&log_console;
     84        else if(level == LOGLVL_DEBUG) {
     85                if(output == LOGOUTPUT_NULL)
     86                        logoutput.debug = &log_null;
     87                else if(output == LOGOUTPUT_IRC)
     88                        logoutput.debug = &log_irc;
     89                else if(output == LOGOUTPUT_SYSLOG)
     90                        logoutput.debug = &log_syslog;
     91                else if(output == LOGOUTPUT_CONSOLE)
     92                        logoutput.debug = &log_console;
    9393        }
    9494#endif
     
    106106        va_end(ap);
    107107
    108         if(level==LOGLVL_INFO)
     108        if(level == LOGLVL_INFO)
    109109                (*(logoutput.informational))(level, msgstring);
    110         if(level==LOGLVL_WARNING)
     110        if(level == LOGLVL_WARNING)
    111111                (*(logoutput.warning))(level, msgstring);
    112         if(level==LOGLVL_ERROR)
     112        if(level == LOGLVL_ERROR)
    113113                (*(logoutput.error))(level, msgstring);
    114114#ifdef DEBUG
    115         if(level==LOGLVL_DEBUG)
     115        if(level == LOGLVL_DEBUG)
    116116                (*(logoutput.debug))(level, msgstring);
    117117#endif
     
    133133
    134134static void log_irc(int level, char *message) {
    135         if(level==LOGLVL_ERROR)
     135        if(level == LOGLVL_ERROR)
    136136                irc_write_all(1, "ERROR :Error: %s", message);
    137         if(level==LOGLVL_WARNING)
     137        if(level == LOGLVL_WARNING)
    138138                irc_write_all(0, "ERROR :Warning: %s", message);
    139         if(level==LOGLVL_INFO)
     139        if(level == LOGLVL_INFO)
    140140                irc_write_all(0, "ERROR :Informational: %s", message); 
    141141#ifdef DEBUG
    142         if(level==LOGLVL_DEBUG)
     142        if(level == LOGLVL_DEBUG)
    143143                irc_write_all(0, "ERROR :Debug: %s", message); 
    144144#endif 
     
    148148
    149149static void log_syslog(int level, char *message) {
    150         if(level==LOGLVL_ERROR)
     150        if(level == LOGLVL_ERROR)
    151151                syslog(LOG_ERR, "%s", message);
    152         if(level==LOGLVL_WARNING)
     152        if(level == LOGLVL_WARNING)
    153153                syslog(LOG_WARNING, "%s", message);
    154         if(level==LOGLVL_INFO)
     154        if(level == LOGLVL_INFO)
    155155                syslog(LOG_INFO, "%s", message);
    156156#ifdef DEBUG
    157         if(level==LOGLVL_DEBUG)
     157        if(level == LOGLVL_DEBUG)
    158158                syslog(LOG_DEBUG, "%s", message);
    159159#endif
     
    162162
    163163static void log_console(int level, char *message) {
    164         if(level==LOGLVL_ERROR)
     164        if(level == LOGLVL_ERROR)
    165165                fprintf(stderr, "Error: %s\n", message);
    166         if(level==LOGLVL_WARNING)
     166        if(level == LOGLVL_WARNING)
    167167                fprintf(stderr, "Warning: %s\n", message);
    168         if(level==LOGLVL_INFO)
     168        if(level == LOGLVL_INFO)
    169169                fprintf(stdout, "Informational: %s\n", message);
    170170#ifdef DEBUG
    171         if(level==LOGLVL_DEBUG)
     171        if(level == LOGLVL_DEBUG)
    172172                fprintf(stdout, "Debug: %s\n", message);
    173173#endif
Note: See TracChangeset for help on using the changeset viewer.