error.c revision dafcb997e390efa4423883dafd100c975c4095d6
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * Copyright (C) 1998-2001 Internet Software Consortium.
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Permission to use, copy, modify, and distribute this software for any
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * purpose with or without fee is hereby granted, provided that the above
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews * copyright notice and this permission notice appear in all copies.
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews *
4b6dc226f78862286daa69fba761eac9fd5da16aAutomatic Updater * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
1db2e6b81a0f14d702b5204a73a00372fdfa01e3Bob Halley * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1db2e6b81a0f14d702b5204a73a00372fdfa01e3Bob Halley * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
1db2e6b81a0f14d702b5204a73a00372fdfa01e3Bob Halley * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1db2e6b81a0f14d702b5204a73a00372fdfa01e3Bob Halley * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrews * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews * PERFORMANCE OF THIS SOFTWARE.
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews */
3761c433912beabe43abeed2c3513b6201c59f64Mark Andrews
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff/* $Id: error.c,v 1.17 2004/03/05 05:10:44 marka Exp $ */
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff#include <config.h>
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#include <stdio.h>
deaaf94332abbfdb3aff53675546acfed16e5eb6Mark Andrews#include <stdlib.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
ae114ded82e773a4d9058f833f964a17514712a8Brian Wellington#include <isc/error.h>
1db2e6b81a0f14d702b5204a73a00372fdfa01e3Bob Halley#include <isc/msgs.h>
1db2e6b81a0f14d702b5204a73a00372fdfa01e3Bob Halley
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrewsstatic void
bddfe77128b0f16af263ff149db40f0d885f43d0Mark Andrewsdefault_unexpected_callback(const char *, int, const char *, va_list)
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrews ISC_FORMAT_PRINTF(3, 0);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsstatic void
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafssondefault_fatal_callback(const char *, int, const char *, va_list)
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington ISC_FORMAT_PRINTF(3, 0);
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington
add4043305ca411202ed9cf1929a4179016515ceBrian Wellingtonstatic isc_errorcallback_t unexpected_callback = default_unexpected_callback;
9ac7076ebad044afb15e9e2687e3696868778538Mark Andrewsstatic isc_errorcallback_t fatal_callback = default_fatal_callback;
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffvoid
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsisc_error_setunexpected(isc_errorcallback_t cb) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews if (cb == NULL)
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff unexpected_callback = default_unexpected_callback;
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence else
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews unexpected_callback = cb;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews}
1db2e6b81a0f14d702b5204a73a00372fdfa01e3Bob Halley
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrewsvoid
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaramanisc_error_setfatal(isc_errorcallback_t cb) {
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews if (cb == NULL)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fatal_callback = default_fatal_callback;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews else
2383eb527269d333df4222da20e4b422c3662daaEvan Hunt fatal_callback = cb;
deaaf94332abbfdb3aff53675546acfed16e5eb6Mark Andrews}
2383eb527269d333df4222da20e4b422c3662daaEvan Hunt
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsvoid
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsisc_error_unexpected(const char *file, int line, const char *format, ...) {
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff va_list args;
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews va_start(args, format);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman (unexpected_callback)(file, line, format, args);
ae114ded82e773a4d9058f833f964a17514712a8Brian Wellington va_end(args);
ae114ded82e773a4d9058f833f964a17514712a8Brian Wellington}
1db2e6b81a0f14d702b5204a73a00372fdfa01e3Bob Halley
1db2e6b81a0f14d702b5204a73a00372fdfa01e3Bob Halleyvoid
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrewsisc_error_fatal(const char *file, int line, const char *format, ...) {
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrews va_list args;
deaaf94332abbfdb3aff53675546acfed16e5eb6Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews va_start(args, format);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews (fatal_callback)(file, line, format, args);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews va_end(args);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff abort();
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence}
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
1db2e6b81a0f14d702b5204a73a00372fdfa01e3Bob Halleyvoid
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrewsisc_error_runtimecheck(const char *file, int line, const char *expression) {
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman isc_error_fatal(file, line, "RUNTIME_CHECK(%s) %s", expression,
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews ISC_MSG_FAILED, "failed"));
1c3191528684f3dd93ebb122298c2f8ebfc6d397Mark Andrews}
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsstatic void
4529cdaedaf1a0a5f8ff89aeca510b7a4475446cBob Halleydefault_unexpected_callback(const char *file, int line, const char *format,
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence va_list args)
1c3191528684f3dd93ebb122298c2f8ebfc6d397Mark Andrews{
1c3191528684f3dd93ebb122298c2f8ebfc6d397Mark Andrews fprintf(stderr, "%s:%d: ", file, line);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence vfprintf(stderr, format, args);
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrews fprintf(stderr, "\n");
d981ca645597116d227a48bf37cc5edc061c854dBob Halley fflush(stderr);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman}
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrewsstatic void
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrewsdefault_fatal_callback(const char *file, int line, const char *format,
1c3191528684f3dd93ebb122298c2f8ebfc6d397Mark Andrews va_list args)
1c3191528684f3dd93ebb122298c2f8ebfc6d397Mark Andrews{
90e303b114e56db5809fdd19805243457fa43cd9Olafur Gudmundsson fprintf(stderr, "%s:%d: %s: ", file, line,
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews ISC_MSG_FATALERROR, "fatal error"));
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff vfprintf(stderr, format, args);
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence fprintf(stderr, "\n");
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews fflush(stderr);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews}
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman