OpenDNSSEC-signer 2.1.13
axfr.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011 NLNet Labs. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
19 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
21 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
22 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
23 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 *
25 */
26
32#include "config.h"
33#include "adapter/addns.h"
34#include "adapter/adutil.h"
35#include "file.h"
36#include "util.h"
37#include "wire/axfr.h"
38#include "wire/buffer.h"
39#include "wire/edns.h"
40#include "wire/query.h"
41#include "wire/sock.h"
42
43#define AXFR_TSIG_SIGN_EVERY_NTH 96 /* tsig sign every N packets. */
44
45const char* axfr_str = "axfr";
46
47
54{
55 char* xfrfile = NULL;
56 ldns_rr* rr = NULL;
57 ldns_rdf* prev = NULL;
58 ldns_rdf* orig = NULL;
59 uint32_t ttl = 0;
60 time_t expire = 0;
61 ldns_status status = LDNS_STATUS_OK;
62 char line[SE_ADFILE_MAXLINE];
63 unsigned l = 0;
64 FILE* fd = NULL;
65 ods_log_assert(q);
66 ods_log_assert(q->buffer);
67 ods_log_assert(q->zone);
68 ods_log_assert(q->zone->name);
69 ods_log_assert(engine);
70 xfrfile = ods_build_path(q->zone->name, ".axfr", 0, 1);
71 if (xfrfile) {
72 fd = ods_fopen(xfrfile, NULL, "r");
73 }
74 if (!fd) {
75 ods_log_error("[%s] unable to open file %s for zone %s",
76 axfr_str, xfrfile, q->zone->name);
77 free((void*)xfrfile);
78 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
79 return QUERY_PROCESSED;
80 }
81 free((void*)xfrfile);
82 if (q->tsig_rr->status == TSIG_OK) {
83 q->tsig_sign_it = 1; /* sign first packet in stream */
84 }
85 /* compression? */
86
87 /* add SOA RR */
88 rr = addns_read_rr(fd, line, &orig, &prev, &ttl, &status, &l);
89 if (!rr) {
90 /* no SOA no transfer */
91 ods_log_error("[%s] bad axfr zone %s, corrupted file", axfr_str,
92 q->zone->name);
93 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
94 ods_fclose(fd);
95 return QUERY_PROCESSED;
96 }
97 /* first RR must be SOA */
98 if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_SOA) {
99 ods_log_error("[%s] bad axfr zone %s, first rr is not soa",
100 axfr_str, q->zone->name);
101 ldns_rr_free(rr);
102 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
103 ods_fclose(fd);
104 return QUERY_PROCESSED;
105 }
106 /* zone not expired? */
107 if (q->zone->xfrd) {
108 expire = q->zone->xfrd->serial_xfr_acquired;
109 expire += ldns_rdf2native_int32(ldns_rr_rdf(rr, SE_SOA_RDATA_EXPIRE));
110 if (expire < time_now()) {
111 ods_log_warning("[%s] zone %s expired at %lld, and it is now %lld: "
112 "not serving soa", axfr_str, q->zone->name, (long long)expire, (long long)time_now());
113 ldns_rr_free(rr);
114 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
115 ods_fclose(fd);
116 return QUERY_PROCESSED;
117 }
118 }
119 /* does it fit? */
120 if (query_add_rr(q, rr)) {
121 ods_log_debug("[%s] set soa in response %s", axfr_str,
122 q->zone->name);
124 ldns_rr_free(rr);
125 rr = NULL;
126 } else {
127 ods_log_error("[%s] soa does not fit in response %s",
128 axfr_str, q->zone->name);
129 ldns_rr_free(rr);
130 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
131 ods_fclose(fd);
132 return QUERY_PROCESSED;
133 }
134 ods_fclose(fd);
139 /* check if it needs TSIG signatures */
140 if (q->tsig_rr->status == TSIG_OK) {
141 q->tsig_sign_it = 1;
142 }
143 return QUERY_PROCESSED;
144}
145
146
152axfr(query_type* q, engine_type* engine, int fallback)
153{
154 char* xfrfile = NULL;
155 ldns_rr* rr = NULL;
156 ldns_rdf* prev = NULL;
157 ldns_rdf* orig = NULL;
158 uint16_t total_added = 0;
159 uint32_t ttl = 0;
160 time_t expire = 0;
161 ldns_status status = LDNS_STATUS_OK;
162 char line[SE_ADFILE_MAXLINE];
163 unsigned l = 0;
164 long fpos = 0;
165 size_t bufpos = 0;
166 ods_log_assert(q);
167 ods_log_assert(q->buffer);
168 ods_log_assert(q->zone);
169 ods_log_assert(q->zone->name);
170 ods_log_assert(engine);
171 if (q->axfr_is_done) {
172 ods_log_debug("[%s] zone transfer %s completed", axfr_str,
173 q->zone->name);
174 return QUERY_PROCESSED;
175 }
176 if (q->maxlen > AXFR_MAX_MESSAGE_LEN) {
178 }
179
180 /* prepare TSIG */
181 if (!fallback) {
182 q->tsig_prepare_it = 0;
183 q->tsig_update_it = 1;
184 if (q->tsig_sign_it) {
185 q->tsig_prepare_it = 1;
186 q->tsig_sign_it = 0;
187 }
188 }
189 ods_log_assert(q->tsig_rr);
190 if (q->axfr_fd == NULL) {
191 /* start AXFR */
192 xfrfile = ods_build_path(q->zone->name, ".axfr", 0, 1);
193 if (xfrfile) {
194 q->axfr_fd = ods_fopen(xfrfile, NULL, "r");
195 }
196 if (!q->axfr_fd) {
197 ods_log_error("[%s] unable to open axfr file %s for zone %s",
198 axfr_str, xfrfile, q->zone->name);
199 free((void*)xfrfile);
200 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
201 return QUERY_PROCESSED;
202 }
203 free((void*)xfrfile);
204 if (q->tsig_rr->status == TSIG_OK) {
205 q->tsig_sign_it = 1; /* sign first packet in stream */
206 }
207 /* compression? */
208
209 /* add SOA RR */
210 fpos = ftell(q->axfr_fd);
211 if (fpos < 0) {
212 ods_log_error("[%s] unable to read axfr for zone %s: "
213 "ftell() failed (%s)", axfr_str, q->zone->name,
214 strerror(errno));
215 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
216 return QUERY_PROCESSED;
217 }
218 rr = addns_read_rr(q->axfr_fd, line, &orig, &prev, &ttl, &status,
219 &l);
220 if (!rr) {
221 /* no SOA no transfer */
222 ods_log_error("[%s] bad axfr zone %s, corrupted file",
223 axfr_str, q->zone->name);
224 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
225 ods_fclose(q->axfr_fd);
226 q->axfr_fd = NULL;
227 return QUERY_PROCESSED;
228 }
229 /* first RR must be SOA */
230 if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_SOA) {
231 ods_log_error("[%s] bad axfr zone %s, first rr is not soa",
232 axfr_str, q->zone->name);
233 ldns_rr_free(rr);
234 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
235 ods_fclose(q->axfr_fd);
236 q->axfr_fd = NULL;
237 return QUERY_PROCESSED;
238 }
239 /* zone not expired? */
240 if (q->zone->xfrd) {
241 expire = q->zone->xfrd->serial_xfr_acquired;
242 expire += ldns_rdf2native_int32(ldns_rr_rdf(rr, SE_SOA_RDATA_EXPIRE));
243 if (expire < time_now()) {
244 ods_log_warning("[%s] zone %s expired, not transferring zone",
245 axfr_str, q->zone->name);
246 ldns_rr_free(rr);
247 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
248 ods_fclose(q->axfr_fd);
249 q->axfr_fd = NULL;
250 return QUERY_PROCESSED;
251 }
252 }
253 /* does it fit? */
254 if (query_add_rr(q, rr)) {
255 ods_log_debug("[%s] set soa in axfr zone %s", axfr_str,
256 q->zone->name);
258 total_added++;
259 ldns_rr_free(rr);
260 rr = NULL;
261 bufpos = buffer_position(q->buffer);
262 } else {
263 ods_log_error("[%s] soa does not fit in axfr zone %s",
264 axfr_str, q->zone->name);
265 ldns_rr_free(rr);
266 rr = NULL;
267 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
268 ods_fclose(q->axfr_fd);
269 q->axfr_fd = NULL;
270 return QUERY_PROCESSED;
271 }
272 } else if (q->tcp) {
273 /* subsequent AXFR packets */
274 ods_log_debug("[%s] subsequent axfr packet zone %s", axfr_str,
275 q->zone->name);
279 query_prepare(q);
280 }
281 /* add as many records as fit */
282 fpos = ftell(q->axfr_fd);
283 if (fpos < 0) {
284 ods_log_error("[%s] unable to read axfr for zone %s: "
285 "ftell() failed (%s)", axfr_str, q->zone->name,
286 strerror(errno));
287 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
288 ods_fclose(q->axfr_fd);
289 q->axfr_fd = NULL;
290 return QUERY_PROCESSED;
291 }
292 while ((rr = addns_read_rr(q->axfr_fd, line, &orig, &prev, &ttl,
293 &status, &l)) != NULL) {
294 ods_log_deeebug("[%s] read rr at line %d", axfr_str, l);
295 if (status != LDNS_STATUS_OK) {
296 ldns_rr_free(rr);
297 rr = NULL;
298 ods_log_error("[%s] error reading rr at line %i (%s): %s",
299 axfr_str, l, ldns_get_errorstr_by_id(status), line);
300 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
301 ods_fclose(q->axfr_fd);
302 q->axfr_fd = NULL;
303 return QUERY_PROCESSED;
304 }
305 /* does it fit? */
306 if (query_add_rr(q, rr)) {
307 ods_log_deeebug("[%s] add rr at line %d", axfr_str, l);
308 ldns_rr_free(rr);
309 rr = NULL;
310 fpos = ftell(q->axfr_fd);
311 if (fpos < 0) {
312 ods_log_error("[%s] unable to read axfr for zone %s: "
313 "ftell() failed (%s)", axfr_str, q->zone->name,
314 strerror(errno));
315 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
316 ods_fclose(q->axfr_fd);
317 q->axfr_fd = NULL;
318 return QUERY_PROCESSED;
319 }
321 total_added++;
322 } else {
323 ods_log_deeebug("[%s] rr at line %d does not fit", axfr_str, l);
324 ldns_rr_free(rr);
325 rr = NULL;
326 if (fseek(q->axfr_fd, fpos, SEEK_SET) != 0) {
327 ods_log_error("[%s] unable to reset file position in axfr "
328 "file: fseek() failed (%s)", axfr_str, strerror(errno));
329 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
330 ods_fclose(q->axfr_fd);
331 q->axfr_fd = NULL;
332 return QUERY_PROCESSED;
333 } else if (q->tcp) {
334 goto return_axfr;
335 } else {
336 goto udp_overflow;
337 }
338 }
339 }
340 ods_log_debug("[%s] axfr zone %s is done", axfr_str, q->zone->name);
341 q->tsig_sign_it = 1; /* sign last packet */
342 q->axfr_is_done = 1;
343 ods_fclose(q->axfr_fd);
344 q->axfr_fd = NULL;
345
346return_axfr:
347 if (q->tcp) {
348 ods_log_debug("[%s] return part axfr zone %s", axfr_str,
349 q->zone->name);
351 buffer_pkt_set_ancount(q->buffer, total_added);
354 /* check if it needs TSIG signatures */
355 if (q->tsig_rr->status == TSIG_OK) {
358 q->tsig_sign_it = 1;
359 }
360 }
361 return QUERY_AXFR;
362 }
363 ods_log_error("[%s] zone transfer %s not tcp", axfr_str,
364 q->zone->name);
365
366udp_overflow:
367 /* UDP Overflow */
368 ods_log_info("[%s] axfr udp overflow zone %s", axfr_str, q->zone->name);
369 buffer_set_position(q->buffer, bufpos);
374 /* check if it needs TSIG signatures */
375 if (q->tsig_rr->status == TSIG_OK) {
376 q->tsig_sign_it = 1;
377 }
378 ods_log_debug("[%s] zone transfer %s udp overflow", axfr_str,
379 q->zone->name);
380 return QUERY_PROCESSED;
381}
382
383
390{
391 char* xfrfile = NULL;
392 ldns_rr* rr = NULL;
393 ldns_rdf* prev = NULL;
394 ldns_rdf* orig = NULL;
395 uint16_t total_added = 0;
396 uint32_t ttl = 0;
397 time_t expire = 0;
398 ldns_status status = LDNS_STATUS_OK;
399 char line[SE_ADFILE_MAXLINE];
400 unsigned l = 0;
401 long fpos = 0;
402 size_t bufpos = 0;
403 uint32_t new_serial = 0;
404 unsigned del_mode = 0;
405 unsigned soa_found = 0;
406 ods_log_assert(engine);
407 ods_log_assert(q);
408 ods_log_assert(q->buffer);
409 ods_log_assert(q->zone);
410 ods_log_assert(q->zone->name);
411 if (q->axfr_is_done) {
412 return QUERY_PROCESSED;
413 }
414 if (q->maxlen > AXFR_MAX_MESSAGE_LEN) {
416 }
417 /* prepare TSIG */
418 q->tsig_prepare_it = 0;
419 q->tsig_update_it = 1;
420 if (q->tsig_sign_it) {
421 q->tsig_prepare_it = 1;
422 q->tsig_sign_it = 0;
423 }
424 ods_log_assert(q->tsig_rr);
425 if (q->axfr_fd == NULL) {
426 /* start IXFR */
427 xfrfile = ods_build_path(q->zone->name, ".ixfr", 0, 1);
428 if (xfrfile) {
429 q->axfr_fd = ods_fopen(xfrfile, NULL, "r");
430 }
431 if (!q->axfr_fd) {
432 ods_log_error("[%s] unable to open ixfr file %s for zone %s",
433 axfr_str, xfrfile, q->zone->name);
434 ods_log_info("[%s] axfr fallback zone %s", axfr_str,
435 q->zone->name);
436 free((void*)xfrfile);
438 return axfr(q, engine, 1);
439 }
440 free((void*)xfrfile);
441 if (q->tsig_rr->status == TSIG_OK) {
442 q->tsig_sign_it = 1; /* sign first packet in stream */
443 }
444 /* compression? */
445
446 /* add SOA RR */
447 fpos = ftell(q->axfr_fd);
448 if (fpos < 0) {
449 ods_log_error("[%s] unable to read ixfr for zone %s: ftell() "
450 "failed (%s)", axfr_str, q->zone->name, strerror(errno));
451 ods_log_info("[%s] axfr fallback zone %s", axfr_str,
452 q->zone->name);
453 ods_fclose(q->axfr_fd);
454 q->axfr_fd = NULL;
456 return axfr(q, engine, 1);
457 }
458 rr = addns_read_rr(q->axfr_fd, line, &orig, &prev, &ttl, &status,
459 &l);
460 if (!rr) {
461 /* no SOA no transfer */
462 ods_log_error("[%s] bad ixfr zone %s, corrupted file",
463 axfr_str, q->zone->name);
464 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
465 return QUERY_PROCESSED;
466 }
467 /* first RR must be SOA */
468 if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_SOA) {
469 ods_log_error("[%s] bad ixfr zone %s, first rr is not soa",
470 axfr_str, q->zone->name);
471 ldns_rr_free(rr);
472 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
473 return QUERY_PROCESSED;
474 }
475 /* zone not expired? */
476 if (q->zone->xfrd) {
477 expire = q->zone->xfrd->serial_xfr_acquired;
478 expire += ldns_rdf2native_int32(ldns_rr_rdf(rr, SE_SOA_RDATA_EXPIRE));
479 if (expire < time_now()) {
480 ods_log_warning("[%s] zone %s expired, not transferring zone",
481 axfr_str, q->zone->name);
482 ldns_rr_free(rr);
483 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
484 ods_fclose(q->axfr_fd);
485 q->axfr_fd = NULL;
486 return QUERY_PROCESSED;
487 }
488 }
489 /* newest serial */
490 new_serial = ldns_rdf2native_int32(
491 ldns_rr_rdf(rr, SE_SOA_RDATA_SERIAL));
492 /* does it fit? */
494 if (query_add_rr(q, rr)) {
495 ods_log_debug("[%s] set soa in ixfr zone %s", axfr_str,
496 q->zone->name);
498 total_added++;
499 ldns_rr_free(rr);
500 rr = NULL;
501 bufpos = buffer_position(q->buffer);
502 } else {
503 ods_log_error("[%s] soa does not fit in ixfr zone %s",
504 axfr_str, q->zone->name);
505 ldns_rr_free(rr);
506 rr = NULL;
507 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
508 return QUERY_PROCESSED;
509 }
510 if (util_serial_gt(q->serial, new_serial)) {
511 goto axfr_fallback;
512 }
513 } else if (q->tcp) {
514 /* subsequent IXFR packets */
515 ods_log_debug("[%s] subsequent ixfr packet zone %s", axfr_str,
516 q->zone->name);
519 query_prepare(q);
520 soa_found = 1;
521 }
522
523 /* add as many records as fit */
524 fpos = ftell(q->axfr_fd);
525 if (fpos < 0) {
526 ods_log_error("[%s] unable to read ixfr for zone %s: ftell() failed "
527 "(%s)", axfr_str, q->zone->name, strerror(errno));
528 ods_log_info("[%s] axfr fallback zone %s", axfr_str,
529 q->zone->name);
530 ods_fclose(q->axfr_fd);
531 q->axfr_fd = NULL;
533 return axfr(q, engine, 1);
534 }
535 while ((rr = addns_read_rr(q->axfr_fd, line, &orig, &prev, &ttl,
536 &status, &l)) != NULL) {
537 ods_log_deeebug("[%s] read rr at line %d", axfr_str, l);
538 if (status != LDNS_STATUS_OK) {
539 ldns_rr_free(rr);
540 rr = NULL;
541 ods_log_error("[%s] error reading rr at line %i (%s): %s",
542 axfr_str, l, ldns_get_errorstr_by_id(status), line);
543 goto axfr_fallback;
544 }
545 if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) {
546 del_mode = !del_mode;
547 }
548 if (!soa_found) {
549 if (del_mode && ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA &&
550 q->serial == ldns_rdf2native_int32(
551 ldns_rr_rdf(rr, SE_SOA_RDATA_SERIAL))) {
552 soa_found = 1;
553 } else {
554 ods_log_deeebug("[%s] soa serial %u not found for rr at line %d",
555 axfr_str, q->serial, l);
556 ldns_rr_free(rr);
557 rr = NULL;
558 continue;
559 }
560 }
561 /* does it fit? */
562 if (query_add_rr(q, rr)) {
563 ods_log_deeebug("[%s] add rr at line %d", axfr_str, l);
564 ldns_rr_free(rr);
565 rr = NULL;
566 fpos = ftell(q->axfr_fd);
567 if (fpos < 0) {
568 ods_log_error("[%s] unable to read ixfr for zone %s: ftell() "
569 "failed (%s)", axfr_str, q->zone->name, strerror(errno));
570 ods_log_info("[%s] axfr fallback zone %s", axfr_str,
571 q->zone->name);
572 ods_fclose(q->axfr_fd);
573 q->axfr_fd = NULL;
575 return axfr(q, engine, 1);
576 }
578 total_added++;
579 } else {
580 ods_log_deeebug("[%s] rr at line %d does not fit", axfr_str, l);
581 ldns_rr_free(rr);
582 rr = NULL;
583 if (fseek(q->axfr_fd, fpos, SEEK_SET) != 0) {
584 ods_log_error("[%s] unable to reset file position in ixfr "
585 "file: fseek() failed (%s)", axfr_str, strerror(errno));
586 buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
587 return QUERY_PROCESSED;
588 } else if (q->tcp) {
589 goto return_ixfr;
590 } else {
591 goto axfr_fallback;
592 }
593 }
594 }
595 if (!soa_found) {
596 ods_log_warning("[%s] zone %s journal not found for serial %u",
597 axfr_str, q->zone->name, q->serial);
598 goto axfr_fallback;
599 }
600 ods_log_debug("[%s] ixfr zone %s is done", axfr_str, q->zone->name);
601 q->tsig_sign_it = 1; /* sign last packet */
602 q->axfr_is_done = 1;
603 ods_fclose(q->axfr_fd);
604 q->axfr_fd = NULL;
605
606return_ixfr:
607 ods_log_debug("[%s] return part ixfr zone %s", axfr_str, q->zone->name);
608 buffer_pkt_set_ancount(q->buffer, total_added);
611
612 /* check if it needs TSIG signatures */
613 if (q->tsig_rr->status == TSIG_OK) {
615 q->tsig_sign_it = 1;
616 }
617 }
618 return QUERY_IXFR;
619
620axfr_fallback:
621 if (q->tcp) {
622 ods_log_info("[%s] axfr fallback zone %s", axfr_str, q->zone->name);
623 if (q->axfr_fd) {
624 ods_fclose(q->axfr_fd);
625 q->axfr_fd = NULL;
626 }
628 return axfr(q, engine, 1);
629 }
630 /* UDP Overflow */
631 ods_log_info("[%s] ixfr udp overflow zone %s", axfr_str, q->zone->name);
632 buffer_set_position(q->buffer, bufpos);
636 /* check if it needs TSIG signatures */
637 if (q->tsig_rr->status == TSIG_OK) {
638 q->tsig_sign_it = 1;
639 }
640 return QUERY_PROCESSED;
641}
ldns_rr * addns_read_rr(FILE *fd, char *line, ldns_rdf **orig, ldns_rdf **prev, uint32_t *ttl, ldns_status *status, unsigned int *l)
Definition addns.c:62
#define SE_ADFILE_MAXLINE
Definition adutil.h:40
query_state ixfr(query_type *q, engine_type *engine)
Definition axfr.c:389
query_state axfr(query_type *q, engine_type *engine, int fallback)
Definition axfr.c:152
query_state soa_request(query_type *q, engine_type *engine)
Definition axfr.c:53
#define AXFR_TSIG_SIGN_EVERY_NTH
Definition axfr.c:43
const char * axfr_str
Definition axfr.c:45
#define AXFR_MAX_MESSAGE_LEN
Definition axfr.h:43
void buffer_pkt_set_rcode(buffer_type *buffer, ldns_pkt_rcode rcode)
Definition buffer.c:966
void buffer_set_limit(buffer_type *buffer, size_t limit)
Definition buffer.c:385
void buffer_set_position(buffer_type *buffer, size_t pos)
Definition buffer.c:137
size_t buffer_position(buffer_type *buffer)
Definition buffer.c:125
void buffer_pkt_set_nscount(buffer_type *buffer, uint16_t count)
Definition buffer.c:1054
void buffer_pkt_set_ancount(buffer_type *buffer, uint16_t count)
Definition buffer.c:1030
void buffer_pkt_set_aa(buffer_type *buffer)
Definition buffer.c:882
uint16_t buffer_pkt_ancount(buffer_type *buffer)
Definition buffer.c:1018
void buffer_pkt_set_arcount(buffer_type *buffer, uint16_t count)
Definition buffer.c:1078
void buffer_pkt_set_qdcount(buffer_type *buffer, uint16_t count)
Definition buffer.c:1006
#define BUFFER_PKT_HEADER_SIZE
Definition buffer.h:43
@ EDNS_NOT_PRESENT
Definition edns.h:65
void query_prepare(query_type *q)
Definition query.c:612
int query_add_rr(query_type *q, ldns_rr *rr)
Definition query.c:1041
@ QUERY_IXFR
Definition query.h:50
@ QUERY_AXFR
Definition query.h:49
@ QUERY_PROCESSED
Definition query.h:47
enum query_enum query_state
Definition query.h:52
edns_status status
Definition edns.h:77
size_t startpos
Definition query.h:83
int tcp
Definition query.h:71
size_t maxlen
Definition query.h:64
buffer_type * buffer
Definition query.h:73
edns_rr_type * edns_rr
Definition query.h:69
unsigned tsig_sign_it
Definition query.h:88
FILE * axfr_fd
Definition query.h:81
uint32_t serial
Definition query.h:82
unsigned axfr_is_done
Definition query.h:85
unsigned tsig_update_it
Definition query.h:87
unsigned tsig_prepare_it
Definition query.h:86
zone_type * zone
Definition query.h:77
tsig_rr_type * tsig_rr
Definition query.h:67
size_t update_since_last_prepare
Definition tsig.h:127
tsig_status status
Definition tsig.h:124
time_t serial_xfr_acquired
Definition xfrd.h:114
xfrd_type * xfrd
Definition zone.h:82
const char * name
Definition zone.h:69
@ TSIG_OK
Definition tsig.h:57