File Coverage

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


line stmt bran cond sub pod time code
1             package Net::DNS::RR::AAAA;
2              
3 22     22   154 use strict;
  22         130  
  22         894  
4 22     22   134 use warnings;
  22         66  
  22         2074  
5             our $VERSION = (qw$Id: AAAA.pm 2003 2025-01-21 12:06:06Z willem $)[2];
6              
7 22     22   140 use base qw(Net::DNS::RR);
  22         58  
  22         2111  
8              
9              
10             =head1 NAME
11              
12             Net::DNS::RR::AAAA - DNS AAAA resource record
13              
14             =cut
15              
16 22     22   151 use integer;
  22         66  
  22         147  
17              
18              
19             sub _decode_rdata { ## decode rdata from wire-format octet string
20 256     256   494 my ( $self, $data, $offset ) = @_;
21              
22 256         1046 $self->{address} = unpack "\@$offset a16", $$data;
23 256         540 return;
24             }
25              
26              
27             sub _encode_rdata { ## encode rdata as wire-format octet string
28 239     239   282 my $self = shift;
29              
30 239         503 return pack 'a16', $self->{address};
31             }
32              
33              
34             sub _format_rdata { ## format rdata portion of RR string.
35 2     2   5 my $self = shift;
36              
37 2         6 return $self->address_short;
38             }
39              
40              
41             sub _parse_rdata { ## populate RR from rdata in argument list
42 68     68   136 my ( $self, @argument ) = @_;
43              
44 68         271 $self->address(@argument);
45 68         140 return;
46             }
47              
48              
49             sub address_long {
50 275     275 1 751 my $addr = pack 'a*@16', grep {defined} shift->{address};
  275         1008  
51 275         2352 return sprintf '%x:%x:%x:%x:%x:%x:%x:%x', unpack 'n8', $addr;
52             }
53              
54              
55             sub address_short {
56 60     60 1 297 my $addr = pack 'a*@16', grep {defined} shift->{address};
  60         250  
57 60         442 local $_ = sprintf ':%x:%x:%x:%x:%x:%x:%x:%x:', unpack 'n8', $addr;
58 60         644 s/(:0[:0]+:)(?!.+:0\1)/::/; # squash longest zero sequence
59 60 100       315 s/^:// unless /^::/; # prune LH :
60 60 100       283 s/:$// unless /::$/; # prune RH :
61 60         370 return $_;
62             }
63              
64              
65             sub address {
66 450     450 1 958 my ( $self, $addr ) = @_;
67              
68 450 100       1156 return address_long($self) unless defined $addr;
69              
70 230         1167 my @parse = split /:/, "0$addr";
71              
72 230 100       975 if ( (@parse)[$#parse] =~ /\./ ) { # embedded IPv4
73 5         20 my @ip4 = split /\./, pop(@parse);
74 5         12 my $rhs = pop(@ip4);
75 5 100       14 my @ip6 = map { /./ ? hex($_) : (0) x ( 7 - @parse ) } @parse;
  12         82  
76 5         60 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       512 my @expand = map { /./ ? hex($_) : (0) x ( 9 - @parse ) } @parse;
  1352         4262  
81 225         1594 return $self->{address} = pack 'n8', @expand;
82             }
83              
84              
85             1;
86             __END__