]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Mass-tidyup of module global vars, theyre no longer global vars.
[user/henk/code/inspircd.git] / src / inspircd.cpp
index b0e6b107327e10548ea7bb8fe6847d10d3bcb2e6..5ed9b1cc9d331d7d11707207a41daec404dca01b 100644 (file)
@@ -1,13 +1,13 @@
 /* ---------------------------------------------------------------------
  * 
- *              +------------------------------------+
- *              | Inspire Internet Relay Chat Daemon |
- *              +------------------------------------+
+ *           +------------------------------------+
+ *           | Inspire Internet Relay Chat Daemon |
+ *           +------------------------------------+
  *
- *         InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
- *                             E-mail:
- *                      <brain@chatspike.net>
- *                      <Craig@chatspike.net>
+ *      InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
+ *                          E-mail:
+ *                   <brain@chatspike.net>
+ *                   <Craig@chatspike.net>
  *     
  *  Written by Craig Edwards, Craig McLure, and others.
  *  This program is free but copyrighted software; you can redistribute
@@ -51,7 +51,6 @@
 #include "modules.h"
 #include "dynamic.h"
 #include "wildcard.h"
-#include "message.h"
 #include "mode.h"
 #include "commands.h"
 #include "xline.h"
 #include "typedefs.h"
 #include "command_parse.h"
 
-InspIRCd* ServerInstance;
+using irc::sockets::BindPorts;
+using irc::sockets::NonBlocking;
+using irc::sockets::insp_ntoa;
+using irc::sockets::insp_inaddr;
+using irc::sockets::insp_sockaddr;
 
-extern ModuleList modules;
-extern FactoryList factory;
-
-extern int MODCOUNT;
-extern char LOG_FILE[MAXBUF];
+InspIRCd* ServerInstance = NULL;
 
 int iterations = 0;
 
@@ -109,7 +108,7 @@ bool InspIRCd::FindServerName(const std::string &servername)
        return (find(servernames.begin(), servernames.end(), servername) != servernames.end());
 }
 
-void Exit(int status)
+void InspIRCd::Exit(int status)
 {
        if (ServerInstance->Config->log_file)
                fclose(ServerInstance->Config->log_file);
@@ -126,19 +125,11 @@ void InspIRCd::Start()
        printf("Name concept:\t\t\033[1;32mLord_Zathras\033[0m\n\n");
 }
 
-void Killed(int status)
+void InspIRCd::Rehash(int status)
 {
-       if (ServerInstance->Config->log_file)
-               fclose(ServerInstance->Config->log_file);
-       ServerInstance->SendError("Server terminated.");
-       exit(status);
-}
-
-void Rehash(int status)
-{
-       WriteOpers("Rehashing config file %s due to SIGHUP",CleanFilename(CONFIG_FILE));
+       ServerInstance->WriteOpers("Rehashing config file %s due to SIGHUP",ServerConfig::CleanFilename(CONFIG_FILE));
        fclose(ServerInstance->Config->log_file);
-       OpenLog(NULL,0);
+       ServerInstance->OpenLog(NULL,0);
        ServerInstance->Config->Read(false,NULL);
        FOREACH_MOD(I_OnRehash,OnRehash(""));
 }
@@ -146,11 +137,11 @@ void Rehash(int status)
 void InspIRCd::SetSignals(bool SEGVHandler)
 {
        signal (SIGALRM, SIG_IGN);
-       signal (SIGHUP, Rehash);
+       signal (SIGHUP, InspIRCd::Rehash);
        signal (SIGPIPE, SIG_IGN);
-       signal (SIGTERM, Exit);
+       signal (SIGTERM, InspIRCd::Exit);
        if (SEGVHandler)
-               signal (SIGSEGV, Error);
+               signal (SIGSEGV, InspIRCd::Error);
 }
 
 bool InspIRCd::DaemonSeed()
@@ -219,24 +210,28 @@ void InspIRCd::MakeLowerMap()
        lowermap[(unsigned)'\\'] = '|';
 }
 
-InspIRCd::InspIRCd(int argc, char** argv)
+InspIRCd::InspIRCd(int argc, char** argv) : ModCount(-1)
 {
        bool SEGVHandler = false;
-       this->Config = new ServerConfig;
        ServerInstance = this;
+
+       modules.resize(255);
+       factory.resize(255);
+
+       this->Config = new ServerConfig(this);
        this->Start();
        this->module_sockets.clear();
        this->startup_time = time(NULL);
        srand(time(NULL));
        log(DEBUG,"*** InspIRCd starting up!");
-       if (!FileExists(CONFIG_FILE))
+       if (!ServerConfig::FileExists(CONFIG_FILE))
        {
                printf("ERROR: Cannot open config file: %s\nExiting...\n",CONFIG_FILE);
                log(DEFAULT,"main: no config");
                printf("ERROR: Your config file is missing, this IRCd will self destruct in 10 seconds!\n");
                Exit(ERROR);
        }
-       *LOG_FILE = 0;
+       *this->LogFileName = 0;
        if (argc > 1) {
                for (int i = 1; i < argc; i++)
                {
@@ -268,8 +263,8 @@ InspIRCd::InspIRCd(int argc, char** argv)
                        {
                                if (argc > i+1)
                                {
-                                       strlcpy(LOG_FILE,argv[i+1],MAXBUF);
-                                       printf("LOG: Setting logfile to %s\n",LOG_FILE);
+                                       strlcpy(LogFileName,argv[i+1],MAXBUF);
+                                       printf("LOG: Setting logfile to %s\n",LogFileName);
                                }
                                else
                                {
@@ -293,11 +288,12 @@ InspIRCd::InspIRCd(int argc, char** argv)
        OpenLog(argv, argc);
        this->stats = new serverstats();
        this->Parser = new CommandParser();
+       this->Timers = new TimerManager();
        Config->ClearStack();
        Config->Read(true, NULL);
        CheckRoot();
        this->ModeGrok = new ModeParser();
-       AddServerName(Config->ServerName);
+       this->AddServerName(Config->ServerName);
        CheckDie();
        InitializeDisabledCommands(Config->DisabledCommands, this);
        stats->BoundPortCount = BindPorts(true);
@@ -368,7 +364,7 @@ void InspIRCd::EraseFactory(int j)
 void InspIRCd::EraseModule(int j)
 {
        int v1 = 0;
-       for (std::vector<Module*>::iterator m = modules.begin(); m!= modules.end(); m++)
+       for (ModuleList::iterator m = modules.begin(); m!= modules.end(); m++)
        {
                if (v1 == j)
                {
@@ -399,7 +395,7 @@ void InspIRCd::MoveTo(std::string modulename,int slot)
        {
                if (Config->module_names[v] == modulename)
                {
-                       // found an instance, swap it with the item at MODCOUNT
+                       // found an instance, swap it with the item at the end
                        v2 = v;
                        break;
                }
@@ -470,7 +466,7 @@ void InspIRCd::MoveToFirst(std::string modulename)
 
 void InspIRCd::MoveToLast(std::string modulename)
 {
-       MoveTo(modulename,MODCOUNT);
+       MoveTo(modulename,this->GetModuleCount());
 }
 
 void InspIRCd::BuildISupport()
@@ -532,7 +528,7 @@ bool InspIRCd::UnloadModule(const char* filename)
                        log(DEBUG,"Erasing module entry...");
                        this->EraseFactory(j);
                        log(DEFAULT,"Module %s unloaded",filename);
-                       MODCOUNT--;
+                       this->ModCount--;
                        BuildISupport();
                        return true;
                }
@@ -553,7 +549,7 @@ bool InspIRCd::LoadModule(const char* filename)
        std::string filename_str = filename;
 #ifndef STATIC_LINK
 #ifndef IS_CYGWIN
-       if (!DirValid(modfile))
+       if (!ServerConfig::DirValid(modfile))
        {
                log(DEFAULT,"Module %s is not within the modules directory.",modfile);
                snprintf(MODERR,MAXBUF,"Module %s is not within the modules directory.",modfile);
@@ -563,7 +559,7 @@ bool InspIRCd::LoadModule(const char* filename)
 #endif
        log(DEBUG,"Loading module: %s",modfile);
 #ifndef STATIC_LINK
-       if (FileExists(modfile))
+       if (ServerConfig::FileExists(modfile))
        {
 #endif
                for (unsigned int j = 0; j < Config->module_names.size(); j++)
@@ -578,29 +574,29 @@ bool InspIRCd::LoadModule(const char* filename)
                try
                {
                        ircd_module* a = new ircd_module(modfile);
-                       factory[MODCOUNT+1] = a;
-                       if (factory[MODCOUNT+1]->LastError())
+                       factory[this->ModCount+1] = a;
+                       if (factory[this->ModCount+1]->LastError())
                        {
-                               log(DEFAULT,"Unable to load %s: %s",modfile,factory[MODCOUNT+1]->LastError());
-                               snprintf(MODERR,MAXBUF,"Loader/Linker error: %s",factory[MODCOUNT+1]->LastError());
+                               log(DEFAULT,"Unable to load %s: %s",modfile,factory[this->ModCount+1]->LastError());
+                               snprintf(MODERR,MAXBUF,"Loader/Linker error: %s",factory[this->ModCount+1]->LastError());
                                return false;
                        }
-                       if ((int)factory[MODCOUNT+1]->factory != -1)
+                       if ((long)factory[this->ModCount+1]->factory != -1)
                        {
-                               Module* m = factory[MODCOUNT+1]->factory->CreateModule(MyServer);
-                               modules[MODCOUNT+1] = m;
+                               Module* m = factory[this->ModCount+1]->factory->CreateModule(MyServer);
+                               modules[this->ModCount+1] = m;
                                /* save the module and the module's classfactory, if
                                 * this isnt done, random crashes can occur :/ */
                                Config->module_names.push_back(filename);
 
