#include "portab.h"
-static char UNUSED id[] = "$Id: ngircd.c,v 1.101 2005/06/24 19:20:56 fw Exp $";
+static char UNUSED id[] = "$Id: ngircd.c,v 1.109 2005/08/25 08:48:43 alex Exp $";
/**
* @file
#include "parse.h"
#include "irc.h"
-#ifdef RENDEZVOUS
+#ifdef ZEROCONF
#include "rendezvous.h"
#endif
#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.
NGIRCd_SignalQuit = false;
/* Initialize modules, part I */
- Log_Init( );
+ Log_Init( ! NGIRCd_NoDaemon );
Conf_Init( );
- if (!NGIRCd_Init( NGIRCd_NoDaemon )) {
- Log(LOG_WARNING, "Fatal: Initialization failed");
+ /* Initialize the "main program": chroot environment, user and
+ * group ID, ... */
+ if (!NGIRCd_Init(NGIRCd_NoDaemon)) {
+ Log(LOG_ALERT, "Fatal: Initialization failed");
exit(1);
}
/* 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( );
/* Alles abmelden */
Conn_Exit( );
-#ifdef RENDEZVOUS
+#ifdef ZEROCONF
Rendezvous_Exit( );
#endif
Client_Exit( );
* 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';
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] )
/* 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." );
}
/**
* Initialize the signal handler.
*/
-LOCAL void
+static void
Initialize_Signal_Handler( void )
{
/* Signal-Handler initialisieren: einige Signale
* 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 )
/**
* Display copyright and version information of ngIRCd on the console.
*/
-LOCAL void
+static void
Show_Version( void )
{
puts( NGIRCd_Version );
* 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
/**
* Delete the file containing the process ID (PID).
*/
-LOCAL void
+static void
Pidfile_Delete( void )
{
/* Pidfile configured? */
* 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;
/**
* Redirect stdin, stdout and stderr to apropriate file handles.
*/
-LOCAL void
+static void
Setup_FDStreams( void )
{
int fd;
} /* Setup_FDStreams */
-LOCAL bool
+static bool
NGIRCd_getNobodyID(unsigned int *uid, unsigned int *gid )
{
struct passwd *pwd;
}
-LOCAL bool
+static bool
NGIRCd_Init( bool NGIRCd_NoDaemon )
{
static bool initialized;
}
}
- 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;
* connected to ther controlling terminal. Use "--nodaemon"
* to disable this "daemon mode" (useful for debugging). */
if ( ! NGIRCd_NoDaemon ) {
- initialized = true;
- Log_SetDaemonized();
pid = (long)fork( );
if( pid > 0 ) {
/* "Old" process: exit. */
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);