xref: /openbsd-src/usr.bin/dig/lib/isc/error.c (revision 99fd087599a8791921855f21bd7e36130f39aadc)
1 /*
2  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14  * PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /* $Id: error.c,v 1.5 2020/02/25 05:00:43 jsg Exp $ */
18 
19 /*! \file */
20 
21 #include <stdio.h>
22 #include <stdlib.h>
23 
24 #include <isc/error.h>
25 
26 /*% Default unexpected callback. */
27 static void
28 default_unexpected_callback(const char *, int, const char *, va_list)
29      __attribute__((__format__(__printf__, 3, 0)));
30 
31 /*% Default fatal callback. */
32 static void
33 default_fatal_callback(const char *, int, const char *, va_list)
34      __attribute__((__format__(__printf__, 3, 0)));
35 
36 /*% unexpected_callback */
37 static isc_errorcallback_t unexpected_callback = default_unexpected_callback;
38 static isc_errorcallback_t fatal_callback = default_fatal_callback;
39 
40 void
41 isc_error_unexpected(const char *file, int line, const char *format, ...) {
42 	va_list args;
43 
44 	va_start(args, format);
45 	(unexpected_callback)(file, line, format, args);
46 	va_end(args);
47 }
48 
49 void
50 isc_error_fatal(const char *file, int line, const char *format, ...) {
51 	va_list args;
52 
53 	va_start(args, format);
54 	(fatal_callback)(file, line, format, args);
55 	va_end(args);
56 	abort();
57 }
58 
59 void
60 isc_error_runtimecheck(const char *file, int line, const char *expression) {
61 	isc_error_fatal(file, line, "RUNTIME_CHECK(%s) %s", expression,
62 				       "failed");
63 }
64 
65 static void
66 default_unexpected_callback(const char *file, int line, const char *format,
67 			    va_list args)
68 {
69 	fprintf(stderr, "%s:%d: ", file, line);
70 	vfprintf(stderr, format, args);
71 	fprintf(stderr, "\n");
72 	fflush(stderr);
73 }
74 
75 static void
76 default_fatal_callback(const char *file, int line, const char *format,
77 		       va_list args)
78 {
79 	fprintf(stderr, "%s:%d: %s: ", file, line, "fatal error");
80 	vfprintf(stderr, format, args);
81 	fprintf(stderr, "\n");
82 	fflush(stderr);
83 }
84