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