File Coverage

blib/lib/Net/DNS/Resolver/Base.pm
Criterion Covered Total %
statement 618 618 100.0
branch 262 264 100.0
path n/a
condition 70 70 100.0
subroutine 89 89 100.0
pod 24 29 100.0
total 1063 1070 100.0


line stmt bran path cond sub pod time code
1               package Net::DNS::Resolver::Base;
2                
3 94       94   664 use strict;
  94           134  
  94           3040  
4 94       94   393 use warnings;
  94           180  
  94           7647  
5               our $VERSION = (qw$Id: Base.pm 2049 2026-06-08 10:44:36Z willem $)[2];
6                
7                
8               #
9               # Implementation notes wrt IPv6 support when using perl before 5.20.0.
10               #
11               # In general we try to be gracious to those stacks that do not have IPv6 support.
12               # The socket code is conditionally compiled depending upon the availability of
13               # the IO::Socket::IP package.
14               #
15               # We have chosen not to use mapped IPv4 addresses, there seem to be issues
16               # with this; as a result we use separate sockets for each family type.
17               #
18               # inet_pton is not available on WIN32, so we only use the getaddrinfo
19               # call to translate IP addresses to socketaddress.
20               #
21               # The configuration options force_v4, force_v6, prefer_v4 and prefer_v6
22               # are provided to control IPv6 behaviour for test purposes.
23               #
24               # Olaf Kolkman, RIPE NCC, December 2003.
25               # [Revised March 2016, June 2018]
26                
27                
28 94       94   506 use constant OS_SPEC => "Net::DNS::Resolver::$^O";
  94           179  
  94           9495  
29 94       94   480 use constant OS_UNIX => "Net::DNS::Resolver::UNIX";
  94           143  
  94           7113  
30 94       94   523 use constant OS_CONF => grep( eval "require $_", OS_SPEC ), OS_UNIX; ## no critic
  94           379  
  94           5738  
31 94       94   470 use base (OS_CONF)[0];
  94           152  
  94           39206  
32                
33                
34 92       92   1653 use constant USE_SOCKET_IP => defined eval 'use IO::Socket::IP 0.38; 1;'; ## no critic
  92       92   397  
  92           15223  
  92           83987  
  92           3794161  
  92           538  
35               require IO::Socket::INET unless USE_SOCKET_IP;
36                
37 92       92   762 use constant IPv6 => USE_SOCKET_IP;
  92           161  
  92           6449  
38                
39                
40               # If SOCKSified Perl, use TCP instead of UDP and keep the socket open.
41 92       92   500 use constant SOCKS => scalar eval { require Config; $Config::Config{usesocks}; };
  92           162  
  92           182  
  92           1376  
  92           15180  
42                
43                
44               # Allow taint tests to be optimised away when appropriate.
45 92       92   689 use constant TFLAG => eval { ${^TAINT} };
  92           276  
  92           230  
  92           6881  
46 92       92   501 use constant TAINT => TFLAG && defined eval { require Scalar::Util; };
  92           150  
  92           3998  
47                
48                
49 92       92   3079 use integer;
  92           234  
  92           1103  
50 92       92   2307 use Carp;
  92           128  
  92           5473  
51 92       92   43437 use IO::File;
  92           150739  
  92           10247  
52 92       92   40741 use IO::Select;
  92           136805  
  92           4644  
53 92       92   616 use IO::Socket;
  92           156  
  92           485  
54                
55 92       92   64305 use Socket;
  92           174  
  92           46323  
56               {
57 92       92   618 no strict 'subs'; ## no critic ProhibitNoStrict
  92           159  
  92           3971  
58 92       92   457 use constant AI_NUMERICHOST => Socket::AI_NUMERICHOST;
  92           181  
  92           6256  
59 92       92   408 use constant IPPROTO_UDP => Socket::IPPROTO_UDP;
  92           207  
  92           5192  
60               }
61                
62 92       92   47103 use Net::DNS::RR;
  92           409  
  92           3364  
63 92       92   48587 use Net::DNS::Packet;
  92           333  
  92           3932  
64                
65 92       92   600 use constant PACKETSZ => 512;
  92           188  
  92           277611  
