Socket: Remove Unix domain listen sockets at shutdown.

If we don't remove the Unix domain listen socket file then when Unit
restarts it get an error like

  2023/02/25 23:10:11 [alert] 36388#36388 bind(\"unix:/tmp/unit.sock\") failed (98: Address already in use)

This patch makes use of the listen_sockets array, that is already
allocated in the main process but never populated, to place the Unix
domain listen sockets into.

At shutdown we can then loop through this array and unlink(2) any Unix
domain sockets found therein.

Closes: <https://github.com/nginx/unit/issues/792>
Reviewed-by: Alejandro Colomar <alx@nginx.com>
Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
This commit is contained in:
Andrew Clayton
2023-02-25 23:37:00 +00:00
parent 172ceba5b6
commit ccaad38bc5
2 changed files with 23 additions and 2 deletions

View File

@@ -1184,6 +1184,7 @@ nxt_main_listening_socket(nxt_sockaddr_t *sa, nxt_listening_socket_t *ls)
{ {
char *filename; char *filename;
mode_t access; mode_t access;
nxt_thread_t *thr;
filename = sa->u.sockaddr_un.sun_path; filename = sa->u.sockaddr_un.sun_path;
access = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); access = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
@@ -1194,6 +1195,9 @@ nxt_main_listening_socket(nxt_sockaddr_t *sa, nxt_listening_socket_t *ls)
filename, nxt_errno); filename, nxt_errno);
goto fail; goto fail;
} }
thr = nxt_thread();
nxt_runtime_listen_socket_add(thr->runtime, sa);
} }
#endif #endif

View File

@@ -563,6 +563,7 @@ nxt_runtime_exit(nxt_task_t *task, void *obj, void *data)
#if (NXT_HAVE_UNIX_DOMAIN) #if (NXT_HAVE_UNIX_DOMAIN)
{ {
size_t i;
nxt_sockaddr_t *sa; nxt_sockaddr_t *sa;
nxt_file_name_t *name; nxt_file_name_t *name;
@@ -572,6 +573,22 @@ nxt_runtime_exit(nxt_task_t *task, void *obj, void *data)
name = (nxt_file_name_t *) sa->u.sockaddr_un.sun_path; name = (nxt_file_name_t *) sa->u.sockaddr_un.sun_path;
(void) nxt_file_delete(name); (void) nxt_file_delete(name);
} }
for (i = 0; i < rt->listen_sockets->nelts; i++) {
nxt_listen_socket_t *ls;
ls = (nxt_listen_socket_t *) rt->listen_sockets->elts + i;
sa = ls->sockaddr;
if (sa->u.sockaddr.sa_family != AF_UNIX
|| sa->u.sockaddr_un.sun_path[0] == '\0')
{
continue;
}
name = (nxt_file_name_t *) sa->u.sockaddr_un.sun_path;
(void) nxt_file_delete(name);
}
} }
#endif #endif
} }