/usr/share/perl5/Socket/GetAddrInfo.pm is in libsocket-getaddrinfo-perl 0.20-2build2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 | # You may distribute under the terms of either the GNU General Public License
# or the Artistic License (the same terms as Perl itself)
#
# (C) Paul Evans, 2007-2011 -- leonerd@leonerd.org.uk
package Socket::GetAddrInfo;
use strict;
use warnings;
use Carp;
our $VERSION = '0.20';
require Exporter;
our @EXPORT;
our %EXPORT_TAGS;
foreach my $impl (qw( Core XS Emul )) {
my $class = "Socket::GetAddrInfo::$impl";
my $file = "Socket/GetAddrInfo/$impl.pm";
eval {
# Each of the impls puts its symbols directly in our package
# Don't need to ->import
require $file;
};
last if defined &getaddrinfo;
}
=head1 NAME
C<Socket::GetAddrInfo> - RFC 2553's C<getaddrinfo> and C<getnameinfo>
functions.
=head1 SYNOPSIS
use Socket qw( SOCK_STREAM );
use Socket::GetAddrInfo qw( :newapi getaddrinfo getnameinfo );
use IO::Socket;
my $sock;
my %hints = ( socktype => SOCK_STREAM );
my ( $err, @res ) = getaddrinfo( "www.google.com", "www", \%hints );
die "Cannot resolve name - $err" if $err;
while( my $ai = shift @res ) {
$sock = IO::Socket->new();
$sock->socket( $ai->{family}, $ai->{socktype}, $ai->{protocol} ) or
undef $sock, next;
$sock->connect( $ai->{addr} ) or undef $sock, next;
last;
}
if( $sock ) {
my ( $err, $host, $service ) = getnameinfo( $sock->peername );
print "Connected to $host:$service\n" if !$err;
}
=head1 DESCRIPTION
The RFC 2553 functions C<getaddrinfo> and C<getnameinfo> provide an abstracted
way to convert between a pair of host name/service name and socket addresses,
or vice versa. C<getaddrinfo> converts names into a set of arguments to pass
to the C<socket()> and C<connect()> syscalls, and C<getnameinfo> converts a
socket address back into its host name/service name pair.
These functions provide a useful interface for performing either of these name
resolution operation, without having to deal with IPv4/IPv6 transparency, or
whether the underlying host can support IPv6 at all, or other such issues.
However, not all platforms can support the underlying calls at the C layer,
which means a dilema for authors wishing to write forward-compatible code.
Either to support these functions, and cause the code not to work on older
platforms, or stick to the older "legacy" resolvers such as
C<gethostbyname()>, which means the code becomes more portable.
This module attempts to solve this problem, by detecting at compiletime
whether the underlying OS will support these functions. If it does not, the
module will use pure-perl emulations of the functions using the legacy
resolver functions instead. The emulations support the same interface as the
real functions, and behave as close as is resonably possible to emulate using
the legacy resolvers. See L<Socket::GetAddrInfo::Emul> for details on the
limits of this emulation.
As of C<Socket> version 1.93 (as shipped by Perl version 5.13.9, and hopefully
will be in 5.14), core Perl already supports C<getaddrinfo>. On such a system,
this module simply uses the functions provided by C<Socket>, and does not need
to use its own compiled XS, or pure-perl legacy emulation.
=cut
=head1 EXPORT TAGS
The following tags may be imported by C<use Socket::GetAddrInfo qw( :tag )>:
=over 8
=item AI
Imports all of the C<AI_*> constants for C<getaddrinfo> flags
=item NI
Imports all of the C<NI_*> constants for C<getnameinfo> flags
=item EAI
Imports all of the C<EAI_*> for error values
=item constants
Imports all of the above constants
=back
=cut
$EXPORT_TAGS{AI} = [ grep m/^AI_/, @EXPORT ];
$EXPORT_TAGS{NI} = [ grep m/^NI_/, @EXPORT ];
$EXPORT_TAGS{EAI} = [ grep m/^EAI_/, @EXPORT ];
$EXPORT_TAGS{constants} = [ map @{$EXPORT_TAGS{$_}}, qw( AI NI EAI ) ];
sub import
{
my $class = shift;
my %symbols = map { $_ => 1 } @_;
my $api = "new";
delete $symbols{':newapi'}; # legacy
$api = "Socket6" if delete $symbols{':Socket6api'};
if( $api eq "Socket6" and
$symbols{getaddrinfo} || $symbols{getnameinfo} ) {
my $callerpkg = caller;
require Socket::GetAddrInfo::Socket6api;
no strict 'refs';
*{"${callerpkg}::getaddrinfo"} = \&Socket::GetAddrInfo::Socket6api::getaddrinfo if delete $symbols{getaddrinfo};
*{"${callerpkg}::getnameinfo"} = \&Socket::GetAddrInfo::Socket6api::getnameinfo if delete $symbols{getnameinfo};
}
return unless keys %symbols;
local $Exporter::ExportLevel = $Exporter::ExportLevel + 1;
Exporter::import( $class, keys %symbols );
}
=head1 FUNCTIONS
=cut
=head2 ( $err, @res ) = getaddrinfo( $host, $service, $hints )
When given both host and service, this function attempts to resolve the host
name to a set of network addresses, and the service name into a protocol and
port number, and then returns a list of address structures suitable to
connect() to it.
When given just a host name, this function attempts to resolve it to a set of
network addresses, and then returns a list of these addresses in the returned
structures.
When given just a service name, this function attempts to resolve it to a
protocol and port number, and then returns a list of address structures that
represent it suitable to bind() to.
When given neither name, it generates an error.
The optional C<$hints> parameter can be passed a HASH reference to indicate
how the results are generated. It may contain any of the following four
fields:
=over 8
=item flags => INT
A bitfield containing C<AI_*> constants
=item family => INT
Restrict to only generating addresses in this address family
=item socktype => INT
Restrict to only generating addresses of this socket type
=item protocol => INT
Restrict to only generating addresses for this protocol
=back
Errors are indicated by the C<$err> value returned; which will be non-zero in
numeric context, and contain a string error message as a string. The value can
be compared against any of the C<EAI_*> constants to determine what the error
is.
If no error occurs, C<@res> will contain HASH references, each representing
one address. It will contain the following five fields:
=over 8
=item family => INT
The address family (e.g. AF_INET)
=item socktype => INT
The socket type (e.g. SOCK_STREAM)
=item protocol => INT
The protocol (e.g. IPPROTO_TCP)
=item addr => STRING
The address in a packed string (such as would be returned by pack_sockaddr_in)
=item canonname => STRING
The canonical name for the host if the C<AI_CANONNAME> flag was provided, or
C<undef> otherwise. This field will only be present on the first returned
address.
=back
=head2 ( $err, $host, $service ) = getnameinfo( $addr, $flags )
This function attempts to resolve the given socket address into a pair of host
and service names.
The optional C<$flags> parameter is a bitfield containing C<NI_*> constants.
Errors are indicated by the C<$err> value returned; which will be non-zero in
numeric context, and contain a string error message as a string. The value can
be compared against any of the C<EAI_*> constants to determine what the error
is.
=cut
# Keep perl happy; keep Britain tidy
1;
__END__
=head1 BUGS
=over 4
=item *
At the time of writing, there are no test reports from the C<MSWin32> platform
either PASS or FAIL. I suspect the code will not currently work as it stands
on that platform, but it should be fairly easy to fix, as C<Socket6> is known
to work there. Patches welcomed. :)
=back
=head1 SEE ALSO
=over 4
=item *
L<http://tools.ietf.org/html/rfc2553> - Basic Socket Interface Extensions for
IPv6
=back
=head1 ACKNOWLEDGEMENTS
Christian Hansen <chansen@cpan.org> - for help with some XS features and Win32
build fixes.
Zefram <zefram@fysh.org> - for help with fixing some bugs in the XS code.
Reini Urban <rurban@cpan.org> - for help with older perls and more Win32
build fixes.
=head1 AUTHOR
Paul Evans <leonerd@leonerd.org.uk>
|