]> 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 47a9fabbac32ce297a73d83b5cb6e5a0d3613209..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"
@@ -180,24 +195,21 @@ void InspIRCd::ResetMaxBans()
 void InspIRCd::RehashUsersAndChans()
 {
        user_hash* old_users = Users->clientlist;
-       user_hash* old_uuid  = Users->uuidlist;
-       chan_hash* old_chans = chanlist;
-
-       Users->clientlist = new user_hash();
-       Users->uuidlist = new user_hash();
-       chanlist = new chan_hash();
-
+       Users->clientlist = new user_hash;
        for (user_hash::const_iterator n = old_users->begin(); n != old_users->end(); 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++)
                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++)
                chanlist->insert(*n);
-
-       delete old_users;
-       delete old_uuid;
        delete old_chans;
 
        // Reset the already_sent IDs so we don't wrap it around and drop a message
@@ -205,6 +217,7 @@ void InspIRCd::RehashUsersAndChans()
        for (std::vector<LocalUser*>::const_iterator i = Users->local_users.begin(); i != Users->local_users.end(); i++)
        {
                (**i).already_sent = 0;
+               (**i).RemoveExpiredInvites();
        }
 }
 
@@ -290,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.
          *
@@ -488,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;
@@ -595,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();