annotate error.c @ 50:653a896a546e

error: not all systems have assfail Check for its presence at build time, and use a workaround if not present. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Wed, 30 Mar 2016 16:56:32 -0400
parents 1e367179ae6c
children 85e9b512bb73
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
1 /*
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
2 * Copyright (c) 2013-2016 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
3 *
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
5 * of this software and associated documentation files (the "Software"), to deal
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
6 * in the Software without restriction, including without limitation the rights
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
8 * copies of the Software, and to permit persons to whom the Software is
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
9 * furnished to do so, subject to the following conditions:
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
10 *
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
11 * The above copyright notice and this permission notice shall be included in
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
12 * all copies or substantial portions of the Software.
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
13 *
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
20 * SOFTWARE.
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
21 */
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
22
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
23 #include <sys/debug.h>
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
24
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
25 /*
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
26 * clean up the pulled in defines since we want to do our own thing
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
27 */
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
28 #undef ASSERT
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
29 #undef VERIFY
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
30 #undef ASSERT64
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
31 #undef ASSERT32
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
32 #undef IMPLY
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
33 #undef EQUIV
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
34 #undef VERIFY3S
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
35 #undef VERIFY3U
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
36 #undef VERIFY3P
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
37 #undef VERIFY0
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
38 #undef ASSERT3S
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
39 #undef ASSERT3U
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
40 #undef ASSERT3P
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
41 #undef ASSERT0
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
42
50
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
43 #include <inttypes.h>
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
44 #include <syslog.h>
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
45 #include <stdio.h>
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
46 #include <stdbool.h>
50
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
47 #include <assert.h>
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
48 #include <pthread.h>
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
49
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
50 #include <jeffpc/error.h>
50
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
51 #include <jeffpc/config.h>
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
52
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
53 #include "init.h"
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
54
50
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
55 #ifndef HAVE_ASSFAIL
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
56 static void assfail(const char *assertion, const char *file, int line)
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
57 {
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
58 __assert(assertion, file, line);
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
59 }
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
60 #endif
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
61
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
62 void default_print(enum errlevel level, const char *fmt, va_list ap)
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
63 {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
64 FILE *out;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
65
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
66 switch (level) {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
67 case CE_DEBUG:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
68 case CE_INFO:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
69 out = stdout;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
70 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
71 case CE_WARN:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
72 case CE_ERROR:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
73 case CE_CRIT:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
74 case CE_PANIC:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
75 default:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
76 out = stderr;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
77 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
78 }
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
79
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
80 vfprintf(out, fmt, ap);
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
81 }
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
82
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
83 void jeffpc_print(enum errlevel level, const char *fmt, ...)
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
84 {
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
85 va_list ap;
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
86
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
87 va_start(ap, fmt);
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
88 libops.print(level, fmt, ap);
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
89 va_end(ap);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
90 }
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
91
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
92 void default_log(int loglevel, const char *fmt, va_list ap)
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
93 {
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
94 /*
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
95 * This function is a no-op but it exists to allow consumers of
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
96 * libjeffpc to override it with their own log implementation.
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
97 */
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
98 }
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
99
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
100 void jeffpc_log(int loglevel, const char *fmt, ...)
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
101 {
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
102 va_list ap;
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
103
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
104 va_start(ap, fmt);
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
105 libops.log(loglevel, fmt, ap);
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
106 va_end(ap);
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
107 }
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
108
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
109 void default_assfail(const char *a, const char *f, int l)
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
110 {
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
111 jeffpc_log(LOG_ALERT, "assertion failed: %s, file: %s, line: %d",
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
112 a, f, l);
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
113
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
114 assfail(a, f, l);
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
115 }
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
116
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
117 void jeffpc_assfail(const char *a, const char *f, int l)
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
118 {
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
119 libops.assfail(a, f, l);
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
120
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
121 /* this is a hack to shut up gcc */
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
122 abort();
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
123 }
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
124
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
125 void default_assfail3(const char *a, uintmax_t lv, const char *op, uintmax_t rv,
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
126 const char *f, int l)
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
127 {
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
128 char msg[512];
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
129
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
130 snprintf(msg, sizeof(msg), "%s (0x%"PRIx64" %s 0x%"PRIx64")", a, lv,
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
131 op, rv);
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
132
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
133 jeffpc_log(LOG_ALERT, "assertion failed: %s, file: %s, line: %d",
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
134 msg, f, l);
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
135
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
136 assfail(msg, f, l);
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
137 }
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
138
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
139 void jeffpc_assfail3(const char *a, uintmax_t lv, const char *op, uintmax_t rv,
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
140 const char *f, int l)
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
141 {
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
142 libops.assfail3(a, lv, op, rv, f, l);
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
143
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
144 /* this is a hack to shut up gcc */
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
145 abort();
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
146 }
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
147
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
148 void cmn_verr(enum errlevel level, const char *fmt, va_list ap)
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
149 {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
150 const char *levelstr;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
151 unsigned long tid;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
152 int loglevel;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
153 bool panic;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
154 char buf[256];
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
155
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
156 tid = (unsigned long) pthread_self();
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
157 panic = false;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
158
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
159 switch (level) {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
160 case CE_DEBUG:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
161 levelstr = "DEBUG";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
162 loglevel = LOG_DEBUG;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
163 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
164 case CE_INFO:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
165 levelstr = "INFO";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
166 loglevel = LOG_INFO;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
167 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
168 case CE_WARN:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
169 levelstr = "WARN";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
170 loglevel = LOG_WARNING;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
171 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
172 case CE_ERROR:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
173 levelstr = "ERROR";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
174 loglevel = LOG_ERR;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
175 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
176 case CE_CRIT:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
177 levelstr = "CRIT";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
178 loglevel = LOG_CRIT;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
179 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
180 case CE_PANIC:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
181 levelstr = "PANIC";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
182 loglevel = LOG_ALERT;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
183 panic = true;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
184 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
185 default:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
186 levelstr = "?????";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
187 loglevel = LOG_CRIT;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
188 panic = true;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
189 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
190 }
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
191
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
192 vsnprintf(buf, sizeof(buf), fmt, ap);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
193
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
194 /*
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
195 * We are printing the thread ID as a 4-digit number. This will
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
196 * allow systems that use small integers (e.g., Illumos) to have
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
197 * short IDs. Systems that use large integers (e.g., Linux) will
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
198 * use more digits. Since on those systems the IDs will be
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
199 * clustered around some big integer, they will very likely always
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
200 * print as the same number of digits.
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
201 */
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
202 jeffpc_log(loglevel, "[%04lx] %-5s %s\n", tid, levelstr, buf);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
203 jeffpc_print(level, "[%04lx] %-5s %s\n", tid, levelstr, buf);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
204
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
205 if (panic)
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
206 abort();
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
207 }
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
208
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
209 void cmn_err(enum errlevel level, const char *fmt, ...)
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
210 {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
211 va_list ap;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
212
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
213 va_start(ap, fmt);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
214 cmn_verr(level, fmt, ap);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
215 va_end(ap);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
216 }
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
217
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
218 void panic(const char *fmt, ...)
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
219 {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
220 va_list ap;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
221
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
222 va_start(ap, fmt);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
223 cmn_verr(CE_PANIC, fmt, ap);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
224 va_end(ap);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
225
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
226 /* this is a hack to shut up gcc */
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
227 abort();
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
228 }