* 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.97 2002/11/28 12:17:38 alex Exp $
+ * $Id: conn.c,v 1.99 2002/11/29 13:13:42 alex Exp $
*
* connect.h: Verwaltung aller Netz-Verbindungen ("connections")
*/
if( InformClient )
{
+#ifndef STRICT_RFC
/* Statistik an Client melden, wenn User */
if(( c != NULL ) && ( Client_Type( c ) == CLIENT_USER ))
{
Conn_WriteStr( Idx, "NOTICE %s :%sConnection statistics: client %.1f kb, server %.1f kb.", Client_ThisServer( ), NOTICE_TXTPREFIX, (DOUBLE)My_Connections[Idx].bytes_in / 1024, (DOUBLE)My_Connections[Idx].bytes_out / 1024 );
}
+#endif
/* ERROR an Client schicken (von RFC so vorgesehen!) */
if( FwdMsg ) Conn_WriteStr( Idx, "ERROR :%s", FwdMsg );
if( My_Connections[Idx].sock == NONE ) return;
}
+ /* zunaechst versuchen, noch im Schreibpuffer vorhandene
+ * Daten auf den Socket zu schreiben ... */
+ Try_Write( Idx );
+
if( close( My_Connections[Idx].sock ) != 0 )
{
Log( LOG_ERR, "Error closing connection %d (socket %d) with %s:%d - %s!", Idx, My_Connections[Idx].sock, My_Connections[Idx].host, ntohs( My_Connections[Idx].addr.sin_port), strerror( errno ));
LOCAL BOOLEAN
Try_Write( CONN_ID Idx )
{
- /* Versuchen, Daten aus dem Schreib-Puffer in den
- * Socket zu schreiben. */
+ /* Versuchen, Daten aus dem Schreib-Puffer in den Socket zu
+ * schreiben. TRUE wird geliefert, wenn entweder keine Daten
+ * zum Versenden vorhanden sind oder erfolgreich bearbeitet
+ * werden konnten. Im Fehlerfall wird FALSE geliefert und
+ * die Verbindung geschlossen. */
fd_set write_socket;
struct timeval tv;
assert( Idx > NONE );
assert( My_Connections[Idx].sock > NONE );
- assert( My_Connections[Idx].wdatalen > 0 );
+
+ /* sind ueberhaupt Daten vorhanden? */
+#ifdef USE_ZLIB
+ if(( ! My_Connections[Idx].wdatalen > 0 ) && ( ! My_Connections[Idx].zip.wdatalen )) return TRUE;
+#else
+ if( ! My_Connections[Idx].wdatalen > 0 ) return TRUE;
+#endif
/* Timeout initialisieren: 0 Sekunden, also nicht blockieren */
tv.tv_sec = 0; tv.tv_usec = 0;
if( s )
{
/* Sub-Prozess wurde asyncron gestartet */
+#ifndef STRICT_RFC
Conn_WriteStr( idx, "NOTICE AUTH :%sLooking up your hostname ...", NOTICE_TXTPREFIX );
+#endif
My_Connections[idx].res_stat = s;
}
* Tritt ein Fehler auf, so wird der Socket geschlossen. */
INT len, bsize;
+#ifdef USE_ZLIB
CLIENT *c;
+#endif
assert( Idx > NONE );
assert( My_Connections[Idx].sock > NONE );
strcpy( My_Connections[i].host, result );
Client_SetHostname( c, result );
+#ifndef STRICT_RFC
Conn_WriteStr( i, "NOTICE AUTH :%sGot your hostname.", NOTICE_TXTPREFIX );
+#endif
}
else
{