]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/ngircd.c
2023!
[ngircd-alex.git] / src / ngircd / ngircd.c
index 1b20597d8aa26cf7dbd0c2e490786ea910bab8d5..47f6092e25748b9e1844655dc0a08b3750768586 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2023 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
@@ -9,6 +9,7 @@
  * Please read the file COPYING, README and AUTHORS for more information.
  */
 
+#define GLOBAL_INIT
 #include "portab.h"
 
 /**
@@ -87,9 +88,7 @@ main(int argc, const char *argv[])
 
        NGIRCd_SignalQuit = NGIRCd_SignalRestart = false;
        NGIRCd_Passive = false;
-#ifdef DEBUG
        NGIRCd_Debug = false;
-#endif
 #ifdef SNIFFER
        NGIRCd_Sniffer = false;
 #endif
@@ -116,16 +115,14 @@ main(int argc, const char *argv[])
                                configtest = true;
                                ok = true;
                        }
-#ifdef DEBUG
                        if (strcmp(argv[i], "--debug") == 0) {
                                NGIRCd_Debug = true;
                                ok = true;
                        }
-#endif
                        if (strcmp(argv[i], "--help") == 0) {
                                Show_Version();
                                puts(""); Show_Help( ); puts( "" );
-                               exit(1);
+                               exit(0);
                        }
                        if (strcmp(argv[i], "--nodaemon") == 0) {
                                NGIRCd_NoDaemon = true;
@@ -143,19 +140,17 @@ main(int argc, const char *argv[])
 #endif
                        if (strcmp(argv[i], "--version") == 0) {
                                Show_Version();
-                               exit(1);
+                               exit(0);
                        }
                }
                else if(argv[i][0] == '-' && argv[i][1] != '-') {
                        /* short option */
                        for (n = 1; n < strlen(argv[i]); n++) {
                                ok = false;
-#ifdef DEBUG
                                if (argv[i][n] == 'd') {
                                        NGIRCd_Debug = true;
                                        ok = true;
                                }
-#endif
                                if (argv[i][n] == 'f') {
                                        if (!argv[i][n+1] && i+1 < argc) {
                                                /* Ok, next character is a blank */
@@ -200,30 +195,30 @@ main(int argc, const char *argv[])
                                }
 
                                if (!ok) {
-                                       printf("%s: invalid option \"-%c\"!\n",
-                                              PACKAGE_NAME, argv[i][n]);
-                                       printf("Try \"%s --help\" for more information.\n",
-                                              PACKAGE_NAME);
-                                       exit(1);
+                                       fprintf(stderr,
+                                               "%s: invalid option \"-%c\"!\n",
+                                               PACKAGE_NAME, argv[i][n]);
+                                       fprintf(stderr,
+                                               "Try \"%s --help\" for more information.\n",
+                                               PACKAGE_NAME);
+                                       exit(2);
                                }
                        }
 
                }
                if (!ok) {
-                       printf("%s: invalid option \"%s\"!\n",
-                              PACKAGE_NAME, argv[i]);
-                       printf("Try \"%s --help\" for more information.\n",
-                              PACKAGE_NAME);
-                       exit(1);
+                       fprintf(stderr, "%s: invalid option \"%s\"!\n",
+                               PACKAGE_NAME, argv[i]);
+                       fprintf(stderr, "Try \"%s --help\" for more information.\n",
+                               PACKAGE_NAME);
+                       exit(2);
                }
        }
 
        /* Debug level for "VERSION" command */
        NGIRCd_DebugLevel[0] = '\0';
-#ifdef DEBUG
        if (NGIRCd_Debug)
                strcpy(NGIRCd_DebugLevel, "1");
