1 | /***************************************
2 | $Revision: 1.19 $
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 |
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 <glib.h>
47 | #include <pthread.h>
48 |
49 | #include <bitmask.h>
50 | #include <stubs.h>
51 |
52 | #include "thread.h"
53 |
54 | #ifdef HAVE_PTHREAD_H
55 | #include <pthread.h>
56 | #endif
57 |
58 | #ifdef ER_IMPL
59 | #define EXTDEF
60 | #define EXTINI(a,b) a = b;
61 | #else
62 | #define EXTDEF extern
63 | #define EXTINI(a,b) extern a;
64 | #endif
65 |
66 | #ifdef __cplusplus
67 | extern "C" {
68 | #endif
69 |
70 | typedef enum {
71 | ER_PATH_SOCK, /* unbuffered file/socket access via a file descriptor */
72 | ER_PATH_BUFPTR, /* buffered file access via a FILE structure */
73 | ER_PATH_NAME, /* buffered file access via a file name
74 | (file reopened for every message) */
75 | ER_PATH_EXEC, /* message constructed, send to stdin of the command
76 | at the end or after one message depending on options */
77 | ER_PATH_SYSLOG, /* syslog msg sent at every message */
78 | ER_PATH_CIRC
79 | } er_path_mt;
80 |
81 | EXTDEF char *er_pathtypes[]
82 | #ifdef ER_IMPL
83 | = {
84 | "SOCK", /* MUST BE IN SYNC WITH THE ABOVE */
85 | "BUFPTR",
86 | "NAME",
87 | "EXEC",
88 | "SYSLOG",
89 | "CIRC",
90 | NULL
91 | }
92 | #endif
93 | ;
94 |
95 | typedef union {
96 | struct {
97 | int fd; /* int filedescr */
98 | } sock;
99 | struct {
100 | FILE *fp; /* FILE* fp for FILEBUFPTR */
101 | } bufptr;
102 | struct {
103 | char filename[80]; /* filename for FILEBUFNAM */
104 | int date; /* 'DATE' option - construct a filename */
105 | } name;
106 | struct {
107 | int usepath;
108 | char **argv; /* parameters for exec - XXX DYNAMIC!!!! */
109 | } exec;
110 | struct {
111 | int facility; /* openlog(3) parameters for SYSLOG */
112 | int logopt;
113 | char ident[32];
114 | } syslog;
115 | } er_path_descr_t;
116 |
117 | typedef struct {
118 | char name[32];
119 | char active;
120 | int format;
121 | pthread_mutex_t mutex;
122 | er_path_mt type;
123 | er_path_descr_t descr;
124 | GList *filters;
125 | } er_path_t;
126 |
127 | typedef struct {
128 | mask_t fac_mask;
129 | er_mask_t asp_mask;
130 | int sev_min;
131 | int sev_max;
132 | pthread_t thr_id;
133 | /* unsigned err; -- a specific error code - or 0 to mean all errors */
134 | } er_filter_t;
135 |
136 | typedef struct {
137 | char errtxt[1024];
138 | int errpos;
139 | char *token;
140 | er_path_t path;
141 | er_filter_t curfilt;
142 | int sock;
143 | } lexerr_t;
144 |
145 |
146 |
147 | #define MNELEN 16
148 | typedef struct {
149 | er_ret_t code;
150 | char mnem[MNELEN];
151 | char text[80];
152 | } er_list_t;
153 |
154 |
155 | typedef struct {
156 | er_ret_t code;
157 | char name[4];
158 | char desc[80];
159 | er_list_t *errs;
160 | } er_fac_t;
161 |
162 |
163 | #define ER_SEV_F 0x20000000 /*+ fatal error +*/
164 | #define ER_SEV_E 0x10000000 /*+ error +*/
165 | #define ER_SEV_W 0x08000000 /*+ warning +*/
166 | #define ER_SEV_I 0x04000000 /*+ information +*/
167 | #define ER_SEV_D 0x02000000 /*+ debug message +*/
168 | #define ER_SEV_L 0x01000000 /*+ library error +*/
169 |
170 |
171 | /* macro to see if the code is OK -- masks out the facility and compares,
172 | assuming all OK codes within the facilities are 0
173 | */
174 |
175 |
176 |
177 | #define ER_SEV_TXT 20
178 |
179 | #define ER_MSGLEN 384
180 | #define ER_ERRLEN 2048
181 |
182 | typedef struct {
183 | int sev;
184 | char chr[2];
185 | char txt[ER_SEV_TXT];
186 | } er_level_t;
187 |
188 | #define DEFFAC(a,b) { FAC_##a, #a, b, a##_mod_err }
189 | #define ER_LASTTXT {-1} /* macro for use in error text arrays */
190 | #define ERDUP(a) a, #a
191 | #include "er_facilities.h"
192 | /* the macro expects two arguments:
193 | capital letters symbol of the facility
194 | short (<80 chars) description
195 | which then are expanded, eg. DEFFAC(TT, "test facility") expands to:
196 | { FAC_TT , "TT", "test facility" , NULL} ,
197 | Therefore, the FAC_TT must be defined in the enum below.
198 | The er_fac_code_t enum must begin with FAC_NONE=0
199 | and must end with FAC_LAST.
200 | The er_fac_err array must end with FAC_NONE.
201 |
202 | The user code must contain INITFAC(a) call early in the code that
203 | sets the pointer to the respective ??_mod_err array. There is nothing
204 | wrong in calling it twice, so don't hesitate if you must do it.
205 |
206 | After a facility number changes (eg. because another one was added or
207 | deleted before yours) ALL your code must be recompiled before linking.
208 | */
209 |
210 |
211 | #include "er_aspects.h"
212 | #include "er_formats.h"
213 |
214 | #ifndef ER_IMPL /* for client modules */
215 | extern er_level_t er_level_a[];
216 | #else /* full definition */
217 | er_level_t er_level_a[] = {
218 | { ER_SEV_F, "F" , "fatal error" },
219 | { ER_SEV_E, "E" , "error" },
220 | { ER_SEV_W, "W" , "warning" },
221 | { ER_SEV_I, "I" , "information" },
222 | { ER_SEV_D, "D" , "debug msg" },
223 | { ER_SEV_L, "L" , "library err" },
224 | { 0, "-" , "BUG! no such sev 0" }
225 | };
226 | #endif /* ER_IMPL */
227 |
228 |
229 | /*************************************************************************/
230 |
231 | EXTINI(GList *er_pathlist , NULL)
232 | EXTDEF er_mask_t er_asparray[FAC_LAST];
233 | EXTDEF rw_lock_t er_paths_lock;
234 | EXTINI(GHashTable *er_macro_hash, NULL)
235 |
236 | #ifdef ER_IMPL
237 |
238 | /* global vars !!!!! must be set for reporting purposes.
239 | Must be initialised in main() by ER_init().
240 | */
241 | char er_progname[32];
242 | char er_pid[16];
243 |
244 | /* those are private variables */
245 | pthread_mutex_t er_pathlist_mutex = PTHREAD_MUTEX_INITIALIZER;
246 | #endif
247 |
248 |
249 |
250 |
251 | void ER_init(char *progname, int processdefs);
252 |
253 | #define ER_dbg_eq(mod, asp, typ, expr) \
254 | ER_dbg_va (mod, asp, #expr " = " typ, expr)
255 |
256 | void ER_perror(er_fac_code_t facwhere, int errcode, char *format,...)
257 | #ifdef __GNUC__ /* let gcc check the format string for problems */
258 | __attribute__ ((format (printf, 3, 4)))
259 | #endif
260 | ;
261 | void ER_dbg_va(er_fac_code_t facwhere, er_mask_t asp, char *txt, ...);
262 | void ER_inf_va(er_fac_code_t facwhere, er_mask_t asp, char *txt, ...);
263 | int ER_anybody_wants(er_fac_code_t facwhere, int errcode, er_mask_t asp );
264 | int ER_is_traced(er_fac_code_t facwhere, er_mask_t asp);
265 |
266 | void ER_setpath(er_path_t *newset);
267 |
268 | int NOERR(er_ret_t a);
269 | #define ERR(a) (!NOERR(a))
270 |
271 | char *er_getsevsym( int sev, int mode );
272 | char *er_getfacsym(er_fac_code_t faccode);
273 | er_mask_t er_getfacval(char *key);
274 | unsigned int er_getaspval(char *key);
275 | er_path_mt er_getpathval(char *key);
276 |
277 | er_ret_t er_add_filter( er_path_t *pathptr, er_filter_t *filter );
278 | er_ret_t er_add_path( er_path_t *pathptr, char *key );
279 |
280 | #ifdef __cplusplus
281 | }
282 | #endif
283 |
284 | #undef EXTDEF
285 | #undef EXTINI
286 | #endif /* ER_H */