From c7a7fc0a1771394534cafaa7c30aa215631efc82 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 4 Jun 2015 12:48:18 +0930 Subject: [PATCH] opt: add opt_usage_exit_fail. I've been using opt_usage_and_exit() but that exits status 0. Signed-off-by: Rusty Russell --- ccan/opt/opt.h | 16 ++++++++++++++++ ccan/opt/usage.c | 15 +++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/ccan/opt/opt.h b/ccan/opt/opt.h index 727dacd0..690907e5 100644 --- a/ccan/opt/opt.h +++ b/ccan/opt/opt.h @@ -372,6 +372,22 @@ char *opt_invalid_argument(const char *arg); */ char *opt_usage(const char *argv0, const char *extra); +/** + * opt_usage_exit_fail - complain about bad usage to stderr, exit with status 1. + * @msg...: printf-style message to output. + * + * This prints argv[0] (if opt_parse has been called), a colon, then + * the message to stderr (just like errx()). Then it prints out the + * usage message, taken from any registered option which uses + * opt_usage_and_exit() as described in opt_usage(argv0, NULL) above. + * Then it exits with status 1. + * + * Example: + * if (argc != 5) + * opt_usage_exit_fail("Need 5 arguments, only got %u", argc); + */ +void opt_usage_exit_fail(const char *msg, ...) NORETURN; + /** * opt_hidden - string for undocumented options. * diff --git a/ccan/opt/usage.c b/ccan/opt/usage.c index b71fb334..26150ea8 100644 --- a/ccan/opt/usage.c +++ b/ccan/opt/usage.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "private.h" /* We only use this for pointer comparisons. */ @@ -227,3 +228,17 @@ char *opt_usage(const char *argv0, const char *extra) ret[len] = '\0'; return ret; } + +void opt_usage_exit_fail(const char *msg, ...) +{ + va_list ap; + + if (opt_argv0) + fprintf(stderr, "%s: ", opt_argv0); + va_start(ap, msg); + vfprintf(stderr, msg, ap); + va_end(ap); + fprintf(stderr, "\n%s", + opt_usage(opt_argv0 ? opt_argv0 : "", NULL)); + exit(1); +} -- 2.39.2