Jelajahi Sumber

Added MHD_OPTION_SIGPIPE_HANDLED_BY_APP option

Evgeny Grin (Karlson2k) 4 tahun lalu
induk
melakukan
2e40251a93
2 mengubah file dengan 24 tambahan dan 2 penghapusan
  1. 13 2
      src/include/microhttpd.h
  2. 11 0
      src/microhttpd/daemon.c

+ 13 - 2
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
 };
 
 

+ 11 - 0
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) &&