Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sudo-project
GitHub Repository: sudo-project/sudo
Path: blob/main/include/sudo_fatal.h
1532 views
1
/*
2
* SPDX-License-Identifier: ISC
3
*
4
* Copyright (c) 2004, 2010-2015, 2017-2018 Todd C. Miller <[email protected]>
5
*
6
* Permission to use, copy, modify, and distribute this software for any
7
* purpose with or without fee is hereby granted, provided that the above
8
* copyright notice and this permission notice appear in all copies.
9
*
10
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
*/
18
19
#ifndef SUDO_FATAL_H
20
#define SUDO_FATAL_H
21
22
#include <stdarg.h>
23
#ifdef HAVE_STDBOOL_H
24
# include <stdbool.h>
25
#else
26
# include <compat/stdbool.h>
27
#endif /* HAVE_STDBOOL_H */
28
29
#include <sudo_plugin.h> /* for conversation function */
30
31
/* No output to debug files when fuzzing. */
32
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
33
# define SUDO_ERROR_WRAP 0
34
#endif
35
36
/*
37
* We wrap fatal/fatalx and warn/warnx so that the same output can
38
* go to the debug file, if there is one.
39
*/
40
#if (defined(SUDO_ERROR_WRAP) && SUDO_ERROR_WRAP == 0) || defined(NO_VARIADIC_MACROS)
41
# define sudo_fatal sudo_fatal_nodebug_v1
42
# define sudo_fatalx sudo_fatalx_nodebug_v1
43
# define sudo_gai_fatal sudo_gai_fatal_nodebug_v1
44
# define sudo_warn sudo_warn_nodebug_v1
45
# define sudo_warnx sudo_warnx_nodebug_v1
46
# define sudo_gai_warn sudo_gai_warn_nodebug_v1
47
# define sudo_vfatal(fmt, ap) sudo_vfatal_nodebug_v1((fmt), (ap))
48
# define sudo_vfatalx(fmt, ap) sudo_vfatalx_nodebug_v1((fmt), (ap))
49
# define sudo_gai_vfatal(en, fmt, ap) sudo_vfatal_nodebug_v1((en), (fmt), (ap))
50
# define sudo_vwarn(fmt, ap) sudo_vwarn_nodebug_v1((fmt), (ap))
51
# define sudo_vwarnx(fmt, ap) sudo_vwarnx_nodebug_v1((fmt), (ap))
52
# define sudo_gai_vwarn(en, fmt, ap) sudo_vwarn_nodebug_v1((en), (fmt), (ap))
53
#else /* SUDO_ERROR_WRAP */
54
# if defined(__GNUC__) && __GNUC__ == 2
55
# define sudo_fatal(fmt...) do { \
56
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
57
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
58
fmt); \
59
sudo_fatal_nodebug_v1(fmt); \
60
} while (0)
61
# define sudo_fatalx(fmt...) do { \
62
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
63
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, fmt); \
64
sudo_fatalx_nodebug_v1(fmt); \
65
} while (0)
66
# define sudo_gai_fatal(en, fmt...) do { \
67
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
68
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, fmt); \
69
sudo_gai_fatal_nodebug_v1((en), fmt); \
70
} while (0)
71
# define sudo_warn(fmt...) do { \
72
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
73
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
74
fmt); \
75
sudo_warn_nodebug_v1(fmt); \
76
} while (0)
77
# define sudo_warnx(fmt...) do { \
78
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
79
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, fmt); \
80
sudo_warnx_nodebug_v1(fmt); \
81
} while (0)
82
# define sudo_gai_warn(en, fmt...) do { \
83
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
84
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, fmt); \
85
sudo_gai_warn_nodebug_v1((en), fmt); \
86
} while (0)
87
# else
88
# define sudo_fatal(...) do { \
89
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
90
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
91
__VA_ARGS__); \
92
sudo_fatal_nodebug_v1(__VA_ARGS__); \
93
} while (0)
94
# define sudo_fatalx(...) do { \
95
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
96
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, __VA_ARGS__); \
97
sudo_fatalx_nodebug_v1(__VA_ARGS__); \
98
} while (0)
99
# define sudo_gai_fatal(en, ...) do { \
100
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
101
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, __VA_ARGS__); \
102
sudo_gai_fatal_nodebug_v1((en), __VA_ARGS__); \
103
} while (0)
104
# define sudo_warn(...) do { \
105
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
106
SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
107
__VA_ARGS__); \
108
sudo_warn_nodebug_v1(__VA_ARGS__); \
109
} while (0)
110
# define sudo_warnx(...) do { \
111
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
112
SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, __VA_ARGS__); \
113
sudo_warnx_nodebug_v1(__VA_ARGS__); \
114
} while (0)
115
# define sudo_gai_warn(en, ...) do { \
116
sudo_debug_printf2(__func__, __FILE__, __LINE__, \
117
SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, __VA_ARGS__); \
118
sudo_gai_warn_nodebug_v1((en), __VA_ARGS__); \
119
} while (0)
120
# endif /* __GNUC__ == 2 */
121
# define sudo_vfatal(fmt, ap) do { \
122
va_list ap2; \
123
va_copy(ap2, (ap)); \
124
sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
125
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
126
(fmt), ap2); \
127
sudo_vfatal_nodebug_v1((fmt), (ap)); \
128
} while (0)
129
# define sudo_vfatalx(fmt, ap) do { \
130
va_list ap2; \
131
va_copy(ap2, (ap)); \
132
sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
133
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), ap2); \
134
sudo_vfatalx_nodebug_v1((fmt), (ap)); \
135
} while (0)
136
# define sudo_gai_vfatal(en, fmt, ap) do { \
137
va_list ap2; \
138
va_copy(ap2, (ap)); \
139
sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
140
SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), ap2); \
141
sudo_gai_vfatal_nodebug_v1((en), (fmt), (ap)); \
142
} while (0)
143
# define sudo_vwarn(fmt, ap) do { \
144
va_list ap2; \
145
va_copy(ap2, (ap)); \
146
sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
147
SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \
148
(fmt), ap2); \
149
sudo_vwarn_nodebug_v1((fmt), (ap)); \
150
} while (0)
151
# define sudo_vwarnx(fmt, ap) do { \
152
va_list ap2; \
153
va_copy(ap2, (ap)); \
154
sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
155
SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), ap2); \
156
sudo_vwarnx_nodebug_v1((fmt), (ap)); \
157
} while (0)
158
# define sudo_gai_vwarn(en, fmt, ap) do { \
159
va_list ap2; \
160
va_copy(ap2, (ap)); \
161
sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \
162
SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), ap2); \
163
sudo_gai_vwarn_nodebug_v1((en), (fmt), (ap)); \
164
} while (0)
165
#endif /* SUDO_ERROR_WRAP */
166
167
typedef void (*sudo_fatal_callback_t)(void);
168
typedef bool (*sudo_warn_setlocale_t)(bool, int *);
169
170
sudo_dso_public int sudo_fatal_callback_deregister_v1(sudo_fatal_callback_t func);
171
sudo_dso_public int sudo_fatal_callback_register_v1(sudo_fatal_callback_t func);
172
sudo_dso_public char *sudo_warn_gettext_v1(const char *domainname, const char *msgid) sudo_attr_fmt_arg(2);
173
sudo_dso_public void sudo_warn_set_locale_func_v1(sudo_warn_setlocale_t func);
174
sudo_noreturn sudo_dso_public void sudo_fatal_nodebug_v1(const char * restrict fmt, ...) sudo_printf0like(1, 2);
175
sudo_noreturn sudo_dso_public void sudo_fatalx_nodebug_v1(const char * restrict fmt, ...) sudo_printflike(1, 2);
176
sudo_noreturn sudo_dso_public void sudo_gai_fatal_nodebug_v1(int errnum, const char * restrict fmt, ...) sudo_printflike(2, 3);
177
sudo_noreturn sudo_dso_public void sudo_vfatal_nodebug_v1(const char * restrict fmt, va_list ap) sudo_printf0like(1, 0);
178
sudo_noreturn sudo_dso_public void sudo_vfatalx_nodebug_v1(const char * restrict fmt, va_list ap) sudo_printflike(1, 0);
179
sudo_noreturn sudo_dso_public void sudo_gai_vfatal_nodebug_v1(int errnum, const char * restrict fmt, va_list ap) sudo_printflike(2, 0);
180
sudo_dso_public void sudo_warn_nodebug_v1(const char * restrict fmt, ...) sudo_printf0like(1, 2);
181
sudo_dso_public void sudo_warnx_nodebug_v1(const char * restrict fmt, ...) sudo_printflike(1, 2);
182
sudo_dso_public void sudo_gai_warn_nodebug_v1(int errnum, const char * restrict fmt, ...) sudo_printflike(2, 3);
183
sudo_dso_public void sudo_vwarn_nodebug_v1(const char * restrict fmt, va_list ap) sudo_printf0like(1, 0);
184
sudo_dso_public void sudo_vwarnx_nodebug_v1(const char * restrict fmt, va_list ap) sudo_printflike(1, 0);
185
sudo_dso_public void sudo_gai_vwarn_nodebug_v1(int errnum, const char * restrict fmt, va_list ap) sudo_printflike(2, 0);
186
sudo_dso_public void sudo_warn_set_conversation_v1(sudo_conv_t conv);
187
188
#define sudo_fatal_callback_deregister(_a) sudo_fatal_callback_deregister_v1((_a))
189
#define sudo_fatal_callback_register(_a) sudo_fatal_callback_register_v1((_a))
190
#define sudo_warn_set_locale_func(_a) sudo_warn_set_locale_func_v1((_a))
191
#define sudo_fatal_nodebug sudo_fatal_nodebug_v1
192
#define sudo_fatalx_nodebug sudo_fatalx_nodebug_v1
193
#define sudo_gai_fatal_nodebug sudo_gai_fatal_nodebug_v1
194
#define sudo_vfatal_nodebug(_a, _b) sudo_vfatal_nodebug_v1((_a), (_b))
195
#define sudo_vfatalx_nodebug(_a, _b) sudo_vfatalx_nodebug_v1((_a), (_b))
196
#define sudo_gai_vfatal_nodebug(_a, _b, _c) sudo_gai_vfatal_nodebug_v1((_a), (_b), (_c))
197
#define sudo_warn_nodebug sudo_warn_nodebug_v1
198
#define sudo_warnx_nodebug sudo_warnx_nodebug_v1
199
#define sudo_gai_warn_nodebug sudo_gai_warn_nodebug_v1
200
#define sudo_vwarn_nodebug(_a, _b) sudo_vwarn_nodebug_v1((_a), (_b))
201
#define sudo_vwarnx_nodebug(_a, _b) sudo_vwarnx_nodebug_v1((_a), (_b))
202
#define sudo_gai_vwarn_nodebug(_a, _b, _c) sudo_gai_vwarn_nodebug_v1((_a), (_b), (_c))
203
#define sudo_warn_set_conversation(_a) sudo_warn_set_conversation_v1(_a)
204
205
#ifdef DEFAULT_TEXT_DOMAIN
206
# define sudo_warn_gettext(_a) sudo_warn_gettext_v1(DEFAULT_TEXT_DOMAIN, (_a))
207
#else
208
# define sudo_warn_gettext(_a) sudo_warn_gettext_v1(NULL, (_a))
209
#endif
210
211
#endif /* SUDO_FATAL_H */
212
213