From b62f0568541a3a2510769c266b0ab2dbc757dc84 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sun, 30 Jun 2013 11:50:12 +0200 Subject: src: Add a destructor to cleanup unix socket files. --- ConfigureChecks.cmake | 12 ++++++++++++ config.h.cmake | 1 + src/socket_wrapper.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake index 6dfac8a..10373c1 100644 --- a/ConfigureChecks.cmake +++ b/ConfigureChecks.cmake @@ -132,6 +132,18 @@ int main(void) { return 0; }" HAVE_SOCKADDR_STORAGE) +check_c_source_compiles(" +void test_destructor_attribute(void) __attribute__ ((destructor)); + +void test_destructor_attribute(void) +{ + return; +} + +int main(void) { + return 0; +}" HAVE_DESTRUCTOR_ATTRIBUTE) + check_library_exists(dl dlopen "" HAVE_LIBDL) if (HAVE_LIBDL) find_library(DLFCN_LIBRARY dl) diff --git a/config.h.cmake b/config.h.cmake index 97e2b1e..99c599f 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -28,6 +28,7 @@ /**************************** OPTIONS ****************************/ +#cmakedefine HAVE_DESTRUCTOR_ATTRIBUTE 1 #cmakedefine HAVE_SOCKADDR_STORAGE 1 #cmakedefine HAVE_IPV6 1 diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c index f7f5654..ea871ce 100644 --- a/src/socket_wrapper.c +++ b/src/socket_wrapper.c @@ -81,6 +81,12 @@ enum swrap_dbglvl_e { #define PRINTF_ATTRIBUTE(a,b) #endif /* __GNUC__ */ +#ifdef HAVE_DESTRUCTOR_ATTRIBUTE +#define DESTRUCTOR_ATTRIBUTE __attribute__ ((destructor)) +#else +#define DESTRUCTOR_ATTRIBUTE +#endif + static void swrap_log(enum swrap_dbglvl_e dbglvl, const char *format, ...) PRINTF_ATTRIBUTE(2, 3); static void swrap_log(enum swrap_dbglvl_e dbglvl, const char *format, ...) @@ -206,6 +212,8 @@ static void swrap_log(enum swrap_dbglvl_e dbglvl, const char *format, ...) * without changing the format above */ #define MAX_WRAPPED_INTERFACES 40 +void swrap_destructor(void) DESTRUCTOR_ATTRIBUTE; + /********************************************************* * SWRAP LOADING LIBC FUNCTIONS *********************************************************/ @@ -3263,3 +3271,24 @@ int dup2(int fd, int newfd) { return swrap_dup2(fd, newfd); } + +/**************************** + * DESTRUCTOR + ***************************/ + +/* + * This function is called when the library is unloaded and makes sure that + * sockets get closed and the unix file for the socket are unlinked. + */ +void swrap_destructor(void) +{ + struct socket_info *s = sockets; + + while (s != NULL) { + struct socket_info_fd *f = s->fds; + if (f != NULL) { + swrap_close(f->fd); + } + s = sockets; + } +} -- cgit