summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2013-06-30 11:50:12 +0200
committerAndreas Schneider <asn@cryptomilk.org>2013-06-30 11:50:12 +0200
commitb62f0568541a3a2510769c266b0ab2dbc757dc84 (patch)
tree0c82da81175ed44cde3ce829800f75cc184daaa8
parent2c118f9c3130bb022e19c9f37294ed768433e046 (diff)
downloadsocket_wrapper-b62f0568541a3a2510769c266b0ab2dbc757dc84.tar.gz
socket_wrapper-b62f0568541a3a2510769c266b0ab2dbc757dc84.tar.xz
socket_wrapper-b62f0568541a3a2510769c266b0ab2dbc757dc84.zip
src: Add a destructor to cleanup unix socket files.
-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;
+ }
+}