From 24978bd0ebb2953c1876cb7ac3f06d302d951414 Mon Sep 17 00:00:00 2001 From: psychon Date: Sun, 4 Oct 2009 17:15:05 +0000 Subject: [PATCH] Write the config file on restart and shutdown ZNC now writes its config file just before it shuts down. If this fails it aborts the shutdown. One can then either fix whatever went wrong or force a shutdown. This also cleans the code up a little by unifying shutdown and restart. Patch by flakes, thanks! git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1641 726aef4b-f618-498e-8847-2d620e286838 --- ClientCommand.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/ClientCommand.cpp b/ClientCommand.cpp index 9a422365..88d701f5 100644 --- a/ClientCommand.cpp +++ b/ClientCommand.cpp @@ -204,24 +204,27 @@ void CClient::UserCommand(CString& sLine) { PutStatus("Cleared MOTD"); } else if (m_pUser->IsAdmin() && sCommand.Equals("BROADCAST")) { CZNC::Get().Broadcast(sLine.Token(1, true)); - } else if (m_pUser->IsAdmin() && sCommand.Equals("SHUTDOWN")) { + } else if (m_pUser->IsAdmin() && (sCommand.Equals("SHUTDOWN") || sCommand.Equals("RESTART"))) { + bool bRestart = sCommand.Equals("RESTART"); CString sMessage = sLine.Token(1, true); + bool bForce = false; - if (sMessage.empty()) { - sMessage = "ZNC is being shutdown NOW!!"; + if (sMessage.Token(0).Equals("FORCE")) { + bForce = true; + sMessage = sMessage.Token(1, true); } - CZNC::Get().Broadcast(sMessage); - throw CException(CException::EX_Shutdown); - } else if (m_pUser->IsAdmin() && sCommand.Equals("RESTART")) { - CString sMessage = sLine.Token(1, true); - if (sMessage.empty()) { - sMessage = "ZNC is being restarted NOW!!"; + sMessage = (bRestart ? "ZNC is being restarted NOW!" : "ZNC is being shut down NOW!"); } - CZNC::Get().Broadcast(sMessage); - throw CException(CException::EX_Restart); + if(!CZNC::Get().WriteConfig() && !bForce) { + PutStatus("ERROR: Writing config file to disk failed! Aborting. Use " + + sCommand.AsUpper() + " FORCE to ignore."); + } else { + CZNC::Get().Broadcast(sMessage); + throw CException(bRestart ? CException::EX_Restart : CException::EX_Shutdown); + } } else if (sCommand.Equals("JUMP") || sCommand.Equals("CONNECT")) { if (!m_pUser->HasServers()) { PutStatus("You don't have any servers added.");