—package
DNS::LDNS::Packet;
use
5.008008;
use
strict;
use
warnings;
use
DNS::LDNS ();
our
$VERSION
=
'0.63'
;
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 ();
my pkt = DNS::LDNS::Packet->new(name => rdata, type => LDNS_RR_TYPE_...,
class => LDNS_RR_CLASS_..., flags => ...)
my pkt = DNS::LDNS::Packet->new
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
=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