Socket

 view release on metacpan or  search on metacpan

Socket.pm  view on Meta::CPAN

    foreach my $addr ( @addrs ) {
        foreach my $portspec ( @ports ) {
            my ( $socktype, $protocol, $port ) = @$portspec;
            push @ret, {
                family    => $family,
                socktype  => $socktype,
                protocol  => $protocol,
                addr      => Socket::pack_sockaddr_in( $port, $addr ),
                canonname => undef,
            };
        }
    }

    # Only supply canonname for the first result
    if( defined $canonname ) {
        $ret[0]->{canonname} = $canonname;
    }

    return ( fake_makeerr( 0 ), @ret );
}

sub fake_getnameinfo
{
    my ( $addr, $flags, $xflags ) = @_;

    my ( $port, $inetaddr );
    eval { ( $port, $inetaddr ) = Socket::unpack_sockaddr_in( $addr ) }
        or return fake_makeerr( EAI_FAMILY() );

    my $family = Socket::AF_INET();

    $flags ||= 0;

    my $flag_numerichost = $flags & NI_NUMERICHOST(); $flags &= ~NI_NUMERICHOST();
    my $flag_numericserv = $flags & NI_NUMERICSERV(); $flags &= ~NI_NUMERICSERV();
    my $flag_nofqdn      = $flags & NI_NOFQDN();      $flags &= ~NI_NOFQDN();
    my $flag_namereqd    = $flags & NI_NAMEREQD();    $flags &= ~NI_NAMEREQD();
    my $flag_dgram       = $flags & NI_DGRAM()   ;    $flags &= ~NI_DGRAM();

    $flags & NI_IDN() and
        croak "Socket::getnameinfo() does not support IDN";

    $flags == 0 or return fake_makeerr( EAI_BADFLAGS() );

    $xflags ||= 0;

    my $node;
    if( $xflags & NIx_NOHOST ) {
        $node = undef;
    }
    elsif( $flag_numerichost ) {
        $node = Socket::inet_ntoa( $inetaddr );
    }
    else {
        $node = gethostbyaddr( $inetaddr, $family );
        if( !defined $node ) {
            return fake_makeerr( EAI_NONAME() ) if $flag_namereqd;
            $node = Socket::inet_ntoa( $inetaddr );
        }
        elsif( $flag_nofqdn ) {
            my ( $shortname ) = split m/\./, $node;
            my ( $fqdn ) = gethostbyname $shortname;
            $node = $shortname if defined $fqdn and $fqdn eq $node;
        }
    }

    my $service;
    if( $xflags & NIx_NOSERV ) {
        $service = undef;
    }
    elsif( $flag_numericserv ) {
        $service = "$port";
    }
    else {
        my $protname = $flag_dgram ? "udp" : "";
        $service = getservbyport( $port, $protname );
        if( !defined $service ) {
            $service = "$port";
        }
    }

    return ( fake_makeerr( 0 ), $node, $service );
}

1;



( run in 1.492 second using v1.01-cache-2.11-cpan-71847e10f99 )