1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker american fuzzy lop++ - debug / error handling macros
3*08b48e0bSAndroid Build Coastguard Worker ----------------------------------------------------
4*08b48e0bSAndroid Build Coastguard Worker
5*08b48e0bSAndroid Build Coastguard Worker Originally written by Michal Zalewski
6*08b48e0bSAndroid Build Coastguard Worker
7*08b48e0bSAndroid Build Coastguard Worker Now maintained by Marc Heuse <[email protected]>,
8*08b48e0bSAndroid Build Coastguard Worker Heiko Eißfeldt <[email protected]>,
9*08b48e0bSAndroid Build Coastguard Worker Andrea Fioraldi <[email protected]>,
10*08b48e0bSAndroid Build Coastguard Worker Dominik Maier <[email protected]>
11*08b48e0bSAndroid Build Coastguard Worker
12*08b48e0bSAndroid Build Coastguard Worker Copyright 2016, 2017 Google Inc. All rights reserved.
13*08b48e0bSAndroid Build Coastguard Worker Copyright 2019-2024 AFLplusplus Project. All rights reserved.
14*08b48e0bSAndroid Build Coastguard Worker
15*08b48e0bSAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License");
16*08b48e0bSAndroid Build Coastguard Worker you may not use this file except in compliance with the License.
17*08b48e0bSAndroid Build Coastguard Worker You may obtain a copy of the License at:
18*08b48e0bSAndroid Build Coastguard Worker
19*08b48e0bSAndroid Build Coastguard Worker https://www.apache.org/licenses/LICENSE-2.0
20*08b48e0bSAndroid Build Coastguard Worker
21*08b48e0bSAndroid Build Coastguard Worker */
22*08b48e0bSAndroid Build Coastguard Worker
23*08b48e0bSAndroid Build Coastguard Worker #ifndef _HAVE_DEBUG_H
24*08b48e0bSAndroid Build Coastguard Worker #define _HAVE_DEBUG_H
25*08b48e0bSAndroid Build Coastguard Worker
26*08b48e0bSAndroid Build Coastguard Worker #include <errno.h>
27*08b48e0bSAndroid Build Coastguard Worker
28*08b48e0bSAndroid Build Coastguard Worker #include "types.h"
29*08b48e0bSAndroid Build Coastguard Worker #include "config.h"
30*08b48e0bSAndroid Build Coastguard Worker
31*08b48e0bSAndroid Build Coastguard Worker /*******************
32*08b48e0bSAndroid Build Coastguard Worker * Terminal colors *
33*08b48e0bSAndroid Build Coastguard Worker *******************/
34*08b48e0bSAndroid Build Coastguard Worker
35*08b48e0bSAndroid Build Coastguard Worker #ifndef MESSAGES_TO_STDOUT
36*08b48e0bSAndroid Build Coastguard Worker #define MESSAGES_TO_STDOUT
37*08b48e0bSAndroid Build Coastguard Worker #endif
38*08b48e0bSAndroid Build Coastguard Worker
39*08b48e0bSAndroid Build Coastguard Worker #ifdef USE_COLOR
40*08b48e0bSAndroid Build Coastguard Worker
41*08b48e0bSAndroid Build Coastguard Worker #define cBLK "\x1b[0;30m"
42*08b48e0bSAndroid Build Coastguard Worker #define cRED "\x1b[0;31m"
43*08b48e0bSAndroid Build Coastguard Worker #define cGRN "\x1b[0;32m"
44*08b48e0bSAndroid Build Coastguard Worker #define cBRN "\x1b[0;33m"
45*08b48e0bSAndroid Build Coastguard Worker #define cBLU "\x1b[0;34m"
46*08b48e0bSAndroid Build Coastguard Worker #define cMGN "\x1b[0;35m"
47*08b48e0bSAndroid Build Coastguard Worker #define cCYA "\x1b[0;36m"
48*08b48e0bSAndroid Build Coastguard Worker #define cLGR "\x1b[0;37m"
49*08b48e0bSAndroid Build Coastguard Worker #define cGRA "\x1b[1;90m"
50*08b48e0bSAndroid Build Coastguard Worker #define cLRD "\x1b[1;91m"
51*08b48e0bSAndroid Build Coastguard Worker #define cLGN "\x1b[1;92m"
52*08b48e0bSAndroid Build Coastguard Worker #define cYEL "\x1b[1;93m"
53*08b48e0bSAndroid Build Coastguard Worker #define cLBL "\x1b[1;94m"
54*08b48e0bSAndroid Build Coastguard Worker #define cPIN "\x1b[1;95m"
55*08b48e0bSAndroid Build Coastguard Worker #define cLCY "\x1b[1;96m"
56*08b48e0bSAndroid Build Coastguard Worker #define cBRI "\x1b[1;97m"
57*08b48e0bSAndroid Build Coastguard Worker #define cRST "\x1b[0m"
58*08b48e0bSAndroid Build Coastguard Worker
59*08b48e0bSAndroid Build Coastguard Worker #define bgBLK "\x1b[40m"
60*08b48e0bSAndroid Build Coastguard Worker #define bgRED "\x1b[41m"
61*08b48e0bSAndroid Build Coastguard Worker #define bgGRN "\x1b[42m"
62*08b48e0bSAndroid Build Coastguard Worker #define bgBRN "\x1b[43m"
63*08b48e0bSAndroid Build Coastguard Worker #define bgBLU "\x1b[44m"
64*08b48e0bSAndroid Build Coastguard Worker #define bgMGN "\x1b[45m"
65*08b48e0bSAndroid Build Coastguard Worker #define bgCYA "\x1b[46m"
66*08b48e0bSAndroid Build Coastguard Worker #define bgLGR "\x1b[47m"
67*08b48e0bSAndroid Build Coastguard Worker #define bgGRA "\x1b[100m"
68*08b48e0bSAndroid Build Coastguard Worker #define bgLRD "\x1b[101m"
69*08b48e0bSAndroid Build Coastguard Worker #define bgLGN "\x1b[102m"
70*08b48e0bSAndroid Build Coastguard Worker #define bgYEL "\x1b[103m"
71*08b48e0bSAndroid Build Coastguard Worker #define bgLBL "\x1b[104m"
72*08b48e0bSAndroid Build Coastguard Worker #define bgPIN "\x1b[105m"
73*08b48e0bSAndroid Build Coastguard Worker #define bgLCY "\x1b[106m"
74*08b48e0bSAndroid Build Coastguard Worker #define bgBRI "\x1b[107m"
75*08b48e0bSAndroid Build Coastguard Worker
76*08b48e0bSAndroid Build Coastguard Worker #else
77*08b48e0bSAndroid Build Coastguard Worker
78*08b48e0bSAndroid Build Coastguard Worker #define cBLK ""
79*08b48e0bSAndroid Build Coastguard Worker #define cRED ""
80*08b48e0bSAndroid Build Coastguard Worker #define cGRN ""
81*08b48e0bSAndroid Build Coastguard Worker #define cBRN ""
82*08b48e0bSAndroid Build Coastguard Worker #define cBLU ""
83*08b48e0bSAndroid Build Coastguard Worker #define cMGN ""
84*08b48e0bSAndroid Build Coastguard Worker #define cCYA ""
85*08b48e0bSAndroid Build Coastguard Worker #define cLGR ""
86*08b48e0bSAndroid Build Coastguard Worker #define cGRA ""
87*08b48e0bSAndroid Build Coastguard Worker #define cLRD ""
88*08b48e0bSAndroid Build Coastguard Worker #define cLGN ""
89*08b48e0bSAndroid Build Coastguard Worker #define cYEL ""
90*08b48e0bSAndroid Build Coastguard Worker #define cLBL ""
91*08b48e0bSAndroid Build Coastguard Worker #define cPIN ""
92*08b48e0bSAndroid Build Coastguard Worker #define cLCY ""
93*08b48e0bSAndroid Build Coastguard Worker #define cBRI ""
94*08b48e0bSAndroid Build Coastguard Worker #define cRST ""
95*08b48e0bSAndroid Build Coastguard Worker
96*08b48e0bSAndroid Build Coastguard Worker #define bgBLK ""
97*08b48e0bSAndroid Build Coastguard Worker #define bgRED ""
98*08b48e0bSAndroid Build Coastguard Worker #define bgGRN ""
99*08b48e0bSAndroid Build Coastguard Worker #define bgBRN ""
100*08b48e0bSAndroid Build Coastguard Worker #define bgBLU ""
101*08b48e0bSAndroid Build Coastguard Worker #define bgMGN ""
102*08b48e0bSAndroid Build Coastguard Worker #define bgCYA ""
103*08b48e0bSAndroid Build Coastguard Worker #define bgLGR ""
104*08b48e0bSAndroid Build Coastguard Worker #define bgGRA ""
105*08b48e0bSAndroid Build Coastguard Worker #define bgLRD ""
106*08b48e0bSAndroid Build Coastguard Worker #define bgLGN ""
107*08b48e0bSAndroid Build Coastguard Worker #define bgYEL ""
108*08b48e0bSAndroid Build Coastguard Worker #define bgLBL ""
109*08b48e0bSAndroid Build Coastguard Worker #define bgPIN ""
110*08b48e0bSAndroid Build Coastguard Worker #define bgLCY ""
111*08b48e0bSAndroid Build Coastguard Worker #define bgBRI ""
112*08b48e0bSAndroid Build Coastguard Worker
113*08b48e0bSAndroid Build Coastguard Worker #endif /* ^USE_COLOR */
114*08b48e0bSAndroid Build Coastguard Worker
115*08b48e0bSAndroid Build Coastguard Worker /*************************
116*08b48e0bSAndroid Build Coastguard Worker * Box drawing sequences *
117*08b48e0bSAndroid Build Coastguard Worker *************************/
118*08b48e0bSAndroid Build Coastguard Worker
119*08b48e0bSAndroid Build Coastguard Worker #ifdef FANCY_BOXES_NO_UTF
120*08b48e0bSAndroid Build Coastguard Worker
121*08b48e0bSAndroid Build Coastguard Worker #define SET_G1 "\x1b)0" /* Set G1 for box drawing */
122*08b48e0bSAndroid Build Coastguard Worker #define RESET_G1 "\x1b)B" /* Reset G1 to ASCII */
123*08b48e0bSAndroid Build Coastguard Worker #define bSTART "\x0e" /* Enter G1 drawing mode */
124*08b48e0bSAndroid Build Coastguard Worker #define bSTOP "\x0f" /* Leave G1 drawing mode */
125*08b48e0bSAndroid Build Coastguard Worker #define bH "q" /* Horizontal line */
126*08b48e0bSAndroid Build Coastguard Worker #define bV "x" /* Vertical line */
127*08b48e0bSAndroid Build Coastguard Worker #define bLT "l" /* Left top corner */
128*08b48e0bSAndroid Build Coastguard Worker #define bRT "k" /* Right top corner */
129*08b48e0bSAndroid Build Coastguard Worker #define bLB "m" /* Left bottom corner */
130*08b48e0bSAndroid Build Coastguard Worker #define bRB "j" /* Right bottom corner */
131*08b48e0bSAndroid Build Coastguard Worker #define bX "n" /* Cross */
132*08b48e0bSAndroid Build Coastguard Worker #define bVR "t" /* Vertical, branch right */
133*08b48e0bSAndroid Build Coastguard Worker #define bVL "u" /* Vertical, branch left */
134*08b48e0bSAndroid Build Coastguard Worker #define bHT "v" /* Horizontal, branch top */
135*08b48e0bSAndroid Build Coastguard Worker #define bHB "w" /* Horizontal, branch bottom */
136*08b48e0bSAndroid Build Coastguard Worker
137*08b48e0bSAndroid Build Coastguard Worker #else
138*08b48e0bSAndroid Build Coastguard Worker
139*08b48e0bSAndroid Build Coastguard Worker #ifdef FANCY_BOXES
140*08b48e0bSAndroid Build Coastguard Worker
141*08b48e0bSAndroid Build Coastguard Worker #define SET_G1 ""
142*08b48e0bSAndroid Build Coastguard Worker #define RESET_G1 ""
143*08b48e0bSAndroid Build Coastguard Worker #define bSTART ""
144*08b48e0bSAndroid Build Coastguard Worker #define bSTOP ""
145*08b48e0bSAndroid Build Coastguard Worker #define bH "\u2500" /* Horizontal line */
146*08b48e0bSAndroid Build Coastguard Worker #define bV "\u2502" /* Vertical line */
147*08b48e0bSAndroid Build Coastguard Worker #define bLT "\u250c" /* Left top corner */
148*08b48e0bSAndroid Build Coastguard Worker #define bRT "\u2510" /* Right top corner */
149*08b48e0bSAndroid Build Coastguard Worker #define bLB "\u2514" /* Left bottom corner */
150*08b48e0bSAndroid Build Coastguard Worker #define bRB "\u2518" /* Right bottom corner */
151*08b48e0bSAndroid Build Coastguard Worker #define bX "\u253c" /* Cross */
152*08b48e0bSAndroid Build Coastguard Worker #define bVR "\u251c" /* Vertical, branch right */
153*08b48e0bSAndroid Build Coastguard Worker #define bVL "\u2524" /* Vertical, branch left */
154*08b48e0bSAndroid Build Coastguard Worker #define bHT "\u2534" /* Horizontal, branch top */
155*08b48e0bSAndroid Build Coastguard Worker #define bHB "\u252c" /* Horizontal, branch bottom */
156*08b48e0bSAndroid Build Coastguard Worker
157*08b48e0bSAndroid Build Coastguard Worker #else
158*08b48e0bSAndroid Build Coastguard Worker
159*08b48e0bSAndroid Build Coastguard Worker #define SET_G1 ""
160*08b48e0bSAndroid Build Coastguard Worker #define RESET_G1 ""
161*08b48e0bSAndroid Build Coastguard Worker #define bSTART ""
162*08b48e0bSAndroid Build Coastguard Worker #define bSTOP ""
163*08b48e0bSAndroid Build Coastguard Worker #define bH "-"
164*08b48e0bSAndroid Build Coastguard Worker #define bV "|"
165*08b48e0bSAndroid Build Coastguard Worker #define bLT "+"
166*08b48e0bSAndroid Build Coastguard Worker #define bRT "+"
167*08b48e0bSAndroid Build Coastguard Worker #define bLB "+"
168*08b48e0bSAndroid Build Coastguard Worker #define bRB "+"
169*08b48e0bSAndroid Build Coastguard Worker #define bX "+"
170*08b48e0bSAndroid Build Coastguard Worker #define bVR "+"
171*08b48e0bSAndroid Build Coastguard Worker #define bVL "+"
172*08b48e0bSAndroid Build Coastguard Worker #define bHT "+"
173*08b48e0bSAndroid Build Coastguard Worker #define bHB "+"
174*08b48e0bSAndroid Build Coastguard Worker
175*08b48e0bSAndroid Build Coastguard Worker #endif
176*08b48e0bSAndroid Build Coastguard Worker #endif /* ^FANCY_BOXES */
177*08b48e0bSAndroid Build Coastguard Worker
178*08b48e0bSAndroid Build Coastguard Worker /***********************
179*08b48e0bSAndroid Build Coastguard Worker * Misc terminal codes *
180*08b48e0bSAndroid Build Coastguard Worker ***********************/
181*08b48e0bSAndroid Build Coastguard Worker
182*08b48e0bSAndroid Build Coastguard Worker #define TERM_HOME "\x1b[H"
183*08b48e0bSAndroid Build Coastguard Worker #define TERM_CLEAR TERM_HOME "\x1b[2J"
184*08b48e0bSAndroid Build Coastguard Worker #define cEOL "\x1b[0K"
185*08b48e0bSAndroid Build Coastguard Worker #define CURSOR_HIDE "\x1b[?25l"
186*08b48e0bSAndroid Build Coastguard Worker #define CURSOR_SHOW "\x1b[?25h"
187*08b48e0bSAndroid Build Coastguard Worker
188*08b48e0bSAndroid Build Coastguard Worker /************************
189*08b48e0bSAndroid Build Coastguard Worker * Debug & error macros *
190*08b48e0bSAndroid Build Coastguard Worker ************************/
191*08b48e0bSAndroid Build Coastguard Worker
192*08b48e0bSAndroid Build Coastguard Worker #if defined USE_COLOR && !defined ALWAYS_COLORED
193*08b48e0bSAndroid Build Coastguard Worker #include <unistd.h>
194*08b48e0bSAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wformat-security"
colorfilter(const char * x)195*08b48e0bSAndroid Build Coastguard Worker static inline const char *colorfilter(const char *x) {
196*08b48e0bSAndroid Build Coastguard Worker
197*08b48e0bSAndroid Build Coastguard Worker static int once = 1;
198*08b48e0bSAndroid Build Coastguard Worker static int disabled = 0;
199*08b48e0bSAndroid Build Coastguard Worker
200*08b48e0bSAndroid Build Coastguard Worker if (once) {
201*08b48e0bSAndroid Build Coastguard Worker
202*08b48e0bSAndroid Build Coastguard Worker /* when there is no tty -> we always want filtering
203*08b48e0bSAndroid Build Coastguard Worker * when AFL_NO_UI is set filtering depends on AFL_NO_COLOR
204*08b48e0bSAndroid Build Coastguard Worker * otherwise we want always colors
205*08b48e0bSAndroid Build Coastguard Worker */
206*08b48e0bSAndroid Build Coastguard Worker disabled =
207*08b48e0bSAndroid Build Coastguard Worker isatty(2) && (!getenv("AFL_NO_UI") ||
208*08b48e0bSAndroid Build Coastguard Worker (!getenv("AFL_NO_COLOR") && !getenv("AFL_NO_COLOUR")));
209*08b48e0bSAndroid Build Coastguard Worker once = 0;
210*08b48e0bSAndroid Build Coastguard Worker
211*08b48e0bSAndroid Build Coastguard Worker }
212*08b48e0bSAndroid Build Coastguard Worker
213*08b48e0bSAndroid Build Coastguard Worker if (likely(disabled)) return x;
214*08b48e0bSAndroid Build Coastguard Worker
215*08b48e0bSAndroid Build Coastguard Worker static char monochromestring[4096];
216*08b48e0bSAndroid Build Coastguard Worker char *d = monochromestring;
217*08b48e0bSAndroid Build Coastguard Worker int in_seq = 0;
218*08b48e0bSAndroid Build Coastguard Worker
219*08b48e0bSAndroid Build Coastguard Worker while (*x) {
220*08b48e0bSAndroid Build Coastguard Worker
221*08b48e0bSAndroid Build Coastguard Worker if (in_seq && *x == 'm') {
222*08b48e0bSAndroid Build Coastguard Worker
223*08b48e0bSAndroid Build Coastguard Worker in_seq = 0;
224*08b48e0bSAndroid Build Coastguard Worker
225*08b48e0bSAndroid Build Coastguard Worker } else {
226*08b48e0bSAndroid Build Coastguard Worker
227*08b48e0bSAndroid Build Coastguard Worker if (!in_seq && *x == '\x1b') { in_seq = 1; }
228*08b48e0bSAndroid Build Coastguard Worker if (!in_seq) { *d++ = *x; }
229*08b48e0bSAndroid Build Coastguard Worker
230*08b48e0bSAndroid Build Coastguard Worker }
231*08b48e0bSAndroid Build Coastguard Worker
232*08b48e0bSAndroid Build Coastguard Worker ++x;
233*08b48e0bSAndroid Build Coastguard Worker
234*08b48e0bSAndroid Build Coastguard Worker }
235*08b48e0bSAndroid Build Coastguard Worker
236*08b48e0bSAndroid Build Coastguard Worker *d = '\0';
237*08b48e0bSAndroid Build Coastguard Worker return monochromestring;
238*08b48e0bSAndroid Build Coastguard Worker
239*08b48e0bSAndroid Build Coastguard Worker }
240*08b48e0bSAndroid Build Coastguard Worker
241*08b48e0bSAndroid Build Coastguard Worker #else
242*08b48e0bSAndroid Build Coastguard Worker #define colorfilter(x) x /* no filtering necessary */
243*08b48e0bSAndroid Build Coastguard Worker #endif
244*08b48e0bSAndroid Build Coastguard Worker
245*08b48e0bSAndroid Build Coastguard Worker /* macro magic to transform the first parameter to SAYF
246*08b48e0bSAndroid Build Coastguard Worker * through colorfilter which strips coloring */
247*08b48e0bSAndroid Build Coastguard Worker #define GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, \
248*08b48e0bSAndroid Build Coastguard Worker _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, \
249*08b48e0bSAndroid Build Coastguard Worker _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, \
250*08b48e0bSAndroid Build Coastguard Worker _39, _40, NAME, ...) \
251*08b48e0bSAndroid Build Coastguard Worker NAME
252*08b48e0bSAndroid Build Coastguard Worker
253*08b48e0bSAndroid Build Coastguard Worker #define SAYF(...) \
254*08b48e0bSAndroid Build Coastguard Worker GET_MACRO(__VA_ARGS__, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
255*08b48e0bSAndroid Build Coastguard Worker SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
256*08b48e0bSAndroid Build Coastguard Worker SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
257*08b48e0bSAndroid Build Coastguard Worker SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
258*08b48e0bSAndroid Build Coastguard Worker SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
259*08b48e0bSAndroid Build Coastguard Worker SAYF_N, SAYF_1) \
260*08b48e0bSAndroid Build Coastguard Worker (__VA_ARGS__)
261*08b48e0bSAndroid Build Coastguard Worker
262*08b48e0bSAndroid Build Coastguard Worker #define SAYF_1(x) MY_SAYF(colorfilter(x))
263*08b48e0bSAndroid Build Coastguard Worker #define SAYF_N(x, ...) MY_SAYF(colorfilter(x), __VA_ARGS__)
264*08b48e0bSAndroid Build Coastguard Worker
265*08b48e0bSAndroid Build Coastguard Worker /* Just print stuff to the appropriate stream. */
266*08b48e0bSAndroid Build Coastguard Worker #ifdef MESSAGES_TO_STDOUT
267*08b48e0bSAndroid Build Coastguard Worker #define MY_SAYF(x...) printf(x)
268*08b48e0bSAndroid Build Coastguard Worker #else
269*08b48e0bSAndroid Build Coastguard Worker #define MY_SAYF(x...) fprintf(stderr, x)
270*08b48e0bSAndroid Build Coastguard Worker #endif /* ^MESSAGES_TO_STDOUT */
271*08b48e0bSAndroid Build Coastguard Worker
272*08b48e0bSAndroid Build Coastguard Worker /* Show a prefixed warning. */
273*08b48e0bSAndroid Build Coastguard Worker
274*08b48e0bSAndroid Build Coastguard Worker #define WARNF(x...) \
275*08b48e0bSAndroid Build Coastguard Worker do { \
276*08b48e0bSAndroid Build Coastguard Worker \
277*08b48e0bSAndroid Build Coastguard Worker SAYF(cYEL "[!] " cBRI "WARNING: " cRST x); \
278*08b48e0bSAndroid Build Coastguard Worker SAYF(cRST "\n"); \
279*08b48e0bSAndroid Build Coastguard Worker \
280*08b48e0bSAndroid Build Coastguard Worker } while (0)
281*08b48e0bSAndroid Build Coastguard Worker
282*08b48e0bSAndroid Build Coastguard Worker /* Show a prefixed "doing something" message. */
283*08b48e0bSAndroid Build Coastguard Worker
284*08b48e0bSAndroid Build Coastguard Worker #define ACTF(x...) \
285*08b48e0bSAndroid Build Coastguard Worker do { \
286*08b48e0bSAndroid Build Coastguard Worker \
287*08b48e0bSAndroid Build Coastguard Worker SAYF(cLBL "[*] " cRST x); \
288*08b48e0bSAndroid Build Coastguard Worker SAYF(cRST "\n"); \
289*08b48e0bSAndroid Build Coastguard Worker \
290*08b48e0bSAndroid Build Coastguard Worker } while (0)
291*08b48e0bSAndroid Build Coastguard Worker
292*08b48e0bSAndroid Build Coastguard Worker /* Show a prefixed "success" message. */
293*08b48e0bSAndroid Build Coastguard Worker
294*08b48e0bSAndroid Build Coastguard Worker #define OKF(x...) \
295*08b48e0bSAndroid Build Coastguard Worker do { \
296*08b48e0bSAndroid Build Coastguard Worker \
297*08b48e0bSAndroid Build Coastguard Worker SAYF(cLGN "[+] " cRST x); \
298*08b48e0bSAndroid Build Coastguard Worker SAYF(cRST "\n"); \
299*08b48e0bSAndroid Build Coastguard Worker \
300*08b48e0bSAndroid Build Coastguard Worker } while (0)
301*08b48e0bSAndroid Build Coastguard Worker
302*08b48e0bSAndroid Build Coastguard Worker /* Show a prefixed fatal error message (not used in afl). */
303*08b48e0bSAndroid Build Coastguard Worker
304*08b48e0bSAndroid Build Coastguard Worker #define BADF(x...) \
305*08b48e0bSAndroid Build Coastguard Worker do { \
306*08b48e0bSAndroid Build Coastguard Worker \
307*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD "\n[-] " cRST x); \
308*08b48e0bSAndroid Build Coastguard Worker SAYF(cRST "\n"); \
309*08b48e0bSAndroid Build Coastguard Worker \
310*08b48e0bSAndroid Build Coastguard Worker } while (0)
311*08b48e0bSAndroid Build Coastguard Worker
312*08b48e0bSAndroid Build Coastguard Worker /* Die with a verbose non-OS fatal error message. */
313*08b48e0bSAndroid Build Coastguard Worker
314*08b48e0bSAndroid Build Coastguard Worker #define FATAL(x...) \
315*08b48e0bSAndroid Build Coastguard Worker do { \
316*08b48e0bSAndroid Build Coastguard Worker \
317*08b48e0bSAndroid Build Coastguard Worker SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD \
318*08b48e0bSAndroid Build Coastguard Worker "\n[-] PROGRAM ABORT : " cRST x); \
319*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD "\n Location : " cRST "%s(), %s:%u\n\n", __func__, \
320*08b48e0bSAndroid Build Coastguard Worker __FILE__, (u32)__LINE__); \
321*08b48e0bSAndroid Build Coastguard Worker exit(1); \
322*08b48e0bSAndroid Build Coastguard Worker \
323*08b48e0bSAndroid Build Coastguard Worker } while (0)
324*08b48e0bSAndroid Build Coastguard Worker
325*08b48e0bSAndroid Build Coastguard Worker /* Die by calling abort() to provide a core dump. */
326*08b48e0bSAndroid Build Coastguard Worker
327*08b48e0bSAndroid Build Coastguard Worker #define ABORT(x...) \
328*08b48e0bSAndroid Build Coastguard Worker do { \
329*08b48e0bSAndroid Build Coastguard Worker \
330*08b48e0bSAndroid Build Coastguard Worker SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD \
331*08b48e0bSAndroid Build Coastguard Worker "\n[-] PROGRAM ABORT : " cRST x); \
332*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD "\n Stop location : " cRST "%s(), %s:%u\n\n", __func__, \
333*08b48e0bSAndroid Build Coastguard Worker __FILE__, (u32)__LINE__); \
334*08b48e0bSAndroid Build Coastguard Worker abort(); \
335*08b48e0bSAndroid Build Coastguard Worker \
336*08b48e0bSAndroid Build Coastguard Worker } while (0)
337*08b48e0bSAndroid Build Coastguard Worker
338*08b48e0bSAndroid Build Coastguard Worker /* Die while also including the output of perror(). */
339*08b48e0bSAndroid Build Coastguard Worker
340*08b48e0bSAndroid Build Coastguard Worker #define PFATAL(x...) \
341*08b48e0bSAndroid Build Coastguard Worker do { \
342*08b48e0bSAndroid Build Coastguard Worker \
343*08b48e0bSAndroid Build Coastguard Worker fflush(stdout); \
344*08b48e0bSAndroid Build Coastguard Worker SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD \
345*08b48e0bSAndroid Build Coastguard Worker "\n[-] SYSTEM ERROR : " cRST x); \
346*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD "\n Stop location : " cRST "%s(), %s:%u\n", __func__, \
347*08b48e0bSAndroid Build Coastguard Worker __FILE__, (u32)__LINE__); \
348*08b48e0bSAndroid Build Coastguard Worker SAYF(cLRD " OS message : " cRST "%s\n", strerror(errno)); \
349*08b48e0bSAndroid Build Coastguard Worker exit(1); \
350*08b48e0bSAndroid Build Coastguard Worker \
351*08b48e0bSAndroid Build Coastguard Worker } while (0)
352*08b48e0bSAndroid Build Coastguard Worker
353*08b48e0bSAndroid Build Coastguard Worker /* Die with FATAL() or PFATAL() depending on the value of res (used to
354*08b48e0bSAndroid Build Coastguard Worker interpret different failure modes for read(), write(), etc). */
355*08b48e0bSAndroid Build Coastguard Worker
356*08b48e0bSAndroid Build Coastguard Worker #define RPFATAL(res, x...) \
357*08b48e0bSAndroid Build Coastguard Worker do { \
358*08b48e0bSAndroid Build Coastguard Worker \
359*08b48e0bSAndroid Build Coastguard Worker if (res < 0) \
360*08b48e0bSAndroid Build Coastguard Worker PFATAL(x); \
361*08b48e0bSAndroid Build Coastguard Worker else \
362*08b48e0bSAndroid Build Coastguard Worker FATAL(x); \
363*08b48e0bSAndroid Build Coastguard Worker \
364*08b48e0bSAndroid Build Coastguard Worker } while (0)
365*08b48e0bSAndroid Build Coastguard Worker
366*08b48e0bSAndroid Build Coastguard Worker /* Show a prefixed debug output. */
367*08b48e0bSAndroid Build Coastguard Worker
368*08b48e0bSAndroid Build Coastguard Worker #define DEBUGF(x...) \
369*08b48e0bSAndroid Build Coastguard Worker do { \
370*08b48e0bSAndroid Build Coastguard Worker \
371*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, cMGN "[D] " cBRI "DEBUG: " cRST x); \
372*08b48e0bSAndroid Build Coastguard Worker fprintf(stderr, cRST ""); \
373*08b48e0bSAndroid Build Coastguard Worker \
374*08b48e0bSAndroid Build Coastguard Worker } while (0)
375*08b48e0bSAndroid Build Coastguard Worker
376*08b48e0bSAndroid Build Coastguard Worker /* Error-checking versions of read() and write() that call RPFATAL() as
377*08b48e0bSAndroid Build Coastguard Worker appropriate. */
378*08b48e0bSAndroid Build Coastguard Worker
379*08b48e0bSAndroid Build Coastguard Worker #define ck_write(fd, buf, len, fn) \
380*08b48e0bSAndroid Build Coastguard Worker do { \
381*08b48e0bSAndroid Build Coastguard Worker \
382*08b48e0bSAndroid Build Coastguard Worker if (len <= 0) break; \
383*08b48e0bSAndroid Build Coastguard Worker int _fd = (fd); \
384*08b48e0bSAndroid Build Coastguard Worker s32 _written = 0, _off = 0, _len = (s32)(len); \
385*08b48e0bSAndroid Build Coastguard Worker \
386*08b48e0bSAndroid Build Coastguard Worker do { \
387*08b48e0bSAndroid Build Coastguard Worker \
388*08b48e0bSAndroid Build Coastguard Worker s32 _res = write(_fd, (buf) + _off, _len); \
389*08b48e0bSAndroid Build Coastguard Worker if (_res != _len && (_res > 0 && _written + _res != _len)) { \
390*08b48e0bSAndroid Build Coastguard Worker \
391*08b48e0bSAndroid Build Coastguard Worker if (_res > 0) { \
392*08b48e0bSAndroid Build Coastguard Worker \
393*08b48e0bSAndroid Build Coastguard Worker _written += _res; \
394*08b48e0bSAndroid Build Coastguard Worker _len -= _res; \
395*08b48e0bSAndroid Build Coastguard Worker _off += _res; \
396*08b48e0bSAndroid Build Coastguard Worker \
397*08b48e0bSAndroid Build Coastguard Worker } else { \
398*08b48e0bSAndroid Build Coastguard Worker \
399*08b48e0bSAndroid Build Coastguard Worker RPFATAL(_res, "Short write to %s, fd %d (%d of %d bytes)", fn, _fd, \
400*08b48e0bSAndroid Build Coastguard Worker _res, _len); \
401*08b48e0bSAndroid Build Coastguard Worker \
402*08b48e0bSAndroid Build Coastguard Worker } \
403*08b48e0bSAndroid Build Coastguard Worker \
404*08b48e0bSAndroid Build Coastguard Worker } else { \
405*08b48e0bSAndroid Build Coastguard Worker \
406*08b48e0bSAndroid Build Coastguard Worker break; \
407*08b48e0bSAndroid Build Coastguard Worker \
408*08b48e0bSAndroid Build Coastguard Worker } \
409*08b48e0bSAndroid Build Coastguard Worker \
410*08b48e0bSAndroid Build Coastguard Worker } while (1); \
411*08b48e0bSAndroid Build Coastguard Worker \
412*08b48e0bSAndroid Build Coastguard Worker \
413*08b48e0bSAndroid Build Coastguard Worker \
414*08b48e0bSAndroid Build Coastguard Worker } while (0)
415*08b48e0bSAndroid Build Coastguard Worker
416*08b48e0bSAndroid Build Coastguard Worker #define ck_read(fd, buf, len, fn) \
417*08b48e0bSAndroid Build Coastguard Worker do { \
418*08b48e0bSAndroid Build Coastguard Worker \
419*08b48e0bSAndroid Build Coastguard Worker s32 _len = (s32)(len); \
420*08b48e0bSAndroid Build Coastguard Worker s32 _res = read(fd, buf, _len); \
421*08b48e0bSAndroid Build Coastguard Worker if (_res != _len) RPFATAL(_res, "Short read from %s", fn); \
422*08b48e0bSAndroid Build Coastguard Worker \
423*08b48e0bSAndroid Build Coastguard Worker } while (0)
424*08b48e0bSAndroid Build Coastguard Worker
425*08b48e0bSAndroid Build Coastguard Worker #endif /* ! _HAVE_DEBUG_H */
426*08b48e0bSAndroid Build Coastguard Worker
427