On Mon Jan 20 11:02:15 2014, PEVANS wrote:
Show quoted text> * I could recreate a basic test using low-level socket(), bind() and
> getsockaddr() calls correctly
On further thought this seems the only reasonable option.
Find patch attached.
--
Paul Evans
=== modified file 't/01local-client-v4.t'
--- t/01local-client-v4.t 2013-09-19 13:15:34 +0000
+++ t/01local-client-v4.t 2014-01-20 16:07:50 +0000
@@ -8,13 +8,14 @@
use IO::Socket::IP;
use IO::Socket::INET;
-use Socket qw( inet_ntoa unpack_sockaddr_in );
+use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in );
# Some odd locations like BSD jails might not like INADDR_LOOPBACK. We'll
# establish a baseline first to test against
my $INADDR_LOOPBACK = do {
- my $localsock = IO::Socket::INET->new( LocalAddr => "localhost", Listen => 1 );
- $localsock->sockaddr;
+ socket my $sockh, PF_INET, SOCK_STREAM, 0 or die "Cannot socket(PF_INET) - $!";
+ bind $sockh, pack_sockaddr_in( 0, inet_aton( "127.0.0.1" ) ) or die "Cannot bind() - $!";
+ ( unpack_sockaddr_in( getsockname $sockh ) )[1];
};
my $INADDR_LOOPBACK_HOST = inet_ntoa( $INADDR_LOOPBACK );
if( $INADDR_LOOPBACK ne INADDR_LOOPBACK ) {
=== modified file 't/02local-server-v4.t'
--- t/02local-server-v4.t 2013-09-19 13:15:34 +0000
+++ t/02local-server-v4.t 2014-01-20 16:07:53 +0000
@@ -8,13 +8,14 @@
use IO::Socket::IP;
use IO::Socket::INET;
-use Socket qw( inet_ntoa unpack_sockaddr_in );
+use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in );
# Some odd locations like BSD jails might not like INADDR_LOOPBACK. We'll
# establish a baseline first to test against
my $INADDR_LOOPBACK = do {
- my $localsock = IO::Socket::INET->new( LocalAddr => "localhost", Listen => 1 );
- $localsock->sockaddr;
+ socket my $sockh, PF_INET, SOCK_STREAM, 0 or die "Cannot socket(PF_INET) - $!";
+ bind $sockh, pack_sockaddr_in( 0, inet_aton( "127.0.0.1" ) ) or die "Cannot bind() - $!";
+ ( unpack_sockaddr_in( getsockname $sockh ) )[1];
};
my $INADDR_LOOPBACK_HOST = inet_ntoa( $INADDR_LOOPBACK );
if( $INADDR_LOOPBACK ne INADDR_LOOPBACK ) {
=== modified file 't/04local-client-v6.t'
--- t/04local-client-v6.t 2013-07-26 14:07:04 +0000
+++ t/04local-client-v6.t 2014-01-20 16:48:30 +0000
@@ -6,13 +6,23 @@
use Test::More;
use IO::Socket::IP;
-use Socket;
+use Socket qw( inet_pton inet_ntop pack_sockaddr_in6 unpack_sockaddr_in6 IN6ADDR_LOOPBACK );
-my $AF_INET6 = eval { require Socket and Socket::AF_INET6() } or
+my $AF_INET6 = eval { Socket::AF_INET6() } or
plan skip_all => "No AF_INET6";
-eval { IO::Socket::IP->new( LocalHost => "::1" ) } or
- plan skip_all => "Unable to bind to ::1";
+# Some odd locations like BSD jails might not like IN6ADDR_LOOPBACK. We'll
+# establish a baseline first to test against
+my $IN6ADDR_LOOPBACK = eval {
+ socket my $sockh, Socket::PF_INET6(), SOCK_STREAM, 0 or die "Cannot socket(PF_INET6) - $!";
+ bind $sockh, pack_sockaddr_in6( 0, inet_pton( $AF_INET6, "::1" ) ) or die "Cannot bind() - $!";
+ ( unpack_sockaddr_in6( getsockname $sockh ) )[1];
+} or plan skip_all => "Unable to bind to ::1 - $@";
+my $IN6ADDR_LOOPBACK_HOST = inet_ntop( $AF_INET6, $IN6ADDR_LOOPBACK );
+if( $IN6ADDR_LOOPBACK ne IN6ADDR_LOOPBACK ) {
+ diag( "Testing with IN6ADDR_LOOPBACK=$IN6ADDR_LOOPBACK_HOST; this may be because of odd networking" );
+}
+my $IN6ADDR_LOOPBACK_HEX = unpack "H*", $IN6ADDR_LOOPBACK;
# Unpack just ip6_addr and port because other fields might not match end to end
sub unpack_sockaddr_in6_addrport {
@@ -67,10 +77,10 @@
is( $socket->peerport, $testport, "\$socket->peerport for $socktype" );
# Unpack just so it pretty prints without wrecking the terminal if it fails
- is( unpack("H*", $socket->peeraddr), "0000"x7 . "0001", "\$socket->peeraddr for $socktype" );
+ is( unpack("H*", $socket->peeraddr), $IN6ADDR_LOOPBACK_HEX, "\$testclient->peeraddr for $socktype" );
if( $socktype eq "SOCK_STREAM" ) {
# Some OSes don't update sockaddr with a local bind() on SOCK_DGRAM sockets
- is( unpack("H*", $socket->sockaddr), "0000"x7 . "0001", "\$socket->sockaddr for $socktype" );
+ is( unpack("H*", $socket->sockaddr), $IN6ADDR_LOOPBACK_HEX, "\$testclient->sockaddr for $socktype" );
}
# Can't easily test the non-numeric versions without relying on the system's
=== modified file 't/05local-server-v6.t'
--- t/05local-server-v6.t 2013-07-26 14:07:04 +0000
+++ t/05local-server-v6.t 2014-01-20 16:48:30 +0000
@@ -6,13 +6,23 @@
use Test::More;
use IO::Socket::IP;
-use Socket;
+use Socket qw( inet_pton inet_ntop pack_sockaddr_in6 unpack_sockaddr_in6 IN6ADDR_LOOPBACK );
-my $AF_INET6 = eval { require Socket and Socket::AF_INET6() } or
+my $AF_INET6 = eval { Socket::AF_INET6() } or
plan skip_all => "No AF_INET6";
-eval { IO::Socket::IP->new( LocalHost => "::1" ) } or
- plan skip_all => "Unable to bind to ::1";
+# Some odd locations like BSD jails might not like IN6ADDR_LOOPBACK. We'll
+# establish a baseline first to test against
+my $IN6ADDR_LOOPBACK = eval {
+ socket my $sockh, Socket::PF_INET6(), SOCK_STREAM, 0 or die "Cannot socket(PF_INET6) - $!";
+ bind $sockh, pack_sockaddr_in6( 0, inet_pton( $AF_INET6, "::1" ) ) or die "Cannot bind() - $!";
+ ( unpack_sockaddr_in6( getsockname $sockh ) )[1];
+} or plan skip_all => "Unable to bind to ::1 - $@";
+my $IN6ADDR_LOOPBACK_HOST = inet_ntop( $AF_INET6, $IN6ADDR_LOOPBACK );
+if( $IN6ADDR_LOOPBACK ne IN6ADDR_LOOPBACK ) {
+ diag( "Testing with IN6ADDR_LOOPBACK=$IN6ADDR_LOOPBACK_HOST; this may be because of odd networking" );
+}
+my $IN6ADDR_LOOPBACK_HEX = unpack "H*", $IN6ADDR_LOOPBACK;
# Unpack just ip6_addr and port because other fields might not match end to end
sub unpack_sockaddr_in6_addrport {
@@ -69,10 +79,10 @@
is( $testclient->peerport, $sockport, "\$testclient->peerport for $socktype" );
# Unpack just so it pretty prints without wrecking the terminal if it fails
- is( unpack("H*", $testclient->peeraddr), "0000"x7 . "0001", "\$testclient->peeraddr for $socktype" );
+ is( unpack("H*", $testclient->peeraddr), $IN6ADDR_LOOPBACK_HEX, "\$testclient->peeraddr for $socktype" );
if( $socktype eq "SOCK_STREAM" ) {
# Some OSes don't update sockaddr with a local bind() on SOCK_DGRAM sockets
- is( unpack("H*", $testclient->sockaddr), "0000"x7 . "0001", "\$testclient->sockaddr for $socktype" );
+ is( unpack("H*", $testclient->sockaddr), $IN6ADDR_LOOPBACK_HEX, "\$testclient->sockaddr for $socktype" );
}
}
=== modified file 't/30nonblocking-connect.t'
--- t/30nonblocking-connect.t 2013-09-19 13:15:34 +0000
+++ t/30nonblocking-connect.t 2014-01-20 16:07:45 +0000
@@ -8,13 +8,15 @@
use IO::Socket::IP;
use IO::Socket::INET;
+use Socket qw( inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in );
use Errno qw( EINPROGRESS EWOULDBLOCK );
# Some odd locations like BSD jails might not like INADDR_LOOPBACK. We'll
# establish a baseline first to test against
my $INADDR_LOOPBACK = do {
- my $localsock = IO::Socket::INET->new( LocalAddr => "localhost", Listen => 1 );
- $localsock->sockaddr;
+ socket my $sockh, PF_INET, SOCK_STREAM, 0 or die "Cannot socket(PF_INET) - $!";
+ bind $sockh, pack_sockaddr_in( 0, inet_aton( "127.0.0.1" ) ) or die "Cannot bind() - $!";
+ ( unpack_sockaddr_in( getsockname $sockh ) )[1];
};
my $INADDR_LOOPBACK_HOST = inet_ntoa( $INADDR_LOOPBACK );
if( $INADDR_LOOPBACK ne INADDR_LOOPBACK ) {