1 | /*************************************** 2 | $Revision: 1.12 $ 3 | 4 | Error reporting (er) erroutines.h - header file for error reporting. 5 | 6 | Status: NOT REVUED, TESTED, 7 | 8 | Design and implementation by: Marek Bukowy 9 | 10 | ******************/ /****************** 11 | Copyright (c) 1999 RIPE NCC 12 | 13 | All Rights Reserved 14 | 15 | Permission to use, copy, modify, and distribute this software and its 16 | documentation for any purpose and without fee is hereby granted, 17 | provided that the above copyright notice appear in all copies and that 18 | both that copyright notice and this permission notice appear in 19 | supporting documentation, and that the name of the author not be 20 | used in advertising or publicity pertaining to distribution of the 21 | software without specific, written prior permission. 22 | 23 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 24 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 25 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 26 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 27 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 28 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 29 | ***************************************/ 30 | 31 | #ifndef ER_H 32 | #define ER_H 33 | 34 | #include <stdio.h> 35 | #include <unistd.h> 36 | #include <stdlib.h> 37 | #include <assert.h> 38 | #include <time.h> 39 | #include <stdarg.h> 40 | #include <strings.h> 41 | 42 | #include <bitmask.h> 43 | #include <er_aspects.h> 44 | #include <stubs.h> 45 | 46 | #ifdef ER_IMPL 47 | #define EXTDEF 48 | #define EXTINI(a,b) a = b; 49 | #else 50 | #define EXTDEF extern 51 | #define EXTINI(a,b) extern a; 52 | #endif 53 | 54 | #ifdef __cplusplus 55 | extern "C" { 56 | #endif 57 | 58 | 59 | typedef unsigned int er_mask_t; 60 | 61 | typedef int er_ret_t; 62 | 63 | #define MNELEN 16 64 | typedef struct { 65 | er_ret_t code; 66 | char mnem[MNELEN]; 67 | char text[80]; 68 | } er_list_t; 69 | 70 | 71 | typedef struct { 72 | er_ret_t code; 73 | char name[4]; 74 | char desc[80]; 75 | er_list_t *errs; 76 | } er_main_t; 77 | 78 | #define ER_SEV_C 0x40000000 /*+ circular buffer dump +*/ 79 | #define ER_SEV_F 0x20000000 /*+ fatal error +*/ 80 | #define ER_SEV_E 0x10000000 /*+ error +*/ 81 | #define ER_SEV_W 0x08000000 /*+ warning +*/ 82 | #define ER_SEV_I 0x04000000 /*+ information +*/ 83 | #define ER_SEV_D 0x02000000 /*+ debug message +*/ 84 | #define ER_SEV_L 0x01000000 /*+ library error +*/ 85 | 86 | 87 | /* macro to see if the code is OK -- masks out the facility and compares, 88 | assuming all OK codes within the facilities are 0 89 | */ 90 | 91 | 92 | 93 | #define ER_SEV_TXT 20 94 | 95 | #define ER_MSGLEN 384 96 | #define ER_ERRLEN 2048 97 | 98 | typedef struct { 99 | int sev; 100 | char chr[2]; 101 | char txt[ER_SEV_TXT]; 102 | } er_level_t; 103 | 104 | #ifndef ER_IMPL /* for client modules */ 105 | extern er_level_t er_level_a[]; 106 | #else /* full definition */ 107 | er_level_t er_level_a[] = { 108 | { ER_SEV_C, "?" , "BUG! bad sev: circ" }, 109 | { ER_SEV_F, "F" , "fatal error" }, 110 | { ER_SEV_E, "E" , "error" }, 111 | { ER_SEV_W, "W" , "warning" }, 112 | { ER_SEV_I, "I" , "information" }, 113 | { ER_SEV_D, "D" , "debug msg" }, 114 | { ER_SEV_L, "L" , "library err" }, 115 | { 0, "-" , "BUG! no such sev 0" } 116 | }; 117 | #endif /* ER_IMPL */ 118 | 119 | #define DEFFAC(a,b) { FAC_##a, #a, b, a##_mod_err } 120 | 121 | /* the macro expects two arguments: 122 | capital letters symbol of the facility 123 | short (<80 chars) description 124 | which then are expanded, eg. DEFFAC(TT, "test facility") expands to: 125 | { FAC_TT , "TT", "test facility" , NULL} , 126 | Therefore, the FAC_TT must be defined in the enum below. 127 | The er_fac_code_t enum must begin with FAC_NONE=0 128 | and must end with FAC_LAST. 129 | The er_main_err array must end with FAC_NONE. 130 | 131 | The user code must contain INITFAC(a) call early in the code that 132 | sets the pointer to the respective ??_mod_err array. There is nothing 133 | wrong in calling it twice, so don't hesitate if you must do it. 134 | 135 | After a facility number changes (eg. because another one was added or 136 | deleted before yours) ALL your code must be recompiled before linking. 137 | */ 138 | 139 | #define ER_LASTTXT {-1} /* macro for use in error text arrays */ 140 | 141 | #define ERDUP(a) a, #a 142 | 143 | #include "er_facilities.h" 144 | 145 | /*************************************************************************/ 146 | 147 | /* mode values (bitmap: describes what kind of severity and mnemonic we 148 | want back. */ 149 | 150 | /* bits 0-1 (values 0-3) - severity: */ 151 | #define ER_M_SEVCHAR 1 /* one-letter severity indication */ 152 | #define ER_M_SEVLONG 2 /* long severity indication */ 153 | 154 | /* bit 2 (values 0 or 4) - mnemonic */ 155 | #define ER_M_MNEMONIC 4 156 | 157 | /* bit 3 (values 0 or 8) - error text */ 158 | #define ER_M_TEXTLONG 8 159 | 160 | /* bits 4-5 (values 0, 16, 32, 48) - user id's */ 161 | #define ER_M_UIDUID 16 162 | #define ER_M_UIDEUID 32 163 | 164 | /* bit 6 (values 0 or 64) - process id's */ 165 | #define ER_M_PIDFULL 64 166 | 167 | /* bit 7 (values 0 or 128) - facility symbol */ 168 | #define ER_M_FACSYMB 128 169 | 170 | 171 | /* bit 8 (values 0 or 256) - program name (argv[0]) */ 172 | #define ER_M_PROGNAME 256 173 | 174 | /* bit 9 (values 0 or 512) - current date and time */ 175 | #define ER_M_DATETIME 512 176 | 177 | #define ER_M_THR_ID 2048 178 | 179 | #define ER_M_DEFAULT (ER_M_DATETIME | ER_M_FACSYMB | ER_M_SEVCHAR \ 180 | | ER_M_MNEMONIC | ER_M_TEXTLONG | ER_M_PIDFULL \ 181 | | ER_M_THR_ID | ER_M_PROGNAME ) 182 | 183 | 184 | int NOERR(er_ret_t a); 185 | #define ERR(a) (!NOERR(a)) 186 | 187 | 188 | void ER_init(int argc, char **argv); 189 | 190 | #define ER_dbg_eq(mod, asp, typ, expr) \ 191 | ER_dbg_va (mod, asp, #expr " = " typ, expr) 192 | 193 | void ER_perror(int facwhere, int errcode, char *format,...); 194 | void ER_dbg_va( int facwhere, er_mask_t asp, char *txt, ...); 195 | void ER_inf_va( int facwhere, er_mask_t asp, char *txt, ...); 196 | int ER_anybody_wants( int facwhere, int errcode, er_mask_t asp ); 197 | int ER_is_traced(int facwhere, er_mask_t asp); 198 | 199 | /* This is just provisional ! */ 200 | typedef struct { 201 | FILE *fdes; 202 | /* file descriptor. This is REALLY provisional! */ 203 | int fac; /* facility */ 204 | er_mask_t asp; /* mask of aspects */ 205 | int sev; /* minimal severity */ 206 | int mode; /* bitmask of output mode - bits of information that 207 | should be printed */ 208 | } er_path_t; 209 | 210 | void ER_setpath(er_path_t *newset); 211 | 212 | #ifdef ER_IMPL 213 | 214 | /* global vars !!!!! must be set for reporting purposes. 215 | Must be initialised in main() by ER_init(). 216 | */ 217 | char er_progname[32]; 218 | char er_pid[16]; 219 | 220 | /* those are private variables */ 221 | 222 | er_path_t er_provisional_struct; 223 | pthread_mutex_t er_pathlist_mutex; 224 | int er_pathlist_mutex_initialised = 0; 225 | #endif 226 | 227 | #if 0 228 | 229 | typedef struct { 230 | mask_t fac_mask; 231 | mask_t asp_mask; 232 | int sev_min; 233 | int sev_max; 234 | unsigned err; /* a specific error code - or 0 to mean all errors */ 235 | } er_filter_t; 236 | 237 | 238 | enum { 239 | ER_PATH_UNBUF=1, /* unbuffered file/socket access via a file descriptor */ 240 | ER_PATH_BUFPTR, /* buffered file access via a FILE structure */ 241 | ER_PATH_BUFNAM, /* buffered file access via a file name 242 | (file reopened for every message) */ 243 | ER_PATH_EMAIL, /* e-mail constructed, send at the end or after one message 244 | depending on options */ 245 | ER_PATH_SYSLOG /* syslog msg sent at every message */ 246 | } er_path_mt; 247 | 248 | 249 | typedef struct { 250 | char active; 251 | pthread_mutex_t mutex; 252 | er_path_mt type; 253 | er_option_mt options; 254 | union { 255 | struct { 256 | int fd; /* int filedescr for FILEUNBUF */ 257 | } unbuf; 258 | struct { 259 | FILE *fp; /* FILE* fp for FILEBUFPTR */ 260 | } bufptr; 261 | struct { 262 | char filename[80]; /* filename for FILEBUFNAM */ 263 | } bufnam; 264 | struct { 265 | char address[80]; /* address(es) for EMAIL */ 266 | } email; 267 | struct { 268 | int facility; /* openlog(3) parameters for SYSLOG */ 269 | int logopt; 270 | char ident[32]; 271 | } syslog; 272 | } desc; 273 | } er_path_t; 274 | 275 | 276 | #endif /* if 0 */ 277 | 278 | #ifdef __cplusplus 279 | } 280 | #endif 281 | 282 | 283 | 284 | #undef EXTDEF 285 | #undef EXTINI 286 | #endif /* ER_H */