🌐 AI搜索 & 代理 主页
blob: 79856a2b9f5bc4603252cb10b471a0815416a617 [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{
Björn Gustavsson625a8602009-11-22 21:19:5310 char msg[4096];
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
Jonathan Nieder64b1cb72009-11-09 15:05:0215static NORETURN void usage_builtin(const char *err, va_list params)
Linus Torvalds0fcfd162005-04-18 20:04:4316{
Jonathan Nieder64b1cb72009-11-09 15:05:0217 report("usage: ", err, params);
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. */
Jonathan Nieder64b1cb72009-11-09 15:05:0239static NORETURN_PTR void (*usage_routine)(const char *err, va_list params) = usage_builtin;
Erik Faye-Lund18660bc2009-09-30 18:05:5040static NORETURN_PTR void (*die_routine)(const char *err, va_list params) = die_builtin;
Petr Baudis39a3f5e2006-06-24 02:34:3841static 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
Erik Faye-Lund18660bc2009-09-30 18:05:5044void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params))
Petr Baudis39a3f5e2006-06-24 02:34:3845{
46 die_routine = routine;
47}
48
Jonathan Nieder64b1cb72009-11-09 15:05:0249void usagef(const char *err, ...)
50{
51 va_list params;
52
53 va_start(params, err);
54 usage_routine(err, params);
55 va_end(params);
56}
57
Petr Baudis39a3f5e2006-06-24 02:34:3858void usage(const char *err)
59{
Jonathan Nieder64b1cb72009-11-09 15:05:0260 usagef("%s", err);
Petr Baudis39a3f5e2006-06-24 02:34:3861}
62
Linus Torvalds0fcfd162005-04-18 20:04:4363void die(const char *err, ...)
64{
65 va_list params;
66
67 va_start(params, err);
Petr Baudis39a3f5e2006-06-24 02:34:3868 die_routine(err, params);
Linus Torvalds0fcfd162005-04-18 20:04:4369 va_end(params);
Linus Torvalds0fcfd162005-04-18 20:04:4370}
71
Thomas Rastb8750362009-06-27 15:58:4472void die_errno(const char *fmt, ...)
73{
74 va_list params;
75 char fmt_with_err[1024];
Junio C Hamanof8b5a8e2009-06-27 15:58:4576 char str_error[256], *err;
77 int i, j;
Thomas Rastb8750362009-06-27 15:58:4478
Junio C Hamanof8b5a8e2009-06-27 15:58:4579 err = strerror(errno);
80 for (i = j = 0; err[i] && j < sizeof(str_error) - 1; ) {
81 if ((str_error[j++] = err[i++]) != '%')
82 continue;
83 if (j < sizeof(str_error) - 1) {
84 str_error[j++] = '%';
85 } else {
86 /* No room to double the '%', so we overwrite it with
87 * '\0' below */
88 j--;
89 break;
90 }
91 }
92 str_error[j] = 0;
93 snprintf(fmt_with_err, sizeof(fmt_with_err), "%s: %s", fmt, str_error);
Thomas Rastb8750362009-06-27 15:58:4494
95 va_start(params, fmt);
96 die_routine(fmt_with_err, params);
97 va_end(params);
98}
99
Linus Torvalds0fcfd162005-04-18 20:04:43100int error(const char *err, ...)
101{
102 va_list params;
103
104 va_start(params, err);
Petr Baudis39a3f5e2006-06-24 02:34:38105 error_routine(err, params);
Linus Torvalds0fcfd162005-04-18 20:04:43106 va_end(params);
107 return -1;
108}
Shawn O. Pearcefa39b6b2006-12-22 00:48:32109
Theodore Ts'o46efd2d2007-03-30 23:07:05110void warning(const char *warn, ...)
Shawn O. Pearcefa39b6b2006-12-22 00:48:32111{
112 va_list params;
113
114 va_start(params, warn);
115 warn_routine(warn, params);
116 va_end(params);
117}