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