1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of either:
4  *
5  *   a) The GNU Lesser General Public License as published by the Free
6  *      Software Foundation; either version 2.1, or (at your option) any
7  *      later version,
8  *
9  *   OR
10  *
11  *   b) The two-clause BSD license.
12  *
13  * These licenses can be found with the distribution in the file LICENSES
14  */
15 
16 
17 
18 #ifndef INC_SPF_LOG
19 #define INC_SPF_LOG
20 
21 /**
22  * @file
23  * Error messages and warnings generated internally by the library call
24  * these routines.  By default, the messages go to stderr, but you can
25  * define your own routines to deal with the messages instead.
26  *
27  * To use the syslog routines, add code such as:
28  *
29  *  openlog(logPrefix,LOG_PID|LOG_CONS|LOG_NDELAY|LOG_NOWAIT,LOG_MAIL);
30  *
31  *  SPF_error_handler = SPF_error_syslog;
32  *  SPF_warning_handler = SPF_warning_syslog;
33  *  SPF_info_handler = SPF_info_syslog;
34  *  SPF_debug_handler = SPF_debug_syslog;
35  */
36 
37 #include <stdarg.h>
38 
39 
40 #define SPF_error(errmsg) SPF_errorx( __FILE__, __LINE__, "%s", errmsg )
41 void SPF_errorx( const char *file, int line, const char *format, ... ) __attribute__ ((noreturn)) __attribute__ ((format (printf, 3, 4)));
42 void SPF_errorx2( const char *format, ... );
43 void SPF_errorv( const char *file, int line, const char *format, va_list ap ) __attribute__ ((noreturn)) __attribute__ ((format (printf, 3, 0)));
44 
45 #define SPF_warning(errmsg) SPF_warningx( __FILE__, __LINE__, "%s", errmsg )
46 void SPF_warningx( const char *file, int line, const char *format, ... ) __attribute__ ((format (printf, 3, 4)));
47 void SPF_warningx2( const char *format, ... );
48 void SPF_warningv( const char *file, int line, const char *format, va_list ap ) __attribute__ ((format (printf, 3, 0)));
49 
50 #define SPF_info(errmsg) SPF_infox( __FILE__, __LINE__, "%s", errmsg )
51 void SPF_infox( const char *file, int line, const char *format, ... ) __attribute__ ((format (printf, 3, 4)));
52 void SPF_infox2( const char *format, ... );
53 void SPF_infov( const char *file, int line, const char *format, va_list ap ) __attribute__ ((format (printf, 3, 0)));
54 
55 #define SPF_debug(errmsg) SPF_debugx( __FILE__, __LINE__, "%s", errmsg )
56 void SPF_debugx( const char *file, int line, const char *format, ... ) __attribute__ ((format (printf, 3, 4)));
57 void SPF_debugx2( const char *format, ... );
58 void SPF_debugv( const char *file, int line, const char *format, va_list ap ) __attribute__ ((format (printf, 3, 0)));
59 
60 
61 #if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L
62 
63 #define SPF_errorf(... ) SPF_errorx( __FILE__, __LINE__, __VA_ARGS__ )
64 #define SPF_warningf(... ) SPF_warningx( __FILE__, __LINE__, __VA_ARGS__ )
65 #define SPF_infof(... ) SPF_infox( __FILE__, __LINE__, __VA_ARGS__ )
66 #define SPF_debugf(... ) SPF_debugx( __FILE__, __LINE__, __VA_ARGS__ )
67 
68 #elif defined( __GNUC__ )
69 
70 #define SPF_errorf(format... ) SPF_errorx( __FILE__, __LINE__, format )
71 #define SPF_warningf(format... ) SPF_warningx( __FILE__, __LINE__, format )
72 #define SPF_infof(format... ) SPF_infox( __FILE__, __LINE__, format )
73 #define SPF_debugf(format... ) SPF_debugx( __FILE__, __LINE__, format )
74 
75 #else
76 
77 #define SPF_errorf	SPF_errorx2
78 #define SPF_warningf	SPF_warningx2
79 #define SPF_infof	SPF_infox2
80 #define SPF_debugf	SPF_debugx2
81 
82 #endif
83 
84 
85 /* These message handler routines print to stderr or stdout, as appropriate. */
86 
87 void SPF_error_stdio( const char *file, int line, const char *errmsg ) __attribute__ ((noreturn));
88 void SPF_warning_stdio( const char *file, int line, const char *errmsg );
89 void SPF_info_stdio( const char *file __attribute__ ((unused)), int line __attribute__ ((unused)), const char *errmsg );
90 void SPF_debug_stdio( const char *file, int line, const char *errmsg );
91 
92 
93 /* These message handler routines send messages to syslog */
94 
95 void SPF_error_syslog( const char *file, int line, const char *errmsg ) __attribute__ ((noreturn));
96 void SPF_warning_syslog( const char *file, int line, const char *errmsg );
97 void SPF_info_syslog( const char *file __attribute__ ((unused)), int line __attribute__ ((unused)), const char *errmsg );
98 void SPF_debug_syslog( const char *file, int line, const char *errmsg );
99 
100 /* FYI only -- can't be changed without recompiling the library */
101 #define SPF_DEFAULT_ERROR_HANDLER	SPF_error_stdio
102 #define SPF_DEFAULT_WARNING_HANDLER	SPF_warning_stdio
103 #define SPF_DEFAULT_INFO_HANDLER	SPF_info_stdio
104 #define SPF_DEFAULT_DEBUG_HANDLER	SPF_debug_stdio
105 
106 
107 /*
108  * You can assign these global function pointers to whatever routines
109  * you want to handle the various types of messages.  Setting them to NULL
110  * will cause the messages to be ignored.
111  */
112 
113 extern void (*SPF_error_handler)( const char *, int, const char * ) __attribute__ ((noreturn));
114 extern void (*SPF_warning_handler)( const char *, int, const char * );
115 extern void (*SPF_info_handler)( const char *, int, const char * );
116 extern void (*SPF_debug_handler)( const char *, int, const char * );
117 
118 #define SPF_ASSERT_NOTNULL(x) \
119 	do { if ((x) == NULL) SPF_error(#x " is NULL"); } while(0)
120 
121 
122 
123 
124 #endif
125