summaryrefslogtreecommitdiff
path: root/usage.c
diff options
context:
space:
mode:
Diffstat (limited to 'usage.c')
-rw-r--r--usage.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/usage.c b/usage.c
index c7d233b0de..76399ba840 100644
--- a/usage.c
+++ b/usage.c
@@ -55,6 +55,12 @@ static NORETURN void usage_builtin(const char *err, va_list params)
exit(129);
}
+static void die_message_builtin(const char *err, va_list params)
+{
+ trace2_cmd_error_va(err, params);
+ vreportf("fatal: ", err, params);
+}
+
/*
* We call trace2_cmd_error_va() in the below functions first and
* expect it to va_copy 'params' before using it (because an 'ap' can
@@ -62,10 +68,9 @@ static NORETURN void usage_builtin(const char *err, va_list params)
*/
static NORETURN void die_builtin(const char *err, va_list params)
{
- trace2_cmd_error_va(err, params);
-
- vreportf("fatal: ", err, params);
+ report_fn die_message_fn = get_die_message_routine();
+ die_message_fn(err, params);
exit(128);
}
@@ -109,6 +114,7 @@ static int die_is_recursing_builtin(void)
* (ugh), so keep things static. */
static NORETURN_PTR report_fn usage_routine = usage_builtin;
static NORETURN_PTR report_fn die_routine = die_builtin;
+static report_fn die_message_routine = die_message_builtin;
static report_fn error_routine = error_builtin;
static report_fn warn_routine = warn_builtin;
static int (*die_is_recursing)(void) = die_is_recursing_builtin;
@@ -118,6 +124,11 @@ void set_die_routine(NORETURN_PTR report_fn routine)
die_routine = routine;
}
+report_fn get_die_message_routine(void)
+{
+ return die_message_routine;
+}
+
void set_error_routine(report_fn routine)
{
error_routine = routine;
@@ -211,6 +222,17 @@ void NORETURN die_errno(const char *fmt, ...)
va_end(params);
}
+#undef die_message
+int die_message(const char *err, ...)
+{
+ va_list params;
+
+ va_start(params, err);
+ die_message_routine(err, params);
+ va_end(params);
+ return 128;
+}
+
#undef error_errno
int error_errno(const char *fmt, ...)
{