From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!/usr/bin/perl
use strict;
use Socket 1.95 qw(
PF_INET SOCK_STREAM IPPROTO_TCP pack_sockaddr_in INADDR_ANY
AI_PASSIVE AI_NUMERICSERV
);
my $AI_ADDRCONFIG = eval { Socket::AI_ADDRCONFIG() } || 0;
my @gai_args;
my @gai_rets;
no strict 'refs';
no warnings 'redefine';
*{"IO::Socket::IP::getaddrinfo"} = sub {
push @gai_args, [ @_ ];
return @{ shift @gai_rets };
};
@gai_args = ();
@gai_rets = (
[ "", {
family => PF_INET,
socktype => SOCK_STREAM,
protocol => IPPROTO_TCP,
addr => pack_sockaddr_in( 80, INADDR_ANY )
} ],
);
IO::Socket::IP->new( LocalPort => "80" );
is_deeply( \@gai_args,
[
[ undef, "80", { flags => AI_PASSIVE|$AI_ADDRCONFIG, socktype => SOCK_STREAM, protocol => IPPROTO_TCP } ],
],
'@gai_args for LocalPort => "80"' );
SKIP: {
skip "No AI_NUMERICSERV", 1 unless defined eval { AI_NUMERICSERV() };
@gai_args = ();
@gai_rets = (
[ "", {
family => PF_INET,
socktype => SOCK_STREAM,
protocol => IPPROTO_TCP,
addr => pack_sockaddr_in( 80, INADDR_ANY )
} ],
);
IO::Socket::IP->new( LocalPort => "80", GetAddrInfoFlags => AI_NUMERICSERV );
is_deeply( \@gai_args,
[
[ undef, "80", { flags => AI_PASSIVE|AI_NUMERICSERV, socktype => SOCK_STREAM, protocol => IPPROTO_TCP } ],
],
'@gai_args for LocalPort => "80", GetAddrInfoFlags => AI_NUMERICSERV' );
}
done_testing;