libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

mhd_panic.c (3066B)


      1 /*
      2   This file is part of libmicrohttpd
      3   Copyright (C) 2007-2018 Daniel Pittman and Christian Grothoff
      4   Copyright (C) 2014-2022 Evgeny Grin (Karlson2k)
      5 
      6   This library is free software; you can redistribute it and/or
      7   modify it under the terms of the GNU Lesser General Public
      8   License as published by the Free Software Foundation; either
      9   version 2.1 of the License, or (at your option) any later version.
     10 
     11   This library is distributed in the hope that it will be useful,
     12   but WITHOUT ANY WARRANTY; without even the implied warranty of
     13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14   Lesser General Public License for more details.
     15 
     16   You should have received a copy of the GNU Lesser General Public
     17   License along with this library; if not, write to the Free Software
     18   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     19 */
     20 
     21 /**
     22  * @file microhttpd/mhd_panic.h
     23  * @brief  MHD_panic() function and helpers
     24  * @author Daniel Pittman
     25  * @author Christian Grothoff
     26  * @author Karlson2k (Evgeny Grin)
     27  */
     28 
     29 #include "mhd_panic.h"
     30 #include "platform.h"
     31 #include "microhttpd.h"
     32 
     33 /**
     34  * Handler for fatal errors.
     35  */
     36 MHD_PanicCallback mhd_panic = (MHD_PanicCallback) NULL;
     37 
     38 /**
     39  * Closure argument for #mhd_panic.
     40  */
     41 void *mhd_panic_cls = NULL;
     42 
     43 
     44 /**
     45  * Default implementation of the panic function,
     46  * prints an error message and aborts.
     47  *
     48  * @param cls unused
     49  * @param file name of the file with the problem
     50  * @param line line number with the problem
     51  * @param reason error message with details
     52  */
     53 _MHD_NORETURN static void
     54 mhd_panic_std (void *cls,
     55                const char *file,
     56                unsigned int line,
     57                const char *reason)
     58 {
     59   (void) cls; /* Mute compiler warning. */
     60 #ifdef HAVE_MESSAGES
     61   fprintf (stderr,
     62            _ ("Fatal error in GNU libmicrohttpd %s:%u: %s\n"),
     63            file,
     64            line,
     65            reason);
     66 #else  /* ! HAVE_MESSAGES */
     67   (void) file;   /* Mute compiler warning. */
     68   (void) line;   /* Mute compiler warning. */
     69   (void) reason; /* Mute compiler warning. */
     70 #endif
     71   abort ();
     72 }
     73 
     74 
     75 /**
     76  * Sets the global error handler to a different implementation.
     77  *
     78  * @a cb will only be called in the case of typically fatal, serious internal
     79  * consistency issues or serious system failures like failed lock of mutex.
     80  *
     81  * These issues should only arise in the case of serious memory corruption or
     82  * similar problems with the architecture, there is no safe way to continue
     83  * even for closing of the application.
     84  *
     85  * The default implementation that is used if no panic function is set simply
     86  * prints an error message and calls `abort()`.
     87  * Alternative implementations might call `exit()` or other similar functions.
     88  *
     89  * @param cb new error handler or NULL to use default handler
     90  * @param cls passed to @a cb
     91  * @ingroup logging
     92  */
     93 _MHD_EXTERN void
     94 MHD_set_panic_func (MHD_PanicCallback cb,
     95                     void *cls)
     96 {
     97   if ((MHD_PanicCallback) NULL != cb)
     98     mhd_panic = cb;
     99   else
    100     mhd_panic = &mhd_panic_std;
    101 
    102   mhd_panic_cls = cls;
    103 }