/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2010 Alexander Barton (alex@barton.de).
+ * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
*
* 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
* Please read the file COPYING, README and AUTHORS for more information.
*/
-
#include "portab.h"
/**
#include "io.h"
#include "irc.h"
-#ifdef ZEROCONF
-#include "rendezvous.h"
-#endif
-
#include "exp.h"
#include "ngircd.h"
static void Fill_Version PARAMS(( void ));
+static void Random_Init PARAMS(( void ));
+
static void Setup_FDStreams PARAMS(( int fd ));
static bool NGIRCd_Init PARAMS(( bool ));
+
/**
* The main() function of ngIRCd.
+ *
* Here all starts: this function is called by the operating system loader,
* it is the first portion of code executed of ngIRCd.
- * @param argc The number of arguments passed to ngIRCd on the command line.
- * @param argv An array containing all the arguments passed to ngIRCd.
- * @return Global exit code of ngIRCd, zero on success.
+ *
+ * @param argc The number of arguments passed to ngIRCd on the command line.
+ * @param argv An array containing all the arguments passed to ngIRCd.
+ * @return Global exit code of ngIRCd, zero on success.
*/
GLOBAL int
main( int argc, const char *argv[] )
}
}
- /* Debug-Level (for IRCs "VERSION" command) */
+ /* Debug level for "VERSION" command */
NGIRCd_DebugLevel[0] = '\0';
#ifdef DEBUG
if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" );
NGIRCd_SignalRestart = false;
NGIRCd_SignalQuit = false;
+ Random_Init();
+
/* Initialize modules, part I */
Log_Init( ! NGIRCd_NoDaemon );
Conf_Init( );
* called with already dropped privileges ... */
Channel_Init( );
Client_Init( );
-#ifdef ZEROCONF
- Rendezvous_Init( );
-#endif
Conn_Init( );
-#ifdef DEBUG
- /* Redirect stderr handle to "error file" for debugging
- * when not running in "no daemon" mode: */
- if( ! NGIRCd_NoDaemon ) Log_InitErrorfile( );
-#endif
if (!io_library_init(CONNECTION_POOL)) {
Log(LOG_ALERT, "Fatal: Cannot initialize IO routines: %s", strerror(errno));
exit(1);
exit(1);
}
- /*
- * create protocol and server identification.
- * The syntax used by ngIRCd in PASS commands and the extended flags
- * are described in doc/Protocol.txt
- */
+ /* Create protocol and server identification. The syntax
+ * used by ngIRCd in PASS commands and the known "extended
+ * flags" are described in doc/Protocol.txt. */
#ifdef IRCPLUS
snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS );
#ifdef ZLIB
Pidfile_Delete( );
exit( 1 );
}
-
- /* Hauptschleife */
+
+ /* Main Run Loop */
Conn_Handler( );
- /* Alles abmelden */
Conn_Exit( );
-#ifdef ZEROCONF
- Rendezvous_Exit( );
-#endif
Client_Exit( );
Channel_Exit( );
Log_Exit( );
/**
- * Generate ngIRCd "version string".
- * This string is generated once and then stored in NGIRCd_Version for
- * further usage, for example by the IRC command VERSION and the --version
- * command line switch.
+ * Generate ngIRCd "version strings".
+ *
+ * The ngIRCd version information is generated once and then stored in the
+ * NGIRCd_Version and NGIRCd_VersionAddition string variables for further
+ * usage, for example by the IRC command "VERSION" and the --version command
+ * line switch.
*/
static void
Fill_Version( void )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
#endif
-#ifdef ZEROCONF
- if( NGIRCd_VersionAddition[0] )
- strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
- strlcat( NGIRCd_VersionAddition, "ZEROCONF", sizeof NGIRCd_VersionAddition );
-#endif
#ifdef IDENTAUTH
if( NGIRCd_VersionAddition[0] )
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
snprintf(NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s",
PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition);
- } /* Fill_Version */
+} /* Fill_Version */
/**
Show_Version( void )
{
puts( NGIRCd_Version );
- puts( "Copyright (c)2001-2010 Alexander Barton (<alex@barton.de>) and Contributors." );
+ puts( "Copyright (c)2001-2011 Alexander Barton (<alex@barton.de>) and Contributors." );
puts( "Homepage: <http://ngircd.barton.de/>\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." );
/**
* Create the file containing the process ID of ngIRCd ("PID file").
- * @param pid The process ID to be stored in this file.
+ *
+ * @param pid The process ID to be stored in this file.
*/
static void
Pidfile_Create(pid_t pid)
/**
* Redirect stdin, stdout and stderr to apropriate file handles.
+ *
+ * @param fd The file handle stdin, stdout and stderr should be redirected to.
*/
static void
Setup_FDStreams(int fd)
} /* Setup_FDStreams */
+/**
+ * Get user and group ID of unprivileged "nobody" user.
+ *
+ * @param uid User ID
+ * @param gid Group ID
+ * @return true on success.
+ */
static bool
NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
{
if ( !pwd->pw_uid || !pwd->pw_gid)
return false;
- *uid = pwd->pw_uid;
+ *uid = pwd->pw_uid;
*gid = pwd->pw_gid;
endpwent();
- return true;
+ return true;
+} /* NGIRCd_getNobodyID */
+
+
+static bool
+Random_Init_Kern(const char *file)
+{
+ unsigned int seed;
+ bool ret = false;
+ int fd = open(file, O_RDONLY);
+ if (fd >= 0) {
+ if (read(fd, &seed, sizeof(seed)) == sizeof(seed))
+ ret = true;
+ close(fd);
+ srandom(seed);
+ }
+ return ret;
+}
+
+/**
+ * Initialize libc random(3) number generator
+ */
+static void
+Random_Init(void)
+{
+ if (Random_Init_Kern("/dev/urandom"))
+ return;
+ if (Random_Init_Kern("/dev/random"))
+ return;
+ if (Random_Init_Kern("/dev/arandom"))
+ return;
+ srandom(random() ^ getpid() ^ time(NULL));
}
+/**
+ * Initialize ngIRCd daemon.
+ *
+ * @param NGIRCd_NoDaemon Set to true if ngIRCd should run in the
+ * foreground and not as a daemon.
+ * @return true on success.
+ */
static bool
NGIRCd_Init( bool NGIRCd_NoDaemon )
{
/* Detach stdin, stdout and stderr */
Setup_FDStreams(fd);
- if (fd > 2) {
+ if (fd > 2)
close(fd);
- fd = -1;
- }
}
pid = getpid();
if (fd > 2)
close(fd);
return false;
-}
+} /* NGIRCd_Init */
+
/* -eof- */