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