]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
fixed std:: stuff
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 12a9bf756612fe80febb17afc00e4bdb831fe46e..450284d19d551470efad4d44985ea41685ecd5b0 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
  * See: http://www.inspircd.org/wiki/index.php/Credits
  *
  * This program is free but copyrighted software; see
@@ -82,7 +82,7 @@ void InspIRCd::Cleanup()
        }
 
        /* Close all client sockets, or the new process inherits them */
-       for (std::vector<User*>::const_iterator i = this->local_users.begin(); i != this->local_users.end(); i++)
+       for (std::vector<User*>::const_iterator i = this->Users->local_users.begin(); i != this->Users->local_users.end(); i++)
        {
                (*i)->SetWriteError("Server shutdown");
                (*i)->CloseSocket();
@@ -156,21 +156,21 @@ void InspIRCd::ResetMaxBans()
  */
 void InspIRCd::RehashUsersAndChans()
 {
-       user_hash* old_users = this->clientlist;
-       user_hash* old_uuid  = this->uuidlist;
+       user_hash* old_users = this->Users->clientlist;
+       user_hash* old_uuid  = this->Users->uuidlist;
        chan_hash* old_chans = this->chanlist;
 
-       this->clientlist = new user_hash();
-       this->uuidlist = new user_hash();
+       this->Users->clientlist = new user_hash();
+       this->Users->uuidlist = new user_hash();
        this->chanlist = new chan_hash();
 
        for (user_hash::const_iterator n = old_users->begin(); n != old_users->end(); n++)
-               this->clientlist->insert(*n);
+               this->Users->clientlist->insert(*n);
 
        delete old_users;
 
        for (user_hash::const_iterator n = old_uuid->begin(); n != old_uuid->end(); n++)
-               this->uuidlist->insert(*n);
+               this->Users->uuidlist->insert(*n);
 
        delete old_uuid;
 
@@ -308,13 +308,17 @@ InspIRCd::InspIRCd(int argc, char** argv)
        delete SEF;
 
        this->s_signal = 0;
+       
+       // Create base manager classes early, so nothing breaks
+       this->Users = new UserManager(this);
+       
+       this->Users->unregistered_count = 0;
 
-       this->unregistered_count = 0;
-
-       this->clientlist = new user_hash();
-       this->uuidlist = new user_hash();
+       this->Users->clientlist = new user_hash();
+       this->Users->uuidlist = new user_hash();
        this->chanlist = new chan_hash();
 
+       this->Res = NULL;
 
        this->Config = new ServerConfig(this);
        this->SNO = new SnomaskManager(this);
@@ -398,7 +402,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        // Set up winsock
        WSADATA wsadata;
        WSAStartup(MAKEWORD(2,0), &wsadata);
-
        ChangeWindowsSpecificPointers(this);
 #endif
        strlcpy(Config->MyExecutable,argv[0],MAXBUF);
@@ -430,9 +433,9 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->Modes = new ModeParser(this);
 
        /* set up fake client (uid is incorrect at this point,
-         * until after config is read. we set up the user again
-         * at that point 
-         */
+        * until after config is read. we set up the user again
+        * at that point 
+        */
        this->FakeClient = new User(this);
        this->FakeClient->SetFd(FD_MAGIC_NUMBER);
 
@@ -465,80 +468,52 @@ InspIRCd::InspIRCd(int argc, char** argv)
 
        SE->RecoverFromFork();
 
-       this->Res = new DNS(this);
-
        /* Read config, pass 0. At the end if this pass,
         * the Config->IncludeFiles is populated, we call
         * Config->StartDownloads to initialize the downlaods of all
         * these files.
         */
-        Config->Read(true, NULL, 0);
-       Config->StartDownloads();
-       
-       /* Now the downloads are started, we monitor them for completion.
-        * On completion, we call Read again with pass = 1.
-        * NOTE: We really should add a timeout here
-        */
+       Config->Read(true, NULL, 0);
+       Config->DoDownloads();
+       /* We have all the files we can get, initiate pass 1 */
+       Config->Read(true, NULL, 1);
 
-       while (Config->Downloading())
+       this->AddServerName(Config->ServerName);
+
+       /*
+        * Initialise SID/UID.
+        * For an explanation as to exactly how this works, and why it works this way, see GetUID().
+        *   -- w00t
+        */
+       if (*Config->sid)
        {
-               SE->DispatchEvents();
-               this->BufferedSocketCull();
        }
-
-       printf("\n");
-
-       if (Config->FileErrors)
+       else
        {
-               /* One or more file download/access errors, do not
-                * proceed to second pass
-                */
-               for (std::map<std::string, std::istream*>::iterator x = Config->IncludedFiles.begin(); x != Config->IncludedFiles.end(); ++x)
-               {
-                       if (!x->second)
-                               printf("ERROR: Failed to access the file: %s.\n", x->first.c_str());
-               }
-               printf("Initialisation of configuration failed.\n");
-               Exit(EXIT_STATUS_CONFIG);
+               // Generate one
+               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;
+
+               Config->sid[0] = (char)(sid / 100 + 48);
+               Config->sid[1] = (char)(((sid / 10) % 10) + 48);
+               Config->sid[2] = (char)(sid % 10 + 48);
        }
 
-       /* We have all the files we can get, initiate pass 1 */
-       Config->Read(true, NULL, 1);
+       this->InitialiseUID();
 
-        this->AddServerName(Config->ServerName);
-
-        /* set up fake client again this time with the correct uid */
-        delete FakeClient;
-        this->FakeClient = new User(this);
-        this->FakeClient->SetFd(FD_MAGIC_NUMBER);
-
-        /*
-         * Initialise SID/UID.
-         * For an explanation as to exactly how this works, and why it works this way, see GetUID().
-         *   -- w00t
-         */
-        /* 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;
-        }
-
-        this->InitialiseUID();
-
-        // Get XLine to do it's thing.
-        this->XLines->CheckELines();
-        this->XLines->ApplyLines();
+       /* set up fake client again this time with the correct uid */
+       delete FakeClient;
+       this->FakeClient = new User(this);
+       this->FakeClient->SetFd(FD_MAGIC_NUMBER);
+
+       // Get XLine to do it's thing.
+       this->XLines->CheckELines();
+       this->XLines->ApplyLines();
 
 
        CheckDie();
@@ -605,8 +580,8 @@ InspIRCd::InspIRCd(int argc, char** argv)
        }
 #endif
 
-       printf("\nInspIRCd is now running!\n");
-       Log(DEFAULT,"Startup complete.");
+       printf("\nInspIRCd is now running as '%s'[%s]\n", Config->ServerName,Config->GetSID().c_str());
+       Log(DEFAULT,"Startup complete as '%s'[%s]", Config->ServerName,Config->GetSID().c_str());
 
        this->WritePID(Config->PID);
 }
