add "get base" function for Class memory block extensions
[oonf.git] / src-api / core / oonf_logging.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon version 2 (olsrd2)
4  * Copyright (c) 2004-2015, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 /**
43  * @file
44  */
45
46 #ifndef OONF_LOGGING_H_
47 #define OONF_LOGGING_H_
48
49 struct oonf_log_handler_entry;
50
51 #include "string.h"
52
53 #include "common/common_types.h"
54 #include "common/autobuf.h"
55 #include "common/list.h"
56 #include "core/oonf_appdata.h"
57 #include "core/oonf_libdata.h"
58
59 /**
60  * defines the severity of a logging event
61  */
62 enum oonf_log_severity {
63   LOG_SEVERITY_MIN   = 1<<0,
64   LOG_SEVERITY_DEBUG = 1<<0,
65   LOG_SEVERITY_INFO  = 1<<1,
66   LOG_SEVERITY_WARN  = 1<<2,
67   LOG_SEVERITY_MAX   = 1<<2,
68 };
69
70 /*! Defines the builtin sources of a logging event. */
71 enum oonf_log_source {
72   /*! all logging sources */
73   LOG_ALL,
74
75   /*! the 'default' logging source */
76   LOG_MAIN,
77
78   /*! logging sources for the core */
79   LOG_LOGGING,
80   LOG_CONFIG,
81   LOG_PLUGINS,
82   LOG_SUBSYSTEMS,
83
84   /*! this one must be the last ones of the normal enums ! */
85   LOG_CORESOURCE_COUNT,
86
87   /*! maximum number of logging sources supported by API */
88   LOG_MAXIMUM_SOURCES = 128,
89 };
90
91 /**
92  * Parameters for logging handler call
93  */
94 struct oonf_log_parameters {
95   /*! severity of logging event */
96   enum oonf_log_severity severity;
97
98   /*! source of logging event */
99   enum oonf_log_source source;
100
101   /*! true if no header should be added to logging event */
102   bool no_header;
103
104   /*! file where the logging event happened */
105   const char *file;
106
107   /*! line number where the logging event happened */
108   int line;
109
110   /*! logging output */
111   char *buffer;
112
113   /*! number of bytes used for the timestamp in the buffer */
114   int timeLength;
115
116   /*! number of bytes used for the logging prefix in the buffer */
117   int prefixLength;
118 };
119
120 /*
121  * macros to check which logging levels are active
122  *
123  * #ifdef OONF_LOG_DEBUG_INFO
124  *   // variable only necessary for logging level debug and info
125  *   struct netaddr_str buf;
126  * #endif
127  *
128  *  * #ifdef OONF_LOG_INFO
129  *   // variable only necessary for logging level info
130  *   struct netaddr_str buf2;
131  * #endif
132  */
133
134 /**
135  * these macros should be used to generate OONF logging output
136  * the OONF_severity_NH() variants don't print the timestamp/file/line header,
137  * which can be used for multiline output.
138  *
139  * OONF_DEBUG should be used for all output that is only usefull for debugging a specific
140  * part of the code. This could be information about the internal progress of a function,
141  * state of variables, ...
142  *
143  * OONF_INFO should be used for all output that does not inform the user about a
144  * problem/error in OONF. Examples would be "SPF run triggered" or "Hello package received
145  * from XXX.XXX.XXX.XXX".
146  *
147  * OONF_WARN should be used for all error messages.
148  */
149
150 #ifndef BASEPATH_LENGTH
151 #define BASEPATH_LENGTH 0
152 #endif
153
154 /**
155  * Helper macro to define a logging macro
156  * @param severity logging severity
157  * @param source logging source
158  * @param no_header true if the header should not be printed
159  * @param hexptr pointer to buffer that should be hexdumped, NULL if no hexdump
160  * @param hexlen length of buffer to be hexdumped, 0 if no hexdump
161  * @param format printf style format string
162  * @param args variable number of parameters for format string
163  */
164 #define _OONF_LOG(severity, source, no_header, hexptr, hexlen, format, args...) do { if (oonf_log_mask_test(log_global_mask, source, severity)) oonf_log(severity, source, no_header, &__FILE__[BASEPATH_LENGTH], __LINE__, hexptr, hexlen, format, ##args); } while(0)
165
166 #ifdef OONF_LOG_DEBUG_INFO
167 /**
168  * Add a DEBUG level logging to the log handlers
169  * @param source logging source
170  * @param format printf style format string
171  * @param args variable number of parameters for format string
172  */
173 #define OONF_DEBUG(source, format, args...) _OONF_LOG(LOG_SEVERITY_DEBUG, source, false, NULL, 0, format, ##args)
174
175 /**
176  * Add a DEBUG level logging without header to the log handlers
177  * @param source logging source
178  * @param format printf style format string
179  * @param args variable number of parameters for format string
180  */
181 #define OONF_DEBUG_NH(source, format, args...) _OONF_LOG(LOG_SEVERITY_DEBUG, source, true, NULL, 0, format, ##args)
182
183 /**
184  * Add a DEBUG level logging and a hexdump to the log handlers
185  * @param source logging source
186  * @param hexptr pointer to buffer that should be hexdumped
187  * @param hexlen length of buffer to be hexdumped
188  * @param format printf style format string
189  * @param args variable number of parameters for format string
190  */
191 #define OONF_DEBUG_HEX(source, hexptr, hexlen, format, args...) _OONF_LOG(LOG_SEVERITY_DEBUG, source, false, hexptr, hexlen, format, ##args)
192
193 /**
194  * Checks if a logging source should produce DEBUG level output
195  * @param source logging source
196  * @return true if DEBUG logging is active for source, false otherwise
197  */
198 #define OONF_TEST_DEBUG(source) oonf_log_mask_test(log_global_mask, source, LOG_SEVERITY_DEBUG)
199 #else
200 /**
201  * Add a DEBUG level logging to the log handlers
202  * @param source logging source
203  * @param format printf style format string
204  * @param args variable number of parameters for format string
205  */
206 #define OONF_DEBUG(source, format, args...) do { } while(0)
207
208 /**
209  * Add a DEBUG level logging without header to the log handlers
210  * @param source logging source
211  * @param format printf style format string
212  * @param args variable number of parameters for format string
213  */
214 #define OONF_DEBUG_NH(source, format, args...) do { } while(0)
215
216 /**
217  * Add a DEBUG level logging and a hexdump to the log handlers
218  * @param source logging source
219  * @param hexptr pointer to buffer that should be hexdumped
220  * @param hexlen length of buffer to be hexdumped
221  * @param format printf style format string
222  * @param args variable number of parameters for format string
223  */
224 #define OONF_DEBUG_HEX(source, hexptr, hexlen, format, args...) do { } while(0)
225
226 /**
227  * Checks if a logging source should produce DEBUG level output
228  * @param source logging source
229  * @return true if DEBUG logging is active for source, false otherwise
230  */
231 #define OONF_TEST_DEBUG(source) false
232 #endif
233
234 #ifdef OONF_LOG_INFO
235 /**
236  * Add a INFO level logging to the log handlers
237  * @param source logging source
238  * @param format printf style format string
239  * @param args variable number of parameters for format string
240  */
241 #define OONF_INFO(source, format, args...) _OONF_LOG(LOG_SEVERITY_INFO, source, false, NULL, 0, format, ##args)
242
243 /**
244  * Add a INFO level logging without header to the log handlers
245  * @param source logging source
246  * @param format printf style format string
247  * @param args variable number of parameters for format string
248  */
249 #define OONF_INFO_NH(source, format, args...) _OONF_LOG(LOG_SEVERITY_INFO, source, true, NULL, 0, format, ##args)
250
251 /**
252  * Add a INFO level logging and a hexdump to the log handlers
253  * @param source logging source
254  * @param hexptr pointer to buffer that should be hexdumped
255  * @param hexlen length of buffer to be hexdumped
256  * @param format printf style format string
257  * @param args variable number of parameters for format string
258  */
259 #define OONF_INFO_HEX(source, hexptr, hexlen, format, args...) _OONF_LOG(LOG_SEVERITY_INFO, source, false, hexptr, hexlen, format, ##args)
260
261 /**
262  * Checks if a logging source should produce INFO level output
263  * @param source logging source
264  * @return true if INFO logging is active for source, false otherwise
265  */
266 #define OONF_TEST_INFO(source) oonf_log_mask_test(log_global_mask, source, LOG_SEVERITY_INFO)
267 #else
268 /**
269  * Add a INFO level logging to the log handlers
270  * @param source logging source
271  * @param format printf style format string
272  * @param args variable number of parameters for format string
273  */
274 #define OONF_INFO(source, format, args...) do { } while(0)
275
276 /**
277  * Add a INFO level logging without header to the log handlers
278  * @param source logging source
279  * @param format printf style format string
280  * @param args variable number of parameters for format string
281  */
282 #define OONF_INFO_NH(source, format, args...) do { } while(0)
283
284 /**
285  * Add a INFO level logging and a hexdump to the log handlers
286  * @param source logging source
287  * @param hexptr pointer to buffer that should be hexdumped
288  * @param hexlen length of buffer to be hexdumped
289  * @param format printf style format string
290  * @param args variable number of parameters for format string
291  */
292 #define OONF_INFO_HEX(source, hexptr, hexlen, format, args...) do { } while(0)
293
294 /**
295  * Checks if a logging source should produce INFO level output
296  * @param source logging source
297  * @return true if INFO logging is active for source, false otherwise
298  */
299 #define OONF_TEST_INFO(source) false
300 #endif
301
302 /**
303  * Add a WARN level logging to the log handlers
304  * @param source logging source
305  * @param format printf style format string
306  * @param args variable number of parameters for format string
307  */
308 #define OONF_WARN(source, format, args...) _OONF_LOG(LOG_SEVERITY_WARN, source, false, NULL, 0, format, ##args)
309
310 /**
311  * Add a WARN level logging without header to the log handlers
312  * @param source logging source
313  * @param format printf style format string
314  * @param args variable number of parameters for format string
315  */
316 #define OONF_WARN_NH(source, format, args...) _OONF_LOG(LOG_SEVERITY_WARN, source, true, NULL, 0, format, ##args)
317
318 /**
319  * Add a WARN level logging and a hexdump to the log handlers
320  * @param source logging source
321  * @param hexptr pointer to buffer that should be hexdumped
322  * @param hexlen length of buffer to be hexdumped
323  * @param format printf style format string
324  * @param args variable number of parameters for format string
325  */
326 #define OONF_WARN_HEX(source, hexptr, hexlen, format, args...) _OONF_LOG(LOG_SEVERITY_WARN, source, false, hexptr, hexlen, format, ##args)
327
328 /**
329  * Checks if a logging source should produce WARN level output
330  * @param source logging source
331  * @return always true
332  */
333 #define OONF_TEST_WARN(source) true
334
335 /**
336  * Definition of a logging handler
337  */
338 struct oonf_log_handler_entry {
339   /*! hook into global list of logging handlers */
340   struct list_entity _node;
341
342   /**
343    * Callback that handles a logging event
344    * @param pointer to this structure
345    * @param parameters for logging event
346    */
347   void (*handler)(struct oonf_log_handler_entry *entry, struct oonf_log_parameters *param);
348
349   /*! user_bitmask */
350   uint8_t user_bitmask[LOG_MAXIMUM_SOURCES];
351
352   /*! internal copy of user_bitmask */
353   uint8_t _processed_bitmask[LOG_MAXIMUM_SOURCES];
354
355   /*! custom data for user */
356   void *custom;
357 };
358
359 /**
360  * Buffer for text representation of walltime
361  */
362 struct oonf_walltime_str {
363   /*! string array for maximum length walltime */
364   char buf[sizeof("00:00:00.000")];
365 };
366
367 /**
368  * Macro to iterate over all logging severities
369  * This macro should be used similar to a for() or while() construct
370  * @param sev reference of log_severity variable,
371  *   will be used as the iterator variable
372  */
373 #define OONF_FOR_ALL_LOGSEVERITIES(sev) for (sev = LOG_SEVERITY_MIN; sev <= LOG_SEVERITY_MAX; sev <<= 1)
374
375 EXPORT extern uint8_t log_global_mask[LOG_MAXIMUM_SOURCES];
376 EXPORT extern const char *LOG_SOURCE_NAMES[LOG_MAXIMUM_SOURCES];
377 EXPORT extern const char *LOG_SEVERITY_NAMES[LOG_SEVERITY_MAX+1];
378
379 EXPORT int oonf_log_init(const struct oonf_appdata *, enum oonf_log_severity)
380   __attribute__((warn_unused_result));
381 EXPORT void oonf_log_cleanup(void);
382
383 EXPORT size_t oonf_log_get_max_severitytextlen(void);
384 EXPORT size_t oonf_log_get_max_sourcetextlen(void);
385 EXPORT size_t oonf_log_get_sourcecount(void);
386
387 EXPORT void oonf_log_addhandler(struct oonf_log_handler_entry *);
388 EXPORT void oonf_log_removehandler(struct oonf_log_handler_entry *);
389 EXPORT int oonf_log_register_source(const char *name);
390
391 EXPORT void oonf_log_updatemask(void);
392
393 EXPORT const struct oonf_appdata *oonf_log_get_appdata(void);
394 EXPORT const struct oonf_libdata *oonf_log_get_libdata(void);
395 EXPORT void oonf_log_printversion(struct autobuf *abuf);
396 EXPORT const char *oonf_log_get_walltime(struct oonf_walltime_str *);
397
398 EXPORT void oonf_log(enum oonf_log_severity, enum oonf_log_source, bool, const char *, int, const void *, size_t, const char *,  ...)
399   __attribute__ ((format(printf, 8, 9)));
400
401 EXPORT void oonf_log_stderr(struct oonf_log_handler_entry *,
402     struct oonf_log_parameters *);
403 EXPORT void oonf_log_syslog(struct oonf_log_handler_entry *,
404     struct oonf_log_parameters *);
405 EXPORT void oonf_log_file(struct oonf_log_handler_entry *,
406     struct oonf_log_parameters *);
407
408 /**
409  * Clear a logging mask
410  * @param mask pointer to logging mask
411  */
412 static INLINE void
413 oonf_log_mask_clear(uint8_t *mask) {
414   memset(mask, LOG_SEVERITY_WARN, LOG_MAXIMUM_SOURCES);
415 }
416
417 /**
418  * Copy a logging mask
419  * @param dst pointer to target logging mask
420  * @param src pointer to source logging mask
421  */
422 static INLINE void
423 oonf_log_mask_copy(uint8_t *dst, uint8_t *src) {
424   memcpy(dst, src, LOG_MAXIMUM_SOURCES);
425 }
426
427 /**
428  * Set a field in a logging mask
429  * @param mask pointer to logging mask
430  * @param src logging source
431  * @param sev logging severity
432  */
433 static INLINE void
434 oonf_log_mask_set(uint8_t *mask, enum oonf_log_source src, enum oonf_log_severity sev) {
435   mask[src] |= sev;
436 }
437
438 /**
439  * Reset a field in a logging mask
440  * @param mask pointer to logging mask
441  * @param src logging source
442  * @param sev logging severity
443  */
444 static INLINE void
445 oonf_log_mask_reset(uint8_t *mask, enum oonf_log_source src, enum oonf_log_severity sev) {
446   mask[src] &= ~sev;
447 }
448
449 /**
450  * Test a field in a logging mask
451  * @param mask pointer to logging mask
452  * @param src logging source
453  * @param sev logging severity
454  * @return true if the field was set, false otherwise
455  */
456 static INLINE bool
457 oonf_log_mask_test(uint8_t *mask, enum oonf_log_source src, enum oonf_log_severity sev) {
458   return (mask[src] & sev) != 0;
459 }
460
461 #endif /* OONF_LOGGING_H_ */