Revision: 1666
http://znc.svn.sourceforge.net/znc/?rev=1666&view=rev
Author: psychon
Date: 2009-11-20 15:38:21 +0000 (Fri, 20 Nov 2009)
Log Message:
-----------
Rewrite znc.conf on SIGUSR1
Modified Paths:
--------------
trunk/main.cpp
trunk/znc.cpp
trunk/znc.h
Modified: trunk/main.cpp
===================================================================
--- trunk/main.cpp 2009-11-19 20:59:40 UTC (rev 1665)
+++ trunk/main.cpp 2009-11-20 15:38:21 UTC (rev 1666)
@@ -57,9 +57,19 @@
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 @@
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.
Modified: trunk/znc.cpp
===================================================================
--- trunk/znc.cpp 2009-11-19 20:59:40 UTC (rev 1665)
+++ trunk/znc.cpp 2009-11-20 15:38:21 UTC (rev 1666)
@@ -41,7 +41,7 @@
m_uBytesRead = 0;
m_uBytesWritten = 0;
m_pConnectUserTimer = NULL;
- m_bNeedRehash = false;
+ m_eConfigState = ECONFIG_NOTHING;
m_TimeStarted = time(NULL);
}
@@ -228,8 +228,9 @@
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 @@
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
Modified: trunk/znc.h
===================================================================
--- trunk/znc.h 2009-11-19 20:59:40 UTC (rev 1665)
+++ trunk/znc.h 2009-11-20 15:38:21 UTC (rev 1666)
@@ -28,6 +28,12 @@
CZNC();
~CZNC();
+ enum ConfigState {
+ ECONFIG_NOTHING,
+ ECONFIG_NEED_REHASH,
+ ECONFIG_NEED_WRITE
+ };
+
void DeleteUsers();
void Loop();
bool WriteISpoof(CUser* pUser);
@@ -75,14 +81,14 @@
void AuthUser(CSmartPtr<CAuthBase> 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 @@
protected:
time_t m_TimeStarted;
- bool m_bNeedRehash;
+ enum ConfigState m_eConfigState;
vector<CListener*> m_vpListeners;
map<CString,CUser*> m_msUsers;
map<CString,CUser*> m_msDelUsers;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|