summaryrefslogtreecommitdiffstats
path: root/src/socket_wrapper.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket_wrapper.c')
-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;
+ }
+}