OpenDNSSEC-signer  1.4.10
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 "shared/file.h"
36 #include "shared/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);
67  ods_log_assert(q->zone);
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 %u, and it is now %u: "
112  "not serving soa", axfr_str, q->zone->name, expire, 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);
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  }
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);
350  buffer_pkt_set_ancount(q->buffer, total_added);
353  /* check if it needs TSIG signatures */
354  if (q->tsig_rr->status == TSIG_OK) {
357  q->tsig_sign_it = 1;
358  }
359  }
360  return QUERY_AXFR;
361  }
362  ods_log_error("[%s] zone transfer %s not tcp", axfr_str,
363  q->zone->name);
364 
365 udp_overflow:
366  /* UDP Overflow */
367  ods_log_info("[%s] axfr udp overflow zone %s", axfr_str, q->zone->name);
368  buffer_set_position(q->buffer, bufpos);
372  /* check if it needs TSIG signatures */
373  if (q->tsig_rr->status == TSIG_OK) {
374  q->tsig_sign_it = 1;
375  }
376  ods_log_debug("[%s] zone transfer %s udp overflow", axfr_str,
377  q->zone->name);
378  return QUERY_PROCESSED;
379 }
380 
381 
388 {
389  char* xfrfile = NULL;
390  ldns_rr* rr = NULL;
391  ldns_rdf* prev = NULL;
392  ldns_rdf* orig = NULL;
393  uint16_t total_added = 0;
394  uint32_t ttl = 0;
395  time_t expire = 0;
396  ldns_status status = LDNS_STATUS_OK;
397  char line[SE_ADFILE_MAXLINE];
398  unsigned l = 0;
399  long fpos = 0;
400  size_t bufpos = 0;
401  uint32_t new_serial = 0;
402  unsigned del_mode = 0;
403  unsigned soa_found = 0;
404  ods_log_assert(engine);
405  ods_log_assert(q);
407  ods_log_assert(q->zone);
408  ods_log_assert(q->zone->name);
409  if (q->axfr_is_done) {
410  return QUERY_PROCESSED;
411  }
412  if (q->maxlen > AXFR_MAX_MESSAGE_LEN) {
414  }
415  /* prepare TSIG */
416  q->tsig_prepare_it = 0;
417  q->tsig_update_it = 1;
418  if (q->tsig_sign_it) {
419  q->tsig_prepare_it = 1;
420  q->tsig_sign_it = 0;
421  }
423  if (q->axfr_fd == NULL) {
424  /* start IXFR */
425  xfrfile = ods_build_path(q->zone->name, ".ixfr", 0, 1);
426  if (xfrfile) {
427  q->axfr_fd = ods_fopen(xfrfile, NULL, "r");
428  }
429  if (!q->axfr_fd) {
430  ods_log_error("[%s] unable to open ixfr file %s for zone %s",
431  axfr_str, xfrfile, q->zone->name);
432  ods_log_info("[%s] axfr fallback zone %s", axfr_str,
433  q->zone->name);
434  free((void*)xfrfile);
436  return axfr(q, engine, 1);
437  }
438  free((void*)xfrfile);
439  if (q->tsig_rr->status == TSIG_OK) {
440  q->tsig_sign_it = 1; /* sign first packet in stream */
441  }
442  /* compression? */
443 
444  /* add SOA RR */
445  fpos = ftell(q->axfr_fd);
446  if (fpos < 0) {
447  ods_log_error("[%s] unable to read ixfr for zone %s: ftell() "
448  "failed (%s)", axfr_str, q->zone->name, strerror(errno));
449  ods_log_info("[%s] axfr fallback zone %s", axfr_str,
450  q->zone->name);
451  ods_fclose(q->axfr_fd);
452  q->axfr_fd = NULL;
454  return axfr(q, engine, 1);
455  }
456  rr = addns_read_rr(q->axfr_fd, line, &orig, &prev, &ttl, &status,
457  &l);
458  if (!rr) {
459  /* no SOA no transfer */
460  ods_log_error("[%s] bad ixfr zone %s, corrupted file",
461  axfr_str, q->zone->name);
462  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
463  return QUERY_PROCESSED;
464  }
465  /* first RR must be SOA */
466  if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_SOA) {
467  ods_log_error("[%s] bad ixfr zone %s, first rr is not soa",
468  axfr_str, q->zone->name);
469  ldns_rr_free(rr);
470  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
471  return QUERY_PROCESSED;
472  }
473  /* zone not expired? */
474  if (q->zone->xfrd) {
475  expire = q->zone->xfrd->serial_xfr_acquired;
476  expire += ldns_rdf2native_int32(ldns_rr_rdf(rr, SE_SOA_RDATA_EXPIRE));
477  if (expire < time_now()) {
478  ods_log_warning("[%s] zone %s expired, not transferring zone",
479  axfr_str, q->zone->name);
480  ldns_rr_free(rr);
481  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
482  ods_fclose(q->axfr_fd);
483  q->axfr_fd = NULL;
484  return QUERY_PROCESSED;
485  }
486  }
487  /* newest serial */
488  new_serial = ldns_rdf2native_int32(
489  ldns_rr_rdf(rr, SE_SOA_RDATA_SERIAL));
490  /* does it fit? */
492  if (query_add_rr(q, rr)) {
493  ods_log_debug("[%s] set soa in ixfr zone %s", axfr_str,
494  q->zone->name);
496  total_added++;
497  ldns_rr_free(rr);
498  rr = NULL;
499  bufpos = buffer_position(q->buffer);
500  } else {
501  ods_log_error("[%s] soa does not fit in ixfr zone %s",
502  axfr_str, q->zone->name);
503  ldns_rr_free(rr);
504  rr = NULL;
505  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
506  return QUERY_PROCESSED;
507  }
508  if (util_serial_gt(q->serial, new_serial)) {
509  goto axfr_fallback;
510  }
511  } else if (q->tcp) {
512  /* subsequent IXFR packets */
513  ods_log_debug("[%s] subsequent ixfr packet zone %s", axfr_str,
514  q->zone->name);
517  query_prepare(q);
518  soa_found = 1;
519  }
520 
521  /* add as many records as fit */
522  fpos = ftell(q->axfr_fd);
523  if (fpos < 0) {
524  ods_log_error("[%s] unable to read ixfr for zone %s: ftell() failed "
525  "(%s)", axfr_str, q->zone->name, strerror(errno));
526  ods_log_info("[%s] axfr fallback zone %s", axfr_str,
527  q->zone->name);
528  ods_fclose(q->axfr_fd);
529  q->axfr_fd = NULL;
531  return axfr(q, engine, 1);
532  }
533  while ((rr = addns_read_rr(q->axfr_fd, line, &orig, &prev, &ttl,
534  &status, &l)) != NULL) {
535  ods_log_deeebug("[%s] read rr at line %d", axfr_str, l);
536  if (status != LDNS_STATUS_OK) {
537  ldns_rr_free(rr);
538  rr = NULL;
539  ods_log_error("[%s] error reading rr at line %i (%s): %s",
540  axfr_str, l, ldns_get_errorstr_by_id(status), line);
541  goto axfr_fallback;
542  }
543  if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) {
544  del_mode = !del_mode;
545  }
546  if (!soa_found) {
547  if (del_mode && ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA &&
548  q->serial == ldns_rdf2native_int32(
549  ldns_rr_rdf(rr, SE_SOA_RDATA_SERIAL))) {
550  soa_found = 1;
551  } else {
552  ods_log_deeebug("[%s] soa serial %u not found for rr at line %d",
553  axfr_str, q->serial, l);
554  continue;
555  }
556  }
557  /* does it fit? */
558  if (query_add_rr(q, rr)) {
559  ods_log_deeebug("[%s] add rr at line %d", axfr_str, l);
560  ldns_rr_free(rr);
561  rr = NULL;
562  fpos = ftell(q->axfr_fd);
563  if (fpos < 0) {
564  ods_log_error("[%s] unable to read ixfr for zone %s: ftell() "
565  "failed (%s)", axfr_str, q->zone->name, strerror(errno));
566  ods_log_info("[%s] axfr fallback zone %s", axfr_str,
567  q->zone->name);
568  ods_fclose(q->axfr_fd);
569  q->axfr_fd = NULL;
571  return axfr(q, engine, 1);
572  }
574  total_added++;
575  } else {
576  ods_log_deeebug("[%s] rr at line %d does not fit", axfr_str, l);
577  ldns_rr_free(rr);
578  rr = NULL;
579  if (fseek(q->axfr_fd, fpos, SEEK_SET) != 0) {
580  ods_log_error("[%s] unable to reset file position in ixfr "
581  "file: fseek() failed (%s)", axfr_str, strerror(errno));
582  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
583  return QUERY_PROCESSED;
584  } else if (q->tcp) {
585  goto return_ixfr;
586  } else {
587  goto axfr_fallback;
588  }
589  }
590  }
591  if (!soa_found) {
592  ods_log_warning("[%s] zone %s journal not found for serial %u",
593  axfr_str, q->zone->name, q->serial);
594  goto axfr_fallback;
595  }
596  ods_log_debug("[%s] ixfr zone %s is done", axfr_str, q->zone->name);
597  q->tsig_sign_it = 1; /* sign last packet */
598  q->axfr_is_done = 1;
599  ods_fclose(q->axfr_fd);
600  q->axfr_fd = NULL;
601 
602 return_ixfr:
603  ods_log_debug("[%s] return part ixfr zone %s", axfr_str, q->zone->name);
604  buffer_pkt_set_ancount(q->buffer, total_added);
607 
608  /* check if it needs TSIG signatures */
609  if (q->tsig_rr->status == TSIG_OK) {
611  q->tsig_sign_it = 1;
612  }
613  }
614  return QUERY_IXFR;
615 
616 axfr_fallback:
617  if (q->tcp) {
618  ods_log_info("[%s] axfr fallback zone %s", axfr_str, q->zone->name);
619  if (q->axfr_fd) {
620  ods_fclose(q->axfr_fd);
621  q->axfr_fd = NULL;
622  }
624  return axfr(q, engine, 1);
625  }
626  /* UDP Overflow */
627  ods_log_info("[%s] ixfr udp overflow zone %s", axfr_str, q->zone->name);
628  buffer_set_position(q->buffer, bufpos);
632  /* check if it needs TSIG signatures */
633  if (q->tsig_rr->status == TSIG_OK) {
634  q->tsig_sign_it = 1;
635  }
636  return QUERY_PROCESSED;
637 }
size_t maxlen
Definition: query.h:66
tsig_status status
Definition: tsig.h:126
#define AXFR_TSIG_SIGN_EVERY_NTH
Definition: axfr.c:43
unsigned tsig_sign_it
Definition: query.h:90
int tcp
Definition: query.h:73
void ods_log_debug(const char *format,...)
Definition: log.c:270
tsig_rr_type * tsig_rr
Definition: query.h:69
zone_type * zone
Definition: query.h:79
#define BUFFER_PKT_HEADER_SIZE
Definition: buffer.h:43
time_t serial_xfr_acquired
Definition: xfrd.h:113
unsigned tsig_update_it
Definition: query.h:89
void buffer_pkt_set_qdcount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1073
void ods_log_info(const char *format,...)
Definition: log.c:302
void ods_log_error(const char *format,...)
Definition: log.c:334
#define SE_SOA_RDATA_SERIAL
Definition: util.h:47
edns_rr_type * edns_rr
Definition: query.h:71
unsigned tsig_prepare_it
Definition: query.h:88
size_t update_since_last_prepare
Definition: tsig.h:129
FILE * ods_fopen(const char *file, const char *dir, const char *mode)
Definition: file.c:190
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
int util_serial_gt(uint32_t serial_new, uint32_t serial_old)
Definition: util.c:72
uint16_t buffer_pkt_ancount(buffer_type *buffer)
Definition: buffer.c:1086
#define SE_SOA_RDATA_EXPIRE
Definition: util.h:48
void buffer_pkt_set_ancount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1098
void buffer_pkt_set_nscount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1123
void buffer_set_limit(buffer_type *buffer, size_t limit)
Definition: buffer.c:423
query_state axfr(query_type *q, engine_type *engine, int fallback)
Definition: axfr.c:152
Definition: tsig.h:58
uint32_t serial
Definition: query.h:84
enum query_enum query_state
Definition: query.h:52
buffer_type * buffer
Definition: query.h:75
void buffer_pkt_set_aa(buffer_type *buffer)
Definition: buffer.c:947
size_t startpos
Definition: query.h:85
char * ods_build_path(const char *file, const char *suffix, int dir, int no_slash)
Definition: file.c:125
unsigned axfr_is_done
Definition: query.h:87
const char * axfr_str
Definition: axfr.c:45
query_state ixfr(query_type *q, engine_type *engine)
Definition: axfr.c:387
void buffer_set_position(buffer_type *buffer, size_t pos)
Definition: buffer.c:172
void ods_fclose(FILE *fd)
Definition: file.c:250
const char * name
Definition: zone.h:76
#define SE_ADFILE_MAXLINE
Definition: adutil.h:40
#define AXFR_MAX_MESSAGE_LEN
Definition: axfr.h:43
void ods_log_deeebug(const char *format,...)
Definition: log.c:254
void buffer_pkt_set_rcode(buffer_type *buffer, ldns_pkt_rcode rcode)
Definition: buffer.c:1032
query_state soa_request(query_type *q, engine_type *engine)
Definition: axfr.c:53
void query_prepare(query_type *q)
Definition: query.c:608
int query_add_rr(query_type *q, ldns_rr *rr)
Definition: query.c:1035
size_t buffer_position(buffer_type *buffer)
Definition: buffer.c:160
FILE * axfr_fd
Definition: query.h:83
void buffer_pkt_set_arcount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1148
#define ods_log_assert(x)
Definition: log.h:154
edns_status status
Definition: edns.h:78
xfrd_type * xfrd
Definition: zone.h:89
void ods_log_warning(const char *format,...)
Definition: log.c:318
time_t time_now(void)
Definition: duration.c:513