[prev in list] [next in list] [prev in thread] [next in thread] 

List:       apr-cvs
Subject:    svn commit: r1551659 - /apr/apr/trunk/network_io/unix/sockets.c
From:       trawick () apache ! org
Date:       2013-12-17 19:17:35
Message-ID: 20131217191735.3BFB42388868 () eris ! apache ! org
[Download RAW message or body]

Author: trawick
Date: Tue Dec 17 19:17:34 2013
New Revision: 1551659

URL: http://svn.apache.org/r1551659
Log:
Fix the inheritance of the non-blocking option across apr_socket_accept()
on FreeBSD 10 which was introduced with APR 1.5.0 through an unlikely
mechanism:

* FreeBSD 10 introduced accept4().  APR uses accept4() where it can find it.
  accept4() on Linux and FreeBSD 10 both have a SOCK_NONBLOCK flag, but on 
  FreeBSD 10 the SOCK_NONBLOCK is the sole determiner of whether or not the
  connected socket is non-blocking.
* clang is normally used on FreeBSD 10.
* APR's configure-time check for inherited O_NONBLOCK didn't work with clang,
  so initially the lack of inheritance across accept4() wasn't a problem.
* APR 1.5.0 allowed the configure-time check to work with clang, exposing
  the bad expectation about accept4() matching the accept() behavior.

With FreeBSD accept4() (avail in 10+), O_NONBLOCK is not inherited
(unlike Linux).  Mimic the accept() behavior here in a way that
may help other platforms as well.

Modified:
    apr/apr/trunk/network_io/unix/sockets.c

Modified: apr/apr/trunk/network_io/unix/sockets.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/network_io/unix/sockets.c?rev=1551659&r1=1551658&r2=1551659&view=diff
 ==============================================================================
--- apr/apr/trunk/network_io/unix/sockets.c (original)
+++ apr/apr/trunk/network_io/unix/sockets.c Tue Dec 17 19:17:34 2013
@@ -250,7 +250,20 @@ apr_status_t apr_socket_accept(apr_socke
     sa.salen = sizeof(sa.sa);
 
 #ifdef HAVE_ACCEPT4
-    s = accept4(sock->socketdes, (struct sockaddr *)&sa.sa, &sa.salen, \
SOCK_CLOEXEC); +    {
+        int flags = SOCK_CLOEXEC;
+
+#if defined(SOCK_NONBLOCK) && APR_O_NONBLOCK_INHERITED
+        /* With FreeBSD accept4() (avail in 10+), O_NONBLOCK is not inherited
+         * (unlike Linux).  Mimic the accept() behavior here in a way that
+         * may help other platforms.
+         */
+        if (apr_is_option_set(sock, APR_SO_NONBLOCK) == 1) {
+            flags |= SOCK_NONBLOCK;
+        }
+#endif
+        s = accept4(sock->socketdes, (struct sockaddr *)&sa.sa, &sa.salen, flags);
+    }
 #else
     s = accept(sock->socketdes, (struct sockaddr *)&sa.sa, &sa.salen);
 #endif


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic