OLD | NEW |
(Empty) | |
| 1 /* |
| 2 american fuzzy lop - debug / error handling macros |
| 3 -------------------------------------------------- |
| 4 |
| 5 Written and maintained by Michal Zalewski <lcamtuf@google.com> |
| 6 |
| 7 Copyright 2013, 2014, 2015, 2016 Google Inc. All rights reserved. |
| 8 |
| 9 Licensed under the Apache License, Version 2.0 (the "License"); |
| 10 you may not use this file except in compliance with the License. |
| 11 You may obtain a copy of the License at: |
| 12 |
| 13 http://www.apache.org/licenses/LICENSE-2.0 |
| 14 |
| 15 */ |
| 16 |
| 17 #ifndef _HAVE_DEBUG_H |
| 18 #define _HAVE_DEBUG_H |
| 19 |
| 20 #include <errno.h> |
| 21 |
| 22 #include "types.h" |
| 23 #include "config.h" |
| 24 |
| 25 /******************* |
| 26 * Terminal colors * |
| 27 *******************/ |
| 28 |
| 29 #ifdef USE_COLOR |
| 30 |
| 31 # define cBLK "\x1b[0;30m" |
| 32 # define cRED "\x1b[0;31m" |
| 33 # define cGRN "\x1b[0;32m" |
| 34 # define cBRN "\x1b[0;33m" |
| 35 # define cBLU "\x1b[0;34m" |
| 36 # define cMGN "\x1b[0;35m" |
| 37 # define cCYA "\x1b[0;36m" |
| 38 # define cLGR "\x1b[0;37m" |
| 39 # define cGRA "\x1b[1;90m" |
| 40 # define cLRD "\x1b[1;91m" |
| 41 # define cLGN "\x1b[1;92m" |
| 42 # define cYEL "\x1b[1;93m" |
| 43 # define cLBL "\x1b[1;94m" |
| 44 # define cPIN "\x1b[1;95m" |
| 45 # define cLCY "\x1b[1;96m" |
| 46 # define cBRI "\x1b[1;97m" |
| 47 # define cRST "\x1b[0m" |
| 48 |
| 49 # define bgBLK "\x1b[40m" |
| 50 # define bgRED "\x1b[41m" |
| 51 # define bgGRN "\x1b[42m" |
| 52 # define bgBRN "\x1b[43m" |
| 53 # define bgBLU "\x1b[44m" |
| 54 # define bgMGN "\x1b[45m" |
| 55 # define bgCYA "\x1b[46m" |
| 56 # define bgLGR "\x1b[47m" |
| 57 # define bgGRA "\x1b[100m" |
| 58 # define bgLRD "\x1b[101m" |
| 59 # define bgLGN "\x1b[102m" |
| 60 # define bgYEL "\x1b[103m" |
| 61 # define bgLBL "\x1b[104m" |
| 62 # define bgPIN "\x1b[105m" |
| 63 # define bgLCY "\x1b[106m" |
| 64 # define bgBRI "\x1b[107m" |
| 65 |
| 66 #else |
| 67 |
| 68 # define cBLK "" |
| 69 # define cRED "" |
| 70 # define cGRN "" |
| 71 # define cBRN "" |
| 72 # define cBLU "" |
| 73 # define cMGN "" |
| 74 # define cCYA "" |
| 75 # define cLGR "" |
| 76 # define cGRA "" |
| 77 # define cLRD "" |
| 78 # define cLGN "" |
| 79 # define cYEL "" |
| 80 # define cLBL "" |
| 81 # define cPIN "" |
| 82 # define cLCY "" |
| 83 # define cBRI "" |
| 84 # define cRST "" |
| 85 |
| 86 # define bgBLK "" |
| 87 # define bgRED "" |
| 88 # define bgGRN "" |
| 89 # define bgBRN "" |
| 90 # define bgBLU "" |
| 91 # define bgMGN "" |
| 92 # define bgCYA "" |
| 93 # define bgLGR "" |
| 94 # define bgGRA "" |
| 95 # define bgLRD "" |
| 96 # define bgLGN "" |
| 97 # define bgYEL "" |
| 98 # define bgLBL "" |
| 99 # define bgPIN "" |
| 100 # define bgLCY "" |
| 101 # define bgBRI "" |
| 102 |
| 103 #endif /* ^USE_COLOR */ |
| 104 |
| 105 /************************* |
| 106 * Box drawing sequences * |
| 107 *************************/ |
| 108 |
| 109 #ifdef FANCY_BOXES |
| 110 |
| 111 # define SET_G1 "\x1b)0" /* Set G1 for box drawing */ |
| 112 # define RESET_G1 "\x1b)B" /* Reset G1 to ASCII */ |
| 113 # define bSTART "\x0e" /* Enter G1 drawing mode */ |
| 114 # define bSTOP "\x0f" /* Leave G1 drawing mode */ |
| 115 # define bH "q" /* Horizontal line */ |
| 116 # define bV "x" /* Vertical line */ |
| 117 # define bLT "l" /* Left top corner */ |
| 118 # define bRT "k" /* Right top corner */ |
| 119 # define bLB "m" /* Left bottom corner */ |
| 120 # define bRB "j" /* Right bottom corner */ |
| 121 # define bX "n" /* Cross */ |
| 122 # define bVR "t" /* Vertical, branch right */ |
| 123 # define bVL "u" /* Vertical, branch left */ |
| 124 # define bHT "v" /* Horizontal, branch top */ |
| 125 # define bHB "w" /* Horizontal, branch bottom */ |
| 126 |
| 127 #else |
| 128 |
| 129 # define SET_G1 "" |
| 130 # define RESET_G1 "" |
| 131 # define bSTART "" |
| 132 # define bSTOP "" |
| 133 # define bH "-" |
| 134 # define bV "|" |
| 135 # define bLT "+" |
| 136 # define bRT "+" |
| 137 # define bLB "+" |
| 138 # define bRB "+" |
| 139 # define bX "+" |
| 140 # define bVR "+" |
| 141 # define bVL "+" |
| 142 # define bHT "+" |
| 143 # define bHB "+" |
| 144 |
| 145 #endif /* ^FANCY_BOXES */ |
| 146 |
| 147 /*********************** |
| 148 * Misc terminal codes * |
| 149 ***********************/ |
| 150 |
| 151 #define TERM_HOME "\x1b[H" |
| 152 #define TERM_CLEAR TERM_HOME "\x1b[2J" |
| 153 #define cEOL "\x1b[0K" |
| 154 #define CURSOR_HIDE "\x1b[?25l" |
| 155 #define CURSOR_SHOW "\x1b[?25h" |
| 156 |
| 157 /************************ |
| 158 * Debug & error macros * |
| 159 ************************/ |
| 160 |
| 161 /* Just print stuff to the appropriate stream. */ |
| 162 |
| 163 #ifdef MESSAGES_TO_STDOUT |
| 164 # define SAYF(x...) printf(x) |
| 165 #else |
| 166 # define SAYF(x...) fprintf(stderr, x) |
| 167 #endif /* ^MESSAGES_TO_STDOUT */ |
| 168 |
| 169 /* Show a prefixed warning. */ |
| 170 |
| 171 #define WARNF(x...) do { \ |
| 172 SAYF(cYEL "[!] " cBRI "WARNING: " cRST x); \ |
| 173 SAYF(cRST "\n"); \ |
| 174 } while (0) |
| 175 |
| 176 /* Show a prefixed "doing something" message. */ |
| 177 |
| 178 #define ACTF(x...) do { \ |
| 179 SAYF(cLBL "[*] " cRST x); \ |
| 180 SAYF(cRST "\n"); \ |
| 181 } while (0) |
| 182 |
| 183 /* Show a prefixed "success" message. */ |
| 184 |
| 185 #define OKF(x...) do { \ |
| 186 SAYF(cLGN "[+] " cRST x); \ |
| 187 SAYF(cRST "\n"); \ |
| 188 } while (0) |
| 189 |
| 190 /* Show a prefixed fatal error message (not used in afl). */ |
| 191 |
| 192 #define BADF(x...) do { \ |
| 193 SAYF(cLRD "\n[-] " cRST x); \ |
| 194 SAYF(cRST "\n"); \ |
| 195 } while (0) |
| 196 |
| 197 /* Die with a verbose non-OS fatal error message. */ |
| 198 |
| 199 #define FATAL(x...) do { \ |
| 200 SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD "\n[-] PROGRAM ABORT : " \ |
| 201 cBRI x); \ |
| 202 SAYF(cLRD "\n Location : " cRST "%s(), %s:%u\n\n", \ |
| 203 __FUNCTION__, __FILE__, __LINE__); \ |
| 204 exit(1); \ |
| 205 } while (0) |
| 206 |
| 207 /* Die by calling abort() to provide a core dump. */ |
| 208 |
| 209 #define ABORT(x...) do { \ |
| 210 SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD "\n[-] PROGRAM ABORT : " \ |
| 211 cBRI x); \ |
| 212 SAYF(cLRD "\n Stop location : " cRST "%s(), %s:%u\n\n", \ |
| 213 __FUNCTION__, __FILE__, __LINE__); \ |
| 214 abort(); \ |
| 215 } while (0) |
| 216 |
| 217 /* Die while also including the output of perror(). */ |
| 218 |
| 219 #define PFATAL(x...) do { \ |
| 220 fflush(stdout); \ |
| 221 SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD "\n[-] SYSTEM ERROR : " \ |
| 222 cBRI x); \ |
| 223 SAYF(cLRD "\n Stop location : " cRST "%s(), %s:%u\n", \ |
| 224 __FUNCTION__, __FILE__, __LINE__); \ |
| 225 SAYF(cLRD " OS message : " cRST "%s\n", strerror(errno)); \ |
| 226 exit(1); \ |
| 227 } while (0) |
| 228 |
| 229 /* Die with FAULT() or PFAULT() depending on the value of res (used to |
| 230 interpret different failure modes for read(), write(), etc). */ |
| 231 |
| 232 #define RPFATAL(res, x...) do { \ |
| 233 if (res < 0) PFATAL(x); else FATAL(x); \ |
| 234 } while (0) |
| 235 |
| 236 /* Error-checking versions of read() and write() that call RPFATAL() as |
| 237 appropriate. */ |
| 238 |
| 239 #define ck_write(fd, buf, len, fn) do { \ |
| 240 u32 _len = (len); \ |
| 241 s32 _res = write(fd, buf, _len); \ |
| 242 if (_res != _len) RPFATAL(_res, "Short write to %s", fn); \ |
| 243 } while (0) |
| 244 |
| 245 #define ck_read(fd, buf, len, fn) do { \ |
| 246 u32 _len = (len); \ |
| 247 s32 _res = read(fd, buf, _len); \ |
| 248 if (_res != _len) RPFATAL(_res, "Short read from %s", fn); \ |
| 249 } while (0) |
| 250 |
| 251 #endif /* ! _HAVE_DEBUG_H */ |
OLD | NEW |