OpenDNSSEC-signer  1.4.3
axfr.c
Go to the documentation of this file.
1 /*
2  * $Id: axfr.c 4958 2011-04-18 07:11:09Z matthijs $
3  *
4  * Copyright (c) 2011 NLNet Labs. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
19  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
21  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
23  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
25  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  *
27  */
28 
34 #include "config.h"
35 #include "adapter/addns.h"
36 #include "adapter/adutil.h"
37 #include "shared/file.h"
38 #include "shared/util.h"
39 #include "wire/axfr.h"
40 #include "wire/buffer.h"
41 #include "wire/edns.h"
42 #include "wire/query.h"
43 #include "wire/sock.h"
44 
45 #define AXFR_TSIG_SIGN_EVERY_NTH 96 /* tsig sign every N packets. */
46 
47 const char* axfr_str = "axfr";
48 
49 
56 {
57  char* xfrfile = NULL;
58  ldns_rr* rr = NULL;
59  ldns_rdf* prev = NULL;
60  ldns_rdf* orig = NULL;
61  uint32_t ttl = 0;
62  time_t expire = 0;
63  ldns_status status = LDNS_STATUS_OK;
64  char line[SE_ADFILE_MAXLINE];
65  unsigned l = 0;
66  FILE* fd = NULL;
67  ods_log_assert(q);
69  ods_log_assert(q->zone);
71  ods_log_assert(engine);
72  xfrfile = ods_build_path(q->zone->name, ".axfr", 0, 1);
73  if (xfrfile) {
74  fd = ods_fopen(xfrfile, NULL, "r");
75  }
76  if (!fd) {
77  ods_log_error("[%s] unable to open file %s for zone %s",
78  axfr_str, xfrfile, q->zone->name);
79  free((void*)xfrfile);
80  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
81  return QUERY_PROCESSED;
82  }
83  free((void*)xfrfile);
84  if (q->tsig_rr->status == TSIG_OK) {
85  q->tsig_sign_it = 1; /* sign first packet in stream */
86  }
87  /* compression? */
88 
89  /* add SOA RR */
90  rr = addns_read_rr(fd, line, &orig, &prev, &ttl, &status, &l);
91  if (!rr) {
92  /* no SOA no transfer */
93  ods_log_error("[%s] bad axfr zone %s, corrupted file", axfr_str,
94  q->zone->name);
95  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
96  ods_fclose(fd);
97  return QUERY_PROCESSED;
98  }
99  /* first RR must be SOA */
100  if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_SOA) {
101  ods_log_error("[%s] bad axfr zone %s, first rr is not soa",
102  axfr_str, q->zone->name);
103  ldns_rr_free(rr);
104  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
105  ods_fclose(fd);
106  return QUERY_PROCESSED;
107  }
108  /* zone not expired? */
109  if (q->zone->xfrd) {
110  expire = q->zone->xfrd->serial_xfr_acquired;
111  expire += ldns_rdf2native_int32(ldns_rr_rdf(rr, SE_SOA_RDATA_EXPIRE));
112  if (expire < time_now()) {
113  ods_log_warning("[%s] zone %s expired, not serving soa",
114  axfr_str, q->zone->name);
115  ldns_rr_free(rr);
116  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
117  ods_fclose(fd);
118  return QUERY_PROCESSED;
119  }
120  }
121  /* does it fit? */
122  if (query_add_rr(q, rr)) {
123  ods_log_debug("[%s] set soa in response %s", axfr_str,
124  q->zone->name);
126  ldns_rr_free(rr);
127  rr = NULL;
128  } else {
129  ods_log_error("[%s] soa does not fit in response %s",
130  axfr_str, q->zone->name);
131  ldns_rr_free(rr);
132  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
133  ods_fclose(fd);
134  return QUERY_PROCESSED;
135  }
136  ods_fclose(fd);
141  /* check if it needs TSIG signatures */
142  if (q->tsig_rr->status == TSIG_OK) {
143  q->tsig_sign_it = 1;
144  }
145  return QUERY_PROCESSED;
146 }
147 
148 
154 axfr(query_type* q, engine_type* engine, int fallback)
155 {
156  char* xfrfile = NULL;
157  ldns_rr* rr = NULL;
158  ldns_rdf* prev = NULL;
159  ldns_rdf* orig = NULL;
160  uint16_t total_added = 0;
161  uint32_t ttl = 0;
162  time_t expire = 0;
163  ldns_status status = LDNS_STATUS_OK;
164  char line[SE_ADFILE_MAXLINE];
165  unsigned l = 0;
166  long fpos = 0;
167  size_t bufpos = 0;
168  ods_log_assert(q);
170  ods_log_assert(q->zone);
171  ods_log_assert(q->zone->name);
172  ods_log_assert(engine);
173  if (q->axfr_is_done) {
174  ods_log_debug("[%s] zone transfer %s completed", axfr_str,
175  q->zone->name);
176  return QUERY_PROCESSED;
177  }
178  if (q->maxlen > AXFR_MAX_MESSAGE_LEN) {
180  }
181 
182  /* prepare TSIG */
183  if (!fallback) {
184  q->tsig_prepare_it = 0;
185  q->tsig_update_it = 1;
186  if (q->tsig_sign_it) {
187  q->tsig_prepare_it = 1;
188  q->tsig_sign_it = 0;
189  }
190  }
192  if (q->axfr_fd == NULL) {
193  /* start AXFR */
194  xfrfile = ods_build_path(q->zone->name, ".axfr", 0, 1);
195  if (xfrfile) {
196  q->axfr_fd = ods_fopen(xfrfile, NULL, "r");
197  }
198  if (!q->axfr_fd) {
199  ods_log_error("[%s] unable to open axfr file %s for zone %s",
200  axfr_str, xfrfile, q->zone->name);
201  free((void*)xfrfile);
202  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
203  return QUERY_PROCESSED;
204  }
205  free((void*)xfrfile);
206  if (q->tsig_rr->status == TSIG_OK) {
207  q->tsig_sign_it = 1; /* sign first packet in stream */
208  }
209  /* compression? */
210 
211  /* add SOA RR */
212  fpos = ftell(q->axfr_fd);
213  if (fpos < 0) {
214  ods_log_error("[%s] unable to read axfr for zone %s: "
215  "ftell() failed (%s)", axfr_str, q->zone->name,
216  strerror(errno));
217  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
218  return QUERY_PROCESSED;
219  }
220  rr = addns_read_rr(q->axfr_fd, line, &orig, &prev, &ttl, &status,
221  &l);
222  if (!rr) {
223  /* no SOA no transfer */
224  ods_log_error("[%s] bad axfr zone %s, corrupted file",
225  axfr_str, q->zone->name);
226  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
227  ods_fclose(q->axfr_fd);
228  q->axfr_fd = NULL;
229  return QUERY_PROCESSED;
230  }
231  /* first RR must be SOA */
232  if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_SOA) {
233  ods_log_error("[%s] bad axfr zone %s, first rr is not soa",
234  axfr_str, q->zone->name);
235  ldns_rr_free(rr);
236  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
237  ods_fclose(q->axfr_fd);
238  q->axfr_fd = NULL;
239  return QUERY_PROCESSED;
240  }
241  /* zone not expired? */
242  if (q->zone->xfrd) {
243  expire = q->zone->xfrd->serial_xfr_acquired;
244  expire += ldns_rdf2native_int32(ldns_rr_rdf(rr, SE_SOA_RDATA_EXPIRE));
245  if (expire < time_now()) {
246  ods_log_warning("[%s] zone %s expired, not transferring zone",
247  axfr_str, q->zone->name);
248  ldns_rr_free(rr);
249  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
250  ods_fclose(q->axfr_fd);
251  q->axfr_fd = NULL;
252  return QUERY_PROCESSED;
253  }
254  }
255  /* does it fit? */
256  if (query_add_rr(q, rr)) {
257  ods_log_debug("[%s] set soa in axfr zone %s", axfr_str,
258  q->zone->name);
260  total_added++;
261  ldns_rr_free(rr);
262  rr = NULL;
263  bufpos = buffer_position(q->buffer);
264  } else {
265  ods_log_error("[%s] soa does not fit in axfr zone %s",
266  axfr_str, q->zone->name);
267  ldns_rr_free(rr);
268  rr = NULL;
269  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
270  ods_fclose(q->axfr_fd);
271  q->axfr_fd = NULL;
272  return QUERY_PROCESSED;
273  }
274  } else if (q->tcp) {
275  /* subsequent AXFR packets */
276  ods_log_debug("[%s] subsequent axfr packet zone %s", axfr_str,
277  q->zone->name);
281  query_prepare(q);
282  }
283  /* add as many records as fit */
284  fpos = ftell(q->axfr_fd);
285  if (fpos < 0) {
286  ods_log_error("[%s] unable to read axfr for zone %s: "
287  "ftell() failed (%s)", axfr_str, q->zone->name,
288  strerror(errno));
289  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
290  ods_fclose(q->axfr_fd);
291  q->axfr_fd = NULL;
292  return QUERY_PROCESSED;
293  }
294  while ((rr = addns_read_rr(q->axfr_fd, line, &orig, &prev, &ttl,
295  &status, &l)) != NULL) {
296  ods_log_deeebug("[%s] read rr at line %d", axfr_str, l);
297  if (status != LDNS_STATUS_OK) {
298  ldns_rr_free(rr);
299  rr = NULL;
300  ods_log_error("[%s] error reading rr at line %i (%s): %s",
301  axfr_str, l, ldns_get_errorstr_by_id(status), line);
302  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
303  ods_fclose(q->axfr_fd);
304  q->axfr_fd = NULL;
305  return QUERY_PROCESSED;
306  }
307  /* does it fit? */
308  if (query_add_rr(q, rr)) {
309  ods_log_deeebug("[%s] add rr at line %d", axfr_str, l);
310  ldns_rr_free(rr);
311  rr = NULL;
312  fpos = ftell(q->axfr_fd);
313  if (fpos < 0) {
314  ods_log_error("[%s] unable to read axfr for zone %s: "
315  "ftell() failed (%s)", axfr_str, q->zone->name,
316  strerror(errno));
317  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
318  ods_fclose(q->axfr_fd);
319  q->axfr_fd = NULL;
320  return QUERY_PROCESSED;
321  }
323  total_added++;
324  } else {
325  ods_log_deeebug("[%s] rr at line %d does not fit", axfr_str, l);
326  ldns_rr_free(rr);
327  rr = NULL;
328  if (fseek(q->axfr_fd, fpos, SEEK_SET) != 0) {
329  ods_log_error("[%s] unable to reset file position in axfr "
330  "file: fseek() failed (%s)", axfr_str, strerror(errno));
331  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
332  ods_fclose(q->axfr_fd);
333  q->axfr_fd = NULL;
334  return QUERY_PROCESSED;
335  } else if (q->tcp) {
336  goto return_axfr;
337  } else {
338  goto udp_overflow;
339  }
340  }
341  }
342  ods_log_debug("[%s] axfr zone %s is done", axfr_str, q->zone->name);
343  q->tsig_sign_it = 1; /* sign last packet */
344  q->axfr_is_done = 1;
345  ods_fclose(q->axfr_fd);
346  q->axfr_fd = NULL;
347 
348 return_axfr:
349  if (q->tcp) {
350  ods_log_debug("[%s] return part axfr zone %s", axfr_str,
351  q->zone->name);
352  buffer_pkt_set_ancount(q->buffer, total_added);
355  /* check if it needs TSIG signatures */
356  if (q->tsig_rr->status == TSIG_OK) {
359  q->tsig_sign_it = 1;
360  }
361  }
362  return QUERY_AXFR;
363  }
364  ods_log_error("[%s] zone transfer %s not tcp", axfr_str,
365  q->zone->name);
366 
367 udp_overflow:
368  /* UDP Overflow */
369  ods_log_info("[%s] axfr udp overflow zone %s", axfr_str, q->zone->name);
370  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);
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  }
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  continue;
557  }
558  }
559  /* does it fit? */
560  if (query_add_rr(q, rr)) {
561  ods_log_deeebug("[%s] add rr at line %d", axfr_str, l);
562  ldns_rr_free(rr);
563  rr = NULL;
564  fpos = ftell(q->axfr_fd);
565  if (fpos < 0) {
566  ods_log_error("[%s] unable to read ixfr for zone %s: ftell() "
567  "failed (%s)", axfr_str, q->zone->name, strerror(errno));
568  ods_log_info("[%s] axfr fallback zone %s", axfr_str,
569  q->zone->name);
570  ods_fclose(q->axfr_fd);
571  q->axfr_fd = NULL;
573  return axfr(q, engine, 1);
574  }
576  total_added++;
577  } else {
578  ods_log_deeebug("[%s] rr at line %d does not fit", axfr_str, l);
579  ldns_rr_free(rr);
580  rr = NULL;
581  if (fseek(q->axfr_fd, fpos, SEEK_SET) != 0) {
582  ods_log_error("[%s] unable to reset file position in ixfr "
583  "file: fseek() failed (%s)", axfr_str, strerror(errno));
584  buffer_pkt_set_rcode(q->buffer, LDNS_RCODE_SERVFAIL);
585  return QUERY_PROCESSED;
586  } else if (q->tcp) {
587  goto return_ixfr;
588  } else {
589  goto axfr_fallback;
590  }
591  }
592  }
593  if (!soa_found) {
594  ods_log_warning("[%s] zone %s journal not found for serial %u",
595  axfr_str, q->zone->name, q->serial);
596  goto axfr_fallback;
597  }
598  ods_log_debug("[%s] ixfr zone %s is done", axfr_str, q->zone->name);
599  q->tsig_sign_it = 1; /* sign last packet */
600  q->axfr_is_done = 1;
601  ods_fclose(q->axfr_fd);
602  q->axfr_fd = NULL;
603 
604 return_ixfr:
605  ods_log_debug("[%s] return part ixfr zone %s", axfr_str, q->zone->name);
606  buffer_pkt_set_ancount(q->buffer, total_added);
609 
610  /* check if it needs TSIG signatures */
611  if (q->tsig_rr->status == TSIG_OK) {
613  q->tsig_sign_it = 1;
614  }
615  }
616  return QUERY_IXFR;
617 
618 axfr_fallback:
619  if (q->tcp) {
620  ods_log_info("[%s] axfr fallback zone %s", axfr_str, q->zone->name);
621  if (q->axfr_fd) {
622  ods_fclose(q->axfr_fd);
623  q->axfr_fd = NULL;
624  }
626  return axfr(q, engine, 1);
627  }
628  /* UDP Overflow */
629  ods_log_info("[%s] ixfr udp overflow zone %s", axfr_str, q->zone->name);
630  buffer_set_position(q->buffer, bufpos);
634  /* check if it needs TSIG signatures */
635  if (q->tsig_rr->status == TSIG_OK) {
636  q->tsig_sign_it = 1;
637  }
638  return QUERY_PROCESSED;
639 }
size_t maxlen
Definition: query.h:68
tsig_status status
Definition: tsig.h:128
#define AXFR_TSIG_SIGN_EVERY_NTH
Definition: axfr.c:45
unsigned tsig_sign_it
Definition: query.h:92
int tcp
Definition: query.h:75
void ods_log_debug(const char *format,...)
Definition: log.c:272
tsig_rr_type * tsig_rr
Definition: query.h:71
zone_type * zone
Definition: query.h:81
#define BUFFER_PKT_HEADER_SIZE
Definition: buffer.h:45
time_t serial_xfr_acquired
Definition: xfrd.h:112
unsigned tsig_update_it
Definition: query.h:91
void buffer_pkt_set_qdcount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1075
void ods_log_info(const char *format,...)
Definition: log.c:304
void ods_log_error(const char *format,...)
Definition: log.c:336
#define SE_SOA_RDATA_SERIAL
Definition: util.h:49
edns_rr_type * edns_rr
Definition: query.h:73
unsigned tsig_prepare_it
Definition: query.h:90
size_t update_since_last_prepare
Definition: tsig.h:131
FILE * ods_fopen(const char *file, const char *dir, const char *mode)
Definition: file.c:187
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:64
int util_serial_gt(uint32_t serial_new, uint32_t serial_old)
Definition: util.c:74
uint16_t buffer_pkt_ancount(buffer_type *buffer)
Definition: buffer.c:1088
#define SE_SOA_RDATA_EXPIRE
Definition: util.h:50
void buffer_pkt_set_ancount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1100
void buffer_pkt_set_nscount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1125
void buffer_set_limit(buffer_type *buffer, size_t limit)
Definition: buffer.c:425
query_state axfr(query_type *q, engine_type *engine, int fallback)
Definition: axfr.c:154
Definition: tsig.h:60
uint32_t serial
Definition: query.h:86
enum query_enum query_state
Definition: query.h:54
buffer_type * buffer
Definition: query.h:77
void buffer_pkt_set_aa(buffer_type *buffer)
Definition: buffer.c:949
size_t startpos
Definition: query.h:87
char * ods_build_path(const char *file, const char *suffix, int dir, int no_slash)
Definition: file.c:127
unsigned axfr_is_done
Definition: query.h:89
const char * axfr_str
Definition: axfr.c:47
query_state ixfr(query_type *q, engine_type *engine)
Definition: axfr.c:389
void buffer_set_position(buffer_type *buffer, size_t pos)
Definition: buffer.c:174
void ods_fclose(FILE *fd)
Definition: file.c:247
const char * name
Definition: zone.h:78
#define SE_ADFILE_MAXLINE
Definition: adutil.h:42
#define AXFR_MAX_MESSAGE_LEN
Definition: axfr.h:45
void ods_log_deeebug(const char *format,...)
Definition: log.c:256
void buffer_pkt_set_rcode(buffer_type *buffer, ldns_pkt_rcode rcode)
Definition: buffer.c:1034
query_state soa_request(query_type *q, engine_type *engine)
Definition: axfr.c:55
void query_prepare(query_type *q)
Definition: query.c:577
int query_add_rr(query_type *q, ldns_rr *rr)
Definition: query.c:1000
size_t buffer_position(buffer_type *buffer)
Definition: buffer.c:162
FILE * axfr_fd
Definition: query.h:85
void buffer_pkt_set_arcount(buffer_type *buffer, uint16_t count)
Definition: buffer.c:1150
#define ods_log_assert(x)
Definition: log.h:156
edns_status status
Definition: edns.h:80
xfrd_type * xfrd
Definition: zone.h:91
void ods_log_warning(const char *format,...)
Definition: log.c:320
time_t time_now(void)
Definition: duration.c:515