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 fseek(in, -7, SEEK_CUR);
93 ods_log_debug(
"[%s] \'%s\' does not match \'%s\'", backup_str, p, str);
109 ods_log_debug(
"[%s] cannot read string", backup_str);
126 ods_log_debug(
"[%s] cannot read time", backup_str);
143 ods_log_debug(
"[%s] cannot read duration", backup_str);
146 if (!strcmp(p,
"jitter")) {
147 fseek(in, -7, SEEK_CUR);
150 *v=duration_create_from_string((
const char*) p);
164 ods_log_debug(
"[%s] cannot read rr type", backup_str);
167 *v=(ldns_rr_type) atoi(p);
181 ods_log_debug(
"[%s] cannot read integer", backup_str);
198 ods_log_debug(
"[%s] cannot read uint8_t", backup_str);
201 *v= (uint8_t)atoi(p);
215 ods_log_debug(
"[%s] cannot read uint32_t", backup_str);
218 *v= (uint32_t)atol(p);
228 backup_read_rr(FILE* in,
zone_type* zone,
char* line, ldns_rdf** orig,
229 ldns_rdf** prev, ldns_status* status,
unsigned int* l)
239 *status = LDNS_STATUS_OK;
244 goto backup_read_line;
248 *status = ldns_rr_new_frm_str(&rr, line, zone->
default_ttl,
250 if (*status == LDNS_STATUS_OK) {
252 }
else if (*status == LDNS_STATUS_SYNTAX_EMPTY) {
257 *status = LDNS_STATUS_OK;
258 goto backup_read_line;
261 ods_log_error(
"[%s] error parsing RR #%i (%s): %s",
262 backup_str, l&&*l?*l:0,
263 ldns_get_errorstr_by_id(*status), line);
274 *status = LDNS_STATUS_OK;
284 replace_space_with_nul(
char* str)
311 ods_status result = ODS_STATUS_OK;
312 ldns_rr_type type_covered;
314 ldns_rdf* prev = NULL;
315 ldns_rdf* orig = NULL;
316 ldns_rdf* dname = NULL;
317 ldns_status status = LDNS_STATUS_OK;
320 char* locator = NULL;
330 ods_log_error(
"[%s] error getting default value for $ORIGIN",
332 return ODS_STATUS_ERR;
334 orig = ldns_rdf_clone(dname);
336 ods_log_error(
"[%s] error setting default value for $ORIGIN",
338 return ODS_STATUS_ERR;
341 ods_log_debug(
"[%s] read RRs %s", backup_str, z->
name);
342 while ((rr = backup_read_rr(in, z, line, &orig, &prev, &status, &l))
345 if (status != LDNS_STATUS_OK) {
346 ods_log_error(
"[%s] error reading RR #%i (%s): %s",
347 backup_str, l, ldns_get_errorstr_by_id(status), line);
348 result = ODS_STATUS_ERR;
349 goto backup_namedb_done;
353 if (result == ODS_STATUS_UNCHANGED) {
354 ods_log_debug(
"[%s] skipping RR #%i (duplicate): %s",
355 backup_str, l, line);
358 result = ODS_STATUS_OK;
360 }
else if (result != ODS_STATUS_OK) {
361 ods_log_error(
"[%s] error adding RR #%i: %s",
362 backup_str, l, line);
365 goto backup_namedb_done;
368 if (result == ODS_STATUS_OK && status != LDNS_STATUS_OK) {
369 ods_log_error(
"[%s] error reading RR #%i (%s): %s",
370 backup_str, l, ldns_get_errorstr_by_id(status), line);
371 result = ODS_STATUS_ERR;
372 goto backup_namedb_done;
377 ods_log_debug(
"[%s] read NSEC(3)s %s", backup_str, z->
name);
379 while ((rr = backup_read_rr(in, z, line, &orig, &prev, &status, &l))
382 if (status != LDNS_STATUS_OK) {
383 ods_log_error(
"[%s] error reading NSEC(3) #%i (%s): %s",
384 backup_str, l, ldns_get_errorstr_by_id(status), line);
385 result = ODS_STATUS_ERR;
386 goto backup_namedb_done;
388 if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_NSEC &&
389 ldns_rr_get_type(rr) != LDNS_RR_TYPE_NSEC3) {
390 ods_log_error(
"[%s] error NSEC(3) #%i is not NSEC(3): %s",
391 backup_str, l, line);
394 result = ODS_STATUS_ERR;
395 goto backup_namedb_done;
400 ods_log_error(
"[%s] error adding NSEC(3) #%i: %s",
401 backup_str, l, line);
404 result = ODS_STATUS_ERR;
405 goto backup_namedb_done;
409 if (result == ODS_STATUS_OK && status != LDNS_STATUS_OK) {
410 ods_log_error(
"[%s] error reading NSEC(3) #%i (%s): %s",
411 backup_str, l, ldns_get_errorstr_by_id(status), line);
412 result = ODS_STATUS_ERR;
413 goto backup_namedb_done;
417 ods_log_debug(
"[%s] read RRSIGs %s", backup_str, z->
name);
419 while ((rr = backup_read_rr(in, z, line, &orig, &prev, &status, &l))
422 if (status != LDNS_STATUS_OK) {
423 ods_log_error(
"[%s] error reading RRSIG #%i (%s): %s",
424 backup_str, l, ldns_get_errorstr_by_id(status), line);
425 result = ODS_STATUS_ERR;
426 goto backup_namedb_done;
428 if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) {
429 ods_log_error(
"[%s] error RRSIG #%i is not RRSIG: %s",
430 backup_str, l, line);
433 result = ODS_STATUS_ERR;
434 goto backup_namedb_done;
437 str = strstr(line,
"flags");
439 flags = (uint32_t) atoi(str+6);
441 str = strstr(line,
"locator");
443 locator = replace_space_with_nul(str+8);
446 type_covered = ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(rr));
447 if (type_covered == LDNS_RR_TYPE_NSEC ||
448 type_covered == LDNS_RR_TYPE_NSEC3) {
451 ods_log_error(
"[%s] error restoring RRSIG #%i (%s): %s",
452 backup_str, l, ldns_get_errorstr_by_id(status), line);
455 result = ODS_STATUS_ERR;
456 goto backup_namedb_done;
458 rrset = denial->
rrset;
463 ods_log_error(
"[%s] error restoring RRSIG #%i (%s): %s",
464 backup_str, l, ldns_get_errorstr_by_id(status), line);
467 result = ODS_STATUS_ERR;
468 goto backup_namedb_done;
474 if (result == ODS_STATUS_OK && status != LDNS_STATUS_OK) {
475 ods_log_error(
"[%s] error reading RRSIG #%i (%s): %s",
476 backup_str, l, ldns_get_errorstr_by_id(status), line);
477 result = ODS_STATUS_ERR;
482 ldns_rdf_deep_free(orig);
486 ldns_rdf_deep_free(prev);
504 ods_status result = ODS_STATUS_OK;
506 ldns_rdf* prev = NULL;
507 ldns_rdf* orig = NULL;
508 ldns_rdf* dname = NULL;
509 ldns_status status = LDNS_STATUS_OK;
513 unsigned first_soa = 0;
514 unsigned del_mode = 0;
522 ods_log_error(
"[%s] error getting default value for $ORIGIN",
524 return ODS_STATUS_ERR;
526 orig = ldns_rdf_clone(dname);
528 ods_log_error(
"[%s] error setting default value for $ORIGIN",
530 return ODS_STATUS_ERR;
533 while ((rr = backup_read_rr(in, z, line, &orig, &prev, &status, &l))
536 if (status != LDNS_STATUS_OK) {
537 ods_log_error(
"[%s] error reading RR #%i (%s): %s",
538 backup_str, l, ldns_get_errorstr_by_id(status), line);
539 result = ODS_STATUS_ERR;
540 goto backup_ixfr_done;
542 if (first_soa == 2) {
543 ods_log_error(
"[%s] bad ixfr journal: trailing RRs after final " 547 result = ODS_STATUS_ERR;
548 goto backup_ixfr_done;
550 if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) {
551 serial = ldns_rdf2native_int32(
552 ldns_rr_rdf(rr, SE_SOA_RDATA_SERIAL));
554 ods_log_debug(
"[%s] ixfr first SOA: %s", backup_str,
560 ods_log_error(
"[%s] bad ixfr journal: first SOA wrong " 561 "serial (was %u, expected %u)", backup_str,
563 result = ODS_STATUS_ERR;
564 goto backup_ixfr_done;
569 ods_log_assert(first_soa);
573 ods_log_debug(
"[%s] ixfr final SOA: %s", backup_str,
577 result = ODS_STATUS_OK;
581 ods_log_debug(
"[%s] new part SOA: %s", backup_str,
588 ods_log_debug(
"[%s] second part SOA: %s", backup_str,
591 del_mode = !del_mode;
595 ods_log_error(
"[%s] bad ixfr journal: first RR not SOA",
599 result = ODS_STATUS_ERR;
600 goto backup_ixfr_done;
602 ods_log_assert(first_soa);
605 ods_log_deeebug(
"[%s] -IXFR: %s", backup_str, ldns_rr2str(rr));
608 ods_log_deeebug(
"[%s] +IXFR: %s", backup_str, ldns_rr2str(rr));
613 if (result == ODS_STATUS_OK && status != LDNS_STATUS_OK) {
614 ods_log_error(
"[%s] error reading RR #%i (%s): %s",
615 backup_str, l, ldns_get_errorstr_by_id(status), line);
616 result = ODS_STATUS_ERR;
621 ldns_rdf_deep_free(orig);
625 ldns_rdf_deep_free(prev);
int backup_read_str(FILE *in, const char **str)
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)
lock_basic_type ixfr_lock
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)
int adutil_readline_frm_file(FILE *fd, char *line, unsigned int *l, int keep_comments)
void ixfr_purge(ixfr_type *ixfr)
denial_type * namedb_lookup_denial(namedb_type *db, ldns_rdf *dname)
int backup_read_uint32_t(FILE *in, uint32_t *v)