X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fngircd.c;h=20a35dbb0c399539bacb663b609ce42312ec34a4;hb=77f54693ef258b1fe65ee105fc026dfb2c6257dc;hp=f435c712d9bda13b8aab013516da80e4db6979d1;hpb=de395db8e3064919bbeaeb8344bf84f9566fb48b;p=ngircd-alex.git diff --git a/src/ngircd/ngircd.c b/src/ngircd/ngircd.c index f435c712..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.102 2005/06/24 19:55:10 alex 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.102 2005/06/24 19:55:10 alex 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.102 2005/06/24 19:55:10 alex 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. @@ -269,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( ); @@ -322,7 +321,7 @@ main( int argc, const char *argv[] ) /* Alles abmelden */ Conn_Exit( ); -#ifdef RENDEZVOUS +#ifdef ZEROCONF Rendezvous_Exit( ); #endif Client_Exit( ); @@ -342,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'; @@ -362,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] ) @@ -439,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." ); } @@ -459,7 +458,7 @@ NGIRCd_Rehash( void ) /** * Initialize the signal handler. */ -LOCAL void +static void Initialize_Signal_Handler( void ) { /* Signal-Handler initialisieren: einige Signale @@ -512,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 ) @@ -543,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 ); @@ -559,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 @@ -580,7 +579,7 @@ Show_Help( void ) /** * Delete the file containing the process ID (PID). */ -LOCAL void +static void Pidfile_Delete( void ) { /* Pidfile configured? */ @@ -599,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; @@ -636,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; @@ -661,7 +660,7 @@ Setup_FDStreams( void ) } /* Setup_FDStreams */ -LOCAL bool +static bool NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid ) { struct passwd *pwd; @@ -680,7 +679,7 @@ NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid ) } -LOCAL bool +static bool NGIRCd_Init( bool NGIRCd_NoDaemon ) { static bool initialized; @@ -712,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; @@ -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);