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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user