1package DNS::LDNS::Zone;
2
3use 5.008008;
4use strict;
5use warnings;
6
7use DNS::LDNS ':all';
8
9our $VERSION = '0.61';
10
11sub new {
12    my ($class, %args) = @_;
13
14    my $line_nr = 0;
15    my $status = &LDNS_STATUS_OK;
16    my $zone;
17    my $file;
18
19    if ($args{filename}) {
20	unless (open FILE, $args{filename}) {
21	    $DNS::LDNS::last_status = &LDNS_STATUS_FILE_ERR;
22	    $DNS::LDNS::line_nr = 0;
23	    return;
24	}
25
26	$file = \*FILE;
27    }
28    elsif ($args{file}) {
29	$file = $args{file};
30    }
31
32    if ($file) {
33	$zone = _new_from_file($file,
34			       $args{origin},
35			       $args{default_ttl} || 0,
36			       $args{class} || 0,
37			       $status, $line_nr);
38    }
39    else {
40	$zone = _new();
41    }
42
43    if ($args{filename}) {
44	close $file;
45    }
46
47    $DNS::LDNS::last_status = $status;
48    $DNS::LDNS::line_nr = $line_nr;
49    if (!defined $zone) {
50	return;
51    }
52
53    return $zone;
54}
55
56sub to_string {
57    my $self = shift;
58
59    return join('', map { $self->$_ ? $self->$_->to_string : '' } qw/soa rrs/);
60}
61
62sub soa {
63    my $self = shift;
64    return DNS::LDNS::GC::own($self->_soa, $self);
65}
66
67sub set_soa {
68    my ($self, $soa) = @_;
69    DNS::LDNS::GC::disown(my $old = $self->soa);
70    $self->_set_soa(my $copy = $soa->clone);
71    return DNS::LDNS::GC::own($copy, $self);
72}
73
74sub rrs {
75    my $self = shift;
76    return DNS::LDNS::GC::own($self->_rrs, $self);
77}
78
79sub set_rrs {
80    my ($self, $list) = @_;
81    DNS::LDNS::GC::disown(my $old = $self->rrs);
82    $self->_set_rrs(my $copy = $list->clone);
83    return DNS::LDNS::GC::own($copy, $self);
84}
85
86sub DESTROY {
87    DNS::LDNS::GC::free($_[0]);
88}
89
901;
91__END__
92
93=head1 NAME
94
95DNS::LDNS::Zone - Parsed zonefile
96
97=head1 SYNOPSIS
98
99  use DNS::LDNS ':all'
100
101  my z = new DNS::LDNS::Zone(
102    filename => '/path/to/myzone',
103    origin => new DNS::LDNS::RData(LDNS_RDF_TYPE_DNAME, 'myzone'), #optional
104    default_ttl => 3600, #optional
105    class => LDNS_RR_CLASS_IN, #optional
106  )
107  my z = new DNS::LDNS::Zone(
108    file => \*FILE,
109    origin => ..., default_ttl => ..., class => ...
110  )
111  my z = new DNS::LDNS::Zone
112
113  z->to_string
114  z->print(\*FILE)
115  z->canonicalize
116  z->sort
117  rr = z->soa
118  z->set_soa(rr)
119  rrlist = z->rrs
120  z->set_rrs(rrlist)
121  z->sign(keylist)
122  z->sign_nsec3(keylist, algorithm, flags, iterations, salt)
123
124=head1 SEE ALSO
125
126http://www.nlnetlabs.nl/projects/ldns
127
128=head1 AUTHOR
129
130Erik Pihl Ostlyngen, E<lt>erik.ostlyngen@uninett.noE<gt>
131
132=head1 COPYRIGHT AND LICENSE
133
134Copyright (C) 2013 by UNINETT Norid AS
135
136This library is free software; you can redistribute it and/or modify
137it under the same terms as Perl itself, either Perl version 5.14.2 or,
138at your option, any later version of Perl 5 you may have available.
139
140=cut
141