annotate error.c @ 819:616a36d39703

error: add EEOF errno Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sun, 06 Sep 2020 23:28:12 -0400
parents dfbcf2a05902
children ceb71a7a96f6
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 /*
819
616a36d39703 error: add EEOF errno
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 632
diff changeset
2 * Copyright (c) 2013-2020 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
4
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
50
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
23 #include <inttypes.h>
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
24 #include <syslog.h>
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
25 #include <stdio.h>
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
26 #include <stdbool.h>
50
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
27 #include <assert.h>
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
28 #include <pthread.h>
90
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
29 #include <execinfo.h>
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
30 #include <ucontext.h>
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
31
55
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
32 #include <jeffpc/config.h>
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
33 #include <jeffpc/error.h>
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
34
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
35 #include "init.h"
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
36
618
6f8be69c0d8e config: prefix all config defines with JEFFPC_
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 615
diff changeset
37 #ifdef JEFFPC_HAVE_ASSFAIL
582
15b3b9cb1f37 error: wrap assfail/__assert in a helper function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 390
diff changeset
38 /* See comment at the end of this file about assfail type checking */
55
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
39 extern int assfail(const char *a, const char *f, int l);
50
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
40 #endif
653a896a546e error: not all systems have assfail
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 39
diff changeset
41
582
15b3b9cb1f37 error: wrap assfail/__assert in a helper function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 390
diff changeset
42 static inline void assertion_failed(const char *assertion, const char *file,
585
ba11a4af050d error: propagate the assertion failing function name to the assfail wrapper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
43 int line, const char *function)
582
15b3b9cb1f37 error: wrap assfail/__assert in a helper function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 390
diff changeset
44 {
618
6f8be69c0d8e config: prefix all config defines with JEFFPC_
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 615
diff changeset
45 #if defined(JEFFPC_HAVE_ASSFAIL)
582
15b3b9cb1f37 error: wrap assfail/__assert in a helper function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 390
diff changeset
46 assfail(assertion, file, line);
618
6f8be69c0d8e config: prefix all config defines with JEFFPC_
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 615
diff changeset
47 #elif defined(JEFFPC_HAVE___ASSERT_FREEBSD_STYLE)
587
cc74dfea4b17 config: detect & use proper arguments to __assert on FreeBSD
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 586
diff changeset
48 __assert(function, file, line, assertion);
618
6f8be69c0d8e config: prefix all config defines with JEFFPC_
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 615
diff changeset
49 #elif defined(JEFFPC_HAVE___ASSERT_LINUX_STYLE)
586
2c14ccb9d69f config: determine which __assert is on the system
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 585
diff changeset
50 __assert(assertion, file, line);
582
15b3b9cb1f37 error: wrap assfail/__assert in a helper function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 390
diff changeset
51 #else
586
2c14ccb9d69f config: determine which __assert is on the system
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 585
diff changeset
52 #error "Don't know how to kill for assertion failures"
582
15b3b9cb1f37 error: wrap assfail/__assert in a helper function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 390
diff changeset
53 #endif
15b3b9cb1f37 error: wrap assfail/__assert in a helper function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 390
diff changeset
54 }
15b3b9cb1f37 error: wrap assfail/__assert in a helper function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 390
diff changeset
55
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
56 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
57 {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
58 FILE *out;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
59
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
60 switch (level) {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
61 case CE_DEBUG:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
62 case CE_INFO:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
63 out = stdout;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
64 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
65 case CE_WARN:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
66 case CE_ERROR:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
67 case CE_CRIT:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
68 case CE_PANIC:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
69 default:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
70 out = stderr;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
71 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
72 }
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
73
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
74 vfprintf(out, fmt, ap);
302
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
75
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
76 /*
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
77 * TODO: improve this
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
78 *
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
79 * stderr doesn't need to be flushed since it is unbuffered by
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
80 * default. stdout o the other hand tends to default to fully
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
81 * buffered instead of what we'd prefer - line buffered. In theory,
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
82 * the buffering strategy can be changed via setvbuf(), but the
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
83 * description of it seems to indicate that this only works before
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
84 * stdout is used the first time. Unfortunately, we support using
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
85 * cmn_err() before the library is initialized.
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
86 */
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
87 if (out != stderr)
821b9ca00f0a error: flush stdout after each cmn_err invocation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 94
diff changeset
88 fflush(out);
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
89 }
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
90
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
91 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
92 {
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
93 va_list ap;
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
94
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
95 va_start(ap, fmt);
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
96 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
97 va_end(ap);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
98 }
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
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 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
101 {
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
102 /*
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
103 * 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
104 * 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
105 */
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
106 }
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
107
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
108 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
109 {
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
110 va_list ap;
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
111
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
112 va_start(ap, fmt);
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
113 libops.log(loglevel, fmt, ap);
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
114 va_end(ap);
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
584
4a442510d4b6 error: propagate the assertion failing function name to the assfail op
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 583
diff changeset
117 void default_assfail(const char *a, const char *f, int l, const char *fxn)
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
118 {
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
119 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
120 a, f, l);
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
121
90
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
122 print_stacktrace(CE_CRIT, NULL);
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
123
585
ba11a4af050d error: propagate the assertion failing function name to the assfail wrapper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
124 assertion_failed(a, f, l, fxn);
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
125 }
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
126
583
761ed4ccdc85 error: assertion failures should grab the function name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 582
diff changeset
127 void jeffpc_assfail(const char *a, const char *f, int l, const char *fxn)
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
128 {
584
4a442510d4b6 error: propagate the assertion failing function name to the assfail op
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 583
diff changeset
129 libops.assfail(a, f, l, fxn);
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
130
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
131 /* 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
132 abort();
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
133 }
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
134
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
135 void default_assfail3(const char *a, uintmax_t lv, const char *op, uintmax_t rv,
584
4a442510d4b6 error: propagate the assertion failing function name to the assfail op
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 583
diff changeset
136 const char *f, int l, const char *fxn)
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
137 {
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
138 char msg[512];
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
139
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
140 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
141 op, rv);
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
142
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
143 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
144 msg, f, l);
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
145
90
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
146 print_stacktrace(CE_CRIT, NULL);
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
147
585
ba11a4af050d error: propagate the assertion failing function name to the assfail wrapper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
148 assertion_failed(msg, f, l, fxn);
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
149 }
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
150
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
151 void jeffpc_assfail3(const char *a, uintmax_t lv, const char *op, uintmax_t rv,
583
761ed4ccdc85 error: assertion failures should grab the function name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 582
diff changeset
152 const char *f, int l, const char *fxn)
39
1e367179ae6c init & error: allow users to provide logging infrastructure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 30
diff changeset
153 {
584
4a442510d4b6 error: propagate the assertion failing function name to the assfail op
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 583
diff changeset
154 libops.assfail3(a, lv, op, rv, f, l, fxn);
4
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
155
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
156 /* 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
157 abort();
49bec073c6e4 error: define assertion macros and a syslogging mechanism
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
158 }
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
159
385
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
160 static const char *get_session(void)
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
161 {
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
162 if (!libops.get_session)
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
163 return "";
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
164
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
165 return libops.get_session();
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
166 }
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
167
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
168 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
169 {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
170 const char *levelstr;
385
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
171 const char *session;
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
172 unsigned long tid;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
173 int loglevel;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
174 bool panic;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
175 char buf[256];
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
176
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
177 tid = (unsigned long) pthread_self();
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
178 panic = false;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
179
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
180 switch (level) {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
181 case CE_DEBUG:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
182 levelstr = "DEBUG";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
183 loglevel = LOG_DEBUG;
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 case CE_INFO:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
186 levelstr = "INFO";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
187 loglevel = LOG_INFO;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
188 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
189 case CE_WARN:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
190 levelstr = "WARN";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
191 loglevel = LOG_WARNING;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
192 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
193 case CE_ERROR:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
194 levelstr = "ERROR";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
195 loglevel = LOG_ERR;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
196 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
197 case CE_CRIT:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
198 levelstr = "CRIT";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
199 loglevel = LOG_CRIT;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
200 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
201 case CE_PANIC:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
202 levelstr = "PANIC";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
203 loglevel = LOG_ALERT;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
204 panic = true;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
205 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
206 default:
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
207 levelstr = "?????";
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
208 loglevel = LOG_CRIT;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
209 panic = true;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
210 break;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
211 }
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 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
214
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
215 /*
385
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
216 * Get the session string.
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
217 */
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
218 session = get_session();
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
219
ad58806bf7e0 init: add a way to print session information
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 302
diff changeset
220 /*
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
221 * 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
222 * 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
223 * 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
224 * 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
225 * 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
226 * 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
227 */
390
d53c1436a171 error: print the session information after the message level
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 385
diff changeset
228 jeffpc_log(loglevel, "[%04lx] %-5s%s %s\n", tid, levelstr, session, buf);
d53c1436a171 error: print the session information after the message level
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 385
diff changeset
229 jeffpc_print(level, "[%04lx] %-5s%s %s\n", tid, levelstr, session, buf);
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
230
90
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
231 if (panic) {
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
232 print_stacktrace(CE_CRIT, NULL);
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
233 abort();
90
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
234 }
30
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
235 }
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
236
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
237 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
238 {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
239 va_list ap;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
240
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
241 va_start(ap, fmt);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
242 cmn_verr(level, fmt, ap);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
243 va_end(ap);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
244 }
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
245
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
246 void panic(const char *fmt, ...)
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
247 {
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
248 va_list ap;
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
249
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
250 va_start(ap, fmt);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
251 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
252 va_end(ap);
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
253
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
254 /* 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
255 abort();
59ce34920fda error: introduce cmn_err, cmn_verr, and panic
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 4
diff changeset
256 }
55
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
257
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
258 /*
90
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
259 * Note: We must not allocate any memory, etc. because we want this function
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
260 * to be callable from any context.
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
261 */
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
262 void save_stacktrace(struct stack *stack)
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
263 {
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
264 size_t nframes;
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
265
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
266 nframes = backtrace(stack->frames, ERROR_STACK_FRAMES);
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
267 stack->nframes = nframes;
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
268
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
269 /* NULL-out any unused frames */
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
270 while (nframes < ERROR_STACK_FRAMES)
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
271 stack->frames[nframes++] = NULL;
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
272 }
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
273
618
6f8be69c0d8e config: prefix all config defines with JEFFPC_
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 615
diff changeset
274 #ifndef JEFFPC_HAVE_ADDRTOSYMSTR
91
ec8fa08617da error: provide a fallback implementation of addrtosymstr for internal use
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 90
diff changeset
275 static void addrtosymstr(void *pc, char *buf, size_t buflen)
ec8fa08617da error: provide a fallback implementation of addrtosymstr for internal use
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 90
diff changeset
276 {
94
95bdfef12cc1 error: print pointers as %p
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 91
diff changeset
277 snprintf(buf, buflen, "[%p]", pc);
91
ec8fa08617da error: provide a fallback implementation of addrtosymstr for internal use
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 90
diff changeset
278 }
ec8fa08617da error: provide a fallback implementation of addrtosymstr for internal use
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 90
diff changeset
279 #endif
ec8fa08617da error: provide a fallback implementation of addrtosymstr for internal use
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 90
diff changeset
280
90
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
281 /*
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
282 * Note: We must not allocate any memory, etc. because we want this function
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
283 * to be callable from any context.
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
284 */
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
285 void print_stacktrace(enum errlevel level, struct stack *stack)
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
286 {
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
287 struct stack here;
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
288 size_t i;
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
289
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
290 if (!stack) {
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
291 save_stacktrace(&here);
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
292 stack = &here;
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
293 }
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
294
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
295 for (i = 0; i < stack->nframes; i++) {
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
296 char tmp[256];
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
297
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
298 addrtosymstr(stack->frames[i], tmp, sizeof(tmp));
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
299
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
300 cmn_err(level, " %s", tmp);
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
301 }
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
302 }
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
303
615
fa38f60e3d8f error: turn xstrerror into a full fledged function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 587
diff changeset
304 const char *xstrerror(int e)
fa38f60e3d8f error: turn xstrerror into a full fledged function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 587
diff changeset
305 {
632
dfbcf2a05902 error: allow hooking xstrerror errno mapping
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 631
diff changeset
306 if (libops.strerror) {
dfbcf2a05902 error: allow hooking xstrerror errno mapping
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 631
diff changeset
307 const char *ret;
dfbcf2a05902 error: allow hooking xstrerror errno mapping
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 631
diff changeset
308
dfbcf2a05902 error: allow hooking xstrerror errno mapping
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 631
diff changeset
309 ret = libops.strerror(e);
dfbcf2a05902 error: allow hooking xstrerror errno mapping
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 631
diff changeset
310 if (ret)
dfbcf2a05902 error: allow hooking xstrerror errno mapping
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 631
diff changeset
311 return ret;
dfbcf2a05902 error: allow hooking xstrerror errno mapping
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 631
diff changeset
312 }
dfbcf2a05902 error: allow hooking xstrerror errno mapping
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 631
diff changeset
313
624
c314619311a5 config: ensure ENOTUNIQ exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 618
diff changeset
314 switch (e) {
631
744982e99bbc error: make xstrerror(0) always return "Success"
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 625
diff changeset
315 case 0:
744982e99bbc error: make xstrerror(0) always return "Success"
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 625
diff changeset
316 return "Success";
625
6e6d66d2df97 config: ensure ECKSUM exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 624
diff changeset
317 case -ECKSUM:
6e6d66d2df97 config: ensure ECKSUM exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 624
diff changeset
318 return "Checksum mismatch";
624
c314619311a5 config: ensure ENOTUNIQ exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 618
diff changeset
319 case -ENOTUNIQ:
c314619311a5 config: ensure ENOTUNIQ exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 618
diff changeset
320 return "Name, identifier, or object not unique";
819
616a36d39703 error: add EEOF errno
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 632
diff changeset
321 case -EEOF:
616a36d39703 error: add EEOF errno
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 632
diff changeset
322 return "End of file";
624
c314619311a5 config: ensure ENOTUNIQ exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 618
diff changeset
323 }
c314619311a5 config: ensure ENOTUNIQ exists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 618
diff changeset
324
615
fa38f60e3d8f error: turn xstrerror into a full fledged function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 587
diff changeset
325 return strerror(-e);
fa38f60e3d8f error: turn xstrerror into a full fledged function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 587
diff changeset
326 }
fa38f60e3d8f error: turn xstrerror into a full fledged function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 587
diff changeset
327
90
6597964ea9ed error: stack trace saving and printing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 55
diff changeset
328 /*
55
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
329 * If we have sys/debug.h, let's include it so that the assfail function
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
330 * signature gets checked to be what we expect.
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
331 *
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
332 * This include is at the end of this file because it polutes the namespace
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
333 * big time.
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
334 */
618
6f8be69c0d8e config: prefix all config defines with JEFFPC_
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 615
diff changeset
335 #ifdef JEFFPC_HAVE_SYS_DEBUG_H
55
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
336 #include <sys/debug.h>
85e9b512bb73 error: stop including the non-POSIX sys/debug.h
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 50
diff changeset
337 #endif