diff --git a/socket.c b/socket.c index ba4625d..bc98a4f 100644 --- a/socket.c +++ b/socket.c @@ -1336,16 +1336,11 @@ SCK_Initialise(int family) void SCK_Finalise(void) { - int fd; - ARR_DestroyInstance(recv_sck_messages); ARR_DestroyInstance(recv_headers); ARR_DestroyInstance(recv_messages); - for (fd = first_reusable_fd; fd < first_reusable_fd + reusable_fds; fd++) - close(fd); - reusable_fds = 0; - first_reusable_fd = 0; + SCK_CloseReusableSockets(); initialised = 0; } @@ -1495,6 +1490,19 @@ SCK_IsReusable(int fd) /* ================================================== */ +void +SCK_CloseReusableSockets(void) +{ + int fd; + + for (fd = first_reusable_fd; fd < first_reusable_fd + reusable_fds; fd++) + close(fd); + reusable_fds = 0; + first_reusable_fd = 0; +} + +/* ================================================== */ + int SCK_SetIntOption(int sock_fd, int level, int name, int value) { diff --git a/socket.h b/socket.h index a2a1fd3..8b178e2 100644 --- a/socket.h +++ b/socket.h @@ -112,6 +112,9 @@ extern int SCK_OpenUnixSocketPair(int flags, int *other_fd); /* Check if a file descriptor was passed from the service manager */ extern int SCK_IsReusable(int sock_fd); +/* Close all reusable sockets before finalisation (e.g. in a helper process) */ +extern void SCK_CloseReusableSockets(void); + /* Set and get a socket option of int size */ extern int SCK_SetIntOption(int sock_fd, int level, int name, int value); extern int SCK_GetIntOption(int sock_fd, int level, int name, int *value);