@@ -614,16 +589,17 @@ InspIRCd::InspIRCd(int argc, char** argv)
 /* moved to a function, as UID generation can call this also */
 void InspIRCd::InitialiseUID()
 {
-       int i;
-       size_t sid = Config->sid;
+       int i = 3;
 
-       current_uid[0] = sid / 100 + 48;
-       current_uid[1] = ((sid / 10) % 10) + 48;
-       current_uid[2] = sid % 10 + 48;
+       current_uid[0] = Config->sid[0];
+       current_uid[1] = Config->sid[1];
+       current_uid[2] = Config->sid[2];
 
        /* Initialise UID */
        for(i = 3; i < UUID_LENGTH - 1; i++)
                current_uid[i] = 'A';
+
+       current_uid[UUID_LENGTH] = '\0';
 }
 
 int InspIRCd::Run()
@@ -653,7 +629,7 @@ int InspIRCd::Run()
                {
                        if (TIME < OLDTIME)
                        {
-                               WriteOpers("*** \002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %d secs.",abs(OLDTIME-TIME));
+                               SNO->WriteToSnoMask('A', "\002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %d secs.",abs(OLDTIME-TIME));
                        }
 
                        if ((TIME % 3600) == 0)
@@ -668,7 +644,7 @@ int InspIRCd::Run()
                        if ((TIME % 5) == 0)
                        {
                                FOREACH_MOD_I(this,I_OnBackgroundTimer,OnBackgroundTimer(TIME));
-                               Timers->TickMissedTimers(TIME);
+                               SNO->FlushSnotices();
                        }
 #ifndef WIN32
                        /* Same change as in cmd_stats.cpp, use RUSAGE_SELF rather than '0' -- Om */
@@ -678,16 +654,7 @@ int InspIRCd::Run()
                                this->stats->LastCPU = ru.ru_utime;
                        }
 #else
-                       WindowsIPC->Check();
-       
-                       if(Config->nofork)
-                       {
-                               uptime = Time() - startup_time;
-                               stime = gmtime(&uptime);
-                               snprintf(window_title, 100, "InspIRCd - %u clients, %u accepted connections - Up %u days, %.2u:%.2u:%.2u",
-                                       LocalUserCount(), stats->statsAccept, stime->tm_yday, stime->tm_hour, stime->tm_min, stime->tm_sec);
-                               SetConsoleTitle(window_title);
-                       }
+                       WindowsIPC->Check();    
 #endif
                }
 
@@ -700,7 +667,7 @@ int InspIRCd::Run()
                 */
                this->SE->DispatchEvents();
 
-               /* if any users was quit, take them out */
+               /* if any users were quit, take them out */
                this->GlobalCulls.Apply();
 
                /* If any inspsockets closed, remove them */
@@ -720,6 +687,7 @@ void InspIRCd::BufferedSocketCull()
 {
        for (std::map<BufferedSocket*,BufferedSocket*>::iterator x = SocketCull.begin(); x != SocketCull.end(); ++x)
        {
+               Log(DEBUG,"Cull socket");
                SE->DelFd(x->second);
                x->second->Close();
                delete x->second;
@@ -773,24 +741,6 @@ int InspIRCd::SetTimeDelta(int delta)
        return old;
 }
 
-void InspIRCd::AddLocalClone(User* user)
-{
-       clonemap::iterator x = local_clones.find(user->GetIPString());
-       if (x != local_clones.end())
-               x->second++;
-       else
-               local_clones[user->GetIPString()] = 1;
-}
-
-void InspIRCd::AddGlobalClone(User* user)
-{
-       clonemap::iterator y = global_clones.find(user->GetIPString());
-       if (y != global_clones.end())
-               y->second++;
-       else
-               global_clones[user->GetIPString()] = 1;
-}
-
 int InspIRCd::GetTimeDelta()
 {
        return time_delta;