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