Commit c7a7fc0a authored by Rusty Russell's avatar Rusty Russell

opt: add opt_usage_exit_fail.

I've been using opt_usage_and_exit() but that exits status 0.
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent c38e11b5
......@@ -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.
*
......
......@@ -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);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment