include/erroutines.h

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. EXTINI
  2. EXTINI
  3. DEFFAC
  4. ERDUP
  5. ER_dbg_eq
  6. ERR

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

/* [<][>][^][v][top][bottom][index][help] */