-#endif
 #ifdef SNIFFER
        if (NGIRCd_Sniffer) {
                NGIRCd_Debug = true;
@@ -246,26 +241,18 @@ main(int argc, const char *argv[])
                NGIRCd_SignalRestart = false;
                NGIRCd_SignalQuit = false;
 
-               /* Initialize modules, part I */
                Log_Init(!NGIRCd_NoDaemon);
                Random_Init();
                Conf_Init();
                Log_ReInit();
 
-               /* Initialize the "main program": chroot environment, user and
-                * group ID, ... */
+               /* Initialize the "main program":
+                * chroot environment, user and group ID, ... */
                if (!NGIRCd_Init(NGIRCd_NoDaemon)) {
                        Log(LOG_ALERT, "Fatal: Initialization failed, exiting!");
                        exit(1);
                }
 
-               /* Initialize modules, part II: these functions are eventually
-                * called with already dropped privileges ... */
-               Channel_Init();
-               Client_Init();
-               Conn_Init();
-               Class_Init();
-
                if (!io_library_init(CONNECTION_POOL)) {
                        Log(LOG_ALERT,
                            "Fatal: Could not initialize IO routines: %s",
@@ -280,6 +267,11 @@ main(int argc, const char *argv[])
                        exit(1);
                }
 
+               Channel_Init();
+               Conn_Init();
+               Class_Init();
+               Client_Init();
+
                /* Create protocol and server identification. The syntax
                 * used by ngIRCd in PASS commands and the known "extended
                 * flags" are described in doc/Protocol.txt. */
@@ -451,7 +443,7 @@ static void
 Show_Version( void )
 {
        puts( NGIRCd_Version );
-       puts( "Copyright (c)2001-2014 Alexander Barton (<alex@barton.de>) and Contributors." );
+       puts( "Copyright (c)2001-2023 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." );
@@ -466,9 +458,7 @@ Show_Version( void )
 static void
 Show_Help( void )
 {
-#ifdef DEBUG
        puts( "  -d, --debug        log extra debug messages" );
-#endif
        puts( "  -f, --config <f>   use file <f> as configuration file" );
        puts( "  -n, --nodaemon     don't fork and don't detach from controlling terminal" );
        puts( "  -p, --passive      disable automatic connections to other servers" );
@@ -490,9 +480,7 @@ Pidfile_Delete( void )
        /* Pidfile configured? */
        if( ! Conf_PidFile[0] ) return;
 
-#ifdef DEBUG
-       Log( LOG_DEBUG, "Removing PID file (%s) ...", Conf_PidFile );
-#endif
+       LogDebug( "Removing PID file (%s) ...", Conf_PidFile );
 
        if( unlink( Conf_PidFile ))
                Log( LOG_ERR, "Error unlinking PID file (%s): %s", Conf_PidFile, strerror( errno ));
@@ -514,9 +502,7 @@ Pidfile_Create(pid_t pid)
        /* Pidfile configured? */
        if( ! Conf_PidFile[0] ) return;
 
-#ifdef DEBUG
-       Log( LOG_DEBUG, "Creating PID file (%s) ...", Conf_PidFile );
-#endif
+       LogDebug( "Creating PID file (%s) ...", Conf_PidFile );
 
        pidfd = open( Conf_PidFile, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
        if ( pidfd < 0 ) {
@@ -530,7 +516,7 @@ Pidfile_Create(pid_t pid)
                close(pidfd);
                return;
        }
-       
+
        if (write(pidfd, pidbuf, (size_t)len) != (ssize_t)len)
                Log(LOG_ERR, "Can't write PID file (%s): %s!", Conf_PidFile,
                    strerror(errno));
@@ -721,9 +707,10 @@ NGIRCd_Init(bool NGIRCd_NoDaemon)
                        Log(LOG_ERR, "Can't change group ID to %s(%u): %s!",
                            grp ? grp->gr_name : "?", Conf_GID,
                            strerror(real_errno));
-                       if (real_errno != EPERM) 
+                       if (real_errno != EPERM)
                                goto out;
                }
+#ifdef HAVE_SETGROUPS
                if (setgroups(0, NULL) != 0) {
                        real_errno = errno;
                        Log(LOG_ERR, "Can't drop supplementary group IDs: %s!",
@@ -731,6 +718,10 @@ NGIRCd_Init(bool NGIRCd_NoDaemon)
                        if (real_errno != EPERM)
                                goto out;
                }
+#else
+               Log(LOG_WARNING,
+                   "Can't drop supplementary group IDs: setgroups(3) missing!");
+#endif
        }
 #endif
 
@@ -812,7 +803,7 @@ NGIRCd_Init(bool NGIRCd_NoDaemon)
 
        if (pwd) {
                if (chdir(pwd->pw_dir) == 0)
-                       Log(LOG_DEBUG,
+                       LogDebug(
                            "Changed working directory to \"%s\" ...",
                            pwd->pw_dir);
                else