* 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")
*/
{
/* 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++ )
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? */
va_list ap;
assert( Idx >= 0 );
- assert( My_Connections[Idx].sock > NONE );
assert( Format != NULL );
#ifdef PROTOTYPES
* 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 )