Package: libx11-protocol-perl Version: 0.56-4 Tags: ipv6, patch The INETSocket.pm module, as used by X11::Protocol, does currently rely on IO::Socket::INET, thus supporting connections over IPv4 only.
The fix is rather straightforward: the IO::Socket::INET6 class (which supports /both/ IPv6 /and/ IPv4) is to be checked at run-time, and, if available, used instead of IO::Socket::INET. (Much like the fix I’ve suggested [1] for Bug#306914.) An (untested) change is MIMEd. As a work-around, the software using X11::Protocol may simply “redirect” the IO::Socket::INET->new () class constructor to IO::Socket::INET6->new (), like: require IO::Socket::INET; require IO::Socket::INET6; *IO::Socket::INET::new = sub { my ($class, @args) = @_; ## . IO::Socket::INET6->new (@args); }; As a side effect, this may actually enable IPv6 support in all the other Perl code that uses IO::Socket::INET. (Potentially breaking it with unexpected values of ->peerhost (), etc.) [1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=306914#68 -- FSF associate member #7257
## to the top of X11/Protocol/Connection/INETSocket.pm our $SOCKET_CLASS; $SOCKET_CLASS = ((eval { require IO::Socket::INET6 }) ? "IO::Socket::INET6" : do { require IO::Socket::INET; "IO::Socket::INET"; }) unless (defined ($SOCKET_CLASS)); ## the ‘open’ function is then to be changed as follows: # my($host, $dispnum) = @_; # - my($sock) = IO::Socket::INET->new('PeerAddr' => $host, # + my($sock) = $SOCKET_CLASS->new ('PeerAddr' => $host, # 'PeerPort' => 6000 + $dispnum, # 'Type' => SOCK_STREAM(), # 'Proto' => "tcp"); # croak "Can't connect to display `$host:$dispnum': $!" unless $sock;