xref: /freebsd/contrib/ldns/ldns/zone.h (revision 5afab0e5e56fe90a378fb57249600e7924e1cab2)
17b5038d7SDag-Erling Smørgrav /**
27b5038d7SDag-Erling Smørgrav  * zone.h
37b5038d7SDag-Erling Smørgrav  *
47b5038d7SDag-Erling Smørgrav  * zone definitions
57b5038d7SDag-Erling Smørgrav  *  - what is it
67b5038d7SDag-Erling Smørgrav  *  - get_glue function
77b5038d7SDag-Erling Smørgrav  *  - search etc
87b5038d7SDag-Erling Smørgrav  *
97b5038d7SDag-Erling Smørgrav  * a Net::DNS like library for C
107b5038d7SDag-Erling Smørgrav  *
117b5038d7SDag-Erling Smørgrav  * (c) NLnet Labs, 2005-2006
127b5038d7SDag-Erling Smørgrav  *
137b5038d7SDag-Erling Smørgrav  * See the file LICENSE for the license
147b5038d7SDag-Erling Smørgrav  */
157b5038d7SDag-Erling Smørgrav 
167b5038d7SDag-Erling Smørgrav /**
177b5038d7SDag-Erling Smørgrav  * \file
187b5038d7SDag-Erling Smørgrav  *
197b5038d7SDag-Erling Smørgrav  * Defines the ldns_zone structure and functions to manipulate it.
207b5038d7SDag-Erling Smørgrav  */
217b5038d7SDag-Erling Smørgrav 
227b5038d7SDag-Erling Smørgrav 
237b5038d7SDag-Erling Smørgrav #ifndef LDNS_ZONE_H
247b5038d7SDag-Erling Smørgrav #define LDNS_ZONE_H
257b5038d7SDag-Erling Smørgrav 
267b5038d7SDag-Erling Smørgrav #include <ldns/common.h>
277b5038d7SDag-Erling Smørgrav #include <ldns/rdata.h>
287b5038d7SDag-Erling Smørgrav #include <ldns/rr.h>
297b5038d7SDag-Erling Smørgrav #include <ldns/error.h>
307b5038d7SDag-Erling Smørgrav 
317b5038d7SDag-Erling Smørgrav #ifdef __cplusplus
327b5038d7SDag-Erling Smørgrav extern "C" {
337b5038d7SDag-Erling Smørgrav #endif
347b5038d7SDag-Erling Smørgrav 
357b5038d7SDag-Erling Smørgrav /**
367b5038d7SDag-Erling Smørgrav  * DNS Zone
377b5038d7SDag-Erling Smørgrav  *
387b5038d7SDag-Erling Smørgrav  * A list of RR's with some
397b5038d7SDag-Erling Smørgrav  * extra information which comes from the SOA RR
407b5038d7SDag-Erling Smørgrav  * Note: nothing has been done to make this efficient (yet).
417b5038d7SDag-Erling Smørgrav  */
427b5038d7SDag-Erling Smørgrav struct ldns_struct_zone
437b5038d7SDag-Erling Smørgrav {
447b5038d7SDag-Erling Smørgrav 	/** the soa defines a zone */
457b5038d7SDag-Erling Smørgrav 	ldns_rr 	*_soa;
46*5afab0e5SDag-Erling Smørgrav 	/* basically a zone is a list of rr's */
477b5038d7SDag-Erling Smørgrav 	ldns_rr_list 	*_rrs;
487b5038d7SDag-Erling Smørgrav 	/* we could change this to be a b-tree etc etc todo */
497b5038d7SDag-Erling Smørgrav };
507b5038d7SDag-Erling Smørgrav typedef struct ldns_struct_zone ldns_zone;
517b5038d7SDag-Erling Smørgrav 
527b5038d7SDag-Erling Smørgrav /**
537b5038d7SDag-Erling Smørgrav  * create a new ldns_zone structure
547b5038d7SDag-Erling Smørgrav  * \return a pointer to a ldns_zone structure
557b5038d7SDag-Erling Smørgrav  */
567b5038d7SDag-Erling Smørgrav ldns_zone * ldns_zone_new(void);
577b5038d7SDag-Erling Smørgrav 
587b5038d7SDag-Erling Smørgrav /**
597b5038d7SDag-Erling Smørgrav  * Return the soa record of a zone
607b5038d7SDag-Erling Smørgrav  * \param[in] z the zone to read from
617b5038d7SDag-Erling Smørgrav  * \return the soa record in the zone
627b5038d7SDag-Erling Smørgrav  */
637b5038d7SDag-Erling Smørgrav ldns_rr * ldns_zone_soa(const ldns_zone *z);
647b5038d7SDag-Erling Smørgrav 
657b5038d7SDag-Erling Smørgrav /**
667b5038d7SDag-Erling Smørgrav  * Returns the number of resource records in the zone, NOT counting the SOA record
677b5038d7SDag-Erling Smørgrav  * \param[in] z the zone to read from
687b5038d7SDag-Erling Smørgrav  * \return the number of rr's in the zone
697b5038d7SDag-Erling Smørgrav  */
707b5038d7SDag-Erling Smørgrav size_t ldns_zone_rr_count(const ldns_zone *z);
717b5038d7SDag-Erling Smørgrav 
727b5038d7SDag-Erling Smørgrav /**
737b5038d7SDag-Erling Smørgrav  * Set the zone's soa record
747b5038d7SDag-Erling Smørgrav  * \param[in] z the zone to put the new soa in
757b5038d7SDag-Erling Smørgrav  * \param[in] soa the soa to set
767b5038d7SDag-Erling Smørgrav  */
777b5038d7SDag-Erling Smørgrav void ldns_zone_set_soa(ldns_zone *z, ldns_rr *soa);
787b5038d7SDag-Erling Smørgrav 
797b5038d7SDag-Erling Smørgrav /**
807b5038d7SDag-Erling Smørgrav  * Get a list of a zone's content. Note that the SOA
817b5038d7SDag-Erling Smørgrav  * isn't included in this list. You need to get the
827b5038d7SDag-Erling Smørgrav  * with ldns_zone_soa.
837b5038d7SDag-Erling Smørgrav  * \param[in] z the zone to read from
847b5038d7SDag-Erling Smørgrav  * \return the rrs from this zone
857b5038d7SDag-Erling Smørgrav  */
867b5038d7SDag-Erling Smørgrav ldns_rr_list * ldns_zone_rrs(const ldns_zone *z);
877b5038d7SDag-Erling Smørgrav 
887b5038d7SDag-Erling Smørgrav /**
897b5038d7SDag-Erling Smørgrav  * Set the zone's contents
907b5038d7SDag-Erling Smørgrav  * \param[in] z the zone to put the new soa in
917b5038d7SDag-Erling Smørgrav  * \param[in] rrlist the rrlist to use
927b5038d7SDag-Erling Smørgrav  */
937b5038d7SDag-Erling Smørgrav void ldns_zone_set_rrs(ldns_zone *z, ldns_rr_list *rrlist);
947b5038d7SDag-Erling Smørgrav 
957b5038d7SDag-Erling Smørgrav /**
967b5038d7SDag-Erling Smørgrav  * push an rrlist to a zone structure. This function use pointer
977b5038d7SDag-Erling Smørgrav  * copying, so the rr_list structure inside z is modified!
987b5038d7SDag-Erling Smørgrav  * \param[in] z the zone to add to
997b5038d7SDag-Erling Smørgrav  * \param[in] list the list to add
100*5afab0e5SDag-Erling Smørgrav  * \return a true on success otherwise false
1017b5038d7SDag-Erling Smørgrav  */
102986ba33cSDag-Erling Smørgrav bool ldns_zone_push_rr_list(ldns_zone *z, const ldns_rr_list *list);
1037b5038d7SDag-Erling Smørgrav 
1047b5038d7SDag-Erling Smørgrav /**
1057b5038d7SDag-Erling Smørgrav  * push an single rr to a zone structure. This function use pointer
1067b5038d7SDag-Erling Smørgrav  * copying, so the rr_list structure inside z is modified!
1077b5038d7SDag-Erling Smørgrav  * \param[in] z the zone to add to
1087b5038d7SDag-Erling Smørgrav  * \param[in] rr the rr to add
109*5afab0e5SDag-Erling Smørgrav  * \return a true on success otherwise false
1107b5038d7SDag-Erling Smørgrav  */
1117b5038d7SDag-Erling Smørgrav bool ldns_zone_push_rr(ldns_zone *z, ldns_rr *rr);
1127b5038d7SDag-Erling Smørgrav 
1137b5038d7SDag-Erling Smørgrav /**
1147b5038d7SDag-Erling Smørgrav  * Retrieve all resource records from the zone that are glue
1157b5038d7SDag-Erling Smørgrav  * records. The resulting list does are pointer references
1167b5038d7SDag-Erling Smørgrav  * to the zone's data.
1177b5038d7SDag-Erling Smørgrav  *
1187b5038d7SDag-Erling Smørgrav  * Due to the current zone implementation (as a list of rr's), this
1197b5038d7SDag-Erling Smørgrav  * function is extremely slow. Another (probably better) way to do this
1207b5038d7SDag-Erling Smørgrav  * is to use an ldns_dnssec_zone structure and the
1217b5038d7SDag-Erling Smørgrav  * ldns_dnssec_mark_and_get_glue() function.
1227b5038d7SDag-Erling Smørgrav  *
1237b5038d7SDag-Erling Smørgrav  * \param[in] z the zone to look for glue
1247b5038d7SDag-Erling Smørgrav  * \return the rr_list with the glue
1257b5038d7SDag-Erling Smørgrav  */
1267b5038d7SDag-Erling Smørgrav ldns_rr_list *ldns_zone_glue_rr_list(const ldns_zone *z);
1277b5038d7SDag-Erling Smørgrav 
1287b5038d7SDag-Erling Smørgrav /**
1297b5038d7SDag-Erling Smørgrav  * Create a new zone from a file
1307b5038d7SDag-Erling Smørgrav  * \param[out] z the new zone
1317b5038d7SDag-Erling Smørgrav  * \param[in] *fp the filepointer to use
1327b5038d7SDag-Erling Smørgrav  * \param[in] *origin the zones' origin
1337b5038d7SDag-Erling Smørgrav  * \param[in] ttl default ttl to use
1347b5038d7SDag-Erling Smørgrav  * \param[in] c default class to use (IN)
1357b5038d7SDag-Erling Smørgrav  *
1367b5038d7SDag-Erling Smørgrav  * \return ldns_status mesg with an error or LDNS_STATUS_OK
1377b5038d7SDag-Erling Smørgrav  */
138986ba33cSDag-Erling Smørgrav ldns_status ldns_zone_new_frm_fp(ldns_zone **z, FILE *fp, const ldns_rdf *origin, uint32_t ttl, ldns_rr_class c);
1397b5038d7SDag-Erling Smørgrav 
1407b5038d7SDag-Erling Smørgrav /**
1417b5038d7SDag-Erling Smørgrav  * Create a new zone from a file, keep track of the line numbering
1427b5038d7SDag-Erling Smørgrav  * \param[out] z the new zone
1437b5038d7SDag-Erling Smørgrav  * \param[in] *fp the filepointer to use
1447b5038d7SDag-Erling Smørgrav  * \param[in] *origin the zones' origin
1457b5038d7SDag-Erling Smørgrav  * \param[in] ttl default ttl to use
1467b5038d7SDag-Erling Smørgrav  * \param[in] c default class to use (IN)
1477b5038d7SDag-Erling Smørgrav  * \param[out] line_nr used for error msg, to get to the line number
1487b5038d7SDag-Erling Smørgrav  *
1497b5038d7SDag-Erling Smørgrav  * \return ldns_status mesg with an error or LDNS_STATUS_OK
1507b5038d7SDag-Erling Smørgrav  */
151986ba33cSDag-Erling Smørgrav ldns_status ldns_zone_new_frm_fp_l(ldns_zone **z, FILE *fp, const ldns_rdf *origin, uint32_t ttl, ldns_rr_class c, int *line_nr);
1527b5038d7SDag-Erling Smørgrav 
1537b5038d7SDag-Erling Smørgrav /**
1547b5038d7SDag-Erling Smørgrav  * Frees the allocated memory for the zone, and the rr_list structure in it
1557b5038d7SDag-Erling Smørgrav  * \param[in] zone the zone to free
1567b5038d7SDag-Erling Smørgrav  */
1577b5038d7SDag-Erling Smørgrav void ldns_zone_free(ldns_zone *zone);
1587b5038d7SDag-Erling Smørgrav 
1597b5038d7SDag-Erling Smørgrav /**
1607b5038d7SDag-Erling Smørgrav  * Frees the allocated memory for the zone, the soa rr in it,
1617b5038d7SDag-Erling Smørgrav  * and the rr_list structure in it, including the rr's in that. etc.
1627b5038d7SDag-Erling Smørgrav  * \param[in] zone the zone to free
1637b5038d7SDag-Erling Smørgrav  */
1647b5038d7SDag-Erling Smørgrav void ldns_zone_deep_free(ldns_zone *zone);
1657b5038d7SDag-Erling Smørgrav 
1667b5038d7SDag-Erling Smørgrav /**
1677b5038d7SDag-Erling Smørgrav  * Sort the rrs in a zone, with the current impl. this is slow
1687b5038d7SDag-Erling Smørgrav  * \param[in] zone the zone to sort
1697b5038d7SDag-Erling Smørgrav  */
1707b5038d7SDag-Erling Smørgrav void ldns_zone_sort(ldns_zone *zone);
1717b5038d7SDag-Erling Smørgrav 
1727b5038d7SDag-Erling Smørgrav #ifdef __cplusplus
1737b5038d7SDag-Erling Smørgrav }
1747b5038d7SDag-Erling Smørgrav #endif
1757b5038d7SDag-Erling Smørgrav 
1767b5038d7SDag-Erling Smørgrav #endif /* LDNS_ZONE_H */
177