40 #include <ldns/ldns.h>
42 static const char* adapi_str =
"adapter";
52 if (!zone || !zone->
db) {
66 if (!zone || !zone->
db) {
110 uint32_t num_added = 0;
111 if (!zone || !zone->
db) {
147 uint32_t num_added = 0;
148 if (!zone || !zone->
db) {
180 adapi_process_soa(
zone_type* zone, ldns_rr* rr,
int add,
int backup)
183 ldns_rdf* soa_rdata = NULL;
184 ods_status status = ODS_STATUS_OK;
187 ods_log_assert(zone);
188 ods_log_assert(zone->
name);
193 return ODS_STATUS_OK;
197 ods_log_verbose(
"[%s] zone %s set soa ttl to %u",
198 adapi_str, zone->
name, tmp);
199 ldns_rr_set_ttl(rr, tmp);
203 ods_log_verbose(
"[%s] zone %s set soa minimum to %u",
204 adapi_str, zone->
name, tmp);
205 soa_rdata = ldns_rr_set_rdf(rr,
206 ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, tmp),
207 SE_SOA_RDATA_MINIMUM);
209 ldns_rdf_deep_free(soa_rdata);
212 ods_log_error(
"[%s] unable to %s soa to zone %s: failed to replace "
213 "soa minimum rdata", adapi_str, add?
"add":
"delete",
215 return ODS_STATUS_ASSERT_ERR;
220 return ODS_STATUS_OK;
222 tmp = ldns_rdf2native_int32(ldns_rr_rdf(rr, SE_SOA_RDATA_SERIAL));
225 if (status != ODS_STATUS_OK) {
226 ods_log_error(
"[%s] unable to add soa to zone %s: failed to replace "
227 "soa serial rdata (%s)", adapi_str, zone->
name,
228 ods_status2str(status));
229 if (status == ODS_STATUS_CONFLICT_ERR) {
230 ods_log_error(
"[%s] If this is the result of a key rollover, "
231 "please increment the serial in the unsigned zone %s",
232 adapi_str, zone->
name);
236 ods_log_verbose(
"[%s] zone %s set soa serial to %u", adapi_str,
238 soa_rdata = ldns_rr_set_rdf(rr, ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32,
241 ldns_rdf_deep_free(soa_rdata);
244 ods_log_error(
"[%s] unable to add soa to zone %s: failed to replace "
245 "soa serial rdata", adapi_str, zone->
name);
246 return ODS_STATUS_ERR;
249 return ODS_STATUS_OK;
258 adapi_process_dnskey(
zone_type* zone, ldns_rr* rr)
262 ods_log_assert(zone);
263 ods_log_assert(zone->
name);
266 ods_log_verbose(
"[%s] zone %s set dnskey ttl to %u",
267 adapi_str, zone->
name, tmp);
268 ldns_rr_set_ttl(rr, tmp);
277 adapi_process_rr(
zone_type* zone, ldns_rr* rr,
int add,
int backup)
279 ods_status status = ODS_STATUS_OK;
282 ods_log_assert(zone);
283 ods_log_assert(zone->
name);
284 ods_log_assert(zone->
db);
287 if (ldns_rr_get_class(rr) != LDNS_RR_CLASS_IN) {
288 ods_log_warning(
"[%s] only class in is supported, changing class "
290 ldns_rr_set_class(rr, LDNS_RR_CLASS_IN);
293 if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) {
294 if (ldns_dname_compare(ldns_rr_owner(rr), zone->
apex)) {
295 ods_log_error(
"[%s] unable to %s rr to zone: soa record has "
296 "invalid owner name", adapi_str, add?
"add":
"delete");
297 return ODS_STATUS_ERR;
299 status = adapi_process_soa(zone, rr, add, backup);
300 if (status != ODS_STATUS_OK) {
301 ods_log_error(
"[%s] unable to %s rr: failed to process soa "
302 "record", adapi_str, add?
"add":
"delete");
306 if (ldns_dname_compare(ldns_rr_owner(rr), zone->
apex) &&
307 !ldns_dname_is_subdomain(ldns_rr_owner(rr), zone->
apex)) {
308 ods_log_warning(
"[%s] zone %s contains out-of-zone data, "
309 "skipping", adapi_str, zone->
name);
310 return ODS_STATUS_UNCHANGED;
311 }
else if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_DNSKEY) {
312 adapi_process_dnskey(zone, rr);
313 }
else if (util_is_dnssec_rr(rr) && !backup) {
314 ods_log_warning(
"[%s] zone %s contains dnssec data (type=%u), "
315 "skipping", adapi_str, zone->
name,
316 (
unsigned) ldns_rr_get_type(rr));
317 return ODS_STATUS_UNCHANGED;
324 if (tmp && tmp < ldns_rr_ttl(rr)) {
325 char* str = ldns_rdf2str(ldns_rr_owner(rr));
327 str[(strlen(str))-1] =
'\0';
329 for (
int i = 0; i < strlen(str); i++) {
330 if (str[i] ==
'\t') {
334 ods_log_warning(
"[%s] TTL %u exceeds MaxZoneTTL %u for rrset "
335 "<%s,%s>", adapi_str, ldns_rr_ttl(rr), tmp, str,
350 return ODS_STATUS_ERR;
361 return adapi_process_rr(zone, rr, 1, backup);
372 return adapi_process_rr(zone, rr, 0, backup);
383 ods_status status = ODS_STATUS_OK;
384 if (!fd || !zone || !zone->
db) {
385 ods_log_error(
"[%s] unable to print zone: file descriptor, zone or "
386 "name database missing", adapi_str);
387 return ODS_STATUS_ASSERT_ERR;
402 ods_status status = ODS_STATUS_OK;
403 if (!fd || !zone || !zone->
db) {
404 ods_log_error(
"[%s] unable to print axfr: file descriptor, zone or "
405 "name database missing", adapi_str);
406 return ODS_STATUS_ASSERT_ERR;
409 if (status == ODS_STATUS_OK) {
411 ods_log_assert(rrset);
426 ods_status status = ODS_STATUS_OK;
427 if (!fd || !zone || !zone->
db || !zone->
ixfr) {
428 ods_log_error(
"[%s] unable to print ixfr: file descriptor, zone or "
429 "name database missing", adapi_str);
430 return ODS_STATUS_ASSERT_ERR;
434 return ODS_STATUS_OK;
437 ods_log_assert(rrset);
439 if (status != ODS_STATUS_OK) {
void adapi_set_serial(zone_type *zone, uint32_t serial)
ods_status adapi_add_rr(zone_type *zone, ldns_rr *rr, int backup)
void adapi_trans_full(zone_type *zone, unsigned more_coming)
ods_status adapi_printixfr(FILE *fd, zone_type *zone)
ods_status adapi_del_rr(zone_type *zone, ldns_rr *rr, int backup)
ods_status adapi_printzone(FILE *fd, zone_type *zone)
ods_status adapi_printaxfr(FILE *fd, zone_type *zone)
uint32_t adapi_get_serial(zone_type *zone)
uint32_t adapi_get_ttl(zone_type *zone)
ldns_rdf * adapi_get_origin(zone_type *zone)
void adapi_trans_diff(zone_type *zone, unsigned more_coming)
int ixfr_print(FILE *fd, ixfr_type *ixfr)
void namedb_export(FILE *fd, namedb_type *db, ods_status *status)
void namedb_diff(namedb_type *db, unsigned is_ixfr, unsigned more_coming)
ods_status namedb_update_serial(namedb_type *db, const char *zone_name, const char *format, uint32_t inbound_serial)
void namedb_nsecify(namedb_type *db, uint32_t *num_added)
const char * rrset_type2str(ldns_rr_type type)
void rrset_print(FILE *fd, rrset_type *rrset, int skip_rrsigs, ods_status *status)
pthread_mutex_t ixfr_lock
duration_type * dnskey_ttl
duration_type * max_zone_ttl
pthread_mutex_t stats_lock
adapter_type * adoutbound
ods_status zone_add_rr(zone_type *zone, ldns_rr *rr, int do_stats)
ods_status zone_del_rr(zone_type *zone, ldns_rr *rr, int do_stats)
rrset_type * zone_lookup_rrset(zone_type *zone, ldns_rdf *owner, ldns_rr_type type)