Files
bind9/lib/isc/assertions.c
Ondřej Surý c931d8e417 Merge branch '46-just-use-clang-format-to-reformat-sources' into 'master'
Reformat source code with clang-format

Closes #46

See merge request isc-projects/bind9!2156

(cherry picked from commit 7099e79a9b)

4c3b063e Import Linux kernel .clang-format with small modifications
f50b1e06 Use clang-format to reformat the source files
11341c76 Update the definition files for Windows
df6c1f76 Remove tkey_test (which is no-op anyway)
2020-02-12 14:51:18 +00:00

132 lines
2.8 KiB
C

/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
/*! \file */
#include <stdio.h>
#include <stdlib.h>
#include <isc/assertions.h>
#include <isc/backtrace.h>
#include <isc/print.h>
#include <isc/result.h>
/*
* The maximum number of stack frames to dump on assertion failure.
*/
#ifndef BACKTRACE_MAXFRAME
#define BACKTRACE_MAXFRAME 128
#endif
/*%
* Forward.
*/
static void
default_callback(const char *, int, isc_assertiontype_t, const char *);
static isc_assertioncallback_t isc_assertion_failed_cb = default_callback;
/*%
* Public.
*/
/*% assertion failed handler */
/* coverity[+kill] */
void
isc_assertion_failed(const char *file, int line, isc_assertiontype_t type,
const char *cond)
{
isc_assertion_failed_cb(file, line, type, cond);
abort();
/* NOTREACHED */
}
/*% Set callback. */
void
isc_assertion_setcallback(isc_assertioncallback_t cb)
{
if (cb == NULL)
isc_assertion_failed_cb = default_callback;
else
isc_assertion_failed_cb = cb;
}
/*% Type to Text */
const char *
isc_assertion_typetotext(isc_assertiontype_t type)
{
const char *result;
/*
* These strings have purposefully not been internationalized
* because they are considered to essentially be keywords of
* the ISC development environment.
*/
switch (type) {
case isc_assertiontype_require:
result = "REQUIRE";
break;
case isc_assertiontype_ensure:
result = "ENSURE";
break;
case isc_assertiontype_insist:
result = "INSIST";
break;
case isc_assertiontype_invariant:
result = "INVARIANT";
break;
default:
result = NULL;
}
return (result);
}
/*
* Private.
*/
static void
default_callback(const char *file, int line, isc_assertiontype_t type,
const char *cond)
{
void * tracebuf[BACKTRACE_MAXFRAME];
int i, nframes;
const char * logsuffix = ".";
const char * fname;
isc_result_t result;
result = isc_backtrace_gettrace(tracebuf, BACKTRACE_MAXFRAME, &nframes);
if (result == ISC_R_SUCCESS && nframes > 0) {
logsuffix = ", back trace";
}
fprintf(stderr, "%s:%d: %s(%s) failed%s\n", file, line,
isc_assertion_typetotext(type), cond, logsuffix);
if (result == ISC_R_SUCCESS) {
for (i = 0; i < nframes; i++) {
unsigned long offset;
fname = NULL;
result = isc_backtrace_getsymbol(tracebuf[i], &fname,
&offset);
if (result == ISC_R_SUCCESS) {
fprintf(stderr, "#%d %p in %s()+0x%lx\n", i,
tracebuf[i], fname, offset);
} else {
fprintf(stderr, "#%d %p in ??\n", i,
tracebuf[i]);
}
}
}
fflush(stderr);
}