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