]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
-Wshadow fixes for some modules in extra/
[user/henk/code/inspircd.git] / src / inspircd.cpp
index f21716e5bd5f06055dcbf5e1118547cfc63947ee..209b7ddbcae9101eb9b9d268e727ba407b8414d4 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();
@@ -103,9 +103,7 @@ void InspIRCd::Cleanup()
        }
 
        /* Close logging */
-       if (this->Logger)
-               this->Logger->Close();
-
+       this->Logs->CloseLogs();
 
        /* Cleanup Server Names */
        for(servernamelist::iterator itr = servernames.begin(); itr != servernames.end(); ++itr)
@@ -156,21 +154,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;
 
@@ -180,12 +178,6 @@ void InspIRCd::RehashUsersAndChans()
        delete old_chans;
 }
 
-void InspIRCd::CloseLog()
-{
-       if (this->Logger)
-               this->Logger->Close();
-}
-
 void InspIRCd::SetSignals()
 {
 #ifndef WIN32
@@ -303,18 +295,25 @@ InspIRCd::InspIRCd(int argc, char** argv)
        memset(&server, 0, sizeof(server));
        memset(&client, 0, sizeof(client));
 
+       // This must be created first, so other parts of Insp can use it while starting up
+       this->Logs = new LogManager(this);
+
        SocketEngineFactory* SEF = new SocketEngineFactory();
        SE = SEF->Create(this);
        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 +397,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);
@@ -418,7 +416,9 @@ InspIRCd::InspIRCd(int argc, char** argv)
 
        printf_c("\033[1;32mInspire Internet Relay Chat Server, compiled %s at %s\n",__DATE__,__TIME__);
        printf_c("(C) InspIRCd Development Team.\033[0m\n\n");
-       printf_c("Developers:\t\t\033[1;32mBrain, FrostyCoolSlug, w00t, Om, Special, pippijn, peavey, Burlex\033[0m\n");
+       printf_c("Developers:\n");
+       printf_c("\t\033[1;32mBrain, FrostyCoolSlug, w00t, Om, Special\n");
+       printf_c("\t\033[1;32mpippijn, peavey, aquanight, fez\033[0m\n\n");
        printf_c("Others:\t\t\t\033[1;32mSee /INFO Output\033[0m\n");
 
        /* Set the finished argument values */
@@ -428,33 +428,11 @@ InspIRCd::InspIRCd(int argc, char** argv)
        Config->ClearStack();
 
        this->Modes = new ModeParser(this);
-       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
+       /* set up fake client (uid is incorrect at this point,
+        * until after config is read. we set up the user again
+        * at that point 
         */
-       /* 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();
-
-       /* set up fake client */
        this->FakeClient = new User(this);
        this->FakeClient->SetFd(FD_MAGIC_NUMBER);
 
@@ -480,20 +458,59 @@ InspIRCd::InspIRCd(int argc, char** argv)
                if (!this->DaemonSeed())
                {
                        printf("ERROR: could not go into daemon mode. Shutting down.\n");
-                       Log(DEFAULT,"ERROR: could not go into daemon mode. Shutting down.");
+                       Logs->Log("STARTUP", DEFAULT, "ERROR: could not go into daemon mode. Shutting down.");
                        Exit(EXIT_STATUS_FORK);
                }
        }
 
        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->DoDownloads();
+       /* We have all the files we can get, initiate pass 1 */
+       Config->Read(true, NULL, 1);
+
+       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)
+       {
+       }
+       else
+       {
+               // Generate one
+               size_t sid = 0;
 
-        Config->Read(true, NULL);
+               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;
 
-        // Get XLine to do it's thing.
-        this->XLines->CheckELines();
-        this->XLines->ApplyLines();
+               Config->sid[0] = (char)(sid / 100 + 48);
+               Config->sid[1] = (char)(((sid / 10) % 10) + 48);
+               Config->sid[2] = (char)(sid % 10 + 48);
+       }
+
+       this->InitialiseUID();
+
+       /* 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();
@@ -510,7 +527,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        if ((Config->ports.size() == 0) && (found_ports > 0))
        {
                printf("\nERROR: I couldn't bind any ports! Are you sure you didn't start InspIRCd twice?\n");
-               Log(DEFAULT,"ERROR: I couldn't bind any ports! Are you sure you didn't start InspIRCd twice?");
+               Logs->Log("STARTUP", DEFAULT,"ERROR: I couldn't bind any ports! Something else is bound to those ports!");
                Exit(EXIT_STATUS_BIND);
        }
 
@@ -530,7 +547,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
                if (kill(getppid(), SIGTERM) == -1)
                {
                        printf("Error killing parent process: %s\n",strerror(errno));
-                       Log(DEFAULT,"Error killing parent process: %s",strerror(errno));
+                       Logs->Log("STARTUP", DEFAULT, "Error killing parent process: %s",strerror(errno));
                }
        }
 
@@ -548,7 +565,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
                }
                else
                {
-                       Log(DEFAULT,"Keeping pseudo-tty open as we are running in the foreground.");
+                       Logs->Log("STARTUP", DEFAULT,"Keeping pseudo-tty open as we are running in the foreground.");
                }
        }
 #else
@@ -560,8 +577,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());
+       Logs->Log("STARTUP", DEFAULT, "Startup complete as '%s'[%s]", Config->ServerName,Config->GetSID().c_str());
 
        this->WritePID(Config->PID);
 }
@@ -569,16 +586,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()
@@ -608,7 +626,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)
@@ -623,7 +641,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 */
@@ -633,16 +651,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
                }
 
@@ -655,7 +664,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 */
@@ -675,6 +684,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;
@@ -728,24 +738,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;