]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Add duplicate UID error in ParseUID(), seems pippijn was triggering it and it was...
[user/henk/code/inspircd.git] / src / inspircd.cpp
index e7d43edffd3f5c5700398c65148053fb21b12eab..fe36208d13670e58f43584aefe350ca8ac1c5b60 100644 (file)
@@ -6,13 +6,12 @@
  * See: http://www.inspircd.org/wiki/index.php/Credits
  *
  * This program is free but copyrighted software; see
- *            the file COPYING for details.
+ *         the file COPYING for details.
  *
  * ---------------------------------------------------
  */
 
 #include "inspircd.h"
-#include "configreader.h"
 #include <signal.h>
 
 #ifndef WIN32
        #endif
 #endif
 
-#include <exception>
 #include <fstream>
-#include "modules.h"
-#include "mode.h"
 #include "xline.h"
 #include "socketengine.h"
 #include "inspircd_se_config.h"
 #include "socket.h"
-#include "typedefs.h"
 #include "command_parse.h"
 #include "exitcodes.h"
 #include "caller.h"
@@ -73,7 +68,7 @@ const char* ExitCodes[] =
 void InspIRCd::Cleanup()
 {
        std::vector<std::string> mymodnames;
-       int MyModCount = this->GetModuleCount();
+       int MyModCount = this->Modules->GetCount();
 
        if (Config)
        {
@@ -99,7 +94,7 @@ void InspIRCd::Cleanup()
         */
        for (int tries = 0; tries < 3; tries++)
        {
-               MyModCount = this->GetModuleCount();
+               MyModCount = this->Modules->GetCount();
                mymodnames.clear();
 
                if (MyModCount)
@@ -109,7 +104,7 @@ void InspIRCd::Cleanup()
                                mymodnames.push_back(Config->module_names[j]);
 
                        for (int k = 0; k <= MyModCount; k++)
-                               this->UnloadModule(mymodnames[k].c_str());
+                               this->Modules->Unload(mymodnames[k].c_str());
                }
        }
 
@@ -165,9 +160,11 @@ void InspIRCd::ResetMaxBans()
 void InspIRCd::RehashUsersAndChans()
 {
        user_hash* old_users = this->clientlist;
+       user_hash* old_uuid  = this->uuidlist;
        chan_hash* old_chans = this->chanlist;
 
        this->clientlist = new user_hash();
+       this->uuidlist = new user_hash();
        this->chanlist = new chan_hash();
 
        for (user_hash::const_iterator n = old_users->begin(); n != old_users->end(); n++)
@@ -175,6 +172,11 @@ void InspIRCd::RehashUsersAndChans()
 
        delete old_users;
 
+       for (user_hash::const_iterator n = old_uuid->begin(); n != old_uuid->end(); n++)
+               this->uuidlist->insert(*n);
+
+       delete old_uuid;
+
        for (chan_hash::const_iterator n = old_chans->begin(); n != old_chans->end(); n++)
                this->chanlist->insert(*n);
 
@@ -278,8 +280,7 @@ void InspIRCd::WritePID(const std::string &filename)
 }
 
 InspIRCd::InspIRCd(int argc, char** argv)
-       : ModCount(0),
-         GlobalCulls(this),
+       : GlobalCulls(this),
 
         /* Functor initialisation. Note that the ordering here is very important. */
         HandleProcessUser(this),
@@ -302,12 +303,10 @@ InspIRCd::InspIRCd(int argc, char** argv)
        int do_version = 0, do_nofork = 0, do_debug = 0, do_nolog = 0, do_root = 0;    /* flag variables */
        char c = 0;
 
-       modules.resize(255);
-       factory.resize(255);
        memset(&server, 0, sizeof(server));
        memset(&client, 0, sizeof(client));
 
-        SocketEngineFactory* SEF = new SocketEngineFactory();
+       SocketEngineFactory* SEF = new SocketEngineFactory();
        SE = SEF->Create(this);
        delete SEF;
 
@@ -316,6 +315,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->unregistered_count = 0;
 
        this->clientlist = new user_hash();
+       this->uuidlist = new user_hash();
        this->chanlist = new chan_hash();
 
        this->Config = new ServerConfig(this);
@@ -422,12 +422,52 @@ InspIRCd::InspIRCd(int argc, char** argv)
                Exit(EXIT_STATUS_LOG);
        }
 
+       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->ClearStack();
        Config->Read(true, NULL);
+       
+       this->Modules->modules.resize(255);
+       this->Modules->handles.resize(255);
+
+       /*
+        * Initialise UID. XXX, we need to read SID from config, and use it instead of 000.
+        * For an explanation as to exactly how this works, and why it works this way, see GetUID().
+        *   -- w00t
+        */
+       int i;
+
+       /* 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;
+       }
+       current_uid[0] = sid / 100 + 48;
+       current_uid[1] = ((sid / 10) % 10) + 48;
+       current_uid[2] = sid % 10 + 48;
+
+       /* Initialise UID */
+       for(i = 3; i < UUID_LENGTH - 1; i++)
+               current_uid[i] = 'A';
+
+       /* set up fake client */
+       this->FakeClient = new userrec(this);
+       this->FakeClient->SetFd(FD_MAGIC_NUMBER);
 
        if (!do_root)
                this->CheckRoot();
@@ -472,7 +512,8 @@ InspIRCd::InspIRCd(int argc, char** argv)
 
        this->Res = new DNS(this);
 
-       this->LoadAllModules();
+       this->Modules->LoadAll();
+       
        /* Just in case no modules were loaded - fix for bug #101 */
        this->BuildISupport();
        InitializeDisabledCommands(Config->DisabledCommands, this);
@@ -530,20 +571,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        }
 #endif
 
-
-       /*
-        * Initialise UID. XXX, we need to read SID from config, and use it instead of 000.
-        * For an explanation as to exactly how this works, and why it works this way, see GetUID().
-        *   -- w00t
-        */
-       int i;
-
-       for(i = 0; i < 3; i++)
-               current_uid[i] = '0';
-
-       for(i = 3; i < UUID_LENGTH - 1; i++)
-               current_uid[i] = 'A';
-
        printf("\nInspIRCd is now running!\n");
        Log(DEFAULT,"Startup complete.");
 
@@ -678,11 +705,11 @@ bool InspIRCd::AllModulesReportReady(userrec* user)
        if (!Config->global_implementation[I_OnCheckReady])
                return true;
 
-       for (int i = 0; i <= this->GetModuleCount(); i++)
+       for (int i = 0; i <= this->Modules->GetCount(); i++)
        {
                if (Config->implement_lists[i][I_OnCheckReady])
                {
-                       int res = modules[i]->OnCheckReady(user);
+                       int res = this->Modules->modules[i]->OnCheckReady(user);
                        if (!res)
                                return false;
                }
@@ -690,11 +717,6 @@ bool InspIRCd::AllModulesReportReady(userrec* user)
        return true;
 }
 
-int InspIRCd::GetModuleCount()
-{
-       return this->ModCount;
-}
-
 time_t InspIRCd::Time(bool delta)
 {
        if (delta)
@@ -737,4 +759,3 @@ void InspIRCd::SetSignal(int signal)
 {
        *mysig = signal;
 }
-