summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/commands/cmd_whowas.h13
-rw-r--r--include/configreader.h13
-rw-r--r--src/commands/cmd_whowas.cpp46
-rw-r--r--src/configreader.cpp7
4 files changed, 50 insertions, 29 deletions
diff --git a/include/commands/cmd_whowas.h b/include/commands/cmd_whowas.h
index 8033f1796..590c11172 100644
--- a/include/commands/cmd_whowas.h
+++ b/include/commands/cmd_whowas.h
@@ -55,6 +55,19 @@ class CommandWhowas : public Command
whowas_users_fifo whowas_fifo;
public:
+ /** Max number of WhoWas entries per user.
+ */
+ int WhoWasGroupSize;
+
+ /** Max number of cumulative user-entries in WhoWas.
+ * When max reached and added to, push out oldest entry FIFO style.
+ */
+ int WhoWasMaxGroups;
+
+ /** Max seconds a user is kept in WhoWas before being pruned.
+ */
+ int WhoWasMaxKeep;
+
CommandWhowas(Module* parent);
/** Handle command.
* @param parameters The parameters to the comamnd
diff --git a/include/configreader.h b/include/configreader.h
index b26be3d6c..d3b3edd84 100644
--- a/include/configreader.h
+++ b/include/configreader.h
@@ -240,19 +240,6 @@ class CoreExport ServerConfig
*/
int c_ipv6_range;
- /** Max number of WhoWas entries per user.
- */
- int WhoWasGroupSize;
-
- /** Max number of cumulative user-entries in WhoWas.
- * When max reached and added to, push out oldest entry FIFO style.
- */
- int WhoWasMaxGroups;
-
- /** Max seconds a user is kept in WhoWas before being pruned.
- */
- int WhoWasMaxKeep;
-
/** Holds the server name of the local server
* as defined by the administrator.
*/
diff --git a/src/commands/cmd_whowas.cpp b/src/commands/cmd_whowas.cpp
index dfe513dff..06c4b0509 100644
--- a/src/commands/cmd_whowas.cpp
+++ b/src/commands/cmd_whowas.cpp
@@ -23,7 +23,8 @@
#include "inspircd.h"
#include "commands/cmd_whowas.h"
-CommandWhowas::CommandWhowas( Module* parent) : Command(parent, "WHOWAS", 1)
+CommandWhowas::CommandWhowas( Module* parent)
+ : Command(parent, "WHOWAS", 1), WhoWasGroupSize(0), WhoWasMaxGroups(0), WhoWasMaxKeep(0)
{
syntax = "<nick>{,<nick>}";
Penalty = 2;
@@ -32,7 +33,7 @@ CommandWhowas::CommandWhowas( Module* parent) : Command(parent, "WHOWAS", 1)
CmdResult CommandWhowas::Handle (const std::vector<std::string>& parameters, User* user)
{
/* if whowas disabled in config */
- if (ServerInstance->Config->WhoWasGroupSize == 0 || ServerInstance->Config->WhoWasMaxGroups == 0)
+ if (this->WhoWasGroupSize == 0 || this->WhoWasMaxGroups == 0)
{
user->WriteNumeric(421, "%s %s :This command has been disabled.",user->nick.c_str(),name.c_str());
return CMD_FAILURE;
@@ -108,7 +109,7 @@ std::string CommandWhowas::GetStats()
void CommandWhowas::AddToWhoWas(User* user)
{
/* if whowas disabled */
- if (ServerInstance->Config->WhoWasGroupSize == 0 || ServerInstance->Config->WhoWasMaxGroups == 0)
+ if (this->WhoWasGroupSize == 0 || this->WhoWasMaxGroups == 0)
{
return;
}
@@ -123,7 +124,7 @@ void CommandWhowas::AddToWhoWas(User* user)
whowas[user->nick.c_str()] = n;
whowas_fifo.push_back(std::make_pair(ServerInstance->Time(),user->nick.c_str()));
- if ((int)(whowas.size()) > ServerInstance->Config->WhoWasMaxGroups)
+ if ((int)(whowas.size()) > this->WhoWasMaxGroups)
{
whowas_users::iterator iter2 = whowas.find(whowas_fifo[0].second);
if (iter2 != whowas.end())
@@ -152,7 +153,7 @@ void CommandWhowas::AddToWhoWas(User* user)
WhoWasGroup *a = new WhoWasGroup(user);
group->push_back(a);
- if ((int)(group->size()) > ServerInstance->Config->WhoWasGroupSize)
+ if ((int)(group->size()) > this->WhoWasGroupSize)
{
WhoWasGroup *a2 = (WhoWasGroup*)*(group->begin());
delete a2;
@@ -165,9 +166,9 @@ void CommandWhowas::AddToWhoWas(User* user)
void CommandWhowas::PruneWhoWas(time_t t)
{
/* config values */
- int groupsize = ServerInstance->Config->WhoWasGroupSize;
- int maxgroups = ServerInstance->Config->WhoWasMaxGroups;
- int maxkeep = ServerInstance->Config->WhoWasMaxKeep;
+ int groupsize = this->WhoWasGroupSize;
+ int maxgroups = this->WhoWasMaxGroups;
+ int maxkeep = this->WhoWasMaxKeep;
/* first cut the list to new size (maxgroups) and also prune entries that are timed out. */
whowas_users::iterator iter;
@@ -241,7 +242,7 @@ void CommandWhowas::MaintainWhoWas(time_t t)
whowas_set* n = (whowas_set*)iter->second;
if (n->size())
{
- while ((n->begin() != n->end()) && ((*n->begin())->signon < t - ServerInstance->Config->WhoWasMaxKeep))
+ while ((n->begin() != n->end()) && ((*n->begin())->signon < t - this->WhoWasMaxKeep))
{
WhoWasGroup *a = *(n->begin());
delete a;
@@ -297,6 +298,17 @@ WhoWasGroup::~WhoWasGroup()
class ModuleWhoWas : public Module
{
CommandWhowas cmd;
+
+ void RangeCheck(int& value, int min, int max, int def, const char* msg)
+ {
+ // From ConfigReader
+ if (value >= min && value <= max)
+ return;
+
+ ServerInstance->Logs->Log("CONFIG", DEFAULT, "WARNING: %s value of %d is not between %d and %d; set to %d.", msg, value, min, max, def);
+ value = def;
+ }
+
public:
ModuleWhoWas() : cmd(this)
{
@@ -307,6 +319,7 @@ class ModuleWhoWas : public Module
ServerInstance->Modules->AddService(cmd);
Implementation eventlist[] = { I_OnGarbageCollect, I_OnUserQuit, I_OnStats, I_OnRehash };
ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
+ OnRehash(NULL);
}
void OnGarbageCollect()
@@ -330,6 +343,21 @@ class ModuleWhoWas : public Module
void OnRehash(User* user)
{
+ ConfigTag* tag = ServerInstance->Config->ConfValue("whowas");
+ int NewGroupSize = tag->getInt("groupsize");
+ int NewMaxGroups = tag->getInt("maxgroups");
+ int NewMaxKeep = InspIRCd::Duration(tag->getString("maxkeep"));
+
+ RangeCheck(NewGroupSize, 0, 10000, 10, "<whowas:groupsize>");
+ RangeCheck(NewMaxGroups, 0, 1000000, 10240, "<whowas:maxgroups>");
+ RangeCheck(NewMaxKeep, 3600, INT_MAX, 3600, "<whowas:maxkeep>");
+
+ if ((NewGroupSize == cmd.WhoWasGroupSize) && (NewMaxGroups == cmd.WhoWasMaxGroups) && (NewMaxKeep == cmd.WhoWasMaxKeep))
+ return;
+
+ cmd.WhoWasGroupSize = NewGroupSize;
+ cmd.WhoWasMaxGroups = NewMaxGroups;
+ cmd.WhoWasMaxKeep = NewMaxKeep;
cmd.PruneWhoWas(ServerInstance->Time());
}
diff --git a/src/configreader.cpp b/src/configreader.cpp
index e2ddd4d27..f7475d54a 100644
--- a/src/configreader.cpp
+++ b/src/configreader.cpp
@@ -35,7 +35,6 @@
ServerConfig::ServerConfig()
{
- WhoWasGroupSize = WhoWasMaxGroups = WhoWasMaxKeep = 0;
RawLog = NoUserDns = HideBans = HideSplits = UndernetMsgPrefix = false;
WildcardIPv6 = CycleHosts = InvBypassModes = true;
dns_timeout = 5;
@@ -532,9 +531,6 @@ void ServerConfig::Fill()
MaxTargets = security->getInt("maxtargets", 20);
DefaultModes = options->getString("defaultmodes", "nt");
PID = ConfValue("pid")->getString("file");
- WhoWasGroupSize = ConfValue("whowas")->getInt("groupsize");
- WhoWasMaxGroups = ConfValue("whowas")->getInt("maxgroups");
- WhoWasMaxKeep = InspIRCd::Duration(ConfValue("whowas")->getString("maxkeep"));
MaxChans = ConfValue("channels")->getInt("users", 20);
OperMaxChans = ConfValue("channels")->getInt("opers", 60);
c_ipv4_range = ConfValue("cidr")->getInt("ipv4clone", 32);
@@ -555,9 +551,6 @@ void ServerConfig::Fill()
range(MaxConn, 0, SOMAXCONN, SOMAXCONN, "<performance:somaxconn>");
range(MaxTargets, 1, 31, 20, "<security:maxtargets>");
range(NetBufferSize, 1024, 65534, 10240, "<performance:netbuffersize>");
- range(WhoWasGroupSize, 0, 10000, 10, "<whowas:groupsize>");
- range(WhoWasMaxGroups, 0, 1000000, 10240, "<whowas:maxgroups>");
- range(WhoWasMaxKeep, 3600, INT_MAX, 3600, "<whowas:maxkeep>");
ValidIP(DNSServer, "<dns:server>");