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