From f8508200e90048523fc7c78467dc8e565744f7f9 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 28 Jan 2014 13:42:38 +0100 Subject: src: Add eventfd() to handle stale fds. Reviewed-by: Stefan Metzmacher --- ConfigureChecks.cmake | 2 ++ config.h.cmake | 2 ++ src/socket_wrapper.c | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake index 65f8b1a..35b8edc 100644 --- a/ConfigureChecks.cmake +++ b/ConfigureChecks.cmake @@ -49,12 +49,14 @@ endif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2) # HEADERS check_include_file(sys/filio.h HAVE_SYS_FILIO_H) check_include_file(sys/signalfd.h HAVE_SYS_SIGNALFD_H) +check_include_file(sys/eventfd.h HAVE_SYS_EVENTFD_H) # FUNCTIONS check_function_exists(strncpy HAVE_STRNCPY) check_function_exists(vsnprintf HAVE_VSNPRINTF) check_function_exists(snprintf HAVE_SNPRINTF) check_function_exists(signalfd HAVE_SIGNALFD) +check_function_exists(eventfd HAVE_EVENTFD) if (UNIX) if (NOT LINUX) diff --git a/config.h.cmake b/config.h.cmake index 6b29d5b..9632aa6 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -16,6 +16,7 @@ #cmakedefine HAVE_SYS_FILIO_H 1 #cmakedefine HAVE_SYS_SIGNALFD_H 1 +#cmakedefine HAVE_SYS_EVENTFD_H 1 /************************ STRUCT MEMBERS *************************/ @@ -27,6 +28,7 @@ /* Define to 1 if you have the `getaddrinfo' function. */ #cmakedefine HAVE_GETADDRINFO 1 #cmakedefine HAVE_SIGNALFD 1 +#cmakedefine HAVE_EVENTFD 1 #cmakedefine HAVE_ACCEPT_PSOCKLEN_T 1 #cmakedefine HAVE_IOCTL_INT 1 diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c index f78f4a5..941f660 100644 --- a/src/socket_wrapper.c +++ b/src/socket_wrapper.c @@ -53,6 +53,9 @@ #ifdef HAVE_SYS_SIGNALFD_H #include #endif +#ifdef HAVE_SYS_EVENTFD_H +#include +#endif #include #include #include @@ -286,6 +289,9 @@ struct swrap_libc_fns { socklen_t addrlen); int (*libc_dup)(int fd); int (*libc_dup2)(int oldfd, int newfd); +#ifdef HAVE_EVENTFD + int (*libc_eventfd)(int count, int flags); +#endif int (*libc_getpeername)(int sockfd, struct sockaddr *addr, socklen_t *addrlen); @@ -514,6 +520,15 @@ static int libc_dup2(int oldfd, int newfd) return swrap.fns.libc_dup2(oldfd, newfd); } +#ifdef HAVE_EVENTFD +static int libc_eventfd(int count, int flags) +{ + swrap_load_lib_function(SWRAP_LIBC, eventfd); + + return swrap.fns.libc_eventfd(count, flags); +} +#endif + static int libc_getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen) @@ -3934,6 +3949,29 @@ int dup2(int fd, int newfd) return swrap_dup2(fd, newfd); } +/**************************** + * DUP2 + ***************************/ + +#ifdef HAVE_EVENTFD +static int swrap_eventfd(int count, int flags) +{ + int fd; + + fd = libc_eventfd(count, flags); + if (fd != -1) { + swrap_remove_stale(fd); + } + + return fd; +} + +int eventfd(int count, int flags) +{ + return swrap_eventfd(count, flags); +} +#endif + /**************************** * DESTRUCTOR ***************************/ -- cgit