]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Daemon.pm
daemon: favor Socket.pm in Perl 5.14+ for IPv6
[public-inbox.git] / lib / PublicInbox / Daemon.pm
index 6d2ae81bc1694dcc3c9fbf1ae2cbf7b249c3153d..48051f488b6c5bbd08408c291794cc9a041a9c86 100644 (file)
@@ -234,6 +234,28 @@ sub sockname ($) {
        "$host:$port";
 }
 
+sub unpack_ipv6 ($) {
+       my ($addr) = @_;
+       my ($port, $host);
+
+       # Socket.pm in Perl 5.14+ supports IPv6:
+       eval {
+               ($port, $host) = Socket::unpack_sockaddr_in6($addr);
+               $host = Socket::inet_ntop(Socket::AF_INET6(), $host);
+       };
+
+       if ($@) {
+               # Perl 5.12 or earlier?  SpamAssassin and Net::Server use
+               # Socket6, so it may be installed on our system, already
+               # (otherwise die here):
+               require Socket6;
+
+               ($port, $host) = Socket6::unpack_sockaddr_in6($addr);
+               $host = Socket6::inet_ntop(Socket6::AF_INET6(), $host);
+       }
+       ($host, $port);
+}
+
 sub host_with_port ($) {
        my ($addr) = @_;
        my ($port, $host);
@@ -241,9 +263,7 @@ sub host_with_port ($) {
        # this eval will die on Unix sockets:
        eval {
                if (length($addr) >= 28) {
-                       require Socket6;
-                       ($port, $host) = Socket6::unpack_sockaddr_in6($addr);
-                       $host = Socket6::inet_ntop(Socket6::AF_INET6(), $host);
+                       ($host, $port) = unpack_ipv6($addr);
                        $host = "[$host]";
                } else {
                        ($port, $host) = Socket::sockaddr_in($addr);