]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Logging
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 98418a967c7fd81c012c41fc3b506a6d2876da14..06a52ed082135bd26ce838af5029c1032b560b31 100644 (file)
@@ -72,6 +72,8 @@ std::vector<userrec*> local_users;
 extern int MODCOUNT;
 extern char LOG_FILE[MAXBUF];
 int openSockfd[MAXSOCKS];
+int yield_depth;
+int iterations = 0;
 sockaddr_in client,server;
 socklen_t length;
 
@@ -89,7 +91,7 @@ ServerConfig *Config = new ServerConfig;
 
 user_hash clientlist;
 chan_hash chanlist;
-whowas_hash whowas;
+
 servernamelist servernames;
 char lowermap[255];
 
@@ -127,21 +129,7 @@ bool FindServerName(std::string servername)
 
 std::string InspIRCd::GetRevision()
 {
-       /* w00t got me to replace a bunch of strtok_r
-        * with something nicer, so i did this. Its the
-        * same thing really, only in C++. It places the
-        * text into a std::stringstream which is a readable
-        * and writeable buffer stream, and then pops two
-        * words off it, space delimited. Because it reads
-        * into the same variable twice, the first word
-        * is discarded, and the second one returned.
-        */
-
-       /* XXX - this revision ID is NOT bumping automatically -- w00t */
-       std::stringstream Revision("$Revision$");
-       std::string single;
-       Revision >> single >> single;
-       return single;
+       return REVISION;
 }
 
 void InspIRCd::MakeLowerMap()
@@ -251,11 +239,11 @@ std::string InspIRCd::GetVersionString()
 #endif
        if (*Config->CustomVersion)
        {
-               snprintf(versiondata,MAXBUF,"%s Rev. %s %s :%s",VERSION,GetRevision().c_str(),Config->ServerName,Config->CustomVersion);
+               snprintf(versiondata,MAXBUF,"%s %s :%s",VERSION,Config->ServerName,Config->CustomVersion);
        }
        else
        {
-               snprintf(versiondata,MAXBUF,"%s Rev. %s %s :%s [FLAGS=%lu,%s,%s]",VERSION,GetRevision().c_str(),Config->ServerName,SYSTEM,(unsigned long)OPTIMISATION,SE->GetName().c_str(),dnsengine);
+               snprintf(versiondata,MAXBUF,"%s %s :%s [FLAGS=%lu,%s,%s]",VERSION,Config->ServerName,SYSTEM,(unsigned long)OPTIMISATION,SE->GetName().c_str(),dnsengine);
        }
        return versiondata;
 }
@@ -310,7 +298,6 @@ void InspIRCd::erase_module(int j)
 void InspIRCd::MoveTo(std::string modulename,int slot)
 {
        unsigned int v2 = 256;
-       log(DEBUG,"Moving %s to slot %d",modulename.c_str(),slot);
        for (unsigned int v = 0; v < Config->module_names.size(); v++)
        {
                if (Config->module_names[v] == modulename)
@@ -320,11 +307,7 @@ void InspIRCd::MoveTo(std::string modulename,int slot)
                        break;
                }
        }
-       if (v2 == (unsigned int)slot)
-       {
-               log(DEBUG,"Item %s already in slot %d!",modulename.c_str(),slot);
-       }
-       else if (v2 < 256)
+       if ((v2 != (unsigned int)slot) && (v2 < 256))
        {
                // Swap the module names over
                Config->module_names[v2] = Config->module_names[slot];
@@ -345,7 +328,6 @@ void InspIRCd::MoveTo(std::string modulename,int slot)
                        Config->implement_lists[v2][n] = Config->implement_lists[slot][n];
                        Config->implement_lists[slot][n] = x;
                }
