* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2008 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
* ---------------------------------------------------
*/
-/* w00t was here. ;p */
-
/* $Install: src/inspircd $(BINPATH) */
#include "inspircd.h"
#include <signal.h>
#define RUSAGE_SELF 0
#endif
- /* CRT memory debugging */
- #ifdef DEBUG
- #define _CRTDBG_MAP_ALLOC
- #include <stdlib.h>
- #include <crtdbg.h>
- #endif
-
#include <pwd.h> // setuid
#include <grp.h> // setgid
#endif
"CreateEvent failed" /* 19 */
};
-template<typename T> void DeleteZero(T* n)
+template<typename T> static void DeleteZero(T* n)
{
if (n != NULL)
{
/* Close logging */
this->Logs->CloseLogs();
DeleteZero(this->Logs);
-
- delete RehashFinishMutex;
}
void InspIRCd::Restart(const std::string &reason)
signal(SIGHUP, InspIRCd::SetSignal);
signal(SIGPIPE, SIG_IGN);
signal(SIGCHLD, SIG_IGN);
+ /* We want E2BIG not a signal! */
+ signal(SIGXFSZ, SIG_IGN);
#endif
signal(SIGTERM, InspIRCd::SetSignal);
}
InspIRCd::InspIRCd(int argc, char** argv)
: GlobalCulls(this),
- /* Functor initialisation. Note that the ordering here is very important.
+ /* Functor initialisation. Note that the ordering here is very important.
*
* THIS MUST MATCH ORDER OF DECLARATION OF THE HandleWhateverFunc classes
* within class InspIRCd.
#ifdef WIN32
// Strict, frequent checking of memory on debug builds
_CrtSetDbgFlag ( _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
-
+
// Avoid erroneous frees on early exit
WindowsIPC = 0;
#endif
FailedPortList pl;
int do_version = 0, do_nofork = 0, do_debug = 0,
do_nolog = 0, do_root = 0, do_testsuite = 0; /* flag variables */
- char c = 0;
+ int c = 0;
// Initialize so that if we exit before proper initialization they're not deleted
this->Logs = 0;
SE = SEF->Create(this);
delete SEF;
- ThreadEngineFactory* tef = new ThreadEngineFactory();
- this->Threads = tef->Create(this);
- delete tef;
- this->Mutexes = new MutexFactory(this);
+ this->Threads = new ThreadEngine(this);
/* Default implementation does nothing */
this->PI = new ProtocolInterface(this);
this->s_signal = 0;
-
+
// Create base manager classes early, so nothing breaks
this->Users = new UserManager(this);
-
+
this->Users->unregistered_count = 0;
this->Users->clientlist = new user_hash();
{ 0, 0, 0, 0 }
};
- while ((c = getopt_long_only(argc, argv, ":f:", longopts, NULL)) != -1)
+ int index;
+ while ((c = getopt_long_only(argc, argv, ":f:", longopts, &index)) != -1)
{
switch (c)
{
case 0:
/* getopt_long_only() set an int variable, just keep going */
break;
+ case '?':
+ /* Unknown parameter */
default:
- /* Unknown parameter! DANGER, INTRUDER.... err.... yeah. */
+ /* Fall through to handle other weird values too */
+ printf("Unknown parameter '%s'\n", argv[index]);
printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>]\n\
[--runasroot] [--version] [--config <config>] [--testsuite]\n", argv[0]);
Exit(EXIT_STATUS_ARGV);
if (!ServerConfig::FileExists(this->ConfigFileName))
{
- printf("ERROR: Cannot open config file: %s\nExiting...\n", this->ConfigFileName);
- this->Logs->Log("STARTUP",DEFAULT,"Unable to open config file %s", this->ConfigFileName);
- Exit(EXIT_STATUS_CONFIG);
+#ifdef WIN32
+ /* Windows can (and defaults to) hide file extensions, so let's play a bit nice for windows users. */
+ std::string txtconf = this->ConfigFileName;
+ txtconf.append(".txt");
+
+ if (ServerConfig::FileExists(txtconf.c_str()))
+ {
+ strlcat(this->ConfigFileName, ".txt", MAXBUF);
+ }
+ else
+#endif
+ {
+ printf("ERROR: Cannot open config file: %s\nExiting...\n", this->ConfigFileName);
+ this->Logs->Log("STARTUP",DEFAULT,"Unable to open config file %s", this->ConfigFileName);
+ Exit(EXIT_STATUS_CONFIG);
+ }
}
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;32mpippijn, peavey, aquanight, fez, psychon, dz\033[0m\n\n");
+ printf_c("\t\033[1;32mpeavey, aquanight, psychon, dz, danieldg\033[0m\n\n");
printf_c("Others:\t\t\t\033[1;32mSee /INFO Output\033[0m\n");
Config->ClearStack();
printf("\n");
this->Modules->LoadAll();
-
+
/* Just in case no modules were loaded - fix for bug #101 */
this->BuildISupport();
InitializeDisabledCommands(Config->DisabledCommands, this);
}
printf("\nInspIRCd is now running as '%s'[%s] with %d max open sockets\n", Config->ServerName,Config->GetSID().c_str(), SE->GetMaxFds());
-
+
#ifndef WINDOWS
if (!Config->nofork)
{
Exit(0);
}
- RehashFinishMutex = Mutexes->CreateMutex();
-
while (true)
{
#ifndef WIN32
#endif
/* Check if there is a config thread which has finished executing but has not yet been freed */
- RehashFinishMutex->Lock();
- if (this->ConfigThread && this->ConfigThread->GetExitFlag())
+ if (this->ConfigThread && this->ConfigThread->IsDone())
{
/* Rehash has completed */
delete ConfigThread;
ConfigThread = NULL;
}
- RehashFinishMutex->Unlock();
/* time() seems to be a pretty expensive syscall, so avoid calling it too much.
* Once per loop iteration is pleanty.
this->stats->LastCPU = ru.ru_utime;
}
#else
- WindowsIPC->Check();
+ WindowsIPC->Check();
#endif
}