1201428Sjilles/*	$NetBSD$	*/
2201428Sjilles
3201428Sjilles/*
4201428Sjilles * Copyright (C) 2004, 2005, 2007, 2008  Internet Systems Consortium, Inc. ("ISC")
5201428Sjilles * Copyright (C) 1997-2001  Internet Software Consortium.
6201428Sjilles *
7201428Sjilles * Permission to use, copy, modify, and/or distribute this software for any
8201428Sjilles * purpose with or without fee is hereby granted, provided that the above
9201428Sjilles * copyright notice and this permission notice appear in all copies.
10201428Sjilles *
11201428Sjilles * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12201428Sjilles * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13201428Sjilles * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14201428Sjilles * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15201428Sjilles * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16201428Sjilles * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17201428Sjilles * PERFORMANCE OF THIS SOFTWARE.
18201428Sjilles */
19201428Sjilles
20201428Sjilles/* Id: assertions.c,v 1.23 2008/10/15 23:47:31 tbox Exp */
21201428Sjilles
22201428Sjilles/*! \file */
23201428Sjilles
24201428Sjilles#include <config.h>
25204016Sjilles
26201428Sjilles#include <stdio.h>
27201428Sjilles#include <stdlib.h>
28201428Sjilles
29201428Sjilles#include <isc/assertions.h>
30201428Sjilles#include <isc/msgs.h>
31201428Sjilles
32201428Sjilles/*%
33201428Sjilles * Forward.
34201428Sjilles */
35201428Sjilles/* coverity[+kill] */
36201428Sjillesstatic void
37201428Sjillesdefault_callback(const char *, int, isc_assertiontype_t, const char *);
38201428Sjilles
39201428Sjilles/*%
40201428Sjilles * Public.
41201428Sjilles */
42201428Sjilles
43201428SjillesLIBISC_EXTERNAL_DATA isc_assertioncallback_t isc_assertion_failed =
44201428Sjilles					     default_callback;
45201428Sjilles
46201428Sjilles/*% Set callback. */
47201428Sjillesvoid
48201428Sjillesisc_assertion_setcallback(isc_assertioncallback_t cb) {
49201428Sjilles	if (cb == NULL)
50201428Sjilles		isc_assertion_failed = default_callback;
51201428Sjilles	else
52201428Sjilles		isc_assertion_failed = cb;
53201428Sjilles}
54201428Sjilles
55201428Sjilles/*% Type to Text */
56201428Sjillesconst char *
57201428Sjillesisc_assertion_typetotext(isc_assertiontype_t type) {
58201428Sjilles	const char *result;
59201428Sjilles
60201428Sjilles	/*
61201428Sjilles	 * These strings have purposefully not been internationalized
62201428Sjilles	 * because they are considered to essentially be keywords of
63201428Sjilles	 * the ISC development environment.
64201428Sjilles	 */
65201428Sjilles	switch (type) {
66201428Sjilles	case isc_assertiontype_require:
67201428Sjilles		result = "REQUIRE";
68201428Sjilles		break;
69201428Sjilles	case isc_assertiontype_ensure:
70201428Sjilles		result = "ENSURE";
71201428Sjilles		break;
72201428Sjilles	case isc_assertiontype_insist:
73201428Sjilles		result = "INSIST";
74201428Sjilles		break;
75209652Sjilles	case isc_assertiontype_invariant:
76201428Sjilles		result = "INVARIANT";
77201428Sjilles		break;
78	default:
79		result = NULL;
80	}
81	return (result);
82}
83
84/*
85 * Private.
86 */
87
88static void
89default_callback(const char *file, int line, isc_assertiontype_t type,
90		 const char *cond)
91{
92	fprintf(stderr, "%s:%d: %s(%s) %s.\n",
93		file, line, isc_assertion_typetotext(type), cond,
94		isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
95			       ISC_MSG_FAILED, "failed"));
96	fflush(stderr);
97	abort();
98	/* NOTREACHED */
99}
100