2  * GIT - The information manager from hell
 
   4  * Copyright (C) Linus Torvalds, 2005
 
   6 #include "git-compat-util.h"
 
   9 void vreportf(const char *prefix, const char *err, va_list params)
 
  12         vsnprintf(msg, sizeof(msg), err, params);
 
  13         fprintf(stderr, "%s%s\n", prefix, msg);
 
  16 void vwritef(int fd, const char *prefix, const char *err, va_list params)
 
  19         int len = vsnprintf(msg, sizeof(msg), err, params);
 
  20         if (len > sizeof(msg))
 
  23         write_in_full(fd, prefix, strlen(prefix));
 
  24         write_in_full(fd, msg, len);
 
  25         write_in_full(fd, "\n", 1);
 
  28 static NORETURN void usage_builtin(const char *err, va_list params)
 
  30         vreportf("usage: ", err, params);
 
  34 static NORETURN void die_builtin(const char *err, va_list params)
 
  36         vreportf("fatal: ", err, params);
 
  40 static void error_builtin(const char *err, va_list params)
 
  42         vreportf("error: ", err, params);
 
  45 static void warn_builtin(const char *warn, va_list params)
 
  47         vreportf("warning: ", warn, params);
 
  50 /* If we are in a dlopen()ed .so write to a global variable would segfault
 
  51  * (ugh), so keep things static. */
 
  52 static NORETURN_PTR void (*usage_routine)(const char *err, va_list params) = usage_builtin;
 
  53 static NORETURN_PTR void (*die_routine)(const char *err, va_list params) = die_builtin;
 
  54 static void (*error_routine)(const char *err, va_list params) = error_builtin;
 
  55 static void (*warn_routine)(const char *err, va_list params) = warn_builtin;
 
  57 void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params))
 
  59         die_routine = routine;
 
  62 void set_error_routine(void (*routine)(const char *err, va_list params))
 
  64         error_routine = routine;
 
  67 void NORETURN usagef(const char *err, ...)
 
  71         va_start(params, err);
 
  72         usage_routine(err, params);
 
  76 void NORETURN usage(const char *err)
 
  81 void NORETURN die(const char *err, ...)
 
  85         va_start(params, err);
 
  86         die_routine(err, params);
 
  90 void NORETURN die_errno(const char *fmt, ...)
 
  93         char fmt_with_err[1024];
 
  94         char str_error[256], *err;
 
  97         err = strerror(errno);
 
  98         for (i = j = 0; err[i] && j < sizeof(str_error) - 1; ) {
 
  99                 if ((str_error[j++] = err[i++]) != '%')
 
 101                 if (j < sizeof(str_error) - 1) {
 
 102                         str_error[j++] = '%';
 
 104                         /* No room to double the '%', so we overwrite it with
 
 111         snprintf(fmt_with_err, sizeof(fmt_with_err), "%s: %s", fmt, str_error);
 
 113         va_start(params, fmt);
 
 114         die_routine(fmt_with_err, params);
 
 118 int error(const char *err, ...)
 
 122         va_start(params, err);
 
 123         error_routine(err, params);
 
 128 void warning(const char *warn, ...)
 
 132         va_start(params, warn);
 
 133         warn_routine(warn, params);