#include "command_parse.h"
#include "exitcodes.h"
#include "caller.h"
+#include "testsuite.h"
using irc::sockets::insp_ntoa;
using irc::sockets::insp_inaddr;
}
/* Close all client sockets, or the new process inherits them */
- for (std::vector<User*>::const_iterator i = this->local_users.begin(); i != this->local_users.end(); i++)
+ for (std::vector<User*>::const_iterator i = this->Users->local_users.begin(); i != this->Users->local_users.end(); i++)
{
(*i)->SetWriteError("Server shutdown");
(*i)->CloseSocket();
}
/* Close logging */
- if (this->Logger)
- this->Logger->Close();
-
+ this->Logs->CloseLogs();
/* Cleanup Server Names */
for(servernamelist::iterator itr = servernames.begin(); itr != servernames.end(); ++itr)
*/
void InspIRCd::RehashUsersAndChans()
{
- user_hash* old_users = this->clientlist;
- user_hash* old_uuid = this->uuidlist;
+ user_hash* old_users = this->Users->clientlist;
+ user_hash* old_uuid = this->Users->uuidlist;
chan_hash* old_chans = this->chanlist;
- this->clientlist = new user_hash();
- this->uuidlist = new user_hash();
+ this->Users->clientlist = new user_hash();
+ this->Users->uuidlist = new user_hash();
this->chanlist = new chan_hash();
for (user_hash::const_iterator n = old_users->begin(); n != old_users->end(); n++)
- this->clientlist->insert(*n);
+ this->Users->clientlist->insert(*n);
delete old_users;
for (user_hash::const_iterator n = old_uuid->begin(); n != old_uuid->end(); n++)
- this->uuidlist->insert(*n);
+ this->Users->uuidlist->insert(*n);
delete old_uuid;
delete old_chans;
}
-void InspIRCd::CloseLog()
-{
- if (this->Logger)
- this->Logger->Close();
-}
-
void InspIRCd::SetSignals()
{
#ifndef WIN32
int found_ports = 0;
FailedPortList pl;
- int do_version = 0, do_nofork = 0, do_debug = 0, do_nolog = 0, do_root = 0; /* flag variables */
+ int do_version = 0, do_nofork = 0, do_debug = 0,
+ do_nolog = 0, do_root = 0, do_testsuite = 0; /* flag variables */
char c = 0;
memset(&server, 0, sizeof(server));
memset(&client, 0, sizeof(client));
+ // This must be created first, so other parts of Insp can use it while starting up
+ this->Logs = new LogManager(this);
+
SocketEngineFactory* SEF = new SocketEngineFactory();
SE = SEF->Create(this);
delete SEF;
this->s_signal = 0;
+
+ // Create base manager classes early, so nothing breaks
+ this->Users = new UserManager(this);
+
+ this->Users->unregistered_count = 0;
- this->unregistered_count = 0;
-
- this->clientlist = new user_hash();
- this->uuidlist = new user_hash();
+ this->Users->clientlist = new user_hash();
+ this->Users->uuidlist = new user_hash();
this->chanlist = new chan_hash();
this->Res = NULL;
this->Timers = new TimerManager(this);
this->Parser = new CommandParser(this);
this->XLines = new XLineManager(this);
- this->Users = new UserManager(this);
this->Config->argv = argv;
this->Config->argc = argc;
{ "nolog", no_argument, &do_nolog, 1 },
{ "runasroot", no_argument, &do_root, 1 },
{ "version", no_argument, &do_version, 1 },
+ { "testsuite", no_argument, &do_testsuite, 1 },
{ 0, 0, 0, 0 }
};
break;
default:
/* Unknown parameter! DANGER, INTRUDER.... err.... yeah. */
- printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>] [--runasroot] [--version] [--config <config>]\n", argv[0]);
+ printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>]\n\
+ [--runasroot] [--version] [--config <config>] [--testsuite]\n", argv[0]);
Exit(EXIT_STATUS_ARGV);
break;
}
}
+ if (do_testsuite)
+ do_nofork = do_debug = true;
+
if (do_version)
{
printf("\n%s r%s\n", VERSION, REVISION);
#endif
strlcpy(Config->MyExecutable,argv[0],MAXBUF);
+ /* Set the finished argument values */
+ Config->nofork = do_nofork;
+ Config->forcedebug = do_debug;
+ Config->writelog = !do_nolog;
+ Config->TestSuite = do_testsuite;
+
if (!this->OpenLog(argv, argc))
{
printf("ERROR: Could not open logfile %s: %s\n\n", Config->logpath.c_str(), strerror(errno));
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:\t\t\033[1;32mBrain, FrostyCoolSlug, w00t, Om, Special, pippijn, peavey, Burlex\033[0m\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\033[0m\n\n");
printf_c("Others:\t\t\t\033[1;32mSee /INFO Output\033[0m\n");
- /* Set the finished argument values */
- Config->nofork = do_nofork;
- Config->forcedebug = do_debug;
- Config->writelog = !do_nolog;
Config->ClearStack();
this->Modes = new ModeParser(this);
/* set up fake client (uid is incorrect at this point,
- * until after config is read. we set up the user again
- * at that point
- */
+ * until after config is read. we set up the user again
+ * at that point
+ */
this->FakeClient = new User(this);
this->FakeClient->SetFd(FD_MAGIC_NUMBER);
if (!this->DaemonSeed())
{
printf("ERROR: could not go into daemon mode. Shutting down.\n");
- Log(DEFAULT,"ERROR: could not go into daemon mode. Shutting down.");
+ Logs->Log("STARTUP", DEFAULT, "ERROR: could not go into daemon mode. Shutting down.");
Exit(EXIT_STATUS_FORK);
}
}
/* We have all the files we can get, initiate pass 1 */
Config->Read(true, NULL, 1);
- this->AddServerName(Config->ServerName);
+ this->AddServerName(Config->ServerName);
- /*
- * Initialise SID/UID.
- * For an explanation as to exactly how this works, and why it works this way, see GetUID().
- * -- w00t
- */
- if (*Config->sid)
- {
+ /*
+ * Initialise SID/UID.
+ * For an explanation as to exactly how this works, and why it works this way, see GetUID().
+ * -- w00t
+ */
+ if (*Config->sid)
+ {
}
- else
- {
+ else
+ {
// Generate one
size_t sid = 0;
- for (const char* x = Config->ServerName; *x; ++x)
- sid = 5 * sid + *x;
- for (const char* y = Config->ServerDesc; *y; ++y)
- sid = 5 * sid + *y;
- sid = sid % 999;
+ for (const char* x = Config->ServerName; *x; ++x)
+ sid = 5 * sid + *x;
+ for (const char* y = Config->ServerDesc; *y; ++y)
+ sid = 5 * sid + *y;
+ sid = sid % 999;
Config->sid[0] = (char)(sid / 100 + 48);
Config->sid[1] = (char)(((sid / 10) % 10) + 48);
Config->sid[2] = (char)(sid % 10 + 48);
- }
+ }
- this->InitialiseUID();
+ this->InitialiseUID();
- /* set up fake client again this time with the correct uid */
- delete FakeClient;
- this->FakeClient = new User(this);
- this->FakeClient->SetFd(FD_MAGIC_NUMBER);
+ /* set up fake client again this time with the correct uid */
+ delete FakeClient;
+ this->FakeClient = new User(this);
+ this->FakeClient->SetFd(FD_MAGIC_NUMBER);
- // Get XLine to do it's thing.
- this->XLines->CheckELines();
- this->XLines->ApplyLines();
+ // Get XLine to do it's thing.
+ this->XLines->CheckELines();
+ this->XLines->ApplyLines();
CheckDie();
if ((Config->ports.size() == 0) && (found_ports > 0))
{
printf("\nERROR: I couldn't bind any ports! Are you sure you didn't start InspIRCd twice?\n");
- Log(DEFAULT,"ERROR: I couldn't bind any ports! Are you sure you didn't start InspIRCd twice?");
+ Logs->Log("STARTUP", DEFAULT,"ERROR: I couldn't bind any ports! Something else is bound to those ports!");
Exit(EXIT_STATUS_BIND);
}
if (kill(getppid(), SIGTERM) == -1)
{
printf("Error killing parent process: %s\n",strerror(errno));
- Log(DEFAULT,"Error killing parent process: %s",strerror(errno));
+ Logs->Log("STARTUP", DEFAULT, "Error killing parent process: %s",strerror(errno));
}
}
}
else
{
- Log(DEFAULT,"Keeping pseudo-tty open as we are running in the foreground.");
+ Logs->Log("STARTUP", DEFAULT,"Keeping pseudo-tty open as we are running in the foreground.");
}
}
#else
}
#endif
- printf("\nInspIRCd is now running!\n");
- Log(DEFAULT,"Startup complete.");
+ printf("\nInspIRCd is now running as '%s'[%s]\n", Config->ServerName,Config->GetSID().c_str());
+ Logs->Log("STARTUP", DEFAULT, "Startup complete as '%s'[%s]", Config->ServerName,Config->GetSID().c_str());
this->WritePID(Config->PID);
}
int InspIRCd::Run()
{
+ /* See if we're supposed to be running the test suite rather than entering the mainloop */
+ if (Config->TestSuite)
+ {
+ TestSuite* ts = new TestSuite(this);
+ delete ts;
+ Exit(0);
+ }
+
while (true)
{
#ifndef WIN32
*/
if (TIME != OLDTIME)
{
- /* if any users were quit, take them out */
- this->GlobalCulls.Apply();
-
if (TIME < OLDTIME)
{
- WriteOpers("*** \002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %d secs.",abs(OLDTIME-TIME));
+ SNO->WriteToSnoMask('A', "\002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %d secs.",abs(OLDTIME-TIME));
}
if ((TIME % 3600) == 0)
this->stats->LastCPU = ru.ru_utime;
}
#else
- WindowsIPC->Check();
-
- if(Config->nofork)
- {
- uptime = Time() - startup_time;
- stime = gmtime(&uptime);
- snprintf(window_title, 100, "InspIRCd - %u clients, %u accepted connections - Up %u days, %.2u:%.2u:%.2u",
- LocalUserCount(), stats->statsAccept, stime->tm_yday, stime->tm_hour, stime->tm_min, stime->tm_sec);
- SetConsoleTitle(window_title);
- }
+ WindowsIPC->Check();
#endif
}
*/
this->SE->DispatchEvents();
+ /* if any users were quit, take them out */
+ this->GlobalCulls.Apply();
+
/* If any inspsockets closed, remove them */
this->BufferedSocketCull();