diff options
author | sthen <sthen@openbsd.org> | 2013-11-26 12:50:10 +0000 |
---|---|---|
committer | sthen <sthen@openbsd.org> | 2013-11-26 12:50:10 +0000 |
commit | d3fecca9f63d975339880ea9da999a59fc9dbfdc (patch) | |
tree | 77f0767482483e7b94040f328076abf2e3d85323 /usr.sbin/nsd/udbzone.h | |
parent | - put -Q in the right place (diff) | |
download | wireguard-openbsd-d3fecca9f63d975339880ea9da999a59fc9dbfdc.tar.xz wireguard-openbsd-d3fecca9f63d975339880ea9da999a59fc9dbfdc.zip |
import NSD 4.0.0, tests from Dorian Büttner, Patrik Lundin, requested by brad@
Diffstat (limited to 'usr.sbin/nsd/udbzone.h')
-rw-r--r-- | usr.sbin/nsd/udbzone.h | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/usr.sbin/nsd/udbzone.h b/usr.sbin/nsd/udbzone.h new file mode 100644 index 00000000000..f1163e4dfe5 --- /dev/null +++ b/usr.sbin/nsd/udbzone.h @@ -0,0 +1,147 @@ +/* + * udbzone -- store zone and rrset information in udb file. + * + * Copyright (c) 2011, NLnet Labs. See LICENSE for license. + */ +#ifndef UDB_ZONE_H +#define UDB_ZONE_H +#include "udb.h" +#include "dns.h" +#include "udbradtree.h" + +/** + * Store the DNS information in udb file on disk. + * udb_global + * | + * v + * zonetree -> zone -- zone_name + * radtree | + * v + * domain --> rrset -> rr + * radtree list list + * |-- name + */ + +/** zone information in the nsd.udb. Name allocated after it. */ +struct zone_d { + /** radtree node in the zonetree for this zone */ + udb_rel_ptr node; + /** the radtree for the domain names in the zone */ + udb_rel_ptr domains; + /** the NSEC3PARAM rr used for hashing (or 0), rr_d pointer */ + udb_rel_ptr nsec3param; + /** the log_str for the AXFR change, or 0 */ + udb_rel_ptr log_str; + /** modification time, time when the zone data was changed */ + uint64_t mtime; + /** number of RRsets in the zone */ + uint64_t rrset_count; + /** number of RRs in the zone */ + uint64_t rr_count; + /** the length of the zone name */ + udb_radstrlen_t namelen; + /** if the zone is expired */ + uint8_t expired; + /** if the zone has been changed by AXFR */ + uint8_t is_changed; + /** the zone (wire uncompressed) name in DNS format */ + uint8_t name[0]; +}; + +/** domain name in the nametree. name allocated after it */ +struct domain_d { + /** radtree node in the nametree for this domain */ + udb_rel_ptr node; + /** the list of rrsets for this name, single linked */ + udb_rel_ptr rrsets; + /** length of the domain name */ + udb_radstrlen_t namelen; + /** the domain (wire uncompressed) name in DNS format */ + uint8_t name[0]; +}; + +/** rrset information. */ +struct rrset_d { + /** next in rrset list */ + udb_rel_ptr next; + /** the singly linked list of rrs for this rrset */ + udb_rel_ptr rrs; + /** type of the RRs in this rrset (host order) */ + uint16_t type; +}; + +/** rr information; wireformat data allocated after it */ +struct rr_d { + /** next in rr list */ + udb_rel_ptr next; + /** type (host order) */ + uint16_t type; + /** class (host order) */ + uint16_t klass; + /** ttl (host order) */ + uint32_t ttl; + /** length of wireformat */ + uint16_t len; + /** wireformat of rdata (without rdatalen) */ + uint8_t wire[0]; +}; + +/** init an udb for use as DNS store */ +int udb_dns_init_file(udb_base* udb); +/** de-init an udb for use as DNS store */ +void udb_dns_deinit_file(udb_base* udb); + +/** create a zone */ +int udb_zone_create(udb_base* udb, udb_ptr* result, const uint8_t* dname, + size_t dlen); +/** clear all RRsets from a zone */ +void udb_zone_clear(udb_base* udb, udb_ptr* zone); +/** delete a zone */ +void udb_zone_delete(udb_base* udb, udb_ptr* zone); +/** find a zone by name (exact match) */ +int udb_zone_search(udb_base* udb, udb_ptr* result, const uint8_t* dname, + size_t dlen); +/** get modification time for zone or 0 */ +uint64_t udb_zone_get_mtime(udb_base* udb, const uint8_t* dname, size_t dlen); +/** set log str in udb, or remove it */ +void udb_zone_set_log_str(udb_base* udb, udb_ptr* zone, const char* str); +/** find a domain name in the zone domain tree */ +int udb_domain_find(udb_base* udb, udb_ptr* zone, const uint8_t* nm, + size_t nmlen, udb_ptr* result); +/** find rrset in domain */ +int udb_rrset_find(udb_base* udb, udb_ptr* domain, uint16_t t, udb_ptr* res); + +/** add an RR to a zone */ +int udb_zone_add_rr(udb_base* udb, udb_ptr* zone, const uint8_t* nm, + size_t nmlen, uint16_t t, uint16_t k, uint32_t ttl, uint8_t* rdata, + size_t rdatalen); +/** del an RR from a zone */ +void udb_zone_del_rr(udb_base* udb, udb_ptr* zone, const uint8_t* nm, + size_t nmlen, uint16_t t, uint16_t k, uint8_t* rdata, size_t rdatalen); + +/** get pretty string for nsec3parameters (static buffer returned) */ +const char* udb_nsec3param_string(udb_ptr* rr); + +/** for use in udb-walkfunc, walks relptrs in udb_chunk_type_zone */ +void udb_zone_walk_chunk(void* base, void* d, uint64_t s, + udb_walk_relptr_cb* cb, void* arg); +/** for use in udb-walkfunc, walks relptrs in udb_chunk_type_domain */ +void udb_domain_walk_chunk(void* base, void* d, uint64_t s, + udb_walk_relptr_cb* cb, void* arg); +/** for use in udb-walkfunc, walks relptrs in udb_chunk_type_rrset */ +void udb_rrset_walk_chunk(void* base, void* d, uint64_t s, + udb_walk_relptr_cb* cb, void* arg); +/** for use in udb-walkfunc, walks relptrs in udb_chunk_type_rr */ +void udb_rr_walk_chunk(void* base, void* d, uint64_t s, + udb_walk_relptr_cb* cb, void* arg); + +/** walk through relptrs in registered types */ +void namedb_walkfunc(void* base, void* warg, uint8_t t, void* d, uint64_t s, + udb_walk_relptr_cb* cb, void* arg); + +#define ZONE(ptr) ((struct zone_d*)UDB_PTR(ptr)) +#define DOMAIN(ptr) ((struct domain_d*)UDB_PTR(ptr)) +#define RRSET(ptr) ((struct rrset_d*)UDB_PTR(ptr)) +#define RR(ptr) ((struct rr_d*)UDB_PTR(ptr)) + +#endif /* UDB_ZONE_H */ |