-                               char* x = &Config->implement_lists[MODCOUNT+1][0];
+                               char* x = &Config->implement_lists[this->ModCount+1][0];
                                for(int t = 0; t < 255; t++)
                                        x[t] = 0;
 
-                               modules[MODCOUNT+1]->Implements(x);
+                               modules[this->ModCount+1]->Implements(x);
 
                                for(int t = 0; t < 255; t++)
-                                       Config->global_implementation[t] += Config->implement_lists[MODCOUNT+1][t];
+                                       Config->global_implementation[t] += Config->implement_lists[this->ModCount+1][t];
                        }
                        else
                        {
@@ -624,8 +620,8 @@ bool InspIRCd::LoadModule(const char* filename)
                return false;
        }
 #endif
-       MODCOUNT++;
-       FOREACH_MOD(I_OnLoadModule,OnLoadModule(modules[MODCOUNT],filename_str));
+       this->ModCount++;
+       FOREACH_MOD(I_OnLoadModule,OnLoadModule(modules[this->ModCount],filename_str));
        // now work out which modules, if any, want to move to the back of the queue,
        // and if they do, move them there.
        std::vector<std::string> put_to_back;
@@ -701,7 +697,7 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
                {
                        FOREACH_MOD(I_OnBackgroundTimer,OnBackgroundTimer(TIME));
                }
