]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Don't hardcode conf/inspircd.conf as the config file, allow the configure script...
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 47f743df2502b64e8f136b5fe2fd1aabdfd6c1dc..4abfb496a3e26e80b63aa186fa3b1453b98a2999 100644 (file)
@@ -1,16 +1,31 @@
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2010 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ *   Copyright (C) 2012 William Pitcock <nenolod@dereferenced.org>
+ *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2003-2008 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2008 Uli Schlachter <psychon@znc.in>
+ *   Copyright (C) 2006-2008 Robin Burchell <robin+git@viroteck.net>
+ *   Copyright (C) 2006-2007 Oliver Lupton <oliverlupton@gmail.com>
+ *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ *   Copyright (C) 2007 Burlex <???@???>
+ *   Copyright (C) 2003 Craig McLure <craig@chatspike.net>
+ *   Copyright (C) 2003 randomdan <???@???>
  *
- * This program is free but copyrighted software; see
- *         the file COPYING for details.
+ * 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
+ * License as published by the Free Software Foundation, version 2.
  *
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+
 /* $Core */
 #include "inspircd.h"
 #include "inspircd_version.h"
@@ -171,37 +186,39 @@ void InspIRCd::ResetMaxBans()
                i->second->ResetMaxBans();
 }
 
-/** Because hash_map doesnt free its buckets when we delete items (this is a 'feature')
- * we must occasionally rehash the hash (yes really).
+/** Because hash_map doesn't free its buckets when we delete items, we occasionally
+ * recreate the hash to free them up.
  * We do this by copying the entries from the old hash to a new hash, causing all
- * empty buckets to be weeded out of the hash. We dont do this on a timer, as its
- * very expensive, so instead we do it when the user types /REHASH and expects a
- * short delay anyway.
+ * empty buckets to be weeded out of the hash.
+ * Since this is quite expensive, it's not done very often.
  */
 void InspIRCd::RehashUsersAndChans()
 {
-       user_hash* old_users = this->Users->clientlist;
-       user_hash* old_uuid  = this->Users->uuidlist;
-       chan_hash* old_chans = this->chanlist;
-
-       this->Users->clientlist = new user_hash();
-       this->Users->uuidlist = new user_hash();
-       this->chanlist = new chan_hash();
-
+       user_hash* old_users = Users->clientlist;
+       Users->clientlist = new user_hash;
        for (user_hash::const_iterator n = old_users->begin(); n != old_users->end(); n++)
-               this->Users->clientlist->insert(*n);
-
+               Users->clientlist->insert(*n);
        delete old_users;
 
+       user_hash* old_uuid = Users->uuidlist;
+       Users->uuidlist = new user_hash;
        for (user_hash::const_iterator n = old_uuid->begin(); n != old_uuid->end(); n++)
-               this->Users->uuidlist->insert(*n);
-
+               Users->uuidlist->insert(*n);
        delete old_uuid;
 
+       chan_hash* old_chans = chanlist;
+       chanlist = new chan_hash;
        for (chan_hash::const_iterator n = old_chans->begin(); n != old_chans->end(); n++)
-               this->chanlist->insert(*n);
-
+               chanlist->insert(*n);
        delete old_chans;
+
+       // Reset the already_sent IDs so we don't wrap it around and drop a message
+       LocalUser::already_sent_id = 0;
+       for (std::vector<LocalUser*>::const_iterator i = Users->local_users.begin(); i != Users->local_users.end(); i++)
+       {
+               (**i).already_sent = 0;
+               (**i).RemoveExpiredInvites();
+       }
 }
 
 void InspIRCd::SetSignals()
@@ -247,7 +264,6 @@ bool InspIRCd::DaemonSeed()
                exit(0);
        }
        setsid ();
-       umask (007);
        printf("InspIRCd Process ID: \033[1;32m%lu\033[0m\n",(unsigned long)getpid());
 
        signal(SIGTERM, InspIRCd::SetSignal);
@@ -287,7 +303,7 @@ void InspIRCd::WritePID(const std::string &filename)
 }
 
 InspIRCd::InspIRCd(int argc, char** argv) :
-        ConfigFileName("conf/inspircd.conf"),
+        ConfigFileName(CONFIG_PATH "/inspircd.conf"),
 
         /* Functor pointer initialisation.
          *
@@ -296,12 +312,14 @@ InspIRCd::InspIRCd(int argc, char** argv) :
          */
         NICKForced("NICKForced", NULL),
         OperQuit("OperQuit", NULL),
+        GenRandom(&HandleGenRandom),
         IsChannel(&HandleIsChannel),
         IsSID(&HandleIsSID),
         Rehash(&HandleRehash),
         IsNick(&HandleIsNick),
         IsIdent(&HandleIsIdent),
