]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/ngircd.c
Add documentation for "ScrubCTCP" configuration option
[ngircd-alex.git] / src / ngircd / ngircd.c
index 63fc64bf2ef2ac6a34ff847bb9f59ad7d1b036d8..58383cfaac51924b6782be3d7a08bf7a96a1056e 100644 (file)
@@ -9,7 +9,6 @@
  * 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"
 
@@ -65,6 +60,8 @@ static void Pidfile_Delete PARAMS(( void ));
 
 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 ));
@@ -72,11 +69,13 @@ 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[] )
@@ -237,7 +236,7 @@ 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" );
@@ -265,6 +264,8 @@ main( int argc, const char *argv[] )
                NGIRCd_SignalRestart = false;
                NGIRCd_SignalQuit = false;
 
+               Random_Init();
+
                /* Initialize modules, part I */
                Log_Init( ! NGIRCd_NoDaemon );
                Conf_Init( );
@@ -280,9 +281,6 @@ main( int argc, const char *argv[] )
                 * called with already dropped privileges ... */
                Channel_Init( );
                Client_Init( );
-#ifdef ZEROCONF
-               Rendezvous_Init( );
-#endif
                Conn_Init( );
 
                if (!io_library_init(CONNECTION_POOL)) {
@@ -295,11 +293,9 @@ main( int argc, const char *argv[] )
                        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
@@ -324,15 +320,11 @@ main( int argc, const char *argv[] )
                        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( );
@@ -344,10 +336,12 @@ main( int argc, const char *argv[] )
 
 
 /**
- * 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 )
@@ -371,11 +365,6 @@ 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 );
@@ -422,7 +411,7 @@ Fill_Version( void )
 
        snprintf(NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s",
                 PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition);
-       } /* Fill_Version */
+} /* Fill_Version */
 
 
 /**
@@ -482,7 +471,8 @@ 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.
+ *
+ * @param pid  The process ID to be stored in this file.
  */
 static void
 Pidfile_Create(pid_t pid)
@@ -520,6 +510,8 @@ 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)
@@ -535,6 +527,13 @@ 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 )
 {
@@ -559,14 +558,52 @@ 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 ) 
 {
@@ -669,10 +706,8 @@ 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();
 
@@ -717,7 +752,7 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
        if (fd > 2)
                close(fd);
        return false;
-}
+} /* NGIRCd_Init */
 
 
 /* -eof- */