X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fngircd.c;h=20a35dbb0c399539bacb663b609ce42312ec34a4;hb=77f54693ef258b1fe65ee105fc026dfb2c6257dc;hp=41c823bcdbc0edcbec6035a08cb289dad81411a4;hpb=bc2dac3c74996fc1164e7b5d6dbf5ae79f6dbb59;p=ngircd-alex.git diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c index 41c823bc..20a35dbb 100644 --- a/src/ngircd/ngircd.c +++ b/src/ngircd/ngircd.c @@ -12,7 +12,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: ngircd.c,v 1.97 2005/06/17 18:22:45 fw Exp $"; +static char UNUSED id[] = "$Id: ngircd.c,v 1.108 2005/07/31 20:13:08 alex Exp $"; /** * @file @@ -48,7 +48,7 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.97 2005/06/17 18:22:45 fw Exp $"; #include "parse.h" #include "irc.h" -#ifdef RENDEZVOUS +#ifdef ZEROCONF #include "rendezvous.h" #endif @@ -56,20 +56,20 @@ static char UNUSED id[] = "$Id: ngircd.c,v 1.97 2005/06/17 18:22:45 fw Exp $"; #include "ngircd.h" -LOCAL void Initialize_Signal_Handler PARAMS(( void )); -LOCAL void Signal_Handler PARAMS(( int Signal )); +static void Initialize_Signal_Handler PARAMS(( void )); +static void Signal_Handler PARAMS(( int Signal )); -LOCAL void Show_Version PARAMS(( void )); -LOCAL void Show_Help PARAMS(( void )); +static void Show_Version PARAMS(( void )); +static void Show_Help PARAMS(( void )); -LOCAL void Pidfile_Create PARAMS(( long )); -LOCAL void Pidfile_Delete PARAMS(( void )); +static void Pidfile_Create PARAMS(( long )); +static void Pidfile_Delete PARAMS(( void )); -LOCAL void Fill_Version PARAMS(( void )); +static void Fill_Version PARAMS(( void )); -LOCAL void Setup_FDStreams PARAMS(( void )); +static void Setup_FDStreams PARAMS(( void )); -LOCAL bool NGIRCd_Init PARAMS(( bool )); +static bool NGIRCd_Init PARAMS(( bool )); /** * The main() function of ngIRCd. @@ -83,13 +83,14 @@ GLOBAL int main( int argc, const char *argv[] ) { bool ok, configtest = false; + bool NGIRCd_NoDaemon = false; int i; size_t n; umask( 0077 ); NGIRCd_SignalQuit = NGIRCd_SignalRestart = NGIRCd_SignalRehash = false; - NGIRCd_NoDaemon = NGIRCd_Passive = false; + NGIRCd_Passive = false; #ifdef DEBUG NGIRCd_Debug = false; #endif @@ -258,7 +259,7 @@ main( int argc, const char *argv[] ) NGIRCd_SignalQuit = false; /* Initialize modules, part I */ - Log_Init( ); + Log_Init( ! NGIRCd_NoDaemon ); Conf_Init( ); if (!NGIRCd_Init( NGIRCd_NoDaemon )) { @@ -268,11 +269,10 @@ main( int argc, const char *argv[] ) /* Initialize modules, part II: these functions are eventually * called with already dropped privileges ... */ - Resolve_Init( ); Lists_Init( ); Channel_Init( ); Client_Init( ); -#ifdef RENDEZVOUS +#ifdef ZEROCONF Rendezvous_Init( ); #endif Conn_Init( ); @@ -321,7 +321,7 @@ main( int argc, const char *argv[] ) /* Alles abmelden */ Conn_Exit( ); -#ifdef RENDEZVOUS +#ifdef ZEROCONF Rendezvous_Exit( ); #endif Client_Exit( ); @@ -341,7 +341,7 @@ main( int argc, const char *argv[] ) * further usage, for example by the IRC command VERSION and the --version * command line switch. */ -LOCAL void +static void Fill_Version( void ) { NGIRCd_VersionAddition[0] = '\0'; @@ -361,11 +361,11 @@ Fill_Version( void ) strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition ); #endif -#ifdef RENDEZVOUS +#ifdef ZEROCONF if( NGIRCd_VersionAddition[0] ) strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition ); - strlcat( NGIRCd_VersionAddition, "RENDEZVOUS", sizeof NGIRCd_VersionAddition ); + strlcat( NGIRCd_VersionAddition, "ZEROCONF", sizeof NGIRCd_VersionAddition ); #endif #ifdef IDENTAUTH if( NGIRCd_VersionAddition[0] ) @@ -438,7 +438,7 @@ NGIRCd_Rehash( void ) /* Recover old server name: it can't be changed during run-time */ if( strcmp( old_name, Conf_ServerName ) != 0 ) { - strcpy( Conf_ServerName, old_name ); + strlcpy( Conf_ServerName, old_name, sizeof Conf_ServerName ); Log( LOG_ERR, "Can't change \"ServerName\" on runtime! Ignored new name." ); } @@ -458,7 +458,7 @@ NGIRCd_Rehash( void ) /** * Initialize the signal handler. */ -LOCAL void +static void Initialize_Signal_Handler( void ) { /* Signal-Handler initialisieren: einige Signale @@ -511,7 +511,7 @@ Initialize_Signal_Handler( void ) * user and/or the system to it. For example SIGTERM and SIGHUP. * @param Signal Number of the signal to handle. */ -LOCAL void +static void Signal_Handler( int Signal ) { switch( Signal ) @@ -542,7 +542,7 @@ Signal_Handler( int Signal ) /** * Display copyright and version information of ngIRCd on the console. */ -LOCAL void +static void Show_Version( void ) { puts( NGIRCd_Version ); @@ -558,7 +558,7 @@ Show_Version( void ) * This help depends on the configuration of the executable and only shows * options that are actually enabled. */ -LOCAL void +static void Show_Help( void ) { #ifdef DEBUG @@ -579,7 +579,7 @@ Show_Help( void ) /** * Delete the file containing the process ID (PID). */ -LOCAL void +static void Pidfile_Delete( void ) { /* Pidfile configured? */ @@ -598,7 +598,7 @@ Pidfile_Delete( void ) * Create the file containing the process ID of ngIRCd ("PID file"). * @param pid The process ID to be stored in this file. */ -LOCAL void +static void Pidfile_Create( long pid ) { int pidfd; @@ -635,7 +635,7 @@ Pidfile_Create( long pid ) /** * Redirect stdin, stdout and stderr to apropriate file handles. */ -LOCAL void +static void Setup_FDStreams( void ) { int fd; @@ -660,7 +660,7 @@ Setup_FDStreams( void ) } /* Setup_FDStreams */ -LOCAL bool +static bool NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid ) { struct passwd *pwd; @@ -679,7 +679,7 @@ NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid ) } -LOCAL bool +static bool NGIRCd_Init( bool NGIRCd_NoDaemon ) { static bool initialized; @@ -711,28 +711,34 @@ NGIRCd_Init( bool NGIRCd_NoDaemon ) } } - if ( Conf_UID == 0 ) { - Log( LOG_INFO, "Conf_UID must not be 0, switching to user nobody", Conf_UID ); + if (Conf_UID == 0) { + Log(LOG_INFO, "ServerUID must not be 0, using \"nobody\" instead.", Conf_UID); - if (!NGIRCd_getNobodyID(&Conf_UID, &Conf_GID )) { - Log( LOG_WARNING, "Could not get uid/gid of user nobody: %s", + if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) { + Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s", errno ? strerror(errno) : "not found" ); return false; } } - if( setgid( Conf_GID ) != 0 ) { - real_errno = errno; - Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno )); - if (real_errno != EPERM) - return false; + if (getgid() != Conf_GID) { + /* Change group ID */ + if (setgid(Conf_GID) != 0) { + real_errno = errno; + Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno )); + if (real_errno != EPERM) + return false; + } } - if( setuid( Conf_UID ) != 0 ) { - real_errno = errno; - Log( LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror( errno )); - if (real_errno != EPERM) - return false; + if (getuid() != Conf_UID) { + /* Change user ID */ + if (setuid(Conf_UID) != 0) { + real_errno = errno; + Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno)); + if (real_errno != EPERM) + return false; + } } initialized = true; @@ -741,7 +747,6 @@ NGIRCd_Init( bool NGIRCd_NoDaemon ) * connected to ther controlling terminal. Use "--nodaemon" * to disable this "daemon mode" (useful for debugging). */ if ( ! NGIRCd_NoDaemon ) { - initialized = true; pid = (long)fork( ); if( pid > 0 ) { /* "Old" process: exit. */ @@ -765,16 +770,14 @@ NGIRCd_Init( bool NGIRCd_NoDaemon ) Pidfile_Create( pid ); - /* check uid we are running as, can be different from values configured (e.g. if we were already - started with a uid > 0 */ + /* Check UID/GID we are running as, can be different from values + * configured (e. g. if we were already started with a UID>0. */ Conf_UID = getuid(); Conf_GID = getgid(); - assert( Conf_GID > 0); - assert( Conf_UID > 0); - pwd = getpwuid( Conf_UID ); grp = getgrgid( Conf_GID ); + Log( LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.", pwd ? pwd->pw_name : "unknown", Conf_UID, grp ? grp->gr_name : "unknown", Conf_GID, pid); @@ -787,14 +790,16 @@ NGIRCd_Init( bool NGIRCd_NoDaemon ) } /* Change working directory to home directory of the user - * we are running as (when not running chroot()'ed!) */ + * we are running as (only when running in daemon mode and not in chroot) */ if ( pwd ) { - if( chdir( pwd->pw_dir ) == 0 ) - Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir ); - else - Log( LOG_ERR, "Can't change working directory to \"%s\": %s", - pwd->pw_dir, strerror( errno )); + if (!NGIRCd_NoDaemon ) { + if( chdir( pwd->pw_dir ) == 0 ) + Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir ); + else + Log( LOG_ERR, "Can't change working directory to \"%s\": %s", + pwd->pw_dir, strerror( errno )); + } } else { Log( LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID ); }