modules/er/erroutines.h

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

FUNCTIONS

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

   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;
     /* [<][>][^][v][top][bottom][index][help] */
  49 #else
  50 #define EXTDEF extern 
  51 #define EXTINI(a,b) extern a;
     /* [<][>][^][v][top][bottom][index][help] */
  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 }
     /* [<][>][^][v][top][bottom][index][help] */
 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      
     /* [<][>][^][v][top][bottom][index][help] */
 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))
     /* [<][>][^][v][top][bottom][index][help] */
 186 
 187 
 188 void ER_init(int argc, char **argv);
 189 
 190 #define ER_dbg_eq(mod, asp, typ, expr)  \
     /* [<][>][^][v][top][bottom][index][help] */
 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 */

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