]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/conn.c
- Conn_Write() prueft nun, ob der Socket noch offen ist, ehe Daten gesendet werden.
[ngircd-alex.git] / src / ngircd / conn.c
index 3e2ca2fad70198b96d3785d61ab9059408146eb7..aeef7a3e00d5bb4c0314c138d3f1a5fbe1c3447f 100644 (file)
@@ -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 )