6a476e6ecc621670e9a4ff054eef0458cd506b13
[silc.git] / lib / silcutil / silclog.h
1 /*
2
3   silclog.h
4
5   Author: Johnny Mnemonic <johnny@themnemonic.org>
6
7   Copyright (C) 1997 - 2002 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19 */
20
21 /****h* silcutil/SilcLogAPI
22  *
23  * DESCRIPTION
24  *
25  * The SILC logging APIs provide a powerful and easy-to-use interface to
26  * the logging system and debugging output.
27  *
28  ***/
29
30 #ifndef SILCLOG_H
31 #define SILCLOG_H
32
33 /****d* silcutil/SilcLogAPI/SilcLogType
34  *
35  * NAME
36  *
37  *    typedef enum { ... } SilcLogType;
38  *
39  * DESCRIPTION
40  *
41  *    This is the main logging channel id. There are currently four known
42  *    logging channels (plus the debugging output channel), and they are
43  *    ordered by importance.
44  *    See the source code for SILC coding conventions about how choosing
45  *    the right output channel.
46  *
47  * SOURCE
48  */
49 typedef enum {
50   /* Generic info channel file */
51   SILC_LOG_INFO,
52
53   /* This should be used for warnings and non critical failures */
54   SILC_LOG_WARNING,
55
56   /* Generic error and critical failures messages */
57   SILC_LOG_ERROR,
58
59   /* Fatal messages (usually situations that will lead to a program crash */
60   SILC_LOG_FATAL,
61
62   /* Total logging channels */
63   SILC_LOG_MAX
64 } SilcLogType;
65 /***/
66
67 /****f* silcutil/SilcLogAPI/SilcLogCb
68  *
69  * SYNOPSIS
70  *
71  *    typedef bool (*SilcLogCb)(SilcLogType type, char *message,
72  *                              void *context);
73  *
74  * DESCRIPTION
75  *
76  *    The logging custom callback function.  The `type' is the channel ID
77  *    that triggered the event, which allows you to use the same callback
78  *    function for multiple logging channels.
79  *    The `message' parameter points to a null-terminated buffer containing
80  *    the received message, while `context' is the caller-specified context.
81  *    The message must not be modified or freed by the callback function.
82  *
83  * SEE ALSO
84  *    silc_log_set_callback
85  *
86  ***/
87 typedef bool (*SilcLogCb)(SilcLogType type, char *message, void *context);
88
89 /****f* silcutil/SilcLogAPI/SilcLogDebugCb
90  *
91  * SYNOPSIS
92  *
93  *    typedef bool (*SilcLogDebugCb)(char *file, char *function, int line,
94  *                                   char *message, void *context);
95  *
96  * DESCRIPTION
97  *
98  *    The debug logging callback function.  The default behaviour is to
99  *    output messages to stderr.  `file', `function', and `line' are the
100  *    corresponding offsets in the source files.  `message' points to a
101  *    null-terminated buffer containing the debugging message, and `context'
102  *    is the caller-specified context.
103  *    The message must not be modified or freed by the callback function.
104  *    If the function returns TRUE, SilcLog will assume the message as handled
105  *    and won't run its default handler.
106  *
107  * SEE ALSO
108  *    silc_debug, silc_log_set_debug_callbacks
109  *
110  ***/
111 typedef bool (*SilcLogDebugCb)(char *file, char *function, int line,
112                                char *message, void *context);
113
114 /****f* silcutil/SilcLogAPI/SilcLogHexdumpCb
115  *
116  * SYNOPSIS
117  *
118  *    typedef bool (*SilcDebugHexdumpCb)(char *file, char *function, int line,
119  *                                       unsigned char *data, uint32 data_len,
120  *                                       char *message, void *context;
121  *
122  * DESCRIPTION
123  *
124  *    The hexdump logging callback function.  The default behaviour is to
125  *    print a formatted hexdump to stderr, and is commonly what you would it
126  *    like to be.  `file', `function', and `line' are the corresponding
127  *    offsets in the source files.  `data' is the begin of the buffer that
128  *    should be hexdumped, which is `data_len' bytes long.
129  *    The `message' parameter points to a null-terminated buffer containing
130  *    the received message, while `context' is the caller-specified context.
131  *    The message must not be modified or freed by the callback function.
132  *    If the function returns TRUE, SilcLog will assume the message as handled
133  *    and won't run its default handler.
134  *
135  * SEE ALSO
136  *    silc_debug_hexdump, silc_log_set_debug_callbacks
137  *
138  ***/
139 typedef bool (*SilcLogHexdumpCb)(char *file, char *function, int line,
140                                  unsigned char *data, uint32 data_len,
141                                  char *message, void *context);
142
143 /* Global Variables */
144
145 /****v* silcutil/SilcLogAPI/silc_log_quick
146  *
147  * NAME
148  *
149  *    bool silc_log_quick -- enable/disable fast logging output
150  *
151  * DESCRIPTION
152  *
153  *    SilcLog makes use of libc stream buffering output, which means that it
154  *    saves HD activity by buffering the logging messages and writing them
155  *    all together every some minutes (default is 5 minutes).
156  *    Setting this variable to TRUE will force SilcLog to write messages to the
157  *    filesystem as soon as they are received. This increases the CPU activity
158  *    notably on bigger servers, but reduces memory usage.
159  *    If you want to change the logging style on-the-fly, make sure to call
160  *    silc_log_flush_all() after setting this variable to TRUE.
161  *
162  ***/
163 extern bool silc_log_quick;
164
165 /****v* silcutil/SilcLogAPI/silc_log_flushdelay
166  *
167  * NAME
168  *
169  *    long silc_log_flushdelay -- flushing time delay
170  *
171  * DESCRIPTION
172  *
173  *    Sets the logfiles flushing delay in seconds.  As for now, changing this
174  *    value AFTER logfiles initialization won't take effect until previous
175  *    delay time will expire; for example if you change from 300 seconds to
176  *    60 seconds you will have to wait up to 300 seconds for this change to
177  *    take effect.
178  *
179  ***/
180 extern long silc_log_flushdelay;
181
182 /****v* silcutil/SilcLogAPI/silc_debug
183  *
184  * NAME
185  *
186  *    bool silc_debug -- enable/disable debugging output
187  *
188  * DESCRIPTION
189  *
190  *    If silc_debug is set to FALSE, debugging functions won't procude any
191  *    output.  This is useful when for example you compile in the debugging
192  *    support but at a certain point you want to send the program in the
193  *    background.
194  *
195  * SEE ALSO
196  *    SILC_LOG_DEBUG
197  *
198  ***/
199 extern bool silc_debug;
200
201 /****v* silcutil/SilcLogAPI/silc_debug_hexdump
202  *
203  * NAME
204  *
205  *    bool silc_debug_hexdump -- enable/disable debugging output
206  *
207  * DESCRIPTION
208  *
209  *    If silc_debug_hexdump is set to FALSE, debugging functions won't produce
210  *    any output.  This is useful when for example you compile in the debugging
211  *    support but at a certain point you want to send the program in the
212  *    background.
213  *
214  * SEE ALSO
215  *    SILC_LOG_HEXDUMP
216  *
217  ***/
218 extern bool silc_debug_hexdump;
219
220 /* Macros */
221
222 #ifdef WIN32
223 #define __FUNCTION__ ""
224 #endif
225
226 /****d* silcutil/SilcLogAPI/SILC_LOG_INFO
227  *
228  * NAME
229  *
230  *    #define SILC_LOG_INFO(...)
231  *
232  * DESCRIPTION
233  *
234  *    This macro is a wrapper to the main logging function.
235  *    It supports variable argument list formatting, and *automatically*
236  *    appends newline at the end of the string.
237  *
238  * NOTES
239  *
240  *    This macro requires double parenthesis to ensure that the VA list
241  *    formatting would work correctly.
242  *
243  * EXAMPLE
244  *
245  *    SILC_LOG_INFO(("Today i feel %s", core->mood));
246  *
247  * SOURCE
248  */
249 #define SILC_LOG_INFO(fmt) silc_log_output(SILC_LOG_INFO, silc_format fmt)
250 /***/
251
252 /****d* silcutil/SilcLogAPI/SILC_LOG_WARNING
253  *
254  * NAME
255  *
256  *    #define SILC_LOG_WARNING(...)
257  *
258  * DESCRIPTION
259  *
260  *    Wrapper to the WARNING logging channel.
261  *    Please see the SILC_LOG_INFO macro.
262  *
263  * SEE ALSO
264  *    SILC_LOG_INFO
265  *
266  * SOURCE
267  */
268 #define SILC_LOG_WARNING(fmt) silc_log_output(SILC_LOG_WARNING, silc_format fmt)
269 /***/
270
271 /****d* silcutil/SilcLogAPI/SILC_LOG_ERROR
272  *
273  * NAME
274  *
275  *    #define SILC_LOG_ERROR(...)
276  *
277  * DESCRIPTION
278  *
279  *    Wrapper to the ERROR logging channel.
280  *    Please see the SILC_LOG_INFO macro.
281  *
282  * SEE ALSO
283  *    SILC_LOG_INFO
284  *
285  * SOURCE
286  */
287 #define SILC_LOG_ERROR(fmt) silc_log_output(SILC_LOG_ERROR, silc_format fmt)
288 /***/
289
290 /****d* silcutil/SilcLogAPI/SILC_LOG_FATAL
291  *
292  * NAME
293  *
294  *    #define SILC_LOG_FATAL(...)
295  *
296  * DESCRIPTION
297  *
298  *    Wrapper to the FATAL logging channel.
299  *    Please see the SILC_LOG_INFO macro.
300  *
301  * SEE ALSO
302  *    SILC_LOG_INFO
303  *
304  * SOURCE
305  */
306 #define SILC_LOG_FATAL(fmt) silc_log_output(SILC_LOG_FATAL, silc_format fmt)
307 /***/
308
309 /****d* silcutil/SilcLogAPI/SILC_LOG_DEBUG
310  *
311  * NAME
312  *
313  *    #define SILC_LOG_DEBUG(...)
314  *
315  * DESCRIPTION
316  *
317  *    This is a special wrapper to the debugging output (usually stderr).
318  *    The standard behaviour is the same as SILC_LOG_INFO, but this macro
319  *    also depends on the global debugging macro SILC_DEBUG.
320  *    Undefining the global SILC_DEBUG define causes these functions to be
321  *    defined to an empty value, thus removing all logging calls from the
322  *    compiled program.
323  *
324  * SEE ALSO
325  *    SILC_LOG_INFO
326  *
327  * SOURCE
328  */
329 #ifdef SILC_DEBUG
330 #define SILC_LOG_DEBUG(fmt) silc_log_output_debug(__FILE__, \
331                                 __FUNCTION__, \
332                                 __LINE__, \
333                                 silc_format fmt)
334 #else
335 #define SILC_LOG_DEBUG(fmt)
336 #endif  /* SILC_DEBUG */
337 /***/
338
339 /****d* silcutil/SilcLogAPI/SILC_LOG_HEXDUMP
340  *
341  * NAME
342  *
343  *    #define SILC_LOG_HEXDUMP(...)
344  *
345  * DESCRIPTION
346  *
347  *    This is a special wrapper to the hexdump output function.  This macro
348  *    behaves slightly differently from other logging wrappers.
349  *    The first parameter, is composed by a group of parameters delimited by
350  *    parenthesis.
351  *    The second parameter is a (char *) pointer to the beginning of the
352  *    memory section that should be hexdumped, and the third parameter is
353  *    the length of this memory section.
354  *    This macro is also affected by the global variable silc_debug_hexdump.
355  *    Undefining the global SILC_DEBUG define causes these functions to be
356  *    defined to an empty value, thus removing all logging calls from the
357  *    compiled program.
358  *
359  * EXAMPLE
360  *
361  *    SILC_LOG_HEXDUMP(("Outgoing packet [%d], len %d", pckt->seq, pckt->len),
362  *                     pckt->data, pckt->datalen);
363  *
364  * SOURCE
365  */
366 #ifdef SILC_DEBUG
367 #define SILC_LOG_HEXDUMP(fmt, data, len) silc_log_output_hexdump(__FILE__, \
368                                 __FUNCTION__, \
369                                 __LINE__, \
370                                 (data), (len), \
371                                 silc_format fmt)
372 #else
373 #define SILC_LOG_HEXDUMP(fmt, data, len)
374 #endif  /* SILC_DEBUG */
375 /***/
376
377 /* Prototypes */
378
379 /****f* silcutil/SilcLogAPI/silc_log_output
380  *
381  * SYNOPSIS
382  *
383  *    void silc_log_output(SilcLogType type, char *string);
384  *
385  * DESCRIPTION
386  *
387  *    This is the main function for logging output. Please note that you
388  *    should rather use one of the logging wrapper macros.
389  *    If you really want to use this function, its usage is quite simple.
390  *    The `type' parameter identifies the channel to use, while the `string'
391  *    parameter must be a dynamic allocated (null-terminated) buffer, because
392  *    it will be freed at the end of this function, for internal reasons.
393  *    If there are registered callbacks for the specified type, this function
394  *    will first trigger those callbacks.  The callback functions must NOT
395  *    free or modify the original buffer.
396  *
397  * SEE ALSO
398  *    SILC_LOG_INFO, SILC_LOG_WARNING, SILC_LOG_ERROR, SILC_LOG_FATAL
399  *
400  ***/
401 void silc_log_output(SilcLogType type, char *string);
402
403 /****f* silcutil/SilcLogAPI/silc_log_get_file
404  *
405  * SYNOPSIS
406  *
407  *    char *silc_log_get_file(SilcLogType type);
408  *
409  * DESCRIPTION
410  *
411  *    Returns the current logging file for the channel `type'.
412  *    If there has been an error during the opening of this channel, NULL
413  *    is returned, even if the file has been previously set with
414  *    silc_log_set_file().
415  *    The returned pointer points to internally allocated storage and must
416  *    must not be freed, modified or stored.
417  *
418  ***/
419 char *silc_log_get_file(SilcLogType type);
420
421 /****f* silcutil/SilcLogAPI/silc_log_set_file
422  *
423  * SYNOPSIS
424  *
425  *    bool silc_log_set_file(SilcLogType type, char *filename, uint32 maxsize,
426  *                           SilcSchedule scheduler);
427  *
428  * DESCRIPTION
429  *
430  *    Sets `filename', which can be maximum `maxsize' bytes long, as the new
431  *    logging file for the channel `type'.  If you specify an illegal filename
432  *    a warning message is printed and FALSE is returned.  In this case
433  *    logging settings are not changed.
434  *    You can disable logging for a channel by specifying NULL filename, the
435  *    maxsize in this case is not important.
436  *    The `scheduler' parameter is needed by the internal logging to allow
437  *    buffered output and thus to save HD activity.
438  *
439  ***/
440 bool silc_log_set_file(SilcLogType type, char *filename, uint32 maxsize,
441                        SilcSchedule scheduler);
442
443 /****f* silcutil/SilcLogAPI/silc_log_set_callback
444  *
445  * SYNOPSIS
446  *
447  *    void silc_log_set_callback(SilcLogType type, SilcLogCb cb,
448  *                               void *context);
449  *
450  * DESCRIPTION
451  *
452  *    Set `cb' as the default callback function for the logging channel
453  *    `type'.  When SilcLog receives a message for this channel, it will
454  *    trigger the callback function.  If the callback function returns TRUE
455  *    SilcLog will assume the input as handled and won't run its default
456  *    handler.
457  *    You can disable/remove a callback by setting it to NULL or calling the
458  *    function silc_log_reset_callbacks.
459  *    If set, the callback function must be in the form described by
460  *    SilcLogCb.
461  *
462  * SEE ALSO
463  *    SilcLogCb, silc_log_reset_callbacks
464  *
465  ***/
466 void silc_log_set_callback(SilcLogType type, SilcLogCb cb, void *context);
467
468 /****f* silcutil/SilcLogAPI/silc_log_reset_callbacks
469  *
470  * SYNOPSIS
471  *
472  *    void silc_log_reset_callbacks();
473  *
474  * DESCRIPTION
475  *
476  *    Removes all logging callbacks for normal channels.  This function does
477  *    NOT remove callbacks for debugging channels (debug and hexdump), you
478  *    rather need to call silc_log_set_debug_callbacks() with NULL callbacks.
479  *
480  ***/
481 void silc_log_reset_callbacks();
482
483 /****f* silcutil/SilcLogAPI/silc_log_flush_all
484  *
485  * SYNOPSIS
486  *
487  *    void silc_log_flush_all();
488  *
489  * DESCRIPTION
490  *
491  *    Forces flushing for all logging channels.  This should be called for
492  *    example after receiving special signals.
493  *
494  * SEE ALSO
495  *    silc_log_quick
496  *
497  ***/
498 void silc_log_flush_all();
499
500 /****f* silcutil/SilcLogAPI/silc_log_reset_all
501  *
502  * SYNOPSIS
503  *
504  *    void silc_log_reset_all();
505  *
506  * DESCRIPTION
507  *
508  *    Forces all logging channels to close and reopen their streams.  Useful
509  *    for example after a SIGHUP signal.
510  *    Please note that this function could cause some warning messages if
511  *    some logging channel points to an illegal filename.
512  *
513  ***/
514 void silc_log_reset_all();
515
516 /****f* silcutil/SilcLogAPI/silc_log_output_debug
517  *
518  * SYNOPSIS
519  *
520  *    void silc_log_output_debug(char *file, char *function,
521  *                               int line, char *string);
522  *
523  * DESCRIPTION
524  *
525  *    This is the main function for debug output.  Please note that you should
526  *    rather use the wrapper macro SILC_LOG_DEBUG.
527  *    If you want to use it anyway, the `file', `function', and `line' are the
528  *    corresponding offsets in the source files, while `string' must be a
529  *    dynamic allocated (null-terminated) buffer.
530  *
531  ***/
532 void silc_log_output_debug(char *file, char *function,
533                            int line, char *string);
534
535 /****f* silcutil/SilcLogAPI/silc_log_output_hexdump
536  *
537  * SYNOPSIS
538  *
539  *    void silc_log_output_hexdump(char *file, char *function,
540  *                                 int line, void *data_in,
541  *                                 uint32 len, char *string);
542  *
543  * DESCRIPTION
544  *
545  *    This is the main function for hexdump output.  Please note that you
546  *    should rather use the wrapper macro SILC_LOG_HEXDUMP.
547  *    If you want to use it anyway, the `file', `function', and `line' are the
548  *    corresponding offsets in the source files, `data_in' is the beginning
549  *    of the buffer you wish to hexdump, which is `len' bytes long.
550  *    `string' must be a dynamic allocated (null-terminated) buffer.
551  *
552  ***/
553 void silc_log_output_hexdump(char *file, char *function,
554                              int line, void *data_in,
555                              uint32 len, char *string);
556
557 /****f* silcutil/SilcLogAPI/silc_log_set_debug_callbacks
558  *
559  * SYNOPSIS
560  *
561  *    void silc_log_set_debug_callbacks(SilcLogDebugCb debug_cb,
562  *                                      void *debug_context,
563  *                                      SilcLogHexdumpCb hexdump_cb,
564  *                                      void *hexdump_context);
565  *
566  * DESCRIPTION
567  *
568  *    Sets `debug_cb' as the the default callback function for the debug
569  *    output, that will be called with the `debug_context' parameter.
570  *    When SilcLog receives a debug message, it will trigger the callback
571  *    function.  If the callback function returns TRUE SilcLog will assume
572  *    the input as handled and won't run its default handler.
573  *    `hexdump_cb' and `hexdump_context' works the same way, except that they
574  *    are referred to SILC_LOG_HEXDUMP requests.
575  *    You can disable/remove a callback by setting it to NULL.
576  *    If set, each callback function must be either in the form described by
577  *    SilcLogDebugCb or SilcLogHexdumpCb.
578  *
579  * SEE ALSO
580  *    SilcLogDebugCb,  SilcLogHexdumpCb
581  *
582  ***/
583 void silc_log_set_debug_callbacks(SilcLogDebugCb debug_cb,
584                                   void *debug_context,
585                                   SilcLogHexdumpCb hexdump_cb,
586                                   void *hexdump_context);
587
588 /****f* silcutil/SilcLogAPI/silc_log_set_debug_string
589  *
590  * SYNOPSIS
591  *
592  *    void silc_log_set_debug_string(const char *debug_string);
593  *
594  * DESCRIPTION
595  *
596  *    Sets `debug_string' as the regexp string for filtering debugging
597  *    output.  The string is copied and it can be modified/destroyed after
598  *    this function call.
599  *
600  ***/
601 void silc_log_set_debug_string(const char *debug_string);
602
603 #endif  /* !SILCLOG_H */