43 #include <ldns/ldns.h> 45 static const char* backup_str =
"backup";
55 static char buf[4000];
59 if (fscanf(in,
"%3990s", buf) != 1) {
65 if (!fgets(buf,
sizeof(buf), in)) {
81 ods_log_debug(
"[%s] cannot read check string \'%s\'", backup_str, str);
84 if (ods_strcmp(p, str) != 0) {
85 if (!strcmp(p,
"rfc5011") && !strcmp(str,
"keytag")) {
88 if (!strcmp(p,
"jitter") && !strcmp(str,
"keyset")) {
89 return fseek(in, -7, SEEK_CUR) == 0;
92 ods_log_debug(
"[%s] \'%s\' does not match \'%s\'", backup_str, p, str);
108 ods_log_debug(
"[%s] cannot read string", backup_str);
125 ods_log_debug(
"[%s] cannot read time", backup_str);
142 ods_log_debug(
"[%s] cannot read duration", backup_str);
145 if (!strcmp(p,
"jitter")) {
146 return fseek(in, -7, SEEK_CUR) == 0;
148 *v=duration_create_from_string((
const char*) p);
162 ods_log_debug(
"[%s] cannot read rr type", backup_str);
165 *v=(ldns_rr_type) atoi(p);
179 ods_log_debug(
"[%s] cannot read integer", backup_str);
196 ods_log_debug(
"[%s] cannot read uint8_t", backup_str);
199 *v= (uint8_t)atoi(p);
213 ods_log_debug(
"[%s] cannot read uint32_t", backup_str);
216 *v= (uint32_t)atol(p);
226 backup_read_rr(FILE* in,
zone_type* zone,
char* line, ldns_rdf** orig,
227 ldns_rdf** prev, ldns_status* status,
unsigned int* l)
237 *status = LDNS_STATUS_OK;
242 goto backup_read_line;
246 *status = ldns_rr_new_frm_str(&rr, line, zone->
default_ttl,
248 if (*status == LDNS_STATUS_OK) {
250 }
else if (*status == LDNS_STATUS_SYNTAX_EMPTY) {
255 *status = LDNS_STATUS_OK;
256 goto backup_read_line;
259 ods_log_error(
"[%s] error parsing RR #%i (%s): %s",
260 backup_str, l&&*l?*l:0,
261 ldns_get_errorstr_by_id(*status), line);
272 *status = LDNS_STATUS_OK;
282 replace_space_with_nul(
char* str)
309 ods_status result = ODS_STATUS_OK;
310 ldns_rr_type type_covered;
312 ldns_rdf* prev = NULL;
313 ldns_rdf* orig = NULL;
314 ldns_rdf* dname = NULL;
315 ldns_status status = LDNS_STATUS_OK;
318 char* locator = NULL;
328 ods_log_error(
"[%s] error getting default value for $ORIGIN",
330 return ODS_STATUS_ERR;
332 orig = ldns_rdf_clone(dname);
334 ods_log_error(
"[%s] error setting default value for $ORIGIN",
336 return ODS_STATUS_ERR;
339 ods_log_debug(
"[%s] read RRs %s", backup_str, z->
name);
340 while ((rr = backup_read_rr(in, z, line, &orig, &prev, &status, &l))
343 if (status != LDNS_STATUS_OK) {
344 ods_log_error(
"[%s] error reading RR #%i (%s): %s",
345 backup_str, l, ldns_get_errorstr_by_id(status), line);
346 result = ODS_STATUS_ERR;
347 goto backup_namedb_done;
351 if (result == ODS_STATUS_UNCHANGED) {
352 ods_log_debug(
"[%s] skipping RR #%i (duplicate): %s",
353 backup_str, l, line);
356 result = ODS_STATUS_OK;
358 }
else if (result != ODS_STATUS_OK) {
359 ods_log_error(
"[%s] error adding RR #%i: %s",
360 backup_str, l, line);
363 goto backup_namedb_done;
366 if (result == ODS_STATUS_OK && status != LDNS_STATUS_OK) {
367 ods_log_error(
"[%s] error reading RR #%i (%s): %s",
368 backup_str, l, ldns_get_errorstr_by_id(status), line);
369 result = ODS_STATUS_ERR;
370 goto backup_namedb_done;
375 ods_log_debug(
"[%s] read NSEC(3)s %s", backup_str, z->
name);
377 while ((rr = backup_read_rr(in, z, line, &orig, &prev, &status, &l))
380 if (status != LDNS_STATUS_OK) {
381 ods_log_error(
"[%s] error reading NSEC(3) #%i (%s): %s",
382 backup_str, l, ldns_get_errorstr_by_id(status), line);
383 result = ODS_STATUS_ERR;
384 goto backup_namedb_done;
386 if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_NSEC &&
387 ldns_rr_get_type(rr) != LDNS_RR_TYPE_NSEC3) {
388 ods_log_error(
"[%s] error NSEC(3) #%i is not NSEC(3): %s",
389 backup_str, l, line);
392 result = ODS_STATUS_ERR;
393 goto backup_namedb_done;
398 ods_log_error(
"[%s] error adding NSEC(3) #%i: %s",
399 backup_str, l, line);
402 result = ODS_STATUS_ERR;
403 goto backup_namedb_done;
407 if (result == ODS_STATUS_OK && status != LDNS_STATUS_OK) {
408 ods_log_error(
"[%s] error reading NSEC(3) #%i (%s): %s",
409 backup_str, l, ldns_get_errorstr_by_id(status), line);
410 result = ODS_STATUS_ERR;
411 goto backup_namedb_done;
415 ods_log_debug(
"[%s] read RRSIGs %s", backup_str, z->
name);
417 while ((rr = backup_read_rr(in, z, line, &orig, &prev, &status, &l))
420 if (status != LDNS_STATUS_OK) {
421 ods_log_error(
"[%s] error reading RRSIG #%i (%s): %s",
422 backup_str, l, ldns_get_errorstr_by_id(status), line);
423 result = ODS_STATUS_ERR;
424 goto backup_namedb_done;
426 if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) {
427 ods_log_error(
"[%s] error RRSIG #%i is not RRSIG: %s",
428 backup_str, l, line);
431 result = ODS_STATUS_ERR;
432 goto backup_namedb_done;
435 str = strstr(line,
"flags");
437 flags = (uint32_t) atoi(str+6);
439 str = strstr(line,
"locator");
441 locator = replace_space_with_nul(str+8);
444 type_covered = ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(rr));
445 if (type_covered == LDNS_RR_TYPE_NSEC ||
446 type_covered == LDNS_RR_TYPE_NSEC3) {
449 ods_log_error(
"[%s] error restoring RRSIG #%i (%s): %s",
450 backup_str, l, ldns_get_errorstr_by_id(status), line);
453 result = ODS_STATUS_ERR;
454 goto backup_namedb_done;
456 rrset = denial->
rrset;
461 ods_log_error(
"[%s] error restoring RRSIG #%i (%s): %s",
462 backup_str, l, ldns_get_errorstr_by_id(status), line);
465 result = ODS_STATUS_ERR;
466 goto backup_namedb_done;
472 if (result == ODS_STATUS_OK && status != LDNS_STATUS_OK) {
473 ods_log_error(
"[%s] error reading RRSIG #%i (%s): %s",
474 backup_str, l, ldns_get_errorstr_by_id(status), line);
475 result = ODS_STATUS_ERR;
480 ldns_rdf_deep_free(orig);
484 ldns_rdf_deep_free(prev);
502 ods_status result = ODS_STATUS_OK;
504 ldns_rdf* prev = NULL;
505 ldns_rdf* orig = NULL;
506 ldns_rdf* dname = NULL;
507 ldns_status status = LDNS_STATUS_OK;
512 unsigned first_soa = 0;
513 unsigned del_mode = 0;
521 ods_log_error(
"[%s] error getting default value for $ORIGIN",
523 return ODS_STATUS_ERR;
525 orig = ldns_rdf_clone(dname);
527 ods_log_error(
"[%s] error setting default value for $ORIGIN",
529 return ODS_STATUS_ERR;
532 while ((rr = backup_read_rr(in, z, line, &orig, &prev, &status, &l))
535 if (status != LDNS_STATUS_OK) {
536 ods_log_error(
"[%s] error reading RR #%i (%s): %s",
537 backup_str, l, ldns_get_errorstr_by_id(status), line);
538 result = ODS_STATUS_ERR;
539 goto backup_ixfr_done;
541 if (first_soa == 2) {
542 ods_log_error(
"[%s] bad ixfr journal: trailing RRs after final " 546 result = ODS_STATUS_ERR;
547 goto backup_ixfr_done;
549 if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) {
550 serial = ldns_rdf2native_int32(
551 ldns_rr_rdf(rr, SE_SOA_RDATA_SERIAL));
553 str = ldns_rr2str(rr);
554 ods_log_debug(
"[%s] ixfr first SOA: %s", backup_str,
561 ods_log_error(
"[%s] bad ixfr journal: first SOA wrong " 562 "serial (was %u, expected %u)", backup_str,
564 result = ODS_STATUS_ERR;
565 goto backup_ixfr_done;
570 ods_log_assert(first_soa);
574 str = ldns_rr2str(rr);
575 ods_log_debug(
"[%s] ixfr final SOA: %s", backup_str,
580 result = ODS_STATUS_OK;
584 str = ldns_rr2str(rr);
585 ods_log_debug(
"[%s] new part SOA: %s", backup_str,
593 str = ldns_rr2str(rr);
594 ods_log_debug(
"[%s] second part SOA: %s", backup_str,
598 del_mode = !del_mode;
602 ods_log_error(
"[%s] bad ixfr journal: first RR not SOA",
606 result = ODS_STATUS_ERR;
607 goto backup_ixfr_done;
609 ods_log_assert(first_soa);
611 str = ldns_rr2str(rr);
614 ods_log_deeebug(
"[%s] -IXFR: %s", backup_str, str);
617 ods_log_deeebug(
"[%s] +IXFR: %s", backup_str, str);
625 if (result == ODS_STATUS_OK && status != LDNS_STATUS_OK) {
626 ods_log_error(
"[%s] error reading RR #%i (%s): %s",
627 backup_str, l, ldns_get_errorstr_by_id(status), line);
628 result = ODS_STATUS_ERR;
633 ldns_rdf_deep_free(orig);
637 ldns_rdf_deep_free(prev);
int backup_read_str(FILE *in, const char **str)
pthread_mutex_t ixfr_lock
char * backup_read_token(FILE *in)
int backup_read_uint8_t(FILE *in, uint8_t *v)
void rrset_add_rrsig(rrset_type *rrset, ldns_rr *rr, const char *locator, uint32_t flags)
int backup_read_duration(FILE *in, duration_type **v)
void ixfr_add_rr(ixfr_type *ixfr, ldns_rr *rr)
int backup_read_rr_type(FILE *in, ldns_rr_type *v)
void ixfr_del_rr(ixfr_type *ixfr, ldns_rr *rr)
int backup_read_time_t(FILE *in, time_t *v)
int backup_read_int(FILE *in, int *v)
void namedb_diff(namedb_type *db, unsigned is_ixfr, unsigned more_coming)
ods_status backup_read_ixfr(FILE *in, void *zone)
ods_status backup_read_namedb(FILE *in, void *zone)
ldns_rdf * adapi_get_origin(zone_type *zone)
void denial_add_rr(denial_type *denial, ldns_rr *rr)
rrset_type * zone_lookup_rrset(zone_type *zone, ldns_rdf *owner, ldns_rr_type type)
ods_status adapi_add_rr(zone_type *zone, ldns_rr *rr, int backup)
#define SE_ADFILE_MAXLINE
int backup_read_check_str(FILE *in, const char *str)
void ixfr_purge(ixfr_type *ixfr, char const *zonename)
int adutil_readline_frm_file(FILE *fd, char *line, unsigned int *l, int keep_comments)
denial_type * namedb_lookup_denial(namedb_type *db, ldns_rdf *dname)
int backup_read_uint32_t(FILE *in, uint32_t *v)