modules/er/erroutines.h
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- EXTINI
- EXTINI
- DEFFAC
- ERDUP
- ERR
- 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 */