summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeavey <peavey@e03df62e-2008-0410-955e-edbf42e46eb7>2007-01-08 04:07:04 +0000
committerpeavey <peavey@e03df62e-2008-0410-955e-edbf42e46eb7>2007-01-08 04:07:04 +0000
commit9f13269062094853b023d09b4ac24d2cf08a0de2 (patch)
treebae6c4deeac0635edcea147ab728df74da32f5c9
parentbf3acfa61d702eef0303bc4743592669cebebabf (diff)
Move whowas containers into whowas class to avoid all cpp files including cmd_whowas.h to try and destroy the containers on fork exit.\nThis would cause a segfault when forking due to the containers destroy being called multiple times, but still allow the server to fork it's child and leave the server running.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6260 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--include/commands/cmd_whowas.h67
-rw-r--r--src/cmd_whowas.cpp44
2 files changed, 65 insertions, 46 deletions
diff --git a/include/commands/cmd_whowas.h b/include/commands/cmd_whowas.h
index 1181b7ae8..90264b406 100644
--- a/include/commands/cmd_whowas.h
+++ b/include/commands/cmd_whowas.h
@@ -23,16 +23,50 @@
#include "users.h"
#include "channels.h"
+/* list of available internal commands */
+enum Internals
+{
+ WHOWAS_ADD = 1,
+ WHOWAS_STATS = 2,
+ WHOWAS_PRUNE = 3,
+ WHOWAS_MAINTAIN = 4
+};
+
+/* Forward ref for timer */
class MaintainTimer;
+/* Forward ref for typedefs */
+class WhoWasGroup;
+
/** InspTimer that is used to maintain the whowas list, called once an hour
*/
MaintainTimer* timer;
+/** A group of users related by nickname
+ */
+typedef std::deque<WhoWasGroup*> whowas_set;
+
+/** Sets of users in the whowas system
+ */
+typedef std::map<irc::string,whowas_set*> whowas_users;
+
+/** Sets of time and users in whowas list
+ */
+typedef std::deque<std::pair<time_t,irc::string> > whowas_users_fifo;
+
/** Handle /WHOWAS
*/
class cmd_whowas : public command_t
{
+ private:
+ /** Whowas container, contains a map of vectors of users tracked by WHOWAS
+ */
+ whowas_users whowas;
+
+ /** Whowas container, contains a map of time_t to users tracked by WHOWAS
+ */
+ whowas_users_fifo whowas_fifo;
+
public:
cmd_whowas(InspIRCd* Instance);
CmdResult Handle(const char** parameters, int pcnt, userrec *user);
@@ -40,17 +74,10 @@ class cmd_whowas : public command_t
void AddToWhoWas(userrec* user);
void GetStats(Extensible* ext);
void PruneWhoWas(time_t t);
+ void MaintainWhoWas(time_t t);
virtual ~cmd_whowas();
};
-enum Internals
-{
- WHOWAS_ADD = 1,
- WHOWAS_STATS = 2,
- WHOWAS_PRUNE = 3
-};
-
-
/** Used to hold WHOWAS information
*/
class WhoWasGroup : public classbase
@@ -95,28 +122,4 @@ class MaintainTimer : public InspTimer
virtual void Tick(time_t TIME);
};
-/** A group of users related by nickname
- */
-typedef std::deque<WhoWasGroup*> whowas_set;
-
-/** Sets of users in the whowas system
- */
-typedef std::map<irc::string,whowas_set*> whowas_users;
-
-/** Sets of time and users in whowas list
- */
-typedef std::deque<std::pair<time_t,irc::string> > whowas_users_fifo;
-
-/** Called every hour by the core to remove expired entries
- */
-void MaintainWhoWas(InspIRCd* ServerInstance, time_t TIME);
-
-/** Whowas container, contains a map of vectors of users tracked by WHOWAS
- */
-whowas_users whowas;
-
-/** Whowas container, contains a map of time_t to users tracked by WHOWAS
- */
-whowas_users_fifo whowas_fifo;
-
#endif
diff --git a/src/cmd_whowas.cpp b/src/cmd_whowas.cpp
index d5f2353b2..6b2d31919 100644
--- a/src/cmd_whowas.cpp
+++ b/src/cmd_whowas.cpp
@@ -90,7 +90,7 @@ CmdResult cmd_whowas::Handle (const char** parameters, int pcnt, userrec* user)
user->WriteServ("369 %s %s :End of WHOWAS",user->nick,parameters[0]);
return CMD_SUCCESS;
-};
+}
CmdResult cmd_whowas::HandleInternal(const unsigned int id, const std::deque<classbase*> &parameters)
{
@@ -108,11 +108,15 @@ CmdResult cmd_whowas::HandleInternal(const unsigned int id, const std::deque<cla
PruneWhoWas(ServerInstance->Time());
break;
+ case WHOWAS_MAINTAIN:
+ MaintainWhoWas(ServerInstance->Time());
+ break;
+
default:
break;
}
return CMD_SUCCESS;
-};
+}
void cmd_whowas::GetStats(Extensible* ext)
{
@@ -263,6 +267,24 @@ void cmd_whowas::PruneWhoWas(time_t t)
}
}
+/* call maintain once an hour to remove expired nicks */
+void cmd_whowas::MaintainWhoWas(time_t t)
+{
+ for (whowas_users::iterator iter = whowas.begin(); iter != whowas.end(); iter++)
+ {
+ whowas_set* n = (whowas_set*)iter->second;
+ if (n->size())
+ {
+ while ((n->begin() != n->end()) && ((*n->begin())->signon < t - ServerInstance->Config->WhoWasMaxKeep))
+ {
+ WhoWasGroup *a = *(n->begin());
+ DELETE(a);
+ n->erase(n->begin());
+ }
+ }
+ }
+}
+
cmd_whowas::~cmd_whowas()
{
if (timer)
@@ -279,7 +301,7 @@ cmd_whowas::~cmd_whowas()
if (iter == whowas.end())
{
/* this should never happen, if it does maps are corrupt */
- ServerInstance->Log(DEBUG, "Whowas maps got corrupted! (1)");
+ ServerInstance->Log(DEBUG, "Whowas maps got corrupted! (3)");
return;
}
whowas_set* n = (whowas_set*)iter->second;
@@ -322,19 +344,13 @@ WhoWasGroup::~WhoWasGroup()
/* every hour, run this function which removes all entries older than Config->WhoWasMaxKeep */
void MaintainTimer::Tick(time_t t)
{
- for (whowas_users::iterator iter = whowas.begin(); iter != whowas.end(); iter++)
+ command_t* whowas_command = ServerInstance->Parser->GetHandler("WHOWAS");
+ if (whowas_command)
{
- whowas_set* n = (whowas_set*)iter->second;
- if (n->size())
- {
- while ((n->begin() != n->end()) && ((*n->begin())->signon < t - ServerInstance->Config->WhoWasMaxKeep))
- {
- WhoWasGroup *a = *(n->begin());
- DELETE(a);
- n->erase(n->begin());
- }
- }
+ std::deque<classbase*> params;
+ whowas_command->HandleInternal(WHOWAS_MAINTAIN, params);
}
+
timer = new MaintainTimer(ServerInstance, 3600);
ServerInstance->Timers->AddTimer(timer);
}