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. ER_dbg_eq
  6. ERR

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

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