🌐 AI搜索 & 代理 主页
blob: b6aea45280bf2aa4c06a0130f912a61377165016 [file] [log] [blame]
Linus Torvalds0fcfd162005-04-18 20:04:431/*
2 * GIT - The information manager from hell
3 *
4 * Copyright (C) Linus Torvalds, 2005
5 */
Junio C Hamano4050c0d2005-12-05 19:54:296#include "git-compat-util.h"
Linus Torvalds0fcfd162005-04-18 20:04:437
8static void report(const char *prefix, const char *err, va_list params)
9{
Shawn O. Pearce389d1762009-03-24 23:10:3510 char msg[1024];
Nicolas Pitred048a962007-11-09 19:33:5411 vsnprintf(msg, sizeof(msg), err, params);
12 fprintf(stderr, "%s%s\n", prefix, msg);
Linus Torvalds0fcfd162005-04-18 20:04:4313}
14
Junio C Hamanoce88ac52006-06-24 05:44:3315static NORETURN void usage_builtin(const char *err)
Linus Torvalds0fcfd162005-04-18 20:04:4316{
17 fprintf(stderr, "usage: %s\n", err);
Linus Torvalds5d1a5c02005-10-01 20:24:2718 exit(129);
Linus Torvalds0fcfd162005-04-18 20:04:4319}
20
Junio C Hamanoce88ac52006-06-24 05:44:3321static NORETURN void die_builtin(const char *err, va_list params)
Petr Baudis39a3f5e2006-06-24 02:34:3822{
23 report("fatal: ", err, params);
24 exit(128);
25}
26
Junio C Hamanoce88ac52006-06-24 05:44:3327static void error_builtin(const char *err, va_list params)
Petr Baudis39a3f5e2006-06-24 02:34:3828{
29 report("error: ", err, params);
30}
31
Shawn O. Pearcefa39b6b2006-12-22 00:48:3232static void warn_builtin(const char *warn, va_list params)
33{
34 report("warning: ", warn, params);
35}
Petr Baudis39a3f5e2006-06-24 02:34:3836
37/* If we are in a dlopen()ed .so write to a global variable would segfault
38 * (ugh), so keep things static. */
39static void (*usage_routine)(const char *err) NORETURN = usage_builtin;
40static void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin;
41static void (*error_routine)(const char *err, va_list params) = error_builtin;
Shawn O. Pearcefa39b6b2006-12-22 00:48:3242static void (*warn_routine)(const char *err, va_list params) = warn_builtin;
Petr Baudis39a3f5e2006-06-24 02:34:3843
Petr Baudis39a3f5e2006-06-24 02:34:3844void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN)
45{
46 die_routine = routine;
47}
48
Petr Baudis39a3f5e2006-06-24 02:34:3849void usage(const char *err)
50{
51 usage_routine(err);
52}
53
Linus Torvalds0fcfd162005-04-18 20:04:4354void die(const char *err, ...)
55{
56 va_list params;
57
58 va_start(params, err);
Petr Baudis39a3f5e2006-06-24 02:34:3859 die_routine(err, params);
Linus Torvalds0fcfd162005-04-18 20:04:4360 va_end(params);
Linus Torvalds0fcfd162005-04-18 20:04:4361}
62
Thomas Rastb8750362009-06-27 15:58:4463void die_errno(const char *fmt, ...)
64{
65 va_list params;
66 char fmt_with_err[1024];
Junio C Hamanof8b5a8e2009-06-27 15:58:4567 char str_error[256], *err;
68 int i, j;
Thomas Rastb8750362009-06-27 15:58:4469
Junio C Hamanof8b5a8e2009-06-27 15:58:4570 err = strerror(errno);
71 for (i = j = 0; err[i] && j < sizeof(str_error) - 1; ) {
72 if ((str_error[j++] = err[i++]) != '%')
73 continue;
74 if (j < sizeof(str_error) - 1) {
75 str_error[j++] = '%';
76 } else {
77 /* No room to double the '%', so we overwrite it with
78 * '\0' below */
79 j--;
80 break;
81 }
82 }
83 str_error[j] = 0;
84 snprintf(fmt_with_err, sizeof(fmt_with_err), "%s: %s", fmt, str_error);
Thomas Rastb8750362009-06-27 15:58:4485
86 va_start(params, fmt);
87 die_routine(fmt_with_err, params);
88 va_end(params);
89}
90
Linus Torvalds0fcfd162005-04-18 20:04:4391int error(const char *err, ...)
92{
93 va_list params;
94
95 va_start(params, err);
Petr Baudis39a3f5e2006-06-24 02:34:3896 error_routine(err, params);
Linus Torvalds0fcfd162005-04-18 20:04:4397 va_end(params);
98 return -1;
99}
Shawn O. Pearcefa39b6b2006-12-22 00:48:32100
Theodore Ts'o46efd2d2007-03-30 23:07:05101void warning(const char *warn, ...)
Shawn O. Pearcefa39b6b2006-12-22 00:48:32102{
103 va_list params;
104
105 va_start(params, warn);
106 warn_routine(warn, params);
107 va_end(params);
108}