summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bots.cpp15
-rw-r--r--src/channels.cpp72
-rw-r--r--src/chanserv.cpp16
-rw-r--r--src/commands.cpp8
-rw-r--r--src/config.cpp127
-rw-r--r--src/encrypt.cpp4
-rw-r--r--src/init.cpp157
-rw-r--r--src/language.cpp19
-rw-r--r--src/log.cpp264
-rw-r--r--src/logger.cpp399
-rw-r--r--src/mail.cpp4
-rw-r--r--src/main.cpp268
-rw-r--r--src/memoserv.cpp2
-rw-r--r--src/messages.cpp10
-rw-r--r--src/misc.cpp4
-rw-r--r--src/modes.cpp40
-rw-r--r--src/modulemanager.cpp26
-rw-r--r--src/modules.cpp22
-rw-r--r--src/nickalias.cpp2
-rw-r--r--src/nickcore.cpp2
-rw-r--r--src/nickserv.cpp8
-rw-r--r--src/process.cpp24
-rw-r--r--src/regchannel.cpp10
-rw-r--r--src/send.cpp8
-rw-r--r--src/servers.cpp30
-rw-r--r--src/sessions.cpp12
-rw-r--r--src/sockets.cpp2
-rw-r--r--src/users.cpp110
28 files changed, 903 insertions, 762 deletions
diff --git a/src/bots.cpp b/src/bots.cpp
index d63f6787f..e6124e135 100644
--- a/src/bots.cpp
+++ b/src/bots.cpp
@@ -20,16 +20,15 @@ BotInfo *MemoServ = NULL;
BotInfo *NickServ = NULL;
BotInfo *OperServ = NULL;
-BotInfo::BotInfo(const Anope::string &nnick, const Anope::string &nuser, const Anope::string &nhost, const Anope::string &nreal) : User(nnick, ts6_uid_retrieve())
+BotInfo::BotInfo(const Anope::string &nnick, const Anope::string &nuser, const Anope::string &nhost, const Anope::string &nreal) : User(nnick, nuser, nhost, ts6_uid_retrieve())
{
- this->ident = nuser;
- this->host = nhost;
this->realname = nreal;
this->server = Me;
this->chancount = 0;
this->lastmsg = this->created = time(NULL);
+ this->SetFlag(BI_CORE);
if (!Config->s_ChanServ.empty() && nnick.equals_ci(Config->s_ChanServ))
ChanServ = this;
else if (!Config->s_BotServ.empty() && nnick.equals_ci(Config->s_BotServ))
@@ -44,6 +43,8 @@ BotInfo::BotInfo(const Anope::string &nnick, const Anope::string &nuser, const A
NickServ = this;
else if (!Config->s_GlobalNoticer.empty() && nnick.equals_ci(Config->s_GlobalNoticer))
Global = this;
+ else
+ this->UnsetFlag(BI_CORE);
BotListByNick[this->nick] = this;
if (!this->uid.empty())
@@ -168,16 +169,16 @@ void BotInfo::Join(Channel *c, bool update_ts)
c->JoinUser(this);
ChannelContainer *cc = this->FindChannel(c);
- for (std::list<ChannelModeStatus *>::iterator it = BotModes.begin(), it_end = BotModes.end(); it != it_end; ++it)
+ for (int i = 0; i < Config->BotModeList.size(); ++i)
{
if (!update_ts)
{
- c->SetMode(this, *it, this->nick, false);
+ c->SetMode(this, Config->BotModeList[i], this->nick, false);
}
else
{
- cc->Status->SetFlag((*it)->Name);
- c->SetModeInternal(*it, this->nick, false);
+ cc->Status->SetFlag(Config->BotModeList[i]->Name);
+ c->SetModeInternal(Config->BotModeList[i], this->nick, false);
}
}
if (!update_ts)
diff --git a/src/channels.cpp b/src/channels.cpp
index aa2e0affc..506dbfc7d 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -37,6 +37,8 @@ Channel::Channel(const Anope::string &name, time_t ts)
this->ci = cs_findchan(this->name);
if (this->ci)
this->ci->c = this;
+
+ Log(NULL, this, "create");
FOREACH_MOD(I_OnChannelCreate, OnChannelCreate(this));
}
@@ -49,7 +51,7 @@ Channel::~Channel()
FOREACH_MOD(I_OnChannelDelete, OnChannelDelete(this));
- Alog(LOG_DEBUG) << "Deleting channel " << this->name;
+ Log(NULL, this, "destroy");
for (bd = this->bd; bd; bd = next)
{
@@ -114,7 +116,7 @@ void Channel::Sync()
void Channel::JoinUser(User *user)
{
- Alog(LOG_DEBUG) << user->nick << " joins " << this->name;
+ Log(user, this, "join");
ChannelStatus *Status = new ChannelStatus();
ChannelContainer *cc = new ChannelContainer(this);
@@ -128,7 +130,7 @@ void Channel::JoinUser(User *user)
bool update_ts = false;
if (this->ci && this->ci->HasFlag(CI_PERSIST) && this->creation_time > this->ci->time_registered)
{
- Alog(LOG_DEBUG) << "Changing TS of " << this->name << " from " << this->creation_time << " to " << this->ci->time_registered;
+ Log(LOG_DEBUG) << "Changing TS of " << this->name << " from " << this->creation_time << " to " << this->ci->time_registered;
this->creation_time = this->ci->time_registered;
update_ts = true;
}
@@ -188,13 +190,13 @@ void Channel::DeleteUser(User *user)
if (this->ci)
update_cs_lastseen(user, this->ci);
- Alog(LOG_DEBUG) << user->nick << " leaves " << this->name;
+ Log(user, this, "leaves");
CUserList::iterator cit, cit_end = this->users.end();
for (cit = this->users.begin(); (*cit)->user != user && cit != cit_end; ++cit);
if (cit == cit_end)
{
- Alog(LOG_DEBUG) << "Channel::DeleteUser() tried to delete nonexistant user " << user->nick << " from channel " << this->name;
+ Log(LOG_DEBUG) << "Channel::DeleteUser() tried to delete nonexistant user " << user->nick << " from channel " << this->name;
return;
}
@@ -206,7 +208,7 @@ void Channel::DeleteUser(User *user)
for (uit = user->chans.begin(); (*uit)->chan != this && uit != uit_end; ++uit);
if (uit == uit_end)
{
- Alog(LOG_DEBUG) << "Channel::DeleteUser() tried to delete nonexistant channel " << this->name << " from " << user->nick << "'s channel list";
+ Log(LOG_DEBUG) << "Channel::DeleteUser() tried to delete nonexistant channel " << this->name << " from " << user->nick << "'s channel list";
return;
}
@@ -310,7 +312,7 @@ void Channel::SetModeInternal(ChannelMode *cm, const Anope::string &param, bool
{
if (param.empty())
{
- Alog() << "Channel::SetModeInternal() mode " << cm->ModeChar << " with no parameter for channel " << this->name;
+ Log() << "Channel::SetModeInternal() mode " << cm->ModeChar << " with no parameter for channel " << this->name;
return;
}
@@ -321,11 +323,11 @@ void Channel::SetModeInternal(ChannelMode *cm, const Anope::string &param, bool
if (!u)
{
- Alog(LOG_DEBUG) << "MODE " << this->name << " +" << cm->ModeChar << " for nonexistant user " << param;
+ Log() << "MODE " << this->name << " +" << cm->ModeChar << " for nonexistant user " << param;
return;
}
- Alog(LOG_DEBUG) << "Setting +" << cm->ModeChar << " on " << this->name << " for " << u->nick;
+ Log(LOG_DEBUG) << "Setting +" << cm->ModeChar << " on " << this->name << " for " << u->nick;
/* Set the status on the user */
ChannelContainer *cc = u->FindChannel(this);
@@ -342,7 +344,7 @@ void Channel::SetModeInternal(ChannelMode *cm, const Anope::string &param, bool
{
if (param.empty())
{
- Alog() << "Channel::SetModeInternal() mode " << cm->ModeChar << " with no parameter for channel " << this->name;
+ Log() << "Channel::SetModeInternal() mode " << cm->ModeChar << " with no parameter for channel " << this->name;
return;
}
@@ -357,7 +359,7 @@ void Channel::SetModeInternal(ChannelMode *cm, const Anope::string &param, bool
{
if (cm->Type != MODE_PARAM)
{
- Alog() << "Channel::SetModeInternal() mode " << cm->ModeChar << " for " << this->name << " with a paramater, but its not a param mode";
+ Log() << "Channel::SetModeInternal() mode " << cm->ModeChar << " for " << this->name << " with a paramater, but its not a param mode";
return;
}
@@ -437,7 +439,7 @@ void Channel::RemoveModeInternal(ChannelMode *cm, const Anope::string &param, bo
{
if (param.empty())
{
- Alog() << "Channel::RemoveModeInternal() mode " << cm->ModeChar << " with no parameter for channel " << this->name;
+ Log() << "Channel::RemoveModeInternal() mode " << cm->ModeChar << " with no parameter for channel " << this->name;
return;
}
@@ -449,17 +451,17 @@ void Channel::RemoveModeInternal(ChannelMode *cm, const Anope::string &param, bo
/* Reset modes on bots if we're supposed to */
if (bi)
{
- if (std::find(BotModes.begin(), BotModes.end(), cm) != BotModes.end())
+ if (std::find(Config->BotModeList.begin(), Config->BotModeList.end(), cm) != Config->BotModeList.end())
this->SetMode(bi, cm, bi->nick);
}
if (!u)
{
- Alog() << "Channel::RemoveModeInternal() MODE " << this->name << "-" << cm->ModeChar << " for nonexistant user " << param;
+ Log() << "Channel::RemoveModeInternal() MODE " << this->name << "-" << cm->ModeChar << " for nonexistant user " << param;
return;
}
- Alog(LOG_DEBUG) << "Setting -" << cm->ModeChar << " on " << this->name << " for " << u->nick;
+ Log(LOG_DEBUG) << "Setting -" << cm->ModeChar << " on " << this->name << " for " << u->nick;
/* Remove the status on the user */
ChannelContainer *cc = u->FindChannel(this);
@@ -473,7 +475,7 @@ void Channel::RemoveModeInternal(ChannelMode *cm, const Anope::string &param, bo
{
if (param.empty())
{
- Alog() << "Channel::RemoveModeInternal() mode " << cm->ModeChar << " with no parameter for channel " << this->name;
+ Log() << "Channel::RemoveModeInternal() mode " << cm->ModeChar << " with no parameter for channel " << this->name;
return;
}
@@ -904,11 +906,11 @@ void ChanSetInternalModes(Channel *c, int ac, const char **av)
c->RemoveModeInternal(cm, av[j]);
}
else
- Alog() << "warning: ChanSetInternalModes() recieved more modes requiring params than params, modes: " << merge_args(ac, av) << ", ac: " << ac << ", j: " << j;
+ Log() << "warning: ChanSetInternalModes() recieved more modes requiring params than params, modes: " << merge_args(ac, av) << ", ac: " << ac << ", j: " << j;
}
if (j + k + 1 < ac)
- Alog() << "warning: ChanSetInternalModes() recieved more params than modes requiring them, modes: " << merge_args(ac, av) << ", ac: " << ac << ", j: " << j << " k: " << k;
+ Log() << "warning: ChanSetInternalModes() recieved more params than modes requiring them, modes: " << merge_args(ac, av) << ", ac: " << ac << ", j: " << j << " k: " << k;
}
/** Kick a user from a channel internally
@@ -924,11 +926,11 @@ void Channel::KickInternal(const Anope::string &source, const Anope::string &nic
User *user = bi ? bi : finduser(nick);
if (!user)
{
- Alog(LOG_DEBUG) << "Channel::KickInternal got a nonexistent user " << nick << " on " << this->name << ": " << reason;
+ Log() << "Channel::KickInternal got a nonexistent user " << nick << " on " << this->name << ": " << reason;
return;
}
- Alog(LOG_DEBUG) << "Channel::KickInternal kicking " << user->nick << " from " << this->name;
+ Log(user, this, "kick") << "by " << source << " (" << reason << ")";
Anope::string chname = this->name;
@@ -938,7 +940,7 @@ void Channel::KickInternal(const Anope::string &source, const Anope::string &nic
this->DeleteUser(user);
}
else
- Alog(LOG_DEBUG) << "Channel::KickInternal got kick for user " << user->nick << " who isn't on channel " << this->name << " ?";
+ Log() << "Channel::KickInternal got kick for user " << user->nick << " who isn't on channel " << this->name << " ?";
/* Bots get rejoined */
if (bi)
@@ -1113,7 +1115,7 @@ void do_join(const Anope::string &source, int ac, const char **av)
user = finduser(source);
if (!user)
{
- Alog(LOG_DEBUG) << "JOIN from nonexistent user " << source << ": " << merge_args(ac, av);
+ Log() << "JOIN from nonexistent user " << source << ": " << merge_args(ac, av);
return;
}
@@ -1150,7 +1152,7 @@ void do_join(const Anope::string &source, int ac, const char **av)
/* Their time is older, we lose */
if (chan->creation_time > ts)
{
- Alog(LOG_DEBUG) << "Recieved an older TS " << chan->name << " in JOIN, changing from " << chan->creation_time << " to " << ts;
+ Log(LOG_DEBUG) << "Recieved an older TS " << chan->name << " in JOIN, changing from " << chan->creation_time << " to " << ts;
chan->creation_time = ts;
chan->Reset();
@@ -1188,7 +1190,7 @@ void do_kick(const Anope::string &source, int ac, const char **av)
Channel *c = findchan(av[0]);
if (!c)
{
- Alog(LOG_DEBUG) << "Recieved kick for nonexistant channel " << av[0];
+ Log() << "Recieved kick for nonexistant channel " << av[0];
return;
}
@@ -1210,7 +1212,7 @@ void do_part(const Anope::string &source, int ac, const char **av)
User *user = finduser(source);
if (!user)
{
- Alog(LOG_DEBUG) << "PART from nonexistent user " << source << ": " << merge_args(ac, av);
+ Log() << "PART from nonexistent user " << source << ": " << merge_args(ac, av);
return;
}
@@ -1221,17 +1223,17 @@ void do_part(const Anope::string &source, int ac, const char **av)
Channel *c = findchan(buf);
if (!c)
- Alog(LOG_DEBUG) << "Recieved PART from " << user->nick << " for nonexistant channel " << buf;
-
- if (user->FindChannel(c))
+ Log() << "Recieved PART from " << user->nick << " for nonexistant channel " << buf;
+ else if (user->FindChannel(c))
{
+ Log(user, c, "part") << "Reason: " << (av[1] ? av[1] : "No reason");
FOREACH_MOD(I_OnPrePartChannel, OnPrePartChannel(user, c));
Anope::string ChannelName = c->name;
c->DeleteUser(user);
FOREACH_MOD(I_OnPartChannel, OnPartChannel(user, findchan(ChannelName), ChannelName, av[1] ? av[1] : ""));
}
else
- Alog(LOG_DEBUG) << "Recieved PART from " << user->nick << " for " << c->name << ", but " << user->nick << " isn't in " << c->name << "?";
+ Log() << "Recieved PART from " << user->nick << " for " << c->name << ", but " << user->nick << " isn't in " << c->name << "?";
}
}
@@ -1264,7 +1266,7 @@ void do_cmode(const Anope::string &source, int ac, const char **av)
++av;
}
else
- Alog() << "TSMODE enabled but MODE has no valid TS";
+ Log() << "TSMODE enabled but MODE has no valid TS";
}
/* :42XAAAAAO TMODE 1106409026 #ircops +b *!*@*.aol.com */
@@ -1281,7 +1283,7 @@ void do_cmode(const Anope::string &source, int ac, const char **av)
{
ci = cs_findchan(av[0]);
if (!ci || ci->HasFlag(CI_FORBIDDEN))
- Alog(LOG_DEBUG) << "MODE " << merge_args(ac - 1, av + 1) << " for nonexistant channel " << av[0];
+ Log(LOG_DEBUG) << "MODE " << merge_args(ac - 1, av + 1) << " for nonexistant channel " << av[0];
}
return;
}
@@ -1298,6 +1300,10 @@ void do_cmode(const Anope::string &source, int ac, const char **av)
--ac;
++av;
+
+ User *u = finduser(source);
+ if (u)
+ Log(u, c, "mode") << merge_args(ac, av);
ChanSetInternalModes(c, ac, av);
}
@@ -1313,7 +1319,7 @@ void do_topic(const Anope::string &source, int ac, const char **av)
if (!c)
{
- Alog(LOG_DEBUG) << "TOPIC " << merge_args(ac - 1, av + 1) << " for nonexistent channel " << av[0];
+ Log() << "TOPIC " << merge_args(ac - 1, av + 1) << " for nonexistent channel " << av[0];
return;
}
@@ -1380,7 +1386,7 @@ void chan_set_correct_modes(User *user, Channel *c, int give_modes)
if (ci->HasFlag(CI_FORBIDDEN) || c->name[0] == '+')
return;
- Alog(LOG_DEBUG) << "Setting correct user modes for " << user->nick << " on " << c->name << " (" << (give_modes ? "" : "not ") << "giving modes)";
+ Log(LOG_DEBUG) << "Setting correct user modes for " << user->nick << " on " << c->name << " (" << (give_modes ? "" : "not ") << "giving modes)";
if (give_modes && !get_ignore(user->nick) && (!user->Account() || user->Account()->HasFlag(NI_AUTOOP)))
{
diff --git a/src/chanserv.cpp b/src/chanserv.cpp
index c80de4c75..b6df9d8cd 100644
--- a/src/chanserv.cpp
+++ b/src/chanserv.cpp
@@ -252,7 +252,7 @@ void check_modes(Channel *c)
if (!c)
{
- Alog(LOG_DEBUG) << "check_modes called with NULL values";
+ Log() << "check_modes called with NULL values";
return;
}
@@ -263,7 +263,7 @@ void check_modes(Channel *c)
if (c->server_modecount >= 3 && c->chanserv_modecount >= 3)
{
ircdproto->SendGlobops(NULL, "Warning: unable to set modes on channel %s. Are your servers' U:lines configured correctly?", c->name.c_str());
- Alog() << Config->s_ChanServ << ": Bouncy modes on channel " << c->name;
+ Log() << "Bouncy modes on channel " << c->name;
c->bouncy_modes = 1;
return;
}
@@ -497,7 +497,7 @@ int check_topiclock(Channel *c, time_t topic_time)
if (!c)
{
- Alog(LOG_DEBUG) << "check_topiclock called with NULL values";
+ Log() << "check_topiclock called with NULL values";
return 0;
}
@@ -572,7 +572,7 @@ void expire_chans()
continue;
Anope::string chname = ci->name;
- Alog() << "Expiring channel " << ci->name << " (founder: " << (ci->founder ? ci->founder->display : "(none)") << " )";
+ Log(LOG_NORMAL, "chanserv/expire") << "Expiring channel " << ci->name << " (founder: " << (ci->founder ? ci->founder->display : "(none)") << " )";
delete ci;
FOREACH_MOD(I_OnChanExpire, OnChanExpire(chname));
}
@@ -599,13 +599,13 @@ void cs_remove_nick(const NickCore *nc)
NickCore *nc2 = ci->successor;
if (!nc2->IsServicesOper() && Config->CSMaxReg && nc2->channelcount >= Config->CSMaxReg)
{
- Alog() << Config->s_ChanServ << ": Successor (" << nc2->display << " ) of " << ci->name << " owns too many channels, deleting channel",
+ Log(LOG_NORMAL, "chanserv/expire") << "Successor (" << nc2->display << " ) of " << ci->name << " owns too many channels, deleting channel",
delete ci;
continue;
}
else
{
- Alog() << Config->s_ChanServ << ": Transferring foundership of " << ci->name << " from deleted nick " << nc->display << " to successor " << nc2->display;
+ Log(LOG_NORMAL, "chanserv/expire") << "Transferring foundership of " << ci->name << " from deleted nick " << nc->display << " to successor " << nc2->display;
ci->founder = nc2;
ci->successor = NULL;
++nc2->channelcount;
@@ -613,7 +613,7 @@ void cs_remove_nick(const NickCore *nc)
}
else
{
- Alog() << Config->s_ChanServ << ": Deleting channel " << ci->name << "owned by deleted nick " << nc->display;
+ Log(LOG_NORMAL, "chanserv/expire") << "Deleting channel " << ci->name << "owned by deleted nick " << nc->display;
if (ModeManager::FindChannelModeByName(CMODE_REGISTERED))
{
@@ -712,7 +712,7 @@ void reset_levels(ChannelInfo *ci)
if (!ci)
{
- Alog(LOG_DEBUG) << "reset_levels() called with NULL values";
+ Log() << "reset_levels() called with NULL values";
return;
}
diff --git a/src/commands.cpp b/src/commands.cpp
index 26ca76e65..bbf2a5233 100644
--- a/src/commands.cpp
+++ b/src/commands.cpp
@@ -58,7 +58,7 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const Anope::string &command,
if (!c->HasFlag(CFLAG_ALLOW_UNREGISTERED) && !u->IsIdentified())
{
notice_lang(bi->nick, u, NICK_IDENTIFY_REQUIRED, Config->s_NickServ.c_str());
- Alog() << "Access denied for unregistered user " << u->nick << " with service " << bi->nick << " and command " << command;
+ Log(LOG_COMMAND, "denied", bi) << "Access denied for unregistered user " << u->GetMask() << " with command " << command;
return;
}
@@ -103,13 +103,13 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const Anope::string &command,
if (ci->HasFlag(CI_FORBIDDEN) && !c->HasFlag(CFLAG_ALLOW_FORBIDDEN))
{
notice_lang(bi->nick, u, CHAN_X_FORBIDDEN, ci->name.c_str());
- Alog() << "Access denied for user " << u->nick << " with service " << bi->nick << " and command " << command << " because of FORBIDDEN channel " << ci->name;
+ Log(LOG_COMMAND, "denied", bi) << "Access denied for user " << u->GetMask() << " with command " << command << " because of FORBIDDEN channel " << ci->name;
return;
}
else if (ci->HasFlag(CI_SUSPENDED) && !c->HasFlag(CFLAG_ALLOW_SUSPENDED))
{
notice_lang(bi->nick, u, CHAN_X_FORBIDDEN, ci->name.c_str());
- Alog() << "Access denied for user " << u->nick << " with service " << bi->nick <<" and command " << command << " because of SUSPENDED channel " << ci->name;
+ Log(LOG_COMMAND, "denied", bi) << "Access denied for user " << u->GetMask() << " with command " << command << " because of SUSPENDED channel " << ci->name;
return;
}
}
@@ -131,7 +131,7 @@ void mod_run_cmd(BotInfo *bi, User *u, Command *c, const Anope::string &command,
if (!c->permission.empty() && !u->Account()->HasCommand(c->permission))
{
notice_lang(bi->nick, u, ACCESS_DENIED);
- Alog() << "Access denied for user " << u->nick << " with service " << bi->nick << " and command " << command;
+ Log(LOG_COMMAND, "denied", bi) << "Access denied for user " << u->GetMask() << " with command " << command;
return;
}
diff --git a/src/config.cpp b/src/config.cpp
index 0dfc9702e..48563b0c5 100644
--- a/src/config.cpp
+++ b/src/config.cpp
@@ -82,7 +82,7 @@ ServerConfig::ServerConfig() : errstr(""), config_data()
else if (option.equals_ci("msg"))
{
if (!this->UsePrivmsg)
- Alog() << "msg in <nickserv:defaults> can only be used when UsePrivmsg is set";
+ Log() << "msg in <nickserv:defaults> can only be used when UsePrivmsg is set";
else
this->NSDefFlags.SetFlag(NI_MSG);
}
@@ -262,7 +262,7 @@ ServerConfig::ServerConfig() : errstr(""), config_data()
/* Check the user keys */
if (this->UserKey1 == this->UserKey2 || this->UserKey1 == this->UserKey3 || this->UserKey3 == this->UserKey2)
- Alog() << "Every UserKey must be different. It's for YOUR safety! Remember that!";
+ Log() << "Every UserKey must be different. It's for YOUR safety! Remember that!";
/**
* Check all DEFCON dependiencies...
@@ -349,10 +349,6 @@ ServerConfig::ServerConfig() : errstr(""), config_data()
}
SetDefaultMLock(this);
-
- /* Disable the log channel if its defined in the conf, but not enabled */
- if (this->LogChannel.empty() && LogChan)
- LogChan = false;
}
bool ServerConfig::CheckOnce(const Anope::string &tag)
@@ -614,13 +610,13 @@ bool ValidateNickLen(ServerConfig *, const Anope::string &, const Anope::string
int nicklen = data.GetInteger();
if (!nicklen)
{
- Alog() << "You have not defined the <networkinfo:nicklen> directive. It is strongly";
- Alog() << "adviced that you do configure this correctly in your services.conf";
+ Log() << "You have not defined the <networkinfo:nicklen> directive. It is strongly";
+ Log() << "adviced that you do configure this correctly in your services.conf";
data.Set(31);
}
else if (nicklen < 1)
{
- Alog() << "<networkinfo:nicklen> has an invalid value; setting to 31";
+ Log() << "<networkinfo:nicklen> has an invalid value; setting to 31";
data.Set(31);
}
return true;
@@ -645,7 +641,7 @@ bool ValidateGlobalOnCycle(ServerConfig *config, const Anope::string &tag, const
{
if (data.GetValue().empty())
{
- Alog() << "<" << tag << ":" << value << "> was undefined, disabling <options:globaloncycle>";
+ Log() << "<" << tag << ":" << value << "> was undefined, disabling <options:globaloncycle>";
config->GlobalOnCycle = false;
}
}
@@ -733,7 +729,7 @@ static bool DoOperType(ServerConfig *config, const Anope::string &, const Anope:
{
if ((*it)->GetName().equals_ci(tok))
{
- Alog() << "Inheriting commands and privs from " << (*it)->GetName() << " to " << ot->GetName();
+ Log() << "Inheriting commands and privs from " << (*it)->GetName() << " to " << ot->GetName();
ot->Inherits(*it);
break;
}
@@ -797,7 +793,7 @@ static bool DoneOpers(ServerConfig *config, const Anope::string &)
OperType *ot = *tit;
if (ot->GetName().equals_ci(type))
{
- Alog() << "Tied oper " << na->nc->display << " to type " << type;
+ Log() << "Tied oper " << na->nc->display << " to type " << type;
na->nc->ot = ot;
}
}
@@ -833,6 +829,91 @@ bool DoneModules(ServerConfig *, const Anope::string &)
return true;
}
+bool InitLogs(ServerConfig *config, const Anope::string &)
+{
+ for (unsigned i = 0; i < config->LogInfos.size(); ++i)
+ {
+ LogInfo *l = config->LogInfos[i];
+
+ for (std::list<Anope::string>::const_iterator sit = l->Targets.begin(), sit_end = l->Targets.end(); sit != sit_end; ++sit)
+ {
+ const Anope::string &target = *sit;
+
+ if (target[0] == '#')
+ {
+ Channel *c = findchan(target);
+ if (c && c->HasFlag(CH_LOGCHAN))
+ {
+ for (CUserList::const_iterator cit = c->users.begin(), cit_end = c->users.end(); cit != cit_end; ++cit)
+ {
+ UserContainer *uc = *cit;
+ BotInfo *bi = findbot(uc->user->nick);
+
+ if (bi && bi->HasFlag(BI_CORE))
+ {
+ bi->Part(c, "Reloading");
+ }
+ }
+
+ c->UnsetFlag(CH_PERSIST);
+ c->UnsetFlag(CH_LOGCHAN);
+ if (c->users.empty())
+ delete c;
+ }
+ }
+ }
+
+ delete config->LogInfos[i];
+ }
+ config->LogInfos.clear();
+
+ return true;
+}
+
+bool DoLogs(ServerConfig *config, const Anope::string &, const Anope::string *, ValueList &values, int *)
+{
+ //{"target", "source", "logage", "admin", "override", "commands", "servers", "channels", "users", "normal", "rawio", "debug"},
+ Anope::string targets = values[0].GetValue();
+ ValueItem vi(targets);
+ if (!ValidateNotEmpty(config, "log", "target", vi))
+ throw ConfigException("One or more values in your configuration file failed to validate. Please see your log for more information.");
+
+ Anope::string source = values[1].GetValue();
+ int logage = values[2].GetInteger();
+ Anope::string admin = values[3].GetValue();
+ Anope::string override = values[4].GetValue();
+ Anope::string commands = values[5].GetValue();
+ Anope::string servers = values[6].GetValue();
+ Anope::string channels = values[7].GetValue();
+ Anope::string users = values[8].GetValue();
+ bool normal = values[9].GetBool();
+ bool rawio = values[10].GetBool();
+ bool ldebug = values[11].GetBool();
+
+ LogInfo *l = new LogInfo(logage, normal, rawio, ldebug);
+ l->Targets = BuildStringList(targets);
+ l->Sources = BuildStringList(source);
+ l->Admin = BuildStringList(admin);
+ l->Override = BuildStringList(override);
+ l->Commands = BuildStringList(commands);
+ l->Servers = BuildStringList(servers);
+ l->Channels = BuildStringList(channels);
+ l->Users = BuildStringList(users);
+
+ config->LogInfos.push_back(l);
+
+ return true;
+}
+
+bool DoneLogs(ServerConfig *config, const Anope::string &)
+{
+ InitLogChannels(config);
+
+ Log() << "Loaded " << config->LogInfos.size() << " log blocks";
+
+ return true;
+}
+
void ServerConfig::Read()
{
errstr.clear();
@@ -902,8 +983,6 @@ void ServerConfig::Read()
{"serverinfo", "hostname", "", new ValueContainerString(&this->ServiceHost), DT_STRING | DT_NORELOAD, ValidateNotEmpty},
{"serverinfo", "pid", "services.pid", new ValueContainerString(&this->PIDFilename), DT_STRING | DT_NORELOAD, ValidateNotEmpty},
{"serverinfo", "motd", "services.motd", new ValueContainerString(&this->MOTDFilename), DT_STRING, ValidateNotEmpty},
- {"networkinfo", "logchannel", "", new ValueContainerString(&this->LogChannel), DT_STRING, NoValidation},
- {"networkinfo", "logbot", "no", new ValueContainerBool(&this->LogBot), DT_BOOLEAN, NoValidation},
{"networkinfo", "networkname", "", new ValueContainerString(&this->NetworkName), DT_STRING, ValidateNotEmpty},
{"networkinfo", "nicklen", "0", new ValueContainerUInt(&this->NickLen), DT_UINTEGER | DT_NORELOAD, ValidateNickLen},
{"networkinfo", "userlen", "10", new ValueContainerUInt(&this->UserLen), DT_UINTEGER | DT_NORELOAD, NoValidation},
@@ -930,7 +1009,6 @@ void ServerConfig::Read()
{"options", "useprivmsg", "no", new ValueContainerBool(&this->UsePrivmsg), DT_BOOLEAN, NoValidation},
{"options", "usestrictprivmsg", "no", new ValueContainerBool(&this->UseStrictPrivMsg), DT_BOOLEAN, NoValidation},
{"options", "dumpcore", "yes", new ValueContainerBool(&this->DumpCore), DT_BOOLEAN | DT_NORELOAD, NoValidation},
- {"options", "logusers", "no", new ValueContainerBool(&this->LogUsers), DT_BOOLEAN, NoValidation},
{"options", "hidestatso", "no", new ValueContainerBool(&this->HideStatsO), DT_BOOLEAN, NoValidation},
{"options", "globaloncycle", "no", new ValueContainerBool(&this->GlobalOnCycle), DT_BOOLEAN, NoValidation},
{"options", "globaloncycledown", "", new ValueContainerString(&this->GlobalOnCycleMessage), DT_STRING, ValidateGlobalOnCycle},
@@ -940,7 +1018,6 @@ void ServerConfig::Read()
{"options", "restrictopernicks", "no", new ValueContainerBool(&this->RestrictOperNicks), DT_BOOLEAN, NoValidation},
{"options", "newscount", "3", new ValueContainerUInt(&this->NewsCount), DT_UINTEGER, NoValidation},
{"options", "ulineservers", "", new ValueContainerString(&UlineServers), DT_STRING, NoValidation},
- {"options", "enablelogchannel", "no", new ValueContainerBool(&LogChan), DT_BOOLEAN, NoValidation},
{"options", "mlock", "+nrt", new ValueContainerString(&this->MLock), DT_STRING, NoValidation},
{"options", "botmodes", "", new ValueContainerString(&this->BotModes), DT_STRING, NoValidation},
{"options", "maxretries", "10", new ValueContainerUInt(&this->MaxRetries), DT_UINTEGER, NoValidation},
@@ -1017,7 +1094,6 @@ void ServerConfig::Read()
{"operserv", "globaldescription", "Global Noticer", new ValueContainerString(&this->desc_GlobalNoticer), DT_STRING | DT_NORELOAD, ValidateNotEmpty},
{"operserv", "modules", "", new ValueContainerString(&OperCoreModules), DT_STRING, NoValidation},
{"operserv", "superadmin", "no", new ValueContainerBool(&this->SuperAdmin), DT_BOOLEAN, NoValidation},
- {"operserv", "logmaxusers", "no", new ValueContainerBool(&this->LogMaxUsers), DT_BOOLEAN, NoValidation},
{"operserv", "autokillexpiry", "0", new ValueContainerTime(&this->AutokillExpiry), DT_TIME, ValidateNotZero},
{"operserv", "chankillexpiry", "0", new ValueContainerTime(&this->ChankillExpiry), DT_TIME, ValidateNotZero},
{"operserv", "snlineexpiry", "0", new ValueContainerTime(&this->SNLineExpiry), DT_TIME, ValidateNotZero},
@@ -1067,6 +1143,11 @@ void ServerConfig::Read()
{"", ""},
{DT_CHARPTR},
InitModules, DoModule, DoneModules},
+ {"log",
+ {"target", "source", "logage", "admin", "override", "commands", "servers", "channels", "users", "normal", "rawio", "debug", ""},
+ {"", "", "7", "", "", "", "", "", "", "", "no", "no", ""},
+ {DT_STRING, DT_STRING, DT_INTEGER, DT_STRING, DT_STRING, DT_STRING, DT_STRING, DT_STRING, DT_STRING, DT_BOOLEAN, DT_BOOLEAN, DT_BOOLEAN},
+ InitLogs, DoLogs, DoneLogs},
{"opertype",
{"name", "inherits", "commands", "privs", ""},
{"", "", "", "", ""},
@@ -1339,10 +1420,10 @@ void ServerConfig::Read()
}
throw ConfigException(ce);
}
- Alog(LOG_DEBUG) << "End config";
+ Log(LOG_DEBUG) << "End config";
for (int Index = 0; !Once[Index].empty(); ++Index)
CheckOnce(Once[Index]);
- Alog() << "Done reading configuration file.";
+ Log() << "Done reading configuration file.";
}
bool ServerConfig::LoadConf(ConfigDataHash &target, const Anope::string &filename)
@@ -1358,7 +1439,7 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const Anope::string &filenam
errstr << "File " << filename << " could not be opened." << std::endl;
return false;
}
- Alog(LOG_DEBUG) << "Start to read conf " << filename;
+ Log(LOG_DEBUG) << "Start to read conf " << filename;
// Start reading characters...
while (getline(conf, line.str()))
{
@@ -1462,7 +1543,7 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const Anope::string &filenam
return false;
}
// this is the same as the below section for testing if itemname is non-empty after the loop, but done inside it to allow the above construct
- Alog(LOG_DEBUG) << "ln "<< linenumber << " EOL: s='" << section << "' '" << itemname << "' set to '" << wordbuffer << "'";
+ Log(LOG_DEBUG) << "ln "<< linenumber << " EOL: s='" << section << "' '" << itemname << "' set to '" << wordbuffer << "'";
sectiondata.push_back(KeyVal(itemname, wordbuffer));
wordbuffer.clear();
itemname.clear();
@@ -1504,7 +1585,7 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const Anope::string &filenam
errstr << "Item without value: " << filename << ":" << linenumber << std::endl;
return false;
}
- Alog(LOG_DEBUG) << "ln " << linenumber << " EOL: s='" << section << "' '" << itemname << "' set to '" << wordbuffer << "'";
+ Log(LOG_DEBUG) << "ln " << linenumber << " EOL: s='" << section << "' '" << itemname << "' set to '" << wordbuffer << "'";
sectiondata.push_back(KeyVal(itemname, wordbuffer));
wordbuffer.clear();
itemname.clear();
@@ -1555,7 +1636,7 @@ bool ServerConfig::ConfValue(ConfigDataHash &target, const Anope::string &tag, c
{
if (!allow_linefeeds && j->second.find('\n') != Anope::string::npos)
{
- Alog(LOG_DEBUG) << "Value of <" << tag << ":" << var << "> contains a linefeed, and linefeeds in this value are not permitted -- stripped to spaces.";
+ Log(LOG_DEBUG) << "Value of <" << tag << ":" << var << "> contains a linefeed, and linefeeds in this value are not permitted -- stripped to spaces.";
j->second.replace_all_cs("\n", " ");
}
else
diff --git a/src/encrypt.cpp b/src/encrypt.cpp
index 0121c0c4a..57c120301 100644
--- a/src/encrypt.cpp
+++ b/src/encrypt.cpp
@@ -38,7 +38,7 @@ int enc_decrypt(const Anope::string &src, Anope::string &dest)
size_t pos = src.find(':');
if (pos == Anope::string::npos)
{
- Alog() << "Error: enc_decrypt() called with invalid password string (" << src << ")";
+ Log() << "Error: enc_decrypt() called with invalid password string (" << src << ")";
return -1;
}
Anope::string hashm(src.begin(), src.begin() + pos);
@@ -62,7 +62,7 @@ int enc_check_password(Anope::string &plaintext, Anope::string &password)
size_t pos = password.find(':');
if (pos == Anope::string::npos)
{
- Alog() << "Error: enc_check_password() called with invalid password string (" << password << ")";
+ Log() << "Error: enc_check_password() called with invalid password string (" << password << ")";
return 0;
}
Anope::string hashm(password.begin(), password.begin() + pos);
diff --git a/src/init.cpp b/src/init.cpp
index d3476a490..5b6d22445 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -25,7 +25,7 @@ void introduce_user(const Anope::string &user)
time_t now = time(NULL);
static time_t lasttime = now - 4;
if (lasttime >= now - 3)
- fatal("introduce_user loop detected");
+ throw FatalException("introduce_user loop detected");
lasttime = now;
if (user.empty())
@@ -54,6 +54,8 @@ void introduce_user(const Anope::string &user)
/* Load MLock from the database now that we know what modes exist */
for (registered_channel_map::iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
it->second->LoadMLock();
+ /* Setup log chanels */
+ InitLogChannels(Config);
}
}
@@ -81,7 +83,7 @@ static int set_group()
}
else
{
- Alog() << "Unknown run group '" << RUNGROUP << "'";
+ Log() << "Unknown run group '" << RUNGROUP << "'";
return -1;
}
#endif
@@ -182,7 +184,7 @@ static void write_pidfile()
atexit(remove_pidfile);
}
else
- log_perror("Warning: cannot write to PID file %s", Config->PIDFilename.c_str());
+ throw FatalException("Can not write to PID file " + Config->PIDFilename);
}
/*************************************************************************/
@@ -191,7 +193,7 @@ static void write_pidfile()
int openlog_failed = 0, openlog_errno = 0;
-int init_primary(int ac, char **av)
+void Init(int ac, char **av)
{
int started_from_term = isatty(0) && isatty(1) && isatty(2);
@@ -200,38 +202,38 @@ int init_primary(int ac, char **av)
umask(DEFUMASK);
#endif
if (set_group() < 0)
- return -1;
+ throw FatalException("set_group() fail");
/* Parse command line arguments */
ParseCommandLineArguments(ac, av);
if (GetCommandLineArgument("version", 'v'))
{
- Alog(LOG_TERMINAL) << "Anope-" << Anope::Version() << " -- " << Anope::Build();
- return -1;
+ Log(LOG_TERMINAL) << "Anope-" << Anope::Version() << " -- " << Anope::Build();
+ throw FatalException();
}
if (GetCommandLineArgument("help", 'h'))
{
- Alog(LOG_TERMINAL) << "Anope-" << Anope::Version() << " -- " << Anope::Build();
- Alog(LOG_TERMINAL) << "Anope IRC Services (http://www.anope.org)";
- Alog(LOG_TERMINAL) << "Usage ./" << SERVICES_BIN << " [options] ...";
- Alog(LOG_TERMINAL) << "-c, --config=filename.conf";
- Alog(LOG_TERMINAL) << "-d, --debug[=level]";
- Alog(LOG_TERMINAL) << " --dir=services_directory";
- Alog(LOG_TERMINAL) << "-h, --help";
- Alog(LOG_TERMINAL) << " --log=log_filename";
- Alog(LOG_TERMINAL) << "-e, --noexpire";
- Alog(LOG_TERMINAL) << "-n, --nofork";
- Alog(LOG_TERMINAL) << " --nothird";
- Alog(LOG_TERMINAL) << " --protocoldebug";
- Alog(LOG_TERMINAL) << "-r, --readonly";
- Alog(LOG_TERMINAL) << "-s, --support";
- Alog(LOG_TERMINAL) << "-v, --version";
- Alog(LOG_TERMINAL) << "";
- Alog(LOG_TERMINAL) << "Further support is available from http://www.anope.org";
- Alog(LOG_TERMINAL) << "Or visit us on IRC at irc.anope.org #anope";
- return -1;
+ Log(LOG_TERMINAL) << "Anope-" << Anope::Version() << " -- " << Anope::Build();
+ Log(LOG_TERMINAL) << "Anope IRC Services (http://www.anope.org)";
+ Log(LOG_TERMINAL) << "Usage ./" << SERVICES_BIN << " [options] ...";
+ Log(LOG_TERMINAL) << "-c, --config=filename.conf";
+ Log(LOG_TERMINAL) << "-d, --debug[=level]";
+ Log(LOG_TERMINAL) << " --dir=services_directory";
+ Log(LOG_TERMINAL) << "-h, --help";
+ Log(LOG_TERMINAL) << " --log=log_filename";
+ Log(LOG_TERMINAL) << "-e, --noexpire";
+ Log(LOG_TERMINAL) << "-n, --nofork";
+ Log(LOG_TERMINAL) << " --nothird";
+ Log(LOG_TERMINAL) << " --protocoldebug";
+ Log(LOG_TERMINAL) << "-r, --readonly";
+ Log(LOG_TERMINAL) << "-s, --support";
+ Log(LOG_TERMINAL) << "-v, --version";
+ Log(LOG_TERMINAL) << "";
+ Log(LOG_TERMINAL) << "Further support is available from http://www.anope.org";
+ Log(LOG_TERMINAL) << "Or visit us on IRC at irc.anope.org #anope";
+ throw FatalException();
}
if (GetCommandLineArgument("nofork", 'n'))
@@ -264,10 +266,7 @@ int init_primary(int ac, char **av)
if (level > 0)
debug = level;
else
- {
- Alog(LOG_TERMINAL) << "Invalid option given to --debug";
- return -1;
- }
+ throw FatalException("Invalid option given to --debug");
}
else
++debug;
@@ -276,49 +275,36 @@ int init_primary(int ac, char **av)
if (GetCommandLineArgument("config", 'c', Arg))
{
if (Arg.empty())
- {
- Alog(LOG_TERMINAL) << "The --config option requires a file name";
- return -1;
- }
+ throw FatalException("The --config option requires a file name");
services_conf = Arg;
}
if (GetCommandLineArgument("dir", 0, Arg))
{
if (Arg.empty())
- {
- Alog(LOG_TERMINAL) << "The --dir option requires a directory name";
- return -1;
- }
+ throw FatalException("The --dir option requires a directory name");
services_dir = Arg;
}
if (GetCommandLineArgument("log", 0, Arg))
{
if (Arg.empty())
- {
- Alog(LOG_TERMINAL) << "The --log option requires a file name";
- return -1;
- }
+ throw FatalException("The --log option requires a file name");
log_filename = Arg;
}
/* Chdir to Services data directory. */
if (chdir(services_dir.c_str()) < 0)
{
- fprintf(stderr, "chdir(%s): %s\n", services_dir.c_str(), strerror(errno));
- return -1;
+ throw FatalException("Unable to chdir to " + services_dir + ": " + Anope::string(strerror(errno)));
}
- /* Open logfile, and complain if we didn't. */
- if (open_log() < 0)
- {
- openlog_errno = errno;
- if (started_from_term)
- fprintf(stderr, "Warning: unable to open log file %s: %s\n", log_filename.c_str(), strerror(errno));
- else
- openlog_failed = 1;
- }
+ Log(LOG_TERMINAL) << "Anope " << Anope::Version() << ", " << Anope::Build();
+#ifdef _WIN32
+ Log(LOG_TERMINAL) << "Using configuration file " << services_dir << "\\" << services_conf;
+#else
+ Log(LOG_TERMINAL) << "Using configuration file " << services_dir << "/" << services_conf;
+#endif
/* Read configuration file; exit if there are problems. */
try
@@ -327,17 +313,17 @@ int init_primary(int ac, char **av)
}
catch (const ConfigException &ex)
{
- Alog(LOG_TERMINAL) << ex.GetReason();
- Alog(LOG_TERMINAL) << "*** Support resources: Read through the services.conf self-contained";
- Alog(LOG_TERMINAL) << "*** documentation. Read the documentation files found in the 'docs'";
- Alog(LOG_TERMINAL) << "*** folder. Visit our portal located at http://www.anope.org/. Join";
- Alog(LOG_TERMINAL) << "*** our support channel on /server irc.anope.org channel #anope.";
- return -1;
+ Log(LOG_TERMINAL) << ex.GetReason();
+ Log(LOG_TERMINAL) << "*** Support resources: Read through the services.conf self-contained";
+ Log(LOG_TERMINAL) << "*** documentation. Read the documentation files found in the 'docs'";
+ Log(LOG_TERMINAL) << "*** folder. Visit our portal located at http://www.anope.org/. Join";
+ Log(LOG_TERMINAL) << "*** our support channel on /server irc.anope.org channel #anope.";
+ throw FatalException("Configuration file failed to validate");
}
/* Add IRCD Protocol Module; exit if there are errors */
if (protocol_module_init())
- return -1;
+ throw FatalException("Unable to load protocol module");
/* Create me */
Me = new Server(NULL, Config->ServerName, 0, Config->ServerDesc, Config->Numeric);
@@ -377,19 +363,7 @@ int init_primary(int ac, char **av)
/* Load the socket engine */
if (ModuleManager::LoadModule(Config->SocketEngine, NULL))
- {
- Alog(LOG_TERMINAL) << "Unable to load socket engine " << Config->SocketEngine;
- return -1;
- }
-
- return 0;
-}
-
-int init_secondary(int ac, char **av)
-{
-#ifndef _WIN32
- int started_from_term = isatty(0) && isatty(1) && isatty(2);
-#endif
+ throw FatalException("Unable to load socket engine " + Config->SocketEngine);
/* Add Core MSG handles */
moduleAddMsgs();
@@ -399,15 +373,13 @@ int init_secondary(int ac, char **av)
{
int i;
if ((i = fork()) < 0)
- {
- perror("fork()");
- return -1;
- }
+ throw FatalException("Unable to fork");
else if (i != 0)
{
- Alog(LOG_TERMINAL) << "PID " << i;
+ Log(LOG_TERMINAL) << "PID " << i;
exit(0);
}
+
if (started_from_term)
{
close(0);
@@ -415,22 +387,15 @@ int init_secondary(int ac, char **av)
close(2);
}
if (setpgid(0, 0) < 0)
- {
- perror("setpgid()");
- return -1;
- }
+ throw FatalException("Unable to setpgid()");
}
#else
if (!SupportedWindowsVersion())
- {
- Alog() << GetWindowsVersion() << " is not a supported version of Windows";
-
- return -1;
- }
+ throw FatalException(GetWindowsVersion() + " is not a supported version of Windows");
if (!nofork)
{
- Alog(LOG_TERMINAL) << "PID " << GetCurrentProcessId();
- Alog() << "Launching Anope into the background";
+ Log(LOG_TERMINAL) << "PID " << GetCurrentProcessId();
+ Log() << "Launching Anope into the background";
FreeConsole();
}
#endif
@@ -439,13 +404,9 @@ int init_secondary(int ac, char **av)
write_pidfile();
/* Announce ourselves to the logfile. */
- Alog() << "Anope " << Anope::Version() << " (ircd protocol: " << version_protocol << ") starting up" << (debug || readonly ? " (options:" : "") << (debug ? " debug" : "") << (readonly ? " readonly" : "") << (debug || readonly ? ")" : "");
+ Log() << "Anope " << Anope::Version() << " (ircd protocol: " << version_protocol << ") starting up" << (debug || readonly ? " (options:" : "") << (debug ? " debug" : "") << (readonly ? " readonly" : "") << (debug || readonly ? ")" : "");
start_time = time(NULL);
- /* If in read-only mode, close the logfile again. */
- if (readonly)
- close_log();
-
/* Set signal handlers. Catch certain signals to let us do things or
* panic as necessary, and ignore all others.
*/
@@ -457,7 +418,7 @@ int init_secondary(int ac, char **av)
/* Initialize multi-language support */
lang_init();
- Alog(LOG_DEBUG) << "Loaded languages";
+ Log(LOG_DEBUG) << "Loaded languages";
/* Initialize subservices */
ns_init();
@@ -476,14 +437,12 @@ int init_secondary(int ac, char **av)
add_entropy_userkeys();
/* Load up databases */
- Alog() << "Loading databases...";
+ Log() << "Loading databases...";
EventReturn MOD_RESULT;
FOREACH_RESULT(I_OnLoadDatabase, OnLoadDatabase());
- Alog() << "Databases loaded";
+ Log() << "Databases loaded";
FOREACH_MOD(I_OnPostLoadDatabases, OnPostLoadDatabases());
-
- return 0;
}
/*************************************************************************/
diff --git a/src/language.cpp b/src/language.cpp
index 32f96b461..9d629f599 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -65,7 +65,7 @@ static void load_lang(int index, const char *filename)
FILE *f;
int32 num, i;
- Alog(LOG_DEBUG) << "Loading language " << index << " from file `languages/" << filename << "'";
+ Log(LOG_DEBUG) << "Loading language " << index << " from file `languages/" << filename << "'";
snprintf(buf, sizeof(buf), "languages/%s", filename);
#ifndef _WIN32
const char *mode = "r";
@@ -74,16 +74,15 @@ static void load_lang(int index, const char *filename)
#endif
if (!(f = fopen(buf, mode)))
{
- log_perror("Failed to load language %d (%s)", index, filename);
- return;
+ throw CoreException("Failed to load language " + stringify(index) + " (" + stringify(filename) + ")");
}
else if (read_int32(&num, f) < 0)
{
- Alog() << "Failed to read number of strings for language " << index << "(" << filename << ")";
+ Log() << "Failed to read number of strings for language " << index << "(" << filename << ")";
return;
}
else if (num != NUM_STRINGS)
- Alog() << "Warning: Bad number of strings (" << num << " , wanted " << NUM_STRINGS << ") for language " << index << " (" << filename << ")";
+ Log() << "Warning: Bad number of strings (" << num << " , wanted " << NUM_STRINGS << ") for language " << index << " (" << filename << ")";
langtexts[index] = static_cast<char **>(scalloc(sizeof(char *), NUM_STRINGS));
if (num > NUM_STRINGS)
num = NUM_STRINGS;
@@ -93,7 +92,7 @@ static void load_lang(int index, const char *filename)
fseek(f, i * 8 + 4, SEEK_SET);
if (read_int32(&pos, f) < 0 || read_int32(&len, f) < 0)
{
- Alog() << "Failed to read entry " << i << " in language " << index << " (" << filename << ") TOC";
+ Log() << "Failed to read entry " << i << " in language " << index << " (" << filename << ") TOC";
while (--i >= 0)
{
if (langtexts[index][i])
@@ -107,7 +106,7 @@ static void load_lang(int index, const char *filename)
langtexts[index][i] = NULL;
else if (len >= 65536)
{
- Alog() << "Entry " << i << " in language " << index << " (" << filename << ") is too long (over 64k) -- corrupt TOC?";
+ Log() << "Entry " << i << " in language " << index << " (" << filename << ") is too long (over 64k) -- corrupt TOC?";
while (--i >= 0)
{
if (langtexts[index][i])
@@ -119,7 +118,7 @@ static void load_lang(int index, const char *filename)
}
else if (len < 0)
{
- Alog() << "Entry " << i << " in language " << index << " (" << filename << ") has negative length -- corrupt TOC?";
+ Log() << "Entry " << i << " in language " << index << " (" << filename << ") has negative length -- corrupt TOC?";
while (--i >= 0)
{
if (langtexts[index][i])
@@ -135,7 +134,7 @@ static void load_lang(int index, const char *filename)
fseek(f, pos, SEEK_SET);
if (fread(langtexts[index][i], 1, len, f) != len)
{
- Alog() << "Failed to read string " << i << " in language " << index << "(" << filename << ")";
+ Log() << "Failed to read string " << i << " in language " << index << "(" << filename << ")";
while (--i >= 0)
{
if (langtexts[index][i])
@@ -225,7 +224,7 @@ void lang_init()
Config->NSDefLanguage = DEF_LANGUAGE;
if (!langtexts[DEF_LANGUAGE])
- fatal("Unable to load default language");
+ throw CoreException("Unable to load default language");
for (i = 0; i < NUM_LANGS; ++i)
{
if (!langtexts[i])
diff --git a/src/log.cpp b/src/log.cpp
deleted file mode 100644
index 62fa29600..000000000
--- a/src/log.cpp
+++ /dev/null
@@ -1,264 +0,0 @@
-/* Logging routines.
- *
- * (C) 2003-2010 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-#include "services.h"
-
-static FILE *logfile;
-
-static int curday = 0;
-
-/*************************************************************************/
-
-static int get_logname(Anope::string &name, struct tm *tm)
-{
- char timestamp[32];
- time_t t;
-
- if (!tm)
- {
- time(&t);
- tm = localtime(&t);
- }
-
- /* fix bug 577 */
- strftime(timestamp, sizeof(timestamp), "%Y%m%d", tm);
- name = Anope::string("logs/") + timestamp + "." + log_filename;
- curday = tm->tm_yday;
-
- return 1;
-}
-
-/*************************************************************************/
-
-static void remove_log()
-{
- time_t t;
- struct tm tm;
-
- Anope::string name;
-
- if (!Config->KeepLogs)
- return;
-
- time(&t);
- t -= (60 * 60 * 24 * Config->KeepLogs);
- tm = *localtime(&t);
-
- /* removed if from here cause get_logchan is always 1 */
- get_logname(name, &tm);
- DeleteFile(name.c_str());
-}
-
-/*************************************************************************/
-
-static void checkday()
-{
- time_t t;
- struct tm tm;
-
- time(&t);
- tm = *localtime(&t);
-
- if (curday != tm.tm_yday)
- {
- close_log();
- remove_log();
- open_log();
- }
-}
-
-/*************************************************************************/
-
-/* Open the log file. Return -1 if the log file could not be opened, else
- * return 0. */
-
-int open_log()
-{
- Anope::string name;
-
- if (logfile)
- return 0;
-
- /* if removed again.. get_logname is always 1 */
- get_logname(name, NULL);
- logfile = fopen(name.c_str(), "a");
-
- if (logfile)
- setbuf(logfile, NULL);
- return logfile ? 0 : -1;
-}
-
-/*************************************************************************/
-
-/* Close the log file. */
-
-void close_log()
-{
- if (!logfile)
- return;
- fclose(logfile);
- logfile = NULL;
-}
-
-/*************************************************************************/
-
-/* added cause this is used over and over in the code */
-Anope::string log_gettimestamp()
-{
- time_t t;
- struct tm tm;
- char tbuf[256];
-
- time(&t);
- tm = *localtime(&t);
-#if HAVE_GETTIMEOFDAY
- if (debug)
- {
- char *s;
- struct timeval tv;
- gettimeofday(&tv, NULL);
- strftime(tbuf, sizeof(tbuf) - 1, "[%b %d %H:%M:%S", &tm);
- s = tbuf + strlen(tbuf);
- s += snprintf(s, sizeof(tbuf) - (s - tbuf), ".%06d", static_cast<int>(tv.tv_usec));
- strftime(s, sizeof(tbuf) - (s - tbuf) - 1, " %Y]", &tm);
- }
- else
-#endif
- strftime(tbuf, sizeof(tbuf) - 1, "[%b %d %H:%M:%S %Y]", &tm);
- return tbuf;
-}
-
-/*************************************************************************/
-
-/* Like alog(), but tack a ": " and a system error message (as returned by
- * strerror()) onto the end.
- */
-
-void log_perror(const char *fmt, ...)
-{
- va_list args;
- int errno_save = errno;
- char str[BUFSIZE];
-
- checkday();
-
- if (!fmt)
- return;
-
- va_start(args, fmt);
- vsnprintf(str, sizeof(str), fmt, args);
- va_end(args);
-
- Anope::string buf = log_gettimestamp();
-
- if (logfile)
- fprintf(logfile, "%s %s : %s\n", buf.c_str(), str, strerror(errno_save));
- if (nofork)
- fprintf(stderr, "%s %s : %s\n", buf.c_str(), str, strerror(errno_save));
- errno = errno_save;
-}
-
-/*************************************************************************/
-
-/* We've hit something we can't recover from. Let people know what
- * happened, then go down.
- */
-
-void fatal(const char *fmt, ...)
-{
- va_list args;
- char buf2[4096];
-
- checkday();
-
- if (!fmt)
- return;
-
- va_start(args, fmt);
- vsnprintf(buf2, sizeof(buf2), fmt, args);
- va_end(args);
-
- Anope::string buf = log_gettimestamp();
-
- if (logfile)
- fprintf(logfile, "%s FATAL: %s\n", buf.c_str(), buf2);
- if (nofork)
- fprintf(stderr, "%s FATAL: %s\n", buf.c_str(), buf2);
- if (UplinkSock)
- ircdproto->SendGlobops(NULL, "FATAL ERROR! %s", buf2);
-
- /* one of the many places this needs to be called from */
- ModuleRunTimeDirCleanUp();
-
- exit(1);
-}
-
-/*************************************************************************/
-
-/* Same thing, but do it like perror(). */
-
-void fatal_perror(const char *fmt, ...)
-{
- va_list args;
- char buf2[4096];
- int errno_save = errno;
-
- checkday();
-
- if (!fmt)
- return;
-
- va_start(args, fmt);
- vsnprintf(buf2, sizeof(buf2), fmt, args);
- va_end(args);
-
- Anope::string buf = log_gettimestamp();
-
- if (logfile)
- fprintf(logfile, "%s FATAL: %s: %s\n", buf.c_str(), buf2, strerror(errno_save));
- if (nofork)
- fprintf(stderr, "%s FATAL: %s: %s\n", buf.c_str(), buf2, strerror(errno_save));
- if (UplinkSock)
- ircdproto->SendGlobops(NULL, "FATAL ERROR! %s: %s", buf2, strerror(errno_save));
-
- /* one of the many places this needs to be called from */
- ModuleRunTimeDirCleanUp();
-
- exit(1);
-}
-
-Alog::Alog(LogLevel val) : Level(val)
-{
- if (Level >= LOG_DEBUG)
- buf << "Debug: ";
-}
-
-Alog::~Alog()
-{
- if (Level >= LOG_DEBUG && (Level - LOG_DEBUG + 1) > debug)
- return;
-
- int errno_save = errno;
-
- checkday();
-
- Anope::string tbuf = log_gettimestamp();
-
- if (logfile)
- fprintf(logfile, "%s %s\n", tbuf.c_str(), buf.str().c_str());
- if (nofork)
- std::cout << tbuf << " " << buf.str() << std::endl;
- else if (Level == LOG_TERMINAL) // XXX dont use this yet unless you know we're at terminal and not daemonized
- std::cout << buf.str() << std::endl;
- if (Config && !Config->LogChannel.empty() && LogChan && !debug && findchan(Config->LogChannel))
- ircdproto->SendPrivmsg(Global, Config->LogChannel, "%s", buf.str().c_str());
- errno = errno_save;
-}
diff --git a/src/logger.cpp b/src/logger.cpp
new file mode 100644
index 000000000..14e5f6d1e
--- /dev/null
+++ b/src/logger.cpp
@@ -0,0 +1,399 @@
+/* Logging routines.
+ *
+ * (C) 2003-2010 Anope Team
+ * Contact us at team@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ */
+
+#include "services.h"
+
+void InitLogChannels(ServerConfig *config)
+{
+ for (unsigned i = 0; i < config->LogInfos.size(); ++i)
+ {
+ LogInfo *l = config->LogInfos[i];
+
+ for (std::list<Anope::string>::const_iterator sit = l->Targets.begin(), sit_end = l->Targets.end(); sit != sit_end; ++sit)
+ {
+ const Anope::string &target = *sit;
+
+ if (target[0] == '#')
+ {
+ Channel *c = findchan(target);
+ if (!c)
+ c = new Channel(target);
+ c->SetFlag(CH_LOGCHAN);
+ c->SetFlag(CH_PERSIST);
+
+ for (botinfo_map::const_iterator bit = BotListByNick.begin(), bit_end = BotListByNick.end(); bit != bit_end; ++bit)
+ {
+ BotInfo *bi = bit->second;
+
+ if (bi->HasFlag(BI_CORE) && !c->FindUser(bi))
+ {
+ bi->Join(c);
+ for (unsigned j = 0; j < config->BotModeList.size(); ++j)
+ c->SetMode(OperServ, config->BotModeList[j], bi->nick, false);
+ }
+ }
+ }
+ }
+ }
+}
+
+static Anope::string GetTimeStamp()
+{
+ char tbuf[256];
+ time_t t;
+
+ if (time(&t) < 0)
+ throw CoreException("time() failed");
+ tm tm = *localtime(&t);
+#if HAVE_GETTIMEOFDAY
+ if (debug)
+ {
+ char *s;
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ strftime(tbuf, sizeof(tbuf) - 1, "[%b %d %H:%M:%S", &tm);
+ s = tbuf + strlen(tbuf);
+ s += snprintf(s, sizeof(tbuf) - (s - tbuf), ".%06d", static_cast<int>(tv.tv_usec));
+ strftime(s, sizeof(tbuf) - (s - tbuf) - 1, " %Y]", &tm);
+ }
+ else
+#endif
+ strftime(tbuf, sizeof(tbuf) - 1, "[%b %d %H:%M:%S %Y]", &tm);
+
+ return tbuf;
+}
+
+static Anope::string GetLogDate(time_t t = time(NULL))
+{
+ char timestamp[32];
+
+ time(&t);
+ tm *tm = localtime(&t);
+
+ strftime(timestamp, sizeof(timestamp), "%Y%m%d", tm);
+
+ return timestamp;
+}
+
+static inline Anope::string CreateLogName(const Anope::string &file, time_t time = time(NULL))
+{
+ return "logs/" + file + "." + GetLogDate(time);
+}
+
+LogFile::LogFile(const Anope::string &name) : filename(name), stream(name.c_str(), std::ios_base::out)
+{
+}
+
+Anope::string LogFile::GetName() const
+{
+ return this->filename;
+}
+
+Log::Log(LogType type, const Anope::string &category, BotInfo *b) : bi(b), Type(type), Category(category)
+{
+ if (b)
+ this->Sources.push_back(b->nick);
+}
+
+Log::Log(LogType type, User *u, Command *c, ChannelInfo *ci) : Type(type)
+{
+ if (!u || !c)
+ throw CoreException("Invalid pointers passed to Log::Log");
+
+ if (type != LOG_COMMAND && type != LOG_OVERRIDE && type != LOG_ADMIN)
+ throw CoreException("This constructor does not support this log type");
+
+ this->bi = c->service ? c->service : Global;
+ this->Category = (c->service ? c->service->nick + "/" : "") + c->name;
+ this->Sources.push_back(this->bi->nick);
+ this->Sources.push_back(u->nick);
+ this->Sources.push_back(c->name);
+ if (ci)
+ this->Sources.push_back(ci->name);
+
+ if (type == LOG_ADMIN)
+ buf << "ADMIN: ";
+ else if (type == LOG_OVERRIDE)
+ buf << "OVERRIDE: ";
+ else
+ buf << "COMMAND: ";
+ buf << u->GetMask() << " used " << c->name << " ";
+ if (ci)
+ buf << "on " << ci->name << " ";
+}
+
+Log::Log(User *u, Channel *c, const Anope::string &category) : Type(LOG_CHANNEL)
+{
+ if (!c)
+ throw CoreException("Invalid pointers passed to Log::Log");
+
+ this->bi = whosends(c->ci);
+ this->Category = category;
+ if (this->bi)
+ this->Sources.push_back(this->bi->nick);
+ if (u)
+ this->Sources.push_back(u->nick);
+ this->Sources.push_back(c->name);
+
+ buf << "CHANNEL: ";
+ if (u)
+ buf << u->GetMask() << " " << this->Category << " " << c->name << " ";
+ else
+ buf << this->Category << " " << c->name << " ";
+}
+
+Log::Log(User *u, const Anope::string &category) : bi(Global), Type(LOG_USER), Category(category)
+{
+ if (!u)
+ throw CoreException("Invalid pointers passed to Log::Log");
+
+ if (this->bi)
+ this->Sources.push_back(this->bi->nick);
+ this->Sources.push_back(u->nick);
+
+ buf << "USERS: " << u->GetMask() << " ";
+}
+
+Log::Log(Server *s, const Anope::string &category) : bi(OperServ), Type(LOG_SERVER), Category(category)
+{
+ if (!s)
+ throw CoreException("Invalid pointer passed to Log::Log");
+
+ if (this->bi)
+ this->Sources.push_back(this->bi->nick);
+ this->Sources.push_back(s->GetName());
+
+ buf << "SERVER: " << s->GetName() << " (" << s->GetDescription() << ") ";
+}
+
+Log::Log(BotInfo *b, const Anope::string &category) : bi(b), Type(LOG_USER), Category(category)
+{
+ if (!b)
+ throw CoreException("Invalid opinter passed to Log::Log");
+
+ this->Sources.push_back(bi->nick);
+}
+
+Log::~Log()
+{
+ if (nofork && debug && this->Type >= LOG_NORMAL && this->Type <= LOG_DEBUG + debug - 1)
+ std::cout << GetTimeStamp() << " Debug: " << this->buf.str() << std::endl;
+ else if (this->Type == LOG_TERMINAL)
+ std::cout << this->buf.str() << std::endl;
+ for (unsigned i = 0; Config && i < Config->LogInfos.size(); ++i)
+ {
+ LogInfo *l = Config->LogInfos[i];
+ l->ProcessMessage(this);
+ }
+}
+
+LogInfo::LogInfo(int logage, bool normal, bool rawio, bool ldebug) : LogAge(logage), Normal(normal), RawIO(rawio), Debug(ldebug)
+{
+}
+
+LogInfo::~LogInfo()
+{
+ for (std::map<Anope::string, LogFile *>::iterator it = this->Logfiles.begin(), it_end = this->Logfiles.end(); it != it_end; ++it)
+ {
+ LogFile *f = it->second;
+
+ if (f && f->stream.is_open())
+ f->stream.close();
+ delete f;
+ }
+ this->Logfiles.clear();
+}
+
+void LogInfo::AddType(std::list<Anope::string> &list, const Anope::string &type)
+{
+ for (std::list<Anope::string>::iterator it = list.begin(), it_end = list.end(); it != it_end; ++it)
+ {
+ if (Anope::Match(type, *it))
+ {
+ Log() << "Log: Type " << type << " is already covered by " << *it;
+ return;
+ }
+ }
+
+ list.push_back(type);
+}
+
+bool LogInfo::HasType(std::list<Anope::string> &list, const Anope::string &type) const
+{
+ for (std::list<Anope::string>::iterator it = list.begin(), it_end = list.end(); it != it_end; ++it)
+ {
+ Anope::string cat = *it;
+ bool inverse = false;
+ if (cat[0] == '~')
+ {
+ cat.erase(cat.begin());
+ inverse = true;
+ }
+ if (Anope::Match(type, cat))
+ {
+ return !inverse;
+ }
+ }
+
+ return false;
+}
+
+std::list<Anope::string> &LogInfo::GetList(LogType type)
+{
+ static std::list<Anope::string> empty;
+
+ switch (type)
+ {
+ case LOG_ADMIN:
+ case LOG_OVERRIDE:
+ case LOG_COMMAND:
+ return this->Commands;
+ case LOG_SERVER:
+ return this->Servers;
+ case LOG_CHANNEL:
+ return this->Channels;
+ case LOG_USER:
+ return this->Users;
+ default:
+ return empty;
+ }
+}
+
+bool LogInfo::HasType(LogType type)
+{
+ switch (type)
+ {
+ case LOG_ADMIN:
+ case LOG_OVERRIDE:
+ case LOG_COMMAND:
+ case LOG_SERVER:
+ case LOG_CHANNEL:
+ case LOG_USER:
+ return !this->GetList(type).empty();
+ case LOG_NORMAL:
+ return this->Normal;
+ case LOG_TERMINAL:
+ return true;
+ case LOG_RAWIO:
+ return this->RawIO;
+ case LOG_DEBUG:
+ return this->Debug;
+ // LOG_DEBUG_[234]
+ default:
+ break;
+ }
+
+ return false;
+}
+
+void LogInfo::ProcessMessage(const Log *l)
+{
+ static time_t lastwarn = time(NULL);
+
+ if (!l)
+ throw CoreException("Bad values passed to LogInfo::ProcessMessages");
+
+ if (!this->HasType(l->Type))
+ return;
+ else if (!l->Category.empty() && !this->HasType(this->GetList(l->Type), l->Category))
+ return;
+
+ if (!this->Sources.empty())
+ {
+ bool log = false;
+ for (std::list<Anope::string>::const_iterator it = this->Sources.begin(), it_end = this->Sources.end(); it != it_end; ++it)
+ {
+ if (std::find(l->Sources.begin(), l->Sources.end(), *it) != l->Sources.end())
+ {
+ log = true;
+ break;
+ }
+ }
+ if (!log)
+ return;
+ }
+
+ for (std::list<Anope::string>::iterator it = this->Targets.begin(), it_end = this->Targets.end(); it != it_end; ++it)
+ {
+ const Anope::string &target = *it;
+
+ if (target[0] == '#')
+ {
+ if (UplinkSock && !debug && Me && Me->IsSynced())
+ {
+ Channel *c = findchan(target);
+ if (!c || !l->bi)
+ continue;
+ ircdproto->SendPrivmsg(l->bi, c->name, "%s", l->buf.str().c_str());
+ }
+ }
+ else
+ {
+ LogFile *log = NULL;
+ std::map<Anope::string, LogFile *>::iterator lit = this->Logfiles.find(target);
+ if (lit != this->Logfiles.end())
+ {
+ log = lit->second;
+ if (log && log->GetName() != CreateLogName(target))
+ {
+ delete log;
+ log = new LogFile(CreateLogName(target));
+
+ if (this->LogAge)
+ {
+ Anope::string oldlog = CreateLogName(target, time(NULL) - 86400 * this->LogAge);
+ if (IsFile(oldlog))
+ {
+ DeleteFile(oldlog.c_str());
+ Log(LOG_DEBUG) << "Deleted old logfile " << oldlog;
+ }
+ }
+ }
+ if (!log || !log->stream.is_open())
+ {
+ time_t now = time(NULL);
+ if (log && lastwarn + 300 > now)
+ {
+ lastwarn = now;
+ Log() << "Unable to open logfile " << log->GetName();
+ }
+ delete log;
+ log = NULL;
+ this->Logfiles.erase(lit);
+ continue;
+ }
+ }
+ else if (lit == this->Logfiles.end())
+ {
+ log = new LogFile(CreateLogName(target));
+
+ if (!log->stream.is_open())
+ {
+ time_t now = time(NULL);
+ if (lastwarn + 300 > now)
+ {
+ lastwarn = now;
+ Log() << "Unable to open logfile " << log->GetName();
+ delete log;
+ log = NULL;
+ continue;
+ }
+ }
+
+ this->Logfiles[target] = log;
+ }
+
+ if (log)
+ log->stream << GetTimeStamp() << " " << l->buf.str() << std::endl;
+ }
+ }
+}
+
diff --git a/src/mail.cpp b/src/mail.cpp
index 354c7e2e7..666355b0a 100644
--- a/src/mail.cpp
+++ b/src/mail.cpp
@@ -4,9 +4,9 @@
MailThread::~MailThread()
{
if (Success)
- Alog() << "Successfully delivered mail for " << MailTo << " (" << Addr << ")";
+ Log() << "Successfully delivered mail for " << MailTo << " (" << Addr << ")";
else
- Alog() << "Error delivering mail for " << MailTo << " (" << Addr << ")";
+ Log() << "Error delivering mail for " << MailTo << " (" << Addr << ")";
}
void MailThread::Run()
diff --git a/src/main.cpp b/src/main.cpp
index bcb67b6fa..79dcd3b00 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -43,7 +43,6 @@ Anope::string orig_cwd; /* Original current working directory */
Anope::string log_filename = "services.log"; /* -log filename */
int debug = 0; /* -debug */
bool readonly = false; /* -readonly */
-bool LogChan = false; /* -logchan */
bool nofork = false; /* -nofork */
bool nothird = false; /* -nothrid */
bool noexpire = false; /* -noexpire */
@@ -138,7 +137,7 @@ extern void expire_all()
FOREACH_MOD(I_OnPreDatabaseExpire, OnPreDatabaseExpire());
- Alog(LOG_DEBUG) << "Running expire routines";
+ Log(LOG_DEBUG) << "Running expire routines";
expire_nicks();
expire_chans();
expire_requests();
@@ -156,7 +155,7 @@ void save_databases()
EventReturn MOD_RESULT;
FOREACH_RESULT(I_OnSaveDatabase, OnSaveDatabase());
- Alog(LOG_DEBUG) << "Saving FFF databases";
+ Log(LOG_DEBUG) << "Saving databases";
}
/*************************************************************************/
@@ -169,7 +168,7 @@ void do_restart_services()
expire_all();
save_databases();
}
- Alog() << "Restarting";
+ Log() << "Restarting";
FOREACH_MOD(I_OnPreRestart, OnPreRestart());
@@ -188,15 +187,12 @@ void do_restart_services()
ircdproto->SendSquit(Config->ServerName, quitmsg);
SocketEngine->Process();
delete UplinkSock;
- close_log();
ModuleManager::UnloadAll();
chdir(binary_dir.c_str());
execve(services_bin.c_str(), my_av, my_envp);
if (!readonly)
{
- open_log();
- log_perror("Restart failed");
- close_log();
+ throw FatalException("Restart failed");
}
FOREACH_MOD(I_OnRestart, OnRestart());
@@ -214,7 +210,7 @@ static void services_shutdown()
if (quitmsg.empty())
quitmsg = "Terminating, reason unknown";
- Alog() << quitmsg;
+ Log() << quitmsg;
if (started && UplinkSock)
{
/* Send a quit for all of our bots */
@@ -259,7 +255,7 @@ void sighandler(int signum)
#ifndef _WIN32
if (signum == SIGHUP)
{
- Alog() << "Received SIGHUP: Saving Databases & Rehash Configuration";
+ Log() << "Received SIGHUP: Saving Databases & Rehash Configuration";
expire_all();
save_databases();
@@ -273,7 +269,7 @@ void sighandler(int signum)
}
catch (const ConfigException &ex)
{
- Alog() << "Error reloading configuration file: " << ex.GetReason();
+ Log() << "Error reloading configuration file: " << ex.GetReason();
}
return;
@@ -287,7 +283,7 @@ void sighandler(int signum)
signal(SIGHUP, SIG_IGN);
#endif
- Alog() << "Received SIGTERM, exiting.";
+ Log() << "Received SIGTERM, exiting.";
expire_all();
save_databases();
@@ -300,7 +296,7 @@ void sighandler(int signum)
if (nofork)
{
signal(SIGINT, SIG_IGN);
- Alog() << "Received SIGINT, exiting.";
+ Log() << "Received SIGINT, exiting.";
expire_all();
save_databases();
quitmsg = "Shutting down on SIGINT";
@@ -323,7 +319,7 @@ void sighandler(int signum)
if (isatty(2))
fprintf(stderr, "%s\n", quitmsg.c_str());
else
- Alog() << quitmsg;
+ Log() << quitmsg;
exit(1);
}
@@ -398,11 +394,11 @@ static bool Connect()
}
catch (const SocketException &ex)
{
- Alog() << "Unable to connect to server" << servernum << " (" << uplink_server->host << ":" << uplink_server->port << "), " << ex.GetReason();
+ Log() << "Unable to connect to server" << servernum << " (" << uplink_server->host << ":" << uplink_server->port << "), " << ex.GetReason();
continue;
}
- Alog() << "Connected to Server " << servernum << " (" << uplink_server->host << ":" << uplink_server->port << ")";
+ Log() << "Connected to Server " << servernum << " (" << uplink_server->host << ":" << uplink_server->port << ")";
return true;
}
@@ -417,175 +413,175 @@ static bool Connect()
int main(int ac, char **av, char **envp)
{
- my_av = av;
- my_envp = envp;
+ try
+ {
+ my_av = av;
+ my_envp = envp;
- char cwd[PATH_MAX] = "";
+ char cwd[PATH_MAX] = "";
#ifdef _WIN32
- GetCurrentDirectory(PATH_MAX, cwd);
+ GetCurrentDirectory(PATH_MAX, cwd);
#else
- getcwd(cwd, PATH_MAX);
+ getcwd(cwd, PATH_MAX);
#endif
- orig_cwd = cwd;
+ orig_cwd = cwd;
#ifndef _WIN32
- /* If we're root, issue a warning now */
- if (!getuid() && !getgid())
- {
- fprintf(stderr, "WARNING: You are currently running Anope as the root superuser. Anope does not\n");
- fprintf(stderr, " require root privileges to run, and it is discouraged that you run Anope\n");
- fprintf(stderr, " as the root superuser.\n");
- }
+ /* If we're root, issue a warning now */
+ if (!getuid() && !getgid())
+ {
+ fprintf(stderr, "WARNING: You are currently running Anope as the root superuser. Anope does not\n");
+ fprintf(stderr, " require root privileges to run, and it is discouraged that you run Anope\n");
+ fprintf(stderr, " as the root superuser.\n");
+ }
#endif
- binary_dir = GetFullProgDir(av[0]);
- if (binary_dir[binary_dir.length() - 1] == '.')
- binary_dir = binary_dir.substr(0, binary_dir.length() - 2);
+ binary_dir = GetFullProgDir(av[0]);
+ if (binary_dir[binary_dir.length() - 1] == '.')
+ binary_dir = binary_dir.substr(0, binary_dir.length() - 2);
#ifdef _WIN32
- Anope::string::size_type n = binary_dir.rfind('\\');
- services_dir = binary_dir.substr(0, n) + "\\data";
+ Anope::string::size_type n = binary_dir.rfind('\\');
+ services_dir = binary_dir.substr(0, n) + "\\data";
#else
- Anope::string::size_type n = binary_dir.rfind('/');
- services_dir = binary_dir.substr(0, n) + "/data";
+ Anope::string::size_type n = binary_dir.rfind('/');
+ services_dir = binary_dir.substr(0, n) + "/data";
#endif
- /* Clean out the module runtime directory prior to running, just in case files were left behind during a previous run */
- ModuleRunTimeDirCleanUp();
+ /* Clean out the module runtime directory prior to running, just in case files were left behind during a previous run */
+ ModuleRunTimeDirCleanUp();
- /* General initialization first */
- int i = init_primary(ac, av);
- if (i)
- return i;
+ /* General initialization first */
+ Init(ac, av);
- Alog(LOG_TERMINAL) << "Anope " << Anope::Version() << ", " << Anope::Build();
-#ifdef _WIN32
- Alog(LOG_TERMINAL) << "Using configuration file " << services_dir << "\\" << services_conf;
-#else
- Alog(LOG_TERMINAL) << "Using configuration file " << services_dir << "/" << services_conf;
-#endif
-
- /* Initialization stuff. */
- i = init_secondary(ac, av);
- if (i)
- return i;
-
- /* If the first connect fails give up, don't sit endlessly trying to reconnect */
- if (!Connect())
- fatal_perror("Can't connect to any servers");
+ /* If the first connect fails give up, don't sit endlessly trying to reconnect */
+ if (!Connect())
+ {
+ Log() << "Can't connect to any servers";
+ return 0;
+ }
- ircdproto->SendConnect();
- FOREACH_MOD(I_OnServerConnect, OnServerConnect());
+ ircdproto->SendConnect();
+ FOREACH_MOD(I_OnServerConnect, OnServerConnect());
- started = true;
+ started = true;
#ifndef _WIN32
- if (Config->DumpCore)
- {
- rlimit rl;
- if (getrlimit(RLIMIT_CORE, &rl) == -1)
- Alog() << "Failed to getrlimit()!";
- else
+ if (Config->DumpCore)
{
- rl.rlim_cur = rl.rlim_max;
- if (setrlimit(RLIMIT_CORE, &rl) == -1)
- Alog() << "setrlimit() failed, cannot increase coredump size";
+ rlimit rl;
+ if (getrlimit(RLIMIT_CORE, &rl) == -1)
+ Log() << "Failed to getrlimit()!";
+ else
+ {
+ rl.rlim_cur = rl.rlim_max;
+ if (setrlimit(RLIMIT_CORE, &rl) == -1)
+ Log() << "setrlimit() failed, cannot increase coredump size";
+ }
}
- }
#endif
- /* Set up timers */
- time_t last_check = time(NULL);
- ExpireTimer expireTimer(Config->ExpireTimeout, last_check);
- UpdateTimer updateTimer(Config->UpdateTimeout, last_check);
+ /* Set up timers */
+ time_t last_check = time(NULL);
+ ExpireTimer expireTimer(Config->ExpireTimeout, last_check);
+ UpdateTimer updateTimer(Config->UpdateTimeout, last_check);
- /*** Main loop. ***/
- while (!quitting)
- {
- while (!quitting && UplinkSock)
+ /*** Main loop. ***/
+ while (!quitting)
{
- time_t t = time(NULL);
-
- Alog(LOG_DEBUG_2) << "Top of main loop";
-
- if (!readonly && (save_data || shutting_down))
+ while (!quitting && UplinkSock)
{
- if (!noexpire)
- expire_all();
- if (shutting_down)
- ircdproto->SendGlobops(NULL, "Updating databases on shutdown, please wait.");
- save_databases();
- save_data = false;
- }
+ time_t t = time(NULL);
- if (shutting_down)
- {
- quitting = true;
- break;
- }
+ Log(LOG_DEBUG_2) << "Top of main loop";
- if (t - last_check >= Config->TimeoutCheck)
- {
- TimerManager::TickTimers(t);
- last_check = t;
- }
+ if (!readonly && (save_data || shutting_down))
+ {
+ if (!noexpire)
+ expire_all();
+ if (shutting_down)
+ ircdproto->SendGlobops(NULL, "Updating databases on shutdown, please wait.");
+ save_databases();
+ save_data = false;
+ }
- /* Process any modes that need to be (un)set */
- ModeManager::ProcessModes();
+ if (shutting_down)
+ {
+ quitting = true;
+ break;
+ }
- /* Process the socket engine */
- SocketEngine->Process();
- }
+ if (t - last_check >= Config->TimeoutCheck)
+ {
+ TimerManager::TickTimers(t);
+ last_check = t;
+ }
- if (quitting)
- /* Disconnect and exit */
- services_shutdown();
- else
- {
- FOREACH_MOD(I_OnServerDisconnect, OnServerDisconnect());
+ /* Process any modes that need to be (un)set */
+ ModeManager::ProcessModes();
+
+ /* Process the socket engine */
+ SocketEngine->Process();
+ }
- /* Clear all of our users, but not our bots */
- for (user_map::const_iterator it = UserListByNick.begin(), it_end = UserListByNick.end(); it != it_end; )
+ if (quitting)
+ /* Disconnect and exit */
+ services_shutdown();
+ else
{
- User *u = it->second;
- ++it;
+ FOREACH_MOD(I_OnServerDisconnect, OnServerDisconnect());
- if (!findbot(u->nick))
- delete u;
- }
+ /* Clear all of our users, but not our bots */
+ for (user_map::const_iterator it = UserListByNick.begin(), it_end = UserListByNick.end(); it != it_end; )
+ {
+ User *u = it->second;
+ ++it;
- Me->SetFlag(SERVER_SYNCING);
- Me->ClearLinks();
+ if (!findbot(u->nick))
+ delete u;
+ }
- unsigned j = 0;
- for (; j < (Config->MaxRetries ? Config->MaxRetries : j + 1); ++j)
- {
- Alog() << "Disconnected from the server, retrying in " << Config->RetryWait << " seconds";
+ Me->SetFlag(SERVER_SYNCING);
+ Me->ClearLinks();
- sleep(Config->RetryWait);
- if (Connect())
+ unsigned j = 0;
+ for (; j < (Config->MaxRetries ? Config->MaxRetries : j + 1); ++j)
{
- ircdproto->SendConnect();
- FOREACH_MOD(I_OnServerConnect, OnServerConnect());
- break;
+ Log() << "Disconnected from the server, retrying in " << Config->RetryWait << " seconds";
+
+ sleep(Config->RetryWait);
+ if (Connect())
+ {
+ ircdproto->SendConnect();
+ FOREACH_MOD(I_OnServerConnect, OnServerConnect());
+ break;
+ }
+ }
+ if (Config->MaxRetries && j == Config->MaxRetries)
+ {
+ Log() << "Max connection retry limit exceeded";
+ quitting = true;
}
- }
- if (Config->MaxRetries && j == Config->MaxRetries)
- {
- Alog() << "Max connection retry limit exceeded";
- quitting = true;
}
}
}
+ catch (const FatalException &ex)
+ {
+ if (!ex.GetReason().empty())
+ Log(LOG_TERMINAL) << ex.GetReason();
+ return -1;
+ }
return 0;
}
-inline Anope::string Anope::Version()
+Anope::string Anope::Version()
{
return stringify(VERSION_MAJOR) + "." + stringify(VERSION_MINOR) + "." + stringify(VERSION_PATCH) + VERSION_EXTRA + " (" + stringify(VERSION_BUILD) + ")";
}
-inline Anope::string Anope::Build()
+Anope::string Anope::Build()
{
return "build #" + stringify(BUILD) + ", compiled " + Anope::compiled;
}
+
+
diff --git a/src/memoserv.cpp b/src/memoserv.cpp
index 0fcf0b6a3..eec5ab7a3 100644
--- a/src/memoserv.cpp
+++ b/src/memoserv.cpp
@@ -50,7 +50,7 @@ void check_memos(User *u)
{
if (!u)
{
- Alog(LOG_DEBUG) << "check_memos called with NULL values";
+ Log() << "check_memos called with NULL values";
return;
}
diff --git a/src/messages.cpp b/src/messages.cpp
index d40d06712..72a926618 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -102,7 +102,7 @@ int m_privmsg(const Anope::string &source, const Anope::string &receiver, const
if (!u)
{
- Alog() << message << ": user record for " << source << " not found";
+ Log() << message << ": user record for " << source << " not found";
BotInfo *bi = findbot(receiver);
if (bi)
@@ -129,7 +129,9 @@ int m_privmsg(const Anope::string &source, const Anope::string &receiver, const
if (get_ignore(source))
{
Anope::string target = myStrGetToken(message, ' ', 0);
- Alog() << "Ignored message from " << source << " to " << receiver << " using command " << target;
+ BotInfo *bi = findbot(target);
+ if (bi)
+ Log(bi) << "Ignored message from " << source << " using command " << target;
return MOD_CONT;
}
}
@@ -147,7 +149,7 @@ int m_privmsg(const Anope::string &source, const Anope::string &receiver, const
}
else if (Config->UseStrictPrivMsg)
{
- Alog(LOG_DEBUG) << "Ignored PRIVMSG without @ from " << source;
+ Log(LOG_DEBUG) << "Ignored PRIVMSG without @ from " << source;
notice_lang(receiver, u, INVALID_TARGET, receiver.c_str(), receiver.c_str(), Config->ServerName.c_str(), receiver.c_str());
return MOD_CONT;
}
@@ -196,7 +198,7 @@ int m_privmsg(const Anope::string &source, const Anope::string &receiver, const
}
else
{
- Alog() << Config->s_OperServ << ": " << u->nick << ": " << message;
+ Log(OperServ) << u->nick << ": " << message;
mod_run_cmd(bi, u, message);
}
}
diff --git a/src/misc.cpp b/src/misc.cpp
index 42d56407b..66beff127 100644
--- a/src/misc.cpp
+++ b/src/misc.cpp
@@ -601,7 +601,7 @@ void EnforceQlinedNick(const Anope::string &nick, const Anope::string &killer)
if (u2)
{
- Alog() << "Killed Q-lined nick: " << u2->GetMask();
+ Log() << "Killed Q-lined nick: " << u2->GetMask();
kill_user(killer, u2->nick, "This nick is reserved for Services. Please use a non Q-Lined nick.");
}
}
@@ -834,7 +834,7 @@ Anope::string host_resolve(const Anope::string &host)
char ipbuf[16];
ntoa(addr, ipbuf, sizeof(ipbuf));
ipreturn = ipbuf;
- Alog(LOG_DEBUG) << "resolved " << host << " to " << ipbuf;
+ Log(LOG_DEBUG) << "resolved " << host << " to " << ipbuf;
}
return ipreturn;
}
diff --git a/src/modes.cpp b/src/modes.cpp
index 6c060aed8..da9f22bef 100644
--- a/src/modes.cpp
+++ b/src/modes.cpp
@@ -33,8 +33,6 @@ Flags<ChannelModeName> DefMLockOn;
Flags<ChannelModeName> DefMLockOff;
/* Map for default mlocked mode parameters */
std::map<ChannelModeName, Anope::string> DefMLockParams;
-/* Modes to set on bots when they join the channel */
-std::list<ChannelModeStatus *> BotModes;
/** Parse the mode string from the config file and set the default mlocked modes
*/
@@ -72,7 +70,7 @@ void SetDefaultMLock(ServerConfig *config)
DefMLockParams.insert(std::make_pair(cm->Name, param));
else
{
- Alog() << "Warning: Got default mlock mode " << cm->ModeChar << " with no param?";
+ Log() << "Warning: Got default mlock mode " << cm->ModeChar << " with no param?";
ptr->UnsetFlag(cm->Name);
}
}
@@ -81,13 +79,13 @@ void SetDefaultMLock(ServerConfig *config)
}
/* Set Bot Modes */
- BotModes.clear();
- for (unsigned i = 0, end_mode = config->BotModes.length(); i < end_mode; ++i)
+ config->BotModeList.clear();
+ for (unsigned i = 0; i < config->BotModes.length(); ++i)
{
ChannelMode *cm = ModeManager::FindChannelModeByChar(config->BotModes[i]);
- if (cm && cm->Type == MODE_STATUS && std::find(BotModes.begin(), BotModes.end(), cm) == BotModes.end())
- BotModes.push_back(debug_cast<ChannelModeStatus *>(cm));
+ if (cm && cm->Type == MODE_STATUS && std::find(config->BotModeList.begin(), config->BotModeList.end(), cm) == config->BotModeList.end())
+ config->BotModeList.push_back(debug_cast<ChannelModeStatus *>(cm));
}
}
@@ -282,7 +280,7 @@ void ChannelModeBan::AddMask(Channel *chan, const Anope::string &mask)
/* check for NULL values otherwise we will segfault */
if (!chan || mask.empty())
{
- Alog(LOG_DEBUG) << "add_ban called with NULL values";
+ Log() << "add_ban called with NULL values";
return;
}
@@ -293,7 +291,7 @@ void ChannelModeBan::AddMask(Channel *chan, const Anope::string &mask)
Entry *ban = entry_add(chan->bans, mask);
if (!ban)
- fatal("Creating new ban entry failed");
+ throw CoreException("Creating new ban entry failed");
/* Check whether it matches a botserv bot after adding internally
* and parsing it through cidr support. ~ Viper */
@@ -309,7 +307,7 @@ void ChannelModeBan::AddMask(Channel *chan, const Anope::string &mask)
}
}
- Alog(LOG_DEBUG) << "Added ban " << mask << " to channel " << chan->name;
+ Log(LOG_DEBUG) << "Added ban " << mask << " to channel " << chan->name;
}
/** Remove a ban from the channel
@@ -327,7 +325,7 @@ void ChannelModeBan::DelMask(Channel *chan, const Anope::string &mask)
{
entry_delete(chan->bans, ban);
- Alog(LOG_DEBUG) << "Deleted ban " << mask << " from channel " << chan->name;
+ Log(LOG_DEBUG) << "Deleted ban " << mask << " from channel " << chan->name;
}
AutoKick *akick;
@@ -343,7 +341,7 @@ void ChannelModeExcept::AddMask(Channel *chan, const Anope::string &mask)
{
if (!chan || mask.empty())
{
- Alog(LOG_DEBUG) << "add_exception called with NULL values";
+ Log() << "add_exception called with NULL values";
return;
}
@@ -354,9 +352,9 @@ void ChannelModeExcept::AddMask(Channel *chan, const Anope::string &mask)
Entry *exception = entry_add(chan->excepts, mask);
if (!exception)
- fatal("Creating new exception entry failed");
+ throw CoreException("Creating new exception entry failed");
- Alog(LOG_DEBUG) << "Added except " << mask << " to channel " << chan->name;
+ Log(LOG_DEBUG) << "Added except " << mask << " to channel " << chan->name;
}
/** Remove an except from the channel
@@ -373,7 +371,7 @@ void ChannelModeExcept::DelMask(Channel *chan, const Anope::string &mask)
if (exception)
{
entry_delete(chan->excepts, exception);
- Alog(LOG_DEBUG) << "Deleted except " << mask << " to channel " << chan->name;
+ Log(LOG_DEBUG) << "Deleted except " << mask << " to channel " << chan->name;
}
}
@@ -385,7 +383,7 @@ void ChannelModeInvex::AddMask(Channel *chan, const Anope::string &mask)
{
if (!chan || mask.empty())
{
- Alog(LOG_DEBUG) << "add_invite called with NULL values";
+ Log() << "add_invite called with NULL values";
return;
}
@@ -396,9 +394,9 @@ void ChannelModeInvex::AddMask(Channel *chan, const Anope::string &mask)
Entry *invite = entry_add(chan->invites, mask);
if (!invite)
- fatal("Creating new exception entry failed");
+ throw CoreException("Creating new invex entry failed");
- Alog(LOG_DEBUG) << "Added invite " << mask << " to channel " << chan->name;
+ Log(LOG_DEBUG) << "Added invite " << mask << " to channel " << chan->name;
}
@@ -416,7 +414,7 @@ void ChannelModeInvex::DelMask(Channel *chan, const Anope::string &mask)
if (invite)
{
entry_delete(chan->invites, invite);
- Alog(LOG_DEBUG) << "Deleted invite " << mask << " to channel " << chan->name;
+ Log(LOG_DEBUG) << "Deleted invite " << mask << " to channel " << chan->name;
}
}
@@ -611,7 +609,7 @@ bool ModeManager::AddUserMode(UserMode *um)
if (um->Name == UMODE_END)
{
um->Name = static_cast<UserModeName>(UMODE_END + ++GenericUserModes);
- Alog() << "ModeManager: Added generic support for user mode " << um->ModeChar;
+ Log() << "ModeManager: Added generic support for user mode " << um->ModeChar;
}
ModeManager::UserModesByName.insert(std::make_pair(um->Name, um));
ModeManager::Modes.insert(std::make_pair(um->NameAsString, um));
@@ -635,7 +633,7 @@ bool ModeManager::AddChannelMode(ChannelMode *cm)
if (cm->Name == CMODE_END)
{
cm->Name = static_cast<ChannelModeName>(CMODE_END + ++GenericChannelModes);
- Alog() << "ModeManager: Added generic support for channel mode " << cm->ModeChar;
+ Log() << "ModeManager: Added generic support for channel mode " << cm->ModeChar;
}
ModeManager::ChannelModesByName.insert(std::make_pair(cm->Name, cm));
ModeManager::Modes.insert(std::make_pair(cm->NameAsString, cm));
diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp
index 49b90ca41..bacf6c8d1 100644
--- a/src/modulemanager.cpp
+++ b/src/modulemanager.cpp
@@ -51,7 +51,7 @@ static int moduleCopyFile(const Anope::string &name, Anope::string &output)
output = tmp_output;
free(tmp_output); // XXX
- Alog(LOG_DEBUG) << "Runtime module location: " << output;
+ Log(LOG_DEBUG) << "Runtime module location: " << output;
FILE *target;
#ifndef _WIN32
@@ -116,7 +116,7 @@ int ModuleManager::LoadModule(const Anope::string &modname, User *u)
if (FindModule(modname))
return MOD_ERR_EXISTS;
- Alog(LOG_DEBUG) << "trying to load [" << modname << "]";
+ Log(LOG_DEBUG) << "trying to load [" << modname << "]";
/* Generate the filename for the temporary copy of the module */
Anope::string pbuf = services_dir + "/modules/runtime/" + modname + ".so.XXXXXX";
@@ -137,7 +137,7 @@ int ModuleManager::LoadModule(const Anope::string &modname, User *u)
const char *err;
if (!handle && (err = dlerror()))
{
- Alog() << err;
+ Log() << err;
return MOD_ERR_NOLOAD;
}
@@ -145,7 +145,7 @@ int ModuleManager::LoadModule(const Anope::string &modname, User *u)
Module *(*func)(const Anope::string &, const Anope::string &) = function_cast<Module *(*)(const Anope::string &, const Anope::string &)>(dlsym(handle, "AnopeInit"));
if (!func && (err = dlerror()))
{
- Alog() << "No init function found, not an Anope module";
+ Log() << "No init function found, not an Anope module";
dlclose(handle);
return MOD_ERR_NOLOAD;
}
@@ -166,7 +166,7 @@ int ModuleManager::LoadModule(const Anope::string &modname, User *u)
}
catch (const ModuleException &ex)
{
- Alog() << "Error while loading " << modname << ": " << ex.GetReason();
+ Log() << "Error while loading " << modname << ": " << ex.GetReason();
return MOD_STOP;
}
@@ -176,27 +176,27 @@ int ModuleManager::LoadModule(const Anope::string &modname, User *u)
Version v = m->GetVersion();
if (v.GetMajor() < VERSION_MAJOR || (v.GetMajor() == VERSION_MAJOR && v.GetMinor() < VERSION_MINOR))
{
- Alog() << "Module " << modname << " is compiled against an older version of Anope " << v.GetMajor() << "." << v.GetMinor() << ", this is " << VERSION_MAJOR << "." << VERSION_MINOR;
+ Log() << "Module " << modname << " is compiled against an older version of Anope " << v.GetMajor() << "." << v.GetMinor() << ", this is " << VERSION_MAJOR << "." << VERSION_MINOR;
DeleteModule(m);
return MOD_STOP;
}
else if (v.GetMajor() > VERSION_MAJOR || (v.GetMajor() == VERSION_MAJOR && v.GetMinor() > VERSION_MINOR))
{
- Alog() << "Module " << modname << " is compiled against a newer version of Anope " << v.GetMajor() << "." << v.GetMinor() << ", this is " << VERSION_MAJOR << "." << VERSION_MINOR;
+ Log() << "Module " << modname << " is compiled against a newer version of Anope " << v.GetMajor() << "." << v.GetMinor() << ", this is " << VERSION_MAJOR << "." << VERSION_MINOR;
DeleteModule(m);
return MOD_STOP;
}
else if (v.GetBuild() < VERSION_BUILD)
- Alog() << "Module " << modname << " is compiled against an older revision of Anope " << v.GetBuild() << ", this is " << VERSION_BUILD;
+ Log() << "Module " << modname << " is compiled against an older revision of Anope " << v.GetBuild() << ", this is " << VERSION_BUILD;
else if (v.GetBuild() > VERSION_BUILD)
- Alog() << "Module " << modname << " is compiled against a newer revision of Anope " << v.GetBuild() << ", this is " << VERSION_BUILD;
+ Log() << "Module " << modname << " is compiled against a newer revision of Anope " << v.GetBuild() << ", this is " << VERSION_BUILD;
else if (v.GetBuild() == VERSION_BUILD)
- Alog(LOG_DEBUG) << "Module " << modname << " compiled against current version of Anope " << v.GetBuild();
+ Log(LOG_DEBUG) << "Module " << modname << " compiled against current version of Anope " << v.GetBuild();
if (m->type == PROTOCOL && IsOneOfModuleTypeLoaded(PROTOCOL))
{
DeleteModule(m);
- Alog() << "You cannot load two protocol modules";
+ Log() << "You cannot load two protocol modules";
return MOD_STOP;
}
@@ -257,7 +257,7 @@ void ModuleManager::DeleteModule(Module *m)
const char *err;
if (!destroy_func && (err = dlerror()))
{
- Alog() << "No destroy function found, chancing delete...";
+ Log() << "No destroy function found, chancing delete...";
delete m; /* we just have to chance they haven't overwrote the delete operator then... */
}
else
@@ -266,7 +266,7 @@ void ModuleManager::DeleteModule(Module *m)
if (handle)
{
if (dlclose(handle))
- Alog() << dlerror();
+ Log() << dlerror();
}
if (!filename.empty())
diff --git a/src/modules.cpp b/src/modules.cpp
index 8f9b6b944..d2c6d7ac3 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -46,7 +46,7 @@ int protocol_module_init()
{
int ret = 0;
- Alog() << "Loading IRCD Protocol Module: [" << Config->IRCDModule << "]";
+ Log() << "Loading IRCD Protocol Module: [" << Config->IRCDModule << "]";
ret = ModuleManager::LoadModule(Config->IRCDModule, NULL);
if (ret == MOD_ERR_OK)
@@ -60,7 +60,7 @@ int protocol_module_init()
{
if (Config->Numeric.empty())
{
- Alog() << "This IRCd protocol requires a server id to be set in Anope's configuration.";
+ Log() << "This IRCd protocol requires a server id to be set in Anope's configuration.";
ret = -1;
}
}
@@ -73,7 +73,7 @@ void Module::InsertLanguage(int langNumber, int ac, const char **av)
{
int i;
- Alog(LOG_DEBUG) << this->name << " Adding " << ac << " texts for language " << langNumber;
+ Log(LOG_DEBUG) << this->name << " Adding " << ac << " texts for language " << langNumber;
if (this->lang[langNumber].argc > 0)
this->DeleteLanguage(langNumber);
@@ -184,7 +184,7 @@ int Module::AddCommand(BotInfo *bi, Command *c)
if (it.second != true)
{
- Alog() << "Error creating command " << c->name << ". Command already exists!";
+ Log() << "Error creating command " << c->name << ". Command already exists!";
return MOD_ERR_EXISTS;
}
@@ -282,7 +282,7 @@ void Module::NoticeLang(const Anope::string &source, const User *u, int number,
va_end(va);
}
else
- Alog() << this->name << ": INVALID language string call, language: [" << mlang << "], String [" << number << "]";
+ Log() << this->name << ": INVALID language string call, language: [" << mlang << "], String [" << number << "]";
}
const char *Module::GetLangString(User *u, int number)
@@ -306,7 +306,7 @@ const char *Module::GetLangString(User *u, int number)
*/
else
{
- Alog() << this->name << ": INVALID language string call, language: [" << mlang << "], String [" << number << "]";
+ Log() << this->name << ": INVALID language string call, language: [" << mlang << "], String [" << number << "]";
return "";
}
}
@@ -326,13 +326,13 @@ void ModuleRunTimeDirCleanUp()
{
Anope::string dirbuf = services_dir + "/modules/runtime";
- Alog(LOG_DEBUG) << "Cleaning out Module run time directory (" << dirbuf << ") - this may take a moment please wait";
+ Log(LOG_DEBUG) << "Cleaning out Module run time directory (" << dirbuf << ") - this may take a moment please wait";
#ifndef _WIN32
DIR *dirp = opendir(dirbuf.c_str());
if (!dirp)
{
- Alog(LOG_DEBUG) << "Cannot open directory (" << dirbuf << ")";
+ Log(LOG_DEBUG) << "Cannot open directory (" << dirbuf << ")";
return;
}
struct dirent *dp;
@@ -360,7 +360,7 @@ void ModuleRunTimeDirCleanUp()
{
Anope::string filebuf = dirbuf + "/" + FileData.cFileName;
if (!DeleteFile(filebuf.c_str()))
- Alog(LOG_DEBUG) << "Error deleting file " << filebuf << " - GetLastError() reports " << dlerror();
+ Log(LOG_DEBUG) << "Error deleting file " << filebuf << " - GetLastError() reports " << dlerror();
}
if (!FindNextFile(hList, &FileData))
{
@@ -370,11 +370,11 @@ void ModuleRunTimeDirCleanUp()
}
}
else
- Alog(LOG_DEBUG) << "Invalid File Handle. GetLastError() reports "<< static_cast<int>(GetLastError());
+ Log(LOG_DEBUG) << "Invalid File Handle. GetLastError() reports "<< static_cast<int>(GetLastError());
FindClose(hList);
#endif
- Alog(LOG_DEBUG) << "Module run time directory has been cleaned out";
+ Log(LOG_DEBUG) << "Module run time directory has been cleaned out";
}
Version Module::GetVersion() const
diff --git a/src/nickalias.cpp b/src/nickalias.cpp
index 4eae63138..b02097f19 100644
--- a/src/nickalias.cpp
+++ b/src/nickalias.cpp
@@ -52,7 +52,7 @@ NickAlias::NickAlias(const Anope::string &nickname, NickCore *nickcore)
if (ot->GetName().equals_ci(it->second))
{
- Alog() << "Tied oper " << this->nc->display << " to type " << ot->GetName();
+ Log() << "Tied oper " << this->nc->display << " to type " << ot->GetName();
this->nc->ot = ot;
break;
}
diff --git a/src/nickcore.cpp b/src/nickcore.cpp
index c75493b4a..61130b878 100644
--- a/src/nickcore.cpp
+++ b/src/nickcore.cpp
@@ -50,7 +50,7 @@ NickCore::~NickCore()
NickCoreList.erase(this->display);
/* Log .. */
- Alog() << Config->s_NickServ << ": deleting nickname group " << this->display;
+ Log() << Config->s_NickServ << ": deleting nickname group " << this->display;
/* Clear access before deleting display name, we want to be able to use the display name in the clear access event */
this->ClearAccess();
diff --git a/src/nickserv.cpp b/src/nickserv.cpp
index 11929ade7..da7b4bc4a 100644
--- a/src/nickserv.cpp
+++ b/src/nickserv.cpp
@@ -248,7 +248,7 @@ void expire_nicks()
User *u = finduser(na->nick);
if (u && (na->nc->HasFlag(NI_SECURE) ? u->IsIdentified() : u->IsRecognized()))
{
- Alog(LOG_DEBUG_2) << "NickServ: updating last seen time for " << na->nick;
+ Log(LOG_DEBUG_2) << "NickServ: updating last seen time for " << na->nick;
na->last_seen = now;
continue;
}
@@ -259,7 +259,7 @@ void expire_nicks()
FOREACH_RESULT(I_OnPreNickExpire, OnPreNickExpire(na));
if (MOD_RESULT == EVENT_STOP)
continue;
- Alog() << "Expiring nickname " << na->nick << " (group: " << na->nc->display << ") (e-mail: " << (na->nc->email.empty() ? "none" : na->nc->email) << ")";
+ Log() << "Expiring nickname " << na->nick << " (group: " << na->nc->display << ") (e-mail: " << (na->nc->email.empty() ? "none" : na->nc->email) << ")";
FOREACH_MOD(I_OnNickExpire, OnNickExpire(na));
delete na;
}
@@ -277,7 +277,7 @@ void expire_requests()
if (Config->NSRExpire && now - nr->requested >= Config->NSRExpire)
{
- Alog() << "Request for nick " << nr->nick << " expiring";
+ Log() << "Request for nick " << nr->nick << " expiring";
delete nr;
}
}
@@ -356,7 +356,7 @@ void change_core_display(NickCore *nc, const Anope::string &newdisplay)
{
/* Log ... */
FOREACH_MOD(I_OnChangeCoreDisplay, OnChangeCoreDisplay(nc, newdisplay));
- Alog() << Config->s_NickServ << ": changing " << nc->display << " nickname group display to " << newdisplay;
+ Log() << Config->s_NickServ << ": changing " << nc->display << " nickname group display to " << newdisplay;
/* Remove the core from the list */
NickCoreList.erase(nc->display);
diff --git a/src/process.cpp b/src/process.cpp
index d2bcec226..8c5ff71fc 100644
--- a/src/process.cpp
+++ b/src/process.cpp
@@ -76,7 +76,7 @@ void add_ignore(const Anope::string &nick, time_t delta)
newign->mask = mask;
newign->time = delta ? now + delta : 0;
ignore.push_front(newign);
- Alog(LOG_DEBUG) << "Added new ignore entry for " << mask;
+ Log(LOG_DEBUG) << "Added new ignore entry for " << mask;
}
}
@@ -137,13 +137,13 @@ IgnoreData *get_ignore(const Anope::string &nick)
/* Check whether the entry has timed out */
if (ign != ign_end && (*ign)->time && (*ign)->time <= now)
{
- Alog(LOG_DEBUG) << "Expiring ignore entry " << (*ign)->mask;
+ Log(LOG_DEBUG) << "Expiring ignore entry " << (*ign)->mask;
delete *ign;
ignore.erase(ign);
ign = ign_end = ignore.end();
}
- if (ign != ign_end && debug)
- Alog(LOG_DEBUG) << "Found ignore entry (" << (*ign)->mask << ") for " << nick;
+ if (ign != ign_end)
+ Log(LOG_DEBUG) << "Found ignore entry (" << (*ign)->mask << ") for " << nick;
return ign == ign_end ? NULL : *ign;
}
@@ -189,7 +189,7 @@ int delete_ignore(const Anope::string &nick)
/* No matching ignore found. */
if (ign == ign_end)
return 0;
- Alog(LOG_DEBUG) << "Deleting ignore entry " << (*ign)->mask;
+ Log(LOG_DEBUG) << "Deleting ignore entry " << (*ign)->mask;
/* Delete the entry and all references to it. */
delete *ign;
ignore.erase(ign);
@@ -208,7 +208,7 @@ int clear_ignores()
return 0;
for (std::list<IgnoreData *>::iterator ign = ignore.begin(), ign_end = ignore.end(); ign != ign_end; ++ign)
{
- Alog(LOG_DEBUG) << "Deleting ignore entry " << (*ign)->mask;
+ Log(LOG_DEBUG) << "Deleting ignore entry " << (*ign)->mask;
delete *ign;
}
int deleted = ignore.size();
@@ -278,7 +278,7 @@ void process(const Anope::string &buffer)
const char **av;
/* If debugging, log the buffer */
- Alog(LOG_DEBUG) << "Received: " << buffer;
+ Log(LOG_RAWIO) << "Received: " << buffer;
/* First make a copy of the buffer so we have the original in case we
* crash - in that case, we want to know what we crashed on. */
@@ -315,17 +315,17 @@ void process(const Anope::string &buffer)
if (protocoldebug)
{
if (*source)
- Alog() << "Source " << source;
+ Log() << "Source " << source;
if (*cmd)
- Alog() << "Token " << cmd;
+ Log() << "Token " << cmd;
if (ac)
{
int i;
for (i = 0; i < ac; ++i)
- Alog() << "av[" << i << "] = " << av[i];
+ Log() << "av[" << i << "] = " << av[i];
}
else
- Alog() << "av[0] = NULL";
+ Log() << "av[0] = NULL";
}
/* Do something with the message. */
@@ -344,7 +344,7 @@ void process(const Anope::string &buffer)
}
}
else
- Alog(LOG_DEBUG) << "unknown message from server (" << buffer << ")";
+ Log(LOG_DEBUG) << "unknown message from server (" << buffer << ")";
/* Free argument list we created */
free(av);
diff --git a/src/regchannel.cpp b/src/regchannel.cpp
index 393054acf..f22d3388f 100644
--- a/src/regchannel.cpp
+++ b/src/regchannel.cpp
@@ -24,7 +24,9 @@ ChannelInfo::ChannelInfo(const Anope::string &chname)
this->founder = this->successor = NULL;
this->last_topic_time = 0;
this->levels = NULL;
- this->c = NULL;
+ this->c = findchan(chname);
+ if (this->c)
+ this->c->ci = this;
this->capsmin = this->capspercent = 0;
this->floodlines = this->floodsecs = 0;
this->repeattimes = 0;
@@ -68,7 +70,7 @@ ChannelInfo::~ChannelInfo()
FOREACH_MOD(I_OnDelChan, OnDelChan(this));
- Alog(LOG_DEBUG) << "Deleting channel " << this->name;
+ Log(LOG_DEBUG) << "Deleting channel " << this->name;
if (this->c)
{
@@ -575,7 +577,7 @@ bool ChannelInfo::CheckKick(User *user)
if ((autokick->HasFlag(AK_ISNICK) && autokick->nc == nc) || (!autokick->HasFlag(AK_ISNICK) && match_usermask(autokick->mask, user)))
{
- Alog(LOG_DEBUG_2) << user->nick << " matched akick " << (autokick->HasFlag(AK_ISNICK) ? autokick->nc->display : autokick->mask);
+ Log(LOG_DEBUG_2) << user->nick << " matched akick " << (autokick->HasFlag(AK_ISNICK) ? autokick->nc->display : autokick->mask);
autokick->last_used = time(NULL);
if (autokick->HasFlag(AK_ISNICK))
get_idealban(this, user, mask);
@@ -598,7 +600,7 @@ bool ChannelInfo::CheckKick(User *user)
if (!do_kick)
return false;
- Alog(LOG_DEBUG) << "Autokicking "<< user->GetMask() << " from " << this->name;
+ Log(LOG_DEBUG) << "Autokicking "<< user->GetMask() << " from " << this->name;
/* If the channel isn't syncing and doesn't have any users, join ChanServ
* Note that the user AND POSSIBLY the botserv bot exist here
diff --git a/src/send.cpp b/src/send.cpp
index 62f1b8ec5..453131f51 100644
--- a/src/send.cpp
+++ b/src/send.cpp
@@ -33,21 +33,21 @@ void send_cmd(const Anope::string &source, const char *fmt, ...)
if (!UplinkSock)
{
if (!source.empty())
- Alog(LOG_DEBUG) << "Attemtped to send \"" << source << " " << buf << "\" with UplinkSock NULL";
+ Log(LOG_DEBUG) << "Attemtped to send \"" << source << " " << buf << "\" with UplinkSock NULL";
else
- Alog(LOG_DEBUG) << "Attemtped to send \"" << buf << "\" with UplinkSock NULL";
+ Log(LOG_DEBUG) << "Attemtped to send \"" << buf << "\" with UplinkSock NULL";
return;
}
if (!source.empty())
{
UplinkSock->Write(":%s %s", source.c_str(), buf);
- Alog(LOG_DEBUG) << "Sent: :" << source << " " << buf;
+ Log(LOG_RAWIO) << "Sent: :" << source << " " << buf;
}
else
{
UplinkSock->Write("%s", buf);
- Alog(LOG_DEBUG) << "Sent: "<< buf;
+ Log(LOG_RAWIO) << "Sent: "<< buf;
}
va_end(args);
diff --git a/src/servers.cpp b/src/servers.cpp
index 75f5b9249..d817ee94f 100644
--- a/src/servers.cpp
+++ b/src/servers.cpp
@@ -60,7 +60,7 @@ Server::Server(Server *uplink, const Anope::string &name, unsigned hops, const A
{
SetFlag(SERVER_SYNCING);
- Alog(LOG_DEBUG) << "Creating " << this->GetName() << " (" << this->GetSID() << ") uplinked to " << (this->UplinkServer ? this->UplinkServer->GetName() : "no uplink");
+ Log(this, "connect") << "uplinked to " << (this->UplinkServer ? this->UplinkServer->GetName() : "no uplink") << " connected to the network";
/* Add this server to our uplinks leaf list */
if (this->UplinkServer)
@@ -72,10 +72,6 @@ Server::Server(Server *uplink, const Anope::string &name, unsigned hops, const A
{
/* Bring in our pseudo-clients */
introduce_user("");
-
- /* And some IRCds needs Global joined in the logchan */
- if (LogChan && ircd->join2msg)
- Global->Join(Config->LogChannel);
}
}
}
@@ -84,7 +80,7 @@ Server::Server(Server *uplink, const Anope::string &name, unsigned hops, const A
*/
Server::~Server()
{
- Alog(LOG_DEBUG) << "Deleting server " << this->GetName() << " (" << this->GetSID() << ") uplinked to " << (this->UplinkServer ? this->UplinkServer->GetName() : "no uplink");
+ Log(this, "quit") << "quit from " << (this->UplinkServer ? this->UplinkServer->GetName() : "no uplink") << " for " << this->QReason;
if (Capab.HasFlag(CAPAB_NOQUIT) || Capab.HasFlag(CAPAB_QS))
{
@@ -108,7 +104,7 @@ Server::~Server()
}
}
- Alog(LOG_DEBUG) << "Finished removing all users for " << this->GetName();
+ Log(LOG_DEBUG) << "Finished removing all users for " << this->GetName();
}
if (this->UplinkServer)
@@ -190,7 +186,7 @@ void Server::AddLink(Server *s)
{
this->Links.push_back(s);
- Alog() << "Server " << s->GetName() << " introduced from " << this->GetName();
+ Log(this, "connect") << "introduced " << s->GetName();
}
/** Delinks a server from this server
@@ -210,7 +206,7 @@ void Server::DelLink(Server *s)
}
}
- Alog() << "Server " << s->GetName() << " quit from " << this->GetName();
+ Log(this, "quit") << "quit " << s->GetName();
}
/** Remov all links from this server
@@ -245,7 +241,7 @@ void Server::Sync(bool SyncLinks)
Me->UnsetFlag(SERVER_SYNCING);
}
- Alog() << "Server " << this->GetName() << " is done syncing";
+ Log(this, "sync") << "is done syncing";
FOREACH_MOD(I_OnServerSync, OnServerSync(this));
@@ -285,7 +281,7 @@ bool Server::IsULined() const
*/
Server *Server::Find(const Anope::string &name, Server *s)
{
- Alog(LOG_DEBUG) << "Server::Find called for " << name;
+ Log(LOG_DEBUG) << "Server::Find called for " << name;
if (!s)
s = Me;
@@ -300,7 +296,7 @@ Server *Server::Find(const Anope::string &name, Server *s)
if (serv->GetName().equals_cs(name) || serv->GetSID().equals_cs(name))
return serv;
- Alog(LOG_DEBUG) << "Server::Find checking " << serv->GetName() << " server tree for " << name;
+ Log(LOG_DEBUG) << "Server::Find checking " << serv->GetName() << " server tree for " << name;
Server *server = Server::Find(name, serv);
if (server)
return server;
@@ -324,9 +320,9 @@ Server *Server::Find(const Anope::string &name, Server *s)
void do_server(const Anope::string &source, const Anope::string &servername, unsigned int hops, const Anope::string &descript, const Anope::string &numeric)
{
if (source.empty())
- Alog(LOG_DEBUG) << "Server " << servername << " introduced";
+ Log(LOG_DEBUG) << "Server " << servername << " introduced";
else
- Alog(LOG_DEBUG) << "Server introduced (" << servername << ")" << " from " << source;
+ Log(LOG_DEBUG) << "Server introduced (" << servername << ")" << " from " << source;
Server *s = NULL;
@@ -366,7 +362,7 @@ void do_squit(const Anope::string &source, int ac, const char **av)
if (!s)
{
- Alog() << "SQUIT for nonexistent server (" << av[0] << ")!!";
+ Log() << "SQUIT for nonexistent server (" << av[0] << ")!!";
return;
}
@@ -386,7 +382,7 @@ void do_squit(const Anope::string &source, int ac, const char **av)
if (s->GetUplink() == Me && Capab.HasFlag(CAPAB_UNCONNECT))
{
- Alog(LOG_DEBUG) << "Sending UNCONNECT SQUIT for " << s->GetName();
+ Log(LOG_DEBUG) << "Sending UNCONNECT SQUIT for " << s->GetName();
/* need to fix */
ircdproto->SendSquit(s->GetName(), buf);
}
@@ -459,7 +455,6 @@ const char *ts6_uid_retrieve()
{
if (!ircd->ts6)
{
- Alog(LOG_DEBUG) << "ts6_uid_retrieve(): TS6 not supported on this ircd";
return "";
}
@@ -525,7 +520,6 @@ const char *ts6_sid_retrieve()
{
if (!ircd->ts6)
{
- Alog(LOG_DEBUG) << "ts6_sid_retrieve(): TS6 not supported on this ircd";
return "";
}
diff --git a/src/sessions.cpp b/src/sessions.cpp
index 893a45858..6d3571d85 100644
--- a/src/sessions.cpp
+++ b/src/sessions.cpp
@@ -168,17 +168,17 @@ void del_session(const Anope::string &host)
{
if (!Config->LimitSessions)
{
- Alog(LOG_DEBUG) << "del_session called when LimitSessions is disabled";
+ Log(LOG_DEBUG) << "del_session called when LimitSessions is disabled";
return;
}
if (host.empty())
{
- Alog(LOG_DEBUG) << "del_session called with NULL values";
+ Log(LOG_DEBUG) << "del_session called with NULL values";
return;
}
- Alog(LOG_DEBUG_2) << "del_session() called";
+ Log(LOG_DEBUG_2) << "del_session() called";
Session *session = findsession(host);
@@ -187,7 +187,7 @@ void del_session(const Anope::string &host)
if (debug)
{
ircdproto->SendGlobops(OperServ, "WARNING: Tried to delete non-existant session: \2%s", host.c_str());
- Alog(LOG_DEBUG) << "session: Tried to delete non-existant session: " << host;
+ Log() << "session: Tried to delete non-existant session: " << host;
}
return;
}
@@ -200,11 +200,11 @@ void del_session(const Anope::string &host)
SessionList.erase(session->host);
- Alog(LOG_DEBUG_2) << "del_session(): free session structure";
+ Log(LOG_DEBUG_2) << "del_session(): free session structure";
delete session;
- Alog(LOG_DEBUG_2) << "del_session() done";
+ Log(LOG_DEBUG_2) << "del_session() done";
}
/*************************************************************************/
diff --git a/src/sockets.cpp b/src/sockets.cpp
index 646ee261f..7dcdde678 100644
--- a/src/sockets.cpp
+++ b/src/sockets.cpp
@@ -19,7 +19,7 @@ SocketEngineBase::SocketEngineBase()
{
#ifdef _WIN32
if (WSAStartup(MAKEWORD(2, 0), &wsa))
- Alog() << "Failed to initialize WinSock library";
+ Log() << "Failed to initialize WinSock library";
#endif
}
diff --git a/src/users.cpp b/src/users.cpp
index 91ba45d0c..3713d102e 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -26,10 +26,10 @@ time_t maxusertime;
/*************************************************************************/
/*************************************************************************/
-User::User(const Anope::string &snick, const Anope::string &suid)
+User::User(const Anope::string &snick, const Anope::string &sident, const Anope::string &shost, const Anope::string &suid)
{
- if (snick.empty())
- throw CoreException("what the craq, empty nick passed to constructor");
+ if (snick.empty() || sident.empty() || shost.empty())
+ throw CoreException("Bad args passed to User::User");
// XXX: we should also duplicate-check here.
@@ -40,7 +40,10 @@ User::User(const Anope::string &snick, const Anope::string &suid)
OnAccess = false;
this->nick = snick;
+ this->ident = sident;
+ this->host = shost;
this->uid = suid;
+ this->isSuperAdmin = 0;
UserListByNick[snick] = this;
if (!suid.empty())
@@ -54,11 +57,8 @@ User::User(const Anope::string &snick, const Anope::string &suid)
{
maxusercnt = usercnt;
maxusertime = time(NULL);
- if (Config->LogMaxUsers)
- Alog() << "user: New maximum user count: "<< maxusercnt;
+ Log(this, "maxusers") << "connected - new maximum user count: " << maxusercnt;
}
-
- this->isSuperAdmin = 0; /* always set SuperAdmin to 0 for new users */
}
void User::SetNewNick(const Anope::string &newnick)
@@ -67,7 +67,7 @@ void User::SetNewNick(const Anope::string &newnick)
if (newnick.empty())
throw CoreException("User::SetNewNick() got a bad argument");
- Alog(LOG_DEBUG) << this->nick << " changed nick to " << newnick;
+ Log(this, "nick") << "changed nick to " << newnick;
UserListByNick.erase(this->nick);
@@ -88,7 +88,7 @@ void User::SetDisplayedHost(const Anope::string &shost)
this->vhost = shost;
- Alog(LOG_DEBUG) << this->nick << " changed vhost to " << shost;
+ Log(this, "host") << "changed vhost to " << shost;
this->UpdateHost();
}
@@ -116,7 +116,7 @@ void User::SetCloakedHost(const Anope::string &newhost)
chost = newhost;
- Alog(LOG_DEBUG) << this->nick << " changed cloaked host to " << newhost;
+ Log(this, "host") << "changed cloaked host to " << newhost;
this->UpdateHost();
}
@@ -138,7 +138,7 @@ void User::SetVIdent(const Anope::string &sident)
{
this->vident = sident;
- Alog(LOG_DEBUG) << this->nick << " changed vident to " << sident;
+ Log(this, "ident") << "changed vident to " << sident;
this->UpdateHost();
}
@@ -155,7 +155,7 @@ void User::SetIdent(const Anope::string &sident)
{
this->ident = sident;
- Alog(LOG_DEBUG) << this->nick << " changed real ident to " << sident;
+ Log(this, "ident") << "changed real ident to " << sident;
this->UpdateHost();
}
@@ -181,21 +181,16 @@ void User::SetRealname(const Anope::string &srealname)
if (na && (this->IsIdentified(true) || this->IsRecognized(true)))
na->last_realname = srealname;
- Alog(LOG_DEBUG) << this->nick << " changed realname to " << srealname;
+ Log(this, "realname") << "changed realname to " << srealname;
}
User::~User()
{
- Alog(LOG_DEBUG_2) << "User::~User() called";
+ Log(LOG_DEBUG_2) << "User::~User() called";
- this->Logout();
+ Log(this, "disconnect") << " (" << this->realname << ") " << "disconnected from the network (" << this->server->GetName() << ")";
- if (Config->LogUsers)
- {
- Anope::string srealname = normalizeBuffer(this->realname);
-
- Alog() << "LOGUSERS: " << this->nick << " (" << this->GetIdent() << "@" << this->host << (ircd->vhost ? " => " : "") << (ircd->vhost ? this->GetDisplayedHost() : "") << ") (" << srealname << ") left the network (" << this->server->GetName() << ").";
- }
+ this->Logout();
FOREACH_MOD(I_OnUserLogoff, OnUserLogoff(this));
@@ -218,7 +213,7 @@ User::~User()
if (na)
na->OnCancel(this);
- Alog(LOG_DEBUG_2) << "User::~User() done";
+ Log(LOG_DEBUG_2) << "User::~User() done";
}
void User::SendMessage(const Anope::string &source, const char *fmt, ...) const
@@ -659,20 +654,13 @@ User *do_nick(const Anope::string &source, const Anope::string &nick, const Anop
char ipbuf[16];
struct in_addr addr;
- if (ircd->nickvhost)
+ if (ircd->nickvhost && !vhost2.empty() && vhost2.equals_cs("*"))
{
- if (!vhost2.empty())
- {
- if (vhost2.equals_cs("*"))
- {
- vhost2.clear();
- Alog(LOG_DEBUG) << "new user with no vhost in NICK command: " << nick;
- }
- }
+ vhost2.clear();
}
/* This is a new user; create a User structure for it. */
- Alog(LOG_DEBUG) << "new user: " << nick;
+ Log(LOG_DEBUG) << "new user: " << nick;
if (ircd->nickip)
{
@@ -682,31 +670,8 @@ User *do_nick(const Anope::string &source, const Anope::string &nick, const Anop
Server *serv = Server::Find(server);
- if (Config->LogUsers)
- {
- /**
- * Ugly swap routine for Flop's bug :) XXX
- **/
- Anope::string logrealname = realname;
- if (!logrealname.empty())
- {
- size_t tmp;
- while ((tmp = logrealname.find('%')) != Anope::string::npos)
- logrealname[tmp] = '-';
- }
- logrealname = normalizeBuffer(logrealname);
-
- /**
- * End of ugly swap
- **/
- Alog() << "LOGUSERS: " << nick << " (" << username << "@" << host << (ircd->nickvhost && !vhost2.empty() ? " => " : "") << (ircd->nickvhost && !vhost2.empty() ? vhost2 : "") << ") (" << logrealname << ") "
- << (ircd->nickip ? "[" : "") << (ircd->nickip ? ipbuf : "") << (ircd->nickip ? "]" : "") << " connected to the network (" << serv->GetName() << ").";
- }
-
/* Allocate User structure and fill it in. */
- user = new User(nick, !uid.empty() ? uid : "");
- user->SetIdent(username);
- user->host = host;
+ user = new User(nick, username, host, uid);
user->server = serv;
user->realname = realname;
user->timestamp = ts;
@@ -721,6 +686,8 @@ User *do_nick(const Anope::string &source, const Anope::string &nick, const Anop
else
user->hostip = "";
+ Log(user, "connect") << (ircd->nickvhost && !vhost2.empty() ? Anope::string("(") + vhost2 + ")" : "") << ") (" << user->realname << ") " << (ircd->nickip ? Anope::string("[") + ipbuf + "] " : "") << "connected to the network (" << serv->GetName() << ")";
+
EventReturn MOD_RESULT;
FOREACH_RESULT(I_OnPreUserConnect, OnPreUserConnect(user));
if (MOD_RESULT == EVENT_STOP)
@@ -744,18 +711,12 @@ User *do_nick(const Anope::string &source, const Anope::string &nick, const Anop
if (!user)
{
- Alog() << "user: NICK from nonexistent nick " << source;
+ Log() << "user: NICK from nonexistent nick " << source;
return NULL;
}
user->isSuperAdmin = 0; /* Dont let people nick change and stay SuperAdmins */
- Alog(LOG_DEBUG) << source << " changes nick to " << nick;
- if (Config->LogUsers)
- {
- Anope::string logrealname = normalizeBuffer(user->realname);
- Alog() << "LOGUSERS: " << user->nick << " (" << user->GetIdent() << "@" << user->host << (ircd->vhost ? " => " : "") << (ircd->vhost ? user->GetDisplayedHost() : "") << ") (" << logrealname << ") changed nick to "
- << nick << " (" << user->server->GetName() << ").";
- }
+ Log(user, "nick") << " " << (ircd->vhost ? " => " : "") << (ircd->vhost ? user->GetDisplayedHost() : "") << ") (" << user->realname << ") changed nick to " << nick;
user->timestamp = ts;
@@ -793,7 +754,7 @@ User *do_nick(const Anope::string &source, const Anope::string &nick, const Anop
user->UpdateHost();
do_on_id(user);
ircdproto->SetAutoIdentificationToken(user);
- Alog() << Config->s_NickServ << ": " << user->GetMask() << " automatically identified for group " << user->Account()->display;
+ Log() << Config->s_NickServ << ": " << user->GetMask() << " automatically identified for group " << user->Account()->display;
}
if (ircd->sqline)
@@ -819,7 +780,7 @@ void do_umode(const Anope::string &source, int ac, const char **av)
User *user = finduser(av[0]);
if (!user)
{
- Alog() << "user: MODE "<< av[1] << " for nonexistent nick "<< av[0] << ":" << merge_args(ac, av);
+ Log() << "user: MODE "<< av[1] << " for nonexistent nick "<< av[0] << ":" << merge_args(ac, av);
return;
}
@@ -837,10 +798,11 @@ void do_quit(const Anope::string &source, int ac, const char **av)
User *user = finduser(source);
if (!user)
{
- Alog() << "user: QUIT from nonexistent user " << source << ":" << merge_args(ac, av);
+ Log() << "user: QUIT from nonexistent user " << source << ":" << merge_args(ac, av);
return;
}
- Alog(LOG_DEBUG) << source << " quits";
+
+ Log(user, "quit") << "for " << (*av[0] ? av[0] : "no reason");
NickAlias *na = findnick(user->nick);
if (na && !na->HasFlag(NS_FORBIDDEN) && !na->nc->HasFlag(NI_SUSPENDED) && (user->IsRecognized() || user->IsIdentified(true)))
@@ -864,10 +826,11 @@ void do_kill(const Anope::string &nick, const Anope::string &msg)
User *user = finduser(nick);
if (!user)
{
- Alog(LOG_DEBUG) << "KILL of nonexistent nick: " << nick;
+ Log() << "KILL of nonexistent nick: " << nick;
return;
}
- Alog(LOG_DEBUG) << nick << " killed";
+
+ Log(user, "killed") << "for " << msg;
NickAlias *na = findnick(user->nick);
if (na && !na->HasFlag(NS_FORBIDDEN) && !na->nc->HasFlag(NI_SUSPENDED) && (user->IsRecognized() || user->IsIdentified(true)))
@@ -997,7 +960,7 @@ void UserSetInternalModes(User *user, int ac, const char **av)
if (!user || !modes)
return;
- Alog(LOG_DEBUG) << "Changing user modes for " << user->nick << " to " << merge_args(ac, av);
+ Log(user, "mode") << "changes modes to " << merge_args(ac, av);
for (; *modes; ++modes)
{
@@ -1042,9 +1005,14 @@ void UserSetInternalModes(User *user, int ac, const char **av)
++opcnt;
if (Config->WallOper)
ircdproto->SendGlobops(OperServ, "\2%s\2 is now an IRC operator.", user->nick.c_str());
+ Log(OperServ) << user->nick << " is now an IRC operator";
}
else
+ {
--opcnt;
+
+ Log(OperServ) << user->nick << " is no longer an IRC operator";
+ }
break;
case UMODE_REGISTERED:
if (add && !user->IsIdentified())