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;
55 | #else
56 | #define EXTDEF extern
57 | #define EXTINI(a,b) extern a;
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 }
187 | #define ER_LASTTXT {-1} /* macro for use in error text arrays */
188 | #define ERDUP(a) a, #a
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) \
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))
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 */