virtual void OnLog(int loglevel, const std::string &type, const std::string &msg)
{
Channel *c = ServerInstance->FindChan(channel);
+ static bool Logging = false;
- if (loglevel < this->loglvl) return;
+ if (loglevel < this->loglvl)
+ return;
+
+ if (Logging)
+ return;
if (c)
{
- // So this won't work remotely. Oh well.
- c->WriteChannelWithServ(ServerInstance->Config->ServerName, "PRIVMSG %s :\2%s\2: %s", c->name, type.c_str(), msg.c_str());
+ Logging = true; // this avoids (rare chance) loops with logging server IO on networks
+ char buf[MAXBUF];
+ snprintf(buf, MAXBUF, "\2%s\2: %s", type.c_str(), msg.c_str());
+
+ c->WriteChannelWithServ(ServerInstance->Config->ServerName, "PRIVMSG %s :%s", c->name, buf);
+ ServerInstance->PI->SendChannelPrivmsg(c, 0, buf);
+ Logging = false;
}
}
};
public:
ModuleChanLog(InspIRCd* Me) : Module(Me)
{
+ Implementation eventlist[] = { I_OnRehash };
+ ServerInstance->Modules->Attach(eventlist, this, 1);
+
+ OnRehash(NULL, "");
}
virtual ~ModuleChanLog()
}
}
- virtual void OnReadConfig(ServerConfig* sc, ConfigReader* Conf)
+ virtual void OnRehash(User *user, const std::string ¶meter)
{
+ ConfigReader Conf(ServerInstance);
+
/* Since the CloseLogs prior to this hook just wiped out our logstreams for us, we just need to wipe the vector. */
std::vector<ChannelLogStream*>().swap(cls);
- int index, max = Conf->Enumerate("log");
+ int index, max = Conf.Enumerate("log");
cls.reserve(max);
+
for (index = 0; index < max; ++index)
{
- std::string method = Conf->ReadValue("log", "method", index);
- if (method != "file") continue;
- std::string type = Conf->ReadValue("log", "type", index);
- std::string level = Conf->ReadValue("log", "level", index);
+ std::string method = Conf.ReadValue("log", "method", index);
+
+
+ //if (method != "file")
+ // continue;
+
+ std::string type = Conf.ReadValue("log", "type", index);
+ std::string level = Conf.ReadValue("log", "level", index);
int loglevel = DEFAULT;
+
if (level == "debug")
{
loglevel = DEBUG;
{
loglevel = NONE;
}
- std::string target = Conf->ReadValue("log", "target", index);
+
+ std::string target = Conf.ReadValue("log", "target", index);
ChannelLogStream* c = new ChannelLogStream(ServerInstance, loglevel, target);
ServerInstance->Logs->AddLogTypes(type, c, true);
cls.push_back(c);