-        FloodQuitUser(&HandleFloodQuitUser)
+        FloodQuitUser(&HandleFloodQuitUser),
+        OnCheckExemption(&HandleOnCheckExemption)
 {
 #ifdef WIN32
        // Strict, frequent checking of memory on debug builds
@@ -339,8 +357,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
        this->Res = 0;
        this->ConfigThread = NULL;
 
-       // Initialise TIME
-       clock_gettime(CLOCK_REALTIME, &TIME);
+       UpdateTime();
        this->startup_time = TIME.tv_sec;
 
        // This must be created first, so other parts of Insp can use it while starting up
@@ -376,7 +393,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
        this->Config->cmdline.argv = argv;
        this->Config->cmdline.argc = argc;
 
-       srand(TIME.tv_nsec ^ TIME.tv_sec);
+       srandom(TIME.tv_nsec ^ TIME.tv_sec);
 
        struct option longopts[] =
        {
@@ -392,7 +409,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
        };
 
        int index;
-       while ((c = getopt_long_only(argc, argv, ":f:", longopts, &index)) != -1)
+       while ((c = getopt_long(argc, argv, ":f:", longopts, &index)) != -1)
        {
                switch (c)
                {
@@ -452,7 +469,7 @@ InspIRCd::InspIRCd(int argc, char** argv) :
        if (do_debug)
        {
                FileWriter* fw = new FileWriter(stdout);
-               FileLogStream* fls = new FileLogStream(DEBUG, fw);
+               FileLogStream* fls = new FileLogStream(RAWIO, fw);
                Logs->AddLogTypes("*", fls, true);
        }
        else if (!this->OpenLog(argv, argc))
@@ -484,8 +501,8 @@ InspIRCd::InspIRCd(int argc, char** argv) :
        printf_c("\033[1;32mInspire Internet Relay Chat Server, compiled %s at %s\n",__DATE__,__TIME__);
        printf_c("(C) InspIRCd Development Team.\033[0m\n\n");
        printf_c("Developers:\n");
-       printf_c("\t\033[1;32mBrain, FrostyCoolSlug, w00t, Om, Special\n");
-       printf_c("\t\033[1;32mpeavey, aquanight, psychon, dz, danieldg\033[0m\n\n");
+       printf_c("\t\033[1;32mBrain, FrostyCoolSlug, w00t, Om, Special, peavey\n");
+       printf_c("\t\033[1;32maquanight, psychon, dz, danieldg, jackmcbarn\033[0m\n\n");
        printf_c("Others:\t\t\t\033[1;32mSee /INFO Output\033[0m\n");
 
        this->Modes = new ModeParser;
@@ -591,27 +608,40 @@ InspIRCd::InspIRCd(int argc, char** argv) :
                }
        }
 
-       if (isatty(0) && isatty(1) && isatty(2))
+       /* Explicitly shut down stdio's stdin/stdout/stderr.
+        *
+        * The previous logic here was to only do this if stdio was connected to a controlling
+        * terminal.  However, we must do this always to avoid information leaks and other
+        * problems related to stdio.
+        *
+        * The only exception is if we are in debug mode.
+        *
+        *    -- nenolod
+        */
+       if ((!do_nofork) && (!do_testsuite) && (!Config->cmdline.forcedebug))
        {
-               /* We didn't start from a TTY, we must have started from a background process -
-                * e.g. we are restarting, or being launched by cron. Dont kill parent, and dont
-                * close stdin/stdout
-                */
-               if ((!do_nofork) && (!do_testsuite))
-               {
-                       fclose(stdin);
-                       fclose(stderr);
-                       if (!Config->cmdline.forcedebug)
-                               fclose(stdout);
-               }
-               else
-               {
-                       Logs->Log("STARTUP", DEFAULT,"Keeping pseudo-tty open as we are running in the foreground.");
-               }
+               int fd;
+
+               fclose(stdin);
+               fclose(stderr);
+               fclose(stdout);
+
+               fd = open("/dev/null", O_RDWR);
+               if (dup2(fd, 0) < 0)
+                       Logs->Log("STARTUP", DEFAULT, "Failed to dup /dev/null to stdin.");
+               if (dup2(fd, 1) < 0)
+                       Logs->Log("STARTUP", DEFAULT, "Failed to dup /dev/null to stdout.");
+               if (dup2(fd, 2) < 0)
+                       Logs->Log("STARTUP", DEFAULT, "Failed to dup /dev/null to stderr.");
+               close(fd);
+       }
+       else
+       {
+               Logs->Log("STARTUP", DEFAULT,"Keeping pseudo-tty open as we are running in the foreground.");
        }
 #else
        WindowsIPC = new IPC;
-       if(!Config->nofork)
+       if(!Config->cmdline.nofork)
        {
                WindowsForkKillOwner();
                FreeConsole();
@@ -688,7 +718,14 @@ InspIRCd::InspIRCd(int argc, char** argv) :
 
 void InspIRCd::UpdateTime()
 {
+#ifdef HAS_CLOCK_GETTIME
        clock_gettime(CLOCK_REALTIME, &TIME);
+#else
+       struct timeval tv;
+       gettimeofday(&tv, NULL);
+       TIME.tv_sec = tv.tv_sec;
+       TIME.tv_nsec = tv.tv_usec * 1000;
+#endif
 }
 
 int InspIRCd::Run()