X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=src%2FPVE%2FTools.pm;h=0e1af0908400f07e3bb6c6f62e5acd1d8943edc6;hb=4808fea7c0d04336d7440526ec769904b381ead1;hp=827ca58bcfec494e823b6d957599966f6b548ce7;hpb=b51b16e6f58de4cb385bd461d97866b3d94c93ec;p=pve-common.git diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm index 827ca58..0e1af09 100644 --- a/src/PVE/Tools.pm +++ b/src/PVE/Tools.pm @@ -3,7 +3,8 @@ package PVE::Tools; use strict; use warnings; use POSIX qw(EINTR); -use IO::Socket::INET; +use IO::Socket::IP; +use Socket qw(AF_INET AF_INET6 AI_ALL AI_V4MAPPED); use IO::Select; use File::Basename; use File::Path qw(make_path); @@ -691,11 +692,11 @@ sub next_unused_port { for (my $p = $range_start; $p < $range_end; $p++) { next if $ports->{$p}; # reserved - my $sock = IO::Socket::INET->new(Listen => 5, - LocalAddr => '0.0.0.0', - LocalPort => $p, - ReuseAddr => 1, - Proto => 0); + my $sock = IO::Socket::IP->new(Listen => 5, + LocalAddr => '0.0.0.0', + LocalPort => $p, + ReuseAddr => 1, + Proto => 0); if ($sock) { close($sock); @@ -1043,4 +1044,22 @@ sub fnv31a { sub fnv31a_hex { return sprintf("%X", fnv31a(@_)); } +sub unpack_sockaddr_in46 { + my ($sin) = @_; + my $family = Socket::sockaddr_family($sin); + my ($port, $host) = ($family == AF_INET6 ? Socket::unpack_sockaddr_in6($sin) + : Socket::unpack_sockaddr_in($sin)); + return ($family, $port, $host); +} + +sub get_host_address_family { + my ($hostname, $socktype) = @_; + my %hints = ( flags => AI_V4MAPPED | AI_ALL, + socktype => $socktype ); + my ($err, @res) = Socket::getaddrinfo($hostname, '0', \%hints); + die "failed to resolve $hostname: $err\n" if $err; + + return ${res[0]}->{family}; +} + 1;