xref: /netbsd-src/external/mpl/bind/dist/lib/isc/error.c (revision 2718af68c3efc72c9769069b5c7f9ed36f6b9def)
1 /*	$NetBSD: error.c,v 1.5 2021/02/19 16:42:19 christos Exp $	*/
2 
3 /*
4  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5  *
6  * This Source Code Form is subject to the terms of the Mozilla Public
7  * License, v. 2.0. If a copy of the MPL was not distributed with this
8  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
9  *
10  * See the COPYRIGHT file distributed with this work for additional
11  * information regarding copyright ownership.
12  */
13 
14 /*! \file */
15 
16 #include <stdio.h>
17 #include <stdlib.h>
18 
19 #include <isc/error.h>
20 #include <isc/print.h>
21 
22 /*% Default unexpected callback. */
23 static void
24 default_unexpected_callback(const char *, int, const char *, va_list)
25 	ISC_FORMAT_PRINTF(3, 0);
26 
27 /*% Default fatal callback. */
28 static void
29 default_fatal_callback(const char *, int, const char *, va_list)
30 	ISC_FORMAT_PRINTF(3, 0);
31 
32 /*% unexpected_callback */
33 static isc_errorcallback_t unexpected_callback = default_unexpected_callback;
34 static isc_errorcallback_t fatal_callback = default_fatal_callback;
35 
36 void
37 isc_error_setunexpected(isc_errorcallback_t cb) {
38 	if (cb == NULL) {
39 		unexpected_callback = default_unexpected_callback;
40 	} else {
41 		unexpected_callback = cb;
42 	}
43 }
44 
45 void
46 isc_error_setfatal(isc_errorcallback_t cb) {
47 	if (cb == NULL) {
48 		fatal_callback = default_fatal_callback;
49 	} else {
50 		fatal_callback = cb;
51 	}
52 }
53 
54 void
55 isc_error_unexpected(const char *file, int line, const char *format, ...) {
56 	va_list args;
57 
58 	va_start(args, format);
59 	(unexpected_callback)(file, line, format, args);
60 	va_end(args);
61 }
62 
63 void
64 isc_error_fatal(const char *file, int line, const char *format, ...) {
65 	va_list args;
66 
67 	va_start(args, format);
68 	(fatal_callback)(file, line, format, args);
69 	va_end(args);
70 	abort();
71 }
72 
73 void
74 isc_error_runtimecheck(const char *file, int line, const char *expression) {
75 	isc_error_fatal(file, line, "RUNTIME_CHECK(%s) failed", expression);
76 }
77 
78 static void
79 default_unexpected_callback(const char *file, int line, const char *format,
80 			    va_list args) {
81 	fprintf(stderr, "%s:%d: ", file, line);
82 	vfprintf(stderr, format, args);
83 	fprintf(stderr, "\n");
84 	fflush(stderr);
85 }
86 
87 static void
88 default_fatal_callback(const char *file, int line, const char *format,
89 		       va_list args) {
90 	fprintf(stderr, "%s:%d: fatal error: ", file, line);
91 	vfprintf(stderr, format, args);
92 	fprintf(stderr, "\n");
93 	fflush(stderr);
94 }
95