-               TickMissedTimers(TIME);
+               Timers->TickMissedTimers(TIME);
                expire_run = true;
                return;
        }   
@@ -735,7 +731,7 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
        if (process_module_sockets)
                this->DoSocketTimeouts(TIME);
         
-       TickTimers(TIME);
+       Timers->TickTimers(TIME);
         
        /* Call the socket engine to wait on the active
         * file descriptors. The socket engine has everything's
@@ -882,11 +878,58 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
        }
 }
 
+bool InspIRCd::IsIdent(const char* n)
+{
+       if (!n || !*n)
+               return false;
+
+       for (char* i = (char*)n; *i; i++)
+       {
+               if ((*i >= 'A') && (*i <= '}'))
+               {
+                       continue;
+               }
+               if (((*i >= '0') && (*i <= '9')) || (*i == '-') || (*i == '.'))
+               {
+                       continue;
+               }
+               return false;
+       }
+       return true;
+}
+
+
+bool InspIRCd::IsNick(const char* n)
+{
+       if (!n || !*n)
+               return false;
+
+       int p = 0; 
+       for (char* i = (char*)n; *i; i++, p++)
+       {
+               /* "A"-"}" can occur anywhere in a nickname */
+               if ((*i >= 'A') && (*i <= '}'))
+               {
+                       continue;
+               }
+               /* "0"-"9", "-" can occur anywhere BUT the first char of a nickname */
+               if ((((*i >= '0') && (*i <= '9')) || (*i == '-')) && (i > n))
+               {
+                       continue;
+               }
+               /* invalid character! abort */
+               return false;
+       }
+       return (p < NICKMAX - 1);
+}
+
 int InspIRCd::Run()
 {
-       this->Res = new DNS();
+       this->Res = new DNS(this);
+
+       log(DEBUG,"RES: %08x",this->Res);
 
-       LoadAllModules(this);
+       this->LoadAllModules();
 
        /* Just in case no modules were loaded - fix for bug #101 */
        this->BuildISupport();
@@ -952,15 +995,49 @@ int main(int argc, char** argv)
 
        try
        {
-               ServerInstance = new InspIRCd(argc, argv);
-               ServerInstance->Run();
-               DELETE(ServerInstance);
+               try
+               {
+                       ServerInstance = new InspIRCd(argc, argv);
+                       ServerInstance->Run();
+                       DELETE(ServerInstance);
+               }
+               catch (std::bad_alloc&)
+               {
+                       log(SPARSE,"You are out of memory! (got exception std::bad_alloc!)");
+                       ServerInstance->SendError("**** OUT OF MEMORY **** We're gonna need a bigger boat!");
+               }
        }
-       catch (std::bad_alloc)
+       catch (...)
        {
-               log(DEFAULT,"You are out of memory! (got exception std::bad_alloc!)");
-               ServerInstance->SendError("**** OUT OF MEMORY **** We're gonna need a bigger boat!");
-               printf("Out of memory! (got exception std::bad_alloc!");
+               log(SPARSE,"Uncaught exception, aborting.");
+               ServerInstance->SendError("Server terminating due to uncaught exception.");
        }
        return 0;
 }
+
+/* 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(userrec* user)
+{
+       if (!Config->global_implementation[I_OnCheckReady])
+               return true;
+
+       for (int i = 0; i <= this->GetModuleCount(); i++)
+       {
+               if (Config->implement_lists[i][I_OnCheckReady])
+               {
+                       int res = modules[i]->OnCheckReady(user);
+                       if (!res)
+                               return false;
+               }
+       }
+       return true;
+}
+
+int InspIRCd::GetModuleCount()
+{
+       return this->ModCount;
+}
+