File Coverage

blib/lib/Net/DNS/Codes.pm
Criterion Covered Total %
statement 24 25 96.0
branch 1 2 50.0
condition n/a
subroutine 12 12 100.0
pod 0 5 0.0
total 37 44 84.0


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2             package Net::DNS::Codes;
3 5     5   18702 use strict;
  5         10  
  5         203  
4             #use diagnostics;
5 5     5   28 use Carp;
  5         8  
  5         643  
6              
7 5     5   27 use vars qw($VERSION @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);
  5         12  
  5         983  
8             require Exporter;
9             @ISA = qw(Exporter);
10              
11             $VERSION = do { my @r = (q$Revision: 0.12 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
12              
13             # various EXPORT variables are declared at end of this module
14              
15             sub AUTOLOAD {
16 5     5   26 no strict;
  5         10  
  5         6396  
17 154     154   24948 my $sub = $AUTOLOAD;
18 154         754 (my $func = $sub) =~ s/.*:://;
19 154 50       1383 if (defined (my $val = &_Code->{$func})) {
20 154     154   951 *$sub = sub { $val };
  154         598  
21 154         563 goto &$sub;
22             }
23 0         0 croak "Undefined function Net::DNS::Codes::${func}";
24             }
25              
26             =head1 NAME
27              
28             Net::DNS::Codes - collection of C library DNS codes
29              
30             =head1 SYNOPSIS
31              
32             use Net::DNS::Codes qw(
33             :header
34             :RRs
35             :constants
36             :all
37             (or any individual item)
38             );
39              
40             --------- :header -------
41              
42             $textval = RBitsTxt->{masked_bits};
43             $textval = RcodeTxt->{numeric};
44             $textval = OpcodeTxt->{numeric};
45             $code = (one of text below)
46              
47             QR AA TC RD RA MBZ Z AD CD
48              
49             BITS_QUERY
50             BITS_IQUERY
51             BITS_STATUS
52             BITS_NS_NOTIFY_OP
53             BITS_NS_UPDATE_OP
54              
55             QUERY
56             IQUERY
57             STATUS
58             NS_NOTIFY_OP
59             NS_UPDATE_OP
60              
61             NOERROR
62             FORMERR
63             SERVFAIL
64             NXDOMAIN
65             NOTIMP
66             REFUSED
67             YXDOMAIN
68             YXRRSET
69             NXRRSET
70             NOTAUTH
71             NOTZONE
72             BADSIG
73             BADKEY
74             BADTIME
75              
76             for flag manipulation
77              
78             RCODE_MASK
79             BITS_OPCODE_MASK
80              
81             ------- :RRs -------
82              
83             $textval = ClassTxt->{numeric};
84             $textval = TypeTxt->{numeric};
85             $code = (one of text below)
86              
87             C_IN
88             C_CHAOS
89             C_HS
90             C_NONE
91             C_ANY
92              
93             T_A
94             T_NS
95             T_MD
96             T_MF
97             T_CNAME
98             T_SOA
99             T_MB
100             T_MG
101             T_MR
102             T_NULL
103             T_WKS
104             T_PTR
105             T_HINFO
106             T_MINFO
107             T_MX
108             T_TXT
109             T_RP
110             T_AFSDB
111             T_X25
112             T_ISDN
113             T_RT
114             T_NSAP
115             T_NSAP_PTR
116             T_SIG
117             T_KEY
118             T_PX
119             T_GPOS
120             T_AAAA
121             T_LOC
122             T_NXT
123             T_EID
124             T_NIMLOC
125             T_SRV
126             T_ATMA
127             T_NAPTR
128             T_KX
129             T_CERT
130             T_A6
131             T_DNAME
132             T_SINK
133             T_OPT
134             T_TKEY
135             T_TSIG
136             T_IXFR
137             T_AXFR
138             T_MAILB
139             T_MAILA
140             T_ANY
141              
142             ------- :constants -------
143             $code = (one of test below)
144              
145             PACKETSZ NS_PACKETSZ MAXDNAME NS_MAXDNAME
146             MAXCDNAME NS_MAXCDNAME MAXLABEL NS_MAXLABEL HFIXEDSZ NS_HFIXEDSZ
147             QFIXEDSZ NS_QFIXEDSZ RRFIXEDSZ NS_RRFIXEDSZ INT32SZ NS_INT32SZ
148             INT16SZ NS_INT16SZ NS_INT8SZ INADDRSZ NS_INADDRSZ
149             IN6ADDRSZ NS_IN6ADDRSZ INDIR_MASK NS_CMPRSFLGS
150             NAMESERVER_PORT NS_DEFAULTPORT
151            
152             $code = INT8SZ (not a DNS code, added for convenience)
153              
154             =head1 DESCRIPTION
155              
156             B provides forward and reverse lookup for most
157             common C library DNS codes as well as all the codes for the DNS
158             HEADER field.
159              
160             =over 4
161              
162             =item * $bitmask = XX
163              
164             Return the bitmask for the code:
165              
166             15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
167             +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
168             |QR| Opcode |AA|TC|RD|RA| Z|AD|CD| Rcode |
169             +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
170             0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
171              
172             QR => 1000_0000_0000_0000
173             BitsOpcode => Opcode binary value
174             left shifted 11 bits
175             AA => 100_0000_0000
176             TC => 10_0000_0000
177             RD => 1_0000_0000
178             RA => 1000_0000
179             MBZ or Z => 100_0000
180             AD => 10_0000
181             CD => 1_0000
182             Rcode => Rcode binary value
183              
184             RCODE_MASK => 1111_1111_1111_0000
185              
186             where BitsOpcode =
187              
188             BITS_QUERY => 0,
189             BITS_IQUERY => 1000_0000_0000 # 1 << 11
190             BITS_STATUS => 1_0000_0000_0000 # 2 << 11
191             BITS_NS_NOTIFY_OP => 10_0000_0000_0000 # 4 << 11
192             BITS_NS_UPDATE_OP => 10_1000_0000_0000 # 5 << 11
193              
194             BITS_OPCODE_MASK => 1000_0111_1111_1111
195              
196             =cut
197              
198             my %_query = (
199             QR => 0x1<<15,
200             AA => 0x1<<10,
201             TC => 0x1<<9,
202             RD => 0x1<<8,
203             RA => 0x1<<7,
204             MBZ => 0x1<<6,
205             AD => 0x1<<5,
206             CD => 0x1<<4,
207             BITS_QUERY => 0,
208             BITS_IQUERY => 1 << 11,
209             BITS_STATUS => 2 << 11,
210             BITS_NS_NOTIFY_OP => 4 << 11,
211             BITS_NS_UPDATE_OP => 5 << 11,
212             BITS_OPCODE_MASK => 0xF<<11 ^ 0xFFFF,
213             RCODE_MASK => 0xFFF0,
214             );
215              
216             my %_querytxt;
217             while (my($key,$val) = each %_query) {
218             $key =~ s/BITS_//;
219             $_querytxt{$val} = $key;
220             }
221              
222             $_query{Z} = $_query{MBZ};
223              
224 13     13 0 1897 sub RBitsTxt { \%_querytxt };
225              
226             =item * $textval = RBitsTxt->{masked_bits};
227              
228             Returns the TEXT string for the bit fields above.
229              
230             NOTE: that MBZ and Z have the same value.
231             The text string 'MBZ' is returned for 0x1 << 6
232              
233             =item * $textval = RcodeTxt->{numeric};
234              
235             Return the TEXT string for numeric code.
236              
237             NOERROR => 0,
238             FORMERR => 1,
239             SERVFAIL => 2,
240             NXDOMAIN => 3,
241             NOTIMP => 4,
242             REFUSED => 5,
243             YXDOMAIN => 6,
244             YXRRSET => 7,
245             NXRRSET => 8,
246             NOTAUTH => 9,
247             NOTZONE => 10,
248             BADSIG => 16,
249             BADKEY => 17,
250             BADTIME => 18,
251              
252             =cut
253              
254             my %_rcode = (
255             NOERROR => 0,
256             FORMERR => 1,
257             SERVFAIL => 2,
258             NXDOMAIN => 3,
259             NOTIMP => 4,
260             REFUSED => 5,
261             YXDOMAIN => 6,
262             YXRRSET => 7,
263             NXRRSET => 8,
264             NOTAUTH => 9,
265             NOTZONE => 10,
266             BADSIG => 16,
267             BADKEY => 17,
268             BADTIME => 18,
269             );
270              
271             my %_rcodeTxt = reverse %_rcode;
272              
273 14     14 0 1537 sub RcodeTxt {\%_rcodeTxt};
274              
275             =item * $textval = OpcodeTxt->{numeric};
276              
277             Return the TEXT string for numeric code.
278              
279             QUERY => 0,
280             IQUERY => 1,
281             STATUS => 2,
282             NS_NOTIFY_OP => 4,
283             NS_UPDATE_OP => 5,
284              
285             =cut
286              
287             my %_opcode = (
288             QUERY => 0,
289             IQUERY => 1,
290             STATUS => 2,
291             NS_NOTIFY_OP => 4,
292             NS_UPDATE_OP => 5,
293             );
294              
295             my %_opcodeTxt = reverse %_opcode;
296              
297 5     5 0 70 sub OpcodeTxt {\%_opcodeTxt};
298              
299             =item * $textval = ClassTxt->{numeric};
300              
301             Return the TEXT string for numeric code.
302              
303             C_IN => 1,
304             C_CHAOS => 3,
305             C_HS => 4,
306             C_NONE => 254,
307             C_ANY => 255,
308              
309             =cut
310              
311             my %_class = (
312             C_IN => 1,
313             C_CHAOS => 3,
314             C_HS => 4,
315             C_NONE => 254,
316             C_ANY => 255,
317             );
318              
319             my %_classTxt = reverse %_class;
320              
321 5     5 0 777 sub ClassTxt {\%_classTxt};
322            
323             =item * $textval = TypeTxt->{numeric};
324              
325             Return the TEXT string for numeric code.
326              
327             T_A => 1, # rfc1035.txt
328             T_NS => 2, # rfc1035.txt
329             T_MD => 3, # rfc1035.txt
330             T_MF => 4, # rfc1035.txt
331             T_CNAME => 5, # rfc1035.txt
332             T_SOA => 6, # rfc1035.txt
333             T_MB => 7, # rfc1035.txt
334             T_MG => 8, # rfc1035.txt
335             T_MR => 9, # rfc1035.txt
336             T_NULL => 10, # rfc1035.txt
337             T_WKS => 11, # rfc1035.txt
338             T_PTR => 12, # rfc1035.txt
339             T_HINFO => 13, # rfc1035.txt
340             T_MINFO => 14, # rfc1035.txt
341             T_MX => 15, # rfc1035.txt
342             T_TXT => 16, # rfc1035.txt
343             T_RP => 17, # rfc1183.txt
344             T_AFSDB => 18, # rfc1183.txt
345             T_X25 => 19, # rfc1183.txt
346             T_ISDN => 20, # rfc1183.txt
347             T_RT => 21, # rfc1183.txt
348             T_NSAP => 22, # rfc1706.txt
349             T_NSAP_PTR => 23, # rfc1348.txt
350             T_SIG => 24, # rfc2535.txt
351             T_KEY => 25, # rfc2535.txt
352             T_PX => 26, # rfc2163.txt
353             T_GPOS => 27, # rfc1712.txt
354             T_AAAA => 28, # rfc1886.txt
355             T_LOC => 29, # rfc1876.txt
356             T_NXT => 30, # rfc2535.txt
357             T_EID => 31, # draft-ietf-nimrod-dns-02.txt
358             T_NIMLOC => 32, # draft-ietf-nimrod-dns-02.txt
359             T_SRV => 33, # rfc2052.txt
360             T_ATMA => 34, # af-saa-0069.000.txt
361             T_NAPTR => 35, # rfc2168.txt
362             T_KX => 36, # rfc2230.txt
363             T_CERT => 37, # rfc2538.txt
364             T_A6 => 38, # rfc2874.txt
365             T_DNAME => 39, # rfc2672.txt
366             T_SINK => 40, # draft-ietf-dnsind-kitchen-sink-01.txt
367             T_OPT => 41, # rfc2671.txt
368             T_APL => 42, # rfc3123.txt
369             T_DS => 43, # draft-ietf-dnsext-delegation-signer-15.txt
370             T_SSHFP => 44, # rfc4255.txt
371             T_IPSECKEY => 45, # rfc4025.txt
372             T_RRSIG => 46, # rfc4034.txt
373             T_NSEC => 47, # rfc4034.txt
374             T_DNSKEY => 48, # rfc4034.txt
375             T_DHCID => 49, # rfc4701.txt
376             T_NSEC3 => 50, # rfc5155.txt
377             T_NSEC3PARAM => 51, # rfc5155.txt
378             # unassigned 52 - 54
379             T_HIP => 55, # rfc5205.txt
380             T_NINFO => 56, # unknown
381             T_RKEY => 57, # draft-reid-dnsext-rkey-00.txt
382             T_ALINK => 58, # draft-ietf-dnsop-dnssec-trust-history-02.txt
383             T_CDS => 59, # draft-barwood-dnsop-ds-publish-02.txt
384             # unassigned 60 - 98
385             T_UINFO => 100, # reserved
386             T_UID => 101, # reserved
387             T_GID => 102, # reserved
388             T_UNSPEC => 103, # reserved
389             # unassigned 104 - 248
390             T_TKEY => 249, # rfc2930.txt
391             T_TSIG => 250, # rfc2931.txt
392             T_IXFR => 251, # rfc1995.txt
393             T_AXFR => 252, # rfc1035.txt
394             T_MAILB => 253, # rfc973.txt
395             T_MAILA => 254, # rfc973.txt
396             T_ANY => 255, # rfc1886.txt
397              
398             =cut
399              
400             my %_type = ( # document in /extradocs
401             T_A => 1, # rfc1035.txt
402             T_NS => 2, # rfc1035.txt
403             T_MD => 3, # rfc1035.txt
404             T_MF => 4, # rfc1035.txt
405             T_CNAME => 5, # rfc1035.txt
406             T_SOA => 6, # rfc1035.txt
407             T_MB => 7, # rfc1035.txt
408             T_MG => 8, # rfc1035.txt
409             T_MR => 9, # rfc1035.txt
410             T_NULL => 10, # rfc1035.txt
411             T_WKS => 11, # rfc1035.txt
412             T_PTR => 12, # rfc1035.txt
413             T_HINFO => 13, # rfc1035.txt
414             T_MINFO => 14, # rfc1035.txt
415             T_MX => 15, # rfc1035.txt
416             T_TXT => 16, # rfc1035.txt
417             T_RP => 17, # rfc1183.txt
418             T_AFSDB => 18, # rfc1183.txt
419             T_X25 => 19, # rfc1183.txt
420             T_ISDN => 20, # rfc1183.txt
421             T_RT => 21, # rfc1183.txt
422             T_NSAP => 22, # rfc1706.txt
423             T_NSAP_PTR => 23, # rfc1348.txt
424             T_SIG => 24, # rfc2535.txt
425             T_KEY => 25, # rfc2535.txt
426             T_PX => 26, # rfc2163.txt
427             T_GPOS => 27, # rfc1712.txt
428             T_AAAA => 28, # rfc1886.txt
429             T_LOC => 29, # rfc1876.txt
430             T_NXT => 30, # rfc2535.txt
431             T_EID => 31, # draft-ietf-nimrod-dns-02.txt
432             T_NIMLOC => 32, # draft-ietf-nimrod-dns-02.txt
433             T_SRV => 33, # rfc2052.txt
434             T_ATMA => 34, # af-saa-0069.000.txt
435             T_NAPTR => 35, # rfc2168.txt
436             T_KX => 36, # rfc2230.txt
437             T_CERT => 37, # rfc2538.txt
438             T_A6 => 38, # rfc2874.txt
439             T_DNAME => 39, # rfc2672.txt
440             T_SINK => 40, # draft-ietf-dnsind-kitchen-sink-01.txt
441             T_OPT => 41, # rfc2671.txt
442             T_APL => 42, # rfc3123.txt
443             T_DS => 43, # draft-ietf-dnsext-delegation-signer-15.txt
444             T_SSHFP => 44, # rfc4255.txt
445             T_IPSECKEY => 45, # rfc4025.txt
446             T_RRSIG => 46, # rfc4034.txt
447             T_NSEC => 47, # rfc4034.txt
448             T_DNSKEY => 48, # rfc4034.txt
449             T_DHCID => 49, # rfc4701.txt
450             T_NSEC3 => 50, # rfc5155.txt
451             T_NSEC3PARAM => 51, # rfc5155.txt
452             # unassigned 52 - 54
453             T_HIP => 55, # rfc5205.txt
454             T_NINFO => 56, # unknown
455             T_RKEY => 57, # draft-reid-dnsext-rkey-00.txt
456             T_ALINK => 58, # draft-ietf-dnsop-dnssec-trust-history-02.txt
457             T_CDS => 59, # draft-barwood-dnsop-ds-publish-02.txt
458             # unassigned 60 - 98
459             T_UINFO => 100, # reserved
460             T_UID => 101, # reserved
461             T_GID => 102, # reserved
462             T_UNSPEC => 103, # reserved
463             # unassigned 104 - 248
464             T_TKEY => 249, # rfc2930.txt
465             T_TSIG => 250, # rfc2931.txt
466             T_IXFR => 251, # rfc1995.txt
467             T_AXFR => 252, # rfc1886.txt
468             T_MAILB => 253, # rfc1886.txt
469             T_MAILA => 254, # rfc1886.txt
470             T_ANY => 255, # rfc1886.txt
471             );
472              
473             my %_typeTxt = reverse %_type;
474              
475 67     67 0 2867 sub TypeTxt {\%_typeTxt};
476              
477             =item * (various constants)
478              
479             PACKETSZ NS_PACKETSZ 512
480             MAXDNAME NS_MAXDNAME 1025
481             MAXCDNAME NS_MAXCDNAME 255
482             MAXLABEL NS_MAXLABEL 63
483             HFIXEDSZ NS_HFIXEDSZ 12
484             QFIXEDSZ NS_QFIXEDSZ 4
485             RRFIXEDSZ NS_RRFIXEDSZ 10
486             INT32SZ NS_INT32SZ 4
487             INT16SZ NS_INT16SZ 2
488             INT8SZ NS_INT8SZ 1
489             INADDRSZ NS_INADDRSZ 4
490             IN6ADDRSZ NS_IN6ADDRSZ 16
491             INDIR_MASK NS_CMPRSFLGS 0xc0
492             NAMESERVER_PORT NS_DEFAULTPORT 53
493              
494             =back
495              
496             =cut
497              
498             my %_constants = (qw(
499             PACKETSZ 512 NS_PACKETSZ 512
500             MAXDNAME 1025 NS_MAXDNAME 1025
501             MAXCDNAME 255 NS_MAXCDNAME 255
502             MAXLABEL 63 NS_MAXLABEL 63
503             HFIXEDSZ 12 NS_HFIXEDSZ 12
504             QFIXEDSZ 4 NS_QFIXEDSZ 4
505             RRFIXEDSZ 10 NS_RRFIXEDSZ 10
506             INT32SZ 4 NS_INT32SZ 4
507             INT16SZ 2 NS_INT16SZ 2
508             INT8SZ 1 NS_INT8SZ 1
509             INADDRSZ 4 NS_INADDRSZ 4
510             IN6ADDRSZ 16 NS_IN6ADDRSZ 16
511             INDIR_MASK ), 0xc0,qw(NS_CMPRSFLGS ), 0xc0, qw(
512             NAMESERVER_PORT 53 NS_DEFAULTPORT 53 )
513             );
514              
515             =head1 INSTALLATION
516              
517             To install this module, type:
518              
519             perl Makfile.PL
520             make
521             make test
522             make install
523              
524             =cut
525              
526             my %_allcodes = (%_rcode,%_opcode,%_type,%_class,%_query,%_constants);
527              
528 154     154   648 sub _Code {\%_allcodes};
529              
530             %EXPORT_TAGS = (
531             header => [qw(
532             QR AA TC RD RA MBZ Z AD CD
533             RBitsTxt
534             RcodeTxt
535             OpcodeTxt),
536             keys %_rcode,
537             keys %_opcode,
538             keys %_query,
539             ],
540             RRs => [qw(
541             ClassTxt
542             TypeTxt),
543             keys %_class,
544             keys %_type,
545             ],
546              
547             constants => [
548             keys %_constants
549             ],
550             );
551              
552             $EXPORT_TAGS{all} = [@{$EXPORT_TAGS{header}},@{$EXPORT_TAGS{RRs}},@{$EXPORT_TAGS{constants}}];
553              
554             Exporter::export_ok_tags('all');
555              
556             =head1 EXPORT_OK
557              
558             ------- for tag :header -------
559              
560             RBitsTxt RcodeTxt OpcodeTxt
561              
562             QR AA TC RD RA MBZ Z AD CD
563              
564             BITS_QUERY
565             BITS_IQUERY
566             BITS_STATUS
567             BITS_NS_NOTIFY_OP
568             BITS_NS_UPDATE_OP
569              
570             QUERY
571             IQUERY
572             STATUS
573             NS_NOTIFY_OP
574             NS_UPDATE_OP
575              
576             NOERROR
577             FORMERR
578             SERVFAIL
579             NXDOMAIN
580             NOTIMP
581             REFUSED
582             YXDOMAIN
583             YXRRSET
584             NXRRSET
585             NOTAUTH
586             NOTZONE
587             BADSIG
588             BADKEY
589             BADTIME
590              
591             BITS_OPCODE_MASK
592             RCODE_MASK
593              
594             ------- for tag :RRs -------
595              
596             $textval = ClassTxt->{numeric};
597             $textval = TypeTxt->{numeric};
598             $code = (one of text below)
599              
600             C_IN
601             C_CHAOS
602             C_HS
603             C_NONE
604             C_ANY
605              
606             T_A
607             T_NS
608             T_MD
609             T_MF
610             T_CNAME
611             T_SOA
612             T_MB
613             T_MG
614             T_MR
615             T_NULL
616             T_WKS
617             T_PTR
618             T_HINFO
619             T_MINFO
620             T_MX
621             T_TXT
622             T_RP
623             T_AFSDB
624             T_X25
625             T_ISDN
626             T_RT
627             T_NSAP
628             T_NSAP_PTR
629             T_SIG
630             T_KEY
631             T_PX
632             T_GPOS
633             T_AAAA
634             T_LOC
635             T_NXT
636             T_EID
637             T_NIMLOC
638             T_SRV
639             T_ATMA
640             T_NAPTR
641             T_KX
642             T_CERT
643             T_A6
644             T_DNAME
645             T_SINK
646             T_OPT
647             T_APL
648             T_DS
649             T_SSHFP
650             T_IPSECKEY
651             T_RRSIG
652             T_NSEC
653             T_DNSKEY
654             T_DHCID
655             T_NSEC3
656             T_NSEC3PARAM
657             T_HIP
658             T_NINFO
659             T_RKEY
660             T_ALINK
661             T_CDS
662             T_UINFO
663             T_UID
664             T_GID
665             T_UNSPEC
666             T_TKEY
667             T_TSIG
668             T_IXFR
669             T_AXFR
670             T_MAILB
671             T_MAILA
672             T_ANY
673              
674             ------- for tag :constants -------
675              
676             PACKETSZ NS_PACKETSZ MAXDNAME NS_MAXDNAME
677             MAXCDNAME NS_MAXCDNAME MAXLABEL NS_MAXLABEL HFIXEDSZ NS_HFIXEDSZ
678             QFIXEDSZ NS_QFIXEDSZ RRFIXEDSZ NS_RRFIXEDSZ INT32SZ NS_INT32SZ
679             INT16SZ NS_INT16SZ NS_INT8SZ INADDRSZ NS_INADDRSZ
680             IN6ADDRSZ NS_IN6ADDRSZ INDIR_MASK NS_CMPRSFLGS
681             NAMESERVER_PORT NS_DEFAULTPORT INT8SZ
682              
683             =head1 EXPORT_TAGS
684              
685             :header
686             :RRs
687             :constants
688             :all
689              
690             =head1 AUTHOR
691              
692             Michael Robinton, michael@bizsystems.com
693              
694             =head1 COPYRIGHT
695              
696             Copyright 2003 - 2014, Michael Robinton & BizSystems
697             This program is free software; you can redistribute it and/or modify
698             it under the terms of the GNU General Public License as published by
699             the Free Software Foundation; either version 2 of the License, or
700             (at your option) any later version.
701              
702             This program is distributed in the hope that it will be useful,
703             but WITHOUT ANY WARRANTY; without even the implied warranty of
704             MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
705             GNU General Public License for more details.
706              
707             You should have received a copy of the GNU General Public License
708             along with this program; if not, write to the Free Software
709             Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
710              
711             =head1 SEE ALSO
712              
713             perl(1), /usr/include/resolv.h /usr/include/arpa/nameser.h /usr/include/namser_compat.h
714              
715             =cut
716              
717             1;