INSTALL | 3 ++- lib/PublicInbox/Daemon.pm | 21 ++++++++++++++------- diff --git a/INSTALL b/INSTALL index a89c8907e4552737366d382df972f4f5b3d318ce..ce2f8c9161afc21c552f9ddb78d35dc24039a33d 100644 --- a/INSTALL +++ b/INSTALL @@ -107,7 +107,8 @@ - Socket6 deb: libsocket6-perl 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 diff --git a/lib/PublicInbox/Daemon.pm b/lib/PublicInbox/Daemon.pm index 033dd98ae4bc22abaf156c603e16ac9b0febfe44..48051f488b6c5bbd08408c291794cc9a041a9c86 100644 --- a/lib/PublicInbox/Daemon.pm +++ b/lib/PublicInbox/Daemon.pm @@ -236,16 +236,23 @@ } 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); }