Browse Source

Merge branch 'master-fix-vncserver-display-selector' of https://github.com/MarkMielke/tigervnc

tags/v1.10.90
Pierre Ossman 3 years ago
parent
commit
1aceb7045b
1 changed files with 33 additions and 60 deletions
  1. 33
    60
      unix/vncserver/vncserver.in

+ 33
- 60
unix/vncserver/vncserver.in View File

@@ -361,41 +361,46 @@ sub LoadXSession {

sub CheckDisplayNumber
{
local ($n) = @_;
my($n) = @_;

socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
if (!bind(S, pack('S n x12', $AF_INET, 6000 + $n))) {
close(S);
return 0;
}
close(S);
use Socket;

socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
if (!bind(S, pack('S n x12', $AF_INET, 5900 + $n))) {
close(S);
return 0;
}
close(S);
my $x11_lock_path = "/tmp/.X$n-lock";

if (-e "/tmp/.X$n-lock") {
warn "\nWarning: $host:$n is taken because of /tmp/.X$n-lock\n";
warn "Remove this file if there is no X server $host:$n\n";
return 0;
if (-e $x11_lock_path) {
my($pid) = `cat "$x11_lock_path"` =~ /^\s*(\d+)\s*$/;
if (defined($pid) && kill(0, $pid)) {
# Lock is associated with valid PID.
return 0;
}
}

if (-e "/tmp/.X11-unix/X$n") {
warn "\nWarning: $host:$n is taken because of /tmp/.X11-unix/X$n\n";
warn "Remove this file if there is no X server $host:$n\n";
return 0;
my $rfb_port = 5900 + $n;
my $x11_port = 6000 + $n;

for my $port ($rfb_port, $x11_port) {
# Bind to port to confirm it is not in use.
socket(S, PF_INET, SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
setsockopt(S, SOL_SOCKET, SO_REUSEADDR, 1);
if (!bind(S, sockaddr_in($port, INADDR_ANY))) {
# Port is in use.
close(S);
return 0;
}
close(S);
}

if (-e "/usr/spool/sockets/X11/$n") {
warn("\nWarning: $host:$n is taken because of ".
"/usr/spool/sockets/X11/$n\n");
warn "Remove this file if there is no X server $host:$n\n";
return 0;
my $x11_unix_domain = "/tmp/.X11-unix/X$n";

if (-e $x11_unix_domain) {
# 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;
@@ -446,36 +451,4 @@ sub SanityCheck
if (!defined($ENV{HOME})) {
die "$prog: The HOME environment variable is not set.\n";
}

#
# Find socket constants. 'use Socket' is a perl5-ism, so we wrap it in an
# eval, and if it fails we try 'require "sys/socket.ph"'. If this fails,
# we just guess at the values. If you find perl moaning here, just
# hard-code the values of AF_INET and SOCK_STREAM. You can find these out
# for your platform by looking in /usr/include/sys/socket.h and related
# files.
#

chop($os = `uname`);
chop($osrev = `uname -r`);

eval 'use Socket';
if ($@) {
eval 'require "sys/socket.ph"';
if ($@) {
if (($os eq "SunOS") && ($osrev !~ /^4/)) {
$AF_INET = 2;
$SOCK_STREAM = 2;
} else {
$AF_INET = 2;
$SOCK_STREAM = 1;
}
} else {
$AF_INET = &AF_INET;
$SOCK_STREAM = &SOCK_STREAM;
}
} else {
$AF_INET = &AF_INET;
$SOCK_STREAM = &SOCK_STREAM;
}
}

Loading…
Cancel
Save