diff options
Diffstat (limited to 'contrib/DNS-LDNS/lib/DNS/LDNS/Packet.pm')
-rw-r--r-- | contrib/DNS-LDNS/lib/DNS/LDNS/Packet.pm | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/contrib/DNS-LDNS/lib/DNS/LDNS/Packet.pm b/contrib/DNS-LDNS/lib/DNS/LDNS/Packet.pm new file mode 100644 index 0000000..c8d4ae2 --- /dev/null +++ b/contrib/DNS-LDNS/lib/DNS/LDNS/Packet.pm @@ -0,0 +1,259 @@ +package DNS::LDNS::Packet; + +use 5.008008; +use strict; +use warnings; + +use DNS::LDNS; + +our $VERSION = '0.52'; + +sub new { + my ($class, %args) = @_; + + if ($args{name}) { + return _query_new( + $args{name}, $args{type}, $args{class}, $args{flags}); + } + else { + return _new; + } +} + +sub question { + my $self = shift; + return DNS::LDNS::GC::own($self->_question, $self); +} + +sub set_question { + my ($self, $l) = @_; + DNS::LDNS::GC::disown(my $old = $self->question); + $self->_set_question($l); + return DNS::LDNS::GC::own($l, $self); +} + +sub answer { + my $self = shift; + return DNS::LDNS::GC::own($self->_answer, $self); +} + +sub set_answer { + my ($self, $l) = @_; + DNS::LDNS::GC::disown(my $old = $self->answer); + $self->_set_answer($l); + return DNS::LDNS::GC::own($l, $self); +} + +sub authority { + my $self = shift; + return DNS::LDNS::GC::own($self->_authority, $self); +} + +sub set_authority { + my ($self, $l) = @_; + DNS::LDNS::GC::disown(my $old = $self->authority); + $self->_set_authority($l); + return DNS::LDNS::GC::own($l, $self); +} + +sub additional { + my $self = shift; + return DNS::LDNS::GC::own($self->_additional, $self); +} + +sub set_additional { + my ($self, $l) = @_; + DNS::LDNS::GC::disown(my $old = $self->additional); + $self->_set_additional($l); + return DNS::LDNS::GC::own($l, $self); +} + +sub answerfrom { + my $self = shift; + return DNS::LDNS::GC::own($self->_answerfrom, $self); +} + +sub set_answerfrom { + my ($self, $a) = @_; + DNS::LDNS::GC::disown(my $old = $self->answerfrom); + $self->_set_answerfrom($a); + return DNS::LDNS::GC::own($a, $self); +} + + +sub timestamp { + my $self = shift; + my $t = _timestamp($self); + return wantarray ? @$t : $t; +} + +sub edns_data { + my $self = shift; + return DNS::LDNS::GC::own($self->_edns_data, $self); +} + +sub set_edns_data { + my ($self, $data) = @_; + DNS::LDNS::GC::disown(my $old = $self->edns_data); + $self->_set_edns_data($data); + return DNS::LDNS::GC::own($data, $self); +} + +sub push_rr { + my ($self, $sec, $rr) = @_; + + my $ret = $self->_push_rr($sec, my $copy = $_->clone); + DNS::LDNS::GC::own($copy, $self); + return $ret; +} + +sub safe_push_rr { + my ($self, $sec, $rr) = @_; + + my $ret = $self->_safe_push_rr($sec, my $copy = $_->clone); + if ($ret) { + DNS::LDNS::GC::own($copy, $self); + } + return $ret; +} + +sub tsig { + my $self = shift; + return DNS::LDNS::GC::own($self->_tsig, $self); +} + +sub set_tsig { + my ($self, $rr) = @_; + DNS::LDNS::GC::disown(my $old = $self->tsig); + $self->_set_tsig($rr); + return DNS::LDNS::GC::own($rr, $self); +} + +sub DESTROY { + DNS::LDNS::GC::free($_[0]); +} + +1; +__END__ + +=head1 NAME + +DNS::LDNS::Packet - DNS packet + +=head1 SYNOPSIS + + use DNS::LDNS ':all' + + my pkt = new DNS::LDNS::Packet(name => rdata, type => LDNS_RR_TYPE_..., + class => LDNS_RR_CLASS_..., flags => ...) + my pkt = new DNS::LDNS::Packet + + pkt2 = pkt->clone + + pkt->to_string + + rrlist = pkt->question + pkt->set_question(rrlist) +' + rrlist = pkt->answer + pkt->set_answer(rrlist) + + rrlist = pkt->authority + pkt->set_authority(rrlist) + + rrlist = pkt->additional + pkt->set_additional(rrlist) + + rrlist = pkt->all + rrlist = pkt->all_noquestion + + for (qw/qr aa tc rd cd ra ad/) { + bool = pkt->$_ + pkt->set_$_(bool) + } + + id = pkt->id + pkt->set_id(id) + pkt->set_random_id + + count = pkt->qdcount + count = pkt->ancount + count = pkt->nscount + count = pkt->arcount + + opcode = pkt->opcode + pkt->set_opcode(opcode) + + rcode = pkt->rcode # Response code + pkt->set_rcode(rcode) + + size = pkt->size + + epoch = pkt->querytime + pkt->set_querytime(epoch) + + rdata = pkt->answerfrom + pkt->set_answerfrom(rdata) + + (sec, usec) = pkt->timestamp + pkt->set_timestamp(sec, usec) + + bool = pkt->edns + + size = pkt->edns_udp_size + pkt->set_edns_udp_size(size) + + rcode = pkt->edns_extended_rcode + pkt->set_edns_extended_rcode(rcode) + + v = pkt->edns_version + pkt->set_edns_version(v) + + z = pkt->edns_z + pkt->set_edns_z(z) + + do = pkt->edns_do + pkt->set_edns_do(do) + + rdata = pkt->edns_data + pkt->set_edns_data(rdata) + + pkt->set_flags(flags) + + rrlist = pkt->rr_list_by_name(rdata, section) + rrlist = pkt->rr_list_by_type(type, section) + rrlist = pkt->rr_list_by_name_and_type(rdata, type, section) + + bool = pkt->rr(section, rr) # Check if rr exists + + pkt->push_rr(section, rr) + pkt->safe_push_rr(section, rr) + + count = pkt->section_count(section) + bool = pkt->empty + + rr = pkt->tsig + pkt->set_tsig(rr) + + type = pkt->reply_type + + rrlist = pkt->get_rrsigs_for_name_and_type(rdata, rrtype) + rrlist = pkt->get_rrsigs_for_type(rrtype) + +=head1 SEE ALSO + +http://www.nlnetlabs.nl/projects/ldns + +=head1 AUTHOR + +Erik Pihl Ostlyngen, E<lt>erik.ostlyngen@uninett.noE<gt> + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2013 by UNINETT Norid AS + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.14.2 or, +at your option, any later version of Perl 5 you may have available. + +=cut |