Home | History | Annotate | Line # | Download | only in isc
      1 /*	$NetBSD: error.c,v 1.1 2024/02/18 20:57:49 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      5  *
      6  * SPDX-License-Identifier: MPL-2.0
      7  *
      8  * This Source Code Form is subject to the terms of the Mozilla Public
      9  * License, v. 2.0. If a copy of the MPL was not distributed with this
     10  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
     11  *
     12  * See the COPYRIGHT file distributed with this work for additional
     13  * information regarding copyright ownership.
     14  */
     15 
     16 /*! \file */
     17 
     18 #include <stdio.h>
     19 #include <stdlib.h>
     20 
     21 #include <isc/error.h>
     22 #include <isc/print.h>
     23 
     24 /*% Default unexpected callback. */
     25 static void
     26 default_unexpected_callback(const char *, int, const char *, va_list)
     27 	ISC_FORMAT_PRINTF(3, 0);
     28 
     29 /*% Default fatal callback. */
     30 static void
     31 default_fatal_callback(const char *, int, const char *, va_list)
     32 	ISC_FORMAT_PRINTF(3, 0);
     33 
     34 /*% unexpected_callback */
     35 static isc_errorcallback_t unexpected_callback = default_unexpected_callback;
     36 static isc_errorcallback_t fatal_callback = default_fatal_callback;
     37 
     38 void
     39 isc_error_setunexpected(isc_errorcallback_t cb) {
     40 	if (cb == NULL) {
     41 		unexpected_callback = default_unexpected_callback;
     42 	} else {
     43 		unexpected_callback = cb;
     44 	}
     45 }
     46 
     47 void
     48 isc_error_setfatal(isc_errorcallback_t cb) {
     49 	if (cb == NULL) {
     50 		fatal_callback = default_fatal_callback;
     51 	} else {
     52 		fatal_callback = cb;
     53 	}
     54 }
     55 
     56 void
     57 isc_error_unexpected(const char *file, int line, const char *format, ...) {
     58 	va_list args;
     59 
     60 	va_start(args, format);
     61 	(unexpected_callback)(file, line, format, args);
     62 	va_end(args);
     63 }
     64 
     65 void
     66 isc_error_fatal(const char *file, int line, const char *format, ...) {
     67 	va_list args;
     68 
     69 	va_start(args, format);
     70 	(fatal_callback)(file, line, format, args);
     71 	va_end(args);
     72 	abort();
     73 }
     74 
     75 void
     76 isc_error_runtimecheck(const char *file, int line, const char *expression) {
     77 	isc_error_fatal(file, line, "RUNTIME_CHECK(%s) failed", expression);
     78 }
     79 
     80 static void
     81 default_unexpected_callback(const char *file, int line, const char *format,
     82 			    va_list args) {
     83 	fprintf(stderr, "%s:%d: ", file, line);
     84 	vfprintf(stderr, format, args);
     85 	fprintf(stderr, "\n");
     86 	fflush(stderr);
     87 }
     88 
     89 static void
     90 default_fatal_callback(const char *file, int line, const char *format,
     91 		       va_list args) {
     92 	fprintf(stderr, "%s:%d: fatal error: ", file, line);
     93 	vfprintf(stderr, format, args);
     94 	fprintf(stderr, "\n");
     95 	fflush(stderr);
     96 }
     97