/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001 by Alexander Barton (alex@barton.de)
+ * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
*
* Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
* der GNU General Public License (GPL), wie von der Free Software Foundation
* herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
* der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
- * der an comBase beteiligten Autoren finden Sie in der Datei AUTHORS.
+ * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
- * $Id: ngircd.c,v 1.14 2001/12/30 19:26:12 alex Exp $
+ * $Id: ngircd.c,v 1.17 2002/01/02 02:51:16 alex Exp $
*
* ngircd.c: Hier beginnt alles ;-)
*
* $Log: ngircd.c,v $
+ * Revision 1.17 2002/01/02 02:51:16 alex
+ * - Signal-Handler fuer SIGCHLD: so sollten Zombies nicht mehr vorkommen.
+ *
+ * Revision 1.15 2001/12/31 02:18:51 alex
+ * - viele neue Befehle (WHOIS, ISON, OPER, DIE, RESTART),
+ * - neuen Header "defines.h" mit (fast) allen Konstanten.
+ * - Code Cleanups und viele "kleine" Aenderungen & Bugfixes.
+ *
* Revision 1.14 2001/12/30 19:26:12 alex
* - Unterstuetzung fuer die Konfigurationsdatei eingebaut.
*
#include <assert.h>
#include <stdio.h>
#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
#include <time.h>
#include "channel.h"
/* Datentypen der portab-Library ueberpruefen */
portab_check_types( );
- /* Globale Variablen initialisieren */
- NGIRCd_Start = time( NULL );
- strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
- NGIRCd_Quit = FALSE;
-
- /* Module initialisieren */
- Log_Init( );
- Conf_Init( );
- Parse_Init( );
- IRC_Init( );
- Channel_Init( );
- Client_Init( );
- Conn_Init( );
-
- /* Signal-Handler initialisieren */
- Initialize_Signal_Handler( );
-
- /* Listen-Ports initialisieren */
- Initialize_Listen_Ports( );
-
- /* Hauptschleife */
while( ! NGIRCd_Quit )
{
- Conn_Handler( 5 );
- }
-
- /* Alles abmelden */
- Conn_Exit( );
- Client_Exit( );
- Channel_Exit( );
- IRC_Exit( );
- Parse_Exit( );
- Conf_Exit( );
- Log_Exit( );
-
+ /* Globale Variablen initialisieren */
+ NGIRCd_Start = time( NULL );
+ strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
+ NGIRCd_Restart = FALSE;
+ NGIRCd_Quit = FALSE;
+
+ /* Module initialisieren */
+ Log_Init( );
+ Conf_Init( );
+ Parse_Init( );
+ IRC_Init( );
+ Channel_Init( );
+ Client_Init( );
+ Conn_Init( );
+
+ /* Signal-Handler initialisieren */
+ Initialize_Signal_Handler( );
+
+ /* Listen-Ports initialisieren */
+ Initialize_Listen_Ports( );
+
+ /* Hauptschleife */
+ while( TRUE )
+ {
+ if( NGIRCd_Quit || NGIRCd_Restart ) break;
+ Conn_Handler( 5 );
+ }
+
+ /* Alles abmelden */
+ Conn_Exit( );
+ Client_Exit( );
+ Channel_Exit( );
+ IRC_Exit( );
+ Parse_Exit( );
+ Conf_Exit( );
+ Log_Exit( );
+ }
return 0;
} /* main */
sigaction( SIGINT, &saction, NULL );
sigaction( SIGQUIT, &saction, NULL );
sigaction( SIGTERM, &saction, NULL);
+ sigaction( SIGCHLD, &saction, NULL);
/* einige Signale ignorieren */
saction.sa_handler = SIG_IGN;
Log( LOG_WARNING, "Got signal %d, terminating now ...", Signal );
NGIRCd_Quit = TRUE;
break;
+ case SIGCHLD:
+ /* Child-Prozess wurde beendet. Zombies vermeiden: */
+ while( waitpid( -1, NULL, WNOHANG ) > 0);
+ break;
default:
/* unbekanntes bzw. unbehandeltes Signal */
Log( LOG_NOTICE, "Got signal %d! Ignored.", Signal );