]> 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 14f88e0a3a247fc1c7912a1b7d193c026691d185..5ed9b1cc9d331d7d11707207a41daec404dca01b 100644 (file)
@@ -72,12 +72,6 @@ using irc::sockets::insp_sockaddr;
 
 InspIRCd* ServerInstance = NULL;
 
-extern ModuleList modules;
-extern FactoryList factory;
-
-extern int MODCOUNT;
-extern char LOG_FILE[MAXBUF];
-
 int iterations = 0;
 
 insp_sockaddr client, server;
@@ -114,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);
@@ -131,19 +125,11 @@ void InspIRCd::Start()
        printf("Name concept:\t\t\033[1;32mLord_Zathras\033[0m\n\n");
 }
 
-void Killed(int status)
-{
-       if (ServerInstance->Config->log_file)
-               fclose(ServerInstance->Config->log_file);
-       ServerInstance->SendError("Server terminated.");
-       exit(status);
-}
-
-void Rehash(int status)
+void InspIRCd::Rehash(int status)
 {
-       ServerInstance->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(""));
 }
@@ -151,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()
@@ -224,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;
        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++)
                {
@@ -273,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
                                {
@@ -374,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)
                {
@@ -405,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;
                }
@@ -476,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()
@@ -538,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;
                }
@@ -559,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);
@@ -569,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++)
@@ -584,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 ((long)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
                        {
@@ -630,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;
@@ -939,7 +929,7 @@ int InspIRCd::Run()
 
        log(DEBUG,"RES: %08x",this->Res);
 
-       LoadAllModules(this);
+       this->LoadAllModules();
 
        /* Just in case no modules were loaded - fix for bug #101 */
        this->BuildISupport();
@@ -1024,3 +1014,30 @@ int main(int argc, char** argv)
        }
        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;
+}
+