1package Net::DNS::ToolKit::RR::MINFO;
2
3use strict;
4#use warnings;
5
6use Net::DNS::ToolKit qw(
7	get16
8	get32
9	put16
10	put32
11	dn_comp
12	dn_expand
13);
14use Net::DNS::Codes qw(:constants);
15use vars qw($VERSION);
16
17$VERSION = do { my @r = (q$Revision: 0.01 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
18
19=head1 NAME
20
21Net::DNS::ToolKit::RR::MINFO - Resource Record Handler
22
23=head1 SYNOPSIS
24
25  DO NOT use Net::DNS::ToolKit::RR::MINFO
26  DO NOT require Net::DNS::ToolKit::RR::MINFO
27
28  Net::DNS::ToolKit::RR::MINFO is autoloaded by
29  class Net::DNS::ToolKit::RR and its methods
30  are instantiated in a 'special' manner.
31
32  use Net::DNS::ToolKit::RR;
33  ($get,$put,$parse) = new Net::DNS::ToolKit::RR;
34
35  ($newoff,$name,$type,$class,$ttl,$rdlength,
36        ) = $get->MINFO(\$buffer,$offset);
37
38  Note: the $get->MINFO method is normally called
39  via:  @stuff = $get->next(\$buffer,$offset);
40
41  ($newoff,@dnptrs)=$put->MINFO(\$buffer,$offset,\@dnptrs,
42     $name,$type,$class,$ttl,
43     $mname,$errname);
44
45  $NAME,$TYPE,$CLASS,$TTL,$rdlength,
46  $MNAME,$RNAME,$serial,$refresh,$retry,$expire,$min)
47    = $parse->MINFO($name,$type,$class,$ttl,$rdlength,
48      $mname,$errname);
49
50=head1 DESCRIPTION
51
52B<Net::DNS::ToolKit::RR:MINFO> appends an MINFO resource record to a DNS packet
53under construction, recovers an MINFO resource record from a packet being decoded, and
54converts the numeric/binary portions of the resource record to human
55readable form.
56
57  Description from RFC1035.txt
58
59  3.2.1. Format
60
61  All RRs have the same top level format shown below:
62
63                                    1  1  1  1  1  1
64      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
65    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
66    |                      NAME                     |
67    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
68    |                      TYPE                     |
69    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
70    |                     CLASS                     |
71    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
72    |                      TTL                      |
73    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
74    |                   RDLENGTH                    |
75    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
76    |                     RDATA                     |
77    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
78
79  NAME  an owner name, i.e., the name of the node to which this
80	resource record pertains.
81
82  TYPE  two octets containing one of the RR TYPE codes.
83
84  CLASS two octets containing one of the RR CLASS codes.
85
86  TTL   a 32 bit signed integer that specifies the time interval
87	that the resource record may be cached before the source
88	of the information should again be consulted.  Zero
89	values are interpreted to mean that the RR can only be
90	used for the transaction in progress, and should not be
91	cached.  For example, MINFO records are always distributed
92	with a zero TTL to prohibit caching.  Zero values can
93	also be used for extremely volatile data.
94
95  RDLENGTH an unsigned 16 bit integer that specifies the length
96	in octets of the RDATA field.
97
98  RDATA a variable length string of octets that describes the
99	resource.  The format of this information varies
100	according to the TYPE and CLASS of the resource record.
101
102    3.3.13. MINFO RDATA format
103
104    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
105    /                    RMAILBX                    /
106    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
107    /                    EMAILBX                    /
108    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
109
110  where:
111
112  RMAILBX A <domain-name> which specifies a mailbox which is
113          responsible for the mailing list or mailbox.  If this
114          domain name names the root, the owner of the MINFO RR is
115          responsible for itself.  Note that many existing mailing
116          lists use a mailbox X-request for the RMAILBX field of
117          mailing list X, e.g., Msgroup-request for Msgroup.  This
118          field provides a more general mechanism.
119
120  EMAILBX A <domain-name> which specifies a mailbox which is to
121          receive error messages related to the mailing list or
122          mailbox specified by the owner of the MINFO RR (similar
123          to the ERRORS-TO: field which has been proposed).  If
124          this domain name names the root, errors should be
125          returned to the sender of the message.
126
127MINFO records cause no additional section processing.
128
129=over 4
130
131=item * @stuff = $get->MINFO(\$buffer,$offset);
132
133  Get the contents of the resource record.
134
135  USE: @stuff = $get->next(\$buffer,$offset);
136
137  where: @stuff = (
138  $newoff $name,$type,$class,$ttl,$rdlength,
139  $rname,$errname);
140
141All except the last five (2) items,
142B<$mname,$errname>, are provided by
143the class loader, B<Net::DNS::ToolKit::RR>. The code in this method knows
144how to retrieve B<$mname,$errname>.
145
146  input:	pointer to buffer,
147		offset into buffer
148  returns:	offset to next resource,
149		@common RR elements,
150		responsible.mail.box
151		error.mail.box
152
153=cut
154
155sub get {
156  my($self,$bp,$offset) = @_;
157  $offset += INT16SZ;	# don't need rdlength
158  ($offset, my $mname) = dn_expand($bp,$offset);
159  ($offset, my $errname) = dn_expand($bp,$offset);
160  return($offset,$mname,$errname);
161}
162
163=item * ($newoff,@dnptrs)=$put->MINFO(\$buffer,$offset,\@dnptrs,
164	$name,$type,$class,$ttl,
165	$mname,$errname);
166
167Append an MINFO record to $buffer.
168
169  where @common = (
170	$name,$type,$class,$ttl);
171
172The method will insert the $rdlength,
173$mname, $errname then
174return the updated pointer to the array of compressed names
175
176The class loader, B<Net::DNS::ToolKit::RR>, inserts the @common elements and
177returns updated @dnptrs. This module knows how to insert its RDATA and
178calculate the $rdlength.
179
180  input:	pointer to buffer,
181		offset (normally end of buffer),
182		pointer to compressed name array,
183		@common RR elements,
184		responsible.mail.box
185		error.mail.box
186
187  output:       offset to next RR,
188		new compressed name pointer array,
189	   or	empty list () on error.
190
191=cut
192
193sub put {
194  return () unless @_;	# always return on error
195  my($self,$bp,$off,$dnp,$mname,$errname) = @_;
196  my $rdlp = $off;	# save pointer to rdlength
197  my ($doff,@dnptrs);	# data start, pointer array
198  return () unless	# check for valid and get
199	($doff = put16($bp,$off,0)) && # offset for names
200	(($off,@dnptrs) = dn_comp($bp,$doff,\$mname,$dnp)) &&
201	(($off,@dnptrs) = dn_comp($bp,$off,\$errname,\@dnptrs));
202
203  # rdlength = new offset - previous offset
204  put16($bp,$rdlp, $off - $doff);
205  return($off,@dnptrs);
206}
207
208=item * (@COMMON,$MNAME,$ERRNAME)
209	= $parse->A(@common,
210	$mname,$errname);
211
212Converts binary/numeric field data into human readable form. The common RR
213elements are supplied by the class loader, B<Net::DNS::ToolKit::RR>.
214For MINFO RR's, this returns $mxdname terminated with '.'
215
216  input:	responsible.mail.box
217		error.mail.box
218  returns:	responsible.mail.box '.' terminated
219		error.mail.box '.' terminated
220
221=back
222
223=cut
224
225sub parse {
226  my($self,$mname,$errname) = @_;
227  return($mname.'.',$errname.'.');
228}
229
230=head1 DEPENDENCIES
231
232	Net::DNS::ToolKit
233	Net::DNS::Codes
234
235=head1 EXPORT
236
237	none
238
239=head1 AUTHOR
240
241Michael Robinton <michael@bizsystems.com>
242
243=head1 COPYRIGHT
244
245    Copyright 2003 - 2011, Michael Robinton <michael@bizsystems.com>
246
247Michael Robinton <michael@bizsystems.com>
248
249All rights reserved.
250
251This program is free software; you can redistribute it and/or modify
252it under the terms of either:
253
254  a) the GNU General Public License as published by the Free
255  Software Foundation; either version 2, or (at your option) any
256  later version, or
257
258  b) the "Artistic License" which comes with this distribution.
259
260This program is distributed in the hope that it will be useful,
261but WITHOUT ANY WARRANTY; without even the implied warranty of
262MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See either
263the GNU General Public License or the Artistic License for more details.
264
265You should have received a copy of the Artistic License with this
266distribution, in the file named "Artistic".  If not, I'll be glad to provide
267one.
268
269You should also have received a copy of the GNU General Public License
270along with this program in the file named "Copying". If not, write to the
271
272        Free Software Foundation, Inc.
273        59 Temple Place, Suite 330
274        Boston, MA  02111-1307, USA
275
276or visit their web page on the internet at:
277
278        http://www.gnu.org/copyleft/gpl.html.
279
280=head1 See also:
281
282Net::DNS::Codes(3), Net::DNS::ToolKit(3)
283
284=cut
285
2861;
287