libmicrohttpd

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

commit 2e40251a934933f35413ea3ef978656f2eb0730a
parent d71df0f08b6cdf2e57739fc48b1420aa9a2a5cd7
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Wed, 17 Mar 2021 20:55:33 +0300

Added MHD_OPTION_SIGPIPE_HANDLED_BY_APP option

Diffstat:
Msrc/include/microhttpd.h | 15+++++++++++++--
Msrc/microhttpd/daemon.c | 11+++++++++++
2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h @@ -135,7 +135,7 @@ typedef intptr_t ssize_t; * they are parsed as decimal numbers. * Example: 0x01093001 = 1.9.30-1. */ -#define MHD_VERSION 0x00097204 +#define MHD_VERSION 0x00097205 /** * Operational results from MHD calls. @@ -1732,7 +1732,18 @@ enum MHD_OPTION * This argument must be followed by an "unsigned int", corresponding * to an `enum MHD_DisableSanityCheck`. */ - MHD_OPTION_SERVER_INSANITY = 32 + MHD_OPTION_SERVER_INSANITY = 32, + + /** + * If followed by value '1' informs MHD that SIGPIPE is suppressed or + * handled by application. Allows MHD to use network functions that could + * generate SIGPIPE, like `sendfile()`. + * Valid only for daemons without #MHD_USE_INTERNAL_POLLING_THREAD as + * MHD automatically suppresses SIGPIPE for threads started by MHD. + * This option should be followed by an `int` argument. + * @note Available since #MHD_VERSION 0x00097205 + */ + MHD_OPTION_SIGPIPE_HANDLED_BY_APP = 33 }; diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c @@ -5849,6 +5849,7 @@ parse_options_va (struct MHD_Daemon *daemon, break; /* all options taking 'int' */ case MHD_OPTION_STRICT_FOR_CLIENT: + case MHD_OPTION_SIGPIPE_HANDLED_BY_APP: if (MHD_NO == parse_options (daemon, servaddr, opt, @@ -5927,6 +5928,16 @@ parse_options_va (struct MHD_Daemon *daemon, return MHD_NO; #endif #endif /* HTTPS_SUPPORT */ + case MHD_OPTION_SIGPIPE_HANDLED_BY_APP: + if (0 == (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD)) + daemon->sigpipe_blocked = ( (va_arg (ap, + int)) != 0); + else + { + (void) va_arg (ap, + int); + } + break; default: #ifdef HAVE_MESSAGES if ( ( (opt >= MHD_OPTION_HTTPS_MEM_KEY) &&