From 6c1b50cfab1529e866e40c037ce1be7027423af0 Mon Sep 17 00:00:00 2001 From: Mikko Koppanen Date: Wed, 26 Oct 2011 11:26:00 +0200 Subject: Added compile-time test for SOCK_CLOEXEC Signed-off-by: Mikko Koppanen --- 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 @@ -581,6 +581,28 @@ AC_DEFUN([LIBZMQ_CHECK_LANG_VISIBILITY], [{ [AC_MSG_RESULT(yes) ; $1], [AC_MSG_RESULT(no) ; $2]) }]) +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 +#include + +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 # 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 -- cgit v1.2.3