I started off writing patches to make qpidd's --help output regular
enough so that we can use help2man <http://www.gnu.org/software/help2man/>
to automatically generate a man page for it.
With the following patch, qpidd --help prints this:
--------------------
Usage: qpidd [OPTION]...
Start the Qpid broker daemon.
Options:
-t, --trace
Print incoming & outgoing frames to the console (default=false)
-p, --port <value>
Set the port to listen on (default=5672)
--worker-threads <value>
Set the number of worker threads to use (default=5).
--max-connections <value>
Set the maximum number of connections the broker can accept
(default=500).
--connection-backlog <value>
Set the connection backlog for the servers socket (default=10)
-s, --store <value>
Set the message store module to use (default='' which implies no
store)
--help
Print usage information
--version
Print version information
Report bugs to <[email protected]>.
--------------------
I also added a new option, --version.
It prints using this familiar format:
qpidd (qpid) version 0.1
That's "program_name" (package name) and the package
version number recorded early in configure.ac:
AC_INIT([qpid], [0.1], [EMAIL PROTECTED])
This is similar to the --version output from programs like
GNU ls, cp, rm, mv, etc.
-------------------------------------------------------------------------
Here's the patch:
[I see I also removed trailing spaces in Configuration.cpp.
If that's a problem, let me know and I'll resubmit without
those hunks. ]
2006-12-05 Jim Meyering <[EMAIL PROTECTED]>
Improve --help output. Add --version option.
* lib/broker/Configuration.cpp: Include <config.h>.
(Configuration::Configuration): Use the active voice.
Handle --version.
(Configuration::usage): Add Usage:... and bug-reporting address.
Output short+long options like "-o, --option ...", so that help2man
will format them properly.
* lib/broker/Configuration.h:
(class Configuration) [version, programName]: New members.
(parse): Update prototype.
(isVersion, setValue): New prototypes.
* src/qpidd.cpp: Include <config.h>.
(programName): New file-scoped global.
(handle_signal, main): Emit diagnostics to stderr.
(main): Pass program name to config.parse.
(main): Handle new --version option.
Index: lib/broker/Configuration.cpp
===================================================================
--- lib/broker/Configuration.cpp (revision 482785)
+++ lib/broker/Configuration.cpp (working copy)
@@ -7,9 +7,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -20,18 +20,20 @@
*/
#include <Configuration.h>
#include <string.h>
+#include <config.h>
using namespace qpid::broker;
using namespace std;
-Configuration::Configuration() :
+Configuration::Configuration() :
trace('t', "trace", "Print incoming & outgoing frames to the console
(default=false)", false),
- port('p', "port", "Sets the port to listen on (default=5672)", 5672),
- workerThreads("worker-threads", "Sets the number of worker threads to use
(default=5).", 5),
- maxConnections("max-connections", "Sets the maximum number of connections
the broker can accept (default=500).", 500),
- connectionBacklog("connection-backlog", "Sets the connection backlog for
the servers socket (default=10)", 10),
- store('s', "store", "Sets the message store module to use (default=''
which implies no store)", ""),
- help("help", "Prints usage information", false)
+ port('p', "port", "Set the port to listen on (default=5672)", 5672),
+ workerThreads("worker-threads", "Set the number of worker threads to use
(default=5).", 5),
+ maxConnections("max-connections", "Set the maximum number of connections
the broker can accept (default=500).", 500),
+ connectionBacklog("connection-backlog", "Set the connection backlog for
the servers socket (default=10)", 10),
+ store('s', "store", "Set the message store module to use (default='' which
implies no store)", ""),
+ help("help", "Print usage information", false),
+ version("version", "Print version information", false)
{
options.push_back(&trace);
options.push_back(&port);
@@ -40,11 +42,13 @@
options.push_back(&connectionBacklog);
options.push_back(&store);
options.push_back(&help);
+ options.push_back(&version);
}
Configuration::~Configuration(){}
-void Configuration::parse(int argc, char** argv){
+void Configuration::parse(char const *progName, int argc, char** argv){
+ programName = progName;
int position = 1;
while(position < argc){
bool matched(false);
@@ -59,15 +63,25 @@
}
void Configuration::usage(){
+ std::cout << "Usage: " << programName << " [OPTION]..." << std::endl
+ << "Start the Qpid broker daemon." << std::endl << std::endl
+ << "Options:" << std::endl;
for(op_iterator i = options.begin(); i < options.end(); i++){
(*i)->print(std::cout);
}
+
+ std::cout << std::endl << "Report bugs to <" << PACKAGE_BUGREPORT << ">."
+ << std::endl;
}
bool Configuration::isHelp() const {
return help.getValue();
}
+bool Configuration::isVersion() const {
+ return version.getValue();
+}
+
bool Configuration::isTrace() const {
return trace.getValue();
}
@@ -92,10 +106,10 @@
return store.getValue();
}
-Configuration::Option::Option(const char _flag, const string& _name, const
string& _desc) :
+Configuration::Option::Option(const char _flag, const string& _name, const
string& _desc) :
flag(string("-") + _flag), name("--" +_name), desc(_desc) {}
-Configuration::Option::Option(const string& _name, const string& _desc) :
+Configuration::Option::Option(const string& _name, const string& _desc) :
flag(""), name("--" + _name), desc(_desc) {}
Configuration::Option::~Option(){}
@@ -121,12 +135,14 @@
}
void Configuration::Option::print(ostream& out) const {
- out << " ";
+ out << " ";
if(flag.length() > 0){
- out << flag << " or ";
+ out << flag << ", ";
+ } else {
+ out << " ";
}
out << name;
- if(needsValue()) out << "<value>";
+ if(needsValue()) out << " <value>";
out << std::endl;
out << " " << desc << std::endl;
}
@@ -134,10 +150,10 @@
// String Option:
-Configuration::StringOption::StringOption(const char _flag, const string&
_name, const string& _desc, const string _value) :
+Configuration::StringOption::StringOption(const char _flag, const string&
_name, const string& _desc, const string _value) :
Option(_flag,_name,_desc), defaultValue(_value), value(_value) {}
-Configuration::StringOption::StringOption(const string& _name, const string&
_desc, const string _value) :
+Configuration::StringOption::StringOption(const string& _name, const string&
_desc, const string _value) :
Option(_name,_desc), defaultValue(_value), value(_value) {}
Configuration::StringOption::~StringOption(){}
@@ -156,10 +172,10 @@
// Int Option:
-Configuration::IntOption::IntOption(const char _flag, const string& _name,
const string& _desc, const int _value) :
+Configuration::IntOption::IntOption(const char _flag, const string& _name,
const string& _desc, const int _value) :
Option(_flag,_name,_desc), defaultValue(_value), value(_value) {}
-Configuration::IntOption::IntOption(const string& _name, const string& _desc,
const int _value) :
+Configuration::IntOption::IntOption(const string& _name, const string& _desc,
const int _value) :
Option(_name,_desc), defaultValue(_value), value(_value) {}
Configuration::IntOption::~IntOption(){}
@@ -178,10 +194,10 @@
// Bool Option:
-Configuration::BoolOption::BoolOption(const char _flag, const string& _name,
const string& _desc, const bool _value) :
+Configuration::BoolOption::BoolOption(const char _flag, const string& _name,
const string& _desc, const bool _value) :
Option(_flag,_name,_desc), defaultValue(_value), value(_value) {}
-Configuration::BoolOption::BoolOption(const string& _name, const string&
_desc, const bool _value) :
+Configuration::BoolOption::BoolOption(const string& _name, const string&
_desc, const bool _value) :
Option(_name,_desc), defaultValue(_value), value(_value) {}
Configuration::BoolOption::~BoolOption(){}
Index: lib/broker/Configuration.h
===================================================================
--- lib/broker/Configuration.h (revision 482785)
+++ lib/broker/Configuration.h (working copy)
@@ -97,6 +97,8 @@
IntOption connectionBacklog;
StringOption store;
BoolOption help;
+ BoolOption version;
+ char const *programName;
typedef std::vector<Option*>::iterator op_iterator;
std::vector<Option*> options;
@@ -111,9 +113,10 @@
Configuration();
~Configuration();
- void parse(int argc, char** argv);
+ void parse(char const*, int argc, char** argv);
bool isHelp() const;
+ bool isVersion() const;
bool isTrace() const;
int getPort() const;
int getWorkerThreads() const;
@@ -122,6 +125,7 @@
const std::string& getStore() const;
void setHelp(bool b) { help.setValue(b); }
+ void setVersion(bool b) { version.setValue(b); }
void setTrace(bool b) { trace.setValue(b); }
void setPort(int i) { port.setValue(i); }
void setWorkerThreads(int i) { workerThreads.setValue(i); }
Index: src/qpidd.cpp
===================================================================
--- src/qpidd.cpp (revision 482785)
+++ src/qpidd.cpp (working copy)
@@ -7,9 +7,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -23,14 +23,17 @@
#include <signal.h>
#include <iostream>
#include <memory>
+#include <config.h>
+static char const* programName = "qpidd";
+
using namespace qpid::broker;
using namespace qpid::sys;
Broker::shared_ptr broker;
void handle_signal(int /*signal*/){
- std::cout << "Shutting down..." << std::endl;
+ std::cerr << "Shutting down..." << std::endl;
broker->shutdown();
}
@@ -38,9 +41,12 @@
{
Configuration config;
try {
- config.parse(argc, argv);
+ config.parse(programName, argc, argv);
if(config.isHelp()){
config.usage();
+ }else if(config.isVersion()){
+ std::cout << programName << " (" << PACKAGE_NAME << ") version "
+ << PACKAGE_VERSION << std::endl;
}else{
broker = Broker::create(config);
signal(SIGINT, handle_signal);
@@ -48,7 +54,7 @@
}
return 0;
} catch(const std::exception& e) {
- std::cout << e.what() << std::endl;
+ std::cerr << e.what() << std::endl;
}
return 1;
}