Source File er/erroutines.h

    1    | /***************************************
    2    |   $Revision: 1.21 $
    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,2000,2001,2002               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;
    62   | #else
    63   | #define EXTDEF extern
    64   | #define EXTINI(a,b) extern a;
    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 }
    190  | #define ER_LASTTXT {-1}	/* macro for use in error text arrays */
    191  | #define ERDUP(a) a, #a
    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)  \
    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))
    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 */