66                
67                
68               #
69               # Set up a closure to be our class data.
70               #
71               {
72               my $defaults = bless {
73               nameservers => [qw(::1 127.0.0.1)],
74               nameserver4 => ['127.0.0.1'],
75               nameserver6 => ['::1'],
76               port => 53,
77               srcaddr4 => '0.0.0.0',
78               srcaddr6 => '::',
79               srcport => 0,
80               searchlist => [],
81               retrans => 5,
82               retry => 4,
83               usevc => ( SOCKS ? 1 : 0 ),
84               igntc => 0,
85               recurse => 1,
86               defnames => 1,
87               dnsrch => 1,
88               ndots => 1,
89               debug => 0,
90               tcp_timeout => 120,
91               udp_timeout => 30,
92               persistent_tcp => ( SOCKS ? 1 : 0 ),
93               persistent_udp => 0,
94               dnssec => 0,
95               adflag => 0, # see RFC6840, 5.7
96               cdflag => 0, # see RFC6840, 5.9
97               udppacketsize => 0, # value bounded below by PACKETSZ
98               force_v4 => 0,
99               force_v6 => 0,
100               prefer_v4 => 0,
101               prefer_v6 => 0,
102               },
103               __PACKAGE__;
104                
105                
106 252       252   1617 sub _defaults { return $defaults; }
107               }
108                
109                
110               my %warned;
111                
112               sub _deprecate {
113 7       7   27 my ( undef, @note ) = @_;
114 7 100         655 carp join ' ', 'deprecated method;', "@note" unless $warned{"@note"}++;
115 7           48 return;
116               }
117                
118                
119               sub _untaint { ## no critic # recurses into user list arguments
120 10       10   210 return TAINT ? map { ref($_) ? [_untaint(@$_)] : do { /^(.*)$/; $1 } } @_ : @_;
121               }
122                
123                
124               # These are the attributes that the user may specify in the new() constructor.
125               my %public_attr = (
126               map { $_ => $_ } keys %{&_defaults},
127               qw(domain nameserver srcaddr),
128               map { $_ => 0 } qw(nameserver4 nameserver6 srcaddr4 srcaddr6),
129               );
130                
131                
132               my $initial;
133                
134               sub new {
135 92       92 1 1327735 my ( $class, %args ) = @_;
136                
137 92           194 my $self;
138 92           335 my $base = $class->_defaults;
139 92           154 my $init = $initial;
140 92     100     575 $initial ||= [%$base];
141 92 100         440 if ( my $file = $args{config_file} ) {
    100            
142 4           34 my $conf = bless {@$initial}, $class;
143 4           17 $conf->_read_config_file($file); # user specified config
144 2           14 $self = bless {_untaint(%$conf)}, $class;
145 2 100         24 %$base = %$self unless $init; # define default configuration
146                
147               } elsif ($init) {
148 80           1446 $self = bless {%$base}, $class;
149                
150               } else {
151 8           65 $class->_init(); # define default configuration
152 8           113 $self = bless {%$base}, $class;
153               }
154                
155 90           544 while ( my ( $attr, $value ) = each %args ) {
156 76 100         268 next unless $public_attr{$attr};
157 74           149 my $ref = ref($value);
158 74 100   100     980 croak "usage: $class->new( $attr => [...] )"
159               if $ref && ( $ref ne 'ARRAY' );
160 70 100         631 $self->$attr( $ref ? @$value : $value );
161               }
162                
163 86           341 return $self;
164               }
165                
166                
167               my %resolv_conf = ( ## map traditional resolv.conf option names
168               attempts => 'retry',
169               inet6 => 'prefer_v6',
170               timeout => 'retrans',
171               );
172                
173               my %res_option = ( ## any resolver attribute plus those listed above
174               %public_attr,
175               %resolv_conf,
176               );
177                
178               sub _option {
179 10       10   19 my ( $self, $name, @value ) = @_;
180 10     100     60 my $attribute = $res_option{lc $name} || return;
181 7 100         14 push @value, 1 unless scalar @value;
182 7           36 return $self->$attribute(@value);
183               }
184                
185                
186               sub _read_env { ## read resolver config environment variables
187 8       8   14 my $self = shift;
188                
189 8 100         39 $self->searchlist( map {split} $ENV{LOCALDOMAIN} ) if defined $ENV{LOCALDOMAIN};
  1           6  
190                
191 8 100         27 $self->nameservers( map {split} $ENV{RES_NAMESERVERS} ) if defined $ENV{RES_NAMESERVERS};
  1           4  
192                
193 8 100         27 $self->searchlist( map {split} $ENV{RES_SEARCHLIST} ) if defined $ENV{RES_SEARCHLIST};
  1           5  
194                
195 8     100     59 foreach ( map {split} $ENV{RES_OPTIONS} || '' ) {
  8           29  
196 4           8 $self->_option( split m/:/ );
197               }
198 8           15 return;
199               }
200                
201                
202               sub _read_config_file { ## read resolver config file
203 19       19   43 my ( $self, $file ) = @_;
204                
205 19 100         118 my $filehandle = IO::File->new( $file, '<' ) or croak "$file: $!";
206                
207 17           1723 my @nameserver;
208               my @searchlist;
209                
210 17           28 local $_;
211 17           397 while (<$filehandle>) {
212 90           231 s/[;#].*$//; # strip comments
213                
214 90 100         154 /^nameserver/ && do {
215 18           50 my ( $keyword, @ip ) = grep {defined} split;
  38           75  
216 18           35 push @nameserver, @ip;
217 18           47 next;
218               };
219                
220 72 100         136 /^domain/ && do {
221 2           6 my ( $keyword, $domain ) = grep {defined} split;
  4           9  
222 2           12 $self->domain($domain);
223 2           5 next;
224               };
225                
226 70 100         106 /^search/ && do {
227 10           30 my ( $keyword, @domain ) = grep {defined} split;
  22           41  
228 10           29 push @searchlist, @domain;
229 10           27 next;
230               };
231                
232 60 100         166 /^option/ && do {
233 2           5 my ( $keyword, @option ) = grep {defined} split;
  8           12  
234 2           3 foreach (@option) {
235 6           13 $self->_option( split m/:/ );
236               }
237               };
238               }
239                
240 17           157 close($filehandle);
241                
242 17 100         83 $self->nameservers(@nameserver) if @nameserver;
243 17 100         73 $self->searchlist(@searchlist) if @searchlist;
244 17           79 return;
245               }
246                
247                
248               sub string {
249 2       2 1 5 my $self = shift;
250 2 100         11 $self = $self->_defaults unless ref($self);
251                
252 2           8 my @nslist = $self->nameservers();
253 2           6 my ($force) = ( grep( { $self->{$_} } qw(force_v6 force_v4) ), 'force_v4' );
  4           12  
254 2           4 my ($prefer) = ( grep( { $self->{$_} } qw(prefer_v6 prefer_v4) ), 'prefer_v4' );
  4           9  
255 2           7 return <
256               ;; RESOLVER state:
257               ;; nameservers = @nslist
258 2           71 ;; searchlist = @{$self->{searchlist}}
259               ;; defnames = $self->{defnames} dnsrch = $self->{dnsrch}
260               ;; igntc = $self->{igntc} usevc = $self->{usevc}
261               ;; recurse = $self->{recurse} port = $self->{port}
262               ;; retrans = $self->{retrans} retry = $self->{retry}
263               ;; tcp_timeout = $self->{tcp_timeout} persistent_tcp = $self->{persistent_tcp}
264               ;; udp_timeout = $self->{udp_timeout} persistent_udp = $self->{persistent_udp}
265               ;; ${prefer} = $self->{$prefer} ${force} = $self->{$force}
266               ;; debug = $self->{debug} ndots = $self->{ndots}
267               END
268               }
269                
270                
271               sub print {
272 1       1 1 217 return print shift->string;
273               }
274                
275                
276               sub searchlist {
277 99       99 1 1782 my ( $self, @domain ) = @_;
278 99 100         302 $self = $self->_defaults unless ref($self);
279                
280 99           186 foreach (@domain) { $_ = Net::DNS::Domain->new($_)->name }
  32           214  
281 99 100         669 $self->{searchlist} = \@domain if scalar(@domain);
282 99           125 return @{$self->{searchlist}};
  99           364  
283               }
284                
285               sub domain {
286 31       31 1 147981 return (&searchlist)[0];
287               }
288                
289                
290               sub nameservers {
291 232       232 1 2428 my ( $self, @ns ) = @_;
292 232 100         635 $self = $self->_defaults unless ref($self);
293                
294 232           400 my @ip;
295 232           519 foreach my $ns ( grep {defined} @ns ) {
  296           567  
296 296 100   100     572 if ( _ipv4($ns) || _ipv6($ns) ) {
297 289           666 push @ip, $ns;
298                
299               } else {
300 7           77 my $defres = ref($self)->new( debug => $self->{debug} );
301 7           17 $defres->{persistent} = $self->{persistent};
302                
303 7           14 my $names = {};
304 7           31 my $packet = $defres->send( $ns, 'A' );
305 7           89 my @iplist = _cname_addr( $packet, $names );
306                
307 7           16 if (IPv6) {
308 7           29 $packet = $defres->send( $ns, 'AAAA' );
309 7           72 push @iplist, _cname_addr( $packet, $names );
310               }
311                
312 7           18 my %unique = map { $_ => $_ } @iplist;
  12           39  
313                
314 7           22 my @address = values(%unique); # tainted
315 7 100         135 carp "unresolvable name: $ns" unless scalar @address;
316                
317 7           167 push @ip, @address;
318               }
319               }
320                
321 232 100   100     893 if ( scalar(@ns) || !defined(wantarray) ) {
322 96           179 my @ipv4 = grep { _ipv4($_) } @ip;
  301           450  
323 96           214 my @ipv6 = grep { _ipv6($_) } @ip;
  301           488  
324 96           313 $self->{nameservers} = \@ip;
325 96           233 $self->{nameserver4} = \@ipv4;
326 96           216 $self->{nameserver6} = \@ipv6;
327               }
328                
329 232           350 my @IPv4 = @{$self->{nameserver4}};
  232           573  
330 232           328 my @IPv6 = IPv6 ? @{$self->{nameserver6}} : ();
  232           514  
331                
332 232 100         543 my @IPlist = @IPv6 ? @{$self->{nameservers}} : @IPv4;
  124           281  
333 232 100         569 @IPlist = ( @IPv6, @IPv4 ) if $self->{prefer_v6};
334 232 100         501 @IPlist = ( @IPv4, @IPv6 ) if $self->{prefer_v4};
335 232 100         564 @IPlist = @IPv6 if $self->{force_v6};
336 232 100         593 @IPlist = @IPv4 if $self->{force_v4};
337                
338 232 100         558 $self->errorstring('no nameservers') unless @IPlist;
339 232           830 return @IPlist;
340               }
341                
342 9       9 1 1603 sub nameserver { return &nameservers; }
343                
344               sub _cname_addr {
345                
346               # TODO 20081217
347               # This code does not follow CNAME chains, it only looks inside the packet.
348               # Out of bailiwick will fail.
349 15       15   48 my @null;
350 15     100     49 my $packet = shift || return @null;
351 12           28 my $names = shift;
352                
353 12           46 $names->{lc( $_->qname )}++ foreach $packet->question;
354 12           50 $names->{lc( $_->cname )}++ foreach grep { $_->can('cname') } $packet->answer;
  12           92  
355                
356 12           32 my @addr = grep { $_->can('address') } $packet->answer;
  12           50  
357 12           27 return map { $_->address } grep { $names->{lc( $_->name )} } @addr;
  12           45  
  12           55  
358               }
359                
360                
361               sub replyfrom {
362 2       2 1 10 return shift->{replyfrom};
363               }
364                
365 1       1 0 7 sub answerfrom { return &replyfrom; } # uncoverable pod
366                
367                
368               sub _reset_errorstring {
369 105       105   247 shift->{errorstring} = '';
370 105           184 return;
371               }
372                
373               sub errorstring {
374 418       418 1 1264 my ( $self, $text ) = @_;
375 418 100         1563 $self->_diag( 'errorstring:', $self->{errorstring} = $text ) if $text;
376 418           3308 return $self->{errorstring};
377               }
378                
379                
380               sub query {
381 13       13 1 60 my ( $self, @argument ) = @_;
382                
383 13     100     61 my $name = shift(@argument) || '.';
384 13 100   100     143 my @sfix = $self->{defnames} && ( $name !~ m/[.:]/ ) ? $self->domain : ();
385                
386 13           44 my $fqdn = join '.', $name, @sfix;
387 13           50 $self->_diag( 'query(', $fqdn, @argument, ')' );
388 13     100     57 my $packet = $self->send( $fqdn, @argument ) || return;
389 10 100         67 return $packet->header->ancount ? $packet : undef;
390               }
391                
392                
393               sub search {
394 7       7 1 29 my ( $self, @argument ) = @_;
395                
396 7 100         23 return $self->query(@argument) unless $self->{dnsrch};
397                
398 6     100     18 my $name = shift(@argument) || '.';
399 6           18 my $dots = $name =~ tr/././;
400                
401 6 100         1393 my @sfix = ( $dots < $self->{ndots} ) ? @{$self->{searchlist}} : ();
  1           3  
402 6 100         62 my ( $one, @more ) = ( $name =~ m/:|\.\d*$/ ) ? () : ( $dots ? ( undef, @sfix ) : @sfix );
    100            
403                
404 6           12 foreach my $suffix ( $one, @more ) {
405 7 100         15 my $fqname = $suffix ? join( '.', $name, $suffix ) : $name;
406 7           18 $self->_diag( 'search(', $fqname, @argument, ')' );
407 7     100     15 my $packet = $self->send( $fqname, @argument ) || next;
408 2 100         12 return $packet if $packet->header->ancount;
409               }
410                
411 5           27 return;
412               }
413                
414                
415               sub send {
416 89       89 1 275 my ( $self, @argument ) = @_;
417 89           290 my $packet = $self->_make_query_packet(@argument);
418 89           347 my $packet_data = $packet->encode;
419                
420 89           372 $self->_reset_errorstring;
421                
422               return $self->_send_tcp( $packet, $packet_data )
423 89 100   100     481 if $self->{usevc} || length $packet_data > $self->_packetsz;
424                
425 82     100     272 my $reply = $self->_send_udp( $packet, $packet_data ) || return;
426                
427 65 100         895 return $reply if $self->{igntc};
428 61 100         232 return $reply unless $reply->header->tc;
429                
430 1           6 $self->_diag('packet truncated: retrying using TCP');
431 1           7 return $self->_send_tcp( $packet, $packet_data );
432               }
433                
434                
435               sub _send_tcp {
436 9       9   26 my ( $self, $query, $query_data ) = @_;
437                
438 9           36 my $tcp_packet = pack 'n a*', length($query_data), $query_data;
439 9           40 my @ns = $self->nameservers();
440 9           14 my $fallback;
441 9           24 my $timeout = $self->{tcp_timeout};
442                
443 9           17 foreach my $ip (@ns) {
444 12           102 $self->_diag( 'tcp send', "[$ip]" );
445                
446 12           53 my $connection = $self->_create_tcp_socket($ip);
447 12           72 $self->errorstring($!);
448 12     100     172 my $select = IO::Select->new( $connection || next );
449                
450 10           835 $connection->send($tcp_packet);
451 10           1133 $self->errorstring($!);
452                
453 10           60 my @ready = $select->can_read($timeout);
454 10 50         185658 next unless @ready; # uncoverable branch true
455 10           36 my $socket = shift @ready;
456 10           49 my $buffer = _read_tcp($socket);
457                
458 10           47 $self->{replyfrom} = $ip;
459 10           87 $self->_diag( 'packet from', "[$ip]", length($buffer), 'octets' );
460                
461 10           212 my $reply = Net::DNS::Packet->decode( \$buffer, $self->{debug} );
462 10           61 $self->errorstring($@);
463 10 100         55 next unless $self->_accept_reply( $reply, $query );
464 8           61 $reply->from( $socket->peerhost );
465                
466 8 100   100     54 if ( $self->{tsig_rr} && !$reply->verify($query) ) {
467 2           12 $self->errorstring( $reply->verifyerr );
468 2           251 next;
469               }
470                
471 6           31 my $rcode = $reply->header->rcode;
472 6 100         533 return $reply if $rcode eq 'NOERROR';
473 3 100         186 return $reply if $rcode eq 'NXDOMAIN';
474 2           233 $fallback = $reply;
475               }
476                
477 5 100         64 $self->errorstring( $fallback->header->rcode ) if $fallback;
478 5 100         17 $self->errorstring('query timed out') unless $self->errorstring;
479 5           59 return $fallback;
480               }
481                
482                
483               sub _send_udp {
484 83       83   191 my ( $self, $query, $query_data ) = @_;
485                
486 83           321 my @ns = $self->nameservers;
487 83           199 my $port = $self->{port};
488 83     100     220 my $retrans = $self->{retrans} || 1;
489 83     100     229 my $retry = $self->{retry} || 1;
490 83           135 my $servers = scalar(@ns);
491 92 100     92   741 my $timeout = $servers ? do { no integer; $retrans / $servers } : 0;
  92           156  
  92           669  
  83           186  
  82           209  
492 83           155 my $fallback;
493                
494               # Perform each round of retries.
495 83           225 RETRY: for ( 1 .. $retry ) { # assumed to be a small number
496                
497               # Try each nameserver.
498 98           779 my $select = IO::Select->new();
499                
500 98           1164 NAMESERVER: foreach my $ns (@ns) {
501                
502               # state vector replaces corresponding element of @ns array
503 182 100         473 unless ( ref $ns ) {
504 131           557 my $sockaddr = $self->_create_dst_sockaddr( $ns, $port );
505 131     100     488 my $socket = $self->_create_udp_socket($ns) || next;
506 92           302 $ns = [$socket, $ns, $sockaddr];
507               }
508                
509 143           402 my ( $socket, $ip, $sockaddr, $failed ) = @$ns;
510 143 100         365 next if $failed;
511                
512 92           588 $self->_diag( 'udp send', "[$ip]:$port" );
513                
514 92           494 $select->add($socket);
515 92           5513 $socket->send( $query_data, 0, $sockaddr );
516 92           13899 $self->errorstring( $$ns[3] = $! );
517                
518 92           174 my $reply;
519 92           441 while ( my @ready = $select->can_read($timeout) ) {
520 70           2687547 my $socket = shift @ready;
521 70           340 my $buffer = _read_udp($socket);
522                
523 70           313 $self->{replyfrom} = $ip;
524 70           537 $self->_diag( 'packet from', "[$ip]", length($buffer), 'octets' );
525                
526 70           1172 my $packet = Net::DNS::Packet->decode( \$buffer, $self->{debug} );
527 70           461 $self->errorstring($@);
528 70 100         363 next unless $self->_accept_reply( $packet, $query );
529                
530 68           426 $packet->from( $socket->peerhost );
531 68           140 $reply = $packet;
532 68           167 last;
533               } #SELECT LOOP
534                
535 92 100         30237428 next unless $reply;
536                
537 68 100   100     336 if ( $self->{tsig_rr} && !$reply->verify($query) ) {
538 2           8 $self->errorstring( $$ns[3] = $reply->verifyerr );
539 2           27 next;
540               }
541                
542 66           214 my $rcode = $reply->header->rcode;
543 66 100         2667 return $reply if $rcode eq 'NOERROR';
544 5 100         134 return $reply if $rcode eq 'NXDOMAIN';
545 2           19 $fallback = $reply;
546 2           12 $$ns[3] = $rcode;
547               } #NAMESERVER LOOP
548                
549 92       92   29021 no integer;
  92           148  
  92           392  
550 34           121 $timeout += $timeout;
551               } #RETRY LOOP
552                
553 19 100         44 $self->errorstring( $fallback->header->rcode ) if $fallback;
554 19 100         47 $self->errorstring('query timed out') unless $self->errorstring;
555 19           504 return $fallback;
556               }
557                
558                
559               sub bgsend {
560 16       16 1 3244 my ( $self, @argument ) = @_;
561 16           64 my $packet = $self->_make_query_packet(@argument);
562 16           74 my $packet_data = $packet->encode;
563                
564 16           59 $self->_reset_errorstring;
565                
566               return $self->_bgsend_tcp( $packet, $packet_data )
567 16 100   100     109 if $self->{usevc} || length $packet_data > $self->_packetsz;
568                
569 9           43 return $self->_bgsend_udp( $packet, $packet_data );
570               }
571                
572                
573               sub _bgsend_tcp {
574 11       11   32 my ( $self, $packet, $packet_data ) = @_;
575                
576 11           36 my $tcp_packet = pack 'n a*', length($packet_data), $packet_data;
577                
578 11           35 foreach my $ip ( $self->nameservers ) {
579 11           51 $self->_diag( 'bgsend', "[$ip]" );
580                
581 11           40 my $socket = $self->_create_tcp_socket($ip);
582 11           97 $self->errorstring($!);
583 11 100         31 next unless $socket;
584                
585 9           34 $socket->blocking(0);
586 9           111 $socket->send($tcp_packet);
587 9           960 $self->errorstring($!);
588 9           31 $socket->blocking(1);
589                
590 9           121 my $expire = time() + $self->{tcp_timeout};
591 9           34 ${*$socket}{net_dns_bg} = [$expire, $packet];
  9           74  
592 9           67 return $socket;
593               }
594                
595 2           13 return;
596               }
597                
598                
599               sub _bgsend_udp {
600 10       10   22 my ( $self, $packet, $packet_data ) = @_;
601                
602 10           22 my $port = $self->{port};
603                
604 10           26 foreach my $ip ( $self->nameservers ) {
605 11           38 my $sockaddr = $self->_create_dst_sockaddr( $ip, $port );
606 11     100     36 my $socket = $self->_create_udp_socket($ip) || next;
607                
608 9           47 $self->_diag( 'bgsend', "[$ip]:$port" );
609                
610 9           36 $socket->send( $packet_data, 0, $sockaddr );
611 9           988 $self->errorstring($!);
612                
613 9           22 my $expire = time() + $self->{udp_timeout};
614 9           20 ${*$socket}{net_dns_bg} = [$expire, $packet];
  9           34  
615 9           50 return $socket;
616               }
617                
618 1           9 return;
619               }
620                
621                
622               sub bgbusy { ## no critic # overwrites user UDP handle
623 10813       10813 1 276225 my ( $self, $handle ) = @_;
624 10813 100         13164 return unless $handle;
625                
626 10811     100     9138 my $appendix = ${*$handle}{net_dns_bg} ||= [time() + $self->{udp_timeout}];
  10811           16631  
627 10811           12844 my ( $expire, $query, $read ) = @$appendix;
628 10811 100         12914 return if ref($read);
629                
630 10810 100         13771 return time() < $expire unless IO::Select->new($handle)->can_read(0.02); # limit CPU burn
631                
632 14 100         221108 return unless $query; # SpamAssassin 3.4.1 workaround
633 13 100         120 return unless $handle->socktype() == SOCK_DGRAM;
634                
635 6           153 my $ans = $self->_bgread($handle);
636 6           16 $$appendix[0] = time();
637 6           37 $$appendix[2] = [$ans];
638 6 100         18 return unless $ans;
639 5 100         18 return if $self->{igntc};
640 4 100         11 return unless $ans->header->tc;
641                
642 2           9 $self->_diag('packet truncated: retrying using TCP');
643 2     100     7 my $tcp = $self->_bgsend_tcp( $query, $query->encode ) || return;
644 1           8 return defined( $_[1] = $tcp ); # caller's UDP handle now TCP
645               }
646                
647                
648               sub bgisready { ## historical
649 1       1 0 20 __PACKAGE__->_deprecate('prefer ! bgbusy(...)'); # uncoverable pod
650 1           2 return !&bgbusy;
651               }
652                
653                
654               sub bgread {
655 11       11 1 1753 1 while &bgbusy; ## side effect: TCP retry if TC flag set
656 11           165 return &_bgread;
657               }
658                
659                
660               sub _bgread {
661 18       18   49 my ( $self, $handle ) = @_;
662 18 100         44 return unless $handle;
663                
664 17           29 my $appendix = ${*$handle}{net_dns_bg};
  17           57  
665 17           59 my ( $expire, $query, $read ) = @$appendix;
666 17 100         83 return shift(@$read) if ref($read);
667                
668 12 100         70 return unless IO::Select->new($handle)->can_read(0.2);
669                
670 11           1400 my $dgram = $handle->socktype() == SOCK_DGRAM;
671 11 100         187 my $buffer = $dgram ? _read_udp($handle) : _read_tcp($handle);
672                
673 11           104 my $peerhost = $self->{replyfrom} = $handle->peerhost;
674 11           743 $self->_diag( "packet from [$peerhost]", length($buffer), 'octets' );
675                
676 11           171 my $reply = Net::DNS::Packet->decode( \$buffer, $self->{debug} );
677 11           63 $self->errorstring($@);
678                
679 11 100         43 return unless $self->_accept_reply( $reply, $query );
680 10           57 $reply->from($peerhost);
681                
682 10 100   100     72 return $reply unless $self->{tsig_rr} && !$reply->verify($query);
683 1           6 $self->errorstring( $reply->verifyerr );
684 1           20 return;
685               }
686                
687                
688               sub _accept_reply {
689 96       96   309 my ( $self, $reply, $query ) = @_;
690                
691 96 100         306 return unless $reply;
692                
693 95           406 my $header = $reply->header;
694 95 100         489 return unless $header->qr;
695                
696 94 100   100     570 return if $query && ( $header->id != $query->header->id );
697                
698 88           419 return $self->errorstring( $header->rcode ); # historical quirk
699               }
700                
701                
702               sub axfr { ## zone transfer
703 9       9 1 1366 my ( $self, @argument ) = @_;
704 9 100         34 my $zone = scalar(@argument) ? shift @argument : $self->domain;
705 9           17 my @class = @argument;
706                
707 9           31 my $request = $self->_make_query_packet( $zone, 'AXFR', @class );
708                
709 8           17 return eval {
710 8           38 $self->_diag("axfr( $zone @class )");
711 8           31 my ( $select, $verify, @rr, $soa ) = $self->_axfr_start($request);
712                
713               my $iterator = sub { ## iterate over RRs
714 2688       2688   9690 my $rr = shift(@rr);
715                
716 2688 100         3425 if ( ref($rr) eq 'Net::DNS::RR::SOA' ) {
717 6 100         18 if ($soa) {
718 3           374 $select = undef;
719 3 100         52 return if $rr->canonical eq $soa->canonical;
720 1           7 croak $self->errorstring('mismatched final SOA');
721               }
722 3           4 $soa = $rr;
723               }
724                
725 2685 100         3081 unless ( scalar @rr ) {
726 28           51 my $reply; # refill @rr
727 28           126 ( $reply, $verify ) = $self->_axfr_next( $select, $verify );
728 28 100         178 @rr = $reply->answer if $reply;
729               }
730                
731 2685           2850 return $rr;
732 3           25 };
733                
734 3 100         23 return $iterator unless wantarray;
735                
736 2           2 my @zone; ## subvert iterator to assemble entire zone
737 2           6 while ( my $rr = $iterator->() ) {
738 20           399 push @zone, $rr, @rr; # copy RRs en bloc
739 20           200 @rr = pop(@zone); # leave last one in @rr
740               }
741 2           956 return @zone;
742               };
743               }
744                
745                
746               sub axfr_start { ## historical
747 1       1 0 21 my ( $self, @argument ) = @_; # uncoverable pod
748 1           5 $self->_deprecate('prefer $iterator = $self->axfr(...)');
749 1           2 my $iterator = $self->axfr(@argument);
750 1       1   6 ( $self->{axfr_iter} ) = grep {defined} ( $iterator, sub { } );
  2           5  
751 1           3 return defined($iterator);
752               }
753                
754                
755               sub axfr_next { ## historical
756 1       1 0 19 my $self = shift; # uncoverable pod
757 1           5 $self->_deprecate('prefer $iterator->()');
758 1           3 return $self->{axfr_iter}->();
759               }
760                
761                
762               sub _axfr_start {
763 8       8   13 my ( $self, $request ) = @_;
764 8           23 my $content = $request->encode;
765 8           31 my $TCP_msg = pack 'n a*', length($content), $content;
766                
767 8           11 my ( $select, $reply, $rcode );
768 8           28 foreach my $ns ( $self->nameservers ) {
769 11           70 $self->_diag("axfr send [$ns]");
770                
771 11           24 local $self->{persistent_tcp};
772 11           40 my $socket = $self->_create_tcp_socket($ns);
773 11           74 $self->errorstring($!);
774 11     100     145 $select = IO::Select->new( $socket || next );
775                
776 9           1162 $socket->send($TCP_msg);
777 9           1068 $self->errorstring($!);
778                
779 9           46 ($reply) = $self->_axfr_next($select);
780 9 100         43 last if ( $rcode = $reply->header->rcode ) eq 'NOERROR';
781               }
782                
783 8 100         28 croak $self->errorstring unless $reply;
784                
785 6           30 $self->errorstring($rcode); # historical quirk
786                
787 6 100         25 my $verify = $request->sigrr ? $request : undef;
788 6 100         19 unless ($verify) {
789 3 100         11 croak $self->errorstring unless $rcode eq 'NOERROR';
790 2           7 return ( $select, $verify, $reply->answer );
791               }
792                
793 3           13 my $verifyok = $reply->verify($verify);
794 3 100         14 croak $self->errorstring( $reply->verifyerr ) unless $verifyok;
795 2 100         10 croak $self->errorstring if $rcode ne 'NOERROR';
796 1           4 return ( $select, $verifyok, $reply->answer );
797               }
798                
799                
800               sub _axfr_next {
801 40       40   385 my $self = shift;
802 40     100     128 my $select = shift || return;
803 39           80 my $verify = shift;
804                
805 39           302 my ($socket) = $select->can_read( $self->{tcp_timeout} );
806 39 100         187620 croak $self->errorstring('timed out') unless $socket;
807                
808 38           159 my $buffer = _read_tcp($socket);
809 38           382 my $packet = Net::DNS::Packet->decode( \$buffer );
810 38 100         152 croak $@, $self->errorstring('corrupt packet') if $@;
811                
812 37 100         245 return ( $packet, $verify ) unless $verify;
813                
814 10           51 my $verifyok = $packet->verify($verify);
815 10 100         38 croak $self->errorstring( $packet->verifyerr ) unless $verifyok;
816 9           129 return ( $packet, $verifyok );
817               }
818                
819                
820               #
821               # Usage: $data = _read_tcp($socket);
822               #
823               sub _read_socket {
824 295       295   658 my ( $socket, $size ) = @_;
825 295           533 my $buffer = '';
826 295 100         1535 $socket->recv( $buffer, $size ) if $size;
827 295           100921 return $buffer;
828               }
829                
830               sub _read_tcp {
831 53       53   96 my $socket = shift;
832                
833 53           133 my $buffer = '';
834 53           154 my $header = _read_socket( $socket, 2 );
835 53           163 $header .= _read_socket( $socket, 2 - length $header );
836 53 50         240 return $buffer if length($header) < 2; # uncoverable branch true
837 53           229 my $size = unpack 'n', $header;
838                
839 53           149 while ( length( my $fragment = _read_socket( $socket, $size - length $buffer ) ) ) {
840 60           320 $buffer .= $fragment;
841               }
842 53           282 return $buffer;
843               }
844                
845                
846               #
847               # Usage: $data = _read_udp($socket);
848               #
849               sub _read_udp {
850 76       76   281 return _read_socket( shift(), 9000 ); ## payload limit for Ethernet "Jumbo" packet
851               }
852                
853                
854               sub _create_tcp_socket {
855 30       30   82 my ( $self, $ip, @sockopt ) = @_;
856                
857 30           42 my $socket;
858 30           59 my $sock_key = "TCP[$ip]";
859 30 100         151 if ( $socket = $self->{persistent}{$sock_key} ) {
860 2           7 $self->_diag( 'using persistent socket', $sock_key );
861 2 100         12 return $socket if $socket->connected;
862 1           16 $self->_diag('socket disconnected (trying to connect)');
863               }
864                
865               Carp::confess 'Insecure dependency while running with -T switch'
866 29           51 if TAINT && Scalar::Util::tainted( $ip || $self->{port} );
867                
868 29           94 my $ip6_addr = IPv6 && _ipv6($ip);
869               $socket = IO::Socket::IP->new(
870               LocalAddr => $ip6_addr ? $self->{srcaddr6} : $self->{srcaddr4},
871               LocalPort => $self->{srcport},
872               PeerAddr => $ip,
873               PeerPort => $self->{port},
874               Proto => 'tcp',
875               Timeout => $self->{tcp_timeout},
876 29 100         402 GetAddrInfoFlags => AI_NUMERICHOST,
877               @sockopt
878               )
879               if USE_SOCKET_IP;
880                
881 29           521702 unless ( USE_SOCKET_IP or $ip6_addr ) {
882               $socket = IO::Socket::INET->new(
883               LocalAddr => $self->{srcaddr4},
884               LocalPort => $self->{srcport} || undef,
885               PeerAddr => $ip,
886               PeerPort => $self->{port},
887               Proto => 'tcp',
888               Timeout => $self->{tcp_timeout},
889               @sockopt
890               );
891               }
892                
893 29 100         201 $self->{persistent}{$sock_key} = $socket if $self->{persistent_tcp};
894 29           124 return $socket;
895               }
896                
897                
898               sub _create_udp_socket {
899 103       103   297 my ( $self, $ip, @sockopt ) = @_;
900                
901 103           144 my $socket;
902 103           245 my $sock_key = "UDP[$ip]";
903 103 100         421 return $socket if $socket = $self->{persistent}{$sock_key};
904                
905 102           255 my $ip6_addr = IPv6 && _ipv6($ip);
906               $socket = IO::Socket::IP->new(
907               LocalAddr => $ip6_addr ? $self->{srcaddr6} : $self->{srcaddr4},
908               LocalPort => $self->{srcport},
909 102 100         1408 Proto => 'udp',
910               Type => SOCK_DGRAM,
911               GetAddrInfoFlags => AI_NUMERICHOST,
912               @sockopt
913               )
914               if USE_SOCKET_IP;
915                
916 102           57559 unless ( USE_SOCKET_IP or $ip6_addr ) {
917               $socket = IO::Socket::INET->new(
918               LocalAddr => $self->{srcaddr4},
919               LocalPort => $self->{srcport} || undef,
920               Proto => 'udp',
921               Type => SOCK_DGRAM,
922               @sockopt
923               );
924               }
925                
926 102 100         392 $self->{persistent}{$sock_key} = $socket if $self->{persistent_udp};
927 102           506 return $socket;
928               }
929                
930                
931               my $ip4 = {
932               family => AF_INET,
933               flags => AI_NUMERICHOST,
934               protocol => IPPROTO_UDP,
935               socktype => SOCK_DGRAM
936               };
937               my $ip6 = {
938               family => AF_INET6,
939               flags => AI_NUMERICHOST,
940               protocol => IPPROTO_UDP,
941               socktype => SOCK_DGRAM
942               };
943                
944               sub _create_dst_sockaddr { ## create UDP destination sockaddr structure
945 142       142   423 my ( $self, $ip, $port ) = @_;
946 142           184 my $addrinfo;
947 142 100         417 ($addrinfo) = grep {ref} Socket::getaddrinfo( $ip, $port, _ipv6($ip) ? $ip6 : $ip4 ), {}
  426           917  
948               if USE_SOCKET_IP;
949 142           267 $addrinfo = _ipv6($ip) ? undef : sockaddr_in( $port, inet_aton($ip) )
950               unless USE_SOCKET_IP;
951 142           300 my $sockaddr = USE_SOCKET_IP ? $addrinfo->{addr} : $addrinfo;
952                
953 142           162 Carp::confess 'Insecure dependency while running with -T switch'
954               if TAINT && Scalar::Util::tainted($sockaddr);
955 142           469 return $sockaddr;
956               }
957                
958                
959               # Lightweight versions of subroutines from Net::IP module, recoded to fix RT#96812
960                
961               sub _ipv4 {
962 597       597   850 for (shift) {
963 597 100         1545 last if m/[^.0-9]/; # dots and digits only
964 356           1530 return m/\.\d+\./; # dots separated by digits
965               }
966 241           627 return;
967               }
968                
969               sub _ipv6 {
970 697       697   1071 for (shift) {
971 697 100         2088 last unless m/:.*:/; # must contain two colons
972 294 100         1635 return 1 unless m/[^:0-9A-Fa-f]/; # colons and hexdigits only
973 4 100         22 return 1 if m/^[:.0-9A-Fa-f]+\%.+$/; # RFC4007 scoped address
974 2           16 return m/^[:0-9A-Fa-f]+:[.0-9]+$/; # prefix : dotted digits
975               }
976 403           2144 return;
977               }
978                
979                
980               sub _make_query_packet {
981 133       133   281 my ( $self, @argument ) = @_;
982                
983 133           235 my ($packet) = @argument;
984 133 100         346 unless ( ref($packet) ) {
985 86           440 $packet = Net::DNS::Packet->new(@argument);
986 85           234 $packet->edns->udpsize( $self->{udppacketsize} );
987                
988 85           214 my $header = $packet->header;
989 85           314 $header->ad( $self->{adflag} ); # RFC6840, 5.7
990 85           250 $header->cd( $self->{cdflag} ); # RFC6840, 5.9
991 85           269 $header->do( $self->{dnssec} );
992 85           268 $header->rd( $self->{recurse} );
993               }
994                
995 132 100         385 if ( $self->{tsig_rr} ) {
996 12 100         40 $packet->sign_tsig( $self->{tsig_rr} ) unless $packet->sigrr;
997               }
998                
999 132           376 return $packet;
1000               }
1001                
1002                
1003               sub dnssec {
1004 7       7 1 1945 my ( $self, @argument ) = @_;
1005 7           11 for (@argument) {
1006 3           10 $self->udppacketsize(1232);
1007 3           4 $self->{dnssec} = $_;
1008               }
1009 7           32 return $self->{dnssec};
1010               }
1011                
1012                
1013               sub force_v6 {
1014 7       7 1 1378 my ( $self, @value ) = @_;
1015 7 100         11 for (@value) { $self->{force_v4} = 0 if $self->{force_v6} = $_ }
  4           20  
1016 7 100         26 return $self->{force_v6} ? 1 : 0;
1017               }
1018                
1019               sub force_v4 {
1020 8       8 1 2056 my ( $self, @value ) = @_;
1021 8 100         18 for (@value) { $self->{force_v6} = 0 if $self->{force_v4} = $_ }
  5           25  
1022 8 100         31 return $self->{force_v4} ? 1 : 0;
1023               }
1024                
1025               sub prefer_v6 {
1026 8       8 1 842 my ( $self, @value ) = @_;
1027 8 100         13 for (@value) { $self->{prefer_v4} = 0 if $self->{prefer_v6} = $_ }
  5           20  
1028 8 100         27 return $self->{prefer_v6} ? 1 : 0;
1029               }
1030                
1031               sub prefer_v4 {
1032 6       6 1 1356 my ( $self, @value ) = @_;
1033 6 100         12 for (@value) { $self->{prefer_v6} = 0 if $self->{prefer_v4} = $_ }
  3           14  
1034 6 100         28 return $self->{prefer_v4} ? 1 : 0;
1035               }
1036                
1037               sub srcaddr {
1038 2       2 1 2020 my ( $self, @value ) = @_;
1039 2           7 for (@value) {
1040 2 100         8 my $hashkey = _ipv6($_) ? 'srcaddr6' : 'srcaddr4';
1041 2           12 $self->{$hashkey} = $_;
1042               }
1043 2           12 return shift @value;
1044               }
1045                
1046                
1047               sub tsig {
1048 9       9 1 488 my ( $self, $arg, @etc ) = @_;
1049 9 100         26 return $arg unless $arg;
1050 8 100         22 return $arg if ref($arg) eq 'Net::DNS::RR::TSIG';
1051 7           13 $self->{tsig_rr} = eval {
1052 7           30 local $SIG{__DIE__};
1053 7           1254 require Net::DNS::RR::TSIG;
1054 7           54 Net::DNS::RR::TSIG->create( $arg, @etc );
1055               };
1056 7 100         1158 croak "${@}unable to create TSIG record" if $@;
1057 6           17 return;
1058               }
1059                
1060                
1061               # if ($self->{udppacketsize} > PACKETSZ
1062               # then we use EDNS and $self->{udppacketsize}
1063               # should be taken as the maximum packet_data length
1064               sub _packetsz {
1065 102     100 102   371 my $udpsize = shift->{udppacketsize} || 0;
1066 102 100         436 return $udpsize > PACKETSZ ? $udpsize : PACKETSZ;
1067               }
1068                
1069               sub udppacketsize {
1070 9       9 1 42 my ( $self, @value ) = @_;
1071 9           16 for (@value) { $self->{udppacketsize} = $_ }
  7           15  
1072 9           28 return $self->_packetsz;
1073               }
1074                
1075                
1076               #
1077               # Keep this method around. Folk depend on it although it is neither documented nor exported.
1078               #
1079               sub make_query_packet { ## historical
1080 2       2 0 38 __PACKAGE__->_deprecate('see RT#37104'); # uncoverable pod
1081 2           5 return &_make_query_packet;
1082               }
1083                
1084                
1085               sub _diag { ## debug output
1086 488 100     488   1668 return unless shift->{debug};
1087 1           21 return print "\n;; @_\n";
1088               }
1089                
1090                
1091               {
1092               my $parse_dig = sub {
1093               require Net::DNS::ZoneFile;
1094                
1095               my $dug = Net::DNS::ZoneFile->new( \*DATA );
1096               my @rr = $dug->read;
1097                
1098               my @auth = grep { $_->type eq 'NS' } @rr;
1099               my %auth = map { lc $_->nsdname => 1 } @auth;
1100               my %glue;
1101               my @glue = grep { $auth{lc $_->name} } @rr;
1102               foreach ( grep { $_->can('address') } @glue ) {
1103               push @{$glue{lc $_->name}}, $_->address;
1104               }
1105               return map {@$_} values %glue;
1106               };
1107                
1108               my @ip;
1109                
1110               sub _hints { ## default hints
1111 6 100     6   1181 @ip = &$parse_dig unless scalar @ip; # once only, on demand
1112 6           202 splice @ip, 0, 0, splice( @ip, int( rand scalar @ip ) ); # cut deck
1113 6           58 return @ip;
1114               }
1115               }
1116                
1117                
1118         1     sub DESTROY { } ## Avoid tickling AUTOLOAD (in cleanup)
1119                
1120               sub AUTOLOAD { ## Default method
1121 44       44   707 my ($self) = @_;
1122                
1123 92       92   330743 no strict 'refs'; ## no critic ProhibitNoStrict
  92           196  
  92           20603  
1124 44           53 our $AUTOLOAD;
1125 44           73 my $name = $AUTOLOAD;
1126 44           235 $name =~ s/.*://;
1127 44 100         243 croak qq[unknown method "$name"] unless $public_attr{$name};
1128                
1129 43           190 *{$AUTOLOAD} = sub {
1130 100       100   3880 my $self = shift;
1131 100 100         250 $self = $self->_defaults unless ref($self);
1132 100 100   100     483 $self->{$name} = shift || 0 if scalar @_;
1133 100           294 return $self->{$name};
1134 43           395 };
1135                
1136 43           111 return &$AUTOLOAD;
1137               }
1138                
1139                
1140               1;
1141                
1142                
1143               =head1 NAME
1144                
1145               Net::DNS::Resolver::Base - DNS resolver base class
1146                
1147               =head1 SYNOPSIS
1148                
1149               use base qw(Net::DNS::Resolver::Base);
1150                
1151               =head1 DESCRIPTION
1152                
1153               This class is the common base class for the different platform
1154               sub-classes of L.
1155                
1156               No user serviceable parts inside, see L
1157               for all your resolving needs.
1158                
1159                
1160               =head1 METHODS
1161                
1162               =head2 new, domain, searchlist, nameserver, nameservers,
1163                
1164               =head2 search, query, send, bgsend, bgbusy, bgread, axfr,
1165                
1166               =head2 force_v4, force_v6, prefer_v4, prefer_v6,
1167                
1168               =head2 dnssec, srcaddr, tsig, udppacketsize,
1169                
1170               =head2 print, string, errorstring, replyfrom
1171                
1172               See L.
1173                
1174                
1175               =head1 COPYRIGHT
1176                
1177               Copyright (c)2003,2004 Chris Reinhardt.
1178                
1179               Portions Copyright (c)2005 Olaf Kolkman.
1180                
1181               Portions Copyright (c)2014-2017 Dick Franks.
1182                
1183               All rights reserved.
1184                
1185                
1186               =head1 LICENSE
1187                
1188               Permission to use, copy, modify, and distribute this software and its
1189               documentation for any purpose and without fee is hereby granted, provided
1190               that the original copyright notices appear in all copies and that both
1191               copyright notice and this permission notice appear in supporting
1192               documentation, and that the name of the author not be used in advertising
1193               or publicity pertaining to distribution of the software without specific
1194               prior written permission.
1195                
1196               THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1197               IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1198               FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1199               THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1200               LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1201               FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1202               DEALINGS IN THE SOFTWARE.
1203                
1204                
1205               =head1 SEE ALSO
1206                
1207               L L L
1208                
1209               =cut
1210                
1211                
1212               ########################################
1213                
1214               __DATA__ ## DEFAULT HINTS