diff options
| author | Andreas Schneider <asn@samba.org> | 2014-01-28 13:42:38 +0100 |
|---|---|---|
| committer | Andreas Schneider <asn@samba.org> | 2014-01-28 14:11:43 +0100 |
| commit | f8508200e90048523fc7c78467dc8e565744f7f9 (patch) | |
| tree | c6e1ec24bdd926628f92bfd2e19a9e5f0fd58a75 | |
| parent | dc0023293292d5247a5984e78fc10de9399da5f5 (diff) | |
| download | socket_wrapper-f8508200e90048523fc7c78467dc8e565744f7f9.tar.gz socket_wrapper-f8508200e90048523fc7c78467dc8e565744f7f9.tar.xz socket_wrapper-f8508200e90048523fc7c78467dc8e565744f7f9.zip | |
src: Add eventfd() to handle stale fds.
Reviewed-by: Stefan Metzmacher <metze@samba.org>
| -rw-r--r-- | ConfigureChecks.cmake | 2 | ||||
| -rw-r--r-- | config.h.cmake | 2 | ||||
| -rw-r--r-- | src/socket_wrapper.c | 38 |
3 files changed, 42 insertions, 0 deletions
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 <sys/signalfd.h> #endif +#ifdef HAVE_SYS_EVENTFD_H +#include <sys/eventfd.h> +#endif #include <sys/uio.h> #include <errno.h> #include <sys/un.h> @@ -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) @@ -3935,6 +3950,29 @@ int dup2(int fd, int 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 ***************************/ |