-               log(DEBUG,"Moved %s to slot successfully",modulename.c_str());
        }
        else
        {
@@ -355,7 +337,6 @@ void InspIRCd::MoveTo(std::string modulename,int slot)
 
 void InspIRCd::MoveAfter(std::string modulename, std::string after)
 {
-       log(DEBUG,"Move %s after %s...",modulename.c_str(),after.c_str());
        for (unsigned int v = 0; v < Config->module_names.size(); v++)
        {
                if (Config->module_names[v] == after)
@@ -368,7 +349,6 @@ void InspIRCd::MoveAfter(std::string modulename, std::string after)
 
 void InspIRCd::MoveBefore(std::string modulename, std::string before)
 {
-       log(DEBUG,"Move %s before %s...",modulename.c_str(),before.c_str());
        for (unsigned int v = 0; v < Config->module_names.size(); v++)
        {
                if (Config->module_names[v] == before)
@@ -523,13 +503,7 @@ bool InspIRCd::LoadModule(const char* filename)
                                modules[MODCOUNT+1]->Implements(x);
 
                                for(int t = 0; t < 255; t++)
-                               {
                                        Config->global_implementation[t] += Config->implement_lists[MODCOUNT+1][t];
-                                       if (Config->implement_lists[MODCOUNT+1][t])
-                                       {
-                                               log(DEBUG,"Add global implementation: %d %d => %d",MODCOUNT+1,t,Config->global_implementation[t]);
-                                       }
-                               }
                        }
                        else
                        {
@@ -573,15 +547,11 @@ bool InspIRCd::LoadModule(const char* filename)
                }
                else if ((modules[j]->Prioritize() & 0xFF) == PRIORITY_BEFORE)
                {
-                       log(DEBUG,"Module %d wants PRIORITY_BEFORE",j);
                        put_before[Config->module_names[j]] = Config->module_names[modules[j]->Prioritize() >> 8];
-                       log(DEBUG,"Before: %s",Config->module_names[modules[j]->Prioritize() >> 8].c_str());
                }
                else if ((modules[j]->Prioritize() & 0xFF) == PRIORITY_AFTER)
                {
-                       log(DEBUG,"Module %d wants PRIORITY_AFTER",j);
                        put_after[Config->module_names[j]] = Config->module_names[modules[j]->Prioritize() >> 8];
-                       log(DEBUG,"After: %s",Config->module_names[modules[j]->Prioritize() >> 8].c_str());
                }
        }
        for (unsigned int j = 0; j < put_to_back.size(); j++)
@@ -606,7 +576,6 @@ bool InspIRCd::LoadModule(const char* filename)
 
 void InspIRCd::DoOneIteration(bool process_module_sockets)
 {
-        /*bool expire_run = false;
         int activefds[MAX_DESCRIPTORS];
         int incomingSockfd;
         int in_port;
@@ -615,7 +584,12 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
         InspSocket* s_del = NULL;
         unsigned int numberactive;
         sockaddr_in sock_us;     // our port number
-        socklen_t uslen;*/         // length of our port number
+        socklen_t uslen;         // length of our port number
+
+       if (yield_depth > 3)
+               return;
+
+       yield_depth++;
 
         /* time() seems to be a pretty expensive syscall, so avoid calling it too much.
          * Once per loop iteration is pleanty.
@@ -631,24 +605,49 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
         if (((TIME % 5) == 0) && (!expire_run))
         {
                 expire_lines();
-                FOREACH_MOD(I_OnBackgroundTimer,OnBackgroundTimer(TIME));
+               if (process_module_sockets)
+               {
+                       /* Fix by brain - the addition of DoOneIteration means that this
+                        * can end up getting called recursively in the following pattern:
+                        *
+                        * m_spanningtree DoPingChecks
+                        * (server pings out and is squit)
+                        * (squit causes call to DoOneIteration)
+                        * DoOneIteration enters here
+                        * calls DoBackground timer
+                        * enters m_spanningtree DoPingChecks... see step 1.
+                        *
+                        * This should do the job and fix the bug.
+                        */
+                       FOREACH_MOD(I_OnBackgroundTimer,OnBackgroundTimer(TIME));
+               }
                 TickMissedTimers(TIME);
                 expire_run = true;
+               yield_depth--;
                 return;
         }   
         else if ((TIME % 5) == 1)
         {
                 expire_run = false;
         }
+
+       if (iterations++ == 15)
+       {
+               iterations = 0;
+               DoBackgroundUserStuff(TIME);
+       }
  
         /* Once a second, do the background processing */
         if (TIME != OLDTIME)
         {
                 if (TIME < OLDTIME)
                         WriteOpers("*** \002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %d secs.",abs(OLDTIME-TIME));
-                DoBackgroundUserStuff(TIME);
+               if ((TIME % 3600) == 0)
+               {
+                       MaintainWhoWas(TIME);
+               }
         }
-               
+
         /* Process timeouts on module sockets each time around
          * the loop. There shouldnt be many module sockets, at
          * most, 20 or so, so this won't be much of a performance
@@ -665,7 +664,10 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
          * servers... so its nice and easy, just one call.
          */
         if (!(numberactive = SE->Wait(activefds)))
+       {
+               yield_depth--;
                 return;
+       }
 
         /**
          * Now process each of the fd's. For users, we have a fast
@@ -690,7 +692,7 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
                         case X_ESTAB_MODULE:
 
                                if (!process_module_sockets)
-                                       return;
+                                       break;
 
                                 /* Process module-owned sockets.
                                  * Modules are encouraged to inherit their sockets from
@@ -700,8 +702,9 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
               
                                 if ((s) && (!s->Poll()))
                                 {
-                                        log(DEBUG,"Socket poll returned false, close and bail");
+                                        log(DEBUG,"inspircd.cpp: Socket poll returned false, close and bail");
                                         SE->DelFd(s->GetFd());
+                                       socket_ref[activefds[activefd]] = NULL;
                                         for (std::vector<InspSocket*>::iterator a = module_sockets.begin(); a < module_sockets.end(); a++)
                                         {
                                                 s_del = (InspSocket*)*a;
@@ -753,7 +756,7 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
                                                 }
                                                 catch (ModuleException& modexcept)
                                                 {
-                                                        log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                                                        log(DEBUG,"Module exception cought: %s",modexcept.GetReason());
                                                 }
                                         }
                                         stats->statsAccept++;
@@ -775,9 +778,11 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
                                  * what we would do, so for now, its going
                                  * to safely do bugger all.
                                  */
+                               SE->DelFd(activefds[activefd]);
                         break;
                 }
         }
+       yield_depth--;
 }
 
 int InspIRCd::Run()
@@ -790,8 +795,9 @@ int InspIRCd::Run()
        
        if (!Config->nofork)
        {
-               freopen("/dev/null","w",stdout);
-               freopen("/dev/null","w",stderr);
+               fclose(stdout);
+               fclose(stderr);
+               fclose(stdin);
        }
 
        /* Add the listening sockets used for client inbound connections
@@ -804,6 +810,8 @@ int InspIRCd::Run()
 
        /* main loop, this never returns */
        expire_run = false;
+       yield_depth = 0;
+       iterations = 0;
 
        while (true)
        {