>From 6c1b50cfab1529e866e40c037ce1be7027423af0 Mon Sep 17 00:00:00 2001
From: Mikko Koppanen <[email protected]>
Date: Wed, 26 Oct 2011 11:26:00 +0200
Subject: [PATCH] Added compile-time test for SOCK_CLOEXEC

Signed-off-by: Mikko Koppanen <[email protected]>
---
 acinclude.m4 |   22 ++++++++++++++++++++++
 configure.in |    5 +++++
 src/ip.cpp   |    4 ++--
 3 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/acinclude.m4 b/acinclude.m4
index 7e96921..537be18 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -582,6 +582,28 @@ AC_DEFUN([LIBZMQ_CHECK_LANG_VISIBILITY], [{
 }])
 
 dnl ################################################################################
+dnl # LIBZMQ_CHECK_SOCK_CLOEXEC([action-if-found], [action-if-not-found])          #
+dnl # Check if SOCK_CLOEXEC is supported                                           #
+dnl ################################################################################
+AC_DEFUN([LIBZMQ_CHECK_SOCK_CLOEXEC], [{
+    AC_MSG_CHECKING(whether SOCK_CLOEXEC is supported)
+    AC_TRY_RUN([/* SOCK_CLOEXEC test */
+#include <sys/types.h>
+#include <sys/socket.h>
+
+int main (int argc, char *argv [])
+{
+    int s = socket (PF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
+    return (s == -1);
+}
+    ],
+    [AC_MSG_RESULT(yes) ; libzmq_cv_sock_cloexec="yes" ; $1],
+    [AC_MSG_RESULT(no)  ; libzmq_cv_sock_cloexec="no"  ; $2],
+    [AC_MSG_RESULT(not during cross-compile) ; libzmq_cv_sock_cloexec="no"]
+    )
+}])
+
+dnl ################################################################################
 dnl # LIBZMQ_CHECK_POLLER_KQUEUE([action-if-found], [action-if-not-found])         #
 dnl # Checks kqueue polling system                                                 #
 dnl ################################################################################
diff --git a/configure.in b/configure.in
index ed8fa14..b0ee7a1 100644
--- a/configure.in
+++ b/configure.in
@@ -383,6 +383,11 @@ AM_CONDITIONAL(ON_MINGW, test "x$libzmq_on_mingw32" = "xyes")
 AC_TYPE_SIGNAL
 AC_CHECK_FUNCS(perror gettimeofday memset socket getifaddrs freeifaddrs)
 AC_CHECK_HEADERS([alloca.h])
+LIBZMQ_CHECK_SOCK_CLOEXEC([AC_DEFINE(
+                              [ZMQ_HAVE_SOCK_CLOEXEC],
+                              [1],
+                              [Whether SOCK_CLOEXEC is defined and functioning.])
+                          ])
 
 # Subst LIBZMQ_EXTRA_CFLAGS & CXXFLAGS & LDFLAGS
 AC_SUBST(LIBZMQ_EXTRA_CFLAGS)
diff --git a/src/ip.cpp b/src/ip.cpp
index b11a244..8090a8a 100644
--- a/src/ip.cpp
+++ b/src/ip.cpp
@@ -40,7 +40,7 @@ zmq::fd_t zmq::open_socket (int domain_, int type_, int protocol_)
 {
     //  Setting this option result in sane behaviour when exec() functions
     //  are used. Old sockets are closed and don't block TCP ports etc.
-#if defined SOCK_CLOEXEC
+#if defined ZMQ_HAVE_SOCK_CLOEXEC
     type_ |= SOCK_CLOEXEC;
 #endif
 
@@ -51,7 +51,7 @@ zmq::fd_t zmq::open_socket (int domain_, int type_, int protocol_)
     //  If there's no SOCK_CLOEXEC, let's try the second best option. Note that
     //  race condition can cause socket not to be closed (if fork happens
     //  between socket creation and this point).
-#if !defined SOCK_CLOEXEC && defined FD_CLOEXEC
+#if !defined ZMQ_HAVE_SOCK_CLOEXEC && defined FD_CLOEXEC
     int rc = fcntl (s, F_SETFD, FD_CLOEXEC);
     errno_assert (rc != -1);
 #endif
-- 
1.7.0.4

_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to