summaryrefslogtreecommitdiffstats
path: root/usr.sbin/nsd/udbzone.h
diff options
context:
space:
mode:
authorsthen <sthen@openbsd.org>2013-11-26 12:50:10 +0000
committersthen <sthen@openbsd.org>2013-11-26 12:50:10 +0000
commitd3fecca9f63d975339880ea9da999a59fc9dbfdc (patch)
tree77f0767482483e7b94040f328076abf2e3d85323 /usr.sbin/nsd/udbzone.h
parent- put -Q in the right place (diff)
downloadwireguard-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.h147
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 */