summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2014-01-28 13:42:38 +0100
committerAndreas Schneider <asn@samba.org>2014-01-28 14:11:43 +0100
commitf8508200e90048523fc7c78467dc8e565744f7f9 (patch)
treec6e1ec24bdd926628f92bfd2e19a9e5f0fd58a75
parentdc0023293292d5247a5984e78fc10de9399da5f5 (diff)
downloadsocket_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.cmake2
-rw-r--r--config.h.cmake2
-rw-r--r--src/socket_wrapper.c38
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
***************************/