Net-DHCPv6

 view release on metacpan or  search on metacpan

lib/Net/DHCPv6/Helpers.pm  view on Meta::CPAN

#!/bin/false
# ABSTRACT: Internal helper methods for IPv6 address resolution
# PODNAME: Net::DHCPv6::Helpers
use strictures 2;

package Net::DHCPv6::Helpers;
$Net::DHCPv6::Helpers::VERSION = '0.003';
use Carp                   qw( croak );
use Net::DHCPv6::Constants qw( $IPV6_ADDR_LEN );
use Ref::Util              qw( is_plain_arrayref );
use Socket                 qw( AF_INET6 inet_ntop inet_pton );
use namespace::clean;

sub _resolve_ipv6 {
    my ( $class, $arg ) = @_;
    return unless defined $arg;
    if ( CORE::length( $arg ) == $IPV6_ADDR_LEN ) {

        # If it looks like IPv6 text (hex digits + colons), parse it
        if ( $arg =~ m/^[0-9a-fA-F:]+$/ && $arg =~ m/:/ ) {
            my $bytes = inet_pton( AF_INET6, $arg );
            return $bytes if defined $bytes;
        }
        return $arg;
    }
    croak( "Invalid IPv6 address: $arg" ) unless $arg =~ m/:/;
    my $bytes = inet_pton( AF_INET6, $arg );
    croak( "Invalid IPv6 address: $arg" ) unless defined $bytes;
    return $bytes;
}

sub _format_ipv6 {    ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
    my ( $self, $bytes ) = @_;
    return unless defined $bytes;
    return inet_ntop( AF_INET6, $bytes );
}

sub _pick_addr {    ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
    my ( $class, $args, $field ) = @_;
    my $key = "${field}_raw";
    return $args->{$key} if exists $args->{$key};
    return unless defined $args->{$field};
    return $class->_resolve_ipv6( $args->{$field} );
}

sub _pick_addrs {    ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
    my ( $class, $args, $field ) = @_;
    my $key = "${field}_raw";
    return $args->{$key} if exists $args->{$key};
    return unless defined $args->{$field};
    my $list =
        is_plain_arrayref( $args->{$field} )
        ? $args->{$field}
        : [ $args->{$field} ];
    return [ map { $class->_resolve_ipv6( $_ ) } @{$list} ];
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Net::DHCPv6::Helpers - Internal helper methods for IPv6 address resolution

=head1 VERSION



( run in 1.222 second using v1.01-cache-2.11-cpan-6aa56a78535 )