## 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.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] */