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