diff options
Diffstat (limited to 'chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/i686-cygwin/Net/DNS/RR.pm')
-rw-r--r-- | chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/i686-cygwin/Net/DNS/RR.pm | 1022 |
1 files changed, 0 insertions, 1022 deletions
diff --git a/chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/i686-cygwin/Net/DNS/RR.pm b/chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/i686-cygwin/Net/DNS/RR.pm deleted file mode 100644 index c3e2b829f8d..00000000000 --- a/chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/i686-cygwin/Net/DNS/RR.pm +++ /dev/null @@ -1,1022 +0,0 @@ -package Net::DNS::RR; -# -# $Id: RR.pm 705 2008-02-06 21:59:18Z olaf $ -# -use strict; - -BEGIN { - eval { require bytes; } -} - - -use vars qw($VERSION $AUTOLOAD %rrsortfunct ); -use Carp; -use Net::DNS; -use Net::DNS::RR::Unknown; - - - -$VERSION = (qw$LastChangedRevision: 705 $)[1]; - -=head1 NAME - -Net::DNS::RR - DNS Resource Record class - -=head1 SYNOPSIS - -C<use Net::DNS::RR> - -=head1 DESCRIPTION - -C<Net::DNS::RR> is the base class for DNS Resource Record (RR) objects. -See also the manual pages for each RR type. - -=head1 METHODS - -B<WARNING!!!> Don't assume the RR objects you receive from a query -are of a particular type -- always check an object's type before calling -any of its methods. If you call an unknown method, you'll get a nasty -warning message and C<Net::DNS::RR> will return C<undef> to the caller. - -=cut -#' Stupid Emacs (I Don't even USE emacs!) ' - -# %RR needs to be available within the scope of the BEGIN block. -# $RR_REGEX is a global just to be on the safe side. -# %_LOADED is used internally for autoloading the RR subclasses. -use vars qw(%RR %_LOADED $RR_REGEX); - -BEGIN { - - %RR = map { $_ => 1 } qw( - A - AAAA - AFSDB - CNAME - CERT - DNAME - EID - HINFO - ISDN - LOC - MB - MG - MINFO - MR - MX - NAPTR - NIMLOC - NS - NSAP - NULL - PTR - PX - RP - RT - SOA - SRV - TKEY - TSIG - TXT - X25 - OPT - SSHFP - SPF - IPSECKEY - ); - - # Only load DNSSEC if available - - eval { - local $SIG{'__DIE__'} = 'DEFAULT'; - require Net::DNS::RR::SIG; - }; - - unless ($@) { - $RR{'SIG'} = 1; - eval { - local $SIG{'__DIE__'} = 'DEFAULT'; - require Net::DNS::RR::NXT; - }; - - unless ($@) { - $RR{'NXT'} = 1; - } else { - die $@; - } - - eval { - local $SIG{'__DIE__'} = 'DEFAULT'; - require Net::DNS::RR::KEY; - }; - - unless ($@) { - $RR{'KEY'} = 1; - } else { - die $@; - } - - eval { - local $SIG{'__DIE__'} = 'DEFAULT'; - require Net::DNS::RR::DS; - }; - - unless ($@) { - $RR{'DS'} = 1; - - } else { - die $@; - } - - eval { - local $SIG{'__DIE__'} = 'DEFAULT'; - require Net::DNS::RR::RRSIG; - }; - - unless ($@) { - $RR{'RRSIG'} = 1; - # If RRSIG is available so should the other DNSSEC types - eval { - local $SIG{'__DIE__'} = 'DEFAULT'; - require Net::DNS::RR::NSEC; - }; - unless ($@) { - $RR{'NSEC'} = 1; - } else { - die $@; - } - eval { - local $SIG{'__DIE__'} = 'DEFAULT'; - require Net::DNS::RR::DNSKEY; - }; - - unless ($@) { - $RR{'DNSKEY'} = 1; - } else { - die $@; - } - } - - eval { - local $SIG{'__DIE__'} = 'DEFAULT'; - require Net::DNS::RR::DLV; - }; - - unless ($@) { - $RR{'DLV'} =1; - } else { - # Die only if we are dealing with a version for which DLV is - # available - die $@ if defined ($Net::DNS::SEC::HAS_DLV) ; - - } - - eval { - local $SIG{'__DIE__'} = 'DEFAULT'; - require Net::DNS::RR::NSEC3; - }; - - unless ($@) { - $RR{'NSEC3'} =1; - } else { - # Die only if we are dealing with a version for which NSEC3 is # available - die $@ if defined ($Net::DNS::SEC::HAS_NSEC3); - } - - - eval { - local $SIG{'__DIE__'} = 'DEFAULT'; - require Net::DNS::RR::NSEC3PARAM; - }; - - unless ($@) { - $RR{'NSEC3PARAM'} =1; - } else { - # Die only if we are dealing with a version for which NSEC3 is - # available - - die $@ if defined($Net::DNS::SEC::SVNVERSION) && $Net::DNS::SEC::SVNVERSION > 619; # In the code since. (for users of the SVN trunk) - } - - - - } -} - -sub build_regex { - my $classes = join('|', keys %Net::DNS::classesbyname, 'CLASS\\d+'); - - # Longest ones go first, so the regex engine will match AAAA before A. - my $types = join('|', sort { length $b <=> length $a } keys %Net::DNS::typesbyname); - - $types .= '|TYPE\\d+'; - - $RR_REGEX = " ^ - \\s* - (\\S+) # name anything non-space will do - \\s* - (\\d+)? - \\s* - ($classes)? - \\s* - ($types)? - \\s* - (.*) - \$"; - -# print STDERR "Regex: $RR_REGEX\n"; -} - - -=head2 new (from string) - - $a = Net::DNS::RR->new("foo.example.com. 86400 A 10.1.2.3"); - $mx = Net::DNS::RR->new("example.com. 7200 MX 10 mailhost.example.com."); - $cname = Net::DNS::RR->new("www.example.com 300 IN CNAME www1.example.com"); - $txt = Net::DNS::RR->new('baz.example.com 3600 HS TXT "text record"'); - -Returns a C<Net::DNS::RR> object of the appropriate type and -initialized from the string passed by the user. The format of the -string is that used in zone files, and is compatible with the string -returned by C<< Net::DNS::RR->string >>. - -The name and RR type are required; all other information is optional. -If omitted, the TTL defaults to 0 and the RR class defaults to IN. -Omitting the optional fields is useful for creating the empty RDATA -sections required for certain dynamic update operations. See the -C<Net::DNS::Update> manual page for additional examples. - -All names must be fully qualified. The trailing dot (.) is optional. - -=head2 new (from hash) - - $rr = Net::DNS::RR->new( - name => "foo.example.com", - ttl => 86400, - class => "IN", - type => "A", - address => "10.1.2.3", - ); - - $rr = Net::DNS::RR->new( - name => "foo.example.com", - type => "A", - ); - -Returns an RR object of the appropriate type, or a C<Net::DNS::RR> -object if the type isn't implemented. See the manual pages for -each RR type to see what fields the type requires. - -The C<Name> and C<Type> fields are required; all others are optional. -If omitted, C<TTL> defaults to 0 and C<Class> defaults to IN. Omitting -the optional fields is useful for creating the empty RDATA sections -required for certain dynamic update operations. - -The fields are case-insensitive, but starting each with uppercase -is recommended. - -=cut - -#' Stupid Emacs - - -sub new { - return new_from_string(@_) if @_ == 2; - return new_from_string(@_) if @_ == 3; - - return new_from_hash(@_); -} - - -sub new_from_data { - my $class = shift; - my ($name, $rrtype, $rrclass, $ttl, $rdlength, $data, $offset) = @_; - - my $self = { name => $name, - type => $rrtype, - class => $rrclass, - ttl => $ttl, - rdlength => $rdlength, - rdata => substr($$data, $offset, $rdlength) - }; - - if ($RR{$rrtype}) { - my $subclass = $class->_get_subclass($rrtype); - return $subclass->new($self, $data, $offset); - } else { - return Net::DNS::RR::Unknown->new($self, $data, $offset); - } - -} - -sub new_from_string { - my ($class, $rrstring, $update_type) = @_; - - build_regex() unless $RR_REGEX; - - # strip out comments - # Test for non escaped ";" by means of the look-behind assertion - # (the backslash is escaped) - $rrstring =~ s/(?<!\\);.*//og; - - ($rrstring =~ m/$RR_REGEX/xso) || - confess qq|qInternal Error: "$rrstring" did not match RR pat.\nPlease report this to the author!\n|; - - my $name = $1; - my $ttl = $2 || 0; - my $rrclass = $3 || ''; - - - my $rrtype = $4 || ''; - my $rdata = $5 || ''; - - $rdata =~ s/\s+$//o if $rdata; - $name =~ s/\.$//o if $name; - - - - # RFC3597 tweaks - # This converts to known class and type if specified as TYPE### - $rrtype = Net::DNS::typesbyval(Net::DNS::typesbyname($rrtype)) if $rrtype =~ m/^TYPE\d+/o; - $rrclass = Net::DNS::classesbyval(Net::DNS::classesbyname($rrclass)) if $rrclass =~ m/^CLASS\d+/o; - - - if (!$rrtype && $rrclass && $rrclass eq 'ANY') { - $rrtype = 'ANY'; - $rrclass = 'IN'; - } elsif (!$rrclass) { - $rrclass = 'IN'; - } - - $rrtype ||= 'ANY'; - - - if ($update_type) { - $update_type = lc $update_type; - - if ($update_type eq 'yxrrset') { - $ttl = 0; - $rrclass = 'ANY' unless $rdata; - } elsif ($update_type eq 'nxrrset') { - $ttl = 0; - $rrclass = 'NONE'; - $rdata = ''; - } elsif ($update_type eq 'yxdomain') { - $ttl = 0; - $rrclass = 'ANY'; - $rrtype = 'ANY'; - $rdata = ''; - } elsif ($update_type eq 'nxdomain') { - $ttl = 0; - $rrclass = 'NONE'; - $rrtype = 'ANY'; - $rdata = ''; - } elsif ($update_type =~ /^(rr_)?add$/o) { - $ttl = 86400 unless $ttl; - } elsif ($update_type =~ /^(rr_)?del(ete)?$/o) { - $ttl = 0; - $rrclass = $rdata ? 'NONE' : 'ANY'; - } - } - - # We used to check if $rrtype was defined at this point. However, - # we just defaulted it to ANY earlier.... - - my $self = { - 'name' => $name, - 'type' => $rrtype, - 'class' => $rrclass, - 'ttl' => $ttl, - 'rdlength' => 0, - 'rdata' => '', - }; - - if ($RR{$rrtype} && $rdata !~ m/^\s*\\#/o ) { - my $subclass = $class->_get_subclass($rrtype); - return $subclass->new_from_string($self, $rdata); - } elsif ($RR{$rrtype}) { # A RR type known to Net::DNS starting with \# - $rdata =~ m/\\\#\s+(\d+)\s+(.*)$/o; - - my $rdlength = $1; - my $hexdump = $2; - $hexdump =~ s/\s*//og; - - die "$rdata is inconsistent; length does not match content" - if length($hexdump) != $rdlength*2; - - $rdata = pack('H*', $hexdump); - - return Net::DNS::RR->new_from_data( - $name, - $rrtype, - $rrclass, - $ttl, - $rdlength, - \$rdata, - length($rdata) - $rdlength - ); - } elsif ($rdata=~/\s*\\\#\s+\d+\s+/o) { - #We are now dealing with the truly unknown. - die 'Expected RFC3597 representation of RDATA' - unless $rdata =~ m/\\\#\s+(\d+)\s+(.*)$/o; - - my $rdlength = $1; - my $hexdump = $2; - $hexdump =~ s/\s*//og; - - die "$rdata is inconsistent; length does not match content" - if length($hexdump) != $rdlength*2; - - $rdata = pack('H*', $hexdump); - - return Net::DNS::RR->new_from_data( - $name, - $rrtype, - $rrclass, - $ttl, - $rdlength, - \$rdata, - length($rdata) - $rdlength - ); - } else { - #God knows how to handle these... bless them in the RR class. - bless $self, $class; - return $self - } - -} - -sub new_from_hash { - my $class = shift; - my %keyval = @_; - my $self = {}; - - while ( my ($key, $val) = each %keyval ) { - ( $self->{lc $key} = $val ) =~ s/\.+$// if defined $val; - } - - croak('RR name not specified') unless defined $self->{name}; - croak('RR type not specified') unless defined $self->{type}; - - $self->{'ttl'} ||= 0; - $self->{'class'} ||= 'IN'; - - $self->{'rdlength'} = length $self->{'rdata'} - if $self->{'rdata'}; - - if ($RR{$self->{'type'}}) { - my $subclass = $class->_get_subclass($self->{'type'}); - - if (uc $self->{'type'} ne 'OPT') { - bless $self, $subclass; - - return $self; - } else { - # Special processing of OPT. Since TTL and CLASS are - # set by other variables. See Net::DNS::RR::OPT - # documentation - return $subclass->new_from_hash($self); - } - } elsif ($self->{'type'} =~ /TYPE\d+/o) { - bless $self, 'Net::DNS::RR::Unknown'; - return $self; - } else { - bless $self, $class; - return $self; - } -} - - -=head2 parse - - ($rrobj, $offset) = Net::DNS::RR->parse(\$data, $offset); - -Parses a DNS resource record at the specified location within a DNS packet. -The first argument is a reference to the packet data. -The second argument is the offset within the packet where the resource record begins. - -Returns a Net::DNS::RR object and the offset of the next location in the packet. - -Parsing is aborted if the object could not be created (e.g., corrupt or insufficient data). - -=cut - -use constant PACKED_LENGTH => length pack 'n2 N n', (0)x4; - -sub parse { - my ($objclass, $data, $offset) = @_; - - my ($name, $index) = Net::DNS::Packet::dn_expand($data, $offset); - die 'Exception: corrupt or incomplete data' unless $index; - - my $rdindex = $index + PACKED_LENGTH; - die 'Exception: incomplete data' if length $$data < $rdindex; - my ($type, $class, $ttl, $rdlength) = unpack("\@$index n2 N n", $$data); - - my $next = $rdindex + $rdlength; - die 'Exception: incomplete data' if length $$data < $next; - - $type = Net::DNS::typesbyval($type) || $type; - - # Special case for OPT RR where CLASS should be - # interpreted as 16 bit unsigned (RFC2671, 4.3) - if ($type ne 'OPT') { - $class = Net::DNS::classesbyval($class) || $class; - } - # else just retain numerical value - - my $self = $objclass->new_from_data($name, $type, $class, $ttl, $rdlength, $data, $rdindex); - die 'Exception: corrupt or incomplete RR subtype data' unless defined $self; - - return wantarray ? ($self, $next) : $self; -} - - -# -# Some people have reported that Net::DNS dies because AUTOLOAD picks up -# calls to DESTROY. -# -sub DESTROY {} - -=head2 print - - $rr->print; - -Prints the record to the standard output. Calls the -B<string> method to get the RR's string representation. - -=cut -#' someone said that emacs gets screwy here. Who am I to claim otherwise... - -sub print { print &string, "\n"; } - -=head2 string - - print $rr->string, "\n"; - -Returns a string representation of the RR. Calls the -B<rdatastr> method to get the RR-specific data. - -=cut - -sub string { - my $self = shift; - my $data = $self->rdatastr || '; no data'; - - join "\t", "$self->{name}.", $self->{ttl}, $self->{class}, $self->{type}, $data; -} - -=head2 rdatastr - - $s = $rr->rdatastr; - -Returns a string containing RR-specific data. Subclasses will need -to implement this method. - -=cut - -sub rdatastr { - my $self = shift; - return exists $self->{'rdlength'} - ? "; rdlength = $self->{'rdlength'}" - : ''; -} - -=head2 name - - $name = $rr->name; - -Returns the record's domain name. - -=head2 type - - $type = $rr->type; - -Returns the record's type. - -=head2 class - - $class = $rr->class; - -Returns the record's class. - -=cut - -# Used to AUTOLOAD this, but apparently some versions of Perl (specifically -# 5.003_07, included with some Linux distributions) would return the -# class the object was blessed into, instead of the RR's class. - -sub class { - my $self = shift; - - if (@_) { - $self->{'class'} = shift; - } elsif (!exists $self->{'class'}) { - Carp::carp('class: no such method'); - return undef; - } - return $self->{'class'}; -} - - -=head2 ttl - - $ttl = $rr->ttl; - -Returns the record's time-to-live (TTL). - -=head2 rdlength - - $rdlength = $rr->rdlength; - -Returns the length of the record's data section. - -=head2 rdata - - $rdata = $rr->rdata - -Returns the record's data section as binary data. - -=cut -#' -sub rdata { - my $self = shift; - my $retval = undef; - - if (@_ == 2) { - my ($packet, $offset) = @_; - $retval = $self->rr_rdata($packet, $offset); - } - elsif (exists $self->{'rdata'}) { - $retval = $self->{'rdata'}; - } - - return $retval; -} - -sub rr_rdata { - my $self = shift; - return exists $self->{'rdata'} ? $self->{'rdata'} : ''; -} - -#------------------------------------------------------------------------------ -# sub data -# -# This method is called by Net::DNS::Packet->data to get the binary -# representation of an RR. -#------------------------------------------------------------------------------ - -sub data { - my ($self, $packet, $offset) = @_; - my $data; - - - # Don't compress TSIG or TKEY names and don't mess with EDNS0 packets - if (uc($self->{'type'}) eq 'TSIG' || uc($self->{'type'}) eq 'TKEY') { - my $tmp_packet = Net::DNS::Packet->new(); - $data = $tmp_packet->dn_comp($self->{'name'}, 0); - return undef unless defined $data; - } elsif (uc($self->{'type'}) eq 'OPT') { - my $tmp_packet = Net::DNS::Packet->new(); - $data = $tmp_packet->dn_comp('', 0); - } else { - $data = $packet->dn_comp($self->{'name'}, $offset); - return undef unless defined $data; - } - - my $qtype = uc($self->{'type'}); - my $qtype_val = ($qtype =~ m/^\d+$/o) ? $qtype : Net::DNS::typesbyname($qtype); - $qtype_val = 0 if !defined($qtype_val); - - my $qclass = uc($self->{'class'}); - my $qclass_val = ($qclass =~ m/^\d+$/o) ? $qclass : Net::DNS::classesbyname($qclass); - $qclass_val = 0 if !defined($qclass_val); - $data .= pack('n', $qtype_val); - - # If the type is OPT then class will need to contain a decimal number - # containing the UDP payload size. (RFC2671 section 4.3) - if (uc($self->{'type'}) ne 'OPT') { - $data .= pack('n', $qclass_val); - } else { - $data .= pack('n', $self->{'class'}); - } - - $data .= pack('N', $self->{'ttl'}); - - $offset += length($data) + &Net::DNS::INT16SZ; # allow for rdlength - - my $rdata = $self->rdata($packet, $offset); - - $data .= pack('n', length $rdata); - $data.=$rdata; - - return $data; -} - - - - - -#------------------------------------------------------------------------------ -# This method is called by SIG objects verify method. -# It is almost the same as data but needed to get an representation of the -# packets in wire format withoud domain name compression. -# It is essential to DNSSEC RFC 2535 section 8 -#------------------------------------------------------------------------------ - -sub _canonicaldata { - my $self = shift; - my $data=''; - { - my $name=$self->{'name'}; - my @dname=Net::DNS::name2labels($name); - for (my $i=0;$i<@dname;$i++){ - $data .= pack ('C',length $dname[$i] ); - $data .= lc($dname[$i] ); - } - $data .= pack ('C','0'); - } - $data .= pack('n', Net::DNS::typesbyname(uc($self->{'type'}))); - $data .= pack('n', Net::DNS::classesbyname(uc($self->{'class'}))); - $data .= pack('N', $self->{'ttl'}); - - - my $rdata = $self->_canonicalRdata; - - $data .= pack('n', length $rdata); - $data .= $rdata; - return $data; - - -} - -# These are methods that are used in the DNSSEC context... Some RR -# have domain names in them. Verification works only on RRs with -# uncompressed domain names. (Canonical format as in sect 8 of -# RFC2535) _canonicalRdata is overwritten in those RR objects that -# have domain names in the RDATA and _name2wire is used to convert a -# domain name to "wire format" - - -sub _canonicalRdata { - my $self=shift; - my $packet=Net::DNS::Packet->new(); - my $rdata = $self->rr_rdata($packet,0); - return $rdata; -} - - - - - -sub _name2wire { - my ($self, $name) = @_; - - my $rdata=""; - my $compname = ""; - my @dname = Net::DNS::name2labels($name); - - - for (@dname) { - $rdata .= pack('C', length $_); - $rdata .= $_ ; - } - - $rdata .= pack('C', '0'); - return $rdata; -} - - - - - -sub AUTOLOAD { - my ($self) = @_; # If we do shift here, it will mess up the goto below. - my ($name) = $AUTOLOAD =~ m/^.*::(.*)$/o; - if ($name =~ /set_rrsort_func/){ - return Net::DNS::RR::set_rrsort_func(@_); - } - if ($name =~ /get_rrsort_func/){ - return Net::DNS::RR::get_rrsort_func(@_); - } - # XXX -- We should test that we do in fact carp on unknown methods. - unless (exists $self->{$name}) { - my $rr_string = $self->string; - Carp::carp(<<"AMEN"); - -*** -*** WARNING!!! The program has attempted to call the method -*** "$name" for the following RR object: -*** -*** $rr_string -*** -*** This object does not have a method "$name". THIS IS A BUG -*** IN THE CALLING SOFTWARE, which has incorrectly assumed that -*** the object would be of a particular type. The calling -*** software should check the type of each RR object before -*** calling any of its methods. -*** -*** Net::DNS has returned undef to the caller. -*** - -AMEN -return; - } - - no strict q/refs/; - - # Build a method in the class. - *{$AUTOLOAD} = sub { - my ($self, $new_val) = @_; - - if (defined $new_val) { - $self->{$name} = $new_val; - } - - return $self->{$name}; - }; - - # And jump over to it. - goto &{$AUTOLOAD}; -} - - - -# -# Net::DNS::RR->_get_subclass($type) -# -# Return a subclass, after loading a subclass (if needed) -# -sub _get_subclass { - my ($class, $type) = @_; - - return unless $type and $RR{$type}; - - my $subclass = join('::', $class, $type); - - unless ($_LOADED{$subclass}) { - eval "require $subclass"; - die $@ if $@; - $_LOADED{$subclass}++; - } - - return $subclass; -} - - - - -=head1 Sorting of RR arrays - -As of version 0.55 there is functionality to help you sort RR -arrays. The sorting is done by Net::DNS::rrsort(), see the -L<Net::DNS> documentation. This package provides class methods to set -the sorting functions used for a particular RR based on a particular -attribute. - - -=head2 set_rrsort_func - -Net::DNS::RR::SRV->set_rrsort_func("priority", - sub { - my ($a,$b)=($Net::DNS::a,$Net::DNS::b); - $a->priority <=> $b->priority - || - $b->weight <=> $a->weight - } - -Net::DNS::RR::SRV->set_rrsort_func("default_sort", - sub { - my ($a,$b)=($Net::DNS::a,$Net::DNS::b); - $a->priority <=> $b->priority - || - $b->weight <=> $a->weight - } - -set_rrsort_func needs to be called as a class method. The first -argument is the attribute name on which the sorting will need to take -place. If you specify "default_sort" than that is the sort algorithm -that will be used in the case that rrsort() is called without an RR -attribute as argument. - -The second argument is a reference to a function that uses the -variables $a and $b global to the C<from Net::DNS>(!!)package for the -sorting. During the sorting $a and $b will contain references to -objects from the class you called the set_prop_sort from. In other -words, you can rest assured that the above sorting function will only -get Net::DNS::RR::SRV objects. - -The above example is the sorting function that actually is implemented in -SRV. - -=cut - - - - -sub set_rrsort_func{ - my $class=shift; - my $attribute=shift; - my $funct=shift; -# print "Using ".__PACKAGE__."set_rrsort: $class\n"; - my ($type) = $class =~ m/^.*::(.*)$/o; - $Net::DNS::RR::rrsortfunct{$type}{$attribute}=$funct; -} - -sub get_rrsort_func { - my $class=shift; - my $attribute=shift; #can be undefined. - my $sortsub; - my ($type) = $class =~ m/^.*::(.*)$/o; - - -# print "Using ".__PACKAGE__." get_rrsort: $class ($type,$attribute)\n"; -# use Data::Dumper; -# print Dumper %Net::DNS::rrsortfunct; - - if (defined($attribute) && - exists($Net::DNS::RR::rrsortfunct{$type}) && - exists($Net::DNS::RR::rrsortfunct{$type}{$attribute}) - ){ - # The default overwritten by the class variable in Net::DNS - return $Net::DNS::RR::rrsortfunct{$type}{$attribute}; - }elsif( - ! defined($attribute) && - exists($Net::DNS::RR::rrsortfunct{$type}) && - exists($Net::DNS::RR::rrsortfunct{$type}{'default_sort'}) - ){ - # The default overwritten by the class variable in Net::DNS - return $Net::DNS::RR::rrsortfunct{$type}{'default_sort'}; - } - elsif( defined($attribute) ){ - - return sub{ - my ($a,$b)=($Net::DNS::a,$Net::DNS::b); - ( exists($a->{$attribute}) && - $a->{$attribute} <=> $b->{$attribute}) - || - $a->_canonicaldata() cmp $b->_canonicaldata() - }; - }else{ - return sub{ - my ($a,$b)=($Net::DNS::a,$Net::DNS::b); - $a->_canonicaldata() cmp $b->_canonicaldata() - }; - } - - return $sortsub; -} - - - - - - - -sub STORABLE_freeze { - my ($self, $cloning) = @_; - - return if $cloning; - - return ('', {%$self}); -} - -sub STORABLE_thaw { - my ($self, $cloning, undef, $data) = @_; - - %{$self} = %{$data}; - - __PACKAGE__->_get_subclass($self->{'type'}); - - return $self; -} - -=head1 BUGS - -This version of C<Net::DNS::RR> does little sanity checking on user-created -RR objects. - -=head1 COPYRIGHT - -Copyright (c) 1997-2002 Michael Fuhr. - -Portions Copyright (c) 2002-2004 Chris Reinhardt. - -Portions Copyright (c) 2005-2007 Olaf Kolkman - -Portions Copyright (c) 2007 Dick Franks - -All rights reserved. This program is free software; you may redistribute -it and/or modify it under the same terms as Perl itself. - -EDNS0 extensions by Olaf Kolkman. - -=head1 SEE ALSO - -L<perl(1)>, L<Net::DNS>, L<Net::DNS::Resolver>, L<Net::DNS::Packet>, -L<Net::DNS::Update>, L<Net::DNS::Header>, L<Net::DNS::Question>, -RFC 1035 Section 4.1.3 - -=cut - -1; |