mirror of
https://github.com/osmarks/ngircd.git
synced 2025-08-03 12:23:56 +00:00
- volle Lesebuffer und Timeouts behandelt Conn_Handle() nun besser.
- Handle_Buffer() liefert nun ein Ergebnis. (beides aus HEAD)
This commit is contained in:
parent
34d7f4162d
commit
266b68b873
@ -9,7 +9,7 @@
|
|||||||
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
||||||
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
||||||
*
|
*
|
||||||
* $Id: conn.c,v 1.72.2.6 2002/11/23 16:20:48 alex Exp $
|
* $Id: conn.c,v 1.72.2.7 2002/11/24 15:10:09 alex Exp $
|
||||||
*
|
*
|
||||||
* connect.h: Verwaltung aller Netz-Verbindungen ("connections")
|
* connect.h: Verwaltung aller Netz-Verbindungen ("connections")
|
||||||
*/
|
*/
|
||||||
@ -84,7 +84,7 @@ LOCAL VOID New_Connection PARAMS(( INT Sock ));
|
|||||||
LOCAL CONN_ID Socket2Index PARAMS(( INT Sock ));
|
LOCAL CONN_ID Socket2Index PARAMS(( INT Sock ));
|
||||||
LOCAL VOID Read_Request PARAMS(( CONN_ID Idx ));
|
LOCAL VOID Read_Request PARAMS(( CONN_ID Idx ));
|
||||||
LOCAL BOOLEAN Try_Write PARAMS(( CONN_ID Idx ));
|
LOCAL BOOLEAN Try_Write PARAMS(( CONN_ID Idx ));
|
||||||
LOCAL VOID Handle_Buffer PARAMS(( CONN_ID Idx ));
|
LOCAL BOOLEAN Handle_Buffer PARAMS(( CONN_ID Idx ));
|
||||||
LOCAL VOID Check_Connections PARAMS(( VOID ));
|
LOCAL VOID Check_Connections PARAMS(( VOID ));
|
||||||
LOCAL VOID Check_Servers PARAMS(( VOID ));
|
LOCAL VOID Check_Servers PARAMS(( VOID ));
|
||||||
LOCAL VOID Init_Conn_Struct PARAMS(( INT Idx ));
|
LOCAL VOID Init_Conn_Struct PARAMS(( INT Idx ));
|
||||||
@ -236,10 +236,13 @@ Conn_Handler( VOID )
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
time_t start, t;
|
time_t start, t;
|
||||||
INT i, idx;
|
INT i, idx;
|
||||||
|
BOOLEAN timeout;
|
||||||
|
|
||||||
start = time( NULL );
|
start = time( NULL );
|
||||||
while(( ! NGIRCd_Quit ) && ( ! NGIRCd_Restart ))
|
while(( ! NGIRCd_Quit ) && ( ! NGIRCd_Restart ))
|
||||||
{
|
{
|
||||||
|
timeout = TRUE;
|
||||||
|
|
||||||
Check_Servers( );
|
Check_Servers( );
|
||||||
|
|
||||||
Check_Connections( );
|
Check_Connections( );
|
||||||
@ -250,7 +253,7 @@ Conn_Handler( VOID )
|
|||||||
if(( My_Connections[i].sock > NONE ) && ( My_Connections[i].rdatalen > 0 ))
|
if(( My_Connections[i].sock > NONE ) && ( My_Connections[i].rdatalen > 0 ))
|
||||||
{
|
{
|
||||||
/* Kann aus dem Buffer noch ein Befehl extrahiert werden? */
|
/* Kann aus dem Buffer noch ein Befehl extrahiert werden? */
|
||||||
Handle_Buffer( i );
|
if( Handle_Buffer( i )) timeout = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,7 +305,9 @@ Conn_Handler( VOID )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Timeout initialisieren */
|
/* Timeout initialisieren */
|
||||||
tv.tv_sec = TIME_RES; tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
|
if( timeout ) tv.tv_sec = TIME_RES;
|
||||||
|
else tv.tv_sec = 0;
|
||||||
|
|
||||||
/* Auf Aktivitaet warten */
|
/* Auf Aktivitaet warten */
|
||||||
i = select( Conn_MaxFD + 1, &read_sockets, &write_sockets, NULL, &tv );
|
i = select( Conn_MaxFD + 1, &read_sockets, &write_sockets, NULL, &tv );
|
||||||
@ -839,16 +844,19 @@ Read_Request( CONN_ID Idx )
|
|||||||
} /* Read_Request */
|
} /* Read_Request */
|
||||||
|
|
||||||
|
|
||||||
LOCAL VOID
|
LOCAL BOOLEAN
|
||||||
Handle_Buffer( CONN_ID Idx )
|
Handle_Buffer( CONN_ID Idx )
|
||||||
{
|
{
|
||||||
/* Daten im Lese-Puffer einer Verbindung verarbeiten. */
|
/* Daten im Lese-Puffer einer Verbindung verarbeiten.
|
||||||
|
* Wurde ein Request verarbeitet, so wird TRUE geliefert,
|
||||||
|
* ansonsten FALSE (auch bei Fehlern). */
|
||||||
|
|
||||||
#ifndef STRICT_RFC
|
#ifndef STRICT_RFC
|
||||||
CHAR *ptr1, *ptr2;
|
CHAR *ptr1, *ptr2;
|
||||||
#endif
|
#endif
|
||||||
CHAR *ptr;
|
CHAR *ptr;
|
||||||
INT len, delta;
|
INT len, delta;
|
||||||
|
BOOLEAN action;
|
||||||
|
|
||||||
/* Eine komplette Anfrage muss mit CR+LF enden, vgl.
|
/* Eine komplette Anfrage muss mit CR+LF enden, vgl.
|
||||||
* RFC 2812. Haben wir eine? */
|
* RFC 2812. Haben wir eine? */
|
||||||
@ -869,6 +877,7 @@ Handle_Buffer( CONN_ID Idx )
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
action = FALSE;
|
||||||
if( ptr )
|
if( ptr )
|
||||||
{
|
{
|
||||||
/* Ende der Anfrage wurde gefunden */
|
/* Ende der Anfrage wurde gefunden */
|
||||||
@ -877,23 +886,26 @@ Handle_Buffer( CONN_ID Idx )
|
|||||||
if( len > ( COMMAND_LEN - 1 ))
|
if( len > ( COMMAND_LEN - 1 ))
|
||||||
{
|
{
|
||||||
/* Eine Anfrage darf(!) nicht laenger als 512 Zeichen
|
/* Eine Anfrage darf(!) nicht laenger als 512 Zeichen
|
||||||
* (incl. CR+LF!) werden; vgl. RFC 2812. Wenn soetwas
|
* (incl. CR+LF!) werden; vgl. RFC 2812. Wenn soetwas
|
||||||
* empfangen wird, wird der Client disconnectiert. */
|
* empfangen wird, wird der Client disconnectiert. */
|
||||||
Log( LOG_ERR, "Request too long (connection %d): %d bytes (max. %d expected)!", Idx, My_Connections[Idx].rdatalen, COMMAND_LEN - 1 );
|
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 );
|
Conn_Close( Idx, NULL, "Request too long", TRUE );
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( len > delta )
|
if( len > delta )
|
||||||
{
|
{
|
||||||
/* Es wurde ein Request gelesen */
|
/* Es wurde ein Request gelesen */
|
||||||
if( ! Parse_Request( Idx, My_Connections[Idx].rbuf )) return;
|
if( ! Parse_Request( Idx, My_Connections[Idx].rbuf )) return FALSE;
|
||||||
|
else action = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Puffer anpassen */
|
/* Puffer anpassen */
|
||||||
My_Connections[Idx].rdatalen -= len;
|
My_Connections[Idx].rdatalen -= len;
|
||||||
memmove( My_Connections[Idx].rbuf, My_Connections[Idx].rbuf + len, My_Connections[Idx].rdatalen );
|
memmove( My_Connections[Idx].rbuf, My_Connections[Idx].rbuf + len, My_Connections[Idx].rdatalen );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return action;
|
||||||
} /* Handle_Buffer */
|
} /* Handle_Buffer */
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user