aboutsummaryrefslogtreecommitdiff
path: root/usage.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-06-24 01:06:51 -0700
committerJunio C Hamano <junkio@cox.net>2006-06-24 01:06:51 -0700
commitbc1f262d67cbe1c736c5dca911f6f085f47ac9bb (patch)
tree09d2fd4312b16cb841238edd2b5ad3a10b6f5263 /usage.c
parent1f330269371cc77b7abfcc99c7b15ad7b86f09c9 (diff)
parentce88ac5b129dd562a1062522039366ebbf1157e1 (diff)
downloadgit-bc1f262d67cbe1c736c5dca911f6f085f47ac9bb.tar.xz
Merge branch 'pb/error'
* pb/error: usage: minimum type fix. Customizable error handlers git-merge: Don't use -p when outputting summary git-commit: allow -e option anywhere on command line patch-id: take "commit" prefix as well as "diff-tree" prefix
Diffstat (limited to 'usage.c')
-rw-r--r--usage.c46
1 files changed, 42 insertions, 4 deletions
diff --git a/usage.c b/usage.c
index 1fa924c3d9..52c2e96056 100644
--- a/usage.c
+++ b/usage.c
@@ -12,20 +12,58 @@ static void report(const char *prefix, const char *err, va_list params)
fputs("\n", stderr);
}
-void usage(const char *err)
+static NORETURN void usage_builtin(const char *err)
{
fprintf(stderr, "usage: %s\n", err);
exit(129);
}
+static NORETURN void die_builtin(const char *err, va_list params)
+{
+ report("fatal: ", err, params);
+ exit(128);
+}
+
+static void error_builtin(const char *err, va_list params)
+{
+ report("error: ", err, params);
+}
+
+
+/* If we are in a dlopen()ed .so write to a global variable would segfault
+ * (ugh), so keep things static. */
+static void (*usage_routine)(const char *err) NORETURN = usage_builtin;
+static void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin;
+static void (*error_routine)(const char *err, va_list params) = error_builtin;
+
+void set_usage_routine(void (*routine)(const char *err) NORETURN)
+{
+ usage_routine = routine;
+}
+
+void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN)
+{
+ die_routine = routine;
+}
+
+void set_error_routine(void (*routine)(const char *err, va_list params))
+{
+ error_routine = routine;
+}
+
+
+void usage(const char *err)
+{
+ usage_routine(err);
+}
+
void die(const char *err, ...)
{
va_list params;
va_start(params, err);
- report("fatal: ", err, params);
+ die_routine(err, params);
va_end(params);
- exit(128);
}
int error(const char *err, ...)
@@ -33,7 +71,7 @@ int error(const char *err, ...)
va_list params;
va_start(params, err);
- report("error: ", err, params);
+ error_routine(err, params);
va_end(params);
return -1;
}