]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Add options:maxtargets that was somehow omitted, fixes bug #400 (Reported by DarkStorm)
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 6d7a2657979136d71a6ae276ccce16a1b1446b07..bfd7a9d45791fb233a6ef2dce923af794f951021 100644 (file)
@@ -41,8 +41,6 @@
 #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;
@@ -77,13 +75,16 @@ void InspIRCd::Cleanup()
        std::vector<std::string> mymodnames;
        int MyModCount = this->GetModuleCount();
 
-       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++)
@@ -101,25 +102,24 @@ void InspIRCd::Cleanup()
                MyModCount = this->GetModuleCount();
                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->UnloadModule(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 +165,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 +177,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 +190,8 @@ void InspIRCd::RehashUsersAndChans()
 
 void InspIRCd::CloseLog()
 {
-       this->Logger->Close();
+       if (this->Logger)
+               this->Logger->Close();
 }
 
 void InspIRCd::SetSignals()
@@ -306,11 +314,16 @@ InspIRCd::InspIRCd(int argc, char** argv)
        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,7 +424,11 @@ 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->stats = new serverstats();
        this->Timers = new TimerManager(this);
@@ -447,13 +464,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);
@@ -526,6 +537,31 @@ InspIRCd::InspIRCd(int argc, char** argv)
                FreeConsole();
        }
 #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;
+
+
+       /* Generate SID */
+        size_t sid = 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;
+       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';
+
        printf("\nInspIRCd is now running!\n");
        Log(DEFAULT,"Startup complete.");