diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bots.cpp | 15 | ||||
-rw-r--r-- | src/channels.cpp | 72 | ||||
-rw-r--r-- | src/chanserv.cpp | 16 | ||||
-rw-r--r-- | src/commands.cpp | 8 | ||||
-rw-r--r-- | src/config.cpp | 127 | ||||
-rw-r--r-- | src/encrypt.cpp | 4 | ||||
-rw-r--r-- | src/init.cpp | 157 | ||||
-rw-r--r-- | src/language.cpp | 19 | ||||
-rw-r--r-- | src/log.cpp | 264 | ||||
-rw-r--r-- | src/logger.cpp | 399 | ||||
-rw-r--r-- | src/mail.cpp | 4 | ||||
-rw-r--r-- | src/main.cpp | 268 | ||||
-rw-r--r-- | src/memoserv.cpp | 2 | ||||
-rw-r--r-- | src/messages.cpp | 10 | ||||
-rw-r--r-- | src/misc.cpp | 4 | ||||
-rw-r--r-- | src/modes.cpp | 40 | ||||
-rw-r--r-- | src/modulemanager.cpp | 26 | ||||
-rw-r--r-- | src/modules.cpp | 22 | ||||
-rw-r--r-- | src/nickalias.cpp | 2 | ||||
-rw-r--r-- | src/nickcore.cpp | 2 | ||||
-rw-r--r-- | src/nickserv.cpp | 8 | ||||
-rw-r--r-- | src/process.cpp | 24 | ||||
-rw-r--r-- | src/regchannel.cpp | 10 | ||||
-rw-r--r-- | src/send.cpp | 8 | ||||
-rw-r--r-- | src/servers.cpp | 30 | ||||
-rw-r--r-- | src/sessions.cpp | 12 | ||||
-rw-r--r-- | src/sockets.cpp | 2 | ||||
-rw-r--r-- | src/users.cpp | 110 |
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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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()) |