]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/Tools.pm
provide Tools::unpack_sockaddr_in46
[pve-common.git] / src / PVE / Tools.pm
index 827ca58bcfec494e823b6d957599966f6b548ce7..75ca5a6a70ebabf726c1b771fe98ed10a89feed7 100644 (file)
@@ -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);
 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,12 @@ 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);
+}
+
 1;