From a2256be50c81f73213a6c7cc2cd64b502814c036 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 17 Oct 2007 12:52:05 +0000 Subject: Refactor out command-line option processing, so that it can be extended by subclasses. (merges [1849]) --- lib/server/Daemon.cpp | 223 ++++++++++++++++++++++++++++++-------------------- lib/server/Daemon.h | 5 +- 2 files changed, 136 insertions(+), 92 deletions(-) (limited to 'lib') diff --git a/lib/server/Daemon.cpp b/lib/server/Daemon.cpp index 584d8a00..d64480c4 100644 --- a/lib/server/Daemon.cpp +++ b/lib/server/Daemon.cpp @@ -50,7 +50,8 @@ Daemon::Daemon() mTerminateWanted(false), mSingleProcess(false), mRunInForeground(false), - mKeepConsoleOpenAfterFork(false) + mKeepConsoleOpenAfterFork(false), + mHaveConfigFile(false); { if(spDaemon != NULL) { @@ -84,6 +85,126 @@ Daemon::~Daemon() spDaemon = NULL; } +// -------------------------------------------------------------------------- +// +// Function +// Name: Daemon::GetOptionString() +// Purpose: Returns the valid Getopt command-line options. +// This should be overridden by subclasses to add +// their own options, which should override +// ProcessOption, handle their own, and delegate to +// ProcessOption for the standard options. +// Created: 2007/09/18 +// +// -------------------------------------------------------------------------- +std::string Daemon::GetOptionString() +{ + return "c:DFqvVt:Tk"; +} + +// -------------------------------------------------------------------------- +// +// Function +// Name: Daemon::ProcessOption(int option) +// Purpose: Processes the supplied option (equivalent to the +// return code from getopt()). Return zero if the +// option was handled successfully, or nonzero to +// abort the program with that return value. +// Created: 2007/09/18 +// +// -------------------------------------------------------------------------- +int Daemon::ProcessOption(signed int option) +{ + switch(option) + { + case 'c': + { + mConfigFileName = optarg; + mHaveConfigFile = true; + } + break; + + case 'D': + { + mSingleProcess = true; + } + break; + + case 'F': + { + mRunInForeground = true; + } + break; + + case 'q': + { + if(mLogLevel == Log::NOTHING) + { + BOX_FATAL("Too many '-q': " + "Cannot reduce logging " + "level any more"); + return 2; + } + mLogLevel--; + } + break; + + case 'v': + { + if(mLogLevel == Log::EVERYTHING) + { + BOX_FATAL("Too many '-v': " + "Cannot increase logging " + "level any more"); + return 2; + } + mLogLevel++; + } + break; + + case 'V': + { + mLogLevel = Log::EVERYTHING; + } + break; + + case 't': + { + Console::SetTag(optarg); + } + break; + + case 'T': + { + Console::SetShowTime(true); + } + break; + + case 'k': + { + mKeepConsoleOpenAfterFork = true; + } + break; + + case '?': + { + BOX_FATAL("Unknown option on command line: " + << "'" << (char)optopt << "'"); + return 2; + } + break; + + default: + { + BOX_FATAL("Unknown error in getopt: returned " + << "'" << option << "'"); + return 1; + } + } + + return 0; +} + // -------------------------------------------------------------------------- // // Function @@ -98,12 +219,11 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) { // Find filename of config file mConfigFileName = DefaultConfigFile; - bool haveConfigFile = false; #ifdef NDEBUG - int masterLevel = Log::NOTICE; // need an int to do math with + mLogLevel = Log::NOTICE; // need an int to do math with #else - int masterLevel = Log::INFO; // need an int to do math with + mLogLevel = Log::INFO; // need an int to do math with #endif signed int c; @@ -118,97 +238,18 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) optreset = 1; #endif - while((c = getopt(argc, (char * const *)argv, "c:DFqvVt:Tk")) != -1) + while((c = getopt(argc, (char * const *)argv, + GetOptionString().c_str())) != -1) { - switch(c) - { - case 'c': - { - mConfigFileName = optarg; - haveConfigFile = true; - } - break; - - case 'D': - { - mSingleProcess = true; - } - break; - - case 'F': - { - mRunInForeground = true; - } - break; - - case 'q': - { - if(masterLevel == Log::NOTHING) - { - BOX_FATAL("Too many '-q': " - "Cannot reduce logging " - "level any more"); - return 2; - } - masterLevel--; - } - break; + int returnCode = ProcessOption(c); - case 'v': - { - if(masterLevel == Log::EVERYTHING) - { - BOX_FATAL("Too many '-v': " - "Cannot increase logging " - "level any more"); - return 2; - } - masterLevel++; - } - break; - - case 'V': - { - masterLevel = Log::EVERYTHING; - } - break; - - case 't': - { - Console::SetTag(optarg); - } - break; - - case 'T': - { - Console::SetShowTime(true); - } - break; - - case 'k': - { - mKeepConsoleOpenAfterFork = true; - } - break; - - case '?': - { - BOX_FATAL("Unknown option on command line: " - << "'" << (char)optopt << "'"); - return 2; - } - break; - - default: - { - BOX_FATAL("Unknown error in getopt: returned " - << "'" << c << "'"); - return 1; - } + if (returnCode != 0) + { + return returnCode; } } - if (argc > optind && !haveConfigFile) + if (argc > optind && !mHaveConfigFile) { mConfigFileName = argv[optind]; optind++; } @@ -225,7 +266,7 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) return 2; } - Logging::SetGlobalLevel((Log::Level)masterLevel); + Logging::SetGlobalLevel((Log::Level)mLogLevel); return Main(mConfigFileName); } diff --git a/lib/server/Daemon.h b/lib/server/Daemon.h index bce6c3c1..0f6d0c73 100644 --- a/lib/server/Daemon.h +++ b/lib/server/Daemon.h @@ -67,12 +67,13 @@ public: protected: box_time_t GetLoadedConfigModifiedTime() const; bool IsSingleProcess() { return mSingleProcess; } + std::string GetOptionString(); + int ProcessOption(signed int option); private: static void SignalHandler(int sigraised); box_time_t GetConfigFileModifiedTime() const; -private: std::string mConfigFileName; Configuration *mpConfiguration; box_time_t mLoadedConfigModifiedTime; @@ -81,6 +82,8 @@ private: bool mSingleProcess; bool mRunInForeground; bool mKeepConsoleOpenAfterFork; + bool mHaveConfigFile; + int mLogLevel; // need an int to do math with static Daemon *spDaemon; }; -- cgit v1.2.3