Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tag: v1.6.6-rc0
Fetching contributors…

Cannot retrieve contributors at this time

file 117 lines (98 sloc) 2.464 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
/*
* GIT - The information manager from hell
*
* Copyright (C) Linus Torvalds, 2005
*/
#include "git-compat-util.h"

static void report(const char *prefix, const char *err, va_list params)
{
char msg[4096];
vsnprintf(msg, sizeof(msg), err, params);
fprintf(stderr, "%s%s\n", prefix, msg);
}

static NORETURN void usage_builtin(const char *err, va_list params)
{
report("usage: ", err, params);
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);
}

static void warn_builtin(const char *warn, va_list params)
{
report("warning: ", warn, params);
}

/* If we are in a dlopen()ed .so write to a global variable would segfault
* (ugh), so keep things static. */
static NORETURN_PTR void (*usage_routine)(const char *err, va_list params) = usage_builtin;
static NORETURN_PTR void (*die_routine)(const char *err, va_list params) = die_builtin;
static void (*error_routine)(const char *err, va_list params) = error_builtin;
static void (*warn_routine)(const char *err, va_list params) = warn_builtin;

void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params))
{
die_routine = routine;
}

void usagef(const char *err, ...)
{
va_list params;

va_start(params, err);
usage_routine(err, params);
va_end(params);
}

void usage(const char *err)
{
usagef("%s", err);
}

void die(const char *err, ...)
{
va_list params;

va_start(params, err);
die_routine(err, params);
va_end(params);
}

void die_errno(const char *fmt, ...)
{
va_list params;
char fmt_with_err[1024];
char str_error[256], *err;
int i, j;

err = strerror(errno);
for (i = j = 0; err[i] && j < sizeof(str_error) - 1; ) {
if ((str_error[j++] = err[i++]) != '%')
continue;
if (j < sizeof(str_error) - 1) {
str_error[j++] = '%';
} else {
/* No room to double the '%', so we overwrite it with
* '\0' below */
j--;
break;
}
}
str_error[j] = 0;
snprintf(fmt_with_err, sizeof(fmt_with_err), "%s: %s", fmt, str_error);

va_start(params, fmt);
die_routine(fmt_with_err, params);
va_end(params);
}

int error(const char *err, ...)
{
va_list params;

va_start(params, err);
error_routine(err, params);
va_end(params);
return -1;
}

void warning(const char *warn, ...)
{
va_list params;

va_start(params, warn);
warn_routine(warn, params);
va_end(params);
}
Something went wrong with that request. Please try again.