aboutsummaryrefslogtreecommitdiff
path: root/external/unbound/util
diff options
context:
space:
mode:
Diffstat (limited to 'external/unbound/util')
m---------external/unbound0
-rw-r--r--external/unbound/util/alloc.c654
-rw-r--r--external/unbound/util/alloc.h217
-rw-r--r--external/unbound/util/as112.c143
-rw-r--r--external/unbound/util/as112.h57
-rw-r--r--external/unbound/util/config_file.c2056
-rw-r--r--external/unbound/util/config_file.h1009
-rw-r--r--external/unbound/util/configlexer.c5212
-rw-r--r--external/unbound/util/configlexer.lex513
-rw-r--r--external/unbound/util/configparser.c5131
-rw-r--r--external/unbound/util/configparser.h484
-rw-r--r--external/unbound/util/configparser.y2282
-rw-r--r--external/unbound/util/configyyrename.h88
-rw-r--r--external/unbound/util/data/dname.c788
-rw-r--r--external/unbound/util/data/dname.h305
-rw-r--r--external/unbound/util/data/msgencode.c916
-rw-r--r--external/unbound/util/data/msgencode.h131
-rw-r--r--external/unbound/util/data/msgparse.c1093
-rw-r--r--external/unbound/util/data/msgparse.h334
-rw-r--r--external/unbound/util/data/msgreply.c1206
-rw-r--r--external/unbound/util/data/msgreply.h674
-rw-r--r--external/unbound/util/data/packed_rrset.c387
-rw-r--r--external/unbound/util/data/packed_rrset.h445
-rw-r--r--external/unbound/util/fptr_wlist.c532
-rw-r--r--external/unbound/util/fptr_wlist.h391
-rw-r--r--external/unbound/util/iana_ports.inc5465
-rw-r--r--external/unbound/util/locks.c264
-rw-r--r--external/unbound/util/locks.h313
-rw-r--r--external/unbound/util/log.c493
-rw-r--r--external/unbound/util/log.h207
-rw-r--r--external/unbound/util/mini_event.c391
-rw-r--r--external/unbound/util/mini_event.h192
-rw-r--r--external/unbound/util/module.c238
-rw-r--r--external/unbound/util/module.h778
-rw-r--r--external/unbound/util/net_help.c840
-rw-r--r--external/unbound/util/net_help.h393
-rw-r--r--external/unbound/util/netevent.c2410
-rw-r--r--external/unbound/util/netevent.h731
-rw-r--r--external/unbound/util/random.c233
-rw-r--r--external/unbound/util/random.h93
-rw-r--r--external/unbound/util/rbtree.c626
-rw-r--r--external/unbound/util/rbtree.h192
-rw-r--r--external/unbound/util/regional.c223
-rw-r--r--external/unbound/util/regional.h150
-rw-r--r--external/unbound/util/rtt.c121
-rw-r--r--external/unbound/util/rtt.h107
-rw-r--r--external/unbound/util/shm_side/shm_main.c286
-rw-r--r--external/unbound/util/shm_side/shm_main.h86
-rw-r--r--external/unbound/util/storage/dnstree.c295
-rw-r--r--external/unbound/util/storage/dnstree.h203
-rw-r--r--external/unbound/util/storage/lookup3.c1032
-rw-r--r--external/unbound/util/storage/lookup3.h71
-rw-r--r--external/unbound/util/storage/lruhash.c631
-rw-r--r--external/unbound/util/storage/lruhash.h446
-rw-r--r--external/unbound/util/storage/slabhash.c231
-rw-r--r--external/unbound/util/storage/slabhash.h218
-rw-r--r--external/unbound/util/timehist.c247
-rw-r--r--external/unbound/util/timehist.h134
-rw-r--r--external/unbound/util/tube.c731
-rw-r--r--external/unbound/util/tube.h272
-rw-r--r--external/unbound/util/ub_event.c444
-rw-r--r--external/unbound/util/ub_event.h127
-rw-r--r--external/unbound/util/ub_event_pluggable.c692
-rw-r--r--external/unbound/util/winsock_event.c694
-rw-r--r--external/unbound/util/winsock_event.h279
65 files changed, 0 insertions, 46627 deletions
diff --git a/external/unbound b/external/unbound
new file mode 160000
+Subproject 193bdc4ee3fe2b0d17e547e86512528c2614483
diff --git a/external/unbound/util/alloc.c b/external/unbound/util/alloc.c
deleted file mode 100644
index 2c6e1a23f..000000000
--- a/external/unbound/util/alloc.c
+++ /dev/null
@@ -1,654 +0,0 @@
-/*
- * util/alloc.c - memory allocation service.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains memory allocation functions.
- */
-
-#include "config.h"
-#include "util/alloc.h"
-#include "util/regional.h"
-#include "util/data/packed_rrset.h"
-#include "util/fptr_wlist.h"
-
-/** custom size of cached regional blocks */
-#define ALLOC_REG_SIZE 16384
-/** number of bits for ID part of uint64, rest for number of threads. */
-#define THRNUM_SHIFT 48 /* for 65k threads, 2^48 rrsets per thr. */
-
-/** setup new special type */
-static void
-alloc_setup_special(alloc_special_type* t)
-{
- memset(t, 0, sizeof(*t));
- lock_rw_init(&t->entry.lock);
- t->entry.key = t;
-}
-
-/** prealloc some entries in the cache. To minimize contention.
- * Result is 1 lock per alloc_max newly created entries.
- * @param alloc: the structure to fill up.
- */
-static void
-prealloc_setup(struct alloc_cache* alloc)
-{
- alloc_special_type* p;
- int i;
- for(i=0; i<ALLOC_SPECIAL_MAX; i++) {
- if(!(p = (alloc_special_type*)malloc(
- sizeof(alloc_special_type)))) {
- log_err("prealloc: out of memory");
- return;
- }
- alloc_setup_special(p);
- alloc_set_special_next(p, alloc->quar);
- alloc->quar = p;
- alloc->num_quar++;
- }
-}
-
-/** prealloc region blocks */
-static void
-prealloc_blocks(struct alloc_cache* alloc, size_t num)
-{
- size_t i;
- struct regional* r;
- for(i=0; i<num; i++) {
- r = regional_create_custom(ALLOC_REG_SIZE);
- if(!r) {
- log_err("prealloc blocks: out of memory");
- return;
- }
- r->next = (char*)alloc->reg_list;
- alloc->reg_list = r;
- alloc->num_reg_blocks ++;
- }
-}
-
-void
-alloc_init(struct alloc_cache* alloc, struct alloc_cache* super,
- int thread_num)
-{
- memset(alloc, 0, sizeof(*alloc));
- alloc->super = super;
- alloc->thread_num = thread_num;
- alloc->next_id = (uint64_t)thread_num; /* in steps, so that type */
- alloc->next_id <<= THRNUM_SHIFT; /* of *_id is used. */
- alloc->last_id = 1; /* so no 64bit constants, */
- alloc->last_id <<= THRNUM_SHIFT; /* or implicit 'int' ops. */
- alloc->last_id -= 1; /* for compiler portability. */
- alloc->last_id |= alloc->next_id;
- alloc->next_id += 1; /* because id=0 is special. */
- alloc->max_reg_blocks = 100;
- alloc->num_reg_blocks = 0;
- alloc->reg_list = NULL;
- alloc->cleanup = NULL;
- alloc->cleanup_arg = NULL;
- if(alloc->super)
- prealloc_blocks(alloc, alloc->max_reg_blocks);
- if(!alloc->super) {
- lock_quick_init(&alloc->lock);
- lock_protect(&alloc->lock, alloc, sizeof(*alloc));
- }
-}
-
-void
-alloc_clear(struct alloc_cache* alloc)
-{
- alloc_special_type* p, *np;
- struct regional* r, *nr;
- if(!alloc)
- return;
- if(!alloc->super) {
- lock_quick_destroy(&alloc->lock);
- }
- if(alloc->super && alloc->quar) {
- /* push entire list into super */
- p = alloc->quar;
- while(alloc_special_next(p)) /* find last */
- p = alloc_special_next(p);
- lock_quick_lock(&alloc->super->lock);
- alloc_set_special_next(p, alloc->super->quar);
- alloc->super->quar = alloc->quar;
- alloc->super->num_quar += alloc->num_quar;
- lock_quick_unlock(&alloc->super->lock);
- } else {
- /* free */
- p = alloc->quar;
- while(p) {
- np = alloc_special_next(p);
- /* deinit special type */
- lock_rw_destroy(&p->entry.lock);
- free(p);
- p = np;
- }
- }
- alloc->quar = 0;
- alloc->num_quar = 0;
- r = alloc->reg_list;
- while(r) {
- nr = (struct regional*)r->next;
- free(r);
- r = nr;
- }
- alloc->reg_list = NULL;
- alloc->num_reg_blocks = 0;
-}
-
-uint64_t
-alloc_get_id(struct alloc_cache* alloc)
-{
- uint64_t id = alloc->next_id++;
- if(id == alloc->last_id) {
- log_warn("rrset alloc: out of 64bit ids. Clearing cache.");
- fptr_ok(fptr_whitelist_alloc_cleanup(alloc->cleanup));
- (*alloc->cleanup)(alloc->cleanup_arg);
-
- /* start back at first number */ /* like in alloc_init*/
- alloc->next_id = (uint64_t)alloc->thread_num;
- alloc->next_id <<= THRNUM_SHIFT; /* in steps for comp. */
- alloc->next_id += 1; /* portability. */
- /* and generate new and safe id */
- id = alloc->next_id++;
- }
- return id;
-}
-
-alloc_special_type*
-alloc_special_obtain(struct alloc_cache* alloc)
-{
- alloc_special_type* p;
- log_assert(alloc);
- /* see if in local cache */
- if(alloc->quar) {
- p = alloc->quar;
- alloc->quar = alloc_special_next(p);
- alloc->num_quar--;
- p->id = alloc_get_id(alloc);
- return p;
- }
- /* see if in global cache */
- if(alloc->super) {
- /* could maybe grab alloc_max/2 entries in one go,
- * but really, isn't that just as fast as this code? */
- lock_quick_lock(&alloc->super->lock);
- if((p = alloc->super->quar)) {
- alloc->super->quar = alloc_special_next(p);
- alloc->super->num_quar--;
- }
- lock_quick_unlock(&alloc->super->lock);
- if(p) {
- p->id = alloc_get_id(alloc);
- return p;
- }
- }
- /* allocate new */
- prealloc_setup(alloc);
- if(!(p = (alloc_special_type*)malloc(sizeof(alloc_special_type)))) {
- log_err("alloc_special_obtain: out of memory");
- return NULL;
- }
- alloc_setup_special(p);
- p->id = alloc_get_id(alloc);
- return p;
-}
-
-/** push mem and some more items to the super */
-static void
-pushintosuper(struct alloc_cache* alloc, alloc_special_type* mem)
-{
- int i;
- alloc_special_type *p = alloc->quar;
- log_assert(p);
- log_assert(alloc && alloc->super &&
- alloc->num_quar >= ALLOC_SPECIAL_MAX);
- /* push ALLOC_SPECIAL_MAX/2 after mem */
- alloc_set_special_next(mem, alloc->quar);
- for(i=1; i<ALLOC_SPECIAL_MAX/2; i++) {
- p = alloc_special_next(p);
- }
- alloc->quar = alloc_special_next(p);
- alloc->num_quar -= ALLOC_SPECIAL_MAX/2;
-
- /* dump mem+list into the super quar list */
- lock_quick_lock(&alloc->super->lock);
- alloc_set_special_next(p, alloc->super->quar);
- alloc->super->quar = mem;
- alloc->super->num_quar += ALLOC_SPECIAL_MAX/2 + 1;
- lock_quick_unlock(&alloc->super->lock);
- /* so 1 lock per mem+alloc/2 deletes */
-}
-
-void
-alloc_special_release(struct alloc_cache* alloc, alloc_special_type* mem)
-{
- log_assert(alloc);
- if(!mem)
- return;
- if(!alloc->super) {
- lock_quick_lock(&alloc->lock); /* superalloc needs locking */
- }
-
- alloc_special_clean(mem);
- if(alloc->super && alloc->num_quar >= ALLOC_SPECIAL_MAX) {
- /* push it to the super structure */
- pushintosuper(alloc, mem);
- return;
- }
-
- alloc_set_special_next(mem, alloc->quar);
- alloc->quar = mem;
- alloc->num_quar++;
- if(!alloc->super) {
- lock_quick_unlock(&alloc->lock);
- }
-}
-
-void
-alloc_stats(struct alloc_cache* alloc)
-{
- log_info("%salloc: %d in cache, %d blocks.", alloc->super?"":"sup",
- (int)alloc->num_quar, (int)alloc->num_reg_blocks);
-}
-
-size_t alloc_get_mem(struct alloc_cache* alloc)
-{
- alloc_special_type* p;
- size_t s = sizeof(*alloc);
- if(!alloc->super) {
- lock_quick_lock(&alloc->lock); /* superalloc needs locking */
- }
- s += sizeof(alloc_special_type) * alloc->num_quar;
- for(p = alloc->quar; p; p = alloc_special_next(p)) {
- s += lock_get_mem(&p->entry.lock);
- }
- s += alloc->num_reg_blocks * ALLOC_REG_SIZE;
- if(!alloc->super) {
- lock_quick_unlock(&alloc->lock);
- }
- return s;
-}
-
-struct regional*
-alloc_reg_obtain(struct alloc_cache* alloc)
-{
- if(alloc->num_reg_blocks > 0) {
- struct regional* r = alloc->reg_list;
- alloc->reg_list = (struct regional*)r->next;
- r->next = NULL;
- alloc->num_reg_blocks--;
- return r;
- }
- return regional_create_custom(ALLOC_REG_SIZE);
-}
-
-void
-alloc_reg_release(struct alloc_cache* alloc, struct regional* r)
-{
- if(alloc->num_reg_blocks >= alloc->max_reg_blocks) {
- regional_destroy(r);
- return;
- }
- if(!r) return;
- regional_free_all(r);
- log_assert(r->next == NULL);
- r->next = (char*)alloc->reg_list;
- alloc->reg_list = r;
- alloc->num_reg_blocks++;
-}
-
-void
-alloc_set_id_cleanup(struct alloc_cache* alloc, void (*cleanup)(void*),
- void* arg)
-{
- alloc->cleanup = cleanup;
- alloc->cleanup_arg = arg;
-}
-
-/** global debug value to keep track of total memory mallocs */
-size_t unbound_mem_alloc = 0;
-/** global debug value to keep track of total memory frees */
-size_t unbound_mem_freed = 0;
-#ifdef UNBOUND_ALLOC_STATS
-/** special value to know if the memory is being tracked */
-uint64_t mem_special = (uint64_t)0xfeed43327766abcdLL;
-#ifdef malloc
-#undef malloc
-#endif
-/** malloc with stats */
-void *unbound_stat_malloc(size_t size)
-{
- void* res;
- if(size == 0) size = 1;
- res = malloc(size+16);
- if(!res) return NULL;
- unbound_mem_alloc += size;
- log_info("stat %p=malloc(%u)", res+16, (unsigned)size);
- memcpy(res, &size, sizeof(size));
- memcpy(res+8, &mem_special, sizeof(mem_special));
- return res+16;
-}
-#ifdef calloc
-#undef calloc
-#endif
-#ifndef INT_MAX
-#define INT_MAX (((int)-1)>>1)
-#endif
-/** calloc with stats */
-void *unbound_stat_calloc(size_t nmemb, size_t size)
-{
- size_t s;
- void* res;
- if(nmemb != 0 && INT_MAX/nmemb < size)
- return NULL; /* integer overflow check */
- s = (nmemb*size==0)?(size_t)1:nmemb*size;
- res = calloc(1, s+16);
- if(!res) return NULL;
- log_info("stat %p=calloc(%u, %u)", res+16, (unsigned)nmemb, (unsigned)size);
- unbound_mem_alloc += s;
- memcpy(res, &s, sizeof(s));
- memcpy(res+8, &mem_special, sizeof(mem_special));
- return res+16;
-}
-#ifdef free
-#undef free
-#endif
-/** free with stats */
-void unbound_stat_free(void *ptr)
-{
- size_t s;
- if(!ptr) return;
- if(memcmp(ptr-8, &mem_special, sizeof(mem_special)) != 0) {
- free(ptr);
- return;
- }
- ptr-=16;
- memcpy(&s, ptr, sizeof(s));
- log_info("stat free(%p) size %u", ptr+16, (unsigned)s);
- memset(ptr+8, 0, 8);
- unbound_mem_freed += s;
- free(ptr);
-}
-#ifdef realloc
-#undef realloc
-#endif
-/** realloc with stats */
-void *unbound_stat_realloc(void *ptr, size_t size)
-{
- size_t cursz;
- void* res;
- if(!ptr) return unbound_stat_malloc(size);
- if(memcmp(ptr-8, &mem_special, sizeof(mem_special)) != 0) {
- return realloc(ptr, size);
- }
- if(size==0) {
- unbound_stat_free(ptr);
- return NULL;
- }
- ptr -= 16;
- memcpy(&cursz, ptr, sizeof(cursz));
- if(cursz == size) {
- /* nothing changes */
- return ptr;
- }
- res = malloc(size+16);
- if(!res) return NULL;
- unbound_mem_alloc += size;
- unbound_mem_freed += cursz;
- log_info("stat realloc(%p, %u) from %u", ptr+16, (unsigned)size, (unsigned)cursz);
- if(cursz > size) {
- memcpy(res+16, ptr+16, size);
- } else if(size > cursz) {
- memcpy(res+16, ptr+16, cursz);
- }
- memset(ptr+8, 0, 8);
- free(ptr);
- memcpy(res, &size, sizeof(size));
- memcpy(res+8, &mem_special, sizeof(mem_special));
- return res+16;
-}
-
-/** log to file where alloc was done */
-void *unbound_stat_malloc_log(size_t size, const char* file, int line,
- const char* func)
-{
- log_info("%s:%d %s malloc(%u)", file, line, func, (unsigned)size);
- return unbound_stat_malloc(size);
-}
-
-/** log to file where alloc was done */
-void *unbound_stat_calloc_log(size_t nmemb, size_t size, const char* file,
- int line, const char* func)
-{
- log_info("%s:%d %s calloc(%u, %u)", file, line, func,
- (unsigned) nmemb, (unsigned)size);
- return unbound_stat_calloc(nmemb, size);
-}
-
-/** log to file where free was done */
-void unbound_stat_free_log(void *ptr, const char* file, int line,
- const char* func)
-{
- if(ptr && memcmp(ptr-8, &mem_special, sizeof(mem_special)) == 0) {
- size_t s;
- memcpy(&s, ptr-16, sizeof(s));
- log_info("%s:%d %s free(%p) size %u",
- file, line, func, ptr, (unsigned)s);
- } else
- log_info("%s:%d %s unmatched free(%p)", file, line, func, ptr);
- unbound_stat_free(ptr);
-}
-
-/** log to file where alloc was done */
-void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
- int line, const char* func)
-{
- log_info("%s:%d %s realloc(%p, %u)", file, line, func,
- ptr, (unsigned)size);
- return unbound_stat_realloc(ptr, size);
-}
-
-#endif /* UNBOUND_ALLOC_STATS */
-#ifdef UNBOUND_ALLOC_LITE
-#undef malloc
-#undef calloc
-#undef free
-#undef realloc
-/** length of prefix and suffix */
-static size_t lite_pad = 16;
-/** prefix value to check */
-static char* lite_pre = "checkfront123456";
-/** suffix value to check */
-static char* lite_post= "checkafter123456";
-
-void *unbound_stat_malloc_lite(size_t size, const char* file, int line,
- const char* func)
-{
- /* [prefix .. len .. actual data .. suffix] */
- void* res = malloc(size+lite_pad*2+sizeof(size_t));
- if(!res) return NULL;
- memmove(res, lite_pre, lite_pad);
- memmove(res+lite_pad, &size, sizeof(size_t));
- memset(res+lite_pad+sizeof(size_t), 0x1a, size); /* init the memory */
- memmove(res+lite_pad+size+sizeof(size_t), lite_post, lite_pad);
- return res+lite_pad+sizeof(size_t);
-}
-
-void *unbound_stat_calloc_lite(size_t nmemb, size_t size, const char* file,
- int line, const char* func)
-{
- size_t req;
- void* res;
- if(nmemb != 0 && INT_MAX/nmemb < size)
- return NULL; /* integer overflow check */
- req = nmemb * size;
- res = malloc(req+lite_pad*2+sizeof(size_t));
- if(!res) return NULL;
- memmove(res, lite_pre, lite_pad);
- memmove(res+lite_pad, &req, sizeof(size_t));
- memset(res+lite_pad+sizeof(size_t), 0, req);
- memmove(res+lite_pad+req+sizeof(size_t), lite_post, lite_pad);
- return res+lite_pad+sizeof(size_t);
-}
-
-void unbound_stat_free_lite(void *ptr, const char* file, int line,
- const char* func)
-{
- void* real;
- size_t orig = 0;
- if(!ptr) return;
- real = ptr-lite_pad-sizeof(size_t);
- if(memcmp(real, lite_pre, lite_pad) != 0) {
- log_err("free(): prefix failed %s:%d %s", file, line, func);
- log_hex("prefix here", real, lite_pad);
- log_hex(" should be", lite_pre, lite_pad);
- fatal_exit("alloc assertion failed");
- }
- memmove(&orig, real+lite_pad, sizeof(size_t));
- if(memcmp(real+lite_pad+orig+sizeof(size_t), lite_post, lite_pad)!=0){
- log_err("free(): suffix failed %s:%d %s", file, line, func);
- log_err("alloc size is %d", (int)orig);
- log_hex("suffix here", real+lite_pad+orig+sizeof(size_t),
- lite_pad);
- log_hex(" should be", lite_post, lite_pad);
- fatal_exit("alloc assertion failed");
- }
- memset(real, 0xdd, orig+lite_pad*2+sizeof(size_t)); /* mark it */
- free(real);
-}
-
-void *unbound_stat_realloc_lite(void *ptr, size_t size, const char* file,
- int line, const char* func)
-{
- /* always free and realloc (no growing) */
- void* real, *newa;
- size_t orig = 0;
- if(!ptr) {
- /* like malloc() */
- return unbound_stat_malloc_lite(size, file, line, func);
- }
- if(!size) {
- /* like free() */
- unbound_stat_free_lite(ptr, file, line, func);
- return NULL;
- }
- /* change allocation size and copy */
- real = ptr-lite_pad-sizeof(size_t);
- if(memcmp(real, lite_pre, lite_pad) != 0) {
- log_err("realloc(): prefix failed %s:%d %s", file, line, func);
- log_hex("prefix here", real, lite_pad);
- log_hex(" should be", lite_pre, lite_pad);
- fatal_exit("alloc assertion failed");
- }
- memmove(&orig, real+lite_pad, sizeof(size_t));
- if(memcmp(real+lite_pad+orig+sizeof(size_t), lite_post, lite_pad)!=0){
- log_err("realloc(): suffix failed %s:%d %s", file, line, func);
- log_err("alloc size is %d", (int)orig);
- log_hex("suffix here", real+lite_pad+orig+sizeof(size_t),
- lite_pad);
- log_hex(" should be", lite_post, lite_pad);
- fatal_exit("alloc assertion failed");
- }
- /* new alloc and copy over */
- newa = unbound_stat_malloc_lite(size, file, line, func);
- if(!newa)
- return NULL;
- if(orig < size)
- memmove(newa, ptr, orig);
- else memmove(newa, ptr, size);
- memset(real, 0xdd, orig+lite_pad*2+sizeof(size_t)); /* mark it */
- free(real);
- return newa;
-}
-
-char* unbound_strdup_lite(const char* s, const char* file, int line,
- const char* func)
-{
- /* this routine is made to make sure strdup() uses the malloc_lite */
- size_t l = strlen(s)+1;
- char* n = (char*)unbound_stat_malloc_lite(l, file, line, func);
- if(!n) return NULL;
- memmove(n, s, l);
- return n;
-}
-
-char* unbound_lite_wrapstr(char* s)
-{
- char* n = unbound_strdup_lite(s, __FILE__, __LINE__, __func__);
- free(s);
- return n;
-}
-
-#undef sldns_pkt2wire
-sldns_status unbound_lite_pkt2wire(uint8_t **dest, const sldns_pkt *p,
- size_t *size)
-{
- uint8_t* md = NULL;
- size_t ms = 0;
- sldns_status s = sldns_pkt2wire(&md, p, &ms);
- if(md) {
- *dest = unbound_stat_malloc_lite(ms, __FILE__, __LINE__,
- __func__);
- *size = ms;
- if(!*dest) { free(md); return LDNS_STATUS_MEM_ERR; }
- memcpy(*dest, md, ms);
- free(md);
- } else {
- *dest = NULL;
- *size = 0;
- }
- return s;
-}
-
-#undef i2d_DSA_SIG
-int unbound_lite_i2d_DSA_SIG(DSA_SIG* dsasig, unsigned char** sig)
-{
- unsigned char* n = NULL;
- int r= i2d_DSA_SIG(dsasig, &n);
- if(n) {
- *sig = unbound_stat_malloc_lite((size_t)r, __FILE__, __LINE__,
- __func__);
- if(!*sig) return -1;
- memcpy(*sig, n, (size_t)r);
- free(n);
- return r;
- }
- *sig = NULL;
- return r;
-}
-
-#endif /* UNBOUND_ALLOC_LITE */
diff --git a/external/unbound/util/alloc.h b/external/unbound/util/alloc.h
deleted file mode 100644
index 9839a4550..000000000
--- a/external/unbound/util/alloc.h
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * util/alloc.h - memory allocation service.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains memory allocation functions.
- *
- * The reasons for this service are:
- * o Avoid locking costs of getting global lock to call malloc().
- * o The packed rrset type needs to be kept on special freelists,
- * so that they are reused for other packet rrset allocations.
- *
- */
-
-#ifndef UTIL_ALLOC_H
-#define UTIL_ALLOC_H
-
-#include "util/locks.h"
-struct ub_packed_rrset_key;
-struct regional;
-
-/** The special type, packed rrset. Not allowed to be used for other memory */
-typedef struct ub_packed_rrset_key alloc_special_type;
-/** clean the special type. Pass pointer. */
-#define alloc_special_clean(x) (x)->id = 0;
-/** access next pointer. (in available spot). Pass pointer. */
-#define alloc_special_next(x) ((alloc_special_type*)((x)->entry.overflow_next))
-/** set next pointer. (in available spot). Pass pointers. */
-#define alloc_set_special_next(x, y) \
- ((x)->entry.overflow_next) = (struct lruhash_entry*)(y);
-
-/** how many blocks to cache locally. */
-#define ALLOC_SPECIAL_MAX 10
-
-/**
- * Structure that provides allocation. Use one per thread.
- * The one on top has a NULL super pointer.
- */
-struct alloc_cache {
- /** lock, only used for the super. */
- lock_quick_type lock;
- /** global allocator above this one. NULL for none (malloc/free) */
- struct alloc_cache* super;
- /** singly linked lists of special type. These are free for use. */
- alloc_special_type* quar;
- /** number of items in quarantine. */
- size_t num_quar;
- /** thread number for id creation */
- int thread_num;
- /** next id number to pass out */
- uint64_t next_id;
- /** last id number possible */
- uint64_t last_id;
- /** what function to call to cleanup when last id is reached */
- void (*cleanup)(void*);
- /** user arg for cleanup */
- void* cleanup_arg;
-
- /** how many regional blocks to keep back max */
- size_t max_reg_blocks;
- /** how many regional blocks are kept now */
- size_t num_reg_blocks;
- /** linked list of regional blocks, using regional->next */
- struct regional* reg_list;
-};
-
-/**
- * Init alloc (zeroes the struct).
- * @param alloc: this parameter is allocated by the caller.
- * @param super: super to use (init that before with super_init).
- * Pass this argument NULL to init the toplevel alloc structure.
- * @param thread_num: thread number for id creation of special type.
- */
-void alloc_init(struct alloc_cache* alloc, struct alloc_cache* super,
- int thread_num);
-
-/**
- * Free the alloc. Pushes all the cached items into the super structure.
- * Or deletes them if alloc->super is NULL.
- * Does not free the alloc struct itself (it was also allocated by caller).
- * @param alloc: is almost zeroed on exit (except some stats).
- */
-void alloc_clear(struct alloc_cache* alloc);
-
-/**
- * Get a new special_type element.
- * @param alloc: where to alloc it.
- * @return: memory block. Will not return NULL (instead fatal_exit).
- * The block is zeroed.
- */
-alloc_special_type* alloc_special_obtain(struct alloc_cache* alloc);
-
-/**
- * Return special_type back to pool.
- * The block is cleaned up (zeroed) which also invalidates the ID inside.
- * @param alloc: where to alloc it.
- * @param mem: block to free.
- */
-void alloc_special_release(struct alloc_cache* alloc, alloc_special_type* mem);
-
-/**
- * Set ID number of special type to a fresh new ID number.
- * In case of ID number overflow, the rrset cache has to be cleared.
- * @param alloc: the alloc cache
- * @return: fresh id is returned.
- */
-uint64_t alloc_get_id(struct alloc_cache* alloc);
-
-/**
- * Get memory size of alloc cache, alloc structure including special types.
- * @param alloc: on what alloc.
- * @return size in bytes.
- */
-size_t alloc_get_mem(struct alloc_cache* alloc);
-
-/**
- * Print debug information (statistics).
- * @param alloc: on what alloc.
- */
-void alloc_stats(struct alloc_cache* alloc);
-
-/**
- * Get a new regional for query states
- * @param alloc: where to alloc it.
- * @return regional for use or NULL on alloc failure.
- */
-struct regional* alloc_reg_obtain(struct alloc_cache* alloc);
-
-/**
- * Put regional for query states back into alloc cache.
- * @param alloc: where to alloc it.
- * @param r: regional to put back.
- */
-void alloc_reg_release(struct alloc_cache* alloc, struct regional* r);
-
-/**
- * Set cleanup on ID overflow callback function. This should remove all
- * RRset ID references from the program. Clear the caches.
- * @param alloc: the alloc
- * @param cleanup: the callback function, called as cleanup(arg).
- * @param arg: user argument to callback function.
- */
-void alloc_set_id_cleanup(struct alloc_cache* alloc, void (*cleanup)(void*),
- void* arg);
-
-#ifdef UNBOUND_ALLOC_LITE
-# include <sldns/ldns.h>
-# include <sldns/packet.h>
-# ifdef HAVE_OPENSSL_SSL_H
-# include <openssl/ssl.h>
-# endif
-# define malloc(s) unbound_stat_malloc_lite(s, __FILE__, __LINE__, __func__)
-# define calloc(n,s) unbound_stat_calloc_lite(n, s, __FILE__, __LINE__, __func__)
-# define free(p) unbound_stat_free_lite(p, __FILE__, __LINE__, __func__)
-# define realloc(p,s) unbound_stat_realloc_lite(p, s, __FILE__, __LINE__, __func__)
-void *unbound_stat_malloc_lite(size_t size, const char* file, int line,
- const char* func);
-void *unbound_stat_calloc_lite(size_t nmemb, size_t size, const char* file,
- int line, const char* func);
-void unbound_stat_free_lite(void *ptr, const char* file, int line,
- const char* func);
-void *unbound_stat_realloc_lite(void *ptr, size_t size, const char* file,
- int line, const char* func);
-# ifdef strdup
-# undef strdup
-# endif
-# define strdup(s) unbound_strdup_lite(s, __FILE__, __LINE__, __func__)
-char* unbound_strdup_lite(const char* s, const char* file, int line,
- const char* func);
-char* unbound_lite_wrapstr(char* s);
-# define sldns_rr2str(rr) unbound_lite_wrapstr(sldns_rr2str(rr))
-# define sldns_rdf2str(rdf) unbound_lite_wrapstr(sldns_rdf2str(rdf))
-# define sldns_rr_type2str(t) unbound_lite_wrapstr(sldns_rr_type2str(t))
-# define sldns_rr_class2str(c) unbound_lite_wrapstr(sldns_rr_class2str(c))
-# define sldns_rr_list2str(r) unbound_lite_wrapstr(sldns_rr_list2str(r))
-# define sldns_pkt2str(p) unbound_lite_wrapstr(sldns_pkt2str(p))
-# define sldns_pkt_rcode2str(r) unbound_lite_wrapstr(sldns_pkt_rcode2str(r))
-# define sldns_pkt2wire(a, r, s) unbound_lite_pkt2wire(a, r, s)
-sldns_status unbound_lite_pkt2wire(uint8_t **dest, const sldns_pkt *p, size_t *size);
-# define i2d_DSA_SIG(d, s) unbound_lite_i2d_DSA_SIG(d, s)
-int unbound_lite_i2d_DSA_SIG(DSA_SIG* dsasig, unsigned char** sig);
-#endif /* UNBOUND_ALLOC_LITE */
-
-#endif /* UTIL_ALLOC_H */
diff --git a/external/unbound/util/as112.c b/external/unbound/util/as112.c
deleted file mode 100644
index 6ee694046..000000000
--- a/external/unbound/util/as112.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * util/as112.c - list of local zones.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file provides a list of lan zones.
- */
-
-#include "util/as112.h"
-
-static const char* as112_zone_array[] = {
- "10.in-addr.arpa.",
- "16.172.in-addr.arpa.",
- "17.172.in-addr.arpa.",
- "18.172.in-addr.arpa.",
- "19.172.in-addr.arpa.",
- "20.172.in-addr.arpa.",
- "21.172.in-addr.arpa.",
- "22.172.in-addr.arpa.",
- "23.172.in-addr.arpa.",
- "24.172.in-addr.arpa.",
- "25.172.in-addr.arpa.",
- "26.172.in-addr.arpa.",
- "27.172.in-addr.arpa.",
- "28.172.in-addr.arpa.",
- "29.172.in-addr.arpa.",
- "30.172.in-addr.arpa.",
- "31.172.in-addr.arpa.",
- "168.192.in-addr.arpa.",
- "0.in-addr.arpa.",
- "64.100.in-addr.arpa.",
- "65.100.in-addr.arpa.",
- "66.100.in-addr.arpa.",
- "67.100.in-addr.arpa.",
- "68.100.in-addr.arpa.",
- "69.100.in-addr.arpa.",
- "70.100.in-addr.arpa.",
- "71.100.in-addr.arpa.",
- "72.100.in-addr.arpa.",
- "73.100.in-addr.arpa.",
- "74.100.in-addr.arpa.",
- "75.100.in-addr.arpa.",
- "76.100.in-addr.arpa.",
- "77.100.in-addr.arpa.",
- "78.100.in-addr.arpa.",
- "79.100.in-addr.arpa.",
- "80.100.in-addr.arpa.",
- "81.100.in-addr.arpa.",
- "82.100.in-addr.arpa.",
- "83.100.in-addr.arpa.",
- "84.100.in-addr.arpa.",
- "85.100.in-addr.arpa.",
- "86.100.in-addr.arpa.",
- "87.100.in-addr.arpa.",
- "88.100.in-addr.arpa.",
- "89.100.in-addr.arpa.",
- "90.100.in-addr.arpa.",
- "91.100.in-addr.arpa.",
- "92.100.in-addr.arpa.",
- "93.100.in-addr.arpa.",
- "94.100.in-addr.arpa.",
- "95.100.in-addr.arpa.",
- "96.100.in-addr.arpa.",
- "97.100.in-addr.arpa.",
- "98.100.in-addr.arpa.",
- "99.100.in-addr.arpa.",
- "100.100.in-addr.arpa.",
- "101.100.in-addr.arpa.",
- "102.100.in-addr.arpa.",
- "103.100.in-addr.arpa.",
- "104.100.in-addr.arpa.",
- "105.100.in-addr.arpa.",
- "106.100.in-addr.arpa.",
- "107.100.in-addr.arpa.",
- "108.100.in-addr.arpa.",
- "109.100.in-addr.arpa.",
- "110.100.in-addr.arpa.",
- "111.100.in-addr.arpa.",
- "112.100.in-addr.arpa.",
- "113.100.in-addr.arpa.",
- "114.100.in-addr.arpa.",
- "115.100.in-addr.arpa.",
- "116.100.in-addr.arpa.",
- "117.100.in-addr.arpa.",
- "118.100.in-addr.arpa.",
- "119.100.in-addr.arpa.",
- "120.100.in-addr.arpa.",
- "121.100.in-addr.arpa.",
- "122.100.in-addr.arpa.",
- "123.100.in-addr.arpa.",
- "124.100.in-addr.arpa.",
- "125.100.in-addr.arpa.",
- "126.100.in-addr.arpa.",
- "127.100.in-addr.arpa.",
- "254.169.in-addr.arpa.",
- "2.0.192.in-addr.arpa.",
- "100.51.198.in-addr.arpa.",
- "113.0.203.in-addr.arpa.",
- "255.255.255.255.in-addr.arpa.",
- "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.",
- "d.f.ip6.arpa.",
- "8.e.f.ip6.arpa.",
- "9.e.f.ip6.arpa.",
- "a.e.f.ip6.arpa.",
- "b.e.f.ip6.arpa.",
- "8.b.d.0.1.0.0.2.ip6.arpa.",
- 0
-};
-
-const char** as112_zones = as112_zone_array;
diff --git a/external/unbound/util/as112.h b/external/unbound/util/as112.h
deleted file mode 100644
index 7d0329e82..000000000
--- a/external/unbound/util/as112.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * util/as112.c - list of local zones.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file provides a list of lan zones
- */
-
-#ifndef UTIL_AS112_H
-#define UTIL_AS112_H
-
-/**
- * Array of text-format domain names of the AS112 zones.
- * The array ends with NULL. "AS112" is a service on the internet that
- * that this array is named after. The names in this list (or some of them)
- * are null-routed by this service to avoid load on central servers caused by
- * mistaken lookups for local content on the global internet.
- *
- * This is the list of names that unbound should not normally be sending
- * on towards the internet, because they are local-use.
- */
-extern const char** as112_zones;
-
-#endif
diff --git a/external/unbound/util/config_file.c b/external/unbound/util/config_file.c
deleted file mode 100644
index af176929d..000000000
--- a/external/unbound/util/config_file.c
+++ /dev/null
@@ -1,2056 +0,0 @@
-/*
- * util/config_file.c - reads and stores the config file for unbound.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains functions for the config file.
- */
-
-#include "config.h"
-#include <ctype.h>
-#include <stdarg.h>
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-#include "util/log.h"
-#include "util/configyyrename.h"
-#include "util/config_file.h"
-#include "util/configparser.h"
-#include "util/net_help.h"
-#include "util/data/msgparse.h"
-#include "util/module.h"
-#include "util/regional.h"
-#include "util/fptr_wlist.h"
-#include "util/data/dname.h"
-#include "util/rtt.h"
-#include "services/cache/infra.h"
-#include "sldns/wire2str.h"
-#include "sldns/parseutil.h"
-#ifdef HAVE_GLOB_H
-# include <glob.h>
-#endif
-#ifdef CLIENT_SUBNET
-#include "edns-subnet/edns-subnet.h"
-#endif
-#ifdef HAVE_PWD_H
-#include <pwd.h>
-#endif
-
-/** from cfg username, after daemonise setup performed */
-uid_t cfg_uid = (uid_t)-1;
-/** from cfg username, after daemonise setup performed */
-gid_t cfg_gid = (gid_t)-1;
-/** for debug allow small timeout values for fast rollovers */
-int autr_permit_small_holddown = 0;
-
-/** global config during parsing */
-struct config_parser_state* cfg_parser = 0;
-
-/** init ports possible for use */
-static void init_outgoing_availports(int* array, int num);
-
-struct config_file*
-config_create(void)
-{
- struct config_file* cfg;
- cfg = (struct config_file*)calloc(1, sizeof(struct config_file));
- if(!cfg)
- return NULL;
- /* the defaults if no config is present */
- cfg->verbosity = 1;
- cfg->stat_interval = 0;
- cfg->stat_cumulative = 0;
- cfg->stat_extended = 0;
- cfg->num_threads = 1;
- cfg->port = UNBOUND_DNS_PORT;
- cfg->do_ip4 = 1;
- cfg->do_ip6 = 1;
- cfg->do_udp = 1;
- cfg->do_tcp = 1;
- cfg->tcp_upstream = 0;
- cfg->tcp_mss = 0;
- cfg->outgoing_tcp_mss = 0;
- cfg->ssl_service_key = NULL;
- cfg->ssl_service_pem = NULL;
- cfg->ssl_port = 853;
- cfg->ssl_upstream = 0;
- cfg->use_syslog = 1;
- cfg->log_identity = NULL; /* changed later with argv[0] */
- cfg->log_time_ascii = 0;
- cfg->log_queries = 0;
- cfg->log_replies = 0;
-#ifndef USE_WINSOCK
-# ifdef USE_MINI_EVENT
- /* select max 1024 sockets */
- cfg->outgoing_num_ports = 960;
- cfg->num_queries_per_thread = 512;
-# else
- /* libevent can use many sockets */
- cfg->outgoing_num_ports = 4096;
- cfg->num_queries_per_thread = 1024;
-# endif
- cfg->outgoing_num_tcp = 10;
- cfg->incoming_num_tcp = 10;
-#else
- cfg->outgoing_num_ports = 48; /* windows is limited in num fds */
- cfg->num_queries_per_thread = 24;
- cfg->outgoing_num_tcp = 2; /* leaves 64-52=12 for: 4if,1stop,thread4 */
- cfg->incoming_num_tcp = 2;
-#endif
- cfg->edns_buffer_size = 4096; /* 4k from rfc recommendation */
- cfg->msg_buffer_size = 65552; /* 64 k + a small margin */
- cfg->msg_cache_size = 4 * 1024 * 1024;
- cfg->msg_cache_slabs = 4;
- cfg->jostle_time = 200;
- cfg->rrset_cache_size = 4 * 1024 * 1024;
- cfg->rrset_cache_slabs = 4;
- cfg->host_ttl = 900;
- cfg->bogus_ttl = 60;
- cfg->min_ttl = 0;
- cfg->max_ttl = 3600 * 24;
- cfg->max_negative_ttl = 3600;
- cfg->prefetch = 0;
- cfg->prefetch_key = 0;
- cfg->infra_cache_slabs = 4;
- cfg->infra_cache_numhosts = 10000;
- cfg->infra_cache_min_rtt = 50;
- cfg->delay_close = 0;
- if(!(cfg->outgoing_avail_ports = (int*)calloc(65536, sizeof(int))))
- goto error_exit;
- init_outgoing_availports(cfg->outgoing_avail_ports, 65536);
- if(!(cfg->username = strdup(UB_USERNAME))) goto error_exit;
-#ifdef HAVE_CHROOT
- if(!(cfg->chrootdir = strdup(CHROOT_DIR))) goto error_exit;
-#endif
- if(!(cfg->directory = strdup(RUN_DIR))) goto error_exit;
- if(!(cfg->logfile = strdup(""))) goto error_exit;
- if(!(cfg->pidfile = strdup(PIDFILE))) goto error_exit;
- if(!(cfg->target_fetch_policy = strdup("3 2 1 0 0"))) goto error_exit;
- cfg->donotqueryaddrs = NULL;
- cfg->donotquery_localhost = 1;
- cfg->root_hints = NULL;
- cfg->use_systemd = 0;
- cfg->do_daemonize = 1;
- cfg->if_automatic = 0;
- cfg->so_rcvbuf = 0;
- cfg->so_sndbuf = 0;
- cfg->so_reuseport = 0;
- cfg->ip_transparent = 0;
- cfg->ip_freebind = 0;
- cfg->num_ifs = 0;
- cfg->ifs = NULL;
- cfg->num_out_ifs = 0;
- cfg->out_ifs = NULL;
- cfg->stubs = NULL;
- cfg->forwards = NULL;
-#ifdef CLIENT_SUBNET
- cfg->client_subnet = NULL;
- cfg->client_subnet_opcode = LDNS_EDNS_CLIENT_SUBNET;
- cfg->client_subnet_always_forward = 0;
- cfg->max_client_subnet_ipv4 = 24;
- cfg->max_client_subnet_ipv6 = 56;
-#endif
- cfg->views = NULL;
- cfg->acls = NULL;
- cfg->harden_short_bufsize = 0;
- cfg->harden_large_queries = 0;
- cfg->harden_glue = 1;
- cfg->harden_dnssec_stripped = 1;
- cfg->harden_below_nxdomain = 0;
- cfg->harden_referral_path = 0;
- cfg->harden_algo_downgrade = 0;
- cfg->use_caps_bits_for_id = 0;
- cfg->caps_whitelist = NULL;
- cfg->private_address = NULL;
- cfg->private_domain = NULL;
- cfg->unwanted_threshold = 0;
- cfg->hide_identity = 0;
- cfg->hide_version = 0;
- cfg->hide_trustanchor = 0;
- cfg->identity = NULL;
- cfg->version = NULL;
- cfg->auto_trust_anchor_file_list = NULL;
- cfg->trust_anchor_file_list = NULL;
- cfg->trust_anchor_list = NULL;
- cfg->trusted_keys_file_list = NULL;
- cfg->dlv_anchor_file = NULL;
- cfg->dlv_anchor_list = NULL;
- cfg->domain_insecure = NULL;
- cfg->val_date_override = 0;
- cfg->val_sig_skew_min = 3600; /* at least daylight savings trouble */
- cfg->val_sig_skew_max = 86400; /* at most timezone settings trouble */
- cfg->val_clean_additional = 1;
- cfg->val_log_level = 0;
- cfg->val_log_squelch = 0;
- cfg->val_permissive_mode = 0;
- cfg->ignore_cd = 0;
- cfg->serve_expired = 0;
- cfg->add_holddown = 30*24*3600;
- cfg->del_holddown = 30*24*3600;
- cfg->keep_missing = 366*24*3600; /* one year plus a little leeway */
- cfg->permit_small_holddown = 0;
- cfg->key_cache_size = 4 * 1024 * 1024;
- cfg->key_cache_slabs = 4;
- cfg->neg_cache_size = 1 * 1024 * 1024;
- cfg->local_zones = NULL;
- cfg->local_zones_nodefault = NULL;
- cfg->local_data = NULL;
- cfg->local_zone_overrides = NULL;
- cfg->unblock_lan_zones = 0;
- cfg->insecure_lan_zones = 0;
- cfg->python_script = NULL;
- cfg->remote_control_enable = 0;
- cfg->control_ifs = NULL;
- cfg->control_port = UNBOUND_CONTROL_PORT;
- cfg->remote_control_use_cert = 1;
- cfg->minimal_responses = 0;
- cfg->rrset_roundrobin = 0;
- cfg->max_udp_size = 4096;
- if(!(cfg->server_key_file = strdup(RUN_DIR"/unbound_server.key")))
- goto error_exit;
- if(!(cfg->server_cert_file = strdup(RUN_DIR"/unbound_server.pem")))
- goto error_exit;
- if(!(cfg->control_key_file = strdup(RUN_DIR"/unbound_control.key")))
- goto error_exit;
- if(!(cfg->control_cert_file = strdup(RUN_DIR"/unbound_control.pem")))
- goto error_exit;
-
-#ifdef CLIENT_SUBNET
- if(!(cfg->module_conf = strdup("subnetcache validator iterator"))) goto error_exit;
-#else
- if(!(cfg->module_conf = strdup("validator iterator"))) goto error_exit;
-#endif
- if(!(cfg->val_nsec3_key_iterations =
- strdup("1024 150 2048 500 4096 2500"))) goto error_exit;
-#if defined(DNSTAP_SOCKET_PATH)
- if(!(cfg->dnstap_socket_path = strdup(DNSTAP_SOCKET_PATH)))
- goto error_exit;
-#endif
- cfg->disable_dnssec_lame_check = 0;
- cfg->ip_ratelimit = 0;
- cfg->ratelimit = 0;
- cfg->ip_ratelimit_slabs = 4;
- cfg->ratelimit_slabs = 4;
- cfg->ip_ratelimit_size = 4*1024*1024;
- cfg->ratelimit_size = 4*1024*1024;
- cfg->ratelimit_for_domain = NULL;
- cfg->ratelimit_below_domain = NULL;
- cfg->ip_ratelimit_factor = 10;
- cfg->ratelimit_factor = 10;
- cfg->qname_minimisation = 0;
- cfg->qname_minimisation_strict = 0;
- cfg->shm_enable = 0;
- cfg->shm_key = 11777;
- cfg->dnscrypt = 0;
- cfg->dnscrypt_port = 0;
- cfg->dnscrypt_provider = NULL;
- cfg->dnscrypt_provider_cert = NULL;
- cfg->dnscrypt_secret_key = NULL;
- return cfg;
-error_exit:
- config_delete(cfg);
- return NULL;
-}
-
-struct config_file* config_create_forlib(void)
-{
- struct config_file* cfg = config_create();
- if(!cfg) return NULL;
- /* modifications for library use, less verbose, less memory */
- free(cfg->chrootdir);
- cfg->chrootdir = NULL;
- cfg->verbosity = 0;
- cfg->outgoing_num_ports = 16; /* in library use, this is 'reasonable'
- and probably within the ulimit(maxfds) of the user */
- cfg->outgoing_num_tcp = 2;
- cfg->msg_cache_size = 1024*1024;
- cfg->msg_cache_slabs = 1;
- cfg->rrset_cache_size = 1024*1024;
- cfg->rrset_cache_slabs = 1;
- cfg->infra_cache_slabs = 1;
- cfg->use_syslog = 0;
- cfg->key_cache_size = 1024*1024;
- cfg->key_cache_slabs = 1;
- cfg->neg_cache_size = 100 * 1024;
- cfg->donotquery_localhost = 0; /* allow, so that you can ask a
- forward nameserver running on localhost */
- cfg->val_log_level = 2; /* to fill why_bogus with */
- cfg->val_log_squelch = 1;
- return cfg;
-}
-
-/** check that the value passed is >= 0 */
-#define IS_NUMBER_OR_ZERO \
- if(atoi(val) == 0 && strcmp(val, "0") != 0) return 0
-/** check that the value passed is > 0 */
-#define IS_NONZERO_NUMBER \
- if(atoi(val) == 0) return 0
-/** check that the value passed is not 0 and a power of 2 */
-#define IS_POW2_NUMBER \
- if(atoi(val) == 0 || !is_pow2((size_t)atoi(val))) return 0
-/** check that the value passed is yes or no */
-#define IS_YES_OR_NO \
- if(strcmp(val, "yes") != 0 && strcmp(val, "no") != 0) return 0
-/** put integer_or_zero into variable */
-#define S_NUMBER_OR_ZERO(str, var) if(strcmp(opt, str) == 0) \
- { IS_NUMBER_OR_ZERO; cfg->var = atoi(val); }
-/** put integer_nonzero into variable */
-#define S_NUMBER_NONZERO(str, var) if(strcmp(opt, str) == 0) \
- { IS_NONZERO_NUMBER; cfg->var = atoi(val); }
-/** put integer_or_zero into unsigned */
-#define S_UNSIGNED_OR_ZERO(str, var) if(strcmp(opt, str) == 0) \
- { IS_NUMBER_OR_ZERO; cfg->var = (unsigned)atoi(val); }
-/** put integer_or_zero into size_t */
-#define S_SIZET_OR_ZERO(str, var) if(strcmp(opt, str) == 0) \
- { IS_NUMBER_OR_ZERO; cfg->var = (size_t)atoi(val); }
-/** put integer_nonzero into size_t */
-#define S_SIZET_NONZERO(str, var) if(strcmp(opt, str) == 0) \
- { IS_NONZERO_NUMBER; cfg->var = (size_t)atoi(val); }
-/** put yesno into variable */
-#define S_YNO(str, var) if(strcmp(opt, str) == 0) \
- { IS_YES_OR_NO; cfg->var = (strcmp(val, "yes") == 0); }
-/** put memsize into variable */
-#define S_MEMSIZE(str, var) if(strcmp(opt, str)==0) \
- { return cfg_parse_memsize(val, &cfg->var); }
-/** put pow2 number into variable */
-#define S_POW2(str, var) if(strcmp(opt, str)==0) \
- { IS_POW2_NUMBER; cfg->var = (size_t)atoi(val); }
-/** put string into variable */
-#define S_STR(str, var) if(strcmp(opt, str)==0) \
- { free(cfg->var); return (cfg->var = strdup(val)) != NULL; }
-/** put string into strlist */
-#define S_STRLIST(str, var) if(strcmp(opt, str)==0) \
- { return cfg_strlist_insert(&cfg->var, strdup(val)); }
-
-int config_set_option(struct config_file* cfg, const char* opt,
- const char* val)
-{
- S_NUMBER_OR_ZERO("verbosity:", verbosity)
- else if(strcmp(opt, "statistics-interval:") == 0) {
- if(strcmp(val, "0") == 0 || strcmp(val, "") == 0)
- cfg->stat_interval = 0;
- else if(atoi(val) == 0)
- return 0;
- else cfg->stat_interval = atoi(val);
- } else if(strcmp(opt, "num_threads:") == 0) {
- /* not supported, library must have 1 thread in bgworker */
- return 0;
- } else if(strcmp(opt, "outgoing-port-permit:") == 0) {
- return cfg_mark_ports(val, 1,
- cfg->outgoing_avail_ports, 65536);
- } else if(strcmp(opt, "outgoing-port-avoid:") == 0) {
- return cfg_mark_ports(val, 0,
- cfg->outgoing_avail_ports, 65536);
- } else if(strcmp(opt, "local-zone:") == 0) {
- return cfg_parse_local_zone(cfg, val);
- } else if(strcmp(opt, "val-override-date:") == 0) {
- if(strcmp(val, "") == 0 || strcmp(val, "0") == 0) {
- cfg->val_date_override = 0;
- } else if(strlen(val) == 14) {
- cfg->val_date_override = cfg_convert_timeval(val);
- return cfg->val_date_override != 0;
- } else {
- if(atoi(val) == 0) return 0;
- cfg->val_date_override = (uint32_t)atoi(val);
- }
- } else if(strcmp(opt, "local-data-ptr:") == 0) {
- char* ptr = cfg_ptr_reverse((char*)opt);
- return cfg_strlist_insert(&cfg->local_data, ptr);
- } else if(strcmp(opt, "logfile:") == 0) {
- cfg->use_syslog = 0;
- free(cfg->logfile);
- return (cfg->logfile = strdup(val)) != NULL;
- }
- else if(strcmp(opt, "log-time-ascii:") == 0)
- { IS_YES_OR_NO; cfg->log_time_ascii = (strcmp(val, "yes") == 0);
- log_set_time_asc(cfg->log_time_ascii); }
- else S_SIZET_NONZERO("max-udp-size:", max_udp_size)
- else S_YNO("use-syslog:", use_syslog)
- else S_STR("log-identity:", log_identity)
- else S_YNO("extended-statistics:", stat_extended)
- else S_YNO("statistics-cumulative:", stat_cumulative)
- else S_YNO("shm-enable:", shm_enable)
- else S_NUMBER_OR_ZERO("shm-key:", shm_key)
- else S_YNO("do-ip4:", do_ip4)
- else S_YNO("do-ip6:", do_ip6)
- else S_YNO("do-udp:", do_udp)
- else S_YNO("do-tcp:", do_tcp)
- else S_YNO("tcp-upstream:", tcp_upstream)
- else S_NUMBER_NONZERO("tcp-mss:", tcp_mss)
- else S_NUMBER_NONZERO("outgoing-tcp-mss:", outgoing_tcp_mss)
- else S_YNO("ssl-upstream:", ssl_upstream)
- else S_STR("ssl-service-key:", ssl_service_key)
- else S_STR("ssl-service-pem:", ssl_service_pem)
- else S_NUMBER_NONZERO("ssl-port:", ssl_port)
- else S_YNO("interface-automatic:", if_automatic)
- else S_YNO("use-systemd:", use_systemd)
- else S_YNO("do-daemonize:", do_daemonize)
- else S_NUMBER_NONZERO("port:", port)
- else S_NUMBER_NONZERO("outgoing-range:", outgoing_num_ports)
- else S_SIZET_OR_ZERO("outgoing-num-tcp:", outgoing_num_tcp)
- else S_SIZET_OR_ZERO("incoming-num-tcp:", incoming_num_tcp)
- else S_SIZET_NONZERO("edns-buffer-size:", edns_buffer_size)
- else S_SIZET_NONZERO("msg-buffer-size:", msg_buffer_size)
- else S_MEMSIZE("msg-cache-size:", msg_cache_size)
- else S_POW2("msg-cache-slabs:", msg_cache_slabs)
- else S_SIZET_NONZERO("num-queries-per-thread:",num_queries_per_thread)
- else S_SIZET_OR_ZERO("jostle-timeout:", jostle_time)
- else S_MEMSIZE("so-rcvbuf:", so_rcvbuf)
- else S_MEMSIZE("so-sndbuf:", so_sndbuf)
- else S_YNO("so-reuseport:", so_reuseport)
- else S_YNO("ip-transparent:", ip_transparent)
- else S_YNO("ip-freebind:", ip_freebind)
- else S_MEMSIZE("rrset-cache-size:", rrset_cache_size)
- else S_POW2("rrset-cache-slabs:", rrset_cache_slabs)
- else S_YNO("prefetch:", prefetch)
- else S_YNO("prefetch-key:", prefetch_key)
- else if(strcmp(opt, "cache-max-ttl:") == 0)
- { IS_NUMBER_OR_ZERO; cfg->max_ttl = atoi(val); MAX_TTL=(time_t)cfg->max_ttl;}
- else if(strcmp(opt, "cache-max-negative-ttl:") == 0)
- { IS_NUMBER_OR_ZERO; cfg->max_negative_ttl = atoi(val); MAX_NEG_TTL=(time_t)cfg->max_negative_ttl;}
- else if(strcmp(opt, "cache-min-ttl:") == 0)
- { IS_NUMBER_OR_ZERO; cfg->min_ttl = atoi(val); MIN_TTL=(time_t)cfg->min_ttl;}
- else if(strcmp(opt, "infra-cache-min-rtt:") == 0) {
- IS_NUMBER_OR_ZERO; cfg->infra_cache_min_rtt = atoi(val);
- RTT_MIN_TIMEOUT=cfg->infra_cache_min_rtt;
- }
- else S_NUMBER_OR_ZERO("infra-host-ttl:", host_ttl)
- else S_POW2("infra-cache-slabs:", infra_cache_slabs)
- else S_SIZET_NONZERO("infra-cache-numhosts:", infra_cache_numhosts)
- else S_NUMBER_OR_ZERO("delay-close:", delay_close)
- else S_STR("chroot:", chrootdir)
- else S_STR("username:", username)
- else S_STR("directory:", directory)
- else S_STR("pidfile:", pidfile)
- else S_YNO("hide-identity:", hide_identity)
- else S_YNO("hide-version:", hide_version)
- else S_YNO("hide-trustanchor:", hide_trustanchor)
- else S_STR("identity:", identity)
- else S_STR("version:", version)
- else S_STRLIST("root-hints:", root_hints)
- else S_STR("target-fetch-policy:", target_fetch_policy)
- else S_YNO("harden-glue:", harden_glue)
- else S_YNO("harden-short-bufsize:", harden_short_bufsize)
- else S_YNO("harden-large-queries:", harden_large_queries)
- else S_YNO("harden-dnssec-stripped:", harden_dnssec_stripped)
- else S_YNO("harden-below-nxdomain:", harden_below_nxdomain)
- else S_YNO("harden-referral-path:", harden_referral_path)
- else S_YNO("harden-algo-downgrade:", harden_algo_downgrade)
- else S_YNO("use-caps-for-id", use_caps_bits_for_id)
- else S_STRLIST("caps-whitelist:", caps_whitelist)
- else S_SIZET_OR_ZERO("unwanted-reply-threshold:", unwanted_threshold)
- else S_STRLIST("private-address:", private_address)
- else S_STRLIST("private-domain:", private_domain)
- else S_YNO("do-not-query-localhost:", donotquery_localhost)
- else S_STRLIST("do-not-query-address:", donotqueryaddrs)
- else S_STRLIST("auto-trust-anchor-file:", auto_trust_anchor_file_list)
- else S_STRLIST("trust-anchor-file:", trust_anchor_file_list)
- else S_STRLIST("trust-anchor:", trust_anchor_list)
- else S_STRLIST("trusted-keys-file:", trusted_keys_file_list)
- else S_STR("dlv-anchor-file:", dlv_anchor_file)
- else S_STRLIST("dlv-anchor:", dlv_anchor_list)
- else S_STRLIST("domain-insecure:", domain_insecure)
- else S_NUMBER_OR_ZERO("val-bogus-ttl:", bogus_ttl)
- else S_YNO("val-clean-additional:", val_clean_additional)
- else S_NUMBER_OR_ZERO("val-log-level:", val_log_level)
- else S_YNO("val-log-squelch:", val_log_squelch)
- else S_YNO("log-queries:", log_queries)
- else S_YNO("log-replies:", log_replies)
- else S_YNO("val-permissive-mode:", val_permissive_mode)
- else S_YNO("ignore-cd-flag:", ignore_cd)
- else S_YNO("serve-expired:", serve_expired)
- else S_STR("val-nsec3-keysize-iterations:", val_nsec3_key_iterations)
- else S_UNSIGNED_OR_ZERO("add-holddown:", add_holddown)
- else S_UNSIGNED_OR_ZERO("del-holddown:", del_holddown)
- else S_UNSIGNED_OR_ZERO("keep-missing:", keep_missing)
- else if(strcmp(opt, "permit-small-holddown:") == 0)
- { IS_YES_OR_NO; cfg->permit_small_holddown = (strcmp(val, "yes") == 0);
- autr_permit_small_holddown = cfg->permit_small_holddown; }
- else S_MEMSIZE("key-cache-size:", key_cache_size)
- else S_POW2("key-cache-slabs:", key_cache_slabs)
- else S_MEMSIZE("neg-cache-size:", neg_cache_size)
- else S_YNO("minimal-responses:", minimal_responses)
- else S_YNO("rrset-roundrobin:", rrset_roundrobin)
- else S_STRLIST("local-data:", local_data)
- else S_YNO("unblock-lan-zones:", unblock_lan_zones)
- else S_YNO("insecure-lan-zones:", insecure_lan_zones)
- else S_YNO("control-enable:", remote_control_enable)
- else S_STRLIST("control-interface:", control_ifs)
- else S_NUMBER_NONZERO("control-port:", control_port)
- else S_STR("server-key-file:", server_key_file)
- else S_STR("server-cert-file:", server_cert_file)
- else S_STR("control-key-file:", control_key_file)
- else S_STR("control-cert-file:", control_cert_file)
- else S_STR("module-config:", module_conf)
- else S_STR("python-script:", python_script)
- else S_YNO("disable-dnssec-lame-check:", disable_dnssec_lame_check)
-#ifdef CLIENT_SUBNET
- /* Can't set max subnet prefix here, since that value is used when
- * generating the address tree. */
- /* No client-subnet-always-forward here, module registration depends on
- * this option. */
-#endif
- else if(strcmp(opt, "ip-ratelimit:") == 0) {
- IS_NUMBER_OR_ZERO; cfg->ip_ratelimit = atoi(val);
- infra_ip_ratelimit=cfg->ip_ratelimit;
- }
- else if(strcmp(opt, "ratelimit:") == 0) {
- IS_NUMBER_OR_ZERO; cfg->ratelimit = atoi(val);
- infra_dp_ratelimit=cfg->ratelimit;
- }
- else S_MEMSIZE("ip-ratelimit-size:", ip_ratelimit_size)
- else S_MEMSIZE("ratelimit-size:", ratelimit_size)
- else S_POW2("ip-ratelimit-slabs:", ip_ratelimit_slabs)
- else S_POW2("ratelimit-slabs:", ratelimit_slabs)
- else S_NUMBER_OR_ZERO("ip-ratelimit-factor:", ip_ratelimit_factor)
- else S_NUMBER_OR_ZERO("ratelimit-factor:", ratelimit_factor)
- else S_YNO("qname-minimisation:", qname_minimisation)
- else S_YNO("qname-minimisation-strict:", qname_minimisation_strict)
- else if(strcmp(opt, "define-tag:") ==0) {
- return config_add_tag(cfg, val);
- /* val_sig_skew_min and max are copied into val_env during init,
- * so this does not update val_env with set_option */
- } else if(strcmp(opt, "val-sig-skew-min:") == 0)
- { IS_NUMBER_OR_ZERO; cfg->val_sig_skew_min = (int32_t)atoi(val); }
- else if(strcmp(opt, "val-sig-skew-max:") == 0)
- { IS_NUMBER_OR_ZERO; cfg->val_sig_skew_max = (int32_t)atoi(val); }
- else if (strcmp(opt, "outgoing-interface:") == 0) {
- char* d = strdup(val);
- char** oi =
- (char**)reallocarray(NULL, (size_t)cfg->num_out_ifs+1, sizeof(char*));
- if(!d || !oi) { free(d); free(oi); return -1; }
- if(cfg->out_ifs && cfg->num_out_ifs) {
- memmove(oi, cfg->out_ifs, cfg->num_out_ifs*sizeof(char*));
- free(cfg->out_ifs);
- }
- oi[cfg->num_out_ifs++] = d;
- cfg->out_ifs = oi;
- } else {
- /* unknown or unsupported (from the set_option interface):
- * interface, outgoing-interface, access-control,
- * stub-zone, name, stub-addr, stub-host, stub-prime
- * forward-first, stub-first, forward-ssl-upstream,
- * stub-ssl-upstream, forward-zone,
- * name, forward-addr, forward-host,
- * ratelimit-for-domain, ratelimit-below-domain,
- * local-zone-tag, access-control-view
- * send-client-subnet client-subnet-always-forward
- * max-client-subnet-ipv4 max-client-subnet-ipv6 */
- return 0;
- }
- return 1;
-}
-
-void config_print_func(char* line, void* arg)
-{
- FILE* f = (FILE*)arg;
- (void)fprintf(f, "%s\n", line);
-}
-
-/** collate func arg */
-struct config_collate_arg {
- /** list of result items */
- struct config_strlist_head list;
- /** if a malloc error occurred, 0 is OK */
- int status;
-};
-
-void config_collate_func(char* line, void* arg)
-{
- struct config_collate_arg* m = (struct config_collate_arg*)arg;
- if(m->status)
- return;
- if(!cfg_strlist_append(&m->list, strdup(line)))
- m->status = 1;
-}
-
-int config_get_option_list(struct config_file* cfg, const char* opt,
- struct config_strlist** list)
-{
- struct config_collate_arg m;
- memset(&m, 0, sizeof(m));
- *list = NULL;
- if(!config_get_option(cfg, opt, config_collate_func, &m))
- return 1;
- if(m.status) {
- config_delstrlist(m.list.first);
- return 2;
- }
- *list = m.list.first;
- return 0;
-}
-
-int
-config_get_option_collate(struct config_file* cfg, const char* opt, char** str)
-{
- struct config_strlist* list = NULL;
- int r;
- *str = NULL;
- if((r = config_get_option_list(cfg, opt, &list)) != 0)
- return r;
- *str = config_collate_cat(list);
- config_delstrlist(list);
- if(!*str) return 2;
- return 0;
-}
-
-char*
-config_collate_cat(struct config_strlist* list)
-{
- size_t total = 0, left;
- struct config_strlist* s;
- char *r, *w;
- if(!list) /* no elements */
- return strdup("");
- if(list->next == NULL) /* one element , no newline at end. */
- return strdup(list->str);
- /* count total length */
- for(s=list; s; s=s->next)
- total += strlen(s->str) + 1; /* len + newline */
- left = total+1; /* one extra for nul at end */
- r = malloc(left);
- if(!r)
- return NULL;
- w = r;
- for(s=list; s; s=s->next) {
- size_t this = strlen(s->str);
- if(this+2 > left) { /* sanity check */
- free(r);
- return NULL;
- }
- snprintf(w, left, "%s\n", s->str);
- this = strlen(w);
- w += this;
- left -= this;
- }
- return r;
-}
-
-/** compare and print decimal option */
-#define O_DEC(opt, str, var) if(strcmp(opt, str)==0) \
- {snprintf(buf, len, "%d", (int)cfg->var); \
- func(buf, arg);}
-/** compare and print unsigned option */
-#define O_UNS(opt, str, var) if(strcmp(opt, str)==0) \
- {snprintf(buf, len, "%u", (unsigned)cfg->var); \
- func(buf, arg);}
-/** compare and print yesno option */
-#define O_YNO(opt, str, var) if(strcmp(opt, str)==0) \
- {func(cfg->var?"yes":"no", arg);}
-/** compare and print string option */
-#define O_STR(opt, str, var) if(strcmp(opt, str)==0) \
- {func(cfg->var?cfg->var:"", arg);}
-/** compare and print array option */
-#define O_IFC(opt, str, num, arr) if(strcmp(opt, str)==0) \
- {int i; for(i=0; i<cfg->num; i++) func(cfg->arr[i], arg);}
-/** compare and print memorysize option */
-#define O_MEM(opt, str, var) if(strcmp(opt, str)==0) { \
- if(cfg->var > 1024*1024*1024) { \
- size_t f=cfg->var/(size_t)1000000, b=cfg->var%(size_t)1000000; \
- snprintf(buf, len, "%u%6.6u", (unsigned)f, (unsigned)b); \
- } else snprintf(buf, len, "%u", (unsigned)cfg->var); \
- func(buf, arg);}
-/** compare and print list option */
-#define O_LST(opt, name, lst) if(strcmp(opt, name)==0) { \
- struct config_strlist* p = cfg->lst; \
- for(p = cfg->lst; p; p = p->next) \
- func(p->str, arg); \
- }
-/** compare and print list option */
-#define O_LS2(opt, name, lst) if(strcmp(opt, name)==0) { \
- struct config_str2list* p = cfg->lst; \
- for(p = cfg->lst; p; p = p->next) { \
- snprintf(buf, len, "%s %s", p->str, p->str2); \
- func(buf, arg); \
- } \
- }
-/** compare and print list option */
-#define O_LS3(opt, name, lst) if(strcmp(opt, name)==0) { \
- struct config_str3list* p = cfg->lst; \
- for(p = cfg->lst; p; p = p->next) { \
- snprintf(buf, len, "%s %s %s", p->str, p->str2, p->str3); \
- func(buf, arg); \
- } \
- }
-/** compare and print taglist option */
-#define O_LTG(opt, name, lst) if(strcmp(opt, name)==0) { \
- char* tmpstr = NULL; \
- struct config_strbytelist *p = cfg->lst; \
- for(p = cfg->lst; p; p = p->next) {\
- tmpstr = config_taglist2str(cfg, p->str2, p->str2len); \
- if(tmpstr) {\
- snprintf(buf, len, "%s %s", p->str, tmpstr); \
- func(buf, arg); \
- free(tmpstr); \
- } \
- } \
- }
-
-int
-config_get_option(struct config_file* cfg, const char* opt,
- void (*func)(char*,void*), void* arg)
-{
- char buf[1024];
- size_t len = sizeof(buf);
- fptr_ok(fptr_whitelist_print_func(func));
- O_DEC(opt, "verbosity", verbosity)
- else O_DEC(opt, "statistics-interval", stat_interval)
- else O_YNO(opt, "statistics-cumulative", stat_cumulative)
- else O_YNO(opt, "extended-statistics", stat_extended)
- else O_YNO(opt, "shm-enable", shm_enable)
- else O_DEC(opt, "shm-key", shm_key)
- else O_YNO(opt, "use-syslog", use_syslog)
- else O_STR(opt, "log-identity", log_identity)
- else O_YNO(opt, "log-time-ascii", log_time_ascii)
- else O_DEC(opt, "num-threads", num_threads)
- else O_IFC(opt, "interface", num_ifs, ifs)
- else O_IFC(opt, "outgoing-interface", num_out_ifs, out_ifs)
- else O_YNO(opt, "interface-automatic", if_automatic)
- else O_DEC(opt, "port", port)
- else O_DEC(opt, "outgoing-range", outgoing_num_ports)
- else O_DEC(opt, "outgoing-num-tcp", outgoing_num_tcp)
- else O_DEC(opt, "incoming-num-tcp", incoming_num_tcp)
- else O_DEC(opt, "edns-buffer-size", edns_buffer_size)
- else O_DEC(opt, "msg-buffer-size", msg_buffer_size)
- else O_MEM(opt, "msg-cache-size", msg_cache_size)
- else O_DEC(opt, "msg-cache-slabs", msg_cache_slabs)
- else O_DEC(opt, "num-queries-per-thread", num_queries_per_thread)
- else O_UNS(opt, "jostle-timeout", jostle_time)
- else O_MEM(opt, "so-rcvbuf", so_rcvbuf)
- else O_MEM(opt, "so-sndbuf", so_sndbuf)
- else O_YNO(opt, "so-reuseport", so_reuseport)
- else O_YNO(opt, "ip-transparent", ip_transparent)
- else O_YNO(opt, "ip-freebind", ip_freebind)
- else O_MEM(opt, "rrset-cache-size", rrset_cache_size)
- else O_DEC(opt, "rrset-cache-slabs", rrset_cache_slabs)
- else O_YNO(opt, "prefetch-key", prefetch_key)
- else O_YNO(opt, "prefetch", prefetch)
- else O_DEC(opt, "cache-max-ttl", max_ttl)
- else O_DEC(opt, "cache-max-negative-ttl", max_negative_ttl)
- else O_DEC(opt, "cache-min-ttl", min_ttl)
- else O_DEC(opt, "infra-host-ttl", host_ttl)
- else O_DEC(opt, "infra-cache-slabs", infra_cache_slabs)
- else O_DEC(opt, "infra-cache-min-rtt", infra_cache_min_rtt)
- else O_MEM(opt, "infra-cache-numhosts", infra_cache_numhosts)
- else O_UNS(opt, "delay-close", delay_close)
- else O_YNO(opt, "do-ip4", do_ip4)
- else O_YNO(opt, "do-ip6", do_ip6)
- else O_YNO(opt, "do-udp", do_udp)
- else O_YNO(opt, "do-tcp", do_tcp)
- else O_YNO(opt, "tcp-upstream", tcp_upstream)
- else O_DEC(opt, "tcp-mss", tcp_mss)
- else O_DEC(opt, "outgoing-tcp-mss", outgoing_tcp_mss)
- else O_YNO(opt, "ssl-upstream", ssl_upstream)
- else O_STR(opt, "ssl-service-key", ssl_service_key)
- else O_STR(opt, "ssl-service-pem", ssl_service_pem)
- else O_DEC(opt, "ssl-port", ssl_port)
- else O_YNO(opt, "use-systemd", use_systemd)
- else O_YNO(opt, "do-daemonize", do_daemonize)
- else O_STR(opt, "chroot", chrootdir)
- else O_STR(opt, "username", username)
- else O_STR(opt, "directory", directory)
- else O_STR(opt, "logfile", logfile)
- else O_YNO(opt, "log-queries", log_queries)
- else O_YNO(opt, "log-replies", log_replies)
- else O_STR(opt, "pidfile", pidfile)
- else O_YNO(opt, "hide-identity", hide_identity)
- else O_YNO(opt, "hide-version", hide_version)
- else O_YNO(opt, "hide-trustanchor", hide_trustanchor)
- else O_STR(opt, "identity", identity)
- else O_STR(opt, "version", version)
- else O_STR(opt, "target-fetch-policy", target_fetch_policy)
- else O_YNO(opt, "harden-short-bufsize", harden_short_bufsize)
- else O_YNO(opt, "harden-large-queries", harden_large_queries)
- else O_YNO(opt, "harden-glue", harden_glue)
- else O_YNO(opt, "harden-dnssec-stripped", harden_dnssec_stripped)
- else O_YNO(opt, "harden-below-nxdomain", harden_below_nxdomain)
- else O_YNO(opt, "harden-referral-path", harden_referral_path)
- else O_YNO(opt, "harden-algo-downgrade", harden_algo_downgrade)
- else O_YNO(opt, "use-caps-for-id", use_caps_bits_for_id)
- else O_LST(opt, "caps-whitelist", caps_whitelist)
- else O_DEC(opt, "unwanted-reply-threshold", unwanted_threshold)
- else O_YNO(opt, "do-not-query-localhost", donotquery_localhost)
- else O_STR(opt, "module-config", module_conf)
- else O_STR(opt, "dlv-anchor-file", dlv_anchor_file)
- else O_DEC(opt, "val-bogus-ttl", bogus_ttl)
- else O_YNO(opt, "val-clean-additional", val_clean_additional)
- else O_DEC(opt, "val-log-level", val_log_level)
- else O_YNO(opt, "val-permissive-mode", val_permissive_mode)
- else O_YNO(opt, "ignore-cd-flag", ignore_cd)
- else O_YNO(opt, "serve-expired", serve_expired)
- else O_STR(opt, "val-nsec3-keysize-iterations",val_nsec3_key_iterations)
- else O_UNS(opt, "add-holddown", add_holddown)
- else O_UNS(opt, "del-holddown", del_holddown)
- else O_UNS(opt, "keep-missing", keep_missing)
- else O_YNO(opt, "permit-small-holddown", permit_small_holddown)
- else O_MEM(opt, "key-cache-size", key_cache_size)
- else O_DEC(opt, "key-cache-slabs", key_cache_slabs)
- else O_MEM(opt, "neg-cache-size", neg_cache_size)
- else O_YNO(opt, "control-enable", remote_control_enable)
- else O_DEC(opt, "control-port", control_port)
- else O_STR(opt, "server-key-file", server_key_file)
- else O_STR(opt, "server-cert-file", server_cert_file)
- else O_STR(opt, "control-key-file", control_key_file)
- else O_STR(opt, "control-cert-file", control_cert_file)
- else O_LST(opt, "root-hints", root_hints)
- else O_LS2(opt, "access-control", acls)
- else O_LST(opt, "do-not-query-address", donotqueryaddrs)
- else O_LST(opt, "private-address", private_address)
- else O_LST(opt, "private-domain", private_domain)
- else O_LST(opt, "auto-trust-anchor-file", auto_trust_anchor_file_list)
- else O_LST(opt, "trust-anchor-file", trust_anchor_file_list)
- else O_LST(opt, "trust-anchor", trust_anchor_list)
- else O_LST(opt, "trusted-keys-file", trusted_keys_file_list)
- else O_LST(opt, "dlv-anchor", dlv_anchor_list)
- else O_LST(opt, "control-interface", control_ifs)
- else O_LST(opt, "domain-insecure", domain_insecure)
- else O_UNS(opt, "val-override-date", val_date_override)
- else O_YNO(opt, "minimal-responses", minimal_responses)
- else O_YNO(opt, "rrset-roundrobin", rrset_roundrobin)
-#ifdef CLIENT_SUBNET
- else O_LST(opt, "send-client-subnet", client_subnet)
- else O_DEC(opt, "max-client-subnet-ipv4", max_client_subnet_ipv4)
- else O_DEC(opt, "max-client-subnet-ipv6", max_client_subnet_ipv6)
- else O_YNO(opt, "client-subnet-always-forward:",
- client_subnet_always_forward)
-#endif
- else O_YNO(opt, "unblock-lan-zones", unblock_lan_zones)
- else O_YNO(opt, "insecure-lan-zones", insecure_lan_zones)
- else O_DEC(opt, "max-udp-size", max_udp_size)
- else O_STR(opt, "python-script", python_script)
- else O_YNO(opt, "disable-dnssec-lame-check", disable_dnssec_lame_check)
- else O_DEC(opt, "ip-ratelimit", ip_ratelimit)
- else O_DEC(opt, "ratelimit", ratelimit)
- else O_MEM(opt, "ip-ratelimit-size", ip_ratelimit_size)
- else O_MEM(opt, "ratelimit-size", ratelimit_size)
- else O_DEC(opt, "ip-ratelimit-slabs", ip_ratelimit_slabs)
- else O_DEC(opt, "ratelimit-slabs", ratelimit_slabs)
- else O_LS2(opt, "ratelimit-for-domain", ratelimit_for_domain)
- else O_LS2(opt, "ratelimit-below-domain", ratelimit_below_domain)
- else O_DEC(opt, "ip-ratelimit-factor", ip_ratelimit_factor)
- else O_DEC(opt, "ratelimit-factor", ratelimit_factor)
- else O_DEC(opt, "val-sig-skew-min", val_sig_skew_min)
- else O_DEC(opt, "val-sig-skew-max", val_sig_skew_max)
- else O_YNO(opt, "qname-minimisation", qname_minimisation)
- else O_YNO(opt, "qname-minimisation-strict", qname_minimisation_strict)
- else O_IFC(opt, "define-tag", num_tags, tagname)
- else O_LTG(opt, "local-zone-tag", local_zone_tags)
- else O_LTG(opt, "access-control-tag", acl_tags)
- else O_LTG(opt, "response-ip-tag", respip_tags)
- else O_LS3(opt, "local-zone-override", local_zone_overrides)
- else O_LS3(opt, "access-control-tag-action", acl_tag_actions)
- else O_LS3(opt, "access-control-tag-data", acl_tag_datas)
- else O_LS2(opt, "access-control-view", acl_view)
- /* not here:
- * outgoing-permit, outgoing-avoid - have list of ports
- * local-zone - zones and nodefault variables
- * local-data - see below
- * local-data-ptr - converted to local-data entries
- * stub-zone, name, stub-addr, stub-host, stub-prime
- * forward-zone, name, forward-addr, forward-host
- */
- else return 0;
- return 1;
-}
-
-/** initialize the global cfg_parser object */
-static void
-create_cfg_parser(struct config_file* cfg, char* filename, const char* chroot)
-{
- static struct config_parser_state st;
- cfg_parser = &st;
- cfg_parser->filename = filename;
- cfg_parser->line = 1;
- cfg_parser->errors = 0;
- cfg_parser->cfg = cfg;
- cfg_parser->chroot = chroot;
- init_cfg_parse();
-}
-
-int
-config_read(struct config_file* cfg, const char* filename, const char* chroot)
-{
- FILE *in;
- char *fname = (char*)filename;
-#ifdef HAVE_GLOB
- glob_t g;
- size_t i;
- int r, flags;
-#endif
- if(!fname)
- return 1;
-
- /* check for wildcards */
-#ifdef HAVE_GLOB
- if(!(!strchr(fname, '*') && !strchr(fname, '?') && !strchr(fname, '[') &&
- !strchr(fname, '{') && !strchr(fname, '~'))) {
- verbose(VERB_QUERY, "wildcard found, processing %s", fname);
- flags = 0
-#ifdef GLOB_ERR
- | GLOB_ERR
-#endif
-#ifdef GLOB_NOSORT
- | GLOB_NOSORT
-#endif
-#ifdef GLOB_BRACE
- | GLOB_BRACE
-#endif
-#ifdef GLOB_TILDE
- | GLOB_TILDE
-#endif
- ;
- memset(&g, 0, sizeof(g));
- r = glob(fname, flags, NULL, &g);
- if(r) {
- /* some error */
- globfree(&g);
- if(r == GLOB_NOMATCH) {
- verbose(VERB_QUERY, "include: "
- "no matches for %s", fname);
- return 1;
- } else if(r == GLOB_NOSPACE) {
- log_err("include: %s: "
- "fnametern out of memory", fname);
- } else if(r == GLOB_ABORTED) {
- log_err("wildcard include: %s: expansion "
- "aborted (%s)", fname, strerror(errno));
- } else {
- log_err("wildcard include: %s: expansion "
- "failed (%s)", fname, strerror(errno));
- }
- /* ignore globs that yield no files */
- return 1;
- }
- /* process files found, if any */
- for(i=0; i<(size_t)g.gl_pathc; i++) {
- if(!config_read(cfg, g.gl_pathv[i], chroot)) {
- log_err("error reading wildcard "
- "include: %s", g.gl_pathv[i]);
- globfree(&g);
- return 0;
- }
- }
- globfree(&g);
- return 1;
- }
-#endif /* HAVE_GLOB */
-
- in = fopen(fname, "r");
- if(!in) {
- log_err("Could not open %s: %s", fname, strerror(errno));
- return 0;
- }
- create_cfg_parser(cfg, fname, chroot);
- ub_c_in = in;
- ub_c_parse();
- fclose(in);
-
- if(!cfg->dnscrypt) cfg->dnscrypt_port = 0;
-
- if(cfg_parser->errors != 0) {
- fprintf(stderr, "read %s failed: %d errors in configuration file\n",
- fname, cfg_parser->errors);
- errno=EINVAL;
- return 0;
- }
-
- return 1;
-}
-
-struct config_stub* cfg_stub_find(struct config_stub*** pp, const char* nm)
-{
- struct config_stub* p = *(*pp);
- while(p) {
- if(strcmp(p->name, nm) == 0)
- return p;
- (*pp) = &p->next;
- p = p->next;
- }
- return NULL;
-}
-
-void
-config_delstrlist(struct config_strlist* p)
-{
- struct config_strlist *np;
- while(p) {
- np = p->next;
- free(p->str);
- free(p);
- p = np;
- }
-}
-
-void
-config_deldblstrlist(struct config_str2list* p)
-{
- struct config_str2list *np;
- while(p) {
- np = p->next;
- free(p->str);
- free(p->str2);
- free(p);
- p = np;
- }
-}
-
-void
-config_deltrplstrlist(struct config_str3list* p)
-{
- struct config_str3list *np;
- while(p) {
- np = p->next;
- free(p->str);
- free(p->str2);
- free(p->str3);
- free(p);
- p = np;
- }
-}
-
-void
-config_delstub(struct config_stub* p)
-{
- if(!p) return;
- free(p->name);
- config_delstrlist(p->hosts);
- config_delstrlist(p->addrs);
- free(p);
-}
-
-void
-config_delstubs(struct config_stub* p)
-{
- struct config_stub* np;
- while(p) {
- np = p->next;
- config_delstub(p);
- p = np;
- }
-}
-
-void
-config_delview(struct config_view* p)
-{
- if(!p) return;
- free(p->name);
- config_deldblstrlist(p->local_zones);
- config_delstrlist(p->local_zones_nodefault);
- config_delstrlist(p->local_data);
- free(p);
-}
-
-void
-config_delviews(struct config_view* p)
-{
- struct config_view* np;
- while(p) {
- np = p->next;
- config_delview(p);
- p = np;
- }
-}
-/** delete string array */
-static void
-config_del_strarray(char** array, int num)
-{
- int i;
- if(!array)
- return;
- for(i=0; i<num; i++) {
- free(array[i]);
- }
- free(array);
-}
-
-void
-config_del_strbytelist(struct config_strbytelist* p)
-{
- struct config_strbytelist* np;
- while(p) {
- np = p->next;
- free(p->str);
- free(p->str2);
- free(p);
- p = np;
- }
-}
-
-void
-config_delete(struct config_file* cfg)
-{
- if(!cfg) return;
- free(cfg->username);
- free(cfg->chrootdir);
- free(cfg->directory);
- free(cfg->logfile);
- free(cfg->pidfile);
- free(cfg->target_fetch_policy);
- free(cfg->ssl_service_key);
- free(cfg->ssl_service_pem);
- free(cfg->log_identity);
- config_del_strarray(cfg->ifs, cfg->num_ifs);
- config_del_strarray(cfg->out_ifs, cfg->num_out_ifs);
- config_delstubs(cfg->stubs);
- config_delstubs(cfg->forwards);
- config_delviews(cfg->views);
- config_delstrlist(cfg->donotqueryaddrs);
- config_delstrlist(cfg->root_hints);
-#ifdef CLIENT_SUBNET
- config_delstrlist(cfg->client_subnet);
-#endif
- free(cfg->identity);
- free(cfg->version);
- free(cfg->module_conf);
- free(cfg->outgoing_avail_ports);
- config_delstrlist(cfg->caps_whitelist);
- config_delstrlist(cfg->private_address);
- config_delstrlist(cfg->private_domain);
- config_delstrlist(cfg->auto_trust_anchor_file_list);
- config_delstrlist(cfg->trust_anchor_file_list);
- config_delstrlist(cfg->trusted_keys_file_list);
- config_delstrlist(cfg->trust_anchor_list);
- config_delstrlist(cfg->domain_insecure);
- free(cfg->dlv_anchor_file);
- config_delstrlist(cfg->dlv_anchor_list);
- config_deldblstrlist(cfg->acls);
- free(cfg->val_nsec3_key_iterations);
- config_deldblstrlist(cfg->local_zones);
- config_delstrlist(cfg->local_zones_nodefault);
- config_delstrlist(cfg->local_data);
- config_deltrplstrlist(cfg->local_zone_overrides);
- config_del_strarray(cfg->tagname, cfg->num_tags);
- config_del_strbytelist(cfg->local_zone_tags);
- config_del_strbytelist(cfg->acl_tags);
- config_del_strbytelist(cfg->respip_tags);
- config_deltrplstrlist(cfg->acl_tag_actions);
- config_deltrplstrlist(cfg->acl_tag_datas);
- config_delstrlist(cfg->control_ifs);
- free(cfg->server_key_file);
- free(cfg->server_cert_file);
- free(cfg->control_key_file);
- free(cfg->control_cert_file);
- free(cfg->dns64_prefix);
- free(cfg->dnstap_socket_path);
- free(cfg->dnstap_identity);
- free(cfg->dnstap_version);
- config_deldblstrlist(cfg->ratelimit_for_domain);
- config_deldblstrlist(cfg->ratelimit_below_domain);
- free(cfg);
-}
-
-static void
-init_outgoing_availports(int* a, int num)
-{
- /* generated with make iana_update */
- const int iana_assigned[] = {
-#include "util/iana_ports.inc"
- -1 }; /* end marker to put behind trailing comma */
-
- int i;
- /* do not use <1024, that could be trouble with the system, privs */
- for(i=1024; i<num; i++) {
- a[i] = i;
- }
- /* create empty spot at 49152 to keep ephemeral ports available
- * to other programs */
- for(i=49152; i<49152+256; i++)
- a[i] = 0;
- /* pick out all the IANA assigned ports */
- for(i=0; iana_assigned[i]!=-1; i++) {
- if(iana_assigned[i] < num)
- a[iana_assigned[i]] = 0;
- }
-}
-
-int
-cfg_mark_ports(const char* str, int allow, int* avail, int num)
-{
- char* mid = strchr(str, '-');
- if(!mid) {
- int port = atoi(str);
- if(port == 0 && strcmp(str, "0") != 0) {
- log_err("cannot parse port number '%s'", str);
- return 0;
- }
- if(port < num)
- avail[port] = (allow?port:0);
- } else {
- int i, low, high = atoi(mid+1);
- char buf[16];
- if(high == 0 && strcmp(mid+1, "0") != 0) {
- log_err("cannot parse port number '%s'", mid+1);
- return 0;
- }
- if( (int)(mid-str)+1 >= (int)sizeof(buf) ) {
- log_err("cannot parse port number '%s'", str);
- return 0;
- }
- if(mid > str)
- memcpy(buf, str, (size_t)(mid-str));
- buf[mid-str] = 0;
- low = atoi(buf);
- if(low == 0 && strcmp(buf, "0") != 0) {
- log_err("cannot parse port number '%s'", buf);
- return 0;
- }
- for(i=low; i<=high; i++) {
- if(i < num)
- avail[i] = (allow?i:0);
- }
- return 1;
- }
- return 1;
-}
-
-int
-cfg_scan_ports(int* avail, int num)
-{
- int i;
- int count = 0;
- for(i=0; i<num; i++) {
- if(avail[i])
- count++;
- }
- return count;
-}
-
-int cfg_condense_ports(struct config_file* cfg, int** avail)
-{
- int num = cfg_scan_ports(cfg->outgoing_avail_ports, 65536);
- int i, at = 0;
- *avail = NULL;
- if(num == 0)
- return 0;
- *avail = (int*)reallocarray(NULL, (size_t)num, sizeof(int));
- if(!*avail)
- return 0;
- for(i=0; i<65536; i++) {
- if(cfg->outgoing_avail_ports[i])
- (*avail)[at++] = cfg->outgoing_avail_ports[i];
- }
- log_assert(at == num);
- return num;
-}
-
-/** print error with file and line number */
-static void ub_c_error_va_list(const char *fmt, va_list args)
-{
- cfg_parser->errors++;
- fprintf(stderr, "%s:%d: error: ", cfg_parser->filename,
- cfg_parser->line);
- vfprintf(stderr, fmt, args);
- fprintf(stderr, "\n");
-}
-
-/** print error with file and line number */
-void ub_c_error_msg(const char* fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- ub_c_error_va_list(fmt, args);
- va_end(args);
-}
-
-void ub_c_error(const char *str)
-{
- cfg_parser->errors++;
- fprintf(stderr, "%s:%d: error: %s\n", cfg_parser->filename,
- cfg_parser->line, str);
-}
-
-int ub_c_wrap(void)
-{
- return 1;
-}
-
-int cfg_strlist_append(struct config_strlist_head* list, char* item)
-{
- struct config_strlist *s;
- if(!item || !list)
- return 0;
- s = (struct config_strlist*)calloc(1, sizeof(struct config_strlist));
- if(!s)
- return 0;
- s->str = item;
- s->next = NULL;
- if(list->last)
- list->last->next = s;
- else
- list->first = s;
- list->last = s;
- return 1;
-}
-
-int
-cfg_region_strlist_insert(struct regional* region,
- struct config_strlist** head, char* item)
-{
- struct config_strlist *s;
- if(!item || !head)
- return 0;
- s = (struct config_strlist*)regional_alloc_zero(region,
- sizeof(struct config_strlist));
- if(!s)
- return 0;
- s->str = item;
- s->next = *head;
- *head = s;
- return 1;
-}
-
-int
-cfg_strlist_insert(struct config_strlist** head, char* item)
-{
- struct config_strlist *s;
- if(!item || !head)
- return 0;
- s = (struct config_strlist*)calloc(1, sizeof(struct config_strlist));
- if(!s)
- return 0;
- s->str = item;
- s->next = *head;
- *head = s;
- return 1;
-}
-
-int
-cfg_str2list_insert(struct config_str2list** head, char* item, char* i2)
-{
- struct config_str2list *s;
- if(!item || !i2 || !head)
- return 0;
- s = (struct config_str2list*)calloc(1, sizeof(struct config_str2list));
- if(!s)
- return 0;
- s->str = item;
- s->str2 = i2;
- s->next = *head;
- *head = s;
- return 1;
-}
-
-int
-cfg_str3list_insert(struct config_str3list** head, char* item, char* i2,
- char* i3)
-{
- struct config_str3list *s;
- if(!item || !i2 || !i3 || !head)
- return 0;
- s = (struct config_str3list*)calloc(1, sizeof(struct config_str3list));
- if(!s)
- return 0;
- s->str = item;
- s->str2 = i2;
- s->str3 = i3;
- s->next = *head;
- *head = s;
- return 1;
-}
-
-int
-cfg_strbytelist_insert(struct config_strbytelist** head, char* item,
- uint8_t* i2, size_t i2len)
-{
- struct config_strbytelist* s;
- if(!item || !i2 || !head)
- return 0;
- s = (struct config_strbytelist*)calloc(1, sizeof(*s));
- if(!s)
- return 0;
- s->str = item;
- s->str2 = i2;
- s->str2len = i2len;
- s->next = *head;
- *head = s;
- return 1;
-}
-
-time_t
-cfg_convert_timeval(const char* str)
-{
- time_t t;
- struct tm tm;
- memset(&tm, 0, sizeof(tm));
- if(strlen(str) < 14)
- return 0;
- if(sscanf(str, "%4d%2d%2d%2d%2d%2d", &tm.tm_year, &tm.tm_mon,
- &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6)
- return 0;
- tm.tm_year -= 1900;
- tm.tm_mon--;
- /* Check values */
- if (tm.tm_year < 70) return 0;
- if (tm.tm_mon < 0 || tm.tm_mon > 11) return 0;
- if (tm.tm_mday < 1 || tm.tm_mday > 31) return 0;
- if (tm.tm_hour < 0 || tm.tm_hour > 23) return 0;
- if (tm.tm_min < 0 || tm.tm_min > 59) return 0;
- if (tm.tm_sec < 0 || tm.tm_sec > 59) return 0;
- /* call ldns conversion function */
- t = sldns_mktime_from_utc(&tm);
- return t;
-}
-
-int
-cfg_count_numbers(const char* s)
-{
- /* format ::= (sp num)+ sp */
- /* num ::= [-](0-9)+ */
- /* sp ::= (space|tab)* */
- int num = 0;
- while(*s) {
- while(*s && isspace((unsigned char)*s))
- s++;
- if(!*s) /* end of string */
- break;
- if(*s == '-')
- s++;
- if(!*s) /* only - not allowed */
- return 0;
- if(!isdigit((unsigned char)*s)) /* bad character */
- return 0;
- while(*s && isdigit((unsigned char)*s))
- s++;
- num++;
- }
- return num;
-}
-
-/** all digit number */
-static int isalldigit(const char* str, size_t l)
-{
- size_t i;
- for(i=0; i<l; i++)
- if(!isdigit((unsigned char)str[i]))
- return 0;
- return 1;
-}
-
-int
-cfg_parse_memsize(const char* str, size_t* res)
-{
- size_t len;
- size_t mult = 1;
- if(!str || (len=(size_t)strlen(str)) == 0) {
- log_err("not a size: '%s'", str);
- return 0;
- }
- if(isalldigit(str, len)) {
- *res = (size_t)atol(str);
- return 1;
- }
- /* check appended num */
- while(len>0 && str[len-1]==' ')
- len--;
- if(len > 1 && str[len-1] == 'b')
- len--;
- else if(len > 1 && str[len-1] == 'B')
- len--;
-
- if(len > 1 && tolower((unsigned char)str[len-1]) == 'g')
- mult = 1024*1024*1024;
- else if(len > 1 && tolower((unsigned char)str[len-1]) == 'm')
- mult = 1024*1024;
- else if(len > 1 && tolower((unsigned char)str[len-1]) == 'k')
- mult = 1024;
- else if(len > 0 && isdigit((unsigned char)str[len-1]))
- mult = 1;
- else {
- log_err("unknown size specifier: '%s'", str);
- return 0;
- }
- while(len>1 && str[len-2]==' ')
- len--;
-
- if(!isalldigit(str, len-1)) {
- log_err("unknown size specifier: '%s'", str);
- return 0;
- }
- *res = ((size_t)atol(str)) * mult;
- return 1;
-}
-
-int
-find_tag_id(struct config_file* cfg, const char* tag)
-{
- int i;
- for(i=0; i<cfg->num_tags; i++) {
- if(strcmp(cfg->tagname[i], tag) == 0)
- return i;
- }
- return -1;
-}
-
-int
-config_add_tag(struct config_file* cfg, const char* tag)
-{
- char** newarray;
- char* newtag;
- if(find_tag_id(cfg, tag) != -1)
- return 1; /* nothing to do */
- newarray = (char**)malloc(sizeof(char*)*(cfg->num_tags+1));
- if(!newarray)
- return 0;
- newtag = strdup(tag);
- if(!newtag) {
- free(newarray);
- return 0;
- }
- if(cfg->tagname) {
- memcpy(newarray, cfg->tagname, sizeof(char*)*cfg->num_tags);
- free(cfg->tagname);
- }
- newarray[cfg->num_tags++] = newtag;
- cfg->tagname = newarray;
- return 1;
-}
-
-/** set a bit in a bit array */
-static void
-cfg_set_bit(uint8_t* bitlist, size_t len, int id)
-{
- int pos = id/8;
- log_assert((size_t)pos < len);
- (void)len;
- bitlist[pos] |= 1<<(id%8);
-}
-
-uint8_t* config_parse_taglist(struct config_file* cfg, char* str,
- size_t* listlen)
-{
- uint8_t* taglist = NULL;
- size_t len = 0;
- char* p, *s;
-
- /* allocate */
- if(cfg->num_tags == 0) {
- log_err("parse taglist, but no tags defined");
- return 0;
- }
- len = (size_t)(cfg->num_tags+7)/8;
- taglist = calloc(1, len);
- if(!taglist) {
- log_err("out of memory");
- return 0;
- }
-
- /* parse */
- s = str;
- while((p=strsep(&s, " \t\n")) != NULL) {
- if(*p) {
- int id = find_tag_id(cfg, p);
- /* set this bit in the bitlist */
- if(id == -1) {
- log_err("unknown tag: %s", p);
- free(taglist);
- return 0;
- }
- cfg_set_bit(taglist, len, id);
- }
- }
-
- *listlen = len;
- return taglist;
-}
-
-char* config_taglist2str(struct config_file* cfg, uint8_t* taglist,
- size_t taglen)
-{
- char buf[10240];
- size_t i, j, len = 0;
- buf[0] = 0;
- for(i=0; i<taglen; i++) {
- if(taglist[i] == 0)
- continue;
- for(j=0; j<8; j++) {
- if((taglist[i] & (1<<j)) != 0) {
- size_t id = i*8 + j;
- snprintf(buf+len, sizeof(buf)-len, "%s%s",
- (len==0?"":" "), cfg->tagname[id]);
- len += strlen(buf+len);
- }
- }
- }
- return strdup(buf);
-}
-
-int taglist_intersect(uint8_t* list1, size_t list1len, uint8_t* list2,
- size_t list2len)
-{
- size_t i;
- if(!list1 || !list2)
- return 0;
- for(i=0; i<list1len && i<list2len; i++) {
- if((list1[i] & list2[i]) != 0)
- return 1;
- }
- return 0;
-}
-
-void
-config_apply(struct config_file* config)
-{
- MAX_TTL = (time_t)config->max_ttl;
- MIN_TTL = (time_t)config->min_ttl;
- MAX_NEG_TTL = (time_t)config->max_negative_ttl;
- RTT_MIN_TIMEOUT = config->infra_cache_min_rtt;
- EDNS_ADVERTISED_SIZE = (uint16_t)config->edns_buffer_size;
- MINIMAL_RESPONSES = config->minimal_responses;
- RRSET_ROUNDROBIN = config->rrset_roundrobin;
- log_set_time_asc(config->log_time_ascii);
- autr_permit_small_holddown = config->permit_small_holddown;
-}
-
-void config_lookup_uid(struct config_file* cfg)
-{
-#ifdef HAVE_GETPWNAM
- /* translate username into uid and gid */
- if(cfg->username && cfg->username[0]) {
- struct passwd *pwd;
- if((pwd = getpwnam(cfg->username)) != NULL) {
- cfg_uid = pwd->pw_uid;
- cfg_gid = pwd->pw_gid;
- }
- }
-#else
- (void)cfg;
-#endif
-}
-
-/**
- * Calculate string length of full pathname in original filesys
- * @param fname: the path name to convert.
- * Must not be null or empty.
- * @param cfg: config struct for chroot and chdir (if set).
- * @param use_chdir: if false, only chroot is applied.
- * @return length of string.
- * remember to allocate one more for 0 at end in mallocs.
- */
-static size_t
-strlen_after_chroot(const char* fname, struct config_file* cfg, int use_chdir)
-{
- size_t len = 0;
- int slashit = 0;
- if(cfg->chrootdir && cfg->chrootdir[0] &&
- strncmp(cfg->chrootdir, fname, strlen(cfg->chrootdir)) == 0) {
- /* already full pathname, return it */
- return strlen(fname);
- }
- /* chroot */
- if(cfg->chrootdir && cfg->chrootdir[0]) {
- /* start with chrootdir */
- len += strlen(cfg->chrootdir);
- slashit = 1;
- }
- /* chdir */
-#ifdef UB_ON_WINDOWS
- if(fname[0] != 0 && fname[1] == ':') {
- /* full path, no chdir */
- } else
-#endif
- if(fname[0] == '/' || !use_chdir) {
- /* full path, no chdir */
- } else if(cfg->directory && cfg->directory[0]) {
- /* prepend chdir */
- if(slashit && cfg->directory[0] != '/')
- len++;
- if(cfg->chrootdir && cfg->chrootdir[0] &&
- strncmp(cfg->chrootdir, cfg->directory,
- strlen(cfg->chrootdir)) == 0)
- len += strlen(cfg->directory)-strlen(cfg->chrootdir);
- else len += strlen(cfg->directory);
- slashit = 1;
- }
- /* fname */
- if(slashit && fname[0] != '/')
- len++;
- len += strlen(fname);
- return len;
-}
-
-char*
-fname_after_chroot(const char* fname, struct config_file* cfg, int use_chdir)
-{
- size_t len = strlen_after_chroot(fname, cfg, use_chdir)+1;
- int slashit = 0;
- char* buf = (char*)malloc(len);
- if(!buf)
- return NULL;
- buf[0] = 0;
- /* is fname already in chroot ? */
- if(cfg->chrootdir && cfg->chrootdir[0] &&
- strncmp(cfg->chrootdir, fname, strlen(cfg->chrootdir)) == 0) {
- /* already full pathname, return it */
- (void)strlcpy(buf, fname, len);
- buf[len-1] = 0;
- return buf;
- }
- /* chroot */
- if(cfg->chrootdir && cfg->chrootdir[0]) {
- /* start with chrootdir */
- (void)strlcpy(buf, cfg->chrootdir, len);
- slashit = 1;
- }
-#ifdef UB_ON_WINDOWS
- if(fname[0] != 0 && fname[1] == ':') {
- /* full path, no chdir */
- } else
-#endif
- /* chdir */
- if(fname[0] == '/' || !use_chdir) {
- /* full path, no chdir */
- } else if(cfg->directory && cfg->directory[0]) {
- /* prepend chdir */
- if(slashit && cfg->directory[0] != '/')
- (void)strlcat(buf, "/", len);
- /* is the directory already in the chroot? */
- if(cfg->chrootdir && cfg->chrootdir[0] &&
- strncmp(cfg->chrootdir, cfg->directory,
- strlen(cfg->chrootdir)) == 0)
- (void)strlcat(buf, cfg->directory+strlen(cfg->chrootdir),
- len);
- else (void)strlcat(buf, cfg->directory, len);
- slashit = 1;
- }
- /* fname */
- if(slashit && fname[0] != '/')
- (void)strlcat(buf, "/", len);
- (void)strlcat(buf, fname, len);
- buf[len-1] = 0;
- return buf;
-}
-
-/** return next space character in string */
-static char* next_space_pos(const char* str)
-{
- char* sp = strchr(str, ' ');
- char* tab = strchr(str, '\t');
- if(!tab && !sp)
- return NULL;
- if(!sp) return tab;
- if(!tab) return sp;
- return (sp<tab)?sp:tab;
-}
-
-/** return last space character in string */
-static char* last_space_pos(const char* str)
-{
- char* sp = strrchr(str, ' ');
- char* tab = strrchr(str, '\t');
- if(!tab && !sp)
- return NULL;
- if(!sp) return tab;
- if(!tab) return sp;
- return (sp>tab)?sp:tab;
-}
-
-int
-cfg_parse_local_zone(struct config_file* cfg, const char* val)
-{
- const char *type, *name_end, *name;
- char buf[256];
-
- /* parse it as: [zone_name] [between stuff] [zone_type] */
- name = val;
- while(*name && isspace((unsigned char)*name))
- name++;
- if(!*name) {
- log_err("syntax error: too short: %s", val);
- return 0;
- }
- name_end = next_space_pos(name);
- if(!name_end || !*name_end) {
- log_err("syntax error: expected zone type: %s", val);
- return 0;
- }
- if (name_end - name > 255) {
- log_err("syntax error: bad zone name: %s", val);
- return 0;
- }
- (void)strlcpy(buf, name, sizeof(buf));
- buf[name_end-name] = '\0';
-
- type = last_space_pos(name_end);
- while(type && *type && isspace((unsigned char)*type))
- type++;
- if(!type || !*type) {
- log_err("syntax error: expected zone type: %s", val);
- return 0;
- }
-
- if(strcmp(type, "nodefault")==0) {
- return cfg_strlist_insert(&cfg->local_zones_nodefault,
- strdup(name));
- } else {
- return cfg_str2list_insert(&cfg->local_zones, strdup(buf),
- strdup(type));
- }
-}
-
-char* cfg_ptr_reverse(char* str)
-{
- char* ip, *ip_end;
- char* name;
- char* result;
- char buf[1024];
- struct sockaddr_storage addr;
- socklen_t addrlen;
-
- /* parse it as: [IP] [between stuff] [name] */
- ip = str;
- while(*ip && isspace((unsigned char)*ip))
- ip++;
- if(!*ip) {
- log_err("syntax error: too short: %s", str);
- return NULL;
- }
- ip_end = next_space_pos(ip);
- if(!ip_end || !*ip_end) {
- log_err("syntax error: expected name: %s", str);
- return NULL;
- }
-
- name = last_space_pos(ip_end);
- if(!name || !*name) {
- log_err("syntax error: expected name: %s", str);
- return NULL;
- }
-
- sscanf(ip, "%100s", buf);
- buf[sizeof(buf)-1]=0;
-
- if(!ipstrtoaddr(buf, UNBOUND_DNS_PORT, &addr, &addrlen)) {
- log_err("syntax error: cannot parse address: %s", str);
- return NULL;
- }
-
- /* reverse IPv4:
- * ddd.ddd.ddd.ddd.in-addr-arpa.
- * IPv6: (h.){32}.ip6.arpa. */
-
- if(addr_is_ip6(&addr, addrlen)) {
- uint8_t ad[16];
- const char* hex = "0123456789abcdef";
- char *p = buf;
- int i;
- memmove(ad, &((struct sockaddr_in6*)&addr)->sin6_addr,
- sizeof(ad));
- for(i=15; i>=0; i--) {
- uint8_t b = ad[i];
- *p++ = hex[ (b&0x0f) ];
- *p++ = '.';
- *p++ = hex[ (b&0xf0) >> 4 ];
- *p++ = '.';
- }
- snprintf(buf+16*4, sizeof(buf)-16*4, "ip6.arpa. ");
- } else {
- uint8_t ad[4];
- memmove(ad, &((struct sockaddr_in*)&addr)->sin_addr,
- sizeof(ad));
- snprintf(buf, sizeof(buf), "%u.%u.%u.%u.in-addr.arpa. ",
- (unsigned)ad[3], (unsigned)ad[2],
- (unsigned)ad[1], (unsigned)ad[0]);
- }
-
- /* printed the reverse address, now the between goop and name on end */
- while(*ip_end && isspace((unsigned char)*ip_end))
- ip_end++;
- if(name>ip_end) {
- snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "%.*s",
- (int)(name-ip_end), ip_end);
- }
- snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), " PTR %s", name);
-
- result = strdup(buf);
- if(!result) {
- log_err("out of memory parsing %s", str);
- return NULL;
- }
- return result;
-}
-
-#ifdef UB_ON_WINDOWS
-char*
-w_lookup_reg_str(const char* key, const char* name)
-{
- HKEY hk = NULL;
- DWORD type = 0;
- BYTE buf[1024];
- DWORD len = (DWORD)sizeof(buf);
- LONG ret;
- char* result = NULL;
- ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &hk);
- if(ret == ERROR_FILE_NOT_FOUND)
- return NULL; /* key does not exist */
- else if(ret != ERROR_SUCCESS) {
- log_err("RegOpenKeyEx failed");
- return NULL;
- }
- ret = RegQueryValueEx(hk, (LPCTSTR)name, 0, &type, buf, &len);
- if(RegCloseKey(hk))
- log_err("RegCloseKey");
- if(ret == ERROR_FILE_NOT_FOUND)
- return NULL; /* name does not exist */
- else if(ret != ERROR_SUCCESS) {
- log_err("RegQueryValueEx failed");
- return NULL;
- }
- if(type == REG_SZ || type == REG_MULTI_SZ || type == REG_EXPAND_SZ) {
- buf[sizeof(buf)-1] = 0;
- buf[sizeof(buf)-2] = 0; /* for multi_sz */
- result = strdup((char*)buf);
- if(!result) log_err("out of memory");
- }
- return result;
-}
-
-void w_config_adjust_directory(struct config_file* cfg)
-{
- if(cfg->directory && cfg->directory[0]) {
- TCHAR dirbuf[2*MAX_PATH+4];
- if(strcmp(cfg->directory, "%EXECUTABLE%") == 0) {
- /* get executable path, and if that contains
- * directories, snip off the filename part */
- dirbuf[0] = 0;
- if(!GetModuleFileName(NULL, dirbuf, MAX_PATH))
- log_err("could not GetModuleFileName");
- if(strrchr(dirbuf, '\\')) {
- (strrchr(dirbuf, '\\'))[0] = 0;
- } else log_err("GetModuleFileName had no path");
- if(dirbuf[0]) {
- /* adjust directory for later lookups to work*/
- free(cfg->directory);
- cfg->directory = memdup(dirbuf, strlen(dirbuf)+1);
- }
- }
- }
-}
-#endif /* UB_ON_WINDOWS */
-
-void errinf(struct module_qstate* qstate, const char* str)
-{
- struct config_strlist* p;
- if(qstate->env->cfg->val_log_level < 2 || !str)
- return;
- p = (struct config_strlist*)regional_alloc(qstate->region, sizeof(*p));
- if(!p) {
- log_err("malloc failure in validator-error-info string");
- return;
- }
- p->next = NULL;
- p->str = regional_strdup(qstate->region, str);
- if(!p->str) {
- log_err("malloc failure in validator-error-info string");
- return;
- }
- /* add at end */
- if(qstate->errinf) {
- struct config_strlist* q = qstate->errinf;
- while(q->next)
- q = q->next;
- q->next = p;
- } else qstate->errinf = p;
-}
-
-void errinf_origin(struct module_qstate* qstate, struct sock_list *origin)
-{
- struct sock_list* p;
- if(qstate->env->cfg->val_log_level < 2)
- return;
- for(p=origin; p; p=p->next) {
- char buf[256];
- if(p == origin)
- snprintf(buf, sizeof(buf), "from ");
- else snprintf(buf, sizeof(buf), "and ");
- if(p->len == 0)
- snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf),
- "cache");
- else
- addr_to_str(&p->addr, p->len, buf+strlen(buf),
- sizeof(buf)-strlen(buf));
- errinf(qstate, buf);
- }
-}
-
-char* errinf_to_str(struct module_qstate* qstate)
-{
- char buf[20480];
- char* p = buf;
- size_t left = sizeof(buf);
- struct config_strlist* s;
- char dname[LDNS_MAX_DOMAINLEN+1];
- char t[16], c[16];
- sldns_wire2str_type_buf(qstate->qinfo.qtype, t, sizeof(t));
- sldns_wire2str_class_buf(qstate->qinfo.qclass, c, sizeof(c));
- dname_str(qstate->qinfo.qname, dname);
- snprintf(p, left, "validation failure <%s %s %s>:", dname, t, c);
- left -= strlen(p); p += strlen(p);
- if(!qstate->errinf)
- snprintf(p, left, " misc failure");
- else for(s=qstate->errinf; s; s=s->next) {
- snprintf(p, left, " %s", s->str);
- left -= strlen(p); p += strlen(p);
- }
- p = strdup(buf);
- if(!p)
- log_err("malloc failure in errinf_to_str");
- return p;
-}
-
-void errinf_rrset(struct module_qstate* qstate, struct ub_packed_rrset_key *rr)
-{
- char buf[1024];
- char dname[LDNS_MAX_DOMAINLEN+1];
- char t[16], c[16];
- if(qstate->env->cfg->val_log_level < 2 || !rr)
- return;
- sldns_wire2str_type_buf(ntohs(rr->rk.type), t, sizeof(t));
- sldns_wire2str_class_buf(ntohs(rr->rk.rrset_class), c, sizeof(c));
- dname_str(rr->rk.dname, dname);
- snprintf(buf, sizeof(buf), "for <%s %s %s>", dname, t, c);
- errinf(qstate, buf);
-}
-
-void errinf_dname(struct module_qstate* qstate, const char* str, uint8_t* dname)
-{
- char b[1024];
- char buf[LDNS_MAX_DOMAINLEN+1];
- if(qstate->env->cfg->val_log_level < 2 || !str || !dname)
- return;
- dname_str(dname, buf);
- snprintf(b, sizeof(b), "%s %s", str, buf);
- errinf(qstate, b);
-}
diff --git a/external/unbound/util/config_file.h b/external/unbound/util/config_file.h
deleted file mode 100644
index 79b094894..000000000
--- a/external/unbound/util/config_file.h
+++ /dev/null
@@ -1,1009 +0,0 @@
-/*
- * util/config_file.h - reads and stores the config file for unbound.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains functions for the config file.
- */
-
-#ifndef UTIL_CONFIG_FILE_H
-#define UTIL_CONFIG_FILE_H
-struct config_stub;
-struct config_view;
-struct config_strlist;
-struct config_str2list;
-struct config_str3list;
-struct config_strbytelist;
-struct module_qstate;
-struct sock_list;
-struct ub_packed_rrset_key;
-struct regional;
-
-/**
- * The configuration options.
- * Strings are malloced.
- */
-struct config_file {
- /** verbosity level as specified in the config file */
- int verbosity;
-
- /** statistics interval (in seconds) */
- int stat_interval;
- /** if false, statistics values are reset after printing them */
- int stat_cumulative;
- /** if true, the statistics are kept in greater detail */
- int stat_extended;
-
- /** number of threads to create */
- int num_threads;
-
- /** port on which queries are answered. */
- int port;
- /** do ip4 query support. */
- int do_ip4;
- /** do ip6 query support. */
- int do_ip6;
- /** prefer ip6 upstream queries. */
- int prefer_ip6;
- /** do udp query support. */
- int do_udp;
- /** do tcp query support. */
- int do_tcp;
- /** tcp upstream queries (no UDP upstream queries) */
- int tcp_upstream;
- /** maximum segment size of tcp socket which queries are answered */
- int tcp_mss;
- /** maximum segment size of tcp socket for outgoing queries */
- int outgoing_tcp_mss;
-
- /** private key file for dnstcp-ssl service (enabled if not NULL) */
- char* ssl_service_key;
- /** public key file for dnstcp-ssl service */
- char* ssl_service_pem;
- /** port on which to provide ssl service */
- int ssl_port;
- /** if outgoing tcp connections use SSL */
- int ssl_upstream;
-
- /** outgoing port range number of ports (per thread) */
- int outgoing_num_ports;
- /** number of outgoing tcp buffers per (per thread) */
- size_t outgoing_num_tcp;
- /** number of incoming tcp buffers per (per thread) */
- size_t incoming_num_tcp;
- /** allowed udp port numbers, array with 0 if not allowed */
- int* outgoing_avail_ports;
-
- /** EDNS buffer size to use */
- size_t edns_buffer_size;
- /** number of bytes buffer size for DNS messages */
- size_t msg_buffer_size;
- /** size of the message cache */
- size_t msg_cache_size;
- /** slabs in the message cache. */
- size_t msg_cache_slabs;
- /** number of queries every thread can service */
- size_t num_queries_per_thread;
- /** number of msec to wait before items can be jostled out */
- size_t jostle_time;
- /** size of the rrset cache */
- size_t rrset_cache_size;
- /** slabs in the rrset cache */
- size_t rrset_cache_slabs;
- /** host cache ttl in seconds */
- int host_ttl;
- /** number of slabs in the infra host cache */
- size_t infra_cache_slabs;
- /** max number of hosts in the infra cache */
- size_t infra_cache_numhosts;
- /** min value for infra cache rtt */
- int infra_cache_min_rtt;
- /** delay close of udp-timeouted ports, if 0 no delayclose. in msec */
- int delay_close;
-
- /** the target fetch policy for the iterator */
- char* target_fetch_policy;
-
- /** automatic interface for incoming messages. Uses ipv6 remapping,
- * and recvmsg/sendmsg ancillary data to detect interfaces, boolean */
- int if_automatic;
- /** SO_RCVBUF size to set on port 53 UDP socket */
- size_t so_rcvbuf;
- /** SO_SNDBUF size to set on port 53 UDP socket */
- size_t so_sndbuf;
- /** SO_REUSEPORT requested on port 53 sockets */
- int so_reuseport;
- /** IP_TRANSPARENT socket option requested on port 53 sockets */
- int ip_transparent;
- /** IP_FREEBIND socket option request on port 53 sockets */
- int ip_freebind;
-
- /** number of interfaces to open. If 0 default all interfaces. */
- int num_ifs;
- /** interface description strings (IP addresses) */
- char **ifs;
-
- /** number of outgoing interfaces to open.
- * If 0 default all interfaces. */
- int num_out_ifs;
- /** outgoing interface description strings (IP addresses) */
- char **out_ifs;
-
- /** the root hints */
- struct config_strlist* root_hints;
- /** the stub definitions, linked list */
- struct config_stub* stubs;
- /** the forward zone definitions, linked list */
- struct config_stub* forwards;
- /** the views definitions, linked list */
- struct config_view* views;
- /** list of donotquery addresses, linked list */
- struct config_strlist* donotqueryaddrs;
-#ifdef CLIENT_SUBNET
- /** list of servers we send edns-client-subnet option to and
- * accept option from, linked list */
- struct config_strlist* client_subnet;
- /** opcode assigned by IANA for edns0-client-subnet option */
- uint16_t client_subnet_opcode;
- /** Do not check whitelist if incoming query contains an ECS record */
- int client_subnet_always_forward;
- /** Subnet length we are willing to give up privacy for */
- uint8_t max_client_subnet_ipv4;
- uint8_t max_client_subnet_ipv6;
-#endif
- /** list of access control entries, linked list */
- struct config_str2list* acls;
- /** use default localhost donotqueryaddr entries */
- int donotquery_localhost;
-
- /** harden against very small edns buffer sizes */
- int harden_short_bufsize;
- /** harden against very large query sizes */
- int harden_large_queries;
- /** harden against spoofed glue (out of zone data) */
- int harden_glue;
- /** harden against receiving no DNSSEC data for trust anchor */
- int harden_dnssec_stripped;
- /** harden against queries that fall under known nxdomain names */
- int harden_below_nxdomain;
- /** harden the referral path, query for NS,A,AAAA and validate */
- int harden_referral_path;
- /** harden against algorithm downgrade */
- int harden_algo_downgrade;
- /** use 0x20 bits in query as random ID bits */
- int use_caps_bits_for_id;
- /** 0x20 whitelist, domains that do not use capsforid */
- struct config_strlist* caps_whitelist;
- /** strip away these private addrs from answers, no DNS Rebinding */
- struct config_strlist* private_address;
- /** allow domain (and subdomains) to use private address space */
- struct config_strlist* private_domain;
- /** what threshold for unwanted action. */
- size_t unwanted_threshold;
- /** the number of seconds maximal TTL used for RRsets and messages */
- int max_ttl;
- /** the number of seconds minimum TTL used for RRsets and messages */
- int min_ttl;
- /** the number of seconds maximal negative TTL for SOA in auth */
- int max_negative_ttl;
- /** if prefetching of messages should be performed. */
- int prefetch;
- /** if prefetching of DNSKEYs should be performed. */
- int prefetch_key;
-
- /** chrootdir, if not "" or chroot will be done */
- char* chrootdir;
- /** username to change to, if not "". */
- char* username;
- /** working directory */
- char* directory;
- /** filename to log to. */
- char* logfile;
- /** pidfile to write pid to. */
- char* pidfile;
-
- /** should log messages be sent to syslogd */
- int use_syslog;
- /** log timestamp in ascii UTC */
- int log_time_ascii;
- /** log queries with one line per query */
- int log_queries;
- /** log replies with one line per reply */
- int log_replies;
- /** log identity to report */
- char* log_identity;
-
- /** do not report identity (id.server, hostname.bind) */
- int hide_identity;
- /** do not report version (version.server, version.bind) */
- int hide_version;
- /** do not report trustanchor (trustanchor.unbound) */
- int hide_trustanchor;
- /** identity, hostname is returned if "". */
- char* identity;
- /** version, package version returned if "". */
- char* version;
-
- /** the module configuration string */
- char* module_conf;
-
- /** files with trusted DS and DNSKEYs in zonefile format, list */
- struct config_strlist* trust_anchor_file_list;
- /** list of trustanchor keys, linked list */
- struct config_strlist* trust_anchor_list;
- /** files with 5011 autotrust tracked keys */
- struct config_strlist* auto_trust_anchor_file_list;
- /** files with trusted DNSKEYs in named.conf format, list */
- struct config_strlist* trusted_keys_file_list;
- /** DLV anchor file */
- char* dlv_anchor_file;
- /** DLV anchor inline */
- struct config_strlist* dlv_anchor_list;
- /** insecure domain list */
- struct config_strlist* domain_insecure;
-
- /** if not 0, this value is the validation date for RRSIGs */
- int32_t val_date_override;
- /** the minimum for signature clock skew */
- int32_t val_sig_skew_min;
- /** the maximum for signature clock skew */
- int32_t val_sig_skew_max;
- /** this value sets the number of seconds before revalidating bogus */
- int bogus_ttl;
- /** should validator clean additional section for secure msgs */
- int val_clean_additional;
- /** log bogus messages by the validator */
- int val_log_level;
- /** squelch val_log_level to log - this is library goes to callback */
- int val_log_squelch;
- /** should validator allow bogus messages to go through */
- int val_permissive_mode;
- /** ignore the CD flag in incoming queries and refuse them bogus data */
- int ignore_cd;
- /** serve expired entries and prefetch them */
- int serve_expired;
- /** nsec3 maximum iterations per key size, string */
- char* val_nsec3_key_iterations;
- /** autotrust add holddown time, in seconds */
- unsigned int add_holddown;
- /** autotrust del holddown time, in seconds */
- unsigned int del_holddown;
- /** autotrust keep_missing time, in seconds. 0 is forever. */
- unsigned int keep_missing;
- /** permit small holddown values, allowing 5011 rollover very fast */
- int permit_small_holddown;
-
- /** size of the key cache */
- size_t key_cache_size;
- /** slabs in the key cache. */
- size_t key_cache_slabs;
- /** size of the neg cache */
- size_t neg_cache_size;
-
- /** local zones config */
- struct config_str2list* local_zones;
- /** local zones nodefault list */
- struct config_strlist* local_zones_nodefault;
- /** local data RRs configured */
- struct config_strlist* local_data;
- /** local zone override types per netblock */
- struct config_str3list* local_zone_overrides;
- /** unblock lan zones (reverse lookups for AS112 zones) */
- int unblock_lan_zones;
- /** insecure lan zones (don't validate AS112 zones) */
- int insecure_lan_zones;
- /** list of zonename, tagbitlist */
- struct config_strbytelist* local_zone_tags;
- /** list of aclname, tagbitlist */
- struct config_strbytelist* acl_tags;
- /** list of aclname, tagname, localzonetype */
- struct config_str3list* acl_tag_actions;
- /** list of aclname, tagname, redirectdata */
- struct config_str3list* acl_tag_datas;
- /** list of aclname, view*/
- struct config_str2list* acl_view;
- /** list of IP-netblock, tagbitlist */
- struct config_strbytelist* respip_tags;
- /** list of response-driven access control entries, linked list */
- struct config_str2list* respip_actions;
- /** RRs configured for response-driven access controls */
- struct config_str2list* respip_data;
- /** tag list, array with tagname[i] is malloced string */
- char** tagname;
- /** number of items in the taglist */
- int num_tags;
-
- /** remote control section. enable toggle. */
- int remote_control_enable;
- /** the interfaces the remote control should listen on */
- struct config_strlist* control_ifs;
- /** port number for the control port */
- int control_port;
- /** use certificates for remote control */
- int remote_control_use_cert;
- /** private key file for server */
- char* server_key_file;
- /** certificate file for server */
- char* server_cert_file;
- /** private key file for unbound-control */
- char* control_key_file;
- /** certificate file for unbound-control */
- char* control_cert_file;
-
- /** Python script file */
- char* python_script;
-
- /** Use systemd socket activation. */
- int use_systemd;
-
- /** daemonize, i.e. fork into the background. */
- int do_daemonize;
-
- /* minimal response when positive answer */
- int minimal_responses;
-
- /* RRSet roundrobin */
- int rrset_roundrobin;
-
- /* maximum UDP response size */
- size_t max_udp_size;
-
- /* DNS64 prefix */
- char* dns64_prefix;
-
- /* Synthetize all AAAA record despite the presence of an authoritative one */
- int dns64_synthall;
-
- /** true to enable dnstap support */
- int dnstap;
- /** dnstap socket path */
- char* dnstap_socket_path;
- /** true to send "identity" via dnstap */
- int dnstap_send_identity;
- /** true to send "version" via dnstap */
- int dnstap_send_version;
- /** dnstap "identity", hostname is used if "". */
- char* dnstap_identity;
- /** dnstap "version", package version is used if "". */
- char* dnstap_version;
-
- /** true to log dnstap RESOLVER_QUERY message events */
- int dnstap_log_resolver_query_messages;
- /** true to log dnstap RESOLVER_RESPONSE message events */
- int dnstap_log_resolver_response_messages;
- /** true to log dnstap CLIENT_QUERY message events */
- int dnstap_log_client_query_messages;
- /** true to log dnstap CLIENT_RESPONSE message events */
- int dnstap_log_client_response_messages;
- /** true to log dnstap FORWARDER_QUERY message events */
- int dnstap_log_forwarder_query_messages;
- /** true to log dnstap FORWARDER_RESPONSE message events */
- int dnstap_log_forwarder_response_messages;
-
- /** true to disable DNSSEC lameness check in iterator */
- int disable_dnssec_lame_check;
-
- /** ratelimit for ip addresses. 0 is off, otherwise qps (unless overridden) */
- int ip_ratelimit;
- /** number of slabs for ip_ratelimit cache */
- size_t ip_ratelimit_slabs;
- /** memory size in bytes for ip_ratelimit cache */
- size_t ip_ratelimit_size;
- /** ip_ratelimit factor, 0 blocks all, 10 allows 1/10 of traffic */
- int ip_ratelimit_factor;
-
- /** ratelimit for domains. 0 is off, otherwise qps (unless overridden) */
- int ratelimit;
- /** number of slabs for ratelimit cache */
- size_t ratelimit_slabs;
- /** memory size in bytes for ratelimit cache */
- size_t ratelimit_size;
- /** ratelimits for domain (exact match) */
- struct config_str2list* ratelimit_for_domain;
- /** ratelimits below domain */
- struct config_str2list* ratelimit_below_domain;
- /** ratelimit factor, 0 blocks all, 10 allows 1/10 of traffic */
- int ratelimit_factor;
- /** minimise outgoing QNAME and hide original QTYPE if possible */
- int qname_minimisation;
- /** minimise QNAME in strict mode, minimise according to RFC.
- * Do not apply fallback */
- int qname_minimisation_strict;
- /** SHM data - true if shm is enabled */
- int shm_enable;
- /** SHM data - key for the shm */
- int shm_key;
-
- /** DNSCrypt */
- /** true to enable dnscrypt */
- int dnscrypt;
- /** port on which to provide dnscrypt service */
- int dnscrypt_port;
- /** provider name 2.dnscrypt-cert.example.com */
- char* dnscrypt_provider;
- /** dnscrypt secret keys 1.key */
- struct config_strlist* dnscrypt_secret_key;
- /** dnscrypt provider certs 1.cert */
- struct config_strlist* dnscrypt_provider_cert;
-};
-
-/** from cfg username, after daemonise setup performed */
-extern uid_t cfg_uid;
-/** from cfg username, after daemonise setup performed */
-extern gid_t cfg_gid;
-/** debug and enable small timeouts */
-extern int autr_permit_small_holddown;
-
-/**
- * Stub config options
- */
-struct config_stub {
- /** next in list */
- struct config_stub* next;
- /** domain name (in text) of the stub apex domain */
- char* name;
- /** list of stub nameserver hosts (domain name) */
- struct config_strlist* hosts;
- /** list of stub nameserver addresses (IP address) */
- struct config_strlist* addrs;
- /** if stub-prime is set */
- int isprime;
- /** if forward-first is set (failover to without if fails) */
- int isfirst;
- /** use SSL for queries to this stub */
- int ssl_upstream;
-};
-
-/**
- * View config options
- */
-struct config_view {
- /** next in list */
- struct config_view* next;
- /** view name */
- char* name;
- /** local zones */
- struct config_str2list* local_zones;
- /** local data RRs */
- struct config_strlist* local_data;
- /** local zones nodefault list */
- struct config_strlist* local_zones_nodefault;
- /** Fallback to global local_zones when there is no match in the view
- * view specific tree. 1 for yes, 0 for no */
- int isfirst;
- /** predefined actions for particular IP address responses */
- struct config_str2list* respip_actions;
- /** data complementing the 'redirect' response IP actions */
- struct config_str2list* respip_data;
-};
-
-/**
- * List of strings for config options
- */
-struct config_strlist {
- /** next item in list */
- struct config_strlist* next;
- /** config option string */
- char* str;
-};
-
-/**
- * List of two strings for config options
- */
-struct config_str2list {
- /** next item in list */
- struct config_str2list* next;
- /** first string */
- char* str;
- /** second string */
- char* str2;
-};
-
-/**
- * List of three strings for config options
- */
-struct config_str3list {
- /** next item in list */
- struct config_str3list* next;
- /** first string */
- char* str;
- /** second string */
- char* str2;
- /** third string */
- char* str3;
-};
-
-
-/**
- * List of string, bytestring for config options
- */
-struct config_strbytelist {
- /** next item in list */
- struct config_strbytelist* next;
- /** first string */
- char* str;
- /** second bytestring */
- uint8_t* str2;
- size_t str2len;
-};
-
-/** List head for strlist processing, used for append operation. */
-struct config_strlist_head {
- /** first in list of text items */
- struct config_strlist* first;
- /** last in list of text items */
- struct config_strlist* last;
-};
-
-/**
- * Create config file structure. Filled with default values.
- * @return: the new structure or NULL on memory error.
- */
-struct config_file* config_create(void);
-
-/**
- * Create config file structure for library use. Filled with default values.
- * @return: the new structure or NULL on memory error.
- */
-struct config_file* config_create_forlib(void);
-
-/**
- * Read the config file from the specified filename.
- * @param config: where options are stored into, must be freshly created.
- * @param filename: name of configfile. If NULL nothing is done.
- * @param chroot: if not NULL, the chroot dir currently in use (for include).
- * @return: false on error. In that case errno is set, ENOENT means
- * file not found.
- */
-int config_read(struct config_file* config, const char* filename,
- const char* chroot);
-
-/**
- * Destroy the config file structure.
- * @param config: to delete.
- */
-void config_delete(struct config_file* config);
-
-/**
- * Apply config to global constants; this routine is called in single thread.
- * @param config: to apply. Side effect: global constants change.
- */
-void config_apply(struct config_file* config);
-
-/**
- * Find username, sets cfg_uid and cfg_gid.
- * @param config: the config structure.
- */
-void config_lookup_uid(struct config_file* config);
-
-/**
- * Set the given keyword to the given value.
- * @param config: where to store config
- * @param option: option name, including the ':' character.
- * @param value: value, this string is copied if needed, or parsed.
- * The caller owns the value string.
- * @return 0 on error (malloc or syntax error).
- */
-int config_set_option(struct config_file* config, const char* option,
- const char* value);
-
-/**
- * Call print routine for the given option.
- * @param cfg: config.
- * @param opt: option name without trailing :.
- * This is different from config_set_option.
- * @param func: print func, called as (str, arg) for every data element.
- * @param arg: user argument for print func.
- * @return false if the option name is not supported (syntax error).
- */
-int config_get_option(struct config_file* cfg, const char* opt,
- void (*func)(char*,void*), void* arg);
-
-/**
- * Get an option and return strlist
- * @param cfg: config file
- * @param opt: option name.
- * @param list: list is returned here. malloced, caller must free it.
- * @return 0=OK, 1=syntax error, 2=malloc failed.
- */
-int config_get_option_list(struct config_file* cfg, const char* opt,
- struct config_strlist** list);
-
-/**
- * Get an option and collate results into string
- * @param cfg: config file
- * @param opt: option name.
- * @param str: string. malloced, caller must free it.
- * @return 0=OK, 1=syntax error, 2=malloc failed.
- */
-int config_get_option_collate(struct config_file* cfg, const char* opt,
- char** str);
-
-/**
- * function to print to a file, use as func with config_get_option.
- * @param line: text to print. \n appended.
- * @param arg: pass a FILE*, like stdout.
- */
-void config_print_func(char* line, void* arg);
-
-/**
- * function to collate the text strings into a strlist_head.
- * @param line: text to append.
- * @param arg: pass a strlist_head structure. zeroed on start.
- */
-void config_collate_func(char* line, void* arg);
-
-/**
- * take a strlist_head list and return a malloc string. separated with newline.
- * @param list: strlist first to collate. zeroes return "".
- * @return NULL on malloc failure. Or if malloc failure happened in strlist.
- */
-char* config_collate_cat(struct config_strlist* list);
-
-/**
- * Append text at end of list.
- * @param list: list head. zeroed at start.
- * @param item: new item. malloced by caller. if NULL the insertion fails.
- * @return true on success.
- */
-int cfg_strlist_append(struct config_strlist_head* list, char* item);
-
-/**
- * Insert string into strlist.
- * @param head: pointer to strlist head variable.
- * @param item: new item. malloced by caller. If NULL the insertion fails.
- * @return: true on success.
- */
-int cfg_strlist_insert(struct config_strlist** head, char* item);
-
-/** insert with region for allocation. */
-int cfg_region_strlist_insert(struct regional* region,
- struct config_strlist** head, char* item);
-
-/**
- * Insert string into str2list.
- * @param head: pointer to str2list head variable.
- * @param item: new item. malloced by caller. If NULL the insertion fails.
- * @param i2: 2nd string, malloced by caller. If NULL the insertion fails.
- * @return: true on success.
- */
-int cfg_str2list_insert(struct config_str2list** head, char* item, char* i2);
-
-/**
- * Insert string into str3list.
- * @param head: pointer to str3list head variable.
- * @param item: new item. malloced by caller. If NULL the insertion fails.
- * @param i2: 2nd string, malloced by caller. If NULL the insertion fails.
- * @param i3: 3rd string, malloced by caller. If NULL the insertion fails.
- * @return: true on success.
- */
-int cfg_str3list_insert(struct config_str3list** head, char* item, char* i2,
- char* i3);
-
-/**
- * Insert string into strbytelist.
- * @param head: pointer to strbytelist head variable.
- * @param item: new item. malloced by caller. If NULL the insertion fails.
- * @param i2: 2nd string, malloced by caller. If NULL the insertion fails.
- * @param i2len: length of the i2 bytestring.
- * @return: true on success.
- */
-int cfg_strbytelist_insert(struct config_strbytelist** head, char* item,
- uint8_t* i2, size_t i2len);
-
-/**
- * Find stub in config list, also returns prevptr (for deletion).
- * @param pp: call routine with pointer to a pointer to the start of the list,
- * if the stub is found, on exit, the value contains a pointer to the
- * next pointer that points to the found element (or to the list start
- * pointer if it is the first element).
- * @param nm: name of stub to find.
- * @return: pointer to config_stub if found, or NULL if not found.
- */
-struct config_stub* cfg_stub_find(struct config_stub*** pp, const char* nm);
-
-/**
- * Delete items in config string list.
- * @param list: list.
- */
-void config_delstrlist(struct config_strlist* list);
-
-/**
- * Delete items in config double string list.
- * @param list: list.
- */
-void config_deldblstrlist(struct config_str2list* list);
-
-/**
- * Delete items in config triple string list.
- * @param list: list.
- */
-void config_deltrplstrlist(struct config_str3list* list);
-
-/** delete stringbytelist */
-void config_del_strbytelist(struct config_strbytelist* list);
-
-/**
- * Delete a stub item
- * @param p: stub item
- */
-void config_delstub(struct config_stub* p);
-
-/**
- * Delete items in config stub list.
- * @param list: list.
- */
-void config_delstubs(struct config_stub* list);
-
-/**
- * Delete a view item
- * @param p: view item
- */
-void config_delview(struct config_view* p);
-
-/**
- * Delete items in config view list.
- * @param list: list.
- */
-void config_delviews(struct config_view* list);
-
-/**
- * Convert 14digit to time value
- * @param str: string of 14 digits
- * @return time value or 0 for error.
- */
-time_t cfg_convert_timeval(const char* str);
-
-/**
- * Count number of values in the string.
- * format ::= (sp num)+ sp
- * num ::= [-](0-9)+
- * sp ::= (space|tab)*
- *
- * @param str: string
- * @return: 0 on parse error, or empty string, else
- * number of integer values in the string.
- */
-int cfg_count_numbers(const char* str);
-
-/**
- * Convert a 'nice' memory or file size into a bytecount
- * From '100k' to 102400. and so on. Understands kKmMgG.
- * k=1024, m=1024*1024, g=1024*1024*1024.
- * @param str: string
- * @param res: result is stored here, size in bytes.
- * @return: true if parsed correctly, or 0 on a parse error (and an error
- * is logged).
- */
-int cfg_parse_memsize(const char* str, size_t* res);
-
-/**
- * Add a tag name to the config. It is added at the end with a new ID value.
- * @param cfg: the config structure.
- * @param tag: string (which is copied) with the name.
- * @return: false on alloc failure.
- */
-int config_add_tag(struct config_file* cfg, const char* tag);
-
-/**
- * Find tag ID in the tag list.
- * @param cfg: the config structure.
- * @param tag: string with tag name to search for.
- * @return: 0..(num_tags-1) with tag ID, or -1 if tagname is not found.
- */
-int find_tag_id(struct config_file* cfg, const char* tag);
-
-/**
- * parse taglist from string into bytestring with bitlist.
- * @param cfg: the config structure (with tagnames)
- * @param str: the string to parse. Parse puts 0 bytes in string.
- * @param listlen: returns length of in bytes.
- * @return malloced bytes with a bitlist of the tags. or NULL on parse error
- * or malloc failure.
- */
-uint8_t* config_parse_taglist(struct config_file* cfg, char* str,
- size_t* listlen);
-
-/**
- * convert tag bitlist to a malloced string with tag names. For debug output.
- * @param cfg: the config structure (with tagnames)
- * @param taglist: the tag bitlist.
- * @param len: length of the tag bitlist.
- * @return malloced string or NULL.
- */
-char* config_taglist2str(struct config_file* cfg, uint8_t* taglist,
- size_t len);
-
-/**
- * see if two taglists intersect (have tags in common).
- * @param list1: first tag bitlist.
- * @param list1len: length in bytes of first list.
- * @param list2: second tag bitlist.
- * @param list2len: length in bytes of second list.
- * @return true if there are tags in common, 0 if not.
- */
-int taglist_intersect(uint8_t* list1, size_t list1len, uint8_t* list2,
- size_t list2len);
-
-/**
- * Parse local-zone directive into two strings and register it in the config.
- * @param cfg: to put it in.
- * @param val: argument strings to local-zone, "example.com nodefault".
- * @return: false on failure
- */
-int cfg_parse_local_zone(struct config_file* cfg, const char* val);
-
-/**
- * Mark "number" or "low-high" as available or not in ports array.
- * @param str: string in input
- * @param allow: give true if this range is permitted.
- * @param avail: the array from cfg.
- * @param num: size of the array (65536).
- * @return: true if parsed correctly, or 0 on a parse error (and an error
- * is logged).
- */
-int cfg_mark_ports(const char* str, int allow, int* avail, int num);
-
-/**
- * Get a condensed list of ports returned. allocated.
- * @param cfg: config file.
- * @param avail: the available ports array is returned here.
- * @return: number of ports in array or 0 on error.
- */
-int cfg_condense_ports(struct config_file* cfg, int** avail);
-
-/**
- * Scan ports available
- * @param avail: the array from cfg.
- * @param num: size of the array (65536).
- * @return the number of ports available for use.
- */
-int cfg_scan_ports(int* avail, int num);
-
-/**
- * Convert a filename to full pathname in original filesys
- * @param fname: the path name to convert.
- * Must not be null or empty.
- * @param cfg: config struct for chroot and chdir (if set).
- * @param use_chdir: if false, only chroot is applied.
- * @return pointer to malloced buffer which is: [chroot][chdir]fname
- * or NULL on malloc failure.
- */
-char* fname_after_chroot(const char* fname, struct config_file* cfg,
- int use_chdir);
-
-/**
- * Convert a ptr shorthand into a full reverse-notation PTR record.
- * @param str: input string, "IP name"
- * @return: malloced string "reversed-ip-name PTR name"
- */
-char* cfg_ptr_reverse(char* str);
-
-/**
- * Append text to the error info for validation.
- * @param qstate: query state.
- * @param str: copied into query region and appended.
- * Failures to allocate are logged.
- */
-void errinf(struct module_qstate* qstate, const char* str);
-
-/**
- * Append text to error info: from 1.2.3.4
- * @param qstate: query state.
- * @param origin: sock list with origin of trouble.
- * Every element added.
- * If NULL: nothing is added.
- * if 0len element: 'from cache' is added.
- */
-void errinf_origin(struct module_qstate* qstate, struct sock_list *origin);
-
-/**
- * Append text to error info: for RRset name type class
- * @param qstate: query state.
- * @param rr: rrset_key.
- */
-void errinf_rrset(struct module_qstate* qstate, struct ub_packed_rrset_key *rr);
-
-/**
- * Append text to error info: str dname
- * @param qstate: query state.
- * @param str: explanation string
- * @param dname: the dname.
- */
-void errinf_dname(struct module_qstate* qstate, const char* str,
- uint8_t* dname);
-
-/**
- * Create error info in string
- * @param qstate: query state.
- * @return string or NULL on malloc failure (already logged).
- * This string is malloced and has to be freed by caller.
- */
-char* errinf_to_str(struct module_qstate* qstate);
-
-/**
- * Used during options parsing
- */
-struct config_parser_state {
- /** name of file being parser */
- char* filename;
- /** line number in the file, starts at 1 */
- int line;
- /** number of errors encountered */
- int errors;
- /** the result of parsing is stored here. */
- struct config_file* cfg;
- /** the current chroot dir (or NULL if none) */
- const char* chroot;
-};
-
-/** global config parser object used during config parsing */
-extern struct config_parser_state* cfg_parser;
-/** init lex state */
-void init_cfg_parse(void);
-/** lex in file */
-extern FILE* ub_c_in;
-/** lex out file */
-extern FILE* ub_c_out;
-/** the yacc lex generated parse function */
-int ub_c_parse(void);
-/** the lexer function */
-int ub_c_lex(void);
-/** wrap function */
-int ub_c_wrap(void);
-/** parsing helpers: print error with file and line numbers */
-void ub_c_error(const char* msg);
-/** parsing helpers: print error with file and line numbers */
-void ub_c_error_msg(const char* fmt, ...) ATTR_FORMAT(printf, 1, 2);
-
-#ifdef UB_ON_WINDOWS
-/**
- * Obtain registry string (if it exists).
- * @param key: key string
- * @param name: name of value to fetch.
- * @return malloced string with the result or NULL if it did not
- * exist on an error (logged with log_err) was encountered.
- */
-char* w_lookup_reg_str(const char* key, const char* name);
-
-/** Modify directory in options for module file name */
-void w_config_adjust_directory(struct config_file* cfg);
-#endif /* UB_ON_WINDOWS */
-
-/** debug option for unit tests. */
-extern int fake_dsa, fake_sha1;
-
-#endif /* UTIL_CONFIG_FILE_H */
diff --git a/external/unbound/util/configlexer.c b/external/unbound/util/configlexer.c
deleted file mode 100644
index 0043165c2..000000000
--- a/external/unbound/util/configlexer.c
+++ /dev/null
@@ -1,5212 +0,0 @@
-#include "config.h"
-#include "util/configyyrename.h"
-
-#line 3 "<stdout>"
-
-#define YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 6
-#define YY_FLEX_SUBMINOR_VERSION 0
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* First, we deal with platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-
-/* end standard C headers. */
-
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-
-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
- */
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS 1
-#endif
-
-#include <inttypes.h>
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX (4294967295U)
-#endif
-
-#endif /* ! C99 */
-
-#endif /* ! FLEXINT_H */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif /* defined (__STDC__) */
-#endif /* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index. If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition. This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN (yy_start) = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state. The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START (((yy_start) - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart(yyin )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k.
- * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
- * Ditto for the __ia64__ case accordingly.
- */
-#define YY_BUF_SIZE 32768
-#else
-#define YY_BUF_SIZE 16384
-#endif /* __ia64__ */
-#endif
-
-/* The state buf must be large enough to hold one state per character in the main buffer.
- */
-#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-extern yy_size_t yyleng;
-
-extern FILE *yyin, *yyout;
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
- #define YY_LESS_LINENO(n)
- #define YY_LINENO_REWIND_TO(ptr)
-
-/* Return all but the first "n" matched characters back to the input stream. */
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- yy_size_t yyless_macro_arg = (n); \
- YY_LESS_LINENO(yyless_macro_arg);\
- *yy_cp = (yy_hold_char); \
- YY_RESTORE_YY_MORE_OFFSET \
- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
- } \
- while ( 0 )
-
-#define unput(c) yyunput( c, (yytext_ptr) )
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
- {
- FILE *yy_input_file;
-
- char *yy_ch_buf; /* input buffer */
- char *yy_buf_pos; /* current position in input buffer */
-
- /* Size of input buffer in bytes, not including room for EOB
- * characters.
- */
- yy_size_t yy_buf_size;
-
- /* Number of characters read into yy_ch_buf, not including EOB
- * characters.
- */
- yy_size_t yy_n_chars;
-
- /* Whether we "own" the buffer - i.e., we know we created it,
- * and can realloc() it to grow it, and should free() it to
- * delete it.
- */
- int yy_is_our_buffer;
-
- /* Whether this is an "interactive" input source; if so, and
- * if we're using stdio for input, then we want to use getc()
- * instead of fread(), to make sure we stop fetching input after
- * each newline.
- */
- int yy_is_interactive;
-
- /* Whether we're considered to be at the beginning of a line.
- * If so, '^' rules will be active on the next match, otherwise
- * not.
- */
- int yy_at_bol;
-
- int yy_bs_lineno; /**< The line count. */
- int yy_bs_column; /**< The column count. */
-
- /* Whether to try to fill the input buffer when we reach the
- * end of it.
- */
- int yy_fill_buffer;
-
- int yy_buffer_status;
-
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
- /* When an EOF's been seen but there's still some text to process
- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
- * shouldn't try reading from the input source any more. We might
- * still have a bunch of tokens to match, though, because of
- * possible backing-up.
- *
- * When we actually see the EOF, we change the status to "new"
- * (via yyrestart()), so that the user can continue scanning by
- * just pointing yyin at a new input file.
- */
-#define YY_BUFFER_EOF_PENDING 2
-
- };
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-/* Stack of input buffers. */
-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- *
- * Returns the top of the stack, or NULL.
- */
-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
- : NULL)
-
-/* Same as previous macro, but useful when we know that the buffer stack is not
- * NULL or when we need an lvalue. For internal use only.
- */
-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
-
-/* yy_hold_char holds the character lost when yytext is formed. */
-static char yy_hold_char;
-static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
-yy_size_t yyleng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 0; /* whether we need to initialize */
-static int yy_start = 0; /* start state number */
-
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin. A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void yyrestart (FILE *input_file );
-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
-void yy_delete_buffer (YY_BUFFER_STATE b );
-void yy_flush_buffer (YY_BUFFER_STATE b );
-void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
-void yypop_buffer_state (void );
-
-static void yyensure_buffer_stack (void );
-static void yy_load_buffer_state (void );
-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
-
-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
-
-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len );
-
-void *yyalloc (yy_size_t );
-void *yyrealloc (void *,yy_size_t );
-void yyfree (void * );
-
-#define yy_new_buffer yy_create_buffer
-
-#define yy_set_interactive(is_interactive) \
- { \
- if ( ! YY_CURRENT_BUFFER ){ \
- yyensure_buffer_stack (); \
- YY_CURRENT_BUFFER_LVALUE = \
- yy_create_buffer(yyin,YY_BUF_SIZE ); \
- } \
- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
- }
-
-#define yy_set_bol(at_bol) \
- { \
- if ( ! YY_CURRENT_BUFFER ){\
- yyensure_buffer_stack (); \
- YY_CURRENT_BUFFER_LVALUE = \
- yy_create_buffer(yyin,YY_BUF_SIZE ); \
- } \
- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
- }
-
-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-
-/* Begin user sect3 */
-
-typedef unsigned char YY_CHAR;
-
-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
-
-typedef int yy_state_type;
-
-extern int yylineno;
-
-int yylineno = 1;
-
-extern char *yytext;
-#ifdef yytext_ptr
-#undef yytext_ptr
-#endif
-#define yytext_ptr yytext
-
-static yy_state_type yy_get_previous_state (void );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
-static int yy_get_next_buffer (void );
-#if defined(__GNUC__) && __GNUC__ >= 3
-__attribute__((__noreturn__))
-#endif
-static void yy_fatal_error (yyconst char msg[] );
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
- (yytext_ptr) = yy_bp; \
- (yytext_ptr) -= (yy_more_len); \
- yyleng = (size_t) (yy_cp - (yytext_ptr)); \
- (yy_hold_char) = *yy_cp; \
- *yy_cp = '\0'; \
- (yy_c_buf_p) = yy_cp;
-
-#define YY_NUM_RULES 221
-#define YY_END_OF_BUFFER 222
-/* This struct is not used in this scanner,
- but its presence is necessary. */
-struct yy_trans_info
- {
- flex_int32_t yy_verify;
- flex_int32_t yy_nxt;
- };
-static yyconst flex_int16_t yy_accept[2165] =
- { 0,
- 1, 1, 203, 203, 207, 207, 211, 211, 215, 215,
- 1, 1, 222, 219, 1, 201, 201, 220, 2, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 220,
- 203, 204, 204, 205, 220, 207, 208, 208, 209, 220,
- 214, 211, 212, 212, 213, 220, 215, 216, 216, 217,
- 220, 218, 202, 2, 206, 218, 220, 219, 0, 1,
- 2, 2, 2, 2, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 203, 0, 207, 0, 214, 0, 211, 215, 0, 218,
- 0, 2, 2, 218, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 218, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
-
- 218, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 77, 219, 219, 219,
- 219, 219, 219, 8, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 88, 218, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 218,
- 219, 219, 219, 219, 219, 37, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 168, 219,
- 14, 15, 219, 18, 17, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 154, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 3, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 218, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 210, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 40, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 41, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 143, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 20, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 102, 219, 210, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 195, 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 118, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 101, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 75, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 25, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 38, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 39, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 119, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 28, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 183, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 219, 219, 32, 219, 33,
- 219, 219, 219, 78, 219, 79, 219, 219, 76, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 7, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 161, 219, 219, 219, 219, 104, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 29, 219, 219, 219,
-
- 219, 219, 219, 219, 135, 219, 134, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 16, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 42, 219, 219,
- 219, 219, 219, 219, 142, 219, 219, 219, 219, 81,
- 80, 219, 219, 219, 219, 219, 219, 219, 219, 129,
- 219, 219, 219, 219, 219, 219, 219, 219, 89, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 60, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 64, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 36, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 132,
- 133, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 6, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 193, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 26, 219, 219, 219, 219, 219, 219, 219, 219, 125,
-
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 147, 219, 126, 219, 219, 159, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 27, 219, 219, 219, 219, 84, 219, 85, 219, 83,
- 219, 219, 219, 219, 219, 219, 219, 219, 99, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 182, 219, 219, 127, 219, 219, 219, 219, 219, 130,
- 219, 219, 158, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 74, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 34, 219, 219, 22, 219,
- 219, 219, 219, 19, 219, 109, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 49, 51, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 197, 219, 219, 169, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 86, 219, 219, 219, 219, 219, 219, 219, 98, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 103, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 219, 153, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 117, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 113, 219, 120, 219, 219, 219,
- 219, 219, 92, 219, 219, 70, 219, 219, 219, 145,
- 219, 219, 219, 219, 219, 160, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 174, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 116, 219, 219, 219, 219, 219, 52, 53, 219, 219,
- 219, 219, 219, 35, 59, 121, 219, 136, 219, 162,
-
- 131, 219, 219, 219, 45, 219, 123, 219, 219, 219,
- 219, 219, 9, 219, 219, 219, 73, 219, 219, 219,
- 219, 187, 219, 144, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 105, 196, 219, 219, 173, 219, 219, 219, 219, 219,
- 219, 219, 219, 155, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 122, 219, 219, 219, 44, 46,
-
- 219, 219, 219, 219, 219, 219, 219, 72, 219, 219,
- 219, 219, 185, 219, 192, 219, 219, 219, 219, 219,
- 149, 23, 24, 219, 219, 219, 219, 219, 219, 219,
- 219, 69, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 151, 148, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 43,
- 219, 219, 219, 219, 219, 219, 219, 219, 100, 13,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 12, 219, 219, 21, 219, 219,
- 219, 191, 219, 194, 47, 219, 157, 219, 150, 219,
-
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 112, 111, 219, 219, 219, 219, 219, 219, 152,
- 146, 219, 219, 198, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 54, 219, 219, 219, 186, 219,
- 219, 219, 156, 219, 219, 219, 219, 219, 219, 219,
- 219, 48, 219, 219, 219, 82, 219, 106, 108, 137,
- 219, 219, 219, 110, 219, 219, 163, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 170, 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 138, 219, 219, 184, 219,
- 219, 219, 30, 219, 219, 219, 219, 4, 219, 219,
- 93, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 166, 219, 219, 219, 219, 219, 219, 199, 219, 219,
- 219, 219, 219, 172, 219, 219, 141, 219, 219, 219,
- 219, 219, 219, 219, 219, 57, 219, 31, 190, 167,
- 219, 219, 11, 219, 219, 219, 219, 219, 219, 139,
- 61, 219, 219, 219, 115, 219, 219, 219, 219, 219,
- 95, 219, 219, 219, 219, 219, 219, 219, 171, 90,
- 219, 87, 219, 219, 219, 63, 67, 62, 219, 55,
-
- 219, 219, 10, 219, 219, 219, 188, 219, 219, 114,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 68, 66, 219, 56, 219,
- 219, 219, 128, 219, 219, 140, 219, 219, 219, 219,
- 107, 50, 219, 219, 200, 219, 219, 219, 219, 219,
- 219, 91, 65, 96, 97, 58, 219, 189, 219, 219,
- 219, 165, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 71, 219, 164, 219, 181, 219, 219,
- 219, 219, 219, 219, 5, 219, 219, 219, 219, 219,
-
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 94, 219, 219, 219, 219, 219, 219, 124,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 177, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 175, 219, 178, 179, 219, 219, 219, 219,
- 219, 176, 180, 0
- } ;
-
-static yyconst YY_CHAR yy_ec[256] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
- 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 1, 5, 6, 1, 1, 1, 7, 1,
- 1, 1, 1, 1, 8, 1, 1, 1, 9, 1,
- 10, 11, 1, 12, 1, 1, 1, 13, 1, 1,
- 1, 1, 1, 1, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
- 1, 40, 1, 1, 1, 1, 41, 42, 43, 44,
-
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
- 65, 66, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1
- } ;
-
-static yyconst YY_CHAR yy_meta[67] =
- { 0,
- 1, 2, 3, 4, 5, 1, 6, 1, 1, 1,
- 1, 1, 7, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1
- } ;
-
-static yyconst flex_uint16_t yy_base[2179] =
- { 0,
- 0, 0, 64, 67, 70, 72, 78, 84, 89, 92,
- 131, 137, 473, 390, 96, 6214, 6214, 6214, 109, 111,
- 142, 180, 86, 133, 138, 172, 50, 151, 91, 181,
- 197, 124, 241, 187, 225, 289, 233, 228, 253, 307,
- 385, 6214, 6214, 6214, 95, 362, 6214, 6214, 6214, 102,
- 331, 364, 6214, 6214, 6214, 311, 317, 6214, 6214, 6214,
- 116, 245, 6214, 321, 6214, 265, 328, 221, 334, 160,
- 0, 338, 0, 0, 141, 206, 184, 330, 322, 255,
- 323, 335, 324, 222, 268, 350, 325, 334, 344, 357,
- 358, 352, 367, 364, 389, 160, 361, 388, 394, 214,
-
- 373, 400, 391, 383, 399, 416, 410, 414, 407, 421,
- 437, 424, 448, 425, 434, 178, 431, 464, 441, 460,
- 458, 462, 461, 468, 263, 490, 488, 487, 476, 491,
- 212, 171, 170, 241, 164, 533, 146, 85, 284, 77,
- 539, 543, 0, 509, 511, 534, 526, 536, 523, 530,
- 546, 527, 539, 554, 553, 559, 557, 580, 624, 561,
- 571, 572, 586, 569, 589, 597, 581, 579, 619, 585,
- 609, 610, 646, 612, 627, 570, 622, 661, 630, 626,
- 642, 653, 670, 673, 681, 671, 669, 677, 665, 680,
- 662, 679, 688, 690, 703, 700, 699, 715, 717, 702,
-
- 704, 714, 708, 729, 723, 727, 728, 738, 741, 735,
- 763, 742, 764, 744, 758, 755, 765, 745, 772, 769,
- 760, 784, 761, 789, 778, 782, 792, 810, 813, 578,
- 797, 816, 819, 802, 806, 823, 824, 822, 832, 838,
- 837, 834, 849, 841, 836, 839, 846, 847, 868, 872,
- 853, 866, 859, 881, 873, 876, 883, 886, 878, 902,
- 897, 904, 899, 909, 938, 359, 924, 915, 928, 936,
- 944, 901, 951, 949, 942, 955, 946, 917, 959, 966,
- 961, 971, 970, 984, 987, 977, 994, 996, 999, 998,
- 1007, 980, 997, 1017, 1026, 1019, 1071, 1021, 1032, 1043,
-
- 1030, 1035, 1034, 1044, 1040, 1042, 1055, 1057, 1078, 1084,
- 1079, 1100, 1076, 1095, 1101, 1102, 1099, 1092, 1104, 1134,
- 1098, 1114, 1121, 1125, 1136, 1140, 1143, 1128, 1142, 1159,
- 1149, 1145, 1171, 1151, 1164, 1161, 1174, 1186, 1187, 1173,
- 1183, 1189, 1039, 1195, 1202, 1199, 1191, 1200, 1206, 1213,
- 1216, 1220, 1230, 1229, 1214, 1236, 6214, 1243, 1227, 1238,
- 1240, 1233, 1247, 6214, 1261, 1257, 1255, 1209, 1263, 1273,
- 1271, 1260, 1288, 1286, 1296, 1280, 1292, 1295, 1282, 1298,
- 1305, 1306, 1310, 1308, 1354, 1316, 1312, 1318, 1345, 1339,
- 1329, 1265, 1332, 1347, 1337, 1356, 1363, 1366, 1364, 1383,
-
- 1387, 1375, 1377, 1393, 6214, 1397, 1376, 1404, 1283, 1395,
- 1390, 979, 1411, 1406, 1414, 1415, 1426, 1417, 1425, 1431,
- 1420, 1421, 1451, 1442, 1440, 1449, 1465, 1450, 1462, 1470,
- 1447, 1466, 1453, 1467, 1469, 1484, 1477, 1483, 1480, 1486,
- 1488, 1482, 1476, 1513, 1500, 1504, 1502, 1514, 1517, 1509,
- 1529, 1526, 1527, 1533, 1534, 1546, 1542, 1550, 1560, 1561,
- 1552, 1555, 1547, 1566, 1573, 1577, 1578, 1557, 1582, 1586,
- 1584, 1603, 1588, 1601, 1617, 1595, 1607, 1619, 1602, 1615,
- 1622, 1614, 1627, 1636, 1637, 1618, 1648, 1639, 1653, 1642,
- 1644, 1649, 1652, 1657, 1647, 1663, 1673, 1667, 1666, 1697,
-
- 1677, 1679, 1700, 1699, 1704, 1702, 1693, 1692, 1708, 1705,
- 1717, 1726, 1732, 1735, 1723, 1736, 1738, 1731, 1742, 1749,
- 1752, 1753, 1725, 1774, 1762, 6214, 1758, 1761, 1766, 1787,
- 1778, 1776, 1792, 1788, 1779, 1782, 1800, 1843, 6214, 1784,
- 6214, 6214, 1795, 6214, 6214, 1822, 1802, 1826, 1815, 1832,
- 1805, 1892, 1836, 1819, 1827, 1839, 1847, 1844, 1849, 1860,
- 1858, 1879, 1876, 1875, 1885, 1895, 1874, 1906, 1889, 1908,
- 1907, 1913, 1903, 1929, 1921, 1920, 1923, 1944, 1941, 1842,
- 1934, 1948, 1947, 1949, 1950, 1942, 1959, 1955, 1969, 1963,
- 1956, 1971, 1954, 1974, 6214, 1985, 1986, 1996, 1992, 1989,
-
- 2001, 1990, 1991, 1980, 2022, 6214, 2007, 2008, 2016, 2034,
- 2017, 2020, 2019, 2028, 2036, 2046, 2024, 2035, 2044, 2047,
- 2043, 2052, 2056, 2062, 2064, 2081, 2092, 2084, 2071, 2083,
- 2089, 2072, 2096, 2101, 2099, 2086, 2087, 2106, 2098, 2107,
- 2114, 2112, 2120, 2133, 2117, 2116, 2124, 2122, 2125, 2171,
- 2156, 2144, 2139, 2143, 2173, 2163, 2167, 2175, 2158, 2179,
- 2184, 2181, 2207, 2186, 2183, 2200, 2203, 2219, 2231, 2228,
- 75, 2258, 2223, 2224, 2226, 2230, 2244, 2233, 2246, 2247,
- 2249, 2251, 2236, 2271, 6214, 2252, 2279, 2273, 2267, 2288,
- 2285, 2286, 2287, 2294, 2283, 2307, 2301, 2313, 2302, 2310,
-
- 2311, 2326, 2327, 2306, 6214, 2325, 2323, 2328, 2329, 2343,
- 2352, 2354, 2351, 2340, 2366, 2361, 6214, 2349, 2377, 2379,
- 2382, 2375, 2370, 2376, 2369, 2378, 2392, 2373, 2403, 2397,
- 2406, 2409, 2415, 6214, 2393, 2407, 2422, 2429, 2430, 2419,
- 2440, 2426, 2432, 2425, 2434, 2436, 2453, 2455, 6214, 2450,
- 2459, 2454, 2457, 2478, 2480, 2461, 2474, 2483, 2471, 2477,
- 2481, 291, 2482, 2485, 2492, 2472, 6214, 2495, 68, 2488,
- 2498, 2496, 2531, 2533, 2525, 2532, 2537, 2521, 2522, 2539,
- 2538, 2527, 2540, 2541, 2551, 2545, 2561, 2558, 2571, 2559,
- 2589, 6214, 2554, 2582, 2583, 2585, 2588, 2566, 2586, 2596,
-
- 2573, 2602, 2606, 6214, 2620, 2623, 2615, 2616, 2611, 2621,
- 2632, 2628, 2618, 2635, 2626, 2643, 2645, 2641, 2653, 2665,
- 6214, 2651, 2655, 2667, 2657, 2676, 2678, 2691, 2666, 2683,
- 2682, 2688, 2686, 2698, 2684, 2705, 2709, 2710, 2715, 2716,
- 2722, 2708, 2718, 2724, 2717, 2712, 2743, 2745, 2747, 2749,
- 2772, 2766, 153, 2751, 6214, 2756, 2758, 2750, 2755, 2771,
- 2770, 2787, 2782, 2794, 2789, 2791, 2795, 2806, 2785, 2815,
- 2807, 2811, 2825, 6214, 2832, 2822, 2817, 2839, 2821, 2840,
- 2838, 2829, 2845, 2837, 2853, 2847, 2856, 2859, 2851, 2865,
- 2866, 2862, 6214, 2881, 2884, 2885, 2886, 2882, 2876, 2883,
-
- 2897, 2879, 2887, 2878, 2909, 2905, 2896, 2903, 2906, 2911,
- 2926, 2917, 2914, 2913, 2930, 2945, 2928, 2943, 6214, 2940,
- 2965, 2941, 2953, 2949, 2956, 2964, 2977, 2967, 2978, 2980,
- 2976, 2966, 2973, 2991, 2990, 2992, 2993, 6214, 2998, 2997,
- 2970, 3011, 3007, 3012, 3016, 3014, 3025, 3028, 3039, 3029,
- 3036, 3048, 3038, 3040, 3043, 3054, 3056, 3066, 3067, 3076,
- 6214, 3069, 3074, 3070, 3071, 3080, 3073, 3063, 3113, 3115,
- 3072, 3098, 3099, 3101, 3107, 3095, 3104, 3105, 3129, 3108,
- 3114, 3124, 3130, 3125, 3132, 3131, 3135, 3134, 3155, 3165,
- 3163, 3170, 3156, 3162, 3159, 3185, 6214, 3158, 3184, 3175,
-
- 3176, 3189, 3186, 3192, 3195, 3182, 3207, 6214, 3199, 6214,
- 3216, 3222, 3229, 6214, 3225, 6214, 3228, 3214, 6214, 3232,
- 3237, 3224, 3220, 3226, 3231, 3246, 3254, 3256, 3248, 3269,
- 3249, 3263, 3273, 3259, 3275, 6214, 3279, 3264, 3285, 3283,
- 3287, 3288, 3293, 3294, 3311, 3297, 3320, 3318, 3298, 3307,
- 3333, 6214, 3315, 3331, 3332, 3330, 6214, 3328, 3338, 3340,
- 3319, 3346, 3345, 3350, 3349, 3368, 3358, 3365, 3372, 3375,
- 3357, 3384, 3388, 3389, 3373, 3385, 3383, 3398, 3400, 3399,
- 3396, 3401, 3420, 3416, 3411, 3414, 3415, 3410, 3422, 3427,
- 3431, 3445, 3430, 3432, 3441, 3443, 6214, 3453, 3440, 3468,
-
- 3454, 3458, 3466, 3467, 6214, 3484, 6214, 3449, 3486, 3488,
- 3487, 3470, 3493, 3491, 3494, 3500, 3497, 3513, 3517, 3508,
- 3512, 3510, 3511, 3514, 3526, 3531, 6214, 3520, 3530, 3550,
- 3536, 3553, 3549, 3559, 3555, 3565, 3566, 6214, 3570, 3572,
- 3573, 3579, 3576, 3582, 6214, 3575, 3578, 3585, 3604, 6214,
- 6214, 3577, 3600, 3601, 3602, 3597, 3623, 3603, 3615, 6214,
- 3621, 3612, 3622, 3631, 3639, 3640, 3628, 3629, 6214, 3642,
- 3638, 3647, 3655, 3656, 3658, 3654, 3660, 3659, 3663, 3674,
- 3671, 3651, 3688, 3676, 6214, 3689, 3684, 3696, 3687, 3703,
- 3686, 3690, 3704, 3719, 3700, 3698, 3713, 3729, 3726, 3718,
-
- 3727, 3741, 3749, 3731, 3740, 3723, 3747, 3737, 3760, 3745,
- 3763, 3767, 3778, 3774, 6214, 3783, 3762, 3786, 3770, 3779,
- 3785, 3787, 3796, 3805, 3800, 3801, 3804, 3806, 6214, 3808,
- 3802, 3809, 3811, 3813, 3833, 3822, 3828, 3836, 3825, 6214,
- 6214, 3832, 3835, 3854, 3843, 3860, 3862, 3846, 3864, 3848,
- 3863, 6214, 3873, 3881, 3866, 3875, 3885, 3889, 3888, 3890,
- 3887, 3877, 3884, 3898, 3904, 3900, 3893, 3920, 3911, 3924,
- 6214, 3913, 3914, 3916, 3938, 3927, 3930, 3936, 3956, 3949,
- 3931, 3947, 3948, 3955, 3964, 3978, 3975, 3954, 3965, 3989,
- 6214, 3973, 3982, 3981, 3962, 3995, 3974, 4002, 3991, 6214,
-
- 4007, 3997, 4006, 4011, 3999, 4020, 4015, 4012, 4022, 4018,
- 6214, 4026, 6214, 4029, 4023, 6214, 4024, 4040, 4041, 4034,
- 4055, 4057, 4044, 4056, 4048, 4050, 4068, 4071, 4078, 4067,
- 6214, 4073, 4062, 4077, 4079, 6214, 4090, 6214, 4093, 6214,
- 4087, 4083, 4116, 4101, 4120, 4117, 4122, 4115, 6214, 4124,
- 4105, 4126, 4128, 4112, 4129, 4145, 4147, 4108, 4148, 4160,
- 6214, 4142, 4150, 6214, 4168, 4138, 4153, 4176, 4175, 6214,
- 4169, 4183, 6214, 4174, 4191, 4187, 4189, 4190, 4199, 4202,
- 4193, 4203, 4227, 4219, 4212, 4220, 6214, 4214, 4218, 4235,
- 4236, 4229, 4222, 4241, 4238, 4246, 4245, 4252, 4260, 4265,
-
- 4256, 4255, 4266, 4269, 4279, 6214, 4262, 4281, 6214, 4282,
- 4270, 4280, 4283, 6214, 4294, 6214, 4296, 4297, 4289, 4306,
- 4311, 4310, 4320, 4309, 4326, 4327, 4318, 4340, 4335, 4324,
- 6214, 6214, 4334, 4348, 4341, 4352, 4355, 4353, 4342, 4369,
- 4361, 4372, 4368, 6214, 4370, 4358, 6214, 4359, 4376, 4371,
- 4387, 4386, 4388, 4393, 4389, 4400, 4392, 4405, 4396, 4398,
- 6214, 4411, 4401, 4415, 4416, 4419, 4414, 4427, 6214, 4432,
- 4445, 4449, 4437, 4441, 4443, 4457, 4460, 4461, 4454, 4465,
- 4462, 4482, 4471, 4473, 4480, 4474, 4486, 4477, 4497, 4499,
- 4488, 4484, 6214, 4501, 4508, 4498, 4510, 4496, 4513, 4509,
-
- 4515, 4527, 4526, 4523, 4528, 4532, 6214, 4529, 4525, 4536,
- 4530, 4560, 4543, 4564, 4546, 4561, 4553, 4570, 4558, 4575,
- 6214, 4557, 4576, 4565, 4573, 4578, 4596, 4602, 4594, 4603,
- 4605, 4597, 4588, 4606, 6214, 4598, 6214, 4613, 4615, 4624,
- 4626, 4628, 6214, 4629, 4637, 6214, 4640, 4604, 4645, 6214,
- 4655, 4654, 4641, 4651, 4660, 6214, 4665, 4664, 4671, 4670,
- 4662, 4673, 4668, 4679, 4675, 4682, 6214, 4695, 4701, 4705,
- 4703, 4691, 4692, 4700, 4709, 4696, 4710, 4722, 4718, 4707,
- 6214, 4717, 4741, 4734, 4739, 4748, 6214, 6214, 4740, 4752,
- 4755, 4730, 4761, 6214, 6214, 6214, 4759, 6214, 4745, 6214,
-
- 6214, 4760, 4764, 4770, 6214, 4771, 6214, 4781, 4777, 4768,
- 4772, 4788, 6214, 4782, 4790, 4800, 6214, 4797, 4808, 4789,
- 4795, 6214, 4812, 6214, 4813, 4818, 4820, 4817, 4809, 4816,
- 4821, 4831, 4832, 4838, 4837, 4824, 4853, 4843, 4844, 4848,
- 4857, 4841, 4863, 4858, 4846, 4859, 4864, 4868, 4882, 4873,
- 4884, 4880, 4875, 4885, 4900, 4905, 4909, 4878, 4913, 4915,
- 6214, 6214, 4899, 4907, 6214, 4901, 4904, 4911, 4919, 4920,
- 4930, 4934, 4953, 6214, 4951, 4946, 4940, 4956, 4944, 4947,
- 4957, 4960, 4943, 4964, 4968, 4974, 4970, 4978, 4977, 4967,
- 4980, 4986, 5003, 5007, 6214, 4989, 4990, 4992, 6214, 6214,
-
- 4994, 5015, 5012, 5013, 5004, 5024, 5025, 6214, 5017, 5039,
- 5026, 5033, 6214, 5047, 6214, 5048, 5031, 5054, 5052, 5061,
- 6214, 6214, 6214, 5062, 5042, 5055, 5056, 5066, 5067, 5059,
- 5077, 6214, 5081, 5075, 5082, 5086, 5076, 5097, 5093, 5105,
- 5111, 5112, 5114, 5103, 5116, 5119, 6214, 6214, 5108, 5131,
- 5120, 5127, 5129, 5135, 5141, 5134, 5128, 5146, 5145, 6214,
- 5156, 5148, 5147, 5158, 5155, 5160, 5178, 5161, 6214, 6214,
- 5162, 5173, 5175, 5190, 5176, 5192, 5184, 5204, 5188, 5205,
- 5139, 5210, 5206, 5208, 6214, 5203, 5211, 6214, 5219, 5202,
- 5227, 6214, 5217, 6214, 6214, 5225, 6214, 5228, 6214, 5229,
-
- 5246, 5253, 5254, 5258, 5259, 5260, 5243, 5250, 5267, 5263,
- 5262, 6214, 6214, 5272, 5255, 5265, 5270, 5275, 5279, 6214,
- 6214, 5290, 5293, 6214, 5276, 5291, 5299, 5289, 5292, 5297,
- 5313, 5302, 5306, 5318, 5324, 5329, 5331, 5326, 5338, 5327,
- 5323, 5335, 5340, 5341, 6214, 5346, 5352, 5345, 6214, 5366,
- 5370, 5368, 6214, 5362, 5378, 5379, 5372, 5369, 5391, 5385,
- 5392, 6214, 5394, 5400, 5402, 6214, 5388, 6214, 6214, 6214,
- 5411, 5419, 5408, 6214, 5418, 5429, 6214, 5422, 5415, 5412,
- 5407, 5443, 5436, 5447, 5437, 5434, 5449, 5440, 5467, 5441,
- 5465, 6214, 5450, 5456, 5472, 5460, 5474, 5475, 5464, 5470,
-
- 5482, 5481, 5477, 5488, 5487, 6214, 5495, 5510, 6214, 5512,
- 5502, 5514, 6214, 5520, 5501, 5500, 5505, 6214, 5525, 5517,
- 6214, 5513, 5534, 5536, 5530, 5542, 5539, 5538, 5540, 5555,
- 6214, 5548, 5544, 5547, 5568, 5569, 5561, 6214, 5573, 5558,
- 5585, 5575, 5584, 6214, 5589, 5571, 6214, 5594, 5596, 5583,
- 5598, 5607, 5608, 5609, 5610, 6214, 5613, 6214, 6214, 6214,
- 5600, 5617, 6214, 5614, 5612, 5611, 5620, 5632, 5628, 6214,
- 6214, 5635, 5646, 5645, 6214, 5634, 5637, 5647, 5636, 5659,
- 6214, 5658, 5649, 5653, 5651, 5670, 5662, 5663, 6214, 6214,
- 5679, 6214, 5682, 5691, 5696, 6214, 6214, 6214, 5701, 6214,
-
- 5704, 5703, 6214, 5705, 5690, 5697, 6214, 5712, 5698, 6214,
- 5702, 5710, 5715, 5721, 5722, 5718, 5731, 5741, 5725, 5729,
- 5730, 5748, 5749, 5740, 5755, 6214, 6214, 5761, 6214, 5762,
- 5764, 5765, 6214, 5757, 5769, 6214, 5758, 5771, 5768, 5773,
- 6214, 6214, 5776, 5784, 6214, 5779, 5788, 5785, 5782, 5786,
- 5789, 6214, 6214, 6214, 6214, 6214, 5815, 6214, 5803, 5799,
- 5806, 6214, 5800, 5797, 5809, 5821, 5825, 5828, 5812, 5826,
- 5831, 5838, 5845, 5856, 5858, 5857, 5855, 5861, 5848, 5847,
- 5868, 5863, 5869, 6214, 5864, 6214, 5874, 6214, 5875, 5881,
- 5885, 5883, 5886, 5884, 6214, 5891, 5910, 5888, 5896, 5904,
-
- 5901, 5911, 5922, 5906, 5929, 5934, 5937, 5940, 5941, 5931,
- 5944, 5948, 6214, 5952, 5936, 5938, 5956, 5947, 5963, 6214,
- 5965, 5961, 5962, 5972, 5977, 5982, 5975, 5990, 5995, 5993,
- 5999, 5992, 6000, 6003, 6008, 5997, 6023, 6012, 6214, 6024,
- 6027, 6017, 6021, 6033, 6022, 6026, 6046, 6052, 6050, 6062,
- 6064, 6058, 6214, 6061, 6214, 6214, 6070, 6059, 6063, 6069,
- 6071, 6214, 6214, 6214, 6122, 6129, 6136, 6143, 6150, 100,
- 6157, 6164, 6171, 6178, 6185, 6192, 6199, 6206
- } ;
-
-static yyconst flex_int16_t yy_def[2179] =
- { 0,
- 2164, 1, 2165, 2165, 2166, 2166, 2167, 2167, 2168, 2168,
- 2169, 2169, 2164, 2170, 2164, 2164, 2164, 2164, 2171, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2172, 2164, 2164, 2164, 2172, 2173, 2164, 2164, 2164, 2173,
- 2174, 2164, 2164, 2164, 2164, 2174, 2175, 2164, 2164, 2164,
- 2175, 2176, 2164, 2177, 2164, 2176, 2176, 2170, 2170, 2164,
- 2178, 2171, 2178, 2171, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2172, 2172, 2173, 2173, 2174, 2174, 2164, 2175, 2175, 2176,
- 2176, 2177, 2177, 2176, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2176, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2176, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2164, 2176, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2176,
- 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170,
- 2164, 2164, 2170, 2164, 2164, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2176, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2176, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2164,
- 2170, 2170, 2170, 2164, 2170, 2164, 2170, 2170, 2164, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2164, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2164, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2164,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2164, 2170, 2170, 2164, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2164, 2170, 2164, 2170, 2164,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2164,
- 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2164, 2170,
- 2170, 2170, 2170, 2164, 2170, 2164, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2164, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2164, 2170, 2170, 2164, 2170, 2170, 2170, 2164,
- 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2170, 2164, 2164, 2170, 2170,
- 2170, 2170, 2170, 2164, 2164, 2164, 2170, 2164, 2170, 2164,
-
- 2164, 2170, 2170, 2170, 2164, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2164, 2170, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2164, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2164, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2164, 2164,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170,
- 2170, 2170, 2164, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
- 2164, 2164, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2164, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2164,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2164, 2170, 2170,
- 2170, 2164, 2170, 2164, 2164, 2170, 2164, 2170, 2164, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2164, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2164,
- 2164, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2164, 2170,
- 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2164, 2170, 2170, 2170, 2164, 2170, 2164, 2164, 2164,
- 2170, 2170, 2170, 2164, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2164, 2170,
- 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2164, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2170,
- 2170, 2170, 2170, 2164, 2170, 2170, 2164, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2164, 2170, 2164, 2164, 2164,
- 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2164,
- 2164, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
- 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2164,
- 2170, 2164, 2170, 2170, 2170, 2164, 2164, 2164, 2170, 2164,
-
- 2170, 2170, 2164, 2170, 2170, 2170, 2164, 2170, 2170, 2164,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2164, 2164, 2170, 2164, 2170,
- 2170, 2170, 2164, 2170, 2170, 2164, 2170, 2170, 2170, 2170,
- 2164, 2164, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
- 2170, 2164, 2164, 2164, 2164, 2164, 2170, 2164, 2170, 2170,
- 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2164, 2170, 2164, 2170, 2164, 2170, 2170,
- 2170, 2170, 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170,
-
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2164, 2170, 2170, 2170, 2170, 2170, 2170, 2164,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2164, 2170,
- 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
- 2170, 2170, 2164, 2170, 2164, 2164, 2170, 2170, 2170, 2170,
- 2170, 2164, 2164, 0, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164
- } ;
-
-static yyconst flex_uint16_t yy_nxt[6281] =
- { 0,
- 14, 15, 16, 17, 18, 19, 18, 14, 14, 14,
- 14, 14, 18, 20, 14, 21, 22, 23, 24, 14,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37, 38, 39, 14, 14, 14, 14, 40,
- 20, 14, 21, 22, 23, 24, 14, 25, 26, 27,
- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
- 38, 39, 14, 14, 14, 14, 42, 43, 44, 42,
- 43, 44, 47, 48, 47, 48, 49, 97, 49, 52,
- 53, 54, 55, 805, 18, 52, 53, 54, 55, 69,
- 18, 58, 59, 60, 58, 59, 60, 70, 131, 131,
-
- 68, 71, 87, 45, 97, 133, 45, 141, 133, 50,
- 73, 50, 73, 73, 69, 73, 141, 56, 99, 138,
- 138, 73, 88, 56, 139, 69, 75, 76, 61, 87,
- 69, 61, 15, 16, 17, 63, 64, 65, 15, 16,
- 17, 63, 64, 65, 77, 99, 89, 137, 74, 88,
- 69, 91, 66, 75, 76, 78, 145, 107, 66, 92,
- 90, 70, 79, 69, 990, 71, 80, 173, 98, 81,
- 67, 77, 69, 89, 131, 131, 67, 69, 91, 66,
- 69, 69, 78, 145, 107, 66, 92, 90, 93, 79,
- 69, 94, 69, 80, 100, 98, 81, 82, 95, 69,
-
- 96, 83, 101, 136, 84, 197, 85, 86, 102, 134,
- 104, 69, 103, 113, 105, 93, 147, 69, 94, 69,
- 69, 100, 146, 69, 82, 95, 69, 96, 83, 101,
- 106, 84, 197, 85, 86, 102, 69, 104, 114, 103,
- 113, 105, 115, 147, 133, 69, 123, 133, 124, 146,
- 179, 132, 116, 69, 126, 117, 157, 106, 108, 127,
- 69, 69, 109, 125, 69, 114, 128, 69, 110, 115,
- 129, 111, 69, 123, 130, 124, 151, 179, 112, 116,
- 69, 126, 117, 157, 141, 108, 127, 138, 138, 109,
- 125, 144, 69, 128, 69, 110, 208, 129, 111, 158,
-
- 897, 130, 69, 151, 141, 112, 118, 69, 68, 119,
- 68, 68, 135, 68, 135, 135, 120, 135, 144, 68,
- 121, 122, 73, 208, 73, 73, 158, 73, 69, 140,
- 69, 140, 140, 118, 140, 68, 119, 68, 68, 73,
- 68, 73, 73, 120, 73, 148, 68, 121, 122, 152,
- 73, 161, 150, 153, 155, 156, 139, 159, 149, 154,
- 143, 69, 69, 69, 69, 137, 162, 163, 166, 69,
- 136, 357, 148, 69, 69, 160, 152, 74, 161, 150,
- 153, 155, 156, 69, 167, 149, 154, 164, 165, 69,
- 168, 69, 174, 162, 163, 166, 69, 69, 69, 180,
-
- 69, 134, 160, 69, 169, 175, 69, 170, 183, 177,
- 182, 167, 69, 178, 164, 165, 181, 168, 184, 174,
- 171, 172, 69, 188, 132, 176, 180, 69, 69, 69,
- 69, 169, 175, 69, 170, 183, 177, 182, 69, 69,
- 178, 185, 186, 181, 187, 184, 69, 171, 172, 69,
- 188, 189, 176, 69, 190, 69, 192, 194, 191, 195,
- 69, 193, 198, 69, 69, 196, 201, 202, 185, 186,
- 69, 187, 2164, 69, 2164, 204, 69, 2164, 189, 2164,
- 69, 190, 203, 192, 194, 191, 195, 69, 193, 198,
- 199, 206, 196, 201, 200, 205, 207, 69, 2164, 69,
-
- 69, 69, 204, 69, 209, 211, 213, 69, 214, 203,
- 2164, 212, 2164, 2164, 2164, 69, 2164, 199, 206, 2164,
- 2164, 200, 205, 207, 215, 210, 69, 69, 216, 69,
- 69, 209, 211, 213, 135, 214, 135, 135, 212, 135,
- 140, 217, 140, 140, 73, 140, 73, 73, 141, 73,
- 69, 215, 210, 218, 220, 216, 219, 221, 2164, 223,
- 224, 225, 69, 222, 229, 69, 69, 226, 2164, 69,
- 227, 2164, 228, 69, 238, 69, 2164, 258, 69, 2164,
- 218, 220, 143, 219, 221, 69, 223, 224, 316, 240,
- 222, 230, 69, 69, 226, 231, 69, 227, 69, 228,
-
- 69, 238, 239, 241, 242, 243, 246, 245, 69, 69,
- 69, 69, 232, 2164, 244, 249, 240, 69, 69, 69,
- 69, 2164, 231, 2164, 69, 69, 250, 251, 69, 239,
- 241, 242, 243, 246, 245, 259, 69, 262, 2164, 232,
- 233, 244, 249, 247, 256, 234, 248, 263, 69, 69,
- 235, 69, 2164, 250, 251, 257, 236, 237, 69, 252,
- 265, 69, 259, 69, 253, 69, 69, 233, 260, 69,
- 247, 256, 234, 248, 263, 264, 254, 235, 255, 261,
- 267, 69, 257, 236, 237, 69, 252, 266, 268, 2164,
- 269, 253, 69, 2164, 270, 271, 274, 272, 273, 275,
-
- 69, 69, 264, 254, 69, 255, 261, 277, 69, 69,
- 69, 284, 69, 276, 266, 287, 69, 269, 69, 69,
- 69, 270, 271, 274, 272, 273, 275, 69, 279, 69,
- 278, 280, 281, 282, 277, 291, 283, 289, 69, 69,
- 276, 69, 69, 69, 285, 286, 290, 69, 294, 297,
- 2164, 2164, 304, 69, 69, 279, 69, 278, 280, 281,
- 282, 288, 69, 283, 289, 293, 69, 69, 69, 292,
- 295, 285, 286, 290, 69, 294, 306, 69, 298, 300,
- 69, 69, 301, 69, 69, 303, 302, 307, 288, 305,
- 2164, 309, 293, 296, 69, 299, 292, 141, 311, 69,
-
- 69, 2164, 69, 69, 69, 298, 300, 313, 69, 301,
- 308, 69, 303, 302, 307, 310, 305, 69, 309, 312,
- 296, 69, 299, 69, 314, 311, 315, 317, 69, 318,
- 320, 69, 319, 321, 313, 2164, 69, 308, 322, 325,
- 323, 69, 310, 324, 327, 69, 312, 328, 330, 69,
- 2164, 314, 69, 315, 317, 69, 318, 320, 69, 319,
- 321, 69, 69, 69, 326, 322, 329, 323, 331, 332,
- 324, 69, 334, 69, 328, 69, 69, 69, 69, 333,
- 69, 335, 338, 337, 2164, 69, 69, 336, 69, 339,
- 343, 326, 69, 329, 340, 331, 332, 2164, 69, 334,
-
- 342, 344, 345, 341, 2164, 69, 333, 69, 335, 338,
- 337, 69, 69, 364, 336, 69, 339, 69, 350, 351,
- 69, 340, 69, 346, 353, 69, 2164, 342, 344, 345,
- 341, 347, 348, 354, 349, 2164, 69, 352, 69, 358,
- 69, 69, 2164, 69, 359, 350, 351, 360, 69, 370,
- 346, 353, 355, 356, 69, 361, 69, 362, 347, 348,
- 354, 349, 366, 69, 352, 363, 358, 69, 365, 367,
- 369, 359, 368, 372, 360, 69, 370, 69, 374, 355,
- 356, 69, 361, 69, 362, 69, 371, 375, 69, 366,
- 69, 526, 363, 373, 69, 365, 367, 369, 69, 368,
-
- 69, 376, 378, 380, 379, 69, 385, 377, 2164, 69,
- 69, 2164, 389, 371, 375, 386, 69, 384, 69, 69,
- 373, 2164, 381, 69, 390, 382, 69, 383, 376, 378,
- 380, 379, 387, 69, 377, 69, 69, 69, 69, 389,
- 388, 392, 386, 391, 384, 394, 69, 410, 402, 381,
- 404, 390, 382, 403, 383, 405, 69, 393, 69, 387,
- 69, 408, 2164, 406, 452, 69, 407, 388, 392, 141,
- 391, 69, 394, 69, 69, 402, 409, 411, 69, 69,
- 403, 69, 69, 69, 393, 395, 396, 412, 408, 413,
- 406, 452, 2164, 407, 69, 397, 69, 398, 399, 400,
-
- 2164, 415, 401, 409, 411, 414, 416, 417, 418, 421,
- 69, 2164, 395, 396, 412, 69, 413, 69, 69, 419,
- 423, 424, 397, 69, 398, 399, 400, 420, 415, 401,
- 427, 69, 414, 416, 69, 418, 422, 69, 69, 69,
- 69, 69, 428, 69, 425, 426, 419, 423, 424, 429,
- 431, 430, 2164, 69, 420, 2164, 432, 427, 435, 433,
- 69, 2164, 441, 422, 69, 2164, 2164, 69, 436, 428,
- 440, 444, 443, 69, 434, 69, 429, 431, 430, 69,
- 437, 69, 69, 432, 69, 435, 433, 442, 69, 441,
- 69, 438, 446, 439, 445, 436, 450, 440, 69, 443,
-
- 69, 434, 447, 69, 448, 449, 451, 437, 453, 454,
- 69, 2164, 69, 69, 442, 455, 476, 457, 438, 446,
- 439, 445, 69, 450, 456, 69, 69, 458, 69, 447,
- 69, 448, 449, 451, 69, 453, 461, 459, 69, 69,
- 460, 69, 455, 462, 457, 69, 463, 464, 69, 465,
- 2164, 456, 69, 69, 458, 69, 466, 2164, 468, 69,
- 467, 469, 2164, 461, 459, 470, 69, 460, 69, 69,
- 462, 471, 69, 463, 464, 69, 465, 69, 507, 69,
- 480, 475, 69, 466, 477, 468, 69, 467, 469, 474,
- 478, 472, 470, 473, 69, 481, 69, 479, 471, 69,
-
- 69, 482, 69, 483, 69, 507, 485, 480, 475, 486,
- 69, 477, 69, 523, 489, 488, 474, 478, 472, 69,
- 473, 69, 69, 491, 479, 69, 484, 69, 482, 487,
- 2164, 69, 490, 485, 69, 69, 486, 69, 492, 493,
- 523, 489, 488, 501, 69, 69, 502, 69, 500, 69,
- 491, 69, 503, 484, 505, 69, 487, 69, 2164, 490,
- 509, 506, 504, 2164, 510, 492, 493, 494, 69, 508,
- 501, 69, 495, 502, 496, 500, 69, 2164, 69, 2164,
- 511, 505, 497, 521, 69, 498, 69, 509, 506, 504,
- 512, 510, 499, 69, 494, 69, 508, 513, 514, 495,
-
- 515, 496, 69, 69, 518, 69, 517, 511, 516, 497,
- 525, 519, 498, 520, 69, 69, 69, 512, 527, 499,
- 524, 529, 69, 2164, 513, 514, 69, 515, 522, 69,
- 528, 518, 69, 517, 69, 516, 141, 525, 519, 530,
- 520, 531, 533, 69, 532, 69, 534, 524, 535, 537,
- 69, 536, 541, 69, 69, 522, 69, 528, 538, 69,
- 69, 542, 544, 539, 69, 69, 530, 540, 531, 533,
- 69, 532, 543, 534, 545, 535, 537, 546, 536, 69,
- 547, 69, 2164, 548, 549, 551, 69, 550, 69, 69,
- 69, 552, 69, 553, 540, 557, 2164, 555, 2164, 558,
-
- 2164, 69, 559, 2164, 69, 69, 69, 547, 69, 69,
- 548, 549, 551, 554, 550, 69, 69, 564, 556, 69,
- 553, 69, 69, 69, 555, 69, 558, 69, 560, 559,
- 563, 566, 565, 561, 567, 568, 569, 562, 2164, 69,
- 554, 69, 571, 69, 564, 556, 2164, 570, 69, 572,
- 2164, 574, 69, 69, 582, 560, 69, 563, 566, 565,
- 561, 567, 568, 575, 562, 69, 69, 2164, 69, 571,
- 576, 573, 69, 69, 570, 577, 572, 578, 574, 581,
- 580, 69, 579, 2164, 583, 69, 69, 587, 584, 69,
- 575, 69, 585, 589, 69, 586, 69, 576, 573, 69,
-
- 69, 590, 577, 592, 578, 69, 581, 580, 588, 579,
- 591, 583, 69, 2164, 587, 584, 69, 69, 593, 585,
- 596, 69, 586, 69, 594, 69, 598, 69, 590, 595,
- 592, 2164, 597, 599, 69, 588, 600, 601, 603, 2164,
- 69, 69, 69, 605, 604, 593, 69, 596, 606, 2164,
- 607, 2164, 602, 69, 69, 608, 69, 69, 69, 597,
- 599, 69, 609, 600, 601, 603, 69, 611, 617, 2164,
- 610, 604, 612, 616, 613, 69, 69, 607, 69, 602,
- 614, 69, 608, 69, 615, 2164, 69, 69, 69, 609,
- 618, 69, 69, 621, 611, 617, 69, 610, 620, 612,
-
- 616, 613, 69, 619, 622, 69, 69, 614, 623, 2164,
- 624, 615, 69, 625, 2164, 626, 69, 618, 69, 628,
- 621, 629, 2164, 630, 632, 620, 2164, 627, 2164, 2164,
- 619, 69, 69, 631, 633, 623, 69, 624, 69, 69,
- 625, 69, 626, 69, 69, 634, 628, 69, 629, 635,
- 630, 632, 636, 637, 627, 638, 69, 640, 645, 639,
- 631, 633, 69, 641, 69, 69, 642, 643, 650, 644,
- 69, 69, 634, 2164, 69, 69, 635, 69, 2164, 636,
- 637, 69, 638, 648, 640, 645, 639, 646, 141, 649,
- 641, 69, 69, 642, 643, 647, 644, 69, 651, 655,
-
- 69, 69, 653, 652, 2164, 69, 654, 2164, 656, 657,
- 648, 665, 672, 69, 646, 69, 649, 69, 69, 658,
- 668, 69, 647, 69, 666, 651, 69, 69, 670, 653,
- 652, 69, 659, 654, 69, 656, 657, 2164, 665, 69,
- 2164, 69, 669, 667, 69, 671, 658, 668, 2164, 707,
- 2164, 666, 681, 680, 69, 670, 685, 682, 69, 659,
- 660, 69, 684, 2164, 661, 69, 69, 662, 686, 669,
- 667, 69, 671, 687, 663, 69, 683, 664, 69, 681,
- 680, 69, 69, 69, 682, 688, 69, 660, 69, 684,
- 691, 661, 689, 690, 662, 686, 2164, 69, 694, 69,
-
- 687, 663, 692, 683, 664, 673, 674, 2164, 675, 693,
- 2164, 676, 688, 69, 69, 69, 677, 691, 69, 689,
- 690, 696, 678, 679, 69, 694, 699, 698, 69, 692,
- 700, 69, 673, 674, 69, 675, 693, 695, 676, 697,
- 704, 708, 69, 677, 703, 69, 69, 69, 696, 678,
- 679, 702, 69, 699, 698, 701, 705, 700, 706, 69,
- 69, 720, 69, 709, 695, 710, 697, 704, 69, 711,
- 712, 703, 713, 69, 715, 717, 714, 718, 702, 2164,
- 69, 69, 701, 69, 2164, 706, 69, 69, 69, 69,
- 709, 719, 710, 69, 69, 69, 711, 712, 69, 713,
-
- 716, 715, 69, 714, 718, 721, 722, 723, 69, 725,
- 69, 724, 729, 69, 727, 726, 730, 728, 719, 69,
- 734, 733, 2164, 2164, 69, 69, 2164, 716, 69, 69,
- 69, 69, 721, 722, 723, 69, 725, 731, 724, 729,
- 69, 727, 726, 730, 728, 732, 69, 69, 733, 735,
- 737, 736, 738, 739, 743, 69, 69, 741, 69, 69,
- 740, 69, 742, 69, 731, 745, 744, 69, 749, 747,
- 748, 746, 732, 69, 69, 69, 735, 737, 736, 738,
- 739, 743, 69, 69, 741, 69, 69, 740, 752, 742,
- 751, 69, 745, 744, 750, 69, 747, 748, 746, 753,
-
- 754, 69, 755, 69, 2164, 759, 758, 756, 761, 760,
- 69, 69, 764, 765, 762, 757, 763, 751, 2164, 767,
- 69, 750, 69, 69, 769, 69, 69, 754, 69, 755,
- 766, 69, 759, 758, 756, 69, 760, 69, 69, 764,
- 69, 762, 757, 763, 768, 69, 69, 770, 772, 771,
- 774, 141, 773, 69, 775, 69, 69, 766, 776, 69,
- 784, 69, 2164, 69, 69, 791, 785, 2164, 2164, 783,
- 792, 768, 69, 2164, 770, 772, 771, 774, 69, 773,
- 786, 775, 69, 69, 789, 776, 777, 784, 778, 787,
- 788, 2164, 779, 785, 780, 69, 783, 69, 2164, 781,
-
- 794, 790, 69, 798, 782, 793, 69, 786, 795, 799,
- 69, 789, 69, 777, 69, 778, 787, 788, 69, 779,
- 69, 780, 69, 69, 796, 69, 781, 794, 790, 801,
- 798, 782, 793, 800, 797, 795, 799, 802, 803, 69,
- 804, 812, 69, 2164, 2164, 2164, 69, 811, 821, 2164,
- 816, 796, 813, 2164, 814, 2164, 801, 815, 69, 823,
- 800, 797, 69, 69, 802, 69, 817, 69, 812, 69,
- 69, 806, 69, 818, 811, 69, 807, 816, 808, 813,
- 819, 814, 820, 69, 815, 69, 69, 822, 69, 809,
- 69, 69, 826, 817, 824, 827, 810, 69, 806, 2164,
-
- 818, 2164, 828, 807, 825, 808, 69, 819, 830, 820,
- 69, 832, 69, 841, 822, 831, 809, 829, 69, 826,
- 2164, 824, 69, 810, 69, 69, 69, 69, 833, 828,
- 835, 825, 834, 69, 836, 830, 837, 2164, 832, 2164,
- 69, 69, 831, 838, 829, 69, 69, 839, 840, 69,
- 69, 842, 69, 850, 843, 833, 845, 835, 844, 834,
- 846, 836, 69, 837, 69, 69, 69, 69, 69, 847,
- 838, 848, 849, 851, 839, 840, 862, 853, 842, 69,
- 850, 843, 69, 845, 854, 844, 852, 846, 69, 855,
- 69, 69, 856, 69, 2164, 857, 847, 858, 848, 849,
-
- 69, 859, 860, 861, 853, 69, 865, 864, 69, 69,
- 863, 871, 69, 852, 69, 69, 69, 69, 69, 856,
- 866, 69, 857, 868, 858, 867, 869, 2164, 859, 860,
- 861, 69, 69, 865, 864, 872, 69, 863, 871, 870,
- 873, 874, 69, 882, 2164, 69, 69, 866, 69, 876,
- 868, 875, 867, 869, 69, 877, 878, 880, 69, 881,
- 2164, 69, 872, 879, 69, 69, 870, 873, 69, 69,
- 883, 69, 884, 69, 886, 69, 876, 887, 875, 69,
- 885, 888, 877, 878, 880, 889, 881, 890, 891, 69,
- 879, 892, 69, 69, 69, 893, 69, 883, 69, 884,
-
- 69, 886, 894, 895, 887, 896, 899, 885, 888, 901,
- 69, 69, 898, 69, 903, 891, 69, 69, 892, 69,
- 69, 69, 69, 900, 69, 904, 902, 69, 905, 894,
- 895, 69, 896, 899, 69, 69, 901, 69, 906, 898,
- 907, 903, 908, 2164, 2164, 2164, 909, 911, 912, 2164,
- 900, 2164, 904, 902, 910, 905, 913, 919, 915, 916,
- 69, 69, 2164, 2164, 69, 914, 69, 927, 917, 908,
- 69, 69, 69, 909, 911, 912, 69, 69, 69, 69,
- 69, 910, 918, 913, 69, 915, 916, 920, 921, 922,
- 69, 923, 914, 69, 927, 917, 932, 69, 69, 928,
-
- 69, 2164, 929, 931, 935, 69, 924, 933, 2164, 918,
- 69, 930, 69, 934, 920, 921, 922, 925, 923, 936,
- 926, 69, 69, 932, 69, 69, 928, 69, 69, 929,
- 931, 935, 938, 924, 933, 69, 940, 937, 930, 939,
- 934, 69, 942, 941, 925, 69, 936, 926, 943, 946,
- 69, 944, 945, 2164, 69, 69, 948, 69, 954, 69,
- 69, 949, 69, 940, 937, 69, 939, 69, 947, 942,
- 941, 69, 950, 951, 69, 943, 946, 2164, 944, 945,
- 69, 955, 69, 948, 69, 952, 953, 956, 949, 957,
- 69, 968, 69, 958, 69, 947, 69, 962, 960, 950,
-
- 951, 965, 959, 961, 69, 69, 69, 964, 955, 963,
- 2164, 966, 952, 953, 956, 69, 957, 69, 969, 967,
- 958, 69, 69, 69, 962, 69, 970, 69, 965, 959,
- 69, 971, 972, 973, 964, 974, 963, 69, 966, 976,
- 975, 977, 979, 978, 69, 969, 967, 69, 69, 69,
- 980, 69, 981, 970, 69, 69, 69, 69, 971, 972,
- 973, 69, 974, 69, 982, 983, 976, 975, 977, 979,
- 978, 2164, 992, 2164, 991, 2164, 995, 2164, 996, 989,
- 994, 2164, 69, 997, 69, 993, 69, 2164, 69, 69,
- 69, 982, 983, 984, 69, 69, 998, 69, 985, 992,
-
- 986, 991, 987, 995, 988, 69, 989, 994, 999, 69,
- 69, 69, 993, 1000, 1001, 1002, 1004, 1003, 2164, 1008,
- 984, 69, 1006, 998, 69, 985, 69, 986, 69, 987,
- 69, 988, 1007, 69, 69, 999, 1005, 1010, 1009, 1012,
- 1000, 1001, 1002, 1004, 1003, 69, 69, 1011, 1013, 1006,
- 69, 1014, 1016, 1015, 69, 1017, 69, 1019, 2164, 1007,
- 69, 69, 1018, 1005, 69, 1009, 1012, 1022, 69, 1020,
- 1021, 69, 1024, 1023, 1011, 1013, 69, 69, 69, 69,
- 1015, 1025, 1017, 1026, 69, 1027, 69, 1028, 1029, 1018,
- 69, 1030, 69, 1032, 1022, 69, 1020, 1021, 69, 1024,
-
- 1023, 69, 1031, 1033, 69, 69, 1035, 1034, 1025, 1036,
- 1026, 1037, 1027, 1039, 1028, 69, 1040, 69, 69, 1038,
- 69, 69, 69, 69, 69, 69, 69, 1044, 1043, 1031,
- 1033, 1041, 1045, 1035, 1034, 69, 69, 1042, 1037, 1047,
- 1039, 1046, 69, 1050, 69, 69, 1038, 1051, 69, 1048,
- 69, 1049, 69, 69, 1044, 1043, 69, 1052, 1041, 1045,
- 1054, 2164, 1058, 1053, 1042, 69, 1047, 69, 1046, 69,
- 1050, 1055, 1056, 1059, 1051, 1060, 1048, 1057, 1049, 69,
- 69, 1063, 69, 1061, 69, 1066, 1062, 1054, 69, 1058,
- 1053, 1064, 69, 1065, 2164, 69, 1067, 1069, 1055, 1068,
-
- 1059, 1077, 1060, 69, 69, 69, 69, 1072, 1063, 69,
- 1061, 1070, 69, 1062, 1075, 69, 69, 69, 1064, 69,
- 1065, 1071, 1073, 1067, 1069, 1074, 1068, 1076, 1077, 69,
- 69, 69, 69, 1079, 1072, 1078, 69, 69, 1070, 1080,
- 2164, 1075, 1083, 1081, 2164, 1082, 69, 1084, 1071, 1073,
- 69, 69, 1074, 69, 1076, 69, 1085, 1087, 1090, 1086,
- 1079, 1088, 1078, 1093, 69, 1089, 1080, 69, 69, 1083,
- 1081, 1092, 1082, 1094, 1084, 69, 1091, 69, 69, 69,
- 1095, 1097, 69, 1085, 1087, 1090, 1086, 69, 1088, 1096,
- 1098, 1099, 1089, 69, 1103, 69, 2164, 1101, 1092, 1102,
-
- 2164, 1100, 69, 1091, 1108, 69, 69, 1095, 69, 69,
- 69, 69, 69, 69, 1112, 69, 1096, 1098, 1099, 69,
- 1104, 1103, 1106, 1115, 1101, 1105, 1102, 1107, 1100, 1109,
- 1110, 1108, 1111, 1113, 69, 1114, 1116, 69, 69, 1117,
- 69, 2164, 2164, 69, 69, 1118, 69, 69, 1124, 1125,
- 1115, 1121, 69, 69, 69, 1119, 1109, 1110, 1123, 1111,
- 1113, 1120, 1114, 69, 69, 1122, 1117, 2164, 69, 69,
- 69, 69, 1118, 69, 69, 1124, 1125, 1127, 1121, 1126,
- 1128, 1130, 1119, 1131, 1132, 1123, 1129, 1138, 1120, 1144,
- 1136, 2164, 1122, 1139, 69, 69, 2164, 69, 69, 1133,
-
- 2164, 69, 69, 1134, 69, 1140, 1126, 1128, 1130, 69,
- 1131, 1132, 1137, 1129, 69, 69, 1135, 1136, 1141, 1145,
- 1139, 69, 1142, 69, 69, 69, 1133, 1143, 69, 1146,
- 1134, 69, 1140, 1147, 69, 1148, 1149, 1150, 69, 1137,
- 1151, 2164, 1152, 1135, 2164, 1141, 69, 1153, 1158, 1142,
- 1154, 1155, 1157, 69, 1143, 69, 1146, 1156, 2164, 69,
- 1147, 69, 1148, 69, 69, 69, 1160, 69, 69, 1152,
- 69, 69, 1161, 1159, 1153, 1158, 69, 1154, 1155, 1157,
- 1162, 2164, 1163, 1164, 1156, 69, 1165, 69, 69, 1166,
- 1167, 1169, 1168, 69, 1170, 69, 1172, 2164, 69, 1161,
-
- 1159, 2164, 69, 69, 1173, 1181, 2164, 1162, 69, 1163,
- 1164, 1171, 69, 1165, 69, 1176, 1166, 1167, 69, 1168,
- 1174, 1170, 69, 1172, 69, 1175, 69, 69, 1177, 1178,
- 2164, 1173, 69, 69, 1179, 1180, 69, 69, 1171, 1182,
- 1183, 1184, 1176, 1185, 2164, 2164, 69, 1174, 1187, 1191,
- 69, 1189, 1175, 1190, 69, 1177, 1178, 69, 69, 69,
- 1193, 1179, 1180, 1186, 1188, 1199, 1182, 69, 1184, 69,
- 69, 69, 69, 1192, 1194, 1187, 1191, 69, 1189, 69,
- 1190, 1195, 1200, 1196, 69, 69, 1197, 1193, 69, 69,
- 1186, 1188, 1202, 1201, 1203, 1205, 69, 69, 1198, 1204,
-
- 1192, 1194, 1206, 1207, 69, 1210, 1212, 69, 1195, 1200,
- 1196, 69, 69, 1197, 69, 1209, 1208, 1211, 1214, 1202,
- 1201, 1203, 69, 69, 69, 1198, 1204, 69, 69, 1206,
- 1207, 1213, 1215, 1216, 2164, 69, 1220, 69, 69, 69,
- 69, 1217, 1209, 1208, 1211, 1214, 1218, 1219, 1221, 69,
- 69, 1222, 1224, 69, 69, 69, 1223, 2164, 1213, 69,
- 1216, 69, 1225, 1220, 1226, 1229, 69, 1227, 1217, 69,
- 69, 69, 1230, 1218, 1219, 1221, 1228, 1233, 1222, 69,
- 69, 1232, 69, 1223, 69, 1231, 1239, 1234, 69, 1225,
- 1235, 1226, 69, 69, 1227, 1236, 2164, 69, 1240, 1230,
-
- 1241, 1243, 1242, 1228, 1233, 69, 69, 69, 1232, 69,
- 1244, 1237, 1231, 1239, 1234, 1246, 1238, 1235, 1248, 1245,
- 1252, 1249, 1236, 69, 1251, 69, 69, 69, 1243, 1242,
- 69, 1247, 69, 69, 1250, 1254, 69, 1244, 1237, 69,
- 1256, 1255, 1246, 1238, 1253, 1248, 1245, 69, 1249, 69,
- 69, 69, 69, 69, 1257, 1258, 69, 1259, 1247, 69,
- 1260, 1250, 1254, 1261, 1262, 69, 1264, 1256, 1255, 69,
- 69, 1253, 1265, 1270, 1263, 69, 1267, 1272, 1271, 1268,
- 1274, 1257, 1258, 1276, 1259, 1279, 1266, 1260, 69, 69,
- 1261, 1262, 69, 1264, 69, 1269, 1275, 2164, 69, 1265,
-
- 1277, 1263, 1273, 1267, 69, 69, 1268, 1278, 1283, 69,
- 1280, 69, 69, 1266, 69, 69, 69, 69, 69, 1281,
- 1284, 69, 1269, 1275, 69, 1282, 1285, 1277, 1287, 1273,
- 1288, 1289, 1286, 1291, 1278, 1283, 69, 1280, 1293, 69,
- 69, 69, 69, 69, 1292, 1290, 1281, 1284, 1294, 1297,
- 1300, 69, 1282, 1285, 69, 1287, 1295, 1296, 1289, 1286,
- 69, 69, 69, 1311, 1298, 1293, 1307, 69, 69, 1299,
- 69, 1292, 1290, 1301, 1302, 1294, 1297, 69, 69, 69,
- 1303, 69, 1304, 1295, 1296, 1305, 69, 1308, 1313, 1310,
- 69, 1298, 1306, 69, 69, 69, 1299, 69, 69, 69,
-
- 1301, 1302, 69, 1312, 1309, 1315, 1314, 1303, 1316, 1304,
- 69, 1317, 1305, 69, 1308, 69, 1310, 1318, 1319, 1306,
- 2164, 1323, 1324, 69, 1320, 69, 69, 69, 69, 69,
- 1312, 1309, 1315, 1314, 1321, 69, 1322, 69, 1317, 69,
- 1325, 2164, 69, 69, 1318, 1319, 1326, 1327, 1323, 1324,
- 1329, 1320, 69, 1331, 1330, 1335, 1332, 69, 69, 1336,
- 1328, 1321, 69, 1322, 1333, 69, 69, 1325, 69, 1337,
- 69, 1334, 1338, 1326, 1327, 1340, 69, 1329, 1339, 69,
- 69, 1330, 1335, 1341, 69, 1342, 69, 1328, 69, 1343,
- 1344, 1333, 1345, 1346, 1348, 2164, 1337, 1349, 1334, 69,
-
- 1350, 69, 69, 1351, 2164, 1339, 69, 1347, 2164, 69,
- 1341, 1358, 2164, 69, 2164, 1360, 1343, 69, 69, 1345,
- 1361, 1348, 69, 1364, 69, 69, 69, 1350, 1362, 1352,
- 1353, 1354, 1356, 1357, 1347, 69, 1355, 1370, 1359, 69,
- 69, 69, 1363, 69, 69, 69, 1366, 69, 69, 1369,
- 69, 1365, 69, 1371, 1367, 1362, 1352, 1353, 1354, 1356,
- 1357, 69, 1368, 1355, 69, 1359, 1373, 69, 1372, 1363,
- 1374, 69, 69, 1366, 69, 69, 1369, 1378, 1365, 1375,
- 1371, 1367, 69, 1376, 1377, 69, 1379, 69, 1382, 1368,
- 1381, 1380, 1385, 69, 1384, 1372, 1386, 1374, 1383, 69,
-
- 1387, 69, 69, 69, 1378, 69, 1375, 1388, 1389, 1390,
- 1376, 1377, 69, 1379, 69, 1391, 69, 1381, 1380, 1393,
- 69, 1384, 1392, 69, 69, 1383, 69, 69, 69, 69,
- 1394, 1395, 69, 1396, 1388, 1389, 1390, 69, 1397, 69,
- 1398, 1401, 1391, 69, 1400, 1404, 1393, 1402, 1406, 1392,
- 69, 1405, 69, 69, 1403, 69, 1399, 1394, 1395, 69,
- 1396, 1409, 1413, 69, 1410, 1397, 69, 1398, 1401, 69,
- 69, 1400, 1404, 1411, 1402, 69, 1414, 69, 1405, 1407,
- 1412, 1403, 1417, 1399, 1408, 1415, 69, 69, 69, 1419,
- 1416, 1410, 1418, 69, 69, 69, 1420, 1421, 1422, 1424,
-
- 1411, 69, 1425, 69, 69, 1423, 1407, 1412, 1426, 1427,
- 1430, 1408, 69, 69, 69, 1428, 1419, 69, 1431, 1418,
- 69, 69, 1429, 1432, 1421, 1422, 1424, 1434, 69, 1436,
- 69, 1433, 1423, 1435, 69, 1426, 69, 1430, 69, 1438,
- 1437, 69, 1428, 1439, 1440, 69, 69, 1441, 1442, 1429,
- 69, 69, 2164, 1444, 69, 1445, 1436, 69, 1433, 69,
- 1435, 69, 69, 69, 1443, 69, 1438, 1437, 69, 1447,
- 1439, 1440, 1446, 69, 1441, 1442, 1448, 1449, 1450, 69,
- 69, 1451, 1445, 69, 1452, 1454, 1456, 69, 1453, 69,
- 2164, 1443, 1458, 1455, 69, 69, 69, 1457, 1459, 1446,
-
- 1460, 69, 1461, 1448, 1449, 1450, 69, 69, 1451, 1464,
- 69, 1452, 69, 1456, 1463, 1453, 69, 69, 69, 1458,
- 1455, 1462, 69, 1465, 1457, 1459, 69, 1460, 2164, 69,
- 1466, 1468, 69, 1467, 1469, 1470, 1464, 1472, 2164, 1473,
- 69, 1463, 2164, 1471, 69, 1475, 1479, 69, 1462, 1474,
- 2164, 69, 1486, 1476, 69, 69, 69, 1466, 1468, 69,
- 1467, 69, 1470, 69, 1472, 69, 1473, 69, 69, 1477,
- 1471, 1478, 1475, 1479, 1483, 1480, 1474, 69, 1481, 1486,
- 1476, 69, 1484, 1487, 69, 1485, 69, 69, 2164, 69,
- 1490, 1482, 69, 1488, 1489, 2164, 1477, 1491, 1478, 69,
-
- 1492, 1483, 1480, 1493, 1496, 1481, 1495, 69, 69, 1484,
- 1487, 2164, 1485, 69, 69, 69, 1497, 1490, 1482, 1498,
- 1488, 1489, 69, 1499, 1491, 1494, 69, 1492, 69, 69,
- 69, 1496, 69, 1495, 1501, 1500, 1502, 1503, 69, 2164,
- 1504, 69, 69, 1497, 1506, 1505, 1498, 1507, 1511, 1508,
- 1499, 69, 1494, 69, 1510, 1512, 1509, 69, 69, 69,
- 1513, 69, 1500, 1502, 1503, 1515, 69, 1504, 69, 1514,
- 1519, 1506, 1505, 1516, 69, 69, 1508, 69, 1521, 1524,
- 69, 1510, 1512, 1509, 69, 69, 1517, 1513, 1520, 1518,
- 1522, 69, 1515, 2164, 69, 69, 1514, 1519, 1525, 69,
-
- 1516, 69, 1527, 1523, 69, 69, 1524, 1526, 69, 69,
- 1528, 1529, 1530, 1517, 1531, 1520, 1518, 1522, 69, 69,
- 69, 69, 69, 1535, 1532, 1525, 1533, 1534, 69, 1527,
- 1523, 1536, 1537, 69, 1526, 69, 69, 1528, 1529, 1530,
- 1538, 1531, 1539, 1541, 1540, 69, 1546, 1542, 69, 69,
- 69, 1532, 1543, 1533, 1534, 1544, 1545, 69, 1536, 69,
- 2164, 1547, 1549, 69, 1550, 69, 69, 1538, 1551, 1539,
- 1541, 1540, 1553, 69, 69, 1548, 1554, 1552, 1555, 69,
- 69, 69, 1544, 1545, 1556, 1557, 1558, 69, 1547, 1549,
- 1559, 69, 69, 1561, 69, 1551, 1560, 69, 69, 1553,
-
- 69, 1567, 1548, 1564, 1552, 1555, 1562, 69, 69, 69,
- 69, 69, 1557, 1558, 1563, 69, 1568, 1559, 1565, 1569,
- 1561, 1566, 1570, 1560, 2164, 69, 69, 69, 69, 1572,
- 1564, 69, 69, 1562, 1571, 69, 1574, 69, 1578, 69,
- 69, 1563, 1573, 1568, 69, 1565, 1569, 1576, 1566, 1570,
- 69, 1575, 1577, 69, 69, 69, 1572, 1581, 69, 1580,
- 1579, 1571, 1583, 1574, 1582, 1578, 69, 1584, 1585, 1573,
- 1586, 69, 1587, 1588, 1576, 1591, 69, 2164, 1575, 1577,
- 69, 1589, 69, 1594, 69, 1595, 1580, 1579, 69, 1583,
- 1590, 1582, 1596, 69, 1584, 1585, 69, 1586, 1598, 69,
-
- 69, 69, 1591, 1592, 69, 1597, 1593, 1599, 1589, 1600,
- 69, 1601, 69, 69, 1602, 1603, 69, 1590, 1604, 69,
- 1605, 69, 1607, 69, 1610, 69, 1608, 69, 1611, 1606,
- 1592, 1609, 1597, 1593, 1599, 69, 69, 69, 69, 1613,
- 69, 1602, 1603, 1612, 1617, 1604, 1621, 69, 69, 69,
- 1615, 1610, 69, 1608, 69, 1611, 1606, 1614, 1609, 1616,
- 1619, 1618, 69, 1620, 69, 69, 69, 69, 69, 69,
- 1612, 69, 1622, 1621, 1623, 69, 1624, 1615, 1625, 1629,
- 1626, 1631, 69, 1628, 1614, 69, 1616, 1619, 1618, 1630,
- 1620, 1627, 69, 1632, 2164, 1642, 69, 69, 1634, 69,
-
- 69, 1623, 1633, 69, 69, 1625, 1629, 1626, 1631, 69,
- 1628, 1635, 69, 1636, 69, 69, 1630, 69, 1627, 1637,
- 1632, 1638, 1643, 1641, 1639, 1634, 1640, 69, 1646, 1633,
- 1644, 1647, 1655, 69, 1645, 69, 69, 69, 1635, 1648,
- 1636, 69, 69, 69, 69, 69, 1637, 1649, 1638, 1643,
- 1641, 1639, 69, 1640, 69, 1646, 1652, 1644, 1653, 1655,
- 1650, 1645, 1651, 69, 1654, 69, 1648, 69, 69, 1656,
- 1657, 1658, 1661, 1659, 1649, 1660, 69, 1662, 1664, 69,
- 69, 1663, 1665, 1652, 69, 1653, 1667, 1650, 1666, 1651,
- 69, 1654, 1668, 69, 69, 1671, 1656, 1657, 1658, 69,
-
- 1659, 69, 1660, 69, 69, 1669, 1670, 69, 1663, 69,
- 69, 1672, 69, 1667, 69, 1666, 1673, 1674, 69, 1668,
- 1675, 69, 1671, 1676, 1677, 1679, 1678, 1681, 1680, 1682,
- 69, 69, 1669, 1670, 69, 69, 1683, 1684, 1672, 69,
- 69, 1687, 69, 1673, 69, 1685, 69, 1675, 69, 69,
- 1676, 1677, 1679, 1678, 1681, 1680, 69, 69, 1686, 1688,
- 2164, 69, 1689, 1683, 1684, 1691, 1690, 2164, 1693, 69,
- 1692, 1695, 1685, 69, 1694, 1696, 2164, 1697, 69, 69,
- 69, 1698, 1699, 1700, 69, 1686, 1688, 69, 1701, 1689,
- 1702, 69, 1691, 1690, 69, 1693, 1703, 1692, 69, 69,
-
- 69, 1694, 1696, 69, 1697, 1705, 1704, 69, 1698, 69,
- 69, 69, 1708, 1706, 1707, 1710, 69, 1702, 1709, 1711,
- 69, 69, 1712, 1703, 1713, 2164, 1714, 69, 69, 69,
- 1715, 1717, 1705, 1704, 69, 1718, 69, 1716, 1720, 69,
- 1706, 1707, 1719, 1721, 1722, 1709, 1711, 69, 69, 1712,
- 1723, 69, 69, 1714, 1725, 69, 69, 69, 1717, 69,
- 69, 1724, 1718, 69, 1716, 1720, 1726, 1727, 1728, 1719,
- 69, 69, 1729, 1731, 1730, 1732, 69, 69, 2164, 1733,
- 69, 1725, 69, 69, 1734, 69, 1739, 69, 1724, 1736,
- 1747, 1735, 69, 1726, 1727, 1728, 69, 69, 69, 1729,
-
- 1731, 1730, 69, 69, 1737, 1740, 1733, 69, 1738, 1742,
- 1741, 1734, 69, 1739, 69, 1744, 1736, 69, 1735, 69,
- 1743, 69, 1745, 69, 69, 1748, 1746, 2164, 1749, 1750,
- 1751, 1737, 1740, 1752, 1753, 1738, 1742, 1741, 69, 69,
- 69, 1756, 1744, 69, 69, 1754, 69, 1743, 69, 1745,
- 69, 1755, 69, 1746, 69, 1749, 1750, 1751, 69, 69,
- 1752, 1753, 1757, 1760, 1758, 2164, 1759, 1761, 1756, 69,
- 1762, 1764, 1754, 69, 1768, 1763, 1769, 1765, 1755, 69,
- 1770, 1771, 69, 69, 1775, 69, 69, 1766, 1767, 1757,
- 69, 1758, 69, 1759, 1761, 69, 69, 1762, 1764, 69,
-
- 1772, 1768, 1763, 69, 1765, 1773, 69, 69, 1774, 69,
- 1780, 1775, 1776, 69, 1766, 1767, 69, 69, 1777, 69,
- 1778, 1779, 1781, 1782, 1785, 69, 1783, 1772, 69, 69,
- 1784, 69, 1773, 69, 1787, 1774, 1788, 1780, 1792, 1776,
- 1786, 1789, 69, 69, 1790, 1777, 69, 1778, 1779, 1781,
- 1782, 69, 69, 1783, 69, 1791, 69, 1784, 1793, 1794,
- 1795, 1787, 1796, 69, 69, 69, 1797, 1786, 1789, 1798,
- 69, 1790, 69, 1799, 2164, 1800, 1801, 1803, 69, 2164,
- 1802, 69, 1791, 1804, 1805, 1793, 69, 69, 1812, 1796,
- 1806, 69, 1809, 69, 69, 69, 1798, 1807, 69, 1810,
-
- 69, 69, 1800, 1801, 1803, 69, 69, 1802, 1808, 1813,
- 1804, 1805, 1814, 1811, 69, 69, 69, 1806, 1816, 1809,
- 69, 69, 1815, 2164, 1807, 69, 1810, 1818, 1820, 1817,
- 1819, 1821, 69, 1822, 1826, 1808, 69, 1825, 1823, 1814,
- 1811, 2164, 69, 1824, 69, 1827, 1852, 69, 1831, 1815,
- 69, 69, 1828, 69, 1818, 69, 1817, 1819, 69, 69,
- 1822, 1830, 1829, 1832, 1825, 1835, 69, 69, 69, 1833,
- 69, 1834, 1827, 69, 69, 1831, 1838, 1836, 69, 1828,
- 69, 1839, 1841, 1837, 69, 69, 69, 69, 1830, 1829,
- 1832, 1840, 1835, 1842, 69, 69, 1833, 69, 1834, 69,
-
- 69, 69, 1845, 1838, 1836, 1843, 1844, 1846, 1839, 1841,
- 1837, 1848, 69, 1847, 69, 69, 1849, 69, 1840, 1850,
- 1842, 1851, 1853, 69, 1856, 1855, 1854, 69, 1859, 69,
- 1861, 69, 1843, 1844, 1846, 1858, 1857, 1862, 1848, 2164,
- 1847, 69, 69, 69, 69, 69, 1850, 69, 1851, 69,
- 69, 1856, 1855, 1854, 1860, 1859, 69, 1861, 69, 1865,
- 1863, 1864, 1858, 1857, 69, 1866, 69, 69, 69, 1867,
- 1868, 1869, 1870, 1871, 1873, 1874, 1872, 1880, 1875, 1876,
- 2164, 1860, 69, 1879, 1877, 69, 1865, 1863, 1864, 69,
- 1878, 2164, 69, 69, 69, 1882, 1867, 69, 69, 69,
-
- 1871, 69, 69, 1872, 69, 1875, 69, 1883, 1884, 69,
- 1879, 69, 1881, 1885, 69, 69, 1888, 1878, 69, 1889,
- 1886, 1887, 1882, 1891, 1890, 1892, 1894, 2164, 69, 69,
- 69, 69, 69, 1893, 1883, 1884, 69, 1896, 69, 1881,
- 1885, 69, 1897, 1888, 1898, 69, 1889, 1886, 1887, 1895,
- 1891, 1890, 69, 1894, 1899, 1900, 1903, 69, 1906, 1901,
- 1893, 1902, 69, 69, 1896, 69, 69, 1907, 69, 1897,
- 69, 1898, 1904, 1905, 69, 1908, 1895, 69, 1909, 69,
- 69, 1899, 1900, 1903, 69, 69, 1901, 1910, 1902, 1911,
- 1913, 69, 1912, 1915, 1907, 1914, 1916, 2164, 1917, 1904,
-
- 1905, 69, 1908, 1918, 2164, 69, 1921, 69, 69, 69,
- 1919, 69, 2164, 1920, 1910, 2164, 1911, 69, 69, 1912,
- 1915, 1922, 1914, 1916, 69, 1924, 1923, 69, 1925, 1927,
- 69, 69, 1926, 69, 1931, 1928, 1932, 1919, 1934, 69,
- 1920, 69, 1929, 1936, 1933, 1930, 69, 69, 1922, 1938,
- 69, 69, 1924, 1923, 69, 1925, 1927, 69, 69, 1926,
- 1935, 69, 1928, 1932, 1937, 1934, 1940, 1939, 69, 1929,
- 1941, 1933, 1930, 69, 1942, 69, 69, 1944, 1943, 69,
- 69, 1945, 69, 1946, 1947, 1948, 69, 1935, 69, 69,
- 1949, 1937, 1951, 1940, 1939, 69, 1950, 1941, 1954, 69,
-
- 1956, 1952, 1953, 69, 69, 1943, 69, 1958, 1945, 69,
- 1946, 69, 1948, 69, 69, 1955, 69, 1949, 1957, 1951,
- 69, 69, 1959, 1950, 1960, 1954, 69, 69, 1952, 1953,
- 1961, 1962, 1963, 1964, 69, 1965, 1966, 2164, 1967, 69,
- 69, 69, 1955, 1968, 69, 1957, 1970, 1969, 1971, 69,
- 1975, 69, 69, 69, 1980, 1976, 69, 1961, 1962, 69,
- 1964, 1972, 1965, 1966, 69, 1967, 1973, 2164, 1977, 69,
- 1968, 1974, 1978, 69, 1969, 69, 1979, 69, 69, 69,
- 1981, 69, 1976, 69, 1982, 2164, 69, 69, 1972, 1985,
- 1984, 1983, 1986, 1973, 69, 1977, 1989, 69, 1974, 1978,
-
- 69, 1990, 1991, 1979, 1987, 1988, 1992, 69, 69, 1994,
- 69, 1982, 69, 1993, 69, 1995, 1985, 1984, 1983, 1996,
- 1997, 1998, 69, 69, 69, 2000, 2003, 1999, 69, 1991,
- 2002, 1987, 1988, 69, 2001, 69, 1994, 69, 2004, 69,
- 1993, 2006, 1995, 2005, 2007, 2008, 69, 69, 69, 69,
- 69, 69, 69, 69, 1999, 2009, 69, 2002, 2010, 69,
- 2015, 2001, 2011, 2164, 2014, 2004, 2012, 69, 2006, 2013,
- 2005, 69, 2008, 69, 69, 69, 69, 2016, 2017, 2020,
- 2024, 2018, 2009, 2019, 69, 69, 69, 2015, 69, 2011,
- 69, 2014, 69, 2012, 2026, 2023, 2013, 69, 69, 2021,
-
- 2022, 69, 69, 2027, 2016, 2017, 2020, 2024, 2018, 69,
- 2019, 2025, 2028, 2029, 2030, 2031, 2164, 2033, 69, 2032,
- 2034, 69, 2023, 2035, 2036, 2037, 2021, 2022, 2040, 69,
- 69, 2039, 2038, 2041, 2042, 69, 69, 69, 2025, 2028,
- 69, 69, 69, 69, 69, 2043, 2032, 2034, 2044, 69,
- 2035, 69, 2037, 2045, 69, 2040, 2047, 69, 2039, 2038,
- 69, 69, 2046, 2048, 69, 2049, 2050, 2052, 69, 69,
- 69, 2051, 2043, 2053, 2054, 2044, 2055, 2056, 2057, 69,
- 69, 2058, 2059, 2047, 2060, 2062, 2065, 69, 69, 2046,
- 2048, 2164, 2049, 2050, 69, 2061, 69, 69, 2051, 2064,
-
- 69, 69, 2067, 69, 69, 2057, 2063, 69, 69, 2059,
- 69, 2060, 69, 2068, 2066, 69, 2069, 2070, 69, 2072,
- 2076, 69, 2061, 69, 69, 69, 2064, 69, 69, 2067,
- 2071, 2073, 2074, 2063, 2077, 2075, 69, 2164, 69, 69,
- 2068, 2066, 69, 2069, 2070, 69, 2072, 2076, 69, 2081,
- 2084, 69, 2078, 2082, 69, 2079, 2080, 2071, 2073, 2074,
- 69, 2077, 2075, 2083, 69, 69, 2085, 69, 2086, 2088,
- 69, 2087, 2089, 2164, 2092, 2093, 2081, 69, 2090, 2078,
- 2082, 2095, 2079, 2080, 69, 2091, 69, 69, 2099, 2094,
- 2083, 2096, 2100, 2085, 69, 69, 69, 69, 2087, 2089,
-
- 69, 2092, 69, 69, 2097, 2090, 2098, 69, 69, 2101,
- 2164, 2102, 2091, 69, 69, 2103, 2094, 2104, 2096, 2106,
- 69, 2107, 69, 69, 69, 69, 2105, 69, 2110, 2108,
- 69, 2097, 2109, 2098, 2164, 69, 2101, 2112, 2102, 2111,
- 69, 2113, 2103, 69, 2104, 69, 2106, 2114, 2107, 69,
- 69, 2119, 2164, 2105, 2115, 2110, 2108, 2116, 2117, 2109,
- 2120, 69, 2118, 2124, 2112, 2164, 2111, 2122, 69, 2123,
- 69, 2121, 2164, 69, 2114, 69, 69, 69, 2125, 69,
- 69, 2115, 2127, 69, 2116, 2117, 69, 69, 2126, 2118,
- 2131, 69, 2128, 2129, 2122, 69, 2123, 2130, 2121, 2132,
-
- 69, 69, 69, 2134, 69, 2125, 2133, 2164, 2135, 2127,
- 2136, 69, 2139, 2164, 69, 2126, 69, 2131, 2137, 2128,
- 2129, 69, 2140, 2138, 2130, 2164, 2132, 2141, 2142, 69,
- 2134, 69, 69, 2133, 69, 2135, 69, 2136, 69, 69,
- 2143, 2145, 69, 2144, 2146, 2137, 2149, 69, 2147, 2140,
- 2138, 69, 2148, 2150, 2141, 2142, 69, 2151, 2164, 2152,
- 69, 69, 69, 69, 2153, 69, 69, 2143, 2145, 2154,
- 2144, 2146, 69, 2149, 2155, 2147, 2156, 2157, 2158, 2148,
- 2150, 2162, 2164, 2163, 2151, 69, 2152, 2159, 2164, 69,
- 2160, 69, 2164, 2164, 2161, 2164, 2154, 69, 69, 2164,
-
- 69, 69, 69, 69, 2157, 2158, 2164, 2164, 69, 69,
- 69, 2164, 2164, 2164, 2159, 2164, 2164, 2160, 2164, 2164,
- 2164, 2161, 41, 41, 41, 41, 41, 41, 41, 46,
- 46, 46, 46, 46, 46, 46, 51, 51, 51, 51,
- 51, 51, 51, 57, 57, 57, 57, 57, 57, 57,
- 62, 62, 62, 62, 62, 62, 62, 72, 72, 2164,
- 72, 72, 72, 72, 131, 131, 2164, 2164, 2164, 131,
- 131, 133, 133, 2164, 2164, 133, 2164, 133, 135, 2164,
- 2164, 2164, 2164, 2164, 135, 138, 138, 2164, 2164, 2164,
- 138, 138, 140, 2164, 2164, 2164, 2164, 2164, 140, 142,
-
- 142, 2164, 142, 142, 142, 142, 73, 73, 2164, 73,
- 73, 73, 73, 13, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164
- } ;
-
-static yyconst flex_int16_t yy_chk[6281] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 3, 3, 3, 4,
- 4, 4, 5, 5, 6, 6, 5, 27, 6, 7,
- 7, 7, 7, 671, 7, 8, 8, 8, 8, 27,
- 8, 9, 9, 9, 10, 10, 10, 15, 45, 45,
-
- 2170, 15, 23, 3, 27, 50, 4, 769, 50, 5,
- 19, 6, 19, 19, 671, 19, 140, 7, 29, 61,
- 61, 19, 23, 8, 138, 23, 20, 20, 9, 23,
- 29, 10, 11, 11, 11, 11, 11, 11, 12, 12,
- 12, 12, 12, 12, 20, 29, 24, 137, 19, 23,
- 20, 25, 11, 20, 20, 21, 75, 32, 12, 25,
- 24, 70, 21, 32, 853, 70, 21, 96, 28, 21,
- 11, 20, 24, 24, 132, 132, 12, 25, 25, 11,
- 75, 21, 21, 75, 32, 12, 25, 24, 26, 21,
- 28, 26, 853, 21, 30, 28, 21, 22, 26, 96,
-
- 26, 22, 30, 135, 22, 116, 22, 22, 30, 133,
- 31, 26, 30, 34, 31, 26, 77, 116, 26, 22,
- 30, 30, 76, 77, 22, 26, 34, 26, 22, 30,
- 31, 22, 116, 22, 22, 30, 31, 31, 35, 30,
- 34, 31, 35, 77, 134, 76, 37, 134, 37, 76,
- 100, 131, 35, 100, 38, 35, 84, 31, 33, 38,
- 68, 84, 33, 37, 35, 35, 39, 38, 33, 35,
- 39, 33, 37, 37, 39, 37, 80, 100, 33, 35,
- 33, 38, 35, 84, 62, 33, 38, 139, 139, 33,
- 37, 66, 39, 39, 80, 33, 125, 39, 33, 85,
-
- 762, 39, 125, 80, 66, 33, 36, 85, 40, 36,
- 40, 40, 56, 40, 56, 56, 36, 56, 66, 40,
- 36, 36, 64, 125, 64, 64, 85, 64, 36, 67,
- 762, 67, 67, 36, 67, 69, 36, 69, 69, 72,
- 69, 72, 72, 36, 72, 78, 69, 36, 36, 81,
- 72, 87, 79, 82, 83, 83, 57, 86, 78, 82,
- 64, 79, 81, 83, 87, 52, 88, 89, 92, 78,
- 51, 266, 78, 88, 82, 86, 81, 72, 87, 79,
- 82, 83, 83, 89, 93, 78, 82, 90, 91, 86,
- 94, 92, 97, 88, 89, 92, 90, 91, 266, 101,
-
- 97, 46, 86, 94, 95, 98, 93, 95, 104, 99,
- 103, 93, 101, 99, 90, 91, 102, 94, 105, 97,
- 95, 95, 104, 109, 41, 98, 101, 98, 95, 14,
- 103, 95, 98, 99, 95, 104, 99, 103, 105, 102,
- 99, 106, 107, 102, 108, 105, 109, 95, 95, 107,
- 109, 110, 98, 108, 111, 106, 112, 114, 111, 115,
- 110, 113, 117, 112, 114, 115, 119, 120, 106, 107,
- 117, 108, 13, 115, 0, 122, 111, 0, 110, 0,
- 119, 111, 121, 112, 114, 111, 115, 113, 113, 117,
- 118, 123, 115, 119, 118, 122, 124, 121, 0, 120,
-
- 123, 122, 122, 118, 126, 127, 129, 124, 130, 121,
- 0, 128, 0, 0, 0, 129, 0, 118, 123, 0,
- 0, 118, 122, 124, 144, 126, 128, 127, 145, 126,
- 130, 126, 127, 129, 136, 130, 136, 136, 128, 136,
- 141, 146, 141, 141, 142, 141, 142, 142, 144, 142,
- 145, 144, 126, 147, 149, 145, 148, 150, 0, 152,
- 153, 154, 149, 151, 157, 147, 152, 154, 0, 150,
- 155, 0, 156, 146, 160, 148, 0, 176, 153, 0,
- 147, 149, 142, 148, 150, 151, 152, 153, 230, 162,
- 151, 158, 155, 154, 154, 158, 157, 155, 156, 156,
-
- 160, 160, 161, 163, 164, 165, 168, 167, 164, 176,
- 161, 162, 158, 0, 166, 170, 162, 230, 168, 158,
- 167, 0, 158, 0, 170, 163, 171, 172, 165, 161,
- 163, 164, 165, 168, 167, 177, 166, 179, 0, 158,
- 159, 166, 170, 169, 174, 159, 169, 180, 171, 172,
- 159, 174, 0, 171, 172, 175, 159, 159, 169, 173,
- 182, 177, 177, 159, 173, 180, 175, 159, 178, 179,
- 169, 174, 159, 169, 180, 181, 173, 159, 173, 178,
- 184, 181, 175, 159, 159, 173, 173, 183, 185, 0,
- 186, 173, 182, 0, 187, 188, 191, 189, 190, 192,
-
- 178, 191, 181, 173, 189, 173, 178, 194, 187, 183,
- 186, 201, 184, 193, 183, 203, 188, 186, 192, 190,
- 185, 187, 188, 191, 189, 190, 192, 193, 196, 194,
- 195, 197, 198, 199, 194, 207, 200, 205, 197, 196,
- 193, 200, 195, 201, 202, 202, 206, 203, 210, 212,
- 0, 0, 218, 202, 198, 196, 199, 195, 197, 198,
- 199, 204, 205, 200, 205, 209, 206, 207, 204, 208,
- 211, 202, 202, 206, 210, 210, 220, 208, 213, 214,
- 209, 212, 215, 214, 218, 217, 216, 221, 204, 219,
- 0, 223, 209, 211, 216, 213, 208, 215, 225, 221,
-
- 223, 0, 211, 213, 217, 213, 214, 227, 220, 215,
- 222, 219, 217, 216, 221, 224, 219, 225, 223, 226,
- 211, 226, 213, 222, 228, 225, 229, 231, 224, 232,
- 234, 227, 233, 235, 227, 0, 231, 222, 236, 239,
- 237, 234, 224, 238, 241, 235, 226, 242, 244, 228,
- 0, 228, 229, 229, 231, 232, 232, 234, 233, 233,
- 235, 238, 236, 237, 240, 236, 243, 237, 245, 246,
- 238, 239, 248, 242, 242, 245, 241, 240, 246, 247,
- 244, 249, 252, 251, 0, 247, 248, 250, 243, 253,
- 257, 240, 251, 243, 254, 245, 246, 0, 253, 248,
-
- 256, 258, 259, 255, 0, 252, 247, 249, 249, 252,
- 251, 250, 255, 272, 250, 256, 253, 259, 261, 262,
- 254, 254, 257, 260, 263, 258, 0, 256, 258, 259,
- 255, 260, 260, 264, 260, 0, 261, 262, 263, 267,
- 272, 260, 0, 262, 268, 261, 262, 268, 264, 278,
- 260, 263, 265, 265, 268, 269, 278, 270, 260, 260,
- 264, 260, 274, 267, 262, 271, 267, 269, 273, 275,
- 277, 268, 276, 280, 268, 270, 278, 265, 282, 265,
- 265, 275, 269, 271, 270, 277, 279, 283, 274, 274,
- 273, 412, 271, 281, 276, 273, 275, 277, 279, 276,
-
- 281, 284, 285, 286, 285, 280, 289, 284, 0, 283,
- 282, 0, 292, 279, 283, 290, 286, 288, 412, 292,
- 281, 0, 287, 284, 293, 287, 285, 287, 284, 285,
- 286, 285, 291, 287, 284, 288, 293, 290, 289, 292,
- 291, 295, 290, 294, 288, 296, 291, 305, 298, 287,
- 300, 293, 287, 299, 287, 300, 294, 295, 296, 291,
- 298, 303, 0, 301, 343, 295, 302, 291, 295, 301,
- 294, 299, 296, 303, 302, 298, 304, 306, 343, 305,
- 299, 306, 300, 304, 295, 297, 297, 307, 303, 308,
- 301, 343, 0, 302, 307, 297, 308, 297, 297, 297,
-
- 0, 310, 297, 304, 306, 309, 311, 312, 313, 316,
- 297, 0, 297, 297, 307, 313, 308, 309, 311, 314,
- 318, 319, 297, 310, 297, 297, 297, 315, 310, 297,
- 321, 318, 309, 311, 314, 313, 317, 321, 317, 312,
- 315, 316, 322, 319, 320, 320, 314, 318, 319, 323,
- 325, 324, 0, 322, 315, 0, 326, 321, 328, 327,
- 323, 0, 332, 317, 324, 0, 0, 328, 329, 322,
- 331, 335, 334, 320, 327, 325, 323, 325, 324, 326,
- 330, 329, 327, 326, 332, 328, 327, 333, 331, 332,
- 334, 330, 337, 330, 336, 329, 341, 331, 330, 334,
-
- 336, 327, 338, 335, 339, 340, 342, 330, 344, 345,
- 333, 0, 340, 337, 333, 346, 368, 348, 330, 337,
- 330, 336, 341, 341, 347, 338, 339, 349, 342, 338,
- 347, 339, 340, 342, 344, 344, 352, 350, 346, 348,
- 351, 345, 346, 353, 348, 349, 354, 355, 368, 356,
- 0, 347, 350, 355, 349, 351, 358, 0, 360, 352,
- 359, 361, 0, 352, 350, 362, 359, 351, 354, 353,
- 353, 363, 362, 354, 355, 356, 356, 360, 392, 361,
- 372, 367, 358, 358, 369, 360, 363, 359, 361, 366,
- 370, 365, 362, 365, 367, 373, 366, 371, 363, 372,
-
- 365, 374, 369, 375, 392, 392, 376, 372, 367, 377,
- 371, 369, 370, 409, 380, 379, 366, 370, 365, 376,
- 365, 379, 409, 382, 371, 374, 375, 373, 374, 378,
- 0, 377, 381, 376, 378, 375, 377, 380, 383, 384,
- 409, 380, 379, 387, 381, 382, 388, 384, 386, 383,
- 382, 387, 389, 375, 390, 386, 378, 388, 0, 381,
- 394, 391, 389, 0, 395, 383, 384, 385, 391, 393,
- 387, 393, 385, 388, 385, 386, 395, 0, 390, 0,
- 396, 390, 385, 407, 389, 385, 394, 394, 391, 389,
- 397, 395, 385, 385, 385, 396, 393, 398, 399, 385,
-
- 400, 385, 397, 399, 403, 398, 402, 396, 401, 385,
- 411, 404, 385, 406, 402, 407, 403, 397, 413, 385,
- 410, 415, 400, 0, 398, 399, 401, 400, 408, 411,
- 414, 403, 404, 402, 410, 401, 406, 411, 404, 416,
- 406, 417, 419, 408, 418, 414, 420, 410, 421, 422,
- 413, 421, 425, 415, 416, 408, 418, 414, 423, 421,
- 422, 426, 428, 423, 419, 417, 416, 424, 417, 419,
- 420, 418, 427, 420, 429, 421, 422, 430, 421, 425,
- 431, 424, 0, 432, 433, 435, 431, 434, 426, 428,
- 423, 436, 433, 437, 424, 441, 0, 439, 0, 442,
-
- 0, 429, 443, 0, 427, 432, 434, 431, 435, 430,
- 432, 433, 435, 438, 434, 443, 437, 446, 440, 439,
- 437, 442, 438, 436, 439, 440, 442, 441, 444, 443,
- 445, 448, 447, 444, 449, 450, 451, 444, 0, 445,
- 438, 447, 453, 446, 446, 440, 0, 452, 450, 454,
- 0, 455, 444, 448, 463, 444, 449, 445, 448, 447,
- 444, 449, 450, 456, 444, 452, 453, 0, 451, 453,
- 457, 454, 454, 455, 452, 458, 454, 459, 455, 462,
- 461, 457, 460, 0, 464, 456, 463, 468, 465, 458,
- 456, 461, 466, 470, 462, 467, 468, 457, 454, 459,
-
- 460, 471, 458, 473, 459, 464, 462, 461, 469, 460,
- 472, 464, 465, 0, 468, 465, 466, 467, 474, 466,
- 476, 469, 467, 471, 475, 470, 478, 473, 471, 475,
- 473, 0, 477, 479, 476, 469, 480, 481, 482, 0,
- 474, 479, 472, 484, 483, 474, 477, 476, 484, 0,
- 485, 0, 481, 482, 480, 486, 475, 486, 478, 477,
- 479, 481, 487, 480, 481, 482, 483, 489, 495, 0,
- 488, 483, 490, 494, 491, 484, 485, 485, 488, 481,
- 492, 490, 486, 491, 493, 0, 495, 487, 492, 487,
- 496, 493, 489, 499, 489, 495, 494, 488, 498, 490,
-
- 494, 491, 496, 497, 500, 499, 498, 492, 501, 0,
- 502, 493, 497, 503, 0, 504, 501, 496, 502, 506,
- 499, 507, 0, 508, 510, 498, 0, 505, 0, 0,
- 497, 508, 507, 509, 511, 501, 500, 502, 504, 503,
- 503, 506, 504, 505, 510, 512, 506, 509, 507, 513,
- 508, 510, 514, 515, 505, 516, 511, 518, 523, 517,
- 509, 511, 515, 519, 523, 512, 520, 521, 528, 522,
- 518, 513, 512, 0, 514, 516, 513, 517, 0, 514,
- 515, 519, 516, 525, 518, 523, 517, 524, 520, 527,
- 519, 521, 522, 520, 521, 524, 522, 527, 529, 533,
-
- 528, 525, 531, 530, 0, 529, 532, 0, 534, 535,
- 525, 540, 551, 524, 524, 532, 527, 531, 535, 536,
- 547, 536, 524, 540, 543, 529, 530, 534, 549, 531,
- 530, 533, 537, 532, 543, 534, 535, 0, 540, 537,
- 0, 547, 548, 546, 551, 550, 536, 547, 0, 580,
- 0, 543, 554, 553, 549, 549, 558, 555, 554, 537,
- 538, 546, 557, 0, 538, 548, 555, 538, 559, 548,
- 546, 550, 550, 560, 538, 553, 556, 538, 556, 554,
- 553, 580, 538, 558, 555, 561, 557, 538, 559, 557,
- 564, 538, 562, 563, 538, 559, 0, 561, 567, 560,
-
- 560, 538, 565, 556, 538, 552, 552, 0, 552, 566,
- 0, 552, 561, 567, 564, 563, 552, 564, 562, 562,
- 563, 569, 552, 552, 565, 567, 572, 571, 569, 565,
- 573, 552, 552, 552, 566, 552, 566, 568, 552, 570,
- 577, 581, 573, 552, 576, 568, 571, 570, 569, 552,
- 552, 575, 572, 572, 571, 574, 578, 573, 579, 576,
- 575, 593, 577, 582, 568, 583, 570, 577, 574, 584,
- 585, 576, 586, 581, 588, 590, 587, 591, 575, 0,
- 579, 586, 574, 578, 0, 579, 583, 582, 584, 585,
- 582, 592, 583, 593, 588, 591, 584, 585, 587, 586,
-
- 589, 588, 590, 587, 591, 594, 596, 597, 589, 599,
- 592, 598, 603, 594, 601, 600, 604, 602, 592, 604,
- 608, 607, 0, 0, 596, 597, 0, 589, 600, 602,
- 603, 599, 594, 596, 597, 598, 599, 605, 598, 603,
- 601, 601, 600, 604, 602, 605, 607, 608, 607, 609,
- 611, 610, 612, 613, 617, 609, 611, 615, 613, 612,
- 614, 605, 616, 617, 605, 619, 618, 614, 623, 621,
- 622, 620, 605, 610, 618, 615, 609, 611, 610, 612,
- 613, 617, 621, 619, 615, 616, 620, 614, 626, 616,
- 625, 622, 619, 618, 624, 623, 621, 622, 620, 627,
-
- 628, 624, 629, 625, 0, 632, 631, 630, 634, 633,
- 629, 632, 637, 638, 635, 630, 636, 625, 0, 640,
- 626, 624, 630, 628, 642, 636, 637, 628, 631, 629,
- 639, 627, 632, 631, 630, 633, 633, 639, 635, 637,
- 634, 635, 630, 636, 641, 638, 640, 643, 645, 644,
- 647, 642, 646, 641, 648, 646, 645, 639, 649, 643,
- 652, 648, 0, 647, 649, 659, 653, 0, 0, 651,
- 659, 641, 644, 0, 643, 645, 644, 647, 653, 646,
- 654, 648, 654, 652, 657, 649, 650, 652, 650, 655,
- 656, 0, 650, 653, 650, 651, 651, 659, 0, 650,
-
- 661, 658, 656, 664, 650, 660, 657, 654, 662, 665,
- 650, 657, 655, 650, 658, 650, 655, 656, 660, 650,
- 662, 650, 665, 661, 663, 664, 650, 661, 658, 667,
- 664, 650, 660, 666, 663, 662, 665, 668, 669, 666,
- 670, 674, 667, 0, 0, 0, 663, 673, 683, 0,
- 678, 663, 675, 0, 676, 0, 667, 677, 668, 686,
- 666, 663, 673, 674, 668, 675, 679, 670, 674, 676,
- 669, 672, 678, 680, 673, 683, 672, 678, 672, 675,
- 681, 676, 682, 677, 677, 679, 680, 684, 681, 672,
- 682, 686, 689, 679, 687, 690, 672, 672, 672, 0,
-
- 680, 0, 691, 672, 688, 672, 689, 681, 693, 682,
- 684, 695, 688, 704, 684, 694, 672, 692, 687, 689,
- 0, 687, 695, 672, 691, 692, 693, 690, 696, 691,
- 698, 688, 697, 694, 699, 693, 700, 0, 695, 0,
- 697, 699, 694, 701, 692, 704, 696, 702, 703, 700,
- 701, 706, 698, 714, 707, 696, 709, 698, 708, 697,
- 710, 699, 707, 700, 706, 702, 703, 708, 709, 711,
- 701, 712, 713, 715, 702, 703, 725, 718, 706, 714,
- 714, 707, 710, 709, 719, 708, 716, 710, 718, 719,
- 713, 711, 720, 712, 0, 720, 711, 721, 712, 713,
-
- 716, 722, 723, 724, 718, 715, 728, 727, 725, 723,
- 726, 735, 728, 716, 722, 724, 719, 726, 720, 720,
- 729, 721, 720, 731, 721, 730, 732, 0, 722, 723,
- 724, 727, 735, 728, 727, 736, 730, 726, 735, 733,
- 737, 738, 729, 746, 0, 731, 736, 729, 732, 740,
- 731, 739, 730, 732, 733, 741, 742, 744, 740, 745,
- 0, 737, 736, 743, 744, 742, 733, 737, 738, 739,
- 747, 743, 748, 745, 751, 746, 740, 752, 739, 741,
- 750, 753, 741, 742, 744, 754, 745, 755, 756, 750,
- 743, 757, 747, 752, 748, 758, 753, 747, 751, 748,
-
- 756, 751, 759, 760, 752, 761, 764, 750, 753, 766,
- 759, 766, 763, 757, 770, 756, 760, 754, 757, 755,
- 761, 763, 758, 765, 764, 771, 768, 770, 772, 759,
- 760, 765, 761, 764, 768, 772, 766, 771, 773, 763,
- 774, 770, 775, 0, 0, 0, 776, 778, 779, 0,
- 765, 0, 771, 768, 777, 772, 780, 786, 782, 783,
- 778, 779, 0, 0, 775, 781, 782, 793, 784, 775,
- 773, 776, 774, 776, 778, 779, 777, 781, 780, 783,
- 784, 777, 785, 780, 786, 782, 783, 787, 788, 789,
- 785, 790, 781, 793, 793, 784, 798, 788, 790, 794,
-
- 787, 0, 795, 797, 801, 798, 791, 799, 0, 785,
- 789, 796, 801, 800, 787, 788, 789, 791, 790, 802,
- 791, 794, 795, 798, 796, 799, 794, 797, 791, 795,
- 797, 801, 805, 791, 799, 800, 807, 803, 796, 806,
- 800, 802, 809, 808, 791, 803, 802, 791, 810, 813,
- 809, 811, 812, 0, 807, 808, 815, 813, 822, 805,
- 810, 816, 806, 807, 803, 815, 806, 812, 814, 809,
- 808, 811, 817, 818, 814, 810, 813, 0, 811, 812,
- 818, 823, 816, 815, 817, 819, 820, 824, 816, 825,
- 822, 835, 819, 826, 823, 814, 825, 829, 828, 817,
-
- 818, 832, 827, 828, 820, 829, 824, 831, 823, 830,
- 0, 833, 819, 820, 824, 826, 825, 827, 836, 834,
- 826, 831, 830, 835, 829, 833, 837, 832, 832, 827,
- 828, 838, 839, 840, 831, 841, 830, 834, 833, 843,
- 842, 844, 846, 845, 836, 836, 834, 842, 837, 838,
- 847, 846, 848, 837, 839, 840, 845, 843, 838, 839,
- 840, 841, 841, 844, 849, 850, 843, 842, 844, 846,
- 845, 0, 856, 0, 854, 0, 859, 0, 860, 852,
- 858, 0, 847, 860, 848, 857, 849, 0, 850, 858,
- 854, 849, 850, 851, 859, 856, 861, 857, 851, 856,
-
- 851, 854, 851, 859, 851, 852, 852, 858, 862, 861,
- 860, 851, 857, 863, 864, 865, 867, 866, 0, 871,
- 851, 863, 869, 861, 869, 851, 862, 851, 865, 851,
- 866, 851, 870, 864, 867, 862, 868, 873, 872, 876,
- 863, 864, 865, 867, 866, 868, 871, 875, 877, 869,
- 872, 878, 880, 879, 870, 881, 877, 883, 0, 870,
- 879, 876, 882, 868, 873, 872, 876, 886, 882, 884,
- 885, 875, 888, 887, 875, 877, 884, 881, 878, 880,
- 879, 889, 881, 890, 883, 891, 886, 892, 894, 882,
- 889, 895, 885, 897, 886, 887, 884, 885, 888, 888,
-
- 887, 892, 896, 898, 890, 891, 900, 899, 889, 901,
- 890, 902, 891, 904, 892, 899, 905, 904, 902, 903,
- 894, 898, 900, 895, 896, 897, 903, 908, 907, 896,
- 898, 906, 909, 900, 899, 907, 901, 906, 902, 911,
- 904, 910, 908, 914, 906, 909, 903, 915, 905, 912,
- 910, 913, 914, 913, 908, 907, 912, 916, 906, 909,
- 918, 0, 922, 917, 906, 911, 911, 917, 910, 915,
- 914, 920, 921, 923, 915, 924, 912, 921, 913, 920,
- 922, 926, 918, 925, 916, 929, 925, 918, 924, 922,
- 917, 927, 923, 928, 0, 925, 930, 932, 920, 931,
-
- 923, 941, 924, 926, 921, 932, 928, 935, 926, 941,
- 925, 933, 933, 925, 939, 931, 927, 929, 927, 930,
- 928, 934, 936, 930, 932, 937, 931, 940, 941, 935,
- 934, 936, 937, 943, 935, 942, 940, 939, 933, 944,
- 0, 939, 947, 945, 0, 946, 943, 948, 934, 936,
- 942, 944, 937, 946, 940, 945, 949, 951, 954, 950,
- 943, 952, 942, 957, 947, 953, 944, 948, 950, 947,
- 945, 956, 946, 958, 948, 951, 955, 953, 949, 954,
- 959, 962, 955, 949, 951, 954, 950, 952, 952, 960,
- 963, 964, 953, 956, 968, 957, 0, 966, 956, 967,
-
- 0, 965, 968, 955, 971, 958, 959, 959, 962, 964,
- 965, 971, 967, 963, 975, 960, 960, 963, 964, 966,
- 969, 968, 970, 978, 966, 969, 967, 970, 965, 972,
- 973, 971, 974, 976, 976, 977, 979, 972, 973, 980,
- 974, 0, 0, 977, 978, 981, 975, 980, 987, 988,
- 978, 984, 969, 981, 970, 982, 972, 973, 986, 974,
- 976, 983, 977, 982, 984, 985, 980, 0, 979, 983,
- 986, 985, 981, 988, 987, 987, 988, 990, 984, 989,
- 991, 993, 982, 994, 995, 986, 992, 1000, 983, 1006,
- 998, 0, 985, 1001, 989, 993, 0, 998, 995, 996,
-
- 0, 994, 991, 996, 990, 1002, 989, 991, 993, 992,
- 994, 995, 999, 992, 1000, 1001, 996, 998, 1003, 1007,
- 1001, 1006, 1004, 999, 996, 1003, 996, 1005, 1002, 1009,
- 996, 1004, 1002, 1011, 1005, 1012, 1013, 1015, 1009, 999,
- 1017, 0, 1018, 996, 0, 1003, 1007, 1020, 1025, 1004,
- 1021, 1022, 1024, 1018, 1005, 1011, 1009, 1023, 0, 1023,
- 1011, 1012, 1012, 1022, 1015, 1024, 1027, 1017, 1013, 1018,
- 1025, 1020, 1028, 1026, 1020, 1025, 1021, 1021, 1022, 1024,
- 1029, 0, 1030, 1031, 1023, 1026, 1032, 1029, 1031, 1033,
- 1034, 1037, 1035, 1027, 1038, 1028, 1040, 0, 1034, 1028,
-
- 1026, 0, 1032, 1038, 1041, 1049, 0, 1029, 1030, 1030,
- 1031, 1039, 1033, 1032, 1035, 1044, 1033, 1034, 1037, 1035,
- 1042, 1038, 1040, 1040, 1039, 1043, 1041, 1042, 1045, 1046,
- 0, 1041, 1043, 1044, 1047, 1048, 1046, 1049, 1039, 1050,
- 1051, 1053, 1044, 1054, 0, 0, 1050, 1042, 1056, 1061,
- 1045, 1059, 1043, 1060, 1053, 1045, 1046, 1048, 1061, 1047,
- 1063, 1047, 1048, 1055, 1058, 1067, 1050, 1058, 1053, 1056,
- 1054, 1055, 1051, 1062, 1064, 1056, 1061, 1059, 1059, 1060,
- 1060, 1065, 1068, 1066, 1063, 1062, 1066, 1063, 1065, 1064,
- 1055, 1058, 1070, 1069, 1071, 1073, 1071, 1067, 1066, 1072,
-
- 1062, 1064, 1074, 1075, 1068, 1078, 1080, 1066, 1065, 1068,
- 1066, 1069, 1075, 1066, 1070, 1077, 1076, 1079, 1082, 1070,
- 1069, 1071, 1077, 1072, 1076, 1066, 1072, 1073, 1074, 1074,
- 1075, 1081, 1083, 1084, 0, 1081, 1088, 1078, 1080, 1079,
- 1082, 1085, 1077, 1076, 1079, 1082, 1086, 1087, 1089, 1088,
- 1085, 1090, 1092, 1086, 1087, 1084, 1091, 0, 1081, 1083,
- 1084, 1089, 1093, 1088, 1094, 1098, 1090, 1095, 1085, 1093,
- 1091, 1094, 1099, 1086, 1087, 1089, 1096, 1102, 1090, 1099,
- 1095, 1101, 1096, 1091, 1092, 1100, 1108, 1103, 1108, 1093,
- 1103, 1094, 1098, 1101, 1095, 1104, 0, 1102, 1109, 1099,
-
- 1110, 1112, 1111, 1096, 1102, 1103, 1104, 1100, 1101, 1112,
- 1113, 1106, 1100, 1108, 1103, 1115, 1106, 1103, 1117, 1114,
- 1120, 1117, 1104, 1106, 1119, 1109, 1111, 1110, 1112, 1111,
- 1114, 1116, 1113, 1115, 1118, 1122, 1117, 1113, 1106, 1116,
- 1124, 1123, 1115, 1106, 1121, 1117, 1114, 1120, 1117, 1122,
- 1123, 1121, 1118, 1124, 1125, 1126, 1119, 1128, 1116, 1128,
- 1129, 1118, 1122, 1130, 1131, 1125, 1133, 1124, 1123, 1129,
- 1126, 1121, 1134, 1137, 1132, 1131, 1135, 1139, 1137, 1135,
- 1141, 1125, 1126, 1143, 1128, 1147, 1134, 1129, 1133, 1130,
- 1130, 1131, 1132, 1133, 1135, 1136, 1142, 0, 1134, 1134,
-
- 1144, 1132, 1140, 1135, 1136, 1137, 1135, 1146, 1152, 1139,
- 1148, 1140, 1141, 1134, 1146, 1143, 1152, 1147, 1142, 1149,
- 1153, 1144, 1136, 1142, 1148, 1149, 1154, 1144, 1156, 1140,
- 1157, 1158, 1155, 1161, 1146, 1152, 1156, 1148, 1163, 1153,
- 1154, 1155, 1158, 1149, 1162, 1159, 1149, 1153, 1164, 1167,
- 1171, 1162, 1149, 1154, 1159, 1156, 1165, 1166, 1158, 1155,
- 1161, 1163, 1157, 1182, 1168, 1163, 1178, 1167, 1168, 1170,
- 1164, 1162, 1159, 1172, 1173, 1164, 1167, 1171, 1165, 1166,
- 1174, 1170, 1175, 1165, 1166, 1176, 1172, 1179, 1184, 1181,
- 1182, 1168, 1177, 1176, 1173, 1174, 1170, 1175, 1178, 1177,
-
- 1172, 1173, 1179, 1183, 1180, 1187, 1186, 1174, 1188, 1175,
- 1181, 1189, 1176, 1180, 1179, 1184, 1181, 1190, 1191, 1177,
- 0, 1195, 1196, 1187, 1192, 1191, 1189, 1183, 1186, 1192,
- 1183, 1180, 1187, 1186, 1193, 1188, 1194, 1196, 1189, 1195,
- 1197, 0, 1190, 1193, 1190, 1191, 1198, 1199, 1195, 1196,
- 1200, 1192, 1197, 1202, 1201, 1206, 1203, 1200, 1194, 1207,
- 1199, 1193, 1206, 1194, 1204, 1199, 1201, 1197, 1198, 1208,
- 1204, 1205, 1209, 1198, 1199, 1211, 1208, 1200, 1210, 1205,
- 1202, 1201, 1206, 1212, 1210, 1213, 1207, 1199, 1203, 1214,
- 1216, 1204, 1217, 1218, 1220, 0, 1208, 1221, 1205, 1209,
-
- 1222, 1217, 1211, 1223, 0, 1210, 1212, 1219, 0, 1219,
- 1212, 1227, 0, 1214, 0, 1230, 1214, 1213, 1220, 1217,
- 1230, 1220, 1216, 1233, 1221, 1218, 1222, 1222, 1231, 1224,
- 1224, 1224, 1225, 1226, 1219, 1223, 1224, 1239, 1228, 1225,
- 1226, 1231, 1232, 1227, 1224, 1228, 1235, 1230, 1232, 1238,
- 1233, 1234, 1234, 1242, 1236, 1231, 1224, 1224, 1224, 1225,
- 1226, 1236, 1237, 1224, 1239, 1228, 1244, 1237, 1243, 1232,
- 1245, 1242, 1235, 1235, 1243, 1238, 1238, 1249, 1234, 1246,
- 1242, 1236, 1245, 1247, 1248, 1248, 1250, 1250, 1254, 1237,
- 1253, 1251, 1257, 1244, 1256, 1243, 1258, 1245, 1255, 1246,
-
- 1259, 1247, 1251, 1249, 1249, 1255, 1246, 1260, 1261, 1262,
- 1247, 1248, 1253, 1250, 1256, 1263, 1262, 1253, 1251, 1265,
- 1254, 1256, 1264, 1263, 1257, 1255, 1261, 1259, 1258, 1260,
- 1266, 1267, 1267, 1268, 1260, 1261, 1262, 1264, 1269, 1266,
- 1270, 1273, 1263, 1265, 1272, 1276, 1265, 1274, 1278, 1264,
- 1269, 1277, 1272, 1273, 1275, 1274, 1270, 1266, 1267, 1268,
- 1268, 1280, 1284, 1270, 1281, 1269, 1276, 1270, 1273, 1277,
- 1281, 1272, 1276, 1282, 1274, 1278, 1285, 1275, 1277, 1279,
- 1283, 1275, 1287, 1270, 1279, 1286, 1282, 1283, 1280, 1289,
- 1286, 1281, 1288, 1288, 1284, 1279, 1290, 1292, 1293, 1295,
-
- 1282, 1295, 1296, 1285, 1289, 1294, 1279, 1283, 1297, 1298,
- 1302, 1279, 1292, 1297, 1287, 1299, 1289, 1286, 1303, 1288,
- 1294, 1293, 1301, 1304, 1292, 1293, 1295, 1306, 1290, 1308,
- 1299, 1305, 1294, 1307, 1296, 1297, 1302, 1302, 1305, 1310,
- 1309, 1298, 1299, 1312, 1314, 1303, 1301, 1315, 1317, 1301,
- 1304, 1308, 0, 1319, 1307, 1320, 1308, 1310, 1305, 1306,
- 1307, 1309, 1315, 1317, 1318, 1312, 1310, 1309, 1314, 1322,
- 1312, 1314, 1321, 1320, 1315, 1317, 1323, 1324, 1325, 1318,
- 1319, 1326, 1320, 1323, 1327, 1329, 1332, 1325, 1328, 1326,
- 0, 1318, 1333, 1330, 1321, 1324, 1322, 1332, 1334, 1321,
-
- 1335, 1333, 1337, 1323, 1324, 1325, 1330, 1327, 1326, 1342,
- 1328, 1327, 1332, 1332, 1341, 1328, 1334, 1329, 1335, 1333,
- 1330, 1339, 1342, 1343, 1332, 1334, 1341, 1335, 0, 1337,
- 1344, 1346, 1339, 1345, 1347, 1348, 1342, 1351, 0, 1352,
- 1344, 1341, 0, 1350, 1351, 1354, 1358, 1358, 1339, 1353,
- 0, 1354, 1366, 1355, 1348, 1343, 1346, 1344, 1346, 1345,
- 1345, 1347, 1348, 1350, 1351, 1352, 1352, 1353, 1355, 1356,
- 1350, 1357, 1354, 1358, 1362, 1359, 1353, 1366, 1360, 1366,
- 1355, 1362, 1363, 1367, 1356, 1365, 1357, 1359, 0, 1363,
- 1371, 1360, 1367, 1368, 1369, 0, 1356, 1372, 1357, 1360,
-
- 1374, 1362, 1359, 1375, 1378, 1360, 1377, 1365, 1371, 1363,
- 1367, 0, 1365, 1374, 1369, 1368, 1379, 1371, 1360, 1380,
- 1368, 1369, 1372, 1381, 1372, 1376, 1376, 1374, 1377, 1378,
- 1375, 1378, 1381, 1377, 1383, 1382, 1384, 1385, 1379, 0,
- 1386, 1380, 1382, 1379, 1389, 1388, 1380, 1390, 1394, 1391,
- 1381, 1385, 1376, 1388, 1393, 1395, 1392, 1389, 1384, 1386,
- 1396, 1393, 1382, 1384, 1385, 1398, 1383, 1386, 1392, 1397,
- 1401, 1389, 1388, 1399, 1390, 1391, 1391, 1395, 1403, 1407,
- 1394, 1393, 1395, 1392, 1397, 1396, 1400, 1396, 1402, 1400,
- 1404, 1398, 1398, 0, 1402, 1401, 1397, 1401, 1408, 1399,
-
- 1399, 1407, 1411, 1405, 1400, 1403, 1407, 1410, 1404, 1411,
- 1412, 1413, 1415, 1400, 1417, 1402, 1400, 1404, 1405, 1412,
- 1408, 1410, 1413, 1421, 1418, 1408, 1419, 1420, 1419, 1411,
- 1405, 1422, 1423, 1415, 1410, 1417, 1418, 1412, 1413, 1415,
- 1424, 1417, 1425, 1427, 1426, 1420, 1433, 1428, 1424, 1422,
- 1421, 1418, 1428, 1419, 1420, 1429, 1430, 1427, 1422, 1423,
- 0, 1434, 1435, 1430, 1436, 1425, 1426, 1424, 1437, 1425,
- 1427, 1426, 1439, 1433, 1429, 1434, 1440, 1438, 1441, 1428,
- 1435, 1439, 1429, 1430, 1442, 1443, 1445, 1434, 1434, 1435,
- 1446, 1436, 1438, 1449, 1437, 1437, 1448, 1446, 1448, 1439,
-
- 1441, 1455, 1434, 1452, 1438, 1441, 1450, 1443, 1440, 1445,
- 1450, 1442, 1443, 1445, 1451, 1449, 1456, 1446, 1453, 1457,
- 1449, 1454, 1458, 1448, 0, 1452, 1451, 1453, 1455, 1460,
- 1452, 1457, 1454, 1450, 1459, 1459, 1463, 1460, 1467, 1456,
- 1463, 1451, 1462, 1456, 1458, 1453, 1457, 1465, 1454, 1458,
- 1462, 1464, 1466, 1467, 1464, 1465, 1460, 1471, 1466, 1470,
- 1468, 1459, 1473, 1463, 1472, 1467, 1468, 1474, 1475, 1462,
- 1476, 1470, 1477, 1478, 1465, 1481, 1473, 0, 1464, 1466,
- 1474, 1479, 1475, 1483, 1471, 1484, 1470, 1468, 1472, 1473,
- 1480, 1472, 1485, 1479, 1474, 1475, 1476, 1476, 1487, 1477,
-
- 1478, 1481, 1481, 1482, 1480, 1486, 1482, 1488, 1479, 1489,
- 1483, 1490, 1484, 1486, 1491, 1492, 1488, 1480, 1494, 1485,
- 1495, 1482, 1497, 1492, 1500, 1487, 1498, 1491, 1501, 1496,
- 1482, 1499, 1486, 1482, 1488, 1498, 1489, 1496, 1490, 1502,
- 1494, 1491, 1492, 1501, 1506, 1494, 1511, 1495, 1500, 1497,
- 1504, 1500, 1499, 1498, 1501, 1501, 1496, 1503, 1499, 1505,
- 1509, 1508, 1504, 1510, 1509, 1503, 1502, 1505, 1508, 1511,
- 1501, 1506, 1512, 1511, 1513, 1510, 1514, 1504, 1515, 1519,
- 1516, 1522, 1513, 1518, 1503, 1515, 1505, 1509, 1508, 1520,
- 1510, 1517, 1517, 1523, 0, 1533, 1522, 1519, 1525, 1512,
-
- 1516, 1513, 1524, 1514, 1524, 1515, 1519, 1516, 1522, 1518,
- 1518, 1526, 1525, 1527, 1520, 1523, 1520, 1526, 1517, 1528,
- 1523, 1529, 1534, 1532, 1530, 1525, 1531, 1533, 1539, 1524,
- 1536, 1540, 1548, 1529, 1538, 1527, 1532, 1536, 1526, 1541,
- 1527, 1528, 1530, 1548, 1531, 1534, 1528, 1541, 1529, 1534,
- 1532, 1530, 1538, 1531, 1539, 1539, 1544, 1536, 1545, 1548,
- 1542, 1538, 1542, 1540, 1547, 1541, 1541, 1542, 1544, 1549,
- 1551, 1552, 1555, 1553, 1541, 1554, 1545, 1557, 1559, 1547,
- 1553, 1558, 1560, 1544, 1549, 1545, 1562, 1542, 1561, 1542,
- 1554, 1547, 1563, 1552, 1551, 1566, 1549, 1551, 1552, 1555,
-
- 1553, 1561, 1554, 1558, 1557, 1564, 1565, 1563, 1558, 1560,
- 1559, 1568, 1562, 1562, 1565, 1561, 1569, 1570, 1564, 1563,
- 1571, 1566, 1566, 1572, 1573, 1575, 1574, 1577, 1576, 1578,
- 1572, 1573, 1564, 1565, 1568, 1576, 1579, 1580, 1568, 1574,
- 1569, 1584, 1571, 1569, 1570, 1582, 1580, 1571, 1575, 1577,
- 1572, 1573, 1575, 1574, 1577, 1576, 1582, 1579, 1583, 1585,
- 0, 1578, 1586, 1579, 1580, 1590, 1589, 0, 1592, 1592,
- 1591, 1597, 1582, 1584, 1593, 1599, 0, 1602, 1585, 1589,
- 1583, 1603, 1604, 1606, 1599, 1583, 1585, 1586, 1608, 1586,
- 1609, 1590, 1590, 1589, 1591, 1592, 1610, 1591, 1597, 1602,
-
- 1593, 1593, 1599, 1603, 1602, 1612, 1611, 1610, 1603, 1604,
- 1606, 1611, 1616, 1614, 1615, 1619, 1609, 1609, 1618, 1620,
- 1608, 1614, 1621, 1610, 1623, 0, 1625, 1612, 1620, 1615,
- 1626, 1628, 1612, 1611, 1621, 1629, 1618, 1627, 1631, 1616,
- 1614, 1615, 1630, 1632, 1633, 1618, 1620, 1619, 1629, 1621,
- 1634, 1623, 1625, 1625, 1636, 1630, 1628, 1626, 1628, 1627,
- 1631, 1635, 1629, 1636, 1627, 1631, 1637, 1638, 1639, 1630,
- 1632, 1633, 1640, 1642, 1641, 1643, 1635, 1634, 0, 1644,
- 1642, 1636, 1638, 1639, 1645, 1645, 1650, 1640, 1635, 1647,
- 1658, 1646, 1637, 1637, 1638, 1639, 1641, 1644, 1646, 1640,
-
- 1642, 1641, 1643, 1647, 1648, 1651, 1644, 1648, 1649, 1653,
- 1652, 1645, 1650, 1650, 1653, 1655, 1647, 1658, 1646, 1652,
- 1654, 1649, 1656, 1651, 1654, 1659, 1657, 0, 1660, 1663,
- 1664, 1648, 1651, 1666, 1667, 1649, 1653, 1652, 1663, 1655,
- 1666, 1670, 1655, 1667, 1656, 1668, 1664, 1654, 1657, 1656,
- 1668, 1669, 1659, 1657, 1660, 1660, 1663, 1664, 1669, 1670,
- 1666, 1667, 1671, 1675, 1672, 0, 1673, 1676, 1670, 1671,
- 1677, 1679, 1668, 1672, 1683, 1678, 1684, 1680, 1669, 1677,
- 1685, 1686, 1683, 1679, 1690, 1676, 1680, 1681, 1682, 1671,
- 1675, 1672, 1673, 1673, 1676, 1678, 1681, 1677, 1679, 1682,
-
- 1687, 1683, 1678, 1684, 1680, 1688, 1690, 1685, 1689, 1687,
- 1696, 1690, 1691, 1686, 1681, 1682, 1689, 1688, 1692, 1691,
- 1693, 1694, 1697, 1698, 1703, 1692, 1701, 1687, 1696, 1697,
- 1702, 1698, 1688, 1701, 1705, 1689, 1706, 1696, 1711, 1691,
- 1704, 1707, 1693, 1705, 1709, 1692, 1694, 1693, 1694, 1697,
- 1698, 1703, 1704, 1701, 1702, 1710, 1709, 1702, 1712, 1714,
- 1716, 1705, 1717, 1706, 1707, 1711, 1718, 1704, 1707, 1719,
- 1717, 1709, 1712, 1720, 0, 1724, 1725, 1727, 1710, 0,
- 1726, 1725, 1710, 1728, 1729, 1712, 1714, 1716, 1737, 1717,
- 1730, 1719, 1734, 1718, 1726, 1727, 1719, 1731, 1730, 1735,
-
- 1720, 1724, 1724, 1725, 1727, 1728, 1729, 1726, 1733, 1738,
- 1728, 1729, 1739, 1736, 1734, 1737, 1731, 1730, 1741, 1734,
- 1733, 1735, 1740, 0, 1731, 1736, 1735, 1743, 1745, 1742,
- 1744, 1746, 1739, 1749, 1752, 1733, 1738, 1751, 1750, 1739,
- 1736, 0, 1744, 1750, 1740, 1753, 1781, 1749, 1757, 1740,
- 1741, 1742, 1754, 1743, 1743, 1745, 1742, 1744, 1746, 1751,
- 1749, 1756, 1755, 1758, 1751, 1762, 1752, 1757, 1753, 1759,
- 1750, 1761, 1753, 1756, 1754, 1757, 1765, 1763, 1781, 1754,
- 1755, 1766, 1768, 1764, 1759, 1758, 1763, 1762, 1756, 1755,
- 1758, 1767, 1762, 1771, 1765, 1761, 1759, 1764, 1761, 1766,
-
- 1768, 1771, 1774, 1765, 1763, 1772, 1773, 1775, 1766, 1768,
- 1764, 1777, 1772, 1776, 1773, 1775, 1778, 1767, 1767, 1779,
- 1771, 1780, 1782, 1777, 1786, 1784, 1783, 1779, 1790, 1774,
- 1793, 1776, 1772, 1773, 1775, 1789, 1787, 1796, 1777, 0,
- 1776, 1790, 1786, 1778, 1780, 1783, 1779, 1784, 1780, 1782,
- 1787, 1786, 1784, 1783, 1791, 1790, 1793, 1793, 1789, 1801,
- 1798, 1800, 1789, 1787, 1796, 1802, 1791, 1798, 1800, 1803,
- 1804, 1805, 1806, 1807, 1809, 1810, 1808, 1817, 1811, 1814,
- 0, 1791, 1807, 1816, 1814, 1801, 1801, 1798, 1800, 1808,
- 1815, 0, 1802, 1803, 1815, 1819, 1803, 1804, 1805, 1806,
-
- 1807, 1811, 1810, 1808, 1816, 1811, 1809, 1822, 1823, 1817,
- 1816, 1814, 1818, 1825, 1818, 1825, 1827, 1815, 1819, 1828,
- 1826, 1826, 1819, 1830, 1829, 1831, 1833, 0, 1828, 1822,
- 1826, 1829, 1823, 1832, 1822, 1823, 1830, 1835, 1827, 1818,
- 1825, 1832, 1836, 1827, 1837, 1833, 1828, 1826, 1826, 1834,
- 1830, 1829, 1831, 1833, 1838, 1839, 1842, 1834, 1846, 1840,
- 1832, 1841, 1841, 1835, 1835, 1838, 1840, 1847, 1836, 1836,
- 1837, 1837, 1843, 1844, 1842, 1848, 1834, 1839, 1850, 1843,
- 1844, 1838, 1839, 1842, 1848, 1846, 1840, 1851, 1841, 1852,
- 1855, 1847, 1854, 1857, 1847, 1856, 1858, 0, 1859, 1843,
-
- 1844, 1854, 1848, 1859, 0, 1850, 1863, 1852, 1858, 1851,
- 1860, 1857, 0, 1861, 1851, 0, 1852, 1855, 1856, 1854,
- 1857, 1864, 1856, 1858, 1860, 1867, 1865, 1867, 1871, 1873,
- 1859, 1861, 1872, 1863, 1878, 1875, 1879, 1860, 1881, 1864,
- 1861, 1865, 1876, 1883, 1880, 1876, 1881, 1873, 1864, 1885,
- 1871, 1880, 1867, 1865, 1879, 1871, 1873, 1875, 1872, 1872,
- 1882, 1878, 1875, 1879, 1884, 1881, 1887, 1886, 1876, 1876,
- 1888, 1880, 1876, 1886, 1889, 1883, 1885, 1891, 1890, 1888,
- 1890, 1893, 1882, 1894, 1895, 1896, 1884, 1882, 1887, 1893,
- 1897, 1884, 1899, 1887, 1886, 1894, 1898, 1888, 1902, 1896,
-
- 1904, 1900, 1901, 1899, 1891, 1890, 1889, 1907, 1893, 1900,
- 1894, 1895, 1896, 1897, 1898, 1903, 1903, 1897, 1905, 1899,
- 1902, 1901, 1908, 1898, 1910, 1902, 1905, 1904, 1900, 1901,
- 1911, 1912, 1914, 1915, 1907, 1916, 1917, 0, 1919, 1916,
- 1915, 1911, 1903, 1920, 1917, 1905, 1923, 1922, 1924, 1908,
- 1928, 1910, 1922, 1912, 1934, 1929, 1920, 1911, 1912, 1914,
- 1915, 1925, 1916, 1917, 1919, 1919, 1926, 0, 1930, 1925,
- 1920, 1927, 1932, 1923, 1922, 1924, 1933, 1928, 1927, 1929,
- 1935, 1926, 1929, 1933, 1936, 0, 1934, 1932, 1925, 1940,
- 1939, 1937, 1941, 1926, 1930, 1930, 1943, 1940, 1927, 1932,
-
- 1937, 1945, 1946, 1933, 1942, 1942, 1948, 1935, 1936, 1950,
- 1946, 1936, 1939, 1949, 1942, 1951, 1940, 1939, 1937, 1952,
- 1953, 1954, 1950, 1943, 1941, 1957, 1964, 1955, 1945, 1946,
- 1962, 1942, 1942, 1948, 1961, 1949, 1950, 1951, 1965, 1961,
- 1949, 1967, 1951, 1966, 1968, 1969, 1952, 1953, 1954, 1955,
- 1966, 1965, 1957, 1964, 1955, 1972, 1962, 1962, 1973, 1967,
- 1979, 1961, 1974, 0, 1978, 1965, 1976, 1969, 1967, 1977,
- 1966, 1968, 1969, 1976, 1972, 1979, 1977, 1980, 1982, 1985,
- 1988, 1983, 1972, 1984, 1974, 1973, 1978, 1979, 1983, 1974,
- 1985, 1978, 1984, 1976, 1993, 1987, 1977, 1982, 1980, 1986,
-
- 1986, 1987, 1988, 1994, 1980, 1982, 1985, 1988, 1983, 1986,
- 1984, 1991, 1995, 1999, 2001, 2001, 0, 2004, 1991, 2002,
- 2005, 1993, 1987, 2006, 2008, 2009, 1986, 1986, 2013, 2005,
- 1994, 2012, 2011, 2014, 2015, 1995, 2006, 2009, 1991, 1995,
- 1999, 2011, 2002, 2001, 2004, 2016, 2002, 2005, 2017, 2012,
- 2006, 2008, 2009, 2018, 2013, 2013, 2020, 2016, 2012, 2011,
- 2014, 2015, 2019, 2021, 2019, 2022, 2023, 2025, 2020, 2021,
- 2017, 2024, 2016, 2028, 2030, 2017, 2031, 2032, 2034, 2024,
- 2018, 2035, 2037, 2020, 2038, 2040, 2046, 2022, 2023, 2019,
- 2021, 0, 2022, 2023, 2025, 2039, 2034, 2037, 2024, 2044,
-
- 2028, 2030, 2048, 2031, 2032, 2034, 2043, 2039, 2035, 2037,
- 2038, 2038, 2040, 2049, 2047, 2043, 2050, 2051, 2046, 2059,
- 2064, 2049, 2039, 2044, 2048, 2050, 2044, 2047, 2051, 2048,
- 2057, 2060, 2061, 2043, 2065, 2063, 2064, 0, 2060, 2063,
- 2049, 2047, 2059, 2050, 2051, 2061, 2059, 2064, 2065, 2069,
- 2072, 2069, 2066, 2070, 2057, 2067, 2068, 2057, 2060, 2061,
- 2066, 2065, 2063, 2071, 2067, 2070, 2073, 2068, 2074, 2076,
- 2071, 2075, 2077, 0, 2080, 2081, 2069, 2072, 2078, 2066,
- 2070, 2083, 2067, 2068, 2073, 2079, 2080, 2079, 2090, 2082,
- 2071, 2085, 2091, 2073, 2077, 2074, 2076, 2075, 2075, 2077,
-
- 2078, 2080, 2082, 2085, 2087, 2078, 2089, 2081, 2083, 2092,
- 0, 2093, 2079, 2087, 2089, 2094, 2082, 2096, 2085, 2098,
- 2090, 2099, 2092, 2094, 2091, 2093, 2097, 2098, 2102, 2100,
- 2096, 2087, 2101, 2089, 0, 2099, 2092, 2104, 2093, 2103,
- 2101, 2105, 2094, 2100, 2096, 2104, 2098, 2106, 2099, 2097,
- 2102, 2111, 0, 2097, 2107, 2102, 2100, 2108, 2109, 2101,
- 2112, 2103, 2110, 2117, 2104, 0, 2103, 2115, 2105, 2116,
- 2110, 2114, 0, 2106, 2106, 2115, 2107, 2116, 2118, 2108,
- 2109, 2107, 2121, 2111, 2108, 2109, 2118, 2112, 2119, 2110,
- 2125, 2114, 2122, 2123, 2115, 2117, 2116, 2124, 2114, 2126,
-
- 2122, 2123, 2119, 2128, 2121, 2118, 2127, 0, 2129, 2121,
- 2130, 2124, 2133, 0, 2127, 2119, 2125, 2125, 2131, 2122,
- 2123, 2126, 2134, 2132, 2124, 0, 2126, 2135, 2136, 2128,
- 2128, 2132, 2130, 2127, 2129, 2129, 2136, 2130, 2131, 2133,
- 2137, 2140, 2134, 2138, 2141, 2131, 2144, 2135, 2142, 2134,
- 2132, 2138, 2143, 2145, 2135, 2136, 2142, 2146, 0, 2147,
- 2143, 2145, 2137, 2140, 2148, 2146, 2141, 2137, 2140, 2149,
- 2138, 2141, 2144, 2144, 2150, 2142, 2151, 2152, 2154, 2143,
- 2145, 2160, 0, 2161, 2146, 2147, 2147, 2157, 0, 2149,
- 2158, 2148, 0, 0, 2159, 0, 2149, 2152, 2158, 0,
-
- 2154, 2150, 2159, 2151, 2152, 2154, 0, 0, 2160, 2157,
- 2161, 0, 0, 0, 2157, 0, 0, 2158, 0, 0,
- 0, 2159, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2166,
- 2166, 2166, 2166, 2166, 2166, 2166, 2167, 2167, 2167, 2167,
- 2167, 2167, 2167, 2168, 2168, 2168, 2168, 2168, 2168, 2168,
- 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2171, 2171, 0,
- 2171, 2171, 2171, 2171, 2172, 2172, 0, 0, 0, 2172,
- 2172, 2173, 2173, 0, 0, 2173, 0, 2173, 2174, 0,
- 0, 0, 0, 0, 2174, 2175, 2175, 0, 0, 0,
- 2175, 2175, 2176, 0, 0, 0, 0, 0, 2176, 2177,
-
- 2177, 0, 2177, 2177, 2177, 2177, 2178, 2178, 0, 2178,
- 2178, 2178, 2178, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164
- } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-extern int yy_flex_debug;
-int yy_flex_debug = 0;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-static int yy_more_flag = 0;
-static int yy_more_len = 0;
-#define yymore() ((yy_more_flag) = 1)
-#define YY_MORE_ADJ (yy_more_len)
-#define YY_RESTORE_YY_MORE_OFFSET
-char *yytext;
-#line 1 "util/configlexer.lex"
-#line 2 "util/configlexer.lex"
-/*
- * configlexer.lex - lexical analyzer for unbound config file
- *
- * Copyright (c) 2001-2006, NLnet Labs. All rights reserved
- *
- * See LICENSE for the license.
- *
- */
-
-/* because flex keeps having sign-unsigned compare problems that are unfixed*/
-#if defined(__clang__)||(defined(__GNUC__)&&((__GNUC__ >4)||(defined(__GNUC_MINOR__)&&(__GNUC__ ==4)&&(__GNUC_MINOR__ >=2))))
-#pragma GCC diagnostic ignored "-Wsign-compare"
-#endif
-
-#include <ctype.h>
-#include <string.h>
-#include <strings.h>
-#ifdef HAVE_GLOB_H
-# include <glob.h>
-#endif
-
-#include "util/config_file.h"
-#include "util/configparser.h"
-void ub_c_error(const char *message);
-
-#if 0
-#define LEXOUT(s) printf s /* used ONLY when debugging */
-#else
-#define LEXOUT(s)
-#endif
-
-/** avoid warning in about fwrite return value */
-#define ECHO ub_c_error_msg("syntax error at text: %s", yytext)
-
-/** A parser variable, this is a statement in the config file which is
- * of the form variable: value1 value2 ... nargs is the number of values. */
-#define YDVAR(nargs, var) \
- num_args=(nargs); \
- LEXOUT(("v(%s%d) ", yytext, num_args)); \
- if(num_args > 0) { BEGIN(val); } \
- return (var);
-
-struct inc_state {
- char* filename;
- int line;
- YY_BUFFER_STATE buffer;
- struct inc_state* next;
-};
-static struct inc_state* config_include_stack = NULL;
-static int inc_depth = 0;
-static int inc_prev = 0;
-static int num_args = 0;
-
-void init_cfg_parse(void)
-{
- config_include_stack = NULL;
- inc_depth = 0;
- inc_prev = 0;
- num_args = 0;
-}
-
-static void config_start_include(const char* filename)
-{
- FILE *input;
- struct inc_state* s;
- char* nm;
- if(inc_depth++ > 100000) {
- ub_c_error_msg("too many include files");
- return;
- }
- if(*filename == '\0') {
- ub_c_error_msg("empty include file name");
- return;
- }
- s = (struct inc_state*)malloc(sizeof(*s));
- if(!s) {
- ub_c_error_msg("include %s: malloc failure", filename);
- return;
- }
- if(cfg_parser->chroot && strncmp(filename, cfg_parser->chroot,
- strlen(cfg_parser->chroot)) == 0) {
- filename += strlen(cfg_parser->chroot);
- }
- nm = strdup(filename);
- if(!nm) {
- ub_c_error_msg("include %s: strdup failure", filename);
- free(s);
- return;
- }
- input = fopen(filename, "r");
- if(!input) {
- ub_c_error_msg("cannot open include file '%s': %s",
- filename, strerror(errno));
- free(s);
- free(nm);
- return;
- }
- LEXOUT(("switch_to_include_file(%s)\n", filename));
- s->filename = cfg_parser->filename;
- s->line = cfg_parser->line;
- s->buffer = YY_CURRENT_BUFFER;
- s->next = config_include_stack;
- config_include_stack = s;
- cfg_parser->filename = nm;
- cfg_parser->line = 1;
- yy_switch_to_buffer(yy_create_buffer(input,YY_BUF_SIZE));
-}
-
-static void config_start_include_glob(const char* filename)
-{
-
- /* check for wildcards */
-#ifdef HAVE_GLOB
- glob_t g;
- size_t i;
- int r, flags;
- if(!(!strchr(filename, '*') && !strchr(filename, '?') && !strchr(filename, '[') &&
- !strchr(filename, '{') && !strchr(filename, '~'))) {
- flags = 0
-#ifdef GLOB_ERR
- | GLOB_ERR
-#endif
-#ifdef GLOB_NOSORT
- | GLOB_NOSORT
-#endif
-#ifdef GLOB_BRACE
- | GLOB_BRACE
-#endif
-#ifdef GLOB_TILDE
- | GLOB_TILDE
-#endif
- ;
- memset(&g, 0, sizeof(g));
- if(cfg_parser->chroot && strncmp(filename, cfg_parser->chroot,
- strlen(cfg_parser->chroot)) == 0) {
- filename += strlen(cfg_parser->chroot);
- }
- r = glob(filename, flags, NULL, &g);
- if(r) {
- /* some error */
- globfree(&g);
- if(r == GLOB_NOMATCH)
- return; /* no matches for pattern */
- config_start_include(filename); /* let original deal with it */
- return;
- }
- /* process files found, if any */
- for(i=0; i<(size_t)g.gl_pathc; i++) {
- config_start_include(g.gl_pathv[i]);
- }
- globfree(&g);
- return;
- }
-#endif /* HAVE_GLOB */
-
- config_start_include(filename);
-}
-
-static void config_end_include(void)
-{
- struct inc_state* s = config_include_stack;
- --inc_depth;
- if(!s) return;
- free(cfg_parser->filename);
- cfg_parser->filename = s->filename;
- cfg_parser->line = s->line;
- yy_delete_buffer(YY_CURRENT_BUFFER);
- yy_switch_to_buffer(s->buffer);
- config_include_stack = s->next;
- free(s);
-}
-
-#ifndef yy_set_bol /* compat definition, for flex 2.4.6 */
-#define yy_set_bol(at_bol) \
- { \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer(yyin,YY_BUF_SIZE ); \
- yy_current_buffer->yy_ch_buf[0] = ((at_bol)?'\n':' '); \
- }
-#endif
-
-#define YY_NO_INPUT 1
-#line 187 "util/configlexer.lex"
-#ifndef YY_NO_UNPUT
-#define YY_NO_UNPUT 1
-#endif
-#ifndef YY_NO_INPUT
-#define YY_NO_INPUT 1
-#endif
-
-#line 2756 "<stdout>"
-
-#define INITIAL 0
-#define quotedstring 1
-#define singlequotedstr 2
-#define include 3
-#define include_quoted 4
-#define val 5
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-#include <unistd.h>
-#endif
-
-#ifndef YY_EXTRA_TYPE
-#define YY_EXTRA_TYPE void *
-#endif
-
-static int yy_init_globals (void );
-
-/* Accessor methods to globals.
- These are made visible to non-reentrant scanners for convenience. */
-
-int yylex_destroy (void );
-
-int yyget_debug (void );
-
-void yyset_debug (int debug_flag );
-
-YY_EXTRA_TYPE yyget_extra (void );
-
-void yyset_extra (YY_EXTRA_TYPE user_defined );
-
-FILE *yyget_in (void );
-
-void yyset_in (FILE * _in_str );
-
-FILE *yyget_out (void );
-
-void yyset_out (FILE * _out_str );
-
-yy_size_t yyget_leng (void );
-
-char *yyget_text (void );
-
-int yyget_lineno (void );
-
-void yyset_lineno (int _line_number );
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int yywrap (void );
-#else
-extern int yywrap (void );
-#endif
-#endif
-
-#ifndef YY_NO_UNPUT
-
-#endif
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int );
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * );
-#endif
-
-#ifndef YY_NO_INPUT
-
-#ifdef __cplusplus
-static int yyinput (void );
-#else
-static int input (void );
-#endif
-
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k */
-#define YY_READ_BUF_SIZE 16384
-#else
-#define YY_READ_BUF_SIZE 8192
-#endif /* __ia64__ */
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
-#endif
-
-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
- { \
- int c = '*'; \
- size_t n; \
- for ( n = 0; n < max_size && \
- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
- buf[n] = (char) c; \
- if ( c == '\n' ) \
- buf[n++] = (char) c; \
- if ( c == EOF && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- result = n; \
- } \
- else \
- { \
- errno=0; \
- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
- { \
- if( errno != EINTR) \
- { \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- break; \
- } \
- errno=0; \
- clearerr(yyin); \
- } \
- }\
-\
-
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-#endif
-
-/* end tables serialization structures and prototypes */
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-
-extern int yylex (void);
-
-#define YY_DECL int yylex (void)
-#endif /* !YY_DECL */
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK /*LINTED*/break;
-#endif
-
-#define YY_RULE_SETUP \
- YY_USER_ACTION
-
-/** The main scanner function which does all the work.
- */
-YY_DECL
-{
- yy_state_type yy_current_state;
- char *yy_cp, *yy_bp;
- int yy_act;
-
- if ( !(yy_init) )
- {
- (yy_init) = 1;
-
-#ifdef YY_USER_INIT
- YY_USER_INIT;
-#endif
-
- if ( ! (yy_start) )
- (yy_start) = 1; /* first start state */
-
- if ( ! yyin )
- yyin = stdin;
-
- if ( ! yyout )
- yyout = stdout;
-
- if ( ! YY_CURRENT_BUFFER ) {
- yyensure_buffer_stack ();
- YY_CURRENT_BUFFER_LVALUE =
- yy_create_buffer(yyin,YY_BUF_SIZE );
- }
-
- yy_load_buffer_state( );
- }
-
- {
-#line 207 "util/configlexer.lex"
-
-#line 2979 "<stdout>"
-
- while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
- {
- (yy_more_len) = 0;
- if ( (yy_more_flag) )
- {
- (yy_more_len) = (yy_c_buf_p) - (yytext_ptr);
- (yy_more_flag) = 0;
- }
- yy_cp = (yy_c_buf_p);
-
- /* Support of yytext. */
- *yy_cp = (yy_hold_char);
-
- /* yy_bp points to the position in yy_ch_buf of the start of
- * the current run.
- */
- yy_bp = yy_cp;
-
- yy_current_state = (yy_start);
-yy_match:
- do
- {
- YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 2165 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- ++yy_cp;
- }
- while ( yy_base[yy_current_state] != 6214 );
-
-yy_find_action:
- yy_act = yy_accept[yy_current_state];
- if ( yy_act == 0 )
- { /* have to back up */
- yy_cp = (yy_last_accepting_cpos);
- yy_current_state = (yy_last_accepting_state);
- yy_act = yy_accept[yy_current_state];
- }
-
- YY_DO_BEFORE_ACTION;
-
-do_action: /* This label is used only to access EOF actions. */
-
- switch ( yy_act )
- { /* beginning of action switch */
- case 0: /* must back up */
- /* undo the effects of YY_DO_BEFORE_ACTION */
- *yy_cp = (yy_hold_char);
- yy_cp = (yy_last_accepting_cpos);
- yy_current_state = (yy_last_accepting_state);
- goto yy_find_action;
-
-case 1:
-YY_RULE_SETUP
-#line 208 "util/configlexer.lex"
-{
- LEXOUT(("SP ")); /* ignore */ }
- YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 210 "util/configlexer.lex"
-{
- /* note that flex makes the longest match and '.' is any but not nl */
- LEXOUT(("comment(%s) ", yytext)); /* ignore */ }
- YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 213 "util/configlexer.lex"
-{ YDVAR(0, VAR_SERVER) }
- YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 214 "util/configlexer.lex"
-{ YDVAR(1, VAR_QNAME_MINIMISATION) }
- YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 215 "util/configlexer.lex"
-{ YDVAR(1, VAR_QNAME_MINIMISATION_STRICT) }
- YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 216 "util/configlexer.lex"
-{ YDVAR(1, VAR_NUM_THREADS) }
- YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 217 "util/configlexer.lex"
-{ YDVAR(1, VAR_VERBOSITY) }
- YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 218 "util/configlexer.lex"
-{ YDVAR(1, VAR_PORT) }
- YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 219 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_RANGE) }
- YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 220 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_PORT_PERMIT) }
- YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 221 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_PORT_AVOID) }
- YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 222 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_NUM_TCP) }
- YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 223 "util/configlexer.lex"
-{ YDVAR(1, VAR_INCOMING_NUM_TCP) }
- YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 224 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_IP4) }
- YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 225 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_IP6) }
- YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 226 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFER_IP6) }
- YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 227 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_UDP) }
- YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 228 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_TCP) }
- YY_BREAK
-case 19:
-YY_RULE_SETUP
-#line 229 "util/configlexer.lex"
-{ YDVAR(1, VAR_TCP_UPSTREAM) }
- YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 230 "util/configlexer.lex"
-{ YDVAR(1, VAR_TCP_MSS) }
- YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 231 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_TCP_MSS) }
- YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 232 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_UPSTREAM) }
- YY_BREAK
-case 23:
-YY_RULE_SETUP
-#line 233 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
- YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 234 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
- YY_BREAK
-case 25:
-YY_RULE_SETUP
-#line 235 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_PORT) }
- YY_BREAK
-case 26:
-YY_RULE_SETUP
-#line 236 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSTEMD) }
- YY_BREAK
-case 27:
-YY_RULE_SETUP
-#line 237 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_DAEMONIZE) }
- YY_BREAK
-case 28:
-YY_RULE_SETUP
-#line 238 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
- YY_BREAK
-case 29:
-YY_RULE_SETUP
-#line 239 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
- YY_BREAK
-case 30:
-YY_RULE_SETUP
-#line 240 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
- YY_BREAK
-case 31:
-YY_RULE_SETUP
-#line 241 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
- YY_BREAK
-case 32:
-YY_RULE_SETUP
-#line 242 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_RCVBUF) }
- YY_BREAK
-case 33:
-YY_RULE_SETUP
-#line 243 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_SNDBUF) }
- YY_BREAK
-case 34:
-YY_RULE_SETUP
-#line 244 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_REUSEPORT) }
- YY_BREAK
-case 35:
-YY_RULE_SETUP
-#line 245 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_TRANSPARENT) }
- YY_BREAK
-case 36:
-YY_RULE_SETUP
-#line 246 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_FREEBIND) }
- YY_BREAK
-case 37:
-YY_RULE_SETUP
-#line 247 "util/configlexer.lex"
-{ YDVAR(1, VAR_CHROOT) }
- YY_BREAK
-case 38:
-YY_RULE_SETUP
-#line 248 "util/configlexer.lex"
-{ YDVAR(1, VAR_USERNAME) }
- YY_BREAK
-case 39:
-YY_RULE_SETUP
-#line 249 "util/configlexer.lex"
-{ YDVAR(1, VAR_DIRECTORY) }
- YY_BREAK
-case 40:
-YY_RULE_SETUP
-#line 250 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOGFILE) }
- YY_BREAK
-case 41:
-YY_RULE_SETUP
-#line 251 "util/configlexer.lex"
-{ YDVAR(1, VAR_PIDFILE) }
- YY_BREAK
-case 42:
-YY_RULE_SETUP
-#line 252 "util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_HINTS) }
- YY_BREAK
-case 43:
-YY_RULE_SETUP
-#line 253 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
- YY_BREAK
-case 44:
-YY_RULE_SETUP
-#line 254 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
- YY_BREAK
-case 45:
-YY_RULE_SETUP
-#line 255 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
- YY_BREAK
-case 46:
-YY_RULE_SETUP
-#line 256 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
- YY_BREAK
-case 47:
-YY_RULE_SETUP
-#line 257 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
- YY_BREAK
-case 48:
-YY_RULE_SETUP
-#line 258 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
- YY_BREAK
-case 49:
-YY_RULE_SETUP
-#line 259 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_TTL) }
- YY_BREAK
-case 50:
-YY_RULE_SETUP
-#line 260 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
- YY_BREAK
-case 51:
-YY_RULE_SETUP
-#line 261 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MIN_TTL) }
- YY_BREAK
-case 52:
-YY_RULE_SETUP
-#line 262 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_HOST_TTL) }
- YY_BREAK
-case 53:
-YY_RULE_SETUP
-#line 263 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_LAME_TTL) }
- YY_BREAK
-case 54:
-YY_RULE_SETUP
-#line 264 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
- YY_BREAK
-case 55:
-YY_RULE_SETUP
-#line 265 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
- YY_BREAK
-case 56:
-YY_RULE_SETUP
-#line 266 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
- YY_BREAK
-case 57:
-YY_RULE_SETUP
-#line 267 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
- YY_BREAK
-case 58:
-YY_RULE_SETUP
-#line 268 "util/configlexer.lex"
-{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
- YY_BREAK
-case 59:
-YY_RULE_SETUP
-#line 269 "util/configlexer.lex"
-{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
- YY_BREAK
-case 60:
-YY_RULE_SETUP
-#line 270 "util/configlexer.lex"
-{ YDVAR(1, VAR_DELAY_CLOSE) }
- YY_BREAK
-case 61:
-YY_RULE_SETUP
-#line 271 "util/configlexer.lex"
-{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
- YY_BREAK
-case 62:
-YY_RULE_SETUP
-#line 272 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
- YY_BREAK
-case 63:
-YY_RULE_SETUP
-#line 273 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
- YY_BREAK
-case 64:
-YY_RULE_SETUP
-#line 274 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_GLUE) }
- YY_BREAK
-case 65:
-YY_RULE_SETUP
-#line 275 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
- YY_BREAK
-case 66:
-YY_RULE_SETUP
-#line 276 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
- YY_BREAK
-case 67:
-YY_RULE_SETUP
-#line 277 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
- YY_BREAK
-case 68:
-YY_RULE_SETUP
-#line 278 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
- YY_BREAK
-case 69:
-YY_RULE_SETUP
-#line 279 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
- YY_BREAK
-case 70:
-YY_RULE_SETUP
-#line 280 "util/configlexer.lex"
-{ YDVAR(1, VAR_CAPS_WHITELIST) }
- YY_BREAK
-case 71:
-YY_RULE_SETUP
-#line 281 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
- YY_BREAK
-case 72:
-YY_RULE_SETUP
-#line 282 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
- YY_BREAK
-case 73:
-YY_RULE_SETUP
-#line 283 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
- YY_BREAK
-case 74:
-YY_RULE_SETUP
-#line 284 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH_KEY) }
- YY_BREAK
-case 75:
-YY_RULE_SETUP
-#line 285 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH) }
- YY_BREAK
-case 76:
-YY_RULE_SETUP
-#line 286 "util/configlexer.lex"
-{ YDVAR(0, VAR_STUB_ZONE) }
- YY_BREAK
-case 77:
-YY_RULE_SETUP
-#line 287 "util/configlexer.lex"
-{ YDVAR(1, VAR_NAME) }
- YY_BREAK
-case 78:
-YY_RULE_SETUP
-#line 288 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_ADDR) }
- YY_BREAK
-case 79:
-YY_RULE_SETUP
-#line 289 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_HOST) }
- YY_BREAK
-case 80:
-YY_RULE_SETUP
-#line 290 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_PRIME) }
- YY_BREAK
-case 81:
-YY_RULE_SETUP
-#line 291 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_FIRST) }
- YY_BREAK
-case 82:
-YY_RULE_SETUP
-#line 292 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
- YY_BREAK
-case 83:
-YY_RULE_SETUP
-#line 293 "util/configlexer.lex"
-{ YDVAR(0, VAR_FORWARD_ZONE) }
- YY_BREAK
-case 84:
-YY_RULE_SETUP
-#line 294 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_ADDR) }
- YY_BREAK
-case 85:
-YY_RULE_SETUP
-#line 295 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_HOST) }
- YY_BREAK
-case 86:
-YY_RULE_SETUP
-#line 296 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_FIRST) }
- YY_BREAK
-case 87:
-YY_RULE_SETUP
-#line 297 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
- YY_BREAK
-case 88:
-YY_RULE_SETUP
-#line 298 "util/configlexer.lex"
-{ YDVAR(0, VAR_VIEW) }
- YY_BREAK
-case 89:
-YY_RULE_SETUP
-#line 299 "util/configlexer.lex"
-{ YDVAR(1, VAR_VIEW_FIRST) }
- YY_BREAK
-case 90:
-YY_RULE_SETUP
-#line 300 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
- YY_BREAK
-case 91:
-YY_RULE_SETUP
-#line 301 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
- YY_BREAK
-case 92:
-YY_RULE_SETUP
-#line 302 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL) }
- YY_BREAK
-case 93:
-YY_RULE_SETUP
-#line 303 "util/configlexer.lex"
-{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
- YY_BREAK
-case 94:
-YY_RULE_SETUP
-#line 304 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
- YY_BREAK
-case 95:
-YY_RULE_SETUP
-#line 305 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
- YY_BREAK
-case 96:
-YY_RULE_SETUP
-#line 306 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
- YY_BREAK
-case 97:
-YY_RULE_SETUP
-#line 307 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
- YY_BREAK
-case 98:
-YY_RULE_SETUP
-#line 308 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_IDENTITY) }
- YY_BREAK
-case 99:
-YY_RULE_SETUP
-#line 309 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_VERSION) }
- YY_BREAK
-case 100:
-YY_RULE_SETUP
-#line 310 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
- YY_BREAK
-case 101:
-YY_RULE_SETUP
-#line 311 "util/configlexer.lex"
-{ YDVAR(1, VAR_IDENTITY) }
- YY_BREAK
-case 102:
-YY_RULE_SETUP
-#line 312 "util/configlexer.lex"
-{ YDVAR(1, VAR_VERSION) }
- YY_BREAK
-case 103:
-YY_RULE_SETUP
-#line 313 "util/configlexer.lex"
-{ YDVAR(1, VAR_MODULE_CONF) }
- YY_BREAK
-case 104:
-YY_RULE_SETUP
-#line 314 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR) }
- YY_BREAK
-case 105:
-YY_RULE_SETUP
-#line 315 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
- YY_BREAK
-case 106:
-YY_RULE_SETUP
-#line 316 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
- YY_BREAK
-case 107:
-YY_RULE_SETUP
-#line 317 "util/configlexer.lex"
-{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
- YY_BREAK
-case 108:
-YY_RULE_SETUP
-#line 318 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
- YY_BREAK
-case 109:
-YY_RULE_SETUP
-#line 319 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR) }
- YY_BREAK
-case 110:
-YY_RULE_SETUP
-#line 320 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
- YY_BREAK
-case 111:
-YY_RULE_SETUP
-#line 321 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
- YY_BREAK
-case 112:
-YY_RULE_SETUP
-#line 322 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
- YY_BREAK
-case 113:
-YY_RULE_SETUP
-#line 323 "util/configlexer.lex"
-{ YDVAR(1, VAR_BOGUS_TTL) }
- YY_BREAK
-case 114:
-YY_RULE_SETUP
-#line 324 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
- YY_BREAK
-case 115:
-YY_RULE_SETUP
-#line 325 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
- YY_BREAK
-case 116:
-YY_RULE_SETUP
-#line 326 "util/configlexer.lex"
-{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
- YY_BREAK
-case 117:
-YY_RULE_SETUP
-#line 327 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED) }
- YY_BREAK
-case 118:
-YY_RULE_SETUP
-#line 328 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_DSA) }
- YY_BREAK
-case 119:
-YY_RULE_SETUP
-#line 329 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_SHA1) }
- YY_BREAK
-case 120:
-YY_RULE_SETUP
-#line 330 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
- YY_BREAK
-case 121:
-YY_RULE_SETUP
-#line 331 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
- YY_BREAK
-case 122:
-YY_RULE_SETUP
-#line 332 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
- YY_BREAK
-case 123:
-YY_RULE_SETUP
-#line 333 "util/configlexer.lex"
-{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
- YY_BREAK
-case 124:
-YY_RULE_SETUP
-#line 334 "util/configlexer.lex"
-{
- YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
- YY_BREAK
-case 125:
-YY_RULE_SETUP
-#line 336 "util/configlexer.lex"
-{ YDVAR(1, VAR_ADD_HOLDDOWN) }
- YY_BREAK
-case 126:
-YY_RULE_SETUP
-#line 337 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEL_HOLDDOWN) }
- YY_BREAK
-case 127:
-YY_RULE_SETUP
-#line 338 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEEP_MISSING) }
- YY_BREAK
-case 128:
-YY_RULE_SETUP
-#line 339 "util/configlexer.lex"
-{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
- YY_BREAK
-case 129:
-YY_RULE_SETUP
-#line 340 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSLOG) }
- YY_BREAK
-case 130:
-YY_RULE_SETUP
-#line 341 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_IDENTITY) }
- YY_BREAK
-case 131:
-YY_RULE_SETUP
-#line 342 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TIME_ASCII) }
- YY_BREAK
-case 132:
-YY_RULE_SETUP
-#line 343 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_QUERIES) }
- YY_BREAK
-case 133:
-YY_RULE_SETUP
-#line 344 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_REPLIES) }
- YY_BREAK
-case 134:
-YY_RULE_SETUP
-#line 345 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE) }
- YY_BREAK
-case 135:
-YY_RULE_SETUP
-#line 346 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA) }
- YY_BREAK
-case 136:
-YY_RULE_SETUP
-#line 347 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
- YY_BREAK
-case 137:
-YY_RULE_SETUP
-#line 348 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
- YY_BREAK
-case 138:
-YY_RULE_SETUP
-#line 349 "util/configlexer.lex"
-{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
- YY_BREAK
-case 139:
-YY_RULE_SETUP
-#line 350 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
- YY_BREAK
-case 140:
-YY_RULE_SETUP
-#line 351 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
- YY_BREAK
-case 141:
-YY_RULE_SETUP
-#line 352 "util/configlexer.lex"
-{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
- YY_BREAK
-case 142:
-YY_RULE_SETUP
-#line 353 "util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_ENABLE) }
- YY_BREAK
-case 143:
-YY_RULE_SETUP
-#line 354 "util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_KEY) }
- YY_BREAK
-case 144:
-YY_RULE_SETUP
-#line 355 "util/configlexer.lex"
-{ YDVAR(0, VAR_REMOTE_CONTROL) }
- YY_BREAK
-case 145:
-YY_RULE_SETUP
-#line 356 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_ENABLE) }
- YY_BREAK
-case 146:
-YY_RULE_SETUP
-#line 357 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_INTERFACE) }
- YY_BREAK
-case 147:
-YY_RULE_SETUP
-#line 358 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_PORT) }
- YY_BREAK
-case 148:
-YY_RULE_SETUP
-#line 359 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_USE_CERT) }
- YY_BREAK
-case 149:
-YY_RULE_SETUP
-#line 360 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_KEY_FILE) }
- YY_BREAK
-case 150:
-YY_RULE_SETUP
-#line 361 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_CERT_FILE) }
- YY_BREAK
-case 151:
-YY_RULE_SETUP
-#line 362 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
- YY_BREAK
-case 152:
-YY_RULE_SETUP
-#line 363 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
- YY_BREAK
-case 153:
-YY_RULE_SETUP
-#line 364 "util/configlexer.lex"
-{ YDVAR(1, VAR_PYTHON_SCRIPT) }
- YY_BREAK
-case 154:
-YY_RULE_SETUP
-#line 365 "util/configlexer.lex"
-{ YDVAR(0, VAR_PYTHON) }
- YY_BREAK
-case 155:
-YY_RULE_SETUP
-#line 366 "util/configlexer.lex"
-{ YDVAR(1, VAR_DOMAIN_INSECURE) }
- YY_BREAK
-case 156:
-YY_RULE_SETUP
-#line 367 "util/configlexer.lex"
-{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
- YY_BREAK
-case 157:
-YY_RULE_SETUP
-#line 368 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
- YY_BREAK
-case 158:
-YY_RULE_SETUP
-#line 369 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_UDP_SIZE) }
- YY_BREAK
-case 159:
-YY_RULE_SETUP
-#line 370 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_PREFIX) }
- YY_BREAK
-case 160:
-YY_RULE_SETUP
-#line 371 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_SYNTHALL) }
- YY_BREAK
-case 161:
-YY_RULE_SETUP
-#line 372 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEFINE_TAG) }
- YY_BREAK
-case 162:
-YY_RULE_SETUP
-#line 373 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
- YY_BREAK
-case 163:
-YY_RULE_SETUP
-#line 374 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
- YY_BREAK
-case 164:
-YY_RULE_SETUP
-#line 375 "util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
- YY_BREAK
-case 165:
-YY_RULE_SETUP
-#line 376 "util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
- YY_BREAK
-case 166:
-YY_RULE_SETUP
-#line 377 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
- YY_BREAK
-case 167:
-YY_RULE_SETUP
-#line 378 "util/configlexer.lex"
-{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
- YY_BREAK
-case 168:
-YY_RULE_SETUP
-#line 379 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSTAP) }
- YY_BREAK
-case 169:
-YY_RULE_SETUP
-#line 380 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_ENABLE) }
- YY_BREAK
-case 170:
-YY_RULE_SETUP
-#line 381 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
- YY_BREAK
-case 171:
-YY_RULE_SETUP
-#line 382 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
- YY_BREAK
-case 172:
-YY_RULE_SETUP
-#line 383 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
- YY_BREAK
-case 173:
-YY_RULE_SETUP
-#line 384 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
- YY_BREAK
-case 174:
-YY_RULE_SETUP
-#line 385 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_VERSION) }
- YY_BREAK
-case 175:
-YY_RULE_SETUP
-#line 386 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
- YY_BREAK
-case 176:
-YY_RULE_SETUP
-#line 388 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
- YY_BREAK
-case 177:
-YY_RULE_SETUP
-#line 390 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
- YY_BREAK
-case 178:
-YY_RULE_SETUP
-#line 392 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
- YY_BREAK
-case 179:
-YY_RULE_SETUP
-#line 394 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
- YY_BREAK
-case 180:
-YY_RULE_SETUP
-#line 396 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
- YY_BREAK
-case 181:
-YY_RULE_SETUP
-#line 398 "util/configlexer.lex"
-{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
- YY_BREAK
-case 182:
-YY_RULE_SETUP
-#line 399 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT) }
- YY_BREAK
-case 183:
-YY_RULE_SETUP
-#line 400 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT) }
- YY_BREAK
-case 184:
-YY_RULE_SETUP
-#line 401 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
- YY_BREAK
-case 185:
-YY_RULE_SETUP
-#line 402 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SLABS) }
- YY_BREAK
-case 186:
-YY_RULE_SETUP
-#line 403 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
- YY_BREAK
-case 187:
-YY_RULE_SETUP
-#line 404 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SIZE) }
- YY_BREAK
-case 188:
-YY_RULE_SETUP
-#line 405 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
- YY_BREAK
-case 189:
-YY_RULE_SETUP
-#line 406 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
- YY_BREAK
-case 190:
-YY_RULE_SETUP
-#line 407 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
- YY_BREAK
-case 191:
-YY_RULE_SETUP
-#line 408 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
- YY_BREAK
-case 192:
-YY_RULE_SETUP
-#line 409 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
- YY_BREAK
-case 193:
-YY_RULE_SETUP
-#line 410 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP) }
- YY_BREAK
-case 194:
-YY_RULE_SETUP
-#line 411 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
- YY_BREAK
-case 195:
-YY_RULE_SETUP
-#line 412 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSCRYPT) }
- YY_BREAK
-case 196:
-YY_RULE_SETUP
-#line 413 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
- YY_BREAK
-case 197:
-YY_RULE_SETUP
-#line 414 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PORT) }
- YY_BREAK
-case 198:
-YY_RULE_SETUP
-#line 415 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
- YY_BREAK
-case 199:
-YY_RULE_SETUP
-#line 416 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
- YY_BREAK
-case 200:
-YY_RULE_SETUP
-#line 417 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
- YY_BREAK
-case 201:
-/* rule 201 can match eol */
-YY_RULE_SETUP
-#line 418 "util/configlexer.lex"
-{ LEXOUT(("NL\n")); cfg_parser->line++; }
- YY_BREAK
-/* Quoted strings. Strip leading and ending quotes */
-case 202:
-YY_RULE_SETUP
-#line 421 "util/configlexer.lex"
-{ BEGIN(quotedstring); LEXOUT(("QS ")); }
- YY_BREAK
-case YY_STATE_EOF(quotedstring):
-#line 422 "util/configlexer.lex"
-{
- yyerror("EOF inside quoted string");
- if(--num_args == 0) { BEGIN(INITIAL); }
- else { BEGIN(val); }
-}
- YY_BREAK
-case 203:
-YY_RULE_SETUP
-#line 427 "util/configlexer.lex"
-{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
- YY_BREAK
-case 204:
-/* rule 204 can match eol */
-YY_RULE_SETUP
-#line 428 "util/configlexer.lex"
-{ yyerror("newline inside quoted string, no end \"");
- cfg_parser->line++; BEGIN(INITIAL); }
- YY_BREAK
-case 205:
-YY_RULE_SETUP
-#line 430 "util/configlexer.lex"
-{
- LEXOUT(("QE "));
- if(--num_args == 0) { BEGIN(INITIAL); }
- else { BEGIN(val); }
- yytext[yyleng - 1] = '\0';
- yylval.str = strdup(yytext);
- if(!yylval.str)
- yyerror("out of memory");
- return STRING_ARG;
-}
- YY_BREAK
-/* Single Quoted strings. Strip leading and ending quotes */
-case 206:
-YY_RULE_SETUP
-#line 442 "util/configlexer.lex"
-{ BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
- YY_BREAK
-case YY_STATE_EOF(singlequotedstr):
-#line 443 "util/configlexer.lex"
-{
- yyerror("EOF inside quoted string");
- if(--num_args == 0) { BEGIN(INITIAL); }
- else { BEGIN(val); }
-}
- YY_BREAK
-case 207:
-YY_RULE_SETUP
-#line 448 "util/configlexer.lex"
-{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
- YY_BREAK
-case 208:
-/* rule 208 can match eol */
-YY_RULE_SETUP
-#line 449 "util/configlexer.lex"
-{ yyerror("newline inside quoted string, no end '");
- cfg_parser->line++; BEGIN(INITIAL); }
- YY_BREAK
-case 209:
-YY_RULE_SETUP
-#line 451 "util/configlexer.lex"
-{
- LEXOUT(("SQE "));
- if(--num_args == 0) { BEGIN(INITIAL); }
- else { BEGIN(val); }
- yytext[yyleng - 1] = '\0';
- yylval.str = strdup(yytext);
- if(!yylval.str)
- yyerror("out of memory");
- return STRING_ARG;
-}
- YY_BREAK
-/* include: directive */
-case 210:
-YY_RULE_SETUP
-#line 463 "util/configlexer.lex"
-{
- LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
- YY_BREAK
-case YY_STATE_EOF(include):
-#line 465 "util/configlexer.lex"
-{
- yyerror("EOF inside include directive");
- BEGIN(inc_prev);
-}
- YY_BREAK
-case 211:
-YY_RULE_SETUP
-#line 469 "util/configlexer.lex"
-{ LEXOUT(("ISP ")); /* ignore */ }
- YY_BREAK
-case 212:
-/* rule 212 can match eol */
-YY_RULE_SETUP
-#line 470 "util/configlexer.lex"
-{ LEXOUT(("NL\n")); cfg_parser->line++;}
- YY_BREAK
-case 213:
-YY_RULE_SETUP
-#line 471 "util/configlexer.lex"
-{ LEXOUT(("IQS ")); BEGIN(include_quoted); }
- YY_BREAK
-case 214:
-YY_RULE_SETUP
-#line 472 "util/configlexer.lex"
-{
- LEXOUT(("Iunquotedstr(%s) ", yytext));
- config_start_include_glob(yytext);
- BEGIN(inc_prev);
-}
- YY_BREAK
-case YY_STATE_EOF(include_quoted):
-#line 477 "util/configlexer.lex"
-{
- yyerror("EOF inside quoted string");
- BEGIN(inc_prev);
-}
- YY_BREAK
-case 215:
-YY_RULE_SETUP
-#line 481 "util/configlexer.lex"
-{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
- YY_BREAK
-case 216:
-/* rule 216 can match eol */
-YY_RULE_SETUP
-#line 482 "util/configlexer.lex"
-{ yyerror("newline before \" in include name");
- cfg_parser->line++; BEGIN(inc_prev); }
- YY_BREAK
-case 217:
-YY_RULE_SETUP
-#line 484 "util/configlexer.lex"
-{
- LEXOUT(("IQE "));
- yytext[yyleng - 1] = '\0';
- config_start_include_glob(yytext);
- BEGIN(inc_prev);
-}
- YY_BREAK
-case YY_STATE_EOF(INITIAL):
-case YY_STATE_EOF(val):
-#line 490 "util/configlexer.lex"
-{
- LEXOUT(("LEXEOF "));
- yy_set_bol(1); /* Set beginning of line, so "^" rules match. */
- if (!config_include_stack) {
- yyterminate();
- } else {
- fclose(yyin);
- config_end_include();
- }
-}
- YY_BREAK
-case 218:
-YY_RULE_SETUP
-#line 501 "util/configlexer.lex"
-{ LEXOUT(("unquotedstr(%s) ", yytext));
- if(--num_args == 0) { BEGIN(INITIAL); }
- yylval.str = strdup(yytext); return STRING_ARG; }
- YY_BREAK
-case 219:
-YY_RULE_SETUP
-#line 505 "util/configlexer.lex"
-{
- ub_c_error_msg("unknown keyword '%s'", yytext);
- }
- YY_BREAK
-case 220:
-YY_RULE_SETUP
-#line 509 "util/configlexer.lex"
-{
- ub_c_error_msg("stray '%s'", yytext);
- }
- YY_BREAK
-case 221:
-YY_RULE_SETUP
-#line 513 "util/configlexer.lex"
-ECHO;
- YY_BREAK
-#line 4246 "<stdout>"
-
- case YY_END_OF_BUFFER:
- {
- /* Amount of text matched not including the EOB char. */
- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
-
- /* Undo the effects of YY_DO_BEFORE_ACTION. */
- *yy_cp = (yy_hold_char);
- YY_RESTORE_YY_MORE_OFFSET
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
- {
- /* We're scanning a new file or input source. It's
- * possible that this happened because the user
- * just pointed yyin at a new source and called
- * yylex(). If so, then we have to assure
- * consistency between YY_CURRENT_BUFFER and our
- * globals. Here is the right place to do so, because
- * this is the first action (other than possibly a
- * back-up) that will match for the new input source.
- */
- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
- }
-
- /* Note that here we test for yy_c_buf_p "<=" to the position
- * of the first EOB in the buffer, since yy_c_buf_p will
- * already have been incremented past the NUL character
- * (since all states make transitions on EOB to the
- * end-of-buffer state). Contrast this with the test
- * in input().
- */
- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
- { /* This was really a NUL. */
- yy_state_type yy_next_state;
-
- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state( );
-
- /* Okay, we're now positioned to make the NUL
- * transition. We couldn't have
- * yy_get_previous_state() go ahead and do it
- * for us because it doesn't know how to deal
- * with the possibility of jamming (and we don't
- * want to build jamming into it because then it
- * will run more slowly).
- */
-
- yy_next_state = yy_try_NUL_trans( yy_current_state );
-
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-
- if ( yy_next_state )
- {
- /* Consume the NUL. */
- yy_cp = ++(yy_c_buf_p);
- yy_current_state = yy_next_state;
- goto yy_match;
- }
-
- else
- {
- yy_cp = (yy_c_buf_p);
- goto yy_find_action;
- }
- }
-
- else switch ( yy_get_next_buffer( ) )
- {
- case EOB_ACT_END_OF_FILE:
- {
- (yy_did_buffer_switch_on_eof) = 0;
-
- if ( yywrap( ) )
- {
- /* Note: because we've taken care in
- * yy_get_next_buffer() to have set up
- * yytext, we can now set up
- * yy_c_buf_p so that if some total
- * hoser (like flex itself) wants to
- * call the scanner after we return the
- * YY_NULL, it'll still work - another
- * YY_NULL will get returned.
- */
- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
-
- yy_act = YY_STATE_EOF(YY_START);
- goto do_action;
- }
-
- else
- {
- if ( ! (yy_did_buffer_switch_on_eof) )
- YY_NEW_FILE;
- }
- break;
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- (yy_c_buf_p) =
- (yytext_ptr) + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state( );
-
- yy_cp = (yy_c_buf_p);
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
- goto yy_match;
-
- case EOB_ACT_LAST_MATCH:
- (yy_c_buf_p) =
- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
-
- yy_current_state = yy_get_previous_state( );
-
- yy_cp = (yy_c_buf_p);
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
- goto yy_find_action;
- }
- break;
- }
-
- default:
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--no action found" );
- } /* end of action switch */
- } /* end of scanning one token */
- } /* end of user's declarations */
-} /* end of yylex */
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- * EOB_ACT_LAST_MATCH -
- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- * EOB_ACT_END_OF_FILE - end of file
- */
-static int yy_get_next_buffer (void)
-{
- char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
- char *source = (yytext_ptr);
- yy_size_t number_to_move, i;
- int ret_val;
-
- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--end of buffer missed" );
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
- { /* Don't try to fill the buffer, so this is an EOF. */
- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
- {
- /* We matched a single character, the EOB, so
- * treat this as a final EOF.
- */
- return EOB_ACT_END_OF_FILE;
- }
-
- else
- {
- /* We matched some text prior to the EOB, first
- * process it.
- */
- return EOB_ACT_LAST_MATCH;
- }
- }
-
- /* Try to read more data. */
-
- /* First move last chars to start of buffer. */
- number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1;
-
- for ( i = 0; i < number_to_move; ++i )
- *(dest++) = *(source++);
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
- /* don't do the read, it's not guaranteed to return an EOF,
- * just force an EOF
- */
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
-
- else
- {
- int num_to_read =
- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-
- while ( num_to_read <= 0 )
- { /* Not enough room in the buffer - grow it. */
-
- /* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
-
- int yy_c_buf_p_offset =
- (int) ((yy_c_buf_p) - b->yy_ch_buf);
-
- if ( b->yy_is_our_buffer )
- {
- yy_size_t new_size = b->yy_buf_size * 2;
-
- if ( new_size <= 0 )
- b->yy_buf_size += b->yy_buf_size / 8;
- else
- b->yy_buf_size *= 2;
-
- b->yy_ch_buf = (char *)
- /* Include room in for 2 EOB chars. */
- yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
- }
- else
- /* Can't grow it, we don't own it. */
- b->yy_ch_buf = 0;
-
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR(
- "fatal error - scanner input buffer overflow" );
-
- (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
-
- num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
- number_to_move - 1;
-
- }
-
- if ( num_to_read > YY_READ_BUF_SIZE )
- num_to_read = YY_READ_BUF_SIZE;
-
- /* Read in more data. */
- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
- (yy_n_chars), num_to_read );
-
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- if ( (yy_n_chars) == 0 )
- {
- if ( number_to_move == YY_MORE_ADJ )
- {
- ret_val = EOB_ACT_END_OF_FILE;
- yyrestart(yyin );
- }
-
- else
- {
- ret_val = EOB_ACT_LAST_MATCH;
- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
- YY_BUFFER_EOF_PENDING;
- }
- }
-
- else
- ret_val = EOB_ACT_CONTINUE_SCAN;
-
- if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
- /* Extend the array by 50%, plus the number we really need. */
- yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
- if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
- }
-
- (yy_n_chars) += number_to_move;
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
-
- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-
- return ret_val;
-}
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
- static yy_state_type yy_get_previous_state (void)
-{
- yy_state_type yy_current_state;
- char *yy_cp;
-
- yy_current_state = (yy_start);
-
- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
- {
- YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 2165 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- }
-
- return yy_current_state;
-}
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- * next_state = yy_try_NUL_trans( current_state );
- */
- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
-{
- int yy_is_jam;
- char *yy_cp = (yy_c_buf_p);
-
- YY_CHAR yy_c = 1;
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 2165 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 2164);
-
- return yy_is_jam ? 0 : yy_current_state;
-}
-
-#ifndef YY_NO_UNPUT
-
-#endif
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
- static int yyinput (void)
-#else
- static int input (void)
-#endif
-
-{
- int c;
-
- *(yy_c_buf_p) = (yy_hold_char);
-
- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
- {
- /* yy_c_buf_p now points to the character we want to return.
- * If this occurs *before* the EOB characters, then it's a
- * valid NUL; if not, then we've hit the end of the buffer.
- */
- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
- /* This was really a NUL. */
- *(yy_c_buf_p) = '\0';
-
- else
- { /* need more input */
- yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
- ++(yy_c_buf_p);
-
- switch ( yy_get_next_buffer( ) )
- {
- case EOB_ACT_LAST_MATCH:
- /* This happens because yy_g_n_b()
- * sees that we've accumulated a
- * token and flags that we need to
- * try matching the token before
- * proceeding. But for input(),
- * there's no matching to consider.
- * So convert the EOB_ACT_LAST_MATCH
- * to EOB_ACT_END_OF_FILE.
- */
-
- /* Reset buffer status. */
- yyrestart(yyin );
-
- /*FALLTHROUGH*/
-
- case EOB_ACT_END_OF_FILE:
- {
- if ( yywrap( ) )
- return EOF;
-
- if ( ! (yy_did_buffer_switch_on_eof) )
- YY_NEW_FILE;
-#ifdef __cplusplus
- return yyinput();
-#else
- return input();
-#endif
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- (yy_c_buf_p) = (yytext_ptr) + offset;
- break;
- }
- }
- }
-
- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
- *(yy_c_buf_p) = '\0'; /* preserve yytext */
- (yy_hold_char) = *++(yy_c_buf_p);
-
- return c;
-}
-#endif /* ifndef YY_NO_INPUT */
-
-/** Immediately switch to a different input stream.
- * @param input_file A readable stream.
- *
- * @note This function does not reset the start condition to @c INITIAL .
- */
- void yyrestart (FILE * input_file )
-{
-
- if ( ! YY_CURRENT_BUFFER ){
- yyensure_buffer_stack ();
- YY_CURRENT_BUFFER_LVALUE =
- yy_create_buffer(yyin,YY_BUF_SIZE );
- }
-
- yy_init_buffer(YY_CURRENT_BUFFER,input_file );
- yy_load_buffer_state( );
-}
-
-/** Switch to a different input buffer.
- * @param new_buffer The new input buffer.
- *
- */
- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
-{
-
- /* TODO. We should be able to replace this entire function body
- * with
- * yypop_buffer_state();
- * yypush_buffer_state(new_buffer);
- */
- yyensure_buffer_stack ();
- if ( YY_CURRENT_BUFFER == new_buffer )
- return;
-
- if ( YY_CURRENT_BUFFER )
- {
- /* Flush out information for old buffer. */
- *(yy_c_buf_p) = (yy_hold_char);
- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- YY_CURRENT_BUFFER_LVALUE = new_buffer;
- yy_load_buffer_state( );
-
- /* We don't actually know whether we did this switch during
- * EOF (yywrap()) processing, but the only time this flag
- * is looked at is after yywrap() is called, so it's safe
- * to go ahead and always set it.
- */
- (yy_did_buffer_switch_on_eof) = 1;
-}
-
-static void yy_load_buffer_state (void)
-{
- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
- (yy_hold_char) = *(yy_c_buf_p);
-}
-
-/** Allocate and initialize an input buffer state.
- * @param file A readable stream.
- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- *
- * @return the allocated buffer state.
- */
- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
-{
- YY_BUFFER_STATE b;
-
- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_buf_size = (yy_size_t)size;
-
- /* yy_ch_buf has to be 2 characters longer than the size given because
- * we need to put in 2 end-of-buffer characters.
- */
- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_is_our_buffer = 1;
-
- yy_init_buffer(b,file );
-
- return b;
-}
-
-/** Destroy the buffer.
- * @param b a buffer created with yy_create_buffer()
- *
- */
- void yy_delete_buffer (YY_BUFFER_STATE b )
-{
-
- if ( ! b )
- return;
-
- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-
- if ( b->yy_is_our_buffer )
- yyfree((void *) b->yy_ch_buf );
-
- yyfree((void *) b );
-}
-
-/* Initializes or reinitializes a buffer.
- * This function is sometimes called more than once on the same buffer,
- * such as during a yyrestart() or at EOF.
- */
- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
-
-{
- int oerrno = errno;
-
- yy_flush_buffer(b );
-
- b->yy_input_file = file;
- b->yy_fill_buffer = 1;
-
- /* If b is the current buffer, then yy_init_buffer was _probably_
- * called from yyrestart() or through yy_get_next_buffer.
- * In that case, we don't want to reset the lineno or column.
- */
- if (b != YY_CURRENT_BUFFER){
- b->yy_bs_lineno = 1;
- b->yy_bs_column = 0;
- }
-
- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-
- errno = oerrno;
-}
-
-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- *
- */
- void yy_flush_buffer (YY_BUFFER_STATE b )
-{
- if ( ! b )
- return;
-
- b->yy_n_chars = 0;
-
- /* We always need two end-of-buffer characters. The first causes
- * a transition to the end-of-buffer state. The second causes
- * a jam in that state.
- */
- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
- b->yy_buf_pos = &b->yy_ch_buf[0];
-
- b->yy_at_bol = 1;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- if ( b == YY_CURRENT_BUFFER )
- yy_load_buffer_state( );
-}
-
-/** Pushes the new state onto the stack. The new state becomes
- * the current state. This function will allocate the stack
- * if necessary.
- * @param new_buffer The new state.
- *
- */
-void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
-{
- if (new_buffer == NULL)
- return;
-
- yyensure_buffer_stack();
-
- /* This block is copied from yy_switch_to_buffer. */
- if ( YY_CURRENT_BUFFER )
- {
- /* Flush out information for old buffer. */
- *(yy_c_buf_p) = (yy_hold_char);
- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- /* Only push if top exists. Otherwise, replace top. */
- if (YY_CURRENT_BUFFER)
- (yy_buffer_stack_top)++;
- YY_CURRENT_BUFFER_LVALUE = new_buffer;
-
- /* copied from yy_switch_to_buffer. */
- yy_load_buffer_state( );
- (yy_did_buffer_switch_on_eof) = 1;
-}
-
-/** Removes and deletes the top of the stack, if present.
- * The next element becomes the new top.
- *
- */
-void yypop_buffer_state (void)
-{
- if (!YY_CURRENT_BUFFER)
- return;
-
- yy_delete_buffer(YY_CURRENT_BUFFER );
- YY_CURRENT_BUFFER_LVALUE = NULL;
- if ((yy_buffer_stack_top) > 0)
- --(yy_buffer_stack_top);
-
- if (YY_CURRENT_BUFFER) {
- yy_load_buffer_state( );
- (yy_did_buffer_switch_on_eof) = 1;
- }
-}
-
-/* Allocates the stack if it does not exist.
- * Guarantees space for at least one push.
- */
-static void yyensure_buffer_stack (void)
-{
- yy_size_t num_to_alloc;
-
- if (!(yy_buffer_stack)) {
-
- /* First allocation is just for 2 elements, since we don't know if this
- * scanner will even need a stack. We use 2 instead of 1 to avoid an
- * immediate realloc on the next call.
- */
- num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
- (num_to_alloc * sizeof(struct yy_buffer_state*)
- );
- if ( ! (yy_buffer_stack) )
- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
-
- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-
- (yy_buffer_stack_max) = num_to_alloc;
- (yy_buffer_stack_top) = 0;
- return;
- }
-
- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
-
- /* Increase the buffer to prepare for a possible push. */
- yy_size_t grow_size = 8 /* arbitrary grow size */;
-
- num_to_alloc = (yy_buffer_stack_max) + grow_size;
- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
- ((yy_buffer_stack),
- num_to_alloc * sizeof(struct yy_buffer_state*)
- );
- if ( ! (yy_buffer_stack) )
- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
-
- /* zero only the new slots.*/
- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
- (yy_buffer_stack_max) = num_to_alloc;
- }
-}
-
-/** Setup the input buffer state to scan directly from a user-specified character buffer.
- * @param base the character buffer
- * @param size the size in bytes of the character buffer
- *
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
-{
- YY_BUFFER_STATE b;
-
- if ( size < 2 ||
- base[size-2] != YY_END_OF_BUFFER_CHAR ||
- base[size-1] != YY_END_OF_BUFFER_CHAR )
- /* They forgot to leave room for the EOB's. */
- return 0;
-
- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
-
- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
- b->yy_buf_pos = b->yy_ch_buf = base;
- b->yy_is_our_buffer = 0;
- b->yy_input_file = 0;
- b->yy_n_chars = b->yy_buf_size;
- b->yy_is_interactive = 0;
- b->yy_at_bol = 1;
- b->yy_fill_buffer = 0;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- yy_switch_to_buffer(b );
-
- return b;
-}
-
-/** Setup the input buffer state to scan a string. The next call to yylex() will
- * scan from a @e copy of @a str.
- * @param yystr a NUL-terminated string to scan
- *
- * @return the newly allocated buffer state object.
- * @note If you want to scan bytes that may contain NUL values, then use
- * yy_scan_bytes() instead.
- */
-YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
-{
-
- return yy_scan_bytes(yystr,strlen(yystr) );
-}
-
-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
- * scan from a @e copy of @a bytes.
- * @param yybytes the byte buffer to scan
- * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
- *
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
-{
- YY_BUFFER_STATE b;
- char *buf;
- yy_size_t n;
- yy_size_t i;
-
- /* Get memory for full buffer, including space for trailing EOB's. */
- n = _yybytes_len + 2;
- buf = (char *) yyalloc(n );
- if ( ! buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
-
- for ( i = 0; i < _yybytes_len; ++i )
- buf[i] = yybytes[i];
-
- buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
-
- b = yy_scan_buffer(buf,n );
- if ( ! b )
- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
-
- /* It's okay to grow etc. this buffer, and we should throw it
- * away when we're done.
- */
- b->yy_is_our_buffer = 1;
-
- return b;
-}
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-static void yy_fatal_error (yyconst char* msg )
-{
- (void) fprintf( stderr, "%s\n", msg );
- exit( YY_EXIT_FAILURE );
-}
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- yy_size_t yyless_macro_arg = (n); \
- YY_LESS_LINENO(yyless_macro_arg);\
- yytext[yyleng] = (yy_hold_char); \
- (yy_c_buf_p) = yytext + yyless_macro_arg; \
- (yy_hold_char) = *(yy_c_buf_p); \
- *(yy_c_buf_p) = '\0'; \
- yyleng = yyless_macro_arg; \
- } \
- while ( 0 )
-
-/* Accessor methods (get/set functions) to struct members. */
-
-/** Get the current line number.
- *
- */
-int yyget_lineno (void)
-{
-
- return yylineno;
-}
-
-/** Get the input stream.
- *
- */
-FILE *yyget_in (void)
-{
- return yyin;
-}
-
-/** Get the output stream.
- *
- */
-FILE *yyget_out (void)
-{
- return yyout;
-}
-
-/** Get the length of the current token.
- *
- */
-yy_size_t yyget_leng (void)
-{
- return yyleng;
-}
-
-/** Get the current token.
- *
- */
-
-char *yyget_text (void)
-{
- return yytext;
-}
-
-/** Set the current line number.
- * @param _line_number line number
- *
- */
-void yyset_lineno (int _line_number )
-{
-
- yylineno = _line_number;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param _in_str A readable stream.
- *
- * @see yy_switch_to_buffer
- */
-void yyset_in (FILE * _in_str )
-{
- yyin = _in_str ;
-}
-
-void yyset_out (FILE * _out_str )
-{
- yyout = _out_str ;
-}
-
-int yyget_debug (void)
-{
- return yy_flex_debug;
-}
-
-void yyset_debug (int _bdebug )
-{
- yy_flex_debug = _bdebug ;
-}
-
-static int yy_init_globals (void)
-{
- /* Initialization is the same as for the non-reentrant scanner.
- * This function is called from yylex_destroy(), so don't allocate here.
- */
-
- (yy_buffer_stack) = 0;
- (yy_buffer_stack_top) = 0;
- (yy_buffer_stack_max) = 0;
- (yy_c_buf_p) = (char *) 0;
- (yy_init) = 0;
- (yy_start) = 0;
-
-/* Defined in main.c */
-#ifdef YY_STDINIT
- yyin = stdin;
- yyout = stdout;
-#else
- yyin = (FILE *) 0;
- yyout = (FILE *) 0;
-#endif
-
- /* For future reference: Set errno on error, since we are called by
- * yylex_init()
- */
- return 0;
-}
-
-/* yylex_destroy is for both reentrant and non-reentrant scanners. */
-int yylex_destroy (void)
-{
-
- /* Pop the buffer stack, destroying each element. */
- while(YY_CURRENT_BUFFER){
- yy_delete_buffer(YY_CURRENT_BUFFER );
- YY_CURRENT_BUFFER_LVALUE = NULL;
- yypop_buffer_state();
- }
-
- /* Destroy the stack itself. */
- yyfree((yy_buffer_stack) );
- (yy_buffer_stack) = NULL;
-
- /* Reset the globals. This is important in a non-reentrant scanner so the next time
- * yylex() is called, initialization will occur. */
- yy_init_globals( );
-
- return 0;
-}
-
-/*
- * Internal utility routines.
- */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
-{
-
- int i;
- for ( i = 0; i < n; ++i )
- s1[i] = s2[i];
-}
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s )
-{
- int n;
- for ( n = 0; s[n]; ++n )
- ;
-
- return n;
-}
-#endif
-
-void *yyalloc (yy_size_t size )
-{
- return (void *) malloc( size );
-}
-
-void *yyrealloc (void * ptr, yy_size_t size )
-{
-
- /* The cast to (char *) in the following accommodates both
- * implementations that use char* generic pointers, and those
- * that use void* generic pointers. It works with the latter
- * because both ANSI C and C++ allow castless assignment from
- * any pointer type to void*, and deal with argument conversions
- * as though doing an assignment.
- */
- return (void *) realloc( (char *) ptr, size );
-}
-
-void yyfree (void * ptr )
-{
- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
-}
-
-#define YYTABLES_NAME "yytables"
-
-#line 513 "util/configlexer.lex"
-
-
-
diff --git a/external/unbound/util/configlexer.lex b/external/unbound/util/configlexer.lex
deleted file mode 100644
index a6323f2c1..000000000
--- a/external/unbound/util/configlexer.lex
+++ /dev/null
@@ -1,513 +0,0 @@
-%{
-/*
- * configlexer.lex - lexical analyzer for unbound config file
- *
- * Copyright (c) 2001-2006, NLnet Labs. All rights reserved
- *
- * See LICENSE for the license.
- *
- */
-
-/* because flex keeps having sign-unsigned compare problems that are unfixed*/
-#if defined(__clang__)||(defined(__GNUC__)&&((__GNUC__ >4)||(defined(__GNUC_MINOR__)&&(__GNUC__ ==4)&&(__GNUC_MINOR__ >=2))))
-#pragma GCC diagnostic ignored "-Wsign-compare"
-#endif
-
-#include <ctype.h>
-#include <string.h>
-#include <strings.h>
-#ifdef HAVE_GLOB_H
-# include <glob.h>
-#endif
-
-#include "util/config_file.h"
-#include "util/configparser.h"
-void ub_c_error(const char *message);
-
-#if 0
-#define LEXOUT(s) printf s /* used ONLY when debugging */
-#else
-#define LEXOUT(s)
-#endif
-
-/** avoid warning in about fwrite return value */
-#define ECHO ub_c_error_msg("syntax error at text: %s", yytext)
-
-/** A parser variable, this is a statement in the config file which is
- * of the form variable: value1 value2 ... nargs is the number of values. */
-#define YDVAR(nargs, var) \
- num_args=(nargs); \
- LEXOUT(("v(%s%d) ", yytext, num_args)); \
- if(num_args > 0) { BEGIN(val); } \
- return (var);
-
-struct inc_state {
- char* filename;
- int line;
- YY_BUFFER_STATE buffer;
- struct inc_state* next;
-};
-static struct inc_state* config_include_stack = NULL;
-static int inc_depth = 0;
-static int inc_prev = 0;
-static int num_args = 0;
-
-void init_cfg_parse(void)
-{
- config_include_stack = NULL;
- inc_depth = 0;
- inc_prev = 0;
- num_args = 0;
-}
-
-static void config_start_include(const char* filename)
-{
- FILE *input;
- struct inc_state* s;
- char* nm;
- if(inc_depth++ > 100000) {
- ub_c_error_msg("too many include files");
- return;
- }
- if(*filename == '\0') {
- ub_c_error_msg("empty include file name");
- return;
- }
- s = (struct inc_state*)malloc(sizeof(*s));
- if(!s) {
- ub_c_error_msg("include %s: malloc failure", filename);
- return;
- }
- if(cfg_parser->chroot && strncmp(filename, cfg_parser->chroot,
- strlen(cfg_parser->chroot)) == 0) {
- filename += strlen(cfg_parser->chroot);
- }
- nm = strdup(filename);
- if(!nm) {
- ub_c_error_msg("include %s: strdup failure", filename);
- free(s);
- return;
- }
- input = fopen(filename, "r");
- if(!input) {
- ub_c_error_msg("cannot open include file '%s': %s",
- filename, strerror(errno));
- free(s);
- free(nm);
- return;
- }
- LEXOUT(("switch_to_include_file(%s)\n", filename));
- s->filename = cfg_parser->filename;
- s->line = cfg_parser->line;
- s->buffer = YY_CURRENT_BUFFER;
- s->next = config_include_stack;
- config_include_stack = s;
- cfg_parser->filename = nm;
- cfg_parser->line = 1;
- yy_switch_to_buffer(yy_create_buffer(input, YY_BUF_SIZE));
-}
-
-static void config_start_include_glob(const char* filename)
-{
-
- /* check for wildcards */
-#ifdef HAVE_GLOB
- glob_t g;
- size_t i;
- int r, flags;
- if(!(!strchr(filename, '*') && !strchr(filename, '?') && !strchr(filename, '[') &&
- !strchr(filename, '{') && !strchr(filename, '~'))) {
- flags = 0
-#ifdef GLOB_ERR
- | GLOB_ERR
-#endif
-#ifdef GLOB_NOSORT
- | GLOB_NOSORT
-#endif
-#ifdef GLOB_BRACE
- | GLOB_BRACE
-#endif
-#ifdef GLOB_TILDE
- | GLOB_TILDE
-#endif
- ;
- memset(&g, 0, sizeof(g));
- if(cfg_parser->chroot && strncmp(filename, cfg_parser->chroot,
- strlen(cfg_parser->chroot)) == 0) {
- filename += strlen(cfg_parser->chroot);
- }
- r = glob(filename, flags, NULL, &g);
- if(r) {
- /* some error */
- globfree(&g);
- if(r == GLOB_NOMATCH)
- return; /* no matches for pattern */
- config_start_include(filename); /* let original deal with it */
- return;
- }
- /* process files found, if any */
- for(i=0; i<(size_t)g.gl_pathc; i++) {
- config_start_include(g.gl_pathv[i]);
- }
- globfree(&g);
- return;
- }
-#endif /* HAVE_GLOB */
-
- config_start_include(filename);
-}
-
-static void config_end_include(void)
-{
- struct inc_state* s = config_include_stack;
- --inc_depth;
- if(!s) return;
- free(cfg_parser->filename);
- cfg_parser->filename = s->filename;
- cfg_parser->line = s->line;
- yy_delete_buffer(YY_CURRENT_BUFFER);
- yy_switch_to_buffer(s->buffer);
- config_include_stack = s->next;
- free(s);
-}
-
-#ifndef yy_set_bol /* compat definition, for flex 2.4.6 */
-#define yy_set_bol(at_bol) \
- { \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_ch_buf[0] = ((at_bol)?'\n':' '); \
- }
-#endif
-
-%}
-%option noinput
-%option nounput
-%{
-#ifndef YY_NO_UNPUT
-#define YY_NO_UNPUT 1
-#endif
-#ifndef YY_NO_INPUT
-#define YY_NO_INPUT 1
-#endif
-%}
-
-SPACE [ \t]
-LETTER [a-zA-Z]
-UNQUOTEDLETTER [^\'\"\n\r \t\\]|\\.
-UNQUOTEDLETTER_NOCOLON [^\:\'\"\n\r \t\\]|\\.
-NEWLINE [\r\n]
-COMMENT \#
-COLON \:
-DQANY [^\"\n\r\\]|\\.
-SQANY [^\'\n\r\\]|\\.
-
-%x quotedstring singlequotedstr include include_quoted val
-
-%%
-<INITIAL,val>{SPACE}* {
- LEXOUT(("SP ")); /* ignore */ }
-<INITIAL,val>{SPACE}*{COMMENT}.* {
- /* note that flex makes the longest match and '.' is any but not nl */
- LEXOUT(("comment(%s) ", yytext)); /* ignore */ }
-server{COLON} { YDVAR(0, VAR_SERVER) }
-qname-minimisation{COLON} { YDVAR(1, VAR_QNAME_MINIMISATION) }
-qname-minimisation-strict{COLON} { YDVAR(1, VAR_QNAME_MINIMISATION_STRICT) }
-num-threads{COLON} { YDVAR(1, VAR_NUM_THREADS) }
-verbosity{COLON} { YDVAR(1, VAR_VERBOSITY) }
-port{COLON} { YDVAR(1, VAR_PORT) }
-outgoing-range{COLON} { YDVAR(1, VAR_OUTGOING_RANGE) }
-outgoing-port-permit{COLON} { YDVAR(1, VAR_OUTGOING_PORT_PERMIT) }
-outgoing-port-avoid{COLON} { YDVAR(1, VAR_OUTGOING_PORT_AVOID) }
-outgoing-num-tcp{COLON} { YDVAR(1, VAR_OUTGOING_NUM_TCP) }
-incoming-num-tcp{COLON} { YDVAR(1, VAR_INCOMING_NUM_TCP) }
-do-ip4{COLON} { YDVAR(1, VAR_DO_IP4) }
-do-ip6{COLON} { YDVAR(1, VAR_DO_IP6) }
-prefer-ip6{COLON} { YDVAR(1, VAR_PREFER_IP6) }
-do-udp{COLON} { YDVAR(1, VAR_DO_UDP) }
-do-tcp{COLON} { YDVAR(1, VAR_DO_TCP) }
-tcp-upstream{COLON} { YDVAR(1, VAR_TCP_UPSTREAM) }
-tcp-mss{COLON} { YDVAR(1, VAR_TCP_MSS) }
-outgoing-tcp-mss{COLON} { YDVAR(1, VAR_OUTGOING_TCP_MSS) }
-ssl-upstream{COLON} { YDVAR(1, VAR_SSL_UPSTREAM) }
-ssl-service-key{COLON} { YDVAR(1, VAR_SSL_SERVICE_KEY) }
-ssl-service-pem{COLON} { YDVAR(1, VAR_SSL_SERVICE_PEM) }
-ssl-port{COLON} { YDVAR(1, VAR_SSL_PORT) }
-use-systemd{COLON} { YDVAR(1, VAR_USE_SYSTEMD) }
-do-daemonize{COLON} { YDVAR(1, VAR_DO_DAEMONIZE) }
-interface{COLON} { YDVAR(1, VAR_INTERFACE) }
-ip-address{COLON} { YDVAR(1, VAR_INTERFACE) }
-outgoing-interface{COLON} { YDVAR(1, VAR_OUTGOING_INTERFACE) }
-interface-automatic{COLON} { YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
-so-rcvbuf{COLON} { YDVAR(1, VAR_SO_RCVBUF) }
-so-sndbuf{COLON} { YDVAR(1, VAR_SO_SNDBUF) }
-so-reuseport{COLON} { YDVAR(1, VAR_SO_REUSEPORT) }
-ip-transparent{COLON} { YDVAR(1, VAR_IP_TRANSPARENT) }
-ip-freebind{COLON} { YDVAR(1, VAR_IP_FREEBIND) }
-chroot{COLON} { YDVAR(1, VAR_CHROOT) }
-username{COLON} { YDVAR(1, VAR_USERNAME) }
-directory{COLON} { YDVAR(1, VAR_DIRECTORY) }
-logfile{COLON} { YDVAR(1, VAR_LOGFILE) }
-pidfile{COLON} { YDVAR(1, VAR_PIDFILE) }
-root-hints{COLON} { YDVAR(1, VAR_ROOT_HINTS) }
-edns-buffer-size{COLON} { YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
-msg-buffer-size{COLON} { YDVAR(1, VAR_MSG_BUFFER_SIZE) }
-msg-cache-size{COLON} { YDVAR(1, VAR_MSG_CACHE_SIZE) }
-msg-cache-slabs{COLON} { YDVAR(1, VAR_MSG_CACHE_SLABS) }
-rrset-cache-size{COLON} { YDVAR(1, VAR_RRSET_CACHE_SIZE) }
-rrset-cache-slabs{COLON} { YDVAR(1, VAR_RRSET_CACHE_SLABS) }
-cache-max-ttl{COLON} { YDVAR(1, VAR_CACHE_MAX_TTL) }
-cache-max-negative-ttl{COLON} { YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
-cache-min-ttl{COLON} { YDVAR(1, VAR_CACHE_MIN_TTL) }
-infra-host-ttl{COLON} { YDVAR(1, VAR_INFRA_HOST_TTL) }
-infra-lame-ttl{COLON} { YDVAR(1, VAR_INFRA_LAME_TTL) }
-infra-cache-slabs{COLON} { YDVAR(1, VAR_INFRA_CACHE_SLABS) }
-infra-cache-numhosts{COLON} { YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
-infra-cache-lame-size{COLON} { YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
-infra-cache-min-rtt{COLON} { YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
-num-queries-per-thread{COLON} { YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
-jostle-timeout{COLON} { YDVAR(1, VAR_JOSTLE_TIMEOUT) }
-delay-close{COLON} { YDVAR(1, VAR_DELAY_CLOSE) }
-target-fetch-policy{COLON} { YDVAR(1, VAR_TARGET_FETCH_POLICY) }
-harden-short-bufsize{COLON} { YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
-harden-large-queries{COLON} { YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
-harden-glue{COLON} { YDVAR(1, VAR_HARDEN_GLUE) }
-harden-dnssec-stripped{COLON} { YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
-harden-below-nxdomain{COLON} { YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
-harden-referral-path{COLON} { YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
-harden-algo-downgrade{COLON} { YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
-use-caps-for-id{COLON} { YDVAR(1, VAR_USE_CAPS_FOR_ID) }
-caps-whitelist{COLON} { YDVAR(1, VAR_CAPS_WHITELIST) }
-unwanted-reply-threshold{COLON} { YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
-private-address{COLON} { YDVAR(1, VAR_PRIVATE_ADDRESS) }
-private-domain{COLON} { YDVAR(1, VAR_PRIVATE_DOMAIN) }
-prefetch-key{COLON} { YDVAR(1, VAR_PREFETCH_KEY) }
-prefetch{COLON} { YDVAR(1, VAR_PREFETCH) }
-stub-zone{COLON} { YDVAR(0, VAR_STUB_ZONE) }
-name{COLON} { YDVAR(1, VAR_NAME) }
-stub-addr{COLON} { YDVAR(1, VAR_STUB_ADDR) }
-stub-host{COLON} { YDVAR(1, VAR_STUB_HOST) }
-stub-prime{COLON} { YDVAR(1, VAR_STUB_PRIME) }
-stub-first{COLON} { YDVAR(1, VAR_STUB_FIRST) }
-stub-ssl-upstream{COLON} { YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
-forward-zone{COLON} { YDVAR(0, VAR_FORWARD_ZONE) }
-forward-addr{COLON} { YDVAR(1, VAR_FORWARD_ADDR) }
-forward-host{COLON} { YDVAR(1, VAR_FORWARD_HOST) }
-forward-first{COLON} { YDVAR(1, VAR_FORWARD_FIRST) }
-forward-ssl-upstream{COLON} { YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
-view{COLON} { YDVAR(0, VAR_VIEW) }
-view-first{COLON} { YDVAR(1, VAR_VIEW_FIRST) }
-do-not-query-address{COLON} { YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
-do-not-query-localhost{COLON} { YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
-access-control{COLON} { YDVAR(2, VAR_ACCESS_CONTROL) }
-send-client-subnet{COLON} { YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
-client-subnet-always-forward{COLON} { YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
-client-subnet-opcode{COLON} { YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
-max-client-subnet-ipv4{COLON} { YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
-max-client-subnet-ipv6{COLON} { YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
-hide-identity{COLON} { YDVAR(1, VAR_HIDE_IDENTITY) }
-hide-version{COLON} { YDVAR(1, VAR_HIDE_VERSION) }
-hide-trustanchor{COLON} { YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
-identity{COLON} { YDVAR(1, VAR_IDENTITY) }
-version{COLON} { YDVAR(1, VAR_VERSION) }
-module-config{COLON} { YDVAR(1, VAR_MODULE_CONF) }
-dlv-anchor{COLON} { YDVAR(1, VAR_DLV_ANCHOR) }
-dlv-anchor-file{COLON} { YDVAR(1, VAR_DLV_ANCHOR_FILE) }
-trust-anchor-file{COLON} { YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
-auto-trust-anchor-file{COLON} { YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
-trusted-keys-file{COLON} { YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
-trust-anchor{COLON} { YDVAR(1, VAR_TRUST_ANCHOR) }
-val-override-date{COLON} { YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
-val-sig-skew-min{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
-val-sig-skew-max{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
-val-bogus-ttl{COLON} { YDVAR(1, VAR_BOGUS_TTL) }
-val-clean-additional{COLON} { YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
-val-permissive-mode{COLON} { YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
-ignore-cd-flag{COLON} { YDVAR(1, VAR_IGNORE_CD_FLAG) }
-serve-expired{COLON} { YDVAR(1, VAR_SERVE_EXPIRED) }
-fake-dsa{COLON} { YDVAR(1, VAR_FAKE_DSA) }
-fake-sha1{COLON} { YDVAR(1, VAR_FAKE_SHA1) }
-val-log-level{COLON} { YDVAR(1, VAR_VAL_LOG_LEVEL) }
-key-cache-size{COLON} { YDVAR(1, VAR_KEY_CACHE_SIZE) }
-key-cache-slabs{COLON} { YDVAR(1, VAR_KEY_CACHE_SLABS) }
-neg-cache-size{COLON} { YDVAR(1, VAR_NEG_CACHE_SIZE) }
-val-nsec3-keysize-iterations{COLON} {
- YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
-add-holddown{COLON} { YDVAR(1, VAR_ADD_HOLDDOWN) }
-del-holddown{COLON} { YDVAR(1, VAR_DEL_HOLDDOWN) }
-keep-missing{COLON} { YDVAR(1, VAR_KEEP_MISSING) }
-permit-small-holddown{COLON} { YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
-use-syslog{COLON} { YDVAR(1, VAR_USE_SYSLOG) }
-log-identity{COLON} { YDVAR(1, VAR_LOG_IDENTITY) }
-log-time-ascii{COLON} { YDVAR(1, VAR_LOG_TIME_ASCII) }
-log-queries{COLON} { YDVAR(1, VAR_LOG_QUERIES) }
-log-replies{COLON} { YDVAR(1, VAR_LOG_REPLIES) }
-local-zone{COLON} { YDVAR(2, VAR_LOCAL_ZONE) }
-local-data{COLON} { YDVAR(1, VAR_LOCAL_DATA) }
-local-data-ptr{COLON} { YDVAR(1, VAR_LOCAL_DATA_PTR) }
-unblock-lan-zones{COLON} { YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
-insecure-lan-zones{COLON} { YDVAR(1, VAR_INSECURE_LAN_ZONES) }
-statistics-interval{COLON} { YDVAR(1, VAR_STATISTICS_INTERVAL) }
-statistics-cumulative{COLON} { YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
-extended-statistics{COLON} { YDVAR(1, VAR_EXTENDED_STATISTICS) }
-shm-enable{COLON} { YDVAR(1, VAR_SHM_ENABLE) }
-shm-key{COLON} { YDVAR(1, VAR_SHM_KEY) }
-remote-control{COLON} { YDVAR(0, VAR_REMOTE_CONTROL) }
-control-enable{COLON} { YDVAR(1, VAR_CONTROL_ENABLE) }
-control-interface{COLON} { YDVAR(1, VAR_CONTROL_INTERFACE) }
-control-port{COLON} { YDVAR(1, VAR_CONTROL_PORT) }
-control-use-cert{COLON} { YDVAR(1, VAR_CONTROL_USE_CERT) }
-server-key-file{COLON} { YDVAR(1, VAR_SERVER_KEY_FILE) }
-server-cert-file{COLON} { YDVAR(1, VAR_SERVER_CERT_FILE) }
-control-key-file{COLON} { YDVAR(1, VAR_CONTROL_KEY_FILE) }
-control-cert-file{COLON} { YDVAR(1, VAR_CONTROL_CERT_FILE) }
-python-script{COLON} { YDVAR(1, VAR_PYTHON_SCRIPT) }
-python{COLON} { YDVAR(0, VAR_PYTHON) }
-domain-insecure{COLON} { YDVAR(1, VAR_DOMAIN_INSECURE) }
-minimal-responses{COLON} { YDVAR(1, VAR_MINIMAL_RESPONSES) }
-rrset-roundrobin{COLON} { YDVAR(1, VAR_RRSET_ROUNDROBIN) }
-max-udp-size{COLON} { YDVAR(1, VAR_MAX_UDP_SIZE) }
-dns64-prefix{COLON} { YDVAR(1, VAR_DNS64_PREFIX) }
-dns64-synthall{COLON} { YDVAR(1, VAR_DNS64_SYNTHALL) }
-define-tag{COLON} { YDVAR(1, VAR_DEFINE_TAG) }
-local-zone-tag{COLON} { YDVAR(2, VAR_LOCAL_ZONE_TAG) }
-access-control-tag{COLON} { YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
-access-control-tag-action{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
-access-control-tag-data{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
-access-control-view{COLON} { YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
-local-zone-override{COLON} { YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
-dnstap{COLON} { YDVAR(0, VAR_DNSTAP) }
-dnstap-enable{COLON} { YDVAR(1, VAR_DNSTAP_ENABLE) }
-dnstap-socket-path{COLON} { YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
-dnstap-send-identity{COLON} { YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
-dnstap-send-version{COLON} { YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
-dnstap-identity{COLON} { YDVAR(1, VAR_DNSTAP_IDENTITY) }
-dnstap-version{COLON} { YDVAR(1, VAR_DNSTAP_VERSION) }
-dnstap-log-resolver-query-messages{COLON} {
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
-dnstap-log-resolver-response-messages{COLON} {
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
-dnstap-log-client-query-messages{COLON} {
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
-dnstap-log-client-response-messages{COLON} {
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
-dnstap-log-forwarder-query-messages{COLON} {
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
-dnstap-log-forwarder-response-messages{COLON} {
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
-disable-dnssec-lame-check{COLON} { YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
-ip-ratelimit{COLON} { YDVAR(1, VAR_IP_RATELIMIT) }
-ratelimit{COLON} { YDVAR(1, VAR_RATELIMIT) }
-ip-ratelimit-slabs{COLON} { YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
-ratelimit-slabs{COLON} { YDVAR(1, VAR_RATELIMIT_SLABS) }
-ip-ratelimit-size{COLON} { YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
-ratelimit-size{COLON} { YDVAR(1, VAR_RATELIMIT_SIZE) }
-ratelimit-for-domain{COLON} { YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
-ratelimit-below-domain{COLON} { YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
-ip-ratelimit-factor{COLON} { YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
-ratelimit-factor{COLON} { YDVAR(1, VAR_RATELIMIT_FACTOR) }
-response-ip-tag{COLON} { YDVAR(2, VAR_RESPONSE_IP_TAG) }
-response-ip{COLON} { YDVAR(2, VAR_RESPONSE_IP) }
-response-ip-data{COLON} { YDVAR(2, VAR_RESPONSE_IP_DATA) }
-dnscrypt{COLON} { YDVAR(0, VAR_DNSCRYPT) }
-dnscrypt-enable{COLON} { YDVAR(1, VAR_DNSCRYPT_ENABLE) }
-dnscrypt-port{COLON} { YDVAR(1, VAR_DNSCRYPT_PORT) }
-dnscrypt-provider{COLON} { YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
-dnscrypt-secret-key{COLON} { YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
-dnscrypt-provider-cert{COLON} { YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
-<INITIAL,val>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; }
-
- /* Quoted strings. Strip leading and ending quotes */
-<val>\" { BEGIN(quotedstring); LEXOUT(("QS ")); }
-<quotedstring><<EOF>> {
- yyerror("EOF inside quoted string");
- if(--num_args == 0) { BEGIN(INITIAL); }
- else { BEGIN(val); }
-}
-<quotedstring>{DQANY}* { LEXOUT(("STR(%s) ", yytext)); yymore(); }
-<quotedstring>{NEWLINE} { yyerror("newline inside quoted string, no end \"");
- cfg_parser->line++; BEGIN(INITIAL); }
-<quotedstring>\" {
- LEXOUT(("QE "));
- if(--num_args == 0) { BEGIN(INITIAL); }
- else { BEGIN(val); }
- yytext[yyleng - 1] = '\0';
- yylval.str = strdup(yytext);
- if(!yylval.str)
- yyerror("out of memory");
- return STRING_ARG;
-}
-
- /* Single Quoted strings. Strip leading and ending quotes */
-<val>\' { BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
-<singlequotedstr><<EOF>> {
- yyerror("EOF inside quoted string");
- if(--num_args == 0) { BEGIN(INITIAL); }
- else { BEGIN(val); }
-}
-<singlequotedstr>{SQANY}* { LEXOUT(("STR(%s) ", yytext)); yymore(); }
-<singlequotedstr>{NEWLINE} { yyerror("newline inside quoted string, no end '");
- cfg_parser->line++; BEGIN(INITIAL); }
-<singlequotedstr>\' {
- LEXOUT(("SQE "));
- if(--num_args == 0) { BEGIN(INITIAL); }
- else { BEGIN(val); }
- yytext[yyleng - 1] = '\0';
- yylval.str = strdup(yytext);
- if(!yylval.str)
- yyerror("out of memory");
- return STRING_ARG;
-}
-
- /* include: directive */
-<INITIAL,val>include{COLON} {
- LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
-<include><<EOF>> {
- yyerror("EOF inside include directive");
- BEGIN(inc_prev);
-}
-<include>{SPACE}* { LEXOUT(("ISP ")); /* ignore */ }
-<include>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++;}
-<include>\" { LEXOUT(("IQS ")); BEGIN(include_quoted); }
-<include>{UNQUOTEDLETTER}* {
- LEXOUT(("Iunquotedstr(%s) ", yytext));
- config_start_include_glob(yytext);
- BEGIN(inc_prev);
-}
-<include_quoted><<EOF>> {
- yyerror("EOF inside quoted string");
- BEGIN(inc_prev);
-}
-<include_quoted>{DQANY}* { LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
-<include_quoted>{NEWLINE} { yyerror("newline before \" in include name");
- cfg_parser->line++; BEGIN(inc_prev); }
-<include_quoted>\" {
- LEXOUT(("IQE "));
- yytext[yyleng - 1] = '\0';
- config_start_include_glob(yytext);
- BEGIN(inc_prev);
-}
-<INITIAL,val><<EOF>> {
- LEXOUT(("LEXEOF "));
- yy_set_bol(1); /* Set beginning of line, so "^" rules match. */
- if (!config_include_stack) {
- yyterminate();
- } else {
- fclose(yyin);
- config_end_include();
- }
-}
-
-<val>{UNQUOTEDLETTER}* { LEXOUT(("unquotedstr(%s) ", yytext));
- if(--num_args == 0) { BEGIN(INITIAL); }
- yylval.str = strdup(yytext); return STRING_ARG; }
-
-{UNQUOTEDLETTER_NOCOLON}* {
- ub_c_error_msg("unknown keyword '%s'", yytext);
- }
-
-<*>. {
- ub_c_error_msg("stray '%s'", yytext);
- }
-
-%%
diff --git a/external/unbound/util/configparser.c b/external/unbound/util/configparser.c
deleted file mode 100644
index f70b948b7..000000000
--- a/external/unbound/util/configparser.c
+++ /dev/null
@@ -1,5131 +0,0 @@
-/* A Bison parser, made by GNU Bison 3.0.4. */
-
-/* Bison implementation for Yacc-like parsers in C
-
- Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
- simplifying the original so-called "semantic" parser. */
-
-/* All symbols defined below should begin with yy or YY, to avoid
- infringing on user name space. This should be done even for local
- variables, as they might otherwise be expanded by user macros.
- There are some unavoidable exceptions within include files to
- define necessary library symbols; they are noted "INFRINGES ON
- USER NAME SPACE" below. */
-
-/* Identify Bison output. */
-#define YYBISON 1
-
-/* Bison version. */
-#define YYBISON_VERSION "3.0.4"
-
-/* Skeleton name. */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers. */
-#define YYPURE 0
-
-/* Push parsers. */
-#define YYPUSH 0
-
-/* Pull parsers. */
-#define YYPULL 1
-
-
-
-
-/* Copy the first part of user declarations. */
-#line 38 "util/configparser.y" /* yacc.c:339 */
-
-#include "config.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#include "util/configyyrename.h"
-#include "util/config_file.h"
-#include "util/net_help.h"
-
-int ub_c_lex(void);
-void ub_c_error(const char *message);
-
-static void validate_respip_action(const char* action);
-
-/* these need to be global, otherwise they cannot be used inside yacc */
-extern struct config_parser_state* cfg_parser;
-
-#if 0
-#define OUTYY(s) printf s /* used ONLY when debugging */
-#else
-#define OUTYY(s)
-#endif
-
-
-#line 95 "util/configparser.c" /* yacc.c:339 */
-
-# ifndef YY_NULLPTR
-# if defined __cplusplus && 201103L <= __cplusplus
-# define YY_NULLPTR nullptr
-# else
-# define YY_NULLPTR 0
-# endif
-# endif
-
-/* Enabling verbose error messages. */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-
-/* In a future release of Bison, this section will be replaced
- by #include "configparser.h". */
-#ifndef YY_YY_UTIL_CONFIGPARSER_H_INCLUDED
-# define YY_YY_UTIL_CONFIGPARSER_H_INCLUDED
-/* Debug traces. */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-#if YYDEBUG
-extern int yydebug;
-#endif
-
-/* Token type. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- enum yytokentype
- {
- SPACE = 258,
- LETTER = 259,
- NEWLINE = 260,
- COMMENT = 261,
- COLON = 262,
- ANY = 263,
- ZONESTR = 264,
- STRING_ARG = 265,
- VAR_SERVER = 266,
- VAR_VERBOSITY = 267,
- VAR_NUM_THREADS = 268,
- VAR_PORT = 269,
- VAR_OUTGOING_RANGE = 270,
- VAR_INTERFACE = 271,
- VAR_DO_IP4 = 272,
- VAR_DO_IP6 = 273,
- VAR_PREFER_IP6 = 274,
- VAR_DO_UDP = 275,
- VAR_DO_TCP = 276,
- VAR_TCP_MSS = 277,
- VAR_OUTGOING_TCP_MSS = 278,
- VAR_CHROOT = 279,
- VAR_USERNAME = 280,
- VAR_DIRECTORY = 281,
- VAR_LOGFILE = 282,
- VAR_PIDFILE = 283,
- VAR_MSG_CACHE_SIZE = 284,
- VAR_MSG_CACHE_SLABS = 285,
- VAR_NUM_QUERIES_PER_THREAD = 286,
- VAR_RRSET_CACHE_SIZE = 287,
- VAR_RRSET_CACHE_SLABS = 288,
- VAR_OUTGOING_NUM_TCP = 289,
- VAR_INFRA_HOST_TTL = 290,
- VAR_INFRA_LAME_TTL = 291,
- VAR_INFRA_CACHE_SLABS = 292,
- VAR_INFRA_CACHE_NUMHOSTS = 293,
- VAR_INFRA_CACHE_LAME_SIZE = 294,
- VAR_NAME = 295,
- VAR_STUB_ZONE = 296,
- VAR_STUB_HOST = 297,
- VAR_STUB_ADDR = 298,
- VAR_TARGET_FETCH_POLICY = 299,
- VAR_HARDEN_SHORT_BUFSIZE = 300,
- VAR_HARDEN_LARGE_QUERIES = 301,
- VAR_FORWARD_ZONE = 302,
- VAR_FORWARD_HOST = 303,
- VAR_FORWARD_ADDR = 304,
- VAR_DO_NOT_QUERY_ADDRESS = 305,
- VAR_HIDE_IDENTITY = 306,
- VAR_HIDE_VERSION = 307,
- VAR_IDENTITY = 308,
- VAR_VERSION = 309,
- VAR_HARDEN_GLUE = 310,
- VAR_MODULE_CONF = 311,
- VAR_TRUST_ANCHOR_FILE = 312,
- VAR_TRUST_ANCHOR = 313,
- VAR_VAL_OVERRIDE_DATE = 314,
- VAR_BOGUS_TTL = 315,
- VAR_VAL_CLEAN_ADDITIONAL = 316,
- VAR_VAL_PERMISSIVE_MODE = 317,
- VAR_INCOMING_NUM_TCP = 318,
- VAR_MSG_BUFFER_SIZE = 319,
- VAR_KEY_CACHE_SIZE = 320,
- VAR_KEY_CACHE_SLABS = 321,
- VAR_TRUSTED_KEYS_FILE = 322,
- VAR_VAL_NSEC3_KEYSIZE_ITERATIONS = 323,
- VAR_USE_SYSLOG = 324,
- VAR_OUTGOING_INTERFACE = 325,
- VAR_ROOT_HINTS = 326,
- VAR_DO_NOT_QUERY_LOCALHOST = 327,
- VAR_CACHE_MAX_TTL = 328,
- VAR_HARDEN_DNSSEC_STRIPPED = 329,
- VAR_ACCESS_CONTROL = 330,
- VAR_LOCAL_ZONE = 331,
- VAR_LOCAL_DATA = 332,
- VAR_INTERFACE_AUTOMATIC = 333,
- VAR_STATISTICS_INTERVAL = 334,
- VAR_DO_DAEMONIZE = 335,
- VAR_USE_CAPS_FOR_ID = 336,
- VAR_STATISTICS_CUMULATIVE = 337,
- VAR_OUTGOING_PORT_PERMIT = 338,
- VAR_OUTGOING_PORT_AVOID = 339,
- VAR_DLV_ANCHOR_FILE = 340,
- VAR_DLV_ANCHOR = 341,
- VAR_NEG_CACHE_SIZE = 342,
- VAR_HARDEN_REFERRAL_PATH = 343,
- VAR_PRIVATE_ADDRESS = 344,
- VAR_PRIVATE_DOMAIN = 345,
- VAR_REMOTE_CONTROL = 346,
- VAR_CONTROL_ENABLE = 347,
- VAR_CONTROL_INTERFACE = 348,
- VAR_CONTROL_PORT = 349,
- VAR_SERVER_KEY_FILE = 350,
- VAR_SERVER_CERT_FILE = 351,
- VAR_CONTROL_KEY_FILE = 352,
- VAR_CONTROL_CERT_FILE = 353,
- VAR_CONTROL_USE_CERT = 354,
- VAR_EXTENDED_STATISTICS = 355,
- VAR_LOCAL_DATA_PTR = 356,
- VAR_JOSTLE_TIMEOUT = 357,
- VAR_STUB_PRIME = 358,
- VAR_UNWANTED_REPLY_THRESHOLD = 359,
- VAR_LOG_TIME_ASCII = 360,
- VAR_DOMAIN_INSECURE = 361,
- VAR_PYTHON = 362,
- VAR_PYTHON_SCRIPT = 363,
- VAR_VAL_SIG_SKEW_MIN = 364,
- VAR_VAL_SIG_SKEW_MAX = 365,
- VAR_CACHE_MIN_TTL = 366,
- VAR_VAL_LOG_LEVEL = 367,
- VAR_AUTO_TRUST_ANCHOR_FILE = 368,
- VAR_KEEP_MISSING = 369,
- VAR_ADD_HOLDDOWN = 370,
- VAR_DEL_HOLDDOWN = 371,
- VAR_SO_RCVBUF = 372,
- VAR_EDNS_BUFFER_SIZE = 373,
- VAR_PREFETCH = 374,
- VAR_PREFETCH_KEY = 375,
- VAR_SO_SNDBUF = 376,
- VAR_SO_REUSEPORT = 377,
- VAR_HARDEN_BELOW_NXDOMAIN = 378,
- VAR_IGNORE_CD_FLAG = 379,
- VAR_LOG_QUERIES = 380,
- VAR_LOG_REPLIES = 381,
- VAR_TCP_UPSTREAM = 382,
- VAR_SSL_UPSTREAM = 383,
- VAR_SSL_SERVICE_KEY = 384,
- VAR_SSL_SERVICE_PEM = 385,
- VAR_SSL_PORT = 386,
- VAR_FORWARD_FIRST = 387,
- VAR_STUB_SSL_UPSTREAM = 388,
- VAR_FORWARD_SSL_UPSTREAM = 389,
- VAR_STUB_FIRST = 390,
- VAR_MINIMAL_RESPONSES = 391,
- VAR_RRSET_ROUNDROBIN = 392,
- VAR_MAX_UDP_SIZE = 393,
- VAR_DELAY_CLOSE = 394,
- VAR_UNBLOCK_LAN_ZONES = 395,
- VAR_INSECURE_LAN_ZONES = 396,
- VAR_INFRA_CACHE_MIN_RTT = 397,
- VAR_DNS64_PREFIX = 398,
- VAR_DNS64_SYNTHALL = 399,
- VAR_DNSTAP = 400,
- VAR_DNSTAP_ENABLE = 401,
- VAR_DNSTAP_SOCKET_PATH = 402,
- VAR_DNSTAP_SEND_IDENTITY = 403,
- VAR_DNSTAP_SEND_VERSION = 404,
- VAR_DNSTAP_IDENTITY = 405,
- VAR_DNSTAP_VERSION = 406,
- VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES = 407,
- VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES = 408,
- VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES = 409,
- VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES = 410,
- VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES = 411,
- VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES = 412,
- VAR_RESPONSE_IP_TAG = 413,
- VAR_RESPONSE_IP = 414,
- VAR_RESPONSE_IP_DATA = 415,
- VAR_HARDEN_ALGO_DOWNGRADE = 416,
- VAR_IP_TRANSPARENT = 417,
- VAR_DISABLE_DNSSEC_LAME_CHECK = 418,
- VAR_IP_RATELIMIT = 419,
- VAR_IP_RATELIMIT_SLABS = 420,
- VAR_IP_RATELIMIT_SIZE = 421,
- VAR_RATELIMIT = 422,
- VAR_RATELIMIT_SLABS = 423,
- VAR_RATELIMIT_SIZE = 424,
- VAR_RATELIMIT_FOR_DOMAIN = 425,
- VAR_RATELIMIT_BELOW_DOMAIN = 426,
- VAR_IP_RATELIMIT_FACTOR = 427,
- VAR_RATELIMIT_FACTOR = 428,
- VAR_SEND_CLIENT_SUBNET = 429,
- VAR_CLIENT_SUBNET_ALWAYS_FORWARD = 430,
- VAR_CLIENT_SUBNET_OPCODE = 431,
- VAR_MAX_CLIENT_SUBNET_IPV4 = 432,
- VAR_MAX_CLIENT_SUBNET_IPV6 = 433,
- VAR_CAPS_WHITELIST = 434,
- VAR_CACHE_MAX_NEGATIVE_TTL = 435,
- VAR_PERMIT_SMALL_HOLDDOWN = 436,
- VAR_QNAME_MINIMISATION = 437,
- VAR_QNAME_MINIMISATION_STRICT = 438,
- VAR_IP_FREEBIND = 439,
- VAR_DEFINE_TAG = 440,
- VAR_LOCAL_ZONE_TAG = 441,
- VAR_ACCESS_CONTROL_TAG = 442,
- VAR_LOCAL_ZONE_OVERRIDE = 443,
- VAR_ACCESS_CONTROL_TAG_ACTION = 444,
- VAR_ACCESS_CONTROL_TAG_DATA = 445,
- VAR_VIEW = 446,
- VAR_ACCESS_CONTROL_VIEW = 447,
- VAR_VIEW_FIRST = 448,
- VAR_SERVE_EXPIRED = 449,
- VAR_FAKE_DSA = 450,
- VAR_FAKE_SHA1 = 451,
- VAR_LOG_IDENTITY = 452,
- VAR_HIDE_TRUSTANCHOR = 453,
- VAR_USE_SYSTEMD = 454,
- VAR_SHM_ENABLE = 455,
- VAR_SHM_KEY = 456,
- VAR_DNSCRYPT = 457,
- VAR_DNSCRYPT_ENABLE = 458,
- VAR_DNSCRYPT_PORT = 459,
- VAR_DNSCRYPT_PROVIDER = 460,
- VAR_DNSCRYPT_SECRET_KEY = 461,
- VAR_DNSCRYPT_PROVIDER_CERT = 462
- };
-#endif
-/* Tokens. */
-#define SPACE 258
-#define LETTER 259
-#define NEWLINE 260
-#define COMMENT 261
-#define COLON 262
-#define ANY 263
-#define ZONESTR 264
-#define STRING_ARG 265
-#define VAR_SERVER 266
-#define VAR_VERBOSITY 267
-#define VAR_NUM_THREADS 268
-#define VAR_PORT 269
-#define VAR_OUTGOING_RANGE 270
-#define VAR_INTERFACE 271
-#define VAR_DO_IP4 272
-#define VAR_DO_IP6 273
-#define VAR_PREFER_IP6 274
-#define VAR_DO_UDP 275
-#define VAR_DO_TCP 276
-#define VAR_TCP_MSS 277
-#define VAR_OUTGOING_TCP_MSS 278
-#define VAR_CHROOT 279
-#define VAR_USERNAME 280
-#define VAR_DIRECTORY 281
-#define VAR_LOGFILE 282
-#define VAR_PIDFILE 283
-#define VAR_MSG_CACHE_SIZE 284
-#define VAR_MSG_CACHE_SLABS 285
-#define VAR_NUM_QUERIES_PER_THREAD 286
-#define VAR_RRSET_CACHE_SIZE 287
-#define VAR_RRSET_CACHE_SLABS 288
-#define VAR_OUTGOING_NUM_TCP 289
-#define VAR_INFRA_HOST_TTL 290
-#define VAR_INFRA_LAME_TTL 291
-#define VAR_INFRA_CACHE_SLABS 292
-#define VAR_INFRA_CACHE_NUMHOSTS 293
-#define VAR_INFRA_CACHE_LAME_SIZE 294
-#define VAR_NAME 295
-#define VAR_STUB_ZONE 296
-#define VAR_STUB_HOST 297
-#define VAR_STUB_ADDR 298
-#define VAR_TARGET_FETCH_POLICY 299
-#define VAR_HARDEN_SHORT_BUFSIZE 300
-#define VAR_HARDEN_LARGE_QUERIES 301
-#define VAR_FORWARD_ZONE 302
-#define VAR_FORWARD_HOST 303
-#define VAR_FORWARD_ADDR 304
-#define VAR_DO_NOT_QUERY_ADDRESS 305
-#define VAR_HIDE_IDENTITY 306
-#define VAR_HIDE_VERSION 307
-#define VAR_IDENTITY 308
-#define VAR_VERSION 309
-#define VAR_HARDEN_GLUE 310
-#define VAR_MODULE_CONF 311
-#define VAR_TRUST_ANCHOR_FILE 312
-#define VAR_TRUST_ANCHOR 313
-#define VAR_VAL_OVERRIDE_DATE 314
-#define VAR_BOGUS_TTL 315
-#define VAR_VAL_CLEAN_ADDITIONAL 316
-#define VAR_VAL_PERMISSIVE_MODE 317
-#define VAR_INCOMING_NUM_TCP 318
-#define VAR_MSG_BUFFER_SIZE 319
-#define VAR_KEY_CACHE_SIZE 320
-#define VAR_KEY_CACHE_SLABS 321
-#define VAR_TRUSTED_KEYS_FILE 322
-#define VAR_VAL_NSEC3_KEYSIZE_ITERATIONS 323
-#define VAR_USE_SYSLOG 324
-#define VAR_OUTGOING_INTERFACE 325
-#define VAR_ROOT_HINTS 326
-#define VAR_DO_NOT_QUERY_LOCALHOST 327
-#define VAR_CACHE_MAX_TTL 328
-#define VAR_HARDEN_DNSSEC_STRIPPED 329
-#define VAR_ACCESS_CONTROL 330
-#define VAR_LOCAL_ZONE 331
-#define VAR_LOCAL_DATA 332
-#define VAR_INTERFACE_AUTOMATIC 333
-#define VAR_STATISTICS_INTERVAL 334
-#define VAR_DO_DAEMONIZE 335
-#define VAR_USE_CAPS_FOR_ID 336
-#define VAR_STATISTICS_CUMULATIVE 337
-#define VAR_OUTGOING_PORT_PERMIT 338
-#define VAR_OUTGOING_PORT_AVOID 339
-#define VAR_DLV_ANCHOR_FILE 340
-#define VAR_DLV_ANCHOR 341
-#define VAR_NEG_CACHE_SIZE 342
-#define VAR_HARDEN_REFERRAL_PATH 343
-#define VAR_PRIVATE_ADDRESS 344
-#define VAR_PRIVATE_DOMAIN 345
-#define VAR_REMOTE_CONTROL 346
-#define VAR_CONTROL_ENABLE 347
-#define VAR_CONTROL_INTERFACE 348
-#define VAR_CONTROL_PORT 349
-#define VAR_SERVER_KEY_FILE 350
-#define VAR_SERVER_CERT_FILE 351
-#define VAR_CONTROL_KEY_FILE 352
-#define VAR_CONTROL_CERT_FILE 353
-#define VAR_CONTROL_USE_CERT 354
-#define VAR_EXTENDED_STATISTICS 355
-#define VAR_LOCAL_DATA_PTR 356
-#define VAR_JOSTLE_TIMEOUT 357
-#define VAR_STUB_PRIME 358
-#define VAR_UNWANTED_REPLY_THRESHOLD 359
-#define VAR_LOG_TIME_ASCII 360
-#define VAR_DOMAIN_INSECURE 361
-#define VAR_PYTHON 362
-#define VAR_PYTHON_SCRIPT 363
-#define VAR_VAL_SIG_SKEW_MIN 364
-#define VAR_VAL_SIG_SKEW_MAX 365
-#define VAR_CACHE_MIN_TTL 366
-#define VAR_VAL_LOG_LEVEL 367
-#define VAR_AUTO_TRUST_ANCHOR_FILE 368
-#define VAR_KEEP_MISSING 369
-#define VAR_ADD_HOLDDOWN 370
-#define VAR_DEL_HOLDDOWN 371
-#define VAR_SO_RCVBUF 372
-#define VAR_EDNS_BUFFER_SIZE 373
-#define VAR_PREFETCH 374
-#define VAR_PREFETCH_KEY 375
-#define VAR_SO_SNDBUF 376
-#define VAR_SO_REUSEPORT 377
-#define VAR_HARDEN_BELOW_NXDOMAIN 378
-#define VAR_IGNORE_CD_FLAG 379
-#define VAR_LOG_QUERIES 380
-#define VAR_LOG_REPLIES 381
-#define VAR_TCP_UPSTREAM 382
-#define VAR_SSL_UPSTREAM 383
-#define VAR_SSL_SERVICE_KEY 384
-#define VAR_SSL_SERVICE_PEM 385
-#define VAR_SSL_PORT 386
-#define VAR_FORWARD_FIRST 387
-#define VAR_STUB_SSL_UPSTREAM 388
-#define VAR_FORWARD_SSL_UPSTREAM 389
-#define VAR_STUB_FIRST 390
-#define VAR_MINIMAL_RESPONSES 391
-#define VAR_RRSET_ROUNDROBIN 392
-#define VAR_MAX_UDP_SIZE 393
-#define VAR_DELAY_CLOSE 394
-#define VAR_UNBLOCK_LAN_ZONES 395
-#define VAR_INSECURE_LAN_ZONES 396
-#define VAR_INFRA_CACHE_MIN_RTT 397
-#define VAR_DNS64_PREFIX 398
-#define VAR_DNS64_SYNTHALL 399
-#define VAR_DNSTAP 400
-#define VAR_DNSTAP_ENABLE 401
-#define VAR_DNSTAP_SOCKET_PATH 402
-#define VAR_DNSTAP_SEND_IDENTITY 403
-#define VAR_DNSTAP_SEND_VERSION 404
-#define VAR_DNSTAP_IDENTITY 405
-#define VAR_DNSTAP_VERSION 406
-#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 407
-#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 408
-#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 409
-#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 410
-#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 411
-#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 412
-#define VAR_RESPONSE_IP_TAG 413
-#define VAR_RESPONSE_IP 414
-#define VAR_RESPONSE_IP_DATA 415
-#define VAR_HARDEN_ALGO_DOWNGRADE 416
-#define VAR_IP_TRANSPARENT 417
-#define VAR_DISABLE_DNSSEC_LAME_CHECK 418
-#define VAR_IP_RATELIMIT 419
-#define VAR_IP_RATELIMIT_SLABS 420
-#define VAR_IP_RATELIMIT_SIZE 421
-#define VAR_RATELIMIT 422
-#define VAR_RATELIMIT_SLABS 423
-#define VAR_RATELIMIT_SIZE 424
-#define VAR_RATELIMIT_FOR_DOMAIN 425
-#define VAR_RATELIMIT_BELOW_DOMAIN 426
-#define VAR_IP_RATELIMIT_FACTOR 427
-#define VAR_RATELIMIT_FACTOR 428
-#define VAR_SEND_CLIENT_SUBNET 429
-#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 430
-#define VAR_CLIENT_SUBNET_OPCODE 431
-#define VAR_MAX_CLIENT_SUBNET_IPV4 432
-#define VAR_MAX_CLIENT_SUBNET_IPV6 433
-#define VAR_CAPS_WHITELIST 434
-#define VAR_CACHE_MAX_NEGATIVE_TTL 435
-#define VAR_PERMIT_SMALL_HOLDDOWN 436
-#define VAR_QNAME_MINIMISATION 437
-#define VAR_QNAME_MINIMISATION_STRICT 438
-#define VAR_IP_FREEBIND 439
-#define VAR_DEFINE_TAG 440
-#define VAR_LOCAL_ZONE_TAG 441
-#define VAR_ACCESS_CONTROL_TAG 442
-#define VAR_LOCAL_ZONE_OVERRIDE 443
-#define VAR_ACCESS_CONTROL_TAG_ACTION 444
-#define VAR_ACCESS_CONTROL_TAG_DATA 445
-#define VAR_VIEW 446
-#define VAR_ACCESS_CONTROL_VIEW 447
-#define VAR_VIEW_FIRST 448
-#define VAR_SERVE_EXPIRED 449
-#define VAR_FAKE_DSA 450
-#define VAR_FAKE_SHA1 451
-#define VAR_LOG_IDENTITY 452
-#define VAR_HIDE_TRUSTANCHOR 453
-#define VAR_USE_SYSTEMD 454
-#define VAR_SHM_ENABLE 455
-#define VAR_SHM_KEY 456
-#define VAR_DNSCRYPT 457
-#define VAR_DNSCRYPT_ENABLE 458
-#define VAR_DNSCRYPT_PORT 459
-#define VAR_DNSCRYPT_PROVIDER 460
-#define VAR_DNSCRYPT_SECRET_KEY 461
-#define VAR_DNSCRYPT_PROVIDER_CERT 462
-
-/* Value type. */
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
-union YYSTYPE
-{
-#line 66 "util/configparser.y" /* yacc.c:355 */
-
- char* str;
-
-#line 553 "util/configparser.c" /* yacc.c:355 */
-};
-
-typedef union YYSTYPE YYSTYPE;
-# define YYSTYPE_IS_TRIVIAL 1
-# define YYSTYPE_IS_DECLARED 1
-#endif
-
-
-extern YYSTYPE yylval;
-
-int yyparse (void);
-
-#endif /* !YY_YY_UTIL_CONFIGPARSER_H_INCLUDED */
-
-/* Copy the second part of user declarations. */
-
-#line 570 "util/configparser.c" /* yacc.c:358 */
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#else
-typedef signed char yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-# define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-# define YYSIZE_T size_t
-# elif ! defined YYSIZE_T
-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# else
-# define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
-# if ENABLE_NLS
-# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
-# endif
-# endif
-# ifndef YY_
-# define YY_(Msgid) Msgid
-# endif
-#endif
-
-#ifndef YY_ATTRIBUTE
-# if (defined __GNUC__ \
- && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
- || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
-# define YY_ATTRIBUTE(Spec) __attribute__(Spec)
-# else
-# define YY_ATTRIBUTE(Spec) /* empty */
-# endif
-#endif
-
-#ifndef YY_ATTRIBUTE_PURE
-# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
-#endif
-
-#ifndef YY_ATTRIBUTE_UNUSED
-# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
-#endif
-
-#if !defined _Noreturn \
- && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
-# if defined _MSC_VER && 1200 <= _MSC_VER
-# define _Noreturn __declspec (noreturn)
-# else
-# define _Noreturn YY_ATTRIBUTE ((__noreturn__))
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E. */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(E) ((void) (E))
-#else
-# define YYUSE(E) /* empty */
-#endif
-
-#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
-/* Suppress an incorrect diagnostic about yylval being uninitialized. */
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
- _Pragma ("GCC diagnostic push") \
- _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
- _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
- _Pragma ("GCC diagnostic pop")
-#else
-# define YY_INITIAL_VALUE(Value) Value
-#endif
-#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END
-#endif
-#ifndef YY_INITIAL_VALUE
-# define YY_INITIAL_VALUE(Value) /* Nothing. */
-#endif
-
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols. */
-
-# ifdef YYSTACK_USE_ALLOCA
-# if YYSTACK_USE_ALLOCA
-# ifdef __GNUC__
-# define YYSTACK_ALLOC __builtin_alloca
-# elif defined __BUILTIN_VA_ARG_INCR
-# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
-# elif defined _AIX
-# define YYSTACK_ALLOC __alloca
-# elif defined _MSC_VER
-# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
-# define alloca _alloca
-# else
-# define YYSTACK_ALLOC alloca
-# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
- /* Use EXIT_SUCCESS as a witness for stdlib.h. */
-# ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-# endif
-# endif
-# endif
-# endif
-# endif
-
-# ifdef YYSTACK_ALLOC
- /* Pacify GCC's 'empty if-body' warning. */
-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
-# ifndef YYSTACK_ALLOC_MAXIMUM
- /* The OS might guarantee only one guard page at the bottom of the stack,
- and a page size can be as small as 4096 bytes. So we cannot safely
- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
- to allow for a few compiler-allocated temporary stack slots. */
-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-# endif
-# else
-# define YYSTACK_ALLOC YYMALLOC
-# define YYSTACK_FREE YYFREE
-# ifndef YYSTACK_ALLOC_MAXIMUM
-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-# endif
-# if (defined __cplusplus && ! defined EXIT_SUCCESS \
- && ! ((defined YYMALLOC || defined malloc) \
- && (defined YYFREE || defined free)))
-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-# ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-# endif
-# endif
-# ifndef YYMALLOC
-# define YYMALLOC malloc
-# if ! defined malloc && ! defined EXIT_SUCCESS
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# ifndef YYFREE
-# define YYFREE free
-# if ! defined free && ! defined EXIT_SUCCESS
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
- && (! defined __cplusplus \
- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member. */
-union yyalloc
-{
- yytype_int16 yyss_alloc;
- YYSTYPE yyvs_alloc;
-};
-
-/* The size of the maximum gap between one aligned stack and the next. */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
- N elements. */
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
- + YYSTACK_GAP_MAXIMUM)
-
-# define YYCOPY_NEEDED 1
-
-/* Relocate STACK from its old location to the new one. The
- local variables YYSIZE and YYSTACKSIZE give the old and new number of
- elements in the stack, and YYPTR gives the new location of the
- stack. Advance YYPTR to a properly aligned location for the next
- stack. */
-# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
- do \
- { \
- YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
- Stack = &yyptr->Stack_alloc; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
- yyptr += yynewbytes / sizeof (*yyptr); \
- } \
- while (0)
-
-#endif
-
-#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
-/* Copy COUNT objects from SRC to DST. The source and destination do
- not overlap. */
-# ifndef YYCOPY
-# if defined __GNUC__ && 1 < __GNUC__
-# define YYCOPY(Dst, Src, Count) \
- __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
-# else
-# define YYCOPY(Dst, Src, Count) \
- do \
- { \
- YYSIZE_T yyi; \
- for (yyi = 0; yyi < (Count); yyi++) \
- (Dst)[yyi] = (Src)[yyi]; \
- } \
- while (0)
-# endif
-# endif
-#endif /* !YYCOPY_NEEDED */
-
-/* YYFINAL -- State number of the termination state. */
-#define YYFINAL 2
-/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 421
-
-/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 208
-/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 223
-/* YYNRULES -- Number of rules. */
-#define YYNRULES 427
-/* YYNSTATES -- Number of states. */
-#define YYNSTATES 643
-
-/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
- by yylex, with out-of-bounds checking. */
-#define YYUNDEFTOK 2
-#define YYMAXUTOK 462
-
-#define YYTRANSLATE(YYX) \
- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
- as returned by yylex, without out-of-bounds checking. */
-static const yytype_uint8 yytranslate[] =
-{
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
- 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
- 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
- 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
- 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
- 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
- 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
- 135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
- 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
- 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
- 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
- 175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
- 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
- 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
- 205, 206, 207
-};
-
-#if YYDEBUG
- /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
-static const yytype_uint16 yyrline[] =
-{
- 0, 149, 149, 149, 150, 150, 151, 151, 152, 152,
- 152, 154, 158, 163, 164, 165, 165, 165, 166, 166,
- 167, 167, 168, 168, 169, 169, 170, 170, 170, 171,
- 171, 171, 172, 172, 173, 173, 174, 174, 175, 175,
- 176, 176, 177, 177, 178, 178, 179, 179, 180, 180,
- 180, 181, 181, 181, 182, 182, 182, 183, 183, 184,
- 184, 185, 185, 186, 186, 187, 187, 187, 188, 188,
- 189, 189, 190, 190, 190, 191, 191, 192, 192, 193,
- 193, 194, 194, 194, 195, 195, 196, 196, 197, 197,
- 198, 198, 199, 199, 200, 200, 200, 201, 201, 202,
- 202, 202, 203, 203, 203, 204, 204, 204, 205, 205,
- 205, 205, 206, 206, 206, 207, 207, 207, 208, 208,
- 209, 209, 210, 210, 211, 211, 212, 212, 212, 213,
- 213, 214, 214, 215, 216, 216, 217, 217, 218, 219,
- 220, 220, 221, 221, 222, 222, 223, 223, 223, 224,
- 224, 225, 225, 226, 226, 227, 227, 228, 228, 228,
- 229, 229, 229, 230, 230, 230, 231, 233, 245, 246,
- 247, 247, 247, 247, 247, 248, 250, 262, 263, 264,
- 264, 264, 264, 265, 267, 281, 282, 283, 283, 283,
- 283, 284, 284, 284, 286, 295, 304, 315, 324, 333,
- 342, 353, 362, 374, 389, 400, 417, 434, 447, 462,
- 471, 480, 489, 498, 507, 516, 525, 534, 543, 552,
- 561, 570, 579, 588, 597, 604, 611, 620, 629, 638,
- 652, 661, 670, 679, 686, 693, 719, 727, 734, 741,
- 748, 755, 763, 771, 779, 786, 793, 802, 811, 820,
- 827, 834, 842, 850, 860, 870, 880, 893, 904, 912,
- 925, 934, 943, 952, 962, 972, 980, 993, 1002, 1010,
- 1019, 1027, 1040, 1049, 1056, 1066, 1076, 1086, 1096, 1106,
- 1116, 1126, 1136, 1143, 1150, 1157, 1166, 1175, 1184, 1191,
- 1201, 1218, 1225, 1243, 1256, 1269, 1278, 1287, 1296, 1305,
- 1315, 1325, 1334, 1343, 1356, 1369, 1378, 1385, 1394, 1403,
- 1412, 1421, 1429, 1442, 1450, 1478, 1485, 1500, 1510, 1520,
- 1527, 1534, 1543, 1557, 1576, 1595, 1607, 1619, 1631, 1642,
- 1661, 1671, 1680, 1688, 1696, 1709, 1722, 1735, 1748, 1757,
- 1766, 1776, 1786, 1796, 1803, 1810, 1819, 1829, 1839, 1849,
- 1856, 1863, 1872, 1882, 1892, 1921, 1931, 1939, 1948, 1963,
- 1972, 1977, 1978, 1979, 1979, 1979, 1980, 1980, 1980, 1981,
- 1981, 1983, 1993, 2002, 2009, 2019, 2026, 2033, 2040, 2047,
- 2052, 2053, 2054, 2054, 2055, 2055, 2056, 2056, 2057, 2058,
- 2059, 2060, 2061, 2062, 2064, 2072, 2079, 2087, 2095, 2102,
- 2109, 2118, 2127, 2136, 2145, 2154, 2163, 2168, 2169, 2170,
- 2172, 2178, 2188, 2195, 2204, 2212, 2218, 2219, 2221, 2221,
- 2221, 2222, 2222, 2224, 2233, 2243, 2250, 2257
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || 0
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-static const char *const yytname[] =
-{
- "$end", "error", "$undefined", "SPACE", "LETTER", "NEWLINE", "COMMENT",
- "COLON", "ANY", "ZONESTR", "STRING_ARG", "VAR_SERVER", "VAR_VERBOSITY",
- "VAR_NUM_THREADS", "VAR_PORT", "VAR_OUTGOING_RANGE", "VAR_INTERFACE",
- "VAR_DO_IP4", "VAR_DO_IP6", "VAR_PREFER_IP6", "VAR_DO_UDP", "VAR_DO_TCP",
- "VAR_TCP_MSS", "VAR_OUTGOING_TCP_MSS", "VAR_CHROOT", "VAR_USERNAME",
- "VAR_DIRECTORY", "VAR_LOGFILE", "VAR_PIDFILE", "VAR_MSG_CACHE_SIZE",
- "VAR_MSG_CACHE_SLABS", "VAR_NUM_QUERIES_PER_THREAD",
- "VAR_RRSET_CACHE_SIZE", "VAR_RRSET_CACHE_SLABS", "VAR_OUTGOING_NUM_TCP",
- "VAR_INFRA_HOST_TTL", "VAR_INFRA_LAME_TTL", "VAR_INFRA_CACHE_SLABS",
- "VAR_INFRA_CACHE_NUMHOSTS", "VAR_INFRA_CACHE_LAME_SIZE", "VAR_NAME",
- "VAR_STUB_ZONE", "VAR_STUB_HOST", "VAR_STUB_ADDR",
- "VAR_TARGET_FETCH_POLICY", "VAR_HARDEN_SHORT_BUFSIZE",
- "VAR_HARDEN_LARGE_QUERIES", "VAR_FORWARD_ZONE", "VAR_FORWARD_HOST",
- "VAR_FORWARD_ADDR", "VAR_DO_NOT_QUERY_ADDRESS", "VAR_HIDE_IDENTITY",
- "VAR_HIDE_VERSION", "VAR_IDENTITY", "VAR_VERSION", "VAR_HARDEN_GLUE",
- "VAR_MODULE_CONF", "VAR_TRUST_ANCHOR_FILE", "VAR_TRUST_ANCHOR",
- "VAR_VAL_OVERRIDE_DATE", "VAR_BOGUS_TTL", "VAR_VAL_CLEAN_ADDITIONAL",
- "VAR_VAL_PERMISSIVE_MODE", "VAR_INCOMING_NUM_TCP", "VAR_MSG_BUFFER_SIZE",
- "VAR_KEY_CACHE_SIZE", "VAR_KEY_CACHE_SLABS", "VAR_TRUSTED_KEYS_FILE",
- "VAR_VAL_NSEC3_KEYSIZE_ITERATIONS", "VAR_USE_SYSLOG",
- "VAR_OUTGOING_INTERFACE", "VAR_ROOT_HINTS", "VAR_DO_NOT_QUERY_LOCALHOST",
- "VAR_CACHE_MAX_TTL", "VAR_HARDEN_DNSSEC_STRIPPED", "VAR_ACCESS_CONTROL",
- "VAR_LOCAL_ZONE", "VAR_LOCAL_DATA", "VAR_INTERFACE_AUTOMATIC",
- "VAR_STATISTICS_INTERVAL", "VAR_DO_DAEMONIZE", "VAR_USE_CAPS_FOR_ID",
- "VAR_STATISTICS_CUMULATIVE", "VAR_OUTGOING_PORT_PERMIT",
- "VAR_OUTGOING_PORT_AVOID", "VAR_DLV_ANCHOR_FILE", "VAR_DLV_ANCHOR",
- "VAR_NEG_CACHE_SIZE", "VAR_HARDEN_REFERRAL_PATH", "VAR_PRIVATE_ADDRESS",
- "VAR_PRIVATE_DOMAIN", "VAR_REMOTE_CONTROL", "VAR_CONTROL_ENABLE",
- "VAR_CONTROL_INTERFACE", "VAR_CONTROL_PORT", "VAR_SERVER_KEY_FILE",
- "VAR_SERVER_CERT_FILE", "VAR_CONTROL_KEY_FILE", "VAR_CONTROL_CERT_FILE",
- "VAR_CONTROL_USE_CERT", "VAR_EXTENDED_STATISTICS", "VAR_LOCAL_DATA_PTR",
- "VAR_JOSTLE_TIMEOUT", "VAR_STUB_PRIME", "VAR_UNWANTED_REPLY_THRESHOLD",
- "VAR_LOG_TIME_ASCII", "VAR_DOMAIN_INSECURE", "VAR_PYTHON",
- "VAR_PYTHON_SCRIPT", "VAR_VAL_SIG_SKEW_MIN", "VAR_VAL_SIG_SKEW_MAX",
- "VAR_CACHE_MIN_TTL", "VAR_VAL_LOG_LEVEL", "VAR_AUTO_TRUST_ANCHOR_FILE",
- "VAR_KEEP_MISSING", "VAR_ADD_HOLDDOWN", "VAR_DEL_HOLDDOWN",
- "VAR_SO_RCVBUF", "VAR_EDNS_BUFFER_SIZE", "VAR_PREFETCH",
- "VAR_PREFETCH_KEY", "VAR_SO_SNDBUF", "VAR_SO_REUSEPORT",
- "VAR_HARDEN_BELOW_NXDOMAIN", "VAR_IGNORE_CD_FLAG", "VAR_LOG_QUERIES",
- "VAR_LOG_REPLIES", "VAR_TCP_UPSTREAM", "VAR_SSL_UPSTREAM",
- "VAR_SSL_SERVICE_KEY", "VAR_SSL_SERVICE_PEM", "VAR_SSL_PORT",
- "VAR_FORWARD_FIRST", "VAR_STUB_SSL_UPSTREAM", "VAR_FORWARD_SSL_UPSTREAM",
- "VAR_STUB_FIRST", "VAR_MINIMAL_RESPONSES", "VAR_RRSET_ROUNDROBIN",
- "VAR_MAX_UDP_SIZE", "VAR_DELAY_CLOSE", "VAR_UNBLOCK_LAN_ZONES",
- "VAR_INSECURE_LAN_ZONES", "VAR_INFRA_CACHE_MIN_RTT", "VAR_DNS64_PREFIX",
- "VAR_DNS64_SYNTHALL", "VAR_DNSTAP", "VAR_DNSTAP_ENABLE",
- "VAR_DNSTAP_SOCKET_PATH", "VAR_DNSTAP_SEND_IDENTITY",
- "VAR_DNSTAP_SEND_VERSION", "VAR_DNSTAP_IDENTITY", "VAR_DNSTAP_VERSION",
- "VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES",
- "VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES",
- "VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES",
- "VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES",
- "VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES",
- "VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES", "VAR_RESPONSE_IP_TAG",
- "VAR_RESPONSE_IP", "VAR_RESPONSE_IP_DATA", "VAR_HARDEN_ALGO_DOWNGRADE",
- "VAR_IP_TRANSPARENT", "VAR_DISABLE_DNSSEC_LAME_CHECK",
- "VAR_IP_RATELIMIT", "VAR_IP_RATELIMIT_SLABS", "VAR_IP_RATELIMIT_SIZE",
- "VAR_RATELIMIT", "VAR_RATELIMIT_SLABS", "VAR_RATELIMIT_SIZE",
- "VAR_RATELIMIT_FOR_DOMAIN", "VAR_RATELIMIT_BELOW_DOMAIN",
- "VAR_IP_RATELIMIT_FACTOR", "VAR_RATELIMIT_FACTOR",
- "VAR_SEND_CLIENT_SUBNET", "VAR_CLIENT_SUBNET_ALWAYS_FORWARD",
- "VAR_CLIENT_SUBNET_OPCODE", "VAR_MAX_CLIENT_SUBNET_IPV4",
- "VAR_MAX_CLIENT_SUBNET_IPV6", "VAR_CAPS_WHITELIST",
- "VAR_CACHE_MAX_NEGATIVE_TTL", "VAR_PERMIT_SMALL_HOLDDOWN",
- "VAR_QNAME_MINIMISATION", "VAR_QNAME_MINIMISATION_STRICT",
- "VAR_IP_FREEBIND", "VAR_DEFINE_TAG", "VAR_LOCAL_ZONE_TAG",
- "VAR_ACCESS_CONTROL_TAG", "VAR_LOCAL_ZONE_OVERRIDE",
- "VAR_ACCESS_CONTROL_TAG_ACTION", "VAR_ACCESS_CONTROL_TAG_DATA",
- "VAR_VIEW", "VAR_ACCESS_CONTROL_VIEW", "VAR_VIEW_FIRST",
- "VAR_SERVE_EXPIRED", "VAR_FAKE_DSA", "VAR_FAKE_SHA1", "VAR_LOG_IDENTITY",
- "VAR_HIDE_TRUSTANCHOR", "VAR_USE_SYSTEMD", "VAR_SHM_ENABLE",
- "VAR_SHM_KEY", "VAR_DNSCRYPT", "VAR_DNSCRYPT_ENABLE",
- "VAR_DNSCRYPT_PORT", "VAR_DNSCRYPT_PROVIDER", "VAR_DNSCRYPT_SECRET_KEY",
- "VAR_DNSCRYPT_PROVIDER_CERT", "$accept", "toplevelvars", "toplevelvar",
- "serverstart", "contents_server", "content_server", "stubstart",
- "contents_stub", "content_stub", "forwardstart", "contents_forward",
- "content_forward", "viewstart", "contents_view", "content_view",
- "server_num_threads", "server_verbosity", "server_statistics_interval",
- "server_statistics_cumulative", "server_extended_statistics",
- "server_shm_enable", "server_shm_key", "server_port",
- "server_send_client_subnet", "server_client_subnet_always_forward",
- "server_client_subnet_opcode", "server_max_client_subnet_ipv4",
- "server_max_client_subnet_ipv6", "server_interface",
- "server_outgoing_interface", "server_outgoing_range",
- "server_outgoing_port_permit", "server_outgoing_port_avoid",
- "server_outgoing_num_tcp", "server_incoming_num_tcp",
- "server_interface_automatic", "server_do_ip4", "server_do_ip6",
- "server_do_udp", "server_do_tcp", "server_prefer_ip6", "server_tcp_mss",
- "server_outgoing_tcp_mss", "server_tcp_upstream", "server_ssl_upstream",
- "server_ssl_service_key", "server_ssl_service_pem", "server_ssl_port",
- "server_use_systemd", "server_do_daemonize", "server_use_syslog",
- "server_log_time_ascii", "server_log_queries", "server_log_replies",
- "server_chroot", "server_username", "server_directory", "server_logfile",
- "server_pidfile", "server_root_hints", "server_dlv_anchor_file",
- "server_dlv_anchor", "server_auto_trust_anchor_file",
- "server_trust_anchor_file", "server_trusted_keys_file",
- "server_trust_anchor", "server_domain_insecure", "server_hide_identity",
- "server_hide_version", "server_hide_trustanchor", "server_identity",
- "server_version", "server_so_rcvbuf", "server_so_sndbuf",
- "server_so_reuseport", "server_ip_transparent", "server_ip_freebind",
- "server_edns_buffer_size", "server_msg_buffer_size",
- "server_msg_cache_size", "server_msg_cache_slabs",
- "server_num_queries_per_thread", "server_jostle_timeout",
- "server_delay_close", "server_unblock_lan_zones",
- "server_insecure_lan_zones", "server_rrset_cache_size",
- "server_rrset_cache_slabs", "server_infra_host_ttl",
- "server_infra_lame_ttl", "server_infra_cache_numhosts",
- "server_infra_cache_lame_size", "server_infra_cache_slabs",
- "server_infra_cache_min_rtt", "server_target_fetch_policy",
- "server_harden_short_bufsize", "server_harden_large_queries",
- "server_harden_glue", "server_harden_dnssec_stripped",
- "server_harden_below_nxdomain", "server_harden_referral_path",
- "server_harden_algo_downgrade", "server_use_caps_for_id",
- "server_caps_whitelist", "server_private_address",
- "server_private_domain", "server_prefetch", "server_prefetch_key",
- "server_unwanted_reply_threshold", "server_do_not_query_address",
- "server_do_not_query_localhost", "server_access_control",
- "server_module_conf", "server_val_override_date",
- "server_val_sig_skew_min", "server_val_sig_skew_max",
- "server_cache_max_ttl", "server_cache_max_negative_ttl",
- "server_cache_min_ttl", "server_bogus_ttl",
- "server_val_clean_additional", "server_val_permissive_mode",
- "server_ignore_cd_flag", "server_serve_expired", "server_fake_dsa",
- "server_fake_sha1", "server_val_log_level",
- "server_val_nsec3_keysize_iterations", "server_add_holddown",
- "server_del_holddown", "server_keep_missing",
- "server_permit_small_holddown", "server_key_cache_size",
- "server_key_cache_slabs", "server_neg_cache_size", "server_local_zone",
- "server_local_data", "server_local_data_ptr", "server_minimal_responses",
- "server_rrset_roundrobin", "server_max_udp_size", "server_dns64_prefix",
- "server_dns64_synthall", "server_define_tag", "server_local_zone_tag",
- "server_access_control_tag", "server_access_control_tag_action",
- "server_access_control_tag_data", "server_local_zone_override",
- "server_access_control_view", "server_response_ip_tag",
- "server_ip_ratelimit", "server_ratelimit", "server_ip_ratelimit_size",
- "server_ratelimit_size", "server_ip_ratelimit_slabs",
- "server_ratelimit_slabs", "server_ratelimit_for_domain",
- "server_ratelimit_below_domain", "server_ip_ratelimit_factor",
- "server_ratelimit_factor", "server_qname_minimisation",
- "server_qname_minimisation_strict", "stub_name", "stub_host",
- "stub_addr", "stub_first", "stub_ssl_upstream", "stub_prime",
- "forward_name", "forward_host", "forward_addr", "forward_first",
- "forward_ssl_upstream", "view_name", "view_local_zone",
- "view_response_ip", "view_response_ip_data", "view_local_data",
- "view_local_data_ptr", "view_first", "rcstart", "contents_rc",
- "content_rc", "rc_control_enable", "rc_control_port",
- "rc_control_interface", "rc_control_use_cert", "rc_server_key_file",
- "rc_server_cert_file", "rc_control_key_file", "rc_control_cert_file",
- "dtstart", "contents_dt", "content_dt", "dt_dnstap_enable",
- "dt_dnstap_socket_path", "dt_dnstap_send_identity",
- "dt_dnstap_send_version", "dt_dnstap_identity", "dt_dnstap_version",
- "dt_dnstap_log_resolver_query_messages",
- "dt_dnstap_log_resolver_response_messages",
- "dt_dnstap_log_client_query_messages",
- "dt_dnstap_log_client_response_messages",
- "dt_dnstap_log_forwarder_query_messages",
- "dt_dnstap_log_forwarder_response_messages", "pythonstart",
- "contents_py", "content_py", "py_script",
- "server_disable_dnssec_lame_check", "server_log_identity",
- "server_response_ip", "server_response_ip_data", "dnscstart",
- "contents_dnsc", "content_dnsc", "dnsc_dnscrypt_enable",
- "dnsc_dnscrypt_port", "dnsc_dnscrypt_provider",
- "dnsc_dnscrypt_provider_cert", "dnsc_dnscrypt_secret_key", YY_NULLPTR
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[NUM] -- (External) token number corresponding to the
- (internal) symbol number NUM (which must be that of a token). */
-static const yytype_uint16 yytoknum[] =
-{
- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
- 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
- 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
- 315, 316, 317, 318, 319, 320, 321, 322, 323, 324,
- 325, 326, 327, 328, 329, 330, 331, 332, 333, 334,
- 335, 336, 337, 338, 339, 340, 341, 342, 343, 344,
- 345, 346, 347, 348, 349, 350, 351, 352, 353, 354,
- 355, 356, 357, 358, 359, 360, 361, 362, 363, 364,
- 365, 366, 367, 368, 369, 370, 371, 372, 373, 374,
- 375, 376, 377, 378, 379, 380, 381, 382, 383, 384,
- 385, 386, 387, 388, 389, 390, 391, 392, 393, 394,
- 395, 396, 397, 398, 399, 400, 401, 402, 403, 404,
- 405, 406, 407, 408, 409, 410, 411, 412, 413, 414,
- 415, 416, 417, 418, 419, 420, 421, 422, 423, 424,
- 425, 426, 427, 428, 429, 430, 431, 432, 433, 434,
- 435, 436, 437, 438, 439, 440, 441, 442, 443, 444,
- 445, 446, 447, 448, 449, 450, 451, 452, 453, 454,
- 455, 456, 457, 458, 459, 460, 461, 462
-};
-# endif
-
-#define YYPACT_NINF -162
-
-#define yypact_value_is_default(Yystate) \
- (!!((Yystate) == (-162)))
-
-#define YYTABLE_NINF -1
-
-#define yytable_value_is_error(Yytable_value) \
- 0
-
- /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
- STATE-NUM. */
-static const yytype_int16 yypact[] =
-{
- -162, 0, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- 191, -38, -34, -39, -64, -130, -105, -161, -3, -2,
- -1, 2, 3, 26, 29, 30, 38, 39, 40, 41,
- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- 53, 54, 56, 57, 58, 59, 60, 61, 62, 63,
- 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
- 74, 75, 76, 77, 78, 79, 80, 82, 83, 84,
- 86, 89, 91, 92, 93, 94, 95, 96, 98, 99,
- 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
- 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
- 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
- 132, 133, 134, 136, 137, 138, 139, 140, 141, 142,
- 143, 145, 146, 147, 148, 149, 150, 151, 152, 153,
- 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
- 164, 165, 166, 167, 168, 169, 170, 171, 172, 173,
- 174, 175, 176, 177, 178, 179, 180, 182, 183, 184,
- 185, 186, 187, 188, 189, 190, 221, 222, 223, 224,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, 228, 229, 230, 272, 273, 274, -162,
- -162, -162, -162, -162, -162, -162, 275, 276, 277, 278,
- 279, -162, -162, -162, -162, -162, -162, 280, 284, 288,
- 289, 313, 314, 315, -162, -162, -162, -162, -162, -162,
- -162, -162, 316, 326, 327, 328, 329, 330, 331, 332,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, 333,
- 334, 335, 336, 337, 338, 372, 374, 383, 384, 385,
- 386, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, 387, -162, -162, 388, 389, 390,
- 391, 392, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, 393, 394, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, 395, 396,
- 397, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- 398, 399, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, 400, 401, 402, 403,
- 404, 405, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, 406, -162, -162, 407, 408, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, 409, 410, 411, -162, -162, -162, -162,
- -162, -162, -162
-};
-
- /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
- Performed when YYTABLE does not specify something else to do. Zero
- means the default is an error. */
-static const yytype_uint16 yydefact[] =
-{
- 2, 0, 1, 12, 167, 176, 360, 406, 379, 184,
- 415, 3, 14, 169, 178, 186, 362, 381, 408, 417,
- 4, 5, 6, 10, 8, 9, 7, 11, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 13, 15, 16, 75, 78, 87, 163, 164, 17, 137,
- 138, 139, 140, 141, 26, 66, 18, 79, 80, 37,
- 59, 74, 19, 20, 22, 23, 21, 24, 25, 110,
- 111, 112, 113, 114, 159, 76, 65, 91, 108, 109,
- 27, 28, 29, 30, 31, 67, 81, 82, 97, 53,
- 63, 54, 92, 47, 48, 166, 49, 50, 101, 105,
- 118, 126, 146, 102, 60, 32, 33, 34, 89, 119,
- 120, 121, 35, 36, 38, 39, 41, 42, 40, 124,
- 43, 44, 45, 51, 70, 106, 84, 125, 77, 142,
- 85, 86, 103, 104, 90, 46, 68, 71, 52, 55,
- 93, 94, 69, 143, 95, 56, 57, 58, 107, 156,
- 157, 165, 96, 64, 98, 99, 100, 144, 61, 62,
- 83, 72, 73, 88, 115, 116, 117, 122, 123, 147,
- 148, 150, 152, 153, 151, 154, 160, 127, 128, 131,
- 132, 129, 130, 133, 134, 136, 135, 145, 155, 149,
- 158, 161, 162, 0, 0, 0, 0, 0, 0, 168,
- 170, 171, 172, 174, 175, 173, 0, 0, 0, 0,
- 0, 177, 179, 180, 181, 182, 183, 0, 0, 0,
- 0, 0, 0, 0, 185, 187, 188, 191, 192, 189,
- 193, 190, 0, 0, 0, 0, 0, 0, 0, 0,
- 361, 363, 365, 364, 370, 366, 367, 368, 369, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 380, 382, 383, 384, 385, 386, 387, 388, 389,
- 390, 391, 392, 393, 0, 407, 409, 0, 0, 0,
- 0, 0, 416, 418, 419, 420, 422, 421, 195, 194,
- 201, 209, 207, 215, 216, 219, 217, 218, 220, 221,
- 233, 234, 235, 236, 237, 258, 259, 260, 265, 266,
- 212, 267, 268, 271, 269, 270, 273, 274, 275, 288,
- 246, 247, 249, 250, 276, 291, 242, 244, 292, 298,
- 299, 300, 213, 257, 311, 312, 243, 306, 229, 208,
- 238, 289, 295, 277, 0, 0, 315, 214, 196, 228,
- 281, 197, 210, 211, 239, 240, 313, 279, 283, 284,
- 198, 316, 261, 287, 230, 245, 293, 294, 297, 305,
- 241, 309, 307, 308, 251, 256, 285, 286, 252, 253,
- 278, 301, 231, 232, 222, 223, 224, 225, 226, 317,
- 318, 319, 262, 263, 264, 272, 320, 321, 0, 0,
- 0, 280, 254, 411, 330, 334, 332, 331, 335, 333,
- 0, 0, 338, 339, 202, 203, 204, 205, 206, 282,
- 296, 310, 340, 341, 255, 322, 0, 0, 0, 0,
- 0, 0, 302, 303, 304, 412, 248, 227, 199, 200,
- 342, 343, 344, 347, 346, 345, 348, 349, 350, 351,
- 352, 353, 0, 357, 358, 0, 0, 359, 371, 373,
- 372, 375, 376, 377, 378, 374, 394, 395, 396, 397,
- 398, 399, 400, 401, 402, 403, 404, 405, 410, 423,
- 424, 425, 427, 426, 290, 314, 329, 413, 414, 336,
- 337, 323, 324, 0, 0, 0, 328, 354, 355, 356,
- 327, 325, 326
-};
-
- /* YYPGOTO[NTERM-NUM]. */
-static const yytype_int16 yypgoto[] =
-{
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162, -162, -162, -162, -162, -162, -162, -162,
- -162, -162, -162
-};
-
- /* YYDEFGOTO[NTERM-NUM]. */
-static const yytype_int16 yydefgoto[] =
-{
- -1, 1, 11, 12, 20, 180, 13, 21, 339, 14,
- 22, 351, 15, 23, 364, 181, 182, 183, 184, 185,
- 186, 187, 188, 189, 190, 191, 192, 193, 194, 195,
- 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
- 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
- 216, 217, 218, 219, 220, 221, 222, 223, 224, 225,
- 226, 227, 228, 229, 230, 231, 232, 233, 234, 235,
- 236, 237, 238, 239, 240, 241, 242, 243, 244, 245,
- 246, 247, 248, 249, 250, 251, 252, 253, 254, 255,
- 256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
- 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
- 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,
- 286, 287, 288, 289, 290, 291, 292, 293, 294, 295,
- 296, 297, 298, 299, 300, 301, 302, 303, 304, 305,
- 306, 307, 308, 309, 310, 311, 312, 313, 314, 315,
- 316, 317, 318, 319, 320, 321, 322, 323, 324, 325,
- 326, 327, 328, 340, 341, 342, 343, 344, 345, 352,
- 353, 354, 355, 356, 365, 366, 367, 368, 369, 370,
- 371, 16, 24, 380, 381, 382, 383, 384, 385, 386,
- 387, 388, 17, 25, 401, 402, 403, 404, 405, 406,
- 407, 408, 409, 410, 411, 412, 413, 18, 26, 415,
- 416, 329, 330, 331, 332, 19, 27, 422, 423, 424,
- 425, 426, 427
-};
-
- /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
- positive, shift that token. If negative, reduce the rule whose
- number is the opposite. If YYTABLE_NINF, syntax error. */
-static const yytype_uint16 yytable[] =
-{
- 2, 357, 333, 414, 334, 335, 346, 428, 429, 430,
- 0, 3, 431, 432, 347, 348, 389, 390, 391, 392,
- 393, 394, 395, 396, 397, 398, 399, 400, 372, 373,
- 374, 375, 376, 377, 378, 379, 433, 358, 359, 434,
- 435, 4, 417, 418, 419, 420, 421, 5, 436, 437,
- 438, 439, 440, 441, 442, 443, 444, 445, 446, 447,
- 448, 449, 360, 450, 451, 336, 452, 453, 454, 455,
- 456, 457, 458, 459, 460, 461, 462, 463, 464, 465,
- 466, 467, 468, 469, 470, 471, 472, 473, 474, 475,
- 476, 6, 477, 478, 479, 337, 480, 338, 349, 481,
- 350, 482, 483, 484, 485, 486, 487, 7, 488, 489,
- 490, 491, 492, 493, 494, 495, 496, 497, 498, 499,
- 361, 362, 500, 501, 502, 503, 504, 505, 506, 507,
- 508, 509, 510, 511, 512, 513, 514, 515, 516, 517,
- 518, 519, 520, 521, 522, 8, 523, 524, 525, 526,
- 527, 528, 529, 530, 363, 531, 532, 533, 534, 535,
- 536, 537, 538, 539, 540, 541, 542, 543, 544, 545,
- 546, 547, 548, 549, 550, 551, 552, 553, 554, 555,
- 556, 557, 558, 559, 560, 561, 562, 563, 564, 565,
- 566, 9, 567, 568, 569, 570, 571, 572, 573, 574,
- 575, 0, 10, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- 55, 576, 577, 578, 579, 56, 57, 58, 580, 581,
- 582, 59, 60, 61, 62, 63, 64, 65, 66, 67,
- 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
- 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
- 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
- 98, 99, 583, 584, 585, 586, 587, 588, 589, 590,
- 591, 100, 101, 102, 592, 103, 104, 105, 593, 594,
- 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
- 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
- 126, 127, 128, 595, 596, 597, 598, 129, 130, 131,
- 132, 133, 134, 135, 136, 137, 599, 600, 601, 602,
- 603, 604, 605, 606, 607, 608, 609, 610, 611, 138,
- 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
- 149, 150, 151, 152, 153, 154, 155, 156, 157, 158,
- 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
- 169, 170, 612, 171, 613, 172, 173, 174, 175, 176,
- 177, 178, 179, 614, 615, 616, 617, 618, 619, 620,
- 621, 622, 623, 624, 625, 626, 627, 628, 629, 630,
- 631, 632, 633, 634, 635, 636, 637, 638, 639, 640,
- 641, 642
-};
-
-static const yytype_int16 yycheck[] =
-{
- 0, 40, 40, 108, 42, 43, 40, 10, 10, 10,
- -1, 11, 10, 10, 48, 49, 146, 147, 148, 149,
- 150, 151, 152, 153, 154, 155, 156, 157, 92, 93,
- 94, 95, 96, 97, 98, 99, 10, 76, 77, 10,
- 10, 41, 203, 204, 205, 206, 207, 47, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 101, 10, 10, 103, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 91, 10, 10, 10, 133, 10, 135, 132, 10,
- 134, 10, 10, 10, 10, 10, 10, 107, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 159, 160, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 145, 10, 10, 10, 10,
- 10, 10, 10, 10, 193, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 191, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, -1, 202, 12, 13, 14, 15, 16, 17, 18,
- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
- 39, 10, 10, 10, 10, 44, 45, 46, 10, 10,
- 10, 50, 51, 52, 53, 54, 55, 56, 57, 58,
- 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
- 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
- 89, 90, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 100, 101, 102, 10, 104, 105, 106, 10, 10,
- 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
- 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
- 129, 130, 131, 10, 10, 10, 10, 136, 137, 138,
- 139, 140, 141, 142, 143, 144, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 158,
- 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
- 169, 170, 171, 172, 173, 174, 175, 176, 177, 178,
- 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
- 189, 190, 10, 192, 10, 194, 195, 196, 197, 198,
- 199, 200, 201, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10
-};
-
- /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
- symbol of state STATE-NUM. */
-static const yytype_uint16 yystos[] =
-{
- 0, 209, 0, 11, 41, 47, 91, 107, 145, 191,
- 202, 210, 211, 214, 217, 220, 389, 400, 415, 423,
- 212, 215, 218, 221, 390, 401, 416, 424, 12, 13,
- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
- 34, 35, 36, 37, 38, 39, 44, 45, 46, 50,
- 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
- 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
- 100, 101, 102, 104, 105, 106, 109, 110, 111, 112,
- 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
- 123, 124, 125, 126, 127, 128, 129, 130, 131, 136,
- 137, 138, 139, 140, 141, 142, 143, 144, 158, 159,
- 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
- 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
- 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
- 190, 192, 194, 195, 196, 197, 198, 199, 200, 201,
- 213, 223, 224, 225, 226, 227, 228, 229, 230, 231,
- 232, 233, 234, 235, 236, 237, 238, 239, 240, 241,
- 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
- 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
- 262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
- 272, 273, 274, 275, 276, 277, 278, 279, 280, 281,
- 282, 283, 284, 285, 286, 287, 288, 289, 290, 291,
- 292, 293, 294, 295, 296, 297, 298, 299, 300, 301,
- 302, 303, 304, 305, 306, 307, 308, 309, 310, 311,
- 312, 313, 314, 315, 316, 317, 318, 319, 320, 321,
- 322, 323, 324, 325, 326, 327, 328, 329, 330, 331,
- 332, 333, 334, 335, 336, 337, 338, 339, 340, 341,
- 342, 343, 344, 345, 346, 347, 348, 349, 350, 351,
- 352, 353, 354, 355, 356, 357, 358, 359, 360, 361,
- 362, 363, 364, 365, 366, 367, 368, 369, 370, 419,
- 420, 421, 422, 40, 42, 43, 103, 133, 135, 216,
- 371, 372, 373, 374, 375, 376, 40, 48, 49, 132,
- 134, 219, 377, 378, 379, 380, 381, 40, 76, 77,
- 101, 159, 160, 193, 222, 382, 383, 384, 385, 386,
- 387, 388, 92, 93, 94, 95, 96, 97, 98, 99,
- 391, 392, 393, 394, 395, 396, 397, 398, 399, 146,
- 147, 148, 149, 150, 151, 152, 153, 154, 155, 156,
- 157, 402, 403, 404, 405, 406, 407, 408, 409, 410,
- 411, 412, 413, 414, 108, 417, 418, 203, 204, 205,
- 206, 207, 425, 426, 427, 428, 429, 430, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10
-};
-
- /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const yytype_uint16 yyr1[] =
-{
- 0, 208, 209, 209, 210, 210, 210, 210, 210, 210,
- 210, 210, 211, 212, 212, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213, 214, 215, 215,
- 216, 216, 216, 216, 216, 216, 217, 218, 218, 219,
- 219, 219, 219, 219, 220, 221, 221, 222, 222, 222,
- 222, 222, 222, 222, 223, 224, 225, 226, 227, 228,
- 229, 230, 231, 232, 233, 234, 235, 236, 237, 238,
- 239, 240, 241, 242, 243, 244, 245, 246, 247, 248,
- 249, 250, 251, 252, 253, 254, 255, 256, 257, 258,
- 259, 260, 261, 262, 263, 264, 265, 266, 267, 268,
- 269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
- 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
- 289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
- 299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
- 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,
- 319, 320, 321, 322, 323, 324, 325, 326, 327, 328,
- 329, 330, 331, 332, 333, 334, 335, 336, 337, 338,
- 339, 340, 341, 342, 343, 344, 345, 346, 347, 348,
- 349, 350, 351, 352, 353, 354, 355, 356, 357, 358,
- 359, 360, 361, 362, 363, 364, 365, 366, 367, 368,
- 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,
- 379, 380, 381, 382, 383, 384, 385, 386, 387, 388,
- 389, 390, 390, 391, 391, 391, 391, 391, 391, 391,
- 391, 392, 393, 394, 395, 396, 397, 398, 399, 400,
- 401, 401, 402, 402, 402, 402, 402, 402, 402, 402,
- 402, 402, 402, 402, 403, 404, 405, 406, 407, 408,
- 409, 410, 411, 412, 413, 414, 415, 416, 416, 417,
- 418, 419, 420, 421, 422, 423, 424, 424, 425, 425,
- 425, 425, 425, 426, 427, 428, 429, 430
-};
-
- /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
-static const yytype_uint8 yyr2[] =
-{
- 0, 2, 0, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 1, 2, 0, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 0,
- 1, 1, 1, 1, 1, 1, 1, 2, 0, 1,
- 1, 1, 1, 1, 1, 2, 0, 1, 1, 1,
- 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 3, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 3, 2, 2, 2, 2, 2,
- 2, 2, 2, 3, 3, 4, 4, 4, 3, 3,
- 2, 2, 2, 2, 2, 2, 3, 3, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 3, 3, 3, 2, 2, 2,
- 1, 2, 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 2, 2, 2, 2, 2, 2, 2, 1,
- 2, 0, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2, 0, 1,
- 2, 2, 2, 3, 3, 1, 2, 0, 1, 1,
- 1, 1, 1, 2, 2, 2, 2, 2
-};
-
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY (-2)
-#define YYEOF 0
-
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrorlab
-
-
-#define YYRECOVERING() (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value) \
-do \
- if (yychar == YYEMPTY) \
- { \
- yychar = (Token); \
- yylval = (Value); \
- YYPOPSTACK (yylen); \
- yystate = *yyssp; \
- goto yybackup; \
- } \
- else \
- { \
- yyerror (YY_("syntax error: cannot back up")); \
- YYERROR; \
- } \
-while (0)
-
-/* Error token number */
-#define YYTERROR 1
-#define YYERRCODE 256
-
-
-
-/* Enable debugging if requested. */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
-# define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args) \
-do { \
- if (yydebug) \
- YYFPRINTF Args; \
-} while (0)
-
-/* This macro is provided for backward compatibility. */
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
-
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-do { \
- if (yydebug) \
- { \
- YYFPRINTF (stderr, "%s ", Title); \
- yy_symbol_print (stderr, \
- Type, Value); \
- YYFPRINTF (stderr, "\n"); \
- } \
-} while (0)
-
-
-/*----------------------------------------.
-| Print this symbol's value on YYOUTPUT. |
-`----------------------------------------*/
-
-static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-{
- FILE *yyo = yyoutput;
- YYUSE (yyo);
- if (!yyvaluep)
- return;
-# ifdef YYPRINT
- if (yytype < YYNTOKENS)
- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# endif
- YYUSE (yytype);
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-{
- YYFPRINTF (yyoutput, "%s %s (",
- yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
-
- yy_symbol_value_print (yyoutput, yytype, yyvaluep);
- YYFPRINTF (yyoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included). |
-`------------------------------------------------------------------*/
-
-static void
-yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
-{
- YYFPRINTF (stderr, "Stack now");
- for (; yybottom <= yytop; yybottom++)
- {
- int yybot = *yybottom;
- YYFPRINTF (stderr, " %d", yybot);
- }
- YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top) \
-do { \
- if (yydebug) \
- yy_stack_print ((Bottom), (Top)); \
-} while (0)
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced. |
-`------------------------------------------------*/
-
-static void
-yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
-{
- unsigned long int yylno = yyrline[yyrule];
- int yynrhs = yyr2[yyrule];
- int yyi;
- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
- yyrule - 1, yylno);
- /* The symbols being reduced. */
- for (yyi = 0; yyi < yynrhs; yyi++)
- {
- YYFPRINTF (stderr, " $%d = ", yyi + 1);
- yy_symbol_print (stderr,
- yystos[yyssp[yyi + 1 - yynrhs]],
- &(yyvsp[(yyi + 1) - (yynrhs)])
- );
- YYFPRINTF (stderr, "\n");
- }
-}
-
-# define YY_REDUCE_PRINT(Rule) \
-do { \
- if (yydebug) \
- yy_reduce_print (yyssp, yyvsp, Rule); \
-} while (0)
-
-/* Nonzero means print parse trace. It is left uninitialized so that
- multiple parsers can coexist. */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
- if the built-in stack extension method is used).
-
- Do not make this value too large; the results are undefined if
- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
- evaluated with infinite-precision integer arithmetic. */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-# if defined __GLIBC__ && defined _STRING_H
-# define yystrlen strlen
-# else
-/* Return the length of YYSTR. */
-static YYSIZE_T
-yystrlen (const char *yystr)
-{
- YYSIZE_T yylen;
- for (yylen = 0; yystr[yylen]; yylen++)
- continue;
- return yylen;
-}
-# endif
-# endif
-
-# ifndef yystpcpy
-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-# define yystpcpy stpcpy
-# else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
- YYDEST. */
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-{
- char *yyd = yydest;
- const char *yys = yysrc;
-
- while ((*yyd++ = *yys++) != '\0')
- continue;
-
- return yyd - 1;
-}
-# endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
- quotes and backslashes, so that it's suitable for yyerror. The
- heuristic is that double-quoting is unnecessary unless the string
- contains an apostrophe, a comma, or backslash (other than
- backslash-backslash). YYSTR is taken from yytname. If YYRES is
- null, do not copy; instead, return the length of what the result
- would have been. */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
- if (*yystr == '"')
- {
- YYSIZE_T yyn = 0;
- char const *yyp = yystr;
-
- for (;;)
- switch (*++yyp)
- {
- case '\'':
- case ',':
- goto do_not_strip_quotes;
-
- case '\\':
- if (*++yyp != '\\')
- goto do_not_strip_quotes;
- /* Fall through. */
- default:
- if (yyres)
- yyres[yyn] = *yyp;
- yyn++;
- break;
-
- case '"':
- if (yyres)
- yyres[yyn] = '\0';
- return yyn;
- }
- do_not_strip_quotes: ;
- }
-
- if (! yyres)
- return yystrlen (yystr);
-
- return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
- about the unexpected token YYTOKEN for the state stack whose top is
- YYSSP.
-
- Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is
- not large enough to hold the message. In that case, also set
- *YYMSG_ALLOC to the required number of bytes. Return 2 if the
- required number of bytes is too large to store. */
-static int
-yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
- yytype_int16 *yyssp, int yytoken)
-{
- YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
- YYSIZE_T yysize = yysize0;
- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
- /* Internationalized format string. */
- const char *yyformat = YY_NULLPTR;
- /* Arguments of yyformat. */
- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
- /* Number of reported tokens (one for the "unexpected", one per
- "expected"). */
- int yycount = 0;
-
- /* There are many possibilities here to consider:
- - If this state is a consistent state with a default action, then
- the only way this function was invoked is if the default action
- is an error action. In that case, don't check for expected
- tokens because there are none.
- - The only way there can be no lookahead present (in yychar) is if
- this state is a consistent state with a default action. Thus,
- detecting the absence of a lookahead is sufficient to determine
- that there is no unexpected or expected token to report. In that
- case, just report a simple "syntax error".
- - Don't assume there isn't a lookahead just because this state is a
- consistent state with a default action. There might have been a
- previous inconsistent state, consistent state with a non-default
- action, or user semantic action that manipulated yychar.
- - Of course, the expected token list depends on states to have
- correct lookahead information, and it depends on the parser not
- to perform extra reductions after fetching a lookahead from the
- scanner and before detecting a syntax error. Thus, state merging
- (from LALR or IELR) and default reductions corrupt the expected
- token list. However, the list is correct for canonical LR with
- one exception: it will still contain any token that will not be
- accepted due to an error action in a later state.
- */
- if (yytoken != YYEMPTY)
- {
- int yyn = yypact[*yyssp];
- yyarg[yycount++] = yytname[yytoken];
- if (!yypact_value_is_default (yyn))
- {
- /* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. In other words, skip the first -YYN actions for
- this state because they are default actions. */
- int yyxbegin = yyn < 0 ? -yyn : 0;
- /* Stay within bounds of both yycheck and yytname. */
- int yychecklim = YYLAST - yyn + 1;
- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
- int yyx;
-
- for (yyx = yyxbegin; yyx < yyxend; ++yyx)
- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
- && !yytable_value_is_error (yytable[yyx + yyn]))
- {
- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
- {
- yycount = 1;
- yysize = yysize0;
- break;
- }
- yyarg[yycount++] = yytname[yyx];
- {
- YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
- if (! (yysize <= yysize1
- && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
- return 2;
- yysize = yysize1;
- }
- }
- }
- }
-
- switch (yycount)
- {
-# define YYCASE_(N, S) \
- case N: \
- yyformat = S; \
- break
- YYCASE_(0, YY_("syntax error"));
- YYCASE_(1, YY_("syntax error, unexpected %s"));
- YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
- YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
- YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
- YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
-# undef YYCASE_
- }
-
- {
- YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
- if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
- return 2;
- yysize = yysize1;
- }
-
- if (*yymsg_alloc < yysize)
- {
- *yymsg_alloc = 2 * yysize;
- if (! (yysize <= *yymsg_alloc
- && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
- *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
- return 1;
- }
-
- /* Avoid sprintf, as that infringes on the user's name space.
- Don't have undefined behavior even if the translation
- produced a string with the wrong number of "%s"s. */
- {
- char *yyp = *yymsg;
- int yyi = 0;
- while ((*yyp = *yyformat) != '\0')
- if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
- {
- yyp += yytnamerr (yyp, yyarg[yyi++]);
- yyformat += 2;
- }
- else
- {
- yyp++;
- yyformat++;
- }
- }
- return 0;
-}
-#endif /* YYERROR_VERBOSE */
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol. |
-`-----------------------------------------------*/
-
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-{
- YYUSE (yyvaluep);
- if (!yymsg)
- yymsg = "Deleting";
- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
- YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
- YYUSE (yytype);
- YY_IGNORE_MAYBE_UNINITIALIZED_END
-}
-
-
-
-
-/* The lookahead symbol. */
-int yychar;
-
-/* The semantic value of the lookahead symbol. */
-YYSTYPE yylval;
-/* Number of syntax errors so far. */
-int yynerrs;
-
-
-/*----------.
-| yyparse. |
-`----------*/
-
-int
-yyparse (void)
-{
- int yystate;
- /* Number of tokens to shift before error messages enabled. */
- int yyerrstatus;
-
- /* The stacks and their tools:
- 'yyss': related to states.
- 'yyvs': related to semantic values.
-
- Refer to the stacks through separate pointers, to allow yyoverflow
- to reallocate them elsewhere. */
-
- /* The state stack. */
- yytype_int16 yyssa[YYINITDEPTH];
- yytype_int16 *yyss;
- yytype_int16 *yyssp;
-
- /* The semantic value stack. */
- YYSTYPE yyvsa[YYINITDEPTH];
- YYSTYPE *yyvs;
- YYSTYPE *yyvsp;
-
- YYSIZE_T yystacksize;
-
- int yyn;
- int yyresult;
- /* Lookahead token as an internal (translated) token number. */
- int yytoken = 0;
- /* The variables used to return semantic value and location from the
- action routines. */
- YYSTYPE yyval;
-
-#if YYERROR_VERBOSE
- /* Buffer for error messages, and its allocated size. */
- char yymsgbuf[128];
- char *yymsg = yymsgbuf;
- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
-
- /* The number of symbols on the RHS of the reduced rule.
- Keep to zero when no symbol should be popped. */
- int yylen = 0;
-
- yyssp = yyss = yyssa;
- yyvsp = yyvs = yyvsa;
- yystacksize = YYINITDEPTH;
-
- YYDPRINTF ((stderr, "Starting parse\n"));
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
- goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate. |
-`------------------------------------------------------------*/
- yynewstate:
- /* In all cases, when you get here, the value and location stacks
- have just been pushed. So pushing a state here evens the stacks. */
- yyssp++;
-
- yysetstate:
- *yyssp = yystate;
-
- if (yyss + yystacksize - 1 <= yyssp)
- {
- /* Get the current used size of the three stacks, in elements. */
- YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- {
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- YYSTYPE *yyvs1 = yyvs;
- yytype_int16 *yyss1 = yyss;
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. This used to be a
- conditional around just the two extra args, but that might
- be undefined if yyoverflow is a macro. */
- yyoverflow (YY_("memory exhausted"),
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
- &yystacksize);
-
- yyss = yyss1;
- yyvs = yyvs1;
- }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
- goto yyexhaustedlab;
-# else
- /* Extend the stack our own way. */
- if (YYMAXDEPTH <= yystacksize)
- goto yyexhaustedlab;
- yystacksize *= 2;
- if (YYMAXDEPTH < yystacksize)
- yystacksize = YYMAXDEPTH;
-
- {
- yytype_int16 *yyss1 = yyss;
- union yyalloc *yyptr =
- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
- if (! yyptr)
- goto yyexhaustedlab;
- YYSTACK_RELOCATE (yyss_alloc, yyss);
- YYSTACK_RELOCATE (yyvs_alloc, yyvs);
-# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa)
- YYSTACK_FREE (yyss1);
- }
-# endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + yysize - 1;
- yyvsp = yyvs + yysize - 1;
-
- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
- (unsigned long int) yystacksize));
-
- if (yyss + yystacksize - 1 <= yyssp)
- YYABORT;
- }
-
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
- if (yystate == YYFINAL)
- YYACCEPT;
-
- goto yybackup;
-
-/*-----------.
-| yybackup. |
-`-----------*/
-yybackup:
-
- /* Do appropriate processing given the current state. Read a
- lookahead token if we need one and don't already have one. */
-
- /* First try to decide what to do without reference to lookahead token. */
- yyn = yypact[yystate];
- if (yypact_value_is_default (yyn))
- goto yydefault;
-
- /* Not known => get a lookahead token if don't already have one. */
-
- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
- if (yychar == YYEMPTY)
- {
- YYDPRINTF ((stderr, "Reading a token: "));
- yychar = yylex ();
- }
-
- if (yychar <= YYEOF)
- {
- yychar = yytoken = YYEOF;
- YYDPRINTF ((stderr, "Now at end of input.\n"));
- }
- else
- {
- yytoken = YYTRANSLATE (yychar);
- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
- }
-
- /* If the proper action on seeing token YYTOKEN is to reduce or to
- detect an error, take that action. */
- yyn += yytoken;
- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
- goto yydefault;
- yyn = yytable[yyn];
- if (yyn <= 0)
- {
- if (yytable_value_is_error (yyn))
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
-
- /* Count tokens shifted since error; after three, turn off error
- status. */
- if (yyerrstatus)
- yyerrstatus--;
-
- /* Shift the lookahead token. */
- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
- /* Discard the shifted token. */
- yychar = YYEMPTY;
-
- yystate = yyn;
- YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
- *++yyvsp = yylval;
- YY_IGNORE_MAYBE_UNINITIALIZED_END
-
- goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state. |
-`-----------------------------------------------------------*/
-yydefault:
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
- goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction. |
-`-----------------------------*/
-yyreduce:
- /* yyn is the number of a rule to reduce with. */
- yylen = yyr2[yyn];
-
- /* If YYLEN is nonzero, implement the default value of the action:
- '$$ = $1'.
-
- Otherwise, the following line sets YYVAL to garbage.
- This behavior is undocumented and Bison
- users should not rely upon it. Assigning to YYVAL
- unconditionally makes the parser a bit smaller, and it avoids a
- GCC warning that YYVAL may be used uninitialized. */
- yyval = yyvsp[1-yylen];
-
-
- YY_REDUCE_PRINT (yyn);
- switch (yyn)
- {
- case 12:
-#line 159 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("\nP(server:)\n"));
- }
-#line 2285 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 167:
-#line 234 "util/configparser.y" /* yacc.c:1646 */
- {
- struct config_stub* s;
- OUTYY(("\nP(stub_zone:)\n"));
- s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
- if(s) {
- s->next = cfg_parser->cfg->stubs;
- cfg_parser->cfg->stubs = s;
- } else
- yyerror("out of memory");
- }
-#line 2300 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 176:
-#line 251 "util/configparser.y" /* yacc.c:1646 */
- {
- struct config_stub* s;
- OUTYY(("\nP(forward_zone:)\n"));
- s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
- if(s) {
- s->next = cfg_parser->cfg->forwards;
- cfg_parser->cfg->forwards = s;
- } else
- yyerror("out of memory");
- }
-#line 2315 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 184:
-#line 268 "util/configparser.y" /* yacc.c:1646 */
- {
- struct config_view* s;
- OUTYY(("\nP(view:)\n"));
- s = (struct config_view*)calloc(1, sizeof(struct config_view));
- if(s) {
- s->next = cfg_parser->cfg->views;
- if(s->next && !s->next->name)
- yyerror("view without name");
- cfg_parser->cfg->views = s;
- } else
- yyerror("out of memory");
- }
-#line 2332 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 194:
-#line 287 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_num_threads:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2344 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 195:
-#line 296 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_verbosity:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2356 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 196:
-#line 305 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0)
- cfg_parser->cfg->stat_interval = 0;
- else if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2370 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 197:
-#line 316 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2382 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 198:
-#line 325 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2394 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 199:
-#line 334 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_shm_enable:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2406 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 200:
-#line 343 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_shm_key:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0)
- cfg_parser->cfg->shm_key = 0;
- else if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2420 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 201:
-#line 354 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_port:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("port number expected");
- else cfg_parser->cfg->port = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2432 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 202:
-#line 363 "util/configparser.y" /* yacc.c:1646 */
- {
- #ifdef CLIENT_SUBNET
- OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->client_subnet, (yyvsp[0].str)))
- fatal_exit("out of memory adding client-subnet");
- #else
- OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
- #endif
- }
-#line 2446 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 203:
-#line 375 "util/configparser.y" /* yacc.c:1646 */
- {
- #ifdef CLIENT_SUBNET
- OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else
- cfg_parser->cfg->client_subnet_always_forward =
- (strcmp((yyvsp[0].str), "yes")==0);
- #else
- OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
- #endif
- free((yyvsp[0].str));
- }
-#line 2464 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 204:
-#line 390 "util/configparser.y" /* yacc.c:1646 */
- {
- #ifdef CLIENT_SUBNET
- OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[0].str)));
- OUTYY(("P(Depricated option, ignoring)\n"));
- #else
- OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
- #endif
- free((yyvsp[0].str));
- }
-#line 2478 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 205:
-#line 401 "util/configparser.y" /* yacc.c:1646 */
- {
- #ifdef CLIENT_SUBNET
- OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("IPv4 subnet length expected");
- else if (atoi((yyvsp[0].str)) > 32)
- cfg_parser->cfg->max_client_subnet_ipv4 = 32;
- else if (atoi((yyvsp[0].str)) < 0)
- cfg_parser->cfg->max_client_subnet_ipv4 = 0;
- else cfg_parser->cfg->max_client_subnet_ipv4 = (uint8_t)atoi((yyvsp[0].str));
- #else
- OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
- #endif
- free((yyvsp[0].str));
- }
-#line 2498 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 206:
-#line 418 "util/configparser.y" /* yacc.c:1646 */
- {
- #ifdef CLIENT_SUBNET
- OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("Ipv6 subnet length expected");
- else if (atoi((yyvsp[0].str)) > 128)
- cfg_parser->cfg->max_client_subnet_ipv6 = 128;
- else if (atoi((yyvsp[0].str)) < 0)
- cfg_parser->cfg->max_client_subnet_ipv6 = 0;
- else cfg_parser->cfg->max_client_subnet_ipv6 = (uint8_t)atoi((yyvsp[0].str));
- #else
- OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
- #endif
- free((yyvsp[0].str));
- }
-#line 2518 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 207:
-#line 435 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str)));
- if(cfg_parser->cfg->num_ifs == 0)
- cfg_parser->cfg->ifs = calloc(1, sizeof(char*));
- else cfg_parser->cfg->ifs = realloc(cfg_parser->cfg->ifs,
- (cfg_parser->cfg->num_ifs+1)*sizeof(char*));
- if(!cfg_parser->cfg->ifs)
- yyerror("out of memory");
- else
- cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str);
- }
-#line 2534 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 208:
-#line 448 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str)));
- if(cfg_parser->cfg->num_out_ifs == 0)
- cfg_parser->cfg->out_ifs = calloc(1, sizeof(char*));
- else cfg_parser->cfg->out_ifs = realloc(
- cfg_parser->cfg->out_ifs,
- (cfg_parser->cfg->num_out_ifs+1)*sizeof(char*));
- if(!cfg_parser->cfg->out_ifs)
- yyerror("out of memory");
- else
- cfg_parser->cfg->out_ifs[
- cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str);
- }
-#line 2552 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 209:
-#line 463 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2564 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 210:
-#line 472 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[0].str)));
- if(!cfg_mark_ports((yyvsp[0].str), 1,
- cfg_parser->cfg->outgoing_avail_ports, 65536))
- yyerror("port number or range (\"low-high\") expected");
- free((yyvsp[0].str));
- }
-#line 2576 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 211:
-#line 481 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[0].str)));
- if(!cfg_mark_ports((yyvsp[0].str), 0,
- cfg_parser->cfg->outgoing_avail_ports, 65536))
- yyerror("port number or range (\"low-high\") expected");
- free((yyvsp[0].str));
- }
-#line 2588 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 212:
-#line 490 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2600 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 213:
-#line 499 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2612 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 214:
-#line 508 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2624 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 215:
-#line 517 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2636 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 216:
-#line 526 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2648 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 217:
-#line 535 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_do_udp:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2660 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 218:
-#line 544 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2672 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 219:
-#line 553 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_prefer_ip6:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2684 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 220:
-#line 562 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_tcp_mss:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2696 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 221:
-#line 571 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_outgoing_tcp_mss:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2708 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 222:
-#line 580 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2720 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 223:
-#line 589 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2732 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 224:
-#line 598 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ssl_service_key:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->ssl_service_key);
- cfg_parser->cfg->ssl_service_key = (yyvsp[0].str);
- }
-#line 2742 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 225:
-#line 605 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ssl_service_pem:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->ssl_service_pem);
- cfg_parser->cfg->ssl_service_pem = (yyvsp[0].str);
- }
-#line 2752 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 226:
-#line 612 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("port number expected");
- else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 2764 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 227:
-#line 621 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_use_systemd:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2776 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 228:
-#line 630 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2788 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 229:
-#line 639 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->use_syslog = (strcmp((yyvsp[0].str), "yes")==0);
-#if !defined(HAVE_SYSLOG_H) && !defined(UB_ON_WINDOWS)
- if(strcmp((yyvsp[0].str), "yes") == 0)
- yyerror("no syslog services are available. "
- "(reconfigure and compile to add)");
-#endif
- free((yyvsp[0].str));
- }
-#line 2805 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 230:
-#line 653 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2817 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 231:
-#line 662 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_log_queries:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2829 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 232:
-#line 671 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_log_replies:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 2841 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 233:
-#line 680 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_chroot:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->chrootdir);
- cfg_parser->cfg->chrootdir = (yyvsp[0].str);
- }
-#line 2851 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 234:
-#line 687 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_username:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->username);
- cfg_parser->cfg->username = (yyvsp[0].str);
- }
-#line 2861 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 235:
-#line 694 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->directory);
- cfg_parser->cfg->directory = (yyvsp[0].str);
- /* change there right away for includes relative to this */
- if((yyvsp[0].str)[0]) {
- char* d;
-#ifdef UB_ON_WINDOWS
- w_config_adjust_directory(cfg_parser->cfg);
-#endif
- d = cfg_parser->cfg->directory;
- /* adjust directory if we have already chroot,
- * like, we reread after sighup */
- if(cfg_parser->chroot && cfg_parser->chroot[0] &&
- strncmp(d, cfg_parser->chroot, strlen(
- cfg_parser->chroot)) == 0)
- d += strlen(cfg_parser->chroot);
- if(d[0]) {
- if(chdir(d))
- log_err("cannot chdir to directory: %s (%s)",
- d, strerror(errno));
- }
- }
- }
-#line 2890 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 236:
-#line 720 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_logfile:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->logfile);
- cfg_parser->cfg->logfile = (yyvsp[0].str);
- cfg_parser->cfg->use_syslog = 0;
- }
-#line 2901 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 237:
-#line 728 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_pidfile:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->pidfile);
- cfg_parser->cfg->pidfile = (yyvsp[0].str);
- }
-#line 2911 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 238:
-#line 735 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_root_hints:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 2921 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 239:
-#line 742 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->dlv_anchor_file);
- cfg_parser->cfg->dlv_anchor_file = (yyvsp[0].str);
- }
-#line 2931 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 240:
-#line 749 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 2941 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 241:
-#line 756 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_auto_trust_anchor_file:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->
- auto_trust_anchor_file_list, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 2952 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 242:
-#line 764 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->
- trust_anchor_file_list, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 2963 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 243:
-#line 772 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->
- trusted_keys_file_list, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 2974 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 244:
-#line 780 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 2984 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 245:
-#line 787 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_domain_insecure:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 2994 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 246:
-#line 794 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3006 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 247:
-#line 803 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_hide_version:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3018 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 248:
-#line 812 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_hide_trustanchor:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3030 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 249:
-#line 821 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_identity:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->identity);
- cfg_parser->cfg->identity = (yyvsp[0].str);
- }
-#line 3040 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 250:
-#line 828 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_version:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->version);
- cfg_parser->cfg->version = (yyvsp[0].str);
- }
-#line 3050 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 251:
-#line 835 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_so_rcvbuf:%s)\n", (yyvsp[0].str)));
- if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_rcvbuf))
- yyerror("buffer size expected");
- free((yyvsp[0].str));
- }
-#line 3061 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 252:
-#line 843 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_so_sndbuf:%s)\n", (yyvsp[0].str)));
- if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_sndbuf))
- yyerror("buffer size expected");
- free((yyvsp[0].str));
- }
-#line 3072 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 253:
-#line 851 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->so_reuseport =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3085 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 254:
-#line 861 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->ip_transparent =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3098 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 255:
-#line 871 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ip_freebind:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->ip_freebind =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3111 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 256:
-#line 881 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else if (atoi((yyvsp[0].str)) < 12)
- yyerror("edns buffer size too small");
- else if (atoi((yyvsp[0].str)) > 65535)
- cfg_parser->cfg->edns_buffer_size = 65535;
- else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3127 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 257:
-#line 894 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else if (atoi((yyvsp[0].str)) < 4096)
- yyerror("message buffer size too small (use 4096)");
- else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3141 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 258:
-#line 905 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[0].str)));
- if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->msg_cache_size))
- yyerror("memory size expected");
- free((yyvsp[0].str));
- }
-#line 3152 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 259:
-#line 913 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->msg_cache_slabs = atoi((yyvsp[0].str));
- if(!is_pow2(cfg_parser->cfg->msg_cache_slabs))
- yyerror("must be a power of 2");
- }
- free((yyvsp[0].str));
- }
-#line 3168 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 260:
-#line 926 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3180 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 261:
-#line 935 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3192 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 262:
-#line 944 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_delay_close:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3204 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 263:
-#line 953 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->unblock_lan_zones =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3217 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 264:
-#line 963 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_insecure_lan_zones:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->insecure_lan_zones =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3230 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 265:
-#line 973 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[0].str)));
- if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->rrset_cache_size))
- yyerror("memory size expected");
- free((yyvsp[0].str));
- }
-#line 3241 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 266:
-#line 981 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->rrset_cache_slabs = atoi((yyvsp[0].str));
- if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs))
- yyerror("must be a power of 2");
- }
- free((yyvsp[0].str));
- }
-#line 3257 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 267:
-#line 994 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3269 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 268:
-#line 1003 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[0].str)));
- verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
- "removed, use infra-host-ttl)", (yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3280 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 269:
-#line 1011 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3292 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 270:
-#line 1020 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[0].str)));
- verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
- "(option removed, use infra-cache-numhosts)", (yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3303 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 271:
-#line 1028 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->infra_cache_slabs = atoi((yyvsp[0].str));
- if(!is_pow2(cfg_parser->cfg->infra_cache_slabs))
- yyerror("must be a power of 2");
- }
- free((yyvsp[0].str));
- }
-#line 3319 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 272:
-#line 1041 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3331 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 273:
-#line 1050 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->target_fetch_policy);
- cfg_parser->cfg->target_fetch_policy = (yyvsp[0].str);
- }
-#line 3341 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 274:
-#line 1057 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_short_bufsize =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3354 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 275:
-#line 1067 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_large_queries =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3367 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 276:
-#line 1077 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_glue =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3380 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 277:
-#line 1087 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_dnssec_stripped =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3393 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 278:
-#line 1097 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_below_nxdomain =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3406 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 279:
-#line 1107 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_referral_path =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3419 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 280:
-#line 1117 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_algo_downgrade =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3432 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 281:
-#line 1127 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->use_caps_bits_for_id =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3445 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 282:
-#line 1137 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_caps_whitelist:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 3455 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 283:
-#line 1144 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_private_address:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 3465 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 284:
-#line 1151 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_private_domain:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 3475 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 285:
-#line 1158 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_prefetch:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3487 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 286:
-#line 1167 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3499 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 287:
-#line 1176 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3511 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 288:
-#line 1185 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 3521 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 289:
-#line 1192 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->donotquery_localhost =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3534 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 290:
-#line 1202 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "deny")!=0 && strcmp((yyvsp[0].str), "refuse")!=0 &&
- strcmp((yyvsp[0].str), "deny_non_local")!=0 &&
- strcmp((yyvsp[0].str), "refuse_non_local")!=0 &&
- strcmp((yyvsp[0].str), "allow")!=0 &&
- strcmp((yyvsp[0].str), "allow_snoop")!=0) {
- yyerror("expected deny, refuse, deny_non_local, "
- "refuse_non_local, allow or allow_snoop "
- "in access control action");
- } else {
- if(!cfg_str2list_insert(&cfg_parser->cfg->acls, (yyvsp[-1].str), (yyvsp[0].str)))
- fatal_exit("out of memory adding acl");
- }
- }
-#line 3554 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 291:
-#line 1219 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_module_conf:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->module_conf);
- cfg_parser->cfg->module_conf = (yyvsp[0].str);
- }
-#line 3564 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 292:
-#line 1226 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[0].str)));
- if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
- cfg_parser->cfg->val_date_override = 0;
- } else if(strlen((yyvsp[0].str)) == 14) {
- cfg_parser->cfg->val_date_override =
- cfg_convert_timeval((yyvsp[0].str));
- if(!cfg_parser->cfg->val_date_override)
- yyerror("bad date/time specification");
- } else {
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- cfg_parser->cfg->val_date_override = atoi((yyvsp[0].str));
- }
- free((yyvsp[0].str));
- }
-#line 3585 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 293:
-#line 1244 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[0].str)));
- if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
- cfg_parser->cfg->val_sig_skew_min = 0;
- } else {
- cfg_parser->cfg->val_sig_skew_min = atoi((yyvsp[0].str));
- if(!cfg_parser->cfg->val_sig_skew_min)
- yyerror("number expected");
- }
- free((yyvsp[0].str));
- }
-#line 3601 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 294:
-#line 1257 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[0].str)));
- if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
- cfg_parser->cfg->val_sig_skew_max = 0;
- } else {
- cfg_parser->cfg->val_sig_skew_max = atoi((yyvsp[0].str));
- if(!cfg_parser->cfg->val_sig_skew_max)
- yyerror("number expected");
- }
- free((yyvsp[0].str));
- }
-#line 3617 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 295:
-#line 1270 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3629 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 296:
-#line 1279 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3641 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 297:
-#line 1288 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3653 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 298:
-#line 1297 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3665 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 299:
-#line 1306 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->val_clean_additional =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3678 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 300:
-#line 1316 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->val_permissive_mode =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3691 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 301:
-#line 1326 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3703 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 302:
-#line 1335 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3715 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 303:
-#line 1344 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
-#ifdef HAVE_SSL
- else fake_dsa = (strcmp((yyvsp[0].str), "yes")==0);
- if(fake_dsa)
- log_warn("test option fake_dsa is enabled");
-#endif
- free((yyvsp[0].str));
- }
-#line 3731 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 304:
-#line 1357 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
-#ifdef HAVE_SSL
- else fake_sha1 = (strcmp((yyvsp[0].str), "yes")==0);
- if(fake_sha1)
- log_warn("test option fake_sha1 is enabled");
-#endif
- free((yyvsp[0].str));
- }
-#line 3747 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 305:
-#line 1370 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3759 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 306:
-#line 1379 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->val_nsec3_key_iterations);
- cfg_parser->cfg->val_nsec3_key_iterations = (yyvsp[0].str);
- }
-#line 3769 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 307:
-#line 1386 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3781 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 308:
-#line 1395 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3793 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 309:
-#line 1404 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3805 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 310:
-#line 1413 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->permit_small_holddown =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3818 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 311:
-#line 1422 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[0].str)));
- if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->key_cache_size))
- yyerror("memory size expected");
- free((yyvsp[0].str));
- }
-#line 3829 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 312:
-#line 1430 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->key_cache_slabs = atoi((yyvsp[0].str));
- if(!is_pow2(cfg_parser->cfg->key_cache_slabs))
- yyerror("must be a power of 2");
- }
- free((yyvsp[0].str));
- }
-#line 3845 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 313:
-#line 1443 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[0].str)));
- if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->neg_cache_size))
- yyerror("memory size expected");
- free((yyvsp[0].str));
- }
-#line 3856 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 314:
-#line 1451 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
- strcmp((yyvsp[0].str), "refuse")!=0 && strcmp((yyvsp[0].str), "redirect")!=0 &&
- strcmp((yyvsp[0].str), "transparent")!=0 && strcmp((yyvsp[0].str), "nodefault")!=0
- && strcmp((yyvsp[0].str), "typetransparent")!=0
- && strcmp((yyvsp[0].str), "always_transparent")!=0
- && strcmp((yyvsp[0].str), "always_refuse")!=0
- && strcmp((yyvsp[0].str), "always_nxdomain")!=0
- && strcmp((yyvsp[0].str), "inform")!=0 && strcmp((yyvsp[0].str), "inform_deny")!=0)
- yyerror("local-zone type: expected static, deny, "
- "refuse, redirect, transparent, "
- "typetransparent, inform, inform_deny, "
- "always_transparent, always_refuse, "
- "always_nxdomain or nodefault");
- else if(strcmp((yyvsp[0].str), "nodefault")==0) {
- if(!cfg_strlist_insert(&cfg_parser->cfg->
- local_zones_nodefault, (yyvsp[-1].str)))
- fatal_exit("out of memory adding local-zone");
- free((yyvsp[0].str));
- } else {
- if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones,
- (yyvsp[-1].str), (yyvsp[0].str)))
- fatal_exit("out of memory adding local-zone");
- }
- }
-#line 3887 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 315:
-#line 1479 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_local_data:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[0].str)))
- fatal_exit("out of memory adding local-data");
- }
-#line 3897 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 316:
-#line 1486 "util/configparser.y" /* yacc.c:1646 */
- {
- char* ptr;
- OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str)));
- ptr = cfg_ptr_reverse((yyvsp[0].str));
- free((yyvsp[0].str));
- if(ptr) {
- if(!cfg_strlist_insert(&cfg_parser->cfg->
- local_data, ptr))
- fatal_exit("out of memory adding local-data");
- } else {
- yyerror("local-data-ptr could not be reversed");
- }
- }
-#line 3915 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 317:
-#line 1501 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->minimal_responses =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3928 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 318:
-#line 1511 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->rrset_roundrobin =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3941 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 319:
-#line 1521 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[0].str)));
- cfg_parser->cfg->max_udp_size = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 3951 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 320:
-#line 1528 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->dns64_prefix);
- cfg_parser->cfg->dns64_prefix = (yyvsp[0].str);
- }
-#line 3961 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 321:
-#line 1535 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 3973 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 322:
-#line 1544 "util/configparser.y" /* yacc.c:1646 */
- {
- char* p, *s = (yyvsp[0].str);
- OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str)));
- while((p=strsep(&s, " \t\n")) != NULL) {
- if(*p) {
- if(!config_add_tag(cfg_parser->cfg, p))
- yyerror("could not define-tag, "
- "out of memory");
- }
- }
- free((yyvsp[0].str));
- }
-#line 3990 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 323:
-#line 1558 "util/configparser.y" /* yacc.c:1646 */
- {
- size_t len = 0;
- uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
- &len);
- free((yyvsp[0].str));
- OUTYY(("P(server_local_zone_tag:%s)\n", (yyvsp[-1].str)));
- if(!bitlist)
- yyerror("could not parse tags, (define-tag them first)");
- if(bitlist) {
- if(!cfg_strbytelist_insert(
- &cfg_parser->cfg->local_zone_tags,
- (yyvsp[-1].str), bitlist, len)) {
- yyerror("out of memory");
- free((yyvsp[-1].str));
- }
- }
- }
-#line 4012 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 324:
-#line 1577 "util/configparser.y" /* yacc.c:1646 */
- {
- size_t len = 0;
- uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
- &len);
- free((yyvsp[0].str));
- OUTYY(("P(server_access_control_tag:%s)\n", (yyvsp[-1].str)));
- if(!bitlist)
- yyerror("could not parse tags, (define-tag them first)");
- if(bitlist) {
- if(!cfg_strbytelist_insert(
- &cfg_parser->cfg->acl_tags,
- (yyvsp[-1].str), bitlist, len)) {
- yyerror("out of memory");
- free((yyvsp[-1].str));
- }
- }
- }
-#line 4034 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 325:
-#line 1596 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
- if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
- (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))) {
- yyerror("out of memory");
- free((yyvsp[-2].str));
- free((yyvsp[-1].str));
- free((yyvsp[0].str));
- }
- }
-#line 4049 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 326:
-#line 1608 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
- if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
- (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))) {
- yyerror("out of memory");
- free((yyvsp[-2].str));
- free((yyvsp[-1].str));
- free((yyvsp[0].str));
- }
- }
-#line 4064 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 327:
-#line 1620 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
- if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
- (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))) {
- yyerror("out of memory");
- free((yyvsp[-2].str));
- free((yyvsp[-1].str));
- free((yyvsp[0].str));
- }
- }
-#line 4079 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 328:
-#line 1632 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
- if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
- (yyvsp[-1].str), (yyvsp[0].str))) {
- yyerror("out of memory");
- free((yyvsp[-1].str));
- free((yyvsp[0].str));
- }
- }
-#line 4093 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 329:
-#line 1643 "util/configparser.y" /* yacc.c:1646 */
- {
- size_t len = 0;
- uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
- &len);
- free((yyvsp[0].str));
- OUTYY(("P(response_ip_tag:%s)\n", (yyvsp[-1].str)));
- if(!bitlist)
- yyerror("could not parse tags, (define-tag them first)");
- if(bitlist) {
- if(!cfg_strbytelist_insert(
- &cfg_parser->cfg->respip_tags,
- (yyvsp[-1].str), bitlist, len)) {
- yyerror("out of memory");
- free((yyvsp[-1].str));
- }
- }
- }
-#line 4115 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 330:
-#line 1662 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 4127 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 331:
-#line 1672 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 4139 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 332:
-#line 1681 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[0].str)));
- if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ip_ratelimit_size))
- yyerror("memory size expected");
- free((yyvsp[0].str));
- }
-#line 4150 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 333:
-#line 1689 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[0].str)));
- if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ratelimit_size))
- yyerror("memory size expected");
- free((yyvsp[0].str));
- }
-#line 4161 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 334:
-#line 1697 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->ip_ratelimit_slabs = atoi((yyvsp[0].str));
- if(!is_pow2(cfg_parser->cfg->ip_ratelimit_slabs))
- yyerror("must be a power of 2");
- }
- free((yyvsp[0].str));
- }
-#line 4177 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 335:
-#line 1710 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->ratelimit_slabs = atoi((yyvsp[0].str));
- if(!is_pow2(cfg_parser->cfg->ratelimit_slabs))
- yyerror("must be a power of 2");
- }
- free((yyvsp[0].str));
- }
-#line 4193 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 336:
-#line 1723 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
- yyerror("number expected");
- } else {
- if(!cfg_str2list_insert(&cfg_parser->cfg->
- ratelimit_for_domain, (yyvsp[-1].str), (yyvsp[0].str)))
- fatal_exit("out of memory adding "
- "ratelimit-for-domain");
- }
- }
-#line 4209 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 337:
-#line 1736 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
- yyerror("number expected");
- } else {
- if(!cfg_str2list_insert(&cfg_parser->cfg->
- ratelimit_below_domain, (yyvsp[-1].str), (yyvsp[0].str)))
- fatal_exit("out of memory adding "
- "ratelimit-below-domain");
- }
- }
-#line 4225 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 338:
-#line 1749 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 4237 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 339:
-#line 1758 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 4249 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 340:
-#line 1767 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->qname_minimisation =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4262 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 341:
-#line 1777 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->qname_minimisation_strict =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4275 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 342:
-#line 1787 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
- if(cfg_parser->cfg->stubs->name)
- yyerror("stub name override, there must be one name "
- "for one stub-zone");
- free(cfg_parser->cfg->stubs->name);
- cfg_parser->cfg->stubs->name = (yyvsp[0].str);
- }
-#line 4288 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 343:
-#line 1797 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(stub-host:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 4298 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 344:
-#line 1804 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(stub-addr:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 4308 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 345:
-#line 1811 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4320 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 346:
-#line 1820 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->stubs->ssl_upstream =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4333 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 347:
-#line 1830 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->stubs->isprime =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4346 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 348:
-#line 1840 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
- if(cfg_parser->cfg->forwards->name)
- yyerror("forward name override, there must be one "
- "name for one forward-zone");
- free(cfg_parser->cfg->forwards->name);
- cfg_parser->cfg->forwards->name = (yyvsp[0].str);
- }
-#line 4359 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 349:
-#line 1850 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(forward-host:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 4369 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 350:
-#line 1857 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(forward-addr:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 4379 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 351:
-#line 1864 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4391 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 352:
-#line 1873 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->forwards->ssl_upstream =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4404 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 353:
-#line 1883 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
- if(cfg_parser->cfg->views->name)
- yyerror("view name override, there must be one "
- "name for one view");
- free(cfg_parser->cfg->views->name);
- cfg_parser->cfg->views->name = (yyvsp[0].str);
- }
-#line 4417 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 354:
-#line 1893 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
- strcmp((yyvsp[0].str), "refuse")!=0 && strcmp((yyvsp[0].str), "redirect")!=0 &&
- strcmp((yyvsp[0].str), "transparent")!=0 && strcmp((yyvsp[0].str), "nodefault")!=0
- && strcmp((yyvsp[0].str), "typetransparent")!=0
- && strcmp((yyvsp[0].str), "always_transparent")!=0
- && strcmp((yyvsp[0].str), "always_refuse")!=0
- && strcmp((yyvsp[0].str), "always_nxdomain")!=0
- && strcmp((yyvsp[0].str), "inform")!=0 && strcmp((yyvsp[0].str), "inform_deny")!=0)
- yyerror("local-zone type: expected static, deny, "
- "refuse, redirect, transparent, "
- "typetransparent, inform, inform_deny, "
- "always_transparent, always_refuse, "
- "always_nxdomain or nodefault");
- else if(strcmp((yyvsp[0].str), "nodefault")==0) {
- if(!cfg_strlist_insert(&cfg_parser->cfg->views->
- local_zones_nodefault, (yyvsp[-1].str)))
- fatal_exit("out of memory adding local-zone");
- free((yyvsp[0].str));
- } else {
- if(!cfg_str2list_insert(
- &cfg_parser->cfg->views->local_zones,
- (yyvsp[-1].str), (yyvsp[0].str)))
- fatal_exit("out of memory adding local-zone");
- }
- }
-#line 4449 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 355:
-#line 1922 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
- validate_respip_action((yyvsp[0].str));
- if(!cfg_str2list_insert(
- &cfg_parser->cfg->views->respip_actions, (yyvsp[-1].str), (yyvsp[0].str)))
- fatal_exit("out of memory adding per-view "
- "response-ip action");
- }
-#line 4462 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 356:
-#line 1932 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[-1].str)));
- if(!cfg_str2list_insert(
- &cfg_parser->cfg->views->respip_data, (yyvsp[-1].str), (yyvsp[0].str)))
- fatal_exit("out of memory adding response-ip-data");
- }
-#line 4473 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 357:
-#line 1940 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(view_local_data:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, (yyvsp[0].str))) {
- fatal_exit("out of memory adding local-data");
- free((yyvsp[0].str));
- }
- }
-#line 4485 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 358:
-#line 1949 "util/configparser.y" /* yacc.c:1646 */
- {
- char* ptr;
- OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str)));
- ptr = cfg_ptr_reverse((yyvsp[0].str));
- free((yyvsp[0].str));
- if(ptr) {
- if(!cfg_strlist_insert(&cfg_parser->cfg->views->
- local_data, ptr))
- fatal_exit("out of memory adding local-data");
- } else {
- yyerror("local-data-ptr could not be reversed");
- }
- }
-#line 4503 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 359:
-#line 1964 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(view-first:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4515 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 360:
-#line 1973 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("\nP(remote-control:)\n"));
- }
-#line 4523 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 371:
-#line 1984 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->remote_control_enable =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4536 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 372:
-#line 1994 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("control port number expected");
- else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 4548 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 373:
-#line 2003 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, (yyvsp[0].str)))
- yyerror("out of memory");
- }
-#line 4558 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 374:
-#line 2010 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->remote_control_use_cert =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4571 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 375:
-#line 2020 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->server_key_file);
- cfg_parser->cfg->server_key_file = (yyvsp[0].str);
- }
-#line 4581 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 376:
-#line 2027 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->server_cert_file);
- cfg_parser->cfg->server_cert_file = (yyvsp[0].str);
- }
-#line 4591 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 377:
-#line 2034 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->control_key_file);
- cfg_parser->cfg->control_key_file = (yyvsp[0].str);
- }
-#line 4601 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 378:
-#line 2041 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->control_cert_file);
- cfg_parser->cfg->control_cert_file = (yyvsp[0].str);
- }
-#line 4611 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 379:
-#line 2048 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("\nP(dnstap:)\n"));
- }
-#line 4619 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 394:
-#line 2065 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0);
- }
-#line 4630 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 395:
-#line 2073 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->dnstap_socket_path);
- cfg_parser->cfg->dnstap_socket_path = (yyvsp[0].str);
- }
-#line 4640 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 396:
-#line 2080 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0);
- }
-#line 4651 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 397:
-#line 2088 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0);
- }
-#line 4662 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 398:
-#line 2096 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->dnstap_identity);
- cfg_parser->cfg->dnstap_identity = (yyvsp[0].str);
- }
-#line 4672 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 399:
-#line 2103 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->dnstap_version);
- cfg_parser->cfg->dnstap_version = (yyvsp[0].str);
- }
-#line 4682 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 400:
-#line 2110 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_resolver_query_messages =
- (strcmp((yyvsp[0].str), "yes")==0);
- }
-#line 4694 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 401:
-#line 2119 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_resolver_response_messages =
- (strcmp((yyvsp[0].str), "yes")==0);
- }
-#line 4706 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 402:
-#line 2128 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_client_query_messages =
- (strcmp((yyvsp[0].str), "yes")==0);
- }
-#line 4718 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 403:
-#line 2137 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_client_response_messages =
- (strcmp((yyvsp[0].str), "yes")==0);
- }
-#line 4730 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 404:
-#line 2146 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
- (strcmp((yyvsp[0].str), "yes")==0);
- }
-#line 4742 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 405:
-#line 2155 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
- (strcmp((yyvsp[0].str), "yes")==0);
- }
-#line 4754 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 406:
-#line 2164 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("\nP(python:)\n"));
- }
-#line 4762 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 410:
-#line 2173 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(python-script:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->python_script);
- cfg_parser->cfg->python_script = (yyvsp[0].str);
- }
-#line 4772 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 411:
-#line 2179 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str)));
- if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->disable_dnssec_lame_check =
- (strcmp((yyvsp[0].str), "yes")==0);
- free((yyvsp[0].str));
- }
-#line 4785 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 412:
-#line 2189 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_log_identity:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->log_identity);
- cfg_parser->cfg->log_identity = (yyvsp[0].str);
- }
-#line 4795 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 413:
-#line 2196 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
- validate_respip_action((yyvsp[0].str));
- if(!cfg_str2list_insert(&cfg_parser->cfg->respip_actions,
- (yyvsp[-1].str), (yyvsp[0].str)))
- fatal_exit("out of memory adding response-ip");
- }
-#line 4807 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 414:
-#line 2205 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(server_response_ip_data:%s)\n", (yyvsp[-1].str)));
- if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
- (yyvsp[-1].str), (yyvsp[0].str)))
- fatal_exit("out of memory adding response-ip-data");
- }
-#line 4818 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 415:
-#line 2213 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("\nP(dnscrypt:)\n"));
- OUTYY(("\nP(dnscrypt:)\n"));
- }
-#line 4827 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 423:
-#line 2225 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[0].str)));
- if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0);
- }
-#line 4838 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 424:
-#line 2234 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str)));
-
- if(atoi((yyvsp[0].str)) == 0)
- yyerror("port number expected");
- else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str));
- free((yyvsp[0].str));
- }
-#line 4851 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 425:
-#line 2244 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", (yyvsp[0].str)));
- free(cfg_parser->cfg->dnscrypt_provider);
- cfg_parser->cfg->dnscrypt_provider = (yyvsp[0].str);
- }
-#line 4861 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 426:
-#line 2251 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
- fatal_exit("out of memory adding dnscrypt-provider-cert");
- }
-#line 4871 "util/configparser.c" /* yacc.c:1646 */
- break;
-
- case 427:
-#line 2258 "util/configparser.y" /* yacc.c:1646 */
- {
- OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[0].str)));
- if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
- fatal_exit("out of memory adding dnscrypt-secret-key");
- }
-#line 4881 "util/configparser.c" /* yacc.c:1646 */
- break;
-
-
-#line 4885 "util/configparser.c" /* yacc.c:1646 */
- default: break;
- }
- /* User semantic actions sometimes alter yychar, and that requires
- that yytoken be updated with the new translation. We take the
- approach of translating immediately before every use of yytoken.
- One alternative is translating here after every semantic action,
- but that translation would be missed if the semantic action invokes
- YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
- if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
- incorrect destructor might then be invoked immediately. In the
- case of YYERROR or YYBACKUP, subsequent parser actions might lead
- to an incorrect destructor call or verbose syntax error message
- before the lookahead is translated. */
- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
-
- *++yyvsp = yyval;
-
- /* Now 'shift' the result of the reduction. Determine what state
- that goes to, based on the state we popped back to and the rule
- number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTOKENS];
-
- goto yynewstate;
-
-
-/*--------------------------------------.
-| yyerrlab -- here on detecting error. |
-`--------------------------------------*/
-yyerrlab:
- /* Make sure we have latest lookahead translation. See comments at
- user semantic actions for why this is necessary. */
- yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
-
- /* If not already recovering from an error, report this error. */
- if (!yyerrstatus)
- {
- ++yynerrs;
-#if ! YYERROR_VERBOSE
- yyerror (YY_("syntax error"));
-#else
-# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
- yyssp, yytoken)
- {
- char const *yymsgp = YY_("syntax error");
- int yysyntax_error_status;
- yysyntax_error_status = YYSYNTAX_ERROR;
- if (yysyntax_error_status == 0)
- yymsgp = yymsg;
- else if (yysyntax_error_status == 1)
- {
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
- yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
- if (!yymsg)
- {
- yymsg = yymsgbuf;
- yymsg_alloc = sizeof yymsgbuf;
- yysyntax_error_status = 2;
- }
- else
- {
- yysyntax_error_status = YYSYNTAX_ERROR;
- yymsgp = yymsg;
- }
- }
- yyerror (yymsgp);
- if (yysyntax_error_status == 2)
- goto yyexhaustedlab;
- }
-# undef YYSYNTAX_ERROR
-#endif
- }
-
-
-
- if (yyerrstatus == 3)
- {
- /* If just tried and failed to reuse lookahead token after an
- error, discard it. */
-
- if (yychar <= YYEOF)
- {
- /* Return failure if at end of input. */
- if (yychar == YYEOF)
- YYABORT;
- }
- else
- {
- yydestruct ("Error: discarding",
- yytoken, &yylval);
- yychar = YYEMPTY;
- }
- }
-
- /* Else will try to reuse lookahead token after shifting the error
- token. */
- goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR. |
-`---------------------------------------------------*/
-yyerrorlab:
-
- /* Pacify compilers like GCC when the user code never invokes
- YYERROR and the label yyerrorlab therefore never appears in user
- code. */
- if (/*CONSTCOND*/ 0)
- goto yyerrorlab;
-
- /* Do not reclaim the symbols of the rule whose action triggered
- this YYERROR. */
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
- yystate = *yyssp;
- goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR. |
-`-------------------------------------------------------------*/
-yyerrlab1:
- yyerrstatus = 3; /* Each real token shifted decrements this. */
-
- for (;;)
- {
- yyn = yypact[yystate];
- if (!yypact_value_is_default (yyn))
- {
- yyn += YYTERROR;
- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
- {
- yyn = yytable[yyn];
- if (0 < yyn)
- break;
- }
- }
-
- /* Pop the current state because it cannot handle the error token. */
- if (yyssp == yyss)
- YYABORT;
-
-
- yydestruct ("Error: popping",
- yystos[yystate], yyvsp);
- YYPOPSTACK (1);
- yystate = *yyssp;
- YY_STACK_PRINT (yyss, yyssp);
- }
-
- YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
- *++yyvsp = yylval;
- YY_IGNORE_MAYBE_UNINITIALIZED_END
-
-
- /* Shift the error token. */
- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here. |
-`-------------------------------------*/
-yyacceptlab:
- yyresult = 0;
- goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here. |
-`-----------------------------------*/
-yyabortlab:
- yyresult = 1;
- goto yyreturn;
-
-#if !defined yyoverflow || YYERROR_VERBOSE
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here. |
-`-------------------------------------------------*/
-yyexhaustedlab:
- yyerror (YY_("memory exhausted"));
- yyresult = 2;
- /* Fall through. */
-#endif
-
-yyreturn:
- if (yychar != YYEMPTY)
- {
- /* Make sure we have latest lookahead translation. See comments at
- user semantic actions for why this is necessary. */
- yytoken = YYTRANSLATE (yychar);
- yydestruct ("Cleanup: discarding lookahead",
- yytoken, &yylval);
- }
- /* Do not reclaim the symbols of the rule whose action triggered
- this YYABORT or YYACCEPT. */
- YYPOPSTACK (yylen);
- YY_STACK_PRINT (yyss, yyssp);
- while (yyssp != yyss)
- {
- yydestruct ("Cleanup: popping",
- yystos[*yyssp], yyvsp);
- YYPOPSTACK (1);
- }
-#ifndef yyoverflow
- if (yyss != yyssa)
- YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
-#endif
- return yyresult;
-}
-#line 2264 "util/configparser.y" /* yacc.c:1906 */
-
-
-/* parse helper routines could be here */
-static void
-validate_respip_action(const char* action)
-{
- if(strcmp(action, "deny")!=0 &&
- strcmp(action, "redirect")!=0 &&
- strcmp(action, "inform")!=0 &&
- strcmp(action, "inform_deny")!=0 &&
- strcmp(action, "always_transparent")!=0 &&
- strcmp(action, "always_refuse")!=0 &&
- strcmp(action, "always_nxdomain")!=0)
- {
- yyerror("response-ip action: expected deny, redirect, "
- "inform, inform_deny, always_transparent, "
- "always_refuse or always_nxdomain");
- }
-}
diff --git a/external/unbound/util/configparser.h b/external/unbound/util/configparser.h
deleted file mode 100644
index 937754cfe..000000000
--- a/external/unbound/util/configparser.h
+++ /dev/null
@@ -1,484 +0,0 @@
-/* A Bison parser, made by GNU Bison 3.0.4. */
-
-/* Bison interface for Yacc-like parsers in C
-
- Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-#ifndef YY_YY_UTIL_CONFIGPARSER_H_INCLUDED
-# define YY_YY_UTIL_CONFIGPARSER_H_INCLUDED
-/* Debug traces. */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-#if YYDEBUG
-extern int yydebug;
-#endif
-
-/* Token type. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- enum yytokentype
- {
- SPACE = 258,
- LETTER = 259,
- NEWLINE = 260,
- COMMENT = 261,
- COLON = 262,
- ANY = 263,
- ZONESTR = 264,
- STRING_ARG = 265,
- VAR_SERVER = 266,
- VAR_VERBOSITY = 267,
- VAR_NUM_THREADS = 268,
- VAR_PORT = 269,
- VAR_OUTGOING_RANGE = 270,
- VAR_INTERFACE = 271,
- VAR_DO_IP4 = 272,
- VAR_DO_IP6 = 273,
- VAR_PREFER_IP6 = 274,
- VAR_DO_UDP = 275,
- VAR_DO_TCP = 276,
- VAR_TCP_MSS = 277,
- VAR_OUTGOING_TCP_MSS = 278,
- VAR_CHROOT = 279,
- VAR_USERNAME = 280,
- VAR_DIRECTORY = 281,
- VAR_LOGFILE = 282,
- VAR_PIDFILE = 283,
- VAR_MSG_CACHE_SIZE = 284,
- VAR_MSG_CACHE_SLABS = 285,
- VAR_NUM_QUERIES_PER_THREAD = 286,
- VAR_RRSET_CACHE_SIZE = 287,
- VAR_RRSET_CACHE_SLABS = 288,
- VAR_OUTGOING_NUM_TCP = 289,
- VAR_INFRA_HOST_TTL = 290,
- VAR_INFRA_LAME_TTL = 291,
- VAR_INFRA_CACHE_SLABS = 292,
- VAR_INFRA_CACHE_NUMHOSTS = 293,
- VAR_INFRA_CACHE_LAME_SIZE = 294,
- VAR_NAME = 295,
- VAR_STUB_ZONE = 296,
- VAR_STUB_HOST = 297,
- VAR_STUB_ADDR = 298,
- VAR_TARGET_FETCH_POLICY = 299,
- VAR_HARDEN_SHORT_BUFSIZE = 300,
- VAR_HARDEN_LARGE_QUERIES = 301,
- VAR_FORWARD_ZONE = 302,
- VAR_FORWARD_HOST = 303,
- VAR_FORWARD_ADDR = 304,
- VAR_DO_NOT_QUERY_ADDRESS = 305,
- VAR_HIDE_IDENTITY = 306,
- VAR_HIDE_VERSION = 307,
- VAR_IDENTITY = 308,
- VAR_VERSION = 309,
- VAR_HARDEN_GLUE = 310,
- VAR_MODULE_CONF = 311,
- VAR_TRUST_ANCHOR_FILE = 312,
- VAR_TRUST_ANCHOR = 313,
- VAR_VAL_OVERRIDE_DATE = 314,
- VAR_BOGUS_TTL = 315,
- VAR_VAL_CLEAN_ADDITIONAL = 316,
- VAR_VAL_PERMISSIVE_MODE = 317,
- VAR_INCOMING_NUM_TCP = 318,
- VAR_MSG_BUFFER_SIZE = 319,
- VAR_KEY_CACHE_SIZE = 320,
- VAR_KEY_CACHE_SLABS = 321,
- VAR_TRUSTED_KEYS_FILE = 322,
- VAR_VAL_NSEC3_KEYSIZE_ITERATIONS = 323,
- VAR_USE_SYSLOG = 324,
- VAR_OUTGOING_INTERFACE = 325,
- VAR_ROOT_HINTS = 326,
- VAR_DO_NOT_QUERY_LOCALHOST = 327,
- VAR_CACHE_MAX_TTL = 328,
- VAR_HARDEN_DNSSEC_STRIPPED = 329,
- VAR_ACCESS_CONTROL = 330,
- VAR_LOCAL_ZONE = 331,
- VAR_LOCAL_DATA = 332,
- VAR_INTERFACE_AUTOMATIC = 333,
- VAR_STATISTICS_INTERVAL = 334,
- VAR_DO_DAEMONIZE = 335,
- VAR_USE_CAPS_FOR_ID = 336,
- VAR_STATISTICS_CUMULATIVE = 337,
- VAR_OUTGOING_PORT_PERMIT = 338,
- VAR_OUTGOING_PORT_AVOID = 339,
- VAR_DLV_ANCHOR_FILE = 340,
- VAR_DLV_ANCHOR = 341,
- VAR_NEG_CACHE_SIZE = 342,
- VAR_HARDEN_REFERRAL_PATH = 343,
- VAR_PRIVATE_ADDRESS = 344,
- VAR_PRIVATE_DOMAIN = 345,
- VAR_REMOTE_CONTROL = 346,
- VAR_CONTROL_ENABLE = 347,
- VAR_CONTROL_INTERFACE = 348,
- VAR_CONTROL_PORT = 349,
- VAR_SERVER_KEY_FILE = 350,
- VAR_SERVER_CERT_FILE = 351,
- VAR_CONTROL_KEY_FILE = 352,
- VAR_CONTROL_CERT_FILE = 353,
- VAR_CONTROL_USE_CERT = 354,
- VAR_EXTENDED_STATISTICS = 355,
- VAR_LOCAL_DATA_PTR = 356,
- VAR_JOSTLE_TIMEOUT = 357,
- VAR_STUB_PRIME = 358,
- VAR_UNWANTED_REPLY_THRESHOLD = 359,
- VAR_LOG_TIME_ASCII = 360,
- VAR_DOMAIN_INSECURE = 361,
- VAR_PYTHON = 362,
- VAR_PYTHON_SCRIPT = 363,
- VAR_VAL_SIG_SKEW_MIN = 364,
- VAR_VAL_SIG_SKEW_MAX = 365,
- VAR_CACHE_MIN_TTL = 366,
- VAR_VAL_LOG_LEVEL = 367,
- VAR_AUTO_TRUST_ANCHOR_FILE = 368,
- VAR_KEEP_MISSING = 369,
- VAR_ADD_HOLDDOWN = 370,
- VAR_DEL_HOLDDOWN = 371,
- VAR_SO_RCVBUF = 372,
- VAR_EDNS_BUFFER_SIZE = 373,
- VAR_PREFETCH = 374,
- VAR_PREFETCH_KEY = 375,
- VAR_SO_SNDBUF = 376,
- VAR_SO_REUSEPORT = 377,
- VAR_HARDEN_BELOW_NXDOMAIN = 378,
- VAR_IGNORE_CD_FLAG = 379,
- VAR_LOG_QUERIES = 380,
- VAR_LOG_REPLIES = 381,
- VAR_TCP_UPSTREAM = 382,
- VAR_SSL_UPSTREAM = 383,
- VAR_SSL_SERVICE_KEY = 384,
- VAR_SSL_SERVICE_PEM = 385,
- VAR_SSL_PORT = 386,
- VAR_FORWARD_FIRST = 387,
- VAR_STUB_SSL_UPSTREAM = 388,
- VAR_FORWARD_SSL_UPSTREAM = 389,
- VAR_STUB_FIRST = 390,
- VAR_MINIMAL_RESPONSES = 391,
- VAR_RRSET_ROUNDROBIN = 392,
- VAR_MAX_UDP_SIZE = 393,
- VAR_DELAY_CLOSE = 394,
- VAR_UNBLOCK_LAN_ZONES = 395,
- VAR_INSECURE_LAN_ZONES = 396,
- VAR_INFRA_CACHE_MIN_RTT = 397,
- VAR_DNS64_PREFIX = 398,
- VAR_DNS64_SYNTHALL = 399,
- VAR_DNSTAP = 400,
- VAR_DNSTAP_ENABLE = 401,
- VAR_DNSTAP_SOCKET_PATH = 402,
- VAR_DNSTAP_SEND_IDENTITY = 403,
- VAR_DNSTAP_SEND_VERSION = 404,
- VAR_DNSTAP_IDENTITY = 405,
- VAR_DNSTAP_VERSION = 406,
- VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES = 407,
- VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES = 408,
- VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES = 409,
- VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES = 410,
- VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES = 411,
- VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES = 412,
- VAR_RESPONSE_IP_TAG = 413,
- VAR_RESPONSE_IP = 414,
- VAR_RESPONSE_IP_DATA = 415,
- VAR_HARDEN_ALGO_DOWNGRADE = 416,
- VAR_IP_TRANSPARENT = 417,
- VAR_DISABLE_DNSSEC_LAME_CHECK = 418,
- VAR_IP_RATELIMIT = 419,
- VAR_IP_RATELIMIT_SLABS = 420,
- VAR_IP_RATELIMIT_SIZE = 421,
- VAR_RATELIMIT = 422,
- VAR_RATELIMIT_SLABS = 423,
- VAR_RATELIMIT_SIZE = 424,
- VAR_RATELIMIT_FOR_DOMAIN = 425,
- VAR_RATELIMIT_BELOW_DOMAIN = 426,
- VAR_IP_RATELIMIT_FACTOR = 427,
- VAR_RATELIMIT_FACTOR = 428,
- VAR_SEND_CLIENT_SUBNET = 429,
- VAR_CLIENT_SUBNET_ALWAYS_FORWARD = 430,
- VAR_CLIENT_SUBNET_OPCODE = 431,
- VAR_MAX_CLIENT_SUBNET_IPV4 = 432,
- VAR_MAX_CLIENT_SUBNET_IPV6 = 433,
- VAR_CAPS_WHITELIST = 434,
- VAR_CACHE_MAX_NEGATIVE_TTL = 435,
- VAR_PERMIT_SMALL_HOLDDOWN = 436,
- VAR_QNAME_MINIMISATION = 437,
- VAR_QNAME_MINIMISATION_STRICT = 438,
- VAR_IP_FREEBIND = 439,
- VAR_DEFINE_TAG = 440,
- VAR_LOCAL_ZONE_TAG = 441,
- VAR_ACCESS_CONTROL_TAG = 442,
- VAR_LOCAL_ZONE_OVERRIDE = 443,
- VAR_ACCESS_CONTROL_TAG_ACTION = 444,
- VAR_ACCESS_CONTROL_TAG_DATA = 445,
- VAR_VIEW = 446,
- VAR_ACCESS_CONTROL_VIEW = 447,
- VAR_VIEW_FIRST = 448,
- VAR_SERVE_EXPIRED = 449,
- VAR_FAKE_DSA = 450,
- VAR_FAKE_SHA1 = 451,
- VAR_LOG_IDENTITY = 452,
- VAR_HIDE_TRUSTANCHOR = 453,
- VAR_USE_SYSTEMD = 454,
- VAR_SHM_ENABLE = 455,
- VAR_SHM_KEY = 456,
- VAR_DNSCRYPT = 457,
- VAR_DNSCRYPT_ENABLE = 458,
- VAR_DNSCRYPT_PORT = 459,
- VAR_DNSCRYPT_PROVIDER = 460,
- VAR_DNSCRYPT_SECRET_KEY = 461,
- VAR_DNSCRYPT_PROVIDER_CERT = 462
- };
-#endif
-/* Tokens. */
-#define SPACE 258
-#define LETTER 259
-#define NEWLINE 260
-#define COMMENT 261
-#define COLON 262
-#define ANY 263
-#define ZONESTR 264
-#define STRING_ARG 265
-#define VAR_SERVER 266
-#define VAR_VERBOSITY 267
-#define VAR_NUM_THREADS 268
-#define VAR_PORT 269
-#define VAR_OUTGOING_RANGE 270
-#define VAR_INTERFACE 271
-#define VAR_DO_IP4 272
-#define VAR_DO_IP6 273
-#define VAR_PREFER_IP6 274
-#define VAR_DO_UDP 275
-#define VAR_DO_TCP 276
-#define VAR_TCP_MSS 277
-#define VAR_OUTGOING_TCP_MSS 278
-#define VAR_CHROOT 279
-#define VAR_USERNAME 280
-#define VAR_DIRECTORY 281
-#define VAR_LOGFILE 282
-#define VAR_PIDFILE 283
-#define VAR_MSG_CACHE_SIZE 284
-#define VAR_MSG_CACHE_SLABS 285
-#define VAR_NUM_QUERIES_PER_THREAD 286
-#define VAR_RRSET_CACHE_SIZE 287
-#define VAR_RRSET_CACHE_SLABS 288
-#define VAR_OUTGOING_NUM_TCP 289
-#define VAR_INFRA_HOST_TTL 290
-#define VAR_INFRA_LAME_TTL 291
-#define VAR_INFRA_CACHE_SLABS 292
-#define VAR_INFRA_CACHE_NUMHOSTS 293
-#define VAR_INFRA_CACHE_LAME_SIZE 294
-#define VAR_NAME 295
-#define VAR_STUB_ZONE 296
-#define VAR_STUB_HOST 297
-#define VAR_STUB_ADDR 298
-#define VAR_TARGET_FETCH_POLICY 299
-#define VAR_HARDEN_SHORT_BUFSIZE 300
-#define VAR_HARDEN_LARGE_QUERIES 301
-#define VAR_FORWARD_ZONE 302
-#define VAR_FORWARD_HOST 303
-#define VAR_FORWARD_ADDR 304
-#define VAR_DO_NOT_QUERY_ADDRESS 305
-#define VAR_HIDE_IDENTITY 306
-#define VAR_HIDE_VERSION 307
-#define VAR_IDENTITY 308
-#define VAR_VERSION 309
-#define VAR_HARDEN_GLUE 310
-#define VAR_MODULE_CONF 311
-#define VAR_TRUST_ANCHOR_FILE 312
-#define VAR_TRUST_ANCHOR 313
-#define VAR_VAL_OVERRIDE_DATE 314
-#define VAR_BOGUS_TTL 315
-#define VAR_VAL_CLEAN_ADDITIONAL 316
-#define VAR_VAL_PERMISSIVE_MODE 317
-#define VAR_INCOMING_NUM_TCP 318
-#define VAR_MSG_BUFFER_SIZE 319
-#define VAR_KEY_CACHE_SIZE 320
-#define VAR_KEY_CACHE_SLABS 321
-#define VAR_TRUSTED_KEYS_FILE 322
-#define VAR_VAL_NSEC3_KEYSIZE_ITERATIONS 323
-#define VAR_USE_SYSLOG 324
-#define VAR_OUTGOING_INTERFACE 325
-#define VAR_ROOT_HINTS 326
-#define VAR_DO_NOT_QUERY_LOCALHOST 327
-#define VAR_CACHE_MAX_TTL 328
-#define VAR_HARDEN_DNSSEC_STRIPPED 329
-#define VAR_ACCESS_CONTROL 330
-#define VAR_LOCAL_ZONE 331
-#define VAR_LOCAL_DATA 332
-#define VAR_INTERFACE_AUTOMATIC 333
-#define VAR_STATISTICS_INTERVAL 334
-#define VAR_DO_DAEMONIZE 335
-#define VAR_USE_CAPS_FOR_ID 336
-#define VAR_STATISTICS_CUMULATIVE 337
-#define VAR_OUTGOING_PORT_PERMIT 338
-#define VAR_OUTGOING_PORT_AVOID 339
-#define VAR_DLV_ANCHOR_FILE 340
-#define VAR_DLV_ANCHOR 341
-#define VAR_NEG_CACHE_SIZE 342
-#define VAR_HARDEN_REFERRAL_PATH 343
-#define VAR_PRIVATE_ADDRESS 344
-#define VAR_PRIVATE_DOMAIN 345
-#define VAR_REMOTE_CONTROL 346
-#define VAR_CONTROL_ENABLE 347
-#define VAR_CONTROL_INTERFACE 348
-#define VAR_CONTROL_PORT 349
-#define VAR_SERVER_KEY_FILE 350
-#define VAR_SERVER_CERT_FILE 351
-#define VAR_CONTROL_KEY_FILE 352
-#define VAR_CONTROL_CERT_FILE 353
-#define VAR_CONTROL_USE_CERT 354
-#define VAR_EXTENDED_STATISTICS 355
-#define VAR_LOCAL_DATA_PTR 356
-#define VAR_JOSTLE_TIMEOUT 357
-#define VAR_STUB_PRIME 358
-#define VAR_UNWANTED_REPLY_THRESHOLD 359
-#define VAR_LOG_TIME_ASCII 360
-#define VAR_DOMAIN_INSECURE 361
-#define VAR_PYTHON 362
-#define VAR_PYTHON_SCRIPT 363
-#define VAR_VAL_SIG_SKEW_MIN 364
-#define VAR_VAL_SIG_SKEW_MAX 365
-#define VAR_CACHE_MIN_TTL 366
-#define VAR_VAL_LOG_LEVEL 367
-#define VAR_AUTO_TRUST_ANCHOR_FILE 368
-#define VAR_KEEP_MISSING 369
-#define VAR_ADD_HOLDDOWN 370
-#define VAR_DEL_HOLDDOWN 371
-#define VAR_SO_RCVBUF 372
-#define VAR_EDNS_BUFFER_SIZE 373
-#define VAR_PREFETCH 374
-#define VAR_PREFETCH_KEY 375
-#define VAR_SO_SNDBUF 376
-#define VAR_SO_REUSEPORT 377
-#define VAR_HARDEN_BELOW_NXDOMAIN 378
-#define VAR_IGNORE_CD_FLAG 379
-#define VAR_LOG_QUERIES 380
-#define VAR_LOG_REPLIES 381
-#define VAR_TCP_UPSTREAM 382
-#define VAR_SSL_UPSTREAM 383
-#define VAR_SSL_SERVICE_KEY 384
-#define VAR_SSL_SERVICE_PEM 385
-#define VAR_SSL_PORT 386
-#define VAR_FORWARD_FIRST 387
-#define VAR_STUB_SSL_UPSTREAM 388
-#define VAR_FORWARD_SSL_UPSTREAM 389
-#define VAR_STUB_FIRST 390
-#define VAR_MINIMAL_RESPONSES 391
-#define VAR_RRSET_ROUNDROBIN 392
-#define VAR_MAX_UDP_SIZE 393
-#define VAR_DELAY_CLOSE 394
-#define VAR_UNBLOCK_LAN_ZONES 395
-#define VAR_INSECURE_LAN_ZONES 396
-#define VAR_INFRA_CACHE_MIN_RTT 397
-#define VAR_DNS64_PREFIX 398
-#define VAR_DNS64_SYNTHALL 399
-#define VAR_DNSTAP 400
-#define VAR_DNSTAP_ENABLE 401
-#define VAR_DNSTAP_SOCKET_PATH 402
-#define VAR_DNSTAP_SEND_IDENTITY 403
-#define VAR_DNSTAP_SEND_VERSION 404
-#define VAR_DNSTAP_IDENTITY 405
-#define VAR_DNSTAP_VERSION 406
-#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 407
-#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 408
-#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 409
-#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 410
-#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 411
-#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 412
-#define VAR_RESPONSE_IP_TAG 413
-#define VAR_RESPONSE_IP 414
-#define VAR_RESPONSE_IP_DATA 415
-#define VAR_HARDEN_ALGO_DOWNGRADE 416
-#define VAR_IP_TRANSPARENT 417
-#define VAR_DISABLE_DNSSEC_LAME_CHECK 418
-#define VAR_IP_RATELIMIT 419
-#define VAR_IP_RATELIMIT_SLABS 420
-#define VAR_IP_RATELIMIT_SIZE 421
-#define VAR_RATELIMIT 422
-#define VAR_RATELIMIT_SLABS 423
-#define VAR_RATELIMIT_SIZE 424
-#define VAR_RATELIMIT_FOR_DOMAIN 425
-#define VAR_RATELIMIT_BELOW_DOMAIN 426
-#define VAR_IP_RATELIMIT_FACTOR 427
-#define VAR_RATELIMIT_FACTOR 428
-#define VAR_SEND_CLIENT_SUBNET 429
-#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 430
-#define VAR_CLIENT_SUBNET_OPCODE 431
-#define VAR_MAX_CLIENT_SUBNET_IPV4 432
-#define VAR_MAX_CLIENT_SUBNET_IPV6 433
-#define VAR_CAPS_WHITELIST 434
-#define VAR_CACHE_MAX_NEGATIVE_TTL 435
-#define VAR_PERMIT_SMALL_HOLDDOWN 436
-#define VAR_QNAME_MINIMISATION 437
-#define VAR_QNAME_MINIMISATION_STRICT 438
-#define VAR_IP_FREEBIND 439
-#define VAR_DEFINE_TAG 440
-#define VAR_LOCAL_ZONE_TAG 441
-#define VAR_ACCESS_CONTROL_TAG 442
-#define VAR_LOCAL_ZONE_OVERRIDE 443
-#define VAR_ACCESS_CONTROL_TAG_ACTION 444
-#define VAR_ACCESS_CONTROL_TAG_DATA 445
-#define VAR_VIEW 446
-#define VAR_ACCESS_CONTROL_VIEW 447
-#define VAR_VIEW_FIRST 448
-#define VAR_SERVE_EXPIRED 449
-#define VAR_FAKE_DSA 450
-#define VAR_FAKE_SHA1 451
-#define VAR_LOG_IDENTITY 452
-#define VAR_HIDE_TRUSTANCHOR 453
-#define VAR_USE_SYSTEMD 454
-#define VAR_SHM_ENABLE 455
-#define VAR_SHM_KEY 456
-#define VAR_DNSCRYPT 457
-#define VAR_DNSCRYPT_ENABLE 458
-#define VAR_DNSCRYPT_PORT 459
-#define VAR_DNSCRYPT_PROVIDER 460
-#define VAR_DNSCRYPT_SECRET_KEY 461
-#define VAR_DNSCRYPT_PROVIDER_CERT 462
-
-/* Value type. */
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
-union YYSTYPE
-{
-#line 66 "util/configparser.y" /* yacc.c:1909 */
-
- char* str;
-
-#line 472 "util/configparser.h" /* yacc.c:1909 */
-};
-
-typedef union YYSTYPE YYSTYPE;
-# define YYSTYPE_IS_TRIVIAL 1
-# define YYSTYPE_IS_DECLARED 1
-#endif
-
-
-extern YYSTYPE yylval;
-
-int yyparse (void);
-
-#endif /* !YY_YY_UTIL_CONFIGPARSER_H_INCLUDED */
diff --git a/external/unbound/util/configparser.y b/external/unbound/util/configparser.y
deleted file mode 100644
index 4a04367f4..000000000
--- a/external/unbound/util/configparser.y
+++ /dev/null
@@ -1,2282 +0,0 @@
-/*
- * configparser.y -- yacc grammar for unbound configuration files
- *
- * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-%{
-#include "config.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#include "util/configyyrename.h"
-#include "util/config_file.h"
-#include "util/net_help.h"
-
-int ub_c_lex(void);
-void ub_c_error(const char *message);
-
-static void validate_respip_action(const char* action);
-
-/* these need to be global, otherwise they cannot be used inside yacc */
-extern struct config_parser_state* cfg_parser;
-
-#if 0
-#define OUTYY(s) printf s /* used ONLY when debugging */
-#else
-#define OUTYY(s)
-#endif
-
-%}
-%union {
- char* str;
-};
-
-%token SPACE LETTER NEWLINE COMMENT COLON ANY ZONESTR
-%token <str> STRING_ARG
-%token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT
-%token VAR_OUTGOING_RANGE VAR_INTERFACE
-%token VAR_DO_IP4 VAR_DO_IP6 VAR_PREFER_IP6 VAR_DO_UDP VAR_DO_TCP
-%token VAR_TCP_MSS VAR_OUTGOING_TCP_MSS
-%token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE
-%token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD
-%token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS VAR_OUTGOING_NUM_TCP
-%token VAR_INFRA_HOST_TTL VAR_INFRA_LAME_TTL VAR_INFRA_CACHE_SLABS
-%token VAR_INFRA_CACHE_NUMHOSTS VAR_INFRA_CACHE_LAME_SIZE VAR_NAME
-%token VAR_STUB_ZONE VAR_STUB_HOST VAR_STUB_ADDR VAR_TARGET_FETCH_POLICY
-%token VAR_HARDEN_SHORT_BUFSIZE VAR_HARDEN_LARGE_QUERIES
-%token VAR_FORWARD_ZONE VAR_FORWARD_HOST VAR_FORWARD_ADDR
-%token VAR_DO_NOT_QUERY_ADDRESS VAR_HIDE_IDENTITY VAR_HIDE_VERSION
-%token VAR_IDENTITY VAR_VERSION VAR_HARDEN_GLUE VAR_MODULE_CONF
-%token VAR_TRUST_ANCHOR_FILE VAR_TRUST_ANCHOR VAR_VAL_OVERRIDE_DATE
-%token VAR_BOGUS_TTL VAR_VAL_CLEAN_ADDITIONAL VAR_VAL_PERMISSIVE_MODE
-%token VAR_INCOMING_NUM_TCP VAR_MSG_BUFFER_SIZE VAR_KEY_CACHE_SIZE
-%token VAR_KEY_CACHE_SLABS VAR_TRUSTED_KEYS_FILE
-%token VAR_VAL_NSEC3_KEYSIZE_ITERATIONS VAR_USE_SYSLOG
-%token VAR_OUTGOING_INTERFACE VAR_ROOT_HINTS VAR_DO_NOT_QUERY_LOCALHOST
-%token VAR_CACHE_MAX_TTL VAR_HARDEN_DNSSEC_STRIPPED VAR_ACCESS_CONTROL
-%token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC
-%token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID
-%token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT
-%token VAR_OUTGOING_PORT_AVOID VAR_DLV_ANCHOR_FILE VAR_DLV_ANCHOR
-%token VAR_NEG_CACHE_SIZE VAR_HARDEN_REFERRAL_PATH VAR_PRIVATE_ADDRESS
-%token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE
-%token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE
-%token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE
-%token VAR_CONTROL_USE_CERT
-%token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT
-%token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII
-%token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN
-%token VAR_VAL_SIG_SKEW_MAX VAR_CACHE_MIN_TTL VAR_VAL_LOG_LEVEL
-%token VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING VAR_ADD_HOLDDOWN
-%token VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE VAR_PREFETCH
-%token VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT VAR_HARDEN_BELOW_NXDOMAIN
-%token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_LOG_REPLIES
-%token VAR_TCP_UPSTREAM VAR_SSL_UPSTREAM
-%token VAR_SSL_SERVICE_KEY VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST
-%token VAR_STUB_SSL_UPSTREAM VAR_FORWARD_SSL_UPSTREAM
-%token VAR_STUB_FIRST VAR_MINIMAL_RESPONSES VAR_RRSET_ROUNDROBIN
-%token VAR_MAX_UDP_SIZE VAR_DELAY_CLOSE
-%token VAR_UNBLOCK_LAN_ZONES VAR_INSECURE_LAN_ZONES
-%token VAR_INFRA_CACHE_MIN_RTT
-%token VAR_DNS64_PREFIX VAR_DNS64_SYNTHALL
-%token VAR_DNSTAP VAR_DNSTAP_ENABLE VAR_DNSTAP_SOCKET_PATH
-%token VAR_DNSTAP_SEND_IDENTITY VAR_DNSTAP_SEND_VERSION
-%token VAR_DNSTAP_IDENTITY VAR_DNSTAP_VERSION
-%token VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES
-%token VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES
-%token VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES
-%token VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES
-%token VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES
-%token VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES
-%token VAR_RESPONSE_IP_TAG VAR_RESPONSE_IP VAR_RESPONSE_IP_DATA
-%token VAR_HARDEN_ALGO_DOWNGRADE VAR_IP_TRANSPARENT
-%token VAR_DISABLE_DNSSEC_LAME_CHECK
-%token VAR_IP_RATELIMIT VAR_IP_RATELIMIT_SLABS VAR_IP_RATELIMIT_SIZE
-%token VAR_RATELIMIT VAR_RATELIMIT_SLABS VAR_RATELIMIT_SIZE
-%token VAR_RATELIMIT_FOR_DOMAIN VAR_RATELIMIT_BELOW_DOMAIN
-%token VAR_IP_RATELIMIT_FACTOR VAR_RATELIMIT_FACTOR
-%token VAR_SEND_CLIENT_SUBNET VAR_CLIENT_SUBNET_ALWAYS_FORWARD
-%token VAR_CLIENT_SUBNET_OPCODE
-%token VAR_MAX_CLIENT_SUBNET_IPV4 VAR_MAX_CLIENT_SUBNET_IPV6
-%token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL VAR_PERMIT_SMALL_HOLDDOWN
-%token VAR_QNAME_MINIMISATION VAR_QNAME_MINIMISATION_STRICT VAR_IP_FREEBIND
-%token VAR_DEFINE_TAG VAR_LOCAL_ZONE_TAG VAR_ACCESS_CONTROL_TAG
-%token VAR_LOCAL_ZONE_OVERRIDE VAR_ACCESS_CONTROL_TAG_ACTION
-%token VAR_ACCESS_CONTROL_TAG_DATA VAR_VIEW VAR_ACCESS_CONTROL_VIEW
-%token VAR_VIEW_FIRST VAR_SERVE_EXPIRED VAR_FAKE_DSA VAR_FAKE_SHA1
-%token VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR
-%token VAR_USE_SYSTEMD VAR_SHM_ENABLE VAR_SHM_KEY
-%token VAR_DNSCRYPT VAR_DNSCRYPT_ENABLE VAR_DNSCRYPT_PORT VAR_DNSCRYPT_PROVIDER
-%token VAR_DNSCRYPT_SECRET_KEY VAR_DNSCRYPT_PROVIDER_CERT
-
-%%
-toplevelvars: /* empty */ | toplevelvars toplevelvar ;
-toplevelvar: serverstart contents_server | stubstart contents_stub |
- forwardstart contents_forward | pythonstart contents_py |
- rcstart contents_rc | dtstart contents_dt | viewstart
- contents_view |
- dnscstart contents_dnsc
- ;
-
-/* server: declaration */
-serverstart: VAR_SERVER
- {
- OUTYY(("\nP(server:)\n"));
- }
- ;
-contents_server: contents_server content_server
- | ;
-content_server: server_num_threads | server_verbosity | server_port |
- server_outgoing_range | server_do_ip4 |
- server_do_ip6 | server_prefer_ip6 |
- server_do_udp | server_do_tcp |
- server_tcp_mss | server_outgoing_tcp_mss |
- server_interface | server_chroot | server_username |
- server_directory | server_logfile | server_pidfile |
- server_msg_cache_size | server_msg_cache_slabs |
- server_num_queries_per_thread | server_rrset_cache_size |
- server_rrset_cache_slabs | server_outgoing_num_tcp |
- server_infra_host_ttl | server_infra_lame_ttl |
- server_infra_cache_slabs | server_infra_cache_numhosts |
- server_infra_cache_lame_size | server_target_fetch_policy |
- server_harden_short_bufsize | server_harden_large_queries |
- server_do_not_query_address | server_hide_identity |
- server_hide_version | server_identity | server_version |
- server_harden_glue | server_module_conf | server_trust_anchor_file |
- server_trust_anchor | server_val_override_date | server_bogus_ttl |
- server_val_clean_additional | server_val_permissive_mode |
- server_incoming_num_tcp | server_msg_buffer_size |
- server_key_cache_size | server_key_cache_slabs |
- server_trusted_keys_file | server_val_nsec3_keysize_iterations |
- server_use_syslog | server_outgoing_interface | server_root_hints |
- server_do_not_query_localhost | server_cache_max_ttl |
- server_harden_dnssec_stripped | server_access_control |
- server_local_zone | server_local_data | server_interface_automatic |
- server_statistics_interval | server_do_daemonize |
- server_use_caps_for_id | server_statistics_cumulative |
- server_outgoing_port_permit | server_outgoing_port_avoid |
- server_dlv_anchor_file | server_dlv_anchor | server_neg_cache_size |
- server_harden_referral_path | server_private_address |
- server_private_domain | server_extended_statistics |
- server_local_data_ptr | server_jostle_timeout |
- server_unwanted_reply_threshold | server_log_time_ascii |
- server_domain_insecure | server_val_sig_skew_min |
- server_val_sig_skew_max | server_cache_min_ttl | server_val_log_level |
- server_auto_trust_anchor_file | server_add_holddown |
- server_del_holddown | server_keep_missing | server_so_rcvbuf |
- server_edns_buffer_size | server_prefetch | server_prefetch_key |
- server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag |
- server_log_queries | server_log_replies | server_tcp_upstream | server_ssl_upstream |
- server_ssl_service_key | server_ssl_service_pem | server_ssl_port |
- server_minimal_responses | server_rrset_roundrobin | server_max_udp_size |
- server_so_reuseport | server_delay_close |
- server_unblock_lan_zones | server_insecure_lan_zones |
- server_dns64_prefix | server_dns64_synthall |
- server_infra_cache_min_rtt | server_harden_algo_downgrade |
- server_ip_transparent | server_ip_ratelimit | server_ratelimit |
- server_ip_ratelimit_slabs | server_ratelimit_slabs |
- server_ip_ratelimit_size | server_ratelimit_size |
- server_ratelimit_for_domain |
- server_ratelimit_below_domain | server_ratelimit_factor |
- server_ip_ratelimit_factor | server_send_client_subnet |
- server_client_subnet_always_forward |
- server_client_subnet_opcode |
- server_max_client_subnet_ipv4 | server_max_client_subnet_ipv6 |
- server_caps_whitelist | server_cache_max_negative_ttl |
- server_permit_small_holddown | server_qname_minimisation |
- server_ip_freebind | server_define_tag | server_local_zone_tag |
- server_disable_dnssec_lame_check | server_access_control_tag |
- server_local_zone_override | server_access_control_tag_action |
- server_access_control_tag_data | server_access_control_view |
- server_qname_minimisation_strict | server_serve_expired |
- server_fake_dsa | server_log_identity | server_use_systemd |
- server_response_ip_tag | server_response_ip | server_response_ip_data |
- server_shm_enable | server_shm_key | server_fake_sha1 |
- server_hide_trustanchor
- ;
-stubstart: VAR_STUB_ZONE
- {
- struct config_stub* s;
- OUTYY(("\nP(stub_zone:)\n"));
- s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
- if(s) {
- s->next = cfg_parser->cfg->stubs;
- cfg_parser->cfg->stubs = s;
- } else
- yyerror("out of memory");
- }
- ;
-contents_stub: contents_stub content_stub
- | ;
-content_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first |
- stub_ssl_upstream
- ;
-forwardstart: VAR_FORWARD_ZONE
- {
- struct config_stub* s;
- OUTYY(("\nP(forward_zone:)\n"));
- s = (struct config_stub*)calloc(1, sizeof(struct config_stub));
- if(s) {
- s->next = cfg_parser->cfg->forwards;
- cfg_parser->cfg->forwards = s;
- } else
- yyerror("out of memory");
- }
- ;
-contents_forward: contents_forward content_forward
- | ;
-content_forward: forward_name | forward_host | forward_addr | forward_first |
- forward_ssl_upstream
- ;
-viewstart: VAR_VIEW
- {
- struct config_view* s;
- OUTYY(("\nP(view:)\n"));
- s = (struct config_view*)calloc(1, sizeof(struct config_view));
- if(s) {
- s->next = cfg_parser->cfg->views;
- if(s->next && !s->next->name)
- yyerror("view without name");
- cfg_parser->cfg->views = s;
- } else
- yyerror("out of memory");
- }
- ;
-contents_view: contents_view content_view
- | ;
-content_view: view_name | view_local_zone | view_local_data | view_first |
- view_response_ip | view_response_ip_data | view_local_data_ptr
- ;
-server_num_threads: VAR_NUM_THREADS STRING_ARG
- {
- OUTYY(("P(server_num_threads:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->num_threads = atoi($2);
- free($2);
- }
- ;
-server_verbosity: VAR_VERBOSITY STRING_ARG
- {
- OUTYY(("P(server_verbosity:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->verbosity = atoi($2);
- free($2);
- }
- ;
-server_statistics_interval: VAR_STATISTICS_INTERVAL STRING_ARG
- {
- OUTYY(("P(server_statistics_interval:%s)\n", $2));
- if(strcmp($2, "") == 0 || strcmp($2, "0") == 0)
- cfg_parser->cfg->stat_interval = 0;
- else if(atoi($2) == 0)
- yyerror("number expected");
- else cfg_parser->cfg->stat_interval = atoi($2);
- free($2);
- }
- ;
-server_statistics_cumulative: VAR_STATISTICS_CUMULATIVE STRING_ARG
- {
- OUTYY(("P(server_statistics_cumulative:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->stat_cumulative = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_extended_statistics: VAR_EXTENDED_STATISTICS STRING_ARG
- {
- OUTYY(("P(server_extended_statistics:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->stat_extended = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_shm_enable: VAR_SHM_ENABLE STRING_ARG
- {
- OUTYY(("P(server_shm_enable:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->shm_enable = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_shm_key: VAR_SHM_KEY STRING_ARG
- {
- OUTYY(("P(server_shm_key:%s)\n", $2));
- if(strcmp($2, "") == 0 || strcmp($2, "0") == 0)
- cfg_parser->cfg->shm_key = 0;
- else if(atoi($2) == 0)
- yyerror("number expected");
- else cfg_parser->cfg->shm_key = atoi($2);
- free($2);
- }
- ;
-server_port: VAR_PORT STRING_ARG
- {
- OUTYY(("P(server_port:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("port number expected");
- else cfg_parser->cfg->port = atoi($2);
- free($2);
- }
- ;
-server_send_client_subnet: VAR_SEND_CLIENT_SUBNET STRING_ARG
- {
- #ifdef CLIENT_SUBNET
- OUTYY(("P(server_send_client_subnet:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->client_subnet, $2))
- fatal_exit("out of memory adding client-subnet");
- #else
- OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
- #endif
- }
- ;
-server_client_subnet_always_forward:
- VAR_CLIENT_SUBNET_ALWAYS_FORWARD STRING_ARG
- {
- #ifdef CLIENT_SUBNET
- OUTYY(("P(server_client_subnet_always_forward:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else
- cfg_parser->cfg->client_subnet_always_forward =
- (strcmp($2, "yes")==0);
- #else
- OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
- #endif
- free($2);
- }
- ;
-server_client_subnet_opcode: VAR_CLIENT_SUBNET_OPCODE STRING_ARG
- {
- #ifdef CLIENT_SUBNET
- OUTYY(("P(client_subnet_opcode:%s)\n", $2));
- OUTYY(("P(Depricated option, ignoring)\n"));
- #else
- OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
- #endif
- free($2);
- }
- ;
-server_max_client_subnet_ipv4: VAR_MAX_CLIENT_SUBNET_IPV4 STRING_ARG
- {
- #ifdef CLIENT_SUBNET
- OUTYY(("P(max_client_subnet_ipv4:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("IPv4 subnet length expected");
- else if (atoi($2) > 32)
- cfg_parser->cfg->max_client_subnet_ipv4 = 32;
- else if (atoi($2) < 0)
- cfg_parser->cfg->max_client_subnet_ipv4 = 0;
- else cfg_parser->cfg->max_client_subnet_ipv4 = (uint8_t)atoi($2);
- #else
- OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
- #endif
- free($2);
- }
- ;
-server_max_client_subnet_ipv6: VAR_MAX_CLIENT_SUBNET_IPV6 STRING_ARG
- {
- #ifdef CLIENT_SUBNET
- OUTYY(("P(max_client_subnet_ipv6:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("Ipv6 subnet length expected");
- else if (atoi($2) > 128)
- cfg_parser->cfg->max_client_subnet_ipv6 = 128;
- else if (atoi($2) < 0)
- cfg_parser->cfg->max_client_subnet_ipv6 = 0;
- else cfg_parser->cfg->max_client_subnet_ipv6 = (uint8_t)atoi($2);
- #else
- OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
- #endif
- free($2);
- }
- ;
-server_interface: VAR_INTERFACE STRING_ARG
- {
- OUTYY(("P(server_interface:%s)\n", $2));
- if(cfg_parser->cfg->num_ifs == 0)
- cfg_parser->cfg->ifs = calloc(1, sizeof(char*));
- else cfg_parser->cfg->ifs = realloc(cfg_parser->cfg->ifs,
- (cfg_parser->cfg->num_ifs+1)*sizeof(char*));
- if(!cfg_parser->cfg->ifs)
- yyerror("out of memory");
- else
- cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = $2;
- }
- ;
-server_outgoing_interface: VAR_OUTGOING_INTERFACE STRING_ARG
- {
- OUTYY(("P(server_outgoing_interface:%s)\n", $2));
- if(cfg_parser->cfg->num_out_ifs == 0)
- cfg_parser->cfg->out_ifs = calloc(1, sizeof(char*));
- else cfg_parser->cfg->out_ifs = realloc(
- cfg_parser->cfg->out_ifs,
- (cfg_parser->cfg->num_out_ifs+1)*sizeof(char*));
- if(!cfg_parser->cfg->out_ifs)
- yyerror("out of memory");
- else
- cfg_parser->cfg->out_ifs[
- cfg_parser->cfg->num_out_ifs++] = $2;
- }
- ;
-server_outgoing_range: VAR_OUTGOING_RANGE STRING_ARG
- {
- OUTYY(("P(server_outgoing_range:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else cfg_parser->cfg->outgoing_num_ports = atoi($2);
- free($2);
- }
- ;
-server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING_ARG
- {
- OUTYY(("P(server_outgoing_port_permit:%s)\n", $2));
- if(!cfg_mark_ports($2, 1,
- cfg_parser->cfg->outgoing_avail_ports, 65536))
- yyerror("port number or range (\"low-high\") expected");
- free($2);
- }
- ;
-server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING_ARG
- {
- OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2));
- if(!cfg_mark_ports($2, 0,
- cfg_parser->cfg->outgoing_avail_ports, 65536))
- yyerror("port number or range (\"low-high\") expected");
- free($2);
- }
- ;
-server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING_ARG
- {
- OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->outgoing_num_tcp = atoi($2);
- free($2);
- }
- ;
-server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING_ARG
- {
- OUTYY(("P(server_incoming_num_tcp:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->incoming_num_tcp = atoi($2);
- free($2);
- }
- ;
-server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING_ARG
- {
- OUTYY(("P(server_interface_automatic:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->if_automatic = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_do_ip4: VAR_DO_IP4 STRING_ARG
- {
- OUTYY(("P(server_do_ip4:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->do_ip4 = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_do_ip6: VAR_DO_IP6 STRING_ARG
- {
- OUTYY(("P(server_do_ip6:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->do_ip6 = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_do_udp: VAR_DO_UDP STRING_ARG
- {
- OUTYY(("P(server_do_udp:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->do_udp = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_do_tcp: VAR_DO_TCP STRING_ARG
- {
- OUTYY(("P(server_do_tcp:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->do_tcp = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG
- {
- OUTYY(("P(server_prefer_ip6:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->prefer_ip6 = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_tcp_mss: VAR_TCP_MSS STRING_ARG
- {
- OUTYY(("P(server_tcp_mss:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->tcp_mss = atoi($2);
- free($2);
- }
- ;
-server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG
- {
- OUTYY(("P(server_outgoing_tcp_mss:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->outgoing_tcp_mss = atoi($2);
- free($2);
- }
- ;
-server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG
- {
- OUTYY(("P(server_tcp_upstream:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->tcp_upstream = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_ssl_upstream: VAR_SSL_UPSTREAM STRING_ARG
- {
- OUTYY(("P(server_ssl_upstream:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->ssl_upstream = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_ssl_service_key: VAR_SSL_SERVICE_KEY STRING_ARG
- {
- OUTYY(("P(server_ssl_service_key:%s)\n", $2));
- free(cfg_parser->cfg->ssl_service_key);
- cfg_parser->cfg->ssl_service_key = $2;
- }
- ;
-server_ssl_service_pem: VAR_SSL_SERVICE_PEM STRING_ARG
- {
- OUTYY(("P(server_ssl_service_pem:%s)\n", $2));
- free(cfg_parser->cfg->ssl_service_pem);
- cfg_parser->cfg->ssl_service_pem = $2;
- }
- ;
-server_ssl_port: VAR_SSL_PORT STRING_ARG
- {
- OUTYY(("P(server_ssl_port:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("port number expected");
- else cfg_parser->cfg->ssl_port = atoi($2);
- free($2);
- }
- ;
-server_use_systemd: VAR_USE_SYSTEMD STRING_ARG
- {
- OUTYY(("P(server_use_systemd:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->use_systemd = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_do_daemonize: VAR_DO_DAEMONIZE STRING_ARG
- {
- OUTYY(("P(server_do_daemonize:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->do_daemonize = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_use_syslog: VAR_USE_SYSLOG STRING_ARG
- {
- OUTYY(("P(server_use_syslog:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->use_syslog = (strcmp($2, "yes")==0);
-#if !defined(HAVE_SYSLOG_H) && !defined(UB_ON_WINDOWS)
- if(strcmp($2, "yes") == 0)
- yyerror("no syslog services are available. "
- "(reconfigure and compile to add)");
-#endif
- free($2);
- }
- ;
-server_log_time_ascii: VAR_LOG_TIME_ASCII STRING_ARG
- {
- OUTYY(("P(server_log_time_ascii:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->log_time_ascii = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_log_queries: VAR_LOG_QUERIES STRING_ARG
- {
- OUTYY(("P(server_log_queries:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->log_queries = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_log_replies: VAR_LOG_REPLIES STRING_ARG
- {
- OUTYY(("P(server_log_replies:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->log_replies = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_chroot: VAR_CHROOT STRING_ARG
- {
- OUTYY(("P(server_chroot:%s)\n", $2));
- free(cfg_parser->cfg->chrootdir);
- cfg_parser->cfg->chrootdir = $2;
- }
- ;
-server_username: VAR_USERNAME STRING_ARG
- {
- OUTYY(("P(server_username:%s)\n", $2));
- free(cfg_parser->cfg->username);
- cfg_parser->cfg->username = $2;
- }
- ;
-server_directory: VAR_DIRECTORY STRING_ARG
- {
- OUTYY(("P(server_directory:%s)\n", $2));
- free(cfg_parser->cfg->directory);
- cfg_parser->cfg->directory = $2;
- /* change there right away for includes relative to this */
- if($2[0]) {
- char* d;
-#ifdef UB_ON_WINDOWS
- w_config_adjust_directory(cfg_parser->cfg);
-#endif
- d = cfg_parser->cfg->directory;
- /* adjust directory if we have already chroot,
- * like, we reread after sighup */
- if(cfg_parser->chroot && cfg_parser->chroot[0] &&
- strncmp(d, cfg_parser->chroot, strlen(
- cfg_parser->chroot)) == 0)
- d += strlen(cfg_parser->chroot);
- if(d[0]) {
- if(chdir(d))
- log_err("cannot chdir to directory: %s (%s)",
- d, strerror(errno));
- }
- }
- }
- ;
-server_logfile: VAR_LOGFILE STRING_ARG
- {
- OUTYY(("P(server_logfile:%s)\n", $2));
- free(cfg_parser->cfg->logfile);
- cfg_parser->cfg->logfile = $2;
- cfg_parser->cfg->use_syslog = 0;
- }
- ;
-server_pidfile: VAR_PIDFILE STRING_ARG
- {
- OUTYY(("P(server_pidfile:%s)\n", $2));
- free(cfg_parser->cfg->pidfile);
- cfg_parser->cfg->pidfile = $2;
- }
- ;
-server_root_hints: VAR_ROOT_HINTS STRING_ARG
- {
- OUTYY(("P(server_root_hints:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, $2))
- yyerror("out of memory");
- }
- ;
-server_dlv_anchor_file: VAR_DLV_ANCHOR_FILE STRING_ARG
- {
- OUTYY(("P(server_dlv_anchor_file:%s)\n", $2));
- free(cfg_parser->cfg->dlv_anchor_file);
- cfg_parser->cfg->dlv_anchor_file = $2;
- }
- ;
-server_dlv_anchor: VAR_DLV_ANCHOR STRING_ARG
- {
- OUTYY(("P(server_dlv_anchor:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, $2))
- yyerror("out of memory");
- }
- ;
-server_auto_trust_anchor_file: VAR_AUTO_TRUST_ANCHOR_FILE STRING_ARG
- {
- OUTYY(("P(server_auto_trust_anchor_file:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->
- auto_trust_anchor_file_list, $2))
- yyerror("out of memory");
- }
- ;
-server_trust_anchor_file: VAR_TRUST_ANCHOR_FILE STRING_ARG
- {
- OUTYY(("P(server_trust_anchor_file:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->
- trust_anchor_file_list, $2))
- yyerror("out of memory");
- }
- ;
-server_trusted_keys_file: VAR_TRUSTED_KEYS_FILE STRING_ARG
- {
- OUTYY(("P(server_trusted_keys_file:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->
- trusted_keys_file_list, $2))
- yyerror("out of memory");
- }
- ;
-server_trust_anchor: VAR_TRUST_ANCHOR STRING_ARG
- {
- OUTYY(("P(server_trust_anchor:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, $2))
- yyerror("out of memory");
- }
- ;
-server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG
- {
- OUTYY(("P(server_domain_insecure:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, $2))
- yyerror("out of memory");
- }
- ;
-server_hide_identity: VAR_HIDE_IDENTITY STRING_ARG
- {
- OUTYY(("P(server_hide_identity:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->hide_identity = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_hide_version: VAR_HIDE_VERSION STRING_ARG
- {
- OUTYY(("P(server_hide_version:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->hide_version = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG
- {
- OUTYY(("P(server_hide_trustanchor:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->hide_trustanchor = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_identity: VAR_IDENTITY STRING_ARG
- {
- OUTYY(("P(server_identity:%s)\n", $2));
- free(cfg_parser->cfg->identity);
- cfg_parser->cfg->identity = $2;
- }
- ;
-server_version: VAR_VERSION STRING_ARG
- {
- OUTYY(("P(server_version:%s)\n", $2));
- free(cfg_parser->cfg->version);
- cfg_parser->cfg->version = $2;
- }
- ;
-server_so_rcvbuf: VAR_SO_RCVBUF STRING_ARG
- {
- OUTYY(("P(server_so_rcvbuf:%s)\n", $2));
- if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_rcvbuf))
- yyerror("buffer size expected");
- free($2);
- }
- ;
-server_so_sndbuf: VAR_SO_SNDBUF STRING_ARG
- {
- OUTYY(("P(server_so_sndbuf:%s)\n", $2));
- if(!cfg_parse_memsize($2, &cfg_parser->cfg->so_sndbuf))
- yyerror("buffer size expected");
- free($2);
- }
- ;
-server_so_reuseport: VAR_SO_REUSEPORT STRING_ARG
- {
- OUTYY(("P(server_so_reuseport:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->so_reuseport =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG
- {
- OUTYY(("P(server_ip_transparent:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->ip_transparent =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_ip_freebind: VAR_IP_FREEBIND STRING_ARG
- {
- OUTYY(("P(server_ip_freebind:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->ip_freebind =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_edns_buffer_size: VAR_EDNS_BUFFER_SIZE STRING_ARG
- {
- OUTYY(("P(server_edns_buffer_size:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else if (atoi($2) < 12)
- yyerror("edns buffer size too small");
- else if (atoi($2) > 65535)
- cfg_parser->cfg->edns_buffer_size = 65535;
- else cfg_parser->cfg->edns_buffer_size = atoi($2);
- free($2);
- }
- ;
-server_msg_buffer_size: VAR_MSG_BUFFER_SIZE STRING_ARG
- {
- OUTYY(("P(server_msg_buffer_size:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else if (atoi($2) < 4096)
- yyerror("message buffer size too small (use 4096)");
- else cfg_parser->cfg->msg_buffer_size = atoi($2);
- free($2);
- }
- ;
-server_msg_cache_size: VAR_MSG_CACHE_SIZE STRING_ARG
- {
- OUTYY(("P(server_msg_cache_size:%s)\n", $2));
- if(!cfg_parse_memsize($2, &cfg_parser->cfg->msg_cache_size))
- yyerror("memory size expected");
- free($2);
- }
- ;
-server_msg_cache_slabs: VAR_MSG_CACHE_SLABS STRING_ARG
- {
- OUTYY(("P(server_msg_cache_slabs:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->msg_cache_slabs = atoi($2);
- if(!is_pow2(cfg_parser->cfg->msg_cache_slabs))
- yyerror("must be a power of 2");
- }
- free($2);
- }
- ;
-server_num_queries_per_thread: VAR_NUM_QUERIES_PER_THREAD STRING_ARG
- {
- OUTYY(("P(server_num_queries_per_thread:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else cfg_parser->cfg->num_queries_per_thread = atoi($2);
- free($2);
- }
- ;
-server_jostle_timeout: VAR_JOSTLE_TIMEOUT STRING_ARG
- {
- OUTYY(("P(server_jostle_timeout:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->jostle_time = atoi($2);
- free($2);
- }
- ;
-server_delay_close: VAR_DELAY_CLOSE STRING_ARG
- {
- OUTYY(("P(server_delay_close:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->delay_close = atoi($2);
- free($2);
- }
- ;
-server_unblock_lan_zones: VAR_UNBLOCK_LAN_ZONES STRING_ARG
- {
- OUTYY(("P(server_unblock_lan_zones:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->unblock_lan_zones =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_insecure_lan_zones: VAR_INSECURE_LAN_ZONES STRING_ARG
- {
- OUTYY(("P(server_insecure_lan_zones:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->insecure_lan_zones =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_rrset_cache_size: VAR_RRSET_CACHE_SIZE STRING_ARG
- {
- OUTYY(("P(server_rrset_cache_size:%s)\n", $2));
- if(!cfg_parse_memsize($2, &cfg_parser->cfg->rrset_cache_size))
- yyerror("memory size expected");
- free($2);
- }
- ;
-server_rrset_cache_slabs: VAR_RRSET_CACHE_SLABS STRING_ARG
- {
- OUTYY(("P(server_rrset_cache_slabs:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->rrset_cache_slabs = atoi($2);
- if(!is_pow2(cfg_parser->cfg->rrset_cache_slabs))
- yyerror("must be a power of 2");
- }
- free($2);
- }
- ;
-server_infra_host_ttl: VAR_INFRA_HOST_TTL STRING_ARG
- {
- OUTYY(("P(server_infra_host_ttl:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->host_ttl = atoi($2);
- free($2);
- }
- ;
-server_infra_lame_ttl: VAR_INFRA_LAME_TTL STRING_ARG
- {
- OUTYY(("P(server_infra_lame_ttl:%s)\n", $2));
- verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
- "removed, use infra-host-ttl)", $2);
- free($2);
- }
- ;
-server_infra_cache_numhosts: VAR_INFRA_CACHE_NUMHOSTS STRING_ARG
- {
- OUTYY(("P(server_infra_cache_numhosts:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else cfg_parser->cfg->infra_cache_numhosts = atoi($2);
- free($2);
- }
- ;
-server_infra_cache_lame_size: VAR_INFRA_CACHE_LAME_SIZE STRING_ARG
- {
- OUTYY(("P(server_infra_cache_lame_size:%s)\n", $2));
- verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
- "(option removed, use infra-cache-numhosts)", $2);
- free($2);
- }
- ;
-server_infra_cache_slabs: VAR_INFRA_CACHE_SLABS STRING_ARG
- {
- OUTYY(("P(server_infra_cache_slabs:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->infra_cache_slabs = atoi($2);
- if(!is_pow2(cfg_parser->cfg->infra_cache_slabs))
- yyerror("must be a power of 2");
- }
- free($2);
- }
- ;
-server_infra_cache_min_rtt: VAR_INFRA_CACHE_MIN_RTT STRING_ARG
- {
- OUTYY(("P(server_infra_cache_min_rtt:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->infra_cache_min_rtt = atoi($2);
- free($2);
- }
- ;
-server_target_fetch_policy: VAR_TARGET_FETCH_POLICY STRING_ARG
- {
- OUTYY(("P(server_target_fetch_policy:%s)\n", $2));
- free(cfg_parser->cfg->target_fetch_policy);
- cfg_parser->cfg->target_fetch_policy = $2;
- }
- ;
-server_harden_short_bufsize: VAR_HARDEN_SHORT_BUFSIZE STRING_ARG
- {
- OUTYY(("P(server_harden_short_bufsize:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_short_bufsize =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_harden_large_queries: VAR_HARDEN_LARGE_QUERIES STRING_ARG
- {
- OUTYY(("P(server_harden_large_queries:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_large_queries =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_harden_glue: VAR_HARDEN_GLUE STRING_ARG
- {
- OUTYY(("P(server_harden_glue:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_glue =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_harden_dnssec_stripped: VAR_HARDEN_DNSSEC_STRIPPED STRING_ARG
- {
- OUTYY(("P(server_harden_dnssec_stripped:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_dnssec_stripped =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_harden_below_nxdomain: VAR_HARDEN_BELOW_NXDOMAIN STRING_ARG
- {
- OUTYY(("P(server_harden_below_nxdomain:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_below_nxdomain =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_harden_referral_path: VAR_HARDEN_REFERRAL_PATH STRING_ARG
- {
- OUTYY(("P(server_harden_referral_path:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_referral_path =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_harden_algo_downgrade: VAR_HARDEN_ALGO_DOWNGRADE STRING_ARG
- {
- OUTYY(("P(server_harden_algo_downgrade:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->harden_algo_downgrade =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_use_caps_for_id: VAR_USE_CAPS_FOR_ID STRING_ARG
- {
- OUTYY(("P(server_use_caps_for_id:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->use_caps_bits_for_id =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_caps_whitelist: VAR_CAPS_WHITELIST STRING_ARG
- {
- OUTYY(("P(server_caps_whitelist:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, $2))
- yyerror("out of memory");
- }
- ;
-server_private_address: VAR_PRIVATE_ADDRESS STRING_ARG
- {
- OUTYY(("P(server_private_address:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, $2))
- yyerror("out of memory");
- }
- ;
-server_private_domain: VAR_PRIVATE_DOMAIN STRING_ARG
- {
- OUTYY(("P(server_private_domain:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, $2))
- yyerror("out of memory");
- }
- ;
-server_prefetch: VAR_PREFETCH STRING_ARG
- {
- OUTYY(("P(server_prefetch:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->prefetch = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_prefetch_key: VAR_PREFETCH_KEY STRING_ARG
- {
- OUTYY(("P(server_prefetch_key:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->prefetch_key = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_unwanted_reply_threshold: VAR_UNWANTED_REPLY_THRESHOLD STRING_ARG
- {
- OUTYY(("P(server_unwanted_reply_threshold:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->unwanted_threshold = atoi($2);
- free($2);
- }
- ;
-server_do_not_query_address: VAR_DO_NOT_QUERY_ADDRESS STRING_ARG
- {
- OUTYY(("P(server_do_not_query_address:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, $2))
- yyerror("out of memory");
- }
- ;
-server_do_not_query_localhost: VAR_DO_NOT_QUERY_LOCALHOST STRING_ARG
- {
- OUTYY(("P(server_do_not_query_localhost:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->donotquery_localhost =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG
- {
- OUTYY(("P(server_access_control:%s %s)\n", $2, $3));
- if(strcmp($3, "deny")!=0 && strcmp($3, "refuse")!=0 &&
- strcmp($3, "deny_non_local")!=0 &&
- strcmp($3, "refuse_non_local")!=0 &&
- strcmp($3, "allow")!=0 &&
- strcmp($3, "allow_snoop")!=0) {
- yyerror("expected deny, refuse, deny_non_local, "
- "refuse_non_local, allow or allow_snoop "
- "in access control action");
- } else {
- if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3))
- fatal_exit("out of memory adding acl");
- }
- }
- ;
-server_module_conf: VAR_MODULE_CONF STRING_ARG
- {
- OUTYY(("P(server_module_conf:%s)\n", $2));
- free(cfg_parser->cfg->module_conf);
- cfg_parser->cfg->module_conf = $2;
- }
- ;
-server_val_override_date: VAR_VAL_OVERRIDE_DATE STRING_ARG
- {
- OUTYY(("P(server_val_override_date:%s)\n", $2));
- if(*$2 == '\0' || strcmp($2, "0") == 0) {
- cfg_parser->cfg->val_date_override = 0;
- } else if(strlen($2) == 14) {
- cfg_parser->cfg->val_date_override =
- cfg_convert_timeval($2);
- if(!cfg_parser->cfg->val_date_override)
- yyerror("bad date/time specification");
- } else {
- if(atoi($2) == 0)
- yyerror("number expected");
- cfg_parser->cfg->val_date_override = atoi($2);
- }
- free($2);
- }
- ;
-server_val_sig_skew_min: VAR_VAL_SIG_SKEW_MIN STRING_ARG
- {
- OUTYY(("P(server_val_sig_skew_min:%s)\n", $2));
- if(*$2 == '\0' || strcmp($2, "0") == 0) {
- cfg_parser->cfg->val_sig_skew_min = 0;
- } else {
- cfg_parser->cfg->val_sig_skew_min = atoi($2);
- if(!cfg_parser->cfg->val_sig_skew_min)
- yyerror("number expected");
- }
- free($2);
- }
- ;
-server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG
- {
- OUTYY(("P(server_val_sig_skew_max:%s)\n", $2));
- if(*$2 == '\0' || strcmp($2, "0") == 0) {
- cfg_parser->cfg->val_sig_skew_max = 0;
- } else {
- cfg_parser->cfg->val_sig_skew_max = atoi($2);
- if(!cfg_parser->cfg->val_sig_skew_max)
- yyerror("number expected");
- }
- free($2);
- }
- ;
-server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG
- {
- OUTYY(("P(server_cache_max_ttl:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->max_ttl = atoi($2);
- free($2);
- }
- ;
-server_cache_max_negative_ttl: VAR_CACHE_MAX_NEGATIVE_TTL STRING_ARG
- {
- OUTYY(("P(server_cache_max_negative_ttl:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->max_negative_ttl = atoi($2);
- free($2);
- }
- ;
-server_cache_min_ttl: VAR_CACHE_MIN_TTL STRING_ARG
- {
- OUTYY(("P(server_cache_min_ttl:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->min_ttl = atoi($2);
- free($2);
- }
- ;
-server_bogus_ttl: VAR_BOGUS_TTL STRING_ARG
- {
- OUTYY(("P(server_bogus_ttl:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->bogus_ttl = atoi($2);
- free($2);
- }
- ;
-server_val_clean_additional: VAR_VAL_CLEAN_ADDITIONAL STRING_ARG
- {
- OUTYY(("P(server_val_clean_additional:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->val_clean_additional =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_val_permissive_mode: VAR_VAL_PERMISSIVE_MODE STRING_ARG
- {
- OUTYY(("P(server_val_permissive_mode:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->val_permissive_mode =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_ignore_cd_flag: VAR_IGNORE_CD_FLAG STRING_ARG
- {
- OUTYY(("P(server_ignore_cd_flag:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->ignore_cd = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_serve_expired: VAR_SERVE_EXPIRED STRING_ARG
- {
- OUTYY(("P(server_serve_expired:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->serve_expired = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_fake_dsa: VAR_FAKE_DSA STRING_ARG
- {
- OUTYY(("P(server_fake_dsa:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
-#ifdef HAVE_SSL
- else fake_dsa = (strcmp($2, "yes")==0);
- if(fake_dsa)
- log_warn("test option fake_dsa is enabled");
-#endif
- free($2);
- }
- ;
-server_fake_sha1: VAR_FAKE_SHA1 STRING_ARG
- {
- OUTYY(("P(server_fake_sha1:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
-#ifdef HAVE_SSL
- else fake_sha1 = (strcmp($2, "yes")==0);
- if(fake_sha1)
- log_warn("test option fake_sha1 is enabled");
-#endif
- free($2);
- }
- ;
-server_val_log_level: VAR_VAL_LOG_LEVEL STRING_ARG
- {
- OUTYY(("P(server_val_log_level:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->val_log_level = atoi($2);
- free($2);
- }
- ;
-server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG
- {
- OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", $2));
- free(cfg_parser->cfg->val_nsec3_key_iterations);
- cfg_parser->cfg->val_nsec3_key_iterations = $2;
- }
- ;
-server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG
- {
- OUTYY(("P(server_add_holddown:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->add_holddown = atoi($2);
- free($2);
- }
- ;
-server_del_holddown: VAR_DEL_HOLDDOWN STRING_ARG
- {
- OUTYY(("P(server_del_holddown:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->del_holddown = atoi($2);
- free($2);
- }
- ;
-server_keep_missing: VAR_KEEP_MISSING STRING_ARG
- {
- OUTYY(("P(server_keep_missing:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->keep_missing = atoi($2);
- free($2);
- }
- ;
-server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG
- {
- OUTYY(("P(server_permit_small_holddown:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->permit_small_holddown =
- (strcmp($2, "yes")==0);
- free($2);
- }
-server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG
- {
- OUTYY(("P(server_key_cache_size:%s)\n", $2));
- if(!cfg_parse_memsize($2, &cfg_parser->cfg->key_cache_size))
- yyerror("memory size expected");
- free($2);
- }
- ;
-server_key_cache_slabs: VAR_KEY_CACHE_SLABS STRING_ARG
- {
- OUTYY(("P(server_key_cache_slabs:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->key_cache_slabs = atoi($2);
- if(!is_pow2(cfg_parser->cfg->key_cache_slabs))
- yyerror("must be a power of 2");
- }
- free($2);
- }
- ;
-server_neg_cache_size: VAR_NEG_CACHE_SIZE STRING_ARG
- {
- OUTYY(("P(server_neg_cache_size:%s)\n", $2));
- if(!cfg_parse_memsize($2, &cfg_parser->cfg->neg_cache_size))
- yyerror("memory size expected");
- free($2);
- }
- ;
-server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
- {
- OUTYY(("P(server_local_zone:%s %s)\n", $2, $3));
- if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
- strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
- strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
- && strcmp($3, "typetransparent")!=0
- && strcmp($3, "always_transparent")!=0
- && strcmp($3, "always_refuse")!=0
- && strcmp($3, "always_nxdomain")!=0
- && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0)
- yyerror("local-zone type: expected static, deny, "
- "refuse, redirect, transparent, "
- "typetransparent, inform, inform_deny, "
- "always_transparent, always_refuse, "
- "always_nxdomain or nodefault");
- else if(strcmp($3, "nodefault")==0) {
- if(!cfg_strlist_insert(&cfg_parser->cfg->
- local_zones_nodefault, $2))
- fatal_exit("out of memory adding local-zone");
- free($3);
- } else {
- if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones,
- $2, $3))
- fatal_exit("out of memory adding local-zone");
- }
- }
- ;
-server_local_data: VAR_LOCAL_DATA STRING_ARG
- {
- OUTYY(("P(server_local_data:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, $2))
- fatal_exit("out of memory adding local-data");
- }
- ;
-server_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
- {
- char* ptr;
- OUTYY(("P(server_local_data_ptr:%s)\n", $2));
- ptr = cfg_ptr_reverse($2);
- free($2);
- if(ptr) {
- if(!cfg_strlist_insert(&cfg_parser->cfg->
- local_data, ptr))
- fatal_exit("out of memory adding local-data");
- } else {
- yyerror("local-data-ptr could not be reversed");
- }
- }
- ;
-server_minimal_responses: VAR_MINIMAL_RESPONSES STRING_ARG
- {
- OUTYY(("P(server_minimal_responses:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->minimal_responses =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_rrset_roundrobin: VAR_RRSET_ROUNDROBIN STRING_ARG
- {
- OUTYY(("P(server_rrset_roundrobin:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->rrset_roundrobin =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_max_udp_size: VAR_MAX_UDP_SIZE STRING_ARG
- {
- OUTYY(("P(server_max_udp_size:%s)\n", $2));
- cfg_parser->cfg->max_udp_size = atoi($2);
- free($2);
- }
- ;
-server_dns64_prefix: VAR_DNS64_PREFIX STRING_ARG
- {
- OUTYY(("P(dns64_prefix:%s)\n", $2));
- free(cfg_parser->cfg->dns64_prefix);
- cfg_parser->cfg->dns64_prefix = $2;
- }
- ;
-server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG
- {
- OUTYY(("P(server_dns64_synthall:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dns64_synthall = (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_define_tag: VAR_DEFINE_TAG STRING_ARG
- {
- char* p, *s = $2;
- OUTYY(("P(server_define_tag:%s)\n", $2));
- while((p=strsep(&s, " \t\n")) != NULL) {
- if(*p) {
- if(!config_add_tag(cfg_parser->cfg, p))
- yyerror("could not define-tag, "
- "out of memory");
- }
- }
- free($2);
- }
- ;
-server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG
- {
- size_t len = 0;
- uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
- &len);
- free($3);
- OUTYY(("P(server_local_zone_tag:%s)\n", $2));
- if(!bitlist)
- yyerror("could not parse tags, (define-tag them first)");
- if(bitlist) {
- if(!cfg_strbytelist_insert(
- &cfg_parser->cfg->local_zone_tags,
- $2, bitlist, len)) {
- yyerror("out of memory");
- free($2);
- }
- }
- }
- ;
-server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG
- {
- size_t len = 0;
- uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
- &len);
- free($3);
- OUTYY(("P(server_access_control_tag:%s)\n", $2));
- if(!bitlist)
- yyerror("could not parse tags, (define-tag them first)");
- if(bitlist) {
- if(!cfg_strbytelist_insert(
- &cfg_parser->cfg->acl_tags,
- $2, bitlist, len)) {
- yyerror("out of memory");
- free($2);
- }
- }
- }
- ;
-server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG
- {
- OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", $2, $3, $4));
- if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
- $2, $3, $4)) {
- yyerror("out of memory");
- free($2);
- free($3);
- free($4);
- }
- }
- ;
-server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG
- {
- OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", $2, $3, $4));
- if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
- $2, $3, $4)) {
- yyerror("out of memory");
- free($2);
- free($3);
- free($4);
- }
- }
- ;
-server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG
- {
- OUTYY(("P(server_local_zone_override:%s %s %s)\n", $2, $3, $4));
- if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
- $2, $3, $4)) {
- yyerror("out of memory");
- free($2);
- free($3);
- free($4);
- }
- }
- ;
-server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG
- {
- OUTYY(("P(server_access_control_view:%s %s)\n", $2, $3));
- if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
- $2, $3)) {
- yyerror("out of memory");
- free($2);
- free($3);
- }
- }
- ;
-server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG
- {
- size_t len = 0;
- uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
- &len);
- free($3);
- OUTYY(("P(response_ip_tag:%s)\n", $2));
- if(!bitlist)
- yyerror("could not parse tags, (define-tag them first)");
- if(bitlist) {
- if(!cfg_strbytelist_insert(
- &cfg_parser->cfg->respip_tags,
- $2, bitlist, len)) {
- yyerror("out of memory");
- free($2);
- }
- }
- }
- ;
-server_ip_ratelimit: VAR_IP_RATELIMIT STRING_ARG
- {
- OUTYY(("P(server_ip_ratelimit:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->ip_ratelimit = atoi($2);
- free($2);
- }
- ;
-
-server_ratelimit: VAR_RATELIMIT STRING_ARG
- {
- OUTYY(("P(server_ratelimit:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->ratelimit = atoi($2);
- free($2);
- }
- ;
-server_ip_ratelimit_size: VAR_IP_RATELIMIT_SIZE STRING_ARG
- {
- OUTYY(("P(server_ip_ratelimit_size:%s)\n", $2));
- if(!cfg_parse_memsize($2, &cfg_parser->cfg->ip_ratelimit_size))
- yyerror("memory size expected");
- free($2);
- }
- ;
-server_ratelimit_size: VAR_RATELIMIT_SIZE STRING_ARG
- {
- OUTYY(("P(server_ratelimit_size:%s)\n", $2));
- if(!cfg_parse_memsize($2, &cfg_parser->cfg->ratelimit_size))
- yyerror("memory size expected");
- free($2);
- }
- ;
-server_ip_ratelimit_slabs: VAR_IP_RATELIMIT_SLABS STRING_ARG
- {
- OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->ip_ratelimit_slabs = atoi($2);
- if(!is_pow2(cfg_parser->cfg->ip_ratelimit_slabs))
- yyerror("must be a power of 2");
- }
- free($2);
- }
- ;
-server_ratelimit_slabs: VAR_RATELIMIT_SLABS STRING_ARG
- {
- OUTYY(("P(server_ratelimit_slabs:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("number expected");
- else {
- cfg_parser->cfg->ratelimit_slabs = atoi($2);
- if(!is_pow2(cfg_parser->cfg->ratelimit_slabs))
- yyerror("must be a power of 2");
- }
- free($2);
- }
- ;
-server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG
- {
- OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", $2, $3));
- if(atoi($3) == 0 && strcmp($3, "0") != 0) {
- yyerror("number expected");
- } else {
- if(!cfg_str2list_insert(&cfg_parser->cfg->
- ratelimit_for_domain, $2, $3))
- fatal_exit("out of memory adding "
- "ratelimit-for-domain");
- }
- }
- ;
-server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG
- {
- OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", $2, $3));
- if(atoi($3) == 0 && strcmp($3, "0") != 0) {
- yyerror("number expected");
- } else {
- if(!cfg_str2list_insert(&cfg_parser->cfg->
- ratelimit_below_domain, $2, $3))
- fatal_exit("out of memory adding "
- "ratelimit-below-domain");
- }
- }
- ;
-server_ip_ratelimit_factor: VAR_IP_RATELIMIT_FACTOR STRING_ARG
- {
- OUTYY(("P(server_ip_ratelimit_factor:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->ip_ratelimit_factor = atoi($2);
- free($2);
- }
- ;
-server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG
- {
- OUTYY(("P(server_ratelimit_factor:%s)\n", $2));
- if(atoi($2) == 0 && strcmp($2, "0") != 0)
- yyerror("number expected");
- else cfg_parser->cfg->ratelimit_factor = atoi($2);
- free($2);
- }
- ;
-server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG
- {
- OUTYY(("P(server_qname_minimisation:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->qname_minimisation =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_qname_minimisation_strict: VAR_QNAME_MINIMISATION_STRICT STRING_ARG
- {
- OUTYY(("P(server_qname_minimisation_strict:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->qname_minimisation_strict =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-stub_name: VAR_NAME STRING_ARG
- {
- OUTYY(("P(name:%s)\n", $2));
- if(cfg_parser->cfg->stubs->name)
- yyerror("stub name override, there must be one name "
- "for one stub-zone");
- free(cfg_parser->cfg->stubs->name);
- cfg_parser->cfg->stubs->name = $2;
- }
- ;
-stub_host: VAR_STUB_HOST STRING_ARG
- {
- OUTYY(("P(stub-host:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, $2))
- yyerror("out of memory");
- }
- ;
-stub_addr: VAR_STUB_ADDR STRING_ARG
- {
- OUTYY(("P(stub-addr:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, $2))
- yyerror("out of memory");
- }
- ;
-stub_first: VAR_STUB_FIRST STRING_ARG
- {
- OUTYY(("P(stub-first:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->stubs->isfirst=(strcmp($2, "yes")==0);
- free($2);
- }
- ;
-stub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG
- {
- OUTYY(("P(stub-ssl-upstream:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->stubs->ssl_upstream =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-stub_prime: VAR_STUB_PRIME STRING_ARG
- {
- OUTYY(("P(stub-prime:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->stubs->isprime =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-forward_name: VAR_NAME STRING_ARG
- {
- OUTYY(("P(name:%s)\n", $2));
- if(cfg_parser->cfg->forwards->name)
- yyerror("forward name override, there must be one "
- "name for one forward-zone");
- free(cfg_parser->cfg->forwards->name);
- cfg_parser->cfg->forwards->name = $2;
- }
- ;
-forward_host: VAR_FORWARD_HOST STRING_ARG
- {
- OUTYY(("P(forward-host:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, $2))
- yyerror("out of memory");
- }
- ;
-forward_addr: VAR_FORWARD_ADDR STRING_ARG
- {
- OUTYY(("P(forward-addr:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, $2))
- yyerror("out of memory");
- }
- ;
-forward_first: VAR_FORWARD_FIRST STRING_ARG
- {
- OUTYY(("P(forward-first:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->forwards->isfirst=(strcmp($2, "yes")==0);
- free($2);
- }
- ;
-forward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG
- {
- OUTYY(("P(forward-ssl-upstream:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->forwards->ssl_upstream =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-view_name: VAR_NAME STRING_ARG
- {
- OUTYY(("P(name:%s)\n", $2));
- if(cfg_parser->cfg->views->name)
- yyerror("view name override, there must be one "
- "name for one view");
- free(cfg_parser->cfg->views->name);
- cfg_parser->cfg->views->name = $2;
- }
- ;
-view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
- {
- OUTYY(("P(view_local_zone:%s %s)\n", $2, $3));
- if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
- strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
- strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
- && strcmp($3, "typetransparent")!=0
- && strcmp($3, "always_transparent")!=0
- && strcmp($3, "always_refuse")!=0
- && strcmp($3, "always_nxdomain")!=0
- && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0)
- yyerror("local-zone type: expected static, deny, "
- "refuse, redirect, transparent, "
- "typetransparent, inform, inform_deny, "
- "always_transparent, always_refuse, "
- "always_nxdomain or nodefault");
- else if(strcmp($3, "nodefault")==0) {
- if(!cfg_strlist_insert(&cfg_parser->cfg->views->
- local_zones_nodefault, $2))
- fatal_exit("out of memory adding local-zone");
- free($3);
- } else {
- if(!cfg_str2list_insert(
- &cfg_parser->cfg->views->local_zones,
- $2, $3))
- fatal_exit("out of memory adding local-zone");
- }
- }
- ;
-view_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG
- {
- OUTYY(("P(view_response_ip:%s %s)\n", $2, $3));
- validate_respip_action($3);
- if(!cfg_str2list_insert(
- &cfg_parser->cfg->views->respip_actions, $2, $3))
- fatal_exit("out of memory adding per-view "
- "response-ip action");
- }
- ;
-view_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG
- {
- OUTYY(("P(view_response_ip_data:%s)\n", $2));
- if(!cfg_str2list_insert(
- &cfg_parser->cfg->views->respip_data, $2, $3))
- fatal_exit("out of memory adding response-ip-data");
- }
- ;
-view_local_data: VAR_LOCAL_DATA STRING_ARG
- {
- OUTYY(("P(view_local_data:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, $2)) {
- fatal_exit("out of memory adding local-data");
- free($2);
- }
- }
- ;
-view_local_data_ptr: VAR_LOCAL_DATA_PTR STRING_ARG
- {
- char* ptr;
- OUTYY(("P(view_local_data_ptr:%s)\n", $2));
- ptr = cfg_ptr_reverse($2);
- free($2);
- if(ptr) {
- if(!cfg_strlist_insert(&cfg_parser->cfg->views->
- local_data, ptr))
- fatal_exit("out of memory adding local-data");
- } else {
- yyerror("local-data-ptr could not be reversed");
- }
- }
- ;
-view_first: VAR_VIEW_FIRST STRING_ARG
- {
- OUTYY(("P(view-first:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->views->isfirst=(strcmp($2, "yes")==0);
- free($2);
- }
- ;
-rcstart: VAR_REMOTE_CONTROL
- {
- OUTYY(("\nP(remote-control:)\n"));
- }
- ;
-contents_rc: contents_rc content_rc
- | ;
-content_rc: rc_control_enable | rc_control_interface | rc_control_port |
- rc_server_key_file | rc_server_cert_file | rc_control_key_file |
- rc_control_cert_file | rc_control_use_cert
- ;
-rc_control_enable: VAR_CONTROL_ENABLE STRING_ARG
- {
- OUTYY(("P(control_enable:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->remote_control_enable =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-rc_control_port: VAR_CONTROL_PORT STRING_ARG
- {
- OUTYY(("P(control_port:%s)\n", $2));
- if(atoi($2) == 0)
- yyerror("control port number expected");
- else cfg_parser->cfg->control_port = atoi($2);
- free($2);
- }
- ;
-rc_control_interface: VAR_CONTROL_INTERFACE STRING_ARG
- {
- OUTYY(("P(control_interface:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, $2))
- yyerror("out of memory");
- }
- ;
-rc_control_use_cert: VAR_CONTROL_USE_CERT STRING_ARG
- {
- OUTYY(("P(control_use_cert:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->remote_control_use_cert =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-rc_server_key_file: VAR_SERVER_KEY_FILE STRING_ARG
- {
- OUTYY(("P(rc_server_key_file:%s)\n", $2));
- free(cfg_parser->cfg->server_key_file);
- cfg_parser->cfg->server_key_file = $2;
- }
- ;
-rc_server_cert_file: VAR_SERVER_CERT_FILE STRING_ARG
- {
- OUTYY(("P(rc_server_cert_file:%s)\n", $2));
- free(cfg_parser->cfg->server_cert_file);
- cfg_parser->cfg->server_cert_file = $2;
- }
- ;
-rc_control_key_file: VAR_CONTROL_KEY_FILE STRING_ARG
- {
- OUTYY(("P(rc_control_key_file:%s)\n", $2));
- free(cfg_parser->cfg->control_key_file);
- cfg_parser->cfg->control_key_file = $2;
- }
- ;
-rc_control_cert_file: VAR_CONTROL_CERT_FILE STRING_ARG
- {
- OUTYY(("P(rc_control_cert_file:%s)\n", $2));
- free(cfg_parser->cfg->control_cert_file);
- cfg_parser->cfg->control_cert_file = $2;
- }
- ;
-dtstart: VAR_DNSTAP
- {
- OUTYY(("\nP(dnstap:)\n"));
- }
- ;
-contents_dt: contents_dt content_dt
- | ;
-content_dt: dt_dnstap_enable | dt_dnstap_socket_path |
- dt_dnstap_send_identity | dt_dnstap_send_version |
- dt_dnstap_identity | dt_dnstap_version |
- dt_dnstap_log_resolver_query_messages |
- dt_dnstap_log_resolver_response_messages |
- dt_dnstap_log_client_query_messages |
- dt_dnstap_log_client_response_messages |
- dt_dnstap_log_forwarder_query_messages |
- dt_dnstap_log_forwarder_response_messages
- ;
-dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG
- {
- OUTYY(("P(dt_dnstap_enable:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap = (strcmp($2, "yes")==0);
- }
- ;
-dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG
- {
- OUTYY(("P(dt_dnstap_socket_path:%s)\n", $2));
- free(cfg_parser->cfg->dnstap_socket_path);
- cfg_parser->cfg->dnstap_socket_path = $2;
- }
- ;
-dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG
- {
- OUTYY(("P(dt_dnstap_send_identity:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_send_identity = (strcmp($2, "yes")==0);
- }
- ;
-dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG
- {
- OUTYY(("P(dt_dnstap_send_version:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_send_version = (strcmp($2, "yes")==0);
- }
- ;
-dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG
- {
- OUTYY(("P(dt_dnstap_identity:%s)\n", $2));
- free(cfg_parser->cfg->dnstap_identity);
- cfg_parser->cfg->dnstap_identity = $2;
- }
- ;
-dt_dnstap_version: VAR_DNSTAP_VERSION STRING_ARG
- {
- OUTYY(("P(dt_dnstap_version:%s)\n", $2));
- free(cfg_parser->cfg->dnstap_version);
- cfg_parser->cfg->dnstap_version = $2;
- }
- ;
-dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES STRING_ARG
- {
- OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_resolver_query_messages =
- (strcmp($2, "yes")==0);
- }
- ;
-dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG
- {
- OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_resolver_response_messages =
- (strcmp($2, "yes")==0);
- }
- ;
-dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG
- {
- OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_client_query_messages =
- (strcmp($2, "yes")==0);
- }
- ;
-dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG
- {
- OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_client_response_messages =
- (strcmp($2, "yes")==0);
- }
- ;
-dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG
- {
- OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
- (strcmp($2, "yes")==0);
- }
- ;
-dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG
- {
- OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
- (strcmp($2, "yes")==0);
- }
- ;
-pythonstart: VAR_PYTHON
- {
- OUTYY(("\nP(python:)\n"));
- }
- ;
-contents_py: contents_py content_py
- | ;
-content_py: py_script
- ;
-py_script: VAR_PYTHON_SCRIPT STRING_ARG
- {
- OUTYY(("P(python-script:%s)\n", $2));
- free(cfg_parser->cfg->python_script);
- cfg_parser->cfg->python_script = $2;
- }
-server_disable_dnssec_lame_check: VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG
- {
- OUTYY(("P(disable_dnssec_lame_check:%s)\n", $2));
- if (strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->disable_dnssec_lame_check =
- (strcmp($2, "yes")==0);
- free($2);
- }
- ;
-server_log_identity: VAR_LOG_IDENTITY STRING_ARG
- {
- OUTYY(("P(server_log_identity:%s)\n", $2));
- free(cfg_parser->cfg->log_identity);
- cfg_parser->cfg->log_identity = $2;
- }
- ;
-server_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG
- {
- OUTYY(("P(server_response_ip:%s %s)\n", $2, $3));
- validate_respip_action($3);
- if(!cfg_str2list_insert(&cfg_parser->cfg->respip_actions,
- $2, $3))
- fatal_exit("out of memory adding response-ip");
- }
- ;
-server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG
- {
- OUTYY(("P(server_response_ip_data:%s)\n", $2));
- if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
- $2, $3))
- fatal_exit("out of memory adding response-ip-data");
- }
- ;
-dnscstart: VAR_DNSCRYPT
- {
- OUTYY(("\nP(dnscrypt:)\n"));
- OUTYY(("\nP(dnscrypt:)\n"));
- }
- ;
-contents_dnsc: contents_dnsc content_dnsc
- | ;
-content_dnsc:
- dnsc_dnscrypt_enable | dnsc_dnscrypt_port | dnsc_dnscrypt_provider |
- dnsc_dnscrypt_secret_key | dnsc_dnscrypt_provider_cert
- ;
-dnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG
- {
- OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", $2));
- if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
- yyerror("expected yes or no.");
- else cfg_parser->cfg->dnscrypt = (strcmp($2, "yes")==0);
- }
- ;
-
-dnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG
- {
- OUTYY(("P(dnsc_dnscrypt_port:%s)\n", $2));
-
- if(atoi($2) == 0)
- yyerror("port number expected");
- else cfg_parser->cfg->dnscrypt_port = atoi($2);
- free($2);
- }
- ;
-dnsc_dnscrypt_provider: VAR_DNSCRYPT_PROVIDER STRING_ARG
- {
- OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", $2));
- free(cfg_parser->cfg->dnscrypt_provider);
- cfg_parser->cfg->dnscrypt_provider = $2;
- }
- ;
-dnsc_dnscrypt_provider_cert: VAR_DNSCRYPT_PROVIDER_CERT STRING_ARG
- {
- OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, $2))
- fatal_exit("out of memory adding dnscrypt-provider-cert");
- }
- ;
-dnsc_dnscrypt_secret_key: VAR_DNSCRYPT_SECRET_KEY STRING_ARG
- {
- OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", $2));
- if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, $2))
- fatal_exit("out of memory adding dnscrypt-secret-key");
- }
- ;
-%%
-
-/* parse helper routines could be here */
-static void
-validate_respip_action(const char* action)
-{
- if(strcmp(action, "deny")!=0 &&
- strcmp(action, "redirect")!=0 &&
- strcmp(action, "inform")!=0 &&
- strcmp(action, "inform_deny")!=0 &&
- strcmp(action, "always_transparent")!=0 &&
- strcmp(action, "always_refuse")!=0 &&
- strcmp(action, "always_nxdomain")!=0)
- {
- yyerror("response-ip action: expected deny, redirect, "
- "inform, inform_deny, always_transparent, "
- "always_refuse or always_nxdomain");
- }
-}
diff --git a/external/unbound/util/configyyrename.h b/external/unbound/util/configyyrename.h
deleted file mode 100644
index f529be577..000000000
--- a/external/unbound/util/configyyrename.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * configyyrename.h -- renames for config file yy values to avoid conflicts.
- *
- * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
- *
- * See LICENSE for the license.
- *
- */
-
-#ifndef UTIL_CONFIGYYRENAME_H
-#define UTIL_CONFIGYYRENAME_H
-
-/* defines to change symbols so that no yacc/lex symbols clash */
-#define yymaxdepth ub_c_maxdepth
-#define yyparse ub_c_parse
-#define yylex ub_c_lex
-#define yyerror ub_c_error
-#define yylval ub_c_lval
-#define yychar ub_c_char
-#define yydebug ub_c_debug
-#define yypact ub_c_pact
-#define yyr1 ub_c_r1
-#define yyr2 ub_c_r2
-#define yydef ub_c_def
-#define yychk ub_c_chk
-#define yypgo ub_c_pgo
-#define yyact ub_c_act
-#define yyexca ub_c_exca
-#define yyerrflag ub_c_errflag
-#define yynerrs ub_c_nerrs
-#define yyps ub_c_ps
-#define yypv ub_c_pv
-#define yys ub_c_s
-#define yy_yys ub_c_yys
-#define yystate ub_c_state
-#define yytmp ub_c_tmp
-#define yyv ub_c_v
-#define yy_yyv ub_c_yyv
-#define yyval ub_c_val
-#define yylloc ub_c_lloc
-#define yyreds ub_c_reds
-#define yytoks ub_c_toks
-#define yylhs ub_c_yylhs
-#define yylen ub_c_yylen
-#define yydefred ub_c_yydefred
-#define yydgoto ub_c_yydgoto
-#define yysindex ub_c_yysindex
-#define yyrindex ub_c_yyrindex
-#define yygindex ub_c_yygindex
-#define yytable ub_c_yytable
-#define yycheck ub_c_yycheck
-#define yyname ub_c_yyname
-#define yyrule ub_c_yyrule
-#define yyin ub_c_in
-#define yyout ub_c_out
-#define yywrap ub_c_wrap
-#define yy_load_buffer_state ub_c_load_buffer_state
-#define yy_switch_to_buffer ub_c_switch_to_buffer
-#define yy_flush_buffer ub_c_flush_buffer
-#define yy_init_buffer ub_c_init_buffer
-#define yy_scan_buffer ub_c_scan_buffer
-#define yy_scan_bytes ub_c_scan_bytes
-#define yy_scan_string ub_c_scan_string
-#define yy_create_buffer ub_c_create_buffer
-#define yyrestart ub_c_restart
-#define yy_delete_buffer ub_c_delete_buffer
-#define yypop_buffer_state ub_c_pop_buffer_state
-#define yypush_buffer_state ub_c_push_buffer_state
-#define yyunput ub_c_unput
-#define yyset_in ub_c_set_in
-#define yyget_in ub_c_get_in
-#define yyset_out ub_c_set_out
-#define yyget_out ub_c_get_out
-#define yyget_lineno ub_c_get_lineno
-#define yyset_lineno ub_c_set_lineno
-#define yyset_debug ub_c_set_debug
-#define yyget_debug ub_c_get_debug
-#define yy_flex_debug ub_c_flex_debug
-#define yylex_destroy ub_c_lex_destroy
-#define yyfree ub_c_free
-#define yyrealloc ub_c_realloc
-#define yyalloc ub_c_alloc
-#define yymalloc ub_c_malloc
-#define yyget_leng ub_c_get_leng
-#define yylineno ub_c_lineno
-#define yyget_text ub_c_get_text
-
-#endif /* UTIL_CONFIGYYRENAME_H */
diff --git a/external/unbound/util/data/dname.c b/external/unbound/util/data/dname.c
deleted file mode 100644
index 517af2843..000000000
--- a/external/unbound/util/data/dname.c
+++ /dev/null
@@ -1,788 +0,0 @@
-/*
- * util/data/dname.h - domain name handling
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains domain name handling functions.
- */
-
-#include "config.h"
-#include <ctype.h>
-#include "util/data/dname.h"
-#include "util/data/msgparse.h"
-#include "util/log.h"
-#include "util/storage/lookup3.h"
-#include "sldns/sbuffer.h"
-
-/* determine length of a dname in buffer, no compression pointers allowed */
-size_t
-query_dname_len(sldns_buffer* query)
-{
- size_t len = 0;
- size_t labellen;
- while(1) {
- if(sldns_buffer_remaining(query) < 1)
- return 0; /* parse error, need label len */
- labellen = sldns_buffer_read_u8(query);
- if(labellen&0xc0)
- return 0; /* no compression allowed in queries */
- len += labellen + 1;
- if(len > LDNS_MAX_DOMAINLEN)
- return 0; /* too long */
- if(labellen == 0)
- return len;
- if(sldns_buffer_remaining(query) < labellen)
- return 0; /* parse error, need content */
- sldns_buffer_skip(query, (ssize_t)labellen);
- }
-}
-
-size_t
-dname_valid(uint8_t* dname, size_t maxlen)
-{
- size_t len = 0;
- size_t labellen;
- labellen = *dname++;
- while(labellen) {
- if(labellen&0xc0)
- return 0; /* no compression ptrs allowed */
- len += labellen + 1;
- if(len >= LDNS_MAX_DOMAINLEN)
- return 0; /* too long */
- if(len > maxlen)
- return 0; /* does not fit in memory allocation */
- dname += labellen;
- labellen = *dname++;
- }
- len += 1;
- if(len > maxlen)
- return 0; /* does not fit in memory allocation */
- return len;
-}
-
-/** compare uncompressed, noncanonical, registers are hints for speed */
-int
-query_dname_compare(register uint8_t* d1, register uint8_t* d2)
-{
- register uint8_t lab1, lab2;
- log_assert(d1 && d2);
- lab1 = *d1++;
- lab2 = *d2++;
- while( lab1 != 0 || lab2 != 0 ) {
- /* compare label length */
- /* if one dname ends, it has labellength 0 */
- if(lab1 != lab2) {
- if(lab1 < lab2)
- return -1;
- return 1;
- }
- log_assert(lab1 == lab2 && lab1 != 0);
- /* compare lowercased labels. */
- while(lab1--) {
- /* compare bytes first for speed */
- if(*d1 != *d2 &&
- tolower((unsigned char)*d1) != tolower((unsigned char)*d2)) {
- if(tolower((unsigned char)*d1) < tolower((unsigned char)*d2))
- return -1;
- return 1;
- }
- d1++;
- d2++;
- }
- /* next pair of labels. */
- lab1 = *d1++;
- lab2 = *d2++;
- }
- return 0;
-}
-
-void
-query_dname_tolower(uint8_t* dname)
-{
- /* the dname is stored uncompressed */
- uint8_t labellen;
- labellen = *dname;
- while(labellen) {
- dname++;
- while(labellen--) {
- *dname = (uint8_t)tolower((unsigned char)*dname);
- dname++;
- }
- labellen = *dname;
- }
-}
-
-void
-pkt_dname_tolower(sldns_buffer* pkt, uint8_t* dname)
-{
- uint8_t lablen;
- int count = 0;
- if(dname >= sldns_buffer_end(pkt))
- return;
- lablen = *dname++;
- while(lablen) {
- if(LABEL_IS_PTR(lablen)) {
- if((size_t)PTR_OFFSET(lablen, *dname)
- >= sldns_buffer_limit(pkt))
- return;
- dname = sldns_buffer_at(pkt, PTR_OFFSET(lablen, *dname));
- lablen = *dname++;
- if(count++ > MAX_COMPRESS_PTRS)
- return;
- continue;
- }
- if(dname+lablen >= sldns_buffer_end(pkt))
- return;
- while(lablen--) {
- *dname = (uint8_t)tolower((unsigned char)*dname);
- dname++;
- }
- if(dname >= sldns_buffer_end(pkt))
- return;
- lablen = *dname++;
- }
-}
-
-
-size_t
-pkt_dname_len(sldns_buffer* pkt)
-{
- size_t len = 0;
- int ptrcount = 0;
- uint8_t labellen;
- size_t endpos = 0;
-
- /* read dname and determine length */
- /* check compression pointers, loops, out of bounds */
- while(1) {
- /* read next label */
- if(sldns_buffer_remaining(pkt) < 1)
- return 0;
- labellen = sldns_buffer_read_u8(pkt);
- if(LABEL_IS_PTR(labellen)) {
- /* compression ptr */
- uint16_t ptr;
- if(sldns_buffer_remaining(pkt) < 1)
- return 0;
- ptr = PTR_OFFSET(labellen, sldns_buffer_read_u8(pkt));
- if(ptrcount++ > MAX_COMPRESS_PTRS)
- return 0; /* loop! */
- if(sldns_buffer_limit(pkt) <= ptr)
- return 0; /* out of bounds! */
- if(!endpos)
- endpos = sldns_buffer_position(pkt);
- sldns_buffer_set_position(pkt, ptr);
- } else {
- /* label contents */
- if(labellen > 0x3f)
- return 0; /* label too long */
- len += 1 + labellen;
- if(len > LDNS_MAX_DOMAINLEN)
- return 0;
- if(labellen == 0) {
- /* end of dname */
- break;
- }
- if(sldns_buffer_remaining(pkt) < labellen)
- return 0;
- sldns_buffer_skip(pkt, (ssize_t)labellen);
- }
- }
- if(endpos)
- sldns_buffer_set_position(pkt, endpos);
-
- return len;
-}
-
-int
-dname_pkt_compare(sldns_buffer* pkt, uint8_t* d1, uint8_t* d2)
-{
- uint8_t len1, len2;
- log_assert(pkt && d1 && d2);
- len1 = *d1++;
- len2 = *d2++;
- while( len1 != 0 || len2 != 0 ) {
- /* resolve ptrs */
- if(LABEL_IS_PTR(len1)) {
- d1 = sldns_buffer_at(pkt, PTR_OFFSET(len1, *d1));
- len1 = *d1++;
- continue;
- }
- if(LABEL_IS_PTR(len2)) {
- d2 = sldns_buffer_at(pkt, PTR_OFFSET(len2, *d2));
- len2 = *d2++;
- continue;
- }
- /* check label length */
- log_assert(len1 <= LDNS_MAX_LABELLEN);
- log_assert(len2 <= LDNS_MAX_LABELLEN);
- if(len1 != len2) {
- if(len1 < len2) return -1;
- return 1;
- }
- log_assert(len1 == len2 && len1 != 0);
- /* compare labels */
- while(len1--) {
- if(tolower((unsigned char)*d1) != tolower((unsigned char)*d2)) {
- if(tolower((unsigned char)*d1) < tolower((unsigned char)*d2))
- return -1;
- return 1;
- }
- d1++;
- d2++;
- }
- len1 = *d1++;
- len2 = *d2++;
- }
- return 0;
-}
-
-hashvalue_type
-dname_query_hash(uint8_t* dname, hashvalue_type h)
-{
- uint8_t labuf[LDNS_MAX_LABELLEN+1];
- uint8_t lablen;
- int i;
-
- /* preserve case of query, make hash label by label */
- lablen = *dname++;
- while(lablen) {
- log_assert(lablen <= LDNS_MAX_LABELLEN);
- labuf[0] = lablen;
- i=0;
- while(lablen--) {
- labuf[++i] = (uint8_t)tolower((unsigned char)*dname);
- dname++;
- }
- h = hashlittle(labuf, labuf[0] + 1, h);
- lablen = *dname++;
- }
-
- return h;
-}
-
-hashvalue_type
-dname_pkt_hash(sldns_buffer* pkt, uint8_t* dname, hashvalue_type h)
-{
- uint8_t labuf[LDNS_MAX_LABELLEN+1];
- uint8_t lablen;
- int i;
-
- /* preserve case of query, make hash label by label */
- lablen = *dname++;
- while(lablen) {
- if(LABEL_IS_PTR(lablen)) {
- /* follow pointer */
- dname = sldns_buffer_at(pkt, PTR_OFFSET(lablen, *dname));
- lablen = *dname++;
- continue;
- }
- log_assert(lablen <= LDNS_MAX_LABELLEN);
- labuf[0] = lablen;
- i=0;
- while(lablen--) {
- labuf[++i] = (uint8_t)tolower((unsigned char)*dname);
- dname++;
- }
- h = hashlittle(labuf, labuf[0] + 1, h);
- lablen = *dname++;
- }
-
- return h;
-}
-
-void dname_pkt_copy(sldns_buffer* pkt, uint8_t* to, uint8_t* dname)
-{
- /* copy over the dname and decompress it at the same time */
- size_t len = 0;
- uint8_t lablen;
- lablen = *dname++;
- while(lablen) {
- if(LABEL_IS_PTR(lablen)) {
- /* follow pointer */
- dname = sldns_buffer_at(pkt, PTR_OFFSET(lablen, *dname));
- lablen = *dname++;
- continue;
- }
- log_assert(lablen <= LDNS_MAX_LABELLEN);
- len += (size_t)lablen+1;
- if(len >= LDNS_MAX_DOMAINLEN) {
- *to = 0; /* end the result prematurely */
- log_err("bad dname in dname_pkt_copy");
- return;
- }
- *to++ = lablen;
- memmove(to, dname, lablen);
- dname += lablen;
- to += lablen;
- lablen = *dname++;
- }
- /* copy last \0 */
- *to = 0;
-}
-
-void dname_print(FILE* out, struct sldns_buffer* pkt, uint8_t* dname)
-{
- uint8_t lablen;
- if(!out) out = stdout;
- if(!dname) return;
-
- lablen = *dname++;
- if(!lablen)
- fputc('.', out);
- while(lablen) {
- if(LABEL_IS_PTR(lablen)) {
- /* follow pointer */
- if(!pkt) {
- fputs("??compressionptr??", out);
- return;
- }
- dname = sldns_buffer_at(pkt, PTR_OFFSET(lablen, *dname));
- lablen = *dname++;
- continue;
- }
- if(lablen > LDNS_MAX_LABELLEN) {
- fputs("??extendedlabel??", out);
- return;
- }
- while(lablen--)
- fputc((int)*dname++, out);
- fputc('.', out);
- lablen = *dname++;
- }
-}
-
-int
-dname_count_labels(uint8_t* dname)
-{
- uint8_t lablen;
- int labs = 1;
-
- lablen = *dname++;
- while(lablen) {
- labs++;
- dname += lablen;
- lablen = *dname++;
- }
- return labs;
-}
-
-int
-dname_count_size_labels(uint8_t* dname, size_t* size)
-{
- uint8_t lablen;
- int labs = 1;
- size_t sz = 1;
-
- lablen = *dname++;
- while(lablen) {
- labs++;
- sz += lablen+1;
- dname += lablen;
- lablen = *dname++;
- }
- *size = sz;
- return labs;
-}
-
-/**
- * Compare labels in memory, lowercase while comparing.
- * @param p1: label 1
- * @param p2: label 2
- * @param len: number of bytes to compare.
- * @return: 0, -1, +1 comparison result.
- */
-static int
-memlowercmp(uint8_t* p1, uint8_t* p2, uint8_t len)
-{
- while(len--) {
- if(*p1 != *p2 && tolower((unsigned char)*p1) != tolower((unsigned char)*p2)) {
- if(tolower((unsigned char)*p1) < tolower((unsigned char)*p2))
- return -1;
- return 1;
- }
- p1++;
- p2++;
- }
- return 0;
-}
-
-int
-dname_lab_cmp(uint8_t* d1, int labs1, uint8_t* d2, int labs2, int* mlabs)
-{
- uint8_t len1, len2;
- int atlabel = labs1;
- int lastmlabs;
- int lastdiff = 0;
- /* first skip so that we compare same label. */
- if(labs1 > labs2) {
- while(atlabel > labs2) {
- len1 = *d1++;
- d1 += len1;
- atlabel--;
- }
- log_assert(atlabel == labs2);
- } else if(labs1 < labs2) {
- atlabel = labs2;
- while(atlabel > labs1) {
- len2 = *d2++;
- d2 += len2;
- atlabel--;
- }
- log_assert(atlabel == labs1);
- }
- lastmlabs = atlabel+1;
- /* now at same label in d1 and d2, atlabel */
- /* www.example.com. */
- /* 4 3 2 1 atlabel number */
- /* repeat until at root label (which is always the same) */
- while(atlabel > 1) {
- len1 = *d1++;
- len2 = *d2++;
- if(len1 != len2) {
- log_assert(len1 != 0 && len2 != 0);
- if(len1<len2)
- lastdiff = -1;
- else lastdiff = 1;
- lastmlabs = atlabel;
- d1 += len1;
- d2 += len2;
- } else {
- /* memlowercmp is inlined here; or just like
- * if((c=memlowercmp(d1, d2, len1)) != 0) {
- * lastdiff = c;
- * lastmlabs = atlabel; } apart from d1++,d2++ */
- while(len1) {
- if(*d1 != *d2 && tolower((unsigned char)*d1)
- != tolower((unsigned char)*d2)) {
- if(tolower((unsigned char)*d1) <
- tolower((unsigned char)*d2)) {
- lastdiff = -1;
- lastmlabs = atlabel;
- d1 += len1;
- d2 += len1;
- break;
- }
- lastdiff = 1;
- lastmlabs = atlabel;
- d1 += len1;
- d2 += len1;
- break; /* out of memlowercmp */
- }
- d1++;
- d2++;
- len1--;
- }
- }
- atlabel--;
- }
- /* last difference atlabel number, so number of labels matching,
- * at the right side, is one less. */
- *mlabs = lastmlabs-1;
- if(lastdiff == 0) {
- /* all labels compared were equal, check if one has more
- * labels, so that example.com. > com. */
- if(labs1 > labs2)
- return 1;
- else if(labs1 < labs2)
- return -1;
- }
- return lastdiff;
-}
-
-int
-dname_buffer_write(sldns_buffer* pkt, uint8_t* dname)
-{
- uint8_t lablen;
-
- if(sldns_buffer_remaining(pkt) < 1)
- return 0;
- lablen = *dname++;
- sldns_buffer_write_u8(pkt, lablen);
- while(lablen) {
- if(sldns_buffer_remaining(pkt) < (size_t)lablen+1)
- return 0;
- sldns_buffer_write(pkt, dname, lablen);
- dname += lablen;
- lablen = *dname++;
- sldns_buffer_write_u8(pkt, lablen);
- }
- return 1;
-}
-
-void dname_str(uint8_t* dname, char* str)
-{
- size_t len = 0;
- uint8_t lablen = 0;
- char* s = str;
- if(!dname || !*dname) {
- *s++ = '.';
- *s = 0;
- return;
- }
- lablen = *dname++;
- while(lablen) {
- if(lablen > LDNS_MAX_LABELLEN) {
- *s++ = '#';
- *s = 0;
- return;
- }
- len += lablen+1;
- if(len >= LDNS_MAX_DOMAINLEN-1) {
- *s++ = '&';
- *s = 0;
- return;
- }
- while(lablen--) {
- if(isalnum((unsigned char)*dname)
- || *dname == '-' || *dname == '_'
- || *dname == '*')
- *s++ = *(char*)dname++;
- else {
- *s++ = '?';
- dname++;
- }
- }
- *s++ = '.';
- lablen = *dname++;
- }
- *s = 0;
-}
-
-int
-dname_strict_subdomain(uint8_t* d1, int labs1, uint8_t* d2, int labs2)
-{
- int m;
- /* check subdomain: d1: www.example.com. and d2: example.com. */
- if(labs2 >= labs1)
- return 0;
- if(dname_lab_cmp(d1, labs1, d2, labs2, &m) > 0) {
- /* subdomain if all labels match */
- return (m == labs2);
- }
- return 0;
-}
-
-int
-dname_strict_subdomain_c(uint8_t* d1, uint8_t* d2)
-{
- return dname_strict_subdomain(d1, dname_count_labels(d1), d2,
- dname_count_labels(d2));
-}
-
-int
-dname_subdomain_c(uint8_t* d1, uint8_t* d2)
-{
- int m;
- /* check subdomain: d1: www.example.com. and d2: example.com. */
- /* or d1: example.com. and d2: example.com. */
- int labs1 = dname_count_labels(d1);
- int labs2 = dname_count_labels(d2);
- if(labs2 > labs1)
- return 0;
- if(dname_lab_cmp(d1, labs1, d2, labs2, &m) < 0) {
- /* must have been example.com , www.example.com - wrong */
- /* or otherwise different dnames */
- return 0;
- }
- return (m == labs2);
-}
-
-int
-dname_is_root(uint8_t* dname)
-{
- uint8_t len;
- log_assert(dname);
- len = dname[0];
- log_assert(!LABEL_IS_PTR(len));
- return (len == 0);
-}
-
-void
-dname_remove_label(uint8_t** dname, size_t* len)
-{
- size_t lablen;
- log_assert(dname && *dname && len);
- lablen = (*dname)[0];
- log_assert(!LABEL_IS_PTR(lablen));
- log_assert(*len > lablen);
- if(lablen == 0)
- return; /* do not modify root label */
- *len -= lablen+1;
- *dname += lablen+1;
-}
-
-void
-dname_remove_labels(uint8_t** dname, size_t* len, int n)
-{
- int i;
- for(i=0; i<n; i++)
- dname_remove_label(dname, len);
-}
-
-int
-dname_signame_label_count(uint8_t* dname)
-{
- uint8_t lablen;
- int count = 0;
- if(!*dname)
- return 0;
- if(dname[0] == 1 && dname[1] == '*')
- dname += 2;
- lablen = dname[0];
- while(lablen) {
- count++;
- dname += lablen;
- dname += 1;
- lablen = dname[0];
- }
- return count;
-}
-
-int
-dname_is_wild(uint8_t* dname)
-{
- return (dname[0] == 1 && dname[1] == '*');
-}
-
-/**
- * Compare labels in memory, lowercase while comparing.
- * Returns canonical order for labels. If all is equal, the
- * shortest is first.
- *
- * @param p1: label 1
- * @param len1: length of label 1.
- * @param p2: label 2
- * @param len2: length of label 2.
- * @return: 0, -1, +1 comparison result.
- */
-static int
-memcanoncmp(uint8_t* p1, uint8_t len1, uint8_t* p2, uint8_t len2)
-{
- uint8_t min = (len1<len2)?len1:len2;
- int c = memlowercmp(p1, p2, min);
- if(c != 0)
- return c;
- /* equal, see who is shortest */
- if(len1 < len2)
- return -1;
- if(len1 > len2)
- return 1;
- return 0;
-}
-
-
-int
-dname_canon_lab_cmp(uint8_t* d1, int labs1, uint8_t* d2, int labs2, int* mlabs)
-{
- /* like dname_lab_cmp, but with different label comparison,
- * empty character sorts before \000.
- * So ylyly is before z. */
- uint8_t len1, len2;
- int atlabel = labs1;
- int lastmlabs;
- int lastdiff = 0;
- int c;
- /* first skip so that we compare same label. */
- if(labs1 > labs2) {
- while(atlabel > labs2) {
- len1 = *d1++;
- d1 += len1;
- atlabel--;
- }
- log_assert(atlabel == labs2);
- } else if(labs1 < labs2) {
- atlabel = labs2;
- while(atlabel > labs1) {
- len2 = *d2++;
- d2 += len2;
- atlabel--;
- }
- log_assert(atlabel == labs1);
- }
- lastmlabs = atlabel+1;
- /* now at same label in d1 and d2, atlabel */
- /* www.example.com. */
- /* 4 3 2 1 atlabel number */
- /* repeat until at root label (which is always the same) */
- while(atlabel > 1) {
- len1 = *d1++;
- len2 = *d2++;
-
- if((c=memcanoncmp(d1, len1, d2, len2)) != 0) {
- if(c<0)
- lastdiff = -1;
- else lastdiff = 1;
- lastmlabs = atlabel;
- }
-
- d1 += len1;
- d2 += len2;
- atlabel--;
- }
- /* last difference atlabel number, so number of labels matching,
- * at the right side, is one less. */
- *mlabs = lastmlabs-1;
- if(lastdiff == 0) {
- /* all labels compared were equal, check if one has more
- * labels, so that example.com. > com. */
- if(labs1 > labs2)
- return 1;
- else if(labs1 < labs2)
- return -1;
- }
- return lastdiff;
-}
-
-int
-dname_canonical_compare(uint8_t* d1, uint8_t* d2)
-{
- int labs1, labs2, m;
- labs1 = dname_count_labels(d1);
- labs2 = dname_count_labels(d2);
- return dname_canon_lab_cmp(d1, labs1, d2, labs2, &m);
-}
-
-uint8_t* dname_get_shared_topdomain(uint8_t* d1, uint8_t* d2)
-{
- int labs1, labs2, m;
- size_t len = LDNS_MAX_DOMAINLEN;
- labs1 = dname_count_labels(d1);
- labs2 = dname_count_labels(d2);
- (void)dname_lab_cmp(d1, labs1, d2, labs2, &m);
- dname_remove_labels(&d1, &len, labs1-m);
- return d1;
-}
diff --git a/external/unbound/util/data/dname.h b/external/unbound/util/data/dname.h
deleted file mode 100644
index 53b341bf7..000000000
--- a/external/unbound/util/data/dname.h
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * util/data/dname.h - domain name routines
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains functions to deal with domain names (dnames).
- *
- * Some of the functions deal with domain names as a wireformat buffer,
- * with a length.
- */
-
-#ifndef UTIL_DATA_DNAME_H
-#define UTIL_DATA_DNAME_H
-#include "util/storage/lruhash.h"
-struct sldns_buffer;
-
-/** max number of compression ptrs to follow */
-#define MAX_COMPRESS_PTRS 256
-
-/**
- * Determine length of dname in buffer, no compression ptrs allowed,
- * @param query: the ldns buffer, current position at start of dname.
- * at end, position is at end of the dname.
- * @return: 0 on parse failure, or length including ending 0 of dname.
- */
-size_t query_dname_len(struct sldns_buffer* query);
-
-/**
- * Determine if dname in memory is correct. no compression ptrs allowed.
- * @param dname: where dname starts in memory.
- * @param len: dname is not allowed to exceed this length (i.e. of allocation).
- * @return length of dname if dname is ok, 0 on a parse error.
- */
-size_t dname_valid(uint8_t* dname, size_t len);
-
-/** lowercase query dname */
-void query_dname_tolower(uint8_t* dname);
-
-/**
- * lowercase pkt dname (follows compression pointers)
- * @param pkt: the packet, used to follow compression pointers. Position
- * is unchanged.
- * @param dname: start of dname in packet.
- */
-void pkt_dname_tolower(struct sldns_buffer* pkt, uint8_t* dname);
-
-/**
- * Compare query dnames (uncompressed storage). The Dnames passed do not
- * have to be lowercased, comparison routine does this.
- *
- * This routine is special, in that the comparison that it does corresponds
- * with the canonical comparison needed when comparing dnames inside rdata
- * for RR types that need canonicalization. That means that the first byte
- * that is smaller (possibly after lowercasing) makes an RR smaller, or the
- * shortest name makes an RR smaller.
- *
- * This routine does not compute the canonical order needed for NSEC
- * processing.
- *
- * Dnames have to be valid format.
- * @param d1: dname to compare
- * @param d2: dname to compare
- * @return: -1, 0, or +1 depending on comparison results.
- * Sort order is first difference found. not the canonical ordering.
- */
-int query_dname_compare(uint8_t* d1, uint8_t* d2);
-
-/**
- * Determine correct, compressed, dname present in packet.
- * Checks for parse errors.
- * @param pkt: packet to read from (from current start position).
- * @return: 0 on parse error.
- * At exit the position is right after the (compressed) dname.
- * Compression pointers are followed and checked for loops.
- * The uncompressed wireformat length is returned.
- */
-size_t pkt_dname_len(struct sldns_buffer* pkt);
-
-/**
- * Compare dnames in packet (compressed). Dnames must be valid.
- * routine performs lowercasing, so the packet casing is preserved.
- * @param pkt: packet, used to resolve compression pointers.
- * @param d1: dname to compare
- * @param d2: dname to compare
- * @return: -1, 0, or +1 depending on comparison results.
- * Sort order is first difference found. not the canonical ordering.
- */
-int dname_pkt_compare(struct sldns_buffer* pkt, uint8_t* d1, uint8_t* d2);
-
-/**
- * Hash dname, label by label, lowercasing, into hashvalue.
- * Dname in query format (not compressed).
- * @param dname: dname to hash.
- * @param h: initial hash value.
- * @return: result hash value.
- */
-hashvalue_type dname_query_hash(uint8_t* dname, hashvalue_type h);
-
-/**
- * Hash dname, label by label, lowercasing, into hashvalue.
- * Dname in pkt format (compressed).
- * @param pkt: packet, for resolving compression pointers.
- * @param dname: dname to hash, pointer to the pkt buffer.
- * Must be valid format. No loops, etc.
- * @param h: initial hash value.
- * @return: result hash value.
- * Result is the same as dname_query_hash, even if compression is used.
- */
-hashvalue_type dname_pkt_hash(struct sldns_buffer* pkt, uint8_t* dname,
- hashvalue_type h);
-
-/**
- * Copy over a valid dname and decompress it.
- * @param pkt: packet to resolve compression pointers.
- * @param to: buffer of size from pkt_len function to hold result.
- * @param dname: pointer into packet where dname starts.
- */
-void dname_pkt_copy(struct sldns_buffer* pkt, uint8_t* to, uint8_t* dname);
-
-/**
- * Copy over a valid dname to a packet.
- * @param pkt: packet to copy to.
- * @param dname: dname to copy.
- * @return: 0 if not enough space in buffer.
- */
-int dname_buffer_write(struct sldns_buffer* pkt, uint8_t* dname);
-
-/**
- * Count the number of labels in an uncompressed dname in memory.
- * @param dname: pointer to uncompressed dname.
- * @return: count of labels, including root label, "com." has 2 labels.
- */
-int dname_count_labels(uint8_t* dname);
-
-/**
- * Count labels and dname length both, for uncompressed dname in memory.
- * @param dname: pointer to uncompressed dname.
- * @param size: length of dname, including root label.
- * @return: count of labels, including root label, "com." has 2 labels.
- */
-int dname_count_size_labels(uint8_t* dname, size_t* size);
-
-/**
- * Compare dnames, sorted not canonical, but by label.
- * Such that zone contents follows zone apex.
- * @param d1: first dname. pointer to uncompressed wireformat.
- * @param labs1: number of labels in first dname.
- * @param d2: second dname. pointer to uncompressed wireformat.
- * @param labs2: number of labels in second dname.
- * @param mlabs: number of labels that matched exactly (the shared topdomain).
- * @return: 0 for equal, -1 smaller, or +1 d1 larger than d2.
- */
-int dname_lab_cmp(uint8_t* d1, int labs1, uint8_t* d2, int labs2, int* mlabs);
-
-/**
- * See if domain name d1 is a strict subdomain of d2.
- * That is a subdomain, but not equal.
- * @param d1: domain name, uncompressed wireformat
- * @param labs1: number of labels in d1, including root label.
- * @param d2: domain name, uncompressed wireformat
- * @param labs2: number of labels in d2, including root label.
- * @return true if d1 is a subdomain of d2, but not equal to d2.
- */
-int dname_strict_subdomain(uint8_t* d1, int labs1, uint8_t* d2, int labs2);
-
-/**
- * Like dname_strict_subdomain but counts labels
- * @param d1: domain name, uncompressed wireformat
- * @param d2: domain name, uncompressed wireformat
- * @return true if d1 is a subdomain of d2, but not equal to d2.
- */
-int dname_strict_subdomain_c(uint8_t* d1, uint8_t* d2);
-
-/**
- * Counts labels. Tests is d1 is a subdomain of d2.
- * @param d1: domain name, uncompressed wireformat
- * @param d2: domain name, uncompressed wireformat
- * @return true if d1 is a subdomain of d2.
- */
-int dname_subdomain_c(uint8_t* d1, uint8_t* d2);
-
-/**
- * Debug helper. Print wireformat dname to output.
- * @param out: like stdout or a file.
- * @param pkt: if not NULL, the packet for resolving compression ptrs.
- * @param dname: pointer to (start of) dname.
- */
-void dname_print(FILE* out, struct sldns_buffer* pkt, uint8_t* dname);
-
-/**
- * Debug helper. Print dname to given string buffer (string buffer must
- * be at least 255 chars + 1 for the 0, in printable form.
- * This may lose information (? for nonprintable characters, or & if
- * the name is too long, # for a bad label length).
- * @param dname: uncompressed wireformat.
- * @param str: buffer of 255+1 length.
- */
-void dname_str(uint8_t* dname, char* str);
-
-/**
- * Returns true if the uncompressed wireformat dname is the root "."
- * @param dname: the dname to check
- * @return true if ".", false if not.
- */
-int dname_is_root(uint8_t* dname);
-
-/**
- * Snip off first label from a dname, returning the parent zone.
- * @param dname: from what to strip off. uncompressed wireformat.
- * @param len: length, adjusted to become less.
- * @return stripped off, or "." if input was ".".
- */
-void dname_remove_label(uint8_t** dname, size_t* len);
-
-/**
- * Snip off first N labels from a dname, returning the parent zone.
- * @param dname: from what to strip off. uncompressed wireformat.
- * @param len: length, adjusted to become less.
- * @param n: number of labels to strip off (from the left).
- * if 0, nothing happens.
- * @return stripped off, or "." if input was ".".
- */
-void dname_remove_labels(uint8_t** dname, size_t* len, int n);
-
-/**
- * Count labels for the RRSIG signature label field.
- * Like a normal labelcount, but "*" wildcard and "." root are not counted.
- * @param dname: valid uncompressed wireformat.
- * @return number of labels like in RRSIG; '*' and '.' are not counted.
- */
-int dname_signame_label_count(uint8_t* dname);
-
-/**
- * Return true if the label is a wildcard, *.example.com.
- * @param dname: valid uncompressed wireformat.
- * @return true if wildcard, or false.
- */
-int dname_is_wild(uint8_t* dname);
-
-/**
- * Compare dnames, Canonical in rfc4034 sense, but by label.
- * Such that zone contents follows zone apex.
- *
- * @param d1: first dname. pointer to uncompressed wireformat.
- * @param labs1: number of labels in first dname.
- * @param d2: second dname. pointer to uncompressed wireformat.
- * @param labs2: number of labels in second dname.
- * @param mlabs: number of labels that matched exactly (the shared topdomain).
- * @return: 0 for equal, -1 smaller, or +1 d1 larger than d2.
- */
-int dname_canon_lab_cmp(uint8_t* d1, int labs1, uint8_t* d2, int labs2,
- int* mlabs);
-
-/**
- * Canonical dname compare. Takes care of counting labels.
- * Per rfc 4034 canonical order.
- *
- * @param d1: first dname. pointer to uncompressed wireformat.
- * @param d2: second dname. pointer to uncompressed wireformat.
- * @return: 0 for equal, -1 smaller, or +1 d1 larger than d2.
- */
-int dname_canonical_compare(uint8_t* d1, uint8_t* d2);
-
-/**
- * Get the shared topdomain between two names. Root "." or longer.
- * @param d1: first dname. pointer to uncompressed wireformat.
- * @param d2: second dname. pointer to uncompressed wireformat.
- * @return pointer to shared topdomain. Ptr to a part of d1.
- */
-uint8_t* dname_get_shared_topdomain(uint8_t* d1, uint8_t* d2);
-
-#endif /* UTIL_DATA_DNAME_H */
diff --git a/external/unbound/util/data/msgencode.c b/external/unbound/util/data/msgencode.c
deleted file mode 100644
index 1f72a03b8..000000000
--- a/external/unbound/util/data/msgencode.c
+++ /dev/null
@@ -1,916 +0,0 @@
-/*
- * util/data/msgencode.c - Encode DNS messages, queries and replies.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains a routines to encode DNS messages.
- */
-
-#include "config.h"
-#include "util/data/msgencode.h"
-#include "util/data/msgreply.h"
-#include "util/data/msgparse.h"
-#include "util/data/dname.h"
-#include "util/log.h"
-#include "util/regional.h"
-#include "util/net_help.h"
-#include "sldns/sbuffer.h"
-#include "services/localzone.h"
-
-/** return code that means the function ran out of memory. negative so it does
- * not conflict with DNS rcodes. */
-#define RETVAL_OUTMEM -2
-/** return code that means the data did not fit (completely) in the packet */
-#define RETVAL_TRUNC -4
-/** return code that means all is peachy keen. Equal to DNS rcode NOERROR */
-#define RETVAL_OK 0
-
-/**
- * Data structure to help domain name compression in outgoing messages.
- * A tree of dnames and their offsets in the packet is kept.
- * It is kept sorted, not canonical, but by label at least, so that after
- * a lookup of a name you know its closest match, and the parent from that
- * closest match. These are possible compression targets.
- *
- * It is a binary tree, not a rbtree or balanced tree, as the effort
- * of keeping it balanced probably outweighs usefulness (given typical
- * DNS packet size).
- */
-struct compress_tree_node {
- /** left node in tree, all smaller to this */
- struct compress_tree_node* left;
- /** right node in tree, all larger than this */
- struct compress_tree_node* right;
-
- /** the parent node - not for tree, but zone parent. One less label */
- struct compress_tree_node* parent;
- /** the domain name for this node. Pointer to uncompressed memory. */
- uint8_t* dname;
- /** number of labels in domain name, kept to help compare func. */
- int labs;
- /** offset in packet that points to this dname */
- size_t offset;
-};
-
-/**
- * Find domain name in tree, returns exact and closest match.
- * @param tree: root of tree.
- * @param dname: pointer to uncompressed dname.
- * @param labs: number of labels in domain name.
- * @param match: closest or exact match.
- * guaranteed to be smaller or equal to the sought dname.
- * can be null if the tree is empty.
- * @param matchlabels: number of labels that match with closest match.
- * can be zero is there is no match.
- * @param insertpt: insert location for dname, if not found.
- * @return: 0 if no exact match.
- */
-static int
-compress_tree_search(struct compress_tree_node** tree, uint8_t* dname,
- int labs, struct compress_tree_node** match, int* matchlabels,
- struct compress_tree_node*** insertpt)
-{
- int c, n, closen=0;
- struct compress_tree_node* p = *tree;
- struct compress_tree_node* close = 0;
- struct compress_tree_node** prev = tree;
- while(p) {
- if((c = dname_lab_cmp(dname, labs, p->dname, p->labs, &n))
- == 0) {
- *matchlabels = n;
- *match = p;
- return 1;
- }
- if(c<0) {
- prev = &p->left;
- p = p->left;
- } else {
- closen = n;
- close = p; /* p->dname is smaller than dname */
- prev = &p->right;
- p = p->right;
- }
- }
- *insertpt = prev;
- *matchlabels = closen;
- *match = close;
- return 0;
-}
-
-/**
- * Lookup a domain name in compression tree.
- * @param tree: root of tree (not the node with '.').
- * @param dname: pointer to uncompressed dname.
- * @param labs: number of labels in domain name.
- * @param insertpt: insert location for dname, if not found.
- * @return: 0 if not found or compress treenode with best compression.
- */
-static struct compress_tree_node*
-compress_tree_lookup(struct compress_tree_node** tree, uint8_t* dname,
- int labs, struct compress_tree_node*** insertpt)
-{
- struct compress_tree_node* p;
- int m;
- if(labs <= 1)
- return 0; /* do not compress root node */
- if(compress_tree_search(tree, dname, labs, &p, &m, insertpt)) {
- /* exact match */
- return p;
- }
- /* return some ancestor of p that compresses well. */
- if(m>1) {
- /* www.example.com. (labs=4) matched foo.example.com.(labs=4)
- * then matchcount = 3. need to go up. */
- while(p && p->labs > m)
- p = p->parent;
- return p;
- }
- return 0;
-}
-
-/**
- * Create node for domain name compression tree.
- * @param dname: pointer to uncompressed dname (stored in tree).
- * @param labs: number of labels in dname.
- * @param offset: offset into packet for dname.
- * @param region: how to allocate memory for new node.
- * @return new node or 0 on malloc failure.
- */
-static struct compress_tree_node*
-compress_tree_newnode(uint8_t* dname, int labs, size_t offset,
- struct regional* region)
-{
- struct compress_tree_node* n = (struct compress_tree_node*)
- regional_alloc(region, sizeof(struct compress_tree_node));
- if(!n) return 0;
- n->left = 0;
- n->right = 0;
- n->parent = 0;
- n->dname = dname;
- n->labs = labs;
- n->offset = offset;
- return n;
-}
-
-/**
- * Store domain name and ancestors into compression tree.
- * @param dname: pointer to uncompressed dname (stored in tree).
- * @param labs: number of labels in dname.
- * @param offset: offset into packet for dname.
- * @param region: how to allocate memory for new node.
- * @param closest: match from previous lookup, used to compress dname.
- * may be NULL if no previous match.
- * if the tree has an ancestor of dname already, this must be it.
- * @param insertpt: where to insert the dname in tree.
- * @return: 0 on memory error.
- */
-static int
-compress_tree_store(uint8_t* dname, int labs, size_t offset,
- struct regional* region, struct compress_tree_node* closest,
- struct compress_tree_node** insertpt)
-{
- uint8_t lablen;
- struct compress_tree_node* newnode;
- struct compress_tree_node* prevnode = NULL;
- int uplabs = labs-1; /* does not store root in tree */
- if(closest) uplabs = labs - closest->labs;
- log_assert(uplabs >= 0);
- /* algorithms builds up a vine of dname-labels to hang into tree */
- while(uplabs--) {
- if(offset > PTR_MAX_OFFSET) {
- /* insertion failed, drop vine */
- return 1; /* compression pointer no longer useful */
- }
- if(!(newnode = compress_tree_newnode(dname, labs, offset,
- region))) {
- /* insertion failed, drop vine */
- return 0;
- }
-
- if(prevnode) {
- /* chain nodes together, last one has one label more,
- * so is larger than newnode, thus goes right. */
- newnode->right = prevnode;
- prevnode->parent = newnode;
- }
-
- /* next label */
- lablen = *dname++;
- dname += lablen;
- offset += lablen+1;
- prevnode = newnode;
- labs--;
- }
- /* if we have a vine, hang the vine into the tree */
- if(prevnode) {
- *insertpt = prevnode;
- prevnode->parent = closest;
- }
- return 1;
-}
-
-/** compress a domain name */
-static int
-write_compressed_dname(sldns_buffer* pkt, uint8_t* dname, int labs,
- struct compress_tree_node* p)
-{
- /* compress it */
- int labcopy = labs - p->labs;
- uint8_t lablen;
- uint16_t ptr;
-
- if(labs == 1) {
- /* write root label */
- if(sldns_buffer_remaining(pkt) < 1)
- return 0;
- sldns_buffer_write_u8(pkt, 0);
- return 1;
- }
-
- /* copy the first couple of labels */
- while(labcopy--) {
- lablen = *dname++;
- if(sldns_buffer_remaining(pkt) < (size_t)lablen+1)
- return 0;
- sldns_buffer_write_u8(pkt, lablen);
- sldns_buffer_write(pkt, dname, lablen);
- dname += lablen;
- }
- /* insert compression ptr */
- if(sldns_buffer_remaining(pkt) < 2)
- return 0;
- ptr = PTR_CREATE(p->offset);
- sldns_buffer_write_u16(pkt, ptr);
- return 1;
-}
-
-/** compress owner name of RR, return RETVAL_OUTMEM RETVAL_TRUNC */
-static int
-compress_owner(struct ub_packed_rrset_key* key, sldns_buffer* pkt,
- struct regional* region, struct compress_tree_node** tree,
- size_t owner_pos, uint16_t* owner_ptr, int owner_labs)
-{
- struct compress_tree_node* p;
- struct compress_tree_node** insertpt = NULL;
- if(!*owner_ptr) {
- /* compress first time dname */
- if((p = compress_tree_lookup(tree, key->rk.dname,
- owner_labs, &insertpt))) {
- if(p->labs == owner_labs)
- /* avoid ptr chains, since some software is
- * not capable of decoding ptr after a ptr. */
- *owner_ptr = htons(PTR_CREATE(p->offset));
- if(!write_compressed_dname(pkt, key->rk.dname,
- owner_labs, p))
- return RETVAL_TRUNC;
- /* check if typeclass+4 ttl + rdatalen is available */
- if(sldns_buffer_remaining(pkt) < 4+4+2)
- return RETVAL_TRUNC;
- } else {
- /* no compress */
- if(sldns_buffer_remaining(pkt) < key->rk.dname_len+4+4+2)
- return RETVAL_TRUNC;
- sldns_buffer_write(pkt, key->rk.dname,
- key->rk.dname_len);
- if(owner_pos <= PTR_MAX_OFFSET)
- *owner_ptr = htons(PTR_CREATE(owner_pos));
- }
- if(!compress_tree_store(key->rk.dname, owner_labs,
- owner_pos, region, p, insertpt))
- return RETVAL_OUTMEM;
- } else {
- /* always compress 2nd-further RRs in RRset */
- if(owner_labs == 1) {
- if(sldns_buffer_remaining(pkt) < 1+4+4+2)
- return RETVAL_TRUNC;
- sldns_buffer_write_u8(pkt, 0);
- } else {
- if(sldns_buffer_remaining(pkt) < 2+4+4+2)
- return RETVAL_TRUNC;
- sldns_buffer_write(pkt, owner_ptr, 2);
- }
- }
- return RETVAL_OK;
-}
-
-/** compress any domain name to the packet, return RETVAL_* */
-static int
-compress_any_dname(uint8_t* dname, sldns_buffer* pkt, int labs,
- struct regional* region, struct compress_tree_node** tree)
-{
- struct compress_tree_node* p;
- struct compress_tree_node** insertpt = NULL;
- size_t pos = sldns_buffer_position(pkt);
- if((p = compress_tree_lookup(tree, dname, labs, &insertpt))) {
- if(!write_compressed_dname(pkt, dname, labs, p))
- return RETVAL_TRUNC;
- } else {
- if(!dname_buffer_write(pkt, dname))
- return RETVAL_TRUNC;
- }
- if(!compress_tree_store(dname, labs, pos, region, p, insertpt))
- return RETVAL_OUTMEM;
- return RETVAL_OK;
-}
-
-/** return true if type needs domain name compression in rdata */
-static const sldns_rr_descriptor*
-type_rdata_compressable(struct ub_packed_rrset_key* key)
-{
- uint16_t t = ntohs(key->rk.type);
- if(sldns_rr_descript(t) &&
- sldns_rr_descript(t)->_compress == LDNS_RR_COMPRESS)
- return sldns_rr_descript(t);
- return 0;
-}
-
-/** compress domain names in rdata, return RETVAL_* */
-static int
-compress_rdata(sldns_buffer* pkt, uint8_t* rdata, size_t todolen,
- struct regional* region, struct compress_tree_node** tree,
- const sldns_rr_descriptor* desc)
-{
- int labs, r, rdf = 0;
- size_t dname_len, len, pos = sldns_buffer_position(pkt);
- uint8_t count = desc->_dname_count;
-
- sldns_buffer_skip(pkt, 2); /* rdata len fill in later */
- /* space for rdatalen checked for already */
- rdata += 2;
- todolen -= 2;
- while(todolen > 0 && count) {
- switch(desc->_wireformat[rdf]) {
- case LDNS_RDF_TYPE_DNAME:
- labs = dname_count_size_labels(rdata, &dname_len);
- if((r=compress_any_dname(rdata, pkt, labs, region,
- tree)) != RETVAL_OK)
- return r;
- rdata += dname_len;
- todolen -= dname_len;
- count--;
- len = 0;
- break;
- case LDNS_RDF_TYPE_STR:
- len = *rdata + 1;
- break;
- default:
- len = get_rdf_size(desc->_wireformat[rdf]);
- }
- if(len) {
- /* copy over */
- if(sldns_buffer_remaining(pkt) < len)
- return RETVAL_TRUNC;
- sldns_buffer_write(pkt, rdata, len);
- todolen -= len;
- rdata += len;
- }
- rdf++;
- }
- /* copy remainder */
- if(todolen > 0) {
- if(sldns_buffer_remaining(pkt) < todolen)
- return RETVAL_TRUNC;
- sldns_buffer_write(pkt, rdata, todolen);
- }
-
- /* set rdata len */
- sldns_buffer_write_u16_at(pkt, pos, sldns_buffer_position(pkt)-pos-2);
- return RETVAL_OK;
-}
-
-/** Returns true if RR type should be included */
-static int
-rrset_belongs_in_reply(sldns_pkt_section s, uint16_t rrtype, uint16_t qtype,
- int dnssec)
-{
- if(dnssec)
- return 1;
- /* skip non DNSSEC types, except if directly queried for */
- if(s == LDNS_SECTION_ANSWER) {
- if(qtype == LDNS_RR_TYPE_ANY || qtype == rrtype)
- return 1;
- }
- /* check DNSSEC-ness */
- switch(rrtype) {
- case LDNS_RR_TYPE_SIG:
- case LDNS_RR_TYPE_KEY:
- case LDNS_RR_TYPE_NXT:
- case LDNS_RR_TYPE_DS:
- case LDNS_RR_TYPE_RRSIG:
- case LDNS_RR_TYPE_NSEC:
- case LDNS_RR_TYPE_DNSKEY:
- case LDNS_RR_TYPE_NSEC3:
- case LDNS_RR_TYPE_NSEC3PARAMS:
- return 0;
- }
- return 1;
-}
-
-/** store rrset in buffer in wireformat, return RETVAL_* */
-static int
-packed_rrset_encode(struct ub_packed_rrset_key* key, sldns_buffer* pkt,
- uint16_t* num_rrs, time_t timenow, struct regional* region,
- int do_data, int do_sig, struct compress_tree_node** tree,
- sldns_pkt_section s, uint16_t qtype, int dnssec, size_t rr_offset)
-{
- size_t i, j, owner_pos;
- int r, owner_labs;
- uint16_t owner_ptr = 0;
- struct packed_rrset_data* data = (struct packed_rrset_data*)
- key->entry.data;
-
- /* does this RR type belong in the answer? */
- if(!rrset_belongs_in_reply(s, ntohs(key->rk.type), qtype, dnssec))
- return RETVAL_OK;
-
- owner_labs = dname_count_labels(key->rk.dname);
- owner_pos = sldns_buffer_position(pkt);
-
- /* For an rrset with a fixed TTL, use the rrset's TTL as given */
- if((key->rk.flags & PACKED_RRSET_FIXEDTTL) != 0)
- timenow = 0;
-
- if(do_data) {
- const sldns_rr_descriptor* c = type_rdata_compressable(key);
- for(i=0; i<data->count; i++) {
- /* rrset roundrobin */
- j = (i + rr_offset) % data->count;
- if((r=compress_owner(key, pkt, region, tree,
- owner_pos, &owner_ptr, owner_labs))
- != RETVAL_OK)
- return r;
- sldns_buffer_write(pkt, &key->rk.type, 2);
- sldns_buffer_write(pkt, &key->rk.rrset_class, 2);
- if(data->rr_ttl[j] < timenow)
- sldns_buffer_write_u32(pkt, 0);
- else sldns_buffer_write_u32(pkt,
- data->rr_ttl[j]-timenow);
- if(c) {
- if((r=compress_rdata(pkt, data->rr_data[j],
- data->rr_len[j], region, tree, c))
- != RETVAL_OK)
- return r;
- } else {
- if(sldns_buffer_remaining(pkt) < data->rr_len[j])
- return RETVAL_TRUNC;
- sldns_buffer_write(pkt, data->rr_data[j],
- data->rr_len[j]);
- }
- }
- }
- /* insert rrsigs */
- if(do_sig && dnssec) {
- size_t total = data->count+data->rrsig_count;
- for(i=data->count; i<total; i++) {
- if(owner_ptr && owner_labs != 1) {
- if(sldns_buffer_remaining(pkt) <
- 2+4+4+data->rr_len[i])
- return RETVAL_TRUNC;
- sldns_buffer_write(pkt, &owner_ptr, 2);
- } else {
- if((r=compress_any_dname(key->rk.dname,
- pkt, owner_labs, region, tree))
- != RETVAL_OK)
- return r;
- if(sldns_buffer_remaining(pkt) <
- 4+4+data->rr_len[i])
- return RETVAL_TRUNC;
- }
- sldns_buffer_write_u16(pkt, LDNS_RR_TYPE_RRSIG);
- sldns_buffer_write(pkt, &key->rk.rrset_class, 2);
- if(data->rr_ttl[i] < timenow)
- sldns_buffer_write_u32(pkt, 0);
- else sldns_buffer_write_u32(pkt,
- data->rr_ttl[i]-timenow);
- /* rrsig rdata cannot be compressed, perform 100+ byte
- * memcopy. */
- sldns_buffer_write(pkt, data->rr_data[i],
- data->rr_len[i]);
- }
- }
- /* change rrnum only after we are sure it fits */
- if(do_data)
- *num_rrs += data->count;
- if(do_sig && dnssec)
- *num_rrs += data->rrsig_count;
-
- return RETVAL_OK;
-}
-
-/** store msg section in wireformat buffer, return RETVAL_* */
-static int
-insert_section(struct reply_info* rep, size_t num_rrsets, uint16_t* num_rrs,
- sldns_buffer* pkt, size_t rrsets_before, time_t timenow,
- struct regional* region, struct compress_tree_node** tree,
- sldns_pkt_section s, uint16_t qtype, int dnssec, size_t rr_offset)
-{
- int r;
- size_t i, setstart;
- /* we now allow this function to be called multiple times for the
- * same section, incrementally updating num_rrs. The caller is
- * responsible for initializing it (which is the case in the current
- * implementation). */
-
- if(s != LDNS_SECTION_ADDITIONAL) {
- if(s == LDNS_SECTION_ANSWER && qtype == LDNS_RR_TYPE_ANY)
- dnssec = 1; /* include all types in ANY answer */
- for(i=0; i<num_rrsets; i++) {
- setstart = sldns_buffer_position(pkt);
- if((r=packed_rrset_encode(rep->rrsets[rrsets_before+i],
- pkt, num_rrs, timenow, region, 1, 1, tree,
- s, qtype, dnssec, rr_offset))
- != RETVAL_OK) {
- /* Bad, but if due to size must set TC bit */
- /* trim off the rrset neatly. */
- sldns_buffer_set_position(pkt, setstart);
- return r;
- }
- }
- } else {
- for(i=0; i<num_rrsets; i++) {
- setstart = sldns_buffer_position(pkt);
- if((r=packed_rrset_encode(rep->rrsets[rrsets_before+i],
- pkt, num_rrs, timenow, region, 1, 0, tree,
- s, qtype, dnssec, rr_offset))
- != RETVAL_OK) {
- sldns_buffer_set_position(pkt, setstart);
- return r;
- }
- }
- if(dnssec)
- for(i=0; i<num_rrsets; i++) {
- setstart = sldns_buffer_position(pkt);
- if((r=packed_rrset_encode(rep->rrsets[rrsets_before+i],
- pkt, num_rrs, timenow, region, 0, 1, tree,
- s, qtype, dnssec, rr_offset))
- != RETVAL_OK) {
- sldns_buffer_set_position(pkt, setstart);
- return r;
- }
- }
- }
- return RETVAL_OK;
-}
-
-/** store query section in wireformat buffer, return RETVAL */
-static int
-insert_query(struct query_info* qinfo, struct compress_tree_node** tree,
- sldns_buffer* buffer, struct regional* region)
-{
- uint8_t* qname = qinfo->local_alias ?
- qinfo->local_alias->rrset->rk.dname : qinfo->qname;
- size_t qname_len = qinfo->local_alias ?
- qinfo->local_alias->rrset->rk.dname_len : qinfo->qname_len;
- if(sldns_buffer_remaining(buffer) <
- qinfo->qname_len+sizeof(uint16_t)*2)
- return RETVAL_TRUNC; /* buffer too small */
- /* the query is the first name inserted into the tree */
- if(!compress_tree_store(qname, dname_count_labels(qname),
- sldns_buffer_position(buffer), region, NULL, tree))
- return RETVAL_OUTMEM;
- if(sldns_buffer_current(buffer) == qname)
- sldns_buffer_skip(buffer, (ssize_t)qname_len);
- else sldns_buffer_write(buffer, qname, qname_len);
- sldns_buffer_write_u16(buffer, qinfo->qtype);
- sldns_buffer_write_u16(buffer, qinfo->qclass);
- return RETVAL_OK;
-}
-
-static int
-positive_answer(struct reply_info* rep, uint16_t qtype) {
- size_t i;
- if (FLAGS_GET_RCODE(rep->flags) != LDNS_RCODE_NOERROR)
- return 0;
-
- for(i=0;i<rep->an_numrrsets; i++) {
- if(ntohs(rep->rrsets[i]->rk.type) == qtype) {
- /* in case it is a wildcard with DNSSEC, there will
- * be NSEC/NSEC3 records in the authority section
- * that we cannot remove */
- for(i=rep->an_numrrsets; i<rep->an_numrrsets+
- rep->ns_numrrsets; i++) {
- if(ntohs(rep->rrsets[i]->rk.type) ==
- LDNS_RR_TYPE_NSEC ||
- ntohs(rep->rrsets[i]->rk.type) ==
- LDNS_RR_TYPE_NSEC3)
- return 0;
- }
- return 1;
- }
- }
- return 0;
-}
-
-int
-reply_info_encode(struct query_info* qinfo, struct reply_info* rep,
- uint16_t id, uint16_t flags, sldns_buffer* buffer, time_t timenow,
- struct regional* region, uint16_t udpsize, int dnssec)
-{
- uint16_t ancount=0, nscount=0, arcount=0;
- struct compress_tree_node* tree = 0;
- int r;
- size_t rr_offset;
-
- sldns_buffer_clear(buffer);
- if(udpsize < sldns_buffer_limit(buffer))
- sldns_buffer_set_limit(buffer, udpsize);
- if(sldns_buffer_remaining(buffer) < LDNS_HEADER_SIZE)
- return 0;
-
- sldns_buffer_write(buffer, &id, sizeof(uint16_t));
- sldns_buffer_write_u16(buffer, flags);
- sldns_buffer_write_u16(buffer, rep->qdcount);
- /* set an, ns, ar counts to zero in case of small packets */
- sldns_buffer_write(buffer, "\000\000\000\000\000\000", 6);
-
- /* insert query section */
- if(rep->qdcount) {
- if((r=insert_query(qinfo, &tree, buffer, region)) !=
- RETVAL_OK) {
- if(r == RETVAL_TRUNC) {
- /* create truncated message */
- sldns_buffer_write_u16_at(buffer, 4, 0);
- LDNS_TC_SET(sldns_buffer_begin(buffer));
- sldns_buffer_flip(buffer);
- return 1;
- }
- return 0;
- }
- }
- /* roundrobin offset. using query id for random number. With ntohs
- * for different roundrobins for sequential id client senders. */
- rr_offset = RRSET_ROUNDROBIN?ntohs(id):0;
-
- /* "prepend" any local alias records in the answer section if this
- * response is supposed to be authoritative. Currently it should
- * be a single CNAME record (sanity-checked in worker_handle_request())
- * but it can be extended if and when we support more variations of
- * aliases. */
- if(qinfo->local_alias && (flags & BIT_AA)) {
- struct reply_info arep;
- time_t timezero = 0; /* to use the 'authoritative' TTL */
- memset(&arep, 0, sizeof(arep));
- arep.flags = rep->flags;
- arep.an_numrrsets = 1;
- arep.rrset_count = 1;
- arep.rrsets = &qinfo->local_alias->rrset;
- if((r=insert_section(&arep, 1, &ancount, buffer, 0,
- timezero, region, &tree, LDNS_SECTION_ANSWER,
- qinfo->qtype, dnssec, rr_offset)) != RETVAL_OK) {
- if(r == RETVAL_TRUNC) {
- /* create truncated message */
- sldns_buffer_write_u16_at(buffer, 6, ancount);
- LDNS_TC_SET(sldns_buffer_begin(buffer));
- sldns_buffer_flip(buffer);
- return 1;
- }
- return 0;
- }
- }
-
- /* insert answer section */
- if((r=insert_section(rep, rep->an_numrrsets, &ancount, buffer,
- 0, timenow, region, &tree, LDNS_SECTION_ANSWER, qinfo->qtype,
- dnssec, rr_offset)) != RETVAL_OK) {
- if(r == RETVAL_TRUNC) {
- /* create truncated message */
- sldns_buffer_write_u16_at(buffer, 6, ancount);
- LDNS_TC_SET(sldns_buffer_begin(buffer));
- sldns_buffer_flip(buffer);
- return 1;
- }
- return 0;
- }
- sldns_buffer_write_u16_at(buffer, 6, ancount);
-
- /* if response is positive answer, auth/add sections are not required */
- if( ! (MINIMAL_RESPONSES && positive_answer(rep, qinfo->qtype)) ) {
- /* insert auth section */
- if((r=insert_section(rep, rep->ns_numrrsets, &nscount, buffer,
- rep->an_numrrsets, timenow, region, &tree,
- LDNS_SECTION_AUTHORITY, qinfo->qtype,
- dnssec, rr_offset)) != RETVAL_OK) {
- if(r == RETVAL_TRUNC) {
- /* create truncated message */
- sldns_buffer_write_u16_at(buffer, 8, nscount);
- LDNS_TC_SET(sldns_buffer_begin(buffer));
- sldns_buffer_flip(buffer);
- return 1;
- }
- return 0;
- }
- sldns_buffer_write_u16_at(buffer, 8, nscount);
-
- /* insert add section */
- if((r=insert_section(rep, rep->ar_numrrsets, &arcount, buffer,
- rep->an_numrrsets + rep->ns_numrrsets, timenow, region,
- &tree, LDNS_SECTION_ADDITIONAL, qinfo->qtype,
- dnssec, rr_offset)) != RETVAL_OK) {
- if(r == RETVAL_TRUNC) {
- /* no need to set TC bit, this is the additional */
- sldns_buffer_write_u16_at(buffer, 10, arcount);
- sldns_buffer_flip(buffer);
- return 1;
- }
- return 0;
- }
- sldns_buffer_write_u16_at(buffer, 10, arcount);
- }
- sldns_buffer_flip(buffer);
- return 1;
-}
-
-uint16_t
-calc_edns_field_size(struct edns_data* edns)
-{
- size_t rdatalen = 0;
- struct edns_option* opt;
- if(!edns || !edns->edns_present)
- return 0;
- for(opt = edns->opt_list; opt; opt = opt->next) {
- rdatalen += 4 + opt->opt_len;
- }
- /* domain root '.' + type + class + ttl + rdatalen */
- return 1 + 2 + 2 + 4 + 2 + rdatalen;
-}
-
-void
-attach_edns_record(sldns_buffer* pkt, struct edns_data* edns)
-{
- size_t len;
- size_t rdatapos;
- struct edns_option* opt;
- if(!edns || !edns->edns_present)
- return;
- /* inc additional count */
- sldns_buffer_write_u16_at(pkt, 10,
- sldns_buffer_read_u16_at(pkt, 10) + 1);
- len = sldns_buffer_limit(pkt);
- sldns_buffer_clear(pkt);
- sldns_buffer_set_position(pkt, len);
- /* write EDNS record */
- sldns_buffer_write_u8(pkt, 0); /* '.' label */
- sldns_buffer_write_u16(pkt, LDNS_RR_TYPE_OPT); /* type */
- sldns_buffer_write_u16(pkt, edns->udp_size); /* class */
- sldns_buffer_write_u8(pkt, edns->ext_rcode); /* ttl */
- sldns_buffer_write_u8(pkt, edns->edns_version);
- sldns_buffer_write_u16(pkt, edns->bits);
- rdatapos = sldns_buffer_position(pkt);
- sldns_buffer_write_u16(pkt, 0); /* rdatalen */
- /* write rdata */
- for(opt=edns->opt_list; opt; opt=opt->next) {
- sldns_buffer_write_u16(pkt, opt->opt_code);
- sldns_buffer_write_u16(pkt, opt->opt_len);
- if(opt->opt_len != 0)
- sldns_buffer_write(pkt, opt->opt_data, opt->opt_len);
- }
- if(edns->opt_list)
- sldns_buffer_write_u16_at(pkt, rdatapos,
- sldns_buffer_position(pkt)-rdatapos-2);
- sldns_buffer_flip(pkt);
-}
-
-int
-reply_info_answer_encode(struct query_info* qinf, struct reply_info* rep,
- uint16_t id, uint16_t qflags, sldns_buffer* pkt, time_t timenow,
- int cached, struct regional* region, uint16_t udpsize,
- struct edns_data* edns, int dnssec, int secure)
-{
- uint16_t flags;
- int attach_edns = 1;
-
- if(!cached || rep->authoritative) {
- /* original flags, copy RD and CD bits from query. */
- flags = rep->flags | (qflags & (BIT_RD|BIT_CD));
- } else {
- /* remove AA bit, copy RD and CD bits from query. */
- flags = (rep->flags & ~BIT_AA) | (qflags & (BIT_RD|BIT_CD));
- }
- if(secure && (dnssec || (qflags&BIT_AD)))
- flags |= BIT_AD;
- /* restore AA bit if we have a local alias and the response can be
- * authoritative. Also clear AD bit if set as the local data is the
- * primary answer. */
- if(qinf->local_alias &&
- (FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NOERROR ||
- FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NXDOMAIN)) {
- flags |= BIT_AA;
- flags &= ~BIT_AD;
- }
- log_assert(flags & BIT_QR); /* QR bit must be on in our replies */
- if(udpsize < LDNS_HEADER_SIZE)
- return 0;
- if(udpsize < LDNS_HEADER_SIZE + calc_edns_field_size(edns)) {
- /* packet too small to contain edns, omit it. */
- attach_edns = 0;
- } else {
- /* reserve space for edns record */
- udpsize -= calc_edns_field_size(edns);
- }
-
- if(!reply_info_encode(qinf, rep, id, flags, pkt, timenow, region,
- udpsize, dnssec)) {
- log_err("reply encode: out of memory");
- return 0;
- }
- if(attach_edns)
- attach_edns_record(pkt, edns);
- return 1;
-}
-
-void
-qinfo_query_encode(sldns_buffer* pkt, struct query_info* qinfo)
-{
- uint16_t flags = 0; /* QUERY, NOERROR */
- const uint8_t* qname = qinfo->local_alias ?
- qinfo->local_alias->rrset->rk.dname : qinfo->qname;
- size_t qname_len = qinfo->local_alias ?
- qinfo->local_alias->rrset->rk.dname_len : qinfo->qname_len;
- sldns_buffer_clear(pkt);
- log_assert(sldns_buffer_remaining(pkt) >= 12+255+4/*max query*/);
- sldns_buffer_skip(pkt, 2); /* id done later */
- sldns_buffer_write_u16(pkt, flags);
- sldns_buffer_write_u16(pkt, 1); /* query count */
- sldns_buffer_write(pkt, "\000\000\000\000\000\000", 6); /* counts */
- sldns_buffer_write(pkt, qname, qname_len);
- sldns_buffer_write_u16(pkt, qinfo->qtype);
- sldns_buffer_write_u16(pkt, qinfo->qclass);
- sldns_buffer_flip(pkt);
-}
-
-void
-error_encode(sldns_buffer* buf, int r, struct query_info* qinfo,
- uint16_t qid, uint16_t qflags, struct edns_data* edns)
-{
- uint16_t flags;
-
- sldns_buffer_clear(buf);
- sldns_buffer_write(buf, &qid, sizeof(uint16_t));
- flags = (uint16_t)(BIT_QR | BIT_RA | r); /* QR and retcode*/
- flags |= (qflags & (BIT_RD|BIT_CD)); /* copy RD and CD bit */
- sldns_buffer_write_u16(buf, flags);
- if(qinfo) flags = 1;
- else flags = 0;
- sldns_buffer_write_u16(buf, flags);
- flags = 0;
- sldns_buffer_write(buf, &flags, sizeof(uint16_t));
- sldns_buffer_write(buf, &flags, sizeof(uint16_t));
- sldns_buffer_write(buf, &flags, sizeof(uint16_t));
- if(qinfo) {
- const uint8_t* qname = qinfo->local_alias ?
- qinfo->local_alias->rrset->rk.dname : qinfo->qname;
- size_t qname_len = qinfo->local_alias ?
- qinfo->local_alias->rrset->rk.dname_len :
- qinfo->qname_len;
- if(sldns_buffer_current(buf) == qname)
- sldns_buffer_skip(buf, (ssize_t)qname_len);
- else sldns_buffer_write(buf, qname, qname_len);
- sldns_buffer_write_u16(buf, qinfo->qtype);
- sldns_buffer_write_u16(buf, qinfo->qclass);
- }
- sldns_buffer_flip(buf);
- if(edns) {
- struct edns_data es = *edns;
- es.edns_version = EDNS_ADVERTISED_VERSION;
- es.udp_size = EDNS_ADVERTISED_SIZE;
- es.ext_rcode = 0;
- es.bits &= EDNS_DO;
- if(sldns_buffer_limit(buf) + calc_edns_field_size(&es) >
- edns->udp_size)
- return;
- attach_edns_record(buf, &es);
- }
-}
diff --git a/external/unbound/util/data/msgencode.h b/external/unbound/util/data/msgencode.h
deleted file mode 100644
index eea129d98..000000000
--- a/external/unbound/util/data/msgencode.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * util/data/msgencode.h - encode compressed DNS messages.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains temporary data structures and routines to create
- * compressed DNS messages.
- */
-
-#ifndef UTIL_DATA_MSGENCODE_H
-#define UTIL_DATA_MSGENCODE_H
-struct sldns_buffer;
-struct query_info;
-struct reply_info;
-struct regional;
-struct edns_data;
-
-/**
- * Generate answer from reply_info.
- * @param qinf: query information that provides query section in packet.
- * @param rep: reply to fill in.
- * @param id: id word from the query.
- * @param qflags: flags word from the query.
- * @param dest: buffer to put message into; will truncate if it does not fit.
- * @param timenow: time to subtract.
- * @param cached: set true if a cached reply (so no AA bit).
- * set false for the first reply.
- * @param region: where to allocate temp variables (for compression).
- * @param udpsize: size of the answer, 512, from EDNS, or 64k for TCP.
- * @param edns: EDNS data included in the answer, NULL for none.
- * or if edns_present = 0, it is not included.
- * @param dnssec: if 0 DNSSEC records are omitted from the answer.
- * @param secure: if 1, the AD bit is set in the reply.
- * @return: 0 on error (server failure).
- */
-int reply_info_answer_encode(struct query_info* qinf, struct reply_info* rep,
- uint16_t id, uint16_t qflags, struct sldns_buffer* dest, time_t timenow,
- int cached, struct regional* region, uint16_t udpsize,
- struct edns_data* edns, int dnssec, int secure);
-
-/**
- * Regenerate the wireformat from the stored msg reply.
- * If the buffer is too small then the message is truncated at a whole
- * rrset and the TC bit set, or whole rrsets are left out of the additional
- * and the TC bit is not set.
- * @param qinfo: query info to store.
- * @param rep: reply to store.
- * @param id: id value to store, network order.
- * @param flags: flags value to store, host order.
- * @param buffer: buffer to store the packet into.
- * @param timenow: time now, to adjust ttl values.
- * @param region: to store temporary data in.
- * @param udpsize: size of the answer, 512, from EDNS, or 64k for TCP.
- * @param dnssec: if 0 DNSSEC records are omitted from the answer.
- * @return: nonzero is success, or
- * 0 on error: malloc failure (no log_err has been done).
- */
-int reply_info_encode(struct query_info* qinfo, struct reply_info* rep,
- uint16_t id, uint16_t flags, struct sldns_buffer* buffer, time_t timenow,
- struct regional* region, uint16_t udpsize, int dnssec);
-
-/**
- * Encode query packet. Assumes the buffer is large enough.
- * @param pkt: where to store the packet.
- * @param qinfo: query info.
- */
-void qinfo_query_encode(struct sldns_buffer* pkt, struct query_info* qinfo);
-
-/**
- * Estimate size of EDNS record in packet. EDNS record will be no larger.
- * @param edns: edns data or NULL.
- * @return octets to reserve for EDNS.
- */
-uint16_t calc_edns_field_size(struct edns_data* edns);
-
-/**
- * Attach EDNS record to buffer. Buffer has complete packet. There must
- * be enough room left for the EDNS record.
- * @param pkt: packet added to.
- * @param edns: if NULL or present=0, nothing is added to the packet.
- */
-void attach_edns_record(struct sldns_buffer* pkt, struct edns_data* edns);
-
-/**
- * Encode an error. With QR and RA set.
- *
- * @param pkt: where to store the packet.
- * @param r: RCODE value to encode.
- * @param qinfo: if not NULL, the query is included.
- * @param qid: query ID to set in packet. network order.
- * @param qflags: original query flags (to copy RD and CD bits). host order.
- * @param edns: if not NULL, this is the query edns info,
- * and an edns reply is attached. Only attached if EDNS record fits reply.
- */
-void error_encode(struct sldns_buffer* pkt, int r, struct query_info* qinfo,
- uint16_t qid, uint16_t qflags, struct edns_data* edns);
-
-#endif /* UTIL_DATA_MSGENCODE_H */
diff --git a/external/unbound/util/data/msgparse.c b/external/unbound/util/data/msgparse.c
deleted file mode 100644
index 5381500e1..000000000
--- a/external/unbound/util/data/msgparse.c
+++ /dev/null
@@ -1,1093 +0,0 @@
-/*
- * util/data/msgparse.c - parse wireformat DNS messages.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * \file
- * Routines for message parsing a packet buffer to a descriptive structure.
- */
-#include "config.h"
-#include "util/data/msgparse.h"
-#include "util/data/msgreply.h"
-#include "util/data/dname.h"
-#include "util/data/packed_rrset.h"
-#include "util/storage/lookup3.h"
-#include "util/regional.h"
-#include "sldns/rrdef.h"
-#include "sldns/sbuffer.h"
-#include "sldns/parseutil.h"
-#include "sldns/wire2str.h"
-
-/** smart comparison of (compressed, valid) dnames from packet */
-static int
-smart_compare(sldns_buffer* pkt, uint8_t* dnow,
- uint8_t* dprfirst, uint8_t* dprlast)
-{
- if(LABEL_IS_PTR(*dnow)) {
- /* ptr points to a previous dname */
- uint8_t* p = sldns_buffer_at(pkt, PTR_OFFSET(dnow[0], dnow[1]));
- if( p == dprfirst || p == dprlast )
- return 0;
- /* prev dname is also a ptr, both ptrs are the same. */
- if(LABEL_IS_PTR(*dprlast) &&
- dprlast[0] == dnow[0] && dprlast[1] == dnow[1])
- return 0;
- }
- return dname_pkt_compare(pkt, dnow, dprlast);
-}
-
-/**
- * Allocate new rrset in region, fill with data.
- */
-static struct rrset_parse*
-new_rrset(struct msg_parse* msg, uint8_t* dname, size_t dnamelen,
- uint16_t type, uint16_t dclass, hashvalue_type hash,
- uint32_t rrset_flags, sldns_pkt_section section,
- struct regional* region)
-{
- struct rrset_parse* p = regional_alloc(region, sizeof(*p));
- if(!p) return NULL;
- p->rrset_bucket_next = msg->hashtable[hash & (PARSE_TABLE_SIZE-1)];
- msg->hashtable[hash & (PARSE_TABLE_SIZE-1)] = p;
- p->rrset_all_next = 0;
- if(msg->rrset_last)
- msg->rrset_last->rrset_all_next = p;
- else msg->rrset_first = p;
- msg->rrset_last = p;
- p->hash = hash;
- p->section = section;
- p->dname = dname;
- p->dname_len = dnamelen;
- p->type = type;
- p->rrset_class = dclass;
- p->flags = rrset_flags;
- p->rr_count = 0;
- p->size = 0;
- p->rr_first = 0;
- p->rr_last = 0;
- p->rrsig_count = 0;
- p->rrsig_first = 0;
- p->rrsig_last = 0;
- return p;
-}
-
-/** See if next rrset is nsec at zone apex */
-static int
-nsec_at_apex(sldns_buffer* pkt)
-{
- /* we are at ttl position in packet. */
- size_t pos = sldns_buffer_position(pkt);
- uint16_t rdatalen;
- if(sldns_buffer_remaining(pkt) < 7) /* ttl+len+root */
- return 0; /* eek! */
- sldns_buffer_skip(pkt, 4); /* ttl */;
- rdatalen = sldns_buffer_read_u16(pkt);
- if(sldns_buffer_remaining(pkt) < rdatalen) {
- sldns_buffer_set_position(pkt, pos);
- return 0; /* parse error happens later */
- }
- /* must validate the nsec next domain name format */
- if(pkt_dname_len(pkt) == 0) {
- sldns_buffer_set_position(pkt, pos);
- return 0; /* parse error */
- }
-
- /* see if SOA bit is set. */
- if(sldns_buffer_position(pkt) < pos+4+rdatalen) {
- /* nsec type bitmap contains items */
- uint8_t win, blen, bits;
- /* need: windownum, bitmap len, firstbyte */
- if(sldns_buffer_position(pkt)+3 > pos+4+rdatalen) {
- sldns_buffer_set_position(pkt, pos);
- return 0; /* malformed nsec */
- }
- win = sldns_buffer_read_u8(pkt);
- blen = sldns_buffer_read_u8(pkt);
- bits = sldns_buffer_read_u8(pkt);
- /* 0window always first window. bitlen >=1 or parse
- error really. bit 0x2 is SOA. */
- if(win == 0 && blen >= 1 && (bits & 0x02)) {
- sldns_buffer_set_position(pkt, pos);
- return 1;
- }
- }
-
- sldns_buffer_set_position(pkt, pos);
- return 0;
-}
-
-/** Calculate rrset flags */
-static uint32_t
-pkt_rrset_flags(sldns_buffer* pkt, uint16_t type, sldns_pkt_section sec)
-{
- uint32_t f = 0;
- if(type == LDNS_RR_TYPE_NSEC && nsec_at_apex(pkt)) {
- f |= PACKED_RRSET_NSEC_AT_APEX;
- } else if(type == LDNS_RR_TYPE_SOA && sec == LDNS_SECTION_AUTHORITY) {
- f |= PACKED_RRSET_SOA_NEG;
- }
- return f;
-}
-
-hashvalue_type
-pkt_hash_rrset(sldns_buffer* pkt, uint8_t* dname, uint16_t type,
- uint16_t dclass, uint32_t rrset_flags)
-{
- /* note this MUST be identical to rrset_key_hash in packed_rrset.c */
- /* this routine handles compressed names */
- hashvalue_type h = 0xab;
- h = dname_pkt_hash(pkt, dname, h);
- h = hashlittle(&type, sizeof(type), h); /* host order */
- h = hashlittle(&dclass, sizeof(dclass), h); /* netw order */
- h = hashlittle(&rrset_flags, sizeof(uint32_t), h);
- return h;
-}
-
-/** create partial dname hash for rrset hash */
-static hashvalue_type
-pkt_hash_rrset_first(sldns_buffer* pkt, uint8_t* dname)
-{
- /* works together with pkt_hash_rrset_rest */
- /* note this MUST be identical to rrset_key_hash in packed_rrset.c */
- /* this routine handles compressed names */
- hashvalue_type h = 0xab;
- h = dname_pkt_hash(pkt, dname, h);
- return h;
-}
-
-/** create a rrset hash from a partial dname hash */
-static hashvalue_type
-pkt_hash_rrset_rest(hashvalue_type dname_h, uint16_t type, uint16_t dclass,
- uint32_t rrset_flags)
-{
- /* works together with pkt_hash_rrset_first */
- /* note this MUST be identical to rrset_key_hash in packed_rrset.c */
- hashvalue_type h;
- h = hashlittle(&type, sizeof(type), dname_h); /* host order */
- h = hashlittle(&dclass, sizeof(dclass), h); /* netw order */
- h = hashlittle(&rrset_flags, sizeof(uint32_t), h);
- return h;
-}
-
-/** compare rrset_parse with data */
-static int
-rrset_parse_equals(struct rrset_parse* p, sldns_buffer* pkt, hashvalue_type h,
- uint32_t rrset_flags, uint8_t* dname, size_t dnamelen,
- uint16_t type, uint16_t dclass)
-{
- if(p->hash == h && p->dname_len == dnamelen && p->type == type &&
- p->rrset_class == dclass && p->flags == rrset_flags &&
- dname_pkt_compare(pkt, dname, p->dname) == 0)
- return 1;
- return 0;
-}
-
-
-struct rrset_parse*
-msgparse_hashtable_lookup(struct msg_parse* msg, sldns_buffer* pkt,
- hashvalue_type h, uint32_t rrset_flags, uint8_t* dname,
- size_t dnamelen, uint16_t type, uint16_t dclass)
-{
- struct rrset_parse* p = msg->hashtable[h & (PARSE_TABLE_SIZE-1)];
- while(p) {
- if(rrset_parse_equals(p, pkt, h, rrset_flags, dname, dnamelen,
- type, dclass))
- return p;
- p = p->rrset_bucket_next;
- }
- return NULL;
-}
-
-/** return type networkformat that rrsig in packet covers */
-static int
-pkt_rrsig_covered(sldns_buffer* pkt, uint8_t* here, uint16_t* type)
-{
- size_t pos = sldns_buffer_position(pkt);
- sldns_buffer_set_position(pkt, (size_t)(here-sldns_buffer_begin(pkt)));
- /* ttl + len + size of small rrsig(rootlabel, no signature) */
- if(sldns_buffer_remaining(pkt) < 4+2+19)
- return 0;
- sldns_buffer_skip(pkt, 4); /* ttl */
- if(sldns_buffer_read_u16(pkt) < 19) /* too short */ {
- sldns_buffer_set_position(pkt, pos);
- return 0;
- }
- *type = sldns_buffer_read_u16(pkt);
- sldns_buffer_set_position(pkt, pos);
- return 1;
-}
-
-/** true if covered type equals prevtype */
-static int
-pkt_rrsig_covered_equals(sldns_buffer* pkt, uint8_t* here, uint16_t type)
-{
- uint16_t t;
- if(pkt_rrsig_covered(pkt, here, &t) && t == type)
- return 1;
- return 0;
-}
-
-void
-msgparse_bucket_remove(struct msg_parse* msg, struct rrset_parse* rrset)
-{
- struct rrset_parse** p;
- p = &msg->hashtable[ rrset->hash & (PARSE_TABLE_SIZE-1) ];
- while(*p) {
- if(*p == rrset) {
- *p = rrset->rrset_bucket_next;
- return;
- }
- p = &( (*p)->rrset_bucket_next );
- }
-}
-
-/** change section of rrset from previous to current section */
-static void
-change_section(struct msg_parse* msg, struct rrset_parse* rrset,
- sldns_pkt_section section)
-{
- struct rrset_parse *p, *prev;
- /* remove from list */
- if(section == rrset->section)
- return;
- p = msg->rrset_first;
- prev = 0;
- while(p) {
- if(p == rrset) {
- if(prev) prev->rrset_all_next = p->rrset_all_next;
- else msg->rrset_first = p->rrset_all_next;
- if(msg->rrset_last == rrset)
- msg->rrset_last = prev;
- break;
- }
- prev = p;
- p = p->rrset_all_next;
- }
- /* remove from count */
- switch(rrset->section) {
- case LDNS_SECTION_ANSWER: msg->an_rrsets--; break;
- case LDNS_SECTION_AUTHORITY: msg->ns_rrsets--; break;
- case LDNS_SECTION_ADDITIONAL: msg->ar_rrsets--; break;
- default: log_assert(0);
- }
- /* insert at end of list */
- rrset->rrset_all_next = 0;
- if(msg->rrset_last)
- msg->rrset_last->rrset_all_next = rrset;
- else msg->rrset_first = rrset;
- msg->rrset_last = rrset;
- /* up count of new section */
- switch(section) {
- case LDNS_SECTION_AUTHORITY: msg->ns_rrsets++; break;
- case LDNS_SECTION_ADDITIONAL: msg->ar_rrsets++; break;
- default: log_assert(0);
- }
- rrset->section = section;
-}
-
-/** see if rrset of type RRSIG contains sig over given type */
-static int
-rrset_has_sigover(sldns_buffer* pkt, struct rrset_parse* rrset, uint16_t type,
- int* hasother)
-{
- int res = 0;
- struct rr_parse* rr = rrset->rr_first;
- log_assert( rrset->type == LDNS_RR_TYPE_RRSIG );
- while(rr) {
- if(pkt_rrsig_covered_equals(pkt, rr->ttl_data, type))
- res = 1;
- else *hasother = 1;
- rr = rr->next;
- }
- return res;
-}
-
-/** move rrsigs from sigset to dataset */
-static int
-moveover_rrsigs(sldns_buffer* pkt, struct regional* region,
- struct rrset_parse* sigset, struct rrset_parse* dataset, int duplicate)
-{
- struct rr_parse* sig = sigset->rr_first;
- struct rr_parse* prev = NULL;
- struct rr_parse* insert;
- struct rr_parse* nextsig;
- while(sig) {
- nextsig = sig->next;
- if(pkt_rrsig_covered_equals(pkt, sig->ttl_data,
- dataset->type)) {
- if(duplicate) {
- /* new */
- insert = (struct rr_parse*)regional_alloc(
- region, sizeof(struct rr_parse));
- if(!insert) return 0;
- insert->outside_packet = 0;
- insert->ttl_data = sig->ttl_data;
- insert->size = sig->size;
- /* prev not used */
- } else {
- /* remove from sigset */
- if(prev) prev->next = sig->next;
- else sigset->rr_first = sig->next;
- if(sigset->rr_last == sig)
- sigset->rr_last = prev;
- sigset->rr_count--;
- sigset->size -= sig->size;
- insert = sig;
- /* prev not changed */
- }
- /* add to dataset */
- dataset->rrsig_count++;
- insert->next = 0;
- if(dataset->rrsig_last)
- dataset->rrsig_last->next = insert;
- else dataset->rrsig_first = insert;
- dataset->rrsig_last = insert;
- dataset->size += insert->size;
- } else {
- prev = sig;
- }
- sig = nextsig;
- }
- return 1;
-}
-
-/** change an rrsig rrset for use as data rrset */
-static struct rrset_parse*
-change_rrsig_rrset(struct rrset_parse* sigset, struct msg_parse* msg,
- sldns_buffer* pkt, uint16_t datatype, uint32_t rrset_flags,
- int hasother, sldns_pkt_section section, struct regional* region)
-{
- struct rrset_parse* dataset = sigset;
- hashvalue_type hash = pkt_hash_rrset(pkt, sigset->dname, datatype,
- sigset->rrset_class, rrset_flags);
- log_assert( sigset->type == LDNS_RR_TYPE_RRSIG );
- log_assert( datatype != LDNS_RR_TYPE_RRSIG );
- if(hasother) {
- /* need to make new rrset to hold data type */
- dataset = new_rrset(msg, sigset->dname, sigset->dname_len,
- datatype, sigset->rrset_class, hash, rrset_flags,
- section, region);
- if(!dataset)
- return NULL;
- switch(section) {
- case LDNS_SECTION_ANSWER: msg->an_rrsets++; break;
- case LDNS_SECTION_AUTHORITY: msg->ns_rrsets++; break;
- case LDNS_SECTION_ADDITIONAL: msg->ar_rrsets++; break;
- default: log_assert(0);
- }
- if(!moveover_rrsigs(pkt, region, sigset, dataset,
- msg->qtype == LDNS_RR_TYPE_RRSIG ||
- (msg->qtype == LDNS_RR_TYPE_ANY &&
- section != LDNS_SECTION_ANSWER) ))
- return NULL;
- return dataset;
- }
- /* changeover the type of the rrset to data set */
- msgparse_bucket_remove(msg, dataset);
- /* insert into new hash bucket */
- dataset->rrset_bucket_next = msg->hashtable[hash&(PARSE_TABLE_SIZE-1)];
- msg->hashtable[hash&(PARSE_TABLE_SIZE-1)] = dataset;
- dataset->hash = hash;
- /* use section of data item for result */
- change_section(msg, dataset, section);
- dataset->type = datatype;
- dataset->flags = rrset_flags;
- dataset->rrsig_count += dataset->rr_count;
- dataset->rr_count = 0;
- /* move sigs to end of siglist */
- if(dataset->rrsig_last)
- dataset->rrsig_last->next = dataset->rr_first;
- else dataset->rrsig_first = dataset->rr_first;
- dataset->rrsig_last = dataset->rr_last;
- dataset->rr_first = 0;
- dataset->rr_last = 0;
- return dataset;
-}
-
-/** Find rrset. If equal to previous it is fast. hash if not so.
- * @param msg: the message with hash table.
- * @param pkt: the packet in wireformat (needed for compression ptrs).
- * @param dname: pointer to start of dname (compressed) in packet.
- * @param dnamelen: uncompressed wirefmt length of dname.
- * @param type: type of current rr.
- * @param dclass: class of current rr.
- * @param hash: hash value is returned if the rrset could not be found.
- * @param rrset_flags: is returned if the rrset could not be found.
- * @param prev_dname_first: dname of last seen RR. First seen dname.
- * @param prev_dname_last: dname of last seen RR. Last seen dname.
- * @param prev_dnamelen: dname len of last seen RR.
- * @param prev_type: type of last seen RR.
- * @param prev_dclass: class of last seen RR.
- * @param rrset_prev: last seen RRset.
- * @param section: the current section in the packet.
- * @param region: used to allocate temporary parsing data.
- * @return 0 on out of memory.
- */
-static int
-find_rrset(struct msg_parse* msg, sldns_buffer* pkt, uint8_t* dname,
- size_t dnamelen, uint16_t type, uint16_t dclass, hashvalue_type* hash,
- uint32_t* rrset_flags,
- uint8_t** prev_dname_first, uint8_t** prev_dname_last,
- size_t* prev_dnamelen, uint16_t* prev_type,
- uint16_t* prev_dclass, struct rrset_parse** rrset_prev,
- sldns_pkt_section section, struct regional* region)
-{
- hashvalue_type dname_h = pkt_hash_rrset_first(pkt, dname);
- uint16_t covtype;
- if(*rrset_prev) {
- /* check if equal to previous item */
- if(type == *prev_type && dclass == *prev_dclass &&
- dnamelen == *prev_dnamelen &&
- smart_compare(pkt, dname, *prev_dname_first,
- *prev_dname_last) == 0 &&
- type != LDNS_RR_TYPE_RRSIG) {
- /* same as previous */
- *prev_dname_last = dname;
- return 1;
- }
- /* check if rrsig over previous item */
- if(type == LDNS_RR_TYPE_RRSIG && dclass == *prev_dclass &&
- pkt_rrsig_covered_equals(pkt, sldns_buffer_current(pkt),
- *prev_type) &&
- smart_compare(pkt, dname, *prev_dname_first,
- *prev_dname_last) == 0) {
- /* covers previous */
- *prev_dname_last = dname;
- return 1;
- }
- }
- /* find by hashing and lookup in hashtable */
- *rrset_flags = pkt_rrset_flags(pkt, type, section);
-
- /* if rrsig - try to lookup matching data set first */
- if(type == LDNS_RR_TYPE_RRSIG && pkt_rrsig_covered(pkt,
- sldns_buffer_current(pkt), &covtype)) {
- *hash = pkt_hash_rrset_rest(dname_h, covtype, dclass,
- *rrset_flags);
- *rrset_prev = msgparse_hashtable_lookup(msg, pkt, *hash,
- *rrset_flags, dname, dnamelen, covtype, dclass);
- if(!*rrset_prev && covtype == LDNS_RR_TYPE_NSEC) {
- /* if NSEC try with NSEC apex bit twiddled */
- *rrset_flags ^= PACKED_RRSET_NSEC_AT_APEX;
- *hash = pkt_hash_rrset_rest(dname_h, covtype, dclass,
- *rrset_flags);
- *rrset_prev = msgparse_hashtable_lookup(msg, pkt,
- *hash, *rrset_flags, dname, dnamelen, covtype,
- dclass);
- if(!*rrset_prev) /* untwiddle if not found */
- *rrset_flags ^= PACKED_RRSET_NSEC_AT_APEX;
- }
- if(!*rrset_prev && covtype == LDNS_RR_TYPE_SOA) {
- /* if SOA try with SOA neg flag twiddled */
- *rrset_flags ^= PACKED_RRSET_SOA_NEG;
- *hash = pkt_hash_rrset_rest(dname_h, covtype, dclass,
- *rrset_flags);
- *rrset_prev = msgparse_hashtable_lookup(msg, pkt,
- *hash, *rrset_flags, dname, dnamelen, covtype,
- dclass);
- if(!*rrset_prev) /* untwiddle if not found */
- *rrset_flags ^= PACKED_RRSET_SOA_NEG;
- }
- if(*rrset_prev) {
- *prev_dname_first = (*rrset_prev)->dname;
- *prev_dname_last = dname;
- *prev_dnamelen = dnamelen;
- *prev_type = covtype;
- *prev_dclass = dclass;
- return 1;
- }
- }
- if(type != LDNS_RR_TYPE_RRSIG) {
- int hasother = 0;
- /* find matching rrsig */
- *hash = pkt_hash_rrset_rest(dname_h, LDNS_RR_TYPE_RRSIG,
- dclass, 0);
- *rrset_prev = msgparse_hashtable_lookup(msg, pkt, *hash,
- 0, dname, dnamelen, LDNS_RR_TYPE_RRSIG,
- dclass);
- if(*rrset_prev && rrset_has_sigover(pkt, *rrset_prev, type,
- &hasother)) {
- /* yes! */
- *prev_dname_first = (*rrset_prev)->dname;
- *prev_dname_last = dname;
- *prev_dnamelen = dnamelen;
- *prev_type = type;
- *prev_dclass = dclass;
- *rrset_prev = change_rrsig_rrset(*rrset_prev, msg,
- pkt, type, *rrset_flags, hasother, section,
- region);
- if(!*rrset_prev) return 0;
- return 1;
- }
- }
-
- *hash = pkt_hash_rrset_rest(dname_h, type, dclass, *rrset_flags);
- *rrset_prev = msgparse_hashtable_lookup(msg, pkt, *hash, *rrset_flags,
- dname, dnamelen, type, dclass);
- if(*rrset_prev)
- *prev_dname_first = (*rrset_prev)->dname;
- else *prev_dname_first = dname;
- *prev_dname_last = dname;
- *prev_dnamelen = dnamelen;
- *prev_type = type;
- *prev_dclass = dclass;
- return 1;
-}
-
-/**
- * Parse query section.
- * @param pkt: packet, position at call must be at start of query section.
- * at end position is after query section.
- * @param msg: store results here.
- * @return: 0 if OK, or rcode on error.
- */
-static int
-parse_query_section(sldns_buffer* pkt, struct msg_parse* msg)
-{
- if(msg->qdcount == 0)
- return 0;
- if(msg->qdcount > 1)
- return LDNS_RCODE_FORMERR;
- log_assert(msg->qdcount == 1);
- if(sldns_buffer_remaining(pkt) <= 0)
- return LDNS_RCODE_FORMERR;
- msg->qname = sldns_buffer_current(pkt);
- if((msg->qname_len = pkt_dname_len(pkt)) == 0)
- return LDNS_RCODE_FORMERR;
- if(sldns_buffer_remaining(pkt) < sizeof(uint16_t)*2)
- return LDNS_RCODE_FORMERR;
- msg->qtype = sldns_buffer_read_u16(pkt);
- msg->qclass = sldns_buffer_read_u16(pkt);
- return 0;
-}
-
-size_t
-get_rdf_size(sldns_rdf_type rdf)
-{
- switch(rdf) {
- case LDNS_RDF_TYPE_CLASS:
- case LDNS_RDF_TYPE_ALG:
- case LDNS_RDF_TYPE_INT8:
- return 1;
- break;
- case LDNS_RDF_TYPE_INT16:
- case LDNS_RDF_TYPE_TYPE:
- case LDNS_RDF_TYPE_CERT_ALG:
- return 2;
- break;
- case LDNS_RDF_TYPE_INT32:
- case LDNS_RDF_TYPE_TIME:
- case LDNS_RDF_TYPE_A:
- case LDNS_RDF_TYPE_PERIOD:
- return 4;
- break;
- case LDNS_RDF_TYPE_TSIGTIME:
- return 6;
- break;
- case LDNS_RDF_TYPE_AAAA:
- return 16;
- break;
- default:
- log_assert(0); /* add type above */
- /* only types that appear before a domain *
- * name are needed. rest is simply copied. */
- }
- return 0;
-}
-
-/** calculate the size of one rr */
-static int
-calc_size(sldns_buffer* pkt, uint16_t type, struct rr_parse* rr)
-{
- const sldns_rr_descriptor* desc;
- uint16_t pkt_len; /* length of rr inside the packet */
- rr->size = sizeof(uint16_t); /* the rdatalen */
- sldns_buffer_skip(pkt, 4); /* skip ttl */
- pkt_len = sldns_buffer_read_u16(pkt);
- if(sldns_buffer_remaining(pkt) < pkt_len)
- return 0;
- desc = sldns_rr_descript(type);
- if(pkt_len > 0 && desc && desc->_dname_count > 0) {
- int count = (int)desc->_dname_count;
- int rdf = 0;
- size_t len;
- size_t oldpos;
- /* skip first part. */
- while(pkt_len > 0 && count) {
- switch(desc->_wireformat[rdf]) {
- case LDNS_RDF_TYPE_DNAME:
- /* decompress every domain name */
- oldpos = sldns_buffer_position(pkt);
- if((len = pkt_dname_len(pkt)) == 0)
- return 0; /* malformed dname */
- if(sldns_buffer_position(pkt)-oldpos > pkt_len)
- return 0; /* dname exceeds rdata */
- pkt_len -= sldns_buffer_position(pkt)-oldpos;
- rr->size += len;
- count--;
- len = 0;
- break;
- case LDNS_RDF_TYPE_STR:
- if(pkt_len < 1) {
- /* NOTREACHED, due to 'while(>0)' */
- return 0; /* len byte exceeds rdata */
- }
- len = sldns_buffer_current(pkt)[0] + 1;
- break;
- default:
- len = get_rdf_size(desc->_wireformat[rdf]);
- }
- if(len) {
- if(pkt_len < len)
- return 0; /* exceeds rdata */
- pkt_len -= len;
- sldns_buffer_skip(pkt, (ssize_t)len);
- rr->size += len;
- }
- rdf++;
- }
- }
- /* remaining rdata */
- rr->size += pkt_len;
- sldns_buffer_skip(pkt, (ssize_t)pkt_len);
- return 1;
-}
-
-/** skip rr ttl and rdata */
-static int
-skip_ttl_rdata(sldns_buffer* pkt)
-{
- uint16_t rdatalen;
- if(sldns_buffer_remaining(pkt) < 6) /* ttl + rdatalen */
- return 0;
- sldns_buffer_skip(pkt, 4); /* ttl */
- rdatalen = sldns_buffer_read_u16(pkt);
- if(sldns_buffer_remaining(pkt) < rdatalen)
- return 0;
- sldns_buffer_skip(pkt, (ssize_t)rdatalen);
- return 1;
-}
-
-/** see if RRSIG is a duplicate of another */
-static int
-sig_is_double(sldns_buffer* pkt, struct rrset_parse* rrset, uint8_t* ttldata)
-{
- uint16_t rlen, siglen;
- size_t pos = sldns_buffer_position(pkt);
- struct rr_parse* sig;
- if(sldns_buffer_remaining(pkt) < 6)
- return 0;
- sldns_buffer_skip(pkt, 4); /* ttl */
- rlen = sldns_buffer_read_u16(pkt);
- if(sldns_buffer_remaining(pkt) < rlen) {
- sldns_buffer_set_position(pkt, pos);
- return 0;
- }
- sldns_buffer_set_position(pkt, pos);
-
- sig = rrset->rrsig_first;
- while(sig) {
- /* check if rdatalen is same */
- memmove(&siglen, sig->ttl_data+4, sizeof(siglen));
- siglen = ntohs(siglen);
- /* checks if data in packet is exactly the same, this means
- * also dname in rdata is the same, but rrsig is not allowed
- * to have compressed dnames anyway. If it is compressed anyway
- * it will lead to duplicate rrs for qtype=RRSIG. (or ANY).
- *
- * Cannot use sig->size because size of the other one is not
- * calculated yet.
- */
- if(siglen == rlen) {
- if(siglen>0 && memcmp(sig->ttl_data+6, ttldata+6,
- siglen) == 0) {
- /* same! */
- return 1;
- }
- }
- sig = sig->next;
- }
- return 0;
-}
-
-/** Add rr (from packet here) to rrset, skips rr */
-static int
-add_rr_to_rrset(struct rrset_parse* rrset, sldns_buffer* pkt,
- struct msg_parse* msg, struct regional* region,
- sldns_pkt_section section, uint16_t type)
-{
- struct rr_parse* rr;
- /* check section of rrset. */
- if(rrset->section != section && type != LDNS_RR_TYPE_RRSIG &&
- rrset->type != LDNS_RR_TYPE_RRSIG) {
- /* silently drop it - we drop the last part, since
- * trust in rr data depends on the section it is in.
- * the less trustworthy part is discarded.
- * also the last part is more likely to be incomplete.
- * RFC 2181: must put RRset only once in response. */
- /*
- verbose(VERB_QUERY, "Packet contains rrset data in "
- "multiple sections, dropped last part.");
- log_buf(VERB_QUERY, "packet was", pkt);
- */
- /* forwards */
- if(!skip_ttl_rdata(pkt))
- return LDNS_RCODE_FORMERR;
- return 0;
- }
-
- if( (msg->qtype == LDNS_RR_TYPE_RRSIG ||
- msg->qtype == LDNS_RR_TYPE_ANY)
- && sig_is_double(pkt, rrset, sldns_buffer_current(pkt))) {
- if(!skip_ttl_rdata(pkt))
- return LDNS_RCODE_FORMERR;
- return 0;
- }
-
- /* create rr */
- if(!(rr = (struct rr_parse*)regional_alloc(region, sizeof(*rr))))
- return LDNS_RCODE_SERVFAIL;
- rr->outside_packet = 0;
- rr->ttl_data = sldns_buffer_current(pkt);
- rr->next = 0;
- if(type == LDNS_RR_TYPE_RRSIG && rrset->type != LDNS_RR_TYPE_RRSIG) {
- if(rrset->rrsig_last)
- rrset->rrsig_last->next = rr;
- else rrset->rrsig_first = rr;
- rrset->rrsig_last = rr;
- rrset->rrsig_count++;
- } else {
- if(rrset->rr_last)
- rrset->rr_last->next = rr;
- else rrset->rr_first = rr;
- rrset->rr_last = rr;
- rrset->rr_count++;
- }
-
- /* calc decompressed size */
- if(!calc_size(pkt, type, rr))
- return LDNS_RCODE_FORMERR;
- rrset->size += rr->size;
-
- return 0;
-}
-
-/**
- * Parse packet RR section, for answer, authority and additional sections.
- * @param pkt: packet, position at call must be at start of section.
- * at end position is after section.
- * @param msg: store results here.
- * @param region: how to alloc results.
- * @param section: section enum.
- * @param num_rrs: how many rrs are in the section.
- * @param num_rrsets: returns number of rrsets in the section.
- * @return: 0 if OK, or rcode on error.
- */
-static int
-parse_section(sldns_buffer* pkt, struct msg_parse* msg,
- struct regional* region, sldns_pkt_section section,
- uint16_t num_rrs, size_t* num_rrsets)
-{
- uint16_t i;
- uint8_t* dname, *prev_dname_f = NULL, *prev_dname_l = NULL;
- size_t dnamelen, prev_dnamelen = 0;
- uint16_t type, prev_type = 0;
- uint16_t dclass, prev_dclass = 0;
- uint32_t rrset_flags = 0;
- hashvalue_type hash = 0;
- struct rrset_parse* rrset = NULL;
- int r;
-
- if(num_rrs == 0)
- return 0;
- if(sldns_buffer_remaining(pkt) <= 0)
- return LDNS_RCODE_FORMERR;
- for(i=0; i<num_rrs; i++) {
- /* parse this RR. */
- dname = sldns_buffer_current(pkt);
- if((dnamelen = pkt_dname_len(pkt)) == 0)
- return LDNS_RCODE_FORMERR;
- if(sldns_buffer_remaining(pkt) < 10) /* type, class, ttl, len */
- return LDNS_RCODE_FORMERR;
- type = sldns_buffer_read_u16(pkt);
- sldns_buffer_read(pkt, &dclass, sizeof(dclass));
-
- if(0) { /* debug show what is being parsed. */
- if(type == LDNS_RR_TYPE_RRSIG) {
- uint16_t t;
- if(pkt_rrsig_covered(pkt,
- sldns_buffer_current(pkt), &t))
- fprintf(stderr, "parse of %s(%d) [%s(%d)]",
- sldns_rr_descript(type)?
- sldns_rr_descript(type)->_name: "??",
- (int)type,
- sldns_rr_descript(t)?
- sldns_rr_descript(t)->_name: "??",
- (int)t);
- } else
- fprintf(stderr, "parse of %s(%d)",
- sldns_rr_descript(type)?
- sldns_rr_descript(type)->_name: "??",
- (int)type);
- fprintf(stderr, " %s(%d) ",
- sldns_lookup_by_id(sldns_rr_classes,
- (int)ntohs(dclass))?sldns_lookup_by_id(
- sldns_rr_classes, (int)ntohs(dclass))->name:
- "??", (int)ntohs(dclass));
- dname_print(stderr, pkt, dname);
- fprintf(stderr, "\n");
- }
-
- /* see if it is part of an existing RR set */
- if(!find_rrset(msg, pkt, dname, dnamelen, type, dclass, &hash,
- &rrset_flags, &prev_dname_f, &prev_dname_l,
- &prev_dnamelen, &prev_type, &prev_dclass, &rrset,
- section, region))
- return LDNS_RCODE_SERVFAIL;
- if(!rrset) {
- /* it is a new RR set. hash&flags already calculated.*/
- (*num_rrsets)++;
- rrset = new_rrset(msg, dname, dnamelen, type, dclass,
- hash, rrset_flags, section, region);
- if(!rrset)
- return LDNS_RCODE_SERVFAIL;
- }
- else if(0) {
- fprintf(stderr, "is part of existing: ");
- dname_print(stderr, pkt, rrset->dname);
- fprintf(stderr, " type %s(%d)\n",
- sldns_rr_descript(rrset->type)?
- sldns_rr_descript(rrset->type)->_name: "??",
- (int)rrset->type);
- }
- /* add to rrset. */
- if((r=add_rr_to_rrset(rrset, pkt, msg, region, section,
- type)) != 0)
- return r;
- }
- return 0;
-}
-
-int
-parse_packet(sldns_buffer* pkt, struct msg_parse* msg, struct regional* region)
-{
- int ret;
- if(sldns_buffer_remaining(pkt) < LDNS_HEADER_SIZE)
- return LDNS_RCODE_FORMERR;
- /* read the header */
- sldns_buffer_read(pkt, &msg->id, sizeof(uint16_t));
- msg->flags = sldns_buffer_read_u16(pkt);
- msg->qdcount = sldns_buffer_read_u16(pkt);
- msg->ancount = sldns_buffer_read_u16(pkt);
- msg->nscount = sldns_buffer_read_u16(pkt);
- msg->arcount = sldns_buffer_read_u16(pkt);
- if(msg->qdcount > 1)
- return LDNS_RCODE_FORMERR;
- if((ret = parse_query_section(pkt, msg)) != 0)
- return ret;
- if((ret = parse_section(pkt, msg, region, LDNS_SECTION_ANSWER,
- msg->ancount, &msg->an_rrsets)) != 0)
- return ret;
- if((ret = parse_section(pkt, msg, region, LDNS_SECTION_AUTHORITY,
- msg->nscount, &msg->ns_rrsets)) != 0)
- return ret;
- if(sldns_buffer_remaining(pkt) == 0 && msg->arcount == 1) {
- /* BIND accepts leniently that an EDNS record is missing.
- * so, we do too. */
- } else if((ret = parse_section(pkt, msg, region,
- LDNS_SECTION_ADDITIONAL, msg->arcount, &msg->ar_rrsets)) != 0)
- return ret;
- /* if(sldns_buffer_remaining(pkt) > 0) { */
- /* there is spurious data at end of packet. ignore */
- /* } */
- msg->rrset_count = msg->an_rrsets + msg->ns_rrsets + msg->ar_rrsets;
- return 0;
-}
-
-/** parse EDNS options from EDNS wireformat rdata */
-static int
-parse_edns_options(uint8_t* rdata_ptr, size_t rdata_len,
- struct edns_data* edns, struct regional* region)
-{
- /* while still more options, and have code+len to read */
- /* ignores partial content (i.e. rdata len 3) */
- while(rdata_len >= 4) {
- uint16_t opt_code = sldns_read_uint16(rdata_ptr);
- uint16_t opt_len = sldns_read_uint16(rdata_ptr+2);
- rdata_ptr += 4;
- rdata_len -= 4;
- if(opt_len > rdata_len)
- break; /* option code partial */
- if(!edns_opt_append(edns, region, opt_code, opt_len,
- rdata_ptr)) {
- log_err("out of memory");
- return 0;
- }
- rdata_ptr += opt_len;
- rdata_len -= opt_len;
- }
- return 1;
-}
-
-int
-parse_extract_edns(struct msg_parse* msg, struct edns_data* edns,
- struct regional* region)
-{
- struct rrset_parse* rrset = msg->rrset_first;
- struct rrset_parse* prev = 0;
- struct rrset_parse* found = 0;
- struct rrset_parse* found_prev = 0;
- size_t rdata_len;
- uint8_t* rdata_ptr;
- /* since the class encodes the UDP size, we cannot use hash table to
- * find the EDNS OPT record. Scan the packet. */
- while(rrset) {
- if(rrset->type == LDNS_RR_TYPE_OPT) {
- /* only one OPT RR allowed. */
- if(found) return LDNS_RCODE_FORMERR;
- /* found it! */
- found_prev = prev;
- found = rrset;
- }
- prev = rrset;
- rrset = rrset->rrset_all_next;
- }
- if(!found) {
- memset(edns, 0, sizeof(*edns));
- edns->udp_size = 512;
- return 0;
- }
- /* check the found RRset */
- /* most lenient check possible. ignore dname, use last opt */
- if(found->section != LDNS_SECTION_ADDITIONAL)
- return LDNS_RCODE_FORMERR;
- if(found->rr_count == 0)
- return LDNS_RCODE_FORMERR;
- if(0) { /* strict checking of dname and RRcount */
- if(found->dname_len != 1 || !found->dname
- || found->dname[0] != 0) return LDNS_RCODE_FORMERR;
- if(found->rr_count != 1) return LDNS_RCODE_FORMERR;
- }
- log_assert(found->rr_first && found->rr_last);
-
- /* remove from packet */
- if(found_prev) found_prev->rrset_all_next = found->rrset_all_next;
- else msg->rrset_first = found->rrset_all_next;
- if(found == msg->rrset_last)
- msg->rrset_last = found_prev;
- msg->arcount --;
- msg->ar_rrsets --;
- msg->rrset_count --;
-
- /* take the data ! */
- edns->edns_present = 1;
- edns->ext_rcode = found->rr_last->ttl_data[0];
- edns->edns_version = found->rr_last->ttl_data[1];
- edns->bits = sldns_read_uint16(&found->rr_last->ttl_data[2]);
- edns->udp_size = ntohs(found->rrset_class);
- edns->opt_list = NULL;
-
- /* take the options */
- rdata_len = found->rr_first->size;
- rdata_ptr = found->rr_first->ttl_data+6;
- if(!parse_edns_options(rdata_ptr, rdata_len, edns, region))
- return 0;
-
- /* ignore rrsigs */
-
- return 0;
-}
-
-int
-parse_edns_from_pkt(sldns_buffer* pkt, struct edns_data* edns,
- struct regional* region)
-{
- size_t rdata_len;
- uint8_t* rdata_ptr;
- log_assert(LDNS_QDCOUNT(sldns_buffer_begin(pkt)) == 1);
- log_assert(LDNS_ANCOUNT(sldns_buffer_begin(pkt)) == 0);
- log_assert(LDNS_NSCOUNT(sldns_buffer_begin(pkt)) == 0);
- /* check edns section is present */
- if(LDNS_ARCOUNT(sldns_buffer_begin(pkt)) > 1) {
- return LDNS_RCODE_FORMERR;
- }
- if(LDNS_ARCOUNT(sldns_buffer_begin(pkt)) == 0) {
- memset(edns, 0, sizeof(*edns));
- edns->udp_size = 512;
- return 0;
- }
- /* domain name must be the root of length 1. */
- if(pkt_dname_len(pkt) != 1)
- return LDNS_RCODE_FORMERR;
- if(sldns_buffer_remaining(pkt) < 10) /* type, class, ttl, rdatalen */
- return LDNS_RCODE_FORMERR;
- if(sldns_buffer_read_u16(pkt) != LDNS_RR_TYPE_OPT)
- return LDNS_RCODE_FORMERR;
- edns->edns_present = 1;
- edns->udp_size = sldns_buffer_read_u16(pkt); /* class is udp size */
- edns->ext_rcode = sldns_buffer_read_u8(pkt); /* ttl used for bits */
- edns->edns_version = sldns_buffer_read_u8(pkt);
- edns->bits = sldns_buffer_read_u16(pkt);
- edns->opt_list = NULL;
-
- /* take the options */
- rdata_len = sldns_buffer_read_u16(pkt);
- if(sldns_buffer_remaining(pkt) < rdata_len)
- return LDNS_RCODE_FORMERR;
- rdata_ptr = sldns_buffer_current(pkt);
- if(!parse_edns_options(rdata_ptr, rdata_len, edns, region))
- return LDNS_RCODE_SERVFAIL;
-
- /* ignore rrsigs */
-
- return 0;
-}
-
-void
-log_edns_opt_list(enum verbosity_value level, const char* info_str,
- struct edns_option* list)
-{
- if(verbosity >= level && list) {
- char str[128], *s;
- size_t slen;
- verbose(level, "%s", info_str);
- while(list) {
- s = str;
- slen = sizeof(str);
- (void)sldns_wire2str_edns_option_print(&s, &slen, list->opt_code,
- list->opt_data, list->opt_len);
- verbose(level, " %s", str);
- list = list->next;
- }
- }
-}
diff --git a/external/unbound/util/data/msgparse.h b/external/unbound/util/data/msgparse.h
deleted file mode 100644
index e21f8504e..000000000
--- a/external/unbound/util/data/msgparse.h
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * util/data/msgparse.h - parse wireformat DNS messages.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * \file
- * Contains message parsing data structures.
- * These point back into the packet buffer.
- *
- * During parsing RRSIGS are put together with the rrsets they (claim to) sign.
- * This process works as follows:
- * o if RRSIG follows the data rrset, it is added to the rrset rrsig list.
- * o if no matching data rrset is found, the RRSIG becomes a new rrset.
- * o If the data rrset later follows the RRSIG
- * o See if the RRSIG rrset contains multiple types, and needs to
- * have the rrsig(s) for that data type split off.
- * o Put the data rr as data type in the rrset and rrsig in list.
- * o RRSIGs are allowed to move to a different section. The section of
- * the data item is used for the final rrset.
- * o multiple signatures over an RRset are possible.
- *
- * For queries of qtype=RRSIG, some special handling is needed, to avoid
- * splitting the RRSIG in the answer section.
- * o duplicate, not split, RRSIGs from the answer section, if qtype=RRSIG.
- * o check for doubles in the rrsig list when adding an RRSIG to data,
- * so that a data rrset is signed by RRSIGs with different rdata.
- * when qtype=RRSIG.
- * This will move the RRSIG from the answer section to sign the data further
- * in the packet (if possible). If then after that, more RRSIGs are found
- * that sign the data as well, doubles are removed.
- */
-
-#ifndef UTIL_DATA_MSGPARSE_H
-#define UTIL_DATA_MSGPARSE_H
-#include "util/storage/lruhash.h"
-#include "sldns/pkthdr.h"
-#include "sldns/rrdef.h"
-struct sldns_buffer;
-struct rrset_parse;
-struct rr_parse;
-struct regional;
-struct edns_option;
-
-/** number of buckets in parse rrset hash table. Must be power of 2. */
-#define PARSE_TABLE_SIZE 32
-/** Maximum TTL that is allowed. */
-extern time_t MAX_TTL;
-/** Minimum TTL that is allowed. */
-extern time_t MIN_TTL;
-/** Maximum Negative TTL that is allowed */
-extern time_t MAX_NEG_TTL;
-/** Negative cache time (for entries without any RRs.) */
-#define NORR_TTL 5 /* seconds */
-
-/**
- * Data stored in scratch pad memory during parsing.
- * Stores the data that will enter into the msgreply and packet result.
- */
-struct msg_parse {
- /** id from message, network format. */
- uint16_t id;
- /** flags from message, host format. */
- uint16_t flags;
- /** count of RRs, host format */
- uint16_t qdcount;
- /** count of RRs, host format */
- uint16_t ancount;
- /** count of RRs, host format */
- uint16_t nscount;
- /** count of RRs, host format */
- uint16_t arcount;
- /** count of RRsets per section. */
- size_t an_rrsets;
- /** count of RRsets per section. */
- size_t ns_rrsets;
- /** count of RRsets per section. */
- size_t ar_rrsets;
- /** total number of rrsets found. */
- size_t rrset_count;
-
- /** query dname (pointer to start location in packet, NULL if none */
- uint8_t* qname;
- /** length of query dname in octets, 0 if none */
- size_t qname_len;
- /** query type, host order. 0 if qdcount=0 */
- uint16_t qtype;
- /** query class, host order. 0 if qdcount=0 */
- uint16_t qclass;
-
- /**
- * Hash table array used during parsing to lookup rrset types.
- * Based on name, type, class. Same hash value as in rrset cache.
- */
- struct rrset_parse* hashtable[PARSE_TABLE_SIZE];
-
- /** linked list of rrsets that have been found (in order). */
- struct rrset_parse* rrset_first;
- /** last element of rrset list. */
- struct rrset_parse* rrset_last;
-};
-
-/**
- * Data stored for an rrset during parsing.
- */
-struct rrset_parse {
- /** next in hash bucket */
- struct rrset_parse* rrset_bucket_next;
- /** next in list of all rrsets */
- struct rrset_parse* rrset_all_next;
- /** hash value of rrset */
- hashvalue_type hash;
- /** which section was it found in: one of
- * LDNS_SECTION_ANSWER, LDNS_SECTION_AUTHORITY, LDNS_SECTION_ADDITIONAL
- */
- sldns_pkt_section section;
- /** start of (possibly compressed) dname in packet */
- uint8_t* dname;
- /** length of the dname uncompressed wireformat */
- size_t dname_len;
- /** type, host order. */
- uint16_t type;
- /** class, network order. var name so that it is not a c++ keyword. */
- uint16_t rrset_class;
- /** the flags for the rrset, like for packedrrset */
- uint32_t flags;
- /** number of RRs in the rr list */
- size_t rr_count;
- /** sum of RR rdata sizes */
- size_t size;
- /** linked list of RRs in this rrset. */
- struct rr_parse* rr_first;
- /** last in list of RRs in this rrset. */
- struct rr_parse* rr_last;
- /** number of RRSIGs over this rrset. */
- size_t rrsig_count;
- /** linked list of RRsig RRs over this rrset. */
- struct rr_parse* rrsig_first;
- /** last in list of RRSIG RRs over this rrset. */
- struct rr_parse* rrsig_last;
-};
-
-/**
- * Data stored for an RR during parsing.
- */
-struct rr_parse {
- /**
- * Pointer to the RR. Points to start of TTL value in the packet.
- * Rdata length and rdata follow it.
- * its dname, type and class are the same and stored for the rrset.
- */
- uint8_t* ttl_data;
- /** true if ttl_data is not part of the packet, but elsewhere in mem.
- * Set for generated CNAMEs for DNAMEs. */
- int outside_packet;
- /** the length of the rdata if allocated (with no dname compression)*/
- size_t size;
- /** next in list of RRs. */
- struct rr_parse* next;
-};
-
-/** Check if label length is first octet of a compression pointer, pass u8. */
-#define LABEL_IS_PTR(x) ( ((x)&0xc0) == 0xc0 )
-/** Calculate destination offset of a compression pointer. pass first and
- * second octets of the compression pointer. */
-#define PTR_OFFSET(x, y) ( ((x)&0x3f)<<8 | (y) )
-/** create a compression pointer to the given offset. */
-#define PTR_CREATE(offset) ((uint16_t)(0xc000 | (offset)))
-
-/** error codes, extended with EDNS, so > 15. */
-#define EDNS_RCODE_BADVERS 16 /** bad EDNS version */
-/** largest valid compression offset */
-#define PTR_MAX_OFFSET 0x3fff
-
-/**
- * EDNS data storage
- * rdata is parsed in a list (has accessor functions). allocated in a
- * region.
- */
-struct edns_data {
- /** if EDNS OPT record was present */
- int edns_present;
- /** Extended RCODE */
- uint8_t ext_rcode;
- /** The EDNS version number */
- uint8_t edns_version;
- /** the EDNS bits field from ttl (host order): Z */
- uint16_t bits;
- /** UDP reassembly size. */
- uint16_t udp_size;
- /** rdata element list, or NULL if none */
- struct edns_option* opt_list;
-};
-
-/**
- * EDNS option
- */
-struct edns_option {
- /** next item in list */
- struct edns_option* next;
- /** type of this edns option */
- uint16_t opt_code;
- /** length of this edns option (cannot exceed uint16 in encoding) */
- size_t opt_len;
- /** data of this edns option; allocated in region, or NULL if len=0 */
- uint8_t* opt_data;
-};
-
-/**
- * Obtain size in the packet of an rr type, that is before dname type.
- * Do TYPE_DNAME, and type STR, yourself. Gives size for most regular types.
- * @param rdf: the rdf type from the descriptor.
- * @return: size in octets. 0 on failure.
- */
-size_t get_rdf_size(sldns_rdf_type rdf);
-
-/**
- * Parse the packet.
- * @param pkt: packet, position at call must be at start of packet.
- * at end position is after packet.
- * @param msg: where to store results.
- * @param region: how to alloc results.
- * @return: 0 if OK, or rcode on error.
- */
-int parse_packet(struct sldns_buffer* pkt, struct msg_parse* msg,
- struct regional* region);
-
-/**
- * After parsing the packet, extract EDNS data from packet.
- * If not present this is noted in the data structure.
- * If a parse error happens, an error code is returned.
- *
- * Quirks:
- * o ignores OPT rdata.
- * o ignores OPT owner name.
- * o ignores extra OPT records, except the last one in the packet.
- *
- * @param msg: parsed message structure. Modified on exit, if EDNS was present
- * it is removed from the additional section.
- * @param edns: the edns data is stored here. Does not have to be initialised.
- * @param region: region to alloc results in (edns option contents)
- * @return: 0 on success. or an RCODE on an error.
- * RCODE formerr if OPT in wrong section, and so on.
- */
-int parse_extract_edns(struct msg_parse* msg, struct edns_data* edns,
- struct regional* region);
-
-/**
- * If EDNS data follows a query section, extract it and initialize edns struct.
- * @param pkt: the packet. position at start must be right after the query
- * section. At end, right after EDNS data or no movement if failed.
- * @param edns: the edns data allocated by the caller. Does not have to be
- * initialised.
- * @param region: region to alloc results in (edns option contents)
- * @return: 0 on success, or an RCODE on error.
- * RCODE formerr if OPT is badly formatted and so on.
- */
-int parse_edns_from_pkt(struct sldns_buffer* pkt, struct edns_data* edns,
- struct regional* region);
-
-/**
- * Calculate hash value for rrset in packet.
- * @param pkt: the packet.
- * @param dname: pointer to uncompressed dname, or compressed dname in packet.
- * @param type: rrset type in host order.
- * @param dclass: rrset class in network order.
- * @param rrset_flags: rrset flags (same as packed_rrset flags).
- * @return hash value
- */
-hashvalue_type pkt_hash_rrset(struct sldns_buffer* pkt, uint8_t* dname,
- uint16_t type, uint16_t dclass, uint32_t rrset_flags);
-
-/**
- * Lookup in msg hashtable to find a rrset.
- * @param msg: with the hashtable.
- * @param pkt: packet for compressed names.
- * @param h: hash value
- * @param rrset_flags: flags of rrset sought for.
- * @param dname: name of rrset sought for.
- * @param dnamelen: len of dname.
- * @param type: rrset type, host order.
- * @param dclass: rrset class, network order.
- * @return NULL or the rrset_parse if found.
- */
-struct rrset_parse* msgparse_hashtable_lookup(struct msg_parse* msg,
- struct sldns_buffer* pkt, hashvalue_type h, uint32_t rrset_flags,
- uint8_t* dname, size_t dnamelen, uint16_t type, uint16_t dclass);
-
-/**
- * Remove rrset from hash table.
- * @param msg: with hashtable.
- * @param rrset: with hash value and id info.
- */
-void msgparse_bucket_remove(struct msg_parse* msg, struct rrset_parse* rrset);
-
-/**
- * Log the edns options in the edns option list.
- * @param level: the verbosity level.
- * @param info_str: the informational string to be printed before the options.
- * @param list: the edns option list.
- */
-void log_edns_opt_list(enum verbosity_value level, const char* info_str,
- struct edns_option* list);
-
-#endif /* UTIL_DATA_MSGPARSE_H */
diff --git a/external/unbound/util/data/msgreply.c b/external/unbound/util/data/msgreply.c
deleted file mode 100644
index 2ce898d7f..000000000
--- a/external/unbound/util/data/msgreply.c
+++ /dev/null
@@ -1,1206 +0,0 @@
-/*
- * util/data/msgreply.c - store message and reply data.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains a data structure to store a message and its reply.
- */
-
-#include "config.h"
-#include "util/data/msgreply.h"
-#include "util/storage/lookup3.h"
-#include "util/log.h"
-#include "util/alloc.h"
-#include "util/netevent.h"
-#include "util/net_help.h"
-#include "util/data/dname.h"
-#include "util/regional.h"
-#include "util/data/msgparse.h"
-#include "util/data/msgencode.h"
-#include "sldns/sbuffer.h"
-#include "sldns/wire2str.h"
-#include "util/module.h"
-#include "util/fptr_wlist.h"
-
-/** MAX TTL default for messages and rrsets */
-time_t MAX_TTL = 3600 * 24 * 10; /* ten days */
-/** MIN TTL default for messages and rrsets */
-time_t MIN_TTL = 0;
-/** MAX Negative TTL, for SOA records in authority section */
-time_t MAX_NEG_TTL = 3600; /* one hour */
-
-/** allocate qinfo, return 0 on error */
-static int
-parse_create_qinfo(sldns_buffer* pkt, struct msg_parse* msg,
- struct query_info* qinf, struct regional* region)
-{
- if(msg->qname) {
- if(region)
- qinf->qname = (uint8_t*)regional_alloc(region,
- msg->qname_len);
- else qinf->qname = (uint8_t*)malloc(msg->qname_len);
- if(!qinf->qname) return 0;
- dname_pkt_copy(pkt, qinf->qname, msg->qname);
- } else qinf->qname = 0;
- qinf->qname_len = msg->qname_len;
- qinf->qtype = msg->qtype;
- qinf->qclass = msg->qclass;
- qinf->local_alias = NULL;
- return 1;
-}
-
-/** constructor for replyinfo */
-struct reply_info*
-construct_reply_info_base(struct regional* region, uint16_t flags, size_t qd,
- time_t ttl, time_t prettl, size_t an, size_t ns, size_t ar,
- size_t total, enum sec_status sec)
-{
- struct reply_info* rep;
- /* rrset_count-1 because the first ref is part of the struct. */
- size_t s = sizeof(struct reply_info) - sizeof(struct rrset_ref) +
- sizeof(struct ub_packed_rrset_key*) * total;
- if(total >= RR_COUNT_MAX) return NULL; /* sanity check on numRRS*/
- if(region)
- rep = (struct reply_info*)regional_alloc(region, s);
- else rep = (struct reply_info*)malloc(s +
- sizeof(struct rrset_ref) * (total));
- if(!rep)
- return NULL;
- rep->flags = flags;
- rep->qdcount = qd;
- rep->ttl = ttl;
- rep->prefetch_ttl = prettl;
- rep->an_numrrsets = an;
- rep->ns_numrrsets = ns;
- rep->ar_numrrsets = ar;
- rep->rrset_count = total;
- rep->security = sec;
- rep->authoritative = 0;
- /* array starts after the refs */
- if(region)
- rep->rrsets = (struct ub_packed_rrset_key**)&(rep->ref[0]);
- else rep->rrsets = (struct ub_packed_rrset_key**)&(rep->ref[total]);
- /* zero the arrays to assist cleanup in case of malloc failure */
- memset( rep->rrsets, 0, sizeof(struct ub_packed_rrset_key*) * total);
- if(!region)
- memset( &rep->ref[0], 0, sizeof(struct rrset_ref) * total);
- return rep;
-}
-
-/** allocate replyinfo, return 0 on error */
-static int
-parse_create_repinfo(struct msg_parse* msg, struct reply_info** rep,
- struct regional* region)
-{
- *rep = construct_reply_info_base(region, msg->flags, msg->qdcount, 0,
- 0, msg->an_rrsets, msg->ns_rrsets, msg->ar_rrsets,
- msg->rrset_count, sec_status_unchecked);
- if(!*rep)
- return 0;
- return 1;
-}
-
-int
-reply_info_alloc_rrset_keys(struct reply_info* rep, struct alloc_cache* alloc,
- struct regional* region)
-{
- size_t i;
- for(i=0; i<rep->rrset_count; i++) {
- if(region) {
- rep->rrsets[i] = (struct ub_packed_rrset_key*)
- regional_alloc(region,
- sizeof(struct ub_packed_rrset_key));
- if(rep->rrsets[i]) {
- memset(rep->rrsets[i], 0,
- sizeof(struct ub_packed_rrset_key));
- rep->rrsets[i]->entry.key = rep->rrsets[i];
- }
- }
- else rep->rrsets[i] = alloc_special_obtain(alloc);
- if(!rep->rrsets[i])
- return 0;
- rep->rrsets[i]->entry.data = NULL;
- }
- return 1;
-}
-
-/** find the minimumttl in the rdata of SOA record */
-static time_t
-soa_find_minttl(struct rr_parse* rr)
-{
- uint16_t rlen = sldns_read_uint16(rr->ttl_data+4);
- if(rlen < 20)
- return 0; /* rdata too small for SOA (dname, dname, 5*32bit) */
- /* minimum TTL is the last 32bit value in the rdata of the record */
- /* at position ttl_data + 4(ttl) + 2(rdatalen) + rdatalen - 4(timeval)*/
- return (time_t)sldns_read_uint32(rr->ttl_data+6+rlen-4);
-}
-
-/** do the rdata copy */
-static int
-rdata_copy(sldns_buffer* pkt, struct packed_rrset_data* data, uint8_t* to,
- struct rr_parse* rr, time_t* rr_ttl, uint16_t type,
- sldns_pkt_section section)
-{
- uint16_t pkt_len;
- const sldns_rr_descriptor* desc;
-
- *rr_ttl = sldns_read_uint32(rr->ttl_data);
- /* RFC 2181 Section 8. if msb of ttl is set treat as if zero. */
- if(*rr_ttl & 0x80000000U)
- *rr_ttl = 0;
- if(type == LDNS_RR_TYPE_SOA && section == LDNS_SECTION_AUTHORITY) {
- /* negative response. see if TTL of SOA record larger than the
- * minimum-ttl in the rdata of the SOA record */
- if(*rr_ttl > soa_find_minttl(rr))
- *rr_ttl = soa_find_minttl(rr);
- if(*rr_ttl > MAX_NEG_TTL)
- *rr_ttl = MAX_NEG_TTL;
- }
- if(*rr_ttl < MIN_TTL)
- *rr_ttl = MIN_TTL;
- if(*rr_ttl < data->ttl)
- data->ttl = *rr_ttl;
-
- if(rr->outside_packet) {
- /* uncompressed already, only needs copy */
- memmove(to, rr->ttl_data+sizeof(uint32_t), rr->size);
- return 1;
- }
-
- sldns_buffer_set_position(pkt, (size_t)
- (rr->ttl_data - sldns_buffer_begin(pkt) + sizeof(uint32_t)));
- /* insert decompressed size into rdata len stored in memory */
- /* -2 because rdatalen bytes are not included. */
- pkt_len = htons(rr->size - 2);
- memmove(to, &pkt_len, sizeof(uint16_t));
- to += 2;
- /* read packet rdata len */
- pkt_len = sldns_buffer_read_u16(pkt);
- if(sldns_buffer_remaining(pkt) < pkt_len)
- return 0;
- desc = sldns_rr_descript(type);
- if(pkt_len > 0 && desc && desc->_dname_count > 0) {
- int count = (int)desc->_dname_count;
- int rdf = 0;
- size_t len;
- size_t oldpos;
- /* decompress dnames. */
- while(pkt_len > 0 && count) {
- switch(desc->_wireformat[rdf]) {
- case LDNS_RDF_TYPE_DNAME:
- oldpos = sldns_buffer_position(pkt);
- dname_pkt_copy(pkt, to,
- sldns_buffer_current(pkt));
- to += pkt_dname_len(pkt);
- pkt_len -= sldns_buffer_position(pkt)-oldpos;
- count--;
- len = 0;
- break;
- case LDNS_RDF_TYPE_STR:
- len = sldns_buffer_current(pkt)[0] + 1;
- break;
- default:
- len = get_rdf_size(desc->_wireformat[rdf]);
- break;
- }
- if(len) {
- memmove(to, sldns_buffer_current(pkt), len);
- to += len;
- sldns_buffer_skip(pkt, (ssize_t)len);
- log_assert(len <= pkt_len);
- pkt_len -= len;
- }
- rdf++;
- }
- }
- /* copy remaining rdata */
- if(pkt_len > 0)
- memmove(to, sldns_buffer_current(pkt), pkt_len);
-
- return 1;
-}
-
-/** copy over the data into packed rrset */
-static int
-parse_rr_copy(sldns_buffer* pkt, struct rrset_parse* pset,
- struct packed_rrset_data* data)
-{
- size_t i;
- struct rr_parse* rr = pset->rr_first;
- uint8_t* nextrdata;
- size_t total = pset->rr_count + pset->rrsig_count;
- data->ttl = MAX_TTL;
- data->count = pset->rr_count;
- data->rrsig_count = pset->rrsig_count;
- data->trust = rrset_trust_none;
- data->security = sec_status_unchecked;
- /* layout: struct - rr_len - rr_data - rr_ttl - rdata - rrsig */
- data->rr_len = (size_t*)((uint8_t*)data +
- sizeof(struct packed_rrset_data));
- data->rr_data = (uint8_t**)&(data->rr_len[total]);
- data->rr_ttl = (time_t*)&(data->rr_data[total]);
- nextrdata = (uint8_t*)&(data->rr_ttl[total]);
- for(i=0; i<data->count; i++) {
- data->rr_len[i] = rr->size;
- data->rr_data[i] = nextrdata;
- nextrdata += rr->size;
- if(!rdata_copy(pkt, data, data->rr_data[i], rr,
- &data->rr_ttl[i], pset->type, pset->section))
- return 0;
- rr = rr->next;
- }
- /* if rrsig, its rdata is at nextrdata */
- rr = pset->rrsig_first;
- for(i=data->count; i<total; i++) {
- data->rr_len[i] = rr->size;
- data->rr_data[i] = nextrdata;
- nextrdata += rr->size;
- if(!rdata_copy(pkt, data, data->rr_data[i], rr,
- &data->rr_ttl[i], LDNS_RR_TYPE_RRSIG, pset->section))
- return 0;
- rr = rr->next;
- }
- return 1;
-}
-
-/** create rrset return 0 on failure */
-static int
-parse_create_rrset(sldns_buffer* pkt, struct rrset_parse* pset,
- struct packed_rrset_data** data, struct regional* region)
-{
- /* allocate */
- size_t s;
- if(pset->rr_count > RR_COUNT_MAX || pset->rrsig_count > RR_COUNT_MAX ||
- pset->size > RR_COUNT_MAX)
- return 0; /* protect against integer overflow */
- s = sizeof(struct packed_rrset_data) +
- (pset->rr_count + pset->rrsig_count) *
- (sizeof(size_t)+sizeof(uint8_t*)+sizeof(time_t)) +
- pset->size;
- if(region)
- *data = regional_alloc(region, s);
- else *data = malloc(s);
- if(!*data)
- return 0;
- /* copy & decompress */
- if(!parse_rr_copy(pkt, pset, *data)) {
- if(!region) free(*data);
- return 0;
- }
- return 1;
-}
-
-/** get trust value for rrset */
-static enum rrset_trust
-get_rrset_trust(struct msg_parse* msg, struct rrset_parse* rrset)
-{
- uint16_t AA = msg->flags & BIT_AA;
- if(rrset->section == LDNS_SECTION_ANSWER) {
- if(AA) {
- /* RFC2181 says remainder of CNAME chain is nonauth*/
- if(msg->rrset_first &&
- msg->rrset_first->section==LDNS_SECTION_ANSWER
- && msg->rrset_first->type==LDNS_RR_TYPE_CNAME){
- if(rrset == msg->rrset_first)
- return rrset_trust_ans_AA;
- else return rrset_trust_ans_noAA;
- }
- if(msg->rrset_first &&
- msg->rrset_first->section==LDNS_SECTION_ANSWER
- && msg->rrset_first->type==LDNS_RR_TYPE_DNAME){
- if(rrset == msg->rrset_first ||
- rrset == msg->rrset_first->rrset_all_next)
- return rrset_trust_ans_AA;
- else return rrset_trust_ans_noAA;
- }
- return rrset_trust_ans_AA;
- }
- else return rrset_trust_ans_noAA;
- } else if(rrset->section == LDNS_SECTION_AUTHORITY) {
- if(AA) return rrset_trust_auth_AA;
- else return rrset_trust_auth_noAA;
- } else {
- /* addit section */
- if(AA) return rrset_trust_add_AA;
- else return rrset_trust_add_noAA;
- }
- /* NOTREACHED */
- return rrset_trust_none;
-}
-
-int
-parse_copy_decompress_rrset(sldns_buffer* pkt, struct msg_parse* msg,
- struct rrset_parse *pset, struct regional* region,
- struct ub_packed_rrset_key* pk)
-{
- struct packed_rrset_data* data;
- pk->rk.flags = pset->flags;
- pk->rk.dname_len = pset->dname_len;
- if(region)
- pk->rk.dname = (uint8_t*)regional_alloc(
- region, pset->dname_len);
- else pk->rk.dname =
- (uint8_t*)malloc(pset->dname_len);
- if(!pk->rk.dname)
- return 0;
- /** copy & decompress dname */
- dname_pkt_copy(pkt, pk->rk.dname, pset->dname);
- /** copy over type and class */
- pk->rk.type = htons(pset->type);
- pk->rk.rrset_class = pset->rrset_class;
- /** read data part. */
- if(!parse_create_rrset(pkt, pset, &data, region))
- return 0;
- pk->entry.data = (void*)data;
- pk->entry.key = (void*)pk;
- pk->entry.hash = pset->hash;
- data->trust = get_rrset_trust(msg, pset);
- return 1;
-}
-
-/**
- * Copy and decompress rrs
- * @param pkt: the packet for compression pointer resolution.
- * @param msg: the parsed message
- * @param rep: reply info to put rrs into.
- * @param region: if not NULL, used for allocation.
- * @return 0 on failure.
- */
-static int
-parse_copy_decompress(sldns_buffer* pkt, struct msg_parse* msg,
- struct reply_info* rep, struct regional* region)
-{
- size_t i;
- struct rrset_parse *pset = msg->rrset_first;
- struct packed_rrset_data* data;
- log_assert(rep);
- rep->ttl = MAX_TTL;
- rep->security = sec_status_unchecked;
- if(rep->rrset_count == 0)
- rep->ttl = NORR_TTL;
-
- for(i=0; i<rep->rrset_count; i++) {
- if(!parse_copy_decompress_rrset(pkt, msg, pset, region,
- rep->rrsets[i]))
- return 0;
- data = (struct packed_rrset_data*)rep->rrsets[i]->entry.data;
- if(data->ttl < rep->ttl)
- rep->ttl = data->ttl;
-
- pset = pset->rrset_all_next;
- }
- rep->prefetch_ttl = PREFETCH_TTL_CALC(rep->ttl);
- return 1;
-}
-
-int
-parse_create_msg(sldns_buffer* pkt, struct msg_parse* msg,
- struct alloc_cache* alloc, struct query_info* qinf,
- struct reply_info** rep, struct regional* region)
-{
- log_assert(pkt && msg);
- if(!parse_create_qinfo(pkt, msg, qinf, region))
- return 0;
- if(!parse_create_repinfo(msg, rep, region))
- return 0;
- if(!reply_info_alloc_rrset_keys(*rep, alloc, region))
- return 0;
- if(!parse_copy_decompress(pkt, msg, *rep, region))
- return 0;
- return 1;
-}
-
-int reply_info_parse(sldns_buffer* pkt, struct alloc_cache* alloc,
- struct query_info* qinf, struct reply_info** rep,
- struct regional* region, struct edns_data* edns)
-{
- /* use scratch pad region-allocator during parsing. */
- struct msg_parse* msg;
- int ret;
-
- qinf->qname = NULL;
- qinf->local_alias = NULL;
- *rep = NULL;
- if(!(msg = regional_alloc(region, sizeof(*msg)))) {
- return LDNS_RCODE_SERVFAIL;
- }
- memset(msg, 0, sizeof(*msg));
-
- sldns_buffer_set_position(pkt, 0);
- if((ret = parse_packet(pkt, msg, region)) != 0) {
- return ret;
- }
- if((ret = parse_extract_edns(msg, edns, region)) != 0)
- return ret;
-
- /* parse OK, allocate return structures */
- /* this also performs dname decompression */
- if(!parse_create_msg(pkt, msg, alloc, qinf, rep, NULL)) {
- query_info_clear(qinf);
- reply_info_parsedelete(*rep, alloc);
- *rep = NULL;
- return LDNS_RCODE_SERVFAIL;
- }
- return 0;
-}
-
-/** helper compare function to sort in lock order */
-static int
-reply_info_sortref_cmp(const void* a, const void* b)
-{
- struct rrset_ref* x = (struct rrset_ref*)a;
- struct rrset_ref* y = (struct rrset_ref*)b;
- if(x->key < y->key) return -1;
- if(x->key > y->key) return 1;
- return 0;
-}
-
-void
-reply_info_sortref(struct reply_info* rep)
-{
- qsort(&rep->ref[0], rep->rrset_count, sizeof(struct rrset_ref),
- reply_info_sortref_cmp);
-}
-
-void
-reply_info_set_ttls(struct reply_info* rep, time_t timenow)
-{
- size_t i, j;
- rep->ttl += timenow;
- rep->prefetch_ttl += timenow;
- for(i=0; i<rep->rrset_count; i++) {
- struct packed_rrset_data* data = (struct packed_rrset_data*)
- rep->ref[i].key->entry.data;
- if(i>0 && rep->ref[i].key == rep->ref[i-1].key)
- continue;
- data->ttl += timenow;
- for(j=0; j<data->count + data->rrsig_count; j++) {
- data->rr_ttl[j] += timenow;
- }
- }
-}
-
-void
-reply_info_parsedelete(struct reply_info* rep, struct alloc_cache* alloc)
-{
- size_t i;
- if(!rep)
- return;
- /* no need to lock, since not shared in hashtables. */
- for(i=0; i<rep->rrset_count; i++) {
- ub_packed_rrset_parsedelete(rep->rrsets[i], alloc);
- }
- free(rep);
-}
-
-int
-query_info_parse(struct query_info* m, sldns_buffer* query)
-{
- uint8_t* q = sldns_buffer_begin(query);
- /* minimum size: header + \0 + qtype + qclass */
- if(sldns_buffer_limit(query) < LDNS_HEADER_SIZE + 5)
- return 0;
- if(LDNS_OPCODE_WIRE(q) != LDNS_PACKET_QUERY ||
- LDNS_QDCOUNT(q) != 1 || sldns_buffer_position(query) != 0)
- return 0;
- sldns_buffer_skip(query, LDNS_HEADER_SIZE);
- m->qname = sldns_buffer_current(query);
- if((m->qname_len = query_dname_len(query)) == 0)
- return 0; /* parse error */
- if(sldns_buffer_remaining(query) < 4)
- return 0; /* need qtype, qclass */
- m->qtype = sldns_buffer_read_u16(query);
- m->qclass = sldns_buffer_read_u16(query);
- m->local_alias = NULL;
- return 1;
-}
-
-/** tiny subroutine for msgreply_compare */
-#define COMPARE_IT(x, y) \
- if( (x) < (y) ) return -1; \
- else if( (x) > (y) ) return +1; \
- log_assert( (x) == (y) );
-
-int
-query_info_compare(void* m1, void* m2)
-{
- struct query_info* msg1 = (struct query_info*)m1;
- struct query_info* msg2 = (struct query_info*)m2;
- int mc;
- /* from most different to least different for speed */
- COMPARE_IT(msg1->qtype, msg2->qtype);
- if((mc = query_dname_compare(msg1->qname, msg2->qname)) != 0)
- return mc;
- log_assert(msg1->qname_len == msg2->qname_len);
- COMPARE_IT(msg1->qclass, msg2->qclass);
- return 0;
-#undef COMPARE_IT
-}
-
-void
-query_info_clear(struct query_info* m)
-{
- free(m->qname);
- m->qname = NULL;
-}
-
-size_t
-msgreply_sizefunc(void* k, void* d)
-{
- struct msgreply_entry* q = (struct msgreply_entry*)k;
- struct reply_info* r = (struct reply_info*)d;
- size_t s = sizeof(struct msgreply_entry) + sizeof(struct reply_info)
- + q->key.qname_len + lock_get_mem(&q->entry.lock)
- - sizeof(struct rrset_ref);
- s += r->rrset_count * sizeof(struct rrset_ref);
- s += r->rrset_count * sizeof(struct ub_packed_rrset_key*);
- return s;
-}
-
-void
-query_entry_delete(void *k, void* ATTR_UNUSED(arg))
-{
- struct msgreply_entry* q = (struct msgreply_entry*)k;
- lock_rw_destroy(&q->entry.lock);
- query_info_clear(&q->key);
- free(q);
-}
-
-void
-reply_info_delete(void* d, void* ATTR_UNUSED(arg))
-{
- struct reply_info* r = (struct reply_info*)d;
- free(r);
-}
-
-hashvalue_type
-query_info_hash(struct query_info *q, uint16_t flags)
-{
- hashvalue_type h = 0xab;
- h = hashlittle(&q->qtype, sizeof(q->qtype), h);
- if(q->qtype == LDNS_RR_TYPE_AAAA && (flags&BIT_CD))
- h++;
- h = hashlittle(&q->qclass, sizeof(q->qclass), h);
- h = dname_query_hash(q->qname, h);
- return h;
-}
-
-struct msgreply_entry*
-query_info_entrysetup(struct query_info* q, struct reply_info* r,
- hashvalue_type h)
-{
- struct msgreply_entry* e = (struct msgreply_entry*)malloc(
- sizeof(struct msgreply_entry));
- if(!e) return NULL;
- memcpy(&e->key, q, sizeof(*q));
- e->entry.hash = h;
- e->entry.key = e;
- e->entry.data = r;
- lock_rw_init(&e->entry.lock);
- lock_protect(&e->entry.lock, &e->key, sizeof(e->key));
- lock_protect(&e->entry.lock, &e->entry.hash, sizeof(e->entry.hash) +
- sizeof(e->entry.key) + sizeof(e->entry.data));
- lock_protect(&e->entry.lock, e->key.qname, e->key.qname_len);
- q->qname = NULL;
- return e;
-}
-
-/** copy rrsets from replyinfo to dest replyinfo */
-static int
-repinfo_copy_rrsets(struct reply_info* dest, struct reply_info* from,
- struct regional* region)
-{
- size_t i, s;
- struct packed_rrset_data* fd, *dd;
- struct ub_packed_rrset_key* fk, *dk;
- for(i=0; i<dest->rrset_count; i++) {
- fk = from->rrsets[i];
- dk = dest->rrsets[i];
- fd = (struct packed_rrset_data*)fk->entry.data;
- dk->entry.hash = fk->entry.hash;
- dk->rk = fk->rk;
- if(region) {
- dk->id = fk->id;
- dk->rk.dname = (uint8_t*)regional_alloc_init(region,
- fk->rk.dname, fk->rk.dname_len);
- } else
- dk->rk.dname = (uint8_t*)memdup(fk->rk.dname,
- fk->rk.dname_len);
- if(!dk->rk.dname)
- return 0;
- s = packed_rrset_sizeof(fd);
- if(region)
- dd = (struct packed_rrset_data*)regional_alloc_init(
- region, fd, s);
- else dd = (struct packed_rrset_data*)memdup(fd, s);
- if(!dd)
- return 0;
- packed_rrset_ptr_fixup(dd);
- dk->entry.data = (void*)dd;
- }
- return 1;
-}
-
-struct reply_info*
-reply_info_copy(struct reply_info* rep, struct alloc_cache* alloc,
- struct regional* region)
-{
- struct reply_info* cp;
- cp = construct_reply_info_base(region, rep->flags, rep->qdcount,
- rep->ttl, rep->prefetch_ttl, rep->an_numrrsets,
- rep->ns_numrrsets, rep->ar_numrrsets, rep->rrset_count,
- rep->security);
- if(!cp)
- return NULL;
- /* allocate ub_key structures special or not */
- if(!reply_info_alloc_rrset_keys(cp, alloc, region)) {
- if(!region)
- reply_info_parsedelete(cp, alloc);
- return NULL;
- }
- if(!repinfo_copy_rrsets(cp, rep, region)) {
- if(!region)
- reply_info_parsedelete(cp, alloc);
- return NULL;
- }
- return cp;
-}
-
-uint8_t*
-reply_find_final_cname_target(struct query_info* qinfo, struct reply_info* rep)
-{
- uint8_t* sname = qinfo->qname;
- size_t snamelen = qinfo->qname_len;
- size_t i;
- for(i=0; i<rep->an_numrrsets; i++) {
- struct ub_packed_rrset_key* s = rep->rrsets[i];
- /* follow CNAME chain (if any) */
- if(ntohs(s->rk.type) == LDNS_RR_TYPE_CNAME &&
- ntohs(s->rk.rrset_class) == qinfo->qclass &&
- snamelen == s->rk.dname_len &&
- query_dname_compare(sname, s->rk.dname) == 0) {
- get_cname_target(s, &sname, &snamelen);
- }
- }
- if(sname != qinfo->qname)
- return sname;
- return NULL;
-}
-
-struct ub_packed_rrset_key*
-reply_find_answer_rrset(struct query_info* qinfo, struct reply_info* rep)
-{
- uint8_t* sname = qinfo->qname;
- size_t snamelen = qinfo->qname_len;
- size_t i;
- for(i=0; i<rep->an_numrrsets; i++) {
- struct ub_packed_rrset_key* s = rep->rrsets[i];
- /* first match type, for query of qtype cname */
- if(ntohs(s->rk.type) == qinfo->qtype &&
- ntohs(s->rk.rrset_class) == qinfo->qclass &&
- snamelen == s->rk.dname_len &&
- query_dname_compare(sname, s->rk.dname) == 0) {
- return s;
- }
- /* follow CNAME chain (if any) */
- if(ntohs(s->rk.type) == LDNS_RR_TYPE_CNAME &&
- ntohs(s->rk.rrset_class) == qinfo->qclass &&
- snamelen == s->rk.dname_len &&
- query_dname_compare(sname, s->rk.dname) == 0) {
- get_cname_target(s, &sname, &snamelen);
- }
- }
- return NULL;
-}
-
-struct ub_packed_rrset_key* reply_find_rrset_section_an(struct reply_info* rep,
- uint8_t* name, size_t namelen, uint16_t type, uint16_t dclass)
-{
- size_t i;
- for(i=0; i<rep->an_numrrsets; i++) {
- struct ub_packed_rrset_key* s = rep->rrsets[i];
- if(ntohs(s->rk.type) == type &&
- ntohs(s->rk.rrset_class) == dclass &&
- namelen == s->rk.dname_len &&
- query_dname_compare(name, s->rk.dname) == 0) {
- return s;
- }
- }
- return NULL;
-}
-
-struct ub_packed_rrset_key* reply_find_rrset_section_ns(struct reply_info* rep,
- uint8_t* name, size_t namelen, uint16_t type, uint16_t dclass)
-{
- size_t i;
- for(i=rep->an_numrrsets; i<rep->an_numrrsets+rep->ns_numrrsets; i++) {
- struct ub_packed_rrset_key* s = rep->rrsets[i];
- if(ntohs(s->rk.type) == type &&
- ntohs(s->rk.rrset_class) == dclass &&
- namelen == s->rk.dname_len &&
- query_dname_compare(name, s->rk.dname) == 0) {
- return s;
- }
- }
- return NULL;
-}
-
-struct ub_packed_rrset_key* reply_find_rrset(struct reply_info* rep,
- uint8_t* name, size_t namelen, uint16_t type, uint16_t dclass)
-{
- size_t i;
- for(i=0; i<rep->rrset_count; i++) {
- struct ub_packed_rrset_key* s = rep->rrsets[i];
- if(ntohs(s->rk.type) == type &&
- ntohs(s->rk.rrset_class) == dclass &&
- namelen == s->rk.dname_len &&
- query_dname_compare(name, s->rk.dname) == 0) {
- return s;
- }
- }
- return NULL;
-}
-
-void
-log_dns_msg(const char* str, struct query_info* qinfo, struct reply_info* rep)
-{
- /* not particularly fast but flexible, make wireformat and print */
- sldns_buffer* buf = sldns_buffer_new(65535);
- struct regional* region = regional_create();
- if(!reply_info_encode(qinfo, rep, 0, rep->flags, buf, 0,
- region, 65535, 1)) {
- log_info("%s: log_dns_msg: out of memory", str);
- } else {
- char* s = sldns_wire2str_pkt(sldns_buffer_begin(buf),
- sldns_buffer_limit(buf));
- if(!s) {
- log_info("%s: log_dns_msg: ldns tostr failed", str);
- } else {
- log_info("%s %s", str, s);
- }
- free(s);
- }
- sldns_buffer_free(buf);
- regional_destroy(region);
-}
-
-void
-log_reply_info(enum verbosity_value v, struct query_info *qinf,
- struct sockaddr_storage *addr, socklen_t addrlen, struct timeval dur,
- int cached, struct sldns_buffer *rmsg)
-{
- char qname_buf[LDNS_MAX_DOMAINLEN+1];
- char clientip_buf[128];
- char rcode_buf[16];
- char type_buf[16];
- char class_buf[16];
- size_t pktlen;
- uint16_t rcode = FLAGS_GET_RCODE(sldns_buffer_read_u16_at(rmsg, 2));
-
- if(verbosity < v)
- return;
-
- sldns_wire2str_rcode_buf((int)rcode, rcode_buf, sizeof(rcode_buf));
- addr_to_str(addr, addrlen, clientip_buf, sizeof(clientip_buf));
- if(rcode == LDNS_RCODE_FORMERR)
- {
- log_info("%s - - - %s - - - ", clientip_buf, rcode_buf);
- } else {
- dname_str(qinf->qname, qname_buf);
- pktlen = sldns_buffer_limit(rmsg);
- sldns_wire2str_type_buf(qinf->qtype, type_buf, sizeof(type_buf));
- sldns_wire2str_class_buf(qinf->qclass, class_buf, sizeof(class_buf));
- log_info("%s %s %s %s %s " ARG_LL "d.%6.6d %d %d",
- clientip_buf, qname_buf, type_buf, class_buf,
- rcode_buf, (long long)dur.tv_sec, (int)dur.tv_usec, cached, (int)pktlen);
- }
-}
-
-void
-log_query_info(enum verbosity_value v, const char* str,
- struct query_info* qinf)
-{
- log_nametypeclass(v, str, qinf->qname, qinf->qtype, qinf->qclass);
-}
-
-int
-reply_check_cname_chain(struct query_info* qinfo, struct reply_info* rep)
-{
- /* check only answer section rrs for matching cname chain.
- * the cache may return changed rdata, but owner names are untouched.*/
- size_t i;
- uint8_t* sname = qinfo->qname;
- size_t snamelen = qinfo->qname_len;
- for(i=0; i<rep->an_numrrsets; i++) {
- uint16_t t = ntohs(rep->rrsets[i]->rk.type);
- if(t == LDNS_RR_TYPE_DNAME)
- continue; /* skip dnames; note TTL 0 not cached */
- /* verify that owner matches current sname */
- if(query_dname_compare(sname, rep->rrsets[i]->rk.dname) != 0){
- /* cname chain broken */
- return 0;
- }
- /* if this is a cname; move on */
- if(t == LDNS_RR_TYPE_CNAME) {
- get_cname_target(rep->rrsets[i], &sname, &snamelen);
- }
- }
- return 1;
-}
-
-int
-reply_all_rrsets_secure(struct reply_info* rep)
-{
- size_t i;
- for(i=0; i<rep->rrset_count; i++) {
- if( ((struct packed_rrset_data*)rep->rrsets[i]->entry.data)
- ->security != sec_status_secure )
- return 0;
- }
- return 1;
-}
-
-int edns_opt_append(struct edns_data* edns, struct regional* region,
- uint16_t code, size_t len, uint8_t* data)
-{
- struct edns_option** prevp;
- struct edns_option* opt;
-
- /* allocate new element */
- opt = (struct edns_option*)regional_alloc(region, sizeof(*opt));
- if(!opt)
- return 0;
- opt->next = NULL;
- opt->opt_code = code;
- opt->opt_len = len;
- opt->opt_data = NULL;
- if(len > 0) {
- opt->opt_data = regional_alloc_init(region, data, len);
- if(!opt->opt_data)
- return 0;
- }
-
- /* append at end of list */
- prevp = &edns->opt_list;
- while(*prevp != NULL)
- prevp = &((*prevp)->next);
- *prevp = opt;
- return 1;
-}
-
-int edns_opt_list_append(struct edns_option** list, uint16_t code, size_t len,
- uint8_t* data, struct regional* region)
-{
- struct edns_option** prevp;
- struct edns_option* opt;
-
- /* allocate new element */
- opt = (struct edns_option*)regional_alloc(region, sizeof(*opt));
- if(!opt)
- return 0;
- opt->next = NULL;
- opt->opt_code = code;
- opt->opt_len = len;
- opt->opt_data = NULL;
- if(len > 0) {
- opt->opt_data = regional_alloc_init(region, data, len);
- if(!opt->opt_data)
- return 0;
- }
-
- /* append at end of list */
- prevp = list;
- while(*prevp != NULL) {
- prevp = &((*prevp)->next);
- }
- *prevp = opt;
- return 1;
-}
-
-int edns_opt_list_remove(struct edns_option** list, uint16_t code)
-{
- /* The list should already be allocated in a region. Freeing the
- * allocated space in a region is not possible. We just unlink the
- * required elements and they will be freed together with the region. */
-
- struct edns_option* prev;
- struct edns_option* curr;
- if(!list || !(*list)) return 0;
-
- /* Unlink and repoint if the element(s) are first in list */
- while(list && *list && (*list)->opt_code == code) {
- *list = (*list)->next;
- }
-
- if(!list || !(*list)) return 1;
- /* Unlink elements and reattach the list */
- prev = *list;
- curr = (*list)->next;
- while(curr != NULL) {
- if(curr->opt_code == code) {
- prev->next = curr->next;
- curr = curr->next;
- } else {
- prev = curr;
- curr = curr->next;
- }
- }
- return 1;
-}
-
-static int inplace_cb_reply_call_generic(
- struct inplace_cb* callback_list, enum inplace_cb_list_type type,
- struct query_info* qinfo, struct module_qstate* qstate,
- struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region)
-{
- struct inplace_cb* cb;
- struct edns_option* opt_list_out = NULL;
- if(qstate)
- opt_list_out = qstate->edns_opts_front_out;
- for(cb=callback_list; cb; cb=cb->next) {
- fptr_ok(fptr_whitelist_inplace_cb_reply_generic(
- (inplace_cb_reply_func_type*)cb->cb, type));
- (void)(*(inplace_cb_reply_func_type*)cb->cb)(qinfo, qstate, rep,
- rcode, edns, &opt_list_out, region, cb->id, cb->cb_arg);
- }
- edns->opt_list = opt_list_out;
- return 1;
-}
-
-int inplace_cb_reply_call(struct module_env* env, struct query_info* qinfo,
- struct module_qstate* qstate, struct reply_info* rep, int rcode,
- struct edns_data* edns, struct regional* region)
-{
- return inplace_cb_reply_call_generic(
- env->inplace_cb_lists[inplace_cb_reply], inplace_cb_reply, qinfo,
- qstate, rep, rcode, edns, region);
-}
-
-int inplace_cb_reply_cache_call(struct module_env* env,
- struct query_info* qinfo, struct module_qstate* qstate,
- struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region)
-{
- return inplace_cb_reply_call_generic(
- env->inplace_cb_lists[inplace_cb_reply_cache], inplace_cb_reply_cache,
- qinfo, qstate, rep, rcode, edns, region);
-}
-
-int inplace_cb_reply_local_call(struct module_env* env,
- struct query_info* qinfo, struct module_qstate* qstate,
- struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region)
-{
- return inplace_cb_reply_call_generic(
- env->inplace_cb_lists[inplace_cb_reply_local], inplace_cb_reply_local,
- qinfo, qstate, rep, rcode, edns, region);
-}
-
-int inplace_cb_reply_servfail_call(struct module_env* env,
- struct query_info* qinfo, struct module_qstate* qstate,
- struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region)
-{
- /* We are going to servfail. Remove any potential edns options. */
- if(qstate)
- qstate->edns_opts_front_out = NULL;
- return inplace_cb_reply_call_generic(
- env->inplace_cb_lists[inplace_cb_reply_servfail],
- inplace_cb_reply_servfail, qinfo, qstate, rep, rcode, edns, region);
-}
-
-int inplace_cb_query_call(struct module_env* env, struct query_info* qinfo,
- uint16_t flags, struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t* zone, size_t zonelen, struct module_qstate* qstate,
- struct regional* region)
-{
- struct inplace_cb* cb = env->inplace_cb_lists[inplace_cb_query];
- for(; cb; cb=cb->next) {
- fptr_ok(fptr_whitelist_inplace_cb_query(
- (inplace_cb_query_func_type*)cb->cb));
- (void)(*(inplace_cb_query_func_type*)cb->cb)(qinfo, flags,
- qstate, addr, addrlen, zone, zonelen, region,
- cb->id, cb->cb_arg);
- }
- return 1;
-}
-
-int inplace_cb_edns_back_parsed_call(struct module_env* env,
- struct module_qstate* qstate)
-{
- struct inplace_cb* cb =
- env->inplace_cb_lists[inplace_cb_edns_back_parsed];
- for(; cb; cb=cb->next) {
- fptr_ok(fptr_whitelist_inplace_cb_edns_back_parsed(
- (inplace_cb_edns_back_parsed_func_type*)cb->cb));
- (void)(*(inplace_cb_edns_back_parsed_func_type*)cb->cb)(qstate,
- cb->id, cb->cb_arg);
- }
- return 1;
-}
-
-int inplace_cb_query_response_call(struct module_env* env,
- struct module_qstate* qstate, struct dns_msg* response) {
- struct inplace_cb* cb =
- env->inplace_cb_lists[inplace_cb_query_response];
- for(; cb; cb=cb->next) {
- fptr_ok(fptr_whitelist_inplace_cb_query_response(
- (inplace_cb_query_response_func_type*)cb->cb));
- (void)(*(inplace_cb_query_response_func_type*)cb->cb)(qstate,
- response, cb->id, cb->cb_arg);
- }
- return 1;
-}
-
-struct edns_option* edns_opt_copy_region(struct edns_option* list,
- struct regional* region)
-{
- struct edns_option* result = NULL, *cur = NULL, *s;
- while(list) {
- /* copy edns option structure */
- s = regional_alloc_init(region, list, sizeof(*list));
- if(!s) return NULL;
- s->next = NULL;
-
- /* copy option data */
- if(s->opt_data) {
- s->opt_data = regional_alloc_init(region, s->opt_data,
- s->opt_len);
- if(!s->opt_data)
- return NULL;
- }
-
- /* link into list */
- if(cur)
- cur->next = s;
- else result = s;
- cur = s;
-
- /* examine next element */
- list = list->next;
- }
- return result;
-}
-
-int edns_opt_compare(struct edns_option* p, struct edns_option* q)
-{
- if(!p && !q) return 0;
- if(!p) return -1;
- if(!q) return 1;
- log_assert(p && q);
- if(p->opt_code != q->opt_code)
- return (int)q->opt_code - (int)p->opt_code;
- if(p->opt_len != q->opt_len)
- return (int)q->opt_len - (int)p->opt_len;
- if(p->opt_len != 0)
- return memcmp(p->opt_data, q->opt_data, p->opt_len);
- return 0;
-}
-
-int edns_opt_list_compare(struct edns_option* p, struct edns_option* q)
-{
- int r;
- while(p && q) {
- r = edns_opt_compare(p, q);
- if(r != 0)
- return r;
- p = p->next;
- q = q->next;
- }
- if(p || q) {
- /* uneven length lists */
- if(p) return 1;
- if(q) return -1;
- }
- return 0;
-}
-
-void edns_opt_list_free(struct edns_option* list)
-{
- struct edns_option* n;
- while(list) {
- free(list->opt_data);
- n = list->next;
- free(list);
- list = n;
- }
-}
-
-struct edns_option* edns_opt_copy_alloc(struct edns_option* list)
-{
- struct edns_option* result = NULL, *cur = NULL, *s;
- while(list) {
- /* copy edns option structure */
- s = memdup(list, sizeof(*list));
- if(!s) {
- edns_opt_list_free(result);
- return NULL;
- }
- s->next = NULL;
-
- /* copy option data */
- if(s->opt_data) {
- s->opt_data = memdup(s->opt_data, s->opt_len);
- if(!s->opt_data) {
- free(s);
- edns_opt_list_free(result);
- return NULL;
- }
- }
-
- /* link into list */
- if(cur)
- cur->next = s;
- else result = s;
- cur = s;
-
- /* examine next element */
- list = list->next;
- }
- return result;
-}
-
-struct edns_option* edns_opt_list_find(struct edns_option* list, uint16_t code)
-{
- struct edns_option* p;
- for(p=list; p; p=p->next) {
- if(p->opt_code == code)
- return p;
- }
- return NULL;
-}
diff --git a/external/unbound/util/data/msgreply.h b/external/unbound/util/data/msgreply.h
deleted file mode 100644
index acbdd3deb..000000000
--- a/external/unbound/util/data/msgreply.h
+++ /dev/null
@@ -1,674 +0,0 @@
-/*
- * util/data/msgreply.h - store message and reply data.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains a data structure to store a message and its reply.
- */
-
-#ifndef UTIL_DATA_MSGREPLY_H
-#define UTIL_DATA_MSGREPLY_H
-#include "util/storage/lruhash.h"
-#include "util/data/packed_rrset.h"
-struct sldns_buffer;
-struct comm_reply;
-struct alloc_cache;
-struct iovec;
-struct regional;
-struct edns_data;
-struct edns_option;
-struct inplace_cb;
-struct module_qstate;
-struct module_env;
-struct msg_parse;
-struct rrset_parse;
-struct local_rrset;
-struct dns_msg;
-
-/** calculate the prefetch TTL as 90% of original. Calculation
- * without numerical overflow (uin32_t) */
-#define PREFETCH_TTL_CALC(ttl) ((ttl) - (ttl)/10)
-
-/**
- * Structure to store query information that makes answers to queries
- * different.
- */
-struct query_info {
- /**
- * Salient data on the query: qname, in wireformat.
- * can be allocated or a pointer to outside buffer.
- * User has to keep track on the status of this.
- */
- uint8_t* qname;
- /** length of qname (including last 0 octet) */
- size_t qname_len;
- /** qtype, host byte order */
- uint16_t qtype;
- /** qclass, host byte order */
- uint16_t qclass;
- /**
- * Alias local answer(s) for the qname. If 'qname' is an alias defined
- * in a local zone, this field will be set to the corresponding local
- * RRset when the alias is determined.
- * In the initial implementation this can only be a single CNAME RR
- * (or NULL), but it could possibly be extended to be a DNAME or a
- * chain of aliases.
- * Users of this structure are responsible to initialize this field
- * to be NULL; otherwise other part of query handling code may be
- * confused.
- * Users also have to be careful about the lifetime of data. On return
- * from local zone lookup, it may point to data derived from
- * configuration that may be dynamically invalidated or data allocated
- * in an ephemeral regional allocator. A deep copy of the data may
- * have to be generated if it has to be kept during iterative
- * resolution. */
- struct local_rrset* local_alias;
-};
-
-/**
- * Information to reference an rrset
- */
-struct rrset_ref {
- /** the key with lock, and ptr to packed data. */
- struct ub_packed_rrset_key* key;
- /** id needed */
- rrset_id_type id;
-};
-
-/**
- * Structure to store DNS query and the reply packet.
- * To use it, copy over the flags from reply and modify using flags from
- * the query (RD,CD if not AA). prepend ID.
- *
- * Memory layout is:
- * o struct
- * o rrset_ref array
- * o packed_rrset_key* array.
- *
- * Memory layout is sometimes not packed, when the message is synthesized,
- * for easy of the generation. It is allocated packed when it is copied
- * from the region allocation to the malloc allocation.
- */
-struct reply_info {
- /** the flags for the answer, host byte order. */
- uint16_t flags;
-
- /**
- * This flag informs unbound the answer is authoritative and
- * the AA flag should be preserved.
- */
- uint8_t authoritative;
-
- /**
- * Number of RRs in the query section.
- * If qdcount is not 0, then it is 1, and the data that appears
- * in the reply is the same as the query_info.
- * Host byte order.
- */
- uint8_t qdcount;
-
- /** 32 bit padding to pad struct member alignment to 64 bits. */
- uint32_t padding;
-
- /**
- * TTL of the entire reply (for negative caching).
- * only for use when there are 0 RRsets in this message.
- * if there are RRsets, check those instead.
- */
- time_t ttl;
-
- /**
- * TTL for prefetch. After it has expired, a prefetch is suitable.
- * Smaller than the TTL, otherwise the prefetch would not happen.
- */
- time_t prefetch_ttl;
-
- /**
- * The security status from DNSSEC validation of this message.
- */
- enum sec_status security;
-
- /**
- * Number of RRsets in each section.
- * The answer section. Add up the RRs in every RRset to calculate
- * the number of RRs, and the count for the dns packet.
- * The number of RRs in RRsets can change due to RRset updates.
- */
- size_t an_numrrsets;
-
- /** Count of authority section RRsets */
- size_t ns_numrrsets;
- /** Count of additional section RRsets */
- size_t ar_numrrsets;
-
- /** number of RRsets: an_numrrsets + ns_numrrsets + ar_numrrsets */
- size_t rrset_count;
-
- /**
- * List of pointers (only) to the rrsets in the order in which
- * they appear in the reply message.
- * Number of elements is ancount+nscount+arcount RRsets.
- * This is a pointer to that array.
- * Use the accessor function for access.
- */
- struct ub_packed_rrset_key** rrsets;
-
- /**
- * Packed array of ids (see counts) and pointers to packed_rrset_key.
- * The number equals ancount+nscount+arcount RRsets.
- * These are sorted in ascending pointer, the locking order. So
- * this list can be locked (and id, ttl checked), to see if
- * all the data is available and recent enough.
- *
- * This is defined as an array of size 1, so that the compiler
- * associates the identifier with this position in the structure.
- * Array bound overflow on this array then gives access to the further
- * elements of the array, which are allocated after the main structure.
- *
- * It could be more pure to define as array of size 0, ref[0].
- * But ref[1] may be less confusing for compilers.
- * Use the accessor function for access.
- */
- struct rrset_ref ref[1];
-};
-
-/**
- * Structure to keep hash table entry for message replies.
- */
-struct msgreply_entry {
- /** the hash table key */
- struct query_info key;
- /** the hash table entry, data is struct reply_info* */
- struct lruhash_entry entry;
-};
-
-/**
- * Constructor for replyinfo.
- * @param region: where to allocate the results, pass NULL to use malloc.
- * @param flags: flags for the replyinfo.
- * @param qd: qd count
- * @param ttl: TTL of replyinfo
- * @param prettl: prefetch ttl
- * @param an: an count
- * @param ns: ns count
- * @param ar: ar count
- * @param total: total rrset count (presumably an+ns+ar).
- * @param sec: security status of the reply info.
- * @return the reply_info base struct with the array for putting the rrsets
- * in. The array has been zeroed. Returns NULL on malloc failure.
- */
-struct reply_info*
-construct_reply_info_base(struct regional* region, uint16_t flags, size_t qd,
- time_t ttl, time_t prettl, size_t an, size_t ns, size_t ar,
- size_t total, enum sec_status sec);
-
-/**
- * Parse wire query into a queryinfo structure, return 0 on parse error.
- * initialises the (prealloced) queryinfo structure as well.
- * This query structure contains a pointer back info the buffer!
- * This pointer avoids memory allocation. allocqname does memory allocation.
- * @param m: the prealloced queryinfo structure to put query into.
- * must be unused, or _clear()ed.
- * @param query: the wireformat packet query. starts with ID.
- * @return: 0 on format error.
- */
-int query_info_parse(struct query_info* m, struct sldns_buffer* query);
-
-/**
- * Parse query reply.
- * Fills in preallocated query_info structure (with ptr into buffer).
- * Allocates reply_info and packed_rrsets. These are not yet added to any
- * caches or anything, this is only parsing. Returns formerror on qdcount > 1.
- * @param pkt: the packet buffer. Must be positioned after the query section.
- * @param alloc: creates packed rrset key structures.
- * @param rep: allocated reply_info is returned (only on no error).
- * @param qinf: query_info is returned (only on no error).
- * @param region: where to store temporary data (for parsing).
- * @param edns: where to store edns information, does not need to be inited.
- * @return: zero is OK, or DNS error code in case of error
- * o FORMERR for parse errors.
- * o SERVFAIL for memory allocation errors.
- */
-int reply_info_parse(struct sldns_buffer* pkt, struct alloc_cache* alloc,
- struct query_info* qinf, struct reply_info** rep,
- struct regional* region, struct edns_data* edns);
-
-/**
- * Allocate and decompress parsed message and rrsets.
- * @param pkt: for name decompression.
- * @param msg: parsed message in scratch region.
- * @param alloc: alloc cache for special rrset key structures.
- * Not used if region!=NULL, it can be NULL in that case.
- * @param qinf: where to store query info.
- * qinf itself is allocated by the caller.
- * @param rep: reply info is allocated and returned.
- * @param region: if this parameter is NULL then malloc and the alloc is used.
- * otherwise, everything is allocated in this region.
- * In a region, no special rrset key structures are needed (not shared),
- * and no rrset_ref array in the reply is built up.
- * @return 0 if allocation failed.
- */
-int parse_create_msg(struct sldns_buffer* pkt, struct msg_parse* msg,
- struct alloc_cache* alloc, struct query_info* qinf,
- struct reply_info** rep, struct regional* region);
-
-/**
- * Sorts the ref array.
- * @param rep: reply info. rrsets must be filled in.
- */
-void reply_info_sortref(struct reply_info* rep);
-
-/**
- * Set TTLs inside the replyinfo to absolute values.
- * @param rep: reply info. rrsets must be filled in.
- * Also refs must be filled in.
- * @param timenow: the current time.
- */
-void reply_info_set_ttls(struct reply_info* rep, time_t timenow);
-
-/**
- * Delete reply_info and packed_rrsets (while they are not yet added to the
- * hashtables.). Returns rrsets to the alloc cache.
- * @param rep: reply_info to delete.
- * @param alloc: where to return rrset structures to.
- */
-void reply_info_parsedelete(struct reply_info* rep, struct alloc_cache* alloc);
-
-/**
- * Compare two queryinfo structures, on query and type, class.
- * It is _not_ sorted in canonical ordering.
- * @param m1: struct query_info* , void* here to ease use as function pointer.
- * @param m2: struct query_info* , void* here to ease use as function pointer.
- * @return: 0 = same, -1 m1 is smaller, +1 m1 is larger.
- */
-int query_info_compare(void* m1, void* m2);
-
-/** clear out query info structure */
-void query_info_clear(struct query_info* m);
-
-/** calculate size of struct query_info + reply_info */
-size_t msgreply_sizefunc(void* k, void* d);
-
-/** delete msgreply_entry key structure */
-void query_entry_delete(void *q, void* arg);
-
-/** delete reply_info data structure */
-void reply_info_delete(void* d, void* arg);
-
-/** calculate hash value of query_info, lowercases the qname,
- * uses CD flag for AAAA qtype */
-hashvalue_type query_info_hash(struct query_info *q, uint16_t flags);
-
-/**
- * Setup query info entry
- * @param q: query info to copy. Emptied as if clear is called.
- * @param r: reply to init data.
- * @param h: hash value.
- * @return: newly allocated message reply cache item.
- */
-struct msgreply_entry* query_info_entrysetup(struct query_info* q,
- struct reply_info* r, hashvalue_type h);
-
-/**
- * Copy reply_info and all rrsets in it and allocate.
- * @param rep: what to copy, probably inside region, no ref[] array in it.
- * @param alloc: how to allocate rrset keys.
- * Not used if region!=NULL, it can be NULL in that case.
- * @param region: if this parameter is NULL then malloc and the alloc is used.
- * otherwise, everything is allocated in this region.
- * In a region, no special rrset key structures are needed (not shared),
- * and no rrset_ref array in the reply is built up.
- * @return new reply info or NULL on memory error.
- */
-struct reply_info* reply_info_copy(struct reply_info* rep,
- struct alloc_cache* alloc, struct regional* region);
-
-/**
- * Allocate (special) rrset keys.
- * @param rep: reply info in which the rrset keys to be allocated, rrset[]
- * array should have bee allocated with NULL pointers.
- * @param alloc: how to allocate rrset keys.
- * Not used if region!=NULL, it can be NULL in that case.
- * @param region: if this parameter is NULL then the alloc is used.
- * otherwise, rrset keys are allocated in this region.
- * In a region, no special rrset key structures are needed (not shared).
- * and no rrset_ref array in the reply needs to be built up.
- * @return 1 on success, 0 on error
- */
-int reply_info_alloc_rrset_keys(struct reply_info* rep,
- struct alloc_cache* alloc, struct regional* region);
-
-/**
- * Copy a parsed rrset into given key, decompressing and allocating rdata.
- * @param pkt: packet for decompression
- * @param msg: the parser message (for flags for trust).
- * @param pset: the parsed rrset to copy.
- * @param region: if NULL - malloc, else data is allocated in this region.
- * @param pk: a freshly obtained rrsetkey structure. No dname is set yet,
- * will be set on return.
- * Note that TTL will still be relative on return.
- * @return false on alloc failure.
- */
-int parse_copy_decompress_rrset(struct sldns_buffer* pkt, struct msg_parse* msg,
- struct rrset_parse *pset, struct regional* region,
- struct ub_packed_rrset_key* pk);
-
-/**
- * Find final cname target in reply, the one matching qinfo. Follows CNAMEs.
- * @param qinfo: what to start with.
- * @param rep: looks in answer section of this message.
- * @return: pointer dname, or NULL if not found.
- */
-uint8_t* reply_find_final_cname_target(struct query_info* qinfo,
- struct reply_info* rep);
-
-/**
- * Check if cname chain in cached reply is still valid.
- * @param qinfo: query info with query name.
- * @param rep: reply to check.
- * @return: true if valid, false if invalid.
- */
-int reply_check_cname_chain(struct query_info* qinfo, struct reply_info* rep);
-
-/**
- * Check security status of all RRs in the message.
- * @param rep: reply to check
- * @return: true if all RRs are secure. False if not.
- * True if there are zero RRs.
- */
-int reply_all_rrsets_secure(struct reply_info* rep);
-
-/**
- * Find answer rrset in reply, the one matching qinfo. Follows CNAMEs, so the
- * result may have a different owner name.
- * @param qinfo: what to look for.
- * @param rep: looks in answer section of this message.
- * @return: pointer to rrset, or NULL if not found.
- */
-struct ub_packed_rrset_key* reply_find_answer_rrset(struct query_info* qinfo,
- struct reply_info* rep);
-
-/**
- * Find rrset in reply, inside the answer section. Does not follow CNAMEs.
- * @param rep: looks in answer section of this message.
- * @param name: what to look for.
- * @param namelen: length of name.
- * @param type: looks for (host order).
- * @param dclass: looks for (host order).
- * @return: pointer to rrset, or NULL if not found.
- */
-struct ub_packed_rrset_key* reply_find_rrset_section_an(struct reply_info* rep,
- uint8_t* name, size_t namelen, uint16_t type, uint16_t dclass);
-
-/**
- * Find rrset in reply, inside the authority section. Does not follow CNAMEs.
- * @param rep: looks in authority section of this message.
- * @param name: what to look for.
- * @param namelen: length of name.
- * @param type: looks for (host order).
- * @param dclass: looks for (host order).
- * @return: pointer to rrset, or NULL if not found.
- */
-struct ub_packed_rrset_key* reply_find_rrset_section_ns(struct reply_info* rep,
- uint8_t* name, size_t namelen, uint16_t type, uint16_t dclass);
-
-/**
- * Find rrset in reply, inside any section. Does not follow CNAMEs.
- * @param rep: looks in answer,authority and additional section of this message.
- * @param name: what to look for.
- * @param namelen: length of name.
- * @param type: looks for (host order).
- * @param dclass: looks for (host order).
- * @return: pointer to rrset, or NULL if not found.
- */
-struct ub_packed_rrset_key* reply_find_rrset(struct reply_info* rep,
- uint8_t* name, size_t namelen, uint16_t type, uint16_t dclass);
-
-/**
- * Debug send the query info and reply info to the log in readable form.
- * @param str: descriptive string printed with packet content.
- * @param qinfo: query section.
- * @param rep: rest of message.
- */
-void log_dns_msg(const char* str, struct query_info* qinfo,
- struct reply_info* rep);
-
-/**
- * Print string with neat domain name, type, class,
- * status code from, and size of a query response.
- *
- * @param v: at what verbosity level to print this.
- * @param qinf: query section.
- * @param addr: address of the client.
- * @param addrlen: length of the client address.
- * @param dur: how long it took to complete the query.
- * @param cached: whether or not the reply is coming from
- * the cache, or an outside network.
- * @param rmsg: sldns buffer packet.
- */
-void log_reply_info(enum verbosity_value v, struct query_info *qinf,
- struct sockaddr_storage *addr, socklen_t addrlen, struct timeval dur,
- int cached, struct sldns_buffer *rmsg);
-
-/**
- * Print string with neat domain name, type, class from query info.
- * @param v: at what verbosity level to print this.
- * @param str: string of message.
- * @param qinf: query info structure with name, type and class.
- */
-void log_query_info(enum verbosity_value v, const char* str,
- struct query_info* qinf);
-
-/**
- * Append edns option to edns data structure
- * @param edns: the edns data structure to append the edns option to.
- * @param region: region to allocate the new edns option.
- * @param code: the edns option's code.
- * @param len: the edns option's length.
- * @param data: the edns option's data.
- * @return false on failure.
- */
-int edns_opt_append(struct edns_data* edns, struct regional* region,
- uint16_t code, size_t len, uint8_t* data);
-
-/**
- * Append edns option to edns option list
- * @param list: the edns option list to append the edns option to.
- * @param code: the edns option's code.
- * @param len: the edns option's length.
- * @param data: the edns option's data.
- * @param region: region to allocate the new edns option.
- * @return false on failure.
- */
-int edns_opt_list_append(struct edns_option** list, uint16_t code, size_t len,
- uint8_t* data, struct regional* region);
-
-/**
- * Remove any option found on the edns option list that matches the code.
- * @param list: the list of edns options.
- * @param code: the opt code to remove.
- * @return true when at least one edns option was removed, false otherwise.
- */
-int edns_opt_list_remove(struct edns_option** list, uint16_t code);
-
-/**
- * Find edns option in edns list
- * @param list: list of edns options (eg. edns.opt_list)
- * @param code: opt code to find.
- * @return NULL or the edns_option element.
- */
-struct edns_option* edns_opt_list_find(struct edns_option* list, uint16_t code);
-
-/**
- * Call the registered functions in the inplace_cb_reply linked list.
- * This function is going to get called while answering with a resolved query.
- * @param env: module environment.
- * @param qinfo: query info.
- * @param qstate: module qstate.
- * @param rep: Reply info. Could be NULL.
- * @param rcode: return code.
- * @param edns: edns data of the reply.
- * @param region: region to store data.
- * @return false on failure (a callback function returned an error).
- */
-int inplace_cb_reply_call(struct module_env* env, struct query_info* qinfo,
- struct module_qstate* qstate, struct reply_info* rep, int rcode,
- struct edns_data* edns, struct regional* region);
-
-/**
- * Call the registered functions in the inplace_cb_reply_cache linked list.
- * This function is going to get called while answering from cache.
- * @param env: module environment.
- * @param qinfo: query info.
- * @param qstate: module qstate. NULL when replying from cache.
- * @param rep: Reply info.
- * @param rcode: return code.
- * @param edns: edns data of the reply. Edns input can be found here.
- * @param region: region to store data.
- * @return false on failure (a callback function returned an error).
- */
-int inplace_cb_reply_cache_call(struct module_env* env,
- struct query_info* qinfo, struct module_qstate* qstate,
- struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region);
-
-/**
- * Call the registered functions in the inplace_cb_reply_local linked list.
- * This function is going to get called while answering with local data.
- * @param env: module environment.
- * @param qinfo: query info.
- * @param qstate: module qstate. NULL when replying from cache.
- * @param rep: Reply info.
- * @param rcode: return code.
- * @param edns: edns data of the reply. Edns input can be found here.
- * @param region: region to store data.
- * @return false on failure (a callback function returned an error).
- */
-int inplace_cb_reply_local_call(struct module_env* env,
- struct query_info* qinfo, struct module_qstate* qstate,
- struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region);
-
-/**
- * Call the registered functions in the inplace_cb_reply linked list.
- * This function is going to get called while answering with a servfail.
- * @param env: module environment.
- * @param qinfo: query info.
- * @param qstate: module qstate. Contains the edns option lists. Could be NULL.
- * @param rep: Reply info. NULL when servfail.
- * @param rcode: return code. LDNS_RCODE_SERVFAIL.
- * @param edns: edns data of the reply. Edns input can be found here if qstate
- * is NULL.
- * @param region: region to store data.
- * @return false on failure (a callback function returned an error).
- */
-int inplace_cb_reply_servfail_call(struct module_env* env,
- struct query_info* qinfo, struct module_qstate* qstate,
- struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region);
-
-/**
- * Call the registered functions in the inplace_cb_query linked list.
- * This function is going to get called just before sending a query to a
- * nameserver.
- * @param env: module environment.
- * @param qinfo: query info.
- * @param flags: flags of the query.
- * @param addr: to which server to send the query.
- * @param addrlen: length of addr.
- * @param zone: name of the zone of the delegation point. wireformat dname.
- * This is the delegation point name for which the server is deemed
- * authoritative.
- * @param zonelen: length of zone.
- * @param qstate: module qstate.
- * @param region: region to store data.
- * @return false on failure (a callback function returned an error).
- */
-int inplace_cb_query_call(struct module_env* env, struct query_info* qinfo,
- uint16_t flags, struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t* zone, size_t zonelen, struct module_qstate* qstate,
- struct regional* region);
-
-/**
- * Call the registered functions in the inplace_cb_edns_back_parsed linked list.
- * This function is going to get called after parsing the EDNS data on the
- * reply from a nameserver.
- * @param env: module environment.
- * @param qstate: module qstate.
- * @return false on failure (a callback function returned an error).
- */
-int inplace_cb_edns_back_parsed_call(struct module_env* env,
- struct module_qstate* qstate);
-
-/**
- * Call the registered functions in the inplace_cb_query_reponse linked list.
- * This function is going to get called after receiving a reply from a
- * nameserver.
- * @param env: module environment.
- * @param qstate: module qstate.
- * @param response: received response
- * @return false on failure (a callback function returned an error).
- */
-int inplace_cb_query_response_call(struct module_env* env,
- struct module_qstate* qstate, struct dns_msg* response);
-
-/**
- * Copy edns option list allocated to the new region
- */
-struct edns_option* edns_opt_copy_region(struct edns_option* list,
- struct regional* region);
-
-/**
- * Copy edns option list allocated with malloc
- */
-struct edns_option* edns_opt_copy_alloc(struct edns_option* list);
-
-/**
- * Free edns option list allocated with malloc
- */
-void edns_opt_list_free(struct edns_option* list);
-
-/**
- * Compare an edns option. (not entire list). Also compares contents.
- */
-int edns_opt_compare(struct edns_option* p, struct edns_option* q);
-
-/**
- * Compare edns option lists, also the order and contents of edns-options.
- */
-int edns_opt_list_compare(struct edns_option* p, struct edns_option* q);
-
-#endif /* UTIL_DATA_MSGREPLY_H */
diff --git a/external/unbound/util/data/packed_rrset.c b/external/unbound/util/data/packed_rrset.c
deleted file mode 100644
index 9944087cb..000000000
--- a/external/unbound/util/data/packed_rrset.c
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * util/data/packed_rrset.c - data storage for a set of resource records.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains the data storage for RRsets.
- */
-
-#include "config.h"
-#include "util/data/packed_rrset.h"
-#include "util/data/dname.h"
-#include "util/storage/lookup3.h"
-#include "util/log.h"
-#include "util/alloc.h"
-#include "util/regional.h"
-#include "util/net_help.h"
-#include "sldns/rrdef.h"
-#include "sldns/sbuffer.h"
-#include "sldns/wire2str.h"
-
-void
-ub_packed_rrset_parsedelete(struct ub_packed_rrset_key* pkey,
- struct alloc_cache* alloc)
-{
- if(!pkey)
- return;
- free(pkey->entry.data);
- pkey->entry.data = NULL;
- free(pkey->rk.dname);
- pkey->rk.dname = NULL;
- pkey->id = 0;
- alloc_special_release(alloc, pkey);
-}
-
-size_t
-ub_rrset_sizefunc(void* key, void* data)
-{
- struct ub_packed_rrset_key* k = (struct ub_packed_rrset_key*)key;
- struct packed_rrset_data* d = (struct packed_rrset_data*)data;
- size_t s = sizeof(struct ub_packed_rrset_key) + k->rk.dname_len;
- s += packed_rrset_sizeof(d) + lock_get_mem(&k->entry.lock);
- return s;
-}
-
-size_t
-packed_rrset_sizeof(struct packed_rrset_data* d)
-{
- size_t s;
- if(d->rrsig_count > 0) {
- s = ((uint8_t*)d->rr_data[d->count+d->rrsig_count-1] -
- (uint8_t*)d) + d->rr_len[d->count+d->rrsig_count-1];
- } else {
- log_assert(d->count > 0);
- s = ((uint8_t*)d->rr_data[d->count-1] - (uint8_t*)d) +
- d->rr_len[d->count-1];
- }
- return s;
-}
-
-int
-ub_rrset_compare(void* k1, void* k2)
-{
- struct ub_packed_rrset_key* key1 = (struct ub_packed_rrset_key*)k1;
- struct ub_packed_rrset_key* key2 = (struct ub_packed_rrset_key*)k2;
- int c;
- if(key1 == key2)
- return 0;
- if(key1->rk.type != key2->rk.type) {
- if(key1->rk.type < key2->rk.type)
- return -1;
- return 1;
- }
- if(key1->rk.dname_len != key2->rk.dname_len) {
- if(key1->rk.dname_len < key2->rk.dname_len)
- return -1;
- return 1;
- }
- if((c=query_dname_compare(key1->rk.dname, key2->rk.dname)) != 0)
- return c;
- if(key1->rk.rrset_class != key2->rk.rrset_class) {
- if(key1->rk.rrset_class < key2->rk.rrset_class)
- return -1;
- return 1;
- }
- if(key1->rk.flags != key2->rk.flags) {
- if(key1->rk.flags < key2->rk.flags)
- return -1;
- return 1;
- }
- return 0;
-}
-
-void
-ub_rrset_key_delete(void* key, void* userdata)
-{
- struct ub_packed_rrset_key* k = (struct ub_packed_rrset_key*)key;
- struct alloc_cache* a = (struct alloc_cache*)userdata;
- k->id = 0;
- free(k->rk.dname);
- k->rk.dname = NULL;
- alloc_special_release(a, k);
-}
-
-void
-rrset_data_delete(void* data, void* ATTR_UNUSED(userdata))
-{
- struct packed_rrset_data* d = (struct packed_rrset_data*)data;
- free(d);
-}
-
-int
-rrsetdata_equal(struct packed_rrset_data* d1, struct packed_rrset_data* d2)
-{
- size_t i;
- size_t total;
- if(d1->count != d2->count || d1->rrsig_count != d2->rrsig_count)
- return 0;
- total = d1->count + d1->rrsig_count;
- for(i=0; i<total; i++) {
- if(d1->rr_len[i] != d2->rr_len[i])
- return 0;
- if(memcmp(d1->rr_data[i], d2->rr_data[i], d1->rr_len[i]) != 0)
- return 0;
- }
- return 1;
-}
-
-hashvalue_type
-rrset_key_hash(struct packed_rrset_key* key)
-{
- /* type is hashed in host order */
- uint16_t t = ntohs(key->type);
- /* Note this MUST be identical to pkt_hash_rrset in msgparse.c */
- /* this routine does not have a compressed name */
- hashvalue_type h = 0xab;
- h = dname_query_hash(key->dname, h);
- h = hashlittle(&t, sizeof(t), h);
- h = hashlittle(&key->rrset_class, sizeof(uint16_t), h);
- h = hashlittle(&key->flags, sizeof(uint32_t), h);
- return h;
-}
-
-void
-packed_rrset_ptr_fixup(struct packed_rrset_data* data)
-{
- size_t i;
- size_t total = data->count + data->rrsig_count;
- uint8_t* nextrdata;
- /* fixup pointers in packed rrset data */
- data->rr_len = (size_t*)((uint8_t*)data +
- sizeof(struct packed_rrset_data));
- data->rr_data = (uint8_t**)&(data->rr_len[total]);
- data->rr_ttl = (time_t*)&(data->rr_data[total]);
- nextrdata = (uint8_t*)&(data->rr_ttl[total]);
- for(i=0; i<total; i++) {
- data->rr_data[i] = nextrdata;
- nextrdata += data->rr_len[i];
- }
-}
-
-void
-get_cname_target(struct ub_packed_rrset_key* rrset, uint8_t** dname,
- size_t* dname_len)
-{
- struct packed_rrset_data* d;
- size_t len;
- if(ntohs(rrset->rk.type) != LDNS_RR_TYPE_CNAME &&
- ntohs(rrset->rk.type) != LDNS_RR_TYPE_DNAME)
- return;
- d = (struct packed_rrset_data*)rrset->entry.data;
- if(d->count < 1)
- return;
- if(d->rr_len[0] < 3) /* at least rdatalen + 0byte root label */
- return;
- len = sldns_read_uint16(d->rr_data[0]);
- if(len != d->rr_len[0] - sizeof(uint16_t))
- return;
- if(dname_valid(d->rr_data[0]+sizeof(uint16_t), len) != len)
- return;
- *dname = d->rr_data[0]+sizeof(uint16_t);
- *dname_len = len;
-}
-
-void
-packed_rrset_ttl_add(struct packed_rrset_data* data, time_t add)
-{
- size_t i;
- size_t total = data->count + data->rrsig_count;
- data->ttl += add;
- for(i=0; i<total; i++)
- data->rr_ttl[i] += add;
-}
-
-const char*
-rrset_trust_to_string(enum rrset_trust s)
-{
- switch(s) {
- case rrset_trust_none: return "rrset_trust_none";
- case rrset_trust_add_noAA: return "rrset_trust_add_noAA";
- case rrset_trust_auth_noAA: return "rrset_trust_auth_noAA";
- case rrset_trust_add_AA: return "rrset_trust_add_AA";
- case rrset_trust_nonauth_ans_AA:return "rrset_trust_nonauth_ans_AA";
- case rrset_trust_ans_noAA: return "rrset_trust_ans_noAA";
- case rrset_trust_glue: return "rrset_trust_glue";
- case rrset_trust_auth_AA: return "rrset_trust_auth_AA";
- case rrset_trust_ans_AA: return "rrset_trust_ans_AA";
- case rrset_trust_sec_noglue: return "rrset_trust_sec_noglue";
- case rrset_trust_prim_noglue: return "rrset_trust_prim_noglue";
- case rrset_trust_validated: return "rrset_trust_validated";
- case rrset_trust_ultimate: return "rrset_trust_ultimate";
- }
- return "unknown_rrset_trust_value";
-}
-
-const char*
-sec_status_to_string(enum sec_status s)
-{
- switch(s) {
- case sec_status_unchecked: return "sec_status_unchecked";
- case sec_status_bogus: return "sec_status_bogus";
- case sec_status_indeterminate: return "sec_status_indeterminate";
- case sec_status_insecure: return "sec_status_insecure";
- case sec_status_secure: return "sec_status_secure";
- }
- return "unknown_sec_status_value";
-}
-
-void log_rrset_key(enum verbosity_value v, const char* str,
- struct ub_packed_rrset_key* rrset)
-{
- if(verbosity >= v)
- log_nametypeclass(v, str, rrset->rk.dname,
- ntohs(rrset->rk.type), ntohs(rrset->rk.rrset_class));
-}
-
-int packed_rr_to_string(struct ub_packed_rrset_key* rrset, size_t i,
- time_t now, char* dest, size_t dest_len)
-{
- struct packed_rrset_data* d = (struct packed_rrset_data*)rrset->
- entry.data;
- uint8_t rr[65535];
- size_t rlen = rrset->rk.dname_len + 2 + 2 + 4 + d->rr_len[i];
- log_assert(dest_len > 0 && dest);
- if(rlen > dest_len) {
- dest[0] = 0;
- return 0;
- }
- memmove(rr, rrset->rk.dname, rrset->rk.dname_len);
- if(i < d->count)
- memmove(rr+rrset->rk.dname_len, &rrset->rk.type, 2);
- else sldns_write_uint16(rr+rrset->rk.dname_len, LDNS_RR_TYPE_RRSIG);
- memmove(rr+rrset->rk.dname_len+2, &rrset->rk.rrset_class, 2);
- sldns_write_uint32(rr+rrset->rk.dname_len+4,
- (uint32_t)(d->rr_ttl[i]-now));
- memmove(rr+rrset->rk.dname_len+8, d->rr_data[i], d->rr_len[i]);
- if(sldns_wire2str_rr_buf(rr, rlen, dest, dest_len) == -1) {
- log_info("rrbuf failure %d %s", (int)d->rr_len[i], dest);
- dest[0] = 0;
- return 0;
- }
- return 1;
-}
-
-void log_packed_rrset(enum verbosity_value v, const char* str,
- struct ub_packed_rrset_key* rrset)
-{
- struct packed_rrset_data* d = (struct packed_rrset_data*)rrset->
- entry.data;
- char buf[65535];
- size_t i;
- if(verbosity < v)
- return;
- for(i=0; i<d->count+d->rrsig_count; i++) {
- if(!packed_rr_to_string(rrset, i, 0, buf, sizeof(buf))) {
- log_info("%s: rr %d wire2str-error", str, (int)i);
- } else {
- log_info("%s: %s", str, buf);
- }
- }
-}
-
-time_t
-ub_packed_rrset_ttl(struct ub_packed_rrset_key* key)
-{
- struct packed_rrset_data* d = (struct packed_rrset_data*)key->
- entry.data;
- return d->ttl;
-}
-
-struct ub_packed_rrset_key*
-packed_rrset_copy_region(struct ub_packed_rrset_key* key,
- struct regional* region, time_t now)
-{
- struct ub_packed_rrset_key* ck = regional_alloc(region,
- sizeof(struct ub_packed_rrset_key));
- struct packed_rrset_data* d;
- struct packed_rrset_data* data = (struct packed_rrset_data*)
- key->entry.data;
- size_t dsize, i;
- if(!ck)
- return NULL;
- ck->id = key->id;
- memset(&ck->entry, 0, sizeof(ck->entry));
- ck->entry.hash = key->entry.hash;
- ck->entry.key = ck;
- ck->rk = key->rk;
- ck->rk.dname = regional_alloc_init(region, key->rk.dname,
- key->rk.dname_len);
- if(!ck->rk.dname)
- return NULL;
- dsize = packed_rrset_sizeof(data);
- d = (struct packed_rrset_data*)regional_alloc_init(region, data, dsize);
- if(!d)
- return NULL;
- ck->entry.data = d;
- packed_rrset_ptr_fixup(d);
- /* make TTLs relative - once per rrset */
- for(i=0; i<d->count + d->rrsig_count; i++) {
- if(d->rr_ttl[i] < now)
- d->rr_ttl[i] = 0;
- else d->rr_ttl[i] -= now;
- }
- if(d->ttl < now)
- d->ttl = 0;
- else d->ttl -= now;
- return ck;
-}
-
-struct ub_packed_rrset_key*
-packed_rrset_copy_alloc(struct ub_packed_rrset_key* key,
- struct alloc_cache* alloc, time_t now)
-{
- struct packed_rrset_data* fd, *dd;
- struct ub_packed_rrset_key* dk = alloc_special_obtain(alloc);
- if(!dk) return NULL;
- fd = (struct packed_rrset_data*)key->entry.data;
- dk->entry.hash = key->entry.hash;
- dk->rk = key->rk;
- dk->rk.dname = (uint8_t*)memdup(key->rk.dname, key->rk.dname_len);
- if(!dk->rk.dname) {
- alloc_special_release(alloc, dk);
- return NULL;
- }
- dd = (struct packed_rrset_data*)memdup(fd, packed_rrset_sizeof(fd));
- if(!dd) {
- free(dk->rk.dname);
- alloc_special_release(alloc, dk);
- return NULL;
- }
- packed_rrset_ptr_fixup(dd);
- dk->entry.data = (void*)dd;
- packed_rrset_ttl_add(dd, now);
- return dk;
-}
diff --git a/external/unbound/util/data/packed_rrset.h b/external/unbound/util/data/packed_rrset.h
deleted file mode 100644
index 28f603d6f..000000000
--- a/external/unbound/util/data/packed_rrset.h
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- * util/data/packed_rrset.h - data storage for a set of resource records.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains the data storage for RRsets.
- */
-
-#ifndef UTIL_DATA_PACKED_RRSET_H
-#define UTIL_DATA_PACKED_RRSET_H
-#include "util/storage/lruhash.h"
-struct alloc_cache;
-struct regional;
-
-/** type used to uniquely identify rrsets. Cannot be reused without
- * clearing the cache. */
-typedef uint64_t rrset_id_type;
-
-/** this rrset is NSEC and is at zone apex (at child side of zonecut) */
-#define PACKED_RRSET_NSEC_AT_APEX 0x1
-/** this rrset is A/AAAA and is in-zone-glue (from parent side of zonecut) */
-#define PACKED_RRSET_PARENT_SIDE 0x2
-/** this rrset is SOA and has the negative ttl (from nxdomain or nodata),
- * this is set on SOA rrsets in the authority section, to keep its TTL separate
- * from the SOA in the answer section from a direct SOA query or ANY query. */
-#define PACKED_RRSET_SOA_NEG 0x4
-/** This rrset is considered to have a fixed TTL; its TTL doesn't have to be
- * updated on encoding in a reply. This flag is not expected to be set in
- * cached data. */
-#define PACKED_RRSET_FIXEDTTL 0x80000000
-
-/** number of rrs and rrsets for integer overflow protection. More than
- * this is not really possible (64K packet has much less RRs and RRsets) in
- * a message. And this is small enough that also multiplied there is no
- * integer overflow. */
-#define RR_COUNT_MAX 0xffffff
-
-/**
- * The identifying information for an RRset.
- */
-struct packed_rrset_key {
- /**
- * The domain name. If not null (for id=0) it is allocated, and
- * contains the wireformat domain name.
- * This dname is not canonicalized.
- */
- uint8_t* dname;
- /**
- * Length of the domain name, including last 0 root octet.
- */
- size_t dname_len;
- /**
- * Flags. 32bit to be easy for hashing:
- * o PACKED_RRSET_NSEC_AT_APEX
- * o PACKED_RRSET_PARENT_SIDE
- * o PACKED_RRSET_SOA_NEG
- * o PACKED_RRSET_FIXEDTTL (not supposed to be cached)
- */
- uint32_t flags;
- /** the rrset type in network format */
- uint16_t type;
- /** the rrset class in network format */
- uint16_t rrset_class;
-};
-
-/**
- * This structure contains an RRset. A set of resource records that
- * share the same domain name, type and class.
- *
- * Due to memory management and threading, the key structure cannot be
- * deleted, although the data can be. The id can be set to 0 to store and the
- * structure can be recycled with a new id.
- */
-struct ub_packed_rrset_key {
- /**
- * entry into hashtable. Note the lock is never destroyed,
- * even when this key is retired to the cache.
- * the data pointer (if not null) points to a struct packed_rrset.
- */
- struct lruhash_entry entry;
- /**
- * the ID of this rrset. unique, based on threadid + sequenceno.
- * ids are not reused, except after flushing the cache.
- * zero is an unused entry, and never a valid id.
- * Check this value after getting entry.lock.
- * The other values in this struct may only be altered after changing
- * the id (which needs a writelock on entry.lock).
- */
- rrset_id_type id;
- /** key data: dname, type and class */
- struct packed_rrset_key rk;
-};
-
-/**
- * RRset trustworthiness. Bigger value is more trust. RFC 2181.
- * The rrset_trust_add_noAA, rrset_trust_auth_noAA, rrset_trust_add_AA,
- * are mentioned as the same trustworthiness in 2181, but split up here
- * for ease of processing.
- *
- * rrset_trust_nonauth_ans_AA, rrset_trust_ans_noAA
- * are also mentioned as the same trustworthiness in 2181, but split up here
- * for ease of processing.
- *
- * Added trust_none for a sane initial value, smaller than anything else.
- * Added validated and ultimate trust for keys and rrsig validated content.
- */
-enum rrset_trust {
- /** initial value for trust */
- rrset_trust_none = 0,
- /** Additional information from non-authoritative answers */
- rrset_trust_add_noAA,
- /** Data from the authority section of a non-authoritative answer */
- rrset_trust_auth_noAA,
- /** Additional information from an authoritative answer */
- rrset_trust_add_AA,
- /** non-authoritative data from the answer section of authoritative
- * answers */
- rrset_trust_nonauth_ans_AA,
- /** Data from the answer section of a non-authoritative answer */
- rrset_trust_ans_noAA,
- /** Glue from a primary zone, or glue from a zone transfer */
- rrset_trust_glue,
- /** Data from the authority section of an authoritative answer */
- rrset_trust_auth_AA,
- /** The authoritative data included in the answer section of an
- * authoritative reply */
- rrset_trust_ans_AA,
- /** Data from a zone transfer, other than glue */
- rrset_trust_sec_noglue,
- /** Data from a primary zone file, other than glue data */
- rrset_trust_prim_noglue,
- /** DNSSEC(rfc4034) validated with trusted keys */
- rrset_trust_validated,
- /** ultimately trusted, no more trust is possible;
- * trusted keys from the unbound configuration setup. */
- rrset_trust_ultimate
-};
-
-/**
- * Security status from validation for data.
- * The order is significant; more secure, more proven later.
- */
-enum sec_status {
- /** UNCHECKED means that object has yet to be validated. */
- sec_status_unchecked = 0,
- /** BOGUS means that the object (RRset or message) failed to validate
- * (according to local policy), but should have validated. */
- sec_status_bogus,
- /** INDETERMINATE means that the object is insecure, but not
- * authoritatively so. Generally this means that the RRset is not
- * below a configured trust anchor. */
- sec_status_indeterminate,
- /** INSECURE means that the object is authoritatively known to be
- * insecure. Generally this means that this RRset is below a trust
- * anchor, but also below a verified, insecure delegation. */
- sec_status_insecure,
- /** SECURE means that the object (RRset or message) validated
- * according to local policy. */
- sec_status_secure
-};
-
-/**
- * RRset data.
- *
- * The data is packed, stored contiguously in memory.
- *
- * It is not always stored contiguously, in that case, an unpacked-packed
- * rrset has the arrays separate. A bunch of routines work on that, but
- * the packed rrset that is contiguous is for the rrset-cache and the
- * cache-response routines in daemon/worker.c.
- *
- * memory layout:
- * o base struct
- * o rr_len size_t array
- * o rr_data uint8_t* array
- * o rr_ttl time_t array (after size_t and ptrs because those may be
- * 64bit and this array before those would make them unaligned).
- * Since the stuff before is 32/64bit, rr_ttl is 32 bit aligned.
- * o rr_data rdata wireformats
- * o rrsig_data rdata wireformat(s)
- *
- * Rdata is stored in wireformat. The dname is stored in wireformat.
- * TTLs are stored as absolute values (and could be expired).
- *
- * RRSIGs are stored in the arrays after the regular rrs.
- *
- * You need the packed_rrset_key to know dname, type, class of the
- * resource records in this RRset. (if signed the rrsig gives the type too).
- *
- * On the wire an RR is:
- * name, type, class, ttl, rdlength, rdata.
- * So we need to send the following per RR:
- * key.dname, ttl, rr_data[i].
- * since key.dname ends with type and class.
- * and rr_data starts with the rdlength.
- * the ttl value to send changes due to time.
- */
-struct packed_rrset_data {
- /** TTL (in seconds like time()) of the rrset.
- * Same for all RRs see rfc2181(5.2). */
- time_t ttl;
- /** number of rrs. */
- size_t count;
- /** number of rrsigs, if 0 no rrsigs */
- size_t rrsig_count;
- /** the trustworthiness of the rrset data */
- enum rrset_trust trust;
- /** security status of the rrset data */
- enum sec_status security;
- /** length of every rr's rdata, rr_len[i] is size of rr_data[i]. */
- size_t* rr_len;
- /** ttl of every rr. rr_ttl[i] ttl of rr i. */
- time_t *rr_ttl;
- /**
- * Array of pointers to every rr's rdata.
- * The rr_data[i] rdata is stored in uncompressed wireformat.
- * The first uint16_t of rr_data[i] is network format rdlength.
- *
- * rr_data[count] to rr_data[count+rrsig_count] contain the rrsig data.
- */
- uint8_t** rr_data;
-};
-
-/**
- * An RRset can be represented using both key and data together.
- * Split into key and data structures to simplify implementation of
- * caching schemes.
- */
-struct packed_rrset {
- /** domain name, type and class */
- struct packed_rrset_key* k;
- /** ttl, count and rdatas (and rrsig) */
- struct packed_rrset_data* d;
-};
-
-/**
- * list of packed rrsets
- */
-struct packed_rrset_list {
- /** next in list */
- struct packed_rrset_list* next;
- /** rrset key and data */
- struct packed_rrset rrset;
-};
-
-/**
- * Delete packed rrset key and data, not entered in hashtables yet.
- * Used during parsing.
- * @param pkey: rrset key structure with locks, key and data pointers.
- * @param alloc: where to return the unfree-able key structure.
- */
-void ub_packed_rrset_parsedelete(struct ub_packed_rrset_key* pkey,
- struct alloc_cache* alloc);
-
-/**
- * Memory size of rrset data. RRset data must be filled in correctly.
- * @param data: data to examine.
- * @return size in bytes.
- */
-size_t packed_rrset_sizeof(struct packed_rrset_data* data);
-
-/**
- * Get TTL of rrset. RRset data must be filled in correctly.
- * @param key: rrset key, with data to examine.
- * @return ttl value.
- */
-time_t ub_packed_rrset_ttl(struct ub_packed_rrset_key* key);
-
-/**
- * Calculate memory size of rrset entry. For hash table usage.
- * @param key: struct ub_packed_rrset_key*.
- * @param data: struct packed_rrset_data*.
- * @return size in bytes.
- */
-size_t ub_rrset_sizefunc(void* key, void* data);
-
-/**
- * compares two rrset keys.
- * @param k1: struct ub_packed_rrset_key*.
- * @param k2: struct ub_packed_rrset_key*.
- * @return 0 if equal.
- */
-int ub_rrset_compare(void* k1, void* k2);
-
-/**
- * compare two rrset data structures.
- * Compared rdata and rrsigdata, not the trust or ttl value.
- * @param d1: data to compare.
- * @param d2: data to compare.
- * @return 1 if equal.
- */
-int rrsetdata_equal(struct packed_rrset_data* d1, struct packed_rrset_data* d2);
-
-/**
- * Old key to be deleted. RRset keys are recycled via alloc.
- * The id is set to 0. So that other threads, after acquiring a lock always
- * get the correct value, in this case the 0 deleted-special value.
- * @param key: struct ub_packed_rrset_key*.
- * @param userdata: alloc structure to use for recycling.
- */
-void ub_rrset_key_delete(void* key, void* userdata);
-
-/**
- * Old data to be deleted.
- * @param data: what to delete.
- * @param userdata: user data ptr.
- */
-void rrset_data_delete(void* data, void* userdata);
-
-/**
- * Calculate hash value for a packed rrset key.
- * @param key: the rrset key with name, type, class, flags.
- * @return hash value.
- */
-hashvalue_type rrset_key_hash(struct packed_rrset_key* key);
-
-/**
- * Fixup pointers in fixed data packed_rrset_data blob.
- * After a memcpy of the data for example. Will set internal pointers right.
- * @param data: rrset data structure. Otherwise correctly filled in.
- */
-void packed_rrset_ptr_fixup(struct packed_rrset_data* data);
-
-/**
- * Fixup TTLs in fixed data packed_rrset_data blob.
- * @param data: rrset data structure. Otherwise correctly filled in.
- * @param add: how many seconds to add, pass time(0) for example.
- */
-void packed_rrset_ttl_add(struct packed_rrset_data* data, time_t add);
-
-/**
- * Utility procedure to extract CNAME target name from its rdata.
- * Failsafes; it will change passed dname to a valid dname or do nothing.
- * @param rrset: the rrset structure. Must be a CNAME.
- * Only first RR is used (multiple RRs are technically illegal anyway).
- * Also works on type DNAME. Returns target name.
- * @param dname: this pointer is updated to point into the cname rdata.
- * If a failsafe fails, nothing happens to the pointer (such as the
- * rdata was not a valid dname, not a CNAME, ...).
- * @param dname_len: length of dname is returned.
- */
-void get_cname_target(struct ub_packed_rrset_key* rrset, uint8_t** dname,
- size_t* dname_len);
-
-/**
- * Get a printable string for a rrset trust value
- * @param s: rrset trust value
- * @return printable string.
- */
-const char* rrset_trust_to_string(enum rrset_trust s);
-
-/**
- * Get a printable string for a security status value
- * @param s: security status
- * @return printable string.
- */
-const char* sec_status_to_string(enum sec_status s);
-
-/**
- * Print string with neat domain name, type, class from rrset.
- * @param v: at what verbosity level to print this.
- * @param str: string of message.
- * @param rrset: structure with name, type and class.
- */
-void log_rrset_key(enum verbosity_value v, const char* str,
- struct ub_packed_rrset_key* rrset);
-
-/**
- * Convert RR from RRset to string.
- * @param rrset: structure with data.
- * @param i: index of rr or RRSIG.
- * @param now: time that is subtracted from ttl before printout. Can be 0.
- * @param dest: destination string buffer. Must be nonNULL.
- * @param dest_len: length of dest buffer (>0).
- * @return false on failure.
- */
-int packed_rr_to_string(struct ub_packed_rrset_key* rrset, size_t i,
- time_t now, char* dest, size_t dest_len);
-
-/**
- * Print the string with prefix, one rr per line.
- * @param v: at what verbosity level to print this.
- * @param str: string of message.
- * @param rrset: with name, and rdata, and rrsigs.
- */
-void log_packed_rrset(enum verbosity_value v, const char* str,
- struct ub_packed_rrset_key* rrset);
-
-/**
- * Allocate rrset in region - no more locks needed
- * @param key: a (just from rrset cache looked up) rrset key + valid,
- * packed data record.
- * @param region: where to alloc the copy
- * @param now: adjust the TTLs to be relative (subtract from all TTLs).
- * @return new region-alloced rrset key or NULL on alloc failure.
- */
-struct ub_packed_rrset_key* packed_rrset_copy_region(
- struct ub_packed_rrset_key* key, struct regional* region,
- time_t now);
-
-/**
- * Allocate rrset with malloc (from region or you are holding the lock).
- * @param key: key with data entry.
- * @param alloc: alloc_cache to create rrset_keys
- * @param now: adjust the TTLs to be absolute (add to all TTLs).
- * @return new region-alloced rrset key or NULL on alloc failure.
- */
-struct ub_packed_rrset_key* packed_rrset_copy_alloc(
- struct ub_packed_rrset_key* key, struct alloc_cache* alloc,
- time_t now);
-
-#endif /* UTIL_DATA_PACKED_RRSET_H */
diff --git a/external/unbound/util/fptr_wlist.c b/external/unbound/util/fptr_wlist.c
deleted file mode 100644
index 03244a123..000000000
--- a/external/unbound/util/fptr_wlist.c
+++ /dev/null
@@ -1,532 +0,0 @@
-/*
- * util/fptr_wlist.c - function pointer whitelists.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains functions that check function pointers.
- * The functions contain a whitelist of known good callback values.
- * Any other values lead to an error.
- *
- * Due to the listing nature, this file violates all the modularization
- * boundaries in the program.
- */
-#include "config.h"
-#include "util/fptr_wlist.h"
-#include "util/mini_event.h"
-#include "services/outside_network.h"
-#include "services/mesh.h"
-#include "services/localzone.h"
-#include "services/cache/infra.h"
-#include "services/cache/rrset.h"
-#include "services/view.h"
-#include "dns64/dns64.h"
-#include "iterator/iterator.h"
-#include "iterator/iter_fwd.h"
-#include "validator/validator.h"
-#include "validator/val_anchor.h"
-#include "validator/val_nsec3.h"
-#include "validator/val_sigcrypt.h"
-#include "validator/val_kentry.h"
-#include "validator/val_neg.h"
-#include "validator/autotrust.h"
-#include "util/data/msgreply.h"
-#include "util/data/packed_rrset.h"
-#include "util/storage/slabhash.h"
-#include "util/storage/dnstree.h"
-#include "util/locks.h"
-#include "libunbound/libworker.h"
-#include "libunbound/context.h"
-#include "libunbound/worker.h"
-#include "util/tube.h"
-#include "util/config_file.h"
-#ifdef UB_ON_WINDOWS
-#include "winrc/win_svc.h"
-#endif
-#include "respip/respip.h"
-
-#ifdef WITH_PYTHONMODULE
-#include "pythonmod/pythonmod.h"
-#endif
-#ifdef USE_CACHEDB
-#include "cachedb/cachedb.h"
-#endif
-#ifdef CLIENT_SUBNET
-#include "edns-subnet/subnetmod.h"
-#endif
-
-int
-fptr_whitelist_comm_point(comm_point_callback_type *fptr)
-{
- if(fptr == &worker_handle_request) return 1;
- else if(fptr == &outnet_udp_cb) return 1;
- else if(fptr == &outnet_tcp_cb) return 1;
- else if(fptr == &tube_handle_listen) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_comm_point_raw(comm_point_callback_type *fptr)
-{
- if(fptr == &tube_handle_listen) return 1;
- else if(fptr == &tube_handle_write) return 1;
- else if(fptr == &remote_accept_callback) return 1;
- else if(fptr == &remote_control_callback) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_comm_timer(void (*fptr)(void*))
-{
- if(fptr == &pending_udp_timer_cb) return 1;
- else if(fptr == &outnet_tcptimer) return 1;
- else if(fptr == &pending_udp_timer_delay_cb) return 1;
- else if(fptr == &worker_stat_timer_cb) return 1;
- else if(fptr == &worker_probe_timer_cb) return 1;
-#ifdef UB_ON_WINDOWS
- else if(fptr == &wsvc_cron_cb) return 1;
-#endif
- return 0;
-}
-
-int
-fptr_whitelist_comm_signal(void (*fptr)(int, void*))
-{
- if(fptr == &worker_sighandler) return 1;
- return 0;
-}
-
-int fptr_whitelist_start_accept(void (*fptr)(void*))
-{
- if(fptr == &worker_start_accept) return 1;
- return 0;
-}
-
-int fptr_whitelist_stop_accept(void (*fptr)(void*))
-{
- if(fptr == &worker_stop_accept) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_event(void (*fptr)(int, short, void *))
-{
- if(fptr == &comm_point_udp_callback) return 1;
- else if(fptr == &comm_point_udp_ancil_callback) return 1;
- else if(fptr == &comm_point_tcp_accept_callback) return 1;
- else if(fptr == &comm_point_tcp_handle_callback) return 1;
- else if(fptr == &comm_timer_callback) return 1;
- else if(fptr == &comm_signal_callback) return 1;
- else if(fptr == &comm_point_local_handle_callback) return 1;
- else if(fptr == &comm_point_raw_handle_callback) return 1;
- else if(fptr == &tube_handle_signal) return 1;
- else if(fptr == &comm_base_handle_slow_accept) return 1;
-#ifdef UB_ON_WINDOWS
- else if(fptr == &worker_win_stop_cb) return 1;
-#endif
- return 0;
-}
-
-int
-fptr_whitelist_pending_udp(comm_point_callback_type *fptr)
-{
- if(fptr == &serviced_udp_callback) return 1;
- else if(fptr == &worker_handle_reply) return 1;
- else if(fptr == &libworker_handle_reply) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_pending_tcp(comm_point_callback_type *fptr)
-{
- if(fptr == &serviced_tcp_callback) return 1;
- else if(fptr == &worker_handle_reply) return 1;
- else if(fptr == &libworker_handle_reply) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_serviced_query(comm_point_callback_type *fptr)
-{
- if(fptr == &worker_handle_service_reply) return 1;
- else if(fptr == &libworker_handle_service_reply) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_rbtree_cmp(int (*fptr) (const void *, const void *))
-{
- if(fptr == &mesh_state_compare) return 1;
- else if(fptr == &mesh_state_ref_compare) return 1;
- else if(fptr == &addr_tree_compare) return 1;
- else if(fptr == &local_zone_cmp) return 1;
- else if(fptr == &local_data_cmp) return 1;
- else if(fptr == &fwd_cmp) return 1;
- else if(fptr == &pending_cmp) return 1;
- else if(fptr == &serviced_cmp) return 1;
- else if(fptr == &name_tree_compare) return 1;
- else if(fptr == &order_lock_cmp) return 1;
- else if(fptr == &codeline_cmp) return 1;
- else if(fptr == &nsec3_hash_cmp) return 1;
- else if(fptr == &mini_ev_cmp) return 1;
- else if(fptr == &anchor_cmp) return 1;
- else if(fptr == &canonical_tree_compare) return 1;
- else if(fptr == &context_query_cmp) return 1;
- else if(fptr == &val_neg_data_compare) return 1;
- else if(fptr == &val_neg_zone_compare) return 1;
- else if(fptr == &probetree_cmp) return 1;
- else if(fptr == &replay_var_compare) return 1;
- else if(fptr == &view_cmp) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_hash_sizefunc(lruhash_sizefunc_type fptr)
-{
- if(fptr == &msgreply_sizefunc) return 1;
- else if(fptr == &ub_rrset_sizefunc) return 1;
- else if(fptr == &infra_sizefunc) return 1;
- else if(fptr == &key_entry_sizefunc) return 1;
- else if(fptr == &rate_sizefunc) return 1;
- else if(fptr == &ip_rate_sizefunc) return 1;
- else if(fptr == &test_slabhash_sizefunc) return 1;
-#ifdef CLIENT_SUBNET
- else if(fptr == &msg_cache_sizefunc) return 1;
-#endif
- return 0;
-}
-
-int
-fptr_whitelist_hash_compfunc(lruhash_compfunc_type fptr)
-{
- if(fptr == &query_info_compare) return 1;
- else if(fptr == &ub_rrset_compare) return 1;
- else if(fptr == &infra_compfunc) return 1;
- else if(fptr == &key_entry_compfunc) return 1;
- else if(fptr == &rate_compfunc) return 1;
- else if(fptr == &ip_rate_compfunc) return 1;
- else if(fptr == &test_slabhash_compfunc) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_hash_delkeyfunc(lruhash_delkeyfunc_type fptr)
-{
- if(fptr == &query_entry_delete) return 1;
- else if(fptr == &ub_rrset_key_delete) return 1;
- else if(fptr == &infra_delkeyfunc) return 1;
- else if(fptr == &key_entry_delkeyfunc) return 1;
- else if(fptr == &rate_delkeyfunc) return 1;
- else if(fptr == &ip_rate_delkeyfunc) return 1;
- else if(fptr == &test_slabhash_delkey) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_hash_deldatafunc(lruhash_deldatafunc_type fptr)
-{
- if(fptr == &reply_info_delete) return 1;
- else if(fptr == &rrset_data_delete) return 1;
- else if(fptr == &infra_deldatafunc) return 1;
- else if(fptr == &key_entry_deldatafunc) return 1;
- else if(fptr == &rate_deldatafunc) return 1;
- else if(fptr == &test_slabhash_deldata) return 1;
-#ifdef CLIENT_SUBNET
- else if(fptr == &subnet_data_delete) return 1;
-#endif
- return 0;
-}
-
-int
-fptr_whitelist_hash_markdelfunc(lruhash_markdelfunc_type fptr)
-{
- if(fptr == NULL) return 1;
- else if(fptr == &rrset_markdel) return 1;
- return 0;
-}
-
-/** whitelist env->send_query callbacks */
-int
-fptr_whitelist_modenv_send_query(struct outbound_entry* (*fptr)(
- struct query_info* qinfo, uint16_t flags, int dnssec, int want_dnssec,
- int nocaps, struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t* zone, size_t zonelen, int ssl_upstream, struct module_qstate* q))
-{
- if(fptr == &worker_send_query) return 1;
- else if(fptr == &libworker_send_query) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_modenv_detach_subs(void (*fptr)(
- struct module_qstate* qstate))
-{
- if(fptr == &mesh_detach_subs) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_modenv_attach_sub(int (*fptr)(
- struct module_qstate* qstate, struct query_info* qinfo,
- uint16_t qflags, int prime, int valrec, struct module_qstate** newq))
-{
- if(fptr == &mesh_attach_sub) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_modenv_kill_sub(void (*fptr)(struct module_qstate* newq))
-{
- if(fptr == &mesh_state_delete) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_modenv_detect_cycle(int (*fptr)(
- struct module_qstate* qstate, struct query_info* qinfo,
- uint16_t flags, int prime, int valrec))
-{
- if(fptr == &mesh_detect_cycle) return 1;
- return 0;
-}
-
-int
-fptr_whitelist_mod_init(int (*fptr)(struct module_env* env, int id))
-{
- if(fptr == &iter_init) return 1;
- else if(fptr == &val_init) return 1;
- else if(fptr == &dns64_init) return 1;
- else if(fptr == &respip_init) return 1;
-#ifdef WITH_PYTHONMODULE
- else if(fptr == &pythonmod_init) return 1;
-#endif
-#ifdef USE_CACHEDB
- else if(fptr == &cachedb_init) return 1;
-#endif
-#ifdef CLIENT_SUBNET
- else if(fptr == &subnetmod_init) return 1;
-#endif
- return 0;
-}
-
-int
-fptr_whitelist_mod_deinit(void (*fptr)(struct module_env* env, int id))
-{
- if(fptr == &iter_deinit) return 1;
- else if(fptr == &val_deinit) return 1;
- else if(fptr == &dns64_deinit) return 1;
- else if(fptr == &respip_deinit) return 1;
-#ifdef WITH_PYTHONMODULE
- else if(fptr == &pythonmod_deinit) return 1;
-#endif
-#ifdef USE_CACHEDB
- else if(fptr == &cachedb_deinit) return 1;
-#endif
-#ifdef CLIENT_SUBNET
- else if(fptr == &subnetmod_deinit) return 1;
-#endif
- return 0;
-}
-
-int
-fptr_whitelist_mod_operate(void (*fptr)(struct module_qstate* qstate,
- enum module_ev event, int id, struct outbound_entry* outbound))
-{
- if(fptr == &iter_operate) return 1;
- else if(fptr == &val_operate) return 1;
- else if(fptr == &dns64_operate) return 1;
- else if(fptr == &respip_operate) return 1;
-#ifdef WITH_PYTHONMODULE
- else if(fptr == &pythonmod_operate) return 1;
-#endif
-#ifdef USE_CACHEDB
- else if(fptr == &cachedb_operate) return 1;
-#endif
-#ifdef CLIENT_SUBNET
- else if(fptr == &subnetmod_operate) return 1;
-#endif
- return 0;
-}
-
-int
-fptr_whitelist_mod_inform_super(void (*fptr)(
- struct module_qstate* qstate, int id, struct module_qstate* super))
-{
- if(fptr == &iter_inform_super) return 1;
- else if(fptr == &val_inform_super) return 1;
- else if(fptr == &dns64_inform_super) return 1;
- else if(fptr == &respip_inform_super) return 1;
-#ifdef WITH_PYTHONMODULE
- else if(fptr == &pythonmod_inform_super) return 1;
-#endif
-#ifdef USE_CACHEDB
- else if(fptr == &cachedb_inform_super) return 1;
-#endif
-#ifdef CLIENT_SUBNET
- else if(fptr == &subnetmod_inform_super) return 1;
-#endif
- return 0;
-}
-
-int
-fptr_whitelist_mod_clear(void (*fptr)(struct module_qstate* qstate,
- int id))
-{
- if(fptr == &iter_clear) return 1;
- else if(fptr == &val_clear) return 1;
- else if(fptr == &dns64_clear) return 1;
- else if(fptr == &respip_clear) return 1;
-#ifdef WITH_PYTHONMODULE
- else if(fptr == &pythonmod_clear) return 1;
-#endif
-#ifdef USE_CACHEDB
- else if(fptr == &cachedb_clear) return 1;
-#endif
-#ifdef CLIENT_SUBNET
- else if(fptr == &subnetmod_clear) return 1;
-#endif
- return 0;
-}
-
-int
-fptr_whitelist_mod_get_mem(size_t (*fptr)(struct module_env* env, int id))
-{
- if(fptr == &iter_get_mem) return 1;
- else if(fptr == &val_get_mem) return 1;
- else if(fptr == &dns64_get_mem) return 1;
- else if(fptr == &respip_get_mem) return 1;
-#ifdef WITH_PYTHONMODULE
- else if(fptr == &pythonmod_get_mem) return 1;
-#endif
-#ifdef USE_CACHEDB
- else if(fptr == &cachedb_get_mem) return 1;
-#endif
-#ifdef CLIENT_SUBNET
- else if(fptr == &subnetmod_get_mem) return 1;
-#endif
- return 0;
-}
-
-int
-fptr_whitelist_alloc_cleanup(void (*fptr)(void*))
-{
- if(fptr == &worker_alloc_cleanup) return 1;
- return 0;
-}
-
-int fptr_whitelist_tube_listen(tube_callback_type* fptr)
-{
- if(fptr == &worker_handle_control_cmd) return 1;
- else if(fptr == &libworker_handle_control_cmd) return 1;
- return 0;
-}
-
-int fptr_whitelist_mesh_cb(mesh_cb_func_type fptr)
-{
- if(fptr == &libworker_fg_done_cb) return 1;
- else if(fptr == &libworker_bg_done_cb) return 1;
- else if(fptr == &libworker_event_done_cb) return 1;
- else if(fptr == &probe_answer_cb) return 1;
- return 0;
-}
-
-int fptr_whitelist_print_func(void (*fptr)(char*,void*))
-{
- if(fptr == &config_print_func) return 1;
- else if(fptr == &config_collate_func) return 1;
- else if(fptr == &remote_get_opt_ssl) return 1;
- return 0;
-}
-
-int fptr_whitelist_inplace_cb_reply_generic(inplace_cb_reply_func_type* fptr,
- enum inplace_cb_list_type type)
-{
-#ifndef WITH_PYTHONMODULE
- (void)fptr;
-#endif
- if(type == inplace_cb_reply) {
-#ifdef WITH_PYTHONMODULE
- if(fptr == &python_inplace_cb_reply_generic) return 1;
-#endif
- } else if(type == inplace_cb_reply_cache) {
-#ifdef WITH_PYTHONMODULE
- if(fptr == &python_inplace_cb_reply_generic) return 1;
-#endif
- } else if(type == inplace_cb_reply_local) {
-#ifdef WITH_PYTHONMODULE
- if(fptr == &python_inplace_cb_reply_generic) return 1;
-#endif
- } else if(type == inplace_cb_reply_servfail) {
-#ifdef WITH_PYTHONMODULE
- if(fptr == &python_inplace_cb_reply_generic) return 1;
-#endif
- }
- return 0;
-}
-
-int fptr_whitelist_inplace_cb_query(inplace_cb_query_func_type* fptr)
-{
-#ifdef CLIENT_SUBNET
- if(fptr == &ecs_whitelist_check)
- return 1;
-#else
- (void)fptr;
-#endif
- return 0;
-}
-
-int fptr_whitelist_inplace_cb_edns_back_parsed(
- inplace_cb_edns_back_parsed_func_type* fptr)
-{
-#ifdef CLIENT_SUBNET
- if(fptr == &ecs_edns_back_parsed)
- return 1;
-#else
- (void)fptr;
-#endif
- return 0;
-}
-
-int fptr_whitelist_inplace_cb_query_response(
- inplace_cb_query_response_func_type* fptr)
-{
-#ifdef CLIENT_SUBNET
- if(fptr == &ecs_query_response)
- return 1;
-#else
- (void)fptr;
-#endif
- return 0;
-}
diff --git a/external/unbound/util/fptr_wlist.h b/external/unbound/util/fptr_wlist.h
deleted file mode 100644
index 653f8f0e7..000000000
--- a/external/unbound/util/fptr_wlist.h
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * util/fptr_wlist.h - function pointer whitelists.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains functions that check function pointers.
- * The functions contain a whitelist of known good callback values.
- * Any other values lead to an error.
- *
- * This prevent heap overflow based exploits, where the callback pointer
- * is overwritten by a buffer overflow (apart from this defense, buffer
- * overflows should be fixed of course).
- *
- * Function pointers are used in
- * o network code callbacks.
- * o rbtree, lruhash, region data manipulation
- * in lruhash, the assertions are before the critical regions.
- * in other places, assertions are before the callback.
- * o module operations.
- */
-
-#ifndef UTIL_FPTR_WLIST_H
-#define UTIL_FPTR_WLIST_H
-#include "util/netevent.h"
-#include "util/storage/lruhash.h"
-#include "util/module.h"
-#include "util/tube.h"
-#include "services/mesh.h"
-
-/**
- * Macro to perform an assertion check for fptr wlist checks.
- * Does not get disabled in optimize mode. Check adds security by layers.
- */
-#if defined(EXPORT_ALL_SYMBOLS)
-#define fptr_ok(x) /* nothing, dll-exe memory layout on win disables it */
-#else
-#define fptr_ok(x) \
- do { if(!(x)) \
- fatal_exit("%s:%d: %s: pointer whitelist %s failed", \
- __FILE__, __LINE__, __func__, #x); \
- } while(0);
-#endif
-
-/**
- * Check function pointer whitelist for comm_point callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_comm_point(comm_point_callback_type *fptr);
-
-/**
- * Check function pointer whitelist for raw comm_point callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_comm_point_raw(comm_point_callback_type *fptr);
-
-/**
- * Check function pointer whitelist for comm_timer callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_comm_timer(void (*fptr)(void*));
-
-/**
- * Check function pointer whitelist for comm_signal callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_comm_signal(void (*fptr)(int, void*));
-
-/**
- * Check function pointer whitelist for start_accept callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_start_accept(void (*fptr)(void*));
-
-/**
- * Check function pointer whitelist for stop_accept callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_stop_accept(void (*fptr)(void*));
-
-/**
- * Check function pointer whitelist for event structure callback values.
- * This is not called by libevent itself, but checked by netevent.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_event(void (*fptr)(int, short, void *));
-
-/**
- * Check function pointer whitelist for pending udp callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_pending_udp(comm_point_callback_type *fptr);
-
-/**
- * Check function pointer whitelist for pending tcp callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_pending_tcp(comm_point_callback_type *fptr);
-
-/**
- * Check function pointer whitelist for serviced query callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_serviced_query(comm_point_callback_type *fptr);
-
-/**
- * Check function pointer whitelist for rbtree cmp callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_rbtree_cmp(int (*fptr) (const void *, const void *));
-
-/**
- * Check function pointer whitelist for lruhash sizefunc callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_hash_sizefunc(lruhash_sizefunc_type fptr);
-
-/**
- * Check function pointer whitelist for lruhash compfunc callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_hash_compfunc(lruhash_compfunc_type fptr);
-
-/**
- * Check function pointer whitelist for lruhash delkeyfunc callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_hash_delkeyfunc(lruhash_delkeyfunc_type fptr);
-
-/**
- * Check function pointer whitelist for lruhash deldata callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_hash_deldatafunc(lruhash_deldatafunc_type fptr);
-
-/**
- * Check function pointer whitelist for lruhash markdel callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_hash_markdelfunc(lruhash_markdelfunc_type fptr);
-
-/**
- * Check function pointer whitelist for module_env send_query callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_modenv_send_query(struct outbound_entry* (*fptr)(
- struct query_info* qinfo, uint16_t flags, int dnssec, int want_dnssec,
- int nocaps, struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t* zone, size_t zonelen, int ssl_upstream, struct module_qstate* q));
-
-/**
- * Check function pointer whitelist for module_env detach_subs callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_modenv_detach_subs(void (*fptr)(
- struct module_qstate* qstate));
-
-/**
- * Check function pointer whitelist for module_env attach_sub callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_modenv_attach_sub(int (*fptr)(
- struct module_qstate* qstate, struct query_info* qinfo,
- uint16_t qflags, int prime, int valrec, struct module_qstate** newq));
-
-/**
- * Check function pointer whitelist for module_env kill_sub callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_modenv_kill_sub(void (*fptr)(struct module_qstate* newq));
-
-/**
- * Check function pointer whitelist for module_env detect_cycle callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_modenv_detect_cycle(int (*fptr)(
- struct module_qstate* qstate, struct query_info* qinfo,
- uint16_t flags, int prime, int valrec));
-
-/**
- * Check function pointer whitelist for module init call values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_mod_init(int (*fptr)(struct module_env* env, int id));
-
-/**
- * Check function pointer whitelist for module deinit call values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_mod_deinit(void (*fptr)(struct module_env* env, int id));
-
-/**
- * Check function pointer whitelist for module operate call values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_mod_operate(void (*fptr)(struct module_qstate* qstate,
- enum module_ev event, int id, struct outbound_entry* outbound));
-
-/**
- * Check function pointer whitelist for module inform_super call values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_mod_inform_super(void (*fptr)(
- struct module_qstate* qstate, int id, struct module_qstate* super));
-
-/**
- * Check function pointer whitelist for module clear call values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_mod_clear(void (*fptr)(struct module_qstate* qstate,
- int id));
-
-/**
- * Check function pointer whitelist for module get_mem call values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_mod_get_mem(size_t (*fptr)(struct module_env* env, int id));
-
-/**
- * Check function pointer whitelist for alloc clear on id overflow call values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_alloc_cleanup(void (*fptr)(void*));
-
-/**
- * Check function pointer whitelist for tube listen handler values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_tube_listen(tube_callback_type* fptr);
-
-/**
- * Check function pointer whitelist for mesh state callback values.
- *
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_mesh_cb(mesh_cb_func_type fptr);
-
-/**
- * Check function pointer whitelist for config_get_option func values.
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_print_func(void (*fptr)(char*,void*));
-
-/**
- * Check function pointer whitelist for inplace_cb_reply,
- * inplace_cb_reply_cache, inplace_cb_reply_local and inplace_cb_reply_servfail
- * func values.
- * @param fptr: function pointer to check.
- * @param type: the type of the callback function.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_inplace_cb_reply_generic(inplace_cb_reply_func_type* fptr,
- enum inplace_cb_list_type type);
-
-/**
- * Check function pointer whitelist for inplace_cb_query func values.
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_inplace_cb_query(inplace_cb_query_func_type* fptr);
-
-/**
- * Check function pointer whitelist for inplace_cb_edns_back_parsed func values.
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_inplace_cb_edns_back_parsed(
- inplace_cb_edns_back_parsed_func_type* fptr);
-
-/**
- * Check function pointer whitelist for inplace_cb_query_response func values.
- * @param fptr: function pointer to check.
- * @return false if not in whitelist.
- */
-int fptr_whitelist_inplace_cb_query_response(
- inplace_cb_query_response_func_type* fptr);
-
-/** Due to module breakage by fptr wlist, these test app declarations
- * are presented here */
-/**
- * compare two order_ids from lock-verify test app
- * @param e1: first order_id
- * @param e2: second order_id
- * @return compare code -1, 0, +1 (like memcmp).
- */
-int order_lock_cmp(const void* e1, const void* e2);
-
-/**
- * compare two codeline structs for rbtree from memstats test app
- * @param a: codeline
- * @param b: codeline
- * @return compare code -1, 0, +1 (like memcmp).
- */
-int codeline_cmp(const void* a, const void* b);
-
-/** compare two replay_vars */
-int replay_var_compare(const void* a, const void* b);
-
-#endif /* UTIL_FPTR_WLIST_H */
diff --git a/external/unbound/util/iana_ports.inc b/external/unbound/util/iana_ports.inc
deleted file mode 100644
index 2555b2591..000000000
--- a/external/unbound/util/iana_ports.inc
+++ /dev/null
@@ -1,5465 +0,0 @@
-1,
-2,
-3,
-5,
-7,
-9,
-11,
-13,
-17,
-18,
-19,
-20,
-21,
-22,
-23,
-24,
-25,
-27,
-29,
-31,
-33,
-35,
-37,
-38,
-39,
-41,
-42,
-43,
-44,
-45,
-46,
-47,
-48,
-49,
-50,
-52,
-53,
-54,
-55,
-56,
-57,
-58,
-59,
-61,
-62,
-63,
-64,
-65,
-66,
-67,
-68,
-69,
-70,
-71,
-72,
-73,
-74,
-75,
-76,
-77,
-78,
-79,
-80,
-82,
-83,
-84,
-85,
-86,
-87,
-88,
-89,
-90,
-91,
-92,
-93,
-94,
-95,
-96,
-97,
-98,
-99,
-101,
-102,
-103,
-104,
-105,
-106,
-107,
-108,
-109,
-110,
-111,
-112,
-113,
-115,
-116,
-117,
-118,
-119,
-120,
-121,
-122,
-123,
-124,
-125,
-126,
-127,
-128,
-129,
-130,
-131,
-132,
-133,
-134,
-135,
-136,
-137,
-138,
-139,
-140,
-141,
-142,
-143,
-144,
-145,
-146,
-147,
-148,
-149,
-150,
-151,
-152,
-153,
-154,
-155,
-156,
-157,
-158,
-159,
-160,
-161,
-162,
-163,
-164,
-165,
-166,
-167,
-168,
-169,
-170,
-171,
-172,
-173,
-174,
-175,
-176,
-177,
-178,
-179,
-180,
-181,
-182,
-183,
-184,
-185,
-186,
-187,
-188,
-189,
-190,
-191,
-192,
-193,
-194,
-195,
-196,
-197,
-198,
-199,
-200,
-201,
-202,
-203,
-204,
-205,
-206,
-207,
-208,
-209,
-210,
-211,
-212,
-213,
-214,
-215,
-216,
-217,
-218,
-219,
-220,
-221,
-222,
-223,
-224,
-242,
-243,
-244,
-245,
-246,
-247,
-248,
-256,
-257,
-259,
-260,
-261,
-262,
-263,
-264,
-265,
-266,
-267,
-268,
-269,
-270,
-280,
-281,
-282,
-283,
-284,
-286,
-287,
-308,
-309,
-310,
-311,
-312,
-313,
-314,
-315,
-316,
-317,
-318,
-319,
-320,
-321,
-322,
-333,
-344,
-345,
-346,
-347,
-348,
-349,
-350,
-351,
-352,
-353,
-354,
-355,
-356,
-357,
-358,
-359,
-360,
-361,
-362,
-363,
-364,
-365,
-366,
-367,
-368,
-369,
-370,
-371,
-372,
-373,
-374,
-375,
-376,
-377,
-378,
-379,
-380,
-381,
-382,
-383,
-384,
-385,
-386,
-387,
-388,
-389,
-390,
-391,
-392,
-393,
-394,
-395,
-396,
-397,
-398,
-399,
-400,
-401,
-402,
-403,
-404,
-405,
-406,
-407,
-408,
-409,
-410,
-411,
-412,
-413,
-414,
-415,
-416,
-417,
-418,
-419,
-420,
-421,
-422,
-423,
-424,
-425,
-426,
-427,
-428,
-429,
-430,
-431,
-432,
-433,
-434,
-435,
-436,
-437,
-438,
-439,
-440,
-441,
-442,
-443,
-444,
-445,
-446,
-447,
-448,
-449,
-450,
-451,
-452,
-453,
-454,
-455,
-456,
-457,
-458,
-459,
-460,
-461,
-462,
-463,
-464,
-465,
-466,
-467,
-468,
-469,
-470,
-471,
-472,
-473,
-474,
-475,
-476,
-477,
-478,
-479,
-480,
-481,
-482,
-483,
-484,
-485,
-486,
-487,
-488,
-489,
-490,
-491,
-492,
-493,
-494,
-495,
-496,
-497,
-498,
-499,
-500,
-501,
-502,
-503,
-504,
-505,
-506,
-507,
-508,
-509,
-510,
-511,
-512,
-513,
-514,
-515,
-516,
-517,
-518,
-519,
-520,
-521,
-522,
-523,
-524,
-525,
-526,
-527,
-528,
-529,
-530,
-531,
-532,
-533,
-534,
-535,
-536,
-537,
-538,
-539,
-540,
-541,
-542,
-543,
-544,
-545,
-546,
-547,
-548,
-549,
-550,
-551,
-552,
-553,
-554,
-555,
-556,
-557,
-558,
-559,
-560,
-561,
-562,
-563,
-564,
-565,
-566,
-567,
-568,
-569,
-570,
-571,
-572,
-573,
-574,
-575,
-576,
-577,
-578,
-579,
-580,
-581,
-582,
-583,
-584,
-586,
-587,
-588,
-589,
-590,
-591,
-592,
-593,
-594,
-595,
-596,
-597,
-598,
-599,
-600,
-601,
-602,
-603,
-604,
-605,
-606,
-607,
-608,
-609,
-610,
-611,
-612,
-613,
-614,
-615,
-616,
-617,
-618,
-619,
-620,
-621,
-622,
-623,
-624,
-625,
-626,
-627,
-628,
-629,
-630,
-631,
-632,
-633,
-634,
-635,
-636,
-637,
-638,
-639,
-640,
-641,
-642,
-643,
-644,
-645,
-646,
-647,
-648,
-649,
-650,
-651,
-652,
-653,
-654,
-655,
-656,
-657,
-658,
-660,
-661,
-662,
-663,
-664,
-665,
-666,
-667,
-668,
-669,
-670,
-671,
-672,
-673,
-674,
-675,
-676,
-677,
-678,
-679,
-680,
-681,
-682,
-683,
-684,
-685,
-686,
-687,
-688,
-689,
-690,
-691,
-692,
-693,
-694,
-695,
-696,
-697,
-698,
-699,
-700,
-701,
-702,
-704,
-705,
-706,
-707,
-709,
-710,
-711,
-712,
-713,
-714,
-715,
-716,
-729,
-730,
-731,
-741,
-742,
-744,
-747,
-748,
-749,
-750,
-751,
-752,
-753,
-754,
-758,
-759,
-760,
-761,
-762,
-763,
-764,
-765,
-767,
-769,
-770,
-771,
-772,
-773,
-774,
-775,
-776,
-777,
-780,
-800,
-801,
-802,
-810,
-828,
-829,
-830,
-831,
-832,
-833,
-847,
-848,
-853,
-854,
-860,
-861,
-862,
-873,
-886,
-887,
-888,
-900,
-901,
-902,
-903,
-910,
-911,
-912,
-913,
-989,
-990,
-991,
-992,
-993,
-995,
-996,
-997,
-998,
-999,
-1000,
-1008,
-1010,
-1021,
-1022,
-1025,
-1026,
-1027,
-1029,
-1033,
-1034,
-1035,
-1036,
-1037,
-1038,
-1039,
-1040,
-1041,
-1042,
-1043,
-1044,
-1045,
-1046,
-1047,
-1048,
-1049,
-1050,
-1051,
-1052,
-1053,
-1054,
-1055,
-1056,
-1057,
-1058,
-1059,
-1060,
-1061,
-1062,
-1063,
-1064,
-1065,
-1066,
-1067,
-1068,
-1069,
-1070,
-1071,
-1072,
-1073,
-1074,
-1075,
-1076,
-1077,
-1078,
-1079,
-1080,
-1081,
-1082,
-1083,
-1084,
-1085,
-1086,
-1087,
-1088,
-1089,
-1090,
-1091,
-1092,
-1093,
-1094,
-1095,
-1096,
-1097,
-1098,
-1099,
-1100,
-1101,
-1102,
-1103,
-1104,
-1105,
-1106,
-1107,
-1108,
-1110,
-1111,
-1112,
-1113,
-1114,
-1115,
-1116,
-1117,
-1118,
-1119,
-1120,
-1121,
-1122,
-1123,
-1124,
-1125,
-1126,
-1127,
-1128,
-1129,
-1130,
-1131,
-1132,
-1133,
-1134,
-1135,
-1136,
-1137,
-1138,
-1139,
-1140,
-1141,
-1142,
-1143,
-1144,
-1145,
-1146,
-1147,
-1148,
-1149,
-1150,
-1151,
-1152,
-1153,
-1154,
-1155,
-1156,
-1157,
-1158,
-1159,
-1160,
-1161,
-1162,
-1163,
-1164,
-1165,
-1166,
-1167,
-1168,
-1169,
-1170,
-1171,
-1172,
-1173,
-1174,
-1175,
-1176,
-1177,
-1178,
-1179,
-1180,
-1181,
-1182,
-1183,
-1184,
-1185,
-1186,
-1187,
-1188,
-1189,
-1190,
-1191,
-1192,
-1193,
-1194,
-1195,
-1196,
-1197,
-1198,
-1199,
-1200,
-1201,
-1202,
-1203,
-1204,
-1205,
-1206,
-1207,
-1208,
-1209,
-1210,
-1211,
-1212,
-1213,
-1214,
-1215,
-1216,
-1217,
-1218,
-1219,
-1220,
-1221,
-1222,
-1223,
-1224,
-1225,
-1226,
-1227,
-1228,
-1229,
-1230,
-1231,
-1232,
-1233,
-1234,
-1235,
-1236,
-1237,
-1238,
-1239,
-1240,
-1241,
-1242,
-1243,
-1244,
-1245,
-1246,
-1247,
-1248,
-1249,
-1250,
-1251,
-1252,
-1253,
-1254,
-1255,
-1256,
-1257,
-1258,
-1259,
-1260,
-1261,
-1262,
-1263,
-1264,
-1265,
-1266,
-1267,
-1268,
-1269,
-1270,
-1271,
-1272,
-1273,
-1274,
-1275,
-1277,
-1278,
-1279,
-1280,
-1281,
-1282,
-1283,
-1284,
-1285,
-1286,
-1287,
-1288,
-1289,
-1290,
-1291,
-1292,
-1293,
-1294,
-1295,
-1296,
-1297,
-1298,
-1299,
-1300,
-1301,
-1302,
-1303,
-1304,
-1305,
-1306,
-1307,
-1308,
-1309,
-1310,
-1311,
-1312,
-1313,
-1314,
-1315,
-1316,
-1317,
-1318,
-1319,
-1320,
-1321,
-1322,
-1323,
-1324,
-1325,
-1326,
-1327,
-1328,
-1329,
-1330,
-1331,
-1332,
-1333,
-1334,
-1335,
-1336,
-1337,
-1338,
-1339,
-1340,
-1341,
-1342,
-1343,
-1344,
-1345,
-1346,
-1347,
-1348,
-1349,
-1350,
-1351,
-1352,
-1353,
-1354,
-1355,
-1356,
-1357,
-1358,
-1359,
-1360,
-1361,
-1362,
-1363,
-1364,
-1365,
-1366,
-1367,
-1368,
-1369,
-1370,
-1371,
-1372,
-1373,
-1374,
-1375,
-1376,
-1377,
-1378,
-1379,
-1380,
-1381,
-1382,
-1383,
-1384,
-1385,
-1386,
-1387,
-1388,
-1389,
-1390,
-1391,
-1392,
-1393,
-1394,
-1395,
-1396,
-1397,
-1398,
-1399,
-1400,
-1401,
-1402,
-1403,
-1404,
-1405,
-1406,
-1408,
-1409,
-1410,
-1411,
-1412,
-1413,
-1414,
-1415,
-1416,
-1417,
-1418,
-1419,
-1420,
-1421,
-1422,
-1423,
-1424,
-1425,
-1426,
-1427,
-1428,
-1429,
-1430,
-1431,
-1432,
-1433,
-1434,
-1435,
-1436,
-1437,
-1438,
-1439,
-1440,
-1441,
-1442,
-1443,
-1444,
-1445,
-1446,
-1447,
-1448,
-1449,
-1450,
-1451,
-1452,
-1453,
-1454,
-1455,
-1456,
-1457,
-1458,
-1459,
-1460,
-1461,
-1462,
-1463,
-1464,
-1465,
-1466,
-1467,
-1468,
-1469,
-1470,
-1471,
-1472,
-1473,
-1474,
-1475,
-1476,
-1477,
-1478,
-1479,
-1480,
-1481,
-1482,
-1483,
-1484,
-1485,
-1486,
-1487,
-1488,
-1489,
-1490,
-1492,
-1493,
-1494,
-1495,
-1496,
-1497,
-1498,
-1499,
-1500,
-1501,
-1502,
-1503,
-1504,
-1505,
-1506,
-1507,
-1508,
-1509,
-1510,
-1511,
-1512,
-1513,
-1514,
-1515,
-1516,
-1517,
-1518,
-1519,
-1520,
-1521,
-1522,
-1523,
-1524,
-1525,
-1526,
-1527,
-1528,
-1529,
-1530,
-1531,
-1532,
-1533,
-1534,
-1535,
-1536,
-1537,
-1538,
-1539,
-1540,
-1541,
-1542,
-1543,
-1544,
-1545,
-1546,
-1547,
-1548,
-1549,
-1550,
-1551,
-1552,
-1553,
-1554,
-1555,
-1556,
-1557,
-1558,
-1559,
-1560,
-1561,
-1562,
-1563,
-1564,
-1565,
-1566,
-1567,
-1568,
-1569,
-1570,
-1571,
-1572,
-1573,
-1574,
-1575,
-1576,
-1577,
-1578,
-1579,
-1580,
-1581,
-1582,
-1583,
-1584,
-1585,
-1586,
-1587,
-1588,
-1589,
-1590,
-1591,
-1592,
-1593,
-1594,
-1595,
-1596,
-1597,
-1598,
-1599,
-1600,
-1601,
-1602,
-1603,
-1604,
-1605,
-1606,
-1607,
-1608,
-1609,
-1610,
-1611,
-1612,
-1613,
-1614,
-1615,
-1616,
-1617,
-1618,
-1619,
-1620,
-1621,
-1622,
-1623,
-1624,
-1625,
-1626,
-1627,
-1628,
-1629,
-1630,
-1631,
-1632,
-1633,
-1634,
-1635,
-1636,
-1637,
-1638,
-1639,
-1640,
-1641,
-1642,
-1643,
-1644,
-1645,
-1646,
-1647,
-1648,
-1649,
-1650,
-1651,
-1652,
-1653,
-1654,
-1655,
-1656,
-1657,
-1658,
-1659,
-1660,
-1661,
-1662,
-1663,
-1664,
-1665,
-1666,
-1667,
-1668,
-1669,
-1670,
-1671,
-1672,
-1673,
-1674,
-1675,
-1676,
-1677,
-1678,
-1679,
-1680,
-1681,
-1682,
-1683,
-1684,
-1685,
-1686,
-1687,
-1688,
-1689,
-1690,
-1691,
-1692,
-1693,
-1694,
-1695,
-1696,
-1697,
-1698,
-1699,
-1700,
-1701,
-1702,
-1703,
-1704,
-1705,
-1706,
-1707,
-1708,
-1709,
-1710,
-1711,
-1712,
-1713,
-1714,
-1715,
-1716,
-1717,
-1718,
-1719,
-1720,
-1721,
-1722,
-1723,
-1724,
-1725,
-1726,
-1727,
-1728,
-1729,
-1730,
-1731,
-1732,
-1733,
-1734,
-1735,
-1736,
-1737,
-1738,
-1739,
-1740,
-1741,
-1742,
-1743,
-1744,
-1745,
-1746,
-1747,
-1748,
-1749,
-1750,
-1751,
-1752,
-1754,
-1755,
-1756,
-1757,
-1758,
-1759,
-1760,
-1761,
-1762,
-1763,
-1764,
-1765,
-1766,
-1767,
-1768,
-1769,
-1770,
-1771,
-1772,
-1773,
-1774,
-1776,
-1777,
-1778,
-1779,
-1780,
-1781,
-1782,
-1784,
-1785,
-1786,
-1787,
-1788,
-1789,
-1790,
-1791,
-1792,
-1793,
-1794,
-1795,
-1796,
-1797,
-1798,
-1799,
-1800,
-1801,
-1802,
-1803,
-1804,
-1805,
-1806,
-1807,
-1808,
-1809,
-1810,
-1811,
-1812,
-1813,
-1814,
-1815,
-1816,
-1817,
-1818,
-1819,
-1820,
-1821,
-1822,
-1823,
-1824,
-1825,
-1826,
-1827,
-1828,
-1829,
-1830,
-1831,
-1832,
-1833,
-1834,
-1835,
-1836,
-1837,
-1838,
-1839,
-1840,
-1841,
-1842,
-1843,
-1844,
-1845,
-1846,
-1847,
-1848,
-1849,
-1850,
-1851,
-1852,
-1853,
-1854,
-1855,
-1856,
-1857,
-1858,
-1859,
-1860,
-1861,
-1862,
-1863,
-1864,
-1865,
-1866,
-1867,
-1868,
-1869,
-1870,
-1871,
-1872,
-1873,
-1874,
-1875,
-1876,
-1877,
-1878,
-1879,
-1880,
-1881,
-1882,
-1883,
-1884,
-1885,
-1886,
-1887,
-1888,
-1889,
-1890,
-1891,
-1892,
-1893,
-1894,
-1896,
-1897,
-1898,
-1899,
-1900,
-1901,
-1902,
-1903,
-1904,
-1905,
-1906,
-1907,
-1908,
-1909,
-1910,
-1911,
-1912,
-1913,
-1914,
-1915,
-1916,
-1917,
-1918,
-1919,
-1920,
-1921,
-1922,
-1923,
-1924,
-1925,
-1926,
-1927,
-1928,
-1929,
-1930,
-1931,
-1932,
-1933,
-1934,
-1935,
-1936,
-1937,
-1938,
-1939,
-1940,
-1941,
-1942,
-1943,
-1944,
-1945,
-1946,
-1947,
-1948,
-1949,
-1950,
-1951,
-1952,
-1953,
-1954,
-1955,
-1956,
-1957,
-1958,
-1959,
-1960,
-1961,
-1962,
-1963,
-1964,
-1965,
-1966,
-1967,
-1968,
-1969,
-1970,
-1971,
-1972,
-1973,
-1974,
-1975,
-1976,
-1977,
-1978,
-1979,
-1980,
-1981,
-1982,
-1983,
-1984,
-1985,
-1986,
-1987,
-1988,
-1989,
-1990,
-1991,
-1992,
-1993,
-1994,
-1995,
-1996,
-1997,
-1998,
-1999,
-2000,
-2001,
-2002,
-2003,
-2004,
-2005,
-2006,
-2007,
-2008,
-2009,
-2010,
-2011,
-2012,
-2013,
-2014,
-2015,
-2016,
-2017,
-2018,
-2019,
-2020,
-2021,
-2022,
-2023,
-2024,
-2025,
-2026,
-2027,
-2028,
-2029,
-2030,
-2031,
-2032,
-2033,
-2034,
-2035,
-2036,
-2037,
-2038,
-2039,
-2040,
-2041,
-2042,
-2043,
-2044,
-2045,
-2046,
-2047,
-2048,
-2049,
-2050,
-2051,
-2052,
-2053,
-2054,
-2055,
-2056,
-2057,
-2058,
-2059,
-2060,
-2061,
-2062,
-2063,
-2064,
-2065,
-2066,
-2067,
-2068,
-2069,
-2070,
-2071,
-2072,
-2073,
-2074,
-2075,
-2076,
-2077,
-2078,
-2079,
-2080,
-2081,
-2082,
-2083,
-2084,
-2085,
-2086,
-2087,
-2088,
-2089,
-2090,
-2091,
-2092,
-2093,
-2094,
-2095,
-2096,
-2097,
-2098,
-2099,
-2100,
-2101,
-2102,
-2103,
-2104,
-2105,
-2106,
-2107,
-2108,
-2109,
-2110,
-2111,
-2112,
-2113,
-2114,
-2115,
-2116,
-2117,
-2118,
-2119,
-2120,
-2121,
-2122,
-2123,
-2124,
-2125,
-2126,
-2127,
-2128,
-2129,
-2130,
-2131,
-2132,
-2133,
-2134,
-2135,
-2136,
-2137,
-2138,
-2139,
-2140,
-2141,
-2142,
-2143,
-2144,
-2145,
-2146,
-2147,
-2148,
-2149,
-2150,
-2151,
-2152,
-2153,
-2154,
-2155,
-2156,
-2157,
-2158,
-2159,
-2160,
-2161,
-2162,
-2163,
-2164,
-2165,
-2166,
-2167,
-2168,
-2169,
-2170,
-2171,
-2172,
-2173,
-2174,
-2175,
-2176,
-2177,
-2178,
-2179,
-2180,
-2181,
-2182,
-2183,
-2184,
-2185,
-2186,
-2187,
-2190,
-2191,
-2192,
-2193,
-2197,
-2198,
-2199,
-2200,
-2201,
-2202,
-2203,
-2204,
-2205,
-2206,
-2207,
-2208,
-2209,
-2210,
-2211,
-2212,
-2213,
-2214,
-2215,
-2216,
-2217,
-2218,
-2219,
-2220,
-2221,
-2222,
-2223,
-2224,
-2226,
-2227,
-2228,
-2229,
-2230,
-2231,
-2232,
-2233,
-2234,
-2235,
-2236,
-2237,
-2238,
-2239,
-2240,
-2241,
-2242,
-2243,
-2244,
-2245,
-2246,
-2247,
-2248,
-2249,
-2250,
-2251,
-2252,
-2253,
-2254,
-2255,
-2256,
-2257,
-2258,
-2260,
-2261,
-2262,
-2263,
-2264,
-2265,
-2266,
-2267,
-2268,
-2269,
-2270,
-2271,
-2272,
-2273,
-2274,
-2275,
-2276,
-2277,
-2278,
-2279,
-2280,
-2281,
-2282,
-2283,
-2284,
-2285,
-2286,
-2287,
-2288,
-2289,
-2290,
-2291,
-2292,
-2293,
-2294,
-2295,
-2296,
-2297,
-2298,
-2299,
-2300,
-2301,
-2302,
-2303,
-2304,
-2305,
-2306,
-2307,
-2308,
-2309,
-2310,
-2311,
-2312,
-2313,
-2314,
-2315,
-2316,
-2317,
-2318,
-2319,
-2320,
-2321,
-2322,
-2323,
-2324,
-2325,
-2326,
-2327,
-2328,
-2329,
-2330,
-2331,
-2332,
-2333,
-2334,
-2335,
-2336,
-2337,
-2338,
-2339,
-2340,
-2341,
-2342,
-2343,
-2344,
-2345,
-2346,
-2347,
-2348,
-2349,
-2350,
-2351,
-2352,
-2353,
-2354,
-2355,
-2356,
-2357,
-2358,
-2359,
-2360,
-2361,
-2362,
-2363,
-2364,
-2365,
-2366,
-2367,
-2368,
-2370,
-2372,
-2381,
-2382,
-2383,
-2384,
-2385,
-2386,
-2387,
-2388,
-2389,
-2390,
-2391,
-2392,
-2393,
-2394,
-2395,
-2396,
-2397,
-2398,
-2399,
-2400,
-2401,
-2402,
-2403,
-2404,
-2405,
-2406,
-2407,
-2409,
-2410,
-2411,
-2412,
-2413,
-2414,
-2415,
-2416,
-2417,
-2418,
-2419,
-2420,
-2421,
-2422,
-2423,
-2424,
-2425,
-2426,
-2427,
-2428,
-2429,
-2430,
-2431,
-2432,
-2433,
-2434,
-2435,
-2436,
-2437,
-2438,
-2439,
-2440,
-2441,
-2442,
-2443,
-2444,
-2445,
-2446,
-2447,
-2448,
-2449,
-2450,
-2451,
-2452,
-2453,
-2454,
-2455,
-2456,
-2457,
-2458,
-2459,
-2460,
-2461,
-2462,
-2463,
-2464,
-2465,
-2466,
-2467,
-2468,
-2469,
-2470,
-2471,
-2472,
-2473,
-2474,
-2475,
-2476,
-2477,
-2478,
-2479,
-2480,
-2481,
-2482,
-2483,
-2484,
-2485,
-2486,
-2487,
-2488,
-2489,
-2490,
-2491,
-2492,
-2493,
-2494,
-2495,
-2496,
-2497,
-2498,
-2499,
-2500,
-2501,
-2502,
-2503,
-2504,
-2505,
-2506,
-2507,
-2508,
-2509,
-2510,
-2511,
-2512,
-2513,
-2514,
-2515,
-2516,
-2517,
-2518,
-2519,
-2520,
-2521,
-2522,
-2523,
-2524,
-2525,
-2526,
-2527,
-2528,
-2529,
-2530,
-2531,
-2532,
-2533,
-2534,
-2535,
-2536,
-2537,
-2538,
-2539,
-2540,
-2541,
-2542,
-2543,
-2544,
-2545,
-2546,
-2547,
-2548,
-2549,
-2550,
-2551,
-2552,
-2553,
-2554,
-2555,
-2556,
-2557,
-2558,
-2559,
-2560,
-2561,
-2562,
-2563,
-2564,
-2565,
-2566,
-2567,
-2568,
-2569,
-2570,
-2571,
-2572,
-2573,
-2574,
-2575,
-2576,
-2577,
-2578,
-2579,
-2580,
-2581,
-2582,
-2583,
-2584,
-2585,
-2586,
-2587,
-2588,
-2589,
-2590,
-2591,
-2592,
-2593,
-2594,
-2595,
-2596,
-2597,
-2598,
-2599,
-2600,
-2601,
-2602,
-2603,
-2604,
-2605,
-2606,
-2607,
-2608,
-2609,
-2610,
-2611,
-2612,
-2613,
-2614,
-2615,
-2616,
-2617,
-2618,
-2619,
-2620,
-2621,
-2622,
-2623,
-2624,
-2625,
-2626,
-2627,
-2628,
-2629,
-2630,
-2631,
-2632,
-2633,
-2634,
-2635,
-2636,
-2637,
-2638,
-2639,
-2640,
-2641,
-2642,
-2643,
-2644,
-2645,
-2646,
-2647,
-2648,
-2649,
-2650,
-2651,
-2652,
-2653,
-2654,
-2655,
-2656,
-2657,
-2658,
-2659,
-2660,
-2661,
-2662,
-2663,
-2664,
-2665,
-2666,
-2667,
-2668,
-2669,
-2670,
-2671,
-2672,
-2673,
-2674,
-2675,
-2676,
-2677,
-2678,
-2679,
-2680,
-2681,
-2683,
-2684,
-2685,
-2686,
-2687,
-2688,
-2689,
-2690,
-2691,
-2692,
-2694,
-2695,
-2696,
-2697,
-2698,
-2699,
-2700,
-2701,
-2702,
-2703,
-2704,
-2705,
-2706,
-2707,
-2708,
-2709,
-2710,
-2711,
-2712,
-2713,
-2714,
-2715,
-2716,
-2717,
-2718,
-2719,
-2720,
-2721,
-2722,
-2723,
-2724,
-2725,
-2726,
-2727,
-2728,
-2729,
-2730,
-2731,
-2732,
-2733,
-2734,
-2735,
-2736,
-2737,
-2738,
-2739,
-2740,
-2741,
-2742,
-2743,
-2744,
-2745,
-2746,
-2747,
-2748,
-2749,
-2750,
-2751,
-2752,
-2753,
-2754,
-2755,
-2756,
-2757,
-2758,
-2759,
-2760,
-2761,
-2762,
-2763,
-2764,
-2765,
-2766,
-2767,
-2768,
-2769,
-2770,
-2771,
-2772,
-2773,
-2774,
-2775,
-2776,
-2777,
-2778,
-2779,
-2780,
-2781,
-2782,
-2783,
-2784,
-2785,
-2786,
-2787,
-2788,
-2789,
-2790,
-2791,
-2792,
-2793,
-2795,
-2796,
-2797,
-2798,
-2799,
-2800,
-2801,
-2802,
-2803,
-2804,
-2805,
-2806,
-2807,
-2808,
-2809,
-2810,
-2811,
-2812,
-2813,
-2814,
-2815,
-2816,
-2817,
-2818,
-2819,
-2820,
-2821,
-2822,
-2823,
-2824,
-2826,
-2827,
-2828,
-2829,
-2830,
-2831,
-2832,
-2833,
-2834,
-2835,
-2836,
-2837,
-2838,
-2839,
-2840,
-2841,
-2842,
-2843,
-2844,
-2845,
-2846,
-2847,
-2848,
-2849,
-2850,
-2851,
-2852,
-2853,
-2854,
-2856,
-2857,
-2858,
-2859,
-2860,
-2861,
-2862,
-2863,
-2864,
-2865,
-2866,
-2867,
-2868,
-2869,
-2870,
-2871,
-2872,
-2874,
-2875,
-2876,
-2877,
-2878,
-2879,
-2880,
-2881,
-2882,
-2883,
-2884,
-2885,
-2886,
-2887,
-2888,
-2889,
-2890,
-2891,
-2892,
-2893,
-2894,
-2895,
-2896,
-2897,
-2898,
-2899,
-2900,
-2901,
-2902,
-2903,
-2904,
-2906,
-2907,
-2908,
-2909,
-2910,
-2911,
-2912,
-2913,
-2914,
-2915,
-2916,
-2917,
-2918,
-2919,
-2920,
-2921,
-2922,
-2923,
-2924,
-2926,
-2927,
-2928,
-2929,
-2930,
-2931,
-2932,
-2933,
-2934,
-2935,
-2936,
-2937,
-2938,
-2939,
-2940,
-2941,
-2942,
-2943,
-2944,
-2945,
-2946,
-2947,
-2948,
-2949,
-2950,
-2951,
-2952,
-2953,
-2954,
-2955,
-2956,
-2957,
-2958,
-2959,
-2960,
-2961,
-2962,
-2963,
-2964,
-2965,
-2966,
-2967,
-2968,
-2969,
-2970,
-2971,
-2972,
-2973,
-2974,
-2975,
-2976,
-2977,
-2978,
-2979,
-2980,
-2981,
-2982,
-2983,
-2984,
-2985,
-2986,
-2987,
-2988,
-2989,
-2990,
-2991,
-2992,
-2993,
-2994,
-2995,
-2996,
-2997,
-2998,
-3000,
-3002,
-3003,
-3004,
-3005,
-3006,
-3007,
-3008,
-3009,
-3010,
-3011,
-3012,
-3013,
-3014,
-3015,
-3016,
-3017,
-3018,
-3019,
-3020,
-3021,
-3022,
-3023,
-3024,
-3025,
-3026,
-3027,
-3028,
-3029,
-3030,
-3031,
-3032,
-3033,
-3034,
-3035,
-3036,
-3037,
-3038,
-3039,
-3040,
-3041,
-3042,
-3043,
-3044,
-3045,
-3046,
-3047,
-3048,
-3049,
-3050,
-3051,
-3052,
-3053,
-3054,
-3055,
-3056,
-3057,
-3058,
-3059,
-3060,
-3061,
-3062,
-3063,
-3064,
-3065,
-3066,
-3067,
-3068,
-3069,
-3070,
-3071,
-3072,
-3073,
-3074,
-3075,
-3076,
-3077,
-3078,
-3079,
-3080,
-3081,
-3082,
-3083,
-3084,
-3085,
-3086,
-3087,
-3088,
-3089,
-3090,
-3091,
-3093,
-3094,
-3095,
-3096,
-3098,
-3099,
-3100,
-3101,
-3102,
-3103,
-3104,
-3105,
-3106,
-3107,
-3108,
-3109,
-3110,
-3111,
-3112,
-3113,
-3114,
-3115,
-3116,
-3117,
-3118,
-3119,
-3120,
-3122,
-3123,
-3124,
-3125,
-3127,
-3128,
-3129,
-3130,
-3131,
-3132,
-3133,
-3134,
-3135,
-3136,
-3137,
-3138,
-3139,
-3140,
-3141,
-3142,
-3143,
-3144,
-3145,
-3146,
-3147,
-3148,
-3149,
-3150,
-3151,
-3152,
-3153,
-3154,
-3155,
-3156,
-3157,
-3158,
-3159,
-3160,
-3161,
-3162,
-3163,
-3164,
-3165,
-3166,
-3167,
-3168,
-3169,
-3170,
-3171,
-3172,
-3173,
-3174,
-3175,
-3176,
-3177,
-3178,
-3179,
-3180,
-3181,
-3182,
-3183,
-3184,
-3185,
-3186,
-3187,
-3188,
-3189,
-3190,
-3191,
-3192,
-3193,
-3194,
-3195,
-3196,
-3197,
-3198,
-3199,
-3200,
-3201,
-3202,
-3203,
-3204,
-3205,
-3206,
-3207,
-3208,
-3209,
-3210,
-3211,
-3212,
-3213,
-3214,
-3215,
-3216,
-3217,
-3218,
-3219,
-3220,
-3221,
-3222,
-3223,
-3224,
-3225,
-3226,
-3227,
-3228,
-3229,
-3230,
-3231,
-3232,
-3233,
-3234,
-3235,
-3236,
-3237,
-3238,
-3239,
-3240,
-3241,
-3242,
-3243,
-3244,
-3245,
-3246,
-3247,
-3248,
-3249,
-3250,
-3251,
-3252,
-3253,
-3254,
-3255,
-3256,
-3257,
-3258,
-3259,
-3260,
-3261,
-3262,
-3263,
-3264,
-3265,
-3266,
-3267,
-3268,
-3269,
-3270,
-3271,
-3272,
-3273,
-3274,
-3275,
-3276,
-3277,
-3278,
-3279,
-3280,
-3281,
-3282,
-3283,
-3284,
-3285,
-3286,
-3287,
-3288,
-3289,
-3290,
-3291,
-3292,
-3293,
-3294,
-3295,
-3296,
-3297,
-3298,
-3299,
-3302,
-3303,
-3304,
-3305,
-3306,
-3307,
-3308,
-3309,
-3310,
-3311,
-3312,
-3313,
-3314,
-3315,
-3316,
-3317,
-3318,
-3319,
-3320,
-3321,
-3326,
-3327,
-3328,
-3329,
-3330,
-3331,
-3332,
-3333,
-3334,
-3335,
-3336,
-3337,
-3338,
-3339,
-3340,
-3341,
-3342,
-3343,
-3344,
-3345,
-3346,
-3347,
-3348,
-3349,
-3350,
-3351,
-3352,
-3353,
-3354,
-3355,
-3356,
-3357,
-3358,
-3359,
-3360,
-3361,
-3362,
-3363,
-3364,
-3365,
-3366,
-3372,
-3373,
-3374,
-3375,
-3376,
-3377,
-3378,
-3379,
-3380,
-3381,
-3382,
-3383,
-3384,
-3385,
-3386,
-3387,
-3388,
-3389,
-3390,
-3391,
-3392,
-3393,
-3394,
-3395,
-3396,
-3397,
-3398,
-3399,
-3400,
-3401,
-3402,
-3405,
-3406,
-3407,
-3408,
-3409,
-3410,
-3411,
-3412,
-3413,
-3414,
-3415,
-3416,
-3417,
-3418,
-3419,
-3420,
-3421,
-3422,
-3423,
-3424,
-3425,
-3426,
-3427,
-3428,
-3429,
-3430,
-3431,
-3432,
-3433,
-3434,
-3435,
-3436,
-3437,
-3438,
-3439,
-3440,
-3441,
-3442,
-3443,
-3444,
-3445,
-3446,
-3447,
-3448,
-3449,
-3450,
-3451,
-3452,
-3453,
-3454,
-3455,
-3456,
-3457,
-3458,
-3459,
-3460,
-3461,
-3462,
-3463,
-3464,
-3465,
-3466,
-3467,
-3468,
-3469,
-3470,
-3471,
-3472,
-3473,
-3474,
-3475,
-3476,
-3477,
-3478,
-3479,
-3480,
-3481,
-3482,
-3483,
-3484,
-3485,
-3486,
-3487,
-3488,
-3489,
-3490,
-3491,
-3492,
-3493,
-3494,
-3495,
-3496,
-3497,
-3498,
-3499,
-3500,
-3501,
-3502,
-3503,
-3504,
-3505,
-3506,
-3507,
-3508,
-3509,
-3510,
-3511,
-3512,
-3513,
-3514,
-3515,
-3516,
-3517,
-3518,
-3519,
-3520,
-3521,
-3522,
-3523,
-3524,
-3525,
-3526,
-3527,
-3528,
-3529,
-3530,
-3531,
-3532,
-3533,
-3534,
-3535,
-3536,
-3537,
-3538,
-3539,
-3540,
-3541,
-3542,
-3543,
-3544,
-3545,
-3547,
-3548,
-3549,
-3550,
-3551,
-3552,
-3553,
-3554,
-3555,
-3556,
-3557,
-3558,
-3559,
-3560,
-3561,
-3562,
-3563,
-3564,
-3567,
-3568,
-3569,
-3570,
-3571,
-3572,
-3573,
-3574,
-3575,
-3576,
-3577,
-3578,
-3579,
-3580,
-3581,
-3582,
-3583,
-3584,
-3585,
-3586,
-3587,
-3588,
-3589,
-3590,
-3591,
-3592,
-3593,
-3594,
-3595,
-3596,
-3597,
-3598,
-3599,
-3600,
-3601,
-3602,
-3603,
-3604,
-3605,
-3606,
-3607,
-3608,
-3609,
-3610,
-3611,
-3612,
-3613,
-3614,
-3615,
-3616,
-3617,
-3618,
-3619,
-3620,
-3621,
-3622,
-3623,
-3624,
-3625,
-3626,
-3627,
-3628,
-3629,
-3630,
-3631,
-3632,
-3633,
-3634,
-3635,
-3636,
-3637,
-3638,
-3639,
-3640,
-3641,
-3642,
-3643,
-3644,
-3645,
-3646,
-3647,
-3648,
-3649,
-3650,
-3651,
-3652,
-3653,
-3654,
-3655,
-3656,
-3657,
-3658,
-3659,
-3660,
-3661,
-3662,
-3663,
-3664,
-3665,
-3666,
-3667,
-3668,
-3669,
-3670,
-3671,
-3672,
-3673,
-3674,
-3675,
-3676,
-3677,
-3678,
-3679,
-3680,
-3681,
-3682,
-3683,
-3684,
-3685,
-3686,
-3687,
-3688,
-3689,
-3690,
-3691,
-3692,
-3695,
-3696,
-3697,
-3698,
-3699,
-3700,
-3701,
-3702,
-3703,
-3704,
-3705,
-3706,
-3707,
-3708,
-3709,
-3710,
-3711,
-3712,
-3713,
-3714,
-3715,
-3716,
-3717,
-3718,
-3719,
-3720,
-3721,
-3722,
-3723,
-3724,
-3725,
-3726,
-3727,
-3728,
-3729,
-3730,
-3731,
-3732,
-3733,
-3734,
-3735,
-3736,
-3738,
-3739,
-3740,
-3741,
-3742,
-3743,
-3744,
-3745,
-3746,
-3747,
-3748,
-3749,
-3750,
-3751,
-3752,
-3753,
-3754,
-3755,
-3756,
-3757,
-3758,
-3759,
-3760,
-3761,
-3762,
-3763,
-3764,
-3765,
-3767,
-3768,
-3769,
-3770,
-3771,
-3772,
-3773,
-3774,
-3775,
-3776,
-3777,
-3778,
-3779,
-3780,
-3781,
-3782,
-3783,
-3784,
-3785,
-3786,
-3787,
-3788,
-3789,
-3790,
-3791,
-3792,
-3793,
-3794,
-3795,
-3796,
-3797,
-3798,
-3799,
-3800,
-3801,
-3802,
-3803,
-3804,
-3805,
-3806,
-3807,
-3808,
-3809,
-3810,
-3811,
-3812,
-3813,
-3814,
-3815,
-3816,
-3817,
-3818,
-3819,
-3820,
-3821,
-3822,
-3823,
-3824,
-3825,
-3826,
-3827,
-3828,
-3829,
-3830,
-3831,
-3832,
-3833,
-3834,
-3835,
-3836,
-3837,
-3838,
-3839,
-3840,
-3842,
-3843,
-3844,
-3845,
-3846,
-3847,
-3848,
-3849,
-3850,
-3851,
-3852,
-3853,
-3854,
-3855,
-3856,
-3857,
-3858,
-3859,
-3860,
-3861,
-3862,
-3863,
-3865,
-3866,
-3867,
-3869,
-3870,
-3871,
-3872,
-3873,
-3874,
-3875,
-3876,
-3877,
-3878,
-3879,
-3880,
-3881,
-3882,
-3883,
-3884,
-3885,
-3886,
-3887,
-3888,
-3889,
-3890,
-3891,
-3892,
-3893,
-3894,
-3895,
-3896,
-3897,
-3898,
-3899,
-3900,
-3901,
-3902,
-3903,
-3904,
-3905,
-3906,
-3907,
-3908,
-3909,
-3910,
-3911,
-3912,
-3913,
-3914,
-3915,
-3916,
-3917,
-3918,
-3919,
-3920,
-3921,
-3922,
-3923,
-3924,
-3925,
-3926,
-3927,
-3928,
-3929,
-3930,
-3931,
-3932,
-3933,
-3934,
-3935,
-3936,
-3937,
-3938,
-3939,
-3940,
-3941,
-3942,
-3943,
-3944,
-3945,
-3946,
-3947,
-3948,
-3949,
-3950,
-3951,
-3952,
-3953,
-3954,
-3955,
-3956,
-3957,
-3958,
-3959,
-3960,
-3961,
-3962,
-3963,
-3964,
-3965,
-3966,
-3967,
-3968,
-3969,
-3970,
-3971,
-3972,
-3973,
-3974,
-3975,
-3976,
-3977,
-3978,
-3979,
-3980,
-3981,
-3982,
-3983,
-3984,
-3985,
-3986,
-3987,
-3988,
-3989,
-3990,
-3991,
-3992,
-3993,
-3995,
-3996,
-3997,
-3998,
-3999,
-4000,
-4001,
-4002,
-4003,
-4004,
-4005,
-4006,
-4007,
-4008,
-4009,
-4010,
-4011,
-4012,
-4013,
-4014,
-4015,
-4016,
-4017,
-4018,
-4019,
-4020,
-4021,
-4022,
-4023,
-4024,
-4025,
-4026,
-4027,
-4028,
-4029,
-4030,
-4031,
-4032,
-4033,
-4034,
-4035,
-4036,
-4037,
-4038,
-4039,
-4040,
-4041,
-4042,
-4043,
-4044,
-4045,
-4046,
-4047,
-4049,
-4050,
-4051,
-4052,
-4053,
-4054,
-4055,
-4056,
-4057,
-4058,
-4059,
-4060,
-4061,
-4062,
-4063,
-4064,
-4065,
-4066,
-4067,
-4068,
-4069,
-4070,
-4071,
-4072,
-4073,
-4074,
-4075,
-4076,
-4077,
-4079,
-4080,
-4081,
-4082,
-4083,
-4084,
-4086,
-4089,
-4090,
-4091,
-4092,
-4093,
-4094,
-4095,
-4096,
-4097,
-4098,
-4099,
-4100,
-4101,
-4102,
-4103,
-4104,
-4105,
-4106,
-4107,
-4108,
-4109,
-4110,
-4111,
-4112,
-4113,
-4114,
-4115,
-4116,
-4117,
-4118,
-4119,
-4121,
-4122,
-4123,
-4124,
-4125,
-4126,
-4127,
-4128,
-4129,
-4130,
-4131,
-4132,
-4133,
-4134,
-4135,
-4136,
-4137,
-4138,
-4139,
-4140,
-4141,
-4142,
-4143,
-4145,
-4146,
-4147,
-4148,
-4149,
-4150,
-4151,
-4152,
-4153,
-4154,
-4155,
-4156,
-4157,
-4158,
-4159,
-4160,
-4161,
-4162,
-4163,
-4164,
-4165,
-4166,
-4167,
-4168,
-4169,
-4172,
-4173,
-4174,
-4177,
-4178,
-4179,
-4180,
-4181,
-4182,
-4183,
-4184,
-4185,
-4188,
-4191,
-4192,
-4197,
-4199,
-4300,
-4301,
-4302,
-4303,
-4304,
-4305,
-4306,
-4307,
-4308,
-4309,
-4310,
-4320,
-4321,
-4322,
-4323,
-4325,
-4326,
-4327,
-4328,
-4333,
-4340,
-4341,
-4342,
-4343,
-4344,
-4345,
-4346,
-4347,
-4348,
-4349,
-4350,
-4351,
-4352,
-4353,
-4354,
-4355,
-4356,
-4357,
-4358,
-4359,
-4361,
-4362,
-4366,
-4368,
-4369,
-4370,
-4371,
-4372,
-4373,
-4375,
-4376,
-4377,
-4378,
-4379,
-4389,
-4390,
-4394,
-4395,
-4400,
-4401,
-4402,
-4403,
-4404,
-4405,
-4406,
-4412,
-4413,
-4416,
-4418,
-4420,
-4425,
-4426,
-4430,
-4432,
-4441,
-4442,
-4443,
-4444,
-4445,
-4446,
-4447,
-4448,
-4449,
-4450,
-4451,
-4452,
-4453,
-4454,
-4455,
-4456,
-4457,
-4458,
-4484,
-4486,
-4488,
-4500,
-4534,
-4535,
-4536,
-4537,
-4538,
-4545,
-4546,
-4547,
-4548,
-4549,
-4550,
-4551,
-4552,
-4554,
-4555,
-4556,
-4557,
-4558,
-4559,
-4566,
-4567,
-4568,
-4569,
-4591,
-4592,
-4593,
-4594,
-4595,
-4596,
-4597,
-4598,
-4599,
-4600,
-4601,
-4621,
-4658,
-4659,
-4660,
-4661,
-4662,
-4663,
-4664,
-4665,
-4666,
-4667,
-4668,
-4669,
-4670,
-4671,
-4672,
-4673,
-4674,
-4675,
-4676,
-4677,
-4678,
-4679,
-4680,
-4681,
-4682,
-4683,
-4684,
-4685,
-4686,
-4687,
-4688,
-4689,
-4690,
-4691,
-4692,
-4700,
-4701,
-4702,
-4711,
-4725,
-4726,
-4727,
-4728,
-4729,
-4730,
-4732,
-4737,
-4738,
-4739,
-4740,
-4741,
-4742,
-4743,
-4744,
-4745,
-4746,
-4747,
-4749,
-4750,
-4751,
-4752,
-4753,
-4754,
-4755,
-4784,
-4785,
-4789,
-4790,
-4791,
-4800,
-4801,
-4802,
-4803,
-4804,
-4827,
-4837,
-4838,
-4839,
-4840,
-4841,
-4842,
-4843,
-4844,
-4845,
-4846,
-4847,
-4848,
-4849,
-4850,
-4851,
-4867,
-4868,
-4869,
-4870,
-4871,
-4876,
-4877,
-4878,
-4881,
-4882,
-4884,
-4885,
-4894,
-4899,
-4900,
-4914,
-4936,
-4937,
-4940,
-4941,
-4942,
-4949,
-4950,
-4951,
-4952,
-4969,
-4970,
-4980,
-4986,
-4987,
-4988,
-4989,
-4990,
-4991,
-4999,
-5000,
-5001,
-5002,
-5003,
-5004,
-5005,
-5006,
-5007,
-5008,
-5009,
-5010,
-5011,
-5012,
-5013,
-5014,
-5020,
-5021,
-5022,
-5023,
-5024,
-5025,
-5026,
-5027,
-5029,
-5030,
-5031,
-5042,
-5043,
-5044,
-5046,
-5047,
-5049,
-5050,
-5051,
-5052,
-5053,
-5055,
-5056,
-5057,
-5058,
-5059,
-5060,
-5061,
-5062,
-5064,
-5065,
-5066,
-5067,
-5069,
-5070,
-5071,
-5072,
-5073,
-5074,
-5078,
-5079,
-5080,
-5081,
-5082,
-5083,
-5084,
-5085,
-5092,
-5093,
-5094,
-5099,
-5100,
-5101,
-5102,
-5104,
-5105,
-5111,
-5112,
-5116,
-5120,
-5133,
-5136,
-5137,
-5145,
-5150,
-5151,
-5152,
-5154,
-5155,
-5164,
-5165,
-5166,
-5167,
-5168,
-5190,
-5191,
-5192,
-5193,
-5200,
-5201,
-5202,
-5203,
-5223,
-5224,
-5225,
-5226,
-5227,
-5234,
-5235,
-5236,
-5237,
-5245,
-5246,
-5247,
-5248,
-5249,
-5250,
-5251,
-5252,
-5264,
-5265,
-5270,
-5271,
-5272,
-5282,
-5298,
-5299,
-5300,
-5301,
-5302,
-5303,
-5304,
-5305,
-5306,
-5307,
-5308,
-5309,
-5310,
-5312,
-5313,
-5314,
-5315,
-5343,
-5344,
-5349,
-5350,
-5351,
-5352,
-5353,
-5354,
-5355,
-5356,
-5357,
-5358,
-5359,
-5360,
-5361,
-5362,
-5363,
-5364,
-5397,
-5398,
-5399,
-5400,
-5401,
-5402,
-5403,
-5404,
-5405,
-5406,
-5407,
-5408,
-5409,
-5410,
-5411,
-5412,
-5413,
-5414,
-5415,
-5416,
-5417,
-5418,
-5419,
-5420,
-5421,
-5422,
-5423,
-5424,
-5425,
-5426,
-5427,
-5428,
-5429,
-5430,
-5431,
-5432,
-5433,
-5434,
-5435,
-5436,
-5437,
-5443,
-5450,
-5453,
-5454,
-5455,
-5456,
-5461,
-5462,
-5463,
-5464,
-5465,
-5474,
-5500,
-5501,
-5502,
-5503,
-5504,
-5505,
-5506,
-5553,
-5554,
-5555,
-5556,
-5567,
-5568,
-5569,
-5573,
-5580,
-5581,
-5582,
-5583,
-5584,
-5585,
-5597,
-5598,
-5599,
-5600,
-5601,
-5602,
-5603,
-5604,
-5605,
-5627,
-5628,
-5629,
-5630,
-5631,
-5632,
-5633,
-5634,
-5670,
-5671,
-5672,
-5673,
-5674,
-5675,
-5676,
-5677,
-5678,
-5679,
-5680,
-5681,
-5682,
-5683,
-5684,
-5687,
-5688,
-5689,
-5713,
-5714,
-5715,
-5716,
-5717,
-5718,
-5719,
-5720,
-5721,
-5722,
-5723,
-5724,
-5728,
-5729,
-5730,
-5741,
-5742,
-5743,
-5744,
-5745,
-5746,
-5747,
-5748,
-5750,
-5755,
-5757,
-5766,
-5767,
-5768,
-5769,
-5770,
-5771,
-5777,
-5781,
-5782,
-5783,
-5784,
-5785,
-5786,
-5787,
-5793,
-5794,
-5813,
-5814,
-5859,
-5863,
-5900,
-5910,
-5911,
-5912,
-5913,
-5963,
-5968,
-5969,
-5984,
-5985,
-5986,
-5987,
-5988,
-5989,
-5990,
-5991,
-5992,
-5999,
-6000,
-6064,
-6065,
-6066,
-6069,
-6070,
-6071,
-6072,
-6073,
-6074,
-6080,
-6081,
-6082,
-6083,
-6085,
-6086,
-6087,
-6088,
-6100,
-6101,
-6102,
-6103,
-6104,
-6105,
-6106,
-6107,
-6108,
-6109,
-6110,
-6111,
-6112,
-6118,
-6122,
-6123,
-6124,
-6133,
-6140,
-6141,
-6142,
-6143,
-6144,
-6145,
-6146,
-6147,
-6148,
-6149,
-6160,
-6161,
-6162,
-6163,
-6200,
-6201,
-6209,
-6222,
-6241,
-6242,
-6243,
-6244,
-6251,
-6252,
-6253,
-6268,
-6269,
-6300,
-6301,
-6306,
-6315,
-6316,
-6317,
-6320,
-6321,
-6322,
-6324,
-6343,
-6346,
-6347,
-6350,
-6355,
-6360,
-6363,
-6370,
-6382,
-6389,
-6390,
-6417,
-6419,
-6420,
-6421,
-6443,
-6444,
-6445,
-6446,
-6455,
-6456,
-6464,
-6471,
-6480,
-6481,
-6482,
-6483,
-6484,
-6485,
-6486,
-6487,
-6488,
-6489,
-6500,
-6501,
-6502,
-6503,
-6505,
-6506,
-6507,
-6508,
-6509,
-6510,
-6511,
-6514,
-6515,
-6543,
-6544,
-6547,
-6548,
-6549,
-6550,
-6551,
-6558,
-6566,
-6568,
-6579,
-6580,
-6581,
-6582,
-6583,
-6619,
-6620,
-6621,
-6622,
-6623,
-6626,
-6627,
-6628,
-6629,
-6633,
-6634,
-6635,
-6636,
-6653,
-6657,
-6670,
-6671,
-6672,
-6673,
-6678,
-6679,
-6689,
-6696,
-6701,
-6702,
-6703,
-6714,
-6715,
-6767,
-6768,
-6769,
-6770,
-6771,
-6784,
-6785,
-6786,
-6787,
-6788,
-6790,
-6791,
-6801,
-6831,
-6841,
-6842,
-6850,
-6868,
-6888,
-6935,
-6936,
-6946,
-6951,
-6961,
-6962,
-6963,
-6964,
-6965,
-6966,
-6969,
-6997,
-6998,
-6999,
-7000,
-7001,
-7002,
-7003,
-7004,
-7005,
-7006,
-7007,
-7008,
-7009,
-7010,
-7011,
-7012,
-7013,
-7014,
-7015,
-7016,
-7019,
-7020,
-7021,
-7022,
-7023,
-7024,
-7025,
-7030,
-7040,
-7070,
-7071,
-7080,
-7088,
-7095,
-7099,
-7100,
-7101,
-7107,
-7121,
-7128,
-7129,
-7161,
-7162,
-7163,
-7164,
-7165,
-7166,
-7169,
-7170,
-7171,
-7174,
-7181,
-7200,
-7201,
-7227,
-7235,
-7244,
-7262,
-7272,
-7273,
-7274,
-7275,
-7276,
-7277,
-7278,
-7279,
-7280,
-7281,
-7282,
-7365,
-7391,
-7392,
-7393,
-7394,
-7395,
-7397,
-7400,
-7401,
-7402,
-7410,
-7411,
-7421,
-7426,
-7427,
-7428,
-7429,
-7430,
-7431,
-7437,
-7443,
-7473,
-7491,
-7500,
-7501,
-7510,
-7511,
-7542,
-7543,
-7544,
-7545,
-7546,
-7547,
-7548,
-7549,
-7550,
-7560,
-7566,
-7570,
-7574,
-7588,
-7606,
-7624,
-7627,
-7628,
-7629,
-7633,
-7648,
-7674,
-7675,
-7676,
-7677,
-7680,
-7689,
-7697,
-7707,
-7708,
-7720,
-7724,
-7725,
-7726,
-7727,
-7728,
-7734,
-7738,
-7741,
-7743,
-7744,
-7747,
-7777,
-7778,
-7779,
-7781,
-7784,
-7786,
-7787,
-7789,
-7794,
-7797,
-7798,
-7799,
-7800,
-7801,
-7802,
-7810,
-7845,
-7846,
-7872,
-7880,
-7887,
-7900,
-7901,
-7902,
-7903,
-7913,
-7932,
-7933,
-7962,
-7967,
-7979,
-7980,
-7982,
-7998,
-7999,
-8000,
-8001,
-8002,
-8003,
-8005,
-8006,
-8008,
-8019,
-8020,
-8021,
-8022,
-8025,
-8026,
-8032,
-8033,
-8034,
-8040,
-8052,
-8053,
-8054,
-8055,
-8056,
-8057,
-8058,
-8059,
-8060,
-8074,
-8080,
-8081,
-8082,
-8083,
-8086,
-8087,
-8088,
-8097,
-8100,
-8115,
-8116,
-8118,
-8121,
-8122,
-8128,
-8129,
-8130,
-8131,
-8132,
-8148,
-8149,
-8160,
-8161,
-8182,
-8184,
-8192,
-8194,
-8195,
-8199,
-8200,
-8201,
-8202,
-8204,
-8205,
-8206,
-8207,
-8208,
-8230,
-8231,
-8232,
-8243,
-8276,
-8280,
-8282,
-8292,
-8294,
-8300,
-8301,
-8320,
-8321,
-8322,
-8351,
-8376,
-8377,
-8378,
-8379,
-8380,
-8383,
-8384,
-8400,
-8401,
-8402,
-8403,
-8416,
-8417,
-8442,
-8443,
-8444,
-8445,
-8450,
-8472,
-8473,
-8474,
-8500,
-8501,
-8503,
-8554,
-8555,
-8567,
-8600,
-8609,
-8610,
-8611,
-8612,
-8613,
-8614,
-8675,
-8686,
-8732,
-8733,
-8763,
-8764,
-8765,
-8766,
-8770,
-8786,
-8787,
-8793,
-8800,
-8804,
-8808,
-8873,
-8880,
-8883,
-8888,
-8889,
-8890,
-8891,
-8892,
-8893,
-8894,
-8899,
-8900,
-8901,
-8910,
-8911,
-8912,
-8913,
-8954,
-8980,
-8981,
-8989,
-8990,
-8991,
-8999,
-9000,
-9001,
-9002,
-9006,
-9007,
-9009,
-9020,
-9021,
-9022,
-9023,
-9024,
-9025,
-9026,
-9060,
-9080,
-9084,
-9085,
-9086,
-9087,
-9088,
-9089,
-9090,
-9091,
-9092,
-9100,
-9101,
-9102,
-9103,
-9104,
-9105,
-9106,
-9119,
-9131,
-9160,
-9161,
-9162,
-9163,
-9164,
-9191,
-9200,
-9201,
-9202,
-9203,
-9204,
-9205,
-9206,
-9207,
-9208,
-9209,
-9210,
-9211,
-9212,
-9213,
-9214,
-9215,
-9216,
-9217,
-9222,
-9255,
-9277,
-9278,
-9279,
-9280,
-9281,
-9282,
-9283,
-9284,
-9285,
-9286,
-9287,
-9292,
-9293,
-9294,
-9295,
-9300,
-9318,
-9321,
-9343,
-9344,
-9346,
-9374,
-9380,
-9396,
-9397,
-9400,
-9401,
-9402,
-9418,
-9443,
-9444,
-9450,
-9500,
-9522,
-9535,
-9536,
-9555,
-9592,
-9593,
-9594,
-9595,
-9596,
-9597,
-9598,
-9599,
-9600,
-9612,
-9618,
-9628,
-9629,
-9632,
-9667,
-9668,
-9694,
-9695,
-9700,
-9747,
-9750,
-9753,
-9762,
-9800,
-9801,
-9802,
-9875,
-9878,
-9888,
-9889,
-9898,
-9899,
-9900,
-9901,
-9903,
-9909,
-9911,
-9950,
-9951,
-9952,
-9953,
-9955,
-9956,
-9966,
-9987,
-9990,
-9991,
-9992,
-9993,
-9994,
-9995,
-9996,
-9997,
-9998,
-9999,
-10000,
-10001,
-10002,
-10003,
-10007,
-10008,
-10009,
-10023,
-10050,
-10051,
-10080,
-10081,
-10100,
-10101,
-10102,
-10103,
-10104,
-10107,
-10110,
-10111,
-10113,
-10114,
-10115,
-10116,
-10117,
-10128,
-10160,
-10161,
-10162,
-10200,
-10201,
-10252,
-10253,
-10260,
-10288,
-10439,
-10500,
-10540,
-10541,
-10542,
-10543,
-10544,
-10800,
-10805,
-10810,
-10860,
-10880,
-10990,
-11000,
-11001,
-11095,
-11106,
-11108,
-11111,
-11112,
-11161,
-11162,
-11163,
-11164,
-11165,
-11171,
-11201,
-11208,
-11211,
-11319,
-11320,
-11321,
-11367,
-11371,
-11430,
-11600,
-11720,
-11723,
-11751,
-11796,
-11876,
-11877,
-11967,
-12000,
-12001,
-12002,
-12003,
-12004,
-12005,
-12006,
-12007,
-12008,
-12009,
-12012,
-12013,
-12109,
-12121,
-12168,
-12172,
-12300,
-12321,
-12322,
-12345,
-12753,
-13160,
-13216,
-13217,
-13218,
-13223,
-13224,
-13400,
-13720,
-13721,
-13722,
-13724,
-13782,
-13783,
-13785,
-13786,
-13818,
-13819,
-13820,
-13821,
-13822,
-13894,
-13929,
-14000,
-14001,
-14002,
-14033,
-14034,
-14141,
-14142,
-14145,
-14149,
-14154,
-14250,
-14414,
-14936,
-14937,
-15000,
-15118,
-15345,
-15363,
-15555,
-15660,
-15740,
-15998,
-16003,
-16161,
-16309,
-16310,
-16311,
-16360,
-16361,
-16367,
-16368,
-16384,
-16666,
-16900,
-16950,
-16991,
-16992,
-16993,
-16994,
-16995,
-17007,
-17185,
-17219,
-17220,
-17221,
-17222,
-17224,
-17225,
-17234,
-17235,
-17500,
-17729,
-17754,
-17755,
-17756,
-18000,
-18181,
-18182,
-18183,
-18184,
-18185,
-18186,
-18187,
-18241,
-18262,
-18463,
-18634,
-18635,
-18668,
-18769,
-18881,
-18888,
-19000,
-19007,
-19191,
-19194,
-19220,
-19283,
-19315,
-19398,
-19410,
-19411,
-19412,
-19539,
-19540,
-19541,
-19788,
-19999,
-20000,
-20001,
-20002,
-20003,
-20005,
-20012,
-20014,
-20034,
-20046,
-20048,
-20049,
-20167,
-20202,
-20222,
-20480,
-20670,
-20999,
-21000,
-21554,
-21590,
-21800,
-21845,
-21846,
-21847,
-21848,
-21849,
-22000,
-22001,
-22002,
-22003,
-22004,
-22005,
-22273,
-22305,
-22335,
-22343,
-22347,
-22350,
-22555,
-22763,
-22800,
-22951,
-23000,
-23001,
-23002,
-23003,
-23004,
-23005,
-23272,
-23294,
-23333,
-23400,
-23401,
-23402,
-24000,
-24001,
-24002,
-24003,
-24004,
-24005,
-24006,
-24242,
-24249,
-24321,
-24322,
-24386,
-24465,
-24554,
-24577,
-24676,
-24677,
-24678,
-24680,
-24850,
-24922,
-25000,
-25001,
-25002,
-25003,
-25004,
-25005,
-25006,
-25007,
-25008,
-25009,
-25793,
-25900,
-25901,
-25902,
-25903,
-25954,
-25955,
-26000,
-26133,
-26208,
-26260,
-26261,
-26262,
-26263,
-26486,
-26487,
-26489,
-27345,
-27442,
-27504,
-27782,
-27999,
-28000,
-28119,
-28200,
-28240,
-29167,
-30001,
-30002,
-30003,
-30004,
-30260,
-30832,
-30999,
-31016,
-31029,
-31416,
-31457,
-31620,
-31765,
-31948,
-31949,
-32034,
-32249,
-32483,
-32635,
-32636,
-32767,
-32768,
-32769,
-32770,
-32771,
-32772,
-32773,
-32774,
-32775,
-32776,
-32777,
-32801,
-32896,
-33123,
-33331,
-33334,
-33434,
-33656,
-34249,
-34378,
-34379,
-34567,
-34962,
-34963,
-34964,
-34980,
-35001,
-35004,
-35100,
-35355,
-36001,
-36411,
-36865,
-37475,
-37654,
-38002,
-38201,
-38202,
-38203,
-39681,
-40000,
-40023,
-40841,
-40842,
-40843,
-40853,
-41111,
-41230,
-41794,
-41795,
-42508,
-42509,
-42510,
-43000,
-43188,
-43189,
-43190,
-43210,
-43439,
-43440,
-43441,
-44321,
-44322,
-44544,
-44553,
-44600,
-44818,
-44900,
-45000,
-45054,
-45514,
-45678,
-45825,
-45966,
-46999,
-47000,
-47100,
-47557,
-47624,
-47806,
-47808,
-47809,
-48000,
-48001,
-48002,
-48003,
-48128,
-48129,
-48556,
-48619,
-48653,
diff --git a/external/unbound/util/locks.c b/external/unbound/util/locks.c
deleted file mode 100644
index b65a02bdc..000000000
--- a/external/unbound/util/locks.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
- * util/locks.c - unbound locking primitives
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- * Implementation of locking and threading support.
- * A place for locking debug code since most locking functions are macros.
- */
-
-#include "config.h"
-#include "util/locks.h"
-#include <signal.h>
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif
-
-/** block all signals, masks them away. */
-void
-ub_thread_blocksigs(void)
-{
-#if defined(HAVE_PTHREAD) || defined(HAVE_SOLARIS_THREADS) || defined(HAVE_SIGPROCMASK)
-# if defined(HAVE_PTHREAD) || defined(HAVE_SOLARIS_THREADS)
- int err;
-# endif
- sigset_t sigset;
- sigfillset(&sigset);
-#ifdef HAVE_PTHREAD
- if((err=pthread_sigmask(SIG_SETMASK, &sigset, NULL)))
- fatal_exit("pthread_sigmask: %s", strerror(err));
-#else
-# ifdef HAVE_SOLARIS_THREADS
- if((err=thr_sigsetmask(SIG_SETMASK, &sigset, NULL)))
- fatal_exit("thr_sigsetmask: %s", strerror(err));
-# else
- /* have nothing, do single process signal mask */
- if(sigprocmask(SIG_SETMASK, &sigset, NULL))
- fatal_exit("sigprocmask: %s", strerror(errno));
-# endif /* HAVE_SOLARIS_THREADS */
-#endif /* HAVE_PTHREAD */
-#endif /* have signal stuff */
-}
-
-/** unblock one signal, so we can catch it */
-void ub_thread_sig_unblock(int sig)
-{
-#if defined(HAVE_PTHREAD) || defined(HAVE_SOLARIS_THREADS) || defined(HAVE_SIGPROCMASK)
-# if defined(HAVE_PTHREAD) || defined(HAVE_SOLARIS_THREADS)
- int err;
-# endif
- sigset_t sigset;
- sigemptyset(&sigset);
- sigaddset(&sigset, sig);
-#ifdef HAVE_PTHREAD
- if((err=pthread_sigmask(SIG_UNBLOCK, &sigset, NULL)))
- fatal_exit("pthread_sigmask: %s", strerror(err));
-#else
-# ifdef HAVE_SOLARIS_THREADS
- if((err=thr_sigsetmask(SIG_UNBLOCK, &sigset, NULL)))
- fatal_exit("thr_sigsetmask: %s", strerror(err));
-# else
- /* have nothing, do single thread case */
- if(sigprocmask(SIG_UNBLOCK, &sigset, NULL))
- fatal_exit("sigprocmask: %s", strerror(errno));
-# endif /* HAVE_SOLARIS_THREADS */
-#endif /* HAVE_PTHREAD */
-#else
- (void)sig;
-#endif /* have signal stuff */
-}
-
-#if !defined(HAVE_PTHREAD) && !defined(HAVE_SOLARIS_THREADS) && !defined(HAVE_WINDOWS_THREADS)
-/**
- * No threading available: fork a new process.
- * This means no shared data structure, and no locking.
- * Only the main thread ever returns. Exits on errors.
- * @param thr: the location where to store the thread-id.
- * @param func: function body of the thread. Return value of func is lost.
- * @param arg: user argument to func.
- */
-void
-ub_thr_fork_create(ub_thread_type* thr, void* (*func)(void*), void* arg)
-{
- pid_t pid = fork();
- switch(pid) {
- default: /* main */
- *thr = (ub_thread_type)pid;
- return;
- case 0: /* child */
- *thr = (ub_thread_type)getpid();
- (void)(*func)(arg);
- exit(0);
- case -1: /* error */
- fatal_exit("could not fork: %s", strerror(errno));
- }
-}
-
-/**
- * There is no threading. Wait for a process to terminate.
- * Note that ub_thread_type is defined as pid_t.
- * @param thread: the process id to wait for.
- */
-void ub_thr_fork_wait(ub_thread_type thread)
-{
- int status = 0;
- if(waitpid((pid_t)thread, &status, 0) == -1)
- log_err("waitpid(%d): %s", (int)thread, strerror(errno));
- if(status != 0)
- log_warn("process %d abnormal exit with status %d",
- (int)thread, status);
-}
-#endif /* !defined(HAVE_PTHREAD) && !defined(HAVE_SOLARIS_THREADS) && !defined(HAVE_WINDOWS_THREADS) */
-
-#ifdef HAVE_SOLARIS_THREADS
-void* ub_thread_key_get(ub_thread_key_type key)
-{
- void* ret=NULL;
- LOCKRET(thr_getspecific(key, &ret));
- return ret;
-}
-#endif
-
-#ifdef HAVE_WINDOWS_THREADS
-/** log a windows GetLastError message */
-static void log_win_err(const char* str, DWORD err)
-{
- LPTSTR buf;
- if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
- NULL, err, 0, (LPTSTR)&buf, 0, NULL) == 0) {
- /* could not format error message */
- log_err("%s, GetLastError=%d", str, (int)err);
- return;
- }
- log_err("%s, (err=%d): %s", str, (int)err, buf);
- LocalFree(buf);
-}
-
-void lock_basic_init(lock_basic_type* lock)
-{
- /* implement own lock, because windows HANDLE as Mutex usage
- * uses too many handles and would bog down the whole system. */
- (void)InterlockedExchange(lock, 0);
-}
-
-void lock_basic_destroy(lock_basic_type* lock)
-{
- (void)InterlockedExchange(lock, 0);
-}
-
-void lock_basic_lock(lock_basic_type* lock)
-{
- LONG wait = 1; /* wait 1 msec at first */
-
- while(InterlockedExchange(lock, 1)) {
- /* if the old value was 1 then if was already locked */
- Sleep(wait); /* wait with sleep */
- wait *= 2; /* exponential backoff for waiting */
- }
- /* the old value was 0, but we inserted 1, we locked it! */
-}
-
-void lock_basic_unlock(lock_basic_type* lock)
-{
- /* unlock it by inserting the value of 0. xchg for cache coherency. */
- (void)InterlockedExchange(lock, 0);
-}
-
-void ub_thread_key_create(ub_thread_key_type* key, void* f)
-{
- *key = TlsAlloc();
- if(*key == TLS_OUT_OF_INDEXES) {
- *key = 0;
- log_win_err("TlsAlloc Failed(OUT_OF_INDEXES)", GetLastError());
- }
- else ub_thread_key_set(*key, f);
-}
-
-void ub_thread_key_set(ub_thread_key_type key, void* v)
-{
- if(!TlsSetValue(key, v)) {
- log_win_err("TlsSetValue failed", GetLastError());
- }
-}
-
-void* ub_thread_key_get(ub_thread_key_type key)
-{
- void* ret = (void*)TlsGetValue(key);
- if(ret == NULL && GetLastError() != ERROR_SUCCESS) {
- log_win_err("TlsGetValue failed", GetLastError());
- }
- return ret;
-}
-
-void ub_thread_create(ub_thread_type* thr, void* (*func)(void*), void* arg)
-{
-#ifndef HAVE__BEGINTHREADEX
- *thr = CreateThread(NULL, /* default security (no inherit handle) */
- 0, /* default stack size */
- (LPTHREAD_START_ROUTINE)func, arg,
- 0, /* default flags, run immediately */
- NULL); /* do not store thread identifier anywhere */
-#else
- /* the beginthreadex routine setups for the C lib; aligns stack */
- *thr=(ub_thread_type)_beginthreadex(NULL, 0, (void*)func, arg, 0, NULL);
-#endif
- if(*thr == NULL) {
- log_win_err("CreateThread failed", GetLastError());
- fatal_exit("thread create failed");
- }
-}
-
-ub_thread_type ub_thread_self(void)
-{
- return GetCurrentThread();
-}
-
-void ub_thread_join(ub_thread_type thr)
-{
- DWORD ret = WaitForSingleObject(thr, INFINITE);
- if(ret == WAIT_FAILED) {
- log_win_err("WaitForSingleObject(Thread):WAIT_FAILED",
- GetLastError());
- } else if(ret == WAIT_TIMEOUT) {
- log_win_err("WaitForSingleObject(Thread):WAIT_TIMEOUT",
- GetLastError());
- }
- /* and close the handle to the thread */
- if(!CloseHandle(thr)) {
- log_win_err("CloseHandle(Thread) failed", GetLastError());
- }
-}
-#endif /* HAVE_WINDOWS_THREADS */
diff --git a/external/unbound/util/locks.h b/external/unbound/util/locks.h
deleted file mode 100644
index d86ee4923..000000000
--- a/external/unbound/util/locks.h
+++ /dev/null
@@ -1,313 +0,0 @@
-/**
- * util/locks.h - unbound locking primitives
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef UTIL_LOCKS_H
-#define UTIL_LOCKS_H
-
-/**
- * \file
- * Locking primitives.
- * If pthreads is available, these are used.
- * If no locking exists, they do nothing.
- *
- * The idea is to have different sorts of locks for different tasks.
- * This allows the locking code to be ported more easily.
- *
- * Types of locks that are supported.
- * o lock_rw: lock that has many readers and one writer (to a data entry).
- * o lock_basic: simple mutex. Blocking, one person has access only.
- * This lock is meant for non performance sensitive uses.
- * o lock_quick: speed lock. For performance sensitive locking of critical
- * sections. Could be implemented by a mutex or a spinlock.
- *
- * Also thread creation and deletion functions are defined here.
- */
-
-/* if you define your own LOCKRET before including locks.h, you can get most
- * locking functions without the dependency on log_err. */
-#ifndef LOCKRET
-#include "util/log.h"
-/**
- * The following macro is used to check the return value of the
- * pthread calls. They return 0 on success and an errno on error.
- * The errno is logged to the logfile with a descriptive comment.
- */
-#define LOCKRET(func) do {\
- int lockret_err; \
- if( (lockret_err=(func)) != 0) \
- log_err("%s at %d could not " #func ": %s", \
- __FILE__, __LINE__, strerror(lockret_err)); \
- } while(0)
-#endif
-
-/** DEBUG: use thread debug whenever possible */
-#if defined(HAVE_PTHREAD) && defined(HAVE_PTHREAD_SPINLOCK_T) && defined(ENABLE_LOCK_CHECKS)
-# define USE_THREAD_DEBUG
-#endif
-
-#ifdef USE_THREAD_DEBUG
-/******************* THREAD DEBUG ************************/
-/* (some) checking; to detect races and deadlocks. */
-#include "testcode/checklocks.h"
-
-#else /* USE_THREAD_DEBUG */
-#define lock_protect(lock, area, size) /* nop */
-#define lock_unprotect(lock, area) /* nop */
-#define lock_get_mem(lock) (0) /* nothing */
-#define checklock_start() /* nop */
-#define checklock_stop() /* nop */
-
-#ifdef HAVE_PTHREAD
-#include <pthread.h>
-
-/******************* PTHREAD ************************/
-
-/** use pthread mutex for basic lock */
-typedef pthread_mutex_t lock_basic_type;
-/** small front for pthread init func, NULL is default attrs. */
-#define lock_basic_init(lock) LOCKRET(pthread_mutex_init(lock, NULL))
-#define lock_basic_destroy(lock) LOCKRET(pthread_mutex_destroy(lock))
-#define lock_basic_lock(lock) LOCKRET(pthread_mutex_lock(lock))
-#define lock_basic_unlock(lock) LOCKRET(pthread_mutex_unlock(lock))
-
-#ifndef HAVE_PTHREAD_RWLOCK_T
-/** in case rwlocks are not supported, use a mutex. */
-typedef pthread_mutex_t lock_rw_type;
-#define lock_rw_init(lock) LOCKRET(pthread_mutex_init(lock, NULL))
-#define lock_rw_destroy(lock) LOCKRET(pthread_mutex_destroy(lock))
-#define lock_rw_rdlock(lock) LOCKRET(pthread_mutex_lock(lock))
-#define lock_rw_wrlock(lock) LOCKRET(pthread_mutex_lock(lock))
-#define lock_rw_unlock(lock) LOCKRET(pthread_mutex_unlock(lock))
-#else /* HAVE_PTHREAD_RWLOCK_T */
-/** we use the pthread rwlock */
-typedef pthread_rwlock_t lock_rw_type;
-/** small front for pthread init func, NULL is default attrs. */
-#define lock_rw_init(lock) LOCKRET(pthread_rwlock_init(lock, NULL))
-#define lock_rw_destroy(lock) LOCKRET(pthread_rwlock_destroy(lock))
-#define lock_rw_rdlock(lock) LOCKRET(pthread_rwlock_rdlock(lock))
-#define lock_rw_wrlock(lock) LOCKRET(pthread_rwlock_wrlock(lock))
-#define lock_rw_unlock(lock) LOCKRET(pthread_rwlock_unlock(lock))
-#endif /* HAVE_PTHREAD_RWLOCK_T */
-
-#ifndef HAVE_PTHREAD_SPINLOCK_T
-/** in case spinlocks are not supported, use a mutex. */
-typedef pthread_mutex_t lock_quick_type;
-/** small front for pthread init func, NULL is default attrs. */
-#define lock_quick_init(lock) LOCKRET(pthread_mutex_init(lock, NULL))
-#define lock_quick_destroy(lock) LOCKRET(pthread_mutex_destroy(lock))
-#define lock_quick_lock(lock) LOCKRET(pthread_mutex_lock(lock))
-#define lock_quick_unlock(lock) LOCKRET(pthread_mutex_unlock(lock))
-
-#else /* HAVE_PTHREAD_SPINLOCK_T */
-/** use pthread spinlock for the quick lock */
-typedef pthread_spinlock_t lock_quick_type;
-/**
- * allocate process private since this is available whether
- * Thread Process-Shared Synchronization is supported or not.
- * This means only threads inside this process may access the lock.
- * (not threads from another process that shares memory).
- * spinlocks are not supported on all pthread platforms.
- */
-#define lock_quick_init(lock) LOCKRET(pthread_spin_init(lock, PTHREAD_PROCESS_PRIVATE))
-#define lock_quick_destroy(lock) LOCKRET(pthread_spin_destroy(lock))
-#define lock_quick_lock(lock) LOCKRET(pthread_spin_lock(lock))
-#define lock_quick_unlock(lock) LOCKRET(pthread_spin_unlock(lock))
-
-#endif /* HAVE SPINLOCK */
-
-/** Thread creation */
-typedef pthread_t ub_thread_type;
-/** On alpine linux default thread stack size is 80 Kb. See
-http://wiki.musl-libc.org/wiki/Functional_differences_from_glibc#Thread_stack_size
-This is not enough and cause segfault. Other linux distros have 2 Mb at least.
-Wrapper for set up thread stack size */
-#define PTHREADSTACKSIZE 2*1024*1024
-#define PTHREADCREATE(thr, stackrequired, func, arg) do {\
- pthread_attr_t attr; \
- size_t stacksize; \
- LOCKRET(pthread_attr_init(&attr)); \
- LOCKRET(pthread_attr_getstacksize(&attr, &stacksize)); \
- if (stacksize < stackrequired) { \
- LOCKRET(pthread_attr_setstacksize(&attr, stackrequired)); \
- LOCKRET(pthread_create(thr, &attr, func, arg)); \
- LOCKRET(pthread_attr_getstacksize(&attr, &stacksize)); \
- verbose(VERB_ALGO, "Thread stack size set to %u", (unsigned)stacksize); \
- } else {LOCKRET(pthread_create(thr, NULL, func, arg));} \
- } while(0)
-/** Use wrapper for set thread stack size on attributes. */
-#define ub_thread_create(thr, func, arg) PTHREADCREATE(thr, PTHREADSTACKSIZE, func, arg)
-/** get self id. */
-#define ub_thread_self() pthread_self()
-/** wait for another thread to terminate */
-#define ub_thread_join(thread) LOCKRET(pthread_join(thread, NULL))
-typedef pthread_key_t ub_thread_key_type;
-#define ub_thread_key_create(key, f) LOCKRET(pthread_key_create(key, f))
-#define ub_thread_key_set(key, v) LOCKRET(pthread_setspecific(key, v))
-#define ub_thread_key_get(key) pthread_getspecific(key)
-
-#else /* we do not HAVE_PTHREAD */
-#ifdef HAVE_SOLARIS_THREADS
-
-/******************* SOLARIS THREADS ************************/
-#include <synch.h>
-#include <thread.h>
-
-typedef rwlock_t lock_rw_type;
-#define lock_rw_init(lock) LOCKRET(rwlock_init(lock, USYNC_THREAD, NULL))
-#define lock_rw_destroy(lock) LOCKRET(rwlock_destroy(lock))
-#define lock_rw_rdlock(lock) LOCKRET(rw_rdlock(lock))
-#define lock_rw_wrlock(lock) LOCKRET(rw_wrlock(lock))
-#define lock_rw_unlock(lock) LOCKRET(rw_unlock(lock))
-
-/** use basic mutex */
-typedef mutex_t lock_basic_type;
-#define lock_basic_init(lock) LOCKRET(mutex_init(lock, USYNC_THREAD, NULL))
-#define lock_basic_destroy(lock) LOCKRET(mutex_destroy(lock))
-#define lock_basic_lock(lock) LOCKRET(mutex_lock(lock))
-#define lock_basic_unlock(lock) LOCKRET(mutex_unlock(lock))
-
-/** No spinlocks in solaris threads API. Use a mutex. */
-typedef mutex_t lock_quick_type;
-#define lock_quick_init(lock) LOCKRET(mutex_init(lock, USYNC_THREAD, NULL))
-#define lock_quick_destroy(lock) LOCKRET(mutex_destroy(lock))
-#define lock_quick_lock(lock) LOCKRET(mutex_lock(lock))
-#define lock_quick_unlock(lock) LOCKRET(mutex_unlock(lock))
-
-/** Thread creation, create a default thread. */
-typedef thread_t ub_thread_type;
-#define ub_thread_create(thr, func, arg) LOCKRET(thr_create(NULL, NULL, func, arg, NULL, thr))
-#define ub_thread_self() thr_self()
-#define ub_thread_join(thread) LOCKRET(thr_join(thread, NULL, NULL))
-typedef thread_key_t ub_thread_key_type;
-#define ub_thread_key_create(key, f) LOCKRET(thr_keycreate(key, f))
-#define ub_thread_key_set(key, v) LOCKRET(thr_setspecific(key, v))
-void* ub_thread_key_get(ub_thread_key_type key);
-
-
-#else /* we do not HAVE_SOLARIS_THREADS and no PTHREADS */
-/******************* WINDOWS THREADS ************************/
-#ifdef HAVE_WINDOWS_THREADS
-#include <windows.h>
-
-/* Use a mutex */
-typedef LONG lock_rw_type;
-#define lock_rw_init(lock) lock_basic_init(lock)
-#define lock_rw_destroy(lock) lock_basic_destroy(lock)
-#define lock_rw_rdlock(lock) lock_basic_lock(lock)
-#define lock_rw_wrlock(lock) lock_basic_lock(lock)
-#define lock_rw_unlock(lock) lock_basic_unlock(lock)
-
-/** the basic lock is a mutex, implemented opaquely, for error handling. */
-typedef LONG lock_basic_type;
-void lock_basic_init(lock_basic_type* lock);
-void lock_basic_destroy(lock_basic_type* lock);
-void lock_basic_lock(lock_basic_type* lock);
-void lock_basic_unlock(lock_basic_type* lock);
-
-/** on windows no spinlock, use mutex too. */
-typedef LONG lock_quick_type;
-#define lock_quick_init(lock) lock_basic_init(lock)
-#define lock_quick_destroy(lock) lock_basic_destroy(lock)
-#define lock_quick_lock(lock) lock_basic_lock(lock)
-#define lock_quick_unlock(lock) lock_basic_unlock(lock)
-
-/** Thread creation, create a default thread. */
-typedef HANDLE ub_thread_type;
-void ub_thread_create(ub_thread_type* thr, void* (*func)(void*), void* arg);
-ub_thread_type ub_thread_self(void);
-void ub_thread_join(ub_thread_type thr);
-typedef DWORD ub_thread_key_type;
-void ub_thread_key_create(ub_thread_key_type* key, void* f);
-void ub_thread_key_set(ub_thread_key_type key, void* v);
-void* ub_thread_key_get(ub_thread_key_type key);
-
-#else /* we do not HAVE_SOLARIS_THREADS, PTHREADS or WINDOWS_THREADS */
-
-/******************* NO THREADS ************************/
-#define THREADS_DISABLED 1
-/** In case there is no thread support, define locks to do nothing */
-typedef int lock_rw_type;
-#define lock_rw_init(lock) /* nop */
-#define lock_rw_destroy(lock) /* nop */
-#define lock_rw_rdlock(lock) /* nop */
-#define lock_rw_wrlock(lock) /* nop */
-#define lock_rw_unlock(lock) /* nop */
-
-/** define locks to do nothing */
-typedef int lock_basic_type;
-#define lock_basic_init(lock) /* nop */
-#define lock_basic_destroy(lock) /* nop */
-#define lock_basic_lock(lock) /* nop */
-#define lock_basic_unlock(lock) /* nop */
-
-/** define locks to do nothing */
-typedef int lock_quick_type;
-#define lock_quick_init(lock) /* nop */
-#define lock_quick_destroy(lock) /* nop */
-#define lock_quick_lock(lock) /* nop */
-#define lock_quick_unlock(lock) /* nop */
-
-/** Thread creation, threads do not exist */
-typedef pid_t ub_thread_type;
-/** ub_thread_create is simulated with fork (extremely heavy threads,
- * with no shared memory). */
-#define ub_thread_create(thr, func, arg) \
- ub_thr_fork_create(thr, func, arg)
-#define ub_thread_self() getpid()
-#define ub_thread_join(thread) ub_thr_fork_wait(thread)
-void ub_thr_fork_wait(ub_thread_type thread);
-void ub_thr_fork_create(ub_thread_type* thr, void* (*func)(void*), void* arg);
-typedef void* ub_thread_key_type;
-#define ub_thread_key_create(key, f) (*(key)) = NULL
-#define ub_thread_key_set(key, v) (key) = (v)
-#define ub_thread_key_get(key) (key)
-
-#endif /* HAVE_WINDOWS_THREADS */
-#endif /* HAVE_SOLARIS_THREADS */
-#endif /* HAVE_PTHREAD */
-#endif /* USE_THREAD_DEBUG */
-
-/**
- * Block all signals for this thread.
- * fatal exit on error.
- */
-void ub_thread_blocksigs(void);
-
-/**
- * unblock one signal for this thread.
- */
-void ub_thread_sig_unblock(int sig);
-
-#endif /* UTIL_LOCKS_H */
diff --git a/external/unbound/util/log.c b/external/unbound/util/log.c
deleted file mode 100644
index 439541a7c..000000000
--- a/external/unbound/util/log.c
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * util/log.c - implementation of the log code
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * \file
- * Implementation of log.h.
- */
-
-#include "config.h"
-#include "util/log.h"
-#include "util/locks.h"
-#include "sldns/sbuffer.h"
-#include <stdarg.h>
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-#ifdef HAVE_SYSLOG_H
-# include <syslog.h>
-#else
-/**define LOG_ constants */
-# define LOG_CRIT 2
-# define LOG_ERR 3
-# define LOG_WARNING 4
-# define LOG_NOTICE 5
-# define LOG_INFO 6
-# define LOG_DEBUG 7
-#endif
-#ifdef UB_ON_WINDOWS
-# include "winrc/win_svc.h"
-#endif
-
-/* default verbosity */
-enum verbosity_value verbosity = 0;
-/** the file logged to. */
-static FILE* logfile = 0;
-/** if key has been created */
-static int key_created = 0;
-/** pthread key for thread ids in logfile */
-static ub_thread_key_type logkey;
-#ifndef THREADS_DISABLED
-/** pthread mutex to protect FILE* */
-static lock_quick_type log_lock;
-#endif
-/** the identity of this executable/process */
-static const char* ident="unbound";
-#if defined(HAVE_SYSLOG_H) || defined(UB_ON_WINDOWS)
-/** are we using syslog(3) to log to */
-static int logging_to_syslog = 0;
-#endif /* HAVE_SYSLOG_H */
-/** time to print in log, if NULL, use time(2) */
-static time_t* log_now = NULL;
-/** print time in UTC or in secondsfrom1970 */
-static int log_time_asc = 0;
-
-void
-log_init(const char* filename, int use_syslog, const char* chrootdir)
-{
- FILE *f;
- if(!key_created) {
- key_created = 1;
- ub_thread_key_create(&logkey, NULL);
- lock_quick_init(&log_lock);
- }
- lock_quick_lock(&log_lock);
- if(logfile
-#if defined(HAVE_SYSLOG_H) || defined(UB_ON_WINDOWS)
- || logging_to_syslog
-#endif
- ) {
- lock_quick_unlock(&log_lock); /* verbose() needs the lock */
- verbose(VERB_QUERY, "switching log to %s",
- use_syslog?"syslog":(filename&&filename[0]?filename:"stderr"));
- lock_quick_lock(&log_lock);
- }
- if(logfile && logfile != stderr)
- fclose(logfile);
-#ifdef HAVE_SYSLOG_H
- if(logging_to_syslog) {
- closelog();
- logging_to_syslog = 0;
- }
- if(use_syslog) {
- /* do not delay opening until first write, because we may
- * chroot and no longer be able to access dev/log and so on */
- openlog(ident, LOG_NDELAY, LOG_DAEMON);
- logging_to_syslog = 1;
- lock_quick_unlock(&log_lock);
- return;
- }
-#elif defined(UB_ON_WINDOWS)
- if(logging_to_syslog) {
- logging_to_syslog = 0;
- }
- if(use_syslog) {
- logging_to_syslog = 1;
- lock_quick_unlock(&log_lock);
- return;
- }
-#endif /* HAVE_SYSLOG_H */
- if(!filename || !filename[0]) {
- logfile = stderr;
- lock_quick_unlock(&log_lock);
- return;
- }
- /* open the file for logging */
- if(chrootdir && chrootdir[0] && strncmp(filename, chrootdir,
- strlen(chrootdir)) == 0)
- filename += strlen(chrootdir);
- f = fopen(filename, "a");
- if(!f) {
- lock_quick_unlock(&log_lock);
- log_err("Could not open logfile %s: %s", filename,
- strerror(errno));
- return;
- }
-#ifndef UB_ON_WINDOWS
- /* line buffering does not work on windows */
- setvbuf(f, NULL, (int)_IOLBF, 0);
-#endif
- logfile = f;
- lock_quick_unlock(&log_lock);
-}
-
-void log_file(FILE *f)
-{
- lock_quick_lock(&log_lock);
- logfile = f;
- lock_quick_unlock(&log_lock);
-}
-
-void log_thread_set(int* num)
-{
- ub_thread_key_set(logkey, num);
-}
-
-int log_thread_get(void)
-{
- unsigned int* tid;
- if(!key_created) return 0;
- tid = (unsigned int*)ub_thread_key_get(logkey);
- return (int)(tid?*tid:0);
-}
-
-void log_ident_set(const char* id)
-{
- ident = id;
-}
-
-void log_set_time(time_t* t)
-{
- log_now = t;
-}
-
-void log_set_time_asc(int use_asc)
-{
- log_time_asc = use_asc;
-}
-
-void
-log_vmsg(int pri, const char* type,
- const char *format, va_list args)
-{
- char message[MAXSYSLOGMSGLEN];
- unsigned int* tid = (unsigned int*)ub_thread_key_get(logkey);
- time_t now;
-#if defined(HAVE_STRFTIME) && defined(HAVE_LOCALTIME_R)
- char tmbuf[32];
- struct tm tm;
-#elif defined(UB_ON_WINDOWS)
- char tmbuf[128], dtbuf[128];
-#endif
- (void)pri;
- vsnprintf(message, sizeof(message), format, args);
-#ifdef HAVE_SYSLOG_H
- if(logging_to_syslog) {
- syslog(pri, "[%d:%x] %s: %s",
- (int)getpid(), tid?*tid:0, type, message);
- return;
- }
-#elif defined(UB_ON_WINDOWS)
- if(logging_to_syslog) {
- char m[32768];
- HANDLE* s;
- LPCTSTR str = m;
- DWORD tp = MSG_GENERIC_ERR;
- WORD wt = EVENTLOG_ERROR_TYPE;
- if(strcmp(type, "info") == 0) {
- tp=MSG_GENERIC_INFO;
- wt=EVENTLOG_INFORMATION_TYPE;
- } else if(strcmp(type, "warning") == 0) {
- tp=MSG_GENERIC_WARN;
- wt=EVENTLOG_WARNING_TYPE;
- } else if(strcmp(type, "notice") == 0
- || strcmp(type, "debug") == 0) {
- tp=MSG_GENERIC_SUCCESS;
- wt=EVENTLOG_SUCCESS;
- }
- snprintf(m, sizeof(m), "[%s:%x] %s: %s",
- ident, tid?*tid:0, type, message);
- s = RegisterEventSource(NULL, SERVICE_NAME);
- if(!s) return;
- ReportEvent(s, wt, 0, tp, NULL, 1, 0, &str, NULL);
- DeregisterEventSource(s);
- return;
- }
-#endif /* HAVE_SYSLOG_H */
- lock_quick_lock(&log_lock);
- if(!logfile) {
- lock_quick_unlock(&log_lock);
- return;
- }
- if(log_now)
- now = (time_t)*log_now;
- else now = (time_t)time(NULL);
-#if defined(HAVE_STRFTIME) && defined(HAVE_LOCALTIME_R)
- if(log_time_asc && strftime(tmbuf, sizeof(tmbuf), "%b %d %H:%M:%S",
- localtime_r(&now, &tm))%(sizeof(tmbuf)) != 0) {
- /* %sizeof buf!=0 because old strftime returned max on error */
- fprintf(logfile, "%s %s[%d:%x] %s: %s\n", tmbuf,
- ident, (int)getpid(), tid?*tid:0, type, message);
- } else
-#elif defined(UB_ON_WINDOWS)
- if(log_time_asc && GetTimeFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL,
- tmbuf, sizeof(tmbuf)) && GetDateFormat(LOCALE_USER_DEFAULT, 0,
- NULL, NULL, dtbuf, sizeof(dtbuf))) {
- fprintf(logfile, "%s %s %s[%d:%x] %s: %s\n", dtbuf, tmbuf,
- ident, (int)getpid(), tid?*tid:0, type, message);
- } else
-#endif
- fprintf(logfile, "[" ARG_LL "d] %s[%d:%x] %s: %s\n", (long long)now,
- ident, (int)getpid(), tid?*tid:0, type, message);
-#ifdef UB_ON_WINDOWS
- /* line buffering does not work on windows */
- fflush(logfile);
-#endif
- lock_quick_unlock(&log_lock);
-}
-
-/**
- * implementation of log_info
- * @param format: format string printf-style.
- */
-void
-log_info(const char *format, ...)
-{
- va_list args;
- va_start(args, format);
- log_vmsg(LOG_INFO, "info", format, args);
- va_end(args);
-}
-
-/**
- * implementation of log_err
- * @param format: format string printf-style.
- */
-void
-log_err(const char *format, ...)
-{
- va_list args;
- va_start(args, format);
- log_vmsg(LOG_ERR, "error", format, args);
- va_end(args);
-}
-
-/**
- * implementation of log_warn
- * @param format: format string printf-style.
- */
-void
-log_warn(const char *format, ...)
-{
- va_list args;
- va_start(args, format);
- log_vmsg(LOG_WARNING, "warning", format, args);
- va_end(args);
-}
-
-/**
- * implementation of fatal_exit
- * @param format: format string printf-style.
- */
-void
-fatal_exit(const char *format, ...)
-{
- va_list args;
- va_start(args, format);
- log_vmsg(LOG_CRIT, "fatal error", format, args);
- va_end(args);
- exit(1);
-}
-
-/**
- * implementation of verbose
- * @param level: verbose level for the message.
- * @param format: format string printf-style.
- */
-void
-verbose(enum verbosity_value level, const char* format, ...)
-{
- va_list args;
- va_start(args, format);
- if(verbosity >= level) {
- if(level == VERB_OPS)
- log_vmsg(LOG_NOTICE, "notice", format, args);
- else if(level == VERB_DETAIL)
- log_vmsg(LOG_INFO, "info", format, args);
- else log_vmsg(LOG_DEBUG, "debug", format, args);
- }
- va_end(args);
-}
-
-/** log hex data */
-static void
-log_hex_f(enum verbosity_value v, const char* msg, void* data, size_t length)
-{
- size_t i, j;
- uint8_t* data8 = (uint8_t*)data;
- const char* hexchar = "0123456789ABCDEF";
- char buf[1024+1]; /* alloc blocksize hex chars + \0 */
- const size_t blocksize = 512;
- size_t len;
-
- if(length == 0) {
- verbose(v, "%s[%u]", msg, (unsigned)length);
- return;
- }
-
- for(i=0; i<length; i+=blocksize/2) {
- len = blocksize/2;
- if(length - i < blocksize/2)
- len = length - i;
- for(j=0; j<len; j++) {
- buf[j*2] = hexchar[ data8[i+j] >> 4 ];
- buf[j*2 + 1] = hexchar[ data8[i+j] & 0xF ];
- }
- buf[len*2] = 0;
- verbose(v, "%s[%u:%u] %.*s", msg, (unsigned)length,
- (unsigned)i, (int)len*2, buf);
- }
-}
-
-void
-log_hex(const char* msg, void* data, size_t length)
-{
- log_hex_f(verbosity, msg, data, length);
-}
-
-void log_buf(enum verbosity_value level, const char* msg, sldns_buffer* buf)
-{
- if(verbosity < level)
- return;
- log_hex_f(level, msg, sldns_buffer_begin(buf), sldns_buffer_limit(buf));
-}
-
-#ifdef USE_WINSOCK
-char* wsa_strerror(DWORD err)
-{
- static char unknown[32];
-
- switch(err) {
- case WSA_INVALID_HANDLE: return "Specified event object handle is invalid.";
- case WSA_NOT_ENOUGH_MEMORY: return "Insufficient memory available.";
- case WSA_INVALID_PARAMETER: return "One or more parameters are invalid.";
- case WSA_OPERATION_ABORTED: return "Overlapped operation aborted.";
- case WSA_IO_INCOMPLETE: return "Overlapped I/O event object not in signaled state.";
- case WSA_IO_PENDING: return "Overlapped operations will complete later.";
- case WSAEINTR: return "Interrupted function call.";
- case WSAEBADF: return "File handle is not valid.";
- case WSAEACCES: return "Permission denied.";
- case WSAEFAULT: return "Bad address.";
- case WSAEINVAL: return "Invalid argument.";
- case WSAEMFILE: return "Too many open files.";
- case WSAEWOULDBLOCK: return "Resource temporarily unavailable.";
- case WSAEINPROGRESS: return "Operation now in progress.";
- case WSAEALREADY: return "Operation already in progress.";
- case WSAENOTSOCK: return "Socket operation on nonsocket.";
- case WSAEDESTADDRREQ: return "Destination address required.";
- case WSAEMSGSIZE: return "Message too long.";
- case WSAEPROTOTYPE: return "Protocol wrong type for socket.";
- case WSAENOPROTOOPT: return "Bad protocol option.";
- case WSAEPROTONOSUPPORT: return "Protocol not supported.";
- case WSAESOCKTNOSUPPORT: return "Socket type not supported.";
- case WSAEOPNOTSUPP: return "Operation not supported.";
- case WSAEPFNOSUPPORT: return "Protocol family not supported.";
- case WSAEAFNOSUPPORT: return "Address family not supported by protocol family.";
- case WSAEADDRINUSE: return "Address already in use.";
- case WSAEADDRNOTAVAIL: return "Cannot assign requested address.";
- case WSAENETDOWN: return "Network is down.";
- case WSAENETUNREACH: return "Network is unreachable.";
- case WSAENETRESET: return "Network dropped connection on reset.";
- case WSAECONNABORTED: return "Software caused connection abort.";
- case WSAECONNRESET: return "Connection reset by peer.";
- case WSAENOBUFS: return "No buffer space available.";
- case WSAEISCONN: return "Socket is already connected.";
- case WSAENOTCONN: return "Socket is not connected.";
- case WSAESHUTDOWN: return "Cannot send after socket shutdown.";
- case WSAETOOMANYREFS: return "Too many references.";
- case WSAETIMEDOUT: return "Connection timed out.";
- case WSAECONNREFUSED: return "Connection refused.";
- case WSAELOOP: return "Cannot translate name.";
- case WSAENAMETOOLONG: return "Name too long.";
- case WSAEHOSTDOWN: return "Host is down.";
- case WSAEHOSTUNREACH: return "No route to host.";
- case WSAENOTEMPTY: return "Directory not empty.";
- case WSAEPROCLIM: return "Too many processes.";
- case WSAEUSERS: return "User quota exceeded.";
- case WSAEDQUOT: return "Disk quota exceeded.";
- case WSAESTALE: return "Stale file handle reference.";
- case WSAEREMOTE: return "Item is remote.";
- case WSASYSNOTREADY: return "Network subsystem is unavailable.";
- case WSAVERNOTSUPPORTED: return "Winsock.dll version out of range.";
- case WSANOTINITIALISED: return "Successful WSAStartup not yet performed.";
- case WSAEDISCON: return "Graceful shutdown in progress.";
- case WSAENOMORE: return "No more results.";
- case WSAECANCELLED: return "Call has been canceled.";
- case WSAEINVALIDPROCTABLE: return "Procedure call table is invalid.";
- case WSAEINVALIDPROVIDER: return "Service provider is invalid.";
- case WSAEPROVIDERFAILEDINIT: return "Service provider failed to initialize.";
- case WSASYSCALLFAILURE: return "System call failure.";
- case WSASERVICE_NOT_FOUND: return "Service not found.";
- case WSATYPE_NOT_FOUND: return "Class type not found.";
- case WSA_E_NO_MORE: return "No more results.";
- case WSA_E_CANCELLED: return "Call was canceled.";
- case WSAEREFUSED: return "Database query was refused.";
- case WSAHOST_NOT_FOUND: return "Host not found.";
- case WSATRY_AGAIN: return "Nonauthoritative host not found.";
- case WSANO_RECOVERY: return "This is a nonrecoverable error.";
- case WSANO_DATA: return "Valid name, no data record of requested type.";
- case WSA_QOS_RECEIVERS: return "QOS receivers.";
- case WSA_QOS_SENDERS: return "QOS senders.";
- case WSA_QOS_NO_SENDERS: return "No QOS senders.";
- case WSA_QOS_NO_RECEIVERS: return "QOS no receivers.";
- case WSA_QOS_REQUEST_CONFIRMED: return "QOS request confirmed.";
- case WSA_QOS_ADMISSION_FAILURE: return "QOS admission error.";
- case WSA_QOS_POLICY_FAILURE: return "QOS policy failure.";
- case WSA_QOS_BAD_STYLE: return "QOS bad style.";
- case WSA_QOS_BAD_OBJECT: return "QOS bad object.";
- case WSA_QOS_TRAFFIC_CTRL_ERROR: return "QOS traffic control error.";
- case WSA_QOS_GENERIC_ERROR: return "QOS generic error.";
- case WSA_QOS_ESERVICETYPE: return "QOS service type error.";
- case WSA_QOS_EFLOWSPEC: return "QOS flowspec error.";
- case WSA_QOS_EPROVSPECBUF: return "Invalid QOS provider buffer.";
- case WSA_QOS_EFILTERSTYLE: return "Invalid QOS filter style.";
- case WSA_QOS_EFILTERTYPE: return "Invalid QOS filter type.";
- case WSA_QOS_EFILTERCOUNT: return "Incorrect QOS filter count.";
- case WSA_QOS_EOBJLENGTH: return "Invalid QOS object length.";
- case WSA_QOS_EFLOWCOUNT: return "Incorrect QOS flow count.";
- /*case WSA_QOS_EUNKOWNPSOBJ: return "Unrecognized QOS object.";*/
- case WSA_QOS_EPOLICYOBJ: return "Invalid QOS policy object.";
- case WSA_QOS_EFLOWDESC: return "Invalid QOS flow descriptor.";
- case WSA_QOS_EPSFLOWSPEC: return "Invalid QOS provider-specific flowspec.";
- case WSA_QOS_EPSFILTERSPEC: return "Invalid QOS provider-specific filterspec.";
- case WSA_QOS_ESDMODEOBJ: return "Invalid QOS shape discard mode object.";
- case WSA_QOS_ESHAPERATEOBJ: return "Invalid QOS shaping rate object.";
- case WSA_QOS_RESERVED_PETYPE: return "Reserved policy QOS element type.";
- default:
- snprintf(unknown, sizeof(unknown),
- "unknown WSA error code %d", (int)err);
- return unknown;
- }
-}
-#endif /* USE_WINSOCK */
diff --git a/external/unbound/util/log.h b/external/unbound/util/log.h
deleted file mode 100644
index 8e85ee620..000000000
--- a/external/unbound/util/log.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * util/log.h - logging service
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains logging functions.
- */
-
-#ifndef UTIL_LOG_H
-#define UTIL_LOG_H
-struct sldns_buffer;
-
-/**
- * verbosity value:
- */
-enum verbosity_value {
- /** 0 - no verbose messages */
- NO_VERBOSE = 0,
- /** 1 - operational information */
- VERB_OPS,
- /** 2 - detailed information */
- VERB_DETAIL,
- /** 3 - query level information */
- VERB_QUERY,
- /** 4 - algorithm level information */
- VERB_ALGO,
- /** 5 - querier client information */
- VERB_CLIENT
-};
-
-/** The global verbosity setting */
-extern enum verbosity_value verbosity;
-
-/**
- * log a verbose message, pass the level for this message.
- * It has printf formatted arguments. No trailing newline is needed.
- * @param level: verbosity level for this message, compared to global
- * verbosity setting.
- * @param format: printf-style format string. Arguments follow.
- */
-void verbose(enum verbosity_value level,
- const char* format, ...) ATTR_FORMAT(printf, 2, 3);
-
-/**
- * call this to initialize logging services.
- * @param filename: if NULL stderr is used.
- * @param use_syslog: set to true to ignore filename and use syslog(3).
- * @param chrootdir: to which directory we have been chrooted, if any.
- */
-void log_init(const char* filename, int use_syslog, const char* chrootdir);
-
-/**
- * Set logging to go to the specified file *.
- * This setting does not affect the use_syslog setting.
- * @param f: to that file, or pass NULL to disable logging.
- */
-void log_file(FILE *f);
-
-/**
- * Init a thread (will print this number for the thread log entries).
- * Must be called from the thread itself. If not called 0 is printed.
- * @param num: number to print for this thread. Owned by caller, must
- * continue to exist.
- */
-void log_thread_set(int* num);
-
-/**
- * Get the thread id from logging system. Set after log_init is
- * initialised, or log_thread_set for newly created threads.
- * This initialisation happens in unbound as a daemon, in daemon
- * startup code, when that spawns threads.
- * @return thread number, from 0 and up. Before initialised, returns 0.
- */
-int log_thread_get(void);
-
-/**
- * Set identity to print, default is 'unbound'.
- * @param id: string to print. Name of executable.
- */
-void log_ident_set(const char* id);
-
-/**
- * Set the time value to print in log entries.
- * @param t: the point is copied and used to find the time.
- * if NULL, time(2) is used.
- */
-void log_set_time(time_t* t);
-
-/**
- * Set if the time value is printed ascii or decimal in log entries.
- * @param use_asc: if true, ascii is printed, otherwise decimal.
- * If the conversion fails or you have no time functions,
- * decimal is printed.
- */
-void log_set_time_asc(int use_asc);
-
-/**
- * Log informational message.
- * Pass printf formatted arguments. No trailing newline is needed.
- * @param format: printf-style format string. Arguments follow.
- */
-void log_info(const char* format, ...) ATTR_FORMAT(printf, 1, 2);
-
-/**
- * Log error message.
- * Pass printf formatted arguments. No trailing newline is needed.
- * @param format: printf-style format string. Arguments follow.
- */
-void log_err(const char* format, ...) ATTR_FORMAT(printf, 1, 2);
-
-/**
- * Log warning message.
- * Pass printf formatted arguments. No trailing newline is needed.
- * @param format: printf-style format string. Arguments follow.
- */
-void log_warn(const char* format, ...) ATTR_FORMAT(printf, 1, 2);
-
-/**
- * Log a hex-string to the log. Can be any length.
- * performs mallocs to do so, slow. But debug useful.
- * @param msg: string desc to accompany the hexdump.
- * @param data: data to dump in hex format.
- * @param length: length of data.
- */
-void log_hex(const char* msg, void* data, size_t length);
-
-/**
- * Easy alternative for log_hex, takes a sldns_buffer.
- * @param level: verbosity level for this message, compared to global
- * verbosity setting.
- * @param msg: string desc to print
- * @param buf: the buffer.
- */
-void log_buf(enum verbosity_value level, const char* msg, struct sldns_buffer* buf);
-
-/**
- * Log fatal error message, and exit the current process.
- * Pass printf formatted arguments. No trailing newline is needed.
- * @param format: printf-style format string. Arguments follow.
- */
-void fatal_exit(const char* format, ...) ATTR_FORMAT(printf, 1, 2);
-
-/**
- * va_list argument version of log_info.
- * @param pri: priority type, for example 5 (INFO).
- * @param type: string to designate type of message (info, error).
- * @param format: the printf style format to print. no newline.
- * @param args: arguments for format string.
- */
-void log_vmsg(int pri, const char* type, const char* format, va_list args);
-
-/**
- * an assertion that is thrown to the logfile.
- */
-#ifdef UNBOUND_DEBUG
-# define log_assert(x) \
- do { if(!(x)) \
- fatal_exit("%s:%d: %s: assertion %s failed", \
- __FILE__, __LINE__, __func__, #x); \
- } while(0);
-#else
-# define log_assert(x) /*nothing*/
-#endif
-
-#ifdef USE_WINSOCK
-/**
- * Convert WSA error into string.
- * @param err: from WSAGetLastError()
- * @return: string.
- */
-char* wsa_strerror(DWORD err);
-#endif /* USE_WINSOCK */
-
-#endif /* UTIL_LOG_H */
diff --git a/external/unbound/util/mini_event.c b/external/unbound/util/mini_event.c
deleted file mode 100644
index 14e9efe47..000000000
--- a/external/unbound/util/mini_event.c
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * mini_event.c - implementation of part of libevent api, portably.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-/**
- * \file
- * fake libevent implementation. Less broad in functionality, and only
- * supports select(2).
- */
-
-#include "config.h"
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-#include <sys/time.h>
-
-#if defined(USE_MINI_EVENT) && !defined(USE_WINSOCK)
-#include <signal.h>
-#include "util/mini_event.h"
-#include "util/fptr_wlist.h"
-
-/** compare events in tree, based on timevalue, ptr for uniqueness */
-int mini_ev_cmp(const void* a, const void* b)
-{
- const struct event *e = (const struct event*)a;
- const struct event *f = (const struct event*)b;
- if(e->ev_timeout.tv_sec < f->ev_timeout.tv_sec)
- return -1;
- if(e->ev_timeout.tv_sec > f->ev_timeout.tv_sec)
- return 1;
- if(e->ev_timeout.tv_usec < f->ev_timeout.tv_usec)
- return -1;
- if(e->ev_timeout.tv_usec > f->ev_timeout.tv_usec)
- return 1;
- if(e < f)
- return -1;
- if(e > f)
- return 1;
- return 0;
-}
-
-/** set time */
-static int
-settime(struct event_base* base)
-{
- if(gettimeofday(base->time_tv, NULL) < 0) {
- return -1;
- }
-#ifndef S_SPLINT_S
- *base->time_secs = (time_t)base->time_tv->tv_sec;
-#endif
- return 0;
-}
-
-/** create event base */
-void *event_init(time_t* time_secs, struct timeval* time_tv)
-{
- struct event_base* base = (struct event_base*)malloc(
- sizeof(struct event_base));
- if(!base)
- return NULL;
- memset(base, 0, sizeof(*base));
- base->time_secs = time_secs;
- base->time_tv = time_tv;
- if(settime(base) < 0) {
- event_base_free(base);
- return NULL;
- }
- base->times = rbtree_create(mini_ev_cmp);
- if(!base->times) {
- event_base_free(base);
- return NULL;
- }
- base->capfd = MAX_FDS;
-#ifdef FD_SETSIZE
- if((int)FD_SETSIZE < base->capfd)
- base->capfd = (int)FD_SETSIZE;
-#endif
- base->fds = (struct event**)calloc((size_t)base->capfd,
- sizeof(struct event*));
- if(!base->fds) {
- event_base_free(base);
- return NULL;
- }
- base->signals = (struct event**)calloc(MAX_SIG, sizeof(struct event*));
- if(!base->signals) {
- event_base_free(base);
- return NULL;
- }
-#ifndef S_SPLINT_S
- FD_ZERO(&base->reads);
- FD_ZERO(&base->writes);
-#endif
- return base;
-}
-
-/** get version */
-const char *event_get_version(void)
-{
- return "mini-event-"PACKAGE_VERSION;
-}
-
-/** get polling method, select */
-const char *event_get_method(void)
-{
- return "select";
-}
-
-/** call timeouts handlers, and return how long to wait for next one or -1 */
-static void handle_timeouts(struct event_base* base, struct timeval* now,
- struct timeval* wait)
-{
- struct event* p;
-#ifndef S_SPLINT_S
- wait->tv_sec = (time_t)-1;
-#endif
-
- while((rbnode_type*)(p = (struct event*)rbtree_first(base->times))
- !=RBTREE_NULL) {
-#ifndef S_SPLINT_S
- if(p->ev_timeout.tv_sec > now->tv_sec ||
- (p->ev_timeout.tv_sec==now->tv_sec &&
- p->ev_timeout.tv_usec > now->tv_usec)) {
- /* there is a next larger timeout. wait for it */
- wait->tv_sec = p->ev_timeout.tv_sec - now->tv_sec;
- if(now->tv_usec > p->ev_timeout.tv_usec) {
- wait->tv_sec--;
- wait->tv_usec = 1000000 - (now->tv_usec -
- p->ev_timeout.tv_usec);
- } else {
- wait->tv_usec = p->ev_timeout.tv_usec
- - now->tv_usec;
- }
- return;
- }
-#endif
- /* event times out, remove it */
- (void)rbtree_delete(base->times, p);
- p->ev_events &= ~EV_TIMEOUT;
- fptr_ok(fptr_whitelist_event(p->ev_callback));
- (*p->ev_callback)(p->ev_fd, EV_TIMEOUT, p->ev_arg);
- }
-}
-
-/** call select and callbacks for that */
-static int handle_select(struct event_base* base, struct timeval* wait)
-{
- fd_set r, w;
- int ret, i;
-
-#ifndef S_SPLINT_S
- if(wait->tv_sec==(time_t)-1)
- wait = NULL;
-#endif
- memmove(&r, &base->reads, sizeof(fd_set));
- memmove(&w, &base->writes, sizeof(fd_set));
- memmove(&base->ready, &base->content, sizeof(fd_set));
-
- if((ret = select(base->maxfd+1, &r, &w, NULL, wait)) == -1) {
- ret = errno;
- if(settime(base) < 0)
- return -1;
- errno = ret;
- if(ret == EAGAIN || ret == EINTR)
- return 0;
- return -1;
- }
- if(settime(base) < 0)
- return -1;
-
- for(i=0; i<base->maxfd+1; i++) {
- short bits = 0;
- if(!base->fds[i] || !(FD_ISSET(i, &base->ready))) {
- continue;
- }
- if(FD_ISSET(i, &r)) {
- bits |= EV_READ;
- ret--;
- }
- if(FD_ISSET(i, &w)) {
- bits |= EV_WRITE;
- ret--;
- }
- bits &= base->fds[i]->ev_events;
- if(bits) {
- fptr_ok(fptr_whitelist_event(
- base->fds[i]->ev_callback));
- (*base->fds[i]->ev_callback)(base->fds[i]->ev_fd,
- bits, base->fds[i]->ev_arg);
- if(ret==0)
- break;
- }
- }
- return 0;
-}
-
-/** run select in a loop */
-int event_base_dispatch(struct event_base* base)
-{
- struct timeval wait;
- if(settime(base) < 0)
- return -1;
- while(!base->need_to_exit)
- {
- /* see if timeouts need handling */
- handle_timeouts(base, base->time_tv, &wait);
- if(base->need_to_exit)
- return 0;
- /* do select */
- if(handle_select(base, &wait) < 0) {
- if(base->need_to_exit)
- return 0;
- return -1;
- }
- }
- return 0;
-}
-
-/** exit that loop */
-int event_base_loopexit(struct event_base* base,
- struct timeval* ATTR_UNUSED(tv))
-{
- base->need_to_exit = 1;
- return 0;
-}
-
-/* free event base, free events yourself */
-void event_base_free(struct event_base* base)
-{
- if(!base)
- return;
- free(base->times);
- free(base->fds);
- free(base->signals);
- free(base);
-}
-
-/** set content of event */
-void event_set(struct event* ev, int fd, short bits,
- void (*cb)(int, short, void *), void* arg)
-{
- ev->node.key = ev;
- ev->ev_fd = fd;
- ev->ev_events = bits;
- ev->ev_callback = cb;
- fptr_ok(fptr_whitelist_event(ev->ev_callback));
- ev->ev_arg = arg;
- ev->added = 0;
-}
-
-/* add event to a base */
-int event_base_set(struct event_base* base, struct event* ev)
-{
- ev->ev_base = base;
- ev->added = 0;
- return 0;
-}
-
-/* add event to make it active, you may not change it with event_set anymore */
-int event_add(struct event* ev, struct timeval* tv)
-{
- if(ev->added)
- event_del(ev);
- if(ev->ev_fd != -1 && ev->ev_fd >= ev->ev_base->capfd)
- return -1;
- if( (ev->ev_events&(EV_READ|EV_WRITE)) && ev->ev_fd != -1) {
- ev->ev_base->fds[ev->ev_fd] = ev;
- if(ev->ev_events&EV_READ) {
- FD_SET(FD_SET_T ev->ev_fd, &ev->ev_base->reads);
- }
- if(ev->ev_events&EV_WRITE) {
- FD_SET(FD_SET_T ev->ev_fd, &ev->ev_base->writes);
- }
- FD_SET(FD_SET_T ev->ev_fd, &ev->ev_base->content);
- FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->ready);
- if(ev->ev_fd > ev->ev_base->maxfd)
- ev->ev_base->maxfd = ev->ev_fd;
- }
- if(tv && (ev->ev_events&EV_TIMEOUT)) {
-#ifndef S_SPLINT_S
- struct timeval *now = ev->ev_base->time_tv;
- ev->ev_timeout.tv_sec = tv->tv_sec + now->tv_sec;
- ev->ev_timeout.tv_usec = tv->tv_usec + now->tv_usec;
- while(ev->ev_timeout.tv_usec > 1000000) {
- ev->ev_timeout.tv_usec -= 1000000;
- ev->ev_timeout.tv_sec++;
- }
-#endif
- (void)rbtree_insert(ev->ev_base->times, &ev->node);
- }
- ev->added = 1;
- return 0;
-}
-
-/* remove event, you may change it again */
-int event_del(struct event* ev)
-{
- if(ev->ev_fd != -1 && ev->ev_fd >= ev->ev_base->capfd)
- return -1;
- if((ev->ev_events&EV_TIMEOUT))
- (void)rbtree_delete(ev->ev_base->times, &ev->node);
- if((ev->ev_events&(EV_READ|EV_WRITE)) && ev->ev_fd != -1) {
- ev->ev_base->fds[ev->ev_fd] = NULL;
- FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->reads);
- FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->writes);
- FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->ready);
- FD_CLR(FD_SET_T ev->ev_fd, &ev->ev_base->content);
- }
- ev->added = 0;
- return 0;
-}
-
-/** which base gets to handle signals */
-static struct event_base* signal_base = NULL;
-/** signal handler */
-static RETSIGTYPE sigh(int sig)
-{
- struct event* ev;
- if(!signal_base || sig < 0 || sig >= MAX_SIG)
- return;
- ev = signal_base->signals[sig];
- if(!ev)
- return;
- fptr_ok(fptr_whitelist_event(ev->ev_callback));
- (*ev->ev_callback)(sig, EV_SIGNAL, ev->ev_arg);
-}
-
-/** install signal handler */
-int signal_add(struct event* ev, struct timeval* ATTR_UNUSED(tv))
-{
- if(ev->ev_fd == -1 || ev->ev_fd >= MAX_SIG)
- return -1;
- signal_base = ev->ev_base;
- ev->ev_base->signals[ev->ev_fd] = ev;
- ev->added = 1;
- if(signal(ev->ev_fd, sigh) == SIG_ERR) {
- return -1;
- }
- return 0;
-}
-
-/** remove signal handler */
-int signal_del(struct event* ev)
-{
- if(ev->ev_fd == -1 || ev->ev_fd >= MAX_SIG)
- return -1;
- ev->ev_base->signals[ev->ev_fd] = NULL;
- ev->added = 0;
- return 0;
-}
-
-#else /* USE_MINI_EVENT */
-#ifndef USE_WINSOCK
-int mini_ev_cmp(const void* ATTR_UNUSED(a), const void* ATTR_UNUSED(b))
-{
- return 0;
-}
-#endif /* not USE_WINSOCK */
-#endif /* USE_MINI_EVENT */
diff --git a/external/unbound/util/mini_event.h b/external/unbound/util/mini_event.h
deleted file mode 100644
index 204894d97..000000000
--- a/external/unbound/util/mini_event.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * mini-event.h - micro implementation of libevent api, using select() only.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- * This file implements part of the event(3) libevent api.
- * The back end is only select. Max number of fds is limited.
- * Max number of signals is limited, one handler per signal only.
- * And one handler per fd.
- *
- * Although limited to select() and a max (1024) open fds, it
- * is efficient:
- * o dispatch call caches fd_sets to use.
- * o handler calling takes time ~ to the number of fds.
- * o timeouts are stored in a redblack tree, sorted, so take log(n).
- * Timeouts are only accurate to the second (no subsecond accuracy).
- * To avoid cpu hogging, fractional timeouts are rounded up to a whole second.
- */
-
-#ifndef MINI_EVENT_H
-#define MINI_EVENT_H
-
-#if defined(USE_MINI_EVENT) && !defined(USE_WINSOCK)
-
-#ifndef HAVE_EVENT_BASE_FREE
-#define HAVE_EVENT_BASE_FREE
-#endif
-
-/* redefine to use our own namespace so that on platforms where
- * linkers crosslink library-private symbols with other symbols, it works */
-#define event_init minievent_init
-#define event_get_version minievent_get_version
-#define event_get_method minievent_get_method
-#define event_base_dispatch minievent_base_dispatch
-#define event_base_loopexit minievent_base_loopexit
-#define event_base_free minievent_base_free
-#define event_set minievent_set
-#define event_base_set minievent_base_set
-#define event_add minievent_add
-#define event_del minievent_del
-#define signal_add minisignal_add
-#define signal_del minisignal_del
-
-/** event timeout */
-#define EV_TIMEOUT 0x01
-/** event fd readable */
-#define EV_READ 0x02
-/** event fd writable */
-#define EV_WRITE 0x04
-/** event signal */
-#define EV_SIGNAL 0x08
-/** event must persist */
-#define EV_PERSIST 0x10
-
-/* needs our redblack tree */
-#include "rbtree.h"
-
-/** max number of file descriptors to support */
-#define MAX_FDS 1024
-/** max number of signals to support */
-#define MAX_SIG 32
-
-/** event base */
-struct event_base
-{
- /** sorted by timeout (absolute), ptr */
- rbtree_type* times;
- /** array of 0 - maxfd of ptr to event for it */
- struct event** fds;
- /** max fd in use */
- int maxfd;
- /** capacity - size of the fds array */
- int capfd;
- /* fdset for read write, for fds ready, and added */
- fd_set
- /** fds for reading */
- reads,
- /** fds for writing */
- writes,
- /** fds determined ready for use */
- ready,
- /** ready plus newly added events. */
- content;
- /** array of 0 - maxsig of ptr to event for it */
- struct event** signals;
- /** if we need to exit */
- int need_to_exit;
- /** where to store time in seconds */
- time_t* time_secs;
- /** where to store time in microseconds */
- struct timeval* time_tv;
-};
-
-/**
- * Event structure. Has some of the event elements.
- */
-struct event {
- /** node in timeout rbtree */
- rbnode_type node;
- /** is event already added */
- int added;
-
- /** event base it belongs to */
- struct event_base *ev_base;
- /** fd to poll or -1 for timeouts. signal number for sigs. */
- int ev_fd;
- /** what events this event is interested in, see EV_.. above. */
- short ev_events;
- /** timeout value */
- struct timeval ev_timeout;
-
- /** callback to call: fd, eventbits, userarg */
- void (*ev_callback)(int, short, void *arg);
- /** callback user arg */
- void *ev_arg;
-};
-
-/* function prototypes (some are as they appear in event.h) */
-/** create event base */
-void *event_init(time_t* time_secs, struct timeval* time_tv);
-/** get version */
-const char *event_get_version(void);
-/** get polling method, select */
-const char *event_get_method(void);
-/** run select in a loop */
-int event_base_dispatch(struct event_base *);
-/** exit that loop */
-int event_base_loopexit(struct event_base *, struct timeval *);
-/** free event base. Free events yourself */
-void event_base_free(struct event_base *);
-/** set content of event */
-void event_set(struct event *, int, short, void (*)(int, short, void *), void *);
-/** add event to a base. You *must* call this for every event. */
-int event_base_set(struct event_base *, struct event *);
-/** add event to make it active. You may not change it with event_set anymore */
-int event_add(struct event *, struct timeval *);
-/** remove event. You may change it again */
-int event_del(struct event *);
-
-/** add a timer */
-#define evtimer_add(ev, tv) event_add(ev, tv)
-/** remove a timer */
-#define evtimer_del(ev) event_del(ev)
-
-/* uses different implementation. Cannot mix fd/timeouts and signals inside
- * the same struct event. create several event structs for that. */
-/** install signal handler */
-int signal_add(struct event *, struct timeval *);
-/** set signal event contents */
-#define signal_set(ev, x, cb, arg) \
- event_set(ev, x, EV_SIGNAL|EV_PERSIST, cb, arg)
-/** remove signal handler */
-int signal_del(struct event *);
-
-#endif /* USE_MINI_EVENT and not USE_WINSOCK */
-
-/** compare events in tree, based on timevalue, ptr for uniqueness */
-int mini_ev_cmp(const void* a, const void* b);
-
-#endif /* MINI_EVENT_H */
diff --git a/external/unbound/util/module.c b/external/unbound/util/module.c
deleted file mode 100644
index f4b715d14..000000000
--- a/external/unbound/util/module.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * util/module.c - module interface
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * \file
- * Implementation of module.h.
- */
-
-#include "config.h"
-#include "util/module.h"
-#include "sldns/wire2str.h"
-
-const char*
-strextstate(enum module_ext_state s)
-{
- switch(s) {
- case module_state_initial: return "module_state_initial";
- case module_wait_reply: return "module_wait_reply";
- case module_wait_module: return "module_wait_module";
- case module_restart_next: return "module_restart_next";
- case module_wait_subquery: return "module_wait_subquery";
- case module_error: return "module_error";
- case module_finished: return "module_finished";
- }
- return "bad_extstate_value";
-}
-
-const char*
-strmodulevent(enum module_ev e)
-{
- switch(e) {
- case module_event_new: return "module_event_new";
- case module_event_pass: return "module_event_pass";
- case module_event_reply: return "module_event_reply";
- case module_event_noreply: return "module_event_noreply";
- case module_event_capsfail: return "module_event_capsfail";
- case module_event_moddone: return "module_event_moddone";
- case module_event_error: return "module_event_error";
- }
- return "bad_event_value";
-}
-
-int
-edns_known_options_init(struct module_env* env)
-{
- env->edns_known_options_num = 0;
- env->edns_known_options = (struct edns_known_option*)calloc(
- MAX_KNOWN_EDNS_OPTS, sizeof(struct edns_known_option));
- if(!env->edns_known_options) return 0;
- return 1;
-}
-
-void
-edns_known_options_delete(struct module_env* env)
-{
- free(env->edns_known_options);
- env->edns_known_options = NULL;
- env->edns_known_options_num = 0;
-}
-
-int
-edns_register_option(uint16_t opt_code, int bypass_cache_stage,
- int no_aggregation, struct module_env* env)
-{
- size_t i;
- if(env->worker) {
- log_err("invalid edns registration: "
- "trying to register option after module init phase");
- return 0;
- }
-
- /**
- * Checking if we are full first is faster but it does not provide
- * the option to change the flags when the array is full.
- * It only impacts unbound initialization, leave it for now.
- */
- /* Check if the option is already registered. */
- for(i=0; i<env->edns_known_options_num; i++)
- if(env->edns_known_options[i].opt_code == opt_code)
- break;
- /* If it is not yet registered check if we have space to add a new one. */
- if(i == env->edns_known_options_num) {
- if(env->edns_known_options_num >= MAX_KNOWN_EDNS_OPTS) {
- log_err("invalid edns registration: maximum options reached");
- return 0;
- }
- env->edns_known_options_num++;
- }
- env->edns_known_options[i].opt_code = opt_code;
- env->edns_known_options[i].bypass_cache_stage = bypass_cache_stage;
- env->edns_known_options[i].no_aggregation = no_aggregation;
- return 1;
-}
-
-int
-inplace_cb_register(void* cb, enum inplace_cb_list_type type, void* cbarg,
- struct module_env* env, int id)
-{
- struct inplace_cb* callback;
- struct inplace_cb** prevp;
- if(env->worker) {
- log_err("invalid edns callback registration: "
- "trying to register callback after module init phase");
- return 0;
- }
-
- callback = (struct inplace_cb*)calloc(1, sizeof(*callback));
- if(callback == NULL) {
- log_err("out of memory during edns callback registration.");
- return 0;
- }
- callback->id = id;
- callback->next = NULL;
- callback->cb = cb;
- callback->cb_arg = cbarg;
-
- prevp = (struct inplace_cb**) &env->inplace_cb_lists[type];
- /* append at end of list */
- while(*prevp != NULL)
- prevp = &((*prevp)->next);
- *prevp = callback;
- return 1;
-}
-
-void
-inplace_cb_delete(struct module_env* env, enum inplace_cb_list_type type,
- int id)
-{
- struct inplace_cb* temp = env->inplace_cb_lists[type];
- struct inplace_cb* prev = NULL;
-
- while(temp) {
- if(temp->id == id) {
- if(!prev) {
- env->inplace_cb_lists[type] = temp->next;
- free(temp);
- temp = env->inplace_cb_lists[type];
- }
- else {
- prev->next = temp->next;
- free(temp);
- temp = prev->next;
- }
- }
- else {
- prev = temp;
- temp = temp->next;
- }
- }
-}
-
-struct edns_known_option*
-edns_option_is_known(uint16_t opt_code, struct module_env* env)
-{
- size_t i;
- for(i=0; i<env->edns_known_options_num; i++)
- if(env->edns_known_options[i].opt_code == opt_code)
- return env->edns_known_options + i;
- return NULL;
-}
-
-int
-edns_bypass_cache_stage(struct edns_option* list, struct module_env* env)
-{
- size_t i;
- for(; list; list=list->next)
- for(i=0; i<env->edns_known_options_num; i++)
- if(env->edns_known_options[i].opt_code == list->opt_code &&
- env->edns_known_options[i].bypass_cache_stage == 1)
- return 1;
- return 0;
-}
-
-int
-unique_mesh_state(struct edns_option* list, struct module_env* env)
-{
- size_t i;
- if(env->unique_mesh)
- return 1;
- for(; list; list=list->next)
- for(i=0; i<env->edns_known_options_num; i++)
- if(env->edns_known_options[i].opt_code == list->opt_code &&
- env->edns_known_options[i].no_aggregation == 1)
- return 1;
- return 0;
-}
-
-void
-log_edns_known_options(enum verbosity_value level, struct module_env* env)
-{
- size_t i;
- char str[32], *s;
- size_t slen;
- if(env->edns_known_options_num > 0 && verbosity >= level) {
- verbose(level, "EDNS known options:");
- verbose(level, " Code: Bypass_cache_stage: Aggregate_mesh:");
- for(i=0; i<env->edns_known_options_num; i++) {
- s = str;
- slen = sizeof(str);
- (void)sldns_wire2str_edns_option_code_print(&s, &slen,
- env->edns_known_options[i].opt_code);
- verbose(level, " %-8.8s %-19s %-15s", str,
- env->edns_known_options[i].bypass_cache_stage?"YES":"NO",
- env->edns_known_options[i].no_aggregation?"NO":"YES");
- }
- }
-}
diff --git a/external/unbound/util/module.h b/external/unbound/util/module.h
deleted file mode 100644
index 82b50ccd7..000000000
--- a/external/unbound/util/module.h
+++ /dev/null
@@ -1,778 +0,0 @@
-/*
- * util/module.h - DNS handling module interface
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains the interface for DNS handling modules.
- *
- * The module interface uses the DNS modules as state machines. The
- * state machines are activated in sequence to operate on queries. Once
- * they are done, the reply is passed back. In the usual setup the mesh
- * is the caller of the state machines and once things are done sends replies
- * and invokes result callbacks.
- *
- * The module provides a number of functions, listed in the module_func_block.
- * The module is inited and destroyed and memory usage queries, for the
- * module as a whole, for entire-module state (such as a cache). And per-query
- * functions are called, operate to move the state machine and cleanup of
- * the per-query state.
- *
- * Most per-query state should simply be allocated in the query region.
- * This is destroyed at the end of the query.
- *
- * The module environment contains services and information and caches
- * shared by the modules and the rest of the system. It also contains
- * function pointers for module-specific tasks (like sending queries).
- *
- * *** Example module calls for a normal query
- *
- * In this example, the query does not need recursion, all the other data
- * can be found in the cache. This makes the example shorter.
- *
- * At the start of the program the iterator module is initialised.
- * The iterator module sets up its global state, such as donotquery lists
- * and private address trees.
- *
- * A query comes in, and a mesh entry is created for it. The mesh
- * starts the resolution process. The validator module is the first
- * in the list of modules, and it is started on this new query. The
- * operate() function is called. The validator decides it needs not do
- * anything yet until there is a result and returns wait_module, that
- * causes the next module in the list to be started.
- *
- * The next module is the iterator. It is started on the passed query and
- * decides to perform a lookup. For this simple example, the delegation
- * point information is available, and all the iterator wants to do is
- * send a UDP query. The iterator uses env.send_query() to send the
- * query. Then the iterator suspends (returns from the operate call).
- *
- * When the UDP reply comes back (and on errors and timeouts), the
- * operate function is called for the query, on the iterator module,
- * with the event that there is a reply. The iterator decides that this
- * is enough, the work is done. It returns the value finished from the
- * operate call, which causes the previous module to be started.
- *
- * The previous module, the validator module, is started with the event
- * that the iterator module is done. The validator decides to validate
- * the query. Once it is done (which could take recursive lookups, but
- * in this example no recursive lookups are needed), it returns from the
- * operate function with finished.
- *
- * There is no previous module from the validator module, and the mesh
- * takes this to mean that the query is finally done. The mesh invokes
- * callbacks and sends packets to queriers.
- *
- * If other modules had been waiting (recursively) on the answer to this
- * query, then the mesh will tell them about it. It calls the inform_super
- * routine on all the waiting modules, and once that is done it calls all of
- * them with the operate() call. During inform_super the query that is done
- * still exists and information can be copied from it (but the module should
- * not really re-entry codepoints and services). During the operate call
- * the modules can use stored state to continue operation with the results.
- * (network buffers are used to contain the answer packet during the
- * inform_super phase, but after that the network buffers will be cleared
- * of their contents so that other tasks can be performed).
- *
- * *** Example module calls for recursion
- *
- * A module is called in operate, and it decides that it wants to perform
- * recursion. That is, it wants the full state-machine-list to operate on
- * a different query. It calls env.attach_sub() to create a new query state.
- * The routine returns the newly created state, and potentially the module
- * can edit the module-states for the newly created query (i.e. pass along
- * some information, like delegation points). The module then suspends,
- * returns from the operate routine.
- *
- * The mesh meanwhile will have the newly created query (or queries) on
- * a waiting list, and will call operate() on this query (or queries).
- * It starts again at the start of the module list for them. The query
- * (or queries) continue to operate their state machines, until they are
- * done. When they are done the mesh calls inform_super on the module that
- * wanted the recursion. After that the mesh calls operate() on the module
- * that wanted to do the recursion, and during this phase the module could,
- * for example, decide to create more recursions.
- *
- * If the module decides it no longer wants the recursive information
- * it can call detach_subs. Those queries will still run to completion,
- * potentially filling the cache with information. Inform_super is not
- * called any more.
- *
- * The iterator module will fetch items from the cache, so a recursion
- * attempt may complete very quickly if the item is in cache. The calling
- * module has to wait for completion or eventual timeout. A recursive query
- * that times out returns a servfail rcode (servfail is also returned for
- * other errors during the lookup).
- *
- * Results are passed in the qstate, the rcode member is used to pass
- * errors without requiring memory allocation, so that the code can continue
- * in out-of-memory conditions. If the rcode member is 0 (NOERROR) then
- * the dns_msg entry contains a filled out message. This message may
- * also contain an rcode that is nonzero, but in this case additional
- * information (query, additional) can be passed along.
- *
- * The rcode and dns_msg are used to pass the result from the the rightmost
- * module towards the leftmost modules and then towards the user.
- *
- * If you want to avoid recursion-cycles where queries need other queries
- * that need the first one, use detect_cycle() to see if that will happen.
- *
- */
-
-#ifndef UTIL_MODULE_H
-#define UTIL_MODULE_H
-#include "util/storage/lruhash.h"
-#include "util/data/msgreply.h"
-#include "util/data/msgparse.h"
-struct sldns_buffer;
-struct alloc_cache;
-struct rrset_cache;
-struct key_cache;
-struct config_file;
-struct slabhash;
-struct query_info;
-struct edns_data;
-struct regional;
-struct worker;
-struct module_qstate;
-struct ub_randstate;
-struct mesh_area;
-struct mesh_state;
-struct val_anchors;
-struct val_neg_cache;
-struct iter_forwards;
-struct iter_hints;
-struct respip_set;
-struct respip_client_info;
-struct respip_addr_info;
-
-/** Maximum number of modules in operation */
-#define MAX_MODULE 16
-
-/** Maximum number of known edns options */
-#define MAX_KNOWN_EDNS_OPTS 256
-
-enum inplace_cb_list_type {
- /* Inplace callbacks for when a resolved reply is ready to be sent to the
- * front.*/
- inplace_cb_reply = 0,
- /* Inplace callbacks for when a reply is given from the cache. */
- inplace_cb_reply_cache,
- /* Inplace callbacks for when a reply is given with local data
- * (or Chaos reply). */
- inplace_cb_reply_local,
- /* Inplace callbacks for when the reply is servfail. */
- inplace_cb_reply_servfail,
- /* Inplace callbacks for when a query is ready to be sent to the back.*/
- inplace_cb_query,
- /* Inplace callback for when a reply is received from the back. */
- inplace_cb_query_response,
- /* Inplace callback for when EDNS is parsed on a reply received from the
- * back. */
- inplace_cb_edns_back_parsed,
- /* Total number of types. Used for array initialization.
- * Should always be last. */
- inplace_cb_types_total
-};
-
-
-/** Known edns option. Can be populated during modules' init. */
-struct edns_known_option {
- /** type of this edns option */
- uint16_t opt_code;
- /** whether the option needs to bypass the cache stage */
- int bypass_cache_stage;
- /** whether the option needs mesh aggregation */
- int no_aggregation;
-};
-
-/**
- * Inplace callback list of registered routines to be called.
- */
-struct inplace_cb {
- /** next in list */
- struct inplace_cb* next;
- /** Inplace callback routine */
- void* cb;
- void* cb_arg;
- /** module id */
- int id;
-};
-
-/**
- * Inplace callback function called before replying.
- * Called as func(edns, qstate, opt_list_out, qinfo, reply_info, rcode,
- * region, python_callback)
- * Where:
- * qinfo: the query info.
- * qstate: the module state. NULL when calling before the query reaches the
- * mesh states.
- * rep: reply_info. Could be NULL.
- * rcode: the return code.
- * edns: the edns_data of the reply. When qstate is NULL, it is also used as
- * the edns input.
- * opt_list_out: the edns options list for the reply.
- * region: region to store data.
- * python_callback: only used for registering a python callback function.
- */
-typedef int inplace_cb_reply_func_type(struct query_info* qinfo,
- struct module_qstate* qstate, struct reply_info* rep, int rcode,
- struct edns_data* edns, struct edns_option** opt_list_out,
- struct regional* region, int id, void* callback);
-
-/**
- * Inplace callback function called before sending the query to a nameserver.
- * Called as func(qinfo, flags, qstate, addr, addrlen, zone, zonelen, region,
- * python_callback)
- * Where:
- * qinfo: query info.
- * flags: flags of the query.
- * qstate: query state.
- * addr: to which server to send the query.
- * addrlen: length of addr.
- * zone: name of the zone of the delegation point. wireformat dname.
- * This is the delegation point name for which the server is deemed
- * authoritative.
- * zonelen: length of zone.
- * region: region to store data.
- * python_callback: only used for registering a python callback function.
- */
-typedef int inplace_cb_query_func_type(struct query_info* qinfo, uint16_t flags,
- struct module_qstate* qstate, struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t* zone, size_t zonelen, struct regional* region,
- int id, void* callback);
-
-/**
- * Inplace callback function called after parsing edns on query reply.
- * Called as func(qstate, cb_args)
- * Where:
- * qstate: the query state
- * id: module id
- * cb_args: argument passed when registering callback.
- */
-typedef int inplace_cb_edns_back_parsed_func_type(struct module_qstate* qstate,
- int id, void* cb_args);
-
-/**
- * Inplace callback function called after parsing query response.
- * Called as func(qstate, id, cb_args)
- * Where:
- * qstate: the query state
- * response: query response
- * id: module id
- * cb_args: argument passed when registering callback.
- */
-typedef int inplace_cb_query_response_func_type(struct module_qstate* qstate,
- struct dns_msg* response, int id, void* cb_args);
-
-/**
- * Module environment.
- * Services and data provided to the module.
- */
-struct module_env {
- /* --- data --- */
- /** config file with config options */
- struct config_file* cfg;
- /** shared message cache */
- struct slabhash* msg_cache;
- /** shared rrset cache */
- struct rrset_cache* rrset_cache;
- /** shared infrastructure cache (edns, lameness) */
- struct infra_cache* infra_cache;
- /** shared key cache */
- struct key_cache* key_cache;
-
- /* --- services --- */
- /**
- * Send serviced DNS query to server. UDP/TCP and EDNS is handled.
- * operate() should return with wait_reply. Later on a callback
- * will cause operate() to be called with event timeout or reply.
- * The time until a timeout is calculated from roundtrip timing,
- * several UDP retries are attempted.
- * @param qinfo: query info.
- * @param flags: host order flags word, with opcode and CD bit.
- * @param dnssec: if set, EDNS record will have bits set.
- * If EDNS_DO bit is set, DO bit is set in EDNS records.
- * If BIT_CD is set, CD bit is set in queries with EDNS records.
- * @param want_dnssec: if set, the validator wants DNSSEC. Without
- * EDNS, the answer is likely to be useless for this domain.
- * @param nocaps: do not use caps_for_id, use the qname as given.
- * (ignored if caps_for_id is disabled).
- * @param addr: where to.
- * @param addrlen: length of addr.
- * @param zone: delegation point name.
- * @param zonelen: length of zone name.
- * @param ssl_upstream: use SSL for upstream queries.
- * @param q: wich query state to reactivate upon return.
- * @return: false on failure (memory or socket related). no query was
- * sent. Or returns an outbound entry with qsent and qstate set.
- * This outbound_entry will be used on later module invocations
- * that involve this query (timeout, error or reply).
- */
- struct outbound_entry* (*send_query)(struct query_info* qinfo,
- uint16_t flags, int dnssec, int want_dnssec, int nocaps,
- struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t* zone, size_t zonelen, int ssl_upstream,
- struct module_qstate* q);
-
- /**
- * Detach-subqueries.
- * Remove all sub-query references from this query state.
- * Keeps super-references of those sub-queries correct.
- * Updates stat items in mesh_area structure.
- * @param qstate: used to find mesh state.
- */
- void (*detach_subs)(struct module_qstate* qstate);
-
- /**
- * Attach subquery.
- * Creates it if it does not exist already.
- * Keeps sub and super references correct.
- * Updates stat items in mesh_area structure.
- * Pass if it is priming query or not.
- * return:
- * o if error (malloc) happened.
- * o need to initialise the new state (module init; it is a new state).
- * so that the next run of the query with this module is successful.
- * o no init needed, attachment successful.
- *
- * @param qstate: the state to find mesh state, and that wants to
- * receive the results from the new subquery.
- * @param qinfo: what to query for (copied).
- * @param qflags: what flags to use (RD, CD flag or not).
- * @param prime: if it is a (stub) priming query.
- * @param valrec: validation lookup recursion, does not need validation
- * @param newq: If the new subquery needs initialisation, it is
- * returned, otherwise NULL is returned.
- * @return: false on error, true if success (and init may be needed).
- */
- int (*attach_sub)(struct module_qstate* qstate,
- struct query_info* qinfo, uint16_t qflags, int prime,
- int valrec, struct module_qstate** newq);
-
- /**
- * Kill newly attached sub. If attach_sub returns newq for
- * initialisation, but that fails, then this routine will cleanup and
- * delete the fresly created sub.
- * @param newq: the new subquery that is no longer needed.
- * It is removed.
- */
- void (*kill_sub)(struct module_qstate* newq);
-
- /**
- * Detect if adding a dependency for qstate on name,type,class will
- * create a dependency cycle.
- * @param qstate: given mesh querystate.
- * @param qinfo: query info for dependency.
- * @param flags: query flags of dependency, RD/CD flags.
- * @param prime: if dependency is a priming query or not.
- * @param valrec: validation lookup recursion, does not need validation
- * @return true if the name,type,class exists and the given
- * qstate mesh exists as a dependency of that name. Thus
- * if qstate becomes dependent on name,type,class then a
- * cycle is created.
- */
- int (*detect_cycle)(struct module_qstate* qstate,
- struct query_info* qinfo, uint16_t flags, int prime,
- int valrec);
-
- /** region for temporary usage. May be cleared after operate() call. */
- struct regional* scratch;
- /** buffer for temporary usage. May be cleared after operate() call. */
- struct sldns_buffer* scratch_buffer;
- /** internal data for daemon - worker thread. */
- struct worker* worker;
- /** mesh area with query state dependencies */
- struct mesh_area* mesh;
- /** allocation service */
- struct alloc_cache* alloc;
- /** random table to generate random numbers */
- struct ub_randstate* rnd;
- /** time in seconds, converted to integer */
- time_t* now;
- /** time in microseconds. Relatively recent. */
- struct timeval* now_tv;
- /** is validation required for messages, controls client-facing
- * validation status (AD bits) and servfails */
- int need_to_validate;
- /** trusted key storage; these are the configured keys, if not NULL,
- * otherwise configured by validator. These are the trust anchors,
- * and are not primed and ready for validation, but on the bright
- * side, they are read only memory, thus no locks and fast. */
- struct val_anchors* anchors;
- /** negative cache, configured by the validator. if not NULL,
- * contains NSEC record lookup trees. */
- struct val_neg_cache* neg_cache;
- /** the 5011-probe timer (if any) */
- struct comm_timer* probe_timer;
- /** Mapping of forwarding zones to targets.
- * iterator forwarder information. per-thread, created by worker */
- struct iter_forwards* fwds;
- /**
- * iterator forwarder information. per-thread, created by worker.
- * The hints -- these aren't stored in the cache because they don't
- * expire. The hints are always used to "prime" the cache. Note
- * that both root hints and stub zone "hints" are stored in this
- * data structure.
- */
- struct iter_hints* hints;
- /** module specific data. indexed by module id. */
- void* modinfo[MAX_MODULE];
-
- /* Shared linked list of inplace callback functions */
- struct inplace_cb* inplace_cb_lists[inplace_cb_types_total];
-
- /**
- * Shared array of known edns options (size MAX_KNOWN_EDNS_OPTS).
- * Filled by edns literate modules during init.
- */
- struct edns_known_option* edns_known_options;
- /* Number of known edns options */
- size_t edns_known_options_num;
-
- /* Make every mesh state unique, do not aggregate mesh states. */
- int unique_mesh;
-};
-
-/**
- * External visible states of the module state machine
- * Modules may also have an internal state.
- * Modules are supposed to run to completion or until blocked.
- */
-enum module_ext_state {
- /** initial state - new query */
- module_state_initial = 0,
- /** waiting for reply to outgoing network query */
- module_wait_reply,
- /** module is waiting for another module */
- module_wait_module,
- /** module is waiting for another module; that other is restarted */
- module_restart_next,
- /** module is waiting for sub-query */
- module_wait_subquery,
- /** module could not finish the query */
- module_error,
- /** module is finished with query */
- module_finished
-};
-
-/**
- * Events that happen to modules, that start or wakeup modules.
- */
-enum module_ev {
- /** new query */
- module_event_new = 0,
- /** query passed by other module */
- module_event_pass,
- /** reply inbound from server */
- module_event_reply,
- /** no reply, timeout or other error */
- module_event_noreply,
- /** reply is there, but capitalisation check failed */
- module_event_capsfail,
- /** next module is done, and its reply is awaiting you */
- module_event_moddone,
- /** error */
- module_event_error
-};
-
-/**
- * Linked list of sockaddrs
- * May be allocated such that only 'len' bytes of addr exist for the structure.
- */
-struct sock_list {
- /** next in list */
- struct sock_list* next;
- /** length of addr */
- socklen_t len;
- /** sockaddr */
- struct sockaddr_storage addr;
-};
-
-struct respip_action_info;
-
-/**
- * Module state, per query.
- */
-struct module_qstate {
- /** which query is being answered: name, type, class */
- struct query_info qinfo;
- /** flags uint16 from query */
- uint16_t query_flags;
- /** if this is a (stub or root) priming query (with hints) */
- int is_priming;
- /** if this is a validation recursion query that does not get
- * validation itself */
- int is_valrec;
-
- /** comm_reply contains server replies */
- struct comm_reply* reply;
- /** the reply message, with message for client and calling module */
- struct dns_msg* return_msg;
- /** the rcode, in case of error, instead of a reply message */
- int return_rcode;
- /** origin of the reply (can be NULL from cache, list for cnames) */
- struct sock_list* reply_origin;
- /** IP blacklist for queries */
- struct sock_list* blacklist;
- /** region for this query. Cleared when query process finishes. */
- struct regional* region;
- /** failure reason information if val-log-level is high */
- struct config_strlist* errinf;
-
- /** which module is executing */
- int curmod;
- /** module states */
- enum module_ext_state ext_state[MAX_MODULE];
- /** module specific data for query. indexed by module id. */
- void* minfo[MAX_MODULE];
- /** environment for this query */
- struct module_env* env;
- /** mesh related information for this query */
- struct mesh_state* mesh_info;
- /** how many seconds before expiry is this prefetched (0 if not) */
- time_t prefetch_leeway;
-
- /** incoming edns options from the front end */
- struct edns_option* edns_opts_front_in;
- /** outgoing edns options to the back end */
- struct edns_option* edns_opts_back_out;
- /** incoming edns options from the back end */
- struct edns_option* edns_opts_back_in;
- /** outgoing edns options to the front end */
- struct edns_option* edns_opts_front_out;
- /** whether modules should answer from the cache */
- int no_cache_lookup;
- /** whether modules should store answer in the cache */
- int no_cache_store;
-
- /**
- * Attributes of clients that share the qstate that may affect IP-based
- * actions.
- */
- struct respip_client_info* client_info;
-
- /** Extended result of response-ip action processing, mainly
- * for logging purposes. */
- struct respip_action_info* respip_action_info;
-
- /** whether the reply should be dropped */
- int is_drop;
-};
-
-/**
- * Module functionality block
- */
-struct module_func_block {
- /** text string name of module */
- const char* name;
-
- /**
- * init the module. Called once for the global state.
- * This is the place to apply settings from the config file.
- * @param env: module environment.
- * @param id: module id number.
- * return: 0 on error
- */
- int (*init)(struct module_env* env, int id);
-
- /**
- * de-init, delete, the module. Called once for the global state.
- * @param env: module environment.
- * @param id: module id number.
- */
- void (*deinit)(struct module_env* env, int id);
-
- /**
- * accept a new query, or work further on existing query.
- * Changes the qstate->ext_state to be correct on exit.
- * @param ev: event that causes the module state machine to
- * (re-)activate.
- * @param qstate: the query state.
- * Note that this method is not allowed to change the
- * query state 'identity', that is query info, qflags,
- * and priming status.
- * Attach a subquery to get results to a different query.
- * @param id: module id number that operate() is called on.
- * @param outbound: if not NULL this event is due to the reply/timeout
- * or error on this outbound query.
- * @return: if at exit the ext_state is:
- * o wait_module: next module is started. (with pass event).
- * o error or finished: previous module is resumed.
- * o otherwise it waits until that event happens (assumes
- * the service routine to make subrequest or send message
- * have been called.
- */
- void (*operate)(struct module_qstate* qstate, enum module_ev event,
- int id, struct outbound_entry* outbound);
-
- /**
- * inform super querystate about the results from this subquerystate.
- * Is called when the querystate is finished. The method invoked is
- * the one from the current module active in the super querystate.
- * @param qstate: the query state that is finished.
- * Examine return_rcode and return_reply in the qstate.
- * @param id: module id for this module.
- * This coincides with the current module for the super qstate.
- * @param super: the super querystate that needs to be informed.
- */
- void (*inform_super)(struct module_qstate* qstate, int id,
- struct module_qstate* super);
-
- /**
- * clear module specific data
- */
- void (*clear)(struct module_qstate* qstate, int id);
-
- /**
- * How much memory is the module specific data using.
- * @param env: module environment.
- * @param id: the module id.
- * @return the number of bytes that are alloced.
- */
- size_t (*get_mem)(struct module_env* env, int id);
-};
-
-/**
- * Debug utility: module external qstate to string
- * @param s: the state value.
- * @return descriptive string.
- */
-const char* strextstate(enum module_ext_state s);
-
-/**
- * Debug utility: module event to string
- * @param e: the module event value.
- * @return descriptive string.
- */
-const char* strmodulevent(enum module_ev e);
-
-/**
- * Initialize the edns known options by allocating the required space.
- * @param env: the module environment.
- * @return false on failure (no memory).
- */
-int edns_known_options_init(struct module_env* env);
-
-/**
- * Free the allocated space for the known edns options.
- * @param env: the module environment.
- */
-void edns_known_options_delete(struct module_env* env);
-
-/**
- * Register a known edns option. Overwrite the flags if it is already
- * registered. Used before creating workers to register known edns options.
- * @param opt_code: the edns option code.
- * @param bypass_cache_stage: whether the option interacts with the cache.
- * @param no_aggregation: whether the option implies more specific
- * aggregation.
- * @param env: the module environment.
- * @return true on success, false on failure (registering more options than
- * allowed or trying to register after the environment is copied to the
- * threads.)
- */
-int edns_register_option(uint16_t opt_code, int bypass_cache_stage,
- int no_aggregation, struct module_env* env);
-
-/**
- * Register an inplace callback function.
- * @param cb: pointer to the callback function.
- * @param type: inplace callback type.
- * @param cbarg: argument for the callback function, or NULL.
- * @param env: the module environment.
- * @param id: module id.
- * @return true on success, false on failure (out of memory or trying to
- * register after the environment is copied to the threads.)
- */
-int
-inplace_cb_register(void* cb, enum inplace_cb_list_type type, void* cbarg,
- struct module_env* env, int id);
-
-/**
- * Delete callback for specified type and module id.
- * @param env: the module environment.
- * @param type: inplace callback type.
- * @param id: module id.
- */
-void
-inplace_cb_delete(struct module_env* env, enum inplace_cb_list_type type,
- int id);
-
-/**
- * Delete all the inplace callback linked lists.
- * @param env: the module environment.
- */
-void inplace_cb_lists_delete(struct module_env* env);
-
-/**
- * Check if an edns option is known.
- * @param opt_code: the edns option code.
- * @param env: the module environment.
- * @return pointer to registered option if the edns option is known,
- * NULL otherwise.
- */
-struct edns_known_option* edns_option_is_known(uint16_t opt_code,
- struct module_env* env);
-
-/**
- * Check if an edns option needs to bypass the reply from cache stage.
- * @param list: the edns options.
- * @param env: the module environment.
- * @return true if an edns option needs to bypass the cache stage,
- * false otherwise.
- */
-int edns_bypass_cache_stage(struct edns_option* list,
- struct module_env* env);
-
-/**
- * Check if an unique mesh state is required. Might be triggered by EDNS option
- * or set for the complete env.
- * @param list: the edns options.
- * @param env: the module environment.
- * @return true if an edns option needs a unique mesh state,
- * false otherwise.
- */
-int unique_mesh_state(struct edns_option* list, struct module_env* env);
-
-/**
- * Log the known edns options.
- * @param level: the desired verbosity level.
- * @param env: the module environment.
- */
-void log_edns_known_options(enum verbosity_value level,
- struct module_env* env);
-
-#endif /* UTIL_MODULE_H */
diff --git a/external/unbound/util/net_help.c b/external/unbound/util/net_help.c
deleted file mode 100644
index 6c0d68e31..000000000
--- a/external/unbound/util/net_help.c
+++ /dev/null
@@ -1,840 +0,0 @@
-/*
- * util/net_help.c - implementation of the network helper code
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * \file
- * Implementation of net_help.h.
- */
-
-#include "config.h"
-#include "util/net_help.h"
-#include "util/log.h"
-#include "util/data/dname.h"
-#include "util/module.h"
-#include "util/regional.h"
-#include "sldns/parseutil.h"
-#include "sldns/wire2str.h"
-#include <fcntl.h>
-#ifdef HAVE_OPENSSL_SSL_H
-#include <openssl/ssl.h>
-#endif
-#ifdef HAVE_OPENSSL_ERR_H
-#include <openssl/err.h>
-#endif
-
-/** max length of an IP address (the address portion) that we allow */
-#define MAX_ADDR_STRLEN 128 /* characters */
-/** default value for EDNS ADVERTISED size */
-uint16_t EDNS_ADVERTISED_SIZE = 4096;
-
-/** minimal responses when positive answer: default is no */
-int MINIMAL_RESPONSES = 0;
-
-/** rrset order roundrobin: default is no */
-int RRSET_ROUNDROBIN = 0;
-
-/* returns true is string addr is an ip6 specced address */
-int
-str_is_ip6(const char* str)
-{
- if(strchr(str, ':'))
- return 1;
- else return 0;
-}
-
-int
-fd_set_nonblock(int s)
-{
-#ifdef HAVE_FCNTL
- int flag;
- if((flag = fcntl(s, F_GETFL)) == -1) {
- log_err("can't fcntl F_GETFL: %s", strerror(errno));
- flag = 0;
- }
- flag |= O_NONBLOCK;
- if(fcntl(s, F_SETFL, flag) == -1) {
- log_err("can't fcntl F_SETFL: %s", strerror(errno));
- return 0;
- }
-#elif defined(HAVE_IOCTLSOCKET)
- unsigned long on = 1;
- if(ioctlsocket(s, FIONBIO, &on) != 0) {
- log_err("can't ioctlsocket FIONBIO on: %s",
- wsa_strerror(WSAGetLastError()));
- }
-#endif
- return 1;
-}
-
-int
-fd_set_block(int s)
-{
-#ifdef HAVE_FCNTL
- int flag;
- if((flag = fcntl(s, F_GETFL)) == -1) {
- log_err("cannot fcntl F_GETFL: %s", strerror(errno));
- flag = 0;
- }
- flag &= ~O_NONBLOCK;
- if(fcntl(s, F_SETFL, flag) == -1) {
- log_err("cannot fcntl F_SETFL: %s", strerror(errno));
- return 0;
- }
-#elif defined(HAVE_IOCTLSOCKET)
- unsigned long off = 0;
- if(ioctlsocket(s, FIONBIO, &off) != 0) {
- log_err("can't ioctlsocket FIONBIO off: %s",
- wsa_strerror(WSAGetLastError()));
- }
-#endif
- return 1;
-}
-
-int
-is_pow2(size_t num)
-{
- if(num == 0) return 1;
- return (num & (num-1)) == 0;
-}
-
-void*
-memdup(void* data, size_t len)
-{
- void* d;
- if(!data) return NULL;
- if(len == 0) return NULL;
- d = malloc(len);
- if(!d) return NULL;
- memcpy(d, data, len);
- return d;
-}
-
-void
-log_addr(enum verbosity_value v, const char* str,
- struct sockaddr_storage* addr, socklen_t addrlen)
-{
- uint16_t port;
- const char* family = "unknown";
- char dest[100];
- int af = (int)((struct sockaddr_in*)addr)->sin_family;
- void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
- if(verbosity < v)
- return;
- switch(af) {
- case AF_INET: family="ip4"; break;
- case AF_INET6: family="ip6";
- sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
- break;
- case AF_LOCAL:
- dest[0]=0;
- (void)inet_ntop(af, sinaddr, dest,
- (socklen_t)sizeof(dest));
- verbose(v, "%s local %s", str, dest);
- return; /* do not continue and try to get port */
- default: break;
- }
- if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
- (void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
- }
- dest[sizeof(dest)-1] = 0;
- port = ntohs(((struct sockaddr_in*)addr)->sin_port);
- if(verbosity >= 4)
- verbose(v, "%s %s %s port %d (len %d)", str, family, dest,
- (int)port, (int)addrlen);
- else verbose(v, "%s %s port %d", str, dest, (int)port);
-}
-
-int
-extstrtoaddr(const char* str, struct sockaddr_storage* addr,
- socklen_t* addrlen)
-{
- char* s;
- int port = UNBOUND_DNS_PORT;
- if((s=strchr(str, '@'))) {
- char buf[MAX_ADDR_STRLEN];
- if(s-str >= MAX_ADDR_STRLEN) {
- return 0;
- }
- (void)strlcpy(buf, str, sizeof(buf));
- buf[s-str] = 0;
- port = atoi(s+1);
- if(port == 0 && strcmp(s+1,"0")!=0) {
- return 0;
- }
- return ipstrtoaddr(buf, port, addr, addrlen);
- }
- return ipstrtoaddr(str, port, addr, addrlen);
-}
-
-
-int
-ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
- socklen_t* addrlen)
-{
- uint16_t p;
- if(!ip) return 0;
- p = (uint16_t) port;
- if(str_is_ip6(ip)) {
- char buf[MAX_ADDR_STRLEN];
- char* s;
- struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
- *addrlen = (socklen_t)sizeof(struct sockaddr_in6);
- memset(sa, 0, *addrlen);
- sa->sin6_family = AF_INET6;
- sa->sin6_port = (in_port_t)htons(p);
- if((s=strchr(ip, '%'))) { /* ip6%interface, rfc 4007 */
- if(s-ip >= MAX_ADDR_STRLEN)
- return 0;
- (void)strlcpy(buf, ip, sizeof(buf));
- buf[s-ip]=0;
- sa->sin6_scope_id = (uint32_t)atoi(s+1);
- ip = buf;
- }
- if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) {
- return 0;
- }
- } else { /* ip4 */
- struct sockaddr_in* sa = (struct sockaddr_in*)addr;
- *addrlen = (socklen_t)sizeof(struct sockaddr_in);
- memset(sa, 0, *addrlen);
- sa->sin_family = AF_INET;
- sa->sin_port = (in_port_t)htons(p);
- if(inet_pton((int)sa->sin_family, ip, &sa->sin_addr) <= 0) {
- return 0;
- }
- }
- return 1;
-}
-
-int netblockstrtoaddr(const char* str, int port, struct sockaddr_storage* addr,
- socklen_t* addrlen, int* net)
-{
- char* s = NULL;
- *net = (str_is_ip6(str)?128:32);
- if((s=strchr(str, '/'))) {
- if(atoi(s+1) > *net) {
- log_err("netblock too large: %s", str);
- return 0;
- }
- *net = atoi(s+1);
- if(*net == 0 && strcmp(s+1, "0") != 0) {
- log_err("cannot parse netblock: '%s'", str);
- return 0;
- }
- if(!(s = strdup(str))) {
- log_err("out of memory");
- return 0;
- }
- *strchr(s, '/') = '\0';
- }
- if(!ipstrtoaddr(s?s:str, port, addr, addrlen)) {
- free(s);
- log_err("cannot parse ip address: '%s'", str);
- return 0;
- }
- if(s) {
- free(s);
- addr_mask(addr, *addrlen, *net);
- }
- return 1;
-}
-
-void
-log_nametypeclass(enum verbosity_value v, const char* str, uint8_t* name,
- uint16_t type, uint16_t dclass)
-{
- char buf[LDNS_MAX_DOMAINLEN+1];
- char t[12], c[12];
- const char *ts, *cs;
- if(verbosity < v)
- return;
- dname_str(name, buf);
- if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
- else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
- else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
- else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
- else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
- else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
- else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
- ts = sldns_rr_descript(type)->_name;
- else {
- snprintf(t, sizeof(t), "TYPE%d", (int)type);
- ts = t;
- }
- if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
- sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
- cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
- else {
- snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
- cs = c;
- }
- log_info("%s %s %s %s", str, buf, ts, cs);
-}
-
-void log_name_addr(enum verbosity_value v, const char* str, uint8_t* zone,
- struct sockaddr_storage* addr, socklen_t addrlen)
-{
- uint16_t port;
- const char* family = "unknown_family ";
- char namebuf[LDNS_MAX_DOMAINLEN+1];
- char dest[100];
- int af = (int)((struct sockaddr_in*)addr)->sin_family;
- void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
- if(verbosity < v)
- return;
- switch(af) {
- case AF_INET: family=""; break;
- case AF_INET6: family="";
- sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
- break;
- case AF_LOCAL: family="local "; break;
- default: break;
- }
- if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
- (void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
- }
- dest[sizeof(dest)-1] = 0;
- port = ntohs(((struct sockaddr_in*)addr)->sin_port);
- dname_str(zone, namebuf);
- if(af != AF_INET && af != AF_INET6)
- verbose(v, "%s <%s> %s%s#%d (addrlen %d)",
- str, namebuf, family, dest, (int)port, (int)addrlen);
- else verbose(v, "%s <%s> %s%s#%d",
- str, namebuf, family, dest, (int)port);
-}
-
-void log_err_addr(const char* str, const char* err,
- struct sockaddr_storage* addr, socklen_t addrlen)
-{
- uint16_t port;
- char dest[100];
- int af = (int)((struct sockaddr_in*)addr)->sin_family;
- void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
- if(af == AF_INET6)
- sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
- if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
- (void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
- }
- dest[sizeof(dest)-1] = 0;
- port = ntohs(((struct sockaddr_in*)addr)->sin_port);
- if(verbosity >= 4)
- log_err("%s: %s for %s port %d (len %d)", str, err, dest,
- (int)port, (int)addrlen);
- else log_err("%s: %s for %s", str, err, dest);
-}
-
-int
-sockaddr_cmp(struct sockaddr_storage* addr1, socklen_t len1,
- struct sockaddr_storage* addr2, socklen_t len2)
-{
- struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
- struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
- struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
- struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
- if(len1 < len2)
- return -1;
- if(len1 > len2)
- return 1;
- log_assert(len1 == len2);
- if( p1_in->sin_family < p2_in->sin_family)
- return -1;
- if( p1_in->sin_family > p2_in->sin_family)
- return 1;
- log_assert( p1_in->sin_family == p2_in->sin_family );
- /* compare ip4 */
- if( p1_in->sin_family == AF_INET ) {
- /* just order it, ntohs not required */
- if(p1_in->sin_port < p2_in->sin_port)
- return -1;
- if(p1_in->sin_port > p2_in->sin_port)
- return 1;
- log_assert(p1_in->sin_port == p2_in->sin_port);
- return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
- } else if (p1_in6->sin6_family == AF_INET6) {
- /* just order it, ntohs not required */
- if(p1_in6->sin6_port < p2_in6->sin6_port)
- return -1;
- if(p1_in6->sin6_port > p2_in6->sin6_port)
- return 1;
- log_assert(p1_in6->sin6_port == p2_in6->sin6_port);
- return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
- INET6_SIZE);
- } else {
- /* eek unknown type, perform this comparison for sanity. */
- return memcmp(addr1, addr2, len1);
- }
-}
-
-int
-sockaddr_cmp_addr(struct sockaddr_storage* addr1, socklen_t len1,
- struct sockaddr_storage* addr2, socklen_t len2)
-{
- struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
- struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
- struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
- struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
- if(len1 < len2)
- return -1;
- if(len1 > len2)
- return 1;
- log_assert(len1 == len2);
- if( p1_in->sin_family < p2_in->sin_family)
- return -1;
- if( p1_in->sin_family > p2_in->sin_family)
- return 1;
- log_assert( p1_in->sin_family == p2_in->sin_family );
- /* compare ip4 */
- if( p1_in->sin_family == AF_INET ) {
- return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
- } else if (p1_in6->sin6_family == AF_INET6) {
- return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
- INET6_SIZE);
- } else {
- /* eek unknown type, perform this comparison for sanity. */
- return memcmp(addr1, addr2, len1);
- }
-}
-
-int
-addr_is_ip6(struct sockaddr_storage* addr, socklen_t len)
-{
- if(len == (socklen_t)sizeof(struct sockaddr_in6) &&
- ((struct sockaddr_in6*)addr)->sin6_family == AF_INET6)
- return 1;
- else return 0;
-}
-
-void
-addr_mask(struct sockaddr_storage* addr, socklen_t len, int net)
-{
- uint8_t mask[8] = {0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
- int i, max;
- uint8_t* s;
- if(addr_is_ip6(addr, len)) {
- s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
- max = 128;
- } else {
- s = (uint8_t*)&((struct sockaddr_in*)addr)->sin_addr;
- max = 32;
- }
- if(net >= max)
- return;
- for(i=net/8+1; i<max/8; i++) {
- s[i] = 0;
- }
- s[net/8] &= mask[net&0x7];
-}
-
-int
-addr_in_common(struct sockaddr_storage* addr1, int net1,
- struct sockaddr_storage* addr2, int net2, socklen_t addrlen)
-{
- int min = (net1<net2)?net1:net2;
- int i, to;
- int match = 0;
- uint8_t* s1, *s2;
- if(addr_is_ip6(addr1, addrlen)) {
- s1 = (uint8_t*)&((struct sockaddr_in6*)addr1)->sin6_addr;
- s2 = (uint8_t*)&((struct sockaddr_in6*)addr2)->sin6_addr;
- to = 16;
- } else {
- s1 = (uint8_t*)&((struct sockaddr_in*)addr1)->sin_addr;
- s2 = (uint8_t*)&((struct sockaddr_in*)addr2)->sin_addr;
- to = 4;
- }
- /* match = bits_in_common(s1, s2, to); */
- for(i=0; i<to; i++) {
- if(s1[i] == s2[i]) {
- match += 8;
- } else {
- uint8_t z = s1[i]^s2[i];
- log_assert(z);
- while(!(z&0x80)) {
- match++;
- z<<=1;
- }
- break;
- }
- }
- if(match > min) match = min;
- return match;
-}
-
-void
-addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
- char* buf, size_t len)
-{
- int af = (int)((struct sockaddr_in*)addr)->sin_family;
- void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
- if(addr_is_ip6(addr, addrlen))
- sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
- if(inet_ntop(af, sinaddr, buf, (socklen_t)len) == 0) {
- snprintf(buf, len, "(inet_ntop_error)");
- }
-}
-
-int
-addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
-{
- /* prefix for ipv4 into ipv6 mapping is ::ffff:x.x.x.x */
- const uint8_t map_prefix[16] =
- {0,0,0,0, 0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
- uint8_t* s;
- if(!addr_is_ip6(addr, addrlen))
- return 0;
- /* s is 16 octet ipv6 address string */
- s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
- return (memcmp(s, map_prefix, 12) == 0);
-}
-
-int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
-{
- int af = (int)((struct sockaddr_in*)addr)->sin_family;
- void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
- return af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
- && memcmp(sinaddr, "\377\377\377\377", 4) == 0;
-}
-
-int addr_is_any(struct sockaddr_storage* addr, socklen_t addrlen)
-{
- int af = (int)((struct sockaddr_in*)addr)->sin_family;
- void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
- void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
- if(af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
- && memcmp(sinaddr, "\000\000\000\000", 4) == 0)
- return 1;
- else if(af==AF_INET6 && addrlen>=(socklen_t)sizeof(struct sockaddr_in6)
- && memcmp(sin6addr, "\000\000\000\000\000\000\000\000"
- "\000\000\000\000\000\000\000\000", 16) == 0)
- return 1;
- return 0;
-}
-
-void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr,
- socklen_t len, struct regional* region)
-{
- struct sock_list* add = (struct sock_list*)regional_alloc(region,
- sizeof(*add) - sizeof(add->addr) + (size_t)len);
- if(!add) {
- log_err("out of memory in socketlist insert");
- return;
- }
- log_assert(list);
- add->next = *list;
- add->len = len;
- *list = add;
- if(len) memmove(&add->addr, addr, len);
-}
-
-void sock_list_prepend(struct sock_list** list, struct sock_list* add)
-{
- struct sock_list* last = add;
- if(!last)
- return;
- while(last->next)
- last = last->next;
- last->next = *list;
- *list = add;
-}
-
-int sock_list_find(struct sock_list* list, struct sockaddr_storage* addr,
- socklen_t len)
-{
- while(list) {
- if(len == list->len) {
- if(len == 0 || sockaddr_cmp_addr(addr, len,
- &list->addr, list->len) == 0)
- return 1;
- }
- list = list->next;
- }
- return 0;
-}
-
-void sock_list_merge(struct sock_list** list, struct regional* region,
- struct sock_list* add)
-{
- struct sock_list* p;
- for(p=add; p; p=p->next) {
- if(!sock_list_find(*list, &p->addr, p->len))
- sock_list_insert(list, &p->addr, p->len, region);
- }
-}
-
-void
-log_crypto_err(const char* str)
-{
-#ifdef HAVE_SSL
- /* error:[error code]:[library name]:[function name]:[reason string] */
- char buf[128];
- unsigned long e;
- ERR_error_string_n(ERR_get_error(), buf, sizeof(buf));
- log_err("%s crypto %s", str, buf);
- while( (e=ERR_get_error()) ) {
- ERR_error_string_n(e, buf, sizeof(buf));
- log_err("and additionally crypto %s", buf);
- }
-#else
- (void)str;
-#endif /* HAVE_SSL */
-}
-
-void* listen_sslctx_create(char* key, char* pem, char* verifypem)
-{
-#ifdef HAVE_SSL
- SSL_CTX* ctx = SSL_CTX_new(SSLv23_server_method());
- if(!ctx) {
- log_crypto_err("could not SSL_CTX_new");
- return NULL;
- }
- /* no SSLv2, SSLv3 because has defects */
- if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
- != SSL_OP_NO_SSLv2){
- log_crypto_err("could not set SSL_OP_NO_SSLv2");
- SSL_CTX_free(ctx);
- return NULL;
- }
- if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
- != SSL_OP_NO_SSLv3){
- log_crypto_err("could not set SSL_OP_NO_SSLv3");
- SSL_CTX_free(ctx);
- return NULL;
- }
- if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
- log_err("error for cert file: %s", pem);
- log_crypto_err("error in SSL_CTX use_certificate_chain_file");
- SSL_CTX_free(ctx);
- return NULL;
- }
- if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
- log_err("error for private key file: %s", key);
- log_crypto_err("Error in SSL_CTX use_PrivateKey_file");
- SSL_CTX_free(ctx);
- return NULL;
- }
- if(!SSL_CTX_check_private_key(ctx)) {
- log_err("error for key file: %s", key);
- log_crypto_err("Error in SSL_CTX check_private_key");
- SSL_CTX_free(ctx);
- return NULL;
- }
-#if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
- if(!SSL_CTX_set_ecdh_auto(ctx,1)) {
- log_crypto_err("Error in SSL_CTX_ecdh_auto, not enabling ECDHE");
- }
-#elif defined(USE_ECDSA)
- if(1) {
- EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
- if (!ecdh) {
- log_crypto_err("could not find p256, not enabling ECDHE");
- } else {
- if (1 != SSL_CTX_set_tmp_ecdh (ctx, ecdh)) {
- log_crypto_err("Error in SSL_CTX_set_tmp_ecdh, not enabling ECDHE");
- }
- EC_KEY_free (ecdh);
- }
- }
-#endif
-
- if(verifypem && verifypem[0]) {
- if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
- log_crypto_err("Error in SSL_CTX verify locations");
- SSL_CTX_free(ctx);
- return NULL;
- }
- SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(
- verifypem));
- SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
- }
- return ctx;
-#else
- (void)key; (void)pem; (void)verifypem;
- return NULL;
-#endif
-}
-
-void* connect_sslctx_create(char* key, char* pem, char* verifypem)
-{
-#ifdef HAVE_SSL
- SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
- if(!ctx) {
- log_crypto_err("could not allocate SSL_CTX pointer");
- return NULL;
- }
- if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
- != SSL_OP_NO_SSLv2) {
- log_crypto_err("could not set SSL_OP_NO_SSLv2");
- SSL_CTX_free(ctx);
- return NULL;
- }
- if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
- != SSL_OP_NO_SSLv3) {
- log_crypto_err("could not set SSL_OP_NO_SSLv3");
- SSL_CTX_free(ctx);
- return NULL;
- }
- if(key && key[0]) {
- if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
- log_err("error in client certificate %s", pem);
- log_crypto_err("error in certificate file");
- SSL_CTX_free(ctx);
- return NULL;
- }
- if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
- log_err("error in client private key %s", key);
- log_crypto_err("error in key file");
- SSL_CTX_free(ctx);
- return NULL;
- }
- if(!SSL_CTX_check_private_key(ctx)) {
- log_err("error in client key %s", key);
- log_crypto_err("error in SSL_CTX_check_private_key");
- SSL_CTX_free(ctx);
- return NULL;
- }
- }
- if(verifypem && verifypem[0]) {
- if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
- log_crypto_err("error in SSL_CTX verify");
- SSL_CTX_free(ctx);
- return NULL;
- }
- SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
- }
- return ctx;
-#else
- (void)key; (void)pem; (void)verifypem;
- return NULL;
-#endif
-}
-
-void* incoming_ssl_fd(void* sslctx, int fd)
-{
-#ifdef HAVE_SSL
- SSL* ssl = SSL_new((SSL_CTX*)sslctx);
- if(!ssl) {
- log_crypto_err("could not SSL_new");
- return NULL;
- }
- SSL_set_accept_state(ssl);
- (void)SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
- if(!SSL_set_fd(ssl, fd)) {
- log_crypto_err("could not SSL_set_fd");
- SSL_free(ssl);
- return NULL;
- }
- return ssl;
-#else
- (void)sslctx; (void)fd;
- return NULL;
-#endif
-}
-
-void* outgoing_ssl_fd(void* sslctx, int fd)
-{
-#ifdef HAVE_SSL
- SSL* ssl = SSL_new((SSL_CTX*)sslctx);
- if(!ssl) {
- log_crypto_err("could not SSL_new");
- return NULL;
- }
- SSL_set_connect_state(ssl);
- (void)SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
- if(!SSL_set_fd(ssl, fd)) {
- log_crypto_err("could not SSL_set_fd");
- SSL_free(ssl);
- return NULL;
- }
- return ssl;
-#else
- (void)sslctx; (void)fd;
- return NULL;
-#endif
-}
-
-#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
-/** global lock list for openssl locks */
-static lock_basic_type *ub_openssl_locks = NULL;
-
-/** callback that gets thread id for openssl */
-static unsigned long
-ub_crypto_id_cb(void)
-{
- return (unsigned long)log_thread_get();
-}
-
-static void
-ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
- int ATTR_UNUSED(line))
-{
- if((mode&CRYPTO_LOCK)) {
- lock_basic_lock(&ub_openssl_locks[type]);
- } else {
- lock_basic_unlock(&ub_openssl_locks[type]);
- }
-}
-#endif /* OPENSSL_THREADS */
-
-int ub_openssl_lock_init(void)
-{
-#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
- int i;
- ub_openssl_locks = (lock_basic_type*)reallocarray(
- NULL, (size_t)CRYPTO_num_locks(), sizeof(lock_basic_type));
- if(!ub_openssl_locks)
- return 0;
- for(i=0; i<CRYPTO_num_locks(); i++) {
- lock_basic_init(&ub_openssl_locks[i]);
- }
- CRYPTO_set_id_callback(&ub_crypto_id_cb);
- CRYPTO_set_locking_callback(&ub_crypto_lock_cb);
-#endif /* OPENSSL_THREADS */
- return 1;
-}
-
-void ub_openssl_lock_delete(void)
-{
-#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
- int i;
- if(!ub_openssl_locks)
- return;
- CRYPTO_set_id_callback(NULL);
- CRYPTO_set_locking_callback(NULL);
- for(i=0; i<CRYPTO_num_locks(); i++) {
- lock_basic_destroy(&ub_openssl_locks[i]);
- }
- free(ub_openssl_locks);
-#endif /* OPENSSL_THREADS */
-}
-
diff --git a/external/unbound/util/net_help.h b/external/unbound/util/net_help.h
deleted file mode 100644
index 54f4c9c0e..000000000
--- a/external/unbound/util/net_help.h
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * util/net_help.h - network help functions
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains functions to perform network related tasks.
- */
-
-#ifndef NET_HELP_H
-#define NET_HELP_H
-#include "util/log.h"
-struct sock_list;
-struct regional;
-
-/** DNS constants for uint16_t style flag manipulation. host byteorder.
- * 1 1 1 1 1 1
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * |QR| Opcode |AA|TC|RD|RA| Z|AD|CD| RCODE |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- */
-/** CD flag */
-#define BIT_CD 0x0010
-/** AD flag */
-#define BIT_AD 0x0020
-/** Z flag */
-#define BIT_Z 0x0040
-/** RA flag */
-#define BIT_RA 0x0080
-/** RD flag */
-#define BIT_RD 0x0100
-/** TC flag */
-#define BIT_TC 0x0200
-/** AA flag */
-#define BIT_AA 0x0400
-/** QR flag */
-#define BIT_QR 0x8000
-/** get RCODE bits from uint16 flags */
-#define FLAGS_GET_RCODE(f) ((f) & 0xf)
-/** set RCODE bits in uint16 flags */
-#define FLAGS_SET_RCODE(f, r) (f = (((f) & 0xfff0) | (r)))
-
-/** timeout in seconds for UDP queries to auth servers. */
-#define UDP_AUTH_QUERY_TIMEOUT 4
-/** timeout in seconds for TCP queries to auth servers. */
-#define TCP_AUTH_QUERY_TIMEOUT 30
-/** Advertised version of EDNS capabilities */
-#define EDNS_ADVERTISED_VERSION 0
-/** Advertised size of EDNS capabilities */
-extern uint16_t EDNS_ADVERTISED_SIZE;
-/** bits for EDNS bitfield */
-#define EDNS_DO 0x8000 /* Dnssec Ok */
-/** byte size of ip4 address */
-#define INET_SIZE 4
-/** byte size of ip6 address */
-#define INET6_SIZE 16
-
-/** DNSKEY zone sign key flag */
-#define DNSKEY_BIT_ZSK 0x0100
-/** DNSKEY secure entry point, KSK flag */
-#define DNSKEY_BIT_SEP 0x0001
-
-/** minimal responses when positive answer */
-extern int MINIMAL_RESPONSES;
-
-/** rrset order roundrobin */
-extern int RRSET_ROUNDROBIN;
-
-/**
- * See if string is ip4 or ip6.
- * @param str: IP specification.
- * @return: true if string addr is an ip6 specced address.
- */
-int str_is_ip6(const char* str);
-
-/**
- * Set fd nonblocking.
- * @param s: file descriptor.
- * @return: 0 on error (error is printed to log).
- */
-int fd_set_nonblock(int s);
-
-/**
- * Set fd (back to) blocking.
- * @param s: file descriptor.
- * @return: 0 on error (error is printed to log).
- */
-int fd_set_block(int s);
-
-/**
- * See if number is a power of 2.
- * @param num: the value.
- * @return: true if the number is a power of 2.
- */
-int is_pow2(size_t num);
-
-/**
- * Allocate memory and copy over contents.
- * @param data: what to copy over.
- * @param len: length of data.
- * @return: NULL on malloc failure, or newly malloced data.
- */
-void* memdup(void* data, size_t len);
-
-/**
- * Prints the sockaddr in readable format with log_info. Debug helper.
- * @param v: at what verbosity level to print this.
- * @param str: descriptive string printed with it.
- * @param addr: the sockaddr to print. Can be ip4 or ip6.
- * @param addrlen: length of addr.
- */
-void log_addr(enum verbosity_value v, const char* str,
- struct sockaddr_storage* addr, socklen_t addrlen);
-
-/**
- * Prints zone name and sockaddr in readable format with log_info. Debug.
- * @param v: at what verbosity level to print this.
- * @param str: descriptive string printed with it.
- * @param zone: DNS domain name, uncompressed wireformat.
- * @param addr: the sockaddr to print. Can be ip4 or ip6.
- * @param addrlen: length of addr.
- */
-void log_name_addr(enum verbosity_value v, const char* str, uint8_t* zone,
- struct sockaddr_storage* addr, socklen_t addrlen);
-
-/**
- * Log errno and addr.
- * @param str: descriptive string printed with it.
- * @param err: errno string to print, i.e. strerror(errno).
- * @param addr: the sockaddr to print. Can be ip4 or ip6.
- * @param addrlen: length of addr.
- */
-void log_err_addr(const char* str, const char* err,
- struct sockaddr_storage* addr, socklen_t addrlen);
-
-/**
- * Convert address string, with "@port" appendix, to sockaddr.
- * Uses DNS port by default.
- * @param str: the string
- * @param addr: where to store sockaddr.
- * @param addrlen: length of stored sockaddr is returned.
- * @return 0 on error.
- */
-int extstrtoaddr(const char* str, struct sockaddr_storage* addr,
- socklen_t* addrlen);
-
-/**
- * Convert ip address string and port to sockaddr.
- * @param ip: ip4 or ip6 address string.
- * @param port: port number, host format.
- * @param addr: where to store sockaddr.
- * @param addrlen: length of stored sockaddr is returned.
- * @return 0 on error.
- */
-int ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
- socklen_t* addrlen);
-
-/**
- * Convert ip netblock (ip/netsize) string and port to sockaddr.
- * *SLOW*, does a malloc internally to avoid writing over 'ip' string.
- * @param ip: ip4 or ip6 address string.
- * @param port: port number, host format.
- * @param addr: where to store sockaddr.
- * @param addrlen: length of stored sockaddr is returned.
- * @param net: netblock size is returned.
- * @return 0 on error.
- */
-int netblockstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
- socklen_t* addrlen, int* net);
-
-/**
- * Print string with neat domain name, type and class.
- * @param v: at what verbosity level to print this.
- * @param str: string of message.
- * @param name: domain name uncompressed wireformat.
- * @param type: host format RR type.
- * @param dclass: host format RR class.
- */
-void log_nametypeclass(enum verbosity_value v, const char* str,
- uint8_t* name, uint16_t type, uint16_t dclass);
-
-/**
- * Compare two sockaddrs. Imposes an ordering on the addresses.
- * Compares address and port.
- * @param addr1: address 1.
- * @param len1: lengths of addr1.
- * @param addr2: address 2.
- * @param len2: lengths of addr2.
- * @return: 0 if addr1 == addr2. -1 if addr1 is smaller, +1 if larger.
- */
-int sockaddr_cmp(struct sockaddr_storage* addr1, socklen_t len1,
- struct sockaddr_storage* addr2, socklen_t len2);
-
-/**
- * Compare two sockaddrs. Compares address, not the port.
- * @param addr1: address 1.
- * @param len1: lengths of addr1.
- * @param addr2: address 2.
- * @param len2: lengths of addr2.
- * @return: 0 if addr1 == addr2. -1 if addr1 is smaller, +1 if larger.
- */
-int sockaddr_cmp_addr(struct sockaddr_storage* addr1, socklen_t len1,
- struct sockaddr_storage* addr2, socklen_t len2);
-
-/**
- * Checkout address family.
- * @param addr: the sockaddr to examine.
- * @param len: the length of addr.
- * @return: true if sockaddr is ip6.
- */
-int addr_is_ip6(struct sockaddr_storage* addr, socklen_t len);
-
-/**
- * Make sure the sockaddr ends in zeroes. For tree insertion and subsequent
- * comparison.
- * @param addr: the ip4 or ip6 addr.
- * @param len: length of addr.
- * @param net: number of bits to leave untouched, the rest of the netblock
- * address is zeroed.
- */
-void addr_mask(struct sockaddr_storage* addr, socklen_t len, int net);
-
-/**
- * See how many bits are shared, equal, between two addrs.
- * @param addr1: first addr.
- * @param net1: netblock size of first addr.
- * @param addr2: second addr.
- * @param net2: netblock size of second addr.
- * @param addrlen: length of first addr and of second addr.
- * They must be of the same length (i.e. same type IP4, IP6).
- * @return: number of bits the same.
- */
-int addr_in_common(struct sockaddr_storage* addr1, int net1,
- struct sockaddr_storage* addr2, int net2, socklen_t addrlen);
-
-/**
- * Put address into string, works for IPv4 and IPv6.
- * @param addr: address
- * @param addrlen: length of address
- * @param buf: result string stored here
- * @param len: length of buf.
- * On failure a string with "error" is stored inside.
- */
-void addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
- char* buf, size_t len);
-
-/**
- * See if sockaddr is an ipv6 mapped ipv4 address, "::ffff:0.0.0.0"
- * @param addr: address
- * @param addrlen: length of address
- * @return true if so
- */
-int addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen);
-
-/**
- * See if sockaddr is 255.255.255.255.
- * @param addr: address
- * @param addrlen: length of address
- * @return true if so
- */
-int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen);
-
-/**
- * See if sockaddr is 0.0.0.0 or ::0.
- * @param addr: address
- * @param addrlen: length of address
- * @return true if so
- */
-int addr_is_any(struct sockaddr_storage* addr, socklen_t addrlen);
-
-/**
- * Insert new socket list item. If fails logs error.
- * @param list: pointer to pointer to first item.
- * @param addr: address or NULL if 'cache'.
- * @param len: length of addr, or 0 if 'cache'.
- * @param region: where to allocate
- */
-void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr,
- socklen_t len, struct regional* region);
-
-/**
- * Append one list to another. Must both be from same qstate(regional).
- * @param list: pointer to result list that is modified.
- * @param add: item(s) to add. They are prepended to list.
- */
-void sock_list_prepend(struct sock_list** list, struct sock_list* add);
-
-/**
- * Find addr in list.
- * @param list: to search in
- * @param addr: address to look for.
- * @param len: length. Can be 0, look for 'cache entry'.
- * @return true if found.
- */
-int sock_list_find(struct sock_list* list, struct sockaddr_storage* addr,
- socklen_t len);
-
-/**
- * Merge socklist into another socket list. Allocates the new entries
- * freshly and copies them over, so also performs a region switchover.
- * Allocation failures are logged.
- * @param list: the destination list (checked for duplicates)
- * @param region: where to allocate
- * @param add: the list of entries to add.
- */
-void sock_list_merge(struct sock_list** list, struct regional* region,
- struct sock_list* add);
-
-/**
- * Log libcrypto error with descriptive string. Calls log_err().
- * @param str: what failed.
- */
-void log_crypto_err(const char* str);
-
-/**
- * create SSL listen context
- * @param key: private key file.
- * @param pem: public key cert.
- * @param verifypem: if nonNULL, verifylocation file.
- * return SSL_CTX* or NULL on failure (logged).
- */
-void* listen_sslctx_create(char* key, char* pem, char* verifypem);
-
-/**
- * create SSL connect context
- * @param key: if nonNULL (also pem nonNULL), the client private key.
- * @param pem: client public key (or NULL if key is NULL).
- * @param verifypem: if nonNULL used for verifylocation file.
- * @return SSL_CTX* or NULL on failure (logged).
- */
-void* connect_sslctx_create(char* key, char* pem, char* verifypem);
-
-/**
- * accept a new fd and wrap it in a BIO in SSL
- * @param sslctx: the SSL_CTX to use (from listen_sslctx_create()).
- * @param fd: from accept, nonblocking.
- * @return SSL or NULL on alloc failure.
- */
-void* incoming_ssl_fd(void* sslctx, int fd);
-
-/**
- * connect a new fd and wrap it in a BIO in SSL
- * @param sslctx: the SSL_CTX to use (from connect_sslctx_create())
- * @param fd: from connect.
- * @return SSL or NULL on alloc failure
- */
-void* outgoing_ssl_fd(void* sslctx, int fd);
-
-/**
- * Initialize openssl locking for thread safety
- * @return false on failure (alloc failure).
- */
-int ub_openssl_lock_init(void);
-
-/**
- * De-init the allocated openssl locks
- */
-void ub_openssl_lock_delete(void);
-
-#endif /* NET_HELP_H */
diff --git a/external/unbound/util/netevent.c b/external/unbound/util/netevent.c
deleted file mode 100644
index 2084cea3e..000000000
--- a/external/unbound/util/netevent.c
+++ /dev/null
@@ -1,2410 +0,0 @@
-/*
- * util/netevent.c - event notification
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains event notification functions.
- */
-#include "config.h"
-#include "util/netevent.h"
-#include "util/ub_event.h"
-#include "util/log.h"
-#include "util/net_help.h"
-#include "util/fptr_wlist.h"
-#include "sldns/pkthdr.h"
-#include "sldns/sbuffer.h"
-#include "dnstap/dnstap.h"
-#include "dnscrypt/dnscrypt.h"
-#ifdef HAVE_OPENSSL_SSL_H
-#include <openssl/ssl.h>
-#endif
-#ifdef HAVE_OPENSSL_ERR_H
-#include <openssl/err.h>
-#endif
-
-/* -------- Start of local definitions -------- */
-/** if CMSG_ALIGN is not defined on this platform, a workaround */
-#ifndef CMSG_ALIGN
-# ifdef __CMSG_ALIGN
-# define CMSG_ALIGN(n) __CMSG_ALIGN(n)
-# elif defined(CMSG_DATA_ALIGN)
-# define CMSG_ALIGN _CMSG_DATA_ALIGN
-# else
-# define CMSG_ALIGN(len) (((len)+sizeof(long)-1) & ~(sizeof(long)-1))
-# endif
-#endif
-
-/** if CMSG_LEN is not defined on this platform, a workaround */
-#ifndef CMSG_LEN
-# define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr))+(len))
-#endif
-
-/** if CMSG_SPACE is not defined on this platform, a workaround */
-#ifndef CMSG_SPACE
-# ifdef _CMSG_HDR_ALIGN
-# define CMSG_SPACE(l) (CMSG_ALIGN(l)+_CMSG_HDR_ALIGN(sizeof(struct cmsghdr)))
-# else
-# define CMSG_SPACE(l) (CMSG_ALIGN(l)+CMSG_ALIGN(sizeof(struct cmsghdr)))
-# endif
-#endif
-
-/** The TCP reading or writing query timeout in milliseconds */
-#define TCP_QUERY_TIMEOUT 120000
-/** The TCP timeout in msec for fast queries, above half are used */
-#define TCP_QUERY_TIMEOUT_FAST 200
-
-#ifndef NONBLOCKING_IS_BROKEN
-/** number of UDP reads to perform per read indication from select */
-#define NUM_UDP_PER_SELECT 100
-#else
-#define NUM_UDP_PER_SELECT 1
-#endif
-
-/**
- * The internal event structure for keeping ub_event info for the event.
- * Possibly other structures (list, tree) this is part of.
- */
-struct internal_event {
- /** the comm base */
- struct comm_base* base;
- /** ub_event event type */
- struct ub_event* ev;
-};
-
-/**
- * Internal base structure, so that every thread has its own events.
- */
-struct internal_base {
- /** ub_event event_base type. */
- struct ub_event_base* base;
- /** seconds time pointer points here */
- time_t secs;
- /** timeval with current time */
- struct timeval now;
- /** the event used for slow_accept timeouts */
- struct ub_event* slow_accept;
- /** true if slow_accept is enabled */
- int slow_accept_enabled;
-};
-
-/**
- * Internal timer structure, to store timer event in.
- */
-struct internal_timer {
- /** the super struct from which derived */
- struct comm_timer super;
- /** the comm base */
- struct comm_base* base;
- /** ub_event event type */
- struct ub_event* ev;
- /** is timer enabled */
- uint8_t enabled;
-};
-
-/**
- * Internal signal structure, to store signal event in.
- */
-struct internal_signal {
- /** ub_event event type */
- struct ub_event* ev;
- /** next in signal list */
- struct internal_signal* next;
-};
-
-/** create a tcp handler with a parent */
-static struct comm_point* comm_point_create_tcp_handler(
- struct comm_base *base, struct comm_point* parent, size_t bufsize,
- comm_point_callback_type* callback, void* callback_arg);
-
-/* -------- End of local definitions -------- */
-
-struct comm_base*
-comm_base_create(int sigs)
-{
- struct comm_base* b = (struct comm_base*)calloc(1,
- sizeof(struct comm_base));
- const char *evnm="event", *evsys="", *evmethod="";
-
- if(!b)
- return NULL;
- b->eb = (struct internal_base*)calloc(1, sizeof(struct internal_base));
- if(!b->eb) {
- free(b);
- return NULL;
- }
- b->eb->base = ub_default_event_base(sigs, &b->eb->secs, &b->eb->now);
- if(!b->eb->base) {
- free(b->eb);
- free(b);
- return NULL;
- }
- ub_comm_base_now(b);
- ub_get_event_sys(b->eb->base, &evnm, &evsys, &evmethod);
- verbose(VERB_ALGO, "%s %s user %s method.", evnm, evsys, evmethod);
- return b;
-}
-
-struct comm_base*
-comm_base_create_event(struct ub_event_base* base)
-{
- struct comm_base* b = (struct comm_base*)calloc(1,
- sizeof(struct comm_base));
- if(!b)
- return NULL;
- b->eb = (struct internal_base*)calloc(1, sizeof(struct internal_base));
- if(!b->eb) {
- free(b);
- return NULL;
- }
- b->eb->base = base;
- ub_comm_base_now(b);
- return b;
-}
-
-void
-comm_base_delete(struct comm_base* b)
-{
- if(!b)
- return;
- if(b->eb->slow_accept_enabled) {
- if(ub_event_del(b->eb->slow_accept) != 0) {
- log_err("could not event_del slow_accept");
- }
- ub_event_free(b->eb->slow_accept);
- }
- ub_event_base_free(b->eb->base);
- b->eb->base = NULL;
- free(b->eb);
- free(b);
-}
-
-void
-comm_base_delete_no_base(struct comm_base* b)
-{
- if(!b)
- return;
- if(b->eb->slow_accept_enabled) {
- if(ub_event_del(b->eb->slow_accept) != 0) {
- log_err("could not event_del slow_accept");
- }
- ub_event_free(b->eb->slow_accept);
- }
- b->eb->base = NULL;
- free(b->eb);
- free(b);
-}
-
-void
-comm_base_timept(struct comm_base* b, time_t** tt, struct timeval** tv)
-{
- *tt = &b->eb->secs;
- *tv = &b->eb->now;
-}
-
-void
-comm_base_dispatch(struct comm_base* b)
-{
- int retval;
- retval = ub_event_base_dispatch(b->eb->base);
- if(retval < 0) {
- fatal_exit("event_dispatch returned error %d, "
- "errno is %s", retval, strerror(errno));
- }
-}
-
-void comm_base_exit(struct comm_base* b)
-{
- if(ub_event_base_loopexit(b->eb->base) != 0) {
- log_err("Could not loopexit");
- }
-}
-
-void comm_base_set_slow_accept_handlers(struct comm_base* b,
- void (*stop_acc)(void*), void (*start_acc)(void*), void* arg)
-{
- b->stop_accept = stop_acc;
- b->start_accept = start_acc;
- b->cb_arg = arg;
-}
-
-struct ub_event_base* comm_base_internal(struct comm_base* b)
-{
- return b->eb->base;
-}
-
-/** see if errno for udp has to be logged or not uses globals */
-static int
-udp_send_errno_needs_log(struct sockaddr* addr, socklen_t addrlen)
-{
- /* do not log transient errors (unless high verbosity) */
-#if defined(ENETUNREACH) || defined(EHOSTDOWN) || defined(EHOSTUNREACH) || defined(ENETDOWN)
- switch(errno) {
-# ifdef ENETUNREACH
- case ENETUNREACH:
-# endif
-# ifdef EHOSTDOWN
- case EHOSTDOWN:
-# endif
-# ifdef EHOSTUNREACH
- case EHOSTUNREACH:
-# endif
-# ifdef ENETDOWN
- case ENETDOWN:
-# endif
- if(verbosity < VERB_ALGO)
- return 0;
- default:
- break;
- }
-#endif
- /* permission denied is gotten for every send if the
- * network is disconnected (on some OS), squelch it */
- if( ((errno == EPERM)
-# ifdef EADDRNOTAVAIL
- /* 'Cannot assign requested address' also when disconnected */
- || (errno == EADDRNOTAVAIL)
-# endif
- ) && verbosity < VERB_DETAIL)
- return 0;
- /* squelch errors where people deploy AAAA ::ffff:bla for
- * authority servers, which we try for intranets. */
- if(errno == EINVAL && addr_is_ip4mapped(
- (struct sockaddr_storage*)addr, addrlen) &&
- verbosity < VERB_DETAIL)
- return 0;
- /* SO_BROADCAST sockopt can give access to 255.255.255.255,
- * but a dns cache does not need it. */
- if(errno == EACCES && addr_is_broadcast(
- (struct sockaddr_storage*)addr, addrlen) &&
- verbosity < VERB_DETAIL)
- return 0;
- return 1;
-}
-
-int tcp_connect_errno_needs_log(struct sockaddr* addr, socklen_t addrlen)
-{
- return udp_send_errno_needs_log(addr, addrlen);
-}
-
-/* send a UDP reply */
-int
-comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet,
- struct sockaddr* addr, socklen_t addrlen)
-{
- ssize_t sent;
- log_assert(c->fd != -1);
-#ifdef UNBOUND_DEBUG
- if(sldns_buffer_remaining(packet) == 0)
- log_err("error: send empty UDP packet");
-#endif
- log_assert(addr && addrlen > 0);
- sent = sendto(c->fd, (void*)sldns_buffer_begin(packet),
- sldns_buffer_remaining(packet), 0,
- addr, addrlen);
- if(sent == -1) {
- /* try again and block, waiting for IO to complete,
- * we want to send the answer, and we will wait for
- * the ethernet interface buffer to have space. */
-#ifndef USE_WINSOCK
- if(errno == EAGAIN ||
-# ifdef EWOULDBLOCK
- errno == EWOULDBLOCK ||
-# endif
- errno == ENOBUFS) {
-#else
- if(WSAGetLastError() == WSAEINPROGRESS ||
- WSAGetLastError() == WSAENOBUFS ||
- WSAGetLastError() == WSAEWOULDBLOCK) {
-#endif
- int e;
- fd_set_block(c->fd);
- sent = sendto(c->fd, (void*)sldns_buffer_begin(packet),
- sldns_buffer_remaining(packet), 0,
- addr, addrlen);
- e = errno;
- fd_set_nonblock(c->fd);
- errno = e;
- }
- }
- if(sent == -1) {
- if(!udp_send_errno_needs_log(addr, addrlen))
- return 0;
-#ifndef USE_WINSOCK
- verbose(VERB_OPS, "sendto failed: %s", strerror(errno));
-#else
- verbose(VERB_OPS, "sendto failed: %s",
- wsa_strerror(WSAGetLastError()));
-#endif
- log_addr(VERB_OPS, "remote address is",
- (struct sockaddr_storage*)addr, addrlen);
- return 0;
- } else if((size_t)sent != sldns_buffer_remaining(packet)) {
- log_err("sent %d in place of %d bytes",
- (int)sent, (int)sldns_buffer_remaining(packet));
- return 0;
- }
- return 1;
-}
-
-#if defined(AF_INET6) && defined(IPV6_PKTINFO) && (defined(HAVE_RECVMSG) || defined(HAVE_SENDMSG))
-/** print debug ancillary info */
-static void p_ancil(const char* str, struct comm_reply* r)
-{
- if(r->srctype != 4 && r->srctype != 6) {
- log_info("%s: unknown srctype %d", str, r->srctype);
- return;
- }
- if(r->srctype == 6) {
- char buf[1024];
- if(inet_ntop(AF_INET6, &r->pktinfo.v6info.ipi6_addr,
- buf, (socklen_t)sizeof(buf)) == 0) {
- (void)strlcpy(buf, "(inet_ntop error)", sizeof(buf));
- }
- buf[sizeof(buf)-1]=0;
- log_info("%s: %s %d", str, buf, r->pktinfo.v6info.ipi6_ifindex);
- } else if(r->srctype == 4) {
-#ifdef IP_PKTINFO
- char buf1[1024], buf2[1024];
- if(inet_ntop(AF_INET, &r->pktinfo.v4info.ipi_addr,
- buf1, (socklen_t)sizeof(buf1)) == 0) {
- (void)strlcpy(buf1, "(inet_ntop error)", sizeof(buf1));
- }
- buf1[sizeof(buf1)-1]=0;
-#ifdef HAVE_STRUCT_IN_PKTINFO_IPI_SPEC_DST
- if(inet_ntop(AF_INET, &r->pktinfo.v4info.ipi_spec_dst,
- buf2, (socklen_t)sizeof(buf2)) == 0) {
- (void)strlcpy(buf2, "(inet_ntop error)", sizeof(buf2));
- }
- buf2[sizeof(buf2)-1]=0;
-#else
- buf2[0]=0;
-#endif
- log_info("%s: %d %s %s", str, r->pktinfo.v4info.ipi_ifindex,
- buf1, buf2);
-#elif defined(IP_RECVDSTADDR)
- char buf1[1024];
- if(inet_ntop(AF_INET, &r->pktinfo.v4addr,
- buf1, (socklen_t)sizeof(buf1)) == 0) {
- (void)strlcpy(buf1, "(inet_ntop error)", sizeof(buf1));
- }
- buf1[sizeof(buf1)-1]=0;
- log_info("%s: %s", str, buf1);
-#endif /* IP_PKTINFO or PI_RECVDSTDADDR */
- }
-}
-#endif /* AF_INET6 && IPV6_PKTINFO && HAVE_RECVMSG||HAVE_SENDMSG */
-
-/** send a UDP reply over specified interface*/
-static int
-comm_point_send_udp_msg_if(struct comm_point *c, sldns_buffer* packet,
- struct sockaddr* addr, socklen_t addrlen, struct comm_reply* r)
-{
-#if defined(AF_INET6) && defined(IPV6_PKTINFO) && defined(HAVE_SENDMSG)
- ssize_t sent;
- struct msghdr msg;
- struct iovec iov[1];
- char control[256];
-#ifndef S_SPLINT_S
- struct cmsghdr *cmsg;
-#endif /* S_SPLINT_S */
-
- log_assert(c->fd != -1);
-#ifdef UNBOUND_DEBUG
- if(sldns_buffer_remaining(packet) == 0)
- log_err("error: send empty UDP packet");
-#endif
- log_assert(addr && addrlen > 0);
-
- msg.msg_name = addr;
- msg.msg_namelen = addrlen;
- iov[0].iov_base = sldns_buffer_begin(packet);
- iov[0].iov_len = sldns_buffer_remaining(packet);
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
- msg.msg_control = control;
-#ifndef S_SPLINT_S
- msg.msg_controllen = sizeof(control);
-#endif /* S_SPLINT_S */
- msg.msg_flags = 0;
-
-#ifndef S_SPLINT_S
- cmsg = CMSG_FIRSTHDR(&msg);
- if(r->srctype == 4) {
-#ifdef IP_PKTINFO
- void* cmsg_data;
- msg.msg_controllen = CMSG_SPACE(sizeof(struct in_pktinfo));
- log_assert(msg.msg_controllen <= sizeof(control));
- cmsg->cmsg_level = IPPROTO_IP;
- cmsg->cmsg_type = IP_PKTINFO;
- memmove(CMSG_DATA(cmsg), &r->pktinfo.v4info,
- sizeof(struct in_pktinfo));
- /* unset the ifindex to not bypass the routing tables */
- cmsg_data = CMSG_DATA(cmsg);
- ((struct in_pktinfo *) cmsg_data)->ipi_ifindex = 0;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
-#elif defined(IP_SENDSRCADDR)
- msg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
- log_assert(msg.msg_controllen <= sizeof(control));
- cmsg->cmsg_level = IPPROTO_IP;
- cmsg->cmsg_type = IP_SENDSRCADDR;
- memmove(CMSG_DATA(cmsg), &r->pktinfo.v4addr,
- sizeof(struct in_addr));
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
-#else
- verbose(VERB_ALGO, "no IP_PKTINFO or IP_SENDSRCADDR");
- msg.msg_control = NULL;
-#endif /* IP_PKTINFO or IP_SENDSRCADDR */
- } else if(r->srctype == 6) {
- void* cmsg_data;
- msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
- log_assert(msg.msg_controllen <= sizeof(control));
- cmsg->cmsg_level = IPPROTO_IPV6;
- cmsg->cmsg_type = IPV6_PKTINFO;
- memmove(CMSG_DATA(cmsg), &r->pktinfo.v6info,
- sizeof(struct in6_pktinfo));
- /* unset the ifindex to not bypass the routing tables */
- cmsg_data = CMSG_DATA(cmsg);
- ((struct in6_pktinfo *) cmsg_data)->ipi6_ifindex = 0;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
- } else {
- /* try to pass all 0 to use default route */
- msg.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
- log_assert(msg.msg_controllen <= sizeof(control));
- cmsg->cmsg_level = IPPROTO_IPV6;
- cmsg->cmsg_type = IPV6_PKTINFO;
- memset(CMSG_DATA(cmsg), 0, sizeof(struct in6_pktinfo));
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
- }
-#endif /* S_SPLINT_S */
- if(verbosity >= VERB_ALGO)
- p_ancil("send_udp over interface", r);
- sent = sendmsg(c->fd, &msg, 0);
- if(sent == -1) {
- /* try again and block, waiting for IO to complete,
- * we want to send the answer, and we will wait for
- * the ethernet interface buffer to have space. */
-#ifndef USE_WINSOCK
- if(errno == EAGAIN ||
-# ifdef EWOULDBLOCK
- errno == EWOULDBLOCK ||
-# endif
- errno == ENOBUFS) {
-#else
- if(WSAGetLastError() == WSAEINPROGRESS ||
- WSAGetLastError() == WSAENOBUFS ||
- WSAGetLastError() == WSAEWOULDBLOCK) {
-#endif
- int e;
- fd_set_block(c->fd);
- sent = sendmsg(c->fd, &msg, 0);
- e = errno;
- fd_set_nonblock(c->fd);
- errno = e;
- }
- }
- if(sent == -1) {
- if(!udp_send_errno_needs_log(addr, addrlen))
- return 0;
- verbose(VERB_OPS, "sendmsg failed: %s", strerror(errno));
- log_addr(VERB_OPS, "remote address is",
- (struct sockaddr_storage*)addr, addrlen);
-#ifdef __NetBSD__
- /* netbsd 7 has IP_PKTINFO for recv but not send */
- if(errno == EINVAL && r->srctype == 4)
- log_err("sendmsg: No support for sendmsg(IP_PKTINFO). "
- "Please disable interface-automatic");
-#endif
- return 0;
- } else if((size_t)sent != sldns_buffer_remaining(packet)) {
- log_err("sent %d in place of %d bytes",
- (int)sent, (int)sldns_buffer_remaining(packet));
- return 0;
- }
- return 1;
-#else
- (void)c;
- (void)packet;
- (void)addr;
- (void)addrlen;
- (void)r;
- log_err("sendmsg: IPV6_PKTINFO not supported");
- return 0;
-#endif /* AF_INET6 && IPV6_PKTINFO && HAVE_SENDMSG */
-}
-
-void
-comm_point_udp_ancil_callback(int fd, short event, void* arg)
-{
-#if defined(AF_INET6) && defined(IPV6_PKTINFO) && defined(HAVE_RECVMSG)
- struct comm_reply rep;
- struct msghdr msg;
- struct iovec iov[1];
- ssize_t rcv;
- char ancil[256];
- int i;
-#ifndef S_SPLINT_S
- struct cmsghdr* cmsg;
-#endif /* S_SPLINT_S */
-
- rep.c = (struct comm_point*)arg;
- log_assert(rep.c->type == comm_udp);
-
- if(!(event&UB_EV_READ))
- return;
- log_assert(rep.c && rep.c->buffer && rep.c->fd == fd);
- ub_comm_base_now(rep.c->ev->base);
- for(i=0; i<NUM_UDP_PER_SELECT; i++) {
- sldns_buffer_clear(rep.c->buffer);
- rep.addrlen = (socklen_t)sizeof(rep.addr);
- log_assert(fd != -1);
- log_assert(sldns_buffer_remaining(rep.c->buffer) > 0);
- msg.msg_name = &rep.addr;
- msg.msg_namelen = (socklen_t)sizeof(rep.addr);
- iov[0].iov_base = sldns_buffer_begin(rep.c->buffer);
- iov[0].iov_len = sldns_buffer_remaining(rep.c->buffer);
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
- msg.msg_control = ancil;
-#ifndef S_SPLINT_S
- msg.msg_controllen = sizeof(ancil);
-#endif /* S_SPLINT_S */
- msg.msg_flags = 0;
- rcv = recvmsg(fd, &msg, 0);
- if(rcv == -1) {
- if(errno != EAGAIN && errno != EINTR) {
- log_err("recvmsg failed: %s", strerror(errno));
- }
- return;
- }
- rep.addrlen = msg.msg_namelen;
- sldns_buffer_skip(rep.c->buffer, rcv);
- sldns_buffer_flip(rep.c->buffer);
- rep.srctype = 0;
-#ifndef S_SPLINT_S
- for(cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
- cmsg = CMSG_NXTHDR(&msg, cmsg)) {
- if( cmsg->cmsg_level == IPPROTO_IPV6 &&
- cmsg->cmsg_type == IPV6_PKTINFO) {
- rep.srctype = 6;
- memmove(&rep.pktinfo.v6info, CMSG_DATA(cmsg),
- sizeof(struct in6_pktinfo));
- break;
-#ifdef IP_PKTINFO
- } else if( cmsg->cmsg_level == IPPROTO_IP &&
- cmsg->cmsg_type == IP_PKTINFO) {
- rep.srctype = 4;
- memmove(&rep.pktinfo.v4info, CMSG_DATA(cmsg),
- sizeof(struct in_pktinfo));
- break;
-#elif defined(IP_RECVDSTADDR)
- } else if( cmsg->cmsg_level == IPPROTO_IP &&
- cmsg->cmsg_type == IP_RECVDSTADDR) {
- rep.srctype = 4;
- memmove(&rep.pktinfo.v4addr, CMSG_DATA(cmsg),
- sizeof(struct in_addr));
- break;
-#endif /* IP_PKTINFO or IP_RECVDSTADDR */
- }
- }
- if(verbosity >= VERB_ALGO)
- p_ancil("receive_udp on interface", &rep);
-#endif /* S_SPLINT_S */
- fptr_ok(fptr_whitelist_comm_point(rep.c->callback));
- if((*rep.c->callback)(rep.c, rep.c->cb_arg, NETEVENT_NOERROR, &rep)) {
- /* send back immediate reply */
- (void)comm_point_send_udp_msg_if(rep.c, rep.c->buffer,
- (struct sockaddr*)&rep.addr, rep.addrlen, &rep);
- }
- if(rep.c->fd == -1) /* commpoint closed */
- break;
- }
-#else
- (void)fd;
- (void)event;
- (void)arg;
- fatal_exit("recvmsg: No support for IPV6_PKTINFO; IP_PKTINFO or IP_RECVDSTADDR. "
- "Please disable interface-automatic");
-#endif /* AF_INET6 && IPV6_PKTINFO && HAVE_RECVMSG */
-}
-
-void
-comm_point_udp_callback(int fd, short event, void* arg)
-{
- struct comm_reply rep;
- ssize_t rcv;
- int i;
- struct sldns_buffer *buffer;
-
- rep.c = (struct comm_point*)arg;
- log_assert(rep.c->type == comm_udp);
-
- if(!(event&UB_EV_READ))
- return;
- log_assert(rep.c && rep.c->buffer && rep.c->fd == fd);
- ub_comm_base_now(rep.c->ev->base);
- for(i=0; i<NUM_UDP_PER_SELECT; i++) {
- sldns_buffer_clear(rep.c->buffer);
- rep.addrlen = (socklen_t)sizeof(rep.addr);
- log_assert(fd != -1);
- log_assert(sldns_buffer_remaining(rep.c->buffer) > 0);
- rcv = recvfrom(fd, (void*)sldns_buffer_begin(rep.c->buffer),
- sldns_buffer_remaining(rep.c->buffer), 0,
- (struct sockaddr*)&rep.addr, &rep.addrlen);
- if(rcv == -1) {
-#ifndef USE_WINSOCK
- if(errno != EAGAIN && errno != EINTR)
- log_err("recvfrom %d failed: %s",
- fd, strerror(errno));
-#else
- if(WSAGetLastError() != WSAEINPROGRESS &&
- WSAGetLastError() != WSAECONNRESET &&
- WSAGetLastError()!= WSAEWOULDBLOCK)
- log_err("recvfrom failed: %s",
- wsa_strerror(WSAGetLastError()));
-#endif
- return;
- }
- sldns_buffer_skip(rep.c->buffer, rcv);
- sldns_buffer_flip(rep.c->buffer);
- rep.srctype = 0;
- fptr_ok(fptr_whitelist_comm_point(rep.c->callback));
- if((*rep.c->callback)(rep.c, rep.c->cb_arg, NETEVENT_NOERROR, &rep)) {
- /* send back immediate reply */
-#ifdef USE_DNSCRYPT
- buffer = rep.c->dnscrypt_buffer;
-#else
- buffer = rep.c->buffer;
-#endif
- (void)comm_point_send_udp_msg(rep.c, buffer,
- (struct sockaddr*)&rep.addr, rep.addrlen);
- }
- if(rep.c->fd != fd) /* commpoint closed to -1 or reused for
- another UDP port. Note rep.c cannot be reused with TCP fd. */
- break;
- }
-}
-
-/** Use a new tcp handler for new query fd, set to read query */
-static void
-setup_tcp_handler(struct comm_point* c, int fd, int cur, int max)
-{
- log_assert(c->type == comm_tcp);
- log_assert(c->fd == -1);
- sldns_buffer_clear(c->buffer);
-#ifdef USE_DNSCRYPT
- if (c->dnscrypt)
- sldns_buffer_clear(c->dnscrypt_buffer);
-#endif
- c->tcp_is_reading = 1;
- c->tcp_byte_count = 0;
- c->tcp_timeout_msec = TCP_QUERY_TIMEOUT;
- /* if more than half the tcp handlers are in use, use a shorter
- * timeout for this TCP connection, we need to make space for
- * other connections to be able to get attention */
- if(cur > max/2)
- c->tcp_timeout_msec = TCP_QUERY_TIMEOUT_FAST;
- comm_point_start_listening(c, fd, c->tcp_timeout_msec);
-}
-
-void comm_base_handle_slow_accept(int ATTR_UNUSED(fd),
- short ATTR_UNUSED(event), void* arg)
-{
- struct comm_base* b = (struct comm_base*)arg;
- /* timeout for the slow accept, re-enable accepts again */
- if(b->start_accept) {
- verbose(VERB_ALGO, "wait is over, slow accept disabled");
- fptr_ok(fptr_whitelist_start_accept(b->start_accept));
- (*b->start_accept)(b->cb_arg);
- b->eb->slow_accept_enabled = 0;
- }
-}
-
-int comm_point_perform_accept(struct comm_point* c,
- struct sockaddr_storage* addr, socklen_t* addrlen)
-{
- int new_fd;
- *addrlen = (socklen_t)sizeof(*addr);
- new_fd = accept(c->fd, (struct sockaddr*)addr, addrlen);
- if(new_fd == -1) {
-#ifndef USE_WINSOCK
- /* EINTR is signal interrupt. others are closed connection. */
- if( errno == EINTR || errno == EAGAIN
-#ifdef EWOULDBLOCK
- || errno == EWOULDBLOCK
-#endif
-#ifdef ECONNABORTED
- || errno == ECONNABORTED
-#endif
-#ifdef EPROTO
- || errno == EPROTO
-#endif /* EPROTO */
- )
- return -1;
-#if defined(ENFILE) && defined(EMFILE)
- if(errno == ENFILE || errno == EMFILE) {
- /* out of file descriptors, likely outside of our
- * control. stop accept() calls for some time */
- if(c->ev->base->stop_accept) {
- struct comm_base* b = c->ev->base;
- struct timeval tv;
- verbose(VERB_ALGO, "out of file descriptors: "
- "slow accept");
- b->eb->slow_accept_enabled = 1;
- fptr_ok(fptr_whitelist_stop_accept(
- b->stop_accept));
- (*b->stop_accept)(b->cb_arg);
- /* set timeout, no mallocs */
- tv.tv_sec = NETEVENT_SLOW_ACCEPT_TIME/1000;
- tv.tv_usec = (NETEVENT_SLOW_ACCEPT_TIME%1000)*1000;
- b->eb->slow_accept = ub_event_new(b->eb->base,
- -1, UB_EV_TIMEOUT,
- comm_base_handle_slow_accept, b);
- if(b->eb->slow_accept == NULL) {
- /* we do not want to log here, because
- * that would spam the logfiles.
- * error: "event_base_set failed." */
- }
- else if(ub_event_add(b->eb->slow_accept, &tv)
- != 0) {
- /* we do not want to log here,
- * error: "event_add failed." */
- }
- }
- return -1;
- }
-#endif
- log_err_addr("accept failed", strerror(errno), addr, *addrlen);
-#else /* USE_WINSOCK */
- if(WSAGetLastError() == WSAEINPROGRESS ||
- WSAGetLastError() == WSAECONNRESET)
- return -1;
- if(WSAGetLastError() == WSAEWOULDBLOCK) {
- ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ);
- return -1;
- }
- log_err_addr("accept failed", wsa_strerror(WSAGetLastError()),
- addr, *addrlen);
-#endif
- return -1;
- }
- fd_set_nonblock(new_fd);
- return new_fd;
-}
-
-#ifdef USE_WINSOCK
-static long win_bio_cb(BIO *b, int oper, const char* ATTR_UNUSED(argp),
- int ATTR_UNUSED(argi), long argl, long retvalue)
-{
- verbose(VERB_ALGO, "bio_cb %d, %s %s %s", oper,
- (oper&BIO_CB_RETURN)?"return":"before",
- (oper&BIO_CB_READ)?"read":((oper&BIO_CB_WRITE)?"write":"other"),
- WSAGetLastError()==WSAEWOULDBLOCK?"wsawb":"");
- /* on windows, check if previous operation caused EWOULDBLOCK */
- if( (oper == (BIO_CB_READ|BIO_CB_RETURN) && argl == 0) ||
- (oper == (BIO_CB_GETS|BIO_CB_RETURN) && argl == 0)) {
- if(WSAGetLastError() == WSAEWOULDBLOCK)
- ub_winsock_tcp_wouldblock((struct ub_event*)
- BIO_get_callback_arg(b), UB_EV_READ);
- }
- if( (oper == (BIO_CB_WRITE|BIO_CB_RETURN) && argl == 0) ||
- (oper == (BIO_CB_PUTS|BIO_CB_RETURN) && argl == 0)) {
- if(WSAGetLastError() == WSAEWOULDBLOCK)
- ub_winsock_tcp_wouldblock((struct ub_event*)
- BIO_get_callback_arg(b), UB_EV_WRITE);
- }
- /* return original return value */
- return retvalue;
-}
-
-/** set win bio callbacks for nonblocking operations */
-void
-comm_point_tcp_win_bio_cb(struct comm_point* c, void* thessl)
-{
- SSL* ssl = (SSL*)thessl;
- /* set them both just in case, but usually they are the same BIO */
- BIO_set_callback(SSL_get_rbio(ssl), &win_bio_cb);
- BIO_set_callback_arg(SSL_get_rbio(ssl), (char*)c->ev->ev);
- BIO_set_callback(SSL_get_wbio(ssl), &win_bio_cb);
- BIO_set_callback_arg(SSL_get_wbio(ssl), (char*)c->ev->ev);
-}
-#endif
-
-void
-comm_point_tcp_accept_callback(int fd, short event, void* arg)
-{
- struct comm_point* c = (struct comm_point*)arg, *c_hdl;
- int new_fd;
- log_assert(c->type == comm_tcp_accept);
- if(!(event & UB_EV_READ)) {
- log_info("ignoring tcp accept event %d", (int)event);
- return;
- }
- ub_comm_base_now(c->ev->base);
- /* find free tcp handler. */
- if(!c->tcp_free) {
- log_warn("accepted too many tcp, connections full");
- return;
- }
- /* accept incoming connection. */
- c_hdl = c->tcp_free;
- log_assert(fd != -1);
- (void)fd;
- new_fd = comm_point_perform_accept(c, &c_hdl->repinfo.addr,
- &c_hdl->repinfo.addrlen);
- if(new_fd == -1)
- return;
- if(c->ssl) {
- c_hdl->ssl = incoming_ssl_fd(c->ssl, new_fd);
- if(!c_hdl->ssl) {
- c_hdl->fd = new_fd;
- comm_point_close(c_hdl);
- return;
- }
- c_hdl->ssl_shake_state = comm_ssl_shake_read;
-#ifdef USE_WINSOCK
- comm_point_tcp_win_bio_cb(c_hdl, c_hdl->ssl);
-#endif
- }
-
- /* grab the tcp handler buffers */
- c->cur_tcp_count++;
- c->tcp_free = c_hdl->tcp_free;
- if(!c->tcp_free) {
- /* stop accepting incoming queries for now. */
- comm_point_stop_listening(c);
- }
- setup_tcp_handler(c_hdl, new_fd, c->cur_tcp_count, c->max_tcp_count);
-}
-
-/** Make tcp handler free for next assignment */
-static void
-reclaim_tcp_handler(struct comm_point* c)
-{
- log_assert(c->type == comm_tcp);
- if(c->ssl) {
-#ifdef HAVE_SSL
- SSL_shutdown(c->ssl);
- SSL_free(c->ssl);
- c->ssl = NULL;
-#endif
- }
- comm_point_close(c);
- if(c->tcp_parent) {
- c->tcp_parent->cur_tcp_count--;
- c->tcp_free = c->tcp_parent->tcp_free;
- c->tcp_parent->tcp_free = c;
- if(!c->tcp_free) {
- /* re-enable listening on accept socket */
- comm_point_start_listening(c->tcp_parent, -1, -1);
- }
- }
-}
-
-/** do the callback when writing is done */
-static void
-tcp_callback_writer(struct comm_point* c)
-{
- log_assert(c->type == comm_tcp);
- sldns_buffer_clear(c->buffer);
- if(c->tcp_do_toggle_rw)
- c->tcp_is_reading = 1;
- c->tcp_byte_count = 0;
- /* switch from listening(write) to listening(read) */
- comm_point_stop_listening(c);
- comm_point_start_listening(c, -1, -1);
-}
-
-/** do the callback when reading is done */
-static void
-tcp_callback_reader(struct comm_point* c)
-{
- log_assert(c->type == comm_tcp || c->type == comm_local);
- sldns_buffer_flip(c->buffer);
- if(c->tcp_do_toggle_rw)
- c->tcp_is_reading = 0;
- c->tcp_byte_count = 0;
- if(c->type == comm_tcp)
- comm_point_stop_listening(c);
- fptr_ok(fptr_whitelist_comm_point(c->callback));
- if( (*c->callback)(c, c->cb_arg, NETEVENT_NOERROR, &c->repinfo) ) {
- comm_point_start_listening(c, -1, c->tcp_timeout_msec);
- }
-}
-
-/** continue ssl handshake */
-#ifdef HAVE_SSL
-static int
-ssl_handshake(struct comm_point* c)
-{
- int r;
- if(c->ssl_shake_state == comm_ssl_shake_hs_read) {
- /* read condition satisfied back to writing */
- comm_point_listen_for_rw(c, 1, 1);
- c->ssl_shake_state = comm_ssl_shake_none;
- return 1;
- }
- if(c->ssl_shake_state == comm_ssl_shake_hs_write) {
- /* write condition satisfied, back to reading */
- comm_point_listen_for_rw(c, 1, 0);
- c->ssl_shake_state = comm_ssl_shake_none;
- return 1;
- }
-
- ERR_clear_error();
- r = SSL_do_handshake(c->ssl);
- if(r != 1) {
- int want = SSL_get_error(c->ssl, r);
- if(want == SSL_ERROR_WANT_READ) {
- if(c->ssl_shake_state == comm_ssl_shake_read)
- return 1;
- c->ssl_shake_state = comm_ssl_shake_read;
- comm_point_listen_for_rw(c, 1, 0);
- return 1;
- } else if(want == SSL_ERROR_WANT_WRITE) {
- if(c->ssl_shake_state == comm_ssl_shake_write)
- return 1;
- c->ssl_shake_state = comm_ssl_shake_write;
- comm_point_listen_for_rw(c, 0, 1);
- return 1;
- } else if(r == 0) {
- return 0; /* closed */
- } else if(want == SSL_ERROR_SYSCALL) {
- /* SYSCALL and errno==0 means closed uncleanly */
- if(errno != 0)
- log_err("SSL_handshake syscall: %s",
- strerror(errno));
- return 0;
- } else {
- log_crypto_err("ssl handshake failed");
- log_addr(1, "ssl handshake failed", &c->repinfo.addr,
- c->repinfo.addrlen);
- return 0;
- }
- }
- /* this is where peer verification could take place */
- log_addr(VERB_ALGO, "SSL DNS connection", &c->repinfo.addr,
- c->repinfo.addrlen);
-
- /* setup listen rw correctly */
- if(c->tcp_is_reading) {
- if(c->ssl_shake_state != comm_ssl_shake_read)
- comm_point_listen_for_rw(c, 1, 0);
- } else {
- comm_point_listen_for_rw(c, 1, 1);
- }
- c->ssl_shake_state = comm_ssl_shake_none;
- return 1;
-}
-#endif /* HAVE_SSL */
-
-/** ssl read callback on TCP */
-static int
-ssl_handle_read(struct comm_point* c)
-{
-#ifdef HAVE_SSL
- int r;
- if(c->ssl_shake_state != comm_ssl_shake_none) {
- if(!ssl_handshake(c))
- return 0;
- if(c->ssl_shake_state != comm_ssl_shake_none)
- return 1;
- }
- if(c->tcp_byte_count < sizeof(uint16_t)) {
- /* read length bytes */
- ERR_clear_error();
- if((r=SSL_read(c->ssl, (void*)sldns_buffer_at(c->buffer,
- c->tcp_byte_count), (int)(sizeof(uint16_t) -
- c->tcp_byte_count))) <= 0) {
- int want = SSL_get_error(c->ssl, r);
- if(want == SSL_ERROR_ZERO_RETURN) {
- return 0; /* shutdown, closed */
- } else if(want == SSL_ERROR_WANT_READ) {
- return 1; /* read more later */
- } else if(want == SSL_ERROR_WANT_WRITE) {
- c->ssl_shake_state = comm_ssl_shake_hs_write;
- comm_point_listen_for_rw(c, 0, 1);
- return 1;
- } else if(want == SSL_ERROR_SYSCALL) {
- if(errno != 0)
- log_err("SSL_read syscall: %s",
- strerror(errno));
- return 0;
- }
- log_crypto_err("could not SSL_read");
- return 0;
- }
- c->tcp_byte_count += r;
- if(c->tcp_byte_count != sizeof(uint16_t))
- return 1;
- if(sldns_buffer_read_u16_at(c->buffer, 0) >
- sldns_buffer_capacity(c->buffer)) {
- verbose(VERB_QUERY, "ssl: dropped larger than buffer");
- return 0;
- }
- sldns_buffer_set_limit(c->buffer,
- sldns_buffer_read_u16_at(c->buffer, 0));
- if(sldns_buffer_limit(c->buffer) < LDNS_HEADER_SIZE) {
- verbose(VERB_QUERY, "ssl: dropped bogus too short.");
- return 0;
- }
- verbose(VERB_ALGO, "Reading ssl tcp query of length %d",
- (int)sldns_buffer_limit(c->buffer));
- }
- log_assert(sldns_buffer_remaining(c->buffer) > 0);
- ERR_clear_error();
- r = SSL_read(c->ssl, (void*)sldns_buffer_current(c->buffer),
- (int)sldns_buffer_remaining(c->buffer));
- if(r <= 0) {
- int want = SSL_get_error(c->ssl, r);
- if(want == SSL_ERROR_ZERO_RETURN) {
- return 0; /* shutdown, closed */
- } else if(want == SSL_ERROR_WANT_READ) {
- return 1; /* read more later */
- } else if(want == SSL_ERROR_WANT_WRITE) {
- c->ssl_shake_state = comm_ssl_shake_hs_write;
- comm_point_listen_for_rw(c, 0, 1);
- return 1;
- } else if(want == SSL_ERROR_SYSCALL) {
- if(errno != 0)
- log_err("SSL_read syscall: %s",
- strerror(errno));
- return 0;
- }
- log_crypto_err("could not SSL_read");
- return 0;
- }
- sldns_buffer_skip(c->buffer, (ssize_t)r);
- if(sldns_buffer_remaining(c->buffer) <= 0) {
- tcp_callback_reader(c);
- }
- return 1;
-#else
- (void)c;
- return 0;
-#endif /* HAVE_SSL */
-}
-
-/** ssl write callback on TCP */
-static int
-ssl_handle_write(struct comm_point* c)
-{
-#ifdef HAVE_SSL
- int r;
- if(c->ssl_shake_state != comm_ssl_shake_none) {
- if(!ssl_handshake(c))
- return 0;
- if(c->ssl_shake_state != comm_ssl_shake_none)
- return 1;
- }
- /* ignore return, if fails we may simply block */
- (void)SSL_set_mode(c->ssl, SSL_MODE_ENABLE_PARTIAL_WRITE);
- if(c->tcp_byte_count < sizeof(uint16_t)) {
- uint16_t len = htons(sldns_buffer_limit(c->buffer));
- ERR_clear_error();
- r = SSL_write(c->ssl,
- (void*)(((uint8_t*)&len)+c->tcp_byte_count),
- (int)(sizeof(uint16_t)-c->tcp_byte_count));
- if(r <= 0) {
- int want = SSL_get_error(c->ssl, r);
- if(want == SSL_ERROR_ZERO_RETURN) {
- return 0; /* closed */
- } else if(want == SSL_ERROR_WANT_READ) {
- c->ssl_shake_state = comm_ssl_shake_read;
- comm_point_listen_for_rw(c, 1, 0);
- return 1; /* wait for read condition */
- } else if(want == SSL_ERROR_WANT_WRITE) {
- return 1; /* write more later */
- } else if(want == SSL_ERROR_SYSCALL) {
- if(errno != 0)
- log_err("SSL_write syscall: %s",
- strerror(errno));
- return 0;
- }
- log_crypto_err("could not SSL_write");
- return 0;
- }
- c->tcp_byte_count += r;
- if(c->tcp_byte_count < sizeof(uint16_t))
- return 1;
- sldns_buffer_set_position(c->buffer, c->tcp_byte_count -
- sizeof(uint16_t));
- if(sldns_buffer_remaining(c->buffer) == 0) {
- tcp_callback_writer(c);
- return 1;
- }
- }
- log_assert(sldns_buffer_remaining(c->buffer) > 0);
- ERR_clear_error();
- r = SSL_write(c->ssl, (void*)sldns_buffer_current(c->buffer),
- (int)sldns_buffer_remaining(c->buffer));
- if(r <= 0) {
- int want = SSL_get_error(c->ssl, r);
- if(want == SSL_ERROR_ZERO_RETURN) {
- return 0; /* closed */
- } else if(want == SSL_ERROR_WANT_READ) {
- c->ssl_shake_state = comm_ssl_shake_read;
- comm_point_listen_for_rw(c, 1, 0);
- return 1; /* wait for read condition */
- } else if(want == SSL_ERROR_WANT_WRITE) {
- return 1; /* write more later */
- } else if(want == SSL_ERROR_SYSCALL) {
- if(errno != 0)
- log_err("SSL_write syscall: %s",
- strerror(errno));
- return 0;
- }
- log_crypto_err("could not SSL_write");
- return 0;
- }
- sldns_buffer_skip(c->buffer, (ssize_t)r);
-
- if(sldns_buffer_remaining(c->buffer) == 0) {
- tcp_callback_writer(c);
- }
- return 1;
-#else
- (void)c;
- return 0;
-#endif /* HAVE_SSL */
-}
-
-/** handle ssl tcp connection with dns contents */
-static int
-ssl_handle_it(struct comm_point* c)
-{
- if(c->tcp_is_reading)
- return ssl_handle_read(c);
- return ssl_handle_write(c);
-}
-
-/** Handle tcp reading callback.
- * @param fd: file descriptor of socket.
- * @param c: comm point to read from into buffer.
- * @param short_ok: if true, very short packets are OK (for comm_local).
- * @return: 0 on error
- */
-static int
-comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok)
-{
- ssize_t r;
- log_assert(c->type == comm_tcp || c->type == comm_local);
- if(c->ssl)
- return ssl_handle_it(c);
- if(!c->tcp_is_reading)
- return 0;
-
- log_assert(fd != -1);
- if(c->tcp_byte_count < sizeof(uint16_t)) {
- /* read length bytes */
- r = recv(fd,(void*)sldns_buffer_at(c->buffer,c->tcp_byte_count),
- sizeof(uint16_t)-c->tcp_byte_count, 0);
- if(r == 0)
- return 0;
- else if(r == -1) {
-#ifndef USE_WINSOCK
- if(errno == EINTR || errno == EAGAIN)
- return 1;
-#ifdef ECONNRESET
- if(errno == ECONNRESET && verbosity < 2)
- return 0; /* silence reset by peer */
-#endif
- log_err_addr("read (in tcp s)", strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
-#else /* USE_WINSOCK */
- if(WSAGetLastError() == WSAECONNRESET)
- return 0;
- if(WSAGetLastError() == WSAEINPROGRESS)
- return 1;
- if(WSAGetLastError() == WSAEWOULDBLOCK) {
- ub_winsock_tcp_wouldblock(c->ev->ev,
- UB_EV_READ);
- return 1;
- }
- log_err_addr("read (in tcp s)",
- wsa_strerror(WSAGetLastError()),
- &c->repinfo.addr, c->repinfo.addrlen);
-#endif
- return 0;
- }
- c->tcp_byte_count += r;
- if(c->tcp_byte_count != sizeof(uint16_t))
- return 1;
- if(sldns_buffer_read_u16_at(c->buffer, 0) >
- sldns_buffer_capacity(c->buffer)) {
- verbose(VERB_QUERY, "tcp: dropped larger than buffer");
- return 0;
- }
- sldns_buffer_set_limit(c->buffer,
- sldns_buffer_read_u16_at(c->buffer, 0));
- if(!short_ok &&
- sldns_buffer_limit(c->buffer) < LDNS_HEADER_SIZE) {
- verbose(VERB_QUERY, "tcp: dropped bogus too short.");
- return 0;
- }
- verbose(VERB_ALGO, "Reading tcp query of length %d",
- (int)sldns_buffer_limit(c->buffer));
- }
-
- log_assert(sldns_buffer_remaining(c->buffer) > 0);
- r = recv(fd, (void*)sldns_buffer_current(c->buffer),
- sldns_buffer_remaining(c->buffer), 0);
- if(r == 0) {
- return 0;
- } else if(r == -1) {
-#ifndef USE_WINSOCK
- if(errno == EINTR || errno == EAGAIN)
- return 1;
- log_err_addr("read (in tcp r)", strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
-#else /* USE_WINSOCK */
- if(WSAGetLastError() == WSAECONNRESET)
- return 0;
- if(WSAGetLastError() == WSAEINPROGRESS)
- return 1;
- if(WSAGetLastError() == WSAEWOULDBLOCK) {
- ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ);
- return 1;
- }
- log_err_addr("read (in tcp r)",
- wsa_strerror(WSAGetLastError()),
- &c->repinfo.addr, c->repinfo.addrlen);
-#endif
- return 0;
- }
- sldns_buffer_skip(c->buffer, r);
- if(sldns_buffer_remaining(c->buffer) <= 0) {
- tcp_callback_reader(c);
- }
- return 1;
-}
-
-/**
- * Handle tcp writing callback.
- * @param fd: file descriptor of socket.
- * @param c: comm point to write buffer out of.
- * @return: 0 on error
- */
-static int
-comm_point_tcp_handle_write(int fd, struct comm_point* c)
-{
- ssize_t r;
- struct sldns_buffer *buffer;
- log_assert(c->type == comm_tcp);
-#ifdef USE_DNSCRYPT
- buffer = c->dnscrypt_buffer;
-#else
- buffer = c->buffer;
-#endif
- if(c->tcp_is_reading && !c->ssl)
- return 0;
- log_assert(fd != -1);
- if(c->tcp_byte_count == 0 && c->tcp_check_nb_connect) {
- /* check for pending error from nonblocking connect */
- /* from Stevens, unix network programming, vol1, 3rd ed, p450*/
- int error = 0;
- socklen_t len = (socklen_t)sizeof(error);
- if(getsockopt(fd, SOL_SOCKET, SO_ERROR, (void*)&error,
- &len) < 0){
-#ifndef USE_WINSOCK
- error = errno; /* on solaris errno is error */
-#else /* USE_WINSOCK */
- error = WSAGetLastError();
-#endif
- }
-#ifndef USE_WINSOCK
-#if defined(EINPROGRESS) && defined(EWOULDBLOCK)
- if(error == EINPROGRESS || error == EWOULDBLOCK)
- return 1; /* try again later */
- else
-#endif
- if(error != 0 && verbosity < 2)
- return 0; /* silence lots of chatter in the logs */
- else if(error != 0) {
- log_err_addr("tcp connect", strerror(error),
- &c->repinfo.addr, c->repinfo.addrlen);
-#else /* USE_WINSOCK */
- /* examine error */
- if(error == WSAEINPROGRESS)
- return 1;
- else if(error == WSAEWOULDBLOCK) {
- ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE);
- return 1;
- } else if(error != 0 && verbosity < 2)
- return 0;
- else if(error != 0) {
- log_err_addr("tcp connect", wsa_strerror(error),
- &c->repinfo.addr, c->repinfo.addrlen);
-#endif /* USE_WINSOCK */
- return 0;
- }
- }
- if(c->ssl)
- return ssl_handle_it(c);
-
-#ifdef USE_MSG_FASTOPEN
- /* Only try this on first use of a connection that uses tfo,
- otherwise fall through to normal write */
- /* Also, TFO support on WINDOWS not implemented at the moment */
- if(c->tcp_do_fastopen == 1) {
- /* this form of sendmsg() does both a connect() and send() so need to
- look for various flavours of error*/
- uint16_t len = htons(sldns_buffer_limit(buffer));
- struct msghdr msg;
- struct iovec iov[2];
- c->tcp_do_fastopen = 0;
- memset(&msg, 0, sizeof(msg));
- iov[0].iov_base = (uint8_t*)&len + c->tcp_byte_count;
- iov[0].iov_len = sizeof(uint16_t) - c->tcp_byte_count;
- iov[1].iov_base = sldns_buffer_begin(buffer);
- iov[1].iov_len = sldns_buffer_limit(buffer);
- log_assert(iov[0].iov_len > 0);
- log_assert(iov[1].iov_len > 0);
- msg.msg_name = &c->repinfo.addr;
- msg.msg_namelen = c->repinfo.addrlen;
- msg.msg_iov = iov;
- msg.msg_iovlen = 2;
- r = sendmsg(fd, &msg, MSG_FASTOPEN);
- if (r == -1) {
-#if defined(EINPROGRESS) && defined(EWOULDBLOCK)
- /* Handshake is underway, maybe because no TFO cookie available.
- Come back to write the messsage*/
- if(errno == EINPROGRESS || errno == EWOULDBLOCK)
- return 1;
-#endif
- if(errno == EINTR || errno == EAGAIN)
- return 1;
- /* Not handling EISCONN here as shouldn't ever hit that case.*/
- if(errno != 0 && verbosity < 2)
- return 0; /* silence lots of chatter in the logs */
- else if(errno != 0)
- log_err_addr("tcp sendmsg", strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
- return 0;
- } else {
- c->tcp_byte_count += r;
- if(c->tcp_byte_count < sizeof(uint16_t))
- return 1;
- sldns_buffer_set_position(buffer, c->tcp_byte_count -
- sizeof(uint16_t));
- if(sldns_buffer_remaining(buffer) == 0) {
- tcp_callback_writer(c);
- return 1;
- }
- }
- }
-#endif /* USE_MSG_FASTOPEN */
-
- if(c->tcp_byte_count < sizeof(uint16_t)) {
- uint16_t len = htons(sldns_buffer_limit(buffer));
-#ifdef HAVE_WRITEV
- struct iovec iov[2];
- iov[0].iov_base = (uint8_t*)&len + c->tcp_byte_count;
- iov[0].iov_len = sizeof(uint16_t) - c->tcp_byte_count;
- iov[1].iov_base = sldns_buffer_begin(buffer);
- iov[1].iov_len = sldns_buffer_limit(buffer);
- log_assert(iov[0].iov_len > 0);
- log_assert(iov[1].iov_len > 0);
- r = writev(fd, iov, 2);
-#else /* HAVE_WRITEV */
- r = send(fd, (void*)(((uint8_t*)&len)+c->tcp_byte_count),
- sizeof(uint16_t)-c->tcp_byte_count, 0);
-#endif /* HAVE_WRITEV */
- if(r == -1) {
-#ifndef USE_WINSOCK
-# ifdef EPIPE
- if(errno == EPIPE && verbosity < 2)
- return 0; /* silence 'broken pipe' */
- #endif
- if(errno == EINTR || errno == EAGAIN)
- return 1;
-# ifdef HAVE_WRITEV
- log_err_addr("tcp writev", strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
-# else /* HAVE_WRITEV */
- log_err_addr("tcp send s", strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
-# endif /* HAVE_WRITEV */
-#else
- if(WSAGetLastError() == WSAENOTCONN)
- return 1;
- if(WSAGetLastError() == WSAEINPROGRESS)
- return 1;
- if(WSAGetLastError() == WSAEWOULDBLOCK) {
- ub_winsock_tcp_wouldblock(c->ev->ev,
- UB_EV_WRITE);
- return 1;
- }
- log_err_addr("tcp send s",
- wsa_strerror(WSAGetLastError()),
- &c->repinfo.addr, c->repinfo.addrlen);
-#endif
- return 0;
- }
- c->tcp_byte_count += r;
- if(c->tcp_byte_count < sizeof(uint16_t))
- return 1;
- sldns_buffer_set_position(buffer, c->tcp_byte_count -
- sizeof(uint16_t));
- if(sldns_buffer_remaining(buffer) == 0) {
- tcp_callback_writer(c);
- return 1;
- }
- }
- log_assert(sldns_buffer_remaining(buffer) > 0);
- r = send(fd, (void*)sldns_buffer_current(buffer),
- sldns_buffer_remaining(buffer), 0);
- if(r == -1) {
-#ifndef USE_WINSOCK
- if(errno == EINTR || errno == EAGAIN)
- return 1;
- log_err_addr("tcp send r", strerror(errno),
- &c->repinfo.addr, c->repinfo.addrlen);
-#else
- if(WSAGetLastError() == WSAEINPROGRESS)
- return 1;
- if(WSAGetLastError() == WSAEWOULDBLOCK) {
- ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE);
- return 1;
- }
- log_err_addr("tcp send r", wsa_strerror(WSAGetLastError()),
- &c->repinfo.addr, c->repinfo.addrlen);
-#endif
- return 0;
- }
- sldns_buffer_skip(buffer, r);
-
- if(sldns_buffer_remaining(buffer) == 0) {
- tcp_callback_writer(c);
- }
-
- return 1;
-}
-
-void
-comm_point_tcp_handle_callback(int fd, short event, void* arg)
-{
- struct comm_point* c = (struct comm_point*)arg;
- log_assert(c->type == comm_tcp);
- ub_comm_base_now(c->ev->base);
-
-#ifdef USE_DNSCRYPT
- /* Initialize if this is a dnscrypt socket */
- if(c->tcp_parent) {
- c->dnscrypt = c->tcp_parent->dnscrypt;
- }
- if(c->dnscrypt && c->dnscrypt_buffer == c->buffer) {
- c->dnscrypt_buffer = sldns_buffer_new(sldns_buffer_capacity(c->buffer));
- if(!c->dnscrypt_buffer) {
- log_err("Could not allocate dnscrypt buffer");
- return;
- }
- }
-#endif
-
- if(event&UB_EV_READ) {
- if(!comm_point_tcp_handle_read(fd, c, 0)) {
- reclaim_tcp_handler(c);
- if(!c->tcp_do_close) {
- fptr_ok(fptr_whitelist_comm_point(
- c->callback));
- (void)(*c->callback)(c, c->cb_arg,
- NETEVENT_CLOSED, NULL);
- }
- }
- return;
- }
- if(event&UB_EV_WRITE) {
- if(!comm_point_tcp_handle_write(fd, c)) {
- reclaim_tcp_handler(c);
- if(!c->tcp_do_close) {
- fptr_ok(fptr_whitelist_comm_point(
- c->callback));
- (void)(*c->callback)(c, c->cb_arg,
- NETEVENT_CLOSED, NULL);
- }
- }
- return;
- }
- if(event&UB_EV_TIMEOUT) {
- verbose(VERB_QUERY, "tcp took too long, dropped");
- reclaim_tcp_handler(c);
- if(!c->tcp_do_close) {
- fptr_ok(fptr_whitelist_comm_point(c->callback));
- (void)(*c->callback)(c, c->cb_arg,
- NETEVENT_TIMEOUT, NULL);
- }
- return;
- }
- log_err("Ignored event %d for tcphdl.", event);
-}
-
-void comm_point_local_handle_callback(int fd, short event, void* arg)
-{
- struct comm_point* c = (struct comm_point*)arg;
- log_assert(c->type == comm_local);
- ub_comm_base_now(c->ev->base);
-
- if(event&UB_EV_READ) {
- if(!comm_point_tcp_handle_read(fd, c, 1)) {
- fptr_ok(fptr_whitelist_comm_point(c->callback));
- (void)(*c->callback)(c, c->cb_arg, NETEVENT_CLOSED,
- NULL);
- }
- return;
- }
- log_err("Ignored event %d for localhdl.", event);
-}
-
-void comm_point_raw_handle_callback(int ATTR_UNUSED(fd),
- short event, void* arg)
-{
- struct comm_point* c = (struct comm_point*)arg;
- int err = NETEVENT_NOERROR;
- log_assert(c->type == comm_raw);
- ub_comm_base_now(c->ev->base);
-
- if(event&UB_EV_TIMEOUT)
- err = NETEVENT_TIMEOUT;
- fptr_ok(fptr_whitelist_comm_point_raw(c->callback));
- (void)(*c->callback)(c, c->cb_arg, err, NULL);
-}
-
-struct comm_point*
-comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer,
- comm_point_callback_type* callback, void* callback_arg)
-{
- struct comm_point* c = (struct comm_point*)calloc(1,
- sizeof(struct comm_point));
- short evbits;
- if(!c)
- return NULL;
- c->ev = (struct internal_event*)calloc(1,
- sizeof(struct internal_event));
- if(!c->ev) {
- free(c);
- return NULL;
- }
- c->ev->base = base;
- c->fd = fd;
- c->buffer = buffer;
- c->timeout = NULL;
- c->tcp_is_reading = 0;
- c->tcp_byte_count = 0;
- c->tcp_parent = NULL;
- c->max_tcp_count = 0;
- c->cur_tcp_count = 0;
- c->tcp_handlers = NULL;
- c->tcp_free = NULL;
- c->type = comm_udp;
- c->tcp_do_close = 0;
- c->do_not_close = 0;
- c->tcp_do_toggle_rw = 0;
- c->tcp_check_nb_connect = 0;
-#ifdef USE_MSG_FASTOPEN
- c->tcp_do_fastopen = 0;
-#endif
-#ifdef USE_DNSCRYPT
- c->dnscrypt = 0;
- c->dnscrypt_buffer = buffer;
-#endif
- c->inuse = 0;
- c->callback = callback;
- c->cb_arg = callback_arg;
- evbits = UB_EV_READ | UB_EV_PERSIST;
- /* ub_event stuff */
- c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
- comm_point_udp_callback, c);
- if(c->ev->ev == NULL) {
- log_err("could not baseset udp event");
- comm_point_delete(c);
- return NULL;
- }
- if(fd!=-1 && ub_event_add(c->ev->ev, c->timeout) != 0 ) {
- log_err("could not add udp event");
- comm_point_delete(c);
- return NULL;
- }
- return c;
-}
-
-struct comm_point*
-comm_point_create_udp_ancil(struct comm_base *base, int fd,
- sldns_buffer* buffer,
- comm_point_callback_type* callback, void* callback_arg)
-{
- struct comm_point* c = (struct comm_point*)calloc(1,
- sizeof(struct comm_point));
- short evbits;
- if(!c)
- return NULL;
- c->ev = (struct internal_event*)calloc(1,
- sizeof(struct internal_event));
- if(!c->ev) {
- free(c);
- return NULL;
- }
- c->ev->base = base;
- c->fd = fd;
- c->buffer = buffer;
- c->timeout = NULL;
- c->tcp_is_reading = 0;
- c->tcp_byte_count = 0;
- c->tcp_parent = NULL;
- c->max_tcp_count = 0;
- c->cur_tcp_count = 0;
- c->tcp_handlers = NULL;
- c->tcp_free = NULL;
- c->type = comm_udp;
- c->tcp_do_close = 0;
- c->do_not_close = 0;
-#ifdef USE_DNSCRYPT
- c->dnscrypt = 0;
- c->dnscrypt_buffer = buffer;
-#endif
- c->inuse = 0;
- c->tcp_do_toggle_rw = 0;
- c->tcp_check_nb_connect = 0;
-#ifdef USE_MSG_FASTOPEN
- c->tcp_do_fastopen = 0;
-#endif
- c->callback = callback;
- c->cb_arg = callback_arg;
- evbits = UB_EV_READ | UB_EV_PERSIST;
- /* ub_event stuff */
- c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
- comm_point_udp_ancil_callback, c);
- if(c->ev->ev == NULL) {
- log_err("could not baseset udp event");
- comm_point_delete(c);
- return NULL;
- }
- if(fd!=-1 && ub_event_add(c->ev->ev, c->timeout) != 0 ) {
- log_err("could not add udp event");
- comm_point_delete(c);
- return NULL;
- }
- return c;
-}
-
-static struct comm_point*
-comm_point_create_tcp_handler(struct comm_base *base,
- struct comm_point* parent, size_t bufsize,
- comm_point_callback_type* callback, void* callback_arg)
-{
- struct comm_point* c = (struct comm_point*)calloc(1,
- sizeof(struct comm_point));
- short evbits;
- if(!c)
- return NULL;
- c->ev = (struct internal_event*)calloc(1,
- sizeof(struct internal_event));
- if(!c->ev) {
- free(c);
- return NULL;
- }
- c->ev->base = base;
- c->fd = -1;
- c->buffer = sldns_buffer_new(bufsize);
- if(!c->buffer) {
- free(c->ev);
- free(c);
- return NULL;
- }
- c->timeout = (struct timeval*)malloc(sizeof(struct timeval));
- if(!c->timeout) {
- sldns_buffer_free(c->buffer);
- free(c->ev);
- free(c);
- return NULL;
- }
- c->tcp_is_reading = 0;
- c->tcp_byte_count = 0;
- c->tcp_parent = parent;
- c->max_tcp_count = 0;
- c->cur_tcp_count = 0;
- c->tcp_handlers = NULL;
- c->tcp_free = NULL;
- c->type = comm_tcp;
- c->tcp_do_close = 0;
- c->do_not_close = 0;
- c->tcp_do_toggle_rw = 1;
- c->tcp_check_nb_connect = 0;
-#ifdef USE_MSG_FASTOPEN
- c->tcp_do_fastopen = 0;
-#endif
-#ifdef USE_DNSCRYPT
- c->dnscrypt = 0;
- // We don't know just yet if this is a dnscrypt channel. Allocation
- // will be done when handling the callback.
- c->dnscrypt_buffer = c->buffer;
-#endif
- c->repinfo.c = c;
- c->callback = callback;
- c->cb_arg = callback_arg;
- /* add to parent free list */
- c->tcp_free = parent->tcp_free;
- parent->tcp_free = c;
- /* ub_event stuff */
- evbits = UB_EV_PERSIST | UB_EV_READ | UB_EV_TIMEOUT;
- c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
- comm_point_tcp_handle_callback, c);
- if(c->ev->ev == NULL)
- {
- log_err("could not basetset tcphdl event");
- parent->tcp_free = c->tcp_free;
- free(c->ev);
- free(c);
- return NULL;
- }
- return c;
-}
-
-struct comm_point*
-comm_point_create_tcp(struct comm_base *base, int fd, int num, size_t bufsize,
- comm_point_callback_type* callback, void* callback_arg)
-{
- struct comm_point* c = (struct comm_point*)calloc(1,
- sizeof(struct comm_point));
- short evbits;
- int i;
- /* first allocate the TCP accept listener */
- if(!c)
- return NULL;
- c->ev = (struct internal_event*)calloc(1,
- sizeof(struct internal_event));
- if(!c->ev) {
- free(c);
- return NULL;
- }
- c->ev->base = base;
- c->fd = fd;
- c->buffer = NULL;
- c->timeout = NULL;
- c->tcp_is_reading = 0;
- c->tcp_byte_count = 0;
- c->tcp_parent = NULL;
- c->max_tcp_count = num;
- c->cur_tcp_count = 0;
- c->tcp_handlers = (struct comm_point**)calloc((size_t)num,
- sizeof(struct comm_point*));
- if(!c->tcp_handlers) {
- free(c->ev);
- free(c);
- return NULL;
- }
- c->tcp_free = NULL;
- c->type = comm_tcp_accept;
- c->tcp_do_close = 0;
- c->do_not_close = 0;
- c->tcp_do_toggle_rw = 0;
- c->tcp_check_nb_connect = 0;
-#ifdef USE_MSG_FASTOPEN
- c->tcp_do_fastopen = 0;
-#endif
-#ifdef USE_DNSCRYPT
- c->dnscrypt = 0;
- c->dnscrypt_buffer = NULL;
-#endif
- c->callback = NULL;
- c->cb_arg = NULL;
- evbits = UB_EV_READ | UB_EV_PERSIST;
- /* ub_event stuff */
- c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
- comm_point_tcp_accept_callback, c);
- if(c->ev->ev == NULL) {
- log_err("could not baseset tcpacc event");
- comm_point_delete(c);
- return NULL;
- }
- if (ub_event_add(c->ev->ev, c->timeout) != 0) {
- log_err("could not add tcpacc event");
- comm_point_delete(c);
- return NULL;
- }
- /* now prealloc the tcp handlers */
- for(i=0; i<num; i++) {
- c->tcp_handlers[i] = comm_point_create_tcp_handler(base,
- c, bufsize, callback, callback_arg);
- if(!c->tcp_handlers[i]) {
- comm_point_delete(c);
- return NULL;
- }
- }
-
- return c;
-}
-
-struct comm_point*
-comm_point_create_tcp_out(struct comm_base *base, size_t bufsize,
- comm_point_callback_type* callback, void* callback_arg)
-{
- struct comm_point* c = (struct comm_point*)calloc(1,
- sizeof(struct comm_point));
- short evbits;
- if(!c)
- return NULL;
- c->ev = (struct internal_event*)calloc(1,
- sizeof(struct internal_event));
- if(!c->ev) {
- free(c);
- return NULL;
- }
- c->ev->base = base;
- c->fd = -1;
- c->buffer = sldns_buffer_new(bufsize);
- if(!c->buffer) {
- free(c->ev);
- free(c);
- return NULL;
- }
- c->timeout = NULL;
- c->tcp_is_reading = 0;
- c->tcp_byte_count = 0;
- c->tcp_parent = NULL;
- c->max_tcp_count = 0;
- c->cur_tcp_count = 0;
- c->tcp_handlers = NULL;
- c->tcp_free = NULL;
- c->type = comm_tcp;
- c->tcp_do_close = 0;
- c->do_not_close = 0;
- c->tcp_do_toggle_rw = 1;
- c->tcp_check_nb_connect = 1;
-#ifdef USE_MSG_FASTOPEN
- c->tcp_do_fastopen = 1;
-#endif
-#ifdef USE_DNSCRYPT
- c->dnscrypt = 0;
- c->dnscrypt_buffer = c->buffer;
-#endif
- c->repinfo.c = c;
- c->callback = callback;
- c->cb_arg = callback_arg;
- evbits = UB_EV_PERSIST | UB_EV_WRITE;
- c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
- comm_point_tcp_handle_callback, c);
- if(c->ev->ev == NULL)
- {
- log_err("could not baseset tcpout event");
- sldns_buffer_free(c->buffer);
- free(c->ev);
- free(c);
- return NULL;
- }
-
- return c;
-}
-
-struct comm_point*
-comm_point_create_local(struct comm_base *base, int fd, size_t bufsize,
- comm_point_callback_type* callback, void* callback_arg)
-{
- struct comm_point* c = (struct comm_point*)calloc(1,
- sizeof(struct comm_point));
- short evbits;
- if(!c)
- return NULL;
- c->ev = (struct internal_event*)calloc(1,
- sizeof(struct internal_event));
- if(!c->ev) {
- free(c);
- return NULL;
- }
- c->ev->base = base;
- c->fd = fd;
- c->buffer = sldns_buffer_new(bufsize);
- if(!c->buffer) {
- free(c->ev);
- free(c);
- return NULL;
- }
- c->timeout = NULL;
- c->tcp_is_reading = 1;
- c->tcp_byte_count = 0;
- c->tcp_parent = NULL;
- c->max_tcp_count = 0;
- c->cur_tcp_count = 0;
- c->tcp_handlers = NULL;
- c->tcp_free = NULL;
- c->type = comm_local;
- c->tcp_do_close = 0;
- c->do_not_close = 1;
- c->tcp_do_toggle_rw = 0;
- c->tcp_check_nb_connect = 0;
-#ifdef USE_MSG_FASTOPEN
- c->tcp_do_fastopen = 0;
-#endif
-#ifdef USE_DNSCRYPT
- c->dnscrypt = 0;
- c->dnscrypt_buffer = c->buffer;
-#endif
- c->callback = callback;
- c->cb_arg = callback_arg;
- /* ub_event stuff */
- evbits = UB_EV_PERSIST | UB_EV_READ;
- c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
- comm_point_local_handle_callback, c);
- if(c->ev->ev == NULL) {
- log_err("could not baseset localhdl event");
- free(c->ev);
- free(c);
- return NULL;
- }
- if (ub_event_add(c->ev->ev, c->timeout) != 0) {
- log_err("could not add localhdl event");
- ub_event_free(c->ev->ev);
- free(c->ev);
- free(c);
- return NULL;
- }
- return c;
-}
-
-struct comm_point*
-comm_point_create_raw(struct comm_base* base, int fd, int writing,
- comm_point_callback_type* callback, void* callback_arg)
-{
- struct comm_point* c = (struct comm_point*)calloc(1,
- sizeof(struct comm_point));
- short evbits;
- if(!c)
- return NULL;
- c->ev = (struct internal_event*)calloc(1,
- sizeof(struct internal_event));
- if(!c->ev) {
- free(c);
- return NULL;
- }
- c->ev->base = base;
- c->fd = fd;
- c->buffer = NULL;
- c->timeout = NULL;
- c->tcp_is_reading = 0;
- c->tcp_byte_count = 0;
- c->tcp_parent = NULL;
- c->max_tcp_count = 0;
- c->cur_tcp_count = 0;
- c->tcp_handlers = NULL;
- c->tcp_free = NULL;
- c->type = comm_raw;
- c->tcp_do_close = 0;
- c->do_not_close = 1;
- c->tcp_do_toggle_rw = 0;
- c->tcp_check_nb_connect = 0;
-#ifdef USE_MSG_FASTOPEN
- c->tcp_do_fastopen = 0;
-#endif
-#ifdef USE_DNSCRYPT
- c->dnscrypt = 0;
- c->dnscrypt_buffer = c->buffer;
-#endif
- c->callback = callback;
- c->cb_arg = callback_arg;
- /* ub_event stuff */
- if(writing)
- evbits = UB_EV_PERSIST | UB_EV_WRITE;
- else evbits = UB_EV_PERSIST | UB_EV_READ;
- c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
- comm_point_raw_handle_callback, c);
- if(c->ev->ev == NULL) {
- log_err("could not baseset rawhdl event");
- free(c->ev);
- free(c);
- return NULL;
- }
- if (ub_event_add(c->ev->ev, c->timeout) != 0) {
- log_err("could not add rawhdl event");
- ub_event_free(c->ev->ev);
- free(c->ev);
- free(c);
- return NULL;
- }
- return c;
-}
-
-void
-comm_point_close(struct comm_point* c)
-{
- if(!c)
- return;
- if(c->fd != -1)
- if(ub_event_del(c->ev->ev) != 0) {
- log_err("could not event_del on close");
- }
- /* close fd after removing from event lists, or epoll.. is messed up */
- if(c->fd != -1 && !c->do_not_close) {
- verbose(VERB_ALGO, "close fd %d", c->fd);
-#ifndef USE_WINSOCK
- close(c->fd);
-#else
- closesocket(c->fd);
-#endif
- }
- c->fd = -1;
-}
-
-void
-comm_point_delete(struct comm_point* c)
-{
- if(!c)
- return;
- if(c->type == comm_tcp && c->ssl) {
-#ifdef HAVE_SSL
- SSL_shutdown(c->ssl);
- SSL_free(c->ssl);
-#endif
- }
- comm_point_close(c);
- if(c->tcp_handlers) {
- int i;
- for(i=0; i<c->max_tcp_count; i++)
- comm_point_delete(c->tcp_handlers[i]);
- free(c->tcp_handlers);
- }
- free(c->timeout);
- if(c->type == comm_tcp || c->type == comm_local) {
- sldns_buffer_free(c->buffer);
-#ifdef USE_DNSCRYPT
- if(c->dnscrypt && c->dnscrypt_buffer != c->buffer) {
- sldns_buffer_free(c->dnscrypt_buffer);
- }
-#endif
- }
- ub_event_free(c->ev->ev);
- free(c->ev);
- free(c);
-}
-
-void
-comm_point_send_reply(struct comm_reply *repinfo)
-{
- struct sldns_buffer* buffer;
- log_assert(repinfo && repinfo->c);
-#ifdef USE_DNSCRYPT
- buffer = repinfo->c->dnscrypt_buffer;
- if(!dnsc_handle_uncurved_request(repinfo)) {
- return;
- }
-#else
- buffer = repinfo->c->buffer;
-#endif
- if(repinfo->c->type == comm_udp) {
- if(repinfo->srctype)
- comm_point_send_udp_msg_if(repinfo->c,
- buffer, (struct sockaddr*)&repinfo->addr,
- repinfo->addrlen, repinfo);
- else
- comm_point_send_udp_msg(repinfo->c, buffer,
- (struct sockaddr*)&repinfo->addr, repinfo->addrlen);
-#ifdef USE_DNSTAP
- if(repinfo->c->dtenv != NULL &&
- repinfo->c->dtenv->log_client_response_messages)
- dt_msg_send_client_response(repinfo->c->dtenv,
- &repinfo->addr, repinfo->c->type, repinfo->c->buffer);
-#endif
- } else {
-#ifdef USE_DNSTAP
- if(repinfo->c->tcp_parent->dtenv != NULL &&
- repinfo->c->tcp_parent->dtenv->log_client_response_messages)
- dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv,
- &repinfo->addr, repinfo->c->type, repinfo->c->buffer);
-#endif
- comm_point_start_listening(repinfo->c, -1,
- repinfo->c->tcp_timeout_msec);
- }
-}
-
-void
-comm_point_drop_reply(struct comm_reply* repinfo)
-{
- if(!repinfo)
- return;
- log_assert(repinfo && repinfo->c);
- log_assert(repinfo->c->type != comm_tcp_accept);
- if(repinfo->c->type == comm_udp)
- return;
- reclaim_tcp_handler(repinfo->c);
-}
-
-void
-comm_point_stop_listening(struct comm_point* c)
-{
- verbose(VERB_ALGO, "comm point stop listening %d", c->fd);
- if(ub_event_del(c->ev->ev) != 0) {
- log_err("event_del error to stoplisten");
- }
-}
-
-void
-comm_point_start_listening(struct comm_point* c, int newfd, int msec)
-{
- verbose(VERB_ALGO, "comm point start listening %d",
- c->fd==-1?newfd:c->fd);
- if(c->type == comm_tcp_accept && !c->tcp_free) {
- /* no use to start listening no free slots. */
- return;
- }
- if(msec != -1 && msec != 0) {
- if(!c->timeout) {
- c->timeout = (struct timeval*)malloc(sizeof(
- struct timeval));
- if(!c->timeout) {
- log_err("cpsl: malloc failed. No net read.");
- return;
- }
- }
- ub_event_add_bits(c->ev->ev, UB_EV_TIMEOUT);
-#ifndef S_SPLINT_S /* splint fails on struct timeval. */
- c->timeout->tv_sec = msec/1000;
- c->timeout->tv_usec = (msec%1000)*1000;
-#endif /* S_SPLINT_S */
- }
- if(c->type == comm_tcp) {
- ub_event_del_bits(c->ev->ev, UB_EV_READ|UB_EV_WRITE);
- if(c->tcp_is_reading)
- ub_event_add_bits(c->ev->ev, UB_EV_READ);
- else ub_event_add_bits(c->ev->ev, UB_EV_WRITE);
- }
- if(newfd != -1) {
- if(c->fd != -1) {
-#ifndef USE_WINSOCK
- close(c->fd);
-#else
- closesocket(c->fd);
-#endif
- }
- c->fd = newfd;
- ub_event_set_fd(c->ev->ev, c->fd);
- }
- if(ub_event_add(c->ev->ev, msec==0?NULL:c->timeout) != 0) {
- log_err("event_add failed. in cpsl.");
- }
-}
-
-void comm_point_listen_for_rw(struct comm_point* c, int rd, int wr)
-{
- verbose(VERB_ALGO, "comm point listen_for_rw %d %d", c->fd, wr);
- if(ub_event_del(c->ev->ev) != 0) {
- log_err("event_del error to cplf");
- }
- ub_event_del_bits(c->ev->ev, UB_EV_READ|UB_EV_WRITE);
- if(rd) ub_event_add_bits(c->ev->ev, UB_EV_READ);
- if(wr) ub_event_add_bits(c->ev->ev, UB_EV_WRITE);
- if(ub_event_add(c->ev->ev, c->timeout) != 0) {
- log_err("event_add failed. in cplf.");
- }
-}
-
-size_t comm_point_get_mem(struct comm_point* c)
-{
- size_t s;
- if(!c)
- return 0;
- s = sizeof(*c) + sizeof(*c->ev);
- if(c->timeout)
- s += sizeof(*c->timeout);
- if(c->type == comm_tcp || c->type == comm_local) {
- s += sizeof(*c->buffer) + sldns_buffer_capacity(c->buffer);
-#ifdef USE_DNSCRYPT
- s += sizeof(*c->dnscrypt_buffer);
- if(c->buffer != c->dnscrypt_buffer) {
- s += sldns_buffer_capacity(c->dnscrypt_buffer);
- }
-#endif
- }
- if(c->type == comm_tcp_accept) {
- int i;
- for(i=0; i<c->max_tcp_count; i++)
- s += comm_point_get_mem(c->tcp_handlers[i]);
- }
- return s;
-}
-
-struct comm_timer*
-comm_timer_create(struct comm_base* base, void (*cb)(void*), void* cb_arg)
-{
- struct internal_timer *tm = (struct internal_timer*)calloc(1,
- sizeof(struct internal_timer));
- if(!tm) {
- log_err("malloc failed");
- return NULL;
- }
- tm->super.ev_timer = tm;
- tm->base = base;
- tm->super.callback = cb;
- tm->super.cb_arg = cb_arg;
- tm->ev = ub_event_new(base->eb->base, -1, UB_EV_TIMEOUT,
- comm_timer_callback, &tm->super);
- if(tm->ev == NULL) {
- log_err("timer_create: event_base_set failed.");
- free(tm);
- return NULL;
- }
- return &tm->super;
-}
-
-void
-comm_timer_disable(struct comm_timer* timer)
-{
- if(!timer)
- return;
- ub_timer_del(timer->ev_timer->ev);
- timer->ev_timer->enabled = 0;
-}
-
-void
-comm_timer_set(struct comm_timer* timer, struct timeval* tv)
-{
- log_assert(tv);
- if(timer->ev_timer->enabled)
- comm_timer_disable(timer);
- if(ub_timer_add(timer->ev_timer->ev, timer->ev_timer->base->eb->base,
- comm_timer_callback, timer, tv) != 0)
- log_err("comm_timer_set: evtimer_add failed.");
- timer->ev_timer->enabled = 1;
-}
-
-void
-comm_timer_delete(struct comm_timer* timer)
-{
- if(!timer)
- return;
- comm_timer_disable(timer);
- /* Free the sub struct timer->ev_timer derived from the super struct timer.
- * i.e. assert(timer == timer->ev_timer)
- */
- ub_event_free(timer->ev_timer->ev);
- free(timer->ev_timer);
-}
-
-void
-comm_timer_callback(int ATTR_UNUSED(fd), short event, void* arg)
-{
- struct comm_timer* tm = (struct comm_timer*)arg;
- if(!(event&UB_EV_TIMEOUT))
- return;
- ub_comm_base_now(tm->ev_timer->base);
- tm->ev_timer->enabled = 0;
- fptr_ok(fptr_whitelist_comm_timer(tm->callback));
- (*tm->callback)(tm->cb_arg);
-}
-
-int
-comm_timer_is_set(struct comm_timer* timer)
-{
- return (int)timer->ev_timer->enabled;
-}
-
-size_t
-comm_timer_get_mem(struct comm_timer* ATTR_UNUSED(timer))
-{
- return sizeof(struct internal_timer);
-}
-
-struct comm_signal*
-comm_signal_create(struct comm_base* base,
- void (*callback)(int, void*), void* cb_arg)
-{
- struct comm_signal* com = (struct comm_signal*)malloc(
- sizeof(struct comm_signal));
- if(!com) {
- log_err("malloc failed");
- return NULL;
- }
- com->base = base;
- com->callback = callback;
- com->cb_arg = cb_arg;
- com->ev_signal = NULL;
- return com;
-}
-
-void
-comm_signal_callback(int sig, short event, void* arg)
-{
- struct comm_signal* comsig = (struct comm_signal*)arg;
- if(!(event & UB_EV_SIGNAL))
- return;
- ub_comm_base_now(comsig->base);
- fptr_ok(fptr_whitelist_comm_signal(comsig->callback));
- (*comsig->callback)(sig, comsig->cb_arg);
-}
-
-int
-comm_signal_bind(struct comm_signal* comsig, int sig)
-{
- struct internal_signal* entry = (struct internal_signal*)calloc(1,
- sizeof(struct internal_signal));
- if(!entry) {
- log_err("malloc failed");
- return 0;
- }
- log_assert(comsig);
- /* add signal event */
- entry->ev = ub_signal_new(comsig->base->eb->base, sig,
- comm_signal_callback, comsig);
- if(entry->ev == NULL) {
- log_err("Could not create signal event");
- free(entry);
- return 0;
- }
- if(ub_signal_add(entry->ev, NULL) != 0) {
- log_err("Could not add signal handler");
- ub_event_free(entry->ev);
- free(entry);
- return 0;
- }
- /* link into list */
- entry->next = comsig->ev_signal;
- comsig->ev_signal = entry;
- return 1;
-}
-
-void
-comm_signal_delete(struct comm_signal* comsig)
-{
- struct internal_signal* p, *np;
- if(!comsig)
- return;
- p=comsig->ev_signal;
- while(p) {
- np = p->next;
- ub_signal_del(p->ev);
- ub_event_free(p->ev);
- free(p);
- p = np;
- }
- free(comsig);
-}
diff --git a/external/unbound/util/netevent.h b/external/unbound/util/netevent.h
deleted file mode 100644
index cb8eb86b9..000000000
--- a/external/unbound/util/netevent.h
+++ /dev/null
@@ -1,731 +0,0 @@
-/*
- * util/netevent.h - event notification
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains event notification functions.
- *
- * There are three types of communication points
- * o UDP socket - perthread buffer.
- * o TCP-accept socket - array of TCP-sockets, socketcount.
- * o TCP socket - own buffer, parent-TCPaccept, read/write state,
- * number of bytes read/written, timeout.
- *
- * There are sockets aimed towards our clients and towards the internet.
- * o frontside - aimed towards our clients, queries come in, answers back.
- * o behind - aimed towards internet, to the authoritative DNS servers.
- *
- * Several event types are available:
- * o comm_base - for thread safety of the comm points, one per thread.
- * o comm_point - udp and tcp networking, with callbacks.
- * o comm_timer - a timeout with callback.
- * o comm_signal - callbacks when signal is caught.
- * o comm_reply - holds reply info during networking callback.
- *
- */
-
-#ifndef NET_EVENT_H
-#define NET_EVENT_H
-
-#include "dnscrypt/dnscrypt.h"
-
-struct sldns_buffer;
-struct comm_point;
-struct comm_reply;
-struct ub_event_base;
-
-/* internal event notification data storage structure. */
-struct internal_event;
-struct internal_base;
-struct internal_timer; /* A sub struct of the comm_timer super struct */
-
-/** callback from communication point function type */
-typedef int comm_point_callback_type(struct comm_point*, void*, int,
- struct comm_reply*);
-
-/** to pass no_error to callback function */
-#define NETEVENT_NOERROR 0
-/** to pass closed connection to callback function */
-#define NETEVENT_CLOSED -1
-/** to pass timeout happened to callback function */
-#define NETEVENT_TIMEOUT -2
-/** to pass fallback from capsforID to callback function; 0x20 failed */
-#define NETEVENT_CAPSFAIL -3
-
-/** timeout to slow accept calls when not possible, in msec. */
-#define NETEVENT_SLOW_ACCEPT_TIME 2000
-
-/**
- * A communication point dispatcher. Thread specific.
- */
-struct comm_base {
- /** behind the scenes structure. with say libevent info. alloced */
- struct internal_base* eb;
- /** callback to stop listening on accept sockets,
- * performed when accept() will not function properly */
- void (*stop_accept)(void*);
- /** callback to start listening on accept sockets, performed
- * after stop_accept() then a timeout has passed. */
- void (*start_accept)(void*);
- /** user argument for stop_accept and start_accept functions */
- void* cb_arg;
-};
-
-/**
- * Reply information for a communication point.
- */
-struct comm_reply {
- /** the comm_point with fd to send reply on to. */
- struct comm_point* c;
- /** the address (for UDP based communication) */
- struct sockaddr_storage addr;
- /** length of address */
- socklen_t addrlen;
- /** return type 0 (none), 4(IP4), 6(IP6) */
- int srctype;
- /* DnsCrypt context */
-#ifdef USE_DNSCRYPT
- uint8_t client_nonce[crypto_box_HALF_NONCEBYTES];
- uint8_t nmkey[crypto_box_BEFORENMBYTES];
- const KeyPair *keypair;
- int is_dnscrypted;
-#endif
- /** the return source interface data */
- union {
-#ifdef IPV6_PKTINFO
- struct in6_pktinfo v6info;
-#endif
-#ifdef IP_PKTINFO
- struct in_pktinfo v4info;
-#elif defined(IP_RECVDSTADDR)
- struct in_addr v4addr;
-#endif
- }
- /** variable with return source data */
- pktinfo;
- /** max udp size for udp packets */
- size_t max_udp_size;
-};
-
-/**
- * Communication point to the network
- * These behaviours can be accomplished by setting the flags
- * and passing return values from the callback.
- * udp frontside: called after readdone. sendafter.
- * tcp frontside: called readdone, sendafter. close.
- * udp behind: called after readdone. No send after.
- * tcp behind: write done, read done, then called. No send after.
- */
-struct comm_point {
- /** behind the scenes structure, with say libevent info. alloced. */
- struct internal_event* ev;
-
- /** file descriptor for communication point */
- int fd;
-
- /** timeout (NULL if it does not). Malloced. */
- struct timeval* timeout;
-
- /** buffer pointer. Either to perthread, or own buffer or NULL */
- struct sldns_buffer* buffer;
-
- /* -------- TCP Handler -------- */
- /** Read/Write state for TCP */
- int tcp_is_reading;
- /** The current read/write count for TCP */
- size_t tcp_byte_count;
- /** parent communication point (for TCP sockets) */
- struct comm_point* tcp_parent;
- /** sockaddr from peer, for TCP handlers */
- struct comm_reply repinfo;
-
- /* -------- TCP Accept -------- */
- /** the number of TCP handlers for this tcp-accept socket */
- int max_tcp_count;
- /** current number of tcp handler in-use for this accept socket */
- int cur_tcp_count;
- /** malloced array of tcp handlers for a tcp-accept,
- of size max_tcp_count. */
- struct comm_point** tcp_handlers;
- /** linked list of free tcp_handlers to use for new queries.
- For tcp_accept the first entry, for tcp_handlers the next one. */
- struct comm_point* tcp_free;
-
- /* -------- SSL TCP DNS ------- */
- /** the SSL object with rw bio (owned) or for commaccept ctx ref */
- void* ssl;
- /** handshake state for init and renegotiate */
- enum {
- /** no handshake, it has been done */
- comm_ssl_shake_none = 0,
- /** ssl initial handshake wants to read */
- comm_ssl_shake_read,
- /** ssl initial handshake wants to write */
- comm_ssl_shake_write,
- /** ssl_write wants to read */
- comm_ssl_shake_hs_read,
- /** ssl_read wants to write */
- comm_ssl_shake_hs_write
- } ssl_shake_state;
-
- /* -------- dnstap ------- */
- /** the dnstap environment */
- struct dt_env* dtenv;
-
- /** is this a UDP, TCP-accept or TCP socket. */
- enum comm_point_type {
- /** UDP socket - handle datagrams. */
- comm_udp,
- /** TCP accept socket - only creates handlers if readable. */
- comm_tcp_accept,
- /** TCP handler socket - handle byteperbyte readwrite. */
- comm_tcp,
- /** AF_UNIX socket - for internal commands. */
- comm_local,
- /** raw - not DNS format - for pipe readers and writers */
- comm_raw
- }
- /** variable with type of socket, UDP,TCP-accept,TCP,pipe */
- type;
-
- /* ---------- Behaviour ----------- */
- /** if set the connection is NOT closed on delete. */
- int do_not_close;
-
- /** if set, the connection is closed on error, on timeout,
- and after read/write completes. No callback is done. */
- int tcp_do_close;
-
- /** if set, read/write completes:
- read/write state of tcp is toggled.
- buffer reset/bytecount reset.
- this flag cleared.
- So that when that is done the callback is called. */
- int tcp_do_toggle_rw;
-
- /** timeout in msec for TCP wait times for this connection */
- int tcp_timeout_msec;
-
- /** if set, checks for pending error from nonblocking connect() call.*/
- int tcp_check_nb_connect;
-
-#ifdef USE_MSG_FASTOPEN
- /** used to track if the sendto() call should be done when using TFO. */
- int tcp_do_fastopen;
-#endif
-
-#ifdef USE_DNSCRYPT
- /** Is this a dnscrypt channel */
- int dnscrypt;
- /** encrypted buffer pointer. Either to perthread, or own buffer or NULL */
- struct sldns_buffer* dnscrypt_buffer;
-#endif
- /** number of queries outstanding on this socket, used by
- * outside network for udp ports */
- int inuse;
-
- /** callback when done.
- tcp_accept does not get called back, is NULL then.
- If a timeout happens, callback with timeout=1 is called.
- If an error happens, callback is called with error set
- nonzero. If not NETEVENT_NOERROR, it is an errno value.
- If the connection is closed (by remote end) then the
- callback is called with error set to NETEVENT_CLOSED=-1.
- If a timeout happens on the connection, the error is set to
- NETEVENT_TIMEOUT=-2.
- The reply_info can be copied if the reply needs to happen at a
- later time. It consists of a struct with commpoint and address.
- It can be passed to a msg send routine some time later.
- Note the reply information is temporary and must be copied.
- NULL is passed for_reply info, in cases where error happened.
-
- declare as:
- int my_callback(struct comm_point* c, void* my_arg, int error,
- struct comm_reply *reply_info);
-
- if the routine returns 0, nothing is done.
- Notzero, the buffer will be sent back to client.
- For UDP this is done without changing the commpoint.
- In TCP it sets write state.
- */
- comm_point_callback_type* callback;
- /** argument to pass to callback. */
- void *cb_arg;
-};
-
-/**
- * Structure only for making timeout events.
- */
-struct comm_timer {
- /** the internal event stuff (derived) */
- struct internal_timer* ev_timer;
-
- /** callback function, takes user arg only */
- void (*callback)(void*);
-
- /** callback user argument */
- void* cb_arg;
-};
-
-/**
- * Structure only for signal events.
- */
-struct comm_signal {
- /** the communication base */
- struct comm_base* base;
-
- /** the internal event stuff */
- struct internal_signal* ev_signal;
-
- /** callback function, takes signal number and user arg */
- void (*callback)(int, void*);
-
- /** callback user argument */
- void* cb_arg;
-};
-
-/**
- * Create a new comm base.
- * @param sigs: if true it attempts to create a default loop for
- * signal handling.
- * @return: the new comm base. NULL on error.
- */
-struct comm_base* comm_base_create(int sigs);
-
-/**
- * Create comm base that uses the given ub_event_base (underlying pluggable
- * event mechanism pointer).
- * @param base: underlying pluggable event base.
- * @return: the new comm base. NULL on error.
- */
-struct comm_base* comm_base_create_event(struct ub_event_base* base);
-
-/**
- * Delete comm base structure but not the underlying lib event base.
- * All comm points must have been deleted.
- * @param b: the base to delete.
- */
-void comm_base_delete_no_base(struct comm_base* b);
-
-/**
- * Destroy a comm base.
- * All comm points must have been deleted.
- * @param b: the base to delete.
- */
-void comm_base_delete(struct comm_base* b);
-
-/**
- * Obtain two pointers. The pointers never change (until base_delete()).
- * The pointers point to time values that are updated regularly.
- * @param b: the communication base that will update the time values.
- * @param tt: pointer to time in seconds is returned.
- * @param tv: pointer to time in microseconds is returned.
- */
-void comm_base_timept(struct comm_base* b, time_t** tt, struct timeval** tv);
-
-/**
- * Dispatch the comm base events.
- * @param b: the communication to perform.
- */
-void comm_base_dispatch(struct comm_base* b);
-
-/**
- * Exit from dispatch loop.
- * @param b: the communication base that is in dispatch().
- */
-void comm_base_exit(struct comm_base* b);
-
-/**
- * Set the slow_accept mode handlers. You can not provide these if you do
- * not perform accept() calls.
- * @param b: comm base
- * @param stop_accept: function that stops listening to accept fds.
- * @param start_accept: function that resumes listening to accept fds.
- * @param arg: callback arg to pass to the functions.
- */
-void comm_base_set_slow_accept_handlers(struct comm_base* b,
- void (*stop_accept)(void*), void (*start_accept)(void*), void* arg);
-
-/**
- * Access internal data structure (for util/tube.c on windows)
- * @param b: comm base
- * @return ub_event_base.
- */
-struct ub_event_base* comm_base_internal(struct comm_base* b);
-
-/**
- * Create an UDP comm point. Calls malloc.
- * setups the structure with the parameters you provide.
- * @param base: in which base to alloc the commpoint.
- * @param fd : file descriptor of open UDP socket.
- * @param buffer: shared buffer by UDP sockets from this thread.
- * @param callback: callback function pointer.
- * @param callback_arg: will be passed to your callback function.
- * @return: returns the allocated communication point. NULL on error.
- * Sets timeout to NULL. Turns off TCP options.
- */
-struct comm_point* comm_point_create_udp(struct comm_base* base,
- int fd, struct sldns_buffer* buffer,
- comm_point_callback_type* callback, void* callback_arg);
-
-/**
- * Create an UDP with ancillary data comm point. Calls malloc.
- * Uses recvmsg instead of recv to get udp message.
- * setups the structure with the parameters you provide.
- * @param base: in which base to alloc the commpoint.
- * @param fd : file descriptor of open UDP socket.
- * @param buffer: shared buffer by UDP sockets from this thread.
- * @param callback: callback function pointer.
- * @param callback_arg: will be passed to your callback function.
- * @return: returns the allocated communication point. NULL on error.
- * Sets timeout to NULL. Turns off TCP options.
- */
-struct comm_point* comm_point_create_udp_ancil(struct comm_base* base,
- int fd, struct sldns_buffer* buffer,
- comm_point_callback_type* callback, void* callback_arg);
-
-/**
- * Create a TCP listener comm point. Calls malloc.
- * Setups the structure with the parameters you provide.
- * Also Creates TCP Handlers, pre allocated for you.
- * Uses the parameters you provide.
- * @param base: in which base to alloc the commpoint.
- * @param fd: file descriptor of open TCP socket set to listen nonblocking.
- * @param num: becomes max_tcp_count, the routine allocates that
- * many tcp handler commpoints.
- * @param bufsize: size of buffer to create for handlers.
- * @param callback: callback function pointer for TCP handlers.
- * @param callback_arg: will be passed to your callback function.
- * @return: returns the TCP listener commpoint. You can find the
- * TCP handlers in the array inside the listener commpoint.
- * returns NULL on error.
- * Inits timeout to NULL. All handlers are on the free list.
- */
-struct comm_point* comm_point_create_tcp(struct comm_base* base,
- int fd, int num, size_t bufsize,
- comm_point_callback_type* callback, void* callback_arg);
-
-/**
- * Create an outgoing TCP commpoint. No file descriptor is opened, left at -1.
- * @param base: in which base to alloc the commpoint.
- * @param bufsize: size of buffer to create for handlers.
- * @param callback: callback function pointer for the handler.
- * @param callback_arg: will be passed to your callback function.
- * @return: the commpoint or NULL on error.
- */
-struct comm_point* comm_point_create_tcp_out(struct comm_base* base,
- size_t bufsize, comm_point_callback_type* callback, void* callback_arg);
-
-/**
- * Create commpoint to listen to a local domain file descriptor.
- * @param base: in which base to alloc the commpoint.
- * @param fd: file descriptor of open AF_UNIX socket set to listen nonblocking.
- * @param bufsize: size of buffer to create for handlers.
- * @param callback: callback function pointer for the handler.
- * @param callback_arg: will be passed to your callback function.
- * @return: the commpoint or NULL on error.
- */
-struct comm_point* comm_point_create_local(struct comm_base* base,
- int fd, size_t bufsize,
- comm_point_callback_type* callback, void* callback_arg);
-
-/**
- * Create commpoint to listen to a local domain pipe descriptor.
- * @param base: in which base to alloc the commpoint.
- * @param fd: file descriptor.
- * @param writing: true if you want to listen to writes, false for reads.
- * @param callback: callback function pointer for the handler.
- * @param callback_arg: will be passed to your callback function.
- * @return: the commpoint or NULL on error.
- */
-struct comm_point* comm_point_create_raw(struct comm_base* base,
- int fd, int writing,
- comm_point_callback_type* callback, void* callback_arg);
-
-/**
- * Close a comm point fd.
- * @param c: comm point to close.
- */
-void comm_point_close(struct comm_point* c);
-
-/**
- * Close and deallocate (free) the comm point. If the comm point is
- * a tcp-accept point, also its tcp-handler points are deleted.
- * @param c: comm point to delete.
- */
-void comm_point_delete(struct comm_point* c);
-
-/**
- * Send reply. Put message into commpoint buffer.
- * @param repinfo: The reply info copied from a commpoint callback call.
- */
-void comm_point_send_reply(struct comm_reply* repinfo);
-
-/**
- * Drop reply. Cleans up.
- * @param repinfo: The reply info copied from a commpoint callback call.
- */
-void comm_point_drop_reply(struct comm_reply* repinfo);
-
-/**
- * Send an udp message over a commpoint.
- * @param c: commpoint to send it from.
- * @param packet: what to send.
- * @param addr: where to send it to.
- * @param addrlen: length of addr.
- * @return: false on a failure.
- */
-int comm_point_send_udp_msg(struct comm_point* c, struct sldns_buffer* packet,
- struct sockaddr* addr, socklen_t addrlen);
-
-/**
- * Stop listening for input on the commpoint. No callbacks will happen.
- * @param c: commpoint to disable. The fd is not closed.
- */
-void comm_point_stop_listening(struct comm_point* c);
-
-/**
- * Start listening again for input on the comm point.
- * @param c: commpoint to enable again.
- * @param newfd: new fd, or -1 to leave fd be.
- * @param msec: timeout in milliseconds, or -1 for no (change to the) timeout.
- * So seconds*1000.
- */
-void comm_point_start_listening(struct comm_point* c, int newfd, int msec);
-
-/**
- * Stop listening and start listening again for reading or writing.
- * @param c: commpoint
- * @param rd: if true, listens for reading.
- * @param wr: if true, listens for writing.
- */
-void comm_point_listen_for_rw(struct comm_point* c, int rd, int wr);
-
-/**
- * Get size of memory used by comm point.
- * For TCP handlers this includes subhandlers.
- * For UDP handlers, this does not include the (shared) UDP buffer.
- * @param c: commpoint.
- * @return size in bytes.
- */
-size_t comm_point_get_mem(struct comm_point* c);
-
-/**
- * create timer. Not active upon creation.
- * @param base: event handling base.
- * @param cb: callback function: void myfunc(void* myarg);
- * @param cb_arg: user callback argument.
- * @return: the new timer or NULL on error.
- */
-struct comm_timer* comm_timer_create(struct comm_base* base,
- void (*cb)(void*), void* cb_arg);
-
-/**
- * disable timer. Stops callbacks from happening.
- * @param timer: to disable.
- */
-void comm_timer_disable(struct comm_timer* timer);
-
-/**
- * reset timevalue for timer.
- * @param timer: timer to (re)set.
- * @param tv: when the timer should activate. if NULL timer is disabled.
- */
-void comm_timer_set(struct comm_timer* timer, struct timeval* tv);
-
-/**
- * delete timer.
- * @param timer: to delete.
- */
-void comm_timer_delete(struct comm_timer* timer);
-
-/**
- * see if timeout has been set to a value.
- * @param timer: the timer to examine.
- * @return: false if disabled or not set.
- */
-int comm_timer_is_set(struct comm_timer* timer);
-
-/**
- * Get size of memory used by comm timer.
- * @param timer: the timer to examine.
- * @return size in bytes.
- */
-size_t comm_timer_get_mem(struct comm_timer* timer);
-
-/**
- * Create a signal handler. Call signal_bind() later to bind to a signal.
- * @param base: communication base to use.
- * @param callback: called when signal is caught.
- * @param cb_arg: user argument to callback
- * @return: the signal struct or NULL on error.
- */
-struct comm_signal* comm_signal_create(struct comm_base* base,
- void (*callback)(int, void*), void* cb_arg);
-
-/**
- * Bind signal struct to catch a signal. A signle comm_signal can be bound
- * to multiple signals, calling comm_signal_bind multiple times.
- * @param comsig: the communication point, with callback information.
- * @param sig: signal number.
- * @return: true on success. false on error.
- */
-int comm_signal_bind(struct comm_signal* comsig, int sig);
-
-/**
- * Delete the signal communication point.
- * @param comsig: to delete.
- */
-void comm_signal_delete(struct comm_signal* comsig);
-
-/**
- * perform accept(2) with error checking.
- * @param c: commpoint with accept fd.
- * @param addr: remote end returned here.
- * @param addrlen: length of remote end returned here.
- * @return new fd, or -1 on error.
- * if -1, error message has been printed if necessary, simply drop
- * out of the reading handler.
- */
-int comm_point_perform_accept(struct comm_point* c,
- struct sockaddr_storage* addr, socklen_t* addrlen);
-
-/**** internal routines ****/
-
-/**
- * This routine is published for checks and tests, and is only used internally.
- * handle libevent callback for udp comm point.
- * @param fd: file descriptor.
- * @param event: event bits from libevent:
- * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
- * @param arg: the comm_point structure.
- */
-void comm_point_udp_callback(int fd, short event, void* arg);
-
-/**
- * This routine is published for checks and tests, and is only used internally.
- * handle libevent callback for udp ancillary data comm point.
- * @param fd: file descriptor.
- * @param event: event bits from libevent:
- * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
- * @param arg: the comm_point structure.
- */
-void comm_point_udp_ancil_callback(int fd, short event, void* arg);
-
-/**
- * This routine is published for checks and tests, and is only used internally.
- * handle libevent callback for tcp accept comm point
- * @param fd: file descriptor.
- * @param event: event bits from libevent:
- * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
- * @param arg: the comm_point structure.
- */
-void comm_point_tcp_accept_callback(int fd, short event, void* arg);
-
-/**
- * This routine is published for checks and tests, and is only used internally.
- * handle libevent callback for tcp data comm point
- * @param fd: file descriptor.
- * @param event: event bits from libevent:
- * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
- * @param arg: the comm_point structure.
- */
-void comm_point_tcp_handle_callback(int fd, short event, void* arg);
-
-/**
- * This routine is published for checks and tests, and is only used internally.
- * handle libevent callback for timer comm.
- * @param fd: file descriptor (always -1).
- * @param event: event bits from libevent:
- * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
- * @param arg: the comm_timer structure.
- */
-void comm_timer_callback(int fd, short event, void* arg);
-
-/**
- * This routine is published for checks and tests, and is only used internally.
- * handle libevent callback for signal comm.
- * @param fd: file descriptor (used for the signal number).
- * @param event: event bits from libevent:
- * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
- * @param arg: the internal commsignal structure.
- */
-void comm_signal_callback(int fd, short event, void* arg);
-
-/**
- * This routine is published for checks and tests, and is only used internally.
- * libevent callback for AF_UNIX fds
- * @param fd: file descriptor.
- * @param event: event bits from libevent:
- * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
- * @param arg: the comm_point structure.
- */
-void comm_point_local_handle_callback(int fd, short event, void* arg);
-
-/**
- * This routine is published for checks and tests, and is only used internally.
- * libevent callback for raw fd access.
- * @param fd: file descriptor.
- * @param event: event bits from libevent:
- * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
- * @param arg: the comm_point structure.
- */
-void comm_point_raw_handle_callback(int fd, short event, void* arg);
-
-/**
- * This routine is published for checks and tests, and is only used internally.
- * libevent callback for timeout on slow accept.
- * @param fd: file descriptor.
- * @param event: event bits from libevent:
- * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
- * @param arg: the comm_point structure.
- */
-void comm_base_handle_slow_accept(int fd, short event, void* arg);
-
-#ifdef USE_WINSOCK
-/**
- * Callback for openssl BIO to on windows detect WSAEWOULDBLOCK and notify
- * the winsock_event of this for proper TCP nonblocking implementation.
- * @param c: comm_point, fd must be set its struct event is registered.
- * @param ssl: openssl SSL, fd must be set so it has a bio.
- */
-void comm_point_tcp_win_bio_cb(struct comm_point* c, void* ssl);
-#endif
-
-/** see if errno for tcp connect has to be logged or not. This uses errno */
-int tcp_connect_errno_needs_log(struct sockaddr* addr, socklen_t addrlen);
-
-#endif /* NET_EVENT_H */
diff --git a/external/unbound/util/random.c b/external/unbound/util/random.c
deleted file mode 100644
index 8332960b4..000000000
--- a/external/unbound/util/random.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * util/random.c - thread safe random generator, which is reasonably secure.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- * Thread safe random functions. Similar to arc4random() with an explicit
- * initialisation routine.
- *
- * The code in this file is based on arc4random from
- * openssh-4.0p1/openbsd-compat/bsd-arc4random.c
- * That code is also BSD licensed. Here is their statement:
- *
- * Copyright (c) 1996, David Mazieres <dm@uun.org>
- * Copyright (c) 2008, Damien Miller <djm@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-#include "config.h"
-#include "util/random.h"
-#include "util/log.h"
-#include <time.h>
-
-#ifdef HAVE_NSS
-/* nspr4 */
-#include "prerror.h"
-/* nss3 */
-#include "secport.h"
-#include "pk11pub.h"
-#elif defined(HAVE_NETTLE)
-#include "yarrow.h"
-#endif
-
-/**
- * Max random value. Similar to RAND_MAX, but more portable
- * (mingw uses only 15 bits random).
- */
-#define MAX_VALUE 0x7fffffff
-
-#if defined(HAVE_SSL)
-void
-ub_systemseed(unsigned int ATTR_UNUSED(seed))
-{
- /* arc4random_uniform does not need seeds, it gets kernel entropy */
-}
-
-struct ub_randstate*
-ub_initstate(unsigned int ATTR_UNUSED(seed),
- struct ub_randstate* ATTR_UNUSED(from))
-{
- struct ub_randstate* s = (struct ub_randstate*)malloc(1);
- if(!s) {
- log_err("malloc failure in random init");
- return NULL;
- }
- return s;
-}
-
-long int
-ub_random(struct ub_randstate* ATTR_UNUSED(s))
-{
- /* This relies on MAX_VALUE being 0x7fffffff. */
- return (long)arc4random() & MAX_VALUE;
-}
-
-long int
-ub_random_max(struct ub_randstate* state, long int x)
-{
- (void)state;
- /* on OpenBSD, this does not need _seed(), or _stir() calls */
- return (long)arc4random_uniform((uint32_t)x);
-}
-
-#elif defined(HAVE_NSS)
-
-/* not much to remember for NSS since we use its pk11_random, placeholder */
-struct ub_randstate {
- int ready;
-};
-
-void ub_systemseed(unsigned int ATTR_UNUSED(seed))
-{
-}
-
-struct ub_randstate* ub_initstate(unsigned int ATTR_UNUSED(seed),
- struct ub_randstate* ATTR_UNUSED(from))
-{
- struct ub_randstate* s = (struct ub_randstate*)calloc(1, sizeof(*s));
- if(!s) {
- log_err("malloc failure in random init");
- return NULL;
- }
- return s;
-}
-
-long int ub_random(struct ub_randstate* ATTR_UNUSED(state))
-{
- long int x;
- /* random 31 bit value. */
- SECStatus s = PK11_GenerateRandom((unsigned char*)&x, (int)sizeof(x));
- if(s != SECSuccess) {
- log_err("PK11_GenerateRandom error: %s",
- PORT_ErrorToString(PORT_GetError()));
- }
- return x & MAX_VALUE;
-}
-
-#elif defined(HAVE_NETTLE)
-
-/**
- * libnettle implements a Yarrow-256 generator (SHA256 + AES),
- * and we have to ensure it is seeded before use.
- */
-struct ub_randstate {
- struct yarrow256_ctx ctx;
- int seeded;
-};
-
-void ub_systemseed(unsigned int ATTR_UNUSED(seed))
-{
-/**
- * We seed on init and not here, as we need the ctx to re-seed.
- * This also means that re-seeding is not supported.
- */
- log_err("Re-seeding not supported, generator untouched");
-}
-
-struct ub_randstate* ub_initstate(unsigned int seed,
- struct ub_randstate* ATTR_UNUSED(from))
-{
- struct ub_randstate* s = (struct ub_randstate*)calloc(1, sizeof(*s));
- uint8_t buf[YARROW256_SEED_FILE_SIZE];
- if(!s) {
- log_err("malloc failure in random init");
- return NULL;
- }
- /* Setup Yarrow context */
- yarrow256_init(&s->ctx, 0, NULL);
-
- if(getentropy(buf, sizeof(buf)) != -1) {
- /* got entropy */
- yarrow256_seed(&s->ctx, YARROW256_SEED_FILE_SIZE, buf);
- s->seeded = yarrow256_is_seeded(&s->ctx);
- } else {
- /* Stretch the uint32 input seed and feed it to Yarrow */
- uint32_t v = seed;
- size_t i;
- for(i=0; i < (YARROW256_SEED_FILE_SIZE/sizeof(seed)); i++) {
- memmove(buf+i*sizeof(seed), &v, sizeof(seed));
- v = v*seed + (uint32_t)i;
- }
- yarrow256_seed(&s->ctx, YARROW256_SEED_FILE_SIZE, buf);
- s->seeded = yarrow256_is_seeded(&s->ctx);
- }
-
- return s;
-}
-
-long int ub_random(struct ub_randstate* s)
-{
- /* random 31 bit value. */
- long int x = 0;
- if (!s || !s->seeded) {
- log_err("Couldn't generate randomness, Yarrow-256 generator not yet seeded");
- } else {
- yarrow256_random(&s->ctx, sizeof(x), (uint8_t *)&x);
- }
- return x & MAX_VALUE;
-}
-#endif /* HAVE_SSL or HAVE_NSS or HAVE_NETTLE */
-
-
-#if defined(HAVE_NSS) || defined(HAVE_NETTLE)
-long int
-ub_random_max(struct ub_randstate* state, long int x)
-{
- /* make sure we fetch in a range that is divisible by x. ignore
- * values from d .. MAX_VALUE, instead draw a new number */
- long int d = MAX_VALUE - (MAX_VALUE % x); /* d is divisible by x */
- long int v = ub_random(state);
- while(d <= v)
- v = ub_random(state);
- return (v % x);
-}
-#endif /* HAVE_NSS or HAVE_NETTLE */
-
-void
-ub_randfree(struct ub_randstate* s)
-{
- free(s);
- /* user app must do RAND_cleanup(); */
-}
diff --git a/external/unbound/util/random.h b/external/unbound/util/random.h
deleted file mode 100644
index a05a994a3..000000000
--- a/external/unbound/util/random.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * util/random.h - thread safe random generator, which is reasonably secure.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef UTIL_RANDOM_H
-#define UTIL_RANDOM_H
-
-/**
- * \file
- * Thread safe random functions. Similar to arc4random() with an explicit
- * initialisation routine.
- */
-
-/**
- * random state structure.
- */
-struct ub_randstate;
-
-/**
- * Initialize the system randomness. Obtains entropy from the system
- * before a chroot or privilege makes it unavailable.
- * You do not have to call this, otherwise ub_initstate does so.
- * @param seed: seed value to create state (if no good entropy is found).
- */
-void ub_systemseed(unsigned int seed);
-
-/**
- * Initialize a random generator state for use
- * @param seed: seed value to create state contents.
- * (ignored for arc4random).
- * @param from: if not NULL, the seed is taken from this random structure.
- * can be used to seed random states via a parent-random-state that
- * is itself seeded with entropy.
- * @return new state or NULL alloc failure.
- */
-struct ub_randstate* ub_initstate(unsigned int seed,
- struct ub_randstate* from);
-
-/**
- * Generate next random number from the state passed along.
- * Thread safe, so random numbers are repeatable.
- * @param state: must have been initialised with ub_initstate.
- * @return: random 31 bit value.
- */
-long int ub_random(struct ub_randstate* state);
-
-/**
- * Generate random number between 0 and x-1. No modulo bias.
- * @param state: must have been initialised with ub_initstate.
- * @param x: an upper limit. not (negative or zero). must be smaller than 2**31.
- * @return: random value between 0..x-1. Possibly more than one
- * random number is picked from the random stream to satisfy this.
- */
-long int ub_random_max(struct ub_randstate* state, long int x);
-
-/**
- * Delete the random state.
- * @param state: to delete.
- */
-void ub_randfree(struct ub_randstate* state);
-
-#endif /* UTIL_RANDOM_H */
diff --git a/external/unbound/util/rbtree.c b/external/unbound/util/rbtree.c
deleted file mode 100644
index f031c9a13..000000000
--- a/external/unbound/util/rbtree.c
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- * rbtree.c -- generic red black tree
- *
- * Copyright (c) 2001-2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-/**
- * \file
- * Implementation of a redblack tree.
- */
-
-#include "config.h"
-#include "log.h"
-#include "fptr_wlist.h"
-#include "util/rbtree.h"
-
-/** Node colour black */
-#define BLACK 0
-/** Node colour red */
-#define RED 1
-
-/** the NULL node, global alloc */
-rbnode_type rbtree_null_node = {
- RBTREE_NULL, /* Parent. */
- RBTREE_NULL, /* Left. */
- RBTREE_NULL, /* Right. */
- NULL, /* Key. */
- BLACK /* Color. */
-};
-
-/** rotate subtree left (to preserve redblack property) */
-static void rbtree_rotate_left(rbtree_type *rbtree, rbnode_type *node);
-/** rotate subtree right (to preserve redblack property) */
-static void rbtree_rotate_right(rbtree_type *rbtree, rbnode_type *node);
-/** Fixup node colours when insert happened */
-static void rbtree_insert_fixup(rbtree_type *rbtree, rbnode_type *node);
-/** Fixup node colours when delete happened */
-static void rbtree_delete_fixup(rbtree_type* rbtree, rbnode_type* child,
- rbnode_type* child_parent);
-
-/*
- * Creates a new red black tree, initializes and returns a pointer to it.
- *
- * Return NULL on failure.
- *
- */
-rbtree_type *
-rbtree_create (int (*cmpf)(const void *, const void *))
-{
- rbtree_type *rbtree;
-
- /* Allocate memory for it */
- rbtree = (rbtree_type *) malloc(sizeof(rbtree_type));
- if (!rbtree) {
- return NULL;
- }
-
- /* Initialize it */
- rbtree_init(rbtree, cmpf);
-
- return rbtree;
-}
-
-void
-rbtree_init(rbtree_type *rbtree, int (*cmpf)(const void *, const void *))
-{
- /* Initialize it */
- rbtree->root = RBTREE_NULL;
- rbtree->count = 0;
- rbtree->cmp = cmpf;
-}
-
-/*
- * Rotates the node to the left.
- *
- */
-static void
-rbtree_rotate_left(rbtree_type *rbtree, rbnode_type *node)
-{
- rbnode_type *right = node->right;
- node->right = right->left;
- if (right->left != RBTREE_NULL)
- right->left->parent = node;
-
- right->parent = node->parent;
-
- if (node->parent != RBTREE_NULL) {
- if (node == node->parent->left) {
- node->parent->left = right;
- } else {
- node->parent->right = right;
- }
- } else {
- rbtree->root = right;
- }
- right->left = node;
- node->parent = right;
-}
-
-/*
- * Rotates the node to the right.
- *
- */
-static void
-rbtree_rotate_right(rbtree_type *rbtree, rbnode_type *node)
-{
- rbnode_type *left = node->left;
- node->left = left->right;
- if (left->right != RBTREE_NULL)
- left->right->parent = node;
-
- left->parent = node->parent;
-
- if (node->parent != RBTREE_NULL) {
- if (node == node->parent->right) {
- node->parent->right = left;
- } else {
- node->parent->left = left;
- }
- } else {
- rbtree->root = left;
- }
- left->right = node;
- node->parent = left;
-}
-
-static void
-rbtree_insert_fixup(rbtree_type *rbtree, rbnode_type *node)
-{
- rbnode_type *uncle;
-
- /* While not at the root and need fixing... */
- while (node != rbtree->root && node->parent->color == RED) {
- /* If our parent is left child of our grandparent... */
- if (node->parent == node->parent->parent->left) {
- uncle = node->parent->parent->right;
-
- /* If our uncle is red... */
- if (uncle->color == RED) {
- /* Paint the parent and the uncle black... */
- node->parent->color = BLACK;
- uncle->color = BLACK;
-
- /* And the grandparent red... */
- node->parent->parent->color = RED;
-
- /* And continue fixing the grandparent */
- node = node->parent->parent;
- } else { /* Our uncle is black... */
- /* Are we the right child? */
- if (node == node->parent->right) {
- node = node->parent;
- rbtree_rotate_left(rbtree, node);
- }
- /* Now we're the left child, repaint and rotate... */
- node->parent->color = BLACK;
- node->parent->parent->color = RED;
- rbtree_rotate_right(rbtree, node->parent->parent);
- }
- } else {
- uncle = node->parent->parent->left;
-
- /* If our uncle is red... */
- if (uncle->color == RED) {
- /* Paint the parent and the uncle black... */
- node->parent->color = BLACK;
- uncle->color = BLACK;
-
- /* And the grandparent red... */
- node->parent->parent->color = RED;
-
- /* And continue fixing the grandparent */
- node = node->parent->parent;
- } else { /* Our uncle is black... */
- /* Are we the right child? */
- if (node == node->parent->left) {
- node = node->parent;
- rbtree_rotate_right(rbtree, node);
- }
- /* Now we're the right child, repaint and rotate... */
- node->parent->color = BLACK;
- node->parent->parent->color = RED;
- rbtree_rotate_left(rbtree, node->parent->parent);
- }
- }
- }
- rbtree->root->color = BLACK;
-}
-
-
-/*
- * Inserts a node into a red black tree.
- *
- * Returns NULL on failure or the pointer to the newly added node
- * otherwise.
- */
-rbnode_type *
-rbtree_insert (rbtree_type *rbtree, rbnode_type *data)
-{
- /* XXX Not necessary, but keeps compiler quiet... */
- int r = 0;
-
- /* We start at the root of the tree */
- rbnode_type *node = rbtree->root;
- rbnode_type *parent = RBTREE_NULL;
-
- fptr_ok(fptr_whitelist_rbtree_cmp(rbtree->cmp));
- /* Lets find the new parent... */
- while (node != RBTREE_NULL) {
- /* Compare two keys, do we have a duplicate? */
- if ((r = rbtree->cmp(data->key, node->key)) == 0) {
- return NULL;
- }
- parent = node;
-
- if (r < 0) {
- node = node->left;
- } else {
- node = node->right;
- }
- }
-
- /* Initialize the new node */
- data->parent = parent;
- data->left = data->right = RBTREE_NULL;
- data->color = RED;
- rbtree->count++;
-
- /* Insert it into the tree... */
- if (parent != RBTREE_NULL) {
- if (r < 0) {
- parent->left = data;
- } else {
- parent->right = data;
- }
- } else {
- rbtree->root = data;
- }
-
- /* Fix up the red-black properties... */
- rbtree_insert_fixup(rbtree, data);
-
- return data;
-}
-
-/*
- * Searches the red black tree, returns the data if key is found or NULL otherwise.
- *
- */
-rbnode_type *
-rbtree_search (rbtree_type *rbtree, const void *key)
-{
- rbnode_type *node;
-
- if (rbtree_find_less_equal(rbtree, key, &node)) {
- return node;
- } else {
- return NULL;
- }
-}
-
-/** helpers for delete: swap node colours */
-static void swap_int8(uint8_t* x, uint8_t* y)
-{
- uint8_t t = *x; *x = *y; *y = t;
-}
-
-/** helpers for delete: swap node pointers */
-static void swap_np(rbnode_type** x, rbnode_type** y)
-{
- rbnode_type* t = *x; *x = *y; *y = t;
-}
-
-/** Update parent pointers of child trees of 'parent' */
-static void change_parent_ptr(rbtree_type* rbtree, rbnode_type* parent,
- rbnode_type* old, rbnode_type* new)
-{
- if(parent == RBTREE_NULL)
- {
- log_assert(rbtree->root == old);
- if(rbtree->root == old) rbtree->root = new;
- return;
- }
- log_assert(parent->left == old || parent->right == old
- || parent->left == new || parent->right == new);
- if(parent->left == old) parent->left = new;
- if(parent->right == old) parent->right = new;
-}
-/** Update parent pointer of a node 'child' */
-static void change_child_ptr(rbnode_type* child, rbnode_type* old,
- rbnode_type* new)
-{
- if(child == RBTREE_NULL) return;
- log_assert(child->parent == old || child->parent == new);
- if(child->parent == old) child->parent = new;
-}
-
-rbnode_type*
-rbtree_delete(rbtree_type *rbtree, const void *key)
-{
- rbnode_type *to_delete;
- rbnode_type *child;
- if((to_delete = rbtree_search(rbtree, key)) == 0) return 0;
- rbtree->count--;
-
- /* make sure we have at most one non-leaf child */
- if(to_delete->left != RBTREE_NULL && to_delete->right != RBTREE_NULL)
- {
- /* swap with smallest from right subtree (or largest from left) */
- rbnode_type *smright = to_delete->right;
- while(smright->left != RBTREE_NULL)
- smright = smright->left;
- /* swap the smright and to_delete elements in the tree,
- * but the rbnode_type is first part of user data struct
- * so cannot just swap the keys and data pointers. Instead
- * readjust the pointers left,right,parent */
-
- /* swap colors - colors are tied to the position in the tree */
- swap_int8(&to_delete->color, &smright->color);
-
- /* swap child pointers in parents of smright/to_delete */
- change_parent_ptr(rbtree, to_delete->parent, to_delete, smright);
- if(to_delete->right != smright)
- change_parent_ptr(rbtree, smright->parent, smright, to_delete);
-
- /* swap parent pointers in children of smright/to_delete */
- change_child_ptr(smright->left, smright, to_delete);
- change_child_ptr(smright->left, smright, to_delete);
- change_child_ptr(smright->right, smright, to_delete);
- change_child_ptr(smright->right, smright, to_delete);
- change_child_ptr(to_delete->left, to_delete, smright);
- if(to_delete->right != smright)
- change_child_ptr(to_delete->right, to_delete, smright);
- if(to_delete->right == smright)
- {
- /* set up so after swap they work */
- to_delete->right = to_delete;
- smright->parent = smright;
- }
-
- /* swap pointers in to_delete/smright nodes */
- swap_np(&to_delete->parent, &smright->parent);
- swap_np(&to_delete->left, &smright->left);
- swap_np(&to_delete->right, &smright->right);
-
- /* now delete to_delete (which is at the location where the smright previously was) */
- }
- log_assert(to_delete->left == RBTREE_NULL || to_delete->right == RBTREE_NULL);
-
- if(to_delete->left != RBTREE_NULL) child = to_delete->left;
- else child = to_delete->right;
-
- /* unlink to_delete from the tree, replace to_delete with child */
- change_parent_ptr(rbtree, to_delete->parent, to_delete, child);
- change_child_ptr(child, to_delete, to_delete->parent);
-
- if(to_delete->color == RED)
- {
- /* if node is red then the child (black) can be swapped in */
- }
- else if(child->color == RED)
- {
- /* change child to BLACK, removing a RED node is no problem */
- if(child!=RBTREE_NULL) child->color = BLACK;
- }
- else rbtree_delete_fixup(rbtree, child, to_delete->parent);
-
- /* unlink completely */
- to_delete->parent = RBTREE_NULL;
- to_delete->left = RBTREE_NULL;
- to_delete->right = RBTREE_NULL;
- to_delete->color = BLACK;
- return to_delete;
-}
-
-static void rbtree_delete_fixup(rbtree_type* rbtree, rbnode_type* child,
- rbnode_type* child_parent)
-{
- rbnode_type* sibling;
- int go_up = 1;
-
- /* determine sibling to the node that is one-black short */
- if(child_parent->right == child) sibling = child_parent->left;
- else sibling = child_parent->right;
-
- while(go_up)
- {
- if(child_parent == RBTREE_NULL)
- {
- /* removed parent==black from root, every path, so ok */
- return;
- }
-
- if(sibling->color == RED)
- { /* rotate to get a black sibling */
- child_parent->color = RED;
- sibling->color = BLACK;
- if(child_parent->right == child)
- rbtree_rotate_right(rbtree, child_parent);
- else rbtree_rotate_left(rbtree, child_parent);
- /* new sibling after rotation */
- if(child_parent->right == child) sibling = child_parent->left;
- else sibling = child_parent->right;
- }
-
- if(child_parent->color == BLACK
- && sibling->color == BLACK
- && sibling->left->color == BLACK
- && sibling->right->color == BLACK)
- { /* fixup local with recolor of sibling */
- if(sibling != RBTREE_NULL)
- sibling->color = RED;
-
- child = child_parent;
- child_parent = child_parent->parent;
- /* prepare to go up, new sibling */
- if(child_parent->right == child) sibling = child_parent->left;
- else sibling = child_parent->right;
- }
- else go_up = 0;
- }
-
- if(child_parent->color == RED
- && sibling->color == BLACK
- && sibling->left->color == BLACK
- && sibling->right->color == BLACK)
- {
- /* move red to sibling to rebalance */
- if(sibling != RBTREE_NULL)
- sibling->color = RED;
- child_parent->color = BLACK;
- return;
- }
- log_assert(sibling != RBTREE_NULL);
-
- /* get a new sibling, by rotating at sibling. See which child
- of sibling is red */
- if(child_parent->right == child
- && sibling->color == BLACK
- && sibling->right->color == RED
- && sibling->left->color == BLACK)
- {
- sibling->color = RED;
- sibling->right->color = BLACK;
- rbtree_rotate_left(rbtree, sibling);
- /* new sibling after rotation */
- if(child_parent->right == child) sibling = child_parent->left;
- else sibling = child_parent->right;
- }
- else if(child_parent->left == child
- && sibling->color == BLACK
- && sibling->left->color == RED
- && sibling->right->color == BLACK)
- {
- sibling->color = RED;
- sibling->left->color = BLACK;
- rbtree_rotate_right(rbtree, sibling);
- /* new sibling after rotation */
- if(child_parent->right == child) sibling = child_parent->left;
- else sibling = child_parent->right;
- }
-
- /* now we have a black sibling with a red child. rotate and exchange colors. */
- sibling->color = child_parent->color;
- child_parent->color = BLACK;
- if(child_parent->right == child)
- {
- log_assert(sibling->left->color == RED);
- sibling->left->color = BLACK;
- rbtree_rotate_right(rbtree, child_parent);
- }
- else
- {
- log_assert(sibling->right->color == RED);
- sibling->right->color = BLACK;
- rbtree_rotate_left(rbtree, child_parent);
- }
-}
-
-int
-rbtree_find_less_equal(rbtree_type *rbtree, const void *key,
- rbnode_type **result)
-{
- int r;
- rbnode_type *node;
-
- log_assert(result);
-
- /* We start at root... */
- node = rbtree->root;
-
- *result = NULL;
- fptr_ok(fptr_whitelist_rbtree_cmp(rbtree->cmp));
-
- /* While there are children... */
- while (node != RBTREE_NULL) {
- r = rbtree->cmp(key, node->key);
- if (r == 0) {
- /* Exact match */
- *result = node;
- return 1;
- }
- if (r < 0) {
- node = node->left;
- } else {
- /* Temporary match */
- *result = node;
- node = node->right;
- }
- }
- return 0;
-}
-
-/*
- * Finds the first element in the red black tree
- *
- */
-rbnode_type *
-rbtree_first (rbtree_type *rbtree)
-{
- rbnode_type *node;
-
- for (node = rbtree->root; node->left != RBTREE_NULL; node = node->left);
- return node;
-}
-
-rbnode_type *
-rbtree_last (rbtree_type *rbtree)
-{
- rbnode_type *node;
-
- for (node = rbtree->root; node->right != RBTREE_NULL; node = node->right);
- return node;
-}
-
-/*
- * Returns the next node...
- *
- */
-rbnode_type *
-rbtree_next (rbnode_type *node)
-{
- rbnode_type *parent;
-
- if (node->right != RBTREE_NULL) {
- /* One right, then keep on going left... */
- for (node = node->right; node->left != RBTREE_NULL; node = node->left);
- } else {
- parent = node->parent;
- while (parent != RBTREE_NULL && node == parent->right) {
- node = parent;
- parent = parent->parent;
- }
- node = parent;
- }
- return node;
-}
-
-rbnode_type *
-rbtree_previous(rbnode_type *node)
-{
- rbnode_type *parent;
-
- if (node->left != RBTREE_NULL) {
- /* One left, then keep on going right... */
- for (node = node->left; node->right != RBTREE_NULL; node = node->right);
- } else {
- parent = node->parent;
- while (parent != RBTREE_NULL && node == parent->left) {
- node = parent;
- parent = parent->parent;
- }
- node = parent;
- }
- return node;
-}
-
-/** recursive descent traverse */
-static void
-traverse_post(void (*func)(rbnode_type*, void*), void* arg, rbnode_type* node)
-{
- if(!node || node == RBTREE_NULL)
- return;
- /* recurse */
- traverse_post(func, arg, node->left);
- traverse_post(func, arg, node->right);
- /* call user func */
- (*func)(node, arg);
-}
-
-void
-traverse_postorder(rbtree_type* tree, void (*func)(rbnode_type*, void*),
- void* arg)
-{
- traverse_post(func, arg, tree->root);
-}
diff --git a/external/unbound/util/rbtree.h b/external/unbound/util/rbtree.h
deleted file mode 100644
index dfcf09ac6..000000000
--- a/external/unbound/util/rbtree.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * rbtree.h -- generic red-black tree
- *
- * Copyright (c) 2001-2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-/**
- * \file
- * Red black tree. Implementation taken from NSD 3.0.5, adjusted for use
- * in unbound (memory allocation, logging and so on).
- */
-
-#ifndef UTIL_RBTREE_H_
-#define UTIL_RBTREE_H_
-
-/**
- * This structure must be the first member of the data structure in
- * the rbtree. This allows easy casting between an rbnode_type and the
- * user data (poor man's inheritance).
- */
-typedef struct rbnode_type rbnode_type;
-/**
- * The rbnode_type struct definition.
- */
-struct rbnode_type {
- /** parent in rbtree, RBTREE_NULL for root */
- rbnode_type *parent;
- /** left node (smaller items) */
- rbnode_type *left;
- /** right node (larger items) */
- rbnode_type *right;
- /** pointer to sorting key */
- const void *key;
- /** colour of this node */
- uint8_t color;
-};
-
-/** The nullpointer, points to empty node */
-#define RBTREE_NULL &rbtree_null_node
-/** the global empty node */
-extern rbnode_type rbtree_null_node;
-
-/** An entire red black tree */
-typedef struct rbtree_type rbtree_type;
-/** definition for tree struct */
-struct rbtree_type {
- /** The root of the red-black tree */
- rbnode_type *root;
-
- /** The number of the nodes in the tree */
- size_t count;
-
- /**
- * Key compare function. <0,0,>0 like strcmp.
- * Return 0 on two NULL ptrs.
- */
- int (*cmp) (const void *, const void *);
-};
-
-/**
- * Create new tree (malloced) with given key compare function.
- * @param cmpf: compare function (like strcmp) takes pointers to two keys.
- * @return: new tree, empty.
- */
-rbtree_type *rbtree_create(int (*cmpf)(const void *, const void *));
-
-/**
- * Init a new tree (malloced by caller) with given key compare function.
- * @param rbtree: uninitialised memory for new tree, returned empty.
- * @param cmpf: compare function (like strcmp) takes pointers to two keys.
- */
-void rbtree_init(rbtree_type *rbtree, int (*cmpf)(const void *, const void *));
-
-/**
- * Insert data into the tree.
- * @param rbtree: tree to insert to.
- * @param data: element to insert.
- * @return: data ptr or NULL if key already present.
- */
-rbnode_type *rbtree_insert(rbtree_type *rbtree, rbnode_type *data);
-
-/**
- * Delete element from tree.
- * @param rbtree: tree to delete from.
- * @param key: key of item to delete.
- * @return: node that is now unlinked from the tree. User to delete it.
- * returns 0 if node not present
- */
-rbnode_type *rbtree_delete(rbtree_type *rbtree, const void *key);
-
-/**
- * Find key in tree. Returns NULL if not found.
- * @param rbtree: tree to find in.
- * @param key: key that must match.
- * @return: node that fits or NULL.
- */
-rbnode_type *rbtree_search(rbtree_type *rbtree, const void *key);
-
-/**
- * Find, but match does not have to be exact.
- * @param rbtree: tree to find in.
- * @param key: key to find position of.
- * @param result: set to the exact node if present, otherwise to element that
- * precedes the position of key in the tree. NULL if no smaller element.
- * @return: true if exact match in result. Else result points to <= element,
- * or NULL if key is smaller than the smallest key.
- */
-int rbtree_find_less_equal(rbtree_type *rbtree, const void *key,
- rbnode_type **result);
-
-/**
- * Returns first (smallest) node in the tree
- * @param rbtree: tree
- * @return: smallest element or NULL if tree empty.
- */
-rbnode_type *rbtree_first(rbtree_type *rbtree);
-
-/**
- * Returns last (largest) node in the tree
- * @param rbtree: tree
- * @return: largest element or NULL if tree empty.
- */
-rbnode_type *rbtree_last(rbtree_type *rbtree);
-
-/**
- * Returns next larger node in the tree
- * @param rbtree: tree
- * @return: next larger element or NULL if no larger in tree.
- */
-rbnode_type *rbtree_next(rbnode_type *rbtree);
-
-/**
- * Returns previous smaller node in the tree
- * @param rbtree: tree
- * @return: previous smaller element or NULL if no previous in tree.
- */
-rbnode_type *rbtree_previous(rbnode_type *rbtree);
-
-/**
- * Call with node=variable of struct* with rbnode_type as first element.
- * with type is the type of a pointer to that struct.
- */
-#define RBTREE_FOR(node, type, rbtree) \
- for(node=(type)rbtree_first(rbtree); \
- (rbnode_type*)node != RBTREE_NULL; \
- node = (type)rbtree_next((rbnode_type*)node))
-
-/**
- * Call function for all elements in the redblack tree, such that
- * leaf elements are called before parent elements. So that all
- * elements can be safely free()d.
- * Note that your function must not remove the nodes from the tree.
- * Since that may trigger rebalances of the rbtree.
- * @param tree: the tree
- * @param func: function called with element and user arg.
- * The function must not alter the rbtree.
- * @param arg: user argument.
- */
-void traverse_postorder(rbtree_type* tree, void (*func)(rbnode_type*, void*),
- void* arg);
-
-#endif /* UTIL_RBTREE_H_ */
diff --git a/external/unbound/util/regional.c b/external/unbound/util/regional.c
deleted file mode 100644
index 899a54edb..000000000
--- a/external/unbound/util/regional.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * regional.c -- region based memory allocator.
- *
- * Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- * Regional allocator. Allocates small portions of of larger chunks.
- */
-
-#include "config.h"
-#include "util/log.h"
-#include "util/regional.h"
-
-#ifdef ALIGNMENT
-# undef ALIGNMENT
-#endif
-/** increase size until it fits alignment of s bytes */
-#define ALIGN_UP(x, s) (((x) + s - 1) & (~(s - 1)))
-/** what size to align on; make sure a char* fits in it. */
-#define ALIGNMENT (sizeof(uint64_t))
-
-/** Default reasonable size for chunks */
-#define REGIONAL_CHUNK_SIZE 8192
-#ifdef UNBOUND_ALLOC_NONREGIONAL
-/** All objects allocated outside of chunks, for debug */
-#define REGIONAL_LARGE_OBJECT_SIZE 0
-#else
-/** Default size for large objects - allocated outside of chunks. */
-#define REGIONAL_LARGE_OBJECT_SIZE 2048
-#endif
-
-struct regional*
-regional_create(void)
-{
- return regional_create_custom(REGIONAL_CHUNK_SIZE);
-}
-
-/** init regional struct with first block */
-static void
-regional_init(struct regional* r)
-{
- size_t a = ALIGN_UP(sizeof(struct regional), ALIGNMENT);
- r->data = (char*)r + a;
- r->available = r->first_size - a;
- r->next = NULL;
- r->large_list = NULL;
- r->total_large = 0;
-}
-
-struct regional*
-regional_create_custom(size_t size)
-{
- struct regional* r = (struct regional*)malloc(size);
- log_assert(sizeof(struct regional) <= size);
- if(!r) return NULL;
- r->first_size = size;
- regional_init(r);
- return r;
-}
-
-void
-regional_free_all(struct regional *r)
-{
- char* p = r->next, *np;
- while(p) {
- np = *(char**)p;
- free(p);
- p = np;
- }
- p = r->large_list;
- while(p) {
- np = *(char**)p;
- free(p);
- p = np;
- }
- regional_init(r);
-}
-
-void
-regional_destroy(struct regional *r)
-{
- if(!r) return;
- regional_free_all(r);
- free(r);
-}
-
-void *
-regional_alloc(struct regional *r, size_t size)
-{
- size_t a = ALIGN_UP(size, ALIGNMENT);
- void *s;
- /* large objects */
- if(a > REGIONAL_LARGE_OBJECT_SIZE) {
- s = malloc(ALIGNMENT + size);
- if(!s) return NULL;
- r->total_large += ALIGNMENT+size;
- *(char**)s = r->large_list;
- r->large_list = (char*)s;
- return (char*)s+ALIGNMENT;
- }
- /* create a new chunk */
- if(a > r->available) {
- s = malloc(REGIONAL_CHUNK_SIZE);
- if(!s) return NULL;
- *(char**)s = r->next;
- r->next = (char*)s;
- r->data = (char*)s + ALIGNMENT;
- r->available = REGIONAL_CHUNK_SIZE - ALIGNMENT;
- }
- /* put in this chunk */
- r->available -= a;
- s = r->data;
- r->data += a;
- return s;
-}
-
-void *
-regional_alloc_init(struct regional* r, const void *init, size_t size)
-{
- void *s = regional_alloc(r, size);
- if(!s) return NULL;
- memcpy(s, init, size);
- return s;
-}
-
-void *
-regional_alloc_zero(struct regional *r, size_t size)
-{
- void *s = regional_alloc(r, size);
- if(!s) return NULL;
- memset(s, 0, size);
- return s;
-}
-
-char *
-regional_strdup(struct regional *r, const char *string)
-{
- return (char*)regional_alloc_init(r, string, strlen(string)+1);
-}
-
-/**
- * reasonably slow, but stats and get_mem are not supposed to be fast
- * count the number of chunks in use
- */
-static size_t
-count_chunks(struct regional* r)
-{
- size_t c = 1;
- char* p = r->next;
- while(p) {
- c++;
- p = *(char**)p;
- }
- return c;
-}
-
-/**
- * also reasonably slow, counts the number of large objects
- */
-static size_t
-count_large(struct regional* r)
-{
- size_t c = 0;
- char* p = r->large_list;
- while(p) {
- c++;
- p = *(char**)p;
- }
- return c;
-}
-
-void
-regional_log_stats(struct regional *r)
-{
- /* some basic assertions put here (non time critical code) */
- log_assert(ALIGNMENT >= sizeof(char*));
- log_assert(REGIONAL_CHUNK_SIZE > ALIGNMENT);
- log_assert(REGIONAL_CHUNK_SIZE-ALIGNMENT > REGIONAL_LARGE_OBJECT_SIZE);
- log_assert(REGIONAL_CHUNK_SIZE >= sizeof(struct regional));
- /* debug print */
- log_info("regional %u chunks, %u large",
- (unsigned)count_chunks(r), (unsigned)count_large(r));
-}
-
-size_t
-regional_get_mem(struct regional* r)
-{
- return r->first_size + (count_chunks(r)-1)*REGIONAL_CHUNK_SIZE
- + r->total_large;
-}
diff --git a/external/unbound/util/regional.h b/external/unbound/util/regional.h
deleted file mode 100644
index e8b2cb8d0..000000000
--- a/external/unbound/util/regional.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * regional.h -- region based memory allocator.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- * Regional allocator. Allocates small portions of of larger chunks.
- * Based on region-allocator from NSD, but rewritten to be light.
- *
- * Different from (nsd) region-allocator.h
- * o does not have recycle bin
- * o does not collect stats; just enough to answer get_mem() in use.
- * o does not keep cleanup list
- * o does not have function pointers to setup
- * o allocs the regional struct inside the first block.
- * o can take a block to create regional from.
- * o blocks and large allocations are kept on singly linked lists.
- */
-
-#ifndef UTIL_REGIONAL_H_
-#define UTIL_REGIONAL_H_
-
-/**
- * the regional* is the first block*.
- * every block has a ptr to the next in first bytes.
- * and so does the regional struct, which is the first block.
- */
-struct regional
-{
- /**
- * next chunk. NULL if first chunk is the only chunk.
- * first inside that chunk is the char* next pointer.
- * When regional_free_all() has been called this value is NULL.
- */
- char* next;
- /** first large object, cast to char** to obtain next ptr */
- char* large_list;
- /** total large size */
- size_t total_large;
- /** initial chunk size */
- size_t first_size;
- /** number of bytes available in the current chunk. */
- size_t available;
- /** current chunk data position. */
- char* data;
-};
-
-/**
- * Create a new regional.
- * @return: newly allocated regional.
- */
-struct regional* regional_create(void);
-
-/**
- * Create a new region, with custom settings.
- * @param size: length of first block.
- * @return: newly allocated regional.
- */
-struct regional* regional_create_custom(size_t size);
-
-/**
- * Free all memory associated with regional. Only keeps the first block with
- * the regional inside it.
- * @param r: the region.
- */
-void regional_free_all(struct regional *r);
-
-/**
- * Destroy regional. All memory associated with regional is freed as if
- * regional_free_all was called, as well as destroying the regional struct.
- * @param r: to delete.
- */
-void regional_destroy(struct regional *r);
-
-/**
- * Allocate size bytes of memory inside regional. The memory is
- * deallocated when region_free_all is called for this region.
- * @param r: the region.
- * @param size: number of bytes.
- * @return: pointer to memory allocated.
- */
-void *regional_alloc(struct regional *r, size_t size);
-
-/**
- * Allocate size bytes of memory inside regional and copy INIT into it.
- * The memory is deallocated when region_free_all is called for this
- * region.
- * @param r: the region.
- * @param init: to copy.
- * @param size: number of bytes.
- * @return: pointer to memory allocated.
- */
-void *regional_alloc_init(struct regional* r, const void *init, size_t size);
-
-/**
- * Allocate size bytes of memory inside regional that are initialized to
- * 0. The memory is deallocated when region_free_all is called for
- * this region.
- * @param r: the region.
- * @param size: number of bytes.
- * @return: pointer to memory allocated.
- */
-void *regional_alloc_zero(struct regional *r, size_t size);
-
-/**
- * Duplicate string and allocate the result in regional.
- * @param r: the region.
- * @param string: null terminated string.
- * @return: pointer to memory allocated.
- */
-char *regional_strdup(struct regional *r, const char *string);
-
-/** Debug print regional statistics to log */
-void regional_log_stats(struct regional *r);
-
-/** get total memory size in use by region */
-size_t regional_get_mem(struct regional* r);
-
-#endif /* UTIL_REGIONAL_H_ */
diff --git a/external/unbound/util/rtt.c b/external/unbound/util/rtt.c
deleted file mode 100644
index 5d86f1337..000000000
--- a/external/unbound/util/rtt.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * util/rtt.c - UDP round trip time estimator for resend timeouts.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains a data type and functions to help estimate good
- * round trip times for UDP resend timeout values.
- */
-#include "config.h"
-#include "util/rtt.h"
-
-/* overwritten by config: infra_cache_min_rtt: */
-int RTT_MIN_TIMEOUT = 50;
-/** calculate RTO from rtt information */
-static int
-calc_rto(const struct rtt_info* rtt)
-{
- /* From Stevens, Unix Network Programming, Vol1, 3rd ed., p.598 */
- int rto = rtt->srtt + 4*rtt->rttvar;
- if(rto < RTT_MIN_TIMEOUT)
- rto = RTT_MIN_TIMEOUT;
- if(rto > RTT_MAX_TIMEOUT)
- rto = RTT_MAX_TIMEOUT;
- return rto;
-}
-
-void
-rtt_init(struct rtt_info* rtt)
-{
- rtt->srtt = 0;
- rtt->rttvar = 94;
- rtt->rto = calc_rto(rtt);
- /* default value from the book is 0 + 4*0.75 = 3 seconds */
- /* first RTO is 0 + 4*0.094 = 0.376 seconds */
-}
-
-int
-rtt_timeout(const struct rtt_info* rtt)
-{
- return rtt->rto;
-}
-
-int
-rtt_unclamped(const struct rtt_info* rtt)
-{
- if(calc_rto(rtt) != rtt->rto) {
- /* timeout fallback has happened */
- return rtt->rto;
- }
- /* return unclamped value */
- return rtt->srtt + 4*rtt->rttvar;
-}
-
-void
-rtt_update(struct rtt_info* rtt, int ms)
-{
- int delta = ms - rtt->srtt;
- rtt->srtt += delta / 8; /* g = 1/8 */
- if(delta < 0)
- delta = -delta; /* |delta| */
- rtt->rttvar += (delta - rtt->rttvar) / 4; /* h = 1/4 */
- rtt->rto = calc_rto(rtt);
-}
-
-void
-rtt_lost(struct rtt_info* rtt, int orig)
-{
- /* exponential backoff */
-
- /* if a query succeeded and put down the rto meanwhile, ignore this */
- if(rtt->rto < orig)
- return;
-
- /* the original rto is doubled, not the current one to make sure
- * that the values in the cache are not increased by lots of
- * queries simultaneously as they time out at the same time */
- orig *= 2;
- if(rtt->rto <= orig) {
- rtt->rto = orig;
- if(rtt->rto > RTT_MAX_TIMEOUT)
- rtt->rto = RTT_MAX_TIMEOUT;
- }
-}
-
-int rtt_notimeout(const struct rtt_info* rtt)
-{
- return calc_rto(rtt);
-}
diff --git a/external/unbound/util/rtt.h b/external/unbound/util/rtt.h
deleted file mode 100644
index 07e65ee1d..000000000
--- a/external/unbound/util/rtt.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * util/rtt.h - UDP round trip time estimator for resend timeouts.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains a data type and functions to help estimate good
- * round trip times for UDP resend timeout values.
- */
-
-#ifndef UTIL_RTT_H
-#define UTIL_RTT_H
-
-/**
- * RTT information. Keeps packet Round Trip Time.
- */
-struct rtt_info {
- /** smoothed rtt estimator, in milliseconds */
- int srtt;
- /** smoothed mean deviation, in milliseconds */
- int rttvar;
- /** current RTO in use, in milliseconds */
- int rto;
-};
-
-/** min retransmit timeout value, in milliseconds */
-extern int RTT_MIN_TIMEOUT;
-/** max retransmit timeout value, in milliseconds */
-#define RTT_MAX_TIMEOUT 120000
-
-/**
- * Initialize RTT estimators.
- * @param rtt: The structure. Caller is responsible for allocation of it.
- */
-void rtt_init(struct rtt_info* rtt);
-
-/**
- * Get timeout to use for sending a UDP packet.
- * @param rtt: round trip statistics structure.
- * @return: timeout to use in milliseconds. Relative time value.
- */
-int rtt_timeout(const struct rtt_info* rtt);
-
-/**
- * Get unclamped timeout to use for server selection.
- * Recent timeouts are reflected in the returned value.
- * @param rtt: round trip statistics structure.
- * @return: value to use in milliseconds.
- */
-int rtt_unclamped(const struct rtt_info* rtt);
-
-/**
- * RTT for valid responses. Without timeouts.
- * @param rtt: round trip statistics structure.
- * @return: value in msec.
- */
-int rtt_notimeout(const struct rtt_info* rtt);
-
-/**
- * Update the statistics with a new roundtrip estimate observation.
- * @param rtt: round trip statistics structure.
- * @param ms: estimate of roundtrip time in milliseconds.
- */
-void rtt_update(struct rtt_info* rtt, int ms);
-
-/**
- * Update the statistics with a new timeout expired observation.
- * @param rtt: round trip statistics structure.
- * @param orig: original rtt time given for the query that timed out.
- * Used to calculate the maximum responsible backed off time that
- * can reasonably be applied.
- */
-void rtt_lost(struct rtt_info* rtt, int orig);
-
-#endif /* UTIL_RTT_H */
diff --git a/external/unbound/util/shm_side/shm_main.c b/external/unbound/util/shm_side/shm_main.c
deleted file mode 100644
index cab9aed56..000000000
--- a/external/unbound/util/shm_side/shm_main.c
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * util/shm_side/shm_main.c - SHM for statistics transport
- *
- * Copyright (c) 2017, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains functions for the SHM implementation.
- */
-
-#include "config.h"
-#include <ctype.h>
-#include <stdarg.h>
-#ifdef HAVE_SYS_IPC_H
-#include <sys/ipc.h>
-#endif
-#ifdef HAVE_SYS_SHM_H
-#include <sys/shm.h>
-#endif
-#include <sys/time.h>
-#include <errno.h>
-#include "shm_main.h"
-#include "daemon/daemon.h"
-#include "daemon/worker.h"
-#include "daemon/stats.h"
-#include "services/mesh.h"
-#include "services/cache/rrset.h"
-#include "services/cache/infra.h"
-#include "validator/validator.h"
-#include "util/config_file.h"
-#include "util/fptr_wlist.h"
-#include "util/log.h"
-
-#ifdef HAVE_SHMGET
-/** subtract timers and the values do not overflow or become negative */
-static void
-timeval_subtract(struct timeval* d, const struct timeval* end,
- const struct timeval* start)
-{
-#ifndef S_SPLINT_S
- time_t end_usec = end->tv_usec;
- d->tv_sec = end->tv_sec - start->tv_sec;
- if(end_usec < start->tv_usec) {
- end_usec += 1000000;
- d->tv_sec--;
- }
- d->tv_usec = end_usec - start->tv_usec;
-#endif
-}
-#endif /* HAVE_SHMGET */
-
-int shm_main_init(struct daemon* daemon)
-{
-#ifdef HAVE_SHMGET
- struct shm_stat_info *shm_stat;
- size_t shm_size;
-
- /* sanitize */
- if(!daemon)
- return 0;
- if(!daemon->cfg->shm_enable)
- return 1;
- if(daemon->cfg->stat_interval == 0)
- log_warn("shm-enable is yes but statistics-interval is 0");
-
- /* Statistics to maintain the number of thread + total */
- shm_size = (sizeof(struct stats_info) * (daemon->num + 1));
-
- /* Allocation of needed memory */
- daemon->shm_info = (struct shm_main_info*)calloc(1, shm_size);
-
- /* Sanitize */
- if(!daemon->shm_info) {
- log_err("shm fail: malloc failure");
- return 0;
- }
-
- daemon->shm_info->key = daemon->cfg->shm_key;
-
- /* Check for previous create SHM */
- daemon->shm_info->id_ctl = shmget(daemon->shm_info->key, sizeof(int), SHM_R);
- daemon->shm_info->id_arr = shmget(daemon->shm_info->key + 1, sizeof(int), SHM_R);
-
- /* Destroy previous SHM */
- if (daemon->shm_info->id_ctl >= 0)
- shmctl(daemon->shm_info->id_ctl, IPC_RMID, NULL);
-
- /* Destroy previous SHM */
- if (daemon->shm_info->id_arr >= 0)
- shmctl(daemon->shm_info->id_arr, IPC_RMID, NULL);
-
- /* SHM: Create the segment */
- daemon->shm_info->id_ctl = shmget(daemon->shm_info->key, sizeof(struct shm_stat_info), IPC_CREAT | 0666);
-
- if (daemon->shm_info->id_ctl < 0)
- {
- log_err("SHM failed(id_ctl) cannot shmget(key %d) %s",
- daemon->shm_info->key, strerror(errno));
-
- /* Just release memory unused */
- free(daemon->shm_info);
-
- return 0;
- }
-
- daemon->shm_info->id_arr = shmget(daemon->shm_info->key + 1, shm_size, IPC_CREAT | 0666);
-
- if (daemon->shm_info->id_arr < 0)
- {
- log_err("SHM failed(id_arr) cannot shmget(key %d + 1) %s",
- daemon->shm_info->key, strerror(errno));
-
- /* Just release memory unused */
- free(daemon->shm_info);
-
- return 0;
- }
-
- /* SHM: attach the segment */
- daemon->shm_info->ptr_ctl = (struct shm_stat_info*)
- shmat(daemon->shm_info->id_ctl, NULL, 0);
- if(daemon->shm_info->ptr_ctl == (void *) -1) {
- log_err("SHM failed(ctl) cannot shmat(%d) %s",
- daemon->shm_info->id_ctl, strerror(errno));
-
- /* Just release memory unused */
- free(daemon->shm_info);
-
- return 0;
- }
-
- daemon->shm_info->ptr_arr = (struct stats_info*)
- shmat(daemon->shm_info->id_arr, NULL, 0);
-
- if (daemon->shm_info->ptr_arr == (void *) -1)
- {
- log_err("SHM failed(arr) cannot shmat(%d) %s",
- daemon->shm_info->id_arr, strerror(errno));
-
- /* Just release memory unused */
- free(daemon->shm_info);
-
- return 0;
- }
-
- /* Zero fill SHM to stand clean while is not filled by other events */
- memset(daemon->shm_info->ptr_ctl, 0, sizeof(struct shm_stat_info));
- memset(daemon->shm_info->ptr_arr, 0, shm_size);
-
- shm_stat = daemon->shm_info->ptr_ctl;
- shm_stat->num_threads = daemon->num;
-
-#else
- (void)daemon;
-#endif /* HAVE_SHMGET */
- return 1;
-}
-
-void shm_main_shutdown(struct daemon* daemon)
-{
-#ifdef HAVE_SHMGET
- /* web are OK, just disabled */
- if(!daemon->cfg->shm_enable)
- return;
-
- verbose(VERB_DETAIL, "SHM shutdown - KEY [%d] - ID CTL [%d] ARR [%d] - PTR CTL [%p] ARR [%p]",
- daemon->shm_info->key, daemon->shm_info->id_ctl, daemon->shm_info->id_arr, daemon->shm_info->ptr_ctl, daemon->shm_info->ptr_arr);
-
- /* Destroy previous SHM */
- if (daemon->shm_info->id_ctl >= 0)
- shmctl(daemon->shm_info->id_ctl, IPC_RMID, NULL);
-
- if (daemon->shm_info->id_arr >= 0)
- shmctl(daemon->shm_info->id_arr, IPC_RMID, NULL);
-
- if (daemon->shm_info->ptr_ctl)
- shmdt(daemon->shm_info->ptr_ctl);
-
- if (daemon->shm_info->ptr_arr)
- shmdt(daemon->shm_info->ptr_arr);
-
-#else
- (void)daemon;
-#endif /* HAVE_SHMGET */
-}
-
-void shm_main_run(struct worker *worker)
-{
-#ifdef HAVE_SHMGET
- struct shm_stat_info *shm_stat;
- struct stats_info *stat_total;
- struct stats_info *stat_info;
- int modstack;
- int offset;
-
- verbose(VERB_DETAIL, "SHM run - worker [%d] - daemon [%p] - timenow(%u) - timeboot(%u)",
- worker->thread_num, worker->daemon, (unsigned)worker->env.now_tv->tv_sec, (unsigned)worker->daemon->time_boot.tv_sec);
-
- offset = worker->thread_num + 1;
- stat_total = worker->daemon->shm_info->ptr_arr;
- stat_info = worker->daemon->shm_info->ptr_arr + offset;
-
- /* Copy data to the current position */
- server_stats_compile(worker, stat_info, 0);
-
- /* First thread, zero fill total, and copy general info */
- if (worker->thread_num == 0) {
-
- /* Copy data to the current position */
- memset(stat_total, 0, sizeof(struct stats_info));
-
- /* Point to data into SHM */
- shm_stat = worker->daemon->shm_info->ptr_ctl;
- shm_stat->time.now = *worker->env.now_tv;
-
- timeval_subtract(&shm_stat->time.up, &shm_stat->time.now, &worker->daemon->time_boot);
- timeval_subtract(&shm_stat->time.elapsed, &shm_stat->time.now, &worker->daemon->time_last_stat);
-
- shm_stat->mem.msg = slabhash_get_mem(worker->env.msg_cache);
- shm_stat->mem.rrset = slabhash_get_mem(&worker->env.rrset_cache->table);
- shm_stat->mem.val = 0;
- shm_stat->mem.iter = 0;
-
- modstack = modstack_find(&worker->env.mesh->mods, "validator");
- if(modstack != -1) {
- fptr_ok(fptr_whitelist_mod_get_mem(worker->env.mesh->mods.mod[modstack]->get_mem));
- shm_stat->mem.val = (*worker->env.mesh->mods.mod[modstack]->get_mem)(&worker->env, modstack);
- }
- modstack = modstack_find(&worker->env.mesh->mods, "iterator");
- if(modstack != -1) {
- fptr_ok(fptr_whitelist_mod_get_mem(worker->env.mesh->mods.mod[modstack]->get_mem));
- shm_stat->mem.iter = (*worker->env.mesh->mods.mod[modstack]->get_mem)(&worker->env, modstack);
- }
- /* subnet mem value is available in shm, also when not enabled,
- * to make the struct easier to memmap by other applications,
- * independent of the configuration of unbound */
- shm_stat->mem.subnet = 0;
-#ifdef CLIENT_SUBNET
- modstack = modstack_find(&worker->env.mesh->mods, "subnet");
- if(modstack != -1) {
- fptr_ok(fptr_whitelist_mod_get_mem(worker->env.mesh->mods.mod[modstack]->get_mem));
- shm_stat->mem.subnet = (*worker->env.mesh->mods.mod[modstack]->get_mem)(&worker->env, modstack);
- }
-#endif
- }
-
- server_stats_add(stat_total, stat_info);
-
- /* print the thread statistics */
- stat_total->mesh_time_median /= (double)worker->daemon->num;
-
-#else
- (void)worker;
-#endif /* HAVE_SHMGET */
-}
diff --git a/external/unbound/util/shm_side/shm_main.h b/external/unbound/util/shm_side/shm_main.h
deleted file mode 100644
index 8e4f4d051..000000000
--- a/external/unbound/util/shm_side/shm_main.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * util/shm_side/shm_main.h - control the shared memory for unbound.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains functions for the SHM side.
- */
-
-#ifndef UTIL_SHM_SIDE_MAIN_H
-#define UTIL_SHM_SIDE_MAIN_H
-struct daemon;
-struct worker;
-
-/** Some global statistics that are not in struct stats_info,
- * this struct is shared on a shm segment */
-struct shm_stat_info {
-
- int num_threads;
-
- struct {
- struct timeval now;
- struct timeval up;
- struct timeval elapsed;
- } time;
-
- struct {
- size_t msg;
- size_t rrset;
- size_t val;
- size_t iter;
- size_t subnet;
- } mem;
-};
-
-/**
- * The SHM info.
- */
-struct shm_main_info {
- /** stats_info array, shared memory segment.
- * [0] is totals, [1..thread_num] are per-thread stats */
- struct stats_info* ptr_arr;
- /** the global stats block, shared memory segment */
- struct shm_stat_info* ptr_ctl;
- int key;
- int id_ctl;
- int id_arr;
-};
-
-int shm_main_init(struct daemon* daemon);
-void shm_main_shutdown(struct daemon* daemon);
-void shm_main_run(struct worker *worker);
-
-#endif /* UTIL_SHM_SIDE_MAIN_H */
diff --git a/external/unbound/util/storage/dnstree.c b/external/unbound/util/storage/dnstree.c
deleted file mode 100644
index 190369d85..000000000
--- a/external/unbound/util/storage/dnstree.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * util/storage/dnstree.c - support for rbtree types suitable for DNS code.
- *
- * Copyright (c) 2008, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains structures combining types and functions to
- * manipulate those structures that help building DNS lookup trees.
- */
-#include "config.h"
-#include "util/storage/dnstree.h"
-#include "util/data/dname.h"
-#include "util/net_help.h"
-
-int name_tree_compare(const void* k1, const void* k2)
-{
- struct name_tree_node* x = (struct name_tree_node*)k1;
- struct name_tree_node* y = (struct name_tree_node*)k2;
- int m;
- if(x->dclass != y->dclass) {
- if(x->dclass < y->dclass)
- return -1;
- return 1;
- }
- return dname_lab_cmp(x->name, x->labs, y->name, y->labs, &m);
-}
-
-int addr_tree_compare(const void* k1, const void* k2)
-{
- struct addr_tree_node* n1 = (struct addr_tree_node*)k1;
- struct addr_tree_node* n2 = (struct addr_tree_node*)k2;
- int r = sockaddr_cmp_addr(&n1->addr, n1->addrlen, &n2->addr,
- n2->addrlen);
- if(r != 0) return r;
- if(n1->net < n2->net)
- return -1;
- if(n1->net > n2->net)
- return 1;
- return 0;
-}
-
-void name_tree_init(rbtree_type* tree)
-{
- rbtree_init(tree, &name_tree_compare);
-}
-
-void addr_tree_init(rbtree_type* tree)
-{
- rbtree_init(tree, &addr_tree_compare);
-}
-
-int name_tree_insert(rbtree_type* tree, struct name_tree_node* node,
- uint8_t* name, size_t len, int labs, uint16_t dclass)
-{
- node->node.key = node;
- node->name = name;
- node->len = len;
- node->labs = labs;
- node->dclass = dclass;
- node->parent = NULL;
- return rbtree_insert(tree, &node->node) != NULL;
-}
-
-int addr_tree_insert(rbtree_type* tree, struct addr_tree_node* node,
- struct sockaddr_storage* addr, socklen_t addrlen, int net)
-{
- node->node.key = node;
- memcpy(&node->addr, addr, addrlen);
- node->addrlen = addrlen;
- node->net = net;
- node->parent = NULL;
- return rbtree_insert(tree, &node->node) != NULL;
-}
-
-void addr_tree_init_parents(rbtree_type* tree)
-{
- struct addr_tree_node* node, *prev = NULL, *p;
- int m;
- RBTREE_FOR(node, struct addr_tree_node*, tree) {
- node->parent = NULL;
- if(!prev || prev->addrlen != node->addrlen) {
- prev = node;
- continue;
- }
- m = addr_in_common(&prev->addr, prev->net, &node->addr,
- node->net, node->addrlen);
- /* sort order like: ::/0, 1::/2, 1::/4, ... 2::/2 */
- /* find the previous, or parent-parent-parent */
- for(p = prev; p; p = p->parent)
- if(p->net <= m) {
- /* ==: since prev matched m, this is closest*/
- /* <: prev matches more, but is not a parent,
- * this one is a (grand)parent */
- node->parent = p;
- break;
- }
- prev = node;
- }
-}
-
-void name_tree_init_parents(rbtree_type* tree)
-{
- struct name_tree_node* node, *prev = NULL, *p;
- int m;
- RBTREE_FOR(node, struct name_tree_node*, tree) {
- node->parent = NULL;
- if(!prev || prev->dclass != node->dclass) {
- prev = node;
- continue;
- }
- (void)dname_lab_cmp(prev->name, prev->labs, node->name,
- node->labs, &m); /* we know prev is smaller */
- /* sort order like: . com. bla.com. zwb.com. net. */
- /* find the previous, or parent-parent-parent */
- for(p = prev; p; p = p->parent)
- if(p->labs <= m) {
- /* ==: since prev matched m, this is closest*/
- /* <: prev matches more, but is not a parent,
- * this one is a (grand)parent */
- node->parent = p;
- break;
- }
- prev = node;
- }
-}
-
-struct name_tree_node* name_tree_find(rbtree_type* tree, uint8_t* name,
- size_t len, int labs, uint16_t dclass)
-{
- struct name_tree_node key;
- key.node.key = &key;
- key.name = name;
- key.len = len;
- key.labs = labs;
- key.dclass = dclass;
- return (struct name_tree_node*)rbtree_search(tree, &key);
-}
-
-struct name_tree_node* name_tree_lookup(rbtree_type* tree, uint8_t* name,
- size_t len, int labs, uint16_t dclass)
-{
- rbnode_type* res = NULL;
- struct name_tree_node *result;
- struct name_tree_node key;
- key.node.key = &key;
- key.name = name;
- key.len = len;
- key.labs = labs;
- key.dclass = dclass;
- if(rbtree_find_less_equal(tree, &key, &res)) {
- /* exact */
- result = (struct name_tree_node*)res;
- } else {
- /* smaller element (or no element) */
- int m;
- result = (struct name_tree_node*)res;
- if(!result || result->dclass != dclass)
- return NULL;
- /* count number of labels matched */
- (void)dname_lab_cmp(result->name, result->labs, key.name,
- key.labs, &m);
- while(result) { /* go up until qname is subdomain of stub */
- if(result->labs <= m)
- break;
- result = result->parent;
- }
- }
- return result;
-}
-
-struct addr_tree_node* addr_tree_lookup(rbtree_type* tree,
- struct sockaddr_storage* addr, socklen_t addrlen)
-{
- rbnode_type* res = NULL;
- struct addr_tree_node* result;
- struct addr_tree_node key;
- key.node.key = &key;
- memcpy(&key.addr, addr, addrlen);
- key.addrlen = addrlen;
- key.net = (addr_is_ip6(addr, addrlen)?128:32);
- if(rbtree_find_less_equal(tree, &key, &res)) {
- /* exact */
- return (struct addr_tree_node*)res;
- } else {
- /* smaller element (or no element) */
- int m;
- result = (struct addr_tree_node*)res;
- if(!result || result->addrlen != addrlen)
- return 0;
- /* count number of bits matched */
- m = addr_in_common(&result->addr, result->net, addr,
- key.net, addrlen);
- while(result) { /* go up until addr is inside netblock */
- if(result->net <= m)
- break;
- result = result->parent;
- }
- }
- return result;
-}
-
-struct addr_tree_node* addr_tree_find(rbtree_type* tree,
- struct sockaddr_storage* addr, socklen_t addrlen, int net)
-{
- rbnode_type* res = NULL;
- struct addr_tree_node key;
- key.node.key = &key;
- memcpy(&key.addr, addr, addrlen);
- key.addrlen = addrlen;
- key.net = net;
- res = rbtree_search(tree, &key);
- return (struct addr_tree_node*)res;
-}
-
-int
-name_tree_next_root(rbtree_type* tree, uint16_t* dclass)
-{
- struct name_tree_node key;
- rbnode_type* n;
- struct name_tree_node* p;
- if(*dclass == 0) {
- /* first root item is first item in tree */
- n = rbtree_first(tree);
- if(n == RBTREE_NULL)
- return 0;
- p = (struct name_tree_node*)n;
- if(dname_is_root(p->name)) {
- *dclass = p->dclass;
- return 1;
- }
- /* root not first item? search for higher items */
- *dclass = p->dclass + 1;
- return name_tree_next_root(tree, dclass);
- }
- /* find class n in tree, we may get a direct hit, or if we don't
- * this is the last item of the previous class so rbtree_next() takes
- * us to the next root (if any) */
- key.node.key = &key;
- key.name = (uint8_t*)"\000";
- key.len = 1;
- key.labs = 0;
- key.dclass = *dclass;
- n = NULL;
- if(rbtree_find_less_equal(tree, &key, &n)) {
- /* exact */
- return 1;
- } else {
- /* smaller element */
- if(!n || n == RBTREE_NULL)
- return 0; /* nothing found */
- n = rbtree_next(n);
- if(n == RBTREE_NULL)
- return 0; /* no higher */
- p = (struct name_tree_node*)n;
- if(dname_is_root(p->name)) {
- *dclass = p->dclass;
- return 1;
- }
- /* not a root node, return next higher item */
- *dclass = p->dclass+1;
- return name_tree_next_root(tree, dclass);
- }
-}
diff --git a/external/unbound/util/storage/dnstree.h b/external/unbound/util/storage/dnstree.h
deleted file mode 100644
index 782644b63..000000000
--- a/external/unbound/util/storage/dnstree.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * util/storage/dnstree.h - support for rbtree types suitable for DNS code.
- *
- * Copyright (c) 2008, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains structures combining types and functions to
- * manipulate those structures that help building DNS lookup trees.
- */
-
-#ifndef UTIL_STORAGE_DNSTREE_H
-#define UTIL_STORAGE_DNSTREE_H
-#include "util/rbtree.h"
-
-/**
- * Tree of domain names. Sorted first by class then by name.
- * This is not sorted canonically, but fast.
- * This can be looked up to obtain a closest encloser parent name.
- *
- * The tree itself is a rbtree_type.
- * This is the element node put as first entry in the client structure.
- */
-struct name_tree_node {
- /** rbtree node, key is this struct : dclass and name */
- rbnode_type node;
- /** parent in tree */
- struct name_tree_node* parent;
- /** name in uncompressed wireformat */
- uint8_t* name;
- /** length of name */
- size_t len;
- /** labels in name */
- int labs;
- /** the class of the name (host order) */
- uint16_t dclass;
-};
-
-/**
- * Tree of IP addresses. Sorted first by protocol, then by bits.
- * This can be looked up to obtain the enclosing subnet.
- *
- * The tree itself is a rbtree_type.
- * This is the element node put as first entry in the client structure.
- */
-struct addr_tree_node {
- /** rbtree node, key is this struct : proto and subnet */
- rbnode_type node;
- /** parent in tree */
- struct addr_tree_node* parent;
- /** address */
- struct sockaddr_storage addr;
- /** length of addr */
- socklen_t addrlen;
- /** netblock size */
- int net;
-};
-
-/**
- * Init a name tree to be empty
- * @param tree: to init.
- */
-void name_tree_init(rbtree_type* tree);
-
-/**
- * insert element into name tree.
- * @param tree: name tree
- * @param node: node element (at start of a structure that caller
- * has allocated).
- * @param name: name to insert (wireformat)
- * this node has been allocated by the caller and it itself inserted.
- * @param len: length of name
- * @param labs: labels in name
- * @param dclass: class of name
- * @return false on error (duplicate element).
- */
-int name_tree_insert(rbtree_type* tree, struct name_tree_node* node,
- uint8_t* name, size_t len, int labs, uint16_t dclass);
-
-/**
- * Initialize parent pointers in name tree.
- * Should be performed after insertions are done, before lookups
- * @param tree: name tree
- */
-void name_tree_init_parents(rbtree_type* tree);
-
-/**
- * Lookup exact match in name tree
- * @param tree: name tree
- * @param name: wireformat name
- * @param len: length of name
- * @param labs: labels in name
- * @param dclass: class of name
- * @return node or NULL if not found.
- */
-struct name_tree_node* name_tree_find(rbtree_type* tree, uint8_t* name,
- size_t len, int labs, uint16_t dclass);
-
-/**
- * Lookup closest encloser in name tree.
- * @param tree: name tree
- * @param name: wireformat name
- * @param len: length of name
- * @param labs: labels in name
- * @param dclass: class of name
- * @return closest enclosing node (could be equal) or NULL if not found.
- */
-struct name_tree_node* name_tree_lookup(rbtree_type* tree, uint8_t* name,
- size_t len, int labs, uint16_t dclass);
-
-/**
- * Find next root item in name tree.
- * @param tree: the nametree.
- * @param dclass: the class to look for next (or higher).
- * @return false if no classes found, true means class put into c.
- */
-int name_tree_next_root(rbtree_type* tree, uint16_t* dclass);
-
-/**
- * Init addr tree to be empty.
- * @param tree: to init.
- */
-void addr_tree_init(rbtree_type* tree);
-
-/**
- * insert element into addr tree.
- * @param tree: addr tree
- * @param node: node element (at start of a structure that caller
- * has allocated).
- * @param addr: to insert (copied).
- * @param addrlen: length of addr
- * @param net: size of subnet.
- * @return false on error (duplicate element).
- */
-int addr_tree_insert(rbtree_type* tree, struct addr_tree_node* node,
- struct sockaddr_storage* addr, socklen_t addrlen, int net);
-
-/**
- * Initialize parent pointers in addr tree.
- * Should be performed after insertions are done, before lookups
- * @param tree: addr tree
- */
-void addr_tree_init_parents(rbtree_type* tree);
-
-/**
- * Lookup closest encloser in addr tree.
- * @param tree: addr tree
- * @param addr: to lookup.
- * @param addrlen: length of addr
- * @return closest enclosing node (could be equal) or NULL if not found.
- */
-struct addr_tree_node* addr_tree_lookup(rbtree_type* tree,
- struct sockaddr_storage* addr, socklen_t addrlen);
-
-/**
- * Find element in addr tree. (search a netblock, not a match for an address)
- * @param tree: addr tree
- * @param addr: netblock to lookup.
- * @param addrlen: length of addr
- * @param net: size of subnet
- * @return addr tree element, or NULL if not found.
- */
-struct addr_tree_node* addr_tree_find(rbtree_type* tree,
- struct sockaddr_storage* addr, socklen_t addrlen, int net);
-
-/** compare name tree nodes */
-int name_tree_compare(const void* k1, const void* k2);
-
-/** compare addr tree nodes */
-int addr_tree_compare(const void* k1, const void* k2);
-
-#endif /* UTIL_STORAGE_DNSTREE_H */
diff --git a/external/unbound/util/storage/lookup3.c b/external/unbound/util/storage/lookup3.c
deleted file mode 100644
index e9b05af37..000000000
--- a/external/unbound/util/storage/lookup3.c
+++ /dev/null
@@ -1,1032 +0,0 @@
-/*
- February 2013(Wouter) patch defines for BSD endianness, from Brad Smith.
- January 2012(Wouter) added randomised initial value, fallout from 28c3.
- March 2007(Wouter) adapted from lookup3.c original, add config.h include.
- added #ifdef VALGRIND to remove 298,384,660 'unused variable k8' warnings.
- added include of lookup3.h to check definitions match declarations.
- removed include of stdint - config.h takes care of platform independence.
- url http://burtleburtle.net/bob/hash/index.html.
-*/
-/*
--------------------------------------------------------------------------------
-lookup3.c, by Bob Jenkins, May 2006, Public Domain.
-
-These are functions for producing 32-bit hashes for hash table lookup.
-hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
-are externally useful functions. Routines to test the hash are included
-if SELF_TEST is defined. You can use this free for any purpose. It's in
-the public domain. It has no warranty.
-
-You probably want to use hashlittle(). hashlittle() and hashbig()
-hash byte arrays. hashlittle() is is faster than hashbig() on
-little-endian machines. Intel and AMD are little-endian machines.
-On second thought, you probably want hashlittle2(), which is identical to
-hashlittle() except it returns two 32-bit hashes for the price of one.
-You could implement hashbig2() if you wanted but I haven't bothered here.
-
-If you want to find a hash of, say, exactly 7 integers, do
- a = i1; b = i2; c = i3;
- mix(a,b,c);
- a += i4; b += i5; c += i6;
- mix(a,b,c);
- a += i7;
- final(a,b,c);
-then use c as the hash value. If you have a variable length array of
-4-byte integers to hash, use hashword(). If you have a byte array (like
-a character string), use hashlittle(). If you have several byte arrays, or
-a mix of things, see the comments above hashlittle().
-
-Why is this so big? I read 12 bytes at a time into 3 4-byte integers,
-then mix those integers. This is fast (you can do a lot more thorough
-mixing with 12*3 instructions on 3 integers than you can with 3 instructions
-on 1 byte), but shoehorning those bytes into integers efficiently is messy.
--------------------------------------------------------------------------------
-*/
-/*#define SELF_TEST 1*/
-
-#include "config.h"
-#include "util/storage/lookup3.h"
-#include <stdio.h> /* defines printf for tests */
-#include <time.h> /* defines time_t for timings in the test */
-/*#include <stdint.h> defines uint32_t etc (from config.h) */
-#include <sys/param.h> /* attempt to define endianness */
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h> /* attempt to define endianness (solaris) */
-#endif
-#if defined(linux) || defined(__OpenBSD__)
-# ifdef HAVE_ENDIAN_H
-# include <endian.h> /* attempt to define endianness */
-# else
-# include <machine/endian.h> /* on older OpenBSD */
-# endif
-#endif
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
-#include <sys/endian.h> /* attempt to define endianness */
-#endif
-
-/* random initial value */
-static uint32_t raninit = (uint32_t)0xdeadbeef;
-
-void
-hash_set_raninit(uint32_t v)
-{
- raninit = v;
-}
-
-/*
- * My best guess at if you are big-endian or little-endian. This may
- * need adjustment.
- */
-#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
- __BYTE_ORDER == __LITTLE_ENDIAN) || \
- (defined(i386) || defined(__i386__) || defined(__i486__) || \
- defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL) || defined(__x86))
-# define HASH_LITTLE_ENDIAN 1
-# define HASH_BIG_ENDIAN 0
-#elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \
- __BYTE_ORDER == __BIG_ENDIAN) || \
- (defined(sparc) || defined(__sparc) || defined(__sparc__) || defined(POWERPC) || defined(mc68000) || defined(sel))
-# define HASH_LITTLE_ENDIAN 0
-# define HASH_BIG_ENDIAN 1
-#elif defined(_MACHINE_ENDIAN_H_)
-/* test for machine_endian_h protects failure if some are empty strings */
-# if defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && _BYTE_ORDER == _BIG_ENDIAN
-# define HASH_LITTLE_ENDIAN 0
-# define HASH_BIG_ENDIAN 1
-# endif
-# if defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && _BYTE_ORDER == _LITTLE_ENDIAN
-# define HASH_LITTLE_ENDIAN 1
-# define HASH_BIG_ENDIAN 0
-# endif /* _MACHINE_ENDIAN_H_ */
-#else
-# define HASH_LITTLE_ENDIAN 0
-# define HASH_BIG_ENDIAN 0
-#endif
-
-#define hashsize(n) ((uint32_t)1<<(n))
-#define hashmask(n) (hashsize(n)-1)
-#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
-
-/*
--------------------------------------------------------------------------------
-mix -- mix 3 32-bit values reversibly.
-
-This is reversible, so any information in (a,b,c) before mix() is
-still in (a,b,c) after mix().
-
-If four pairs of (a,b,c) inputs are run through mix(), or through
-mix() in reverse, there are at least 32 bits of the output that
-are sometimes the same for one pair and different for another pair.
-This was tested for:
-* pairs that differed by one bit, by two bits, in any combination
- of top bits of (a,b,c), or in any combination of bottom bits of
- (a,b,c).
-* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed
- the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
- is commonly produced by subtraction) look like a single 1-bit
- difference.
-* the base values were pseudorandom, all zero but one bit set, or
- all zero plus a counter that starts at zero.
-
-Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that
-satisfy this are
- 4 6 8 16 19 4
- 9 15 3 18 27 15
- 14 9 3 7 17 3
-Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing
-for "differ" defined as + with a one-bit base and a two-bit delta. I
-used http://burtleburtle.net/bob/hash/avalanche.html to choose
-the operations, constants, and arrangements of the variables.
-
-This does not achieve avalanche. There are input bits of (a,b,c)
-that fail to affect some output bits of (a,b,c), especially of a. The
-most thoroughly mixed value is c, but it doesn't really even achieve
-avalanche in c.
-
-This allows some parallelism. Read-after-writes are good at doubling
-the number of bits affected, so the goal of mixing pulls in the opposite
-direction as the goal of parallelism. I did what I could. Rotates
-seem to cost as much as shifts on every machine I could lay my hands
-on, and rotates are much kinder to the top and bottom bits, so I used
-rotates.
--------------------------------------------------------------------------------
-*/
-#define mix(a,b,c) \
-{ \
- a -= c; a ^= rot(c, 4); c += b; \
- b -= a; b ^= rot(a, 6); a += c; \
- c -= b; c ^= rot(b, 8); b += a; \
- a -= c; a ^= rot(c,16); c += b; \
- b -= a; b ^= rot(a,19); a += c; \
- c -= b; c ^= rot(b, 4); b += a; \
-}
-
-/*
--------------------------------------------------------------------------------
-final -- final mixing of 3 32-bit values (a,b,c) into c
-
-Pairs of (a,b,c) values differing in only a few bits will usually
-produce values of c that look totally different. This was tested for
-* pairs that differed by one bit, by two bits, in any combination
- of top bits of (a,b,c), or in any combination of bottom bits of
- (a,b,c).
-* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed
- the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
- is commonly produced by subtraction) look like a single 1-bit
- difference.
-* the base values were pseudorandom, all zero but one bit set, or
- all zero plus a counter that starts at zero.
-
-These constants passed:
- 14 11 25 16 4 14 24
- 12 14 25 16 4 14 24
-and these came close:
- 4 8 15 26 3 22 24
- 10 8 15 26 3 22 24
- 11 8 15 26 3 22 24
--------------------------------------------------------------------------------
-*/
-#define final(a,b,c) \
-{ \
- c ^= b; c -= rot(b,14); \
- a ^= c; a -= rot(c,11); \
- b ^= a; b -= rot(a,25); \
- c ^= b; c -= rot(b,16); \
- a ^= c; a -= rot(c,4); \
- b ^= a; b -= rot(a,14); \
- c ^= b; c -= rot(b,24); \
-}
-
-/*
---------------------------------------------------------------------
- This works on all machines. To be useful, it requires
- -- that the key be an array of uint32_t's, and
- -- that the length be the number of uint32_t's in the key
-
- The function hashword() is identical to hashlittle() on little-endian
- machines, and identical to hashbig() on big-endian machines,
- except that the length has to be measured in uint32_ts rather than in
- bytes. hashlittle() is more complicated than hashword() only because
- hashlittle() has to dance around fitting the key bytes into registers.
---------------------------------------------------------------------
-*/
-uint32_t hashword(
-const uint32_t *k, /* the key, an array of uint32_t values */
-size_t length, /* the length of the key, in uint32_ts */
-uint32_t initval) /* the previous hash, or an arbitrary value */
-{
- uint32_t a,b,c;
-
- /* Set up the internal state */
- a = b = c = raninit + (((uint32_t)length)<<2) + initval;
-
- /*------------------------------------------------- handle most of the key */
- while (length > 3)
- {
- a += k[0];
- b += k[1];
- c += k[2];
- mix(a,b,c);
- length -= 3;
- k += 3;
- }
-
- /*------------------------------------------- handle the last 3 uint32_t's */
- switch(length) /* all the case statements fall through */
- {
- case 3 : c+=k[2];
- case 2 : b+=k[1];
- case 1 : a+=k[0];
- final(a,b,c);
- case 0: /* case 0: nothing left to add */
- break;
- }
- /*------------------------------------------------------ report the result */
- return c;
-}
-
-
-#ifdef SELF_TEST
-
-/*
---------------------------------------------------------------------
-hashword2() -- same as hashword(), but take two seeds and return two
-32-bit values. pc and pb must both be nonnull, and *pc and *pb must
-both be initialized with seeds. If you pass in (*pb)==0, the output
-(*pc) will be the same as the return value from hashword().
---------------------------------------------------------------------
-*/
-void hashword2 (
-const uint32_t *k, /* the key, an array of uint32_t values */
-size_t length, /* the length of the key, in uint32_ts */
-uint32_t *pc, /* IN: seed OUT: primary hash value */
-uint32_t *pb) /* IN: more seed OUT: secondary hash value */
-{
- uint32_t a,b,c;
-
- /* Set up the internal state */
- a = b = c = raninit + ((uint32_t)(length<<2)) + *pc;
- c += *pb;
-
- /*------------------------------------------------- handle most of the key */
- while (length > 3)
- {
- a += k[0];
- b += k[1];
- c += k[2];
- mix(a,b,c);
- length -= 3;
- k += 3;
- }
-
- /*------------------------------------------- handle the last 3 uint32_t's */
- switch(length) /* all the case statements fall through */
- {
- case 3 : c+=k[2];
- case 2 : b+=k[1];
- case 1 : a+=k[0];
- final(a,b,c);
- case 0: /* case 0: nothing left to add */
- break;
- }
- /*------------------------------------------------------ report the result */
- *pc=c; *pb=b;
-}
-
-#endif /* SELF_TEST */
-
-/*
--------------------------------------------------------------------------------
-hashlittle() -- hash a variable-length key into a 32-bit value
- k : the key (the unaligned variable-length array of bytes)
- length : the length of the key, counting by bytes
- initval : can be any 4-byte value
-Returns a 32-bit value. Every bit of the key affects every bit of
-the return value. Two keys differing by one or two bits will have
-totally different hash values.
-
-The best hash table sizes are powers of 2. There is no need to do
-mod a prime (mod is sooo slow!). If you need less than 32 bits,
-use a bitmask. For example, if you need only 10 bits, do
- h = (h & hashmask(10));
-In which case, the hash table should have hashsize(10) elements.
-
-If you are hashing n strings (uint8_t **)k, do it like this:
- for (i=0, h=0; i<n; ++i) h = hashlittle( k[i], len[i], h);
-
-By Bob Jenkins, 2006. bob_jenkins@burtleburtle.net. You may use this
-code any way you wish, private, educational, or commercial. It's free.
-
-Use for hash table lookup, or anything where one collision in 2^^32 is
-acceptable. Do NOT use for cryptographic purposes.
--------------------------------------------------------------------------------
-*/
-
-uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
-{
- uint32_t a,b,c; /* internal state */
- union { const void *ptr; size_t i; } u; /* needed for Mac Powerbook G4 */
-
- /* Set up the internal state */
- a = b = c = raninit + ((uint32_t)length) + initval;
-
- u.ptr = key;
- if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
- const uint32_t *k = (const uint32_t *)key; /* read 32-bit chunks */
-#ifdef VALGRIND
- const uint8_t *k8;
-#endif
-
- /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
- while (length > 12)
- {
- a += k[0];
- b += k[1];
- c += k[2];
- mix(a,b,c);
- length -= 12;
- k += 3;
- }
-
- /*----------------------------- handle the last (probably partial) block */
- /*
- * "k[2]&0xffffff" actually reads beyond the end of the string, but
- * then masks off the part it's not allowed to read. Because the
- * string is aligned, the masked-off tail is in the same word as the
- * rest of the string. Every machine with memory protection I've seen
- * does it on word boundaries, so is OK with this. But VALGRIND will
- * still catch it and complain. The masking trick does make the hash
- * noticeably faster for short strings (like English words).
- */
-#ifndef VALGRIND
-
- switch(length)
- {
- case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
- case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break;
- case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break;
- case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break;
- case 8 : b+=k[1]; a+=k[0]; break;
- case 7 : b+=k[1]&0xffffff; a+=k[0]; break;
- case 6 : b+=k[1]&0xffff; a+=k[0]; break;
- case 5 : b+=k[1]&0xff; a+=k[0]; break;
- case 4 : a+=k[0]; break;
- case 3 : a+=k[0]&0xffffff; break;
- case 2 : a+=k[0]&0xffff; break;
- case 1 : a+=k[0]&0xff; break;
- case 0 : return c; /* zero length strings require no mixing */
- }
-
-#else /* make valgrind happy */
-
- k8 = (const uint8_t *)k;
- switch(length)
- {
- case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
- case 11: c+=((uint32_t)k8[10])<<16; /* fall through */
- case 10: c+=((uint32_t)k8[9])<<8; /* fall through */
- case 9 : c+=k8[8]; /* fall through */
- case 8 : b+=k[1]; a+=k[0]; break;
- case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */
- case 6 : b+=((uint32_t)k8[5])<<8; /* fall through */
- case 5 : b+=k8[4]; /* fall through */
- case 4 : a+=k[0]; break;
- case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */
- case 2 : a+=((uint32_t)k8[1])<<8; /* fall through */
- case 1 : a+=k8[0]; break;
- case 0 : return c;
- }
-
-#endif /* !valgrind */
-
- } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
- const uint16_t *k = (const uint16_t *)key; /* read 16-bit chunks */
- const uint8_t *k8;
-
- /*--------------- all but last block: aligned reads and different mixing */
- while (length > 12)
- {
- a += k[0] + (((uint32_t)k[1])<<16);
- b += k[2] + (((uint32_t)k[3])<<16);
- c += k[4] + (((uint32_t)k[5])<<16);
- mix(a,b,c);
- length -= 12;
- k += 6;
- }
-
- /*----------------------------- handle the last (probably partial) block */
- k8 = (const uint8_t *)k;
- switch(length)
- {
- case 12: c+=k[4]+(((uint32_t)k[5])<<16);
- b+=k[2]+(((uint32_t)k[3])<<16);
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 11: c+=((uint32_t)k8[10])<<16; /* fall through */
- case 10: c+=k[4];
- b+=k[2]+(((uint32_t)k[3])<<16);
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 9 : c+=k8[8]; /* fall through */
- case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */
- case 6 : b+=k[2];
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 5 : b+=k8[4]; /* fall through */
- case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */
- case 2 : a+=k[0];
- break;
- case 1 : a+=k8[0];
- break;
- case 0 : return c; /* zero length requires no mixing */
- }
-
- } else { /* need to read the key one byte at a time */
- const uint8_t *k = (const uint8_t *)key;
-
- /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
- while (length > 12)
- {
- a += k[0];
- a += ((uint32_t)k[1])<<8;
- a += ((uint32_t)k[2])<<16;
- a += ((uint32_t)k[3])<<24;
- b += k[4];
- b += ((uint32_t)k[5])<<8;
- b += ((uint32_t)k[6])<<16;
- b += ((uint32_t)k[7])<<24;
- c += k[8];
- c += ((uint32_t)k[9])<<8;
- c += ((uint32_t)k[10])<<16;
- c += ((uint32_t)k[11])<<24;
- mix(a,b,c);
- length -= 12;
- k += 12;
- }
-
- /*-------------------------------- last block: affect all 32 bits of (c) */
- switch(length) /* all the case statements fall through */
- {
- case 12: c+=((uint32_t)k[11])<<24;
- case 11: c+=((uint32_t)k[10])<<16;
- case 10: c+=((uint32_t)k[9])<<8;
- case 9 : c+=k[8];
- case 8 : b+=((uint32_t)k[7])<<24;
- case 7 : b+=((uint32_t)k[6])<<16;
- case 6 : b+=((uint32_t)k[5])<<8;
- case 5 : b+=k[4];
- case 4 : a+=((uint32_t)k[3])<<24;
- case 3 : a+=((uint32_t)k[2])<<16;
- case 2 : a+=((uint32_t)k[1])<<8;
- case 1 : a+=k[0];
- break;
- case 0 : return c;
- }
- }
-
- final(a,b,c);
- return c;
-}
-
-#ifdef SELF_TEST
-
-/*
- * hashlittle2: return 2 32-bit hash values
- *
- * This is identical to hashlittle(), except it returns two 32-bit hash
- * values instead of just one. This is good enough for hash table
- * lookup with 2^^64 buckets, or if you want a second hash if you're not
- * happy with the first, or if you want a probably-unique 64-bit ID for
- * the key. *pc is better mixed than *pb, so use *pc first. If you want
- * a 64-bit value do something like "*pc + (((uint64_t)*pb)<<32)".
- */
-void hashlittle2(
- const void *key, /* the key to hash */
- size_t length, /* length of the key */
- uint32_t *pc, /* IN: primary initval, OUT: primary hash */
- uint32_t *pb) /* IN: secondary initval, OUT: secondary hash */
-{
- uint32_t a,b,c; /* internal state */
- union { const void *ptr; size_t i; } u; /* needed for Mac Powerbook G4 */
-
- /* Set up the internal state */
- a = b = c = raninit + ((uint32_t)length) + *pc;
- c += *pb;
-
- u.ptr = key;
- if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
- const uint32_t *k = (const uint32_t *)key; /* read 32-bit chunks */
-#ifdef VALGRIND
- const uint8_t *k8;
-#endif
-
- /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
- while (length > 12)
- {
- a += k[0];
- b += k[1];
- c += k[2];
- mix(a,b,c);
- length -= 12;
- k += 3;
- }
-
- /*----------------------------- handle the last (probably partial) block */
- /*
- * "k[2]&0xffffff" actually reads beyond the end of the string, but
- * then masks off the part it's not allowed to read. Because the
- * string is aligned, the masked-off tail is in the same word as the
- * rest of the string. Every machine with memory protection I've seen
- * does it on word boundaries, so is OK with this. But VALGRIND will
- * still catch it and complain. The masking trick does make the hash
- * noticeably faster for short strings (like English words).
- */
-#ifndef VALGRIND
-
- switch(length)
- {
- case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
- case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break;
- case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break;
- case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break;
- case 8 : b+=k[1]; a+=k[0]; break;
- case 7 : b+=k[1]&0xffffff; a+=k[0]; break;
- case 6 : b+=k[1]&0xffff; a+=k[0]; break;
- case 5 : b+=k[1]&0xff; a+=k[0]; break;
- case 4 : a+=k[0]; break;
- case 3 : a+=k[0]&0xffffff; break;
- case 2 : a+=k[0]&0xffff; break;
- case 1 : a+=k[0]&0xff; break;
- case 0 : *pc=c; *pb=b; return; /* zero length strings require no mixing */
- }
-
-#else /* make valgrind happy */
-
- k8 = (const uint8_t *)k;
- switch(length)
- {
- case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
- case 11: c+=((uint32_t)k8[10])<<16; /* fall through */
- case 10: c+=((uint32_t)k8[9])<<8; /* fall through */
- case 9 : c+=k8[8]; /* fall through */
- case 8 : b+=k[1]; a+=k[0]; break;
- case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */
- case 6 : b+=((uint32_t)k8[5])<<8; /* fall through */
- case 5 : b+=k8[4]; /* fall through */
- case 4 : a+=k[0]; break;
- case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */
- case 2 : a+=((uint32_t)k8[1])<<8; /* fall through */
- case 1 : a+=k8[0]; break;
- case 0 : *pc=c; *pb=b; return; /* zero length strings require no mixing */
- }
-
-#endif /* !valgrind */
-
- } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
- const uint16_t *k = (const uint16_t *)key; /* read 16-bit chunks */
- const uint8_t *k8;
-
- /*--------------- all but last block: aligned reads and different mixing */
- while (length > 12)
- {
- a += k[0] + (((uint32_t)k[1])<<16);
- b += k[2] + (((uint32_t)k[3])<<16);
- c += k[4] + (((uint32_t)k[5])<<16);
- mix(a,b,c);
- length -= 12;
- k += 6;
- }
-
- /*----------------------------- handle the last (probably partial) block */
- k8 = (const uint8_t *)k;
- switch(length)
- {
- case 12: c+=k[4]+(((uint32_t)k[5])<<16);
- b+=k[2]+(((uint32_t)k[3])<<16);
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 11: c+=((uint32_t)k8[10])<<16; /* fall through */
- case 10: c+=k[4];
- b+=k[2]+(((uint32_t)k[3])<<16);
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 9 : c+=k8[8]; /* fall through */
- case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */
- case 6 : b+=k[2];
- a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 5 : b+=k8[4]; /* fall through */
- case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
- break;
- case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */
- case 2 : a+=k[0];
- break;
- case 1 : a+=k8[0];
- break;
- case 0 : *pc=c; *pb=b; return; /* zero length strings require no mixing */
- }
-
- } else { /* need to read the key one byte at a time */
- const uint8_t *k = (const uint8_t *)key;
-
- /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
- while (length > 12)
- {
- a += k[0];
- a += ((uint32_t)k[1])<<8;
- a += ((uint32_t)k[2])<<16;
- a += ((uint32_t)k[3])<<24;
- b += k[4];
- b += ((uint32_t)k[5])<<8;
- b += ((uint32_t)k[6])<<16;
- b += ((uint32_t)k[7])<<24;
- c += k[8];
- c += ((uint32_t)k[9])<<8;
- c += ((uint32_t)k[10])<<16;
- c += ((uint32_t)k[11])<<24;
- mix(a,b,c);
- length -= 12;
- k += 12;
- }
-
- /*-------------------------------- last block: affect all 32 bits of (c) */
- switch(length) /* all the case statements fall through */
- {
- case 12: c+=((uint32_t)k[11])<<24;
- case 11: c+=((uint32_t)k[10])<<16;
- case 10: c+=((uint32_t)k[9])<<8;
- case 9 : c+=k[8];
- case 8 : b+=((uint32_t)k[7])<<24;
- case 7 : b+=((uint32_t)k[6])<<16;
- case 6 : b+=((uint32_t)k[5])<<8;
- case 5 : b+=k[4];
- case 4 : a+=((uint32_t)k[3])<<24;
- case 3 : a+=((uint32_t)k[2])<<16;
- case 2 : a+=((uint32_t)k[1])<<8;
- case 1 : a+=k[0];
- break;
- case 0 : *pc=c; *pb=b; return; /* zero length strings require no mixing */
- }
- }
-
- final(a,b,c);
- *pc=c; *pb=b;
-}
-
-#endif /* SELF_TEST */
-
-#if 0 /* currently not used */
-
-/*
- * hashbig():
- * This is the same as hashword() on big-endian machines. It is different
- * from hashlittle() on all machines. hashbig() takes advantage of
- * big-endian byte ordering.
- */
-uint32_t hashbig( const void *key, size_t length, uint32_t initval)
-{
- uint32_t a,b,c;
- union { const void *ptr; size_t i; } u; /* to cast key to (size_t) happily */
-
- /* Set up the internal state */
- a = b = c = raninit + ((uint32_t)length) + initval;
-
- u.ptr = key;
- if (HASH_BIG_ENDIAN && ((u.i & 0x3) == 0)) {
- const uint32_t *k = (const uint32_t *)key; /* read 32-bit chunks */
-#ifdef VALGRIND
- const uint8_t *k8;
-#endif
-
- /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
- while (length > 12)
- {
- a += k[0];
- b += k[1];
- c += k[2];
- mix(a,b,c);
- length -= 12;
- k += 3;
- }
-
- /*----------------------------- handle the last (probably partial) block */
- /*
- * "k[2]<<8" actually reads beyond the end of the string, but
- * then shifts out the part it's not allowed to read. Because the
- * string is aligned, the illegal read is in the same word as the
- * rest of the string. Every machine with memory protection I've seen
- * does it on word boundaries, so is OK with this. But VALGRIND will
- * still catch it and complain. The masking trick does make the hash
- * noticeably faster for short strings (like English words).
- */
-#ifndef VALGRIND
-
- switch(length)
- {
- case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
- case 11: c+=k[2]&0xffffff00; b+=k[1]; a+=k[0]; break;
- case 10: c+=k[2]&0xffff0000; b+=k[1]; a+=k[0]; break;
- case 9 : c+=k[2]&0xff000000; b+=k[1]; a+=k[0]; break;
- case 8 : b+=k[1]; a+=k[0]; break;
- case 7 : b+=k[1]&0xffffff00; a+=k[0]; break;
- case 6 : b+=k[1]&0xffff0000; a+=k[0]; break;
- case 5 : b+=k[1]&0xff000000; a+=k[0]; break;
- case 4 : a+=k[0]; break;
- case 3 : a+=k[0]&0xffffff00; break;
- case 2 : a+=k[0]&0xffff0000; break;
- case 1 : a+=k[0]&0xff000000; break;
- case 0 : return c; /* zero length strings require no mixing */
- }
-
-#else /* make valgrind happy */
-
- k8 = (const uint8_t *)k;
- switch(length) /* all the case statements fall through */
- {
- case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
- case 11: c+=((uint32_t)k8[10])<<8; /* fall through */
- case 10: c+=((uint32_t)k8[9])<<16; /* fall through */
- case 9 : c+=((uint32_t)k8[8])<<24; /* fall through */
- case 8 : b+=k[1]; a+=k[0]; break;
- case 7 : b+=((uint32_t)k8[6])<<8; /* fall through */
- case 6 : b+=((uint32_t)k8[5])<<16; /* fall through */
- case 5 : b+=((uint32_t)k8[4])<<24; /* fall through */
- case 4 : a+=k[0]; break;
- case 3 : a+=((uint32_t)k8[2])<<8; /* fall through */
- case 2 : a+=((uint32_t)k8[1])<<16; /* fall through */
- case 1 : a+=((uint32_t)k8[0])<<24; break;
- case 0 : return c;
- }
-
-#endif /* !VALGRIND */
-
- } else { /* need to read the key one byte at a time */
- const uint8_t *k = (const uint8_t *)key;
-
- /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
- while (length > 12)
- {
- a += ((uint32_t)k[0])<<24;
- a += ((uint32_t)k[1])<<16;
- a += ((uint32_t)k[2])<<8;
- a += ((uint32_t)k[3]);
- b += ((uint32_t)k[4])<<24;
- b += ((uint32_t)k[5])<<16;
- b += ((uint32_t)k[6])<<8;
- b += ((uint32_t)k[7]);
- c += ((uint32_t)k[8])<<24;
- c += ((uint32_t)k[9])<<16;
- c += ((uint32_t)k[10])<<8;
- c += ((uint32_t)k[11]);
- mix(a,b,c);
- length -= 12;
- k += 12;
- }
-
- /*-------------------------------- last block: affect all 32 bits of (c) */
- switch(length) /* all the case statements fall through */
- {
- case 12: c+=k[11];
- case 11: c+=((uint32_t)k[10])<<8;
- case 10: c+=((uint32_t)k[9])<<16;
- case 9 : c+=((uint32_t)k[8])<<24;
- case 8 : b+=k[7];
- case 7 : b+=((uint32_t)k[6])<<8;
- case 6 : b+=((uint32_t)k[5])<<16;
- case 5 : b+=((uint32_t)k[4])<<24;
- case 4 : a+=k[3];
- case 3 : a+=((uint32_t)k[2])<<8;
- case 2 : a+=((uint32_t)k[1])<<16;
- case 1 : a+=((uint32_t)k[0])<<24;
- break;
- case 0 : return c;
- }
- }
-
- final(a,b,c);
- return c;
-}
-
-#endif /* 0 == currently not used */
-
-#ifdef SELF_TEST
-
-/* used for timings */
-void driver1(void)
-{
- uint8_t buf[256];
- uint32_t i;
- uint32_t h=0;
- time_t a,z;
-
- time(&a);
- for (i=0; i<256; ++i) buf[i] = 'x';
- for (i=0; i<1; ++i)
- {
- h = hashlittle(&buf[0],1,h);
- }
- time(&z);
- if (z-a > 0) printf("time %d %.8x\n", z-a, h);
-}
-
-/* check that every input bit changes every output bit half the time */
-#define HASHSTATE 1
-#define HASHLEN 1
-#define MAXPAIR 60
-#define MAXLEN 70
-void driver2(void)
-{
- uint8_t qa[MAXLEN+1], qb[MAXLEN+2], *a = &qa[0], *b = &qb[1];
- uint32_t c[HASHSTATE], d[HASHSTATE], i=0, j=0, k, l, m=0, z;
- uint32_t e[HASHSTATE],f[HASHSTATE],g[HASHSTATE],h[HASHSTATE];
- uint32_t x[HASHSTATE],y[HASHSTATE];
- uint32_t hlen;
-
- printf("No more than %d trials should ever be needed \n",MAXPAIR/2);
- for (hlen=0; hlen < MAXLEN; ++hlen)
- {
- z=0;
- for (i=0; i<hlen; ++i) /*----------------------- for each input byte, */
- {
- for (j=0; j<8; ++j) /*------------------------ for each input bit, */
- {
- for (m=1; m<8; ++m) /*------------ for several possible initvals, */
- {
- for (l=0; l<HASHSTATE; ++l)
- e[l]=f[l]=g[l]=h[l]=x[l]=y[l]=~((uint32_t)0);
-
- /*---- check that every output bit is affected by that input bit */
- for (k=0; k<MAXPAIR; k+=2)
- {
- uint32_t finished=1;
- /* keys have one bit different */
- for (l=0; l<hlen+1; ++l) {a[l] = b[l] = (uint8_t)0;}
- /* have a and b be two keys differing in only one bit */
- a[i] ^= (k<<j);
- a[i] ^= (k>>(8-j));
- c[0] = hashlittle(a, hlen, m);
- b[i] ^= ((k+1)<<j);
- b[i] ^= ((k+1)>>(8-j));
- d[0] = hashlittle(b, hlen, m);
- /* check every bit is 1, 0, set, and not set at least once */
- for (l=0; l<HASHSTATE; ++l)
- {
- e[l] &= (c[l]^d[l]);
- f[l] &= ~(c[l]^d[l]);
- g[l] &= c[l];
- h[l] &= ~c[l];
- x[l] &= d[l];
- y[l] &= ~d[l];
- if (e[l]|f[l]|g[l]|h[l]|x[l]|y[l]) finished=0;
- }
- if (finished) break;
- }
- if (k>z) z=k;
- if (k==MAXPAIR)
- {
- printf("Some bit didn't change: ");
- printf("%.8x %.8x %.8x %.8x %.8x %.8x ",
- e[0],f[0],g[0],h[0],x[0],y[0]);
- printf("i %d j %d m %d len %d\n", i, j, m, hlen);
- }
- if (z==MAXPAIR) goto done;
- }
- }
- }
- done:
- if (z < MAXPAIR)
- {
- printf("Mix success %2d bytes %2d initvals ",i,m);
- printf("required %d trials\n", z/2);
- }
- }
- printf("\n");
-}
-
-/* Check for reading beyond the end of the buffer and alignment problems */
-void driver3(void)
-{
- uint8_t buf[MAXLEN+20], *b;
- uint32_t len;
- uint8_t q[] = "This is the time for all good men to come to the aid of their country...";
- uint32_t h;
- uint8_t qq[] = "xThis is the time for all good men to come to the aid of their country...";
- uint32_t i;
- uint8_t qqq[] = "xxThis is the time for all good men to come to the aid of their country...";
- uint32_t j;
- uint8_t qqqq[] = "xxxThis is the time for all good men to come to the aid of their country...";
- uint32_t ref,x,y;
- uint8_t *p;
-
- printf("Endianness. These lines should all be the same (for values filled in):\n");
- printf("%.8x %.8x %.8x\n",
- hashword((const uint32_t *)q, (sizeof(q)-1)/4, 13),
- hashword((const uint32_t *)q, (sizeof(q)-5)/4, 13),
- hashword((const uint32_t *)q, (sizeof(q)-9)/4, 13));
- p = q;
- printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
- hashlittle(p, sizeof(q)-1, 13), hashlittle(p, sizeof(q)-2, 13),
- hashlittle(p, sizeof(q)-3, 13), hashlittle(p, sizeof(q)-4, 13),
- hashlittle(p, sizeof(q)-5, 13), hashlittle(p, sizeof(q)-6, 13),
- hashlittle(p, sizeof(q)-7, 13), hashlittle(p, sizeof(q)-8, 13),
- hashlittle(p, sizeof(q)-9, 13), hashlittle(p, sizeof(q)-10, 13),
- hashlittle(p, sizeof(q)-11, 13), hashlittle(p, sizeof(q)-12, 13));
- p = &qq[1];
- printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
- hashlittle(p, sizeof(q)-1, 13), hashlittle(p, sizeof(q)-2, 13),
- hashlittle(p, sizeof(q)-3, 13), hashlittle(p, sizeof(q)-4, 13),
- hashlittle(p, sizeof(q)-5, 13), hashlittle(p, sizeof(q)-6, 13),
- hashlittle(p, sizeof(q)-7, 13), hashlittle(p, sizeof(q)-8, 13),
- hashlittle(p, sizeof(q)-9, 13), hashlittle(p, sizeof(q)-10, 13),
- hashlittle(p, sizeof(q)-11, 13), hashlittle(p, sizeof(q)-12, 13));
- p = &qqq[2];
- printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
- hashlittle(p, sizeof(q)-1, 13), hashlittle(p, sizeof(q)-2, 13),
- hashlittle(p, sizeof(q)-3, 13), hashlittle(p, sizeof(q)-4, 13),
- hashlittle(p, sizeof(q)-5, 13), hashlittle(p, sizeof(q)-6, 13),
- hashlittle(p, sizeof(q)-7, 13), hashlittle(p, sizeof(q)-8, 13),
- hashlittle(p, sizeof(q)-9, 13), hashlittle(p, sizeof(q)-10, 13),
- hashlittle(p, sizeof(q)-11, 13), hashlittle(p, sizeof(q)-12, 13));
- p = &qqqq[3];
- printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
- hashlittle(p, sizeof(q)-1, 13), hashlittle(p, sizeof(q)-2, 13),
- hashlittle(p, sizeof(q)-3, 13), hashlittle(p, sizeof(q)-4, 13),
- hashlittle(p, sizeof(q)-5, 13), hashlittle(p, sizeof(q)-6, 13),
- hashlittle(p, sizeof(q)-7, 13), hashlittle(p, sizeof(q)-8, 13),
- hashlittle(p, sizeof(q)-9, 13), hashlittle(p, sizeof(q)-10, 13),
- hashlittle(p, sizeof(q)-11, 13), hashlittle(p, sizeof(q)-12, 13));
- printf("\n");
-
- /* check that hashlittle2 and hashlittle produce the same results */
- i=47; j=0;
- hashlittle2(q, sizeof(q), &i, &j);
- if (hashlittle(q, sizeof(q), 47) != i)
- printf("hashlittle2 and hashlittle mismatch\n");
-
- /* check that hashword2 and hashword produce the same results */
- len = raninit;
- i=47, j=0;
- hashword2(&len, 1, &i, &j);
- if (hashword(&len, 1, 47) != i)
- printf("hashword2 and hashword mismatch %x %x\n",
- i, hashword(&len, 1, 47));
-
- /* check hashlittle doesn't read before or after the ends of the string */
- for (h=0, b=buf+1; h<8; ++h, ++b)
- {
- for (i=0; i<MAXLEN; ++i)
- {
- len = i;
- for (j=0; j<i; ++j) *(b+j)=0;
-
- /* these should all be equal */
- ref = hashlittle(b, len, (uint32_t)1);
- *(b+i)=(uint8_t)~0;
- *(b-1)=(uint8_t)~0;
- x = hashlittle(b, len, (uint32_t)1);
- y = hashlittle(b, len, (uint32_t)1);
- if ((ref != x) || (ref != y))
- {
- printf("alignment error: %.8x %.8x %.8x %d %d\n",ref,x,y,
- h, i);
- }
- }
- }
-}
-
-/* check for problems with nulls */
- void driver4(void)
-{
- uint8_t buf[1];
- uint32_t h,i,state[HASHSTATE];
-
-
- buf[0] = ~0;
- for (i=0; i<HASHSTATE; ++i) state[i] = 1;
- printf("These should all be different\n");
- for (i=0, h=0; i<8; ++i)
- {
- h = hashlittle(buf, 0, h);
- printf("%2ld 0-byte strings, hash is %.8x\n", i, h);
- }
-}
-
-
-int main(void)
-{
- driver1(); /* test that the key is hashed: used for timings */
- driver2(); /* test that whole key is hashed thoroughly */
- driver3(); /* test that nothing but the key is hashed */
- driver4(); /* test hashing multiple buffers (all buffers are null) */
- return 1;
-}
-
-#endif /* SELF_TEST */
diff --git a/external/unbound/util/storage/lookup3.h b/external/unbound/util/storage/lookup3.h
deleted file mode 100644
index 59dad7c48..000000000
--- a/external/unbound/util/storage/lookup3.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * util/storage/lookup3.h - header file for hashing functions.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains header definitions for the hash functions we use.
- * The hash functions are public domain (see lookup3.c).
- */
-
-#ifndef UTIL_STORAGE_LOOKUP3_H
-#define UTIL_STORAGE_LOOKUP3_H
-
-/**
- * Hash key made of 4byte chunks.
- * @param k: the key, an array of uint32_t values
- * @param length: the length of the key, in uint32_ts
- * @param initval: the previous hash, or an arbitrary value
- * @return: hash value.
- */
-uint32_t hashword(const uint32_t *k, size_t length, uint32_t initval);
-
-/**
- * Hash key data.
- * @param k: the key, array of uint8_t
- * @param length: the length of the key, in uint8_ts
- * @param initval: the previous hash, or an arbitrary value
- * @return: hash value.
- */
-uint32_t hashlittle(const void *k, size_t length, uint32_t initval);
-
-/**
- * Set the randomisation initial value, set this before threads start,
- * and before hashing stuff (because it changes subsequent results).
- * @param v: value
- */
-void hash_set_raninit(uint32_t v);
-
-#endif /* UTIL_STORAGE_LOOKUP3_H */
diff --git a/external/unbound/util/storage/lruhash.c b/external/unbound/util/storage/lruhash.c
deleted file mode 100644
index 0003ff491..000000000
--- a/external/unbound/util/storage/lruhash.c
+++ /dev/null
@@ -1,631 +0,0 @@
-/*
- * util/storage/lruhash.c - hashtable, hash function, LRU keeping.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains a hashtable with LRU keeping of entries.
- *
- */
-
-#include "config.h"
-#include "util/storage/lruhash.h"
-#include "util/fptr_wlist.h"
-
-void
-bin_init(struct lruhash_bin* array, size_t size)
-{
- size_t i;
-#ifdef THREADS_DISABLED
- (void)array;
-#endif
- for(i=0; i<size; i++) {
- lock_quick_init(&array[i].lock);
- lock_protect(&array[i].lock, &array[i],
- sizeof(struct lruhash_bin));
- }
-}
-
-struct lruhash*
-lruhash_create(size_t start_size, size_t maxmem,
- lruhash_sizefunc_type sizefunc, lruhash_compfunc_type compfunc,
- lruhash_delkeyfunc_type delkeyfunc,
- lruhash_deldatafunc_type deldatafunc, void* arg)
-{
- struct lruhash* table = (struct lruhash*)calloc(1,
- sizeof(struct lruhash));
- if(!table)
- return NULL;
- lock_quick_init(&table->lock);
- table->sizefunc = sizefunc;
- table->compfunc = compfunc;
- table->delkeyfunc = delkeyfunc;
- table->deldatafunc = deldatafunc;
- table->cb_arg = arg;
- table->size = start_size;
- table->size_mask = (int)(start_size-1);
- table->lru_start = NULL;
- table->lru_end = NULL;
- table->num = 0;
- table->space_used = 0;
- table->space_max = maxmem;
- table->array = calloc(table->size, sizeof(struct lruhash_bin));
- if(!table->array) {
- lock_quick_destroy(&table->lock);
- free(table);
- return NULL;
- }
- bin_init(table->array, table->size);
- lock_protect(&table->lock, table, sizeof(*table));
- lock_protect(&table->lock, table->array,
- table->size*sizeof(struct lruhash_bin));
- return table;
-}
-
-void
-bin_delete(struct lruhash* table, struct lruhash_bin* bin)
-{
- struct lruhash_entry* p, *np;
- void *d;
- if(!bin)
- return;
- lock_quick_destroy(&bin->lock);
- p = bin->overflow_list;
- bin->overflow_list = NULL;
- while(p) {
- np = p->overflow_next;
- d = p->data;
- (*table->delkeyfunc)(p->key, table->cb_arg);
- (*table->deldatafunc)(d, table->cb_arg);
- p = np;
- }
-}
-
-void
-bin_split(struct lruhash* table, struct lruhash_bin* newa,
- int newmask)
-{
- size_t i;
- struct lruhash_entry *p, *np;
- struct lruhash_bin* newbin;
- /* move entries to new table. Notice that since hash x is mapped to
- * bin x & mask, and new mask uses one more bit, so all entries in
- * one bin will go into the old bin or bin | newbit */
-#ifndef THREADS_DISABLED
- int newbit = newmask - table->size_mask;
-#endif
- /* so, really, this task could also be threaded, per bin. */
- /* LRU list is not changed */
- for(i=0; i<table->size; i++)
- {
- lock_quick_lock(&table->array[i].lock);
- p = table->array[i].overflow_list;
- /* lock both destination bins */
- lock_quick_lock(&newa[i].lock);
- lock_quick_lock(&newa[newbit|i].lock);
- while(p) {
- np = p->overflow_next;
- /* link into correct new bin */
- newbin = &newa[p->hash & newmask];
- p->overflow_next = newbin->overflow_list;
- newbin->overflow_list = p;
- p=np;
- }
- lock_quick_unlock(&newa[i].lock);
- lock_quick_unlock(&newa[newbit|i].lock);
- lock_quick_unlock(&table->array[i].lock);
- }
-}
-
-void
-lruhash_delete(struct lruhash* table)
-{
- size_t i;
- if(!table)
- return;
- /* delete lock on hashtable to force check its OK */
- lock_quick_destroy(&table->lock);
- for(i=0; i<table->size; i++)
- bin_delete(table, &table->array[i]);
- free(table->array);
- free(table);
-}
-
-void
-bin_overflow_remove(struct lruhash_bin* bin, struct lruhash_entry* entry)
-{
- struct lruhash_entry* p = bin->overflow_list;
- struct lruhash_entry** prevp = &bin->overflow_list;
- while(p) {
- if(p == entry) {
- *prevp = p->overflow_next;
- return;
- }
- prevp = &p->overflow_next;
- p = p->overflow_next;
- }
-}
-
-void
-reclaim_space(struct lruhash* table, struct lruhash_entry** list)
-{
- struct lruhash_entry* d;
- struct lruhash_bin* bin;
- log_assert(table);
- /* does not delete MRU entry, so table will not be empty. */
- while(table->num > 1 && table->space_used > table->space_max) {
- /* notice that since we hold the hashtable lock, nobody
- can change the lru chain. So it cannot be deleted underneath
- us. We still need the hashbin and entry write lock to make
- sure we flush all users away from the entry.
- which is unlikely, since it is LRU, if someone got a rdlock
- it would be moved to front, but to be sure. */
- d = table->lru_end;
- /* specialised, delete from end of double linked list,
- and we know num>1, so there is a previous lru entry. */
- log_assert(d && d->lru_prev);
- table->lru_end = d->lru_prev;
- d->lru_prev->lru_next = NULL;
- /* schedule entry for deletion */
- bin = &table->array[d->hash & table->size_mask];
- table->num --;
- lock_quick_lock(&bin->lock);
- bin_overflow_remove(bin, d);
- d->overflow_next = *list;
- *list = d;
- lock_rw_wrlock(&d->lock);
- table->space_used -= table->sizefunc(d->key, d->data);
- if(table->markdelfunc)
- (*table->markdelfunc)(d->key);
- lock_rw_unlock(&d->lock);
- lock_quick_unlock(&bin->lock);
- }
-}
-
-struct lruhash_entry*
-bin_find_entry(struct lruhash* table,
- struct lruhash_bin* bin, hashvalue_type hash, void* key)
-{
- struct lruhash_entry* p = bin->overflow_list;
- while(p) {
- if(p->hash == hash && table->compfunc(p->key, key) == 0)
- return p;
- p = p->overflow_next;
- }
- return NULL;
-}
-
-void
-table_grow(struct lruhash* table)
-{
- struct lruhash_bin* newa;
- int newmask;
- size_t i;
- if(table->size_mask == (int)(((size_t)-1)>>1)) {
- log_err("hash array malloc: size_t too small");
- return;
- }
- /* try to allocate new array, if not fail */
- newa = calloc(table->size*2, sizeof(struct lruhash_bin));
- if(!newa) {
- log_err("hash grow: malloc failed");
- /* continue with smaller array. Though its slower. */
- return;
- }
- bin_init(newa, table->size*2);
- newmask = (table->size_mask << 1) | 1;
- bin_split(table, newa, newmask);
- /* delete the old bins */
- lock_unprotect(&table->lock, table->array);
- for(i=0; i<table->size; i++) {
- lock_quick_destroy(&table->array[i].lock);
- }
- free(table->array);
-
- table->size *= 2;
- table->size_mask = newmask;
- table->array = newa;
- lock_protect(&table->lock, table->array,
- table->size*sizeof(struct lruhash_bin));
- return;
-}
-
-void
-lru_front(struct lruhash* table, struct lruhash_entry* entry)
-{
- entry->lru_prev = NULL;
- entry->lru_next = table->lru_start;
- if(!table->lru_start)
- table->lru_end = entry;
- else table->lru_start->lru_prev = entry;
- table->lru_start = entry;
-}
-
-void
-lru_remove(struct lruhash* table, struct lruhash_entry* entry)
-{
- if(entry->lru_prev)
- entry->lru_prev->lru_next = entry->lru_next;
- else table->lru_start = entry->lru_next;
- if(entry->lru_next)
- entry->lru_next->lru_prev = entry->lru_prev;
- else table->lru_end = entry->lru_prev;
-}
-
-void
-lru_touch(struct lruhash* table, struct lruhash_entry* entry)
-{
- log_assert(table && entry);
- if(entry == table->lru_start)
- return; /* nothing to do */
- /* remove from current lru position */
- lru_remove(table, entry);
- /* add at front */
- lru_front(table, entry);
-}
-
-void
-lruhash_insert(struct lruhash* table, hashvalue_type hash,
- struct lruhash_entry* entry, void* data, void* cb_arg)
-{
- struct lruhash_bin* bin;
- struct lruhash_entry* found, *reclaimlist=NULL;
- size_t need_size;
- fptr_ok(fptr_whitelist_hash_sizefunc(table->sizefunc));
- fptr_ok(fptr_whitelist_hash_delkeyfunc(table->delkeyfunc));
- fptr_ok(fptr_whitelist_hash_deldatafunc(table->deldatafunc));
- fptr_ok(fptr_whitelist_hash_compfunc(table->compfunc));
- fptr_ok(fptr_whitelist_hash_markdelfunc(table->markdelfunc));
- need_size = table->sizefunc(entry->key, data);
- if(cb_arg == NULL) cb_arg = table->cb_arg;
-
- /* find bin */
- lock_quick_lock(&table->lock);
- bin = &table->array[hash & table->size_mask];
- lock_quick_lock(&bin->lock);
-
- /* see if entry exists already */
- if(!(found=bin_find_entry(table, bin, hash, entry->key))) {
- /* if not: add to bin */
- entry->overflow_next = bin->overflow_list;
- bin->overflow_list = entry;
- lru_front(table, entry);
- table->num++;
- table->space_used += need_size;
- } else {
- /* if so: update data - needs a writelock */
- table->space_used += need_size -
- (*table->sizefunc)(found->key, found->data);
- (*table->delkeyfunc)(entry->key, cb_arg);
- lru_touch(table, found);
- lock_rw_wrlock(&found->lock);
- (*table->deldatafunc)(found->data, cb_arg);
- found->data = data;
- lock_rw_unlock(&found->lock);
- }
- lock_quick_unlock(&bin->lock);
- if(table->space_used > table->space_max)
- reclaim_space(table, &reclaimlist);
- if(table->num >= table->size)
- table_grow(table);
- lock_quick_unlock(&table->lock);
-
- /* finish reclaim if any (outside of critical region) */
- while(reclaimlist) {
- struct lruhash_entry* n = reclaimlist->overflow_next;
- void* d = reclaimlist->data;
- (*table->delkeyfunc)(reclaimlist->key, cb_arg);
- (*table->deldatafunc)(d, cb_arg);
- reclaimlist = n;
- }
-}
-
-struct lruhash_entry*
-lruhash_lookup(struct lruhash* table, hashvalue_type hash, void* key, int wr)
-{
- struct lruhash_entry* entry;
- struct lruhash_bin* bin;
- fptr_ok(fptr_whitelist_hash_compfunc(table->compfunc));
-
- lock_quick_lock(&table->lock);
- bin = &table->array[hash & table->size_mask];
- lock_quick_lock(&bin->lock);
- if((entry=bin_find_entry(table, bin, hash, key)))
- lru_touch(table, entry);
- lock_quick_unlock(&table->lock);
-
- if(entry) {
- if(wr) { lock_rw_wrlock(&entry->lock); }
- else { lock_rw_rdlock(&entry->lock); }
- }
- lock_quick_unlock(&bin->lock);
- return entry;
-}
-
-void
-lruhash_remove(struct lruhash* table, hashvalue_type hash, void* key)
-{
- struct lruhash_entry* entry;
- struct lruhash_bin* bin;
- void *d;
- fptr_ok(fptr_whitelist_hash_sizefunc(table->sizefunc));
- fptr_ok(fptr_whitelist_hash_delkeyfunc(table->delkeyfunc));
- fptr_ok(fptr_whitelist_hash_deldatafunc(table->deldatafunc));
- fptr_ok(fptr_whitelist_hash_compfunc(table->compfunc));
- fptr_ok(fptr_whitelist_hash_markdelfunc(table->markdelfunc));
-
- lock_quick_lock(&table->lock);
- bin = &table->array[hash & table->size_mask];
- lock_quick_lock(&bin->lock);
- if((entry=bin_find_entry(table, bin, hash, key))) {
- bin_overflow_remove(bin, entry);
- lru_remove(table, entry);
- } else {
- lock_quick_unlock(&table->lock);
- lock_quick_unlock(&bin->lock);
- return;
- }
- table->num--;
- table->space_used -= (*table->sizefunc)(entry->key, entry->data);
- lock_quick_unlock(&table->lock);
- lock_rw_wrlock(&entry->lock);
- if(table->markdelfunc)
- (*table->markdelfunc)(entry->key);
- lock_rw_unlock(&entry->lock);
- lock_quick_unlock(&bin->lock);
- /* finish removal */
- d = entry->data;
- (*table->delkeyfunc)(entry->key, table->cb_arg);
- (*table->deldatafunc)(d, table->cb_arg);
-}
-
-/** clear bin, respecting locks, does not do space, LRU */
-static void
-bin_clear(struct lruhash* table, struct lruhash_bin* bin)
-{
- struct lruhash_entry* p, *np;
- void *d;
- lock_quick_lock(&bin->lock);
- p = bin->overflow_list;
- while(p) {
- lock_rw_wrlock(&p->lock);
- np = p->overflow_next;
- d = p->data;
- if(table->markdelfunc)
- (*table->markdelfunc)(p->key);
- lock_rw_unlock(&p->lock);
- (*table->delkeyfunc)(p->key, table->cb_arg);
- (*table->deldatafunc)(d, table->cb_arg);
- p = np;
- }
- bin->overflow_list = NULL;
- lock_quick_unlock(&bin->lock);
-}
-
-void
-lruhash_clear(struct lruhash* table)
-{
- size_t i;
- if(!table)
- return;
- fptr_ok(fptr_whitelist_hash_delkeyfunc(table->delkeyfunc));
- fptr_ok(fptr_whitelist_hash_deldatafunc(table->deldatafunc));
- fptr_ok(fptr_whitelist_hash_markdelfunc(table->markdelfunc));
-
- lock_quick_lock(&table->lock);
- for(i=0; i<table->size; i++) {
- bin_clear(table, &table->array[i]);
- }
- table->lru_start = NULL;
- table->lru_end = NULL;
- table->num = 0;
- table->space_used = 0;
- lock_quick_unlock(&table->lock);
-}
-
-void
-lruhash_status(struct lruhash* table, const char* id, int extended)
-{
- lock_quick_lock(&table->lock);
- log_info("%s: %u entries, memory %u / %u",
- id, (unsigned)table->num, (unsigned)table->space_used,
- (unsigned)table->space_max);
- log_info(" itemsize %u, array %u, mask %d",
- (unsigned)(table->num? table->space_used/table->num : 0),
- (unsigned)table->size, table->size_mask);
- if(extended) {
- size_t i;
- int min=(int)table->size*2, max=-2;
- for(i=0; i<table->size; i++) {
- int here = 0;
- struct lruhash_entry *en;
- lock_quick_lock(&table->array[i].lock);
- en = table->array[i].overflow_list;
- while(en) {
- here ++;
- en = en->overflow_next;
- }
- lock_quick_unlock(&table->array[i].lock);
- if(extended >= 2)
- log_info("bin[%d] %d", (int)i, here);
- if(here > max) max = here;
- if(here < min) min = here;
- }
- log_info(" bin min %d, avg %.2lf, max %d", min,
- (double)table->num/(double)table->size, max);
- }
- lock_quick_unlock(&table->lock);
-}
-
-size_t
-lruhash_get_mem(struct lruhash* table)
-{
- size_t s;
- lock_quick_lock(&table->lock);
- s = sizeof(struct lruhash) + table->space_used;
-#ifdef USE_THREAD_DEBUG
- if(table->size != 0) {
- size_t i;
- for(i=0; i<table->size; i++)
- s += sizeof(struct lruhash_bin) +
- lock_get_mem(&table->array[i].lock);
- }
-#else /* no THREAD_DEBUG */
- if(table->size != 0)
- s += (table->size)*(sizeof(struct lruhash_bin) +
- lock_get_mem(&table->array[0].lock));
-#endif
- lock_quick_unlock(&table->lock);
- s += lock_get_mem(&table->lock);
- return s;
-}
-
-void
-lruhash_setmarkdel(struct lruhash* table, lruhash_markdelfunc_type md)
-{
- lock_quick_lock(&table->lock);
- table->markdelfunc = md;
- lock_quick_unlock(&table->lock);
-}
-
-void
-lruhash_traverse(struct lruhash* h, int wr,
- void (*func)(struct lruhash_entry*, void*), void* arg)
-{
- size_t i;
- struct lruhash_entry* e;
-
- lock_quick_lock(&h->lock);
- for(i=0; i<h->size; i++) {
- lock_quick_lock(&h->array[i].lock);
- for(e = h->array[i].overflow_list; e; e = e->overflow_next) {
- if(wr) {
- lock_rw_wrlock(&e->lock);
- } else {
- lock_rw_rdlock(&e->lock);
- }
- (*func)(e, arg);
- lock_rw_unlock(&e->lock);
- }
- lock_quick_unlock(&h->array[i].lock);
- }
- lock_quick_unlock(&h->lock);
-}
-
-/*
- * Demote: the opposite of touch, move an entry to the bottom
- * of the LRU pile.
- */
-
-void
-lru_demote(struct lruhash* table, struct lruhash_entry* entry)
-{
- log_assert(table && entry);
- if (entry == table->lru_end)
- return; /* nothing to do */
- /* remove from current lru position */
- lru_remove(table, entry);
- /* add at end */
- entry->lru_next = NULL;
- entry->lru_prev = table->lru_end;
-
- if (table->lru_end == NULL)
- {
- table->lru_start = entry;
- }
- else
- {
- table->lru_end->lru_next = entry;
- }
- table->lru_end = entry;
-}
-
-struct lruhash_entry*
-lruhash_insert_or_retrieve(struct lruhash* table, hashvalue_type hash,
- struct lruhash_entry* entry, void* data, void* cb_arg)
-{
- struct lruhash_bin* bin;
- struct lruhash_entry* found, *reclaimlist = NULL;
- size_t need_size;
- fptr_ok(fptr_whitelist_hash_sizefunc(table->sizefunc));
- fptr_ok(fptr_whitelist_hash_delkeyfunc(table->delkeyfunc));
- fptr_ok(fptr_whitelist_hash_deldatafunc(table->deldatafunc));
- fptr_ok(fptr_whitelist_hash_compfunc(table->compfunc));
- fptr_ok(fptr_whitelist_hash_markdelfunc(table->markdelfunc));
- need_size = table->sizefunc(entry->key, data);
- if (cb_arg == NULL) cb_arg = table->cb_arg;
-
- /* find bin */
- lock_quick_lock(&table->lock);
- bin = &table->array[hash & table->size_mask];
- lock_quick_lock(&bin->lock);
-
- /* see if entry exists already */
- if ((found = bin_find_entry(table, bin, hash, entry->key)) != NULL) {
- /* if so: keep the existing data - acquire a writelock */
- lock_rw_wrlock(&found->lock);
- }
- else
- {
- /* if not: add to bin */
- entry->overflow_next = bin->overflow_list;
- bin->overflow_list = entry;
- lru_front(table, entry);
- table->num++;
- table->space_used += need_size;
- /* return the entry that was presented, and lock it */
- found = entry;
- lock_rw_wrlock(&found->lock);
- }
- lock_quick_unlock(&bin->lock);
- if (table->space_used > table->space_max)
- reclaim_space(table, &reclaimlist);
- if (table->num >= table->size)
- table_grow(table);
- lock_quick_unlock(&table->lock);
-
- /* finish reclaim if any (outside of critical region) */
- while (reclaimlist) {
- struct lruhash_entry* n = reclaimlist->overflow_next;
- void* d = reclaimlist->data;
- (*table->delkeyfunc)(reclaimlist->key, cb_arg);
- (*table->deldatafunc)(d, cb_arg);
- reclaimlist = n;
- }
-
- /* return the entry that was selected */
- return found;
-}
-
diff --git a/external/unbound/util/storage/lruhash.h b/external/unbound/util/storage/lruhash.h
deleted file mode 100644
index 4759b5001..000000000
--- a/external/unbound/util/storage/lruhash.h
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- * util/storage/lruhash.h - hashtable, hash function, LRU keeping.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains a hashtable with LRU keeping of entries.
- *
- * The hash table keeps a maximum memory size. Old entries are removed
- * to make space for new entries.
- *
- * The locking strategy is as follows:
- * o since (almost) every read also implies a LRU update, the
- * hashtable lock is a spinlock, not rwlock.
- * o the idea is to move every thread through the hash lock quickly,
- * so that the next thread can access the lookup table.
- * o User performs hash function.
- *
- * For read:
- * o lock hashtable.
- * o lookup hash bin.
- * o lock hash bin.
- * o find entry (if failed, unlock hash, unl bin, exit).
- * o swizzle pointers for LRU update.
- * o unlock hashtable.
- * o lock entry (rwlock).
- * o unlock hash bin.
- * o work on entry.
- * o unlock entry.
- *
- * To update an entry, gain writelock and change the entry.
- * (the entry must keep the same hashvalue, so a data update.)
- * (you cannot upgrade a readlock to a writelock, because the item may
- * be deleted, it would cause race conditions. So instead, unlock and
- * relookup it in the hashtable.)
- *
- * To delete an entry:
- * o unlock the entry if you hold the lock already.
- * o lock hashtable.
- * o lookup hash bin.
- * o lock hash bin.
- * o find entry (if failed, unlock hash, unl bin, exit).
- * o remove entry from hashtable bin overflow chain.
- * o unlock hashtable.
- * o lock entry (writelock).
- * o unlock hash bin.
- * o unlock entry (nobody else should be waiting for this lock,
- * since you removed it from hashtable, and you got writelock while
- * holding the hashbinlock so you are the only one.)
- * Note you are only allowed to obtain a lock while holding hashbinlock.
- * o delete entry.
- *
- * The above sequence is:
- * o race free, works with read, write and delete.
- * o but has a queue, imagine someone needing a writelock on an item.
- * but there are still readlocks. The writelocker waits, but holds
- * the hashbinlock. The next thread that comes in and needs the same
- * hashbin will wait for the lock while holding the hashtable lock.
- * thus halting the entire system on hashtable.
- * This is because of the delete protection.
- * Readlocks will be easier on the rwlock on entries.
- * While the writer is holding writelock, similar problems happen with
- * a reader or writer needing the same item.
- * the scenario requires more than three threads.
- * o so the queue length is 3 threads in a bad situation. The fourth is
- * unable to use the hashtable.
- *
- * If you need to acquire locks on multiple items from the hashtable.
- * o you MUST release all locks on items from the hashtable before
- * doing the next lookup/insert/delete/whatever.
- * o To acquire multiple items you should use a special routine that
- * obtains the locks on those multiple items in one go.
- */
-
-#ifndef UTIL_STORAGE_LRUHASH_H
-#define UTIL_STORAGE_LRUHASH_H
-#include "util/locks.h"
-struct lruhash_bin;
-struct lruhash_entry;
-
-/** default start size for hash arrays */
-#define HASH_DEFAULT_STARTARRAY 1024 /* entries in array */
-/** default max memory for hash arrays */
-#define HASH_DEFAULT_MAXMEM 4*1024*1024 /* bytes */
-
-/** the type of a hash value */
-typedef uint32_t hashvalue_type;
-
-/**
- * Type of function that calculates the size of an entry.
- * Result must include the size of struct lruhash_entry.
- * Keys that are identical must also calculate to the same size.
- * size = func(key, data).
- */
-typedef size_t (*lruhash_sizefunc_type)(void*, void*);
-
-/** type of function that compares two keys. return 0 if equal. */
-typedef int (*lruhash_compfunc_type)(void*, void*);
-
-/** old keys are deleted.
- * The RRset type has to revoke its ID number, markdel() is used first.
- * This function is called: func(key, userarg) */
-typedef void (*lruhash_delkeyfunc_type)(void*, void*);
-
-/** old data is deleted. This function is called: func(data, userarg). */
-typedef void (*lruhash_deldatafunc_type)(void*, void*);
-
-/** mark a key as pending to be deleted (and not to be used by anyone).
- * called: func(key) */
-typedef void (*lruhash_markdelfunc_type)(void*);
-
-/**
- * Hash table that keeps LRU list of entries.
- */
-struct lruhash {
- /** lock for exclusive access, to the lookup array */
- lock_quick_type lock;
- /** the size function for entries in this table */
- lruhash_sizefunc_type sizefunc;
- /** the compare function for entries in this table. */
- lruhash_compfunc_type compfunc;
- /** how to delete keys. */
- lruhash_delkeyfunc_type delkeyfunc;
- /** how to delete data. */
- lruhash_deldatafunc_type deldatafunc;
- /** how to mark a key pending deletion */
- lruhash_markdelfunc_type markdelfunc;
- /** user argument for user functions */
- void* cb_arg;
-
- /** the size of the lookup array */
- size_t size;
- /** size bitmask - since size is a power of 2 */
- int size_mask;
- /** lookup array of bins */
- struct lruhash_bin* array;
-
- /** the lru list, start and end, noncyclical double linked list. */
- struct lruhash_entry* lru_start;
- /** lru list end item (least recently used) */
- struct lruhash_entry* lru_end;
-
- /** the number of entries in the hash table. */
- size_t num;
- /** the amount of space used, roughly the number of bytes in use. */
- size_t space_used;
- /** the amount of space the hash table is maximally allowed to use. */
- size_t space_max;
-};
-
-/**
- * A single bin with a linked list of entries in it.
- */
-struct lruhash_bin {
- /**
- * Lock for exclusive access to the linked list
- * This lock makes deletion of items safe in this overflow list.
- */
- lock_quick_type lock;
- /** linked list of overflow entries */
- struct lruhash_entry* overflow_list;
-};
-
-/**
- * An entry into the hash table.
- * To change overflow_next you need to hold the bin lock.
- * To change the lru items you need to hold the hashtable lock.
- * This structure is designed as part of key struct. And key pointer helps
- * to get the surrounding structure. Data should be allocated on its own.
- */
-struct lruhash_entry {
- /**
- * rwlock for access to the contents of the entry
- * Note that it does _not_ cover the lru_ and overflow_ ptrs.
- * Even with a writelock, you cannot change hash and key.
- * You need to delete it to change hash or key.
- */
- lock_rw_type lock;
- /** next entry in overflow chain. Covered by hashlock and binlock. */
- struct lruhash_entry* overflow_next;
- /** next entry in lru chain. covered by hashlock. */
- struct lruhash_entry* lru_next;
- /** prev entry in lru chain. covered by hashlock. */
- struct lruhash_entry* lru_prev;
- /** hash value of the key. It may not change, until entry deleted. */
- hashvalue_type hash;
- /** key */
- void* key;
- /** data */
- void* data;
-};
-
-/**
- * Create new hash table.
- * @param start_size: size of hashtable array at start, must be power of 2.
- * @param maxmem: maximum amount of memory this table is allowed to use.
- * @param sizefunc: calculates memory usage of entries.
- * @param compfunc: compares entries, 0 on equality.
- * @param delkeyfunc: deletes key.
- * Calling both delkey and deldata will also free the struct lruhash_entry.
- * Make it part of the key structure and delete it in delkeyfunc.
- * @param deldatafunc: deletes data.
- * @param arg: user argument that is passed to user function calls.
- * @return: new hash table or NULL on malloc failure.
- */
-struct lruhash* lruhash_create(size_t start_size, size_t maxmem,
- lruhash_sizefunc_type sizefunc, lruhash_compfunc_type compfunc,
- lruhash_delkeyfunc_type delkeyfunc,
- lruhash_deldatafunc_type deldatafunc, void* arg);
-
-/**
- * Delete hash table. Entries are all deleted.
- * @param table: to delete.
- */
-void lruhash_delete(struct lruhash* table);
-
-/**
- * Clear hash table. Entries are all deleted, while locking them before
- * doing so. At end the table is empty.
- * @param table: to make empty.
- */
-void lruhash_clear(struct lruhash* table);
-
-/**
- * Insert a new element into the hashtable.
- * If key is already present data pointer in that entry is updated.
- * The space calculation function is called with the key, data.
- * If necessary the least recently used entries are deleted to make space.
- * If necessary the hash array is grown up.
- *
- * @param table: hash table.
- * @param hash: hash value. User calculates the hash.
- * @param entry: identifies the entry.
- * If key already present, this entry->key is deleted immediately.
- * But entry->data is set to NULL before deletion, and put into
- * the existing entry. The data is then freed.
- * @param data: the data.
- * @param cb_override: if not null overrides the cb_arg for the deletefunc.
- */
-void lruhash_insert(struct lruhash* table, hashvalue_type hash,
- struct lruhash_entry* entry, void* data, void* cb_override);
-
-/**
- * Lookup an entry in the hashtable.
- * At the end of the function you hold a (read/write)lock on the entry.
- * The LRU is updated for the entry (if found).
- * @param table: hash table.
- * @param hash: hash of key.
- * @param key: what to look for, compared against entries in overflow chain.
- * the hash value must be set, and must work with compare function.
- * @param wr: set to true if you desire a writelock on the entry.
- * with a writelock you can update the data part.
- * @return: pointer to the entry or NULL. The entry is locked.
- * The user must unlock the entry when done.
- */
-struct lruhash_entry* lruhash_lookup(struct lruhash* table,
- hashvalue_type hash, void* key, int wr);
-
-/**
- * Touch entry, so it becomes the most recently used in the LRU list.
- * Caller must hold hash table lock. The entry must be inserted already.
- * @param table: hash table.
- * @param entry: entry to make first in LRU.
- */
-void lru_touch(struct lruhash* table, struct lruhash_entry* entry);
-
-/**
- * Set the markdelfunction (or NULL)
- */
-void lruhash_setmarkdel(struct lruhash* table, lruhash_markdelfunc_type md);
-
-/************************* getdns functions ************************/
-/*** these are used by getdns only and not by unbound. ***/
-
-/**
- * Demote entry, so it becomes the least recently used in the LRU list.
- * Caller must hold hash table lock. The entry must be inserted already.
- * @param table: hash table.
- * @param entry: entry to make last in LRU.
- */
-void lru_demote(struct lruhash* table, struct lruhash_entry* entry);
-
-/**
- * Insert a new element into the hashtable, or retrieve the corresponding
- * element of it exits.
- *
- * If key is already present data pointer in that entry is kept.
- * If it is not present, a new entry is created. In that case,
- * the space calculation function is called with the key, data.
- * If necessary the least recently used entries are deleted to make space.
- * If necessary the hash array is grown up.
- *
- * @param table: hash table.
- * @param hash: hash value. User calculates the hash.
- * @param entry: identifies the entry.
- * @param data: the data.
- * @param cb_arg: if not null overrides the cb_arg for the deletefunc.
- * @return: pointer to the existing entry if the key was already present,
- * or to the entry argument if it was not.
- */
-struct lruhash_entry* lruhash_insert_or_retrieve(struct lruhash* table, hashvalue_type hash,
- struct lruhash_entry* entry, void* data, void* cb_arg);
-
-/************************* Internal functions ************************/
-/*** these are only exposed for unit tests. ***/
-
-/**
- * Remove entry from hashtable. Does nothing if not found in hashtable.
- * Delfunc is called for the entry.
- * @param table: hash table.
- * @param hash: hash of key.
- * @param key: what to look for.
- */
-void lruhash_remove(struct lruhash* table, hashvalue_type hash, void* key);
-
-/** init the hash bins for the table */
-void bin_init(struct lruhash_bin* array, size_t size);
-
-/** delete the hash bin and entries inside it */
-void bin_delete(struct lruhash* table, struct lruhash_bin* bin);
-
-/**
- * Find entry in hash bin. You must have locked the bin.
- * @param table: hash table with function pointers.
- * @param bin: hash bin to look into.
- * @param hash: hash value to look for.
- * @param key: key to look for.
- * @return: the entry or NULL if not found.
- */
-struct lruhash_entry* bin_find_entry(struct lruhash* table,
- struct lruhash_bin* bin, hashvalue_type hash, void* key);
-
-/**
- * Remove entry from bin overflow chain.
- * You must have locked the bin.
- * @param bin: hash bin to look into.
- * @param entry: entry ptr that needs removal.
- */
-void bin_overflow_remove(struct lruhash_bin* bin,
- struct lruhash_entry* entry);
-
-/**
- * Split hash bin into two new ones. Based on increased size_mask.
- * Caller must hold hash table lock.
- * At the end the routine acquires all hashbin locks (in the old array).
- * This makes it wait for other threads to finish with the bins.
- * So the bins are ready to be deleted after this function.
- * @param table: hash table with function pointers.
- * @param newa: new increased array.
- * @param newmask: new lookup mask.
- */
-void bin_split(struct lruhash* table, struct lruhash_bin* newa,
- int newmask);
-
-/**
- * Try to make space available by deleting old entries.
- * Assumes that the lock on the hashtable is being held by caller.
- * Caller must not hold bin locks.
- * @param table: hash table.
- * @param list: list of entries that are to be deleted later.
- * Entries have been removed from the hash table and writelock is held.
- */
-void reclaim_space(struct lruhash* table, struct lruhash_entry** list);
-
-/**
- * Grow the table lookup array. Becomes twice as large.
- * Caller must hold the hash table lock. Must not hold any bin locks.
- * Tries to grow, on malloc failure, nothing happened.
- * @param table: hash table.
- */
-void table_grow(struct lruhash* table);
-
-/**
- * Put entry at front of lru. entry must be unlinked from lru.
- * Caller must hold hash table lock.
- * @param table: hash table with lru head and tail.
- * @param entry: entry to make most recently used.
- */
-void lru_front(struct lruhash* table, struct lruhash_entry* entry);
-
-/**
- * Remove entry from lru list.
- * Caller must hold hash table lock.
- * @param table: hash table with lru head and tail.
- * @param entry: entry to remove from lru.
- */
-void lru_remove(struct lruhash* table, struct lruhash_entry* entry);
-
-/**
- * Output debug info to the log as to state of the hash table.
- * @param table: hash table.
- * @param id: string printed with table to identify the hash table.
- * @param extended: set to true to print statistics on overflow bin lengths.
- */
-void lruhash_status(struct lruhash* table, const char* id, int extended);
-
-/**
- * Get memory in use now by the lruhash table.
- * @param table: hash table. Will be locked before use. And unlocked after.
- * @return size in bytes.
- */
-size_t lruhash_get_mem(struct lruhash* table);
-
-/**
- * Traverse a lruhash. Call back for every element in the table.
- * @param h: hash table. Locked before use.
- * @param wr: if true writelock is obtained on element, otherwise readlock.
- * @param func: function for every element. Do not lock or unlock elements.
- * @param arg: user argument to func.
- */
-void lruhash_traverse(struct lruhash* h, int wr,
- void (*func)(struct lruhash_entry*, void*), void* arg);
-
-#endif /* UTIL_STORAGE_LRUHASH_H */
diff --git a/external/unbound/util/storage/slabhash.c b/external/unbound/util/storage/slabhash.c
deleted file mode 100644
index ae63b9772..000000000
--- a/external/unbound/util/storage/slabhash.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * util/storage/slabhash.c - hashtable consisting of several smaller tables.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * Implementation of hash table that consists of smaller hash tables.
- * This results in a partitioned lruhash table.
- * It cannot grow, but that gives it the ability to have multiple
- * locks. Also this means there are multiple LRU lists.
- */
-
-#include "config.h"
-#include "util/storage/slabhash.h"
-
-struct slabhash* slabhash_create(size_t numtables, size_t start_size,
- size_t maxmem, lruhash_sizefunc_type sizefunc,
- lruhash_compfunc_type compfunc, lruhash_delkeyfunc_type delkeyfunc,
- lruhash_deldatafunc_type deldatafunc, void* arg)
-{
- size_t i;
- struct slabhash* sl = (struct slabhash*)calloc(1,
- sizeof(struct slabhash));
- if(!sl) return NULL;
- sl->size = numtables;
- log_assert(sl->size > 0);
- sl->array = (struct lruhash**)calloc(sl->size, sizeof(struct lruhash*));
- if(!sl->array) {
- free(sl);
- return NULL;
- }
- sl->mask = (uint32_t)(sl->size - 1);
- if(sl->mask == 0) {
- sl->shift = 0;
- } else {
- log_assert( (sl->size & sl->mask) == 0
- /* size must be power of 2 */ );
- sl->shift = 0;
- while(!(sl->mask & 0x80000000)) {
- sl->mask <<= 1;
- sl->shift ++;
- }
- }
- for(i=0; i<sl->size; i++) {
- sl->array[i] = lruhash_create(start_size, maxmem / sl->size,
- sizefunc, compfunc, delkeyfunc, deldatafunc, arg);
- if(!sl->array[i]) {
- slabhash_delete(sl);
- return NULL;
- }
- }
- return sl;
-}
-
-void slabhash_delete(struct slabhash* sl)
-{
- if(!sl)
- return;
- if(sl->array) {
- size_t i;
- for(i=0; i<sl->size; i++)
- lruhash_delete(sl->array[i]);
- free(sl->array);
- }
- free(sl);
-}
-
-void slabhash_clear(struct slabhash* sl)
-{
- size_t i;
- if(!sl)
- return;
- for(i=0; i<sl->size; i++)
- lruhash_clear(sl->array[i]);
-}
-
-/** helper routine to calculate the slabhash index */
-static unsigned int
-slab_idx(struct slabhash* sl, hashvalue_type hash)
-{
- return ((hash & sl->mask) >> sl->shift);
-}
-
-void slabhash_insert(struct slabhash* sl, hashvalue_type hash,
- struct lruhash_entry* entry, void* data, void* arg)
-{
- lruhash_insert(sl->array[slab_idx(sl, hash)], hash, entry, data, arg);
-}
-
-struct lruhash_entry* slabhash_lookup(struct slabhash* sl,
- hashvalue_type hash, void* key, int wr)
-{
- return lruhash_lookup(sl->array[slab_idx(sl, hash)], hash, key, wr);
-}
-
-void slabhash_remove(struct slabhash* sl, hashvalue_type hash, void* key)
-{
- lruhash_remove(sl->array[slab_idx(sl, hash)], hash, key);
-}
-
-void slabhash_status(struct slabhash* sl, const char* id, int extended)
-{
- size_t i;
- char num[17];
- log_info("Slabhash %s: %u tables mask=%x shift=%d",
- id, (unsigned)sl->size, (unsigned)sl->mask, sl->shift);
- for(i=0; i<sl->size; i++) {
- snprintf(num, sizeof(num), "table %u", (unsigned)i);
- lruhash_status(sl->array[i], num, extended);
- }
-}
-
-size_t slabhash_get_size(struct slabhash* sl)
-{
- size_t i, total = 0;
- for(i=0; i<sl->size; i++) {
- lock_quick_lock(&sl->array[i]->lock);
- total += sl->array[i]->space_max;
- lock_quick_unlock(&sl->array[i]->lock);
- }
- return total;
-}
-
-size_t slabhash_get_mem(struct slabhash* sl)
-{
- size_t i, total = sizeof(*sl);
- total += sizeof(struct lruhash*)*sl->size;
- for(i=0; i<sl->size; i++) {
- total += lruhash_get_mem(sl->array[i]);
- }
- return total;
-}
-
-struct lruhash* slabhash_gettable(struct slabhash* sl, hashvalue_type hash)
-{
- return sl->array[slab_idx(sl, hash)];
-}
-
-/* test code, here to avoid linking problems with fptr_wlist */
-/** delete key */
-static void delkey(struct slabhash_testkey* k) {
- lock_rw_destroy(&k->entry.lock); free(k);}
-/** delete data */
-static void deldata(struct slabhash_testdata* d) {free(d);}
-
-size_t test_slabhash_sizefunc(void* ATTR_UNUSED(key), void* ATTR_UNUSED(data))
-{
- return sizeof(struct slabhash_testkey) +
- sizeof(struct slabhash_testdata);
-}
-
-int test_slabhash_compfunc(void* key1, void* key2)
-{
- struct slabhash_testkey* k1 = (struct slabhash_testkey*)key1;
- struct slabhash_testkey* k2 = (struct slabhash_testkey*)key2;
- if(k1->id == k2->id)
- return 0;
- if(k1->id > k2->id)
- return 1;
- return -1;
-}
-
-void test_slabhash_delkey(void* key, void* ATTR_UNUSED(arg))
-{
- delkey((struct slabhash_testkey*)key);
-}
-
-void test_slabhash_deldata(void* data, void* ATTR_UNUSED(arg))
-{
- deldata((struct slabhash_testdata*)data);
-}
-
-void slabhash_setmarkdel(struct slabhash* sl, lruhash_markdelfunc_type md)
-{
- size_t i;
- for(i=0; i<sl->size; i++) {
- lruhash_setmarkdel(sl->array[i], md);
- }
-}
-
-void slabhash_traverse(struct slabhash* sh, int wr,
- void (*func)(struct lruhash_entry*, void*), void* arg)
-{
- size_t i;
- for(i=0; i<sh->size; i++)
- lruhash_traverse(sh->array[i], wr, func, arg);
-}
-
-size_t count_slabhash_entries(struct slabhash* sh)
-{
- size_t slab, cnt = 0;
-
- for(slab=0; slab<sh->size; slab++) {
- lock_quick_lock(&sh->array[slab]->lock);
- cnt += sh->array[slab]->num;
- lock_quick_unlock(&sh->array[slab]->lock);
- }
- return cnt;
-}
diff --git a/external/unbound/util/storage/slabhash.h b/external/unbound/util/storage/slabhash.h
deleted file mode 100644
index d00983fc1..000000000
--- a/external/unbound/util/storage/slabhash.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * util/storage/slabhash.h - hashtable consisting of several smaller tables.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * Hash table that consists of smaller hash tables.
- * It cannot grow, but that gives it the ability to have multiple
- * locks. Also this means there are multiple LRU lists.
- */
-
-#ifndef UTIL_STORAGE_SLABHASH_H
-#define UTIL_STORAGE_SLABHASH_H
-#include "util/storage/lruhash.h"
-
-/** default number of slabs */
-#define HASH_DEFAULT_SLABS 4
-
-/**
- * Hash table formed from several smaller ones.
- * This results in a partitioned lruhash table, a 'slashtable'.
- * None of the data inside the slabhash may be altered.
- * Therefore, no locks are needed to access the structure.
- */
-struct slabhash {
- /** the size of the array - must be power of 2 */
- size_t size;
- /** size bitmask - uses high bits. */
- uint32_t mask;
- /** shift right this many bits to get index into array. */
- unsigned int shift;
- /** lookup array of hash tables */
- struct lruhash** array;
-};
-
-/**
- * Create new slabbed hash table.
- * @param numtables: number of hash tables to use, other parameters used to
- * initialize these smaller hashtables.
- * @param start_size: size of hashtable array at start, must be power of 2.
- * @param maxmem: maximum amount of memory this table is allowed to use.
- * so every table gets maxmem/numtables to use for itself.
- * @param sizefunc: calculates memory usage of entries.
- * @param compfunc: compares entries, 0 on equality.
- * @param delkeyfunc: deletes key.
- * @param deldatafunc: deletes data.
- * @param arg: user argument that is passed to user function calls.
- * @return: new hash table or NULL on malloc failure.
- */
-struct slabhash* slabhash_create(size_t numtables, size_t start_size,
- size_t maxmem, lruhash_sizefunc_type sizefunc,
- lruhash_compfunc_type compfunc, lruhash_delkeyfunc_type delkeyfunc,
- lruhash_deldatafunc_type deldatafunc, void* arg);
-
-/**
- * Delete hash table. Entries are all deleted.
- * @param table: to delete.
- */
-void slabhash_delete(struct slabhash* table);
-
-/**
- * Clear hash table. Entries are all deleted.
- * @param table: to make empty.
- */
-void slabhash_clear(struct slabhash* table);
-
-/**
- * Insert a new element into the hashtable, uses lruhash_insert.
- * If key is already present data pointer in that entry is updated.
- *
- * @param table: hash table.
- * @param hash: hash value. User calculates the hash.
- * @param entry: identifies the entry.
- * If key already present, this entry->key is deleted immediately.
- * But entry->data is set to NULL before deletion, and put into
- * the existing entry. The data is then freed.
- * @param data: the data.
- * @param cb_override: if not NULL overrides the cb_arg for deletfunc.
- */
-void slabhash_insert(struct slabhash* table, hashvalue_type hash,
- struct lruhash_entry* entry, void* data, void* cb_override);
-
-/**
- * Lookup an entry in the hashtable. Uses lruhash_lookup.
- * At the end of the function you hold a (read/write)lock on the entry.
- * The LRU is updated for the entry (if found).
- * @param table: hash table.
- * @param hash: hash of key.
- * @param key: what to look for, compared against entries in overflow chain.
- * the hash value must be set, and must work with compare function.
- * @param wr: set to true if you desire a writelock on the entry.
- * with a writelock you can update the data part.
- * @return: pointer to the entry or NULL. The entry is locked.
- * The user must unlock the entry when done.
- */
-struct lruhash_entry* slabhash_lookup(struct slabhash* table,
- hashvalue_type hash, void* key, int wr);
-
-/**
- * Remove entry from hashtable. Does nothing if not found in hashtable.
- * Delfunc is called for the entry. Uses lruhash_remove.
- * @param table: hash table.
- * @param hash: hash of key.
- * @param key: what to look for.
- */
-void slabhash_remove(struct slabhash* table, hashvalue_type hash, void* key);
-
-/**
- * Output debug info to the log as to state of the hash table.
- * @param table: hash table.
- * @param id: string printed with table to identify the hash table.
- * @param extended: set to true to print statistics on overflow bin lengths.
- */
-void slabhash_status(struct slabhash* table, const char* id, int extended);
-
-/**
- * Retrieve slab hash total size.
- * @param table: hash table.
- * @return size configured as max.
- */
-size_t slabhash_get_size(struct slabhash* table);
-
-/**
- * Retrieve slab hash current memory use.
- * @param table: hash table.
- * @return memory in use.
- */
-size_t slabhash_get_mem(struct slabhash* table);
-
-/**
- * Get lruhash table for a given hash value
- * @param table: slabbed hash table.
- * @param hash: hash value.
- * @return the lru hash table.
- */
-struct lruhash* slabhash_gettable(struct slabhash* table, hashvalue_type hash);
-
-/**
- * Set markdel function
- * @param table: slabbed hash table.
- * @param md: markdel function ptr.
- */
-void slabhash_setmarkdel(struct slabhash* table, lruhash_markdelfunc_type md);
-
-/**
- * Traverse a slabhash.
- * @param table: slabbed hash table.
- * @param wr: if true, writelock is obtained, otherwise readlock.
- * @param func: function to call for every element.
- * @param arg: user argument to function.
- */
-void slabhash_traverse(struct slabhash* table, int wr,
- void (*func)(struct lruhash_entry*, void*), void* arg);
-
-/*
- * Count entries in slabhash.
- * @param table: slabbed hash table;
- * @return the number of items
- */
-size_t count_slabhash_entries(struct slabhash* table);
-
-/* --- test representation --- */
-/** test structure contains test key */
-struct slabhash_testkey {
- /** the key id */
- int id;
- /** the entry */
- struct lruhash_entry entry;
-};
-/** test structure contains test data */
-struct slabhash_testdata {
- /** data value */
- int data;
-};
-
-/** test sizefunc for lruhash */
-size_t test_slabhash_sizefunc(void*, void*);
-/** test comparefunc for lruhash */
-int test_slabhash_compfunc(void*, void*);
-/** test delkey for lruhash */
-void test_slabhash_delkey(void*, void*);
-/** test deldata for lruhash */
-void test_slabhash_deldata(void*, void*);
-/* --- end test representation --- */
-
-#endif /* UTIL_STORAGE_SLABHASH_H */
diff --git a/external/unbound/util/timehist.c b/external/unbound/util/timehist.c
deleted file mode 100644
index dbf5b9841..000000000
--- a/external/unbound/util/timehist.c
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * util/timehist.c - make histogram of time values.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains functions to make a histogram of time values.
- */
-#include "config.h"
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-#include <sys/time.h>
-#include <sys/types.h>
-#include "util/timehist.h"
-#include "util/log.h"
-
-/** special timestwo operation for time values in histogram setup */
-static void
-timestwo(struct timeval* v)
-{
-#ifndef S_SPLINT_S
- if(v->tv_sec == 0 && v->tv_usec == 0) {
- v->tv_usec = 1;
- return;
- }
- v->tv_sec *= 2;
- v->tv_usec *= 2;
- if(v->tv_usec == 1024*1024) {
- /* nice values and easy to compute */
- v->tv_sec = 1;
- v->tv_usec = 0;
- }
-#endif
-}
-
-/** do setup exponentially */
-static void
-dosetup(struct timehist* hist)
-{
- struct timeval last;
- size_t i;
- memset(&last, 0, sizeof(last));
- for(i=0; i<hist->num; i++) {
- hist->buckets[i].lower = last;
- timestwo(&last);
- hist->buckets[i].upper = last;
- hist->buckets[i].count = 0;
- }
-}
-
-struct timehist* timehist_setup(void)
-{
- struct timehist* hist = (struct timehist*)calloc(1,
- sizeof(struct timehist));
- if(!hist)
- return NULL;
- hist->num = NUM_BUCKETS_HIST;
- hist->buckets = (struct th_buck*)calloc(hist->num,
- sizeof(struct th_buck));
- if(!hist->buckets) {
- free(hist);
- return NULL;
- }
- /* setup the buckets */
- dosetup(hist);
- return hist;
-}
-
-void timehist_delete(struct timehist* hist)
-{
- if(!hist)
- return;
- free(hist->buckets);
- free(hist);
-}
-
-void timehist_clear(struct timehist* hist)
-{
- size_t i;
- for(i=0; i<hist->num; i++)
- hist->buckets[i].count = 0;
-}
-
-/** histogram compare of time values */
-static int
-timeval_smaller(const struct timeval* x, const struct timeval* y)
-{
-#ifndef S_SPLINT_S
- if(x->tv_sec < y->tv_sec)
- return 1;
- else if(x->tv_sec == y->tv_sec) {
- if(x->tv_usec <= y->tv_usec)
- return 1;
- else return 0;
- }
- else return 0;
-#endif
-}
-
-
-void timehist_insert(struct timehist* hist, struct timeval* tv)
-{
- size_t i;
- for(i=0; i<hist->num; i++) {
- if(timeval_smaller(tv, &hist->buckets[i].upper)) {
- hist->buckets[i].count++;
- return;
- }
- }
- /* dump in last bucket */
- hist->buckets[hist->num-1].count++;
-}
-
-void timehist_print(struct timehist* hist)
-{
-#ifndef S_SPLINT_S
- size_t i;
- for(i=0; i<hist->num; i++) {
- if(hist->buckets[i].count != 0) {
- printf("%4d.%6.6d %4d.%6.6d %u\n",
- (int)hist->buckets[i].lower.tv_sec,
- (int)hist->buckets[i].lower.tv_usec,
- (int)hist->buckets[i].upper.tv_sec,
- (int)hist->buckets[i].upper.tv_usec,
- (unsigned)hist->buckets[i].count);
- }
- }
-#endif
-}
-
-void timehist_log(struct timehist* hist, const char* name)
-{
-#ifndef S_SPLINT_S
- size_t i;
- log_info("[25%%]=%g median[50%%]=%g [75%%]=%g",
- timehist_quartile(hist, 0.25),
- timehist_quartile(hist, 0.50),
- timehist_quartile(hist, 0.75));
- /* 0000.000000 0000.000000 0 */
- log_info("lower(secs) upper(secs) %s", name);
- for(i=0; i<hist->num; i++) {
- if(hist->buckets[i].count != 0) {
- log_info("%4d.%6.6d %4d.%6.6d %u",
- (int)hist->buckets[i].lower.tv_sec,
- (int)hist->buckets[i].lower.tv_usec,
- (int)hist->buckets[i].upper.tv_sec,
- (int)hist->buckets[i].upper.tv_usec,
- (unsigned)hist->buckets[i].count);
- }
- }
-#endif
-}
-
-/** total number in histogram */
-static size_t
-timehist_count(struct timehist* hist)
-{
- size_t i, res = 0;
- for(i=0; i<hist->num; i++)
- res += hist->buckets[i].count;
- return res;
-}
-
-double
-timehist_quartile(struct timehist* hist, double q)
-{
- double lookfor, passed, res;
- double low = 0, up = 0;
- size_t i;
- if(!hist || hist->num == 0)
- return 0.;
- /* look for i'th element, interpolated */
- lookfor = (double)timehist_count(hist);
- if(lookfor < 4)
- return 0.; /* not enough elements for a good estimate */
- lookfor *= q;
- passed = 0;
- i = 0;
- while(i+1 < hist->num &&
- passed+(double)hist->buckets[i].count < lookfor) {
- passed += (double)hist->buckets[i++].count;
- }
- /* got the right bucket */
-#ifndef S_SPLINT_S
- low = (double)hist->buckets[i].lower.tv_sec +
- (double)hist->buckets[i].lower.tv_usec/1000000.;
- up = (double)hist->buckets[i].upper.tv_sec +
- (double)hist->buckets[i].upper.tv_usec/1000000.;
-#endif
- res = (lookfor - passed)*(up-low)/((double)hist->buckets[i].count);
- return low+res;
-}
-
-void
-timehist_export(struct timehist* hist, size_t* array, size_t sz)
-{
- size_t i;
- if(!hist) return;
- if(sz > hist->num)
- sz = hist->num;
- for(i=0; i<sz; i++)
- array[i] = hist->buckets[i].count;
-}
-
-void
-timehist_import(struct timehist* hist, size_t* array, size_t sz)
-{
- size_t i;
- if(!hist) return;
- if(sz > hist->num)
- sz = hist->num;
- for(i=0; i<sz; i++)
- hist->buckets[i].count = array[i];
-}
diff --git a/external/unbound/util/timehist.h b/external/unbound/util/timehist.h
deleted file mode 100644
index 5c65048b9..000000000
--- a/external/unbound/util/timehist.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * util/timehist.h - make histogram of time values.
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains functions to make a histogram of time values.
- */
-
-#ifndef UTIL_TIMEHIST_H
-#define UTIL_TIMEHIST_H
-
-/** Number of buckets in a histogram */
-#define NUM_BUCKETS_HIST 40
-
-/**
- * Bucket of time history information
- */
-struct th_buck {
- /** lower bound */
- struct timeval lower;
- /** upper bound */
- struct timeval upper;
- /** number of items */
- size_t count;
-};
-
-/**
- * Keep histogram of time values.
- */
-struct timehist {
- /** number of buckets */
- size_t num;
- /** bucket array */
- struct th_buck* buckets;
-};
-
-/**
- * Setup a histogram, default
- * @return histogram or NULL on malloc failure.
- */
-struct timehist* timehist_setup(void);
-
-/**
- * Delete histogram
- * @param hist: to delete
- */
-void timehist_delete(struct timehist* hist);
-
-/**
- * Clear histogram
- * @param hist: to clear all data from
- */
-void timehist_clear(struct timehist* hist);
-
-/**
- * Add time value to histogram.
- * @param hist: histogram
- * @param tv: time value
- */
-void timehist_insert(struct timehist* hist, struct timeval* tv);
-
-/**
- * Find time value for given quartile, such as 0.25, 0.50, 0.75.
- * The looks up the value for the i-th element in the sorted list of time
- * values, as approximated using the histogram.
- * @param hist: histogram. Interpolated information is used from it.
- * @param q: quartile, 0.50 results in the median. Must be >0 and <1.
- * @return: the time in seconds for that percentage.
- */
-double timehist_quartile(struct timehist* hist, double q);
-
-/**
- * Printout histogram
- * @param hist: histogram
- */
-void timehist_print(struct timehist* hist);
-
-/**
- * Log histogram, print it to the logfile.
- * @param hist: histogram
- * @param name: the name of the value column
- */
-void timehist_log(struct timehist* hist, const char* name);
-
-/**
- * Export histogram to an array.
- * @param hist: histogram
- * @param array: the array to export to.
- * @param sz: number of items in array.
- */
-void timehist_export(struct timehist* hist, size_t* array, size_t sz);
-
-/**
- * Import histogram from an array.
- * @param hist: histogram
- * @param array: the array to import from.
- * @param sz: number of items in array.
- */
-void timehist_import(struct timehist* hist, size_t* array, size_t sz);
-
-#endif /* UTIL_TIMEHIST_H */
diff --git a/external/unbound/util/tube.c b/external/unbound/util/tube.c
deleted file mode 100644
index f42d22cb3..000000000
--- a/external/unbound/util/tube.c
+++ /dev/null
@@ -1,731 +0,0 @@
-/*
- * util/tube.c - pipe service
- *
- * Copyright (c) 2008, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains pipe service functions.
- */
-#include "config.h"
-#include "util/tube.h"
-#include "util/log.h"
-#include "util/net_help.h"
-#include "util/netevent.h"
-#include "util/fptr_wlist.h"
-#include "util/ub_event.h"
-
-#ifndef USE_WINSOCK
-/* on unix */
-
-#ifndef HAVE_SOCKETPAIR
-/** no socketpair() available, like on Minix 3.1.7, use pipe */
-#define socketpair(f, t, p, sv) pipe(sv)
-#endif /* HAVE_SOCKETPAIR */
-
-struct tube* tube_create(void)
-{
- struct tube* tube = (struct tube*)calloc(1, sizeof(*tube));
- int sv[2];
- if(!tube) {
- int err = errno;
- log_err("tube_create: out of memory");
- errno = err;
- return NULL;
- }
- tube->sr = -1;
- tube->sw = -1;
- if(socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) {
- int err = errno;
- log_err("socketpair: %s", strerror(errno));
- free(tube);
- errno = err;
- return NULL;
- }
- tube->sr = sv[0];
- tube->sw = sv[1];
- if(!fd_set_nonblock(tube->sr) || !fd_set_nonblock(tube->sw)) {
- int err = errno;
- log_err("tube: cannot set nonblocking");
- tube_delete(tube);
- errno = err;
- return NULL;
- }
- return tube;
-}
-
-void tube_delete(struct tube* tube)
-{
- if(!tube) return;
- tube_remove_bg_listen(tube);
- tube_remove_bg_write(tube);
- /* close fds after deleting commpoints, to be sure.
- * Also epoll does not like closing fd before event_del */
- tube_close_read(tube);
- tube_close_write(tube);
- free(tube);
-}
-
-void tube_close_read(struct tube* tube)
-{
- if(tube->sr != -1) {
- close(tube->sr);
- tube->sr = -1;
- }
-}
-
-void tube_close_write(struct tube* tube)
-{
- if(tube->sw != -1) {
- close(tube->sw);
- tube->sw = -1;
- }
-}
-
-void tube_remove_bg_listen(struct tube* tube)
-{
- if(tube->listen_com) {
- comm_point_delete(tube->listen_com);
- tube->listen_com = NULL;
- }
- free(tube->cmd_msg);
- tube->cmd_msg = NULL;
-}
-
-void tube_remove_bg_write(struct tube* tube)
-{
- if(tube->res_com) {
- comm_point_delete(tube->res_com);
- tube->res_com = NULL;
- }
- if(tube->res_list) {
- struct tube_res_list* np, *p = tube->res_list;
- tube->res_list = NULL;
- tube->res_last = NULL;
- while(p) {
- np = p->next;
- free(p->buf);
- free(p);
- p = np;
- }
- }
-}
-
-int
-tube_handle_listen(struct comm_point* c, void* arg, int error,
- struct comm_reply* ATTR_UNUSED(reply_info))
-{
- struct tube* tube = (struct tube*)arg;
- ssize_t r;
- if(error != NETEVENT_NOERROR) {
- fptr_ok(fptr_whitelist_tube_listen(tube->listen_cb));
- (*tube->listen_cb)(tube, NULL, 0, error, tube->listen_arg);
- return 0;
- }
-
- if(tube->cmd_read < sizeof(tube->cmd_len)) {
- /* complete reading the length of control msg */
- r = read(c->fd, ((uint8_t*)&tube->cmd_len) + tube->cmd_read,
- sizeof(tube->cmd_len) - tube->cmd_read);
- if(r==0) {
- /* error has happened or */
- /* parent closed pipe, must have exited somehow */
- fptr_ok(fptr_whitelist_tube_listen(tube->listen_cb));
- (*tube->listen_cb)(tube, NULL, 0, NETEVENT_CLOSED,
- tube->listen_arg);
- return 0;
- }
- if(r==-1) {
- if(errno != EAGAIN && errno != EINTR) {
- log_err("rpipe error: %s", strerror(errno));
- }
- /* nothing to read now, try later */
- return 0;
- }
- tube->cmd_read += r;
- if(tube->cmd_read < sizeof(tube->cmd_len)) {
- /* not complete, try later */
- return 0;
- }
- tube->cmd_msg = (uint8_t*)calloc(1, tube->cmd_len);
- if(!tube->cmd_msg) {
- log_err("malloc failure");
- tube->cmd_read = 0;
- return 0;
- }
- }
- /* cmd_len has been read, read remainder */
- r = read(c->fd, tube->cmd_msg+tube->cmd_read-sizeof(tube->cmd_len),
- tube->cmd_len - (tube->cmd_read - sizeof(tube->cmd_len)));
- if(r==0) {
- /* error has happened or */
- /* parent closed pipe, must have exited somehow */
- fptr_ok(fptr_whitelist_tube_listen(tube->listen_cb));
- (*tube->listen_cb)(tube, NULL, 0, NETEVENT_CLOSED,
- tube->listen_arg);
- return 0;
- }
- if(r==-1) {
- /* nothing to read now, try later */
- if(errno != EAGAIN && errno != EINTR) {
- log_err("rpipe error: %s", strerror(errno));
- }
- return 0;
- }
- tube->cmd_read += r;
- if(tube->cmd_read < sizeof(tube->cmd_len) + tube->cmd_len) {
- /* not complete, try later */
- return 0;
- }
- tube->cmd_read = 0;
-
- fptr_ok(fptr_whitelist_tube_listen(tube->listen_cb));
- (*tube->listen_cb)(tube, tube->cmd_msg, tube->cmd_len,
- NETEVENT_NOERROR, tube->listen_arg);
- /* also frees the buf */
- tube->cmd_msg = NULL;
- return 0;
-}
-
-int
-tube_handle_write(struct comm_point* c, void* arg, int error,
- struct comm_reply* ATTR_UNUSED(reply_info))
-{
- struct tube* tube = (struct tube*)arg;
- struct tube_res_list* item = tube->res_list;
- ssize_t r;
- if(error != NETEVENT_NOERROR) {
- log_err("tube_handle_write net error %d", error);
- return 0;
- }
-
- if(!item) {
- comm_point_stop_listening(c);
- return 0;
- }
-
- if(tube->res_write < sizeof(item->len)) {
- r = write(c->fd, ((uint8_t*)&item->len) + tube->res_write,
- sizeof(item->len) - tube->res_write);
- if(r == -1) {
- if(errno != EAGAIN && errno != EINTR) {
- log_err("wpipe error: %s", strerror(errno));
- }
- return 0; /* try again later */
- }
- if(r == 0) {
- /* error on pipe, must have exited somehow */
- /* cannot signal this to pipe user */
- return 0;
- }
- tube->res_write += r;
- if(tube->res_write < sizeof(item->len))
- return 0;
- }
- r = write(c->fd, item->buf + tube->res_write - sizeof(item->len),
- item->len - (tube->res_write - sizeof(item->len)));
- if(r == -1) {
- if(errno != EAGAIN && errno != EINTR) {
- log_err("wpipe error: %s", strerror(errno));
- }
- return 0; /* try again later */
- }
- if(r == 0) {
- /* error on pipe, must have exited somehow */
- /* cannot signal this to pipe user */
- return 0;
- }
- tube->res_write += r;
- if(tube->res_write < sizeof(item->len) + item->len)
- return 0;
- /* done this result, remove it */
- free(item->buf);
- item->buf = NULL;
- tube->res_list = tube->res_list->next;
- free(item);
- if(!tube->res_list) {
- tube->res_last = NULL;
- comm_point_stop_listening(c);
- }
- tube->res_write = 0;
- return 0;
-}
-
-int tube_write_msg(struct tube* tube, uint8_t* buf, uint32_t len,
- int nonblock)
-{
- ssize_t r, d;
- int fd = tube->sw;
-
- /* test */
- if(nonblock) {
- r = write(fd, &len, sizeof(len));
- if(r == -1) {
- if(errno==EINTR || errno==EAGAIN)
- return -1;
- log_err("tube msg write failed: %s", strerror(errno));
- return -1; /* can still continue, perhaps */
- }
- } else r = 0;
- if(!fd_set_block(fd))
- return 0;
- /* write remainder */
- d = r;
- while(d != (ssize_t)sizeof(len)) {
- if((r=write(fd, ((char*)&len)+d, sizeof(len)-d)) == -1) {
- if(errno == EAGAIN)
- continue; /* temporarily unavail: try again*/
- log_err("tube msg write failed: %s", strerror(errno));
- (void)fd_set_nonblock(fd);
- return 0;
- }
- d += r;
- }
- d = 0;
- while(d != (ssize_t)len) {
- if((r=write(fd, buf+d, len-d)) == -1) {
- if(errno == EAGAIN)
- continue; /* temporarily unavail: try again*/
- log_err("tube msg write failed: %s", strerror(errno));
- (void)fd_set_nonblock(fd);
- return 0;
- }
- d += r;
- }
- if(!fd_set_nonblock(fd))
- return 0;
- return 1;
-}
-
-int tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len,
- int nonblock)
-{
- ssize_t r, d;
- int fd = tube->sr;
-
- /* test */
- *len = 0;
- if(nonblock) {
- r = read(fd, len, sizeof(*len));
- if(r == -1) {
- if(errno==EINTR || errno==EAGAIN)
- return -1;
- log_err("tube msg read failed: %s", strerror(errno));
- return -1; /* we can still continue, perhaps */
- }
- if(r == 0) /* EOF */
- return 0;
- } else r = 0;
- if(!fd_set_block(fd))
- return 0;
- /* read remainder */
- d = r;
- while(d != (ssize_t)sizeof(*len)) {
- if((r=read(fd, ((char*)len)+d, sizeof(*len)-d)) == -1) {
- log_err("tube msg read failed: %s", strerror(errno));
- (void)fd_set_nonblock(fd);
- return 0;
- }
- if(r == 0) /* EOF */ {
- (void)fd_set_nonblock(fd);
- return 0;
- }
- d += r;
- }
- log_assert(*len < 65536*2);
- *buf = (uint8_t*)malloc(*len);
- if(!*buf) {
- log_err("tube read out of memory");
- (void)fd_set_nonblock(fd);
- return 0;
- }
- d = 0;
- while(d < (ssize_t)*len) {
- if((r=read(fd, (*buf)+d, (size_t)((ssize_t)*len)-d)) == -1) {
- log_err("tube msg read failed: %s", strerror(errno));
- (void)fd_set_nonblock(fd);
- free(*buf);
- return 0;
- }
- if(r == 0) { /* EOF */
- (void)fd_set_nonblock(fd);
- free(*buf);
- return 0;
- }
- d += r;
- }
- if(!fd_set_nonblock(fd)) {
- free(*buf);
- return 0;
- }
- return 1;
-}
-
-/** perform a select() on the fd */
-static int
-pollit(int fd, struct timeval* t)
-{
- fd_set r;
-#ifndef S_SPLINT_S
- FD_ZERO(&r);
- FD_SET(FD_SET_T fd, &r);
-#endif
- if(select(fd+1, &r, NULL, NULL, t) == -1) {
- return 0;
- }
- errno = 0;
- return (int)(FD_ISSET(fd, &r));
-}
-
-int tube_poll(struct tube* tube)
-{
- struct timeval t;
- memset(&t, 0, sizeof(t));
- return pollit(tube->sr, &t);
-}
-
-int tube_wait(struct tube* tube)
-{
- return pollit(tube->sr, NULL);
-}
-
-int tube_read_fd(struct tube* tube)
-{
- return tube->sr;
-}
-
-int tube_setup_bg_listen(struct tube* tube, struct comm_base* base,
- tube_callback_type* cb, void* arg)
-{
- tube->listen_cb = cb;
- tube->listen_arg = arg;
- if(!(tube->listen_com = comm_point_create_raw(base, tube->sr,
- 0, tube_handle_listen, tube))) {
- int err = errno;
- log_err("tube_setup_bg_l: commpoint creation failed");
- errno = err;
- return 0;
- }
- return 1;
-}
-
-int tube_setup_bg_write(struct tube* tube, struct comm_base* base)
-{
- if(!(tube->res_com = comm_point_create_raw(base, tube->sw,
- 1, tube_handle_write, tube))) {
- int err = errno;
- log_err("tube_setup_bg_w: commpoint creation failed");
- errno = err;
- return 0;
- }
- return 1;
-}
-
-int tube_queue_item(struct tube* tube, uint8_t* msg, size_t len)
-{
- struct tube_res_list* item =
- (struct tube_res_list*)malloc(sizeof(*item));
- if(!item) {
- free(msg);
- log_err("out of memory for async answer");
- return 0;
- }
- item->buf = msg;
- item->len = len;
- item->next = NULL;
- /* add at back of list, since the first one may be partially written */
- if(tube->res_last)
- tube->res_last->next = item;
- else tube->res_list = item;
- tube->res_last = item;
- if(tube->res_list == tube->res_last) {
- /* first added item, start the write process */
- comm_point_start_listening(tube->res_com, -1, -1);
- }
- return 1;
-}
-
-void tube_handle_signal(int ATTR_UNUSED(fd), short ATTR_UNUSED(events),
- void* ATTR_UNUSED(arg))
-{
- log_assert(0);
-}
-
-#else /* USE_WINSOCK */
-/* on windows */
-
-
-struct tube* tube_create(void)
-{
- /* windows does not have forks like unix, so we only support
- * threads on windows. And thus the pipe need only connect
- * threads. We use a mutex and a list of datagrams. */
- struct tube* tube = (struct tube*)calloc(1, sizeof(*tube));
- if(!tube) {
- int err = errno;
- log_err("tube_create: out of memory");
- errno = err;
- return NULL;
- }
- tube->event = WSACreateEvent();
- if(tube->event == WSA_INVALID_EVENT) {
- free(tube);
- log_err("WSACreateEvent: %s", wsa_strerror(WSAGetLastError()));
- }
- if(!WSAResetEvent(tube->event)) {
- log_err("WSAResetEvent: %s", wsa_strerror(WSAGetLastError()));
- }
- lock_basic_init(&tube->res_lock);
- verbose(VERB_ALGO, "tube created");
- return tube;
-}
-
-void tube_delete(struct tube* tube)
-{
- if(!tube) return;
- tube_remove_bg_listen(tube);
- tube_remove_bg_write(tube);
- tube_close_read(tube);
- tube_close_write(tube);
- if(!WSACloseEvent(tube->event))
- log_err("WSACloseEvent: %s", wsa_strerror(WSAGetLastError()));
- lock_basic_destroy(&tube->res_lock);
- verbose(VERB_ALGO, "tube deleted");
- free(tube);
-}
-
-void tube_close_read(struct tube* ATTR_UNUSED(tube))
-{
- verbose(VERB_ALGO, "tube close_read");
-}
-
-void tube_close_write(struct tube* ATTR_UNUSED(tube))
-{
- verbose(VERB_ALGO, "tube close_write");
- /* wake up waiting reader with an empty queue */
- if(!WSASetEvent(tube->event)) {
- log_err("WSASetEvent: %s", wsa_strerror(WSAGetLastError()));
- }
-}
-
-void tube_remove_bg_listen(struct tube* tube)
-{
- verbose(VERB_ALGO, "tube remove_bg_listen");
- ub_winsock_unregister_wsaevent(tube->ev_listen);
-}
-
-void tube_remove_bg_write(struct tube* tube)
-{
- verbose(VERB_ALGO, "tube remove_bg_write");
- if(tube->res_list) {
- struct tube_res_list* np, *p = tube->res_list;
- tube->res_list = NULL;
- tube->res_last = NULL;
- while(p) {
- np = p->next;
- free(p->buf);
- free(p);
- p = np;
- }
- }
-}
-
-int tube_write_msg(struct tube* tube, uint8_t* buf, uint32_t len,
- int ATTR_UNUSED(nonblock))
-{
- uint8_t* a;
- verbose(VERB_ALGO, "tube write_msg len %d", (int)len);
- a = (uint8_t*)memdup(buf, len);
- if(!a) {
- log_err("out of memory in tube_write_msg");
- return 0;
- }
- /* always nonblocking, this pipe cannot get full */
- return tube_queue_item(tube, a, len);
-}
-
-int tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len,
- int nonblock)
-{
- struct tube_res_list* item = NULL;
- verbose(VERB_ALGO, "tube read_msg %s", nonblock?"nonblock":"blocking");
- *buf = NULL;
- if(!tube_poll(tube)) {
- verbose(VERB_ALGO, "tube read_msg nodata");
- /* nothing ready right now, wait if we want to */
- if(nonblock)
- return -1; /* would block waiting for items */
- if(!tube_wait(tube))
- return 0;
- }
- lock_basic_lock(&tube->res_lock);
- if(tube->res_list) {
- item = tube->res_list;
- tube->res_list = item->next;
- if(tube->res_last == item) {
- /* the list is now empty */
- tube->res_last = NULL;
- verbose(VERB_ALGO, "tube read_msg lastdata");
- if(!WSAResetEvent(tube->event)) {
- log_err("WSAResetEvent: %s",
- wsa_strerror(WSAGetLastError()));
- }
- }
- }
- lock_basic_unlock(&tube->res_lock);
- if(!item)
- return 0; /* would block waiting for items */
- *buf = item->buf;
- *len = item->len;
- free(item);
- verbose(VERB_ALGO, "tube read_msg len %d", (int)*len);
- return 1;
-}
-
-int tube_poll(struct tube* tube)
-{
- struct tube_res_list* item = NULL;
- lock_basic_lock(&tube->res_lock);
- item = tube->res_list;
- lock_basic_unlock(&tube->res_lock);
- if(item)
- return 1;
- return 0;
-}
-
-int tube_wait(struct tube* tube)
-{
- /* block on eventhandle */
- DWORD res = WSAWaitForMultipleEvents(
- 1 /* one event in array */,
- &tube->event /* the event to wait for, our pipe signal */,
- 0 /* wait for all events is false */,
- WSA_INFINITE /* wait, no timeout */,
- 0 /* we are not alertable for IO completion routines */
- );
- if(res == WSA_WAIT_TIMEOUT) {
- return 0;
- }
- if(res == WSA_WAIT_IO_COMPLETION) {
- /* a bit unexpected, since we were not alertable */
- return 0;
- }
- return 1;
-}
-
-int tube_read_fd(struct tube* ATTR_UNUSED(tube))
-{
- /* nothing sensible on Windows */
- return -1;
-}
-
-int
-tube_handle_listen(struct comm_point* ATTR_UNUSED(c), void* ATTR_UNUSED(arg),
- int ATTR_UNUSED(error), struct comm_reply* ATTR_UNUSED(reply_info))
-{
- log_assert(0);
- return 0;
-}
-
-int
-tube_handle_write(struct comm_point* ATTR_UNUSED(c), void* ATTR_UNUSED(arg),
- int ATTR_UNUSED(error), struct comm_reply* ATTR_UNUSED(reply_info))
-{
- log_assert(0);
- return 0;
-}
-
-int tube_setup_bg_listen(struct tube* tube, struct comm_base* base,
- tube_callback_type* cb, void* arg)
-{
- tube->listen_cb = cb;
- tube->listen_arg = arg;
- if(!comm_base_internal(base))
- return 1; /* ignore when no comm base - testing */
- tube->ev_listen = ub_winsock_register_wsaevent(
- comm_base_internal(base), tube->event, &tube_handle_signal, tube);
- return tube->ev_listen ? 1 : 0;
-}
-
-int tube_setup_bg_write(struct tube* ATTR_UNUSED(tube),
- struct comm_base* ATTR_UNUSED(base))
-{
- /* the queue item routine performs the signaling */
- return 1;
-}
-
-int tube_queue_item(struct tube* tube, uint8_t* msg, size_t len)
-{
- struct tube_res_list* item =
- (struct tube_res_list*)malloc(sizeof(*item));
- verbose(VERB_ALGO, "tube queue_item len %d", (int)len);
- if(!item) {
- free(msg);
- log_err("out of memory for async answer");
- return 0;
- }
- item->buf = msg;
- item->len = len;
- item->next = NULL;
- lock_basic_lock(&tube->res_lock);
- /* add at back of list, since the first one may be partially written */
- if(tube->res_last)
- tube->res_last->next = item;
- else tube->res_list = item;
- tube->res_last = item;
- /* signal the eventhandle */
- if(!WSASetEvent(tube->event)) {
- log_err("WSASetEvent: %s", wsa_strerror(WSAGetLastError()));
- }
- lock_basic_unlock(&tube->res_lock);
- return 1;
-}
-
-void tube_handle_signal(int ATTR_UNUSED(fd), short ATTR_UNUSED(events),
- void* arg)
-{
- struct tube* tube = (struct tube*)arg;
- uint8_t* buf;
- uint32_t len = 0;
- verbose(VERB_ALGO, "tube handle_signal");
- while(tube_poll(tube)) {
- if(tube_read_msg(tube, &buf, &len, 1)) {
- fptr_ok(fptr_whitelist_tube_listen(tube->listen_cb));
- (*tube->listen_cb)(tube, buf, len, NETEVENT_NOERROR,
- tube->listen_arg);
- }
- }
-}
-
-#endif /* USE_WINSOCK */
diff --git a/external/unbound/util/tube.h b/external/unbound/util/tube.h
deleted file mode 100644
index 5b1fdb8e8..000000000
--- a/external/unbound/util/tube.h
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * util/tube.h - pipe service
- *
- * Copyright (c) 2008, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains pipe service functions.
- */
-
-#ifndef UTIL_TUBE_H
-#define UTIL_TUBE_H
-struct comm_reply;
-struct comm_point;
-struct comm_base;
-struct tube;
-struct tube_res_list;
-#ifdef USE_WINSOCK
-#include "util/locks.h"
-#endif
-
-/**
- * Callback from pipe listen function
- * void mycallback(tube, msg, len, error, user_argument);
- * if error is true (NETEVENT_*), msg is probably NULL.
- */
-typedef void tube_callback_type(struct tube*, uint8_t*, size_t, int, void*);
-
-/**
- * A pipe
- */
-struct tube {
-#ifndef USE_WINSOCK
- /** pipe end to read from */
- int sr;
- /** pipe end to write on */
- int sw;
-
- /** listen commpoint */
- struct comm_point* listen_com;
- /** listen callback */
- tube_callback_type* listen_cb;
- /** listen callback user arg */
- void* listen_arg;
- /** are we currently reading a command, 0 if not, else bytecount */
- size_t cmd_read;
- /** size of current read command, may be partially read */
- uint32_t cmd_len;
- /** the current read command content, malloced, can be partially read*/
- uint8_t* cmd_msg;
-
- /** background write queue, commpoint to write results back */
- struct comm_point* res_com;
- /** are we currently writing a result, 0 if not, else bytecount into
- * the res_list first entry. */
- size_t res_write;
- /** list of outstanding results to be written back */
- struct tube_res_list* res_list;
- /** last in list */
- struct tube_res_list* res_last;
-
-#else /* USE_WINSOCK */
- /** listen callback */
- tube_callback_type* listen_cb;
- /** listen callback user arg */
- void* listen_arg;
- /** the windows sockets event (signaled if items in pipe) */
- WSAEVENT event;
- /** winsock event storage when registered with event base */
- struct ub_event* ev_listen;
-
- /** lock on the list of outstanding items */
- lock_basic_type res_lock;
- /** list of outstanding results on pipe */
- struct tube_res_list* res_list;
- /** last in list */
- struct tube_res_list* res_last;
-#endif /* USE_WINSOCK */
-};
-
-/**
- * List of results (arbitrary command serializations) to write back
- */
-struct tube_res_list {
- /** next in list */
- struct tube_res_list* next;
- /** serialized buffer to write */
- uint8_t* buf;
- /** length to write */
- uint32_t len;
-};
-
-/**
- * Create a pipe
- * @return: new tube struct or NULL on error.
- */
-struct tube* tube_create(void);
-
-/**
- * Delete and destroy a pipe
- * @param tube: to delete
- */
-void tube_delete(struct tube* tube);
-
-/**
- * Write length bytes followed by message.
- * @param tube: the tube to write on.
- * If that tube is a pipe, its write fd is used as
- * the socket to write on. Is nonblocking.
- * Set to blocking by the function,
- * and back to non-blocking at exit of function.
- * @param buf: the message.
- * @param len: length of message.
- * @param nonblock: if set to true, the first write is nonblocking.
- * If the first write fails the function returns -1.
- * If set false, the first write is blocking.
- * @return: all remainder writes are nonblocking.
- * return 0 on error, in that case blocking/nonblocking of socket is
- * unknown.
- * return 1 if all OK.
- */
-int tube_write_msg(struct tube* tube, uint8_t* buf, uint32_t len,
- int nonblock);
-
-/**
- * Read length bytes followed by message.
- * @param tube: The tube to read on.
- * If that tube is a pipe, its read fd is used as
- * the socket to read on. Is nonblocking.
- * Set to blocking by the function,
- * and back to non-blocking at exit of function.
- * @param buf: the message, malloced.
- * @param len: length of message, returned.
- * @param nonblock: if set to true, the first read is nonblocking.
- * If the first read fails the function returns -1.
- * If set false, the first read is blocking.
- * @return: all remainder reads are nonblocking.
- * return 0 on error, in that case blocking/nonblocking of socket is
- * unknown. On EOF 0 is returned.
- * return 1 if all OK.
- */
-int tube_read_msg(struct tube* tube, uint8_t** buf, uint32_t* len,
- int nonblock);
-
-/**
- * Close read part of the pipe.
- * The tube can no longer be read from.
- * @param tube: tube to operate on.
- */
-void tube_close_read(struct tube* tube);
-
-/**
- * Close write part of the pipe.
- * The tube can no longer be written to.
- * @param tube: tube to operate on.
- */
-void tube_close_write(struct tube* tube);
-
-/**
- * See if data is ready for reading on the tube without blocking.
- * @param tube: tube to check for readable items
- * @return true if readable items are present. False if not (or error).
- * true on pipe_closed.
- */
-int tube_poll(struct tube* tube);
-
-/**
- * Wait for data to be ready for reading on the tube. is blocking.
- * No timeout.
- * @param tube: the tube to wait on.
- * @return: if there was something to read (false on error).
- * true on pipe_closed.
- */
-int tube_wait(struct tube* tube);
-
-/**
- * Get FD that is readable when new information arrives.
- * @param tube
- * @return file descriptor.
- */
-int tube_read_fd(struct tube* tube);
-
-/**
- * Start listening for information over the pipe.
- * Background registration of a read listener, callback when read completed.
- * Do not mix with tube_read_msg style direct reads from the pipe.
- * @param tube: tube to listen on
- * @param base: what base to register event callback.
- * @param cb: callback routine.
- * @param arg: user argument for callback routine.
- * @return true if successful, false on error.
- */
-int tube_setup_bg_listen(struct tube* tube, struct comm_base* base,
- tube_callback_type* cb, void* arg);
-
-/**
- * Remove bg listen setup from event base.
- * @param tube: what tube to cleanup
- */
-void tube_remove_bg_listen(struct tube* tube);
-
-/**
- * Start background write handler for the pipe.
- * Do not mix with tube_write_msg style direct writes to the pipe.
- * @param tube: tube to write on
- * @param base: what base to register event handler on.
- * @return true if successful, false on error.
- */
-int tube_setup_bg_write(struct tube* tube, struct comm_base* base);
-
-/**
- * Remove bg write setup from event base.
- * @param tube: what tube to cleanup
- */
-void tube_remove_bg_write(struct tube* tube);
-
-
-/**
- * Append data item to background list of writes.
- * Mallocs a list entry behind the scenes.
- * Not locked behind the scenes, call from one thread or lock on outside.
- * @param tube: what tube to queue on.
- * @param msg: memory message to send. Is free()d after use.
- * Put at the end of the to-send queue.
- * @param len: length of item.
- * @return 0 on failure (msg freed).
- */
-int tube_queue_item(struct tube* tube, uint8_t* msg, size_t len);
-
-/** for fptr wlist, callback function */
-int tube_handle_listen(struct comm_point* c, void* arg, int error,
- struct comm_reply* reply_info);
-
-/** for fptr wlist, callback function */
-int tube_handle_write(struct comm_point* c, void* arg, int error,
- struct comm_reply* reply_info);
-
-/** for fptr wlist, winsock signal event callback function */
-void tube_handle_signal(int fd, short events, void* arg);
-
-#endif /* UTIL_TUBE_H */
diff --git a/external/unbound/util/ub_event.c b/external/unbound/util/ub_event.c
deleted file mode 100644
index 3b92be1a3..000000000
--- a/external/unbound/util/ub_event.c
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- * util/ub_event.c - directly call libevent (compatability) functions
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains and implementation for the indirection layer for pluggable
- * events that transparently passes it either directly to libevent, or calls
- * the libevent compatibility layer functions.
- */
-#include "config.h"
-#include <sys/time.h>
-#include "util/ub_event.h"
-#include "util/log.h"
-#include "util/netevent.h"
-#include "util/tube.h"
-
-/* We define libevent structures here to hide the libevent stuff. */
-
-#ifdef USE_MINI_EVENT
-# ifdef USE_WINSOCK
-# include "util/winsock_event.h"
-# else
-# include "util/mini_event.h"
-# endif /* USE_WINSOCK */
-#else /* USE_MINI_EVENT */
- /* we use libevent */
-# ifdef HAVE_EVENT_H
-# include <event.h>
-# else
-# include "event2/event.h"
-# include "event2/event_struct.h"
-# include "event2/event_compat.h"
-# endif
-#endif /* USE_MINI_EVENT */
-
-#if UB_EV_TIMEOUT != EV_TIMEOUT || UB_EV_READ != EV_READ || \
- UB_EV_WRITE != EV_WRITE || UB_EV_SIGNAL != EV_SIGNAL || \
- UB_EV_PERSIST != EV_PERSIST
-/* Only necessary for libev */
-# define NATIVE_BITS(b) ( \
- (((b) & UB_EV_TIMEOUT) ? EV_TIMEOUT : 0) \
- | (((b) & UB_EV_READ ) ? EV_READ : 0) \
- | (((b) & UB_EV_WRITE ) ? EV_WRITE : 0) \
- | (((b) & UB_EV_SIGNAL ) ? EV_SIGNAL : 0) \
- | (((b) & UB_EV_PERSIST) ? EV_PERSIST : 0))
-
-# define UB_EV_BITS(b) ( \
- (((b) & EV_TIMEOUT) ? UB_EV_TIMEOUT : 0) \
- | (((b) & EV_READ ) ? UB_EV_READ : 0) \
- | (((b) & EV_WRITE ) ? UB_EV_WRITE : 0) \
- | (((b) & EV_SIGNAL ) ? UB_EV_SIGNAL : 0) \
- | (((b) & EV_PERSIST) ? UB_EV_PERSIST : 0))
-
-# define UB_EV_BITS_CB(C) void my_ ## C (int fd, short bits, void *arg) \
- { (C)(fd, UB_EV_BITS(bits), arg); }
-
-UB_EV_BITS_CB(comm_point_udp_callback);
-UB_EV_BITS_CB(comm_point_udp_ancil_callback)
-UB_EV_BITS_CB(comm_point_tcp_accept_callback)
-UB_EV_BITS_CB(comm_point_tcp_handle_callback)
-UB_EV_BITS_CB(comm_timer_callback)
-UB_EV_BITS_CB(comm_signal_callback)
-UB_EV_BITS_CB(comm_point_local_handle_callback)
-UB_EV_BITS_CB(comm_point_raw_handle_callback)
-UB_EV_BITS_CB(tube_handle_signal)
-UB_EV_BITS_CB(comm_base_handle_slow_accept)
-
-static void (*NATIVE_BITS_CB(void (*cb)(int, short, void*)))(int, short, void*)
-{
- if(cb == comm_point_udp_callback)
- return my_comm_point_udp_callback;
- else if(cb == comm_point_udp_ancil_callback)
- return my_comm_point_udp_ancil_callback;
- else if(cb == comm_point_tcp_accept_callback)
- return my_comm_point_tcp_accept_callback;
- else if(cb == comm_point_tcp_handle_callback)
- return my_comm_point_tcp_handle_callback;
- else if(cb == comm_timer_callback)
- return my_comm_timer_callback;
- else if(cb == comm_signal_callback)
- return my_comm_signal_callback;
- else if(cb == comm_point_local_handle_callback)
- return my_comm_point_local_handle_callback;
- else if(cb == comm_point_raw_handle_callback)
- return my_comm_point_raw_handle_callback;
- else if(cb == tube_handle_signal)
- return my_tube_handle_signal;
- else if(cb == comm_base_handle_slow_accept)
- return my_comm_base_handle_slow_accept;
- else
- return NULL;
-}
-#else
-# define NATIVE_BITS(b) (b)
-# define NATIVE_BITS_CB(c) (c)
-#endif
-
-#ifndef EVFLAG_AUTO
-#define EVFLAG_AUTO 0
-#endif
-
-#define AS_EVENT_BASE(x) ((struct event_base*)x)
-#define AS_UB_EVENT_BASE(x) ((struct ub_event_base*)x)
-#define AS_EVENT(x) ((struct event*)x)
-#define AS_UB_EVENT(x) ((struct ub_event*)x)
-
-const char* ub_event_get_version(void)
-{
- return event_get_version();
-}
-
-#if (defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)) && defined(EVBACKEND_SELECT)
-static const char* ub_ev_backend2str(int b)
-{
- switch(b) {
- case EVBACKEND_SELECT: return "select";
- case EVBACKEND_POLL: return "poll";
- case EVBACKEND_EPOLL: return "epoll";
- case EVBACKEND_KQUEUE: return "kqueue";
- case EVBACKEND_DEVPOLL: return "devpoll";
- case EVBACKEND_PORT: return "evport";
- }
- return "unknown";
-}
-#endif
-
-void
-ub_get_event_sys(struct ub_event_base* base, const char** n, const char** s,
- const char** m)
-{
-#ifdef USE_WINSOCK
- (void)base;
- *n = "event";
- *s = "winsock";
- *m = "WSAWaitForMultipleEvents";
-#elif defined(USE_MINI_EVENT)
- (void)base;
- *n = "mini-event";
- *s = "internal";
- *m = "select";
-#else
- struct event_base* b = AS_EVENT_BASE(base);
- *s = event_get_version();
-# if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)
- *n = "libev";
- if (!b)
- b = (struct event_base*)ev_default_loop(EVFLAG_AUTO);
-# ifdef EVBACKEND_SELECT
- *m = ub_ev_backend2str(ev_backend((struct ev_loop*)b));
-# else
- *m = "not obtainable";
-# endif
-# elif defined(HAVE_EVENT_BASE_GET_METHOD)
- *n = "libevent";
- if (!b)
- b = event_base_new();
- *m = event_base_get_method(b);
-# else
- *n = "unknown";
- *m = "not obtainable";
- (void)b;
-# endif
-# ifdef HAVE_EVENT_BASE_FREE
- if (b && b != AS_EVENT_BASE(base))
- event_base_free(b);
-# endif
-#endif
-}
-
-struct ub_event_base*
-ub_default_event_base(int sigs, time_t* time_secs, struct timeval* time_tv)
-{
- void* base;
-
- (void)base;
-#ifdef USE_MINI_EVENT
- (void)sigs;
- /* use mini event time-sharing feature */
- base = event_init(time_secs, time_tv);
-#else
- (void)time_secs;
- (void)time_tv;
-# if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)
- /* libev */
- if(sigs)
- base = ev_default_loop(EVFLAG_AUTO);
- else
- base = ev_loop_new(EVFLAG_AUTO);
-# else
- (void)sigs;
-# ifdef HAVE_EVENT_BASE_NEW
- base = event_base_new();
-# else
- base = event_init();
-# endif
-# endif
-#endif
- return (struct ub_event_base*)base;
-}
-
-struct ub_event_base *
-ub_libevent_event_base(struct event_base* libevent_base)
-{
-#ifdef USE_MINI_EVENT
- (void)libevent_base;
- return NULL;
-#else
- return AS_UB_EVENT_BASE(libevent_base);
-#endif
-}
-
-struct event_base *
-ub_libevent_get_event_base(struct ub_event_base* base)
-{
-#ifdef USE_MINI_EVENT
- (void)base;
- return NULL;
-#else
- return AS_EVENT_BASE(base);
-#endif
-}
-
-void
-ub_event_base_free(struct ub_event_base* base)
-{
-#ifdef USE_MINI_EVENT
- event_base_free(AS_EVENT_BASE(base));
-#elif defined(HAVE_EVENT_BASE_FREE) && defined(HAVE_EVENT_BASE_ONCE)
- /* only libevent 1.2+ has it, but in 1.2 it is broken -
- assertion fails on signal handling ev that is not deleted
- in libevent 1.3c (event_base_once appears) this is fixed. */
- event_base_free(AS_EVENT_BASE(base));
-#else
- (void)base;
-#endif /* HAVE_EVENT_BASE_FREE and HAVE_EVENT_BASE_ONCE */
-}
-
-int
-ub_event_base_dispatch(struct ub_event_base* base)
-{
- return event_base_dispatch(AS_EVENT_BASE(base));
-}
-
-int
-ub_event_base_loopexit(struct ub_event_base* base)
-{
- return event_base_loopexit(AS_EVENT_BASE(base), NULL);
-}
-
-struct ub_event*
-ub_event_new(struct ub_event_base* base, int fd, short bits,
- void (*cb)(int, short, void*), void* arg)
-{
- struct event *ev = (struct event*)calloc(1, sizeof(struct event));
-
- if (!ev)
- return NULL;
-
- event_set(ev, fd, NATIVE_BITS(bits), NATIVE_BITS_CB(cb), arg);
- if (event_base_set(AS_EVENT_BASE(base), ev) != 0) {
- free(ev);
- return NULL;
- }
- return AS_UB_EVENT(ev);
-}
-
-struct ub_event*
-ub_signal_new(struct ub_event_base* base, int fd,
- void (*cb)(int, short, void*), void* arg)
-{
- struct event *ev = (struct event*)calloc(1, sizeof(struct event));
-
- if (!ev)
- return NULL;
-
- signal_set(ev, fd, NATIVE_BITS_CB(cb), arg);
- if (event_base_set(AS_EVENT_BASE(base), ev) != 0) {
- free(ev);
- return NULL;
- }
- return AS_UB_EVENT(ev);
-}
-
-struct ub_event*
-ub_winsock_register_wsaevent(struct ub_event_base* base, void* wsaevent,
- void (*cb)(int, short, void*), void* arg)
-{
-#if defined(USE_MINI_EVENT) && defined(USE_WINSOCK)
- struct event *ev = (struct event*)calloc(1, sizeof(struct event));
-
- if (!ev)
- return NULL;
-
- if (winsock_register_wsaevent(AS_EVENT_BASE(base), ev, wsaevent, cb,
- arg))
- return AS_UB_EVENT(ev);
- free(ev);
- return NULL;
-#else
- (void)base;
- (void)wsaevent;
- (void)cb;
- (void)arg;
- return NULL;
-#endif
-}
-
-void
-ub_event_add_bits(struct ub_event* ev, short bits)
-{
- AS_EVENT(ev)->ev_events |= NATIVE_BITS(bits);
-}
-
-void
-ub_event_del_bits(struct ub_event* ev, short bits)
-{
- AS_EVENT(ev)->ev_events &= ~NATIVE_BITS(bits);
-}
-
-void
-ub_event_set_fd(struct ub_event* ev, int fd)
-{
- AS_EVENT(ev)->ev_fd = fd;
-}
-
-void
-ub_event_free(struct ub_event* ev)
-{
- if (ev)
- free(AS_EVENT(ev));
-}
-
-int
-ub_event_add(struct ub_event* ev, struct timeval* tv)
-{
- return event_add(AS_EVENT(ev), tv);
-}
-
-int
-ub_event_del(struct ub_event* ev)
-{
- return event_del(AS_EVENT(ev));
-}
-
-int
-ub_timer_add(struct ub_event* ev, struct ub_event_base* base,
- void (*cb)(int, short, void*), void* arg, struct timeval* tv)
-{
- event_set(AS_EVENT(ev), -1, EV_TIMEOUT, NATIVE_BITS_CB(cb), arg);
- if (event_base_set(AS_EVENT_BASE(base), AS_EVENT(ev)) != 0)
- return -1;
- return evtimer_add(AS_EVENT(ev), tv);
-}
-
-int
-ub_timer_del(struct ub_event* ev)
-{
- return evtimer_del(AS_EVENT(ev));
-}
-
-int
-ub_signal_add(struct ub_event* ev, struct timeval* tv)
-{
- return signal_add(AS_EVENT(ev), tv);
-}
-
-int
-ub_signal_del(struct ub_event* ev)
-{
- return signal_del(AS_EVENT(ev));
-}
-
-void
-ub_winsock_unregister_wsaevent(struct ub_event* ev)
-{
-#if defined(USE_MINI_EVENT) && defined(USE_WINSOCK)
- winsock_unregister_wsaevent(AS_EVENT(ev));
- free(AS_EVENT(ev));
-#else
- (void)ev;
-#endif
-}
-
-void
-ub_winsock_tcp_wouldblock(struct ub_event* ev, int eventbits)
-{
-#if defined(USE_MINI_EVENT) && defined(USE_WINSOCK)
- winsock_tcp_wouldblock(AS_EVENT(ev), NATIVE_BITS(eventbits));
-#else
- (void)ev;
- (void)eventbits;
-#endif
-}
-
-void ub_comm_base_now(struct comm_base* cb)
-{
- #ifdef USE_MINI_EVENT
-/** minievent updates the time when it blocks. */
- (void)cb; /* nothing to do */
-#else /* !USE_MINI_EVENT */
-/** fillup the time values in the event base */
- time_t *tt;
- struct timeval *tv;
- comm_base_timept(cb, &tt, &tv);
- if(gettimeofday(tv, NULL) < 0) {
- log_err("gettimeofday: %s", strerror(errno));
- }
- *tt = tv->tv_sec;
-#endif /* USE_MINI_EVENT */
-}
-
diff --git a/external/unbound/util/ub_event.h b/external/unbound/util/ub_event.h
deleted file mode 100644
index 9739e6d83..000000000
--- a/external/unbound/util/ub_event.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * util/ub_event.h - indirection layer for pluggable events
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains prototypes for event loop functions.
- *
- */
-
-#ifndef UB_EVENT_H
-#define UB_EVENT_H
-
-struct ub_event_base;
-struct ub_event;
-struct comm_base;
-struct event_base;
-
-/** event timeout */
-#define UB_EV_TIMEOUT 0x01
-/** event fd readable */
-#define UB_EV_READ 0x02
-/** event fd writable */
-#define UB_EV_WRITE 0x04
-/** event signal */
-#define UB_EV_SIGNAL 0x08
-/** event must persist */
-#define UB_EV_PERSIST 0x10
-
-/** Returns event-base type. Could be "mini-event", "winsock-event" for the
- * daemon compile, and will be "pluggable-event<PACKAGE_VERSION>" for
- * libunbound.
- */
-const char* ub_event_get_version(void);
-/** Return the name, system and method for the pluggable event base */
-void ub_get_event_sys(struct ub_event_base*, const char** n, const char** s,
- const char** m);
-/** Return a default event base. In the deamon thess will be the only event
- * bases used.
- */
-struct ub_event_base* ub_default_event_base(int, time_t*, struct timeval*);
-/** Return an ub_event_base constructed for the given libevent event base */
-struct ub_event_base* ub_libevent_event_base(struct event_base*);
-/** Return the libevent base underlying the given ub_event_base. Will return
- * NULL when the ub_event_base does not have an underlying libevent event base
- */
-struct event_base* ub_libevent_get_event_base(struct ub_event_base*);
-/** Free event base. Free events yourself */
-void ub_event_base_free(struct ub_event_base*);
-/** Run the event base */
-int ub_event_base_dispatch(struct ub_event_base*);
-/** exit that loop */
-int ub_event_base_loopexit(struct ub_event_base*);
-
-/** Create a new ub_event for the event base */
-struct ub_event* ub_event_new(struct ub_event_base*,
- int fd, short bits, void (*cb)(int, short, void*), void* arg);
-/** Create a new ub_event signal for the event base */
-struct ub_event* ub_signal_new(struct ub_event_base*, int fd,
- void (*cb)(int, short, void*), void* arg);
-/** Create a new ub_event associated with the wsaevent for the event base */
-struct ub_event* ub_winsock_register_wsaevent(struct ub_event_base*,
- void* wsaevent, void (*cb)(int, short, void*), void* arg);
-
-/** Add event bits for this event to fire on */
-void ub_event_add_bits(struct ub_event*, short bits);
- /** Configure the event so it will not longer fire on given bits */
-void ub_event_del_bits(struct ub_event*, short bits);
-/** Change or set the file descriptor on the event */
-void ub_event_set_fd(struct ub_event*, int fd);
-/** free the event */
-void ub_event_free(struct ub_event*);
-/** Activate the event. The given timeval is an timeout value. */
-int ub_event_add(struct ub_event*, struct timeval*);
-/** Deactivate the event */
-int ub_event_del(struct ub_event*);
-/** Reconfigure and activate a timeout event */
-int ub_timer_add(struct ub_event*, struct ub_event_base*,
- void (*cb)(int, short, void*), void* arg, struct timeval*);
-/** Deactivate the timeout event */
-int ub_timer_del(struct ub_event*);
-/** Activate a signal event */
-int ub_signal_add(struct ub_event*, struct timeval*);
-/** Deactivate a signal event */
-int ub_signal_del(struct ub_event*);
-/** Free a with a wsaevent associated event */
-void ub_winsock_unregister_wsaevent(struct ub_event* ev);
-/** Signal the eventloop when a TCP windows socket will block on next read
- * or write (given by the eventbits)
- */
-void ub_winsock_tcp_wouldblock(struct ub_event*, int bits);
-/** Equip the comm_base with the current time */
-void ub_comm_base_now(struct comm_base* cb);
-
-#endif /* UB_EVENT_H */
diff --git a/external/unbound/util/ub_event_pluggable.c b/external/unbound/util/ub_event_pluggable.c
deleted file mode 100644
index 4a9451263..000000000
--- a/external/unbound/util/ub_event_pluggable.c
+++ /dev/null
@@ -1,692 +0,0 @@
-/*
- * util/ub_event_pluggable.c - call registered pluggable event functions
- *
- * Copyright (c) 2007, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains an implementation for the indirection layer for pluggable
- * events that calls the registered pluggable event loop. It also defines a
- * default pluggable event loop based on the default libevent (compatibility)
- * functions.
- */
-#include "config.h"
-#include <sys/time.h>
-#include "util/ub_event.h"
-#include "libunbound/unbound-event.h"
-#include "util/netevent.h"
-#include "util/log.h"
-#include "util/fptr_wlist.h"
-
-/* We define libevent structures here to hide the libevent stuff. */
-
-#ifdef USE_MINI_EVENT
-# ifdef USE_WINSOCK
-# include "util/winsock_event.h"
-# else
-# include "util/mini_event.h"
-# endif /* USE_WINSOCK */
-#else /* USE_MINI_EVENT */
- /* we use libevent */
-# ifdef HAVE_EVENT_H
-# include <event.h>
-# else
-# include "event2/event.h"
-# include "event2/event_struct.h"
-# include "event2/event_compat.h"
-# endif
-#endif /* USE_MINI_EVENT */
-
-#if UB_EV_TIMEOUT != EV_TIMEOUT || UB_EV_READ != EV_READ || \
- UB_EV_WRITE != EV_WRITE || UB_EV_SIGNAL != EV_SIGNAL || \
- UB_EV_PERSIST != EV_PERSIST
-/* Only necessary for libev */
-# define NATIVE_BITS(b) ( \
- (((b) & UB_EV_TIMEOUT) ? EV_TIMEOUT : 0) \
- | (((b) & UB_EV_READ ) ? EV_READ : 0) \
- | (((b) & UB_EV_WRITE ) ? EV_WRITE : 0) \
- | (((b) & UB_EV_SIGNAL ) ? EV_SIGNAL : 0) \
- | (((b) & UB_EV_PERSIST) ? EV_PERSIST : 0))
-
-# define UB_EV_BITS(b) ( \
- (((b) & EV_TIMEOUT) ? UB_EV_TIMEOUT : 0) \
- | (((b) & EV_READ ) ? UB_EV_READ : 0) \
- | (((b) & EV_WRITE ) ? UB_EV_WRITE : 0) \
- | (((b) & EV_SIGNAL ) ? UB_EV_SIGNAL : 0) \
- | (((b) & EV_PERSIST) ? UB_EV_PERSIST : 0))
-
-# define UB_EV_BITS_CB(C) void my_ ## C (int fd, short bits, void *arg) \
- { (C)(fd, UB_EV_BITS(bits), arg); }
-
-UB_EV_BITS_CB(comm_point_udp_callback);
-UB_EV_BITS_CB(comm_point_udp_ancil_callback)
-UB_EV_BITS_CB(comm_point_tcp_accept_callback)
-UB_EV_BITS_CB(comm_point_tcp_handle_callback)
-UB_EV_BITS_CB(comm_timer_callback)
-UB_EV_BITS_CB(comm_signal_callback)
-UB_EV_BITS_CB(comm_point_local_handle_callback)
-UB_EV_BITS_CB(comm_point_raw_handle_callback)
-UB_EV_BITS_CB(tube_handle_signal)
-UB_EV_BITS_CB(comm_base_handle_slow_accept)
-
-static void (*NATIVE_BITS_CB(void (*cb)(int, short, void*)))(int, short, void*)
-{
- if(cb == comm_point_udp_callback)
- return my_comm_point_udp_callback;
- else if(cb == comm_point_udp_ancil_callback)
- return my_comm_point_udp_ancil_callback;
- else if(cb == comm_point_tcp_accept_callback)
- return my_comm_point_tcp_accept_callback;
- else if(cb == comm_point_tcp_handle_callback)
- return my_comm_point_tcp_handle_callback;
- else if(cb == comm_timer_callback)
- return my_comm_timer_callback;
- else if(cb == comm_signal_callback)
- return my_comm_signal_callback;
- else if(cb == comm_point_local_handle_callback)
- return my_comm_point_local_handle_callback;
- else if(cb == comm_point_raw_handle_callback)
- return my_comm_point_raw_handle_callback;
- else if(cb == tube_handle_signal)
- return my_tube_handle_signal;
- else if(cb == comm_base_handle_slow_accept)
- return my_comm_base_handle_slow_accept;
- else
- return NULL;
-}
-#else
-# define NATIVE_BITS(b) (b)
-# define NATIVE_BITS_CB(c) (c)
-#endif
-
-#ifndef EVFLAG_AUTO
-#define EVFLAG_AUTO 0
-#endif
-
-struct my_event_base {
- struct ub_event_base super;
- struct event_base* base;
-};
-
-struct my_event {
- struct ub_event super;
- struct event ev;
-};
-
-#define AS_MY_EVENT_BASE(x) ((struct my_event_base*)x)
-#define AS_MY_EVENT(x) ((struct my_event*)x)
-
-const char* ub_event_get_version(void)
-{
- return "pluggable-event"PACKAGE_VERSION;
-}
-
-static void
-my_event_add_bits(struct ub_event* ev, short bits)
-{
- AS_MY_EVENT(ev)->ev.ev_events |= NATIVE_BITS(bits);
-}
-
-static void
-my_event_del_bits(struct ub_event* ev, short bits)
-{
- AS_MY_EVENT(ev)->ev.ev_events &= ~NATIVE_BITS(bits);
-}
-
-static void
-my_event_set_fd(struct ub_event* ev, int fd)
-{
- AS_MY_EVENT(ev)->ev.ev_fd = fd;
-}
-
-static void
-my_event_free(struct ub_event* ev)
-{
- free(AS_MY_EVENT(ev));
-}
-
-static int
-my_event_add(struct ub_event* ev, struct timeval* tv)
-{
- return event_add(&AS_MY_EVENT(ev)->ev, tv);
-}
-
-static int
-my_event_del(struct ub_event* ev)
-{
- return event_del(&AS_MY_EVENT(ev)->ev);
-}
-
-static int
-my_timer_add(struct ub_event* ev, struct ub_event_base* base,
- void (*cb)(int, short, void*), void* arg, struct timeval* tv)
-{
- event_set(&AS_MY_EVENT(ev)->ev, -1, EV_TIMEOUT,NATIVE_BITS_CB(cb),arg);
- if (event_base_set(AS_MY_EVENT_BASE(base)->base, &AS_MY_EVENT(ev)->ev)
- != 0)
- return -1;
- return evtimer_add(&AS_MY_EVENT(ev)->ev, tv);
-}
-
-static int
-my_timer_del(struct ub_event* ev)
-{
- return evtimer_del(&AS_MY_EVENT(ev)->ev);
-}
-
-static int
-my_signal_add(struct ub_event* ev, struct timeval* tv)
-{
- return signal_add(&AS_MY_EVENT(ev)->ev, tv);
-}
-
-static int
-my_signal_del(struct ub_event* ev)
-{
- return signal_del(&AS_MY_EVENT(ev)->ev);
-}
-
-static void
-my_winsock_unregister_wsaevent(struct ub_event* ev)
-{
-#if defined(USE_MINI_EVENT) && defined(USE_WINSOCK)
- winsock_unregister_wsaevent(&AS_MY_EVENT(ev)->ev);
- free(AS_MY_EVENT(ev));
-#else
- (void)ev;
-#endif
-}
-
-static void
-my_winsock_tcp_wouldblock(struct ub_event* ev, int eventbits)
-{
-#if defined(USE_MINI_EVENT) && defined(USE_WINSOCK)
- winsock_tcp_wouldblock(&AS_MY_EVENT(ev)->ev, NATIVE_BITS(eventbits));
-#else
- (void)ev;
- (void)eventbits;
-#endif
-}
-
-static struct ub_event_vmt default_event_vmt = {
- my_event_add_bits, my_event_del_bits, my_event_set_fd,
- my_event_free, my_event_add, my_event_del,
- my_timer_add, my_timer_del, my_signal_add, my_signal_del,
- my_winsock_unregister_wsaevent, my_winsock_tcp_wouldblock
-};
-
-static void
-my_event_base_free(struct ub_event_base* base)
-{
-#ifdef USE_MINI_EVENT
- event_base_free(AS_MY_EVENT_BASE(base)->base);
-#elif defined(HAVE_EVENT_BASE_FREE) && defined(HAVE_EVENT_BASE_ONCE)
- /* only libevent 1.2+ has it, but in 1.2 it is broken -
- assertion fails on signal handling ev that is not deleted
- in libevent 1.3c (event_base_once appears) this is fixed. */
- event_base_free(AS_MY_EVENT_BASE(base)->base);
-#endif /* HAVE_EVENT_BASE_FREE and HAVE_EVENT_BASE_ONCE */
- free(AS_MY_EVENT_BASE(base));
-}
-
-static int
-my_event_base_dispatch(struct ub_event_base* base)
-{
- return event_base_dispatch(AS_MY_EVENT_BASE(base)->base);
-}
-
-static int
-my_event_base_loopexit(struct ub_event_base* base, struct timeval* tv)
-{
- return event_base_loopexit(AS_MY_EVENT_BASE(base)->base, tv);
-}
-
-static struct ub_event*
-my_event_new(struct ub_event_base* base, int fd, short bits,
- void (*cb)(int, short, void*), void* arg)
-{
- struct my_event *my_ev = (struct my_event*)calloc(1,
- sizeof(struct my_event));
-
- if (!my_ev)
- return NULL;
-
- event_set(&my_ev->ev, fd, NATIVE_BITS(bits), NATIVE_BITS_CB(cb), arg);
- if (event_base_set(AS_MY_EVENT_BASE(base)->base, &my_ev->ev) != 0) {
- free(my_ev);
- return NULL;
- }
- my_ev->super.magic = UB_EVENT_MAGIC;
- my_ev->super.vmt = &default_event_vmt;
- return &my_ev->super;
-}
-
-static struct ub_event*
-my_signal_new(struct ub_event_base* base, int fd,
- void (*cb)(int, short, void*), void* arg)
-{
- struct my_event *my_ev = (struct my_event*)calloc(1,
- sizeof(struct my_event));
-
- if (!my_ev)
- return NULL;
-
- signal_set(&my_ev->ev, fd, NATIVE_BITS_CB(cb), arg);
- if (event_base_set(AS_MY_EVENT_BASE(base)->base, &my_ev->ev) != 0) {
- free(my_ev);
- return NULL;
- }
- my_ev->super.magic = UB_EVENT_MAGIC;
- my_ev->super.vmt = &default_event_vmt;
- return &my_ev->super;
-}
-
-static struct ub_event*
-my_winsock_register_wsaevent(struct ub_event_base* base, void* wsaevent,
- void (*cb)(int, short, void*), void* arg)
-{
-#if defined(USE_MINI_EVENT) && defined(USE_WINSOCK)
- struct my_event *my_ev = (struct my_event*)calloc(1,
- sizeof(struct my_event));
-
- if (!my_ev)
- return NULL;
-
- if (!winsock_register_wsaevent(AS_MY_EVENT_BASE(base)->base,
- &my_ev->ev, wsaevent, cb, arg)) {
- free(my_ev);
- return NULL;
-
- }
- my_ev->super.magic = UB_EVENT_MAGIC;
- my_ev->super.vmt = &default_event_vmt;
- return &my_ev->super;
-#else
- (void)base;
- (void)wsaevent;
- (void)cb;
- (void)arg;
- return NULL;
-#endif
-}
-
-static struct ub_event_base_vmt default_event_base_vmt = {
- my_event_base_free, my_event_base_dispatch,
- my_event_base_loopexit, my_event_new, my_signal_new,
- my_winsock_register_wsaevent
-};
-
-struct ub_event_base*
-ub_default_event_base(int sigs, time_t* time_secs, struct timeval* time_tv)
-{
- struct my_event_base* my_base = (struct my_event_base*)calloc(1,
- sizeof(struct my_event_base));
-
- if (!my_base)
- return NULL;
-
-#ifdef USE_MINI_EVENT
- (void)sigs;
- /* use mini event time-sharing feature */
- my_base->base = event_init(time_secs, time_tv);
-#else
- (void)time_secs;
- (void)time_tv;
-# if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)
- /* libev */
- if(sigs)
- my_base->base = (struct event_base*)ev_default_loop(EVFLAG_AUTO);
- else
- my_base->base = (struct event_base*)ev_loop_new(EVFLAG_AUTO);
-# else
- (void)sigs;
-# ifdef HAVE_EVENT_BASE_NEW
- my_base->base = event_base_new();
-# else
- my_base->base = event_init();
-# endif
-# endif
-#endif
- if (!my_base->base) {
- free(my_base);
- return NULL;
- }
- my_base->super.magic = UB_EVENT_MAGIC;
- my_base->super.vmt = &default_event_base_vmt;
- return &my_base->super;
-}
-
-struct ub_event_base*
-ub_libevent_event_base(struct event_base* base)
-{
-#ifdef USE_MINI_EVENT
- (void)base;
- return NULL;
-#else
- struct my_event_base* my_base = (struct my_event_base*)calloc(1,
- sizeof(struct my_event_base));
-
- if (!my_base)
- return NULL;
- my_base->super.magic = UB_EVENT_MAGIC;
- my_base->super.vmt = &default_event_base_vmt;
- my_base->base = base;
- return &my_base->super;
-#endif
-}
-
-struct event_base*
-ub_libevent_get_event_base(struct ub_event_base* base)
-{
-#ifndef USE_MINI_EVENT
- if (base->vmt == &default_event_base_vmt)
- return AS_MY_EVENT_BASE(base)->base;
-#else
- (void)base;
-#endif
- return NULL;
-}
-
-#if (defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)) && defined(EVBACKEND_SELECT)
-static const char* ub_ev_backend2str_pluggable(int b)
-{
- switch(b) {
- case EVBACKEND_SELECT: return "select";
- case EVBACKEND_POLL: return "poll";
- case EVBACKEND_EPOLL: return "epoll";
- case EVBACKEND_KQUEUE: return "kqueue";
- case EVBACKEND_DEVPOLL: return "devpoll";
- case EVBACKEND_PORT: return "evport";
- }
- return "unknown";
-}
-#endif
-
-void
-ub_get_event_sys(struct ub_event_base* ub_base, const char** n, const char** s,
- const char** m)
-{
-#ifdef USE_WINSOCK
- (void)ub_base;
- *n = "pluggable-event";
- *s = "winsock";
- *m = "WSAWaitForMultipleEvents";
-#elif defined(USE_MINI_EVENT)
- (void)ub_base;
- *n = "pluggable-event";
- *s = "internal";
- *m = "select";
-#else
- struct event_base* b = ub_libevent_get_event_base(ub_base);
- /* This function is only called from comm_base_create, so
- * ub_base is guaranteed to exist and to be the default
- * event base.
- */
- assert(b);
- *n = "pluggable-event";
- *s = event_get_version();
-# if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)
- *n = "pluggable-libev";
-# ifdef EVBACKEND_SELECT
- *m = ub_ev_backend2str_pluggable(ev_backend((struct ev_loop*)b));
-# else
- *m = "not obtainable";
-# endif
-# elif defined(HAVE_EVENT_BASE_GET_METHOD)
- *n = "pluggable-libevent";
- *m = event_base_get_method(b);
-# else
- *m = "not obtainable";
-# endif
-#endif
-}
-
-void
-ub_event_base_free(struct ub_event_base* base)
-{
- if (base && base->magic == UB_EVENT_MAGIC) {
- fptr_ok(base->vmt != &default_event_base_vmt ||
- base->vmt->free == my_event_base_free);
- (*base->vmt->free)(base);
- }
-}
-
-int
-ub_event_base_dispatch(struct ub_event_base* base)
-{
- if (base->magic == UB_EVENT_MAGIC) {
- fptr_ok(base->vmt != &default_event_base_vmt ||
- base->vmt->dispatch == my_event_base_dispatch);
- return (*base->vmt->dispatch)(base);
- }
- return -1;
-}
-
-int
-ub_event_base_loopexit(struct ub_event_base* base)
-{
- if (base->magic == UB_EVENT_MAGIC) {
- fptr_ok(base->vmt != &default_event_base_vmt ||
- base->vmt->loopexit == my_event_base_loopexit);
- return (*base->vmt->loopexit)(base, NULL);
- }
- return -1;
-}
-
-struct ub_event*
-ub_event_new(struct ub_event_base* base, int fd, short bits,
- void (*cb)(int, short, void*), void* arg)
-{
- if (base->magic == UB_EVENT_MAGIC) {
- fptr_ok(base->vmt != &default_event_base_vmt ||
- base->vmt->new_event == my_event_new);
- return (*base->vmt->new_event)(base, fd, bits, cb, arg);
- }
- return NULL;
-}
-
-struct ub_event*
-ub_signal_new(struct ub_event_base* base, int fd,
- void (*cb)(int, short, void*), void* arg)
-{
- if (base->magic == UB_EVENT_MAGIC) {
- fptr_ok(base->vmt != &default_event_base_vmt ||
- base->vmt->new_signal == my_signal_new);
- return (*base->vmt->new_signal)(base, fd, cb, arg);
- }
- return NULL;
-}
-
-struct ub_event*
-ub_winsock_register_wsaevent(struct ub_event_base* base, void* wsaevent,
- void (*cb)(int, short, void*), void* arg)
-{
- if (base->magic == UB_EVENT_MAGIC) {
- fptr_ok(base->vmt != &default_event_base_vmt ||
- base->vmt->winsock_register_wsaevent ==
- my_winsock_register_wsaevent);
- return (*base->vmt->winsock_register_wsaevent)(base, wsaevent, cb, arg);
- }
- return NULL;
-}
-
-void
-ub_event_add_bits(struct ub_event* ev, short bits)
-{
- if (ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->add_bits == my_event_add_bits);
- (*ev->vmt->add_bits)(ev, bits);
- }
-}
-
-void
-ub_event_del_bits(struct ub_event* ev, short bits)
-{
- if (ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->del_bits == my_event_del_bits);
- (*ev->vmt->del_bits)(ev, bits);
- }
-}
-
-void
-ub_event_set_fd(struct ub_event* ev, int fd)
-{
- if (ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->set_fd == my_event_set_fd);
- (*ev->vmt->set_fd)(ev, fd);
- }
-}
-
-void
-ub_event_free(struct ub_event* ev)
-{
- if (ev && ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->free == my_event_free);
- (*ev->vmt->free)(ev);
- }
-}
-
-int
-ub_event_add(struct ub_event* ev, struct timeval* tv)
-{
- if (ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->add == my_event_add);
- return (*ev->vmt->add)(ev, tv);
- }
- return -1;
-}
-
-int
-ub_event_del(struct ub_event* ev)
-{
- if (ev && ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->del == my_event_del);
- return (*ev->vmt->del)(ev);
- }
- return -1;
-}
-
-int
-ub_timer_add(struct ub_event* ev, struct ub_event_base* base,
- void (*cb)(int, short, void*), void* arg, struct timeval* tv)
-{
- if (ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->add_timer == my_timer_add);
- return (*ev->vmt->add_timer)(ev, base, cb, arg, tv);
- }
- return -1;
-}
-
-int
-ub_timer_del(struct ub_event* ev)
-{
- if (ev && ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->del_timer == my_timer_del);
- return (*ev->vmt->del_timer)(ev);
- }
- return -1;
-}
-
-int
-ub_signal_add(struct ub_event* ev, struct timeval* tv)
-{
- if (ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->add_signal == my_signal_add);
- return (*ev->vmt->add_signal)(ev, tv);
- }
- return -1;
-}
-
-int
-ub_signal_del(struct ub_event* ev)
-{
- if (ev && ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->del_signal == my_signal_del);
- return (*ev->vmt->del_signal)(ev);
- }
- return -1;
-}
-
-void
-ub_winsock_unregister_wsaevent(struct ub_event* ev)
-{
- if (ev && ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->winsock_unregister_wsaevent ==
- my_winsock_unregister_wsaevent);
- (*ev->vmt->winsock_unregister_wsaevent)(ev);
- }
-}
-
-void
-ub_winsock_tcp_wouldblock(struct ub_event* ev, int eventbits)
-{
- if (ev->magic == UB_EVENT_MAGIC) {
- fptr_ok(ev->vmt != &default_event_vmt ||
- ev->vmt->winsock_tcp_wouldblock ==
- my_winsock_tcp_wouldblock);
- (*ev->vmt->winsock_tcp_wouldblock)(ev, eventbits);
- }
-}
-
-void ub_comm_base_now(struct comm_base* cb)
-{
- time_t *tt;
- struct timeval *tv;
-
-#ifdef USE_MINI_EVENT
-/** minievent updates the time when it blocks. */
- if (comm_base_internal(cb)->magic == UB_EVENT_MAGIC &&
- comm_base_internal(cb)->vmt == &default_event_base_vmt)
- return; /* Actually using mini event, so do not set time */
-#endif /* USE_MINI_EVENT */
-
-/** fillup the time values in the event base */
- comm_base_timept(cb, &tt, &tv);
- if(gettimeofday(tv, NULL) < 0) {
- log_err("gettimeofday: %s", strerror(errno));
- }
- *tt = tv->tv_sec;
-}
-
diff --git a/external/unbound/util/winsock_event.c b/external/unbound/util/winsock_event.c
deleted file mode 100644
index 63d98796d..000000000
--- a/external/unbound/util/winsock_event.c
+++ /dev/null
@@ -1,694 +0,0 @@
-/*
- * util/winsock_event.c - implementation of the unbound winsock event handler.
- *
- * Copyright (c) 2008, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * \file
- * Implementation of the unbound WinSock2 API event notification handler
- * for the Windows port.
- */
-
-#include "config.h"
-#ifdef USE_WINSOCK
-#include <signal.h>
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-#include <sys/time.h>
-#include "util/winsock_event.h"
-#include "util/fptr_wlist.h"
-
-int mini_ev_cmp(const void* a, const void* b)
-{
- const struct event *e = (const struct event*)a;
- const struct event *f = (const struct event*)b;
- if(e->ev_timeout.tv_sec < f->ev_timeout.tv_sec)
- return -1;
- if(e->ev_timeout.tv_sec > f->ev_timeout.tv_sec)
- return 1;
- if(e->ev_timeout.tv_usec < f->ev_timeout.tv_usec)
- return -1;
- if(e->ev_timeout.tv_usec > f->ev_timeout.tv_usec)
- return 1;
- if(e < f)
- return -1;
- if(e > f)
- return 1;
- return 0;
-}
-
-/** set time */
-static int
-settime(struct event_base* base)
-{
- if(gettimeofday(base->time_tv, NULL) < 0) {
- return -1;
- }
-#ifndef S_SPLINT_S
- *base->time_secs = (time_t)base->time_tv->tv_sec;
-#endif
- return 0;
-}
-
-#ifdef UNBOUND_DEBUG
-/**
- * Find a fd in the list of items.
- * Note that not all items have a fd associated (those are -1).
- * Signals are stored separately, and not searched.
- * @param base: event base to look in.
- * @param fd: what socket to look for.
- * @return the index in the array, or -1 on failure.
- */
-static int
-find_fd(struct event_base* base, int fd)
-{
- int i;
- for(i=0; i<base->max; i++) {
- if(base->items[i]->ev_fd == fd)
- return i;
- }
- return -1;
-}
-#endif
-
-/** Find ptr in base array */
-static void
-zero_waitfor(WSAEVENT waitfor[], WSAEVENT x)
-{
- int i;
- for(i=0; i<WSK_MAX_ITEMS; i++) {
- if(waitfor[i] == x)
- waitfor[i] = 0;
- }
-}
-
-void *event_init(time_t* time_secs, struct timeval* time_tv)
-{
- struct event_base* base = (struct event_base*)malloc(
- sizeof(struct event_base));
- if(!base)
- return NULL;
- memset(base, 0, sizeof(*base));
- base->time_secs = time_secs;
- base->time_tv = time_tv;
- if(settime(base) < 0) {
- event_base_free(base);
- return NULL;
- }
- base->items = (struct event**)calloc(WSK_MAX_ITEMS,
- sizeof(struct event*));
- if(!base->items) {
- event_base_free(base);
- return NULL;
- }
- base->cap = WSK_MAX_ITEMS;
- base->max = 0;
- base->times = rbtree_create(mini_ev_cmp);
- if(!base->times) {
- event_base_free(base);
- return NULL;
- }
- base->signals = (struct event**)calloc(MAX_SIG, sizeof(struct event*));
- if(!base->signals) {
- event_base_free(base);
- return NULL;
- }
- base->tcp_stickies = 0;
- base->tcp_reinvigorated = 0;
- verbose(VERB_CLIENT, "winsock_event inited");
- return base;
-}
-
-const char *event_get_version(void)
-{
- return "winsock-event-"PACKAGE_VERSION;
-}
-
-const char *event_get_method(void)
-{
- return "WSAWaitForMultipleEvents";
-}
-
-/** call timeouts handlers, and return how long to wait for next one or -1 */
-static void handle_timeouts(struct event_base* base, struct timeval* now,
- struct timeval* wait)
-{
- struct event* p;
-#ifndef S_SPLINT_S
- wait->tv_sec = (time_t)-1;
-#endif
- verbose(VERB_CLIENT, "winsock_event handle_timeouts");
-
- while((rbnode_type*)(p = (struct event*)rbtree_first(base->times))
- !=RBTREE_NULL) {
-#ifndef S_SPLINT_S
- if(p->ev_timeout.tv_sec > now->tv_sec ||
- (p->ev_timeout.tv_sec==now->tv_sec &&
- p->ev_timeout.tv_usec > now->tv_usec)) {
- /* there is a next larger timeout. wait for it */
- wait->tv_sec = p->ev_timeout.tv_sec - now->tv_sec;
- if(now->tv_usec > p->ev_timeout.tv_usec) {
- wait->tv_sec--;
- wait->tv_usec = 1000000 - (now->tv_usec -
- p->ev_timeout.tv_usec);
- } else {
- wait->tv_usec = p->ev_timeout.tv_usec
- - now->tv_usec;
- }
- verbose(VERB_CLIENT, "winsock_event wait=" ARG_LL "d.%6.6d",
- (long long)wait->tv_sec, (int)wait->tv_usec);
- return;
- }
-#endif
- /* event times out, remove it */
- (void)rbtree_delete(base->times, p);
- p->ev_events &= ~EV_TIMEOUT;
- fptr_ok(fptr_whitelist_event(p->ev_callback));
- (*p->ev_callback)(p->ev_fd, EV_TIMEOUT, p->ev_arg);
- }
- verbose(VERB_CLIENT, "winsock_event wait=(-1)");
-}
-
-/** handle is_signal events and see if signalled */
-static void handle_signal(struct event* ev)
-{
- DWORD ret;
- log_assert(ev->is_signal && ev->hEvent);
- /* see if the event is signalled */
- ret = WSAWaitForMultipleEvents(1, &ev->hEvent, 0 /* any object */,
- 0 /* return immediately */, 0 /* not alertable for IOcomple*/);
- if(ret == WSA_WAIT_IO_COMPLETION || ret == WSA_WAIT_FAILED) {
- log_err("WSAWaitForMultipleEvents(signal) failed: %s",
- wsa_strerror(WSAGetLastError()));
- return;
- }
- if(ret == WSA_WAIT_TIMEOUT) {
- /* not signalled */
- return;
- }
-
- /* reset the signal */
- if(!WSAResetEvent(ev->hEvent))
- log_err("WSAResetEvent failed: %s",
- wsa_strerror(WSAGetLastError()));
- /* do the callback (which may set the signal again) */
- fptr_ok(fptr_whitelist_event(ev->ev_callback));
- (*ev->ev_callback)(ev->ev_fd, ev->ev_events, ev->ev_arg);
-}
-
-/** call select and callbacks for that */
-static int handle_select(struct event_base* base, struct timeval* wait)
-{
- DWORD timeout = 0; /* in milliseconds */
- DWORD ret;
- struct event* eventlist[WSK_MAX_ITEMS];
- WSANETWORKEVENTS netev;
- int i, numwait = 0, startidx = 0, was_timeout = 0;
- int newstickies = 0;
- struct timeval nultm;
-
- verbose(VERB_CLIENT, "winsock_event handle_select");
-
-#ifndef S_SPLINT_S
- if(wait->tv_sec==(time_t)-1)
- wait = NULL;
- if(wait)
- timeout = wait->tv_sec*1000 + wait->tv_usec/1000;
- if(base->tcp_stickies) {
- wait = &nultm;
- nultm.tv_sec = 0;
- nultm.tv_usec = 0;
- timeout = 0; /* no waiting, we have sticky events */
- }
-#endif
-
- /* prepare event array */
- for(i=0; i<base->max; i++) {
- if(base->items[i]->ev_fd == -1 && !base->items[i]->is_signal)
- continue; /* skip timer only events */
- eventlist[numwait] = base->items[i];
- base->waitfor[numwait++] = base->items[i]->hEvent;
- if(numwait == WSK_MAX_ITEMS)
- break; /* sanity check */
- }
- log_assert(numwait <= WSA_MAXIMUM_WAIT_EVENTS);
- verbose(VERB_CLIENT, "winsock_event bmax=%d numwait=%d wait=%s "
- "timeout=%d", base->max, numwait, (wait?"<wait>":"<null>"),
- (int)timeout);
-
- /* do the wait */
- if(numwait == 0) {
- /* WSAWaitFor.. doesn't like 0 event objects */
- if(wait) {
- Sleep(timeout);
- }
- was_timeout = 1;
- } else {
- ret = WSAWaitForMultipleEvents(numwait, base->waitfor,
- 0 /* do not wait for all, just one will do */,
- wait?timeout:WSA_INFINITE,
- 0); /* we are not alertable (IO completion events) */
- if(ret == WSA_WAIT_IO_COMPLETION) {
- log_err("WSAWaitForMultipleEvents failed: WSA_WAIT_IO_COMPLETION");
- return -1;
- } else if(ret == WSA_WAIT_FAILED) {
- log_err("WSAWaitForMultipleEvents failed: %s",
- wsa_strerror(WSAGetLastError()));
- return -1;
- } else if(ret == WSA_WAIT_TIMEOUT) {
- was_timeout = 1;
- } else
- startidx = ret - WSA_WAIT_EVENT_0;
- }
- verbose(VERB_CLIENT, "winsock_event wake was_timeout=%d startidx=%d",
- was_timeout, startidx);
-
- /* get new time after wait */
- if(settime(base) < 0)
- return -1;
-
- /* callbacks */
- if(base->tcp_stickies)
- startidx = 0; /* process all events, some are sticky */
- for(i=startidx; i<numwait; i++)
- eventlist[i]->just_checked = 1;
-
- verbose(VERB_CLIENT, "winsock_event signals");
- for(i=startidx; i<numwait; i++) {
- if(!base->waitfor[i])
- continue; /* was deleted */
- if(eventlist[i]->is_signal) {
- eventlist[i]->just_checked = 0;
- handle_signal(eventlist[i]);
- }
- }
- /* early exit - do not process network, exit quickly */
- if(base->need_to_exit)
- return 0;
-
- verbose(VERB_CLIENT, "winsock_event net");
- for(i=startidx; i<numwait; i++) {
- short bits = 0;
- /* eventlist[i] fired */
- /* see if eventlist[i] is still valid and just checked from
- * WSAWaitForEvents */
- if(!base->waitfor[i])
- continue; /* was deleted */
- if(!eventlist[i]->just_checked)
- continue; /* added by other callback */
- if(eventlist[i]->is_signal)
- continue; /* not a network event at all */
- eventlist[i]->just_checked = 0;
-
- if(WSAEnumNetworkEvents(eventlist[i]->ev_fd,
- base->waitfor[i], /* reset the event handle */
- /*NULL,*/ /* do not reset the event handle */
- &netev) != 0) {
- log_err("WSAEnumNetworkEvents failed: %s",
- wsa_strerror(WSAGetLastError()));
- return -1;
- }
- if((netev.lNetworkEvents & FD_READ)) {
- if(netev.iErrorCode[FD_READ_BIT] != 0)
- verbose(VERB_ALGO, "FD_READ_BIT error: %s",
- wsa_strerror(netev.iErrorCode[FD_READ_BIT]));
- bits |= EV_READ;
- }
- if((netev.lNetworkEvents & FD_WRITE)) {
- if(netev.iErrorCode[FD_WRITE_BIT] != 0)
- verbose(VERB_ALGO, "FD_WRITE_BIT error: %s",
- wsa_strerror(netev.iErrorCode[FD_WRITE_BIT]));
- bits |= EV_WRITE;
- }
- if((netev.lNetworkEvents & FD_CONNECT)) {
- if(netev.iErrorCode[FD_CONNECT_BIT] != 0)
- verbose(VERB_ALGO, "FD_CONNECT_BIT error: %s",
- wsa_strerror(netev.iErrorCode[FD_CONNECT_BIT]));
- bits |= EV_READ;
- bits |= EV_WRITE;
- }
- if((netev.lNetworkEvents & FD_ACCEPT)) {
- if(netev.iErrorCode[FD_ACCEPT_BIT] != 0)
- verbose(VERB_ALGO, "FD_ACCEPT_BIT error: %s",
- wsa_strerror(netev.iErrorCode[FD_ACCEPT_BIT]));
- bits |= EV_READ;
- }
- if((netev.lNetworkEvents & FD_CLOSE)) {
- if(netev.iErrorCode[FD_CLOSE_BIT] != 0)
- verbose(VERB_ALGO, "FD_CLOSE_BIT error: %s",
- wsa_strerror(netev.iErrorCode[FD_CLOSE_BIT]));
- bits |= EV_READ;
- bits |= EV_WRITE;
- }
- if(eventlist[i]->is_tcp && eventlist[i]->stick_events) {
- verbose(VERB_ALGO, "winsock %d pass sticky %s%s",
- eventlist[i]->ev_fd,
- (eventlist[i]->old_events&EV_READ)?"EV_READ":"",
- (eventlist[i]->old_events&EV_WRITE)?"EV_WRITE":"");
- bits |= eventlist[i]->old_events;
- }
- if(eventlist[i]->is_tcp && bits) {
- eventlist[i]->old_events = bits;
- eventlist[i]->stick_events = 1;
- if((eventlist[i]->ev_events & bits)) {
- newstickies = 1;
- }
- verbose(VERB_ALGO, "winsock %d store sticky %s%s",
- eventlist[i]->ev_fd,
- (eventlist[i]->old_events&EV_READ)?"EV_READ":"",
- (eventlist[i]->old_events&EV_WRITE)?"EV_WRITE":"");
- }
- if((bits & eventlist[i]->ev_events)) {
- verbose(VERB_ALGO, "winsock event callback %p fd=%d "
- "%s%s%s%s%s ; %s%s%s",
- eventlist[i], eventlist[i]->ev_fd,
- (netev.lNetworkEvents&FD_READ)?" FD_READ":"",
- (netev.lNetworkEvents&FD_WRITE)?" FD_WRITE":"",
- (netev.lNetworkEvents&FD_CONNECT)?
- " FD_CONNECT":"",
- (netev.lNetworkEvents&FD_ACCEPT)?
- " FD_ACCEPT":"",
- (netev.lNetworkEvents&FD_CLOSE)?" FD_CLOSE":"",
- (bits&EV_READ)?" EV_READ":"",
- (bits&EV_WRITE)?" EV_WRITE":"",
- (bits&EV_TIMEOUT)?" EV_TIMEOUT":"");
-
- fptr_ok(fptr_whitelist_event(
- eventlist[i]->ev_callback));
- (*eventlist[i]->ev_callback)(eventlist[i]->ev_fd,
- bits & eventlist[i]->ev_events,
- eventlist[i]->ev_arg);
- }
- if(eventlist[i]->is_tcp && bits)
- verbose(VERB_ALGO, "winsock %d got sticky %s%s",
- eventlist[i]->ev_fd,
- (eventlist[i]->old_events&EV_READ)?"EV_READ":"",
- (eventlist[i]->old_events&EV_WRITE)?"EV_WRITE":"");
- }
- verbose(VERB_CLIENT, "winsock_event net");
- if(base->tcp_reinvigorated) {
- verbose(VERB_CLIENT, "winsock_event reinvigorated");
- base->tcp_reinvigorated = 0;
- newstickies = 1;
- }
- base->tcp_stickies = newstickies;
- verbose(VERB_CLIENT, "winsock_event handle_select end");
- return 0;
-}
-
-int event_base_dispatch(struct event_base *base)
-{
- struct timeval wait;
- if(settime(base) < 0)
- return -1;
- while(!base->need_to_exit)
- {
- /* see if timeouts need handling */
- handle_timeouts(base, base->time_tv, &wait);
- if(base->need_to_exit)
- return 0;
- /* do select */
- if(handle_select(base, &wait) < 0) {
- if(base->need_to_exit)
- return 0;
- return -1;
- }
- }
- return 0;
-}
-
-int event_base_loopexit(struct event_base *base,
- struct timeval * ATTR_UNUSED(tv))
-{
- verbose(VERB_CLIENT, "winsock_event loopexit");
- base->need_to_exit = 1;
- return 0;
-}
-
-void event_base_free(struct event_base *base)
-{
- verbose(VERB_CLIENT, "winsock_event event_base_free");
- if(!base)
- return;
- free(base->items);
- free(base->times);
- free(base->signals);
- free(base);
-}
-
-void event_set(struct event *ev, int fd, short bits,
- void (*cb)(int, short, void *), void *arg)
-{
- ev->node.key = ev;
- ev->ev_fd = fd;
- ev->ev_events = bits;
- ev->ev_callback = cb;
- fptr_ok(fptr_whitelist_event(ev->ev_callback));
- ev->ev_arg = arg;
- ev->just_checked = 0;
- ev->added = 0;
-}
-
-int event_base_set(struct event_base *base, struct event *ev)
-{
- ev->ev_base = base;
- ev->old_events = 0;
- ev->stick_events = 0;
- ev->added = 0;
- return 0;
-}
-
-int event_add(struct event *ev, struct timeval *tv)
-{
- verbose(VERB_ALGO, "event_add %p added=%d fd=%d tv=" ARG_LL "d %s%s%s",
- ev, ev->added, ev->ev_fd,
- (tv?(long long)tv->tv_sec*1000+(long long)tv->tv_usec/1000:-1),
- (ev->ev_events&EV_READ)?" EV_READ":"",
- (ev->ev_events&EV_WRITE)?" EV_WRITE":"",
- (ev->ev_events&EV_TIMEOUT)?" EV_TIMEOUT":"");
- if(ev->added)
- event_del(ev);
- log_assert(ev->ev_fd==-1 || find_fd(ev->ev_base, ev->ev_fd) == -1);
- ev->is_tcp = 0;
- ev->is_signal = 0;
- ev->just_checked = 0;
-
- if((ev->ev_events&(EV_READ|EV_WRITE)) && ev->ev_fd != -1) {
- BOOL b=0;
- int t, l;
- long events = 0;
-
- if(ev->ev_base->max == ev->ev_base->cap)
- return -1;
- ev->idx = ev->ev_base->max++;
- ev->ev_base->items[ev->idx] = ev;
-
- if( (ev->ev_events&EV_READ) )
- events |= FD_READ;
- if( (ev->ev_events&EV_WRITE) )
- events |= FD_WRITE;
- l = sizeof(t);
- if(getsockopt(ev->ev_fd, SOL_SOCKET, SO_TYPE,
- (void*)&t, &l) != 0)
- log_err("getsockopt(SO_TYPE) failed: %s",
- wsa_strerror(WSAGetLastError()));
- if(t == SOCK_STREAM) {
- /* TCP socket */
- ev->is_tcp = 1;
- events |= FD_CLOSE;
- if( (ev->ev_events&EV_WRITE) )
- events |= FD_CONNECT;
- l = sizeof(b);
- if(getsockopt(ev->ev_fd, SOL_SOCKET, SO_ACCEPTCONN,
- (void*)&b, &l) != 0)
- log_err("getsockopt(SO_ACCEPTCONN) failed: %s",
- wsa_strerror(WSAGetLastError()));
- if(b) /* TCP accept socket */
- events |= FD_ACCEPT;
- }
- ev->hEvent = WSACreateEvent();
- if(ev->hEvent == WSA_INVALID_EVENT)
- log_err("WSACreateEvent failed: %s",
- wsa_strerror(WSAGetLastError()));
- /* automatically sets fd to nonblocking mode.
- * nonblocking cannot be disabled, until wsaES(fd, NULL, 0) */
- if(WSAEventSelect(ev->ev_fd, ev->hEvent, events) != 0) {
- log_err("WSAEventSelect failed: %s",
- wsa_strerror(WSAGetLastError()));
- }
- if(ev->is_tcp && ev->stick_events &&
- (ev->ev_events & ev->old_events)) {
- /* go to processing the sticky event right away */
- ev->ev_base->tcp_reinvigorated = 1;
- }
- }
-
- if(tv && (ev->ev_events&EV_TIMEOUT)) {
-#ifndef S_SPLINT_S
- struct timeval *now = ev->ev_base->time_tv;
- ev->ev_timeout.tv_sec = tv->tv_sec + now->tv_sec;
- ev->ev_timeout.tv_usec = tv->tv_usec + now->tv_usec;
- while(ev->ev_timeout.tv_usec > 1000000) {
- ev->ev_timeout.tv_usec -= 1000000;
- ev->ev_timeout.tv_sec++;
- }
-#endif
- (void)rbtree_insert(ev->ev_base->times, &ev->node);
- }
- ev->added = 1;
- return 0;
-}
-
-int event_del(struct event *ev)
-{
- verbose(VERB_ALGO, "event_del %p added=%d fd=%d tv=" ARG_LL "d %s%s%s",
- ev, ev->added, ev->ev_fd,
- (ev->ev_events&EV_TIMEOUT)?(long long)ev->ev_timeout.tv_sec*1000+
- (long long)ev->ev_timeout.tv_usec/1000:-1,
- (ev->ev_events&EV_READ)?" EV_READ":"",
- (ev->ev_events&EV_WRITE)?" EV_WRITE":"",
- (ev->ev_events&EV_TIMEOUT)?" EV_TIMEOUT":"");
- if(!ev->added)
- return 0;
- log_assert(ev->added);
- if((ev->ev_events&EV_TIMEOUT))
- (void)rbtree_delete(ev->ev_base->times, &ev->node);
- if((ev->ev_events&(EV_READ|EV_WRITE)) && ev->ev_fd != -1) {
- log_assert(ev->ev_base->max > 0);
- /* remove item and compact the list */
- ev->ev_base->items[ev->idx] =
- ev->ev_base->items[ev->ev_base->max-1];
- ev->ev_base->items[ev->ev_base->max-1] = NULL;
- ev->ev_base->max--;
- if(ev->idx < ev->ev_base->max)
- ev->ev_base->items[ev->idx]->idx = ev->idx;
- zero_waitfor(ev->ev_base->waitfor, ev->hEvent);
-
- if(WSAEventSelect(ev->ev_fd, ev->hEvent, 0) != 0)
- log_err("WSAEventSelect(disable) failed: %s",
- wsa_strerror(WSAGetLastError()));
- if(!WSACloseEvent(ev->hEvent))
- log_err("WSACloseEvent failed: %s",
- wsa_strerror(WSAGetLastError()));
- }
- ev->just_checked = 0;
- ev->added = 0;
- return 0;
-}
-
-/** which base gets to handle signals */
-static struct event_base* signal_base = NULL;
-/** signal handler */
-static RETSIGTYPE sigh(int sig)
-{
- struct event* ev;
- if(!signal_base || sig < 0 || sig >= MAX_SIG)
- return;
- ev = signal_base->signals[sig];
- if(!ev)
- return;
- fptr_ok(fptr_whitelist_event(ev->ev_callback));
- (*ev->ev_callback)(sig, EV_SIGNAL, ev->ev_arg);
-}
-
-int signal_add(struct event *ev, struct timeval * ATTR_UNUSED(tv))
-{
- if(ev->ev_fd == -1 || ev->ev_fd >= MAX_SIG)
- return -1;
- signal_base = ev->ev_base;
- ev->ev_base->signals[ev->ev_fd] = ev;
- ev->added = 1;
- if(signal(ev->ev_fd, sigh) == SIG_ERR) {
- return -1;
- }
- return 0;
-}
-
-int signal_del(struct event *ev)
-{
- if(ev->ev_fd == -1 || ev->ev_fd >= MAX_SIG)
- return -1;
- ev->ev_base->signals[ev->ev_fd] = NULL;
- ev->added = 0;
- return 0;
-}
-
-void winsock_tcp_wouldblock(struct event* ev, int eventbits)
-{
- verbose(VERB_ALGO, "winsock: tcp wouldblock %s",
- eventbits==EV_READ?"EV_READ":"EV_WRITE");
- ev->old_events &= (~eventbits);
- if(ev->old_events == 0)
- ev->stick_events = 0;
- /* in case this is the last sticky event, we could
- * possibly run an empty handler loop to reset the base
- * tcp_stickies variable
- */
-}
-
-int winsock_register_wsaevent(struct event_base* base, struct event* ev,
- WSAEVENT wsaevent, void (*cb)(int, short, void*), void* arg)
-{
- if(base->max == base->cap)
- return 0;
- memset(ev, 0, sizeof(*ev));
- ev->ev_fd = -1;
- ev->ev_events = EV_READ;
- ev->ev_callback = cb;
- ev->ev_arg = arg;
- ev->is_signal = 1;
- ev->hEvent = wsaevent;
- ev->added = 1;
- ev->ev_base = base;
- ev->idx = ev->ev_base->max++;
- ev->ev_base->items[ev->idx] = ev;
- return 1;
-}
-
-void winsock_unregister_wsaevent(struct event* ev)
-{
- if(!ev || !ev->added) return;
- log_assert(ev->added && ev->ev_base->max > 0)
- /* remove item and compact the list */
- ev->ev_base->items[ev->idx] = ev->ev_base->items[ev->ev_base->max-1];
- ev->ev_base->items[ev->ev_base->max-1] = NULL;
- ev->ev_base->max--;
- if(ev->idx < ev->ev_base->max)
- ev->ev_base->items[ev->idx]->idx = ev->idx;
- ev->added = 0;
-}
-
-#else /* USE_WINSOCK */
-/** symbol so this codefile defines symbols. pleasing ranlib on OSX 10.5 */
-int winsock_unused_symbol = 1;
-#endif /* USE_WINSOCK */
diff --git a/external/unbound/util/winsock_event.h b/external/unbound/util/winsock_event.h
deleted file mode 100644
index d6dafac8c..000000000
--- a/external/unbound/util/winsock_event.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * util/winsock_event.h - unbound event handling for winsock on windows
- *
- * Copyright (c) 2008, NLnet Labs. All rights reserved.
- *
- * This software is open source.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of the NLNET LABS nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * \file
- *
- * This file contains interface functions with the WinSock2 API on Windows.
- * It uses the winsock WSAWaitForMultipleEvents interface on a number of
- * sockets.
- *
- * Note that windows can only wait for max 64 events at one time.
- *
- * Also, file descriptors cannot be waited for.
- *
- * Named pipes are not easily available (and are not usable in select() ).
- * For interprocess communication, it is possible to wait for a hEvent to
- * be signaled by another thread.
- *
- * When a socket becomes readable, then it will not be flagged as
- * readable again until you have gotten WOULDBLOCK from a recv routine.
- * That means the event handler must store the readability (edge notify)
- * and process the incoming data until it blocks.
- * The function performing recv then has to inform the event handler that
- * the socket has blocked, and the event handler can mark it as such.
- * Thus, this file transforms the edge notify from windows to a level notify
- * that is compatible with UNIX.
- * The WSAEventSelect page says that it does do level notify, as long
- * as you call a recv/write/accept at least once when it is signalled.
- * This last bit is not true, even though documented in server2008 api docs
- * from microsoft, it does not happen at all. Instead you have to test for
- * WSAEWOULDBLOCK on a tcp stream, and only then retest the socket.
- * And before that remember the previous result as still valid.
- *
- * To stay 'fair', instead of emptying a socket completely, the event handler
- * can test the other (marked as blocking) sockets for new events.
- *
- * Additionally, TCP accept sockets get special event support.
- *
- * Socket numbers are not starting small, they can be any number (say 33060).
- * Therefore, bitmaps are not used, but arrays.
- *
- * on winsock, you must use recv() and send() for TCP reads and writes,
- * not read() and write(), those work only on files.
- *
- * Also fseek and fseeko do not work if a FILE is not fopen-ed in binary mode.
- *
- * When under a high load windows gives out lots of errors, from recvfrom
- * on udp sockets for example (WSAECONNRESET). Even though the udp socket
- * has no connection per se.
- */
-
-#ifndef UTIL_WINSOCK_EVENT_H
-#define UTIL_WINSOCK_EVENT_H
-
-#ifdef USE_WINSOCK
-
-#ifndef HAVE_EVENT_BASE_FREE
-#define HAVE_EVENT_BASE_FREE
-#endif
-
-/* redefine the calls to different names so that there is no name
- * collision with other code that uses libevent names. (that uses libunbound)*/
-#define event_init winsockevent_init
-#define event_get_version winsockevent_get_version
-#define event_get_method winsockevent_get_method
-#define event_base_dispatch winsockevent_base_dispatch
-#define event_base_loopexit winsockevent_base_loopexit
-#define event_base_free winsockevent_base_free
-#define event_set winsockevent_set
-#define event_base_set winsockevent_base_set
-#define event_add winsockevent_add
-#define event_del winsockevent_del
-#define signal_add winsocksignal_add
-#define signal_del winsocksignal_del
-
-/** event timeout */
-#define EV_TIMEOUT 0x01
-/** event fd readable */
-#define EV_READ 0x02
-/** event fd writable */
-#define EV_WRITE 0x04
-/** event signal */
-#define EV_SIGNAL 0x08
-/** event must persist */
-#define EV_PERSIST 0x10
-
-/* needs our redblack tree */
-#include "rbtree.h"
-
-/** max number of signals to support */
-#define MAX_SIG 32
-
-/** The number of items that the winsock event handler can service.
- * Windows cannot handle more anyway */
-#define WSK_MAX_ITEMS 64
-
-/**
- * event base for winsock event handler
- */
-struct event_base
-{
- /** sorted by timeout (absolute), ptr */
- rbtree_type* times;
- /** array (first part in use) of handles to work on */
- struct event** items;
- /** number of items in use in array */
- int max;
- /** capacity of array, size of array in items */
- int cap;
- /** array of 0 - maxsig of ptr to event for it */
- struct event** signals;
- /** if we need to exit */
- int need_to_exit;
- /** where to store time in seconds */
- time_t* time_secs;
- /** where to store time in microseconds */
- struct timeval* time_tv;
- /**
- * TCP streams have sticky events to them, these are not
- * reported by the windows event system anymore, we have to
- * keep reporting those events as present until wouldblock() is
- * signalled by the handler back to use.
- */
- int tcp_stickies;
- /**
- * should next cycle process reinvigorated stickies,
- * these are stickies that have been stored, but due to a new
- * event_add a sudden interest in the event has incepted.
- */
- int tcp_reinvigorated;
- /** The list of events that is currently being processed. */
- WSAEVENT waitfor[WSK_MAX_ITEMS];
-};
-
-/**
- * Event structure. Has some of the event elements.
- */
-struct event {
- /** node in timeout rbtree */
- rbnode_type node;
- /** is event already added */
- int added;
-
- /** event base it belongs to */
- struct event_base *ev_base;
- /** fd to poll or -1 for timeouts. signal number for sigs. */
- int ev_fd;
- /** what events this event is interested in, see EV_.. above. */
- short ev_events;
- /** timeout value */
- struct timeval ev_timeout;
-
- /** callback to call: fd, eventbits, userarg */
- void (*ev_callback)(int, short, void *);
- /** callback user arg */
- void *ev_arg;
-
- /* ----- nonpublic part, for winsock_event only ----- */
- /** index of this event in the items array (if added) */
- int idx;
- /** the event handle to wait for new events to become ready */
- WSAEVENT hEvent;
- /** true if this filedes is a TCP socket and needs special attention */
- int is_tcp;
- /** remembered EV_ values */
- short old_events;
- /** should remembered EV_ values be used for TCP streams.
- * Reset after WOULDBLOCK is signaled using the function. */
- int stick_events;
-
- /** true if this event is a signaling WSAEvent by the user.
- * User created and user closed WSAEvent. Only signaled/unsignaled,
- * no read/write/distinctions needed. */
- int is_signal;
- /** used during callbacks to see which events were just checked */
- int just_checked;
-};
-
-/** create event base */
-void *event_init(time_t* time_secs, struct timeval* time_tv);
-/** get version */
-const char *event_get_version(void);
-/** get polling method (select,epoll) */
-const char *event_get_method(void);
-/** run select in a loop */
-int event_base_dispatch(struct event_base *);
-/** exit that loop */
-int event_base_loopexit(struct event_base *, struct timeval *);
-/** free event base. Free events yourself */
-void event_base_free(struct event_base *);
-/** set content of event */
-void event_set(struct event *, int, short, void (*)(int, short, void *), void *);
-
-/** add event to a base. You *must* call this for every event. */
-int event_base_set(struct event_base *, struct event *);
-/** add event to make it active. You may not change it with event_set anymore */
-int event_add(struct event *, struct timeval *);
-/** remove event. You may change it again */
-int event_del(struct event *);
-
-#define evtimer_add(ev, tv) event_add(ev, tv)
-#define evtimer_del(ev) event_del(ev)
-
-/* uses different implementation. Cannot mix fd/timeouts and signals inside
- * the same struct event. create several event structs for that. */
-/** install signal handler */
-int signal_add(struct event *, struct timeval *);
-/** set signal event contents */
-#define signal_set(ev, x, cb, arg) \
- event_set(ev, x, EV_SIGNAL|EV_PERSIST, cb, arg)
-/** remove signal handler */
-int signal_del(struct event *);
-
-/** compare events in tree, based on timevalue, ptr for uniqueness */
-int mini_ev_cmp(const void* a, const void* b);
-
-/**
- * Routine for windows only, where the handling layer can signal that
- * a TCP stream encountered WSAEWOULDBLOCK for a stream and thus needs
- * retesting the event.
- * Pass if EV_READ or EV_WRITE gave wouldblock.
- */
-void winsock_tcp_wouldblock(struct event* ev, int eventbit);
-
-/**
- * Routine for windows only. where you pass a signal WSAEvent that
- * you wait for. When the event is signaled, the callback gets called.
- * The callback has to WSAResetEvent to disable the signal.
- * @param base: the event base.
- * @param ev: the event structure for data storage
- * can be passed uninitialised.
- * @param wsaevent: the WSAEvent that gets signaled.
- * @param cb: callback routine.
- * @param arg: user argument to callback routine.
- * @return false on error.
- */
-int winsock_register_wsaevent(struct event_base* base, struct event* ev,
- WSAEVENT wsaevent, void (*cb)(int, short, void*), void* arg);
-
-/**
- * Unregister a wsaevent. User has to close the WSAEVENT itself.
- * @param ev: event data storage.
- */
-void winsock_unregister_wsaevent(struct event* ev);
-
-#endif /* USE_WINSOCK */
-#endif /* UTIL_WINSOCK_EVENT_H */