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