summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikko Koppanen <mkoppanen@php.net>2011-10-26 11:26:00 +0200
committerMartin Sustrik <sustrik@250bpm.com>2011-10-26 11:26:00 +0200
commit6c1b50cfab1529e866e40c037ce1be7027423af0 (patch)
tree2c970852a5792cf35c7290fdda2337ba279f414c
parentd31792e652cc9fd3bc84e2abd89f232d273b7ede (diff)
Added compile-time test for SOCK_CLOEXEC
Signed-off-by: Mikko Koppanen <mkoppanen@php.net>
-rw-r--r--acinclude.m422
-rw-r--r--configure.in5
-rw-r--r--src/ip.cpp4
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