1package DNS::LDNS::Packet; 2 3use 5.008008; 4use strict; 5use warnings; 6 7use DNS::LDNS; 8 9our $VERSION = '0.61'; 10 11sub new { 12 my ($class, %args) = @_; 13 14 if ($args{name}) { 15 return _query_new( 16 $args{name}, $args{type}, $args{class}, $args{flags}); 17 } 18 else { 19 return _new; 20 } 21} 22 23sub question { 24 my $self = shift; 25 return DNS::LDNS::GC::own($self->_question, $self); 26} 27 28sub set_question { 29 my ($self, $l) = @_; 30 DNS::LDNS::GC::disown(my $old = $self->question); 31 $self->_set_question($l); 32 return DNS::LDNS::GC::own($l, $self); 33} 34 35sub answer { 36 my $self = shift; 37 return DNS::LDNS::GC::own($self->_answer, $self); 38} 39 40sub set_answer { 41 my ($self, $l) = @_; 42 DNS::LDNS::GC::disown(my $old = $self->answer); 43 $self->_set_answer($l); 44 return DNS::LDNS::GC::own($l, $self); 45} 46 47sub authority { 48 my $self = shift; 49 return DNS::LDNS::GC::own($self->_authority, $self); 50} 51 52sub set_authority { 53 my ($self, $l) = @_; 54 DNS::LDNS::GC::disown(my $old = $self->authority); 55 $self->_set_authority($l); 56 return DNS::LDNS::GC::own($l, $self); 57} 58 59sub additional { 60 my $self = shift; 61 return DNS::LDNS::GC::own($self->_additional, $self); 62} 63 64sub set_additional { 65 my ($self, $l) = @_; 66 DNS::LDNS::GC::disown(my $old = $self->additional); 67 $self->_set_additional($l); 68 return DNS::LDNS::GC::own($l, $self); 69} 70 71sub answerfrom { 72 my $self = shift; 73 return DNS::LDNS::GC::own($self->_answerfrom, $self); 74} 75 76sub set_answerfrom { 77 my ($self, $a) = @_; 78 DNS::LDNS::GC::disown(my $old = $self->answerfrom); 79 $self->_set_answerfrom($a); 80 return DNS::LDNS::GC::own($a, $self); 81} 82 83 84sub timestamp { 85 my $self = shift; 86 my $t = _timestamp($self); 87 return wantarray ? @$t : $t; 88} 89 90sub edns_data { 91 my $self = shift; 92 return DNS::LDNS::GC::own($self->_edns_data, $self); 93} 94 95sub set_edns_data { 96 my ($self, $data) = @_; 97 DNS::LDNS::GC::disown(my $old = $self->edns_data); 98 $self->_set_edns_data($data); 99 return DNS::LDNS::GC::own($data, $self); 100} 101 102sub push_rr { 103 my ($self, $sec, $rr) = @_; 104 105 my $ret = $self->_push_rr($sec, my $copy = $_->clone); 106 DNS::LDNS::GC::own($copy, $self); 107 return $ret; 108} 109 110sub safe_push_rr { 111 my ($self, $sec, $rr) = @_; 112 113 my $ret = $self->_safe_push_rr($sec, my $copy = $_->clone); 114 if ($ret) { 115 DNS::LDNS::GC::own($copy, $self); 116 } 117 return $ret; 118} 119 120sub tsig { 121 my $self = shift; 122 return DNS::LDNS::GC::own($self->_tsig, $self); 123} 124 125sub set_tsig { 126 my ($self, $rr) = @_; 127 DNS::LDNS::GC::disown(my $old = $self->tsig); 128 $self->_set_tsig($rr); 129 return DNS::LDNS::GC::own($rr, $self); 130} 131 132sub DESTROY { 133 DNS::LDNS::GC::free($_[0]); 134} 135 1361; 137__END__ 138 139=head1 NAME 140 141DNS::LDNS::Packet - DNS packet 142 143=head1 SYNOPSIS 144 145 use DNS::LDNS ':all' 146 147 my pkt = new DNS::LDNS::Packet(name => rdata, type => LDNS_RR_TYPE_..., 148 class => LDNS_RR_CLASS_..., flags => ...) 149 my pkt = new DNS::LDNS::Packet 150 151 pkt2 = pkt->clone 152 153 pkt->to_string 154 155 rrlist = pkt->question 156 pkt->set_question(rrlist) 157' 158 rrlist = pkt->answer 159 pkt->set_answer(rrlist) 160 161 rrlist = pkt->authority 162 pkt->set_authority(rrlist) 163 164 rrlist = pkt->additional 165 pkt->set_additional(rrlist) 166 167 rrlist = pkt->all 168 rrlist = pkt->all_noquestion 169 170 for (qw/qr aa tc rd cd ra ad/) { 171 bool = pkt->$_ 172 pkt->set_$_(bool) 173 } 174 175 id = pkt->id 176 pkt->set_id(id) 177 pkt->set_random_id 178 179 count = pkt->qdcount 180 count = pkt->ancount 181 count = pkt->nscount 182 count = pkt->arcount 183 184 opcode = pkt->opcode 185 pkt->set_opcode(opcode) 186 187 rcode = pkt->rcode # Response code 188 pkt->set_rcode(rcode) 189 190 size = pkt->size 191 192 epoch = pkt->querytime 193 pkt->set_querytime(epoch) 194 195 rdata = pkt->answerfrom 196 pkt->set_answerfrom(rdata) 197 198 (sec, usec) = pkt->timestamp 199 pkt->set_timestamp(sec, usec) 200 201 bool = pkt->edns 202 203 size = pkt->edns_udp_size 204 pkt->set_edns_udp_size(size) 205 206 rcode = pkt->edns_extended_rcode 207 pkt->set_edns_extended_rcode(rcode) 208 209 v = pkt->edns_version 210 pkt->set_edns_version(v) 211 212 z = pkt->edns_z 213 pkt->set_edns_z(z) 214 215 do = pkt->edns_do 216 pkt->set_edns_do(do) 217 218 rdata = pkt->edns_data 219 pkt->set_edns_data(rdata) 220 221 pkt->set_flags(flags) 222 223 rrlist = pkt->rr_list_by_name(rdata, section) 224 rrlist = pkt->rr_list_by_type(type, section) 225 rrlist = pkt->rr_list_by_name_and_type(rdata, type, section) 226 227 bool = pkt->rr(section, rr) # Check if rr exists 228 229 pkt->push_rr(section, rr) 230 pkt->safe_push_rr(section, rr) 231 232 count = pkt->section_count(section) 233 bool = pkt->empty 234 235 rr = pkt->tsig 236 pkt->set_tsig(rr) 237 238 type = pkt->reply_type 239 240 rrlist = pkt->get_rrsigs_for_name_and_type(rdata, rrtype) 241 rrlist = pkt->get_rrsigs_for_type(rrtype) 242 243=head1 SEE ALSO 244 245http://www.nlnetlabs.nl/projects/ldns 246 247=head1 AUTHOR 248 249Erik Pihl Ostlyngen, E<lt>erik.ostlyngen@uninett.noE<gt> 250 251=head1 COPYRIGHT AND LICENSE 252 253Copyright (C) 2013 by UNINETT Norid AS 254 255This library is free software; you can redistribute it and/or modify 256it under the same terms as Perl itself, either Perl version 5.14.2 or, 257at your option, any later version of Perl 5 you may have available. 258 259=cut 260