xref: /freebsd/lib/libpjdlog/pjdlog.h (revision b3e76948)
12f02600aSPawel Jakub Dawidek /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
35e53a4f9SPedro F. Giffuni  *
42f02600aSPawel Jakub Dawidek  * Copyright (c) 2009-2010 The FreeBSD Foundation
52f02600aSPawel Jakub Dawidek  * Copyright (c) 2011 Pawel Jakub Dawidek <pjd@FreeBSD.org>
62f02600aSPawel Jakub Dawidek  * All rights reserved.
72f02600aSPawel Jakub Dawidek  *
82f02600aSPawel Jakub Dawidek  * This software was developed by Pawel Jakub Dawidek under sponsorship from
92f02600aSPawel Jakub Dawidek  * the FreeBSD Foundation.
102f02600aSPawel Jakub Dawidek  *
112f02600aSPawel Jakub Dawidek  * Redistribution and use in source and binary forms, with or without
122f02600aSPawel Jakub Dawidek  * modification, are permitted provided that the following conditions
132f02600aSPawel Jakub Dawidek  * are met:
142f02600aSPawel Jakub Dawidek  * 1. Redistributions of source code must retain the above copyright
152f02600aSPawel Jakub Dawidek  *    notice, this list of conditions and the following disclaimer.
162f02600aSPawel Jakub Dawidek  * 2. Redistributions in binary form must reproduce the above copyright
172f02600aSPawel Jakub Dawidek  *    notice, this list of conditions and the following disclaimer in the
182f02600aSPawel Jakub Dawidek  *    documentation and/or other materials provided with the distribution.
192f02600aSPawel Jakub Dawidek  *
202f02600aSPawel Jakub Dawidek  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
212f02600aSPawel Jakub Dawidek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
222f02600aSPawel Jakub Dawidek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
232f02600aSPawel Jakub Dawidek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
242f02600aSPawel Jakub Dawidek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
252f02600aSPawel Jakub Dawidek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
262f02600aSPawel Jakub Dawidek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
272f02600aSPawel Jakub Dawidek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
282f02600aSPawel Jakub Dawidek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
292f02600aSPawel Jakub Dawidek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
302f02600aSPawel Jakub Dawidek  * SUCH DAMAGE.
312f02600aSPawel Jakub Dawidek  */
322f02600aSPawel Jakub Dawidek 
332f02600aSPawel Jakub Dawidek #ifndef	_PJDLOG_H_
342f02600aSPawel Jakub Dawidek #define	_PJDLOG_H_
352f02600aSPawel Jakub Dawidek 
362f02600aSPawel Jakub Dawidek #include <sys/cdefs.h>
372f02600aSPawel Jakub Dawidek 
382f02600aSPawel Jakub Dawidek #include <errno.h>
392f02600aSPawel Jakub Dawidek #include <stdarg.h>
402f02600aSPawel Jakub Dawidek #include <sysexits.h>
412f02600aSPawel Jakub Dawidek #include <syslog.h>
422f02600aSPawel Jakub Dawidek 
432f02600aSPawel Jakub Dawidek #define	PJDLOG_MODE_STD		0
442f02600aSPawel Jakub Dawidek #define	PJDLOG_MODE_SYSLOG	1
452f02600aSPawel Jakub Dawidek #define	PJDLOG_MODE_SOCK	2
462f02600aSPawel Jakub Dawidek 
472f02600aSPawel Jakub Dawidek void pjdlog_init(int mode);
482f02600aSPawel Jakub Dawidek void pjdlog_fini(void);
492f02600aSPawel Jakub Dawidek 
502f02600aSPawel Jakub Dawidek void pjdlog_mode_set(int mode);
512f02600aSPawel Jakub Dawidek int pjdlog_mode_get(void);
522f02600aSPawel Jakub Dawidek 
532f02600aSPawel Jakub Dawidek #ifdef notyet
542f02600aSPawel Jakub Dawidek void pjdlog_sock_set(int sock);
552f02600aSPawel Jakub Dawidek int pjdlog_sock_get(void);
562f02600aSPawel Jakub Dawidek #endif
572f02600aSPawel Jakub Dawidek 
582f02600aSPawel Jakub Dawidek void pjdlog_debug_set(int level);
592f02600aSPawel Jakub Dawidek int pjdlog_debug_get(void);
602f02600aSPawel Jakub Dawidek 
612f02600aSPawel Jakub Dawidek void pjdlog_prefix_set(const char *fmt, ...) __printflike(1, 2);
622f02600aSPawel Jakub Dawidek void pjdlogv_prefix_set(const char *fmt, va_list ap) __printflike(1, 0);
632f02600aSPawel Jakub Dawidek const char *pjdlog_prefix_get(void);
642f02600aSPawel Jakub Dawidek void pjdlog_prefix_push(const char *fmt, ...) __printflike(1, 2);
652f02600aSPawel Jakub Dawidek void pjdlogv_prefix_push(const char *fmt, va_list ap) __printflike(1, 0);
662f02600aSPawel Jakub Dawidek void pjdlog_prefix_pop(void);
672f02600aSPawel Jakub Dawidek 
682f02600aSPawel Jakub Dawidek void _pjdlogv_common(const char *func, const char *file, int line, int loglevel,
692f02600aSPawel Jakub Dawidek     int debuglevel, int error, const char *fmt, va_list ap) __printflike(7, 0);
702f02600aSPawel Jakub Dawidek void _pjdlog_common(const char *func, const char *file, int line, int loglevel,
712f02600aSPawel Jakub Dawidek     int debuglevel, int error, const char *fmt, ...) __printflike(7, 8);
722f02600aSPawel Jakub Dawidek 
732f02600aSPawel Jakub Dawidek void _pjdlogv_exit(const char *func, const char *file, int line, int exitcode,
742f02600aSPawel Jakub Dawidek     int error, const char *fmt, va_list ap) __printflike(6, 0) __dead2;
752f02600aSPawel Jakub Dawidek void _pjdlog_exit(const char *func, const char *file, int line, int exitcode,
762f02600aSPawel Jakub Dawidek     int error, const char *fmt, ...) __printflike(6, 7) __dead2;
772f02600aSPawel Jakub Dawidek 
782f02600aSPawel Jakub Dawidek void _pjdlog_abort(const char *func, const char *file, int line, int error,
792f02600aSPawel Jakub Dawidek     const char *failedexpr, const char *fmt, ...) __printflike(6, 7) __dead2;
802f02600aSPawel Jakub Dawidek 
812f02600aSPawel Jakub Dawidek #ifdef notyet
822f02600aSPawel Jakub Dawidek int pjdlog_receive(int sock);
832f02600aSPawel Jakub Dawidek #endif
842f02600aSPawel Jakub Dawidek 
852f02600aSPawel Jakub Dawidek #define	pjdlogv_common(loglevel, debuglevel, error, fmt, ap)		\
862f02600aSPawel Jakub Dawidek 	_pjdlogv_common(__func__, __FILE__, __LINE__, (loglevel),	\
872f02600aSPawel Jakub Dawidek 	    (debuglevel), (error), (fmt), (ap))
882f02600aSPawel Jakub Dawidek #define	pjdlog_common(loglevel, debuglevel, error, ...)			\
892f02600aSPawel Jakub Dawidek 	_pjdlog_common(__func__, __FILE__, __LINE__, (loglevel),	\
902f02600aSPawel Jakub Dawidek 	    (debuglevel), (error), __VA_ARGS__)
912f02600aSPawel Jakub Dawidek 
922f02600aSPawel Jakub Dawidek #define	pjdlogv(loglevel, fmt, ap)					\
932f02600aSPawel Jakub Dawidek 	pjdlogv_common((loglevel), 0, -1, (fmt), (ap))
942f02600aSPawel Jakub Dawidek #define	pjdlog(loglevel, ...)						\
952f02600aSPawel Jakub Dawidek 	pjdlog_common((loglevel), 0, -1, __VA_ARGS__)
962f02600aSPawel Jakub Dawidek 
972f02600aSPawel Jakub Dawidek #define	pjdlogv_emergency(fmt, ap)	pjdlogv(LOG_EMERG, (fmt), (ap))
982f02600aSPawel Jakub Dawidek #define	pjdlog_emergency(...)		pjdlog(LOG_EMERG, __VA_ARGS__)
992f02600aSPawel Jakub Dawidek #define	pjdlogv_alert(fmt, ap)		pjdlogv(LOG_ALERT, (fmt), (ap))
1002f02600aSPawel Jakub Dawidek #define	pjdlog_alert(...)		pjdlog(LOG_ALERT, __VA_ARGS__)
1012f02600aSPawel Jakub Dawidek #define	pjdlogv_critical(fmt, ap)	pjdlogv(LOG_CRIT, (fmt), (ap))
1022f02600aSPawel Jakub Dawidek #define	pjdlog_critical(...)		pjdlog(LOG_CRIT, __VA_ARGS__)
1032f02600aSPawel Jakub Dawidek #define	pjdlogv_error(fmt, ap)		pjdlogv(LOG_ERR, (fmt), (ap))
1042f02600aSPawel Jakub Dawidek #define	pjdlog_error(...)		pjdlog(LOG_ERR, __VA_ARGS__)
1052f02600aSPawel Jakub Dawidek #define	pjdlogv_warning(fmt, ap)	pjdlogv(LOG_WARNING, (fmt), (ap))
1062f02600aSPawel Jakub Dawidek #define	pjdlog_warning(...)		pjdlog(LOG_WARNING, __VA_ARGS__)
1072f02600aSPawel Jakub Dawidek #define	pjdlogv_notice(fmt, ap)		pjdlogv(LOG_NOTICE, (fmt), (ap))
1082f02600aSPawel Jakub Dawidek #define	pjdlog_notice(...)		pjdlog(LOG_NOTICE, __VA_ARGS__)
1092f02600aSPawel Jakub Dawidek #define	pjdlogv_info(fmt, ap)		pjdlogv(LOG_INFO, (fmt), (ap))
1102f02600aSPawel Jakub Dawidek #define	pjdlog_info(...)		pjdlog(LOG_INFO, __VA_ARGS__)
1112f02600aSPawel Jakub Dawidek 
1122f02600aSPawel Jakub Dawidek #define	pjdlog_debug(debuglevel, ...)					\
1132f02600aSPawel Jakub Dawidek 	pjdlog_common(LOG_DEBUG, (debuglevel), -1, __VA_ARGS__)
1142f02600aSPawel Jakub Dawidek #define	pjdlogv_debug(debuglevel, fmt, ap)				\
1152f02600aSPawel Jakub Dawidek 	pjdlogv_common(LOG_DEBUG, (debuglevel), -1, (fmt), (ap))
1162f02600aSPawel Jakub Dawidek 
1172f02600aSPawel Jakub Dawidek #define	pjdlog_errno(loglevel, ...)					\
1182f02600aSPawel Jakub Dawidek 	pjdlog_common((loglevel), 0, (errno), __VA_ARGS__)
1192f02600aSPawel Jakub Dawidek #define	pjdlogv_errno(loglevel, fmt, ap)				\
1202f02600aSPawel Jakub Dawidek 	pjdlogv_common((loglevel), 0, (errno), (fmt), (ap))
1212f02600aSPawel Jakub Dawidek 
1222f02600aSPawel Jakub Dawidek #define	pjdlogv_exit(exitcode, fmt, ap)					\
1232f02600aSPawel Jakub Dawidek 	_pjdlogv_exit(__func__, __FILE__, __LINE__, (exitcode),		\
1242f02600aSPawel Jakub Dawidek 	    (errno), (fmt), (ap))
1252f02600aSPawel Jakub Dawidek #define	pjdlog_exit(exitcode, ...)					\
1262f02600aSPawel Jakub Dawidek 	_pjdlog_exit(__func__, __FILE__, __LINE__, (exitcode), (errno),	\
1272f02600aSPawel Jakub Dawidek 	    __VA_ARGS__)
1282f02600aSPawel Jakub Dawidek 
1292f02600aSPawel Jakub Dawidek #define	pjdlogv_exitx(exitcode, fmt, ap)				\
1302f02600aSPawel Jakub Dawidek 	_pjdlogv_exit(__func__, __FILE__, __LINE__, (exitcode), -1,	\
1312f02600aSPawel Jakub Dawidek 	    (fmt), (ap))
1322f02600aSPawel Jakub Dawidek #define	pjdlog_exitx(exitcode, ...)					\
1332f02600aSPawel Jakub Dawidek 	_pjdlog_exit(__func__, __FILE__, __LINE__, (exitcode), -1,	\
1342f02600aSPawel Jakub Dawidek 	    __VA_ARGS__)
1352f02600aSPawel Jakub Dawidek 
1362f02600aSPawel Jakub Dawidek #define	PJDLOG_VERIFY(expr)	do {					\
1372f02600aSPawel Jakub Dawidek 	if (!(expr)) {							\
1382f02600aSPawel Jakub Dawidek 		_pjdlog_abort(__func__, __FILE__, __LINE__, -1, #expr,	\
1392f02600aSPawel Jakub Dawidek 		    __func__);						\
1402f02600aSPawel Jakub Dawidek 	}								\
1412f02600aSPawel Jakub Dawidek } while (0)
1422f02600aSPawel Jakub Dawidek #define	PJDLOG_RVERIFY(expr, ...)	do {				\
1432f02600aSPawel Jakub Dawidek 	if (!(expr)) {							\
1442f02600aSPawel Jakub Dawidek 		_pjdlog_abort(__func__, __FILE__, __LINE__, -1, #expr,	\
1452f02600aSPawel Jakub Dawidek 		    __VA_ARGS__);					\
1462f02600aSPawel Jakub Dawidek 	}								\
1472f02600aSPawel Jakub Dawidek } while (0)
1482f02600aSPawel Jakub Dawidek #define	PJDLOG_EVERIFY(expr)		do {				\
1492f02600aSPawel Jakub Dawidek 	if (!(expr)) {							\
1502f02600aSPawel Jakub Dawidek 		_pjdlog_abort(__func__, __FILE__, __LINE__, errno,	\
1512f02600aSPawel Jakub Dawidek 		    #expr, __func__);					\
1522f02600aSPawel Jakub Dawidek 	}								\
1532f02600aSPawel Jakub Dawidek } while (0)
1542f02600aSPawel Jakub Dawidek #define	PJDLOG_ABORT(...)	_pjdlog_abort(__func__, __FILE__,	\
1552f02600aSPawel Jakub Dawidek 				    __LINE__, -1, NULL, __VA_ARGS__)
1562f02600aSPawel Jakub Dawidek #ifdef NDEBUG
1572f02600aSPawel Jakub Dawidek #define	PJDLOG_ASSERT(expr)	do { } while (0)
1582f02600aSPawel Jakub Dawidek #define	PJDLOG_RASSERT(...)	do { } while (0)
1592f02600aSPawel Jakub Dawidek #else
1602f02600aSPawel Jakub Dawidek #define	PJDLOG_ASSERT(expr)	do {					\
1612f02600aSPawel Jakub Dawidek 	if (!(expr)) {							\
1622f02600aSPawel Jakub Dawidek 		_pjdlog_abort(__func__, __FILE__, __LINE__, -1, #expr,	\
1632f02600aSPawel Jakub Dawidek 		    __func__);						\
1642f02600aSPawel Jakub Dawidek 	}								\
1652f02600aSPawel Jakub Dawidek } while (0)
1662f02600aSPawel Jakub Dawidek #define	PJDLOG_RASSERT(expr, ...)	do {				\
1672f02600aSPawel Jakub Dawidek 	if (!(expr)) {							\
1682f02600aSPawel Jakub Dawidek 		_pjdlog_abort(__func__, __FILE__, __LINE__, -1, #expr,	\
1692f02600aSPawel Jakub Dawidek 		    __VA_ARGS__);					\
1702f02600aSPawel Jakub Dawidek 	}								\
1712f02600aSPawel Jakub Dawidek } while (0)
1722f02600aSPawel Jakub Dawidek #endif
1732f02600aSPawel Jakub Dawidek 
1742f02600aSPawel Jakub Dawidek #endif	/* !_PJDLOG_H_ */
175