]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Convert the ISO 8859-2 nationalchars files to codepage configs.
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 8cc1dd8787d0f38458d1bf4f038394ab416284a7..56b8178d235b733bb6c289b434d6b253c2a4a9a9 100644 (file)
@@ -1,20 +1,21 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2020 Matt Schatz <genius3000@g3k.solutions>
  *   Copyright (C) 2018 Chris Novakovic <chrisnovakovic@users.noreply.github.com>
- *   Copyright (C) 2013, 2017-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013, 2017-2021 Sadie Powell <sadie@witchery.services>
  *   Copyright (C) 2013 Adam <Adam@anope.org>
  *   Copyright (C) 2012-2014, 2016, 2018 Attila Molnar <attilamolnar@hush.com>
- *   Copyright (C) 2012 William Pitcock <nenolod@dereferenced.org>
+ *   Copyright (C) 2012-2013 ChrisTX <xpipe@hotmail.de>
  *   Copyright (C) 2012 Robby <robby@chatbelgie.be>
- *   Copyright (C) 2012 ChrisTX <xpipe@hotmail.de>
+ *   Copyright (C) 2012 Ariadne Conill <ariadne@dereferenced.org>
  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
- *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
+ *   Copyright (C) 2008-2009 Uli Schlachter <psychon@inspircd.org>
  *   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
- *   Copyright (C) 2007-2008, 2010 Craig Edwards <brain@inspircd.org>
  *   Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
- *   Copyright (C) 2007 Oliver Lupton <om@inspircd.org>
  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ *   Copyright (C) 2006-2007 Oliver Lupton <om@inspircd.org>
+ *   Copyright (C) 2005-2010 Craig Edwards <brain@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 #ifndef _WIN32
        #include <unistd.h>
        #include <sys/resource.h>
-       #include <dlfcn.h>
        #include <getopt.h>
        #include <pwd.h> // setuid
        #include <grp.h> // setgid
 #else
-       WORD g_wOriginalColors;
-       WORD g_wBackgroundColor;
-       HANDLE g_hStdout;
+       /** Manages formatting lines written to stderr on Windows. */
+       WindowsStream StandardError(STD_ERROR_HANDLE);
+
+       /** Manages formatting lines written to stdout on Windows. */
+       WindowsStream StandardOutput(STD_OUTPUT_HANDLE);
 #endif
 
 #include <fstream>
@@ -53,7 +55,7 @@
 
 InspIRCd* ServerInstance = NULL;
 
-/** Seperate from the other casemap tables so that code *can* still exclusively rely on RFC casemapping
+/** Separate from the other casemap tables so that code *can* still exclusively rely on RFC casemapping
  * if it must.
  *
  * This is provided as a pointer so that modules can change it to their custom mapping tables,
@@ -136,13 +138,19 @@ namespace
 #endif
        }
 
-       // Deletes a pointer and then zeroes it.
-       template<typename T>
-       void DeleteZero(T*& pr)
+       // Checks whether the server clock has skipped too much and warn about it if it has.
+       void CheckTimeSkip(time_t oldtime, time_t newtime)
        {
-               T* p = pr;
-               pr = NULL;
-               delete p;
+               if (!ServerInstance->Config->TimeSkipWarn)
+                       return;
+
+               time_t timediff = newtime - oldtime;
+
+               if (timediff > ServerInstance->Config->TimeSkipWarn)
+                       ServerInstance->SNO->WriteToSnoMask('a', "\002Performance warning!\002 Server clock jumped forwards by %lu seconds!", timediff);
+
+               else if (timediff < -ServerInstance->Config->TimeSkipWarn)
+                       ServerInstance->SNO->WriteToSnoMask('a', "\002Performance warning!\002 Server clock jumped backwards by %lu seconds!", labs(timediff));
        }
 
        // Drops to the unprivileged user/group specified in <security:runas{user,group}>.
@@ -316,7 +324,7 @@ namespace
 
                                default:
                                        // An unknown option was specified.
-                                       std::cout << con_red << "Error:" <<  con_reset << " unknown option '" << argv[optind - 1] << "'." << std::endl
+                                       std::cout << con_red << "Error:" <<  con_reset << " unknown option '" << argv[optind] << "'." << std::endl
                                                << con_bright << "Usage: " << con_reset << argv[0] << " [--config <file>] [--debug] [--nofork] [--nolog]" << std::endl
                                                << std::string(strlen(argv[0]) + 8, ' ') << "[--nopid] [--runasroot] [--version]" << std::endl;
                                        ServerInstance->Exit(EXIT_STATUS_ARGV);
@@ -326,7 +334,7 @@ namespace
 
                if (do_version)
                {
-                       std::cout << std::endl << INSPIRCD_VERSION << std::endl;
+                       std::cout << INSPIRCD_VERSION << std::endl;
                        ServerInstance->Exit(EXIT_STATUS_NOERROR);
                }
 
@@ -382,7 +390,7 @@ namespace
 
                        std::cout << con_bright << "Hints:" << con_reset << std::endl
                                << "- For TCP/IP listeners try using a public IP address in <bind:address> instead" << std::endl
-                               << "  of * of leaving it blank." << std::endl
+                               << "  of * or leaving it blank." << std::endl
                                << "- For UNIX socket listeners try enabling <bind:rewrite> to replace old sockets." << std::endl;
                }
        }
@@ -423,9 +431,9 @@ void InspIRCd::Cleanup()
                delete FakeClient->server;
                FakeClient->cull();
        }
-       DeleteZero(this->FakeClient);
-       DeleteZero(this->XLines);
-       DeleteZero(this->Config);
+       stdalgo::delete_zero(this->FakeClient);
+       stdalgo::delete_zero(this->XLines);
+       stdalgo::delete_zero(this->Config);
        SocketEngine::Deinit();
        Logs->CloseLogs();
 }
@@ -439,7 +447,7 @@ void InspIRCd::WritePID(const std::string& filename, bool exitonfail)
                return;
        }
 
-       std::string fname = ServerInstance->Config->Paths.PrependData(filename.empty() ? "inspircd.pid" : filename);
+       std::string fname = ServerInstance->Config->Paths.PrependRuntime(filename.empty() ? "inspircd.pid" : filename);
        std::ofstream outfile(fname.c_str());
        if (outfile.is_open())
        {
@@ -484,22 +492,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
 
        this->Config->cmdline.argv = argv;
        this->Config->cmdline.argc = argc;
-
-#ifdef _WIN32
-       // Initialize the console values
-       g_hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
-       CONSOLE_SCREEN_BUFFER_INFO bufinf;
-       if(GetConsoleScreenBufferInfo(g_hStdout, &bufinf))
-       {
-               g_wOriginalColors = bufinf.wAttributes & 0x00FF;
-               g_wBackgroundColor = bufinf.wAttributes & 0x00F0;
-       }
-       else
-       {
-               g_wOriginalColors = FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN;
-               g_wBackgroundColor = 0;
-       }
-#endif
+       ParseOptions();
 
        {
                ServiceProvider* provs[] =
@@ -515,10 +508,10 @@ InspIRCd::InspIRCd(int argc, char** argv)
                << "See " << con_green << "/INFO" << con_reset << " for contributors & authors" << std::endl
                << std::endl;
 
-       ParseOptions();
        if (Config->cmdline.forcedebug)
        {
-               FileWriter* fw = new FileWriter(stdout, 1);
+               FILE* newstdout = fdopen(dup(STDOUT_FILENO), "w");
+               FileWriter* fw = new FileWriter(newstdout, 1);
                FileLogStream* fls = new FileLogStream(LOG_RAWIO, fw);
                Logs->AddLogTypes("*", fls, true);
        }
@@ -539,7 +532,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        std::cout << "InspIRCd Process ID: " << con_green << getpid() << con_reset << std::endl;
 
        /* During startup we read the configuration now, not in
-        * a seperate thread
+        * a separate thread
         */
        this->Config->Read();
        this->Config->Apply(NULL, "");
@@ -670,24 +663,14 @@ void InspIRCd::Run()
                UpdateTime();
 
                /* Run background module timers every few seconds
-                * (the docs say modules shouldnt rely on accurate
+                * (the docs say modules should not rely on accurate
                 * timing using this event, so we dont have to
                 * time this exactly).
                 */
                if (TIME.tv_sec != OLDTIME)
                {
                        CollectStats();
-
-                       if (Config->TimeSkipWarn)
-                       {
-                               time_t timediff = TIME.tv_sec - OLDTIME;
-
-                               if (timediff > Config->TimeSkipWarn)
-                                       SNO->WriteToSnoMask('a', "\002Performance warning!\002 Server clock jumped forwards by %lu seconds!", timediff);
-
-                               else if (timediff < -Config->TimeSkipWarn)
-                                       SNO->WriteToSnoMask('a', "\002Performance warning!\002 Server clock jumped backwards by %lu seconds!", labs(timediff));
-                       }
+                       CheckTimeSkip(OLDTIME, TIME.tv_sec);
 
                        OLDTIME = TIME.tv_sec;