X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd.cpp;h=4abfb496a3e26e80b63aa186fa3b1453b98a2999;hb=97e8518c1961c3d1ff7b3a0ad4e04ee2880c1fc4;hp=c6faf88021b458893e0392614cdf03f99ac49190;hpb=4d46f5f9ef94c295649afad38c6d496ae2bbe5e1;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index c6faf8802..4abfb496a 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -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 + * Copyright (C) 2009-2010 Daniel De Graaf + * Copyright (C) 2003-2008 Craig Edwards + * Copyright (C) 2008 Uli Schlachter + * Copyright (C) 2006-2008 Robin Burchell + * Copyright (C) 2006-2007 Oliver Lupton + * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2007 Burlex + * Copyright (C) 2003 Craig McLure + * 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 . */ + /* $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::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. * @@ -344,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 @@ -457,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)) @@ -489,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; @@ -596,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(); @@ -693,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()