| | 91 | // Name: Daemon::GetOptionString() |
|---|
| | 92 | // Purpose: Returns the valid Getopt command-line options. |
|---|
| | 93 | // This should be overridden by subclasses to add |
|---|
| | 94 | // their own options, which should override |
|---|
| | 95 | // ProcessOption, handle their own, and delegate to |
|---|
| | 96 | // ProcessOption for the standard options. |
|---|
| | 97 | // Created: 2007/09/18 |
|---|
| | 98 | // |
|---|
| | 99 | // -------------------------------------------------------------------------- |
|---|
| | 100 | std::string Daemon::GetOptionString() |
|---|
| | 101 | { |
|---|
| | 102 | return "c:DFqvVt:Tk"; |
|---|
| | 103 | } |
|---|
| | 104 | |
|---|
| | 105 | // -------------------------------------------------------------------------- |
|---|
| | 106 | // |
|---|
| | 107 | // Function |
|---|
| | 108 | // Name: Daemon::ProcessOption(int option) |
|---|
| | 109 | // Purpose: Processes the supplied option (equivalent to the |
|---|
| | 110 | // return code from getopt()). Return zero if the |
|---|
| | 111 | // option was handled successfully, or nonzero to |
|---|
| | 112 | // abort the program with that return value. |
|---|
| | 113 | // Created: 2007/09/18 |
|---|
| | 114 | // |
|---|
| | 115 | // -------------------------------------------------------------------------- |
|---|
| | 116 | int Daemon::ProcessOption(signed int option) |
|---|
| | 117 | { |
|---|
| | 118 | switch(option) |
|---|
| | 119 | { |
|---|
| | 120 | case 'c': |
|---|
| | 121 | { |
|---|
| | 122 | mConfigFileName = optarg; |
|---|
| | 123 | mHaveConfigFile = true; |
|---|
| | 124 | } |
|---|
| | 125 | break; |
|---|
| | 126 | |
|---|
| | 127 | case 'D': |
|---|
| | 128 | { |
|---|
| | 129 | mSingleProcess = true; |
|---|
| | 130 | } |
|---|
| | 131 | break; |
|---|
| | 132 | |
|---|
| | 133 | case 'F': |
|---|
| | 134 | { |
|---|
| | 135 | mRunInForeground = true; |
|---|
| | 136 | } |
|---|
| | 137 | break; |
|---|
| | 138 | |
|---|
| | 139 | case 'q': |
|---|
| | 140 | { |
|---|
| | 141 | if(mLogLevel == Log::NOTHING) |
|---|
| | 142 | { |
|---|
| | 143 | BOX_FATAL("Too many '-q': " |
|---|
| | 144 | "Cannot reduce logging " |
|---|
| | 145 | "level any more"); |
|---|
| | 146 | return 2; |
|---|
| | 147 | } |
|---|
| | 148 | mLogLevel--; |
|---|
| | 149 | } |
|---|
| | 150 | break; |
|---|
| | 151 | |
|---|
| | 152 | case 'v': |
|---|
| | 153 | { |
|---|
| | 154 | if(mLogLevel == Log::EVERYTHING) |
|---|
| | 155 | { |
|---|
| | 156 | BOX_FATAL("Too many '-v': " |
|---|
| | 157 | "Cannot increase logging " |
|---|
| | 158 | "level any more"); |
|---|
| | 159 | return 2; |
|---|
| | 160 | } |
|---|
| | 161 | mLogLevel++; |
|---|
| | 162 | } |
|---|
| | 163 | break; |
|---|
| | 164 | |
|---|
| | 165 | case 'V': |
|---|
| | 166 | { |
|---|
| | 167 | mLogLevel = Log::EVERYTHING; |
|---|
| | 168 | } |
|---|
| | 169 | break; |
|---|
| | 170 | |
|---|
| | 171 | case 't': |
|---|
| | 172 | { |
|---|
| | 173 | Console::SetTag(optarg); |
|---|
| | 174 | } |
|---|
| | 175 | break; |
|---|
| | 176 | |
|---|
| | 177 | case 'T': |
|---|
| | 178 | { |
|---|
| | 179 | Console::SetShowTime(true); |
|---|
| | 180 | } |
|---|
| | 181 | break; |
|---|
| | 182 | |
|---|
| | 183 | case 'k': |
|---|
| | 184 | { |
|---|
| | 185 | mKeepConsoleOpenAfterFork = true; |
|---|
| | 186 | } |
|---|
| | 187 | break; |
|---|
| | 188 | |
|---|
| | 189 | case '?': |
|---|
| | 190 | { |
|---|
| | 191 | BOX_FATAL("Unknown option on command line: " |
|---|
| | 192 | << "'" << (char)optopt << "'"); |
|---|
| | 193 | return 2; |
|---|
| | 194 | } |
|---|
| | 195 | break; |
|---|
| | 196 | |
|---|
| | 197 | default: |
|---|
| | 198 | { |
|---|
| | 199 | BOX_FATAL("Unknown error in getopt: returned " |
|---|
| | 200 | << "'" << option << "'"); |
|---|
| | 201 | return 1; |
|---|
| | 202 | } |
|---|
| | 203 | } |
|---|
| | 204 | |
|---|
| | 205 | return 0; |
|---|
| | 206 | } |
|---|
| | 207 | |
|---|
| | 208 | // -------------------------------------------------------------------------- |
|---|
| | 209 | // |
|---|
| | 210 | // Function |
|---|
| 121 | | while((c = getopt(argc, (char * const *)argv, "c:DFqvVt:Tk")) != -1) |
|---|
| 122 | | { |
|---|
| 123 | | switch(c) |
|---|
| 124 | | { |
|---|
| 125 | | case 'c': |
|---|
| 126 | | { |
|---|
| 127 | | mConfigFileName = optarg; |
|---|
| 128 | | haveConfigFile = true; |
|---|
| 129 | | } |
|---|
| 130 | | break; |
|---|
| 131 | | |
|---|
| 132 | | case 'D': |
|---|
| 133 | | { |
|---|
| 134 | | mSingleProcess = true; |
|---|
| 135 | | } |
|---|
| 136 | | break; |
|---|
| 137 | | |
|---|
| 138 | | case 'F': |
|---|
| 139 | | { |
|---|
| 140 | | mRunInForeground = true; |
|---|
| 141 | | } |
|---|
| 142 | | break; |
|---|
| 143 | | |
|---|
| 144 | | case 'q': |
|---|
| 145 | | { |
|---|
| 146 | | if(masterLevel == Log::NOTHING) |
|---|
| 147 | | { |
|---|
| 148 | | BOX_FATAL("Too many '-q': " |
|---|
| 149 | | "Cannot reduce logging " |
|---|
| 150 | | "level any more"); |
|---|
| 151 | | return 2; |
|---|
| 152 | | } |
|---|
| 153 | | masterLevel--; |
|---|
| 154 | | } |
|---|
| 155 | | break; |
|---|
| 156 | | |
|---|
| 157 | | case 'v': |
|---|
| 158 | | { |
|---|
| 159 | | if(masterLevel == Log::EVERYTHING) |
|---|
| 160 | | { |
|---|
| 161 | | BOX_FATAL("Too many '-v': " |
|---|
| 162 | | "Cannot increase logging " |
|---|
| 163 | | "level any more"); |
|---|
| 164 | | return 2; |
|---|
| 165 | | } |
|---|
| 166 | | masterLevel++; |
|---|
| 167 | | } |
|---|
| 168 | | break; |
|---|
| 169 | | |
|---|
| 170 | | case 'V': |
|---|
| 171 | | { |
|---|
| 172 | | masterLevel = Log::EVERYTHING; |
|---|
| 173 | | } |
|---|
| 174 | | break; |
|---|
| 175 | | |
|---|
| 176 | | case 't': |
|---|
| 177 | | { |
|---|
| 178 | | Console::SetTag(optarg); |
|---|
| 179 | | } |
|---|
| 180 | | break; |
|---|
| 181 | | |
|---|
| 182 | | case 'T': |
|---|
| 183 | | { |
|---|
| 184 | | Console::SetShowTime(true); |
|---|
| 185 | | } |
|---|
| 186 | | break; |
|---|
| 187 | | |
|---|
| 188 | | case 'k': |
|---|
| 189 | | { |
|---|
| 190 | | mKeepConsoleOpenAfterFork = true; |
|---|
| 191 | | } |
|---|
| 192 | | break; |
|---|
| 193 | | |
|---|
| 194 | | case '?': |
|---|
| 195 | | { |
|---|
| 196 | | BOX_FATAL("Unknown option on command line: " |
|---|
| 197 | | << "'" << (char)optopt << "'"); |
|---|
| 198 | | return 2; |
|---|
| 199 | | } |
|---|
| 200 | | break; |
|---|
| 201 | | |
|---|
| 202 | | default: |
|---|
| 203 | | { |
|---|
| 204 | | BOX_FATAL("Unknown error in getopt: returned " |
|---|
| 205 | | << "'" << c << "'"); |
|---|
| 206 | | return 1; |
|---|
| 207 | | } |
|---|
| 208 | | } |
|---|
| 209 | | } |
|---|
| 210 | | |
|---|
| 211 | | if (argc > optind && !haveConfigFile) |
|---|
| | 241 | while((c = getopt(argc, (char * const *)argv, |
|---|
| | 242 | GetOptionString().c_str())) != -1) |
|---|
| | 243 | { |
|---|
| | 244 | int returnCode = ProcessOption(c); |
|---|
| | 245 | |
|---|
| | 246 | if (returnCode != 0) |
|---|
| | 247 | { |
|---|
| | 248 | return returnCode; |
|---|
| | 249 | } |
|---|
| | 250 | } |
|---|
| | 251 | |
|---|
| | 252 | if (argc > optind && !mHaveConfigFile) |
|---|