diff options
Diffstat (limited to 'src/socket_wrapper.c')
-rw-r--r-- | src/socket_wrapper.c | 29 |
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; + } +} |