]> 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 6d7a2657979136d71a6ae276ccce16a1b1446b07..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"
 
-using irc::sockets::NonBlocking;
-using irc::sockets::Blocking;
 using irc::sockets::insp_ntoa;
 using irc::sockets::insp_inaddr;
 using irc::sockets::insp_sockaddr;
@@ -75,15 +68,18 @@ const char* ExitCodes[] =
 void InspIRCd::Cleanup()
 {
        std::vector<std::string> mymodnames;
-       int MyModCount = this->GetModuleCount();
+       int MyModCount = this->Modules->GetCount();
 
-       for (unsigned int i = 0; i < Config->ports.size(); i++)
+       if (Config)
        {
-               /* This calls the constructor and closes the listening socket */
-               delete Config->ports[i];
-       }
+               for (unsigned int i = 0; i < Config->ports.size(); i++)
+               {
+                       /* This calls the constructor and closes the listening socket */
+                       delete Config->ports[i];
+               }
 
-       Config->ports.clear();
+               Config->ports.clear();
+       }
 
        /* Close all client sockets, or the new process inherits them */
        for (std::vector<userrec*>::const_iterator i = this->local_users.begin(); i != this->local_users.end(); i++)
@@ -98,28 +94,27 @@ void InspIRCd::Cleanup()
         */
        for (int tries = 0; tries < 3; tries++)
        {
-               MyModCount = this->GetModuleCount();
+               MyModCount = this->Modules->GetCount();
                mymodnames.clear();
 
-               /* 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]);
+               if (MyModCount)
+               {
+                       /* 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->UnloadModule(mymodnames[k].c_str());
+                       for (int k = 0; k <= MyModCount; k++)
+                               this->Modules->Unload(mymodnames[k].c_str());
+               }
        }
 
        /* Close logging */
-       this->Logger->Close();
+       if (this->Logger)
+               this->Logger->Close();
 
        /* Cleanup Server Names */
        for(servernamelist::iterator itr = servernames.begin(); itr != servernames.end(); ++itr)
                delete (*itr);
-
-#ifdef WINDOWS
-       /* WSACleanup */
-       WSACleanup();
-#endif
 }
 
 void InspIRCd::Restart(const std::string &reason)
@@ -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);
 
@@ -183,7 +185,8 @@ void InspIRCd::RehashUsersAndChans()
 
 void InspIRCd::CloseLog()
 {
-       this->Logger->Close();
+       if (this->Logger)
+               this->Logger->Close();
 }
 
 void InspIRCd::SetSignals()
@@ -277,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),
@@ -301,16 +303,19 @@ 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();
+       SE = SEF->Create(this);
+       delete SEF;
+
        this->s_signal = 0;
 
        this->unregistered_count = 0;
 
        this->clientlist = new user_hash();
+       this->uuidlist = new user_hash();
        this->chanlist = new chan_hash();
 
        this->Config = new ServerConfig(this);
@@ -411,14 +416,58 @@ InspIRCd::InspIRCd(int argc, char** argv)
 
        strlcpy(Config->MyExecutable,argv[0],MAXBUF);
 
-       this->OpenLog(argv, argc);
+       if (!this->OpenLog(argv, argc))
+       {
+               printf("ERROR: Could not open logfile %s: %s\n\n", Config->logpath.c_str(), strerror(errno));
+               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();
@@ -447,13 +496,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
                }
        }
 
-
-       /* Because of limitations in kqueue on freebsd, we must fork BEFORE we
-        * initialize the socket engine.
-        */
-       SocketEngineFactory* SEF = new SocketEngineFactory();
-       SE = SEF->Create(this);
-       delete SEF;
+       SE->RecoverFromFork();
 
        this->Modes = new ModeParser(this);
        this->AddServerName(Config->ServerName);
@@ -469,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);
@@ -526,6 +570,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
                FreeConsole();
        }
 #endif
+
        printf("\nInspIRCd is now running!\n");
        Log(DEFAULT,"Startup complete.");
 
@@ -660,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;
                }
@@ -672,11 +717,6 @@ bool InspIRCd::AllModulesReportReady(userrec* user)
        return true;
 }
 
-int InspIRCd::GetModuleCount()
-{
-       return this->ModCount;
-}
-
 time_t InspIRCd::Time(bool delta)
 {
        if (delta)
@@ -719,4 +759,3 @@ void InspIRCd::SetSignal(int signal)
 {
        *mysig = signal;
 }
-