OpenDNSSEC-signer  2.1.5
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 
45 const 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 
152 axfr(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 
346 return_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 
366 udp_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 
606 return_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 
620 axfr_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 }
axfr
query_state axfr(query_type *q, engine_type *engine, int fallback)
Definition: axfr.c:152
ixfr
query_state ixfr(query_type *q, engine_type *engine)
Definition: axfr.c:389
query_struct::axfr_is_done
unsigned axfr_is_done
Definition: query.h:85
buffer_pkt_set_ancount
void buffer_pkt_set_ancount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1030
QUERY_PROCESSED
@ QUERY_PROCESSED
Definition: query.h:47
buffer_set_limit
void buffer_set_limit(buffer_type *buffer, size_t limit)
Definition: buffer.c:385
query_struct::tcp
int tcp
Definition: query.h:71
buffer_pkt_set_arcount
void buffer_pkt_set_arcount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1078
query_state
enum query_enum query_state
Definition: query.h:52
addns.h
buffer_pkt_ancount
uint16_t buffer_pkt_ancount(buffer_type *buffer)
Definition: buffer.c:1018
query_struct::axfr_fd
FILE * axfr_fd
Definition: query.h:81
buffer_position
size_t buffer_position(buffer_type *buffer)
Definition: buffer.c:125
zone_struct::xfrd
xfrd_type * xfrd
Definition: zone.h:82
addns_read_rr
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
zone_struct::name
const char * name
Definition: zone.h:69
query.h
QUERY_AXFR
@ QUERY_AXFR
Definition: query.h:49
tsig_rr_struct::update_since_last_prepare
size_t update_since_last_prepare
Definition: tsig.h:127
AXFR_TSIG_SIGN_EVERY_NTH
#define AXFR_TSIG_SIGN_EVERY_NTH
Definition: axfr.c:43
edns.h
query_struct::edns_rr
edns_rr_type * edns_rr
Definition: query.h:69
buffer_pkt_set_aa
void buffer_pkt_set_aa(buffer_type *buffer)
Definition: buffer.c:882
buffer_set_position
void buffer_set_position(buffer_type *buffer, size_t pos)
Definition: buffer.c:137
buffer_pkt_set_rcode
void buffer_pkt_set_rcode(buffer_type *buffer, ldns_pkt_rcode rcode)
Definition: buffer.c:966
SE_ADFILE_MAXLINE
#define SE_ADFILE_MAXLINE
Definition: adutil.h:40
query_struct::tsig_update_it
unsigned tsig_update_it
Definition: query.h:87
AXFR_MAX_MESSAGE_LEN
#define AXFR_MAX_MESSAGE_LEN
Definition: axfr.h:43
query_add_rr
int query_add_rr(query_type *q, ldns_rr *rr)
Definition: query.c:1035
xfrd_struct::serial_xfr_acquired
time_t serial_xfr_acquired
Definition: xfrd.h:114
QUERY_IXFR
@ QUERY_IXFR
Definition: query.h:50
axfr.h
buffer.h
query_struct::maxlen
size_t maxlen
Definition: query.h:64
query_struct::tsig_prepare_it
unsigned tsig_prepare_it
Definition: query.h:86
engine_struct
Definition: engine.h:51
query_struct::serial
uint32_t serial
Definition: query.h:82
query_struct::buffer
buffer_type * buffer
Definition: query.h:73
buffer_pkt_set_nscount
void buffer_pkt_set_nscount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1054
query_struct::startpos
size_t startpos
Definition: query.h:83
EDNS_NOT_PRESENT
@ EDNS_NOT_PRESENT
Definition: edns.h:65
BUFFER_PKT_HEADER_SIZE
#define BUFFER_PKT_HEADER_SIZE
Definition: buffer.h:43
query_struct
Definition: query.h:59
TSIG_OK
@ TSIG_OK
Definition: tsig.h:57
query_struct::zone
zone_type * zone
Definition: query.h:77
edns_rr_struct::status
edns_status status
Definition: edns.h:77
axfr_str
const char * axfr_str
Definition: axfr.c:45
query_struct::tsig_rr
tsig_rr_type * tsig_rr
Definition: query.h:67
soa_request
query_state soa_request(query_type *q, engine_type *engine)
Definition: axfr.c:53
tsig_rr_struct::status
tsig_status status
Definition: tsig.h:124
query_prepare
void query_prepare(query_type *q)
Definition: query.c:612
sock.h
adutil.h
buffer_pkt_set_qdcount
void buffer_pkt_set_qdcount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1006
query_struct::tsig_sign_it
unsigned tsig_sign_it
Definition: query.h:88