Commit Diff
Diff:
ff218617dbedae87f24a279ef16505a824a636d7
bc09a3e4876bd92b1c5c8706203ce85c54e180d6
Commit:
bc09a3e4876bd92b1c5c8706203ce85c54e180d6
Tree:
f9f097c2923709734e641ec569d619f2bed99821
Author:
Alexander Barton <alex@barton.de>
Committer:
Alexander Barton <alex@barton.de>
Date:
Tue Oct 11 19:29:23 2005 UTC
Message:
Changed Handle_Write() to not close sockets itself but to call Conn_Close.
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 <assert.h>
@@ -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 <assert.h>
@@ -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,9 +736,15 @@ 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 ))
{
IRCNow