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;