summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ConfigureChecks.cmake12
-rw-r--r--config.h.cmake1
-rw-r--r--src/socket_wrapper.c29
3 files changed, 42 insertions, 0 deletions
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;
+ }
+}