File Coverage

blib/lib/Net/DNS/RR/AMTRELAY.pm
Criterion Covered Total %
statement 94 94 100.0
branch 36 36 100.0
condition 6 6 100.0
subroutine 18 18 100.0
pod 3 5 100.0
total 157 159 100.0


line stmt bran cond sub pod time code
1             package Net::DNS::RR::AMTRELAY;
2              
3 1     1   7 use strict;
  1         2  
  1         33  
4 1     1   3 use warnings;
  1         2  
  1         104  
5             our $VERSION = (qw$Id: AMTRELAY.pm 2003 2025-01-21 12:06:06Z willem $)[2];
6              
7 1     1   6 use base qw(Net::DNS::RR);
  1         2  
  1         78  
8              
9              
10             =head1 NAME
11              
12             Net::DNS::RR::AMTRELAY - DNS AMTRELAY resource record
13              
14             =cut
15              
16 1     1   5 use integer;
  1         1  
  1         5  
17              
18 1     1   24 use Carp;
  1         2  
  1         64  
19              
20 1     1   4 use Net::DNS::DomainName;
  1         2  
  1         17  
21 1     1   426 use Net::DNS::RR::A;
  1         2  
  1         24  
22 1     1   401 use Net::DNS::RR::AAAA;
  1         3  
  1         899  
23              
24              
25             sub _decode_rdata { ## decode rdata from wire-format octet string
26 5     5   8 my ( $self, $data, $offset ) = @_;
27              
28 5         8 my $size = $self->{rdlength} - 2;
29 5         13 @{$self}{qw(precedence relaytype relay)} = unpack "\@$offset C2 a$size", $$data;
  5         15  
30              
31 5         15 for ( $self->relaytype ) {
32 5 100       25 /^3$/ && return $self->{relay} = Net::DNS::DomainName->decode( $data, $offset + 2 );
33 3 100       10 /^2$/ && return $self->{relay} = pack( 'a16', $self->{relay} );
34 2 100       10 /^1$/ && return $self->{relay} = pack( 'a4', $self->{relay} );
35             }
36 1         2 $self->{relay} = '';
37 1         2 return;
38             }
39              
40              
41             sub _encode_rdata { ## encode rdata as wire-format octet string
42 9     9   15 my $self = shift;
43              
44 9         23 for ( $self->relaytype ) {
45 9 100       44 /^3$/ && return pack( 'C2 a*', @{$self}{qw(precedence relaytype)}, $self->{relay}->encode );
  6         22  
46 3 100       13 /^2$/ && return pack( 'C2 a16', @{$self}{qw(precedence relaytype relay)} );
  1         7  
47 2 100       11 /^1$/ && return pack( 'C2 a4', @{$self}{qw(precedence relaytype relay)} );
  1         6  
48             }
49 1         4 return pack( 'C2', @{$self}{qw(precedence relaytype)} );
  1         5  
50             }
51              
52              
53             sub _format_rdata { ## format rdata portion of RR string.
54 23     23   24 my $self = shift;
55              
56 23         32 my @rdata = map { $self->$_ } qw(precedence dbit relaytype relay);
  92         151  
57 23         58 return @rdata;
58             }
59              
60              
61             sub _parse_rdata { ## populate RR from rdata in argument list
62 7     7   21 my ( $self, @argument ) = @_;
63              
64 7         13 foreach (qw(precedence dbit relaytype relay)) {
65 28         70 $self->$_( shift @argument );
66             }
67 7         11 return;
68             }
69              
70              
71             sub _defaults { ## specify RR attribute default values
72 1     1   2 my $self = shift;
73              
74 1         1 @{$self}{qw(precedence relaytype relay)} = ( 0, 0, '' );
  1         6  
75 1         1 return;
76             }
77              
78              
79             sub precedence {
80 33     33 1 62 my ( $self, @value ) = @_;
81 33         46 for (@value) { $self->{precedence} = 0 + $_ }
  8         21  
82 33   100     93 return $self->{precedence} || 0;
83             }
84              
85              
86             sub dbit {
87 61     61 0 88 my ( $self, @value ) = @_; # uncoverable pod
88 61 100       85 for (@value) { $self->{relaytype} = $self->relaytype | ( $_ ? 0x80 : 0 ) }
  12         26  
89 61   100     184 return ( $self->{relaytype} || 0 ) >> 7;
90             }
91              
92 11     11 0 26 sub d { return &dbit } # uncoverable pod
93              
94              
95             sub relaytype {
96 100     100 1 1321 my ( $self, @value ) = @_;
97 100 100       133 for (@value) { $self->{relaytype} = $self->dbit ? ( 0x80 | $_ ) : $_ }
  20         28  
98 100   100     271 return 0x7f & ( $self->{relaytype} || 0 );
99             }
100              
101              
102             sub relay {
103 42     42 1 1670 my ( $self, @value ) = @_;
104              
105 42         56 for (@value) {
106 13 100       63 /^\.*$/ && do {
107 2         3 $self->relaytype(0);
108 2         2 $self->{relay} = ''; # no relay
109 2         4 last;
110             };
111 11 100       31 /:.*:/ && do {
112 2         7 $self->relaytype(2);
113 2         7 $self->{relay} = Net::DNS::RR::AAAA::address( {}, $_ );
114 2         6 last;
115             };
116 9 100       50 /\.\d+$/ && do {
117 2         6 $self->relaytype(1);
118 2         10 $self->{relay} = Net::DNS::RR::A::address( {}, $_ );
119 2         6 last;
120             };
121 7 100       25 /\..+/ && do {
122 6         12 $self->relaytype(3);
123 6         38 $self->{relay} = Net::DNS::DomainName->new($_);
124 6         12 last;
125             };
126 1         300 croak 'unrecognised relay type';
127             }
128              
129 41 100       99 if ( defined wantarray ) {
130 29         45 for ( $self->relaytype ) {
131 29 100       94 /^1$/ && return Net::DNS::RR::A::address( {address => $self->{relay}} );
132 23 100       55 /^2$/ && return Net::DNS::RR::AAAA::address( {address => $self->{relay}} );
133 17 100       89 /^3$/ && return wantarray ? $self->{relay}->string : $self->{relay}->name;
    100          
134             }
135             }
136 19 100       48 return wantarray ? '.' : undef;
137             }
138              
139              
140             my $function = sub { ## sort RRs in numerically ascending order.
141             $Net::DNS::a->{'preference'} <=> $Net::DNS::b->{'preference'};
142             };
143              
144             __PACKAGE__->set_rrsort_func( 'preference', $function );
145              
146             __PACKAGE__->set_rrsort_func( 'default_sort', $function );
147              
148              
149             1;
150             __END__