X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconn.c;h=aeef7a3e00d5bb4c0314c138d3f1a5fbe1c3447f;hp=3e2ca2fad70198b96d3785d61ab9059408146eb7;hb=c50ecda71559f78b0548840f3ced3098b8896055;hpb=eab10c91b795af65bbeb9004354f9686a7bc49f1 diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index 3e2ca2fa..aeef7a3e 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.71 2002/09/07 21:35:06 alex Exp $ + * $Id: conn.c,v 1.73 2002/09/26 15:59:02 alex Exp $ * * connect.h: Verwaltung aller Netz-Verbindungen ("connections") */ @@ -289,6 +289,7 @@ Conn_Handler( VOID ) { /* Fuer die Verbindung ist eine "Penalty-Zeit" gesetzt */ FD_CLR( My_Connections[i].sock, &read_sockets ); + FD_CLR( My_Connections[i].sock, &write_sockets ); } } for( i = 0; i < Conn_MaxFD + 1; i++ ) @@ -305,15 +306,22 @@ Conn_Handler( VOID ) tv.tv_usec = 0; /* Auf Aktivitaet warten */ - if( select( Conn_MaxFD + 1, &read_sockets, &write_sockets, NULL, &tv ) == -1 ) + i = select( Conn_MaxFD + 1, &read_sockets, &write_sockets, NULL, &tv ); + if( i == 0 ) { + /* keine Veraenderung an den Sockets */ + continue; + } + if( i == -1 ) + { + /* Fehler (z.B. Interrupt) */ if( errno != EINTR ) { Log( LOG_EMERG, "select(): %s!", strerror( errno )); Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); exit( 1 ); } - if(( ! NGIRCd_Quit ) && ( ! NGIRCd_Restart )) continue; + continue; } /* Koennen Daten geschrieben werden? */ @@ -351,7 +359,6 @@ va_dcl va_list ap; assert( Idx >= 0 ); - assert( My_Connections[Idx].sock > NONE ); assert( Format != NULL ); #ifdef PROTOTYPES @@ -385,10 +392,20 @@ Conn_Write( CONN_ID Idx, CHAR *Data, INT Len ) * der Client disconnectiert und FALSE geliefert. */ assert( Idx >= 0 ); - assert( My_Connections[Idx].sock > NONE ); assert( Data != NULL ); assert( Len > 0 ); + /* Ist der entsprechende Socket ueberhaupt noch offen? + * In einem "Handler-Durchlauf" kann es passieren, dass + * dem nicht mehr so ist, wenn einer von mehreren + * Conn_Write()'s fehlgeschlagen ist. In diesem Fall + * wird hier einfach ein Fehler geliefert. */ + if( ! My_Connections[Idx].sock > NONE ) + { + Log( LOG_DEBUG, "Skipped write on closed socket (connection %d).", Idx ); + return FALSE; + } + /* pruefen, ob Daten im Schreibpuffer sind. Wenn ja, zunaechst * pruefen, ob diese gesendet werden koennen */ if( My_Connections[Idx].wdatalen > 0 )