Commit 2c5858513e2bd00c92f27b356f5bd3ed35b92ce0
1 parent
b94ba026
Use accept4 with SOCK_CLOEXEC when available (Linux)
Showing
2 changed files
with
9 additions
and
1 deletions
configure.ac
| ... | ... | @@ -101,7 +101,7 @@ AC_CHECK_DECLS([__CYGWIN__]) |
| 101 | 101 | |
| 102 | 102 | # Checks for library functions. |
| 103 | 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 | 106 | # Add -Wall -Werror for GCC if not already there |
| 107 | 107 | if test "x$GCC" = "xyes"; then | ... | ... |
src/modbus-tcp.c
| ... | ... | @@ -16,6 +16,8 @@ |
| 16 | 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 | 21 | #include <stdio.h> |
| 20 | 22 | #include <stdlib.h> |
| 21 | 23 | #include <string.h> |
| ... | ... | @@ -526,7 +528,13 @@ int modbus_tcp_accept(modbus_t *ctx, int *socket) |
| 526 | 528 | socklen_t addrlen; |
| 527 | 529 | |
| 528 | 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 | 535 | ctx->s = accept(*socket, (struct sockaddr *)&addr, &addrlen); |
| 536 | +#endif | |
| 537 | + | |
| 530 | 538 | if (ctx->s == -1) { |
| 531 | 539 | close(*socket); |
| 532 | 540 | *socket = 0; | ... | ... |