This patch removes the need to add --help option to every program.
It is added (and handled) by parse_opts().
Run tested. Please review.
--
vda
diff -x '*.po' -d -urpN abrt.0/lib/utils/parse_options.c
abrt.1/lib/utils/parse_options.c
--- abrt.0/lib/utils/parse_options.c 2010-10-05 17:23:41.000000000 +0200
+++ abrt.1/lib/utils/parse_options.c 2010-10-08 13:28:34.655230855 +0200
@@ -67,13 +67,18 @@ void parse_usage_and_die(const char * co
void parse_opts(int argc, char **argv, const struct options *opt,
const char * const usage[])
{
+ int help = 0;
int size = parse_opt_size(opt);
struct strbuf *shortopts = strbuf_new();
- struct option *longopts = xcalloc(sizeof(struct options), size);
+ struct option *longopts = xzalloc(sizeof(longopts[0]) * (size+1));
+ longopts[0].name = "help";
+ /*longopts[0].has_arg = 0; - xzalloc did it */
+ longopts[0].flag = &help;
+ longopts[0].val = 1;
int ii;
- for (ii = 0; ii < size - 1; ++ii)
+ for (ii = 1; ii < size; ++ii)
{
longopts[ii].name = opt[ii].long_name;
@@ -97,21 +102,21 @@ void parse_opts(int argc, char **argv, c
longopts[ii].flag = 0;
longopts[ii].val = opt[ii].short_name;
}
-
- longopts[ii].name = 0;
+ /* xzalloc did it already:
+ longopts[ii].name = NULL;
longopts[ii].has_arg = 0;
- longopts[ii].flag = 0;
+ longopts[ii].flag = NULL;
longopts[ii].val = 0;
+ */
- int option_index = 0;
while (1)
{
- int c = getopt_long(argc, argv, shortopts->buf, longopts, &option_index);
+ int c = getopt_long(argc, argv, shortopts->buf, longopts, /*longindex:*/
NULL);
if (c == -1)
break;
- if (c == '?')
+ if (c == '?' || (c == 0 && help))
{
free(longopts);
strbuf_free(shortopts);
diff -x '*.po' -d -urpN abrt.0/lib/utils/parse_options.h
abrt.1/lib/utils/parse_options.h
--- abrt.0/lib/utils/parse_options.h 2010-10-05 17:23:41.000000000 +0200
+++ abrt.1/lib/utils/parse_options.h 2010-10-08 13:30:26.604480641 +0200
@@ -38,7 +38,6 @@ struct options {
#define OPT_STRING(s, l, v, a, h) { OPTION_STRING, (s), (l), (v), (a), (h) }
#define OPT__VERBOSE(v) OPT_BOOL('v', "verbose", (v), "be
verbose")
-#define OPT__HELP(v) OPT_BOOL('h', "help", (v), "show this
help message")
void parse_opts(int argc, char **argv, const struct options *opt,
const char * const usage[]);
diff -x '*.po' -d -urpN abrt.0/lib/utils/xfuncs.c abrt.1/lib/utils/xfuncs.c
--- abrt.0/lib/utils/xfuncs.c 2010-10-05 17:23:41.000000000 +0200
+++ abrt.1/lib/utils/xfuncs.c 2010-10-08 13:31:24.878480382 +0200
@@ -39,6 +39,7 @@ int close_on_exec_on(int fd)
return fcntl(fd, F_SETFD, FD_CLOEXEC);
}
+#if 0 /* unused */
void *xcalloc(size_t nmemb, size_t size)
{
void *ptr = calloc(nmemb, size);
@@ -46,6 +47,7 @@ void *xcalloc(size_t nmemb, size_t size)
die_out_of_memory();
return ptr;
}
+#endif
// Die if we can't allocate size bytes of memory.
void* xmalloc(size_t size)
diff -x '*.po' -d -urpN abrt.0/src/daemon/abrt-action-generate-backtrace.c
abrt.1/src/daemon/abrt-action-generate-backtrace.c
--- abrt.0/src/daemon/abrt-action-generate-backtrace.c 2010-10-08 13:06:56.000000000
+0200
+++ abrt.1/src/daemon/abrt-action-generate-backtrace.c 2010-10-08 13:30:50.959230457
+0200
@@ -23,11 +23,6 @@
#define DEBUGINFO_CACHE_DIR LOCALSTATEDIR"/cache/abrt-di"
-static const char * const abrt_action_generage_backtrace_usage[] = {
- "abrt-action-generate-backtrace [options] -d DIR",
- NULL
-};
-
static const char *dump_dir_name = ".";
static char *debuginfo_dirs;
static int exec_timeout_sec = 60;
@@ -246,10 +241,14 @@ static char *get_backtrace(struct dump_d
}
static char *d_opt, *i_opt;
-static int s_opt, help_opt;
+static int s_opt;
+
+static const char * const abrt_action_generage_backtrace_usage[] = {
+ "abrt-action-generate-backtrace [options] -d DIR",
+ NULL
+};
static struct options abrt_action_generate_backtrace_options[] = {
- OPT__HELP(&help_opt),
OPT__VERBOSE(&g_verbose),
OPT_GROUP(""),
OPT_STRING( 'd' , 0, &d_opt, "dir", "Crash dump
directory"),
@@ -268,7 +267,7 @@ int main(int argc, char **argv)
parse_opts(argc, argv, abrt_action_generate_backtrace_options,
abrt_action_generage_backtrace_usage);
- if (help_opt || !d_opt)
+ if (!d_opt)
parse_usage_and_die(abrt_action_generage_backtrace_usage,
abrt_action_generate_backtrace_options);
diff -x '*.po' -d -urpN abrt.0/src/daemon/abrt-action-save-package-data.cpp
abrt.1/src/daemon/abrt-action-save-package-data.cpp
--- abrt.0/src/daemon/abrt-action-save-package-data.cpp 2010-10-08 13:06:56.000000000
+0200
+++ abrt.1/src/daemon/abrt-action-save-package-data.cpp 2010-10-08 13:30:34.221480398
+0200
@@ -23,11 +23,6 @@
#include "rpm.h"
#include "parse_options.h"
-static const char * const abrt_action_save_package_data_usage[] = {
- "abrt-action-save-package-data [options] -d DIR",
- NULL
-};
-
/**
* Returns the first full path argument in the command line or NULL.
* Skips options are in form "-XXX".
@@ -273,10 +268,14 @@ static int SavePackageDescriptionToDebug
}
static char *d_opt;
-static int s_opt, help_opt;
+static int s_opt;
+
+static const char * const abrt_action_save_package_data_usage[] = {
+ "abrt-action-save-package-data [options] -d DIR",
+ NULL
+};
static struct options abrt_action_save_package_data_options[] = {
- OPT__HELP(&help_opt),
OPT__VERBOSE(&g_verbose),
OPT_GROUP(""),
OPT_STRING( 'd' , 0, &d_opt, "dir", "Crash dump
directory"),
@@ -295,7 +294,7 @@ int main(int argc, char **argv)
parse_opts(argc, argv, abrt_action_save_package_data_options,
abrt_action_save_package_data_usage);
- if (help_opt || !d_opt)
+ if (!d_opt)
parse_usage_and_die(abrt_action_save_package_data_usage,
abrt_action_save_package_data_options);
diff -x '*.po' -d -urpN abrt.0/src/daemon/abrt-server.c
abrt.1/src/daemon/abrt-server.c
--- abrt.0/src/daemon/abrt-server.c 2010-10-08 13:06:56.000000000 +0200
+++ abrt.1/src/daemon/abrt-server.c 2010-10-08 13:30:20.911480328 +0200
@@ -76,11 +76,6 @@ Finalizing dump creation:
\0
*/
-static const char * const abrt_server_usage[] = {
- "abrt-server [options]",
- NULL
-};
-
/* Buffer for incomplete incoming messages. */
static char *messagebuf_data = NULL;
static unsigned messagebuf_len = 0;
@@ -282,10 +277,14 @@ static void process_message(const char *
static void dummy_handler(int sig_unused) {}
-static int s_opt, help_opt;
+static int s_opt;
+
+static const char * const abrt_server_usage[] = {
+ "abrt-server [options]",
+ NULL
+};
static struct options abrt_server_options[] = {
- OPT__HELP(&help_opt),
OPT__VERBOSE(&g_verbose),
OPT_GROUP(""),
OPT_INTEGER( 'u' , 0, &client_uid, "Use UID as client uid"),
@@ -299,14 +298,9 @@ int main(int argc, char **argv)
if (env_verbose)
g_verbose = atoi(env_verbose);
-
parse_opts(argc, argv, abrt_server_options,
abrt_server_usage);
- if (help_opt)
- parse_usage_and_die(abrt_server_usage,
- abrt_server_options);
-
putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
msg_prefix = xasprintf("abrt-server[%u]", getpid());
if (s_opt)
diff -x '*.po' -d -urpN abrt.0/src/daemon/Daemon.cpp abrt.1/src/daemon/Daemon.cpp
--- abrt.0/src/daemon/Daemon.cpp 2010-10-08 13:06:56.000000000 +0200
+++ abrt.1/src/daemon/Daemon.cpp 2010-10-08 13:30:08.044480622 +0200
@@ -85,11 +85,6 @@ using namespace std;
* Both are sent as unicast to last client set by set_client_name(name).
* If set_client_name(NULL) was done, they are not sent.
*/
-static const char * const abrtd_usage[] = {
- _("abrtd [options]"),
- NULL
-};
-
CCommLayerServer* g_pCommLayer;
static bool daemonize = true;
@@ -865,11 +860,15 @@ static void sanitize_dump_dir_rights()
ensure_writable_dir(VAR_RUN"/abrt", 0755, "root");
}
-static int daemonize_opt, syslog_opt, help_opt;
+static int daemonize_opt, syslog_opt;
static char *timeout_opt;
+static const char * const abrtd_usage[] = {
+ _("abrtd [options]"),
+ NULL
+};
+
static struct options abrtd_options[] = {
- OPT__HELP(&help_opt),
OPT__VERBOSE(&g_verbose),
OPT_GROUP(""),
OPT_BOOL( 'd' , 0, &daemonize_opt, _("Do not daemonize")),
@@ -898,9 +897,6 @@ int main(int argc, char** argv)
parse_opts(argc, argv, abrtd_options, abrtd_usage);
- if (help_opt)
- parse_usage_and_die(abrtd_usage, abrtd_options);
-
if (daemonize_opt)
daemonize = false;