commit bc09a3e4876bd92b1c5c8706203ce85c54e180d6 from: Alexander Barton date: Tue Oct 11 19:29:23 2005 UTC Changed Handle_Write() to not close sockets itself but to call Conn_Close. commit - ff218617dbedae87f24a279ef16505a824a636d7 commit + bc09a3e4876bd92b1c5c8706203ce85c54e180d6 blob - bdef8dd2469f823120ff2f868d86a87472e23c45 blob + 5836acfeb79bafcafc40545940188b95530a4598 --- ChangeLog +++ ChangeLog @@ -11,6 +11,9 @@ ngIRCd CVSHEAD + + - Fixed a bug that could cause the damon to crash when outgoing server + connections can't be established. - Internal: Simplified resolver code. - Fixed a bug that caused the daemon to leak file descriptors when no resolver subprocesses could be created. @@ -641,4 +644,4 @@ ngIRCd 0.0.1, 31.12.2001 -- -$Id: ChangeLog,v 1.295 2005/09/12 19:10:20 fw Exp $ +$Id: ChangeLog,v 1.296 2005/10/11 19:29:23 alex Exp $ blob - 979a1a62e76fe95af877581d7e423f00ad5637f4 blob + 976d2e0d0f1bcb6f81ab8d8461f4a230b11fbc7f --- src/ngircd/conf.c +++ src/ngircd/conf.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conf.c,v 1.87 2005/09/24 17:06:54 alex Exp $"; +static char UNUSED id[] = "$Id: conf.c,v 1.88 2005/10/11 19:29:23 alex Exp $"; #include "imp.h" #include @@ -254,6 +254,7 @@ Conf_UnsetServer( CONN_ID Idx ) * Non-Server-Connections will be silently ignored. */ int i; + time_t t; /* Check all our configured servers */ for( i = 0; i < MAX_SERVERS; i++ ) { @@ -267,10 +268,14 @@ Conf_UnsetServer( CONN_ID Idx ) Init_Server_Struct( &Conf_Server[i] ); } else { /* Set time for next connect attempt */ - if( Conf_Server[i].lasttry < time( NULL ) - Conf_ConnectRetry ) { - /* Okay, the connection was established "long enough": */ - Conf_Server[i].lasttry = time( NULL ) - Conf_ConnectRetry + RECONNECT_DELAY; - } + t = time(NULL); + if (Conf_Server[i].lasttry < t - Conf_ConnectRetry) { + /* The connection has been "long", so we don't + * require the next attempt to be delayed. */ + Conf_Server[i].lasttry = + t - Conf_ConnectRetry + RECONNECT_DELAY; + } else + Conf_Server[i].lasttry = t; } } } /* Conf_UnsetServer */ blob - e460bb48e6a92aa16aa9dda036995bf8e0c9f16d blob + 0c3f4fcee70f705a4a5acff9c92238d682336689 --- src/ngircd/conn.c +++ src/ngircd/conn.c @@ -17,7 +17,7 @@ #include "portab.h" #include "io.h" -static char UNUSED id[] = "$Id: conn.c,v 1.183 2005/09/24 02:48:46 fw Exp $"; +static char UNUSED id[] = "$Id: conn.c,v 1.184 2005/10/11 19:29:23 alex Exp $"; #include "imp.h" #include @@ -138,25 +138,30 @@ cb_connserver(int sock, UNUSED short what) res = getsockopt( My_Connections[idx].sock, SOL_SOCKET, SO_ERROR, &err, &sock_len ); assert( sock_len == sizeof( err )); - /* Fehler aufgetreten? */ - if(( res != 0 ) || ( err != 0 )) { - if ( res != 0 ) - Log( LOG_CRIT, "getsockopt (connection %d): %s!", idx, strerror( errno )); - else - Log( LOG_CRIT, "Can't connect socket to \"%s:%d\" (connection %d): %s!", - My_Connections[idx].host, Conf_Server[Conf_GetServer( idx )].port, - idx, strerror( err )); + /* Error while connecting? */ + if ((res != 0) || (err != 0)) { + if (res != 0) + Log(LOG_CRIT, "getsockopt (connection %d): %s!", + idx, strerror(errno)); + else + Log(LOG_CRIT, + "Can't connect socket to \"%s:%d\" (connection %d): %s!", + My_Connections[idx].host, + Conf_Server[Conf_GetServer(idx)].port, + idx, strerror(err)); - /* Clean up socket, connection and client structures */ - c = Client_GetFromConn( idx ); - if( c ) Client_DestroyNow( c ); - io_close( My_Connections[idx].sock ); - Init_Conn_Struct( idx ); + /* Clean up the CLIENT structure (to avoid silly log + * messages) and call Conn_Close() to do the rest. */ + c = Client_GetFromConn(idx); + if (c) + Client_DestroyNow(c); + + Conn_Close(idx, "Can't connect!", NULL, false); + + /* Set the timestamp of the last connect attempt */ + Conf_UnsetServer(idx); - /* Bei Server-Verbindungen lasttry-Zeitpunkt auf "jetzt" setzen */ - Conf_Server[Conf_GetServer( idx )].lasttry = time( NULL ); - Conf_UnsetServer( idx ); - return; + return; } Conn_OPTION_DEL( &My_Connections[idx], CONN_ISCONNECTING ); @@ -731,8 +736,14 @@ Conn_Close( CONN_ID Idx, char *LogMsg, char *FwdMsg, b Conn_WriteStr(Idx, "ERROR :Closing connection."); } - /* Try to write out the write buffer */ + /* Try to write out the write buffer. Note: Handle_Write() eventually + * removes the CLIENT structure associated with this connection if an + * error occurs! So we have to re-check if there is still an valid + * CLIENT structure after calling Handle_Write() ...*/ (void)Handle_Write( Idx ); + + /* Search client, if any (re-check!) */ + c = Client_GetFromConn( Idx ); /* Shut down socket */ if( ! io_close( My_Connections[Idx].sock ))