File Coverage

blib/lib/Net/DNS/RR/AAAA.pm
Criterion Covered Total %
statement 44 44 100.0
branch 12 12 100.0
path n/a
condition n/a
subroutine 11 11 100.0
pod 3 3 100.0
total 70 70 100.0


line stmt bran path cond sub pod time code
1               package Net::DNS::RR::AAAA;
2                
3 22       22   128 use strict;
  22           37  
  22           773  
4 22       22   105 use warnings;
  22           33  
  22           1553  
5               our $VERSION = (qw$Id: AAAA.pm 2003 2025-01-21 12:06:06Z willem $)[2];
6                
7 22       22   119 use base qw(Net::DNS::RR);
  22           36  
  22           1829  
8                
9                
10               =head1 NAME
11                
12               Net::DNS::RR::AAAA - DNS AAAA resource record
13                
14               =cut
15                
16 22       22   145 use integer;
  22           47  
  22           116  
17                
18                
19               sub _decode_rdata { ## decode rdata from wire-format octet string
20 219       219   358 my ( $self, $data, $offset ) = @_;
21                
22 219           614 $self->{address} = unpack "\@$offset a16", $$data;
23 219           402 return;
24               }
25                
26                
27               sub _encode_rdata { ## encode rdata as wire-format octet string
28 239       239   233 my $self = shift;
29                
30 239           419 return pack 'a16', $self->{address};
31               }
32                
33                
34               sub _format_rdata { ## format rdata portion of RR string.
35 2       2   3 my $self = shift;
36                
37 2           4 return $self->address_short;
38               }
39                
40                
41               sub _parse_rdata { ## populate RR from rdata in argument list
42 68       68   113 my ( $self, @argument ) = @_;
43                
44 68           225 $self->address(@argument);
45 68           122 return;
46               }
47                
48                
49               sub address_long {
50 266       266 1 618 my $addr = pack 'a*@16', grep {defined} shift->{address};
  266           809  
51 266           1609 return sprintf '%x:%x:%x:%x:%x:%x:%x:%x', unpack 'n8', $addr;
52               }
53                
54                
55               sub address_short {
56 60       60 1 256 my $addr = pack 'a*@16', grep {defined} shift->{address};
  60           239  
57 60           380 local $_ = sprintf ':%x:%x:%x:%x:%x:%x:%x:%x:', unpack 'n8', $addr;
58 60           547 s/(:0[:0]+:)(?!.+:0\1)/::/; # squash longest zero sequence
59 60 100         247 s/^:// unless /^::/; # prune LH :
60 60 100         231 s/:$// unless /::$/; # prune RH :
61 60           300 return $_;
62               }
63                
64                
65               sub address {
66 441       441 1 795 my ( $self, $addr ) = @_;
67                
68 441 100         1859 return address_long($self) unless defined $addr;
69                
70 230           947 my @parse = split /:/, "0$addr";
71                
72 230 100         807 if ( (@parse)[$#parse] =~ /\./ ) { # embedded IPv4
73 5           18 my @ip4 = split /\./, pop(@parse);
74 5           10 my $rhs = pop(@ip4);
75 5 100         9 my @ip6 = map { /./ ? hex($_) : (0) x ( 7 - @parse ) } @parse;
  12           37  
76 5           45 return $self->{address} = pack 'n6 C4', @ip6, @ip4, (0) x ( 3 - @ip4 ), $rhs;
77               }
78                
79               # Note: pack() masks overlarge values, mostly without warning.
80 225 100         514 my @expand = map { /./ ? hex($_) : (0) x ( 9 - @parse ) } @parse;
  1352           3871  
81 225           1493 return $self->{address} = pack 'n8', @expand;
82               }
83                
84                
85               1;
86               __END__