/* This file is part of libmicrohttpd Copyright (C) 2007-2018 Daniel Pittman and Christian Grothoff Copyright (C) 2014-2022 Evgeny Grin (Karlson2k) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** * @file microhttpd/mhd_panic.h * @brief MHD_panic() function and helpers * @author Daniel Pittman * @author Christian Grothoff * @author Karlson2k (Evgeny Grin) */ #include "mhd_panic.h" #include "platform.h" #include "microhttpd.h" /** * Handler for fatal errors. */ MHD_PanicCallback mhd_panic = (MHD_PanicCallback) NULL; /** * Closure argument for #mhd_panic. */ void *mhd_panic_cls = NULL; /** * Default implementation of the panic function, * prints an error message and aborts. * * @param cls unused * @param file name of the file with the problem * @param line line number with the problem * @param reason error message with details */ _MHD_NORETURN static void mhd_panic_std (void *cls, const char *file, unsigned int line, const char *reason) { (void) cls; /* Mute compiler warning. */ #ifdef HAVE_MESSAGES fprintf (stderr, _ ("Fatal error in GNU libmicrohttpd %s:%u: %s\n"), file, line, reason); #else /* ! HAVE_MESSAGES */ (void) file; /* Mute compiler warning. */ (void) line; /* Mute compiler warning. */ (void) reason; /* Mute compiler warning. */ #endif abort (); } /** * Sets the global error handler to a different implementation. * * @a cb will only be called in the case of typically fatal, serious internal * consistency issues or serious system failures like failed lock of mutex. * * These issues should only arise in the case of serious memory corruption or * similar problems with the architecture, there is no safe way to continue * even for closing of the application. * * The default implementation that is used if no panic function is set simply * prints an error message and calls `abort()`. * Alternative implementations might call `exit()` or other similar functions. * * @param cb new error handler or NULL to use default handler * @param cls passed to @a cb * @ingroup logging */ _MHD_EXTERN void MHD_set_panic_func (MHD_PanicCallback cb, void *cls) { if ((MHD_PanicCallback) NULL != cb) mhd_panic = cb; else mhd_panic = &mhd_panic_std; mhd_panic_cls = cls; }