Mercurial > libjeffpc
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 |
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 |