If the X server is not shut down cleanly, it can leave UNIX domain
sockets around that "vncserver" has previously mis-identified as
evidence that the display number is still in use.
Instead of checking for existence of /tmp/.X11-unix/X<n>, the code
will now attempt to connect to the socket to confirm that there is a
server process listening on this UNIX domain socket. This will
eliminate false positives in the case the UNIX domain socket still
exists but is not associated with a listening Xorg server. The Xorg
server does not have a problem with fixing this file when it next
starts up. It is only important to avoid using the port if it is still
in use.
my $x11_unix_domain = "/tmp/.X11-unix/X$n";
if (-e $x11_unix_domain) {
- warn "\nWarning: $host:$n is taken because of $x11_unix_domain\n";
- warn "Remove this file if there is no X server $host:$n\n";
- return 0;
+ # Connect to UNIX domain socket to confirm it is not in use.
+ socket(S, PF_UNIX, SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
+ if (connect(S, sockaddr_un($x11_unix_domain))) {
+ # UNIX domain socket is in use.
+ close(S);
+ return 0;
+ }
+ close(S);
}
return 1;