xref: /freebsd/contrib/unbound/services/localzone.h (revision b5663de9eb877cb7ebb54c4ae4eb81007bb17df4)
1b7579f77SDag-Erling Smørgrav /*
2b7579f77SDag-Erling Smørgrav  * services/localzone.h - local zones authority service.
3b7579f77SDag-Erling Smørgrav  *
4b7579f77SDag-Erling Smørgrav  * Copyright (c) 2007, NLnet Labs. All rights reserved.
5b7579f77SDag-Erling Smørgrav  *
6b7579f77SDag-Erling Smørgrav  * This software is open source.
7b7579f77SDag-Erling Smørgrav  *
8b7579f77SDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
9b7579f77SDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
10b7579f77SDag-Erling Smørgrav  * are met:
11b7579f77SDag-Erling Smørgrav  *
12b7579f77SDag-Erling Smørgrav  * Redistributions of source code must retain the above copyright notice,
13b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer.
14b7579f77SDag-Erling Smørgrav  *
15b7579f77SDag-Erling Smørgrav  * Redistributions in binary form must reproduce the above copyright notice,
16b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer in the documentation
17b7579f77SDag-Erling Smørgrav  * and/or other materials provided with the distribution.
18b7579f77SDag-Erling Smørgrav  *
19b7579f77SDag-Erling Smørgrav  * Neither the name of the NLNET LABS nor the names of its contributors may
20b7579f77SDag-Erling Smørgrav  * be used to endorse or promote products derived from this software without
21b7579f77SDag-Erling Smørgrav  * specific prior written permission.
22b7579f77SDag-Erling Smørgrav  *
23b7579f77SDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2417d15b25SDag-Erling Smørgrav  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2517d15b25SDag-Erling Smørgrav  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2617d15b25SDag-Erling Smørgrav  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2717d15b25SDag-Erling Smørgrav  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2817d15b25SDag-Erling Smørgrav  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2917d15b25SDag-Erling Smørgrav  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3017d15b25SDag-Erling Smørgrav  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3117d15b25SDag-Erling Smørgrav  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3217d15b25SDag-Erling Smørgrav  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3317d15b25SDag-Erling Smørgrav  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34b7579f77SDag-Erling Smørgrav  */
35b7579f77SDag-Erling Smørgrav 
36b7579f77SDag-Erling Smørgrav /**
37b7579f77SDag-Erling Smørgrav  * \file
38b7579f77SDag-Erling Smørgrav  *
39b7579f77SDag-Erling Smørgrav  * This file contains functions to enable local zone authority service.
40b7579f77SDag-Erling Smørgrav  */
41b7579f77SDag-Erling Smørgrav 
42b7579f77SDag-Erling Smørgrav #ifndef SERVICES_LOCALZONE_H
43b7579f77SDag-Erling Smørgrav #define SERVICES_LOCALZONE_H
44b7579f77SDag-Erling Smørgrav #include "util/rbtree.h"
45b7579f77SDag-Erling Smørgrav #include "util/locks.h"
46*b5663de9SDag-Erling Smørgrav #include "util/storage/dnstree.h"
47b7579f77SDag-Erling Smørgrav struct ub_packed_rrset_key;
48b7579f77SDag-Erling Smørgrav struct regional;
49b7579f77SDag-Erling Smørgrav struct config_file;
50b7579f77SDag-Erling Smørgrav struct edns_data;
51b7579f77SDag-Erling Smørgrav struct query_info;
5217d15b25SDag-Erling Smørgrav struct sldns_buffer;
536480faa8SDag-Erling Smørgrav struct comm_reply;
54*b5663de9SDag-Erling Smørgrav struct config_strlist;
55b7579f77SDag-Erling Smørgrav 
56b7579f77SDag-Erling Smørgrav /**
57b7579f77SDag-Erling Smørgrav  * Local zone type
58b7579f77SDag-Erling Smørgrav  * This type determines processing for queries that did not match
59b7579f77SDag-Erling Smørgrav  * local-data directly.
60b7579f77SDag-Erling Smørgrav  */
61b7579f77SDag-Erling Smørgrav enum localzone_type {
62b7579f77SDag-Erling Smørgrav 	/** drop query */
63b7579f77SDag-Erling Smørgrav 	local_zone_deny = 0,
64b7579f77SDag-Erling Smørgrav 	/** answer with error */
65b7579f77SDag-Erling Smørgrav 	local_zone_refuse,
66b7579f77SDag-Erling Smørgrav 	/** answer nxdomain or nodata */
67b7579f77SDag-Erling Smørgrav 	local_zone_static,
68b7579f77SDag-Erling Smørgrav 	/** resolve normally */
69b7579f77SDag-Erling Smørgrav 	local_zone_transparent,
70b7579f77SDag-Erling Smørgrav 	/** do not block types at localdata names */
71b7579f77SDag-Erling Smørgrav 	local_zone_typetransparent,
72b7579f77SDag-Erling Smørgrav 	/** answer with data at zone apex */
73b7579f77SDag-Erling Smørgrav 	local_zone_redirect,
74b7579f77SDag-Erling Smørgrav 	/** remove default AS112 blocking contents for zone
75b7579f77SDag-Erling Smørgrav 	 * nodefault is used in config not during service. */
766480faa8SDag-Erling Smørgrav 	local_zone_nodefault,
776480faa8SDag-Erling Smørgrav 	/** log client address, but no block (transparent) */
7809a3aaf3SDag-Erling Smørgrav 	local_zone_inform,
7909a3aaf3SDag-Erling Smørgrav 	/** log client address, and block (drop) */
80*b5663de9SDag-Erling Smørgrav 	local_zone_inform_deny,
81*b5663de9SDag-Erling Smørgrav 	/** resolve normally, even when there is local data */
82*b5663de9SDag-Erling Smørgrav 	local_zone_always_transparent,
83*b5663de9SDag-Erling Smørgrav 	/** answer with error, even when there is local data */
84*b5663de9SDag-Erling Smørgrav 	local_zone_always_refuse,
85*b5663de9SDag-Erling Smørgrav 	/** answer with nxdomain, even when there is local data */
86*b5663de9SDag-Erling Smørgrav 	local_zone_always_nxdomain
87b7579f77SDag-Erling Smørgrav };
88b7579f77SDag-Erling Smørgrav 
89b7579f77SDag-Erling Smørgrav /**
90b7579f77SDag-Erling Smørgrav  * Authoritative local zones storage, shared.
91b7579f77SDag-Erling Smørgrav  */
92b7579f77SDag-Erling Smørgrav struct local_zones {
93b7579f77SDag-Erling Smørgrav 	/** lock on the localzone tree */
9417d15b25SDag-Erling Smørgrav 	lock_rw_t lock;
95b7579f77SDag-Erling Smørgrav 	/** rbtree of struct local_zone */
96b7579f77SDag-Erling Smørgrav 	rbtree_t ztree;
97b7579f77SDag-Erling Smørgrav };
98b7579f77SDag-Erling Smørgrav 
99b7579f77SDag-Erling Smørgrav /**
100b7579f77SDag-Erling Smørgrav  * Local zone. A locally served authoritative zone.
101b7579f77SDag-Erling Smørgrav  */
102b7579f77SDag-Erling Smørgrav struct local_zone {
103b7579f77SDag-Erling Smørgrav 	/** rbtree node, key is name and class */
104b7579f77SDag-Erling Smørgrav 	rbnode_t node;
105b7579f77SDag-Erling Smørgrav 	/** parent zone, if any. */
106b7579f77SDag-Erling Smørgrav 	struct local_zone* parent;
107b7579f77SDag-Erling Smørgrav 
108b7579f77SDag-Erling Smørgrav 	/** zone name, in uncompressed wireformat */
109b7579f77SDag-Erling Smørgrav 	uint8_t* name;
110b7579f77SDag-Erling Smørgrav 	/** length of zone name */
111b7579f77SDag-Erling Smørgrav 	size_t namelen;
112b7579f77SDag-Erling Smørgrav 	/** number of labels in zone name */
113b7579f77SDag-Erling Smørgrav 	int namelabs;
114b7579f77SDag-Erling Smørgrav 	/** the class of this zone.
115b7579f77SDag-Erling Smørgrav 	 * uses 'dclass' to not conflict with c++ keyword class. */
116b7579f77SDag-Erling Smørgrav 	uint16_t dclass;
117b7579f77SDag-Erling Smørgrav 
118b7579f77SDag-Erling Smørgrav 	/** lock on the data in the structure
119b7579f77SDag-Erling Smørgrav 	 * For the node, parent, name, namelen, namelabs, dclass, you
120b7579f77SDag-Erling Smørgrav 	 * need to also hold the zones_tree lock to change them (or to
121b7579f77SDag-Erling Smørgrav 	 * delete this zone) */
122b7579f77SDag-Erling Smørgrav 	lock_rw_t lock;
123b7579f77SDag-Erling Smørgrav 
124b7579f77SDag-Erling Smørgrav 	/** how to process zone */
125b7579f77SDag-Erling Smørgrav 	enum localzone_type type;
126e2d15004SDag-Erling Smørgrav 	/** tag bitlist */
127e2d15004SDag-Erling Smørgrav 	uint8_t* taglist;
128e2d15004SDag-Erling Smørgrav 	/** length of the taglist (in bytes) */
129e2d15004SDag-Erling Smørgrav 	size_t taglen;
130*b5663de9SDag-Erling Smørgrav 	/** netblock addr_tree with struct local_zone_override information
131*b5663de9SDag-Erling Smørgrav 	 * or NULL if there are no override elements */
132*b5663de9SDag-Erling Smørgrav 	struct rbtree_t* override_tree;
133b7579f77SDag-Erling Smørgrav 
134b7579f77SDag-Erling Smørgrav 	/** in this region the zone's data is allocated.
135b7579f77SDag-Erling Smørgrav 	 * the struct local_zone itself is malloced. */
136b7579f77SDag-Erling Smørgrav 	struct regional* region;
137b7579f77SDag-Erling Smørgrav 	/** local data for this zone
138b7579f77SDag-Erling Smørgrav 	 * rbtree of struct local_data */
139b7579f77SDag-Erling Smørgrav 	rbtree_t data;
140b7579f77SDag-Erling Smørgrav 	/** if data contains zone apex SOA data, this is a ptr to it. */
141b7579f77SDag-Erling Smørgrav 	struct ub_packed_rrset_key* soa;
142b7579f77SDag-Erling Smørgrav };
143b7579f77SDag-Erling Smørgrav 
144b7579f77SDag-Erling Smørgrav /**
145b7579f77SDag-Erling Smørgrav  * Local data. One domain name, and the RRs to go with it.
146b7579f77SDag-Erling Smørgrav  */
147b7579f77SDag-Erling Smørgrav struct local_data {
148b7579f77SDag-Erling Smørgrav 	/** rbtree node, key is name only */
149b7579f77SDag-Erling Smørgrav 	rbnode_t node;
150b7579f77SDag-Erling Smørgrav 	/** domain name */
151b7579f77SDag-Erling Smørgrav 	uint8_t* name;
152b7579f77SDag-Erling Smørgrav 	/** length of name */
153b7579f77SDag-Erling Smørgrav 	size_t namelen;
154b7579f77SDag-Erling Smørgrav 	/** number of labels in name */
155b7579f77SDag-Erling Smørgrav 	int namelabs;
156b7579f77SDag-Erling Smørgrav 	/** the data rrsets, with different types, linked list.
157b7579f77SDag-Erling Smørgrav 	 * If this list is NULL, the node is an empty non-terminal. */
158b7579f77SDag-Erling Smørgrav 	struct local_rrset* rrsets;
159b7579f77SDag-Erling Smørgrav };
160b7579f77SDag-Erling Smørgrav 
161b7579f77SDag-Erling Smørgrav /**
162b7579f77SDag-Erling Smørgrav  * A local data RRset
163b7579f77SDag-Erling Smørgrav  */
164b7579f77SDag-Erling Smørgrav struct local_rrset {
165b7579f77SDag-Erling Smørgrav 	/** next in list */
166b7579f77SDag-Erling Smørgrav 	struct local_rrset* next;
167b7579f77SDag-Erling Smørgrav 	/** RRset data item */
168b7579f77SDag-Erling Smørgrav 	struct ub_packed_rrset_key* rrset;
169b7579f77SDag-Erling Smørgrav };
170b7579f77SDag-Erling Smørgrav 
171b7579f77SDag-Erling Smørgrav /**
172*b5663de9SDag-Erling Smørgrav  * Local zone override information
173*b5663de9SDag-Erling Smørgrav  */
174*b5663de9SDag-Erling Smørgrav struct local_zone_override {
175*b5663de9SDag-Erling Smørgrav 	/** node in addrtree */
176*b5663de9SDag-Erling Smørgrav 	struct addr_tree_node node;
177*b5663de9SDag-Erling Smørgrav 	/** override for local zone type */
178*b5663de9SDag-Erling Smørgrav 	enum localzone_type type;
179*b5663de9SDag-Erling Smørgrav };
180*b5663de9SDag-Erling Smørgrav 
181*b5663de9SDag-Erling Smørgrav /**
182b7579f77SDag-Erling Smørgrav  * Create local zones storage
183b7579f77SDag-Erling Smørgrav  * @return new struct or NULL on error.
184b7579f77SDag-Erling Smørgrav  */
185b7579f77SDag-Erling Smørgrav struct local_zones* local_zones_create(void);
186b7579f77SDag-Erling Smørgrav 
187b7579f77SDag-Erling Smørgrav /**
188b7579f77SDag-Erling Smørgrav  * Delete local zones storage
189b7579f77SDag-Erling Smørgrav  * @param zones: to delete.
190b7579f77SDag-Erling Smørgrav  */
191b7579f77SDag-Erling Smørgrav void local_zones_delete(struct local_zones* zones);
192b7579f77SDag-Erling Smørgrav 
193b7579f77SDag-Erling Smørgrav /**
194b7579f77SDag-Erling Smørgrav  * Apply config settings; setup the local authoritative data.
195b7579f77SDag-Erling Smørgrav  * Takes care of locking.
196b7579f77SDag-Erling Smørgrav  * @param zones: is set up.
197b7579f77SDag-Erling Smørgrav  * @param cfg: config data.
198b7579f77SDag-Erling Smørgrav  * @return false on error.
199b7579f77SDag-Erling Smørgrav  */
200b7579f77SDag-Erling Smørgrav int local_zones_apply_cfg(struct local_zones* zones, struct config_file* cfg);
201b7579f77SDag-Erling Smørgrav 
202b7579f77SDag-Erling Smørgrav /**
203b7579f77SDag-Erling Smørgrav  * Compare two local_zone entries in rbtree. Sort hierarchical but not
204b7579f77SDag-Erling Smørgrav  * canonical
205b7579f77SDag-Erling Smørgrav  * @param z1: zone 1
206b7579f77SDag-Erling Smørgrav  * @param z2: zone 2
207b7579f77SDag-Erling Smørgrav  * @return: -1, 0, +1 comparison value.
208b7579f77SDag-Erling Smørgrav  */
209b7579f77SDag-Erling Smørgrav int local_zone_cmp(const void* z1, const void* z2);
210b7579f77SDag-Erling Smørgrav 
211b7579f77SDag-Erling Smørgrav /**
212b7579f77SDag-Erling Smørgrav  * Compare two local_data entries in rbtree. Sort canonical.
213b7579f77SDag-Erling Smørgrav  * @param d1: data 1
214b7579f77SDag-Erling Smørgrav  * @param d2: data 2
215b7579f77SDag-Erling Smørgrav  * @return: -1, 0, +1 comparison value.
216b7579f77SDag-Erling Smørgrav  */
217b7579f77SDag-Erling Smørgrav int local_data_cmp(const void* d1, const void* d2);
218b7579f77SDag-Erling Smørgrav 
219b7579f77SDag-Erling Smørgrav /**
220b7579f77SDag-Erling Smørgrav  * Delete one zone
221b7579f77SDag-Erling Smørgrav  * @param z: to delete.
222b7579f77SDag-Erling Smørgrav  */
223b7579f77SDag-Erling Smørgrav void local_zone_delete(struct local_zone* z);
224b7579f77SDag-Erling Smørgrav 
225b7579f77SDag-Erling Smørgrav /**
226*b5663de9SDag-Erling Smørgrav  * Lookup zone that contains the given name, class and taglist.
227*b5663de9SDag-Erling Smørgrav  * User must lock the tree or result zone.
228*b5663de9SDag-Erling Smørgrav  * @param zones: the zones tree
229*b5663de9SDag-Erling Smørgrav  * @param name: dname to lookup
230*b5663de9SDag-Erling Smørgrav  * @param len: length of name.
231*b5663de9SDag-Erling Smørgrav  * @param labs: labelcount of name.
232*b5663de9SDag-Erling Smørgrav  * @param dclass: class to lookup.
233*b5663de9SDag-Erling Smørgrav  * @param taglist: taglist to lookup.
234*b5663de9SDag-Erling Smørgrav  * @param taglen: lenth of taglist.
235*b5663de9SDag-Erling Smørgrav  * @param ignoretags: lookup zone by name and class, regardless the
236*b5663de9SDag-Erling Smørgrav  * local-zone's tags.
237*b5663de9SDag-Erling Smørgrav  * @return closest local_zone or NULL if no covering zone is found.
238*b5663de9SDag-Erling Smørgrav  */
239*b5663de9SDag-Erling Smørgrav struct local_zone* local_zones_tags_lookup(struct local_zones* zones,
240*b5663de9SDag-Erling Smørgrav 	uint8_t* name, size_t len, int labs, uint16_t dclass,
241*b5663de9SDag-Erling Smørgrav 	uint8_t* taglist, size_t taglen, int ignoretags);
242*b5663de9SDag-Erling Smørgrav 
243*b5663de9SDag-Erling Smørgrav /**
244b7579f77SDag-Erling Smørgrav  * Lookup zone that contains the given name, class.
245b7579f77SDag-Erling Smørgrav  * User must lock the tree or result zone.
246b7579f77SDag-Erling Smørgrav  * @param zones: the zones tree
247b7579f77SDag-Erling Smørgrav  * @param name: dname to lookup
248b7579f77SDag-Erling Smørgrav  * @param len: length of name.
249b7579f77SDag-Erling Smørgrav  * @param labs: labelcount of name.
250b7579f77SDag-Erling Smørgrav  * @param dclass: class to lookup.
251b7579f77SDag-Erling Smørgrav  * @return closest local_zone or NULL if no covering zone is found.
252b7579f77SDag-Erling Smørgrav  */
253b7579f77SDag-Erling Smørgrav struct local_zone* local_zones_lookup(struct local_zones* zones,
254b7579f77SDag-Erling Smørgrav 	uint8_t* name, size_t len, int labs, uint16_t dclass);
255b7579f77SDag-Erling Smørgrav 
256b7579f77SDag-Erling Smørgrav /**
257b7579f77SDag-Erling Smørgrav  * Debug helper. Print all zones
258b7579f77SDag-Erling Smørgrav  * Takes care of locking.
259b7579f77SDag-Erling Smørgrav  * @param zones: the zones tree
260b7579f77SDag-Erling Smørgrav  */
261b7579f77SDag-Erling Smørgrav void local_zones_print(struct local_zones* zones);
262b7579f77SDag-Erling Smørgrav 
263b7579f77SDag-Erling Smørgrav /**
264b7579f77SDag-Erling Smørgrav  * Answer authoritatively for local zones.
265b7579f77SDag-Erling Smørgrav  * Takes care of locking.
266b7579f77SDag-Erling Smørgrav  * @param zones: the stored zones (shared, read only).
267b7579f77SDag-Erling Smørgrav  * @param qinfo: query info (parsed).
268b7579f77SDag-Erling Smørgrav  * @param edns: edns info (parsed).
269b7579f77SDag-Erling Smørgrav  * @param buf: buffer with query ID and flags, also for reply.
270b7579f77SDag-Erling Smørgrav  * @param temp: temporary storage region.
2716480faa8SDag-Erling Smørgrav  * @param repinfo: source address for checks. may be NULL.
272*b5663de9SDag-Erling Smørgrav  * @param taglist: taglist for checks. May be NULL.
273*b5663de9SDag-Erling Smørgrav  * @param taglen: length of the taglist.
274*b5663de9SDag-Erling Smørgrav  * @param tagactions: local zone actions for tags. May be NULL.
275*b5663de9SDag-Erling Smørgrav  * @param tagactionssize: length of the tagactions.
276*b5663de9SDag-Erling Smørgrav  * @param tag_datas: array per tag of strlist with rdata strings. or NULL.
277*b5663de9SDag-Erling Smørgrav  * @param tag_datas_size: size of tag_datas array.
278*b5663de9SDag-Erling Smørgrav  * @param tagname: array of tag name strings (for debug output).
279*b5663de9SDag-Erling Smørgrav  * @param num_tags: number of items in tagname array.
280b7579f77SDag-Erling Smørgrav  * @return true if answer is in buffer. false if query is not answered
281b7579f77SDag-Erling Smørgrav  * by authority data. If the reply should be dropped altogether, the return
282b7579f77SDag-Erling Smørgrav  * value is true, but the buffer is cleared (empty).
283b7579f77SDag-Erling Smørgrav  */
284b7579f77SDag-Erling Smørgrav int local_zones_answer(struct local_zones* zones, struct query_info* qinfo,
2856480faa8SDag-Erling Smørgrav 	struct edns_data* edns, struct sldns_buffer* buf, struct regional* temp,
286*b5663de9SDag-Erling Smørgrav 	struct comm_reply* repinfo, uint8_t* taglist, size_t taglen,
287*b5663de9SDag-Erling Smørgrav 	uint8_t* tagactions, size_t tagactionssize,
288*b5663de9SDag-Erling Smørgrav 	struct config_strlist** tag_datas, size_t tag_datas_size,
289*b5663de9SDag-Erling Smørgrav 	char** tagname, int num_tags);
290b7579f77SDag-Erling Smørgrav 
291b7579f77SDag-Erling Smørgrav /**
292b7579f77SDag-Erling Smørgrav  * Parse the string into localzone type.
293b7579f77SDag-Erling Smørgrav  *
294b7579f77SDag-Erling Smørgrav  * @param str: string to parse
295b7579f77SDag-Erling Smørgrav  * @param t: local zone type returned here.
296b7579f77SDag-Erling Smørgrav  * @return 0 on parse error.
297b7579f77SDag-Erling Smørgrav  */
298b7579f77SDag-Erling Smørgrav int local_zone_str2type(const char* str, enum localzone_type* t);
299b7579f77SDag-Erling Smørgrav 
300b7579f77SDag-Erling Smørgrav /**
301b7579f77SDag-Erling Smørgrav  * Print localzone type to a string.  Pointer to a constant string.
302b7579f77SDag-Erling Smørgrav  *
303b7579f77SDag-Erling Smørgrav  * @param t: local zone type.
304b7579f77SDag-Erling Smørgrav  * @return constant string that describes type.
305b7579f77SDag-Erling Smørgrav  */
306b7579f77SDag-Erling Smørgrav const char* local_zone_type2str(enum localzone_type t);
307b7579f77SDag-Erling Smørgrav 
308b7579f77SDag-Erling Smørgrav /**
309b7579f77SDag-Erling Smørgrav  * Find zone that with exactly given name, class.
310b7579f77SDag-Erling Smørgrav  * User must lock the tree or result zone.
311b7579f77SDag-Erling Smørgrav  * @param zones: the zones tree
312b7579f77SDag-Erling Smørgrav  * @param name: dname to lookup
313b7579f77SDag-Erling Smørgrav  * @param len: length of name.
314b7579f77SDag-Erling Smørgrav  * @param labs: labelcount of name.
315b7579f77SDag-Erling Smørgrav  * @param dclass: class to lookup.
316b7579f77SDag-Erling Smørgrav  * @return the exact local_zone or NULL.
317b7579f77SDag-Erling Smørgrav  */
318b7579f77SDag-Erling Smørgrav struct local_zone* local_zones_find(struct local_zones* zones,
319b7579f77SDag-Erling Smørgrav 	uint8_t* name, size_t len, int labs, uint16_t dclass);
320b7579f77SDag-Erling Smørgrav 
321b7579f77SDag-Erling Smørgrav /**
322b7579f77SDag-Erling Smørgrav  * Add a new zone. Caller must hold the zones lock.
323b7579f77SDag-Erling Smørgrav  * Adjusts the other zones as well (parent pointers) after insertion.
324b7579f77SDag-Erling Smørgrav  * The zone must NOT exist (returns NULL and logs error).
325b7579f77SDag-Erling Smørgrav  * @param zones: the zones tree
326b7579f77SDag-Erling Smørgrav  * @param name: dname to add
327b7579f77SDag-Erling Smørgrav  * @param len: length of name.
328b7579f77SDag-Erling Smørgrav  * @param labs: labelcount of name.
329b7579f77SDag-Erling Smørgrav  * @param dclass: class to add.
330b7579f77SDag-Erling Smørgrav  * @param tp: type.
331b7579f77SDag-Erling Smørgrav  * @return local_zone or NULL on error, caller must printout memory error.
332b7579f77SDag-Erling Smørgrav  */
333b7579f77SDag-Erling Smørgrav struct local_zone* local_zones_add_zone(struct local_zones* zones,
334b7579f77SDag-Erling Smørgrav 	uint8_t* name, size_t len, int labs, uint16_t dclass,
335b7579f77SDag-Erling Smørgrav 	enum localzone_type tp);
336b7579f77SDag-Erling Smørgrav 
337b7579f77SDag-Erling Smørgrav /**
338b7579f77SDag-Erling Smørgrav  * Delete a zone. Caller must hold the zones lock.
339b7579f77SDag-Erling Smørgrav  * Adjusts the other zones as well (parent pointers) after insertion.
340b7579f77SDag-Erling Smørgrav  * @param zones: the zones tree
341b7579f77SDag-Erling Smørgrav  * @param zone: the zone to delete from tree. Also deletes zone from memory.
342b7579f77SDag-Erling Smørgrav  */
343b7579f77SDag-Erling Smørgrav void local_zones_del_zone(struct local_zones* zones, struct local_zone* zone);
344b7579f77SDag-Erling Smørgrav 
345b7579f77SDag-Erling Smørgrav /**
346b7579f77SDag-Erling Smørgrav  * Add RR data into the localzone data.
347b7579f77SDag-Erling Smørgrav  * Looks up the zone, if no covering zone, a transparent zone with the
348b7579f77SDag-Erling Smørgrav  * name of the RR is created.
349b7579f77SDag-Erling Smørgrav  * @param zones: the zones tree. Not locked by caller.
350b7579f77SDag-Erling Smørgrav  * @param rr: string with on RR.
351b7579f77SDag-Erling Smørgrav  * @return false on failure.
352b7579f77SDag-Erling Smørgrav  */
35317d15b25SDag-Erling Smørgrav int local_zones_add_RR(struct local_zones* zones, const char* rr);
354b7579f77SDag-Erling Smørgrav 
355b7579f77SDag-Erling Smørgrav /**
356b7579f77SDag-Erling Smørgrav  * Remove data from domain name in the tree.
357b7579f77SDag-Erling Smørgrav  * All types are removed. No effect if zone or name does not exist.
358b7579f77SDag-Erling Smørgrav  * @param zones: zones tree.
359b7579f77SDag-Erling Smørgrav  * @param name: dname to remove
360b7579f77SDag-Erling Smørgrav  * @param len: length of name.
361b7579f77SDag-Erling Smørgrav  * @param labs: labelcount of name.
362b7579f77SDag-Erling Smørgrav  * @param dclass: class to remove.
363b7579f77SDag-Erling Smørgrav  */
364b7579f77SDag-Erling Smørgrav void local_zones_del_data(struct local_zones* zones,
365b7579f77SDag-Erling Smørgrav 	uint8_t* name, size_t len, int labs, uint16_t dclass);
366b7579f77SDag-Erling Smørgrav 
367b7579f77SDag-Erling Smørgrav 
368b7579f77SDag-Erling Smørgrav /**
369b7579f77SDag-Erling Smørgrav  * Form wireformat from text format domain name.
370b7579f77SDag-Erling Smørgrav  * @param str: the domain name in text "www.example.com"
371b7579f77SDag-Erling Smørgrav  * @param res: resulting wireformat is stored here with malloc.
372b7579f77SDag-Erling Smørgrav  * @param len: length of resulting wireformat.
373b7579f77SDag-Erling Smørgrav  * @param labs: number of labels in resulting wireformat.
374b7579f77SDag-Erling Smørgrav  * @return false on error, syntax or memory. Also logged.
375b7579f77SDag-Erling Smørgrav  */
376b7579f77SDag-Erling Smørgrav int parse_dname(const char* str, uint8_t** res, size_t* len, int* labs);
377b7579f77SDag-Erling Smørgrav 
378b7579f77SDag-Erling Smørgrav #endif /* SERVICES_LOCALZONE_H */
379