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