From caf295f07f1b0690c6ae888f9b9bc9a1f406a43b Mon Sep 17 00:00:00 2001 From: psychon Date: Fri, 20 Nov 2009 15:38:21 +0000 Subject: [PATCH] Rewrite znc.conf on SIGUSR1 git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1666 726aef4b-f618-498e-8847-2d620e286838 --- main.cpp | 19 +++++++++++++++---- znc.cpp | 19 ++++++++++++++++--- znc.h | 12 +++++++++--- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/main.cpp b/main.cpp index 3d8c60ba..ba699a01 100644 --- a/main.cpp +++ b/main.cpp @@ -57,9 +57,19 @@ static void die(int sig) { exit(sig); } -static void rehash(int sig) { - CUtils::PrintMessage("Caught SIGHUP"); - CZNC::Get().SetNeedRehash(true); +static void signalHandler(int sig) { + switch (sig) { + case SIGHUP: + CUtils::PrintMessage("Caught SIGHUP"); + CZNC::Get().SetConfigState(CZNC::ECONFIG_NEED_REHASH); + break; + case SIGUSR1: + CUtils::PrintMessage("Caught SIGUSR1"); + CZNC::Get().SetConfigState(CZNC::ECONFIG_NEED_WRITE); + break; + default: + CUtils::PrintMessage("WTF? Signal handler called for a signal it doesn't know?"); + } } static bool isRoot() { @@ -240,8 +250,9 @@ int main(int argc, char** argv) { sa.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sa, (struct sigaction*) NULL); - sa.sa_handler = rehash; + sa.sa_handler = signalHandler; sigaction(SIGHUP, &sa, (struct sigaction*) NULL); + sigaction(SIGUSR1, &sa, (struct sigaction*) NULL); // Once this signal is caught, the signal handler is reset // to SIG_DFL. This avoids endless loop with signals. diff --git a/znc.cpp b/znc.cpp index 2d71a331..21c0ad39 100644 --- a/znc.cpp +++ b/znc.cpp @@ -41,7 +41,7 @@ CZNC::CZNC() { m_uBytesRead = 0; m_uBytesWritten = 0; m_pConnectUserTimer = NULL; - m_bNeedRehash = false; + m_eConfigState = ECONFIG_NOTHING; m_TimeStarted = time(NULL); } @@ -228,8 +228,9 @@ void CZNC::Loop() { while (true) { CString sError; - if (GetNeedRehash()) { - SetNeedRehash(false); + switch (GetConfigState()) { + case ECONFIG_NEED_REHASH: + SetConfigState(ECONFIG_NOTHING); if (RehashConfig(sError)) { Broadcast("Rehashing succeeded", true); @@ -237,6 +238,18 @@ void CZNC::Loop() { Broadcast("Rehashing failed: " + sError, true); Broadcast("ZNC is in some possibly inconsistent state!", true); } + break; + case ECONFIG_NEED_WRITE: + SetConfigState(ECONFIG_NOTHING); + + if (WriteConfig()) { + Broadcast("Writing the config suceeded", true); + } else { + Broadcast("Writing the config file failed", true); + } + break; + case ECONFIG_NOTHING: + break; } // Check for users that need to be deleted diff --git a/znc.h b/znc.h index 5f8cc1a4..76ac7e2f 100644 --- a/znc.h +++ b/znc.h @@ -28,6 +28,12 @@ public: CZNC(); ~CZNC(); + enum ConfigState { + ECONFIG_NOTHING, + ECONFIG_NEED_REHASH, + ECONFIG_NEED_WRITE + }; + void DeleteUsers(); void Loop(); bool WriteISpoof(CUser* pUser); @@ -75,14 +81,14 @@ public: void AuthUser(CSmartPtr AuthClass); // Setters - void SetNeedRehash(bool b) { m_bNeedRehash = b; } + void SetConfigState(enum ConfigState e) { m_eConfigState = e; } void SetStatusPrefix(const CString& s) { m_sStatusPrefix = (s.empty()) ? "*" : s; } void SetISpoofFile(const CString& s) { m_sISpoofFile = s; } void SetISpoofFormat(const CString& s) { m_sISpoofFormat = (s.empty()) ? "global { reply \"%\" }" : s; } // !Setters // Getters - bool GetNeedRehash() const { return m_bNeedRehash; } + enum ConfigState GetConfigState() const { return m_eConfigState; } CSockManager& GetManager() { return m_Manager; } const CSockManager& GetManager() const { return m_Manager; } #ifdef _MODULES @@ -136,7 +142,7 @@ private: protected: time_t m_TimeStarted; - bool m_bNeedRehash; + enum ConfigState m_eConfigState; vector m_vpListeners; map m_msUsers; map m_msDelUsers;