44 #include <ldns/ldns.h>
48 static const char* adapter_str =
"adapter";
57 adfile_read_rr(FILE* fd,
zone_type* zone,
char* line, ldns_rdf** orig,
58 ldns_rdf** prev, uint32_t* ttl, ldns_status* status,
unsigned int* l)
62 FILE* fd_include = NULL;
79 if (strncmp(line,
"$ORIGIN", 7) == 0 && isspace((
int)line[7])) {
82 ldns_rdf_deep_free(*orig);
86 while (isspace((
int)line[offset])) {
89 tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME,
93 *status = LDNS_STATUS_SYNTAX_DNAME_ERR;
98 goto adfile_read_line;
100 }
else if (strncmp(line,
"$TTL", 4) == 0 &&
101 isspace((
int)line[4])) {
104 while (isspace((
int)line[offset])) {
108 *ttl = ldns_str2period(line + offset, &endptr);
111 goto adfile_read_line;
113 }
else if (strncmp(line,
"$INCLUDE", 8) == 0 &&
114 isspace((
int)line[8])) {
117 while (isspace((
int)line[offset])) {
120 fd_include =
ods_fopen(line + offset, NULL,
"r");
122 s = adfile_read_file(fd_include, zone);
126 adapter_str, (line+offset));
127 *status = LDNS_STATUS_SYNTAX_ERR;
131 *status = LDNS_STATUS_SYNTAX_ERR;
133 adapter_str, (line+offset));
140 goto adfile_read_line;
148 goto adfile_read_line;
154 goto adfile_read_line;
157 *status = ldns_rr_new_frm_str(&rr, line, new_ttl, *orig, prev);
158 if (*status == LDNS_STATUS_OK) {
160 }
else if (*status == LDNS_STATUS_SYNTAX_EMPTY) {
165 *status = LDNS_STATUS_OK;
166 goto adfile_read_line;
170 adapter_str, l&&*l?*l:0,
171 ldns_get_errorstr_by_id(*status), line);
185 *status = LDNS_STATUS_OK;
195 adfile_read_file(FILE* fd,
zone_type* zone)
199 ldns_rdf* prev = NULL;
200 ldns_rdf* orig = NULL;
201 ldns_rdf* dname = NULL;
203 uint32_t new_serial = 0;
204 ldns_status status = LDNS_STATUS_OK;
206 unsigned int line_update_interval = 100000;
207 unsigned int line_update = line_update_interval;
216 ods_log_error(
"[%s] error getting default value for $ORIGIN",
220 orig = ldns_rdf_clone(dname);
222 ods_log_error(
"[%s] error setting default value for $ORIGIN",
229 while ((rr = adfile_read_rr(fd, zone, line, &orig, &prev, &ttl,
230 &status, &l)) != NULL) {
232 if (status != LDNS_STATUS_OK) {
234 adapter_str, l, ldns_get_errorstr_by_id(status), line);
239 if (l > line_update) {
240 ods_log_debug(
"[%s] ...at line %i: %s", adapter_str, l, line);
241 line_update += line_update_interval;
244 if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) {
252 adapter_str, l, line);
259 adapter_str, l, line);
267 ldns_rdf_deep_free(orig);
271 ldns_rdf_deep_free(prev);
276 adapter_str, l, ldns_get_errorstr_by_id(status), line);
283 ods_log_error(
"[%s] unable to read file: zonefile contains errors",
312 status = adfile_read_file(fd, adzone);
329 char* tmpname = NULL;
335 ods_log_error(
"[%s] unable to write file: no output adapter",
340 ods_log_error(
"[%s] unable to write file: no filename given",
357 ods_log_error(
"[%s] unable to write zone %s file %s: one or "
358 "more RR print failed", adapter_str, adzone->
name,
370 if (rename((
const char*) tmpname, filename) != 0) {
371 ods_log_error(
"[%s] unable to write file: failed to rename %s "
372 "to %s (%s)", adapter_str, tmpname, filename, strerror(errno));