commit - 5063de59b152db79827ed9ef7d1e31fa60fa6cc5
commit + 7b6cfc17c428b9c9b58fcb9204337d5c4329f98b
blob - a12206c2ceea03a3424aeab0ee955620d79c5893
blob + d4ecc1ade8fb87a53db4a4ee60f71d7f7aaa8d7a
--- src/ngircd/conn.c
+++ src/ngircd/conn.c
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
- * $Id: conn.c,v 1.67 2002/06/02 17:03:08 alex Exp $
+ * $Id: conn.c,v 1.68 2002/08/26 00:03:15 alex Exp $
*
* connect.h: Verwaltung aller Netz-Verbindungen ("connections")
*/
time_t lastdata; /* Letzte Aktivitaet */
time_t lastping; /* Letzter PING */
time_t lastprivmsg; /* Letzte PRIVMSG */
+ time_t delaytime; /* Nicht beachten bis ("penalty") */
} CONNECTION;
fd_set read_sockets, write_sockets;
struct timeval tv;
- time_t start;
+ time_t start, t;
INT i;
start = time( NULL );
}
/* von welchen Sockets koennte gelesen werden? */
+ t = time( NULL );
read_sockets = My_Sockets;
for( i = 0; i < MAX_CONNECTIONS; i++ )
{
/* Hier laeuft noch ein asyncrones connect() */
FD_CLR( My_Connections[i].sock, &read_sockets );
}
+ if( My_Connections[i].delaytime > t )
+ {
+ /* Fuer die Verbindung ist eine "Penalty-Zeit" gesetzt */
+ FD_CLR( My_Connections[i].sock, &read_sockets );
+ }
}
for( i = 0; i < Conn_MaxFD + 1; i++ )
{
} /* Conn_LastPing */
+GLOBAL VOID
+Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
+{
+ /* Penalty-Delay fuer eine Verbindung (in Sekunden) setzen;
+ * waehrend dieser Zeit wird der entsprechende Socket vom Server
+ * bei Lese-Operationen komplett ignoriert. Der Delay kann mit
+ * dieser Funktion nur erhoeht, nicht aber verringert werden. */
+
+ time_t t;
+
+ assert( Idx >= 0 );
+ assert( Seconds >= 0 );
+
+ t = time( NULL ) + Seconds;
+ if( t > My_Connections[Idx].delaytime ) My_Connections[Idx].delaytime = t;
+} /* Conn_SetPenalty */
+
+
LOCAL BOOLEAN
Try_Write( CONN_ID Idx )
{
strcpy( My_Connections[idx].host, inet_ntoa( new_addr.sin_addr ));
Client_SetHostname( c, My_Connections[idx].host );
}
+
+ /* Penalty-Zeit setzen */
+ Conn_SetPenalty( idx, 1 );
} /* New_Connection */
/* Eine Anfrage darf(!) nicht laenger als 512 Zeichen
* (incl. CR+LF!) werden; vgl. RFC 2812. Wenn soetwas
* empfangen wird, wird der Client disconnectiert. */
- Log( LOG_ERR, "Request too long (connection %d): %d bytes!", Idx, My_Connections[Idx].rdatalen );
+ Log( LOG_ERR, "Request too long (connection %d): %d bytes (max. %d expected)!", Idx, My_Connections[Idx].rdatalen, COMMAND_LEN - 1 );
Conn_Close( Idx, NULL, "Request too long", TRUE );
return;
}
My_Connections[Idx].lastdata = time( NULL );
My_Connections[Idx].lastping = 0;
My_Connections[Idx].lastprivmsg = time( NULL );
+ My_Connections[Idx].delaytime = 0;
} /* Init_Conn_Struct */
blob - 1707b29529883fcfe8845bf162d0a00ec9852ec0
blob + bc1c18600d132a15150c9fefab9f98db108c1305
--- src/ngircd/conn.h
+++ src/ngircd/conn.h
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
- * $Id: conn.h,v 1.16 2002/06/02 17:02:34 alex Exp $
+ * $Id: conn.h,v 1.17 2002/08/26 00:03:15 alex Exp $
*
* conn.h: Verwaltung aller Netz-Verbindungen ("connections") (Header)
*/
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
+GLOBAL VOID Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
+
GLOBAL INT Conn_MaxFD;