From 2c5858513e2bd00c92f27b356f5bd3ed35b92ce0 Mon Sep 17 00:00:00 2001 From: Stéphane Raimbault Date: Wed, 2 Nov 2011 23:42:33 +0100 Subject: [PATCH] Use accept4 with SOCK_CLOEXEC when available (Linux) --- configure.ac | 2 +- src/modbus-tcp.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 0d9bc8c..8266b5b 100644 --- a/configure.ac +++ b/configure.ac @@ -101,7 +101,7 @@ AC_CHECK_DECLS([__CYGWIN__]) # Checks for library functions. AC_FUNC_FORK -AC_CHECK_FUNCS([gettimeofday inet_ntoa memset select socket strerror strlcpy getaddrinfo]) +AC_CHECK_FUNCS([accept4 getaddrinfo gettimeofday inet_ntoa memset select socket strerror strlcpy]) # Add -Wall -Werror for GCC if not already there if test "x$GCC" = "xyes"; then diff --git a/src/modbus-tcp.c b/src/modbus-tcp.c index b215b18..11b11f1 100644 --- a/src/modbus-tcp.c +++ b/src/modbus-tcp.c @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/* For accept4 when available */ +#define _GNU_SOURCE #include #include #include @@ -526,7 +528,13 @@ int modbus_tcp_accept(modbus_t *ctx, int *socket) socklen_t addrlen; addrlen = sizeof(addr); +#ifdef HAVE_ACCEPT4 + /* Inherit socket flags and use accept4 call */ + ctx->s = accept4(*socket, (struct sockaddr *)&addr, &addrlen, SOCK_CLOEXEC); +#else ctx->s = accept(*socket, (struct sockaddr *)&addr, &addrlen); +#endif + if (ctx->s == -1) { close(*socket); *socket = 0; -- libgit2 0.21.4