Ver código fonte

Use accept4 with SOCK_CLOEXEC when available (Linux)

Stéphane Raimbault 13 anos atrás
pai
commit
2c5858513e
2 arquivos alterados com 9 adições e 1 exclusões
  1. 1 1
      configure.ac
  2. 8 0
      src/modbus-tcp.c

+ 1 - 1
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

+ 8 - 0
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 <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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;