X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fconn.c;h=194c181b8e7c550ef137db3c0ca6dd956b7ac3a5;hb=1c668252c9c84bb2574ed96d5f19e2ceb313ebd6;hp=a12206c2ceea03a3424aeab0ee955620d79c5893;hpb=ae958aa1a51f59ce78986d57d48e1df3c112fcc7;p=ngircd-alex.git diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index a12206c2..194c181b 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -9,7 +9,7 @@ * 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.69 2002/09/02 19:03:09 alex Exp $ * * connect.h: Verwaltung aller Netz-Verbindungen ("connections") */ @@ -74,6 +74,7 @@ typedef struct _Connection time_t lastdata; /* Letzte Aktivitaet */ time_t lastping; /* Letzter PING */ time_t lastprivmsg; /* Letzte PRIVMSG */ + time_t delaytime; /* Nicht beachten bis ("penalty") */ } CONNECTION; @@ -231,7 +232,7 @@ Conn_Handler( VOID ) fd_set read_sockets, write_sockets; struct timeval tv; - time_t start; + time_t start, t; INT i; start = time( NULL ); @@ -272,6 +273,7 @@ Conn_Handler( VOID ) } /* von welchen Sockets koennte gelesen werden? */ + t = time( NULL ); read_sockets = My_Sockets; for( i = 0; i < MAX_CONNECTIONS; i++ ) { @@ -285,6 +287,11 @@ Conn_Handler( VOID ) /* 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++ ) { @@ -494,6 +501,24 @@ Conn_LastPing( CONN_ID Idx ) } /* 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 ) { @@ -601,7 +626,7 @@ Handle_Write( CONN_ID Idx ) Log( LOG_DEBUG, "Connection %d with \"%s:%d\" established, now sendig PASS and SERVER ...", Idx, My_Connections[Idx].host, Conf_Server[My_Connections[Idx].our_server].port ); /* PASS und SERVER verschicken */ - Conn_WriteStr( Idx, "PASS %s %s", Conf_Server[My_Connections[Idx].our_server].pwd, PASSSERVERADD ); + Conn_WriteStr( Idx, "PASS %s %s", Conf_Server[My_Connections[Idx].our_server].pwd, NGIRCd_ProtoID ); Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo ); return TRUE; @@ -691,6 +716,9 @@ New_Connection( INT Sock ) 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 */ @@ -796,7 +824,7 @@ Handle_Buffer( CONN_ID Idx ) /* 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; } @@ -1044,6 +1072,7 @@ Init_Conn_Struct( INT Idx ) 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 */