]> Sergey Matveev's repositories - public-inbox.git/commitdiff
daemon: favor Socket.pm in Perl 5.14+ for IPv6
authorEric Wong <e@80x24.org>
Wed, 6 Feb 2019 11:07:41 +0000 (11:07 +0000)
committerEric Wong <e@80x24.org>
Thu, 7 Feb 2019 01:00:25 +0000 (01:00 +0000)
Users on Perl 5.14+ are common, so we can try the bundled Socket
(not "Socket6") module before attempting Socket6 for IPv6.

INSTALL
lib/PublicInbox/Daemon.pm

diff --git a/INSTALL b/INSTALL
index a89c8907e4552737366d382df972f4f5b3d318ce..ce2f8c9161afc21c552f9ddb78d35dc24039a33d 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -107,7 +107,8 @@ Numerous optional modules are likely to be useful as well:
                                rpm: perl-Socket6
                                (pulled in by SpamAssassin and Net::Server,
                                 only necessary if using IPv6 with
-                                Plack::Middleware::AccessLog or similar)
+                                Plack::Middleware::AccessLog or similar
+                                on Perl <= 5.12)
 
 On Fedora systems, you'll probably also end up wanting
 perl-Test-HTTP-Server-Simple, perl-Devel-Peek, and perl-IPC-Run to run the
index 033dd98ae4bc22abaf156c603e16ac9b0febfe44..48051f488b6c5bbd08408c291794cc9a041a9c86 100644 (file)
@@ -236,16 +236,23 @@ sub sockname ($) {
 
 sub unpack_ipv6 ($) {
        my ($addr) = @_;
+       my ($port, $host);
 
-       # TODO: support IO::Socket::IP which comes with Perl 5.24
-       # (perl-modules-5.24 in Debian)
+       # Socket.pm in Perl 5.14+ supports IPv6:
+       eval {
+               ($port, $host) = Socket::unpack_sockaddr_in6($addr);
+               $host = Socket::inet_ntop(Socket::AF_INET6(), $host);
+       };
 
-       # SpamAssassin and Net::Server use Socket6, so it may be installed
-       # on our system, already (otherwise die):
-       require Socket6;
+       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;
 
-       my ($port, $host) = Socket6::unpack_sockaddr_in6($addr);
-       $host = Socket6::inet_ntop(Socket6::AF_INET6(), $host);
+               ($port, $host) = Socket6::unpack_sockaddr_in6($addr);
+               $host = Socket6::inet_ntop(Socket6::AF_INET6(), $host);
+       }
        ($host, $port);
 }