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 --- src/socket_wrapper.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'src') 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