1package DNS::LDNS::RRList;
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{hosts_filename} or $args{hosts_file})  {
15	my $file = $args{hosts_file};
16	if ($args{hosts_filename}) {
17	    unless (open FILE, $args{hosts_filename}) {
18		$DNS::LDNS::last_status = &LDNS_STATUS_FILE_ERR;
19		$DNS::LDNS::line_nr = 0;
20		return;
21	    }
22	    $file = \*FILE;
23	}
24	my $list = _new_hosts_from_file($file, $DNS::LDNS::line_nr);
25	if ($args{hosts_filename}) {
26	    close $file;
27	}
28	return $list;
29    }
30
31    return _new();
32}
33
34sub rr {
35    my ($self, $index) = @_;
36    return DNS::LDNS::GC::own($self->_rr($index), $self);
37}
38
39sub push {
40    my ($self, @rrs) = @_;
41
42    for my $rr (@rrs) {
43	# Push a copy of the rr in case it is already owned
44	$self->_push(my $copy = $rr->clone);
45	DNS::LDNS::GC::own($copy, $self);
46    }
47}
48
49sub push_list {
50    my ($self, $list) = @_;
51
52    $self->_push_list(my $copy = $list->clone);
53    DNS::LDNS::GC::own($copy, $self);
54}
55
56sub verify {
57    my ($self, $sig, $keys) = @_;
58    my $goodkeys = new DNS::LDNS::RRList;
59    my $s = _verify($self, $sig, $keys, $goodkeys);
60    $DNS::LDNS::last_status = $s;
61    return wantarray ? ($s, $goodkeys) : $s;
62}
63
64sub verify_time {
65    my ($self, $sig, $keys, $checktime) = @_;
66    my $goodkeys = new DNS::LDNS::RRList;
67    my $s = _verify_time($self, $sig, $keys, $checktime, $goodkeys);
68    $DNS::LDNS::last_status = $s;
69    return wantarray ? ($s, $goodkeys) : $s;
70}
71
72sub verify_notime {
73    my ($self, $sig, $keys) = @_;
74    my $goodkeys = new DNS::LDNS::RRList;
75    my $s = _verify_notime($self, $sig, $keys, $goodkeys);
76    $DNS::LDNS::last_status = $s;
77    return wantarray ? ($s, $goodkeys) : $s;
78}
79
80sub verify_rrsig_keylist {
81    my ($self, $sig, $keys) = @_;
82    my $goodkeys = new DNS::LDNS::RRList;
83    my $s = _verify_rrsig_keylist($self, $sig, $keys, $goodkeys);
84    $DNS::LDNS::last_status = $s;
85    return wantarray ? ($s, $goodkeys) : $s;
86}
87
88sub verify_rrsig_keylist_notime {
89    my ($self, $sig, $keys, $check_time) = @_;
90    my $goodkeys = new DNS::LDNS::RRList;
91    my $s = _verify_rrsig_keylist_notime($self, $sig, $keys, $goodkeys);
92    $DNS::LDNS::last_status = $s;
93    return wantarray ? ($s, $goodkeys) : $s;
94}
95
96sub get_dnskey_for_rrsig {
97    my ($self, $rrsig) = @_;
98    return DNS::LDNS::GC::own(_get_dnskey_for_rrsig($rrsig, $self), $self);
99}
100
101sub get_rrsig_for_name_and_type {
102    my ($self, $name, $type) = @_;
103    return DNS::LDNS::GC::own(
104	_get_dnskey_for_name_and_type($name, $type, $self), $self);
105}
106
107sub DESTROY {
108    DNS::LDNS::GC::free($_[0]);
109}
110
1111;
112__END__
113
114=head1 NAME
115
116DNS::LDNS::RRList - List of rrs
117
118=head1 SYNOPSIS
119
120  use DNS::LDNS ':all'
121
122  my l = new DNS::LDNS::RRList
123  my l = new DNS::LDNS::RRList(hosts_file => \*FILE)
124  my l = new DNS::LDNS::RRList(hosts_filename => fname)
125  my l2 = l->clone
126
127  l->to_string
128
129  l->print(\*FILE)
130  count = l->rr_count
131
132  rr = l->rr(index)
133  l->push(@rr)
134  rr = l->pop
135
136  l->push_list(l2)
137  l2 = l->pop_list(count)
138  l2 = l->pop_rrset
139
140  l->compare(l2)
141
142  l2 = l->subtype_by_rdata(rdata, pos)
143
144  bool = l->is_rrset
145
146  bool = l->contains_rr(rr)
147
148  (status, goodkeys) = l->verify(sig, keys)
149  (status, goodkeys) = l->verify_time(sig, keys, checktime)
150  (status, goodkeys) = l->verify_notime(sig, keys)
151  (status, goodkeys) = l->verify_rrsig_keylist(sig, keys)
152  (status, goodkeys) = l->verify_rrsig_keylist_time(sig, keys, checktime)
153  (status, goodkeys) = l->verify_rrsig_keylist_notime(sig, keys)
154  status = l->verify_rrsig(sig, keys)
155  status = l->verify_rrsig_time(sig, keys, checktime)
156
157  rr = l->create_empty_rrsig(key)
158  rrlist = l->sign_public(keylist)
159
160  rrlist->canonicalize
161  rrlist->sort
162  rrlist->sort_nsec3   # the list must contain only nsec3 rrs
163
164  rr = keylist->get_dnskey_for_rrsig(rrsig)
165  rr = keylist->get_rrsig_for_name_and_type(name, type)
166
167=head1 SEE ALSO
168
169http://www.nlnetlabs.nl/projects/ldns
170
171=head1 AUTHOR
172
173Erik Pihl Ostlyngen, E<lt>erik.ostlyngen@uninett.noE<gt>
174
175=head1 COPYRIGHT AND LICENSE
176
177Copyright (C) 2013 by UNINETT Norid AS
178
179This library is free software; you can redistribute it and/or modify
180it under the same terms as Perl itself, either Perl version 5.14.2 or,
181at your option, any later version of Perl 5 you may have available.
182
183=cut
184