/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following functions.
- er_mask_t
- er_ret_t
- ER_PATH_SOCK
- ER_PATH_BUFPTR
- ER_PATH_NAME
- ER_PATH_EXEC
- ER_PATH_SYSLOG
- ER_PATH_CIRC
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;
/* [<][>][^][v][top][bottom][index][help] */
36 typedef int er_ret_t;
/* [<][>][^][v][top][bottom][index][help] */
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 */
/* [<][>][^][v][top][bottom][index][help] */
73 ER_PATH_BUFPTR, /* buffered file access via a FILE structure */
/* [<][>][^][v][top][bottom][index][help] */
74 ER_PATH_NAME, /* buffered file access via a file name
/* [<][>][^][v][top][bottom][index][help] */
75 (file reopened for every message) */
76 ER_PATH_EXEC, /* message constructed, send to stdin of the command
/* [<][>][^][v][top][bottom][index][help] */
77 at the end or after one message depending on options */
78 ER_PATH_SYSLOG, /* syslog msg sent at every message */
/* [<][>][^][v][top][bottom][index][help] */
79 ER_PATH_CIRC
/* [<][>][^][v][top][bottom][index][help] */
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 */