diff options
Diffstat (limited to 'chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/i686-cygwin/Net/DNS/Packet.pm')
-rw-r--r-- | chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/i686-cygwin/Net/DNS/Packet.pm | 749 |
1 files changed, 0 insertions, 749 deletions
diff --git a/chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/i686-cygwin/Net/DNS/Packet.pm b/chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/i686-cygwin/Net/DNS/Packet.pm deleted file mode 100644 index 9aabcac01e4..00000000000 --- a/chromium/third_party/cygwin/lib/perl5/vendor_perl/5.10/i686-cygwin/Net/DNS/Packet.pm +++ /dev/null @@ -1,749 +0,0 @@ -package Net::DNS::Packet; -# -# $Id: Packet.pm 704 2008-02-06 21:30:59Z olaf $ -# -use strict; - -BEGIN { - eval { require bytes; } -} - -use vars qw(@ISA @EXPORT_OK $VERSION $AUTOLOAD); - -use Carp; -use Net::DNS ; -use Net::DNS::Question; -use Net::DNS::RR; - - - -require Exporter; -@ISA = qw(Exporter); -@EXPORT_OK = qw(dn_expand); - - -$VERSION = (qw$LastChangedRevision: 704 $)[1]; - - - -=head1 NAME - -Net::DNS::Packet - DNS packet object class - -=head1 SYNOPSIS - -C<use Net::DNS::Packet;> - -=head1 DESCRIPTION - -A C<Net::DNS::Packet> object represents a DNS packet. - -=head1 METHODS - -=head2 new - - $packet = Net::DNS::Packet->new("example.com"); - $packet = Net::DNS::Packet->new("example.com", "MX", "IN"); - - $packet = Net::DNS::Packet->new(\$data); - $packet = Net::DNS::Packet->new(\$data, 1); # set debugging - - ($packet, $err) = Net::DNS::Packet->new(\$data); - - $packet = Net::DNS::Packet->new(); - -If passed a domain, type, and class, C<new> creates a packet -object appropriate for making a DNS query for the requested -information. The type and class can be omitted; they default -to A and IN. - -If passed a reference to a scalar containing DNS packet data, -C<new> creates a packet object from that data. A second argument -can be passed to turn on debugging output for packet parsing. - -If called in array context, returns a packet object and an -error string. The error string will only be defined if the -packet object is undefined (i.e., couldn't be created). - -Returns B<undef> if unable to create a packet object (e.g., if -the packet data is truncated). - -If called with an empty argument list, C<new> creates an empty packet. - -=cut - -sub new { - my $class = shift; - my ($data) = @_; - return $class->parse(@_) if ref $data; - - my %self = ( header => Net::DNS::Header->new, - question => [], - answer => [], - authority => [], - additional => [] ); - - push @{$self{question}}, Net::DNS::Question->new(@_) if @_; - - bless \%self, $class; -} - - - -sub parse { - my $class = shift; - my $data = shift; - my $debug = shift || 0; - - my %self = ( question => [], - answer => [], - authority => [], - additional => [], - answersize => length $$data, - buffer => $data ); - - my $self = eval { - # Parse header section - my ($header, $offset) = Net::DNS::Header->parse($data); - $self{header} = $header; - - # Parse question/zone section - for ( 1 .. $header->qdcount ) { - my $qd; - ($qd, $offset) = Net::DNS::Question->parse($data, $offset); - push(@{$self{question}}, $qd); - } - - # Retain offset for on-demand parse of remaining data - $self{offset} = $offset; - - bless \%self, $class; - }; - - ($self || die $@)->print if $debug; - - return wantarray ? ($self, $@) : $self; -} - - - -=head2 data - - $data = $packet->data; - -Returns the packet data in binary format, suitable for sending to -a nameserver. - -=cut - -sub data { - my $self = shift; - my $data = ''; - my $header = $self->{header}; - - # Default question for empty packet - $self->push('question', Net::DNS::Question->new('','ANY','ANY')) - unless @{$self->{question}}; - - #---------------------------------------------------------------------- - # Set record counts in packet header - #---------------------------------------------------------------------- - $header->qdcount( scalar @{$self->{question}} ); - $header->ancount( scalar @{$self->{answer}} ); - $header->nscount( scalar @{$self->{authority}} ); - $header->arcount( scalar @{$self->{additional}} ); - - #---------------------------------------------------------------------- - # Get the data for each section in the packet - #---------------------------------------------------------------------- - $self->{compnames} = {}; - foreach my $component ( $header, - @{$self->{question}}, - @{$self->{answer}}, - @{$self->{authority}}, - @{$self->{additional}} ) { - $data .= $component->data($self, length $data); - } - - return $data; -} - - -=head2 header - - $header = $packet->header; - -Returns a C<Net::DNS::Header> object representing the header section -of the packet. - -=cut - -sub header { - return shift->{header}; -} - -=head2 question, zone - - @question = $packet->question; - -Returns a list of C<Net::DNS::Question> objects representing the -question section of the packet. - -In dynamic update packets, this section is known as C<zone> and -specifies the zone to be updated. - -=cut - -sub question { - return @{shift->{question}}; -} - -sub zone { &question } - -=head2 answer, pre, prerequisite - - @answer = $packet->answer; - -Returns a list of C<Net::DNS::RR> objects representing the answer -section of the packet. - -In dynamic update packets, this section is known as C<pre> or -C<prerequisite> and specifies the RRs or RRsets which must or -must not preexist. - -=cut - -sub answer { - my @rr = eval { &_answer }; - carp "$@ caught" if $@; - return @rr; -} - -sub _answer { - my ($self) = @_; - - my @rr = @{$self->{answer}}; - return @rr if @rr; # return if already parsed - - my $data = $self->{buffer}; # parse answer data - my $offset = $self->{offset} || return; - undef $self->{offset}; - my $ancount = $self->{header}->ancount; - my $rr; - while ( $ancount-- ) { - ($rr, $offset) = Net::DNS::RR->parse($data, $offset); - push(@rr, $rr); - } - $self->{offset} = $offset; # index next section - @{$self->{answer}} = @rr; -} - -sub pre { &answer } -sub prerequisite { &answer } - -=head2 authority, update - - @authority = $packet->authority; - -Returns a list of C<Net::DNS::RR> objects representing the authority -section of the packet. - -In dynamic update packets, this section is known as C<update> and -specifies the RRs or RRsets to be added or deleted. - -=cut - -sub authority { - my @rr = eval { &_authority }; - carp "$@ caught" if $@; - return @rr; -} - -sub _authority { - my ($self) = @_; - - my @rr = @{$self->{authority}}; - return @rr if @rr; # return if already parsed - - &_answer unless @{$self->{answer}}; # parse answer data - - my $data = $self->{buffer}; # parse authority data - my $offset = $self->{offset} || return; - undef $self->{offset}; - my $nscount = $self->{header}->nscount; - my $rr; - while ( $nscount-- ) { - ($rr, $offset) = Net::DNS::RR->parse($data, $offset); - push(@rr, $rr); - } - $self->{offset} = $offset; # index next section - @{$self->{authority}} = @rr; -} - -sub update { &authority } - -=head2 additional - - @additional = $packet->additional; - -Returns a list of C<Net::DNS::RR> objects representing the additional -section of the packet. - -=cut - -sub additional { - my @rr = eval { &_additional }; - carp "$@ caught" if $@; - return @rr; -} - -sub _additional { - my ($self) = @_; - - my @rr = @{$self->{additional}}; - return @rr if @rr; # return if already parsed - - &_authority unless @{$self->{authority}}; # parse authority data - - my $data = $self->{buffer}; # parse additional data - undef $self->{buffer}; # discard raw data after use - my $offset = $self->{offset} || return; - undef $self->{offset}; - my $arcount = $self->{header}->arcount; - my $rr; - while ( $arcount-- ) { - ($rr, $offset) = Net::DNS::RR->parse($data, $offset); - push(@rr, $rr); - } - @{$self->{additional}} = @rr; -} - - -=head2 print - - $packet->print; - -Prints the packet data on the standard output in an ASCII format -similar to that used in DNS zone files. - -=cut - -sub print { print &string; } - -=head2 string - - print $packet->string; - -Returns a string representation of the packet. - -=cut - -sub string { - my $self = shift; - - my $header = $self->{header}; - my $update = $header->opcode eq 'UPDATE'; - - my $server = $self->{answerfrom}; - my $string = $server ? ";; Answer received from $server ($self->{answersize} bytes)\n" : ""; - - $string .= ";; HEADER SECTION\n".$header->string; - - my $question = $update ? 'ZONE' : 'QUESTION'; - my @question = map{$_->string} $self->question; - my $qdcount = @question; - my $qds = $qdcount != 1 ? 's' : ''; - $string .= join "\n;; ", "\n;; $question SECTION ($qdcount record$qds)", @question; - - my $answer = $update ? 'PREREQUISITE' : 'ANSWER'; - my @answer = map{$_->string} $self->answer; - my $ancount = @answer; - my $ans = $ancount != 1 ? 's' : ''; - $string .= join "\n", "\n\n;; $answer SECTION ($ancount record$ans)", @answer; - - my $authority = $update ? 'UPDATE' : 'AUTHORITY'; - my @authority = map{$_->string} $self->authority; - my $nscount = @authority; - my $nss = $nscount != 1 ? 's' : ''; - $string .= join "\n", "\n\n;; $authority SECTION ($nscount record$nss)", @authority; - - my @additional = map{$_->string} $self->additional; - my $arcount = @additional; - my $ars = $arcount != 1 ? 's' : ''; - $string .= join "\n", "\n\n;; ADDITIONAL SECTION ($arcount record$ars)", @additional; - - return $string."\n\n"; -} - -=head2 answerfrom - - print "packet received from ", $packet->answerfrom, "\n"; - -Returns the IP address from which we received this packet. User-created -packets will return undef for this method. - -=cut - -sub answerfrom { - my $self = shift; - - return $self->{answerfrom} = shift if @_; - - return $self->{answerfrom}; -} - -=head2 answersize - - print "packet size: ", $packet->answersize, " bytes\n"; - -Returns the size of the packet in bytes as it was received from a -nameserver. User-created packets will return undef for this method -(use C<< length $packet->data >> instead). - -=cut - -sub answersize { - return shift->{answersize}; -} - -=head2 push - - $ancount = $packet->push(pre => $rr); - $nscount = $packet->push(update => $rr); - $arcount = $packet->push(additional => $rr); - - $nscount = $packet->push(update => $rr1, $rr2, $rr3); - $nscount = $packet->push(update => @rr); - -Adds RRs to the specified section of the packet. - -Returns the number of resource records in the specified section. - - -=cut - -sub push { - my $self = shift; - my $section = lc shift || ''; - my @rr = map{ref $_ ? $_ : ()} @_; - - my $hdr = $self->{header}; - for ( $section ) { - return $hdr->qdcount(push(@{$self->{question}}, @rr)) if /^question/; - - if ( $hdr->opcode eq 'UPDATE' ) { - my ($zone) = $self->zone; - my $zclass = $zone->zclass; - foreach ( @rr ) { - $_->class($zclass) unless $_->class =~ /ANY|NONE/; - } - } - - return $hdr->ancount(push(@{$self->{answer}}, @rr)) if /^ans|^pre/; - return $hdr->nscount(push(@{$self->{authority}}, @rr)) if /^auth|^upd/; - return $hdr->adcount(push(@{$self->{additional}}, @rr)) if /^add/; - } - - carp qq(invalid section "$section"); - return undef; # undefined record count -} - - -=head2 unique_push - - $ancount = $packet->unique_push(pre => $rr); - $nscount = $packet->unique_push(update => $rr); - $arcount = $packet->unique_push(additional => $rr); - - $nscount = $packet->unique_push(update => $rr1, $rr2, $rr3); - $nscount = $packet->unique_push(update => @rr); - -Adds RRs to the specified section of the packet provided that -the RRs do not already exist in the packet. - -Returns the number of resource records in the specified section. - -=cut - -sub unique_push { - my $self = shift; - my $section = shift; - my @rr = map{ref $_ ? $_ : ()} @_; - - my @unique = map{$self->{seen}->{ (lc $_->name) . $_->class . $_->type . $_->rdatastr }++ ? () : $_} @rr; - - return $self->push($section, @unique); -} - -=head2 safe_push - -A deprecated name for C<unique_push()>. - -=cut - -sub safe_push { - carp('safe_push() is deprecated, use unique_push() instead,'); - &unique_push; -} - - -=head2 pop - - my $rr = $packet->pop("pre"); - my $rr = $packet->pop("update"); - my $rr = $packet->pop("additional"); - my $rr = $packet->pop("question"); - -Removes RRs from the specified section of the packet. - -=cut - -sub pop { - my $self = shift; - my $section = lc shift || ''; - - for ( $section ) { - return pop(@{$self->{answer}}) if /^ans|^pre/; - return pop(@{$self->{question}}) if /^question/; - - $self->additional if $self->{buffer}; # parse remaining data - - return pop(@{$self->{authority}}) if /^auth|^upd/; - return pop(@{$self->{additional}}) if /^add/; - } - - carp qq(invalid section "$section"); - return undef; -} - - -=head2 dn_comp - - $compname = $packet->dn_comp("foo.example.com", $offset); - -Returns a domain name compressed for a particular packet object, to -be stored beginning at the given offset within the packet data. The -name will be added to a running list of compressed domain names for -future use. - -=cut - -sub dn_comp { - my ($self, $name, $offset) = @_; - # The Exporter module does not seem to catch this baby... - my @names=Net::DNS::name2labels($name); - my $namehash = $self->{compnames}; - my $compname=''; - - while (@names) { - my $dname = join('.', @names); - - if ( my $pointer = $namehash->{$dname} ) { - $compname .= pack('n', 0xc000 | $pointer); - last; - } - $namehash->{$dname} = $offset; - - my $label = shift @names; - my $length = length $label || next; # skip if null - if ( $length > 63 ) { - $length = 63; - $label = substr($label, 0, $length); - carp "\n$label...\ntruncated to $length octets (RFC1035 2.3.1)"; - } - $compname .= pack('C a*', $length, $label); - $offset += $length + 1; - } - - $compname .= pack('C', 0) unless @names; - - return $compname; -} - -=head2 dn_expand - - use Net::DNS::Packet qw(dn_expand); - ($name, $nextoffset) = dn_expand(\$data, $offset); - - ($name, $nextoffset) = Net::DNS::Packet::dn_expand(\$data, $offset); - -Expands the domain name stored at a particular location in a DNS -packet. The first argument is a reference to a scalar containing -the packet data. The second argument is the offset within the -packet where the (possibly compressed) domain name is stored. - -Returns the domain name and the offset of the next location in the -packet. - -Returns B<(undef)> if the domain name couldn't be expanded. - -=cut -# ' - -# This is very hot code, so we try to keep things fast. This makes for -# odd style sometimes. - -sub dn_expand { -#FYI my ($packet, $offset) = @_; - return dn_expand_XS(@_) if $Net::DNS::HAVE_XS; -# warn "USING PURE PERL dn_expand()\n"; - return dn_expand_PP(@_, {} ); # $packet, $offset, anonymous hash -} - -sub dn_expand_PP { - my ($packet, $offset, $visited) = @_; - my $packetlen = length $$packet; - my $name = ''; - - while ( $offset < $packetlen ) { - unless ( my $length = unpack("\@$offset C", $$packet) ) { - $name =~ s/\.$//o; - return ($name, ++$offset); - - } elsif ( ($length & 0xc0) == 0xc0 ) { # pointer - my $point = 0x3fff & unpack("\@$offset n", $$packet); - die 'Exception: unbounded name expansion' if $visited->{$point}++; - - my ($suffix) = dn_expand_PP($packet, $point, $visited); - - return ($name.$suffix, $offset+2) if defined $suffix; - - } else { - my $element = substr($$packet, ++$offset, $length); - $name .= Net::DNS::wire2presentation($element).'.'; - $offset += $length; - } - } - return undef; -} - -=head2 sign_tsig - - $key_name = "tsig-key"; - $key = "awwLOtRfpGE+rRKF2+DEiw=="; - - $update = Net::DNS::Update->new("example.com"); - $update->push("update", rr_add("foo.example.com A 10.1.2.3")); - - $update->sign_tsig($key_name, $key); - - $response = $res->send($update); - -Signs a packet with a TSIG resource record (see RFC 2845). Uses the -following defaults: - - algorithm = HMAC-MD5.SIG-ALG.REG.INT - time_signed = current time - fudge = 300 seconds - -If you wish to customize the TSIG record, you'll have to create it -yourself and call the appropriate Net::DNS::RR::TSIG methods. The -following example creates a TSIG record and sets the fudge to 60 -seconds: - - $key_name = "tsig-key"; - $key = "awwLOtRfpGE+rRKF2+DEiw=="; - - $tsig = Net::DNS::RR->new("$key_name TSIG $key"); - $tsig->fudge(60); - - $query = Net::DNS::Packet->new("www.example.com"); - $query->sign_tsig($tsig); - - $response = $res->send($query); - -You shouldn't modify a packet after signing it; otherwise authentication -will probably fail. - -=cut - -sub sign_tsig { - my $self = shift; - my $tsig = shift || return undef; - - unless ( ref $tsig && ($tsig->type eq "TSIG") ) { - my $key = shift || return undef; - $tsig = Net::DNS::RR->new("$tsig TSIG $key"); - } - - $self->push('additional', $tsig) if $tsig; - return $tsig; -} - - - -=head2 sign_sig0 - -SIG0 support is provided through the Net::DNS::RR::SIG class. This class is not part -of the default Net::DNS distribution but resides in the Net::DNS::SEC distribution. - - $update = Net::DNS::Update->new("example.com"); - $update->push("update", rr_add("foo.example.com A 10.1.2.3")); - $update->sign_sig0("Kexample.com+003+25317.private"); - - -SIG0 support is experimental see Net::DNS::RR::SIG for details. - -The method will call C<Carp::croak()> if Net::DNS::RR::SIG cannot be found. - - -=cut - -sub sign_sig0 { - my $self = shift; - my $arg = shift || return undef; - my $sig0; - - croak('sign_sig0() is only available when Net::DNS::SEC is installed') - unless $Net::DNS::DNSSEC; - - if ( ref $arg ) { - if ( UNIVERSAL::isa($arg,'Net::DNS::RR::SIG') ) { - $sig0 = $arg; - - } elsif ( UNIVERSAL::isa($arg,'Net::DNS::SEC::Private') ) { - $sig0 = Net::DNS::RR::SIG->create('', $arg); - - } elsif ( UNIVERSAL::isa($arg,'Net::DNS::RR::SIG::Private') ) { - carp ref($arg).' is deprecated - use Net::DNS::SEC::Private instead'; - $sig0 = Net::DNS::RR::SIG->create('', $arg); - - } else { - croak 'Incompatible class as argument to sign_sig0: '.ref($arg); - - } - - } else { - $sig0 = Net::DNS::RR::SIG->create('', $arg); - } - - $self->push('additional', $sig0) if $sig0; - return $sig0; -} - - - -=head1 COPYRIGHT - -Copyright (c) 1997-2002 Michael Fuhr. - -Portions Copyright (c) 2002-2004 Chris Reinhardt. - -Portions Copyright (c) 2002-2005 Olaf Kolkman - -Portions Copyright (c) 2007-2008 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. - - - -=head1 SEE ALSO - -L<perl(1)>, L<Net::DNS>, L<Net::DNS::Resolver>, L<Net::DNS::Update>, -L<Net::DNS::Header>, L<Net::DNS::Question>, L<Net::DNS::RR>, -RFC 1035 Section 4.1, RFC 2136 Section 2, RFC 2845 - -=cut - -1; |