]> git.ozlabs.org Git - ccan/commitdiff
opt: add opt_usage_exit_fail.
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 4 Jun 2015 03:18:18 +0000 (12:48 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 4 Jun 2015 03:59:15 +0000 (13:29 +0930)
I've been using opt_usage_and_exit() but that exits status 0.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/opt/opt.h
ccan/opt/usage.c

index 727dacd0f148594a87c1b465c8180438b778a349..690907e595eff6922690204eb4c76a6be3e59d8c 100644 (file)
@@ -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.
  *
index b71fb334627f174fbc8bfd2022e87c0304d43fd8..26150ea8cd409e6c84d5a33067fd15932bccb4dc 100644 (file)
@@ -9,6 +9,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdint.h>
+#include <stdarg.h>
 #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 : "<program>", NULL));
+       exit(1);
+}