dnssec_zone.h
Go to the documentation of this file.
00001 /*
00002  * special zone file structures and functions for better dnssec handling
00003  *
00004  * A zone contains a SOA dnssec_zone_rrset, and an AVL tree of 'normal'
00005  * dnssec_zone_rrsets, indexed by name and type
00006  */
00007 
00008 #ifndef LDNS_DNSSEC_ZONE_H
00009 #define LDNS_DNSSEC_ZONE_H
00010  
00011 #include <ldns/rbtree.h>
00012 #include <ldns/host2str.h>
00013 
00014 #ifdef __cplusplus
00015 extern "C" {
00016 #endif
00017 
00021 typedef struct ldns_struct_dnssec_rrs ldns_dnssec_rrs;
00022 struct ldns_struct_dnssec_rrs
00023 {
00024         ldns_rr *rr;
00025         ldns_dnssec_rrs *next;
00026 };
00027 
00031 typedef struct ldns_struct_dnssec_rrsets ldns_dnssec_rrsets;
00032 struct ldns_struct_dnssec_rrsets
00033 {
00034         ldns_dnssec_rrs *rrs;
00035         ldns_rr_type type;
00036         ldns_dnssec_rrs *signatures;
00037         ldns_dnssec_rrsets *next;
00038 };
00039 
00044 typedef struct ldns_struct_dnssec_name ldns_dnssec_name;
00045 struct ldns_struct_dnssec_name
00046 {
00051         ldns_rdf *name;
00059         bool name_alloced;
00063         ldns_dnssec_rrsets *rrsets;
00067         ldns_rr *nsec;
00071         ldns_dnssec_rrs *nsec_signatures;
00081         bool is_glue;
00085         ldns_rdf *hashed_name;
00086 };
00087 
00091 struct ldns_struct_dnssec_zone {
00093         ldns_dnssec_name *soa;
00095         ldns_rbtree_t *names;
00097         ldns_rbtree_t *hashed_names;
00102         ldns_rr *_nsec3params;
00103 };
00104 typedef struct ldns_struct_dnssec_zone ldns_dnssec_zone;
00105 
00110 ldns_dnssec_rrs *ldns_dnssec_rrs_new(void);
00111 
00118 void ldns_dnssec_rrs_free(ldns_dnssec_rrs *rrs);
00119 
00126 void ldns_dnssec_rrs_deep_free(ldns_dnssec_rrs *rrs);
00127 
00136 ldns_status ldns_dnssec_rrs_add_rr(ldns_dnssec_rrs *rrs, ldns_rr *rr);
00137 
00144 void ldns_dnssec_rrs_print(FILE *out, ldns_dnssec_rrs *rrs);
00145 
00153 void ldns_dnssec_rrs_print_fmt(FILE *out, 
00154                 const ldns_output_format *fmt, ldns_dnssec_rrs *rrs);
00155 
00160 ldns_dnssec_rrsets *ldns_dnssec_rrsets_new(void);
00161 
00168 void ldns_dnssec_rrsets_free(ldns_dnssec_rrsets *rrsets);
00169 
00176 void ldns_dnssec_rrsets_deep_free(ldns_dnssec_rrsets *rrsets);
00177 
00184 ldns_rr_type ldns_dnssec_rrsets_type(ldns_dnssec_rrsets *rrsets);
00185 
00193 ldns_status ldns_dnssec_rrsets_set_type(ldns_dnssec_rrsets *rrsets,
00194                                            ldns_rr_type type);
00195 
00204 ldns_status ldns_dnssec_rrsets_add_rr(ldns_dnssec_rrsets *rrsets, ldns_rr *rr);
00205 
00213 void ldns_dnssec_rrsets_print(FILE *out,
00214                 ldns_dnssec_rrsets *rrsets,
00215                 bool follow);
00216 
00225 void ldns_dnssec_rrsets_print_fmt(FILE *out,
00226                 const ldns_output_format *fmt,
00227                 ldns_dnssec_rrsets *rrsets,
00228                 bool follow);
00229 
00230 
00235 ldns_dnssec_name *ldns_dnssec_name_new(void);
00236 
00242 ldns_dnssec_name *ldns_dnssec_name_new_frm_rr(ldns_rr *rr);
00243 
00250 void ldns_dnssec_name_free(ldns_dnssec_name *name);
00251 
00258 void ldns_dnssec_name_deep_free(ldns_dnssec_name *name);
00259 
00266 ldns_rdf *ldns_dnssec_name_name(ldns_dnssec_name *name);
00267 
00268 
00275 void ldns_dnssec_name_set_name(ldns_dnssec_name *name,
00276                                                  ldns_rdf *dname);
00288 bool ldns_dnssec_name_is_glue(ldns_dnssec_name *name);
00289 
00296 void ldns_dnssec_name_set_nsec(ldns_dnssec_name *name, ldns_rr *nsec);
00297 
00308 int ldns_dnssec_name_cmp(const void *a, const void *b);
00309 
00318 ldns_status ldns_dnssec_name_add_rr(ldns_dnssec_name *name,
00319                                                          ldns_rr *rr);
00320 
00328 ldns_dnssec_rrsets *ldns_dnssec_name_find_rrset(ldns_dnssec_name *name,
00329                                                                            ldns_rr_type type);
00330 
00339 ldns_dnssec_rrsets *ldns_dnssec_zone_find_rrset(ldns_dnssec_zone *zone,
00340                                                                            ldns_rdf *dname,
00341                                                                            ldns_rr_type type);
00342 
00350 void ldns_dnssec_name_print(FILE *out, ldns_dnssec_name *name);
00351 
00360 void ldns_dnssec_name_print_fmt(FILE *out, 
00361                 const ldns_output_format *fmt, ldns_dnssec_name *name);
00362 
00367 ldns_dnssec_zone *ldns_dnssec_zone_new(void);
00368 
00379 ldns_status ldns_dnssec_zone_new_frm_fp(ldns_dnssec_zone** z, FILE* fp,
00380                 ldns_rdf* origin, uint32_t ttl, ldns_rr_class c);
00381 
00393 ldns_status ldns_dnssec_zone_new_frm_fp_l(ldns_dnssec_zone** z, FILE* fp,
00394                 ldns_rdf* origin, uint32_t ttl, ldns_rr_class c, int* line_nr);
00395 
00401 void ldns_dnssec_zone_free(ldns_dnssec_zone *zone);
00402 
00408 void ldns_dnssec_zone_deep_free(ldns_dnssec_zone *zone);
00409 
00420 ldns_status ldns_dnssec_zone_add_rr(ldns_dnssec_zone *zone,
00421                                                          ldns_rr *rr);
00422 
00430 void ldns_dnssec_zone_names_print(FILE *out, ldns_rbtree_t *tree, bool print_soa);
00431 
00440 void ldns_dnssec_zone_names_print_fmt(FILE *out, const ldns_output_format *fmt,
00441                 ldns_rbtree_t *tree, bool print_soa);
00442 
00449 void ldns_dnssec_zone_print(FILE *out, ldns_dnssec_zone *zone);
00450 
00458 void ldns_dnssec_zone_print_fmt(FILE *out, 
00459                 const ldns_output_format *fmt, ldns_dnssec_zone *zone);
00460 
00468 ldns_status ldns_dnssec_zone_add_empty_nonterminals(ldns_dnssec_zone *zone);
00469 
00477 bool ldns_dnssec_zone_is_nsec3_optout(ldns_dnssec_zone* zone);
00478 
00479 #ifdef __cplusplus
00480 }
00481 #endif
00482 
00483 #endif