1 /* 2 * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (C) 1998-2001 Internet Software Consortium. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 * PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /* $Id: error.c,v 1.21 2007/06/19 23:47:17 tbox Exp $ */ 19 20 /*! \file */ 21 22 #include <config.h> 23 24 #include <stdio.h> 25 #include <stdlib.h> 26 27 #include <isc/error.h> 28 #include <isc/msgs.h> 29 30 /*% Default unexpected callback. */ 31 static void 32 default_unexpected_callback(const char *, int, const char *, va_list) 33 ISC_FORMAT_PRINTF(3, 0); 34 35 /*% Default fatal callback. */ 36 static void 37 default_fatal_callback(const char *, int, const char *, va_list) 38 ISC_FORMAT_PRINTF(3, 0); 39 40 /*% unexpected_callback */ 41 static isc_errorcallback_t unexpected_callback = default_unexpected_callback; 42 static isc_errorcallback_t fatal_callback = default_fatal_callback; 43 44 void 45 isc_error_setunexpected(isc_errorcallback_t cb) { 46 if (cb == NULL) 47 unexpected_callback = default_unexpected_callback; 48 else 49 unexpected_callback = cb; 50 } 51 52 void 53 isc_error_setfatal(isc_errorcallback_t cb) { 54 if (cb == NULL) 55 fatal_callback = default_fatal_callback; 56 else 57 fatal_callback = cb; 58 } 59 60 void 61 isc_error_unexpected(const char *file, int line, const char *format, ...) { 62 va_list args; 63 64 va_start(args, format); 65 (unexpected_callback)(file, line, format, args); 66 va_end(args); 67 } 68 69 void 70 isc_error_fatal(const char *file, int line, const char *format, ...) { 71 va_list args; 72 73 va_start(args, format); 74 (fatal_callback)(file, line, format, args); 75 va_end(args); 76 abort(); 77 } 78 79 void 80 isc_error_runtimecheck(const char *file, int line, const char *expression) { 81 isc_error_fatal(file, line, "RUNTIME_CHECK(%s) %s", expression, 82 isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL, 83 ISC_MSG_FAILED, "failed")); 84 } 85 86 static void 87 default_unexpected_callback(const char *file, int line, const char *format, 88 va_list args) 89 { 90 fprintf(stderr, "%s:%d: ", file, line); 91 vfprintf(stderr, format, args); 92 fprintf(stderr, "\n"); 93 fflush(stderr); 94 } 95 96 static void 97 default_fatal_callback(const char *file, int line, const char *format, 98 va_list args) 99 { 100 fprintf(stderr, "%s:%d: %s: ", file, line, 101 isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL, 102 ISC_MSG_FATALERROR, "fatal error")); 103 vfprintf(stderr, format, args); 104 fprintf(stderr, "\n"); 105 fflush(stderr); 106 } 107