X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fngircd.c;h=31f08eeede2e60c80bc366619baab2745ccd4866;hb=9f247ebd5a9b424ae9e6c10ba31dcb4b7190b1f8;hp=191c216a1ac0df60fe38362338328c82e6500250;hpb=894cd2cd685ef17029c260c96801d082c71aac11;p=ngircd-alex.git diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c index 191c216a..31f08eee 100644 --- a/src/ngircd/ngircd.c +++ b/src/ngircd/ngircd.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: ngircd.c,v 1.90 2005/02/09 09:52:58 alex Exp $"; +static char UNUSED id[] = "$Id: ngircd.c,v 1.95 2005/03/19 18:43:49 fw Exp $"; #include "imp.h" #include @@ -28,6 +28,7 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.90 2005/02/09 09:52:58 alex Exp $"; #include #include #include +#include #include #include @@ -51,16 +52,18 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.90 2005/02/09 09:52:58 alex Exp $"; #include "ngircd.h" -LOCAL VOID Initialize_Signal_Handler PARAMS(( VOID )); -LOCAL VOID Signal_Handler PARAMS(( INT Signal )); +LOCAL void Initialize_Signal_Handler PARAMS(( void )); +LOCAL void Signal_Handler PARAMS(( int Signal )); -LOCAL VOID Show_Version PARAMS(( VOID )); -LOCAL VOID Show_Help PARAMS(( VOID )); +LOCAL void Show_Version PARAMS(( void )); +LOCAL void Show_Help PARAMS(( void )); -LOCAL VOID Pidfile_Create PARAMS(( LONG )); -LOCAL VOID Pidfile_Delete PARAMS(( VOID )); +LOCAL void Pidfile_Create PARAMS(( long )); +LOCAL void Pidfile_Delete PARAMS(( void )); -LOCAL VOID NGIRCd_FillVersion PARAMS(( VOID )); +LOCAL void Fill_Version PARAMS(( void )); + +LOCAL void Setup_FDStreams PARAMS(( void )); GLOBAL int @@ -68,29 +71,30 @@ main( int argc, const char *argv[] ) { struct passwd *pwd; struct group *grp; - BOOLEAN ok, configtest = FALSE; - LONG pid, n; - INT i; + bool ok, configtest = false; + long pid; + int i; + size_t n; umask( 0077 ); - NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = FALSE; - NGIRCd_NoDaemon = NGIRCd_Passive = FALSE; + NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = false; + NGIRCd_NoDaemon = NGIRCd_Passive = false; #ifdef DEBUG - NGIRCd_Debug = FALSE; + NGIRCd_Debug = false; #endif #ifdef SNIFFER - NGIRCd_Sniffer = FALSE; + NGIRCd_Sniffer = false; #endif strlcpy( NGIRCd_ConfFile, SYSCONFDIR, sizeof( NGIRCd_ConfFile )); strlcat( NGIRCd_ConfFile, CONFIG_FILE, sizeof( NGIRCd_ConfFile )); - NGIRCd_FillVersion( ); + Fill_Version( ); /* Kommandozeile parsen */ for( i = 1; i < argc; i++ ) { - ok = FALSE; + ok = false; if(( argv[i][0] == '-' ) && ( argv[i][1] == '-' )) { /* Lange Option */ @@ -103,19 +107,19 @@ main( int argc, const char *argv[] ) strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile )); /* next parameter */ - i++; ok = TRUE; + i++; ok = true; } } if( strcmp( argv[i], "--configtest" ) == 0 ) { - configtest = TRUE; - ok = TRUE; + configtest = true; + ok = true; } #ifdef DEBUG if( strcmp( argv[i], "--debug" ) == 0 ) { - NGIRCd_Debug = TRUE; - ok = TRUE; + NGIRCd_Debug = true; + ok = true; } #endif if( strcmp( argv[i], "--help" ) == 0 ) @@ -126,19 +130,19 @@ main( int argc, const char *argv[] ) } if( strcmp( argv[i], "--nodaemon" ) == 0 ) { - NGIRCd_NoDaemon = TRUE; - ok = TRUE; + NGIRCd_NoDaemon = true; + ok = true; } if( strcmp( argv[i], "--passive" ) == 0 ) { - NGIRCd_Passive = TRUE; - ok = TRUE; + NGIRCd_Passive = true; + ok = true; } #ifdef SNIFFER if( strcmp( argv[i], "--sniffer" ) == 0 ) { - NGIRCd_Sniffer = TRUE; - ok = TRUE; + NGIRCd_Sniffer = true; + ok = true; } #endif if( strcmp( argv[i], "--version" ) == 0 ) @@ -150,15 +154,14 @@ main( int argc, const char *argv[] ) else if(( argv[i][0] == '-' ) && ( argv[i][1] != '-' )) { /* Kurze Option */ - - for( n = 1; n < (LONG)strlen( argv[i] ); n++ ) + for( n = 1; n < strlen( argv[i] ); n++ ) { - ok = FALSE; + ok = false; #ifdef DEBUG if( argv[i][n] == 'd' ) { - NGIRCd_Debug = TRUE; - ok = TRUE; + NGIRCd_Debug = true; + ok = true; } #endif if( argv[i][n] == 'f' ) @@ -169,31 +172,32 @@ main( int argc, const char *argv[] ) strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile )); /* go to the following parameter */ - i++; n = (LONG)strlen( argv[i] ); - ok = TRUE; + i++; + n = strlen( argv[i] ); + ok = true; } } if( argv[i][n] == 'n' ) { - NGIRCd_NoDaemon = TRUE; - ok = TRUE; + NGIRCd_NoDaemon = true; + ok = true; } if( argv[i][n] == 'p' ) { - NGIRCd_Passive = TRUE; - ok = TRUE; + NGIRCd_Passive = true; + ok = true; } #ifdef SNIFFER if( argv[i][n] == 's' ) { - NGIRCd_Sniffer = TRUE; - ok = TRUE; + NGIRCd_Sniffer = true; + ok = true; } #endif if( argv[i][n] == 't' ) { - configtest = TRUE; - ok = TRUE; + configtest = true; + ok = true; } if( ! ok ) @@ -221,7 +225,7 @@ main( int argc, const char *argv[] ) #ifdef SNIFFER if( NGIRCd_Sniffer ) { - NGIRCd_Debug = TRUE; + NGIRCd_Debug = true; strcpy( NGIRCd_DebugLevel, "2" ); } #endif @@ -237,11 +241,11 @@ main( int argc, const char *argv[] ) { /* Initialize global variables */ NGIRCd_Start = time( NULL ); - (VOID)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start )); + (void)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start )); - NGIRCd_SignalRehash = FALSE; - NGIRCd_SignalRestart = FALSE; - NGIRCd_SignalQuit = FALSE; + NGIRCd_SignalRehash = false; + NGIRCd_SignalRestart = false; + NGIRCd_SignalQuit = false; /* Initialize modules, part I */ Log_Init( ); @@ -267,38 +271,40 @@ main( int argc, const char *argv[] ) if( setuid( Conf_UID ) != 0 ) Log( LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror( errno )); } - /* In der Regel wird ein Sub-Prozess ge-fork()'t, der - * nicht mehr mit dem Terminal verbunden ist. Mit der - * Option "--nodaemon" kann dies (z.B. zum Debuggen) - * verhindert werden. */ + /* Normally a child process is forked which isn't any longer + * connected to ther controlling terminal. Use "--nodaemon" + * to disable this "daemon mode" (useful for debugging). */ if( ! NGIRCd_NoDaemon ) { - /* Daemon im Hintergrund erzeugen */ - pid = (LONG)fork( ); + /* fork child process */ + pid = (long)fork( ); if( pid > 0 ) { - /* "alter" Prozess */ + /* "Old" process: exit. */ exit( 0 ); } if( pid < 0 ) { - /* Fehler */ - printf( "%s: Can't fork: %s!\nFatal error, exiting now ...\n", PACKAGE_NAME, strerror( errno )); + /* Error!? */ + fprintf( stderr, "%s: Can't fork: %s!\nFatal error, exiting now ...\n", PACKAGE_NAME, strerror( errno )); exit( 1 ); } - /* Child-Prozess initialisieren */ - (VOID)setsid( ); + /* New child process */ + (void)setsid( ); chdir( "/" ); + + /* Detach stdin, stdout and stderr */ + Setup_FDStreams( ); } /* Create PID file */ - pid = (LONG) getpid( ); + pid = (long) getpid( ); Pidfile_Create( pid ); /* Show user, group, and PID of the running daemon */ pwd = getpwuid( getuid( )); grp = getgrgid( getgid( )); - Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", (LONG)getuid( ), grp ? grp->gr_name : "unknown", (LONG)getgid( ), pid); + Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", (long)getuid( ), grp ? grp->gr_name : "unknown", (long)getgid( ), pid); /* Change working directory to home directory of the user * we are running as (when not running chroot()'ed!) */ @@ -326,11 +332,11 @@ main( int argc, const char *argv[] ) #endif Conn_Init( ); - /* Redirect stderr handle to "error file" for debugging. - * But don't try to write in the chroot jail, since it's more - * secure to have a chroot dir not writable by the daemon. - */ - if( ! Conf_Chroot[0] ) Log_InitErrorfile( ); +#ifdef DEBUG + /* Redirect stderr handle to "error file" for debugging + * when not running in "no daemon" mode: */ + if( ! NGIRCd_NoDaemon ) Log_InitErrorfile( ); +#endif /* Signal-Handler initialisieren */ Initialize_Signal_Handler( ); @@ -385,8 +391,8 @@ main( int argc, const char *argv[] ) } /* main */ -LOCAL VOID -NGIRCd_FillVersion( VOID ) +LOCAL void +Fill_Version( void ) { NGIRCd_VersionAddition[0] = '\0'; @@ -438,16 +444,16 @@ NGIRCd_FillVersion( VOID ) #else snprintf( NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s", PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition); #endif -} /* NGIRCd_FillVersion */ +} /* Fill_Version */ -GLOBAL VOID -NGIRCd_Rehash( VOID ) +GLOBAL void +NGIRCd_Rehash( void ) { - CHAR old_name[CLIENT_ID_LEN]; + char old_name[CLIENT_ID_LEN]; Log( LOG_NOTICE|LOG_snotice, "Re-reading configuration NOW!" ); - NGIRCd_SignalRehash = FALSE; + NGIRCd_SignalRehash = false; /* Close down all listening sockets */ Conn_ExitListeners( ); @@ -478,8 +484,8 @@ NGIRCd_Rehash( VOID ) } /* NGIRCd_Rehash */ -LOCAL VOID -Initialize_Signal_Handler( VOID ) +LOCAL void +Initialize_Signal_Handler( void ) { /* Signal-Handler initialisieren: einige Signale * werden ignoriert, andere speziell behandelt. */ @@ -525,8 +531,8 @@ Initialize_Signal_Handler( VOID ) } /* Initialize_Signal_Handler */ -LOCAL VOID -Signal_Handler( INT Signal ) +LOCAL void +Signal_Handler( int Signal ) { /* Signal-Handler. Dieser wird aufgerufen, wenn eines der Signale eintrifft, * fuer das wir uns registriert haben (vgl. Initialize_Signal_Handler). Die @@ -538,11 +544,11 @@ Signal_Handler( INT Signal ) case SIGINT: case SIGQUIT: /* wir soll(t)en uns wohl beenden ... */ - NGIRCd_SignalQuit = TRUE; + NGIRCd_SignalQuit = true; break; case SIGHUP: /* Konfiguration neu einlesen: */ - NGIRCd_SignalRehash = TRUE; + NGIRCd_SignalRehash = true; break; case SIGCHLD: /* Child-Prozess wurde beendet. Zombies vermeiden: */ @@ -557,8 +563,8 @@ Signal_Handler( INT Signal ) } /* Signal_Handler */ -LOCAL VOID -Show_Version( VOID ) +LOCAL void +Show_Version( void ) { puts( NGIRCd_Version ); puts( "Copyright (c)2001-2005 by Alexander Barton ()." ); @@ -568,15 +574,15 @@ Show_Version( VOID ) } /* Show_Version */ -LOCAL VOID -Show_Help( VOID ) +LOCAL void +Show_Help( void ) { #ifdef DEBUG puts( " -d, --debug log extra debug messages" ); #endif puts( " -f, --config use file as configuration file" ); - puts( " -n, --nodaemon don't fork and don't detach from controlling terminal" ); - puts( " -p, --passive disable automatic connections to other servers" ); + puts( " -n, --nodaemon don't fork and don't detach from controlling terminal" ); + puts( " -p, --passive disable automatic connections to other servers" ); #ifdef SNIFFER puts( " -s, --sniffer enable network sniffer and display all IRC traffic" ); #endif @@ -586,8 +592,8 @@ Show_Help( VOID ) } /* Show_Help */ -LOCAL VOID -Pidfile_Delete( VOID ) +LOCAL void +Pidfile_Delete( void ) { /* Pidfile configured? */ if( ! Conf_PidFile[0] ) return; @@ -601,8 +607,8 @@ Pidfile_Delete( VOID ) } /* Pidfile_Delete */ -LOCAL VOID -Pidfile_Create( LONG pid ) +LOCAL void +Pidfile_Create( long pid ) { FILE *pidf; @@ -629,4 +635,26 @@ Pidfile_Create( LONG pid ) } /* Pidfile_Create */ +LOCAL void +Setup_FDStreams( void ) +{ + int fd; + + /* Test if we can open /dev/null for reading and writing. If not + * we are most probably chrooted already and the server has been + * restarted. So we simply don't try to redirect stdXXX ... */ + fd = open( "/dev/null", O_RDWR ); + if ( fd < 0 ) return; + + /* Close "old" stdin/out/err descriptors */ + close( 0 ); close( 1 ); close( 2 ); + + /* Create new stdin(0), stdout(1) and stderr(2) descriptors */ + dup2( fd, 0 ); dup2( fd, 1 ); dup2( fd, 2 ); + + /* Close newly opened file descriptor if not stdin/out/err */ + if( fd > 2 ) close( fd ); +} /* Setup_FDStreams */ + + /* -eof- */