passt: Don't fork into background until the UNIX domain socket isn't listening

Once passt forks to background, it should be guaranteed that the UNIX
domain socket is available, otherwise, if qemu is started right after
it, it might fail to connect.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Stefano Brivio 2021-05-10 13:15:52 +02:00
parent 6f89dc3650
commit 0328e2a1f7

11
passt.c
View file

@ -757,10 +757,6 @@ int main(int argc, char **argv)
openlog("passt", LOG_PERROR, LOG_DAEMON); openlog("passt", LOG_PERROR, LOG_DAEMON);
#else #else
openlog("passt", 0, LOG_DAEMON); openlog("passt", 0, LOG_DAEMON);
if (daemon(0, 0)) {
fprintf(stderr, "Failed to fork into background\n");
exit(EXIT_FAILURE);
}
#endif #endif
get_routes(&c); get_routes(&c);
@ -812,6 +808,13 @@ listen:
info(" kvm ... -net socket,connect=" info(" kvm ... -net socket,connect="
UNIX_SOCK_PATH " -net nic,model=virtio"); UNIX_SOCK_PATH " -net nic,model=virtio");
#ifndef DEBUG
if (daemon(0, 0)) {
fprintf(stderr, "Failed to fork into background\n");
exit(EXIT_FAILURE);
}
#endif
c.fd_unix = accept(fd_unix, NULL, NULL); c.fd_unix = accept(fd_unix, NULL, NULL);
ev.events = EPOLLIN | EPOLLRDHUP | EPOLLERR | EPOLLHUP; ev.events = EPOLLIN | EPOLLRDHUP | EPOLLERR | EPOLLHUP;
ev.data.fd = c.fd_unix; ev.data.fd = c.fd_unix;