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 )