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