about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ngircd/conf.c15
-rw-r--r--src/ngircd/conn.c53
2 files changed, 42 insertions, 26 deletions
diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c
index 979a1a62..976d2e0d 100644
--- a/src/ngircd/conf.c
+++ b/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 */
diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c
index e460bb48..0c3f4fce 100644
--- a/src/ngircd/conn.c
+++ b/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 ));
-
-			/* 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 );
-
-			/* Bei Server-Verbindungen lasttry-Zeitpunkt auf "jetzt" setzen */
-			Conf_Server[Conf_GetServer( idx )].lasttry = time( NULL );
-			Conf_UnsetServer( idx );
-			return;
+	/* 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 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);
+
+		return;
 	}
 
 	Conn_OPTION_DEL( &My_Connections[idx], CONN_ISCONNECTING );
@@ -731,9 +736,15 @@ Conn_Close( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient )
 			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 ))
 	{