diff options
| author | Andreas Schneider <asn@cryptomilk.org> | 2013-06-30 11:50:12 +0200 |
|---|---|---|
| committer | Andreas Schneider <asn@cryptomilk.org> | 2013-06-30 11:50:12 +0200 |
| commit | b62f0568541a3a2510769c266b0ab2dbc757dc84 (patch) | |
| tree | 0c82da81175ed44cde3ce829800f75cc184daaa8 /src | |
| parent | 2c118f9c3130bb022e19c9f37294ed768433e046 (diff) | |
| download | socket_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.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; + } +} |
