1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * usage.c
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Various reporting routines.
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Originally copied from GIT source.
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) Linus Torvalds, 2005
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util.h"
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "debug.h"
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void report(const char *prefix, const char *err, va_list params)
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char msg[1024];
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	vsnprintf(msg, sizeof(msg), err, params);
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(stderr, " %s%s\n", prefix, msg);
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic NORETURN void usage_builtin(const char *err)
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	fprintf(stderr, "\n Usage: %s\n", err);
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	exit(129);
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic NORETURN void die_builtin(const char *err, va_list params)
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	report(" Fatal: ", err, params);
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	exit(128);
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void error_builtin(const char *err, va_list params)
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	report(" Error: ", err, params);
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void warn_builtin(const char *warn, va_list params)
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	report(" Warning: ", warn, params);
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* If we are in a dlopen()ed .so write to a global variable would segfault
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * (ugh), so keep things static. */
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void (*usage_routine)(const char *err) NORETURN = usage_builtin;
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin;
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void (*error_routine)(const char *err, va_list params) = error_builtin;
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void (*warn_routine)(const char *err, va_list params) = warn_builtin;
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid set_die_routine(void (*routine)(const char *err, va_list params) NORETURN)
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	die_routine = routine;
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid usage(const char *err)
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	usage_routine(err);
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid die(const char *err, ...)
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	va_list params;
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	va_start(params, err);
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	die_routine(err, params);
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	va_end(params);
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint error(const char *err, ...)
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	va_list params;
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	va_start(params, err);
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	error_routine(err, params);
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	va_end(params);
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return -1;
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid warning(const char *warn, ...)
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	va_list params;
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	va_start(params, warn);
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	warn_routine(warn, params);
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	va_end(params);
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
85