File Coverage

blib/lib/Net/DNS/RR/NSEC.pm
Criterion Covered Total %
statement 129 129 100.0
branch 18 18 100.0
condition 9 9 100.0
subroutine 23 23 100.0
pod 8 10 100.0
total 187 189 100.0


line stmt bran cond sub pod time code
1             package Net::DNS::RR::NSEC;
2              
3 14     14   842677 use strict;
  14         33  
  14         614  
4 14     14   81 use warnings;
  14         28  
  14         1210  
5             our $VERSION = (qw$Id: NSEC.pm 2002 2025-01-07 09:57:46Z willem $)[2];
6              
7 14     14   95 use base qw(Net::DNS::RR);
  14         32  
  14         2230  
8              
9              
10             =head1 NAME
11              
12             Net::DNS::RR::NSEC - DNS NSEC resource record
13              
14             =cut
15              
16 14     14   102 use integer;
  14         32  
  14         110  
17              
18 14     14   612 use Net::DNS::DomainName;
  14         45  
  14         732  
19 14     14   81 use Net::DNS::Parameters qw(:type);
  14         29  
  14         29944  
20              
21              
22             sub _decode_rdata { ## decode rdata from wire-format octet string
23 1     1   2 my ( $self, $data, $offset ) = @_;
24              
25 1         1 my $limit = $offset + $self->{rdlength};
26 1         3 ( $self->{nxtdname}, $offset ) = Net::DNS::DomainName->decode( $data, $offset );
27 1         3 $self->{typebm} = substr $$data, $offset, $limit - $offset;
28 1         2 return;
29             }
30              
31              
32             sub _encode_rdata { ## encode rdata as wire-format octet string
33 20     20   33 my $self = shift;
34              
35 20         36 my $nxtdname = $self->{nxtdname};
36 20         75 return join '', $nxtdname->encode(), $self->{typebm};
37             }
38              
39              
40             sub _format_rdata { ## format rdata portion of RR string.
41 3     3   4 my $self = shift;
42              
43 3         4 my $nxtdname = $self->{nxtdname};
44 3         6 return ( $nxtdname->string(), $self->typelist );
45             }
46              
47              
48             sub _parse_rdata { ## populate RR from rdata in argument list
49 40     40   1553 my ( $self, @argument ) = @_;
50              
51 40         164 $self->nxtdname( shift @argument );
52 40         120 $self->typelist(@argument);
53 40         107 return;
54             }
55              
56              
57             sub _defaults { ## specify RR attribute default values
58 5     5   12 my $self = shift;
59              
60 5         21 $self->_parse_rdata('.');
61 5         13 return;
62             }
63              
64              
65             sub nxtdname {
66 44     44 1 96 my ( $self, @value ) = @_;
67 44         102 for (@value) { $self->{nxtdname} = Net::DNS::DomainName->new($_) }
  42         171  
68 44 100       195 return $self->{nxtdname} ? $self->{nxtdname}->name : undef;
69             }
70              
71              
72             sub typelist {
73 244     244 1 50178 my ( $self, @argument ) = @_;
74              
75 244 100 100     907 if ( scalar(@argument) || !defined(wantarray) ) {
76 229         630 $self->{typebm} = &_type2bm(@argument);
77 229         684 return;
78             }
79              
80 15         157 my @type = &_bm2type( $self->{typebm} );
81 15 100       96 return wantarray ? (@type) : "@type";
82             }
83              
84              
85             sub typemap {
86 126     126 1 615 my ( $self, $type ) = @_;
87              
88 126         334 my $number = typebyname($type);
89 126         256 my $window = $number >> 8;
90 126         219 my $bitnum = $number & 255;
91              
92 126   100     384 my $typebm = $self->{typebm} || return;
93 125         213 my @bitmap;
94 125         211 my $index = 0;
95 125         355 while ( $index < length $typebm ) {
96 125         539 my ( $block, $size ) = unpack "\@$index C2", $typebm;
97 125         503 $bitmap[$block] = unpack "\@$index xxa$size", $typebm;
98 125         463 $index += $size + 2;
99             }
100              
101 125   100     1431 my @bit = split //, unpack 'B*', ( $bitmap[$window] || return );
102 124         1051 return $bit[$bitnum];
103             }
104              
105              
106             sub match {
107 8     8 1 3083 my ( $self, $qname ) = @_;
108 8         37 my $name = Net::DNS::DomainName->new($qname)->canonical;
109 8         30 return $name eq $self->{owner}->canonical;
110             }
111              
112              
113             sub covers {
114 29     29 1 159 my ( $self, $qname ) = @_;
115 29         95 my $name = join chr(0), reverse Net::DNS::DomainName->new($qname)->_wire;
116 29         105 my $this = join chr(0), reverse $self->{owner}->_wire;
117 29         83 my $next = join chr(0), reverse $self->{nxtdname}->_wire;
118 29         67 foreach ( $name, $this, $next ) {tr /\101-\132/\141-\172/}
  87         164  
119              
120 29 100       106 return ( $name cmp $this ) + ( "$next\001" cmp $name ) == 2 unless $next gt $this;
121 23         137 return ( $name cmp $this ) + ( $next cmp $name ) == 2;
122             }
123              
124              
125             sub encloser {
126 42     42 1 11218 my ( $self, $qname ) = @_;
127 42         160 my @label = Net::DNS::Domain->new($qname)->label;
128              
129 42         143 my @owner = $self->{owner}->label;
130 42         69 my $depth = scalar(@owner);
131 42         60 my $next;
132 42         108 while ( scalar(@label) > $depth ) {
133 36         83 $next = shift @label;
134             }
135              
136 42 100       132 return unless defined $next;
137              
138 20         55 my $nextcloser = join( '.', $next, @label );
139 20 100       91 return if lc($nextcloser) ne lc( join '.', $next, @owner );
140              
141 12         28 $self->{nextcloser} = $nextcloser;
142 12         35 $self->{wildcard} = join( '.', '*', @label );
143 12         46 return $self->owner;
144             }
145              
146              
147 2     2 1 16 sub nextcloser { return shift->{nextcloser}; }
148              
149 2     2 1 16 sub wildcard { return shift->{wildcard}; }
150              
151              
152             ########################################
153              
154             sub _type2bm {
155 229     229   563 my @typelist = @_;
156 229         369 my @typearray;
157 229         532 foreach my $typename ( map { split() } @typelist ) {
  291         1151  
158 302         839 my $number = typebyname($typename);
159 302         614 my $window = $number >> 8;
160 302         607 my $bitnum = $number & 255;
161 302         507 my $octet = $bitnum >> 3;
162 302         534 my $bit = $bitnum & 7;
163 302         1082 $typearray[$window][$octet] |= 0x80 >> $bit;
164             }
165              
166 229         904 my $bitmap = '';
167 229         379 my $window = 0;
168 229         474 foreach (@typearray) {
169 234 100       673 if ( my $pane = $typearray[$window] ) {
170 214 100       791 my @content = map { $_ || 0 } @$pane;
  844         3138  
171 214         1060 $bitmap .= pack 'CC C*', $window, scalar(@content), @content;
172             }
173 234         576 $window++;
174             }
175              
176 229         1057 return $bitmap;
177             }
178              
179              
180             sub _bm2type {
181 15     15   27 my @empty;
182 15   100     40 my $bitmap = shift || return @empty;
183              
184 13         22 my $index = 0;
185 13         22 my $limit = length $bitmap;
186 13         19 my @typelist;
187              
188 13         42 while ( $index < $limit ) {
189 13         57 my ( $block, $size ) = unpack "\@$index C2", $bitmap;
190 13         23 my $typenum = $block << 8;
191 13         43 foreach my $octet ( unpack "\@$index xxC$size", $bitmap ) {
192 69         92 my $i = $typenum += 8;
193 69         80 my @name;
194 69         118 while ($octet) {
195 155         183 --$i;
196 155 100       319 unshift @name, typebyval($i) if $octet & 1;
197 155         324 $octet = $octet >> 1;
198             }
199 69         158 push @typelist, @name;
200             }
201 13         59 $index += $size + 2;
202             }
203              
204 13         51 return @typelist;
205             }
206              
207              
208             sub typebm { ## historical
209 1     1 0 4 my ( $self, @typebm ) = @_; # uncoverable pod
210 1         2 for (@typebm) { $self->{typebm} = $_ }
  1         2  
211 1         7 $self->_deprecate('prefer $rr->typelist() or $rr->typemap()');
212 1         7 return $self->{typebm};
213             }
214              
215             sub covered { ## historical
216 1     1 0 12 my ( $self, @argument ) = @_; # uncoverable pod
217 1         3 return $self->covers(@argument);
218             }
219              
220             ########################################
221              
222              
223             1;
224             __END__