diff --git a/src/ipc_listener.cpp b/src/ipc_listener.cpp index 178f1456..23c782ee 100644 --- a/src/ipc_listener.cpp +++ b/src/ipc_listener.cpp @@ -390,7 +390,11 @@ zmq::fd_t zmq::ipc_listener_t::accept () // The situation where connection cannot be accepted due to insufficient // resources is considered valid and treated by ignoring the connection. zmq_assert (s != retired_fd); +#if defined ZMQ_HAVE_SOCK_CLOEXEC + fd_t sock = ::accept4 (s, (struct sockaddr *) &ss, &ss_len, SOCK_CLOEXEC); +#else fd_t sock = ::accept (s, NULL, NULL); +#endif if (sock == -1) { errno_assert (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR || errno == ECONNABORTED || errno == EPROTO || @@ -398,9 +402,9 @@ zmq::fd_t zmq::ipc_listener_t::accept () return retired_fd; } +#if !defined ZMQ_HAVE_SOCK_CLOEXEC && defined FD_CLOEXEC // Race condition can cause socket not to be closed (if fork happens // between accept and this point). -#ifdef FD_CLOEXEC int rc = fcntl (sock, F_SETFD, FD_CLOEXEC); errno_assert (rc != -1); #endif diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp index eac7f423..762f421f 100644 --- a/src/tcp_listener.cpp +++ b/src/tcp_listener.cpp @@ -273,7 +273,11 @@ zmq::fd_t zmq::tcp_listener_t::accept () #else socklen_t ss_len = sizeof (ss); #endif +#if defined ZMQ_HAVE_SOCK_CLOEXEC + fd_t sock = ::accept4 (s, (struct sockaddr *) &ss, &ss_len, SOCK_CLOEXEC); +#else fd_t sock = ::accept (s, (struct sockaddr *) &ss, &ss_len); +#endif #ifdef ZMQ_HAVE_WINDOWS if (sock == INVALID_SOCKET) { @@ -299,9 +303,9 @@ zmq::fd_t zmq::tcp_listener_t::accept () } #endif +#if !defined ZMQ_HAVE_SOCK_CLOEXEC && defined FD_CLOEXEC // Race condition can cause socket not to be closed (if fork happens // between accept and this point). -#ifdef FD_CLOEXEC int rc = fcntl (sock, F_SETFD, FD_CLOEXEC); errno_assert (rc != -1); #endif