summaryrefslogtreecommitdiffstats
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-rw-r--r--src/socket_wrapper.c29
1 files changed, 29 insertions, 0 deletions
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;
+ }
+}