* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * InspIRCd: (C) 2002-2008 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
* ---------------------------------------------------
*/
+/* $Install: src/inspircd $(BINPATH) */
+
#include "inspircd.h"
#include <signal.h>
#include <fstream>
#include "xline.h"
+#include "bancache.h"
#include "socketengine.h"
#include "inspircd_se_config.h"
#include "socket.h"
void InspIRCd::Cleanup()
{
- std::vector<std::string> mymodnames;
- int MyModCount = this->Modules->GetCount();
-
if (Config)
{
for (unsigned int i = 0; i < Config->ports.size(); i++)
}
/* 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();
*/
for (int tries = 0; tries < 3; tries++)
{
- MyModCount = this->Modules->GetCount();
- mymodnames.clear();
-
- if (MyModCount)
+ std::vector<std::string> module_names = Modules->GetAllModuleNames(0);
+ for (std::vector<std::string>::iterator k = module_names.begin(); k != module_names.end(); ++k)
{
/* Unload all modules, so they get a chance to clean up their listeners */
- for (int j = 0; j <= MyModCount; j++)
- mymodnames.push_back(Config->module_names[j]);
-
- for (int k = 0; k <= MyModCount; k++)
- this->Modules->Unload(mymodnames[k].c_str());
+ this->Modules->Unload(k->c_str());
}
-
}
/* Close logging */
*/
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 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->Config = new ServerConfig(this);
+ this->SNO = new SnomaskManager(this);
+ this->BanCache = new BanCacheManager(this);
+ this->Modules = new ModuleManager(this);
+ this->stats = new serverstats();
+ this->Timers = new TimerManager(this);
+ this->Parser = new CommandParser(this);
+ this->XLines = new XLineManager(this);
this->Config->argv = argv;
this->Config->argc = argc;
this->Config->opertypes.clear();
this->Config->operclass.clear();
- this->SNO = new SnomaskManager(this);
+
this->TIME = this->OLDTIME = this->startup_time = time(NULL);
this->time_delta = 0;
- this->next_call = this->TIME + 3;
srand(this->TIME);
*this->LogFileName = 0;
// Set up winsock
WSADATA wsadata;
WSAStartup(MAKEWORD(2,0), &wsadata);
-
ChangeWindowsSpecificPointers(this);
#endif
strlcpy(Config->MyExecutable,argv[0],MAXBUF);
/* Set the finished argument values */
Config->nofork = do_nofork;
Config->forcedebug = do_debug;
- Config->writelog = !do_nolog;
-
- this->Modules = new ModuleManager(this);
- this->stats = new serverstats();
- this->Timers = new TimerManager(this);
- this->Parser = new CommandParser(this);
- this->XLines = new XLineManager(this);
-
+ Config->writelog = !do_nolog;
Config->ClearStack();
- Config->Read(true, NULL);
-
- this->Modules->modules.resize(255);
- this->Modules->handles.resize(255);
-
- /*
- * Initialise SID/UID.
- * For an explanation as to exactly how this works, and why it works this way, see GetUID().
- * -- w00t
- */
- /* Generate SID */
- size_t sid = 0;
- if (Config->sid)
- {
- sid = Config->sid;
- }
- else
- {
- 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 = sid;
- }
- this->InitialiseUID();
+ this->Modes = new ModeParser(this);
- /* set up fake client */
+ /* set up fake client (uid is incorrect at this 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);
SE->RecoverFromFork();
- this->Modes = new ModeParser(this);
- this->AddServerName(Config->ServerName);
- CheckDie();
- int bounditems = BindPorts(true, found_ports, pl);
+ /* Read config, pass 0. At the end if this pass,
+ * the Config->IncludeFiles is populated, we call
+ * Config->StartDownloads to initialize the downlaods of all
+ * these files.
+ */
+ Config->Read(true, NULL, 0);
+ Config->DoDownloads();
+ /* We have all the files we can get, initiate pass 1 */
+ Config->Read(true, NULL, 1);
+
+ 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)
+ {
+ }
+ else
+ {
+ // Generate one
+ size_t sid = 0;
- for(int t = 0; t < 255; t++)
- Config->global_implementation[t] = 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;
- memset(&Config->implement_lists,0,sizeof(Config->implement_lists));
+ Config->sid[0] = (char)(sid / 100 + 48);
+ Config->sid[1] = (char)(((sid / 10) % 10) + 48);
+ Config->sid[2] = (char)(sid % 10 + 48);
+ }
- printf("\n");
+ this->InitialiseUID();
- this->Res = new DNS(this);
+ /* set up fake client again this time with the correct uid */
+ delete FakeClient;
+ this->FakeClient = new User(this);
+ this->FakeClient->SetFd(FD_MAGIC_NUMBER);
- this->Modules->LoadAll();
+ // Get XLine to do it's thing.
+ this->XLines->CheckELines();
+ this->XLines->ApplyLines();
+
+
+ CheckDie();
+ int bounditems = BindPorts(true, found_ports, pl);
+
+ printf("\n");
+
+ /*this->Modules->LoadAll();*/
/* Just in case no modules were loaded - fix for bug #101 */
this->BuildISupport();
}
#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());
+ Log(DEFAULT,"Startup complete as '%s'[%s]", Config->ServerName,Config->GetSID().c_str());
this->WritePID(Config->PID);
}
/* moved to a function, as UID generation can call this also */
void InspIRCd::InitialiseUID()
{
- int i;
- size_t sid = Config->sid;
+ int i = 3;
- current_uid[0] = sid / 100 + 48;
- current_uid[1] = ((sid / 10) % 10) + 48;
- current_uid[2] = sid % 10 + 48;
+ current_uid[0] = Config->sid[0];
+ current_uid[1] = Config->sid[1];
+ current_uid[2] = Config->sid[2];
/* Initialise UID */
for(i = 3; i < UUID_LENGTH - 1; i++)
current_uid[i] = 'A';
+
+ current_uid[UUID_LENGTH] = '\0';
}
int InspIRCd::Run()
if (TIME != OLDTIME)
{
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->RehashUsersAndChans();
FOREACH_MOD_I(this, I_OnGarbageCollect, OnGarbageCollect());
}
+
Timers->TickTimers(TIME);
- this->DoBackgroundUserStuff(TIME);
+ this->DoBackgroundUserStuff();
if ((TIME % 5) == 0)
{
- XLines->expire_lines();
FOREACH_MOD_I(this,I_OnBackgroundTimer,OnBackgroundTimer(TIME));
- Timers->TickMissedTimers(TIME);
+ SNO->FlushSnotices();
}
#ifndef WIN32
/* Same change as in cmd_stats.cpp, use RUSAGE_SELF rather than '0' -- Om */
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 was quit, take them out */
+ /* if any users were quit, take them out */
this->GlobalCulls.Apply();
/* If any inspsockets closed, remove them */
{
for (std::map<BufferedSocket*,BufferedSocket*>::iterator x = SocketCull.begin(); x != SocketCull.end(); ++x)
{
+ Log(DEBUG,"Cull socket");
SE->DelFd(x->second);
x->second->Close();
delete x->second;
/**********************************************************************************/
/**
- * An ircd in four lines! bwahahaha. ahahahahaha. ahahah *cough*.
+ * An ircd in five lines! bwahahaha. ahahahahaha. ahahah *cough*.
*/
-int ircd(int argc, char ** argv)
+int main(int argc, char ** argv)
{
SI = new InspIRCd(argc, argv);
mysig = &SI->s_signal;
return 0;
}
-#ifdef WINDOWS
-
-int main(int argc, char ** argv)
-{
- ircd(argc,argv);
- return 0;
-}
-
-#else
-int main(int argc, char** argv)
-{
- return ircd(argc,argv);
-}
-#endif
-
/* this returns true when all modules are satisfied that the user should be allowed onto the irc server
* (until this returns true, a user will block in the waiting state, waiting to connect up to the
* registration timeout maximum seconds)
*/
bool InspIRCd::AllModulesReportReady(User* user)
{
- if (!Config->global_implementation[I_OnCheckReady])
- return true;
-
- for (int i = 0; i <= this->Modules->GetCount(); i++)
+ for (EventHandlerIter i = Modules->EventHandlers[I_OnCheckReady].begin(); i != Modules->EventHandlers[I_OnCheckReady].end(); ++i)
{
- if (Config->implement_lists[i][I_OnCheckReady])
- {
- int res = this->Modules->modules[i]->OnCheckReady(user);
- if (!res)
- return false;
- }
+ int res = (*i)->OnCheckReady(user);
+ if (!res)
+ return false;
}
+
return true;
}
return old;
}
-void InspIRCd::AddLocalClone(User* user)
-{
- clonemap::iterator x = local_clones.find(user->GetIPString());
- if (x != local_clones.end())
- x->second++;
- else
- local_clones[user->GetIPString()] = 1;
-}
-
-void InspIRCd::AddGlobalClone(User* user)
-{
- clonemap::iterator y = global_clones.find(user->GetIPString());
- if (y != global_clones.end())
- y->second++;
- else
- global_clones[user->GetIPString()] = 1;
-}
-
int InspIRCd::GetTimeDelta()
{
return time_delta;