Forráskód Böngészése

Fixed missing macros blocking use of accept4()

Evgeny Grin (Karlson2k) 10 hónapja
szülő
commit
799deef112
3 módosított fájl, 40 hozzáadás és 30 törlés
  1. 33 30
      src/mhd2/daemon_add_conn.c
  2. 1 0
      src/mhd2/mhd_connection.h
  3. 6 0
      src/mhd2/sys_sockets_headers.h

+ 33 - 30
src/mhd2/daemon_add_conn.c

@@ -817,9 +817,9 @@ mhd_daemon_accept_connection (struct MHD_Daemon *restrict daemon)
   bool sk_spipe_supprs;
   bool sk_cloexec;
   enum mhd_Tristate sk_non_ip;
-#if defined(_DEBUG) && defined (USE_ACCEPT4)
+#if defined(_DEBUG) && defined (mhd_USE_ACCEPT4)
   const bool use_accept4 = ! daemon->dbg.avoid_accept4;
-#elif defined (USE_ACCEPT4)
+#elif defined (mhd_USE_ACCEPT4)
   static const bool use_accept4 = true;
 #else  /* ! USE_ACCEPT4 && ! _DEBUG */
   static const bool use_accept4 = false;
@@ -849,44 +849,47 @@ mhd_daemon_accept_connection (struct MHD_Daemon *restrict daemon)
   sk_cloexec = false;
   s = MHD_INVALID_SOCKET;
 
-#ifdef USE_ACCEPT4
-  if (use_accept4 &&
-      (MHD_INVALID_SOCKET !=
-       (s = accept4 (fd,
-                     (struct sockaddr *) &addrstorage,
-                     &addrlen,
-                     SOCK_CLOEXEC_OR_ZERO | SOCK_NONBLOCK_OR_ZERO
-                     | SOCK_NOSIGPIPE_OR_ZERO))))
+#ifdef mhd_USE_ACCEPT4
+  if (use_accept4)
   {
-    sk_nonbl = (SOCK_NONBLOCK_OR_ZERO != 0);
+    s = accept4 (fd,
+                 (struct sockaddr *) &addrstorage,
+                 &addrlen,
+                 mhd_SOCK_CLOEXEC | mhd_SOCK_NONBLOCK | mhd_SOCK_NOSIGPIPE);
+    if (MHD_INVALID_SOCKET != s)
+    {
+      sk_nonbl = (mhd_SOCK_NONBLOCK != 0);
 #ifndef MHD_SOCKETS_KIND_WINSOCK
-    sk_spipe_supprs = (SOCK_NOSIGPIPE_OR_ZERO != 0);
+      sk_spipe_supprs = (mhd_SOCK_NOSIGPIPE != 0);
 #else  /* MHD_SOCKETS_KIND_WINSOCK */
-    sk_spipe_supprs = true; /* Nothing to suppress on W32 */
+      sk_spipe_supprs = true; /* Nothing to suppress on W32 */
 #endif /* MHD_SOCKETS_KIND_WINSOCK */
-    sk_cloexec = (SOCK_CLOEXEC_OR_ZERO != 0);
+      sk_cloexec = (mhd_SOCK_CLOEXEC != 0);
+    }
   }
-#endif /* USE_ACCEPT4 */
-#if defined(_DEBUG) || ! defined(USE_ACCEPT4)
-  if (! use_accept4 &&
-      (MHD_INVALID_SOCKET !=
-       (s = accept (fd,
-                    (struct sockaddr *) &addrstorage,
-                    &addrlen))))
+#endif /* mhd_USE_ACCEPT4 */
+#if ! defined(mhd_USE_ACCEPT4) || defined(_DEBUG)
+  if (! use_accept4)
   {
-#ifdef MHD_ACCEPT_INHERIT_NONBLOCK
-    sk_nonbl = daemon->listen_nonblk;
-#else  /* ! MHD_ACCEPT_INHERIT_NONBLOCK */
-    sk_nonbl = false;
-#endif /* ! MHD_ACCEPT_INHERIT_NONBLOCK */
+    s = accept (fd,
+                (struct sockaddr *) &addrstorage,
+                &addrlen);
+    if (MHD_INVALID_SOCKET != s)
+    {
+#ifdef MHD_ACCEPTED_INHERITS_NONBLOCK
+      sk_nonbl = daemon->net.listen.non_block;
+#else  /* ! MHD_ACCEPTED_INHERITS_NONBLOCK */
+      sk_nonbl = false;
+#endif /* ! MHD_ACCEPTED_INHERITS_NONBLOCK */
 #ifndef MHD_SOCKETS_KIND_WINSOCK
-    sk_spipe_supprs = false;
+      sk_spipe_supprs = false;
 #else  /* MHD_SOCKETS_KIND_WINSOCK */
-    sk_spipe_supprs = true; /* Nothing to suppress on W32 */
+      sk_spipe_supprs = true; /* Nothing to suppress on W32 */
 #endif /* MHD_SOCKETS_KIND_WINSOCK */
-    sk_cloexec = false;
+      sk_cloexec = false;
+    }
   }
-#endif /* _DEBUG || !USE_ACCEPT4 */
+#endif /* !mhd_USE_ACCEPT4 || _DEBUG */
 
   if (MHD_INVALID_SOCKET == s)
   { /* This could be a common occurrence with multiple worker threads */

+ 1 - 0
src/mhd2/mhd_connection.h

@@ -480,6 +480,7 @@ struct mhd_ConnDebugData
   bool pre_cleaned;
   bool removed_from_daemon;
   bool tls_inited;
+  bool avoid_accept4;
 };
 
 /**

+ 6 - 0
src/mhd2/sys_sockets_headers.h

@@ -141,6 +141,12 @@
 #endif
 
 
+#if defined(HAVE_ACCEPT4) && (defined(HAVE_DCLR_SOCK_NONBLOCK) || \
+  defined(HAVE_DCLR_SOCK_CLOEXEC) || defined(HAVE_DCLR_SOCK_NOSIGPIPE))
+#  define mhd_USE_ACCEPT4 1
+#endif
+
+
 /**
  * mhd_SCKT_OPT_BOOL is the type for bool parameters
  * for setsockopt()/getsockopt() functions