Browse Source

opt: add opt_usage_exit_fail.

I've been using opt_usage_and_exit() but that exits status 0.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 10 years ago
parent
commit
c7a7fc0a17
2 changed files with 31 additions and 0 deletions
  1. 16 0
      ccan/opt/opt.h
  2. 15 0
      ccan/opt/usage.c

+ 16 - 0
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.
  *

+ 15 - 0
ccan/opt/usage.c

@@ -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);
+}