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