mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	- volle Lesebuffer und Timeouts behandelt Conn_Handle() nun besser.
- Handle_Buffer() liefert nun ein Ergebnis.
This commit is contained in:
		| @@ -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.94 2002/11/23 16:09:57 alex Exp $ |  * $Id: conn.c,v 1.95 2002/11/23 17:04:07 alex Exp $ | ||||||
|  * |  * | ||||||
|  * connect.h: Verwaltung aller Netz-Verbindungen ("connections") |  * connect.h: Verwaltung aller Netz-Verbindungen ("connections") | ||||||
|  */ |  */ | ||||||
| @@ -86,7 +86,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(( LONG Idx )); | LOCAL VOID Init_Conn_Struct PARAMS(( LONG Idx )); | ||||||
| @@ -297,10 +297,13 @@ Conn_Handler( VOID ) | |||||||
| 	struct timeval tv; | 	struct timeval tv; | ||||||
| 	time_t start, t; | 	time_t start, t; | ||||||
| 	LONG i, idx; | 	LONG 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( ); | ||||||
| @@ -311,7 +314,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; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -363,7 +366,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 ); | ||||||
| @@ -1039,16 +1044,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? */ | ||||||
| @@ -1069,6 +1077,7 @@ Handle_Buffer( CONN_ID Idx ) | |||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | 	action = FALSE; | ||||||
| 	if( ptr ) | 	if( ptr ) | ||||||
| 	{ | 	{ | ||||||
| 		/* Ende der Anfrage wurde gefunden */ | 		/* Ende der Anfrage wurde gefunden */ | ||||||
| @@ -1077,23 +1086,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 */ | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Alexander Barton
					Alexander Barton