119304Speter/*
219304Speter * Copyright (C) 2004, 2005, 2007  Internet Systems Consortium, Inc. ("ISC")
319304Speter * Copyright (C) 1998-2001  Internet Software Consortium.
419304Speter *
519304Speter * Permission to use, copy, modify, and/or distribute this software for any
619304Speter * purpose with or without fee is hereby granted, provided that the above
719304Speter * copyright notice and this permission notice appear in all copies.
819304Speter *
919304Speter * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
1019304Speter * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1119304Speter * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
1219304Speter * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13254225Speter * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
1419304Speter * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1519304Speter * PERFORMANCE OF THIS SOFTWARE.
1619304Speter */
1719304Speter
1819304Speter/* $Id: error.c,v 1.21 2007/06/19 23:47:17 tbox Exp $ */
1919304Speter
2019304Speter/*! \file */
2119304Speter
2219304Speter#include <config.h>
2319304Speter
2419304Speter#include <stdio.h>
2519304Speter#include <stdlib.h>
2619304Speter
2719304Speter#include <isc/error.h>
2819304Speter#include <isc/msgs.h>
2919304Speter
3019304Speter/*% Default unexpected callback. */
3119304Speterstatic void
3219304Speterdefault_unexpected_callback(const char *, int, const char *, va_list)
3319304Speter     ISC_FORMAT_PRINTF(3, 0);
3419304Speter
3519304Speter/*% Default fatal callback. */
3619304Speterstatic void
3719304Speterdefault_fatal_callback(const char *, int, const char *, va_list)
38254225Speter     ISC_FORMAT_PRINTF(3, 0);
3919304Speter
4019304Speter/*% unexpected_callback */
4119304Speterstatic isc_errorcallback_t unexpected_callback = default_unexpected_callback;
42254225Speterstatic isc_errorcallback_t fatal_callback = default_fatal_callback;
43254225Speter
44254225Spetervoid
45254225Speterisc_error_setunexpected(isc_errorcallback_t cb) {
46254225Speter	if (cb == NULL)
47254225Speter		unexpected_callback = default_unexpected_callback;
4819304Speter	else
49254225Speter		unexpected_callback = cb;
5019304Speter}
5119304Speter
5219304Spetervoid
5319304Speterisc_error_setfatal(isc_errorcallback_t cb) {
5419304Speter	if (cb == NULL)
5519304Speter		fatal_callback = default_fatal_callback;
5619304Speter	else
5719304Speter		fatal_callback = cb;
5819304Speter}
5919304Speter
6019304Spetervoid
6119304Speterisc_error_unexpected(const char *file, int line, const char *format, ...) {
6219304Speter	va_list args;
6319304Speter
6419304Speter	va_start(args, format);
6519304Speter	(unexpected_callback)(file, line, format, args);
6619304Speter	va_end(args);
6719304Speter}
6819304Speter
6919304Spetervoid
7019304Speterisc_error_fatal(const char *file, int line, const char *format, ...) {
7119304Speter	va_list args;
7219304Speter
7319304Speter	va_start(args, format);
7419304Speter	(fatal_callback)(file, line, format, args);
7519304Speter	va_end(args);
7619304Speter	abort();
7719304Speter}
7819304Speter
7919304Spetervoid
8019304Speterisc_error_runtimecheck(const char *file, int line, const char *expression) {
8119304Speter	isc_error_fatal(file, line, "RUNTIME_CHECK(%s) %s", expression,
8219304Speter			isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
8319304Speter				       ISC_MSG_FAILED, "failed"));
8419304Speter}
8519304Speter
86254225Speterstatic void
87254225Speterdefault_unexpected_callback(const char *file, int line, const char *format,
88254225Speter			    va_list args)
8919304Speter{
90254225Speter	fprintf(stderr, "%s:%d: ", file, line);
91254225Speter	vfprintf(stderr, format, args);
92254225Speter	fprintf(stderr, "\n");
93254225Speter	fflush(stderr);
94254225Speter}
9519304Speter
96static void
97default_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