use warnings;
use POSIX qw(EINTR EEXIST EOPNOTSUPP);
use IO::Socket::IP;
-use Socket qw(AF_INET AF_INET6 AI_ALL AI_V4MAPPED AI_CANONNAME SOCK_DGRAM);
+use Socket qw(AF_INET AF_INET6 AI_ALL AI_V4MAPPED AI_CANONNAME SOCK_DGRAM
+ IPPROTO_TCP);
use IO::Select;
use File::Basename;
use File::Path qw(make_path);
}
sub next_unused_port {
- my ($range_start, $range_end, $family) = @_;
+ my ($range_start, $range_end, $family, $address) = @_;
# We use a file to register allocated ports.
# Those registrations expires after $expiretime.
}
my $newport;
+ my %sockargs = (Listen => 5,
+ ReuseAddr => 1,
+ Family => $family,
+ Proto => IPPROTO_TCP,
+ GetAddrInfoFlags => 0);
+ $sockargs{LocalAddr} = $address if defined($address);
for (my $p = $range_start; $p < $range_end; $p++) {
next if $ports->{$p}; # reserved
- my $sock = IO::Socket::IP->new(Listen => 5,
- LocalPort => $p,
- ReuseAddr => 1,
- Family => $family,
- Proto => 0,
- GetAddrInfoFlags => 0);
+ $sockargs{LocalPort} = $p;
+ my $sock = IO::Socket::IP->new(%sockargs);
if ($sock) {
close($sock);
}
sub next_migrate_port {
- my ($family) = @_;
- return next_unused_port(60000, 60050, $family);
+ my ($family, $address) = @_;
+ return next_unused_port(60000, 60050, $family, $address);
}
sub next_vnc_port {
- my ($family) = @_;
- return next_unused_port(5900, 6000, $family);
+ my ($family, $address) = @_;
+ return next_unused_port(5900, 6000, $family, $address);
}
sub next_spice_port {
- my ($family) = @_;
- return next_unused_port(61000, 61099, $family);
+ my ($family, $address) = @_;
+ return next_unused_port(61000, 61099, $family, $address);
}
# NOTE: NFS syscall can't be interrupted, so alarm does