1 | /*************************************** 2 | $Revision: 1.19 $ 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 | 35 | typedef unsigned int er_mask_t; 36 | typedef int er_ret_t; 37 | 38 | #include <stdio.h> 39 | #include <unistd.h> 40 | #include <stdlib.h> 41 | #include <assert.h> 42 | #include <time.h> 43 | #include <stdarg.h> 44 | #include <strings.h> 45 | 46 | #include <glib.h> 47 | #include <pthread.h> 48 | 49 | #include <bitmask.h> 50 | #include <stubs.h> 51 | 52 | #include "thread.h" 53 | 54 | #ifdef HAVE_PTHREAD_H 55 | #include <pthread.h> 56 | #endif 57 | 58 | #ifdef ER_IMPL 59 | #define EXTDEF 60 | #define EXTINI(a,b) a = b; 61 | #else 62 | #define EXTDEF extern 63 | #define EXTINI(a,b) extern a; 64 | #endif 65 | 66 | #ifdef __cplusplus 67 | extern "C" { 68 | #endif 69 | 70 | typedef enum { 71 | ER_PATH_SOCK, /* unbuffered file/socket access via a file descriptor */ 72 | ER_PATH_BUFPTR, /* buffered file access via a FILE structure */ 73 | ER_PATH_NAME, /* buffered file access via a file name 74 | (file reopened for every message) */ 75 | ER_PATH_EXEC, /* message constructed, send to stdin of the command 76 | at the end or after one message depending on options */ 77 | ER_PATH_SYSLOG, /* syslog msg sent at every message */ 78 | ER_PATH_CIRC 79 | } er_path_mt; 80 | 81 | EXTDEF char *er_pathtypes[] 82 | #ifdef ER_IMPL 83 | = { 84 | "SOCK", /* MUST BE IN SYNC WITH THE ABOVE */ 85 | "BUFPTR", 86 | "NAME", 87 | "EXEC", 88 | "SYSLOG", 89 | "CIRC", 90 | NULL 91 | } 92 | #endif 93 | ; 94 | 95 | typedef union { 96 | struct { 97 | int fd; /* int filedescr */ 98 | } sock; 99 | struct { 100 | FILE *fp; /* FILE* fp for FILEBUFPTR */ 101 | } bufptr; 102 | struct { 103 | char filename[80]; /* filename for FILEBUFNAM */ 104 | int date; /* 'DATE' option - construct a filename */ 105 | } name; 106 | struct { 107 | int usepath; 108 | char **argv; /* parameters for exec - XXX DYNAMIC!!!! */ 109 | } exec; 110 | struct { 111 | int facility; /* openlog(3) parameters for SYSLOG */ 112 | int logopt; 113 | char ident[32]; 114 | } syslog; 115 | } er_path_descr_t; 116 | 117 | typedef struct { 118 | char name[32]; 119 | char active; 120 | int format; 121 | pthread_mutex_t mutex; 122 | er_path_mt type; 123 | er_path_descr_t descr; 124 | GList *filters; 125 | } er_path_t; 126 | 127 | typedef struct { 128 | mask_t fac_mask; 129 | er_mask_t asp_mask; 130 | int sev_min; 131 | int sev_max; 132 | pthread_t thr_id; 133 | /* unsigned err; -- a specific error code - or 0 to mean all errors */ 134 | } er_filter_t; 135 | 136 | typedef struct { 137 | char errtxt[1024]; 138 | int errpos; 139 | char *token; 140 | er_path_t path; 141 | er_filter_t curfilt; 142 | int sock; 143 | } lexerr_t; 144 | 145 | 146 | 147 | #define MNELEN 16 148 | typedef struct { 149 | er_ret_t code; 150 | char mnem[MNELEN]; 151 | char text[80]; 152 | } er_list_t; 153 | 154 | 155 | typedef struct { 156 | er_ret_t code; 157 | char name[4]; 158 | char desc[80]; 159 | er_list_t *errs; 160 | } er_fac_t; 161 | 162 | 163 | #define ER_SEV_F 0x20000000 /*+ fatal error +*/ 164 | #define ER_SEV_E 0x10000000 /*+ error +*/ 165 | #define ER_SEV_W 0x08000000 /*+ warning +*/ 166 | #define ER_SEV_I 0x04000000 /*+ information +*/ 167 | #define ER_SEV_D 0x02000000 /*+ debug message +*/ 168 | #define ER_SEV_L 0x01000000 /*+ library error +*/ 169 | 170 | 171 | /* macro to see if the code is OK -- masks out the facility and compares, 172 | assuming all OK codes within the facilities are 0 173 | */ 174 | 175 | 176 | 177 | #define ER_SEV_TXT 20 178 | 179 | #define ER_MSGLEN 384 180 | #define ER_ERRLEN 2048 181 | 182 | typedef struct { 183 | int sev; 184 | char chr[2]; 185 | char txt[ER_SEV_TXT]; 186 | } er_level_t; 187 | 188 | #define DEFFAC(a,b) { FAC_##a, #a, b, a##_mod_err } 189 | #define ER_LASTTXT {-1} /* macro for use in error text arrays */ 190 | #define ERDUP(a) a, #a 191 | #include "er_facilities.h" 192 | /* the macro expects two arguments: 193 | capital letters symbol of the facility 194 | short (<80 chars) description 195 | which then are expanded, eg. DEFFAC(TT, "test facility") expands to: 196 | { FAC_TT , "TT", "test facility" , NULL} , 197 | Therefore, the FAC_TT must be defined in the enum below. 198 | The er_fac_code_t enum must begin with FAC_NONE=0 199 | and must end with FAC_LAST. 200 | The er_fac_err array must end with FAC_NONE. 201 | 202 | The user code must contain INITFAC(a) call early in the code that 203 | sets the pointer to the respective ??_mod_err array. There is nothing 204 | wrong in calling it twice, so don't hesitate if you must do it. 205 | 206 | After a facility number changes (eg. because another one was added or 207 | deleted before yours) ALL your code must be recompiled before linking. 208 | */ 209 | 210 | 211 | #include "er_aspects.h" 212 | #include "er_formats.h" 213 | 214 | #ifndef ER_IMPL /* for client modules */ 215 | extern er_level_t er_level_a[]; 216 | #else /* full definition */ 217 | er_level_t er_level_a[] = { 218 | { ER_SEV_F, "F" , "fatal error" }, 219 | { ER_SEV_E, "E" , "error" }, 220 | { ER_SEV_W, "W" , "warning" }, 221 | { ER_SEV_I, "I" , "information" }, 222 | { ER_SEV_D, "D" , "debug msg" }, 223 | { ER_SEV_L, "L" , "library err" }, 224 | { 0, "-" , "BUG! no such sev 0" } 225 | }; 226 | #endif /* ER_IMPL */ 227 | 228 | 229 | /*************************************************************************/ 230 | 231 | EXTINI(GList *er_pathlist , NULL) 232 | EXTDEF er_mask_t er_asparray[FAC_LAST]; 233 | EXTDEF rw_lock_t er_paths_lock; 234 | EXTINI(GHashTable *er_macro_hash, NULL) 235 | 236 | #ifdef ER_IMPL 237 | 238 | /* global vars !!!!! must be set for reporting purposes. 239 | Must be initialised in main() by ER_init(). 240 | */ 241 | char er_progname[32]; 242 | char er_pid[16]; 243 | 244 | /* those are private variables */ 245 | pthread_mutex_t er_pathlist_mutex = PTHREAD_MUTEX_INITIALIZER; 246 | #endif 247 | 248 | 249 | 250 | 251 | void ER_init(char *progname, int processdefs); 252 | 253 | #define ER_dbg_eq(mod, asp, typ, expr) \ 254 | ER_dbg_va (mod, asp, #expr " = " typ, expr) 255 | 256 | void ER_perror(er_fac_code_t facwhere, int errcode, char *format,...) 257 | #ifdef __GNUC__ /* let gcc check the format string for problems */ 258 | __attribute__ ((format (printf, 3, 4))) 259 | #endif 260 | ; 261 | void ER_dbg_va(er_fac_code_t facwhere, er_mask_t asp, char *txt, ...); 262 | void ER_inf_va(er_fac_code_t facwhere, er_mask_t asp, char *txt, ...); 263 | int ER_anybody_wants(er_fac_code_t facwhere, int errcode, er_mask_t asp ); 264 | int ER_is_traced(er_fac_code_t facwhere, er_mask_t asp); 265 | 266 | void ER_setpath(er_path_t *newset); 267 | 268 | int NOERR(er_ret_t a); 269 | #define ERR(a) (!NOERR(a)) 270 | 271 | char *er_getsevsym( int sev, int mode ); 272 | char *er_getfacsym(er_fac_code_t faccode); 273 | er_mask_t er_getfacval(char *key); 274 | unsigned int er_getaspval(char *key); 275 | er_path_mt er_getpathval(char *key); 276 | 277 | er_ret_t er_add_filter( er_path_t *pathptr, er_filter_t *filter ); 278 | er_ret_t er_add_path( er_path_t *pathptr, char *key ); 279 | 280 | #ifdef __cplusplus 281 | } 282 | #endif 283 | 284 | #undef EXTDEF 285 | #undef EXTINI 286 | #endif /* ER_H */