X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fngircd.c;h=e800117948347d4c61d3c118f22405303042da7d;hb=0f3e84f4154676dc05a09bd0b1ad9d3d43574d48;hp=37cc97fc5d97fe71809f292cd06af1c3393efc59;hpb=e311cc0140b2edff3927ce9b2117d328735445ec;p=ngircd-alex.git diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c index 37cc97fc..e8001179 100644 --- a/src/ngircd/ngircd.c +++ b/src/ngircd/ngircd.c @@ -1,22 +1,21 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2003 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 ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: ngircd.c,v 1.60 2002/11/22 17:59:43 alex Exp $ - * - * ngircd.c: Hier beginnt alles ;-) + * Main program -- main() */ #include "portab.h" +static char UNUSED id[] = "$Id: ngircd.c,v 1.71 2003/01/01 13:32:23 alex Exp $"; + #include "imp.h" #include #include @@ -66,17 +65,16 @@ main( int argc, const char *argv[] ) umask( 0077 ); - NGIRCd_Restart = FALSE; - NGIRCd_Quit = FALSE; - NGIRCd_NoDaemon = FALSE; - NGIRCd_Passive = FALSE; + NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = FALSE; + NGIRCd_NoDaemon = NGIRCd_Passive = FALSE; #ifdef DEBUG NGIRCd_Debug = FALSE; #endif #ifdef SNIFFER NGIRCd_Sniffer = FALSE; #endif - strcpy( NGIRCd_ConfFile, CONFIG_FILE ); + strlcpy( NGIRCd_ConfFile, SYSCONFDIR, sizeof( NGIRCd_ConfFile )); + strlcat( NGIRCd_ConfFile, CONFIG_FILE, sizeof( NGIRCd_ConfFile )); /* Kommandozeile parsen */ for( i = 1; i < argc; i++ ) @@ -90,11 +88,10 @@ main( int argc, const char *argv[] ) { if( i + 1 < argc ) { - /* Ok, danach kommt noch ein Parameter */ - strncpy( NGIRCd_ConfFile, argv[i + 1], FNAME_LEN - 1 ); - NGIRCd_ConfFile[FNAME_LEN - 1] = '\0'; + /* Ok, there's an parameter left */ + strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile )); - /* zum uebernaechsten Parameter */ + /* next parameter */ i++; ok = TRUE; } } @@ -157,11 +154,10 @@ main( int argc, const char *argv[] ) { if(( ! argv[i][n + 1] ) && ( i + 1 < argc )) { - /* Ok, danach kommt ein Leerzeichen */ - strncpy( NGIRCd_ConfFile, argv[i + 1], FNAME_LEN - 1 ); - NGIRCd_ConfFile[FNAME_LEN - 1] = '\0'; + /* Ok, next character is a blank */ + strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile )); - /* zum uebernaechsten Parameter */ + /* go to the following parameter */ i++; n = (LONG)strlen( argv[i] ); ok = TRUE; } @@ -221,7 +217,7 @@ main( int argc, const char *argv[] ) exit( Conf_Test( )); } - while( ! NGIRCd_Quit ) + while( ! NGIRCd_SignalQuit ) { /* In der Regel wird ein Sub-Prozess ge-fork()'t, der * nicht mehr mit dem Terminal verbunden ist. Mit der @@ -251,8 +247,9 @@ main( int argc, const char *argv[] ) /* Globale Variablen initialisieren */ NGIRCd_Start = time( NULL ); (VOID)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start )); - NGIRCd_Restart = FALSE; - NGIRCd_Quit = FALSE; + NGIRCd_SignalRehash = FALSE; + NGIRCd_SignalRestart = FALSE; + NGIRCd_SignalQuit = FALSE; /* Module initialisieren */ Log_Init( ); @@ -294,11 +291,17 @@ main( int argc, const char *argv[] ) * sind in doc/Protocol.txt beschrieben. */ #ifdef IRCPLUS sprintf( NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE, VERSION, IRCPLUSFLAGS ); +#ifdef USE_ZLIB + strcat( NGIRCd_ProtoID, "Z" ); +#endif if( Conf_OperCanMode ) strcat( NGIRCd_ProtoID, "o" ); #else sprintf( NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE, VERSION ); #endif strcat( NGIRCd_ProtoID, " P" ); +#ifdef USE_ZLIB + strcat( NGIRCd_ProtoID, "Z" ); +#endif Log( LOG_DEBUG, "Protocol and server ID is \"%s\".", NGIRCd_ProtoID ); /* Vordefinierte Channels anlegen */ @@ -352,6 +355,10 @@ NGIRCd_VersionAddition( VOID ) if( txt[0] ) strcat( txt, "+" ); strcat( txt, "SYSLOG" ); #endif +#ifdef USE_ZLIB + if( txt[0] ) strcat( txt, "+" ); + strcat( txt, "ZLIB" ); +#endif #ifdef DEBUG if( txt[0] ) strcat( txt, "+" ); strcat( txt, "DEBUG" ); @@ -369,30 +376,34 @@ NGIRCd_VersionAddition( VOID ) strcat( txt, "IRCPLUS" ); #endif - if( txt[0] ) strcat( txt, "-" ); - strcat( txt, TARGET_CPU ); - strcat( txt, "/" ); - strcat( txt, TARGET_VENDOR ); - strcat( txt, "/" ); - strcat( txt, TARGET_OS ); + if( txt[0] ) strlcat( txt, "-", sizeof( txt )); + strlcat( txt, TARGET_CPU, sizeof( txt )); + strlcat( txt, "/", sizeof( txt )); + strlcat( txt, TARGET_VENDOR, sizeof( txt )); + strlcat( txt, "/", sizeof( txt )); + strlcat( txt, TARGET_OS, sizeof( txt )); return txt; } /* NGIRCd_VersionAddition */ GLOBAL VOID -NGIRCd_Reload( VOID ) +NGIRCd_Rehash( VOID ) { CHAR old_name[CLIENT_ID_LEN]; - + + Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" ); + NGIRCd_SignalRehash = FALSE; + /* Alle Listen-Sockets schliessen */ Conn_ExitListeners( ); /* Alten Server-Namen merken */ + assert( sizeof( old_name ) == sizeof( Conf_ServerName )); strcpy( old_name, Conf_ServerName ); /* Konfiguration neu lesen ... */ - Conf_Init( ); + Conf_Rehash( ); /* Alten Server-Namen wiederherstellen: dieser * kann nicht zur Laufzeit geaendert werden ... */ @@ -408,8 +419,8 @@ NGIRCd_Reload( VOID ) /* Listen-Sockets neu anlegen: */ Conn_InitListeners( ); - Log( LOG_INFO, "Re-reading of configuration done." ); -} /* NGIRCd_Reload */ + Log( LOG_NOTICE|LOG_snotice, "Re-reading of configuration done." ); +} /* NGIRCd_Rehash */ LOCAL VOID @@ -472,23 +483,21 @@ Signal_Handler( INT Signal ) case SIGINT: case SIGQUIT: /* wir soll(t)en uns wohl beenden ... */ - if( Signal == SIGTERM ) Log( LOG_WARNING|LOG_snotice, "Got TERM signal, terminating now ..." ); - else if( Signal == SIGINT ) Log( LOG_WARNING|LOG_snotice, "Got INT signal, terminating now ..." ); - else if( Signal == SIGQUIT ) Log( LOG_WARNING|LOG_snotice, "Got QUIT signal, terminating now ..." ); - NGIRCd_Quit = TRUE; + NGIRCd_SignalQuit = TRUE; break; case SIGHUP: /* Konfiguration neu einlesen: */ - Log( LOG_WARNING|LOG_snotice, "Got HUP signal, re-reading configuration ..." ); - NGIRCd_Reload( ); + NGIRCd_SignalRehash = TRUE; break; case SIGCHLD: /* Child-Prozess wurde beendet. Zombies vermeiden: */ while( waitpid( -1, NULL, WNOHANG ) > 0); break; +#ifdef DEBUG default: /* unbekanntes bzw. unbehandeltes Signal */ - Log( LOG_NOTICE, "Got signal %d! Ignored.", Signal ); + Log( LOG_DEBUG, "Got signal %d! Ignored.", Signal ); +#endif } } /* Signal_Handler */ @@ -497,7 +506,7 @@ LOCAL VOID Show_Version( VOID ) { puts( NGIRCd_Version( )); - puts( "Copyright (c)2001,2002 by Alexander Barton ()." ); + puts( "Copyright (c)2001-2003 by Alexander Barton ()." ); puts( "Homepage: \n" ); puts( "This is free software; see the source for copying conditions. There is NO" ); puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );