diff --git a/include/znc/main.h b/include/znc/main.h index bade558e..576069f8 100644 --- a/include/znc/main.h +++ b/include/znc/main.h @@ -12,13 +12,16 @@ #include #include -#define NOTHING (void)0 +extern bool ZNC_NO_NEED_TO_DO_ANYTHING_ON_MODULE_CALL_EXITER; +#define NOTHING &ZNC_NO_NEED_TO_DO_ANYTHING_ON_MODULE_CALL_EXITER #define ALLMODULECALL(macFUNC, macEXITER) \ do { \ + *macEXITER = false; \ CModules& GMods = CZNC::Get().GetModules(); \ + bool bAllExit = false; \ if (GMods.macFUNC) { \ - macEXITER; \ + bAllExit = true; \ } else { \ const map& mUsers = \ CZNC::Get().GetUserMap(); \ @@ -26,7 +29,8 @@ for (it = mUsers.begin(); it != mUsers.end(); ++it) { \ CModules& UMods = it->second->GetModules(); \ if (UMods.macFUNC) { \ - macEXITER; \ + bAllExit = true; \ + break; \ } \ const vector& mNets = \ it->second->GetNetworks(); \ @@ -34,15 +38,19 @@ for (it2 = mNets.begin(); it2 != mNets.end(); ++it2) { \ CModules& NMods = (*it2)->GetModules(); \ if (NMods.macFUNC) { \ - macEXITER; \ + bAllExit = true; \ + break; \ } \ } \ + if (bAllExit) break; \ } \ } \ + *macEXITER = bAllExit; \ } while (false) #define _GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \ do { \ + *macEXITER = false; \ CModules& GMods = CZNC::Get().GetModules(); \ CUser* pOldGUser = GMods.GetUser(); \ CIRCNetwork* pOldGNetwork = GMods.GetNetwork(); \ @@ -54,7 +62,7 @@ GMods.SetUser(pOldGUser); \ GMods.SetNetwork(pOldGNetwork); \ GMods.SetClient(pOldGClient); \ - macEXITER; \ + *macEXITER = true; \ } \ GMods.SetUser(pOldGUser); \ GMods.SetClient(pOldGClient); \ @@ -63,7 +71,13 @@ #define _USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \ do { \ assert(macUSER != NULL); \ - _GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER); \ + *macEXITER = false; \ + bool bGlobalExited = false; \ + _GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, &bGlobalExited); \ + if (bGlobalExited) { \ + *macEXITER = true; \ + break; \ + } \ CModules& UMods = macUSER->GetModules(); \ CIRCNetwork* pOldUNetwork = UMods.GetNetwork(); \ CClient* pOldUClient = UMods.GetClient(); \ @@ -72,7 +86,7 @@ if (UMods.macFUNC) { \ UMods.SetNetwork(pOldUNetwork); \ UMods.SetClient(pOldUClient); \ - macEXITER; \ + *macEXITER = true; \ } \ UMods.SetNetwork(pOldUNetwork); \ UMods.SetClient(pOldUClient); \ @@ -81,14 +95,20 @@ #define NETWORKMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \ do { \ assert(macUSER != NULL); \ - _USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER); \ + *macEXITER = false; \ + bool bUserExited = false; \ + _USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, &bUserExited); \ + if (bUserExited) { \ + *macEXITER = true; \ + break; \ + } \ if (macNETWORK != NULL) { \ CModules& NMods = macNETWORK->GetModules(); \ CClient* pOldNClient = NMods.GetClient(); \ NMods.SetClient(macCLIENT); \ if (NMods.macFUNC) { \ NMods.SetClient(pOldNClient); \ - macEXITER; \ + *macEXITER = true; \ } \ NMods.SetClient(pOldNClient); \ } \ diff --git a/src/Chan.cpp b/src/Chan.cpp index bca74548..9dd70c54 100644 --- a/src/Chan.cpp +++ b/src/Chan.cpp @@ -545,7 +545,7 @@ void CChan::SendBuffer(CClient* pClient) { CClient * pUseClient = (pClient ? pClient : vClients[uClient]); bool bSkipStatusMsg = pUseClient->HasServerTime(); - NETWORKMODULECALL(OnChanBufferStarting(*this, *pUseClient), m_pNetwork->GetUser(), m_pNetwork, NULL, bSkipStatusMsg = true); + NETWORKMODULECALL(OnChanBufferStarting(*this, *pUseClient), m_pNetwork->GetUser(), m_pNetwork, NULL, &bSkipStatusMsg); if (!bSkipStatusMsg) { m_pNetwork->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Buffer Playback...", pUseClient); @@ -554,12 +554,14 @@ void CChan::SendBuffer(CClient* pClient) { unsigned int uSize = m_Buffer.Size(); for (unsigned int uIdx = 0; uIdx < uSize; uIdx++) { CString sLine = m_Buffer.GetLine(uIdx, *pUseClient); - NETWORKMODULECALL(OnChanBufferPlayLine(*this, *pUseClient, sLine), m_pNetwork->GetUser(), m_pNetwork, NULL, continue); + bool bNotShowThisLine = false; + NETWORKMODULECALL(OnChanBufferPlayLine(*this, *pUseClient, sLine), m_pNetwork->GetUser(), m_pNetwork, NULL, &bNotShowThisLine); + if (bNotShowThisLine) continue; m_pNetwork->PutUser(sLine, pUseClient); } bSkipStatusMsg = pUseClient->HasServerTime(); - NETWORKMODULECALL(OnChanBufferEnding(*this, *pUseClient), m_pNetwork->GetUser(), m_pNetwork, NULL, bSkipStatusMsg = true); + NETWORKMODULECALL(OnChanBufferEnding(*this, *pUseClient), m_pNetwork->GetUser(), m_pNetwork, NULL, &bSkipStatusMsg); if (!bSkipStatusMsg) { m_pNetwork->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Playback Complete.", pUseClient); } diff --git a/src/Client.cpp b/src/Client.cpp index a525e420..2804e114 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -90,11 +90,13 @@ void CClient::ReadLine(const CString& sData) { sLine = sLine.Token(1, true); } + bool bReturn = false; if (IsAttached()) { - NETWORKMODULECALL(OnUserRaw(sLine), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserRaw(sLine), m_pUser, m_pNetwork, this, &bReturn); } else { - GLOBALMODULECALL(OnUnknownUserRaw(this, sLine), return); + GLOBALMODULECALL(OnUnknownUserRaw(this, sLine), &bReturn); } + if (bReturn) return; CString sCommand = sLine.Token(0); if (sCommand.Left(1) == ":") { @@ -232,11 +234,13 @@ void CClient::ReadLine(const CString& sData) { sCTCP.LeftChomp(); sCTCP.RightChomp(); - NETWORKMODULECALL(OnUserCTCPReply(sTarget, sCTCP), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserCTCPReply(sTarget, sCTCP), m_pUser, m_pNetwork, this, &bReturn); + if (bReturn) return; sMsg = "\001" + sCTCP + "\001"; } else { - NETWORKMODULECALL(OnUserNotice(sTarget, sMsg), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserNotice(sTarget, sMsg), m_pUser, m_pNetwork, this, &bReturn); + if (bReturn) return; } if (!GetIRCSock()) { @@ -293,7 +297,8 @@ void CClient::ReadLine(const CString& sData) { if (sCTCP.Token(0).Equals("ACTION")) { CString sMessage = sCTCP.Token(1, true); - NETWORKMODULECALL(OnUserAction(sTarget, sMessage), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserAction(sTarget, sMessage), m_pUser, m_pNetwork, this, &bReturn); + if (bReturn) return; sCTCP = "ACTION " + sMessage; if (pChan && (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline())) { @@ -313,7 +318,8 @@ void CClient::ReadLine(const CString& sData) { } } } else { - NETWORKMODULECALL(OnUserCTCP(sTarget, sCTCP), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserCTCP(sTarget, sCTCP), m_pUser, m_pNetwork, this, &bReturn); + if (bReturn) return; } PutIRC("PRIVMSG " + sTarget + " :\001" + sCTCP + "\001"); @@ -331,7 +337,8 @@ void CClient::ReadLine(const CString& sData) { return; } - NETWORKMODULECALL(OnUserMsg(sTarget, sMsg), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserMsg(sTarget, sMsg), m_pUser, m_pNetwork, this, &bReturn); + if (bReturn) return; if (!GetIRCSock()) { // Some lagmeters do a PRIVMSG to their own nick, ignore those. @@ -398,7 +405,9 @@ void CClient::ReadLine(const CString& sData) { for (unsigned int a = 0; a < vChans.size(); a++) { CString sChannel = vChans[a]; - NETWORKMODULECALL(OnUserJoin(sChannel, sKey), m_pUser, m_pNetwork, this, continue); + bool bContinue = false; + NETWORKMODULECALL(OnUserJoin(sChannel, sKey), m_pUser, m_pNetwork, this, &bContinue); + if (bContinue) continue; CChan* pChan = m_pNetwork->FindChan(sChannel); if (pChan) { @@ -430,7 +439,9 @@ void CClient::ReadLine(const CString& sData) { for (VCString::const_iterator it = vChans.begin(); it != vChans.end(); ++it) { CString sChan = *it; - NETWORKMODULECALL(OnUserPart(sChan, sMessage), m_pUser, m_pNetwork, this, continue); + bool bContinue = false; + NETWORKMODULECALL(OnUserPart(sChan, sMessage), m_pUser, m_pNetwork, this, &bContinue); + if (bContinue) continue; CChan* pChan = m_pNetwork->FindChan(sChan); @@ -456,10 +467,12 @@ void CClient::ReadLine(const CString& sData) { CString sTopic = sLine.Token(2, true).TrimPrefix_n(); if (!sTopic.empty()) { - NETWORKMODULECALL(OnUserTopic(sChan, sTopic), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserTopic(sChan, sTopic), m_pUser, m_pNetwork, this, &bReturn); + if (bReturn) return; sLine = "TOPIC " + sChan + " :" + sTopic; } else { - NETWORKMODULECALL(OnUserTopicRequest(sChan), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserTopicRequest(sChan), m_pUser, m_pNetwork, this, &bReturn); + if (bReturn) return; } } else if (sCommand.Equals("MODE")) { CString sTarget = sLine.Token(1); @@ -838,7 +851,7 @@ void CClient::HandleCap(const CString& sLine) bVal = false; bool bAccepted = ("multi-prefix" == sCap) || ("userhost-in-names" == sCap) || ("server-time" == sCap); - GLOBALMODULECALL(IsClientCapSupported(this, sCap, bVal), bAccepted = true); + GLOBALMODULECALL(IsClientCapSupported(this, sCap, bVal), &bAccepted); if (!bAccepted) { // Some unsupported capability is requested @@ -880,7 +893,7 @@ void CClient::HandleCap(const CString& sLine) SCString ssRemoved; for (SCString::iterator i = m_ssAcceptedCaps.begin(); i != m_ssAcceptedCaps.end(); ++i) { bool bRemoving = false; - GLOBALMODULECALL(IsClientCapSupported(this, *i, false), bRemoving = true); + GLOBALMODULECALL(IsClientCapSupported(this, *i, false), &bRemoving); if (bRemoving) { GLOBALMODULECALL(OnClientCapRequest(this, *i, false), NOTHING); ssRemoved.insert(*i); diff --git a/src/ClientCommand.cpp b/src/ClientCommand.cpp index 0e027015..9dec9930 100644 --- a/src/ClientCommand.cpp +++ b/src/ClientCommand.cpp @@ -29,7 +29,9 @@ void CClient::UserCommand(CString& sLine) { return; } - NETWORKMODULECALL(OnStatusCommand(sLine), m_pUser, m_pNetwork, this, return); + bool bReturn = false; + NETWORKMODULECALL(OnStatusCommand(sLine), m_pUser, m_pNetwork, this, &bReturn); + if (bReturn) return; const CString sCommand = sLine.Token(0); diff --git a/src/IRCNetwork.cpp b/src/IRCNetwork.cpp index d601b76d..96cee2e0 100644 --- a/src/IRCNetwork.cpp +++ b/src/IRCNetwork.cpp @@ -503,7 +503,9 @@ void CIRCNetwork::ClientConnected(CClient *pClient) { uSize = m_QueryBuffer.Size(); for (uIdx = 0; uIdx < uSize; uIdx++) { CString sLine = m_QueryBuffer.GetLine(uIdx, *pClient, msParams); - NETWORKMODULECALL(OnPrivBufferPlayLine(*pClient, sLine), m_pUser, this, NULL, continue); + bool bContinue = false; + NETWORKMODULECALL(OnPrivBufferPlayLine(*pClient, sLine), m_pUser, this, NULL, &bContinue); + if (bContinue) continue; pClient->PutClient(sLine); } m_QueryBuffer.Clear(); @@ -706,7 +708,9 @@ bool CIRCNetwork::JoinChan(CChan* pChan) { pChan->Disable(); } else { pChan->IncJoinTries(); - NETWORKMODULECALL(OnTimerAutoJoin(*pChan), m_pUser, this, NULL, return false); + bool bFailed = false; + NETWORKMODULECALL(OnTimerAutoJoin(*pChan), m_pUser, this, NULL, &bFailed); + if (bFailed) return false; return true; } return false; @@ -948,13 +952,15 @@ bool CIRCNetwork::Connect() { DEBUG("Connecting user/network [" << m_pUser->GetUserName() << "/" << m_sName << "]"); - NETWORKMODULECALL(OnIRCConnecting(pIRCSock), m_pUser, this, NULL, + bool bAbort = false; + NETWORKMODULECALL(OnIRCConnecting(pIRCSock), m_pUser, this, NULL, &bAbort); + if (bAbort) { DEBUG("Some module aborted the connection attempt"); PutStatus("Some module aborted the connection attempt"); delete pIRCSock; CZNC::Get().AddNetworkToQueue(this); return false; - ); + } CString sSockName = "IRC::" + m_pUser->GetUserName() + "::" + m_sName; CZNC::Get().GetManager().Connect(pServer->GetName(), pServer->GetPort(), sSockName, 120, bSSL, GetBindHost(), pIRCSock); diff --git a/src/IRCSock.cpp b/src/IRCSock.cpp index c5a49bcb..e75bcb0c 100644 --- a/src/IRCSock.cpp +++ b/src/IRCSock.cpp @@ -128,7 +128,9 @@ void CIRCSock::ReadLine(const CString& sData) { DEBUG("(" << m_pNetwork->GetUser()->GetUserName() << "/" << m_pNetwork->GetName() << ") IRC -> ZNC [" << sLine << "]"); - IRCSOCKMODULECALL(OnRaw(sLine), return); + bool bReturn = false; + IRCSOCKMODULECALL(OnRaw(sLine), &bReturn); + if (bReturn) return; if (sLine.Equals("PING ", false, 5)) { // Generate a reply and don't forward this to any user, @@ -682,7 +684,8 @@ void CIRCSock::ReadLine(const CString& sData) { CString sTopic = sLine.Token(3, true); sTopic.LeftChomp(); - IRCSOCKMODULECALL(OnTopic(Nick, *pChan, sTopic), return); + IRCSOCKMODULECALL(OnTopic(Nick, *pChan, sTopic), &bReturn); + if (bReturn) return; pChan->SetTopicOwner(Nick.GetNick()); pChan->SetTopicDate((unsigned long) time(NULL)); @@ -793,7 +796,8 @@ void CIRCSock::ReadLine(const CString& sData) { // Don't forward any CAP stuff to the client return; } else if (sCmd.Equals("INVITE")) { - IRCSOCKMODULECALL(OnInvite(Nick, sLine.Token(3).TrimPrefix_n(":")), return); + IRCSOCKMODULECALL(OnInvite(Nick, sLine.Token(3).TrimPrefix_n(":")), &bReturn); + if (bReturn) return; } } @@ -823,21 +827,27 @@ void CIRCSock::ResumeCap() { } bool CIRCSock::OnServerCapAvailable(const CString& sCap) { - IRCSOCKMODULECALL(OnServerCapAvailable(sCap), return true); - return false; + bool bResult = false; + IRCSOCKMODULECALL(OnServerCapAvailable(sCap), &bResult); + return bResult; } bool CIRCSock::OnCTCPReply(CNick& Nick, CString& sMessage) { - IRCSOCKMODULECALL(OnCTCPReply(Nick, sMessage), return true); + bool bResult = false; + IRCSOCKMODULECALL(OnCTCPReply(Nick, sMessage), &bResult); - return false; + return bResult; } bool CIRCSock::OnPrivCTCP(CNick& Nick, CString& sMessage) { - IRCSOCKMODULECALL(OnPrivCTCP(Nick, sMessage), return true); + bool bResult = false; + IRCSOCKMODULECALL(OnPrivCTCP(Nick, sMessage), &bResult); + if (bResult) return true; if (sMessage.TrimPrefix("ACTION ")) { - IRCSOCKMODULECALL(OnPrivAction(Nick, sMessage), return true); + bResult = false; + IRCSOCKMODULECALL(OnPrivAction(Nick, sMessage), &bResult); + if (bResult) return true; if (!m_pNetwork->IsUserOnline()) { // If the user is detached, add to the buffer @@ -896,7 +906,9 @@ bool CIRCSock::OnGeneralCTCP(CNick& Nick, CString& sMessage) { } bool CIRCSock::OnPrivNotice(CNick& Nick, CString& sMessage) { - IRCSOCKMODULECALL(OnPrivNotice(Nick, sMessage), return true); + bool bResult = false; + IRCSOCKMODULECALL(OnPrivNotice(Nick, sMessage), &bResult); + if (bResult) return true; if (!m_pNetwork->IsUserOnline()) { // If the user is detached, add to the buffer @@ -907,7 +919,9 @@ bool CIRCSock::OnPrivNotice(CNick& Nick, CString& sMessage) { } bool CIRCSock::OnPrivMsg(CNick& Nick, CString& sMessage) { - IRCSOCKMODULECALL(OnPrivMsg(Nick, sMessage), return true); + bool bResult = false; + IRCSOCKMODULECALL(OnPrivMsg(Nick, sMessage), &bResult); + if (bResult) return true; if (!m_pNetwork->IsUserOnline()) { // If the user is detached, add to the buffer @@ -920,11 +934,15 @@ bool CIRCSock::OnPrivMsg(CNick& Nick, CString& sMessage) { bool CIRCSock::OnChanCTCP(CNick& Nick, const CString& sChan, CString& sMessage) { CChan* pChan = m_pNetwork->FindChan(sChan); if (pChan) { - IRCSOCKMODULECALL(OnChanCTCP(Nick, *pChan, sMessage), return true); + bool bResult = false; + IRCSOCKMODULECALL(OnChanCTCP(Nick, *pChan, sMessage), &bResult); + if (bResult) return true; // Record a /me if (sMessage.TrimPrefix("ACTION ")) { - IRCSOCKMODULECALL(OnChanAction(Nick, *pChan, sMessage), return true); + bResult = false; + IRCSOCKMODULECALL(OnChanAction(Nick, *pChan, sMessage), &bResult); + if (bResult) return true; if (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) { pChan->AddBuffer(":" + _NAMEDFMT(Nick.GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sChan) + " :\001ACTION {text}\001", sMessage); } @@ -941,7 +959,9 @@ bool CIRCSock::OnChanCTCP(CNick& Nick, const CString& sChan, CString& sMessage) bool CIRCSock::OnChanNotice(CNick& Nick, const CString& sChan, CString& sMessage) { CChan* pChan = m_pNetwork->FindChan(sChan); if (pChan) { - IRCSOCKMODULECALL(OnChanNotice(Nick, *pChan, sMessage), return true); + bool bResult = false; + IRCSOCKMODULECALL(OnChanNotice(Nick, *pChan, sMessage), &bResult); + if (bResult) return true; if (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) { pChan->AddBuffer(":" + _NAMEDFMT(Nick.GetNickMask()) + " NOTICE " + _NAMEDFMT(sChan) + " :{text}", sMessage); @@ -954,7 +974,9 @@ bool CIRCSock::OnChanNotice(CNick& Nick, const CString& sChan, CString& sMessage bool CIRCSock::OnChanMsg(CNick& Nick, const CString& sChan, CString& sMessage) { CChan* pChan = m_pNetwork->FindChan(sChan); if (pChan) { - IRCSOCKMODULECALL(OnChanMsg(Nick, *pChan, sMessage), return true); + bool bResult = false; + IRCSOCKMODULECALL(OnChanMsg(Nick, *pChan, sMessage), &bResult); + if (bResult) return true; if (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) { pChan->AddBuffer(":" + _NAMEDFMT(Nick.GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sChan) + " :{text}", sMessage); @@ -998,7 +1020,9 @@ void CIRCSock::Connected() { CString sIdent = m_pNetwork->GetIdent(); CString sRealName = m_pNetwork->GetRealName(); - IRCSOCKMODULECALL(OnIRCRegistration(sPass, sNick, sIdent, sRealName), return); + bool bReturn = false; + IRCSOCKMODULECALL(OnIRCRegistration(sPass, sNick, sIdent, sRealName), &bReturn); + if (bReturn) return; PutIRC("CAP LS"); diff --git a/src/Modules.cpp b/src/Modules.cpp index a21c936e..1112c761 100644 --- a/src/Modules.cpp +++ b/src/Modules.cpp @@ -868,7 +868,9 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CModInfo } bool bSuccess; - _GLOBALMODULECALL(OnModuleLoading(sModule, sArgs, eType, bSuccess, sRetMsg), pUser, pNetwork, NULL, return bSuccess); + bool bHandled = false; + _GLOBALMODULECALL(OnModuleLoading(sModule, sArgs, eType, bSuccess, sRetMsg), pUser, pNetwork, NULL, &bHandled); + if (bHandled) return bSuccess; CString sModPath, sDataPath; bool bVersionMismatch; @@ -956,7 +958,9 @@ bool CModules::UnloadModule(const CString& sModule, CString& sRetMsg) { } bool bSuccess; - _GLOBALMODULECALL(OnModuleUnloading(pModule, bSuccess, sRetMsg), pModule->GetUser(), pModule->GetNetwork(), NULL, return bSuccess); + bool bHandled = false; + _GLOBALMODULECALL(OnModuleUnloading(pModule, bSuccess, sRetMsg), pModule->GetUser(), pModule->GetNetwork(), NULL, &bHandled); + if (bHandled) return bSuccess; ModHandle p = pModule->GetDLL(); @@ -1009,7 +1013,9 @@ bool CModules::GetModInfo(CModInfo& ModInfo, const CString& sModule, CString& sR CString sModPath, sTmp; bool bSuccess; - GLOBALMODULECALL(OnGetModInfo(ModInfo, sModule, bSuccess, sRetMsg), return bSuccess); + bool bHandled = false; + GLOBALMODULECALL(OnGetModInfo(ModInfo, sModule, bSuccess, sRetMsg), &bHandled); + if (bHandled) return bSuccess; if (!FindModPath(sModule, sModPath, sTmp)) { sRetMsg = "Unable to find module [" + sModule + "]"; diff --git a/src/main.cpp b/src/main.cpp index ebb87fd3..80d1d458 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -35,6 +35,8 @@ static inline int getopt_long(int argc, char * const argv[], const char *optstri } #endif +bool ZNC_NO_NEED_TO_DO_ANYTHING_ON_MODULE_CALL_EXITER; + static const struct option g_LongOpts[] = { { "help", no_argument, 0, 'h' }, { "version", no_argument, 0, 'v' }, diff --git a/src/znc.cpp b/src/znc.cpp index 00a469f2..ffb5f09b 100644 --- a/src/znc.cpp +++ b/src/znc.cpp @@ -130,7 +130,9 @@ CString CZNC::GetUptime() const { } bool CZNC::OnBoot() { - ALLMODULECALL(OnBoot(), return false); + bool bFail = false; + ALLMODULECALL(OnBoot(), &bFail); + if (bFail) return false; return true; } @@ -1412,7 +1414,10 @@ void CZNC::Broadcast(const CString& sMessage, bool bAdminOnly, if (a->second != pSkipUser) { CString sMsg = sMessage; - USERMODULECALL(OnBroadcast(sMsg), a->second, NULL, continue); + bool bContinue = false; + USERMODULECALL(OnBroadcast(sMsg), a->second, NULL, &bContinue); + if (bContinue) continue; + a->second->PutStatusNotice("*** " + sMsg, NULL, pSkipClient); } } @@ -1552,11 +1557,13 @@ bool CZNC::AddUser(CUser* pUser, CString& sErrorRet) { << sErrorRet << "]"); return false; } - GLOBALMODULECALL(OnAddUser(*pUser, sErrorRet), + bool bFailed = false; + GLOBALMODULECALL(OnAddUser(*pUser, sErrorRet), &bFailed); + if (bFailed) { DEBUG("AddUser [" << pUser->GetUserName() << "] aborted by a module [" << sErrorRet << "]"); return false; - ); + } m_msUsers[pUser->GetUserName()] = pUser; return true; } @@ -1825,7 +1832,9 @@ CZNC::TrafficStatsMap CZNC::GetTrafficStats(TrafficStatsPair &Users, void CZNC::AuthUser(CSmartPtr AuthClass) { // TODO unless the auth module calls it, CUser::IsHostAllowed() is not honoured - GLOBALMODULECALL(OnLoginAttempt(AuthClass), return); + bool bReturn = false; + GLOBALMODULECALL(OnLoginAttempt(AuthClass), &bReturn); + if (bReturn) return; CUser* pUser = FindUser(AuthClass->GetUsername());