Commit 2c5858513e2bd00c92f27b356f5bd3ed35b92ce0

Authored by Stéphane Raimbault
1 parent b94ba026

Use accept4 with SOCK_CLOEXEC when available (Linux)

configure.ac
@@ -101,7 +101,7 @@ AC_CHECK_DECLS([__CYGWIN__]) @@ -101,7 +101,7 @@ AC_CHECK_DECLS([__CYGWIN__])
101 101
102 # Checks for library functions. 102 # Checks for library functions.
103 AC_FUNC_FORK 103 AC_FUNC_FORK
104 -AC_CHECK_FUNCS([gettimeofday inet_ntoa memset select socket strerror strlcpy getaddrinfo]) 104 +AC_CHECK_FUNCS([accept4 getaddrinfo gettimeofday inet_ntoa memset select socket strerror strlcpy])
105 105
106 # Add -Wall -Werror for GCC if not already there 106 # Add -Wall -Werror for GCC if not already there
107 if test "x$GCC" = "xyes"; then 107 if test "x$GCC" = "xyes"; then
src/modbus-tcp.c
@@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */ 17 */
18 18
  19 +/* For accept4 when available */
  20 +#define _GNU_SOURCE
19 #include <stdio.h> 21 #include <stdio.h>
20 #include <stdlib.h> 22 #include <stdlib.h>
21 #include <string.h> 23 #include <string.h>
@@ -526,7 +528,13 @@ int modbus_tcp_accept(modbus_t *ctx, int *socket) @@ -526,7 +528,13 @@ int modbus_tcp_accept(modbus_t *ctx, int *socket)
526 socklen_t addrlen; 528 socklen_t addrlen;
527 529
528 addrlen = sizeof(addr); 530 addrlen = sizeof(addr);
  531 +#ifdef HAVE_ACCEPT4
  532 + /* Inherit socket flags and use accept4 call */
  533 + ctx->s = accept4(*socket, (struct sockaddr *)&addr, &addrlen, SOCK_CLOEXEC);
  534 +#else
529 ctx->s = accept(*socket, (struct sockaddr *)&addr, &addrlen); 535 ctx->s = accept(*socket, (struct sockaddr *)&addr, &addrlen);
  536 +#endif
  537 +
530 if (ctx->s == -1) { 538 if (ctx->s == -1) {
531 close(*socket); 539 close(*socket);
532 *socket = 0; 540 *socket = 0;