Commit Diff


commit - 12e288c0625bde5aa5a56b6d813abbe2b22d2af5
commit + e728bd2e1a5bcf69596b8c2a305cd6decbeaf42a
blob - 2018a10f91aab64dacbe71fbdf93f662b0a5cd36
blob + a9c5e8c8640ac03ae4f07cc215e983dd67d042fe
--- ChangeLog
+++ ChangeLog
@@ -12,6 +12,8 @@
 
 ngIRCd CVSHEAD
 
+  - Changed handling of timeouts for unregistered connections: don't reset
+    the counter if data is received and disconnect clients earlier.
   - Fixed a format string bug in "connection statistics" messages to clients.
   - Removed unnecessary #define of "LOCAL", now use plain C "static" instead.
   - Channel topics are no longer limited to 127 characters: now the only limit
@@ -632,4 +634,4 @@ ngIRCd 0.0.1, 31.12.2001
 
 
 -- 
-$Id: ChangeLog,v 1.288 2005/08/27 22:59:06 alex Exp $
+$Id: ChangeLog,v 1.289 2005/08/27 23:33:10 alex Exp $
blob - 714ebe6f34e611c45e36596c8e7b0278d6380cad
blob + c1bc4c23540ff13e160c5ad7c07b1f732d2719ed
--- 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.170 2005/08/15 23:02:40 alex Exp $";
+static char UNUSED id[] = "$Id: conn.c,v 1.171 2005/08/27 23:33:11 alex Exp $";
 
 #include "imp.h"
 #include <assert.h>
@@ -1078,6 +1078,7 @@ Read_Request( CONN_ID Idx )
 
 	int len;
 	char readbuf[1024];
+	CLIENT *c;
 
 	assert( Idx > NONE );
 	assert( My_Connections[Idx].sock > NONE );
@@ -1129,13 +1130,21 @@ Read_Request( CONN_ID Idx )
 		}
 	}
 
-	/* Connection-Statistik aktualisieren */
+	/* Update connection statistics */
 	My_Connections[Idx].bytes_in += len;
 
-	/* Timestamp aktualisieren */
-	My_Connections[Idx].lastdata = time( NULL );
+	/* Update timestamp of last data received if this connection is
+	 * registered as a user, server or service connection. Don't update
+	 * otherwise, so users have at least Conf_PongTimeout seconds time to
+	 * register with the IRC server -- see Check_Connections(). */
+	c = Client_GetFromConn(Idx);
+	if (c && (Client_Type(c) == CLIENT_USER
+		  || Client_Type(c) == CLIENT_SERVER
+		  || Client_Type(c) == CLIENT_SERVICE))
+		My_Connections[Idx].lastdata = time(NULL);
 
-	Handle_Buffer( Idx );
+	/* Look at the data in the (read-) buffer of this connection */
+	Handle_Buffer(Idx);
 } /* Read_Request */
 
 
@@ -1286,14 +1295,19 @@ Check_Connections( void )
 		}
 		else
 		{
-			/* connection is not fully established yet */
-			if( My_Connections[i].lastdata < time( NULL ) - Conf_PingTimeout )
-			{
-				/* Timeout */
-#ifdef DEBUG
-				Log( LOG_DEBUG, "Connection %d timed out ...", i );
+			/* The connection is not fully established yet, so
+			 * we don't do the PING-PONG game here but instead
+			 * disconnect the client after "a short time" if it's
+			 * still not registered. */
+
+			if (My_Connections[i].lastdata <
+			    time(NULL) - Conf_PongTimeout) {
+#ifdef DEBUG
+				Log(LOG_DEBUG,
+				    "Unregistered connection %d timed out ...",
+				    i);
 #endif
-				Conn_Close( i, NULL, "Timeout", false );
+				Conn_Close(i, NULL, "Timeout", false);
 			}
 		}
 	}