summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2016-09-03 15:08:13 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2016-09-03 15:08:13 +0000
commita6533d88996e7570cf04db0d99b6012d25a953d3 (patch)
treecb1552d6fa59b30201907edc56208f6fe720c283
parent21d2013cbd382bc99b9c1a31146ec76a2792b92c (diff)
downloadsrc-test2-a6533d88996e7570cf04db0d99b6012d25a953d3.tar.gz
src-test2-a6533d88996e7570cf04db0d99b6012d25a953d3.zip
import unbound 1.5.9vendor/unbound/1.5.9
Notes
Notes: svn path=/vendor/unbound/dist/; revision=305347 svn path=/vendor/unbound/1.5.9/; revision=305348; tag=vendor/unbound/1.5.9
-rw-r--r--Makefile.in92
-rw-r--r--acx_nlnetlabs.m447
-rw-r--r--cachedb/cachedb.c702
-rw-r--r--cachedb/cachedb.h110
-rw-r--r--compat/explicit_bzero.c4
-rw-r--r--compat/getentropy_linux.c6
-rw-r--r--compat/strsep.c65
-rw-r--r--config.h.in24
-rwxr-xr-xconfigure210
-rw-r--r--configure.ac72
-rw-r--r--daemon/daemon.c10
-rw-r--r--daemon/daemon.h3
-rw-r--r--daemon/remote.c64
-rw-r--r--daemon/unbound.c71
-rw-r--r--daemon/worker.c56
-rw-r--r--dns64/dns64.c5
-rw-r--r--dnstap/dnstap.c2
-rw-r--r--doc/Changelog153
-rw-r--r--doc/README2
-rw-r--r--doc/example.conf.in13
-rw-r--r--doc/libunbound.3.in4
-rw-r--r--doc/unbound-anchor.8.in2
-rw-r--r--doc/unbound-checkconf.8.in2
-rw-r--r--doc/unbound-control.8.in2
-rw-r--r--doc/unbound-host.1.in2
-rw-r--r--doc/unbound.8.in4
-rw-r--r--doc/unbound.conf.5.in21
-rw-r--r--iterator/iter_fwd.c1
-rw-r--r--iterator/iter_utils.c21
-rw-r--r--iterator/iter_utils.h12
-rw-r--r--iterator/iterator.c119
-rw-r--r--iterator/iterator.h22
-rw-r--r--libunbound/context.h4
-rw-r--r--libunbound/libunbound.c34
-rw-r--r--libunbound/libworker.c20
-rw-r--r--libunbound/libworker.h4
-rw-r--r--libunbound/python/libunbound.i2
-rw-r--r--libunbound/ubsyms.def1
-rw-r--r--libunbound/unbound-event.h152
-rw-r--r--libunbound/worker.h15
-rw-r--r--pythonmod/pythonmod.c3
-rw-r--r--pythonmod/pythonmod_utils.c3
-rw-r--r--services/cache/dns.c7
-rw-r--r--services/listen_dnsport.c79
-rw-r--r--services/listen_dnsport.h6
-rw-r--r--services/localzone.c64
-rw-r--r--services/localzone.h4
-rw-r--r--services/mesh.c27
-rw-r--r--services/modstack.c9
-rw-r--r--services/outside_network.c89
-rw-r--r--services/outside_network.h11
-rw-r--r--sldns/keyraw.c1
-rw-r--r--sldns/parseutil.c4
-rw-r--r--sldns/rrdef.h3
-rw-r--r--sldns/str2wire.c4
-rw-r--r--sldns/wire2str.c4
-rw-r--r--smallapp/unbound-checkconf.c15
-rw-r--r--smallapp/unbound-control.c2
-rw-r--r--smallapp/worker_cb.c6
-rw-r--r--testcode/fake_event.c9
-rw-r--r--testcode/petal.c2
-rw-r--r--testcode/unitmain.c27
-rw-r--r--testcode/unitverify.c2
-rw-r--r--testdata/val_deleg_nons.rpl268
-rw-r--r--util/config_file.c210
-rw-r--r--util/config_file.h84
-rw-r--r--util/configlexer.c3974
-rw-r--r--util/configlexer.lex4
-rw-r--r--util/configparser.c1534
-rw-r--r--util/configparser.h50
-rw-r--r--util/configparser.y59
-rw-r--r--util/data/dname.c18
-rw-r--r--util/data/msgencode.c22
-rw-r--r--util/data/msgparse.c60
-rw-r--r--util/data/msgparse.h28
-rw-r--r--util/data/msgreply.c154
-rw-r--r--util/data/msgreply.h52
-rw-r--r--util/fptr_wlist.c25
-rw-r--r--util/fptr_wlist.h2
-rw-r--r--util/iana_ports.inc7
-rw-r--r--util/module.h8
-rw-r--r--util/net_help.c6
-rw-r--r--util/netevent.c381
-rw-r--r--util/netevent.h18
-rw-r--r--util/tube.c12
-rw-r--r--util/tube.h3
-rw-r--r--util/ub_event.c448
-rw-r--r--util/ub_event.h127
-rw-r--r--util/ub_event_pluggable.c694
-rw-r--r--validator/autotrust.c1
-rw-r--r--validator/val_anchor.c2
-rw-r--r--validator/val_secalgo.c156
-rw-r--r--validator/val_secalgo.h8
-rw-r--r--winrc/w_inst.c4
-rw-r--r--winrc/win_svc.c12
95 files changed, 7576 insertions, 3391 deletions
diff --git a/Makefile.in b/Makefile.in
index ff46581eb6d8..b064e655df00 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -108,11 +108,12 @@ util/fptr_wlist.c util/locks.c util/log.c util/mini_event.c util/module.c \
util/netevent.c util/net_help.c util/random.c util/rbtree.c util/regional.c \
util/rtt.c util/storage/dnstree.c util/storage/lookup3.c \
util/storage/lruhash.c util/storage/slabhash.c util/timehist.c util/tube.c \
-util/winsock_event.c validator/autotrust.c validator/val_anchor.c \
-validator/validator.c validator/val_kcache.c validator/val_kentry.c \
-validator/val_neg.c validator/val_nsec3.c validator/val_nsec.c \
-validator/val_secalgo.c validator/val_sigcrypt.c \
-validator/val_utils.c dns64/dns64.c $(CHECKLOCK_SRC) $(DNSTAP_SRC)
+util/ub_event.c util/ub_event_pluggable.c util/winsock_event.c \
+validator/autotrust.c validator/val_anchor.c validator/validator.c \
+validator/val_kcache.c validator/val_kentry.c validator/val_neg.c \
+validator/val_nsec3.c validator/val_nsec.c validator/val_secalgo.c \
+validator/val_sigcrypt.c validator/val_utils.c dns64/dns64.c cachedb/cachedb.c $(CHECKLOCK_SRC) \
+$(DNSTAP_SRC)
COMMON_OBJ_WITHOUT_NETCALL=dns.lo infra.lo rrset.lo dname.lo msgencode.lo \
as112.lo msgparse.lo msgreply.lo packed_rrset.lo iterator.lo iter_delegpt.lo \
iter_donotq.lo iter_fwd.lo iter_hints.lo iter_priv.lo iter_resptype.lo \
@@ -122,10 +123,11 @@ fptr_wlist.lo locks.lo log.lo mini_event.lo module.lo net_help.lo \
random.lo rbtree.lo regional.lo rtt.lo dnstree.lo lookup3.lo lruhash.lo \
slabhash.lo timehist.lo tube.lo winsock_event.lo autotrust.lo val_anchor.lo \
validator.lo val_kcache.lo val_kentry.lo val_neg.lo val_nsec3.lo val_nsec.lo \
-val_secalgo.lo val_sigcrypt.lo val_utils.lo dns64.lo \
+val_secalgo.lo val_sigcrypt.lo val_utils.lo dns64.lo cachedb.lo \
$(PYTHONMOD_OBJ) $(CHECKLOCK_OBJ) $(DNSTAP_OBJ)
-COMMON_OBJ=$(COMMON_OBJ_WITHOUT_NETCALL) netevent.lo listen_dnsport.lo \
+COMMON_OBJ_WITHOUT_UB_EVENT=$(COMMON_OBJ_WITHOUT_NETCALL) netevent.lo listen_dnsport.lo \
outside_network.lo
+COMMON_OBJ=$(COMMON_OBJ_WITHOUT_UB_EVENT) ub_event.lo
# set to $COMMON_OBJ or to "" if --enableallsymbols
COMMON_OBJ_ALL_SYMBOLS=@COMMON_OBJ_ALL_SYMBOLS@
COMPAT_SRC=compat/ctime_r.c compat/fake-rfc2553.c compat/gmtime_r.c \
@@ -134,7 +136,8 @@ compat/memcmp.c compat/memmove.c compat/snprintf.c compat/strlcat.c \
compat/strlcpy.c compat/strptime.c compat/getentropy_linux.c \
compat/getentropy_osx.c compat/getentropy_solaris.c compat/getentropy_win.c \
compat/explicit_bzero.c compat/arc4random.c compat/arc4random_uniform.c \
-compat/arc4_lock.c compat/sha512.c compat/reallocarray.c compat/isblank.c
+compat/arc4_lock.c compat/sha512.c compat/reallocarray.c compat/isblank.c \
+compat/strsep.c
COMPAT_OBJ=$(LIBOBJS:.o=.lo)
COMPAT_OBJ_WITHOUT_CTIME=$(LIBOBJ_WITHOUT_CTIME:.o=.lo)
COMPAT_OBJ_WITHOUT_CTIMEARC4=$(LIBOBJ_WITHOUT_CTIMEARC4:.o=.lo)
@@ -177,7 +180,8 @@ daemon/worker.c daemon/acl_list.c daemon/daemon.c daemon/stats.c \
testcode/replay.c testcode/fake_event.c
TESTBOUND_OBJ=testbound.lo replay.lo fake_event.lo
TESTBOUND_OBJ_LINK=$(TESTBOUND_OBJ) testpkts.lo worker.lo acl_list.lo \
-daemon.lo stats.lo $(COMMON_OBJ_WITHOUT_NETCALL) $(SLDNS_OBJ) $(COMPAT_OBJ)
+daemon.lo stats.lo $(COMMON_OBJ_WITHOUT_NETCALL) ub_event.lo $(SLDNS_OBJ) \
+$(COMPAT_OBJ)
LOCKVERIFY_SRC=testcode/lock_verify.c
LOCKVERIFY_OBJ=lock_verify.lo
LOCKVERIFY_OBJ_LINK=$(LOCKVERIFY_OBJ) worker_cb.lo $(COMMON_OBJ) $(COMPAT_OBJ) \
@@ -209,8 +213,8 @@ DELAYER_OBJ_LINK=$(DELAYER_OBJ) worker_cb.lo $(COMMON_OBJ) $(COMPAT_OBJ) \
$(SLDNS_OBJ)
LIBUNBOUND_SRC=libunbound/context.c libunbound/libunbound.c \
libunbound/libworker.c
-LIBUNBOUND_OBJ=context.lo libunbound.lo libworker.lo
-LIBUNBOUND_OBJ_LINK=$(LIBUNBOUND_OBJ) $(COMMON_OBJ) $(SLDNS_OBJ) $(COMPAT_OBJ)
+LIBUNBOUND_OBJ=context.lo libunbound.lo libworker.lo ub_event_pluggable.lo
+LIBUNBOUND_OBJ_LINK=$(LIBUNBOUND_OBJ) $(COMMON_OBJ_WITHOUT_UB_EVENT) $(SLDNS_OBJ) $(COMPAT_OBJ)
# win apps or "" if not on windows
WINAPPS=@WINAPPS@
@@ -552,7 +556,7 @@ uninstall: $(PYTHONMOD_UNINSTALL) $(PYUNBOUND_UNINSTALL) $(UNBOUND_EVENT_UNINSTA
@echo "You still need to remove "`dirname $(DESTDIR)$(configfile)`" , $(DESTDIR)$(configfile) by hand"
iana_update:
- curl -o port-numbers.tmp http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml --compressed
+ curl -o port-numbers.tmp https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml --compressed
if file port-numbers.tmp | grep 'gzip' >/dev/null; then zcat port-numbers.tmp; else cat port-numbers.tmp; fi | awk '/<record>/ {p=0;} /<protocol>udp/ {p=1;} /<protocol>[^u]/ {p=0;} /Decomissioned|Decommissioned|Removed|De-registered|unassigned|Unassigned|Reserved/ {u=1;} /<number>/ { if(u==1) {u=0;} else { if(p==1) { match($$0,/[0-9]+/); print substr($$0, RSTART, RLENGTH) ","}}}' | sort -nu > util/iana_ports.inc
rm -f port-numbers.tmp
@@ -596,7 +600,6 @@ depend:
rm -f $(DEPEND_TMP) $(DEPEND_TMP2)
# Dependencies
-as112.lo as112.o: $(srcdir)/util/as112.c $(srcdir)/util/as112.h
dns.lo dns.o: $(srcdir)/services/cache/dns.c config.h $(srcdir)/iterator/iter_delegpt.h $(srcdir)/util/log.h \
$(srcdir)/validator/val_nsec.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
$(srcdir)/util/locks.h $(srcdir)/services/cache/dns.h $(srcdir)/util/data/msgreply.h \
@@ -614,6 +617,7 @@ rrset.lo rrset.o: $(srcdir)/services/cache/rrset.c config.h $(srcdir)/services/c
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/storage/slabhash.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/config_file.h \
$(srcdir)/util/data/msgreply.h $(srcdir)/util/regional.h $(srcdir)/util/alloc.h
+as112.lo as112.o: $(srcdir)/util/as112.c $(srcdir)/util/as112.h
dname.lo dname.o: $(srcdir)/util/data/dname.c config.h $(srcdir)/util/data/dname.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/data/msgparse.h \
$(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/storage/lookup3.h $(srcdir)/sldns/sbuffer.h
@@ -624,9 +628,9 @@ msgencode.lo msgencode.o: $(srcdir)/util/data/msgencode.c config.h $(srcdir)/uti
$(srcdir)/sldns/sbuffer.h
msgparse.lo msgparse.o: $(srcdir)/util/data/msgparse.c config.h $(srcdir)/util/data/msgparse.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/sldns/pkthdr.h \
- $(srcdir)/sldns/rrdef.h $(srcdir)/util/data/dname.h $(srcdir)/util/data/packed_rrset.h \
- $(srcdir)/util/storage/lookup3.h $(srcdir)/util/regional.h $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/parseutil.h \
- $(srcdir)/sldns/wire2str.h
+ $(srcdir)/sldns/rrdef.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/regional.h $(srcdir)/sldns/sbuffer.h \
+ $(srcdir)/sldns/parseutil.h $(srcdir)/sldns/wire2str.h
msgreply.lo msgreply.o: $(srcdir)/util/data/msgreply.c config.h $(srcdir)/util/data/msgreply.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/data/packed_rrset.h \
$(srcdir)/util/storage/lookup3.h $(srcdir)/util/alloc.h $(srcdir)/util/netevent.h $(srcdir)/util/net_help.h \
@@ -718,7 +722,7 @@ modstack.lo modstack.o: $(srcdir)/services/modstack.c config.h $(srcdir)/service
$(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/netevent.h \
$(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h $(srcdir)/dns64/dns64.h \
$(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/validator/validator.h \
- $(srcdir)/validator/val_utils.h
+ $(srcdir)/validator/val_utils.h $(PYTHONMOD_HEADER) $(srcdir)/cachedb/cachedb.h
outbound_list.lo outbound_list.o: $(srcdir)/services/outbound_list.c config.h \
$(srcdir)/services/outbound_list.h $(srcdir)/services/outside_network.h $(srcdir)/util/rbtree.h \
$(srcdir)/util/netevent.h
@@ -762,7 +766,8 @@ fptr_wlist.lo fptr_wlist.o: $(srcdir)/util/fptr_wlist.c config.h $(srcdir)/util/
$(srcdir)/validator/val_nsec3.h $(srcdir)/validator/val_sigcrypt.h $(srcdir)/validator/val_kentry.h \
$(srcdir)/validator/val_neg.h $(srcdir)/validator/autotrust.h $(srcdir)/libunbound/libworker.h \
$(srcdir)/libunbound/context.h $(srcdir)/util/alloc.h $(srcdir)/libunbound/unbound.h \
- $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/config_file.h
+ $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/config_file.h \
+ $(PYTHONMOD_HEADER) $(srcdir)/cachedb/cachedb.h
locks.lo locks.o: $(srcdir)/util/locks.c config.h $(srcdir)/util/locks.h $(srcdir)/util/log.h
log.lo log.o: $(srcdir)/util/log.c config.h $(srcdir)/util/log.h $(srcdir)/util/locks.h $(srcdir)/sldns/sbuffer.h
mini_event.lo mini_event.o: $(srcdir)/util/mini_event.c config.h $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h \
@@ -773,12 +778,12 @@ mini_event.lo mini_event.o: $(srcdir)/util/mini_event.c config.h $(srcdir)/util/
module.lo module.o: $(srcdir)/util/module.c config.h $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h \
$(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
$(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h
-netevent.lo netevent.o: $(srcdir)/util/netevent.c config.h $(srcdir)/util/netevent.h $(srcdir)/util/log.h \
- $(srcdir)/util/net_help.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
- $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
+netevent.lo netevent.o: $(srcdir)/util/netevent.c config.h $(srcdir)/util/netevent.h $(srcdir)/util/ub_event.h \
+ $(srcdir)/util/log.h $(srcdir)/util/net_help.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
$(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h \
$(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h $(srcdir)/sldns/sbuffer.h \
- $(srcdir)/dnstap/dnstap.h $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h
+ $(srcdir)/dnstap/dnstap.h
net_help.lo net_help.o: $(srcdir)/util/net_help.c config.h $(srcdir)/util/net_help.h $(srcdir)/util/log.h \
$(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/module.h \
$(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \
@@ -808,7 +813,15 @@ tube.lo tube.o: $(srcdir)/util/tube.c config.h $(srcdir)/util/tube.h $(srcdir)/u
$(srcdir)/util/netevent.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
$(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
$(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/services/mesh.h \
- $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h
+ $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h $(srcdir)/util/ub_event.h
+ub_event.lo ub_event.o: $(srcdir)/util/ub_event.c config.h $(srcdir)/util/ub_event.h $(srcdir)/util/log.h \
+ $(srcdir)/util/netevent.h $(srcdir)/util/tube.h $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h
+ub_event_pluggable.lo ub_event_pluggable.o: $(srcdir)/util/ub_event_pluggable.c config.h $(srcdir)/util/ub_event.h \
+ $(srcdir)/libunbound/unbound-event.h $(srcdir)/util/netevent.h $(srcdir)/util/log.h $(srcdir)/util/fptr_wlist.h \
+ $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
+ $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
+ $(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/services/modstack.h $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h
winsock_event.lo winsock_event.o: $(srcdir)/util/winsock_event.c config.h
autotrust.lo autotrust.o: $(srcdir)/validator/autotrust.c config.h $(srcdir)/validator/autotrust.h \
$(srcdir)/util/rbtree.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
@@ -822,8 +835,8 @@ autotrust.lo autotrust.o: $(srcdir)/validator/autotrust.c config.h $(srcdir)/val
val_anchor.lo val_anchor.o: $(srcdir)/validator/val_anchor.c config.h $(srcdir)/validator/val_anchor.h \
$(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/validator/val_sigcrypt.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/validator/autotrust.h \
- $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h $(srcdir)/sldns/sbuffer.h \
- $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/str2wire.h $(srcdir)/util/as112.h
+ $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h $(srcdir)/util/as112.h \
+ $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/str2wire.h
validator.lo validator.o: $(srcdir)/validator/validator.c config.h $(srcdir)/validator/validator.h \
$(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \
@@ -880,7 +893,7 @@ val_utils.lo val_utils.o: $(srcdir)/validator/val_utils.c config.h $(srcdir)/val
$(srcdir)/validator/val_sigcrypt.h $(srcdir)/validator/val_anchor.h $(srcdir)/util/rbtree.h \
$(srcdir)/validator/val_nsec.h $(srcdir)/validator/val_neg.h $(srcdir)/services/cache/rrset.h \
$(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/dns.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/net_help.h $(srcdir)/util/regional.h
+ $(srcdir)/util/net_help.h $(srcdir)/util/regional.h $(srcdir)/sldns/wire2str.h $(srcdir)/sldns/parseutil.h
dns64.lo dns64.o: $(srcdir)/dns64/dns64.c config.h $(srcdir)/dns64/dns64.h $(srcdir)/util/module.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/data/msgreply.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
@@ -888,6 +901,14 @@ dns64.lo dns64.o: $(srcdir)/dns64/dns64.c config.h $(srcdir)/dns64/dns64.h $(src
$(srcdir)/util/storage/slabhash.h $(srcdir)/util/config_file.h $(srcdir)/util/fptr_wlist.h \
$(srcdir)/util/netevent.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
$(srcdir)/services/modstack.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h
+cachedb.lo cachedb.o: $(srcdir)/cachedb/cachedb.c config.h $(srcdir)/cachedb/cachedb.h $(srcdir)/util/module.h \
+ $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/data/msgreply.h \
+ $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
+ $(srcdir)/sldns/rrdef.h $(srcdir)/util/regional.h $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h \
+ $(srcdir)/util/data/msgencode.h $(srcdir)/services/cache/dns.h $(srcdir)/validator/val_neg.h \
+ $(srcdir)/util/rbtree.h $(srcdir)/validator/val_secalgo.h $(srcdir)/iterator/iter_utils.h \
+ $(srcdir)/iterator/iter_resptype.h $(srcdir)/sldns/parseutil.h $(srcdir)/sldns/wire2str.h \
+ $(srcdir)/sldns/sbuffer.h
checklocks.lo checklocks.o: $(srcdir)/testcode/checklocks.c config.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/testcode/checklocks.h
unitanchor.lo unitanchor.o: $(srcdir)/testcode/unitanchor.c config.h $(srcdir)/util/log.h $(srcdir)/util/data/dname.h \
@@ -994,7 +1015,7 @@ unbound.lo unbound.o: $(srcdir)/daemon/unbound.c config.h $(srcdir)/util/log.h $
$(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/rtt.h $(srcdir)/util/fptr_wlist.h \
$(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/net_help.h \
- $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h
+ $(srcdir)/util/ub_event.h
worker.lo worker.o: $(srcdir)/daemon/worker.c config.h $(srcdir)/util/log.h $(srcdir)/util/net_help.h \
$(srcdir)/util/random.h $(srcdir)/daemon/worker.h $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
@@ -1020,7 +1041,7 @@ testbound.lo testbound.o: $(srcdir)/testcode/testbound.c config.h $(srcdir)/test
$(srcdir)/util/data/packed_rrset.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/util/rtt.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
$(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h \
- $(srcdir)/services/mesh.h $(srcdir)/util/net_help.h $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h
+ $(srcdir)/services/mesh.h $(srcdir)/util/net_help.h $(srcdir)/util/ub_event.h
testpkts.lo testpkts.o: $(srcdir)/testcode/testpkts.c config.h $(srcdir)/testcode/testpkts.h \
$(srcdir)/util/net_help.h $(srcdir)/util/log.h $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/pkthdr.h \
$(srcdir)/sldns/str2wire.h $(srcdir)/sldns/wire2str.h
@@ -1101,7 +1122,7 @@ unbound-checkconf.lo unbound-checkconf.o: $(srcdir)/smallapp/unbound-checkconf.c
$(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/iterator/iter_fwd.h \
$(srcdir)/util/rbtree.h $(srcdir)/iterator/iter_hints.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/validator/validator.h $(srcdir)/validator/val_utils.h $(srcdir)/services/localzone.h \
- $(srcdir)/sldns/sbuffer.h
+ $(srcdir)/sldns/sbuffer.h $(PYTHONMOD_HEADER)
worker_cb.lo worker_cb.o: $(srcdir)/smallapp/worker_cb.c config.h $(srcdir)/libunbound/context.h \
$(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/alloc.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h \
$(srcdir)/libunbound/unbound.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
@@ -1121,9 +1142,10 @@ libunbound.lo libunbound.o: $(srcdir)/libunbound/libunbound.c $(srcdir)/libunbou
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/libunbound/libworker.h \
$(srcdir)/util/config_file.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
$(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/regional.h \
- $(srcdir)/util/random.h $(srcdir)/util/net_help.h $(srcdir)/util/tube.h $(srcdir)/services/localzone.h \
- $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rtt.h \
- $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h $(srcdir)/sldns/sbuffer.h
+ $(srcdir)/util/random.h $(srcdir)/util/net_help.h $(srcdir)/util/tube.h $(srcdir)/util/ub_event.h \
+ $(srcdir)/services/localzone.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h \
+ $(srcdir)/util/rtt.h $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h \
+ $(srcdir)/sldns/sbuffer.h
libworker.lo libworker.o: $(srcdir)/libunbound/libworker.c config.h $(srcdir)/libunbound/libworker.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/libunbound/context.h $(srcdir)/util/alloc.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h \
@@ -1163,14 +1185,15 @@ pythonmod_utils.lo pythonmod_utils.o: $(srcdir)/pythonmod/pythonmod_utils.c conf
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/util/netevent.h $(srcdir)/util/net_help.h $(srcdir)/services/cache/dns.h \
$(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h $(srcdir)/util/regional.h \
- $(srcdir)/iterator/iter_delegpt.h $(srcdir)/sldns/sbuffer.h
+ $(srcdir)/iterator/iter_delegpt.h $(srcdir)/sldns/sbuffer.h \
+
win_svc.lo win_svc.o: $(srcdir)/winrc/win_svc.c config.h $(srcdir)/winrc/win_svc.h $(srcdir)/winrc/w_inst.h \
$(srcdir)/daemon/daemon.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/alloc.h $(srcdir)/services/modstack.h \
$(srcdir)/daemon/worker.h $(srcdir)/libunbound/worker.h \
$(srcdir)/sldns/sbuffer.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
$(srcdir)/util/netevent.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/daemon/stats.h $(srcdir)/util/timehist.h $(srcdir)/util/module.h \
- $(srcdir)/dnstap/dnstap.h $(srcdir)/daemon/remote.h $(srcdir)/util/config_file.h $(srcdir)/util/winsock_event.h
+ $(srcdir)/dnstap/dnstap.h $(srcdir)/daemon/remote.h $(srcdir)/util/config_file.h $(srcdir)/util/ub_event.h
w_inst.lo w_inst.o: $(srcdir)/winrc/w_inst.c config.h $(srcdir)/winrc/w_inst.h $(srcdir)/winrc/win_svc.h
unbound-service-install.lo unbound-service-install.o: $(srcdir)/winrc/unbound-service-install.c config.h \
$(srcdir)/winrc/w_inst.h
@@ -1202,6 +1225,7 @@ snprintf.lo snprintf.o: $(srcdir)/compat/snprintf.c config.h
strlcat.lo strlcat.o: $(srcdir)/compat/strlcat.c config.h
strlcpy.lo strlcpy.o: $(srcdir)/compat/strlcpy.c config.h
strptime.lo strptime.o: $(srcdir)/compat/strptime.c config.h
+strsep.lo strsep.o: $(srcdir)/compat/strsep.c config.h
getentropy_linux.lo getentropy_linux.o: $(srcdir)/compat/getentropy_linux.c config.h
getentropy_osx.lo getentropy_osx.o: $(srcdir)/compat/getentropy_osx.c config.h
getentropy_solaris.lo getentropy_solaris.o: $(srcdir)/compat/getentropy_solaris.c config.h
diff --git a/acx_nlnetlabs.m4 b/acx_nlnetlabs.m4
index d43b66e2dd79..a6c174f1c421 100644
--- a/acx_nlnetlabs.m4
+++ b/acx_nlnetlabs.m4
@@ -2,7 +2,9 @@
# Copyright 2009, Wouter Wijngaards, NLnet Labs.
# BSD licensed.
#
-# Version 32
+# Version 34
+# 2016-03-21 Check -ldl -pthread for libcrypto for ldns and openssl 1.1.0.
+# 2016-03-21 Use HMAC_Update instead of HMAC_CTX_Init (for openssl-1.1.0).
# 2016-01-04 -D_DEFAULT_SOURCE defined with -D_BSD_SOURCE for Linux glibc 2.20
# 2015-12-11 FLTO check for new OSX, clang.
# 2015-11-18 spelling check fix.
@@ -671,16 +673,16 @@ AC_DEFUN([ACX_SSL_CHECKS], [
ACX_RUNTIME_PATH_ADD([$ssldir/lib])
fi
- AC_MSG_CHECKING([for HMAC_CTX_init in -lcrypto])
+ AC_MSG_CHECKING([for HMAC_Update in -lcrypto])
LIBS="$LIBS -lcrypto"
LIBSSL_LIBS="$LIBSSL_LIBS -lcrypto"
AC_TRY_LINK(, [
- int HMAC_CTX_init(void);
- (void)HMAC_CTX_init();
+ int HMAC_Update(void);
+ (void)HMAC_Update();
], [
AC_MSG_RESULT(yes)
- AC_DEFINE([HAVE_HMAC_CTX_INIT], 1,
- [If you have HMAC_CTX_init])
+ AC_DEFINE([HAVE_HMAC_UPDATE], 1,
+ [If you have HMAC_Update])
], [
AC_MSG_RESULT(no)
# check if -lwsock32 or -lgdi32 are needed.
@@ -690,11 +692,11 @@ AC_DEFUN([ACX_SSL_CHECKS], [
LIBSSL_LIBS="$LIBSSL_LIBS -lgdi32"
AC_MSG_CHECKING([if -lcrypto needs -lgdi32])
AC_TRY_LINK([], [
- int HMAC_CTX_init(void);
- (void)HMAC_CTX_init();
+ int HMAC_Update(void);
+ (void)HMAC_Update();
],[
- AC_DEFINE([HAVE_HMAC_CTX_INIT], 1,
- [If you have HMAC_CTX_init])
+ AC_DEFINE([HAVE_HMAC_UPDATE], 1,
+ [If you have HMAC_Update])
AC_MSG_RESULT(yes)
],[
AC_MSG_RESULT(no)
@@ -704,15 +706,30 @@ AC_DEFUN([ACX_SSL_CHECKS], [
LIBSSL_LIBS="$LIBSSL_LIBS -ldl"
AC_MSG_CHECKING([if -lcrypto needs -ldl])
AC_TRY_LINK([], [
- int HMAC_CTX_init(void);
- (void)HMAC_CTX_init();
+ int HMAC_Update(void);
+ (void)HMAC_Update();
],[
- AC_DEFINE([HAVE_HMAC_CTX_INIT], 1,
- [If you have HMAC_CTX_init])
+ AC_DEFINE([HAVE_HMAC_UPDATE], 1,
+ [If you have HMAC_Update])
AC_MSG_RESULT(yes)
],[
AC_MSG_RESULT(no)
- AC_MSG_ERROR([OpenSSL found in $ssldir, but version 0.9.7 or higher is required])
+ LIBS="$BAKLIBS"
+ LIBSSL_LIBS="$BAKSSLLIBS"
+ LIBS="$LIBS -ldl -pthread"
+ LIBSSL_LIBS="$LIBSSL_LIBS -ldl -pthread"
+ AC_MSG_CHECKING([if -lcrypto needs -ldl -pthread])
+ AC_TRY_LINK([], [
+ int HMAC_Update(void);
+ (void)HMAC_Update();
+ ],[
+ AC_DEFINE([HAVE_HMAC_UPDATE], 1,
+ [If you have HMAC_Update])
+ AC_MSG_RESULT(yes)
+ ],[
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR([OpenSSL found in $ssldir, but version 0.9.7 or higher is required])
+ ])
])
])
])
diff --git a/cachedb/cachedb.c b/cachedb/cachedb.c
new file mode 100644
index 000000000000..76d9afa47c8f
--- /dev/null
+++ b/cachedb/cachedb.c
@@ -0,0 +1,702 @@
+/*
+ * cachedb/cachedb.c - cache from a database external to the program module
+ *
+ * Copyright (c) 2016, 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 module that uses an external database to cache
+ * dns responses.
+ */
+
+#include "config.h"
+#ifdef USE_CACHEDB
+#include "cachedb/cachedb.h"
+#include "util/regional.h"
+#include "util/net_help.h"
+#include "util/config_file.h"
+#include "util/data/msgreply.h"
+#include "util/data/msgencode.h"
+#include "services/cache/dns.h"
+#include "validator/val_neg.h"
+#include "validator/val_secalgo.h"
+#include "iterator/iter_utils.h"
+#include "sldns/parseutil.h"
+#include "sldns/wire2str.h"
+#include "sldns/sbuffer.h"
+
+#define CACHEDB_HASHSIZE 256 /* bit hash */
+
+/** the unit test testframe for cachedb, its module state contains
+ * a cache for a couple queries (in memory). */
+struct testframe_moddata {
+ /** key for single stored data element, NULL if none */
+ char* stored_key;
+ /** data for single stored data element, NULL if none */
+ uint8_t* stored_data;
+ /** length of stored data */
+ size_t stored_datalen;
+};
+
+static int
+testframe_init(struct module_env* env, struct cachedb_env* cachedb_env)
+{
+ (void)env;
+ verbose(VERB_ALGO, "testframe_init");
+ cachedb_env->backend_data = (void*)calloc(1,
+ sizeof(struct testframe_moddata));
+ if(!cachedb_env->backend_data) {
+ log_err("out of memory");
+ return 0;
+ }
+ return 1;
+}
+
+static void
+testframe_deinit(struct module_env* env, struct cachedb_env* cachedb_env)
+{
+ struct testframe_moddata* d = (struct testframe_moddata*)
+ cachedb_env->backend_data;
+ (void)env;
+ verbose(VERB_ALGO, "testframe_deinit");
+ if(!d)
+ return;
+ free(d->stored_key);
+ free(d->stored_data);
+ free(d);
+}
+
+static int
+testframe_lookup(struct module_env* env, struct cachedb_env* cachedb_env,
+ char* key, struct sldns_buffer* result_buffer)
+{
+ struct testframe_moddata* d = (struct testframe_moddata*)
+ cachedb_env->backend_data;
+ (void)env;
+ verbose(VERB_ALGO, "testframe_lookup of %s", key);
+ if(d->stored_key && strcmp(d->stored_key, key) == 0) {
+ if(d->stored_datalen > sldns_buffer_capacity(result_buffer))
+ return 0; /* too large */
+ verbose(VERB_ALGO, "testframe_lookup found %d bytes",
+ (int)d->stored_datalen);
+ sldns_buffer_clear(result_buffer);
+ sldns_buffer_write(result_buffer, d->stored_data,
+ d->stored_datalen);
+ sldns_buffer_flip(result_buffer);
+ return 1;
+ }
+ return 0;
+}
+
+static void
+testframe_store(struct module_env* env, struct cachedb_env* cachedb_env,
+ char* key, uint8_t* data, size_t data_len)
+{
+ struct testframe_moddata* d = (struct testframe_moddata*)
+ cachedb_env->backend_data;
+ (void)env;
+ verbose(VERB_ALGO, "testframe_store %s (%d bytes)", key, (int)data_len);
+
+ /* free old data element (if any) */
+ free(d->stored_key);
+ d->stored_key = NULL;
+ free(d->stored_data);
+ d->stored_data = NULL;
+ d->stored_datalen = 0;
+
+ d->stored_data = memdup(data, data_len);
+ if(!d->stored_data) {
+ log_err("out of memory");
+ return;
+ }
+ d->stored_datalen = data_len;
+ d->stored_key = strdup(key);
+ if(!d->stored_key) {
+ free(d->stored_data);
+ d->stored_data = NULL;
+ d->stored_datalen = 0;
+ return;
+ }
+ /* (key,data) successfully stored */
+}
+
+/** The testframe backend is for unit tests */
+static struct cachedb_backend testframe_backend = { "testframe",
+ testframe_init, testframe_deinit, testframe_lookup, testframe_store
+};
+
+/** find a particular backend from possible backends */
+static struct cachedb_backend*
+cachedb_find_backend(const char* str)
+{
+ if(strcmp(str, testframe_backend.name) == 0)
+ return &testframe_backend;
+ /* TODO add more backends here */
+ return NULL;
+}
+
+/** apply configuration to cachedb module 'global' state */
+static int
+cachedb_apply_cfg(struct cachedb_env* cachedb_env, struct config_file* cfg)
+{
+ const char* backend_str = "testframe"; /* TODO get from cfg */
+ if(backend_str && backend_str[0]) {
+ cachedb_env->backend = cachedb_find_backend(backend_str);
+ if(!cachedb_env->backend) {
+ log_err("cachedb: cannot find backend name '%s",
+ backend_str);
+ return NULL;
+ }
+ }
+ /* TODO see if more configuration needs to be applied or not */
+ return 1;
+}
+
+int
+cachedb_init(struct module_env* env, int id)
+{
+ struct cachedb_env* cachedb_env = (struct cachedb_env*)calloc(1,
+ sizeof(struct cachedb_env));
+ if(!cachedb_env) {
+ log_err("malloc failure");
+ return 0;
+ }
+ env->modinfo[id] = (void*)cachedb_env;
+ if(!cachedb_apply_cfg(cachedb_env, env->cfg)) {
+ log_err("cachedb: could not apply configuration settings.");
+ return 0;
+ }
+ /* see if a backend is selected */
+ if(!cachedb_env->backend || !cachedb_env->backend->name)
+ return 1;
+ if(!(*cachedb_env->backend->init)(env, cachedb_env)) {
+ log_err("cachedb: could not init %s backend",
+ cachedb_env->backend->name);
+ return 0;
+ }
+ cachedb_env->enabled = 1;
+ return 1;
+}
+
+void
+cachedb_deinit(struct module_env* env, int id)
+{
+ struct cachedb_env* cachedb_env;
+ if(!env || !env->modinfo[id])
+ return;
+ cachedb_env = (struct cachedb_env*)env->modinfo[id];
+ /* free contents */
+ /* TODO */
+ if(cachedb_env->enabled) {
+ (*cachedb_env->backend->deinit)(env, cachedb_env);
+ }
+
+ free(cachedb_env);
+ env->modinfo[id] = NULL;
+}
+
+/** new query for cachedb */
+static int
+cachedb_new(struct module_qstate* qstate, int id)
+{
+ struct cachedb_qstate* iq = (struct cachedb_qstate*)regional_alloc(
+ qstate->region, sizeof(struct cachedb_qstate));
+ qstate->minfo[id] = iq;
+ if(!iq)
+ return 0;
+ memset(iq, 0, sizeof(*iq));
+ /* initialise it */
+ /* TODO */
+
+ return 1;
+}
+
+/**
+ * Return an error
+ * @param qstate: our query state
+ * @param id: module id
+ * @param rcode: error code (DNS errcode).
+ * @return: 0 for use by caller, to make notation easy, like:
+ * return error_response(..).
+ */
+static int
+error_response(struct module_qstate* qstate, int id, int rcode)
+{
+ verbose(VERB_QUERY, "return error response %s",
+ sldns_lookup_by_id(sldns_rcodes, rcode)?
+ sldns_lookup_by_id(sldns_rcodes, rcode)->name:"??");
+ qstate->return_rcode = rcode;
+ qstate->return_msg = NULL;
+ qstate->ext_state[id] = module_finished;
+ return 0;
+}
+
+/**
+ * Hash the query name, type, class and dbacess-secret into lookup buffer.
+ * @param qstate: query state with query info
+ * and env->cfg with secret.
+ * @param buf: returned buffer with hash to lookup
+ * @param len: length of the buffer.
+ */
+static void
+calc_hash(struct module_qstate* qstate, char* buf, size_t len)
+{
+ uint8_t clear[1024];
+ size_t clen = 0;
+ uint8_t hash[CACHEDB_HASHSIZE/8];
+ const char* hex = "0123456789ABCDEF";
+ const char* secret = "default"; /* TODO: from qstate->env->cfg */
+ size_t i;
+
+ /* copy the hash info into the clear buffer */
+ if(clen + qstate->qinfo.qname_len < sizeof(clear)) {
+ memmove(clear+clen, qstate->qinfo.qname,
+ qstate->qinfo.qname_len);
+ clen += qstate->qinfo.qname_len;
+ }
+ if(clen + 4 < sizeof(clear)) {
+ uint16_t t = htons(qstate->qinfo.qtype);
+ uint16_t c = htons(qstate->qinfo.qclass);
+ memmove(clear+clen, &t, 2);
+ memmove(clear+clen+2, &c, 2);
+ clen += 4;
+ }
+ if(secret && secret[0] && clen + strlen(secret) < sizeof(clear)) {
+ memmove(clear+clen, secret, strlen(secret));
+ clen += strlen(secret);
+ }
+
+ /* hash the buffer */
+ secalgo_hash_sha256(clear, clen, hash);
+ memset(clear, 0, clen);
+
+ /* hex encode output for portability (some online dbs need
+ * no nulls, no control characters, and so on) */
+ log_assert(len >= sizeof(hash)*2 + 1);
+ (void)len;
+ for(i=0; i<sizeof(hash); i++) {
+ buf[i*2] = hex[(hash[i]&0xf0)>>4];
+ buf[i*2+1] = hex[hash[i]&0x0f];
+ }
+ buf[sizeof(hash)*2] = 0;
+}
+
+/** convert data from return_msg into the data buffer */
+static int
+prep_data(struct module_qstate* qstate, struct sldns_buffer* buf)
+{
+ uint64_t timestamp, expiry;
+ size_t oldlim;
+ struct edns_data edns;
+ memset(&edns, 0, sizeof(edns));
+ edns.edns_present = 1;
+ edns.bits = EDNS_DO;
+ edns.ext_rcode = 0;
+ edns.edns_version = EDNS_ADVERTISED_VERSION;
+ edns.udp_size = EDNS_ADVERTISED_SIZE;
+
+ if(!qstate->return_msg || !qstate->return_msg->rep)
+ return 0;
+ if(verbosity >= VERB_ALGO)
+ log_dns_msg("cachedb encoding", &qstate->return_msg->qinfo,
+ qstate->return_msg->rep);
+ if(!reply_info_answer_encode(&qstate->return_msg->qinfo,
+ qstate->return_msg->rep, 0, qstate->query_flags,
+ buf, 0, 1, qstate->env->scratch, 65535, &edns, 1, 0))
+ return 0;
+
+ /* TTLs in the return_msg are relative to time(0) so we have to
+ * store that, we also store the smallest ttl in the packet+time(0)
+ * as the packet expiry time */
+ /* qstate->return_msg->rep->ttl contains that relative shortest ttl */
+ timestamp = (uint64_t)*qstate->env->now;
+ expiry = timestamp + (uint64_t)qstate->return_msg->rep->ttl;
+ timestamp = htobe64(timestamp);
+ expiry = htobe64(expiry);
+ oldlim = sldns_buffer_limit(buf);
+ if(oldlim + sizeof(timestamp)+sizeof(expiry) >=
+ sldns_buffer_capacity(buf))
+ return 0; /* doesn't fit. */
+ sldns_buffer_set_limit(buf, oldlim + sizeof(timestamp)+sizeof(expiry));
+ sldns_buffer_write_at(buf, oldlim, &timestamp, sizeof(timestamp));
+ sldns_buffer_write_at(buf, oldlim+sizeof(timestamp), &expiry,
+ sizeof(expiry));
+
+ return 1;
+}
+
+/** check expiry, return true if matches OK */
+static int
+good_expiry_and_qinfo(struct module_qstate* qstate, struct sldns_buffer* buf)
+{
+ uint64_t expiry;
+ /* the expiry time is the last bytes of the buffer */
+ if(sldns_buffer_limit(buf) < sizeof(expiry))
+ return 0;
+ sldns_buffer_read_at(buf, sldns_buffer_limit(buf)-sizeof(expiry),
+ &expiry, sizeof(expiry));
+ expiry = be64toh(expiry);
+
+ if((time_t)expiry < *qstate->env->now)
+ return 0;
+
+ return 1;
+}
+
+/** convert dns message in buffer to return_msg */
+static int
+parse_data(struct module_qstate* qstate, struct sldns_buffer* buf)
+{
+ struct msg_parse* prs;
+ struct edns_data edns;
+ uint64_t timestamp, expiry;
+ time_t adjust;
+ size_t lim = sldns_buffer_limit(buf);
+ if(lim < LDNS_HEADER_SIZE+sizeof(timestamp)+sizeof(expiry))
+ return 0; /* too short */
+
+ /* remove timestamp and expiry from end */
+ sldns_buffer_read_at(buf, lim-sizeof(expiry), &expiry, sizeof(expiry));
+ sldns_buffer_read_at(buf, lim-sizeof(expiry)-sizeof(timestamp),
+ &timestamp, sizeof(timestamp));
+ expiry = be64toh(expiry);
+ timestamp = be64toh(timestamp);
+
+ /* parse DNS packet */
+ regional_free_all(qstate->env->scratch);
+ prs = (struct msg_parse*)regional_alloc(qstate->env->scratch,
+ sizeof(struct msg_parse));
+ if(!prs)
+ return 0; /* out of memory */
+ memset(prs, 0, sizeof(*prs));
+ memset(&edns, 0, sizeof(edns));
+ sldns_buffer_set_limit(buf, lim - sizeof(expiry)-sizeof(timestamp));
+ if(parse_packet(buf, prs, qstate->env->scratch) != LDNS_RCODE_NOERROR) {
+ sldns_buffer_set_limit(buf, lim);
+ return 0;
+ }
+ if(parse_extract_edns(prs, &edns, qstate->env->scratch) !=
+ LDNS_RCODE_NOERROR) {
+ sldns_buffer_set_limit(buf, lim);
+ return 0;
+ }
+
+ qstate->return_msg = dns_alloc_msg(buf, prs, qstate->region);
+ sldns_buffer_set_limit(buf, lim);
+ if(!qstate->return_msg)
+ return 0;
+
+ qstate->return_rcode = LDNS_RCODE_NOERROR;
+
+ /* see how much of the TTL expired, and remove it */
+ adjust = *qstate->env->now - (time_t)timestamp;
+ verbose(VERB_ALGO, "cachedb msg adjusted down by %d", (int)adjust);
+ /*adjust_msg(qstate->return_msg, adjust);*/
+ /* TODO:
+ msg->rep->ttl = r->ttl - adjust;
+ msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ for(i=0; i<d->count + d->rrsig_count; i++) {
+ if(d->rr_ttl[i] < adjust)
+ d->rr_ttl[i] = 0;
+ else d->rr_ttl[i] -= adjust;
+ }
+ if(d->ttl < adjust)
+ d->ttl = 0;
+ else d->ttl -= adjust;
+ */
+ /* TODO */
+
+ return 0;
+}
+
+/**
+ * Lookup the qstate.qinfo in extcache, store in qstate.return_msg.
+ * return true if lookup was successful.
+ */
+static int
+cachedb_extcache_lookup(struct module_qstate* qstate, struct cachedb_env* ie)
+{
+ char key[(CACHEDB_HASHSIZE/8)*2+1];
+ calc_hash(qstate, key, sizeof(key));
+
+ /* call backend to fetch data for key into scratch buffer */
+ if( !(*ie->backend->lookup)(qstate->env, ie, key,
+ qstate->env->scratch_buffer)) {
+ return 0;
+ }
+
+ /* check expiry date and check if query-data matches */
+ if( !good_expiry_and_qinfo(qstate, qstate->env->scratch_buffer) ) {
+ return 0;
+ }
+
+ /* parse dns message into return_msg */
+ if( !parse_data(qstate, qstate->env->scratch_buffer) ) {
+ return 0;
+ }
+ return 1;
+}
+
+/**
+ * Store the qstate.return_msg in extcache for key qstate.info
+ */
+static void
+cachedb_extcache_store(struct module_qstate* qstate, struct cachedb_env* ie)
+{
+ char key[(CACHEDB_HASHSIZE/8)*2+1];
+ calc_hash(qstate, key, sizeof(key));
+
+ /* prepare data in scratch buffer */
+ if(!prep_data(qstate, qstate->env->scratch_buffer))
+ return;
+
+ /* call backend */
+ (*ie->backend->store)(qstate->env, ie, key,
+ sldns_buffer_begin(qstate->env->scratch_buffer),
+ sldns_buffer_limit(qstate->env->scratch_buffer));
+}
+
+/**
+ * See if unbound's internal cache can answer the query
+ */
+static int
+cachedb_intcache_lookup(struct module_qstate* qstate)
+{
+ struct dns_msg* msg;
+ msg = dns_cache_lookup(qstate->env, qstate->qinfo.qname,
+ qstate->qinfo.qname_len, qstate->qinfo.qtype,
+ qstate->qinfo.qclass, qstate->query_flags,
+ qstate->region, qstate->env->scratch);
+ if(!msg && qstate->env->neg_cache) {
+ /* lookup in negative cache; may result in
+ * NOERROR/NODATA or NXDOMAIN answers that need validation */
+ msg = val_neg_getmsg(qstate->env->neg_cache, &qstate->qinfo,
+ qstate->region, qstate->env->rrset_cache,
+ qstate->env->scratch_buffer,
+ *qstate->env->now, 1/*add SOA*/, NULL);
+ }
+ if(!msg)
+ return 0;
+ /* this is the returned msg */
+ qstate->return_rcode = LDNS_RCODE_NOERROR;
+ qstate->return_msg = msg;
+ return 1;
+}
+
+/**
+ * Store query into the internal cache of unbound.
+ */
+static void
+cachedb_intcache_store(struct module_qstate* qstate)
+{
+ if(!qstate->return_msg)
+ return;
+ (void)dns_cache_store(qstate->env, &qstate->qinfo,
+ qstate->return_msg->rep, 0, qstate->prefetch_leeway, 0,
+ qstate->region, qstate->query_flags);
+}
+
+/**
+ * Handle a cachedb module event with a query
+ * @param qstate: query state (from the mesh), passed between modules.
+ * contains qstate->env module environment with global caches and so on.
+ * @param iq: query state specific for this module. per-query.
+ * @param ie: environment specific for this module. global.
+ * @param id: module id.
+ */
+static void
+cachedb_handle_query(struct module_qstate* qstate,
+ struct cachedb_qstate* ATTR_UNUSED(iq),
+ struct cachedb_env* ie, int id)
+{
+ /* check if we are enabled, and skip if so */
+ if(!ie->enabled) {
+ /* pass request to next module */
+ qstate->ext_state[id] = module_wait_module;
+ return;
+ }
+
+ if(qstate->blacklist) {
+ /* cache is blacklisted */
+ /* pass request to next module */
+ qstate->ext_state[id] = module_wait_module;
+ return;
+ }
+
+ /* lookup inside unbound's internal cache */
+ if(cachedb_intcache_lookup(qstate)) {
+ if(verbosity >= VERB_ALGO)
+ log_dns_msg("cachedb internal cache lookup",
+ &qstate->return_msg->qinfo,
+ qstate->return_msg->rep);
+ /* we are done with the query */
+ qstate->ext_state[id] = module_finished;
+ return;
+ }
+
+ /* ask backend cache to see if we have data */
+ if(cachedb_extcache_lookup(qstate, ie)) {
+ if(verbosity >= VERB_ALGO)
+ log_dns_msg(ie->backend->name,
+ &qstate->return_msg->qinfo,
+ qstate->return_msg->rep);
+ /* store this result in internal cache */
+ cachedb_intcache_store(qstate);
+ /* we are done with the query */
+ qstate->ext_state[id] = module_finished;
+ return;
+ }
+
+ /* no cache fetches */
+ /* pass request to next module */
+ qstate->ext_state[id] = module_wait_module;
+}
+
+/**
+ * Handle a cachedb module event with a response from the iterator.
+ * @param qstate: query state (from the mesh), passed between modules.
+ * contains qstate->env module environment with global caches and so on.
+ * @param iq: query state specific for this module. per-query.
+ * @param ie: environment specific for this module. global.
+ * @param id: module id.
+ */
+static void
+cachedb_handle_response(struct module_qstate* qstate,
+ struct cachedb_qstate* ATTR_UNUSED(iq), struct cachedb_env* ie, int id)
+{
+ /* check if we are enabled, and skip if not */
+ if(!ie->enabled) {
+ /* we are done with the query */
+ qstate->ext_state[id] = module_finished;
+ return;
+ }
+
+ /* store the item into the backend cache */
+ cachedb_extcache_store(qstate, ie);
+
+ /* we are done with the query */
+ qstate->ext_state[id] = module_finished;
+}
+
+void
+cachedb_operate(struct module_qstate* qstate, enum module_ev event, int id,
+ struct outbound_entry* outbound)
+{
+ struct cachedb_env* ie = (struct cachedb_env*)qstate->env->modinfo[id];
+ struct cachedb_qstate* iq = (struct cachedb_qstate*)qstate->minfo[id];
+ verbose(VERB_QUERY, "cachedb[module %d] operate: extstate:%s event:%s",
+ id, strextstate(qstate->ext_state[id]), strmodulevent(event));
+ if(iq) log_query_info(VERB_QUERY, "cachedb operate: query",
+ &qstate->qinfo);
+
+ /* perform cachedb state machine */
+ if((event == module_event_new || event == module_event_pass) &&
+ iq == NULL) {
+ if(!cachedb_new(qstate, id)) {
+ (void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+ return;
+ }
+ iq = (struct cachedb_qstate*)qstate->minfo[id];
+ }
+ if(iq && (event == module_event_pass || event == module_event_new)) {
+ cachedb_handle_query(qstate, iq, ie, id);
+ return;
+ }
+ if(iq && (event == module_event_moddone)) {
+ cachedb_handle_response(qstate, iq, ie, id);
+ return;
+ }
+ if(iq && outbound) {
+ /* cachedb does not need to process responses at this time
+ * ignore it.
+ cachedb_process_response(qstate, iq, ie, id, outbound, event);
+ */
+ return;
+ }
+ if(event == module_event_error) {
+ verbose(VERB_ALGO, "got called with event error, giving up");
+ (void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+ return;
+ }
+
+ log_err("bad event for cachedb");
+ (void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+}
+
+void
+cachedb_inform_super(struct module_qstate* ATTR_UNUSED(qstate),
+ int ATTR_UNUSED(id), struct module_qstate* ATTR_UNUSED(super))
+{
+ /* cachedb does not use subordinate requests at this time */
+ verbose(VERB_ALGO, "cachedb inform_super was called");
+}
+
+void
+cachedb_clear(struct module_qstate* qstate, int id)
+{
+ struct cachedb_qstate* iq;
+ if(!qstate)
+ return;
+ iq = (struct cachedb_qstate*)qstate->minfo[id];
+ if(iq) {
+ /* free contents of iq */
+ /* TODO */
+ }
+ qstate->minfo[id] = NULL;
+}
+
+size_t
+cachedb_get_mem(struct module_env* env, int id)
+{
+ struct cachedb_env* ie = (struct cachedb_env*)env->modinfo[id];
+ if(!ie)
+ return 0;
+ return sizeof(*ie); /* TODO - more mem */
+}
+
+/**
+ * The cachedb function block
+ */
+static struct module_func_block cachedb_block = {
+ "cachedb",
+ &cachedb_init, &cachedb_deinit, &cachedb_operate,
+ &cachedb_inform_super, &cachedb_clear, &cachedb_get_mem
+};
+
+struct module_func_block*
+cachedb_get_funcblock(void)
+{
+ return &cachedb_block;
+}
+#endif /* USE_CACHEDB */
diff --git a/cachedb/cachedb.h b/cachedb/cachedb.h
new file mode 100644
index 000000000000..d477e90a7dee
--- /dev/null
+++ b/cachedb/cachedb.h
@@ -0,0 +1,110 @@
+/*
+ * cachedb/cachedb.h - cache from a database external to the program module
+ *
+ * Copyright (c) 2016, 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 module that uses an external database to cache
+ * dns responses.
+ */
+#include "util/module.h"
+struct cachedb_backend;
+
+/**
+ * The global variable environment contents for the cachedb
+ * Shared between threads, this represents long term information.
+ * Like database connections.
+ */
+struct cachedb_env {
+ /** true is cachedb is enabled, the backend is turned on */
+ int enabled;
+
+ /** the backend routines */
+ struct cachedb_backend* backend;
+
+ /** backend specific data here */
+ void* backend_data;
+};
+
+/**
+ * Per query state for the cachedb module.
+ */
+struct cachedb_qstate {
+ int todo;
+};
+
+/**
+ * Backend call routines
+ */
+struct cachedb_backend {
+ /** backend name */
+ const char* name;
+
+ /** Init(env, cachedb_env): false on setup failure */
+ int (*init)(struct module_env*, struct cachedb_env*);
+
+ /** Deinit - close db for program exit */
+ void (*deinit)(struct module_env*, struct cachedb_env*);
+
+ /** Lookup (env, cachedb_env, key, result_buffer): true if found */
+ int (*lookup)(struct module_env*, struct cachedb_env*, char*,
+ struct sldns_buffer*);
+
+ /** Store (env, cachedb_env, key, data, data_len) */
+ void (*store)(struct module_env*, struct cachedb_env*, char*,
+ uint8_t*, size_t);
+};
+
+/** Init the cachedb module */
+int cachedb_init(struct module_env* env, int id);
+/** Deinit the cachedb module */
+void cachedb_deinit(struct module_env* env, int id);
+/** Operate on an event on a query (in qstate). */
+void cachedb_operate(struct module_qstate* qstate, enum module_ev event,
+ int id, struct outbound_entry* outbound);
+/** Subordinate query done, inform this super request of its conclusion */
+void cachedb_inform_super(struct module_qstate* qstate, int id,
+ struct module_qstate* super);
+/** clear the cachedb query-specific contents out of qstate */
+void cachedb_clear(struct module_qstate* qstate, int id);
+/** return memory estimate for cachedb module */
+size_t cachedb_get_mem(struct module_env* env, int id);
+
+/**
+ * Get the function block with pointers to the cachedb functions
+ * @return the function block for "cachedb".
+ */
+struct module_func_block* cachedb_get_funcblock(void);
+
diff --git a/compat/explicit_bzero.c b/compat/explicit_bzero.c
index a3ba2798a23b..5f1c427c2137 100644
--- a/compat/explicit_bzero.c
+++ b/compat/explicit_bzero.c
@@ -6,7 +6,11 @@
#include "config.h"
#include <string.h>
+#ifdef HAVE_ATTR_WEAK
__attribute__((weak)) void
+#else
+void
+#endif
__explicit_bzero_hook(void *ATTR_UNUSED(buf), size_t ATTR_UNUSED(len))
{
}
diff --git a/compat/getentropy_linux.c b/compat/getentropy_linux.c
index 37d86a8f12ba..f8c5e0f7ee59 100644
--- a/compat/getentropy_linux.c
+++ b/compat/getentropy_linux.c
@@ -94,7 +94,7 @@ int getentropy(void *buf, size_t len);
extern int main(int, char *argv[]);
#endif
static int gotdata(char *buf, size_t len);
-#ifdef SYS_getrandom
+#if defined(SYS_getrandom) && defined(__NR_getrandom)
static int getentropy_getrandom(void *buf, size_t len);
#endif
static int getentropy_urandom(void *buf, size_t len);
@@ -113,7 +113,7 @@ getentropy(void *buf, size_t len)
return -1;
}
-#ifdef SYS_getrandom
+#if defined(SYS_getrandom) && defined(__NR_getrandom)
/*
* Try descriptor-less getrandom()
*/
@@ -209,7 +209,7 @@ gotdata(char *buf, size_t len)
return 0;
}
-#ifdef SYS_getrandom
+#if defined(SYS_getrandom) && defined(__NR_getrandom)
static int
getentropy_getrandom(void *buf, size_t len)
{
diff --git a/compat/strsep.c b/compat/strsep.c
new file mode 100644
index 000000000000..4e3f05c5237f
--- /dev/null
+++ b/compat/strsep.c
@@ -0,0 +1,65 @@
+/**
+ * strsep implementation for compatibility.
+ *
+ * LICENSE
+ * Copyright (c) 2016, NLnet Labs
+ * All rights reserved.
+ *
+ * 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 NLnetLabs 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 OWNER 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"
+
+/** see if character is in the delimiter array */
+static int
+in_delim(char c, const char* delim)
+{
+ const char* p;
+ if(!delim)
+ return 0;
+ for(p=delim; *p; p++) {
+ if(*p == c)
+ return 1;
+ }
+ return 0;
+}
+
+char *strsep(char **stringp, const char *delim)
+{
+ char* s;
+ char* orig;
+ if(stringp == NULL || *stringp == NULL)
+ return NULL;
+ orig = *stringp;
+ s = *stringp;
+ while(*s && !in_delim(*s, delim))
+ s++;
+ if(*s) {
+ *s = 0;
+ *stringp = s+1;
+ } else {
+ *stringp = NULL;
+ }
+ return orig;
+}
diff --git a/config.h.in b/config.h.in
index 59277ddf0a73..b982629ea4d2 100644
--- a/config.h.in
+++ b/config.h.in
@@ -42,6 +42,9 @@
/* Whether the C compiler accepts the "unused" attribute */
#undef HAVE_ATTR_UNUSED
+/* Whether the C compiler accepts the "weak" attribute */
+#undef HAVE_ATTR_WEAK
+
/* Define to 1 if you have the `chown' function. */
#undef HAVE_CHOWN
@@ -125,6 +128,9 @@
/* Define to 1 if you have the <event.h> header file. */
#undef HAVE_EVENT_H
+/* Define to 1 if you have the `EVP_MD_CTX_new' function. */
+#undef HAVE_EVP_MD_CTX_NEW
+
/* Define to 1 if you have the `EVP_sha1' function. */
#undef HAVE_EVP_SHA1
@@ -188,8 +194,8 @@
/* Define to 1 if you have the <grp.h> header file. */
#undef HAVE_GRP_H
-/* If you have HMAC_CTX_init */
-#undef HAVE_HMAC_CTX_INIT
+/* If you have HMAC_Update */
+#undef HAVE_HMAC_UPDATE
/* Define to 1 if you have the `inet_aton' function. */
#undef HAVE_INET_ATON
@@ -377,6 +383,9 @@
/* Define to 1 if you have the `strptime' function. */
#undef HAVE_STRPTIME
+/* Define to 1 if you have the `strsep' function. */
+#undef HAVE_STRSEP
+
/* Define to 1 if `ipi_spec_dst' is a member of `struct in_pktinfo'. */
#undef HAVE_STRUCT_IN_PKTINFO_IPI_SPEC_DST
@@ -580,9 +589,15 @@
/* define this to enable debug checks. */
#undef UNBOUND_DEBUG
+/* Define to 1 to use cachedb support */
+#undef USE_CACHEDB
+
/* Define to 1 to enable dnstap support */
#undef USE_DNSTAP
+/* Define this to enable DSA support. */
+#undef USE_DSA
+
/* Define this to enable ECDSA support. */
#undef USE_ECDSA
@@ -979,6 +994,11 @@ int memcmp(const void *x, const void *y, size_t n);
char *ctime_r(const time_t *timep, char *buf);
#endif
+#ifndef HAVE_STRSEP
+#define strsep unbound_strsep
+char *strsep(char **stringp, const char *delim);
+#endif
+
#ifndef HAVE_ISBLANK
#define isblank unbound_isblank
int isblank(int c);
diff --git a/configure b/configure
index 6c6b9efeb1e3..5b65237ddc2e 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for unbound 1.5.8.
+# Generated by GNU Autoconf 2.69 for unbound 1.5.9.
#
# Report bugs to <unbound-bugs@nlnetlabs.nl>.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='unbound'
PACKAGE_TARNAME='unbound'
-PACKAGE_VERSION='1.5.8'
-PACKAGE_STRING='unbound 1.5.8'
+PACKAGE_VERSION='1.5.9'
+PACKAGE_STRING='unbound 1.5.9'
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl'
PACKAGE_URL=''
@@ -832,6 +832,7 @@ with_ssl
enable_sha2
enable_gost
enable_ecdsa
+enable_dsa
enable_event_api
with_libevent
with_libexpat
@@ -842,6 +843,7 @@ enable_dnstap
with_dnstap_socket_path
with_protobuf_c
with_libfstrm
+enable_cachedb
with_libunbound_only
'
ac_precious_vars='build_alias
@@ -1397,7 +1399,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures unbound 1.5.8 to adapt to many kinds of systems.
+\`configure' configures unbound 1.5.9 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1462,7 +1464,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of unbound 1.5.8:";;
+ short | recursive ) echo "Configuration of unbound 1.5.9:";;
esac
cat <<\_ACEOF
@@ -1495,8 +1497,9 @@ Optional Features:
--disable-sha2 Disable SHA256 and SHA512 RRSIG support
--disable-gost Disable GOST support
--disable-ecdsa Disable ECDSA support
- --enable-event-api Enable (experimental) libevent-based libunbound API
- installed to unbound-event.h
+ --disable-dsa Disable DSA support
+ --enable-event-api Enable (experimental) pluggable event base
+ libunbound API installed to unbound-event.h
--enable-static-exe enable to compile executables statically against
(event) libs, for debug purposes
--enable-lock-checks enable to check lock and unlock calls, for debug
@@ -1505,6 +1508,8 @@ Optional Features:
to it, smaller install size but libunbound export
table is polluted by internal symbols
--enable-dnstap Enable dnstap support (requires fstrm, protobuf-c)
+ --enable-cachedb enable cachedb module that can use external cache
+ storage
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -1647,7 +1652,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-unbound configure 1.5.8
+unbound configure 1.5.9
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2356,7 +2361,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by unbound $as_me 1.5.8, which was
+It was created by unbound $as_me 1.5.9, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2708,11 +2713,11 @@ UNBOUND_VERSION_MAJOR=1
UNBOUND_VERSION_MINOR=5
-UNBOUND_VERSION_MICRO=8
+UNBOUND_VERSION_MICRO=9
LIBUNBOUND_CURRENT=6
-LIBUNBOUND_REVISION=0
+LIBUNBOUND_REVISION=1
LIBUNBOUND_AGE=4
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -2760,6 +2765,7 @@ LIBUNBOUND_AGE=4
# 1.5.6 had 5:9:3
# 1.5.7 had 5:10:3
# 1.5.8 had 6:0:4 # adds ub_ctx_set_stub
+# 1.5.9 had 6:1:4
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -6117,6 +6123,48 @@ $as_echo "#define HAVE_ATTR_UNUSED 1" >>confdefs.h
fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler (${CC-cc}) accepts the \"weak\" attribute" >&5
+$as_echo_n "checking whether the C compiler (${CC-cc}) accepts the \"weak\" attribute... " >&6; }
+if ${ac_cv_c_weak_attribute+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_weak_attribute=no
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+ #include <stdio.h>
+__attribute__((weak)) void f(int x) { printf("%d", x); }
+
+int
+main ()
+{
+
+ f(1);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_weak_attribute="yes"
+else
+ ac_cv_c_weak_attribute="no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_weak_attribute" >&5
+$as_echo "$ac_cv_c_weak_attribute" >&6; }
+if test $ac_cv_c_weak_attribute = yes; then
+
+$as_echo "#define HAVE_ATTR_WEAK 1" >>confdefs.h
+
+fi
+
+
if test "$srcdir" != "."; then
CPPFLAGS="$CPPFLAGS -I$srcdir"
fi
@@ -17064,8 +17112,8 @@ $as_echo "found in $ssldir" >&6; }
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HMAC_CTX_init in -lcrypto" >&5
-$as_echo_n "checking for HMAC_CTX_init in -lcrypto... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HMAC_Update in -lcrypto" >&5
+$as_echo_n "checking for HMAC_Update in -lcrypto... " >&6; }
LIBS="$LIBS -lcrypto"
LIBSSL_LIBS="$LIBSSL_LIBS -lcrypto"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -17075,8 +17123,8 @@ int
main ()
{
- int HMAC_CTX_init(void);
- (void)HMAC_CTX_init();
+ int HMAC_Update(void);
+ (void)HMAC_Update();
;
return 0;
@@ -17087,7 +17135,7 @@ if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
-$as_echo "#define HAVE_HMAC_CTX_INIT 1" >>confdefs.h
+$as_echo "#define HAVE_HMAC_UPDATE 1" >>confdefs.h
else
@@ -17108,8 +17156,8 @@ int
main ()
{
- int HMAC_CTX_init(void);
- (void)HMAC_CTX_init();
+ int HMAC_Update(void);
+ (void)HMAC_Update();
;
return 0;
@@ -17118,7 +17166,7 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"; then :
-$as_echo "#define HAVE_HMAC_CTX_INIT 1" >>confdefs.h
+$as_echo "#define HAVE_HMAC_UPDATE 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -17140,8 +17188,8 @@ int
main ()
{
- int HMAC_CTX_init(void);
- (void)HMAC_CTX_init();
+ int HMAC_Update(void);
+ (void)HMAC_Update();
;
return 0;
@@ -17150,7 +17198,7 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"; then :
-$as_echo "#define HAVE_HMAC_CTX_INIT 1" >>confdefs.h
+$as_echo "#define HAVE_HMAC_UPDATE 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -17159,7 +17207,43 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
- as_fn_error $? "OpenSSL found in $ssldir, but version 0.9.7 or higher is required" "$LINENO" 5
+ LIBS="$BAKLIBS"
+ LIBSSL_LIBS="$BAKSSLLIBS"
+ LIBS="$LIBS -ldl -pthread"
+ LIBSSL_LIBS="$LIBSSL_LIBS -ldl -pthread"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -lcrypto needs -ldl -pthread" >&5
+$as_echo_n "checking if -lcrypto needs -ldl -pthread... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ int HMAC_Update(void);
+ (void)HMAC_Update();
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+
+$as_echo "#define HAVE_HMAC_UPDATE 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ as_fn_error $? "OpenSSL found in $ssldir, but version 0.9.7 or higher is required" "$LINENO" 5
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext \
@@ -17404,7 +17488,7 @@ fi
done
-for ac_func in OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode
+for ac_func in OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -17771,15 +17855,46 @@ _ACEOF
;;
esac
+# Check whether --enable-dsa was given.
+if test "${enable_dsa+set}" = set; then :
+ enableval=$enable_dsa;
+fi
+
+use_dsa="no"
+case "$enable_ecdsa" in
+ no)
+ ;;
+ *)
+ # detect if DSA is supported, and turn it off if not.
+ ac_fn_c_check_func "$LINENO" "EVP_dss1" "ac_cv_func_EVP_dss1"
+if test "x$ac_cv_func_EVP_dss1" = xyes; then :
+
+
+cat >>confdefs.h <<_ACEOF
+#define USE_DSA 1
+_ACEOF
+
+
+else
+ if test "x$enable_dsa" = "xyes"; then as_fn_error $? "OpenSSL does not support DSA and you used --enable-dsa." "$LINENO" 5
+ fi
+fi
+
+ ;;
+esac
+
+
# Check whether --enable-event-api was given.
if test "${enable_event_api+set}" = set; then :
enableval=$enable_event_api;
fi
-use_unbound_event="no"
case "$enable_event_api" in
yes)
- use_unbound_event="yes"
+ UNBOUND_EVENT_INSTALL=unbound-event-install
+
+ UNBOUND_EVENT_UNINSTALL=unbound-event-uninstall
+
;;
*)
;;
@@ -18126,12 +18241,6 @@ done
if test -n "$BAK_LDFLAGS_SET"; then
LDFLAGS="$BAK_LDFLAGS"
fi
- if test "$use_unbound_event" = "yes"; then
- UNBOUND_EVENT_INSTALL=unbound-event-install
-
- UNBOUND_EVENT_UNINSTALL=unbound-event-uninstall
-
- fi
else
$as_echo "#define USE_MINI_EVENT 1" >>confdefs.h
@@ -19237,6 +19346,20 @@ esac
fi
+ac_fn_c_check_func "$LINENO" "strsep" "ac_cv_func_strsep"
+if test "x$ac_cv_func_strsep" = xyes; then :
+ $as_echo "#define HAVE_STRSEP 1" >>confdefs.h
+
+else
+ case " $LIBOBJS " in
+ *" strsep.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strsep.$ac_objext"
+ ;;
+esac
+
+fi
+
+
# Check whether --enable-allsymbols was given.
if test "${enable_allsymbols+set}" = set; then :
@@ -19520,6 +19643,23 @@ _ACEOF
fi
+# check for cachedb if requested
+# Check whether --enable-cachedb was given.
+if test "${enable_cachedb+set}" = set; then :
+ enableval=$enable_cachedb;
+fi
+
+case "$enable_cachedb" in
+ yes)
+
+$as_echo "#define USE_CACHEDB 1" >>confdefs.h
+
+ ;;
+ no|*)
+ # nothing
+ ;;
+esac
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${MAKE:-make} supports $< with implicit rule in scope" >&5
$as_echo_n "checking if ${MAKE:-make} supports $< with implicit rule in scope... " >&6; }
# on openBSD, the implicit rule make $< work.
@@ -19661,7 +19801,7 @@ _ACEOF
-version=1.5.8
+version=1.5.9
date=`date +'%b %e, %Y'`
@@ -20176,7 +20316,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by unbound $as_me 1.5.8, which was
+This file was extended by unbound $as_me 1.5.9, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -20242,7 +20382,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-unbound config.status 1.5.8
+unbound config.status 1.5.9
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 0e53a5b7dd3b..37e3993e6f99 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,14 +10,14 @@ sinclude(dnstap/dnstap.m4)
# must be numbers. ac_defun because of later processing
m4_define([VERSION_MAJOR],[1])
m4_define([VERSION_MINOR],[5])
-m4_define([VERSION_MICRO],[8])
+m4_define([VERSION_MICRO],[9])
AC_INIT(unbound, m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]), unbound-bugs@nlnetlabs.nl, unbound)
AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO])
LIBUNBOUND_CURRENT=6
-LIBUNBOUND_REVISION=0
+LIBUNBOUND_REVISION=1
LIBUNBOUND_AGE=4
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -65,6 +65,7 @@ LIBUNBOUND_AGE=4
# 1.5.6 had 5:9:3
# 1.5.7 had 5:10:3
# 1.5.8 had 6:0:4 # adds ub_ctx_set_stub
+# 1.5.9 had 6:1:4
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -257,6 +258,29 @@ AC_C_INLINE
ACX_CHECK_FORMAT_ATTRIBUTE
ACX_CHECK_UNUSED_ATTRIBUTE
+AC_DEFUN([CHECK_WEAK_ATTRIBUTE],
+[AC_REQUIRE([AC_PROG_CC])
+AC_MSG_CHECKING(whether the C compiler (${CC-cc}) accepts the "weak" attribute)
+AC_CACHE_VAL(ac_cv_c_weak_attribute,
+[ac_cv_c_weak_attribute=no
+AC_TRY_COMPILE(
+[ #include <stdio.h>
+__attribute__((weak)) void f(int x) { printf("%d", x); }
+], [
+ f(1);
+],
+[ac_cv_c_weak_attribute="yes"],
+[ac_cv_c_weak_attribute="no"])
+])
+
+AC_MSG_RESULT($ac_cv_c_weak_attribute)
+if test $ac_cv_c_weak_attribute = yes; then
+ AC_DEFINE(HAVE_ATTR_WEAK, 1, [Whether the C compiler accepts the "weak" attribute])
+fi
+])dnl End of CHECK_WEAK_ATTRIBUTE
+
+CHECK_WEAK_ATTRIBUTE
+
if test "$srcdir" != "."; then
CPPFLAGS="$CPPFLAGS -I$srcdir"
fi
@@ -634,7 +658,7 @@ else
fi
AC_CHECK_HEADERS([openssl/conf.h],,, [AC_INCLUDES_DEFAULT])
AC_CHECK_HEADERS([openssl/engine.h],,, [AC_INCLUDES_DEFAULT])
-AC_CHECK_FUNCS([OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode])
+AC_CHECK_FUNCS([OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new])
AC_CHECK_DECLS([SSL_COMP_get_compression_methods,sk_SSL_COMP_pop_free,SSL_CTX_set_ecdh_auto], [], [], [
AC_INCLUDES_DEFAULT
#ifdef HAVE_OPENSSL_ERR_H
@@ -816,11 +840,26 @@ case "$enable_ecdsa" in
;;
esac
-AC_ARG_ENABLE(event-api, AC_HELP_STRING([--enable-event-api], [Enable (experimental) libevent-based libunbound API installed to unbound-event.h]))
-use_unbound_event="no"
+AC_ARG_ENABLE(dsa, AC_HELP_STRING([--disable-dsa], [Disable DSA support]))
+use_dsa="no"
+case "$enable_ecdsa" in
+ no)
+ ;;
+ *)
+ # detect if DSA is supported, and turn it off if not.
+ AC_CHECK_FUNC(EVP_dss1, [
+ AC_DEFINE_UNQUOTED([USE_DSA], [1], [Define this to enable DSA support.])
+ ], [if test "x$enable_dsa" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support DSA and you used --enable-dsa.])
+ fi ])
+ ;;
+esac
+
+
+AC_ARG_ENABLE(event-api, AC_HELP_STRING([--enable-event-api], [Enable (experimental) pluggable event base libunbound API installed to unbound-event.h]))
case "$enable_event_api" in
yes)
- use_unbound_event="yes"
+ AC_SUBST(UNBOUND_EVENT_INSTALL, [unbound-event-install])
+ AC_SUBST(UNBOUND_EVENT_UNINSTALL, [unbound-event-uninstall])
;;
*)
;;
@@ -906,10 +945,6 @@ large outgoing port ranges. ])
if test -n "$BAK_LDFLAGS_SET"; then
LDFLAGS="$BAK_LDFLAGS"
fi
- if test "$use_unbound_event" = "yes"; then
- AC_SUBST(UNBOUND_EVENT_INSTALL, [unbound-event-install])
- AC_SUBST(UNBOUND_EVENT_UNINSTALL, [unbound-event-uninstall])
- fi
else
AC_DEFINE(USE_MINI_EVENT, 1, [Define if you want to use internal select based events])
fi
@@ -1140,6 +1175,7 @@ fi
LIBOBJ_WITHOUT_CTIME="$LIBOBJS"
AC_SUBST(LIBOBJ_WITHOUT_CTIME)
AC_REPLACE_FUNCS(ctime_r)
+AC_REPLACE_FUNCS(strsep)
AC_ARG_ENABLE(allsymbols, AC_HELP_STRING([--enable-allsymbols], [export all symbols from libunbound and link binaries to it, smaller install size but libunbound export table is polluted by internal symbols]))
case "$enable_allsymbols" in
@@ -1192,6 +1228,17 @@ dt_DNSTAP([$UNBOUND_RUN_DIR/dnstap.sock],
]
)
+# check for cachedb if requested
+AC_ARG_ENABLE(cachedb, AC_HELP_STRING([--enable-cachedb], [enable cachedb module that can use external cache storage]))
+case "$enable_cachedb" in
+ yes)
+ AC_DEFINE([USE_CACHEDB], [1], [Define to 1 to use cachedb support])
+ ;;
+ no|*)
+ # nothing
+ ;;
+esac
+
AC_MSG_CHECKING([if ${MAKE:-make} supports $< with implicit rule in scope])
# on openBSD, the implicit rule make $< work.
# on Solaris, it does not work ($? is changed sources, $^ lists dependencies).
@@ -1358,6 +1405,11 @@ AHX_MEMCMP_BROKEN(unbound)
char *ctime_r(const time_t *timep, char *buf);
#endif
+#ifndef HAVE_STRSEP
+#define strsep unbound_strsep
+char *strsep(char **stringp, const char *delim);
+#endif
+
#ifndef HAVE_ISBLANK
#define isblank unbound_isblank
int isblank(int c);
diff --git a/daemon/daemon.c b/daemon/daemon.c
index e763f724edb4..1036fcde2001 100644
--- a/daemon/daemon.c
+++ b/daemon/daemon.c
@@ -206,9 +206,6 @@ daemon_init(void)
#ifdef HAVE_SSL
ERR_load_crypto_strings();
ERR_load_SSL_strings();
-# ifdef HAVE_OPENSSL_CONFIG
- OPENSSL_config("unbound");
-# endif
# ifdef USE_GOST
(void)sldns_key_EVP_load_gost_id();
# endif
@@ -647,18 +644,23 @@ daemon_delete(struct daemon* daemon)
# endif
# if HAVE_DECL_SSL_COMP_GET_COMPRESSION_METHODS && HAVE_DECL_SK_SSL_COMP_POP_FREE
# ifndef S_SPLINT_S
+# if OPENSSL_VERSION_NUMBER < 0x10100000
sk_SSL_COMP_pop_free(comp_meth, (void(*)())CRYPTO_free);
+# endif
# endif
# endif
# ifdef HAVE_OPENSSL_CONFIG
EVP_cleanup();
+# if OPENSSL_VERSION_NUMBER < 0x10100000
ENGINE_cleanup();
+# endif
CONF_modules_free();
# endif
CRYPTO_cleanup_all_ex_data(); /* safe, no more threads right now */
- ERR_remove_state(0);
ERR_free_strings();
+# if OPENSSL_VERSION_NUMBER < 0x10100000
RAND_cleanup();
+# endif
# if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED)
ub_openssl_lock_delete();
# endif
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 86ddab1df739..48c0b4f78a00 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -45,9 +45,6 @@
#include "util/locks.h"
#include "util/alloc.h"
#include "services/modstack.h"
-#ifdef UB_ON_WINDOWS
-# include "util/winsock_event.h"
-#endif
struct config_file;
struct worker;
struct listen_port;
diff --git a/daemon/remote.c b/daemon/remote.c
index c2112dec130a..7690ee8b1875 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -140,46 +140,46 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, size_t d)
/*
* The following function was generated using the openssl utility, using
- * the command : "openssl dhparam -dsaparam -C 1024"
+ * the command : "openssl dhparam -C 2048"
* (some openssl versions reject DH that is 'too small', eg. 512).
*/
#ifndef S_SPLINT_S
-DH *get_dh1024()
-{
- static unsigned char dh1024_p[]={
- 0xB3,0x67,0x2E,0x3B,0x68,0xC5,0xDA,0x58,0x46,0xD6,0x2B,0xD3,
- 0x41,0x78,0x97,0xE4,0xE1,0x61,0x71,0x68,0xE6,0x0F,0x1D,0x78,
- 0x05,0xAA,0xF0,0xFF,0x30,0xDF,0xAC,0x49,0x7F,0xE0,0x90,0xFE,
- 0xB9,0x56,0x4E,0x3F,0xE2,0x98,0x8A,0xED,0xF5,0x28,0x39,0xEF,
- 0x2E,0xA6,0xB7,0x67,0xB2,0x43,0xE4,0x53,0xF8,0xEB,0x2C,0x1F,
- 0x06,0x77,0x3A,0x6F,0x62,0x98,0xC1,0x3B,0xF7,0xBA,0x4D,0x93,
- 0xF7,0xEB,0x5A,0xAD,0xC5,0x5F,0xF0,0xB7,0x24,0x35,0x81,0xF7,
- 0x7F,0x1F,0x24,0xC0,0xDF,0xD3,0xD8,0x40,0x72,0x7E,0xF3,0x19,
- 0x2B,0x26,0x27,0xF4,0xB6,0xB3,0xD4,0x7D,0x08,0x23,0xBE,0x68,
- 0x2B,0xCA,0xB4,0x46,0xA8,0x9E,0xDD,0x6C,0x3D,0x75,0xA6,0x48,
- 0xF7,0x44,0x43,0xBF,0x91,0xC2,0xB4,0x49,
+DH *get_dh2048()
+{
+ static unsigned char dh2048_p[]={
+ 0xE7,0x36,0x28,0x3B,0xE4,0xC3,0x32,0x1C,0x01,0xC3,0x67,0xD6,
+ 0xF5,0xF3,0xDA,0xDC,0x71,0xC0,0x42,0x8B,0xE6,0xEB,0x8D,0x80,
+ 0x35,0x7F,0x09,0x45,0x30,0xE5,0xB2,0x92,0x81,0x3F,0x08,0xCD,
+ 0x36,0x5E,0x19,0x83,0x62,0xCC,0xAE,0x9B,0x81,0x66,0x24,0xEE,
+ 0x16,0x6F,0xA9,0x9E,0xF4,0x82,0x1B,0xDD,0x46,0xC7,0x33,0x5D,
+ 0xF4,0xCA,0xE6,0x8F,0xFC,0xD4,0xD8,0x58,0x94,0x24,0x5D,0xFF,
+ 0x0A,0xE8,0xEF,0x3D,0xCE,0xBB,0x50,0x94,0xE0,0x5F,0xE8,0x41,
+ 0xC3,0x35,0x30,0x37,0xD5,0xCB,0x8F,0x3D,0x95,0x15,0x1A,0x77,
+ 0x42,0xB2,0x06,0x86,0xF6,0x09,0x66,0x0E,0x9A,0x25,0x94,0x3E,
+ 0xD2,0x04,0x25,0x25,0x1D,0x23,0xEB,0xDC,0x4D,0x0C,0x83,0x28,
+ 0x2E,0x15,0x81,0x2D,0xC1,0xAF,0x8D,0x36,0x64,0xE3,0x9A,0x83,
+ 0x78,0xC2,0x8D,0xC0,0x9D,0xD9,0x3A,0x1C,0xC5,0x2B,0x50,0x68,
+ 0x07,0xA9,0x4B,0x8C,0x07,0x57,0xD6,0x15,0x03,0x4E,0x9E,0x01,
+ 0xF2,0x6F,0x35,0xAC,0x26,0x9C,0x92,0x68,0x61,0x13,0xFB,0x01,
+ 0xBA,0x22,0x36,0x01,0x55,0xB6,0x62,0xD9,0xB2,0x98,0xCE,0x5D,
+ 0x4B,0xA5,0x41,0xD6,0xE5,0x70,0x78,0x12,0x1F,0x64,0xB6,0x6F,
+ 0xB0,0x91,0x51,0x91,0x92,0xC0,0x94,0x3A,0xD1,0x28,0x4D,0x30,
+ 0x84,0x3E,0xE4,0xE4,0x7F,0x47,0x89,0xB1,0xB6,0x8C,0x8E,0x0E,
+ 0x26,0xDB,0xCD,0x17,0x07,0x2A,0x21,0x7A,0xCC,0x68,0xE8,0x57,
+ 0x94,0x9E,0x59,0x61,0xEC,0x20,0x34,0x26,0x0D,0x66,0x44,0xEB,
+ 0x6F,0x02,0x58,0xE2,0xED,0xF6,0xF3,0x1B,0xBF,0x9E,0x45,0x52,
+ 0x5A,0x49,0xA1,0x5B,
};
- static unsigned char dh1024_g[]={
- 0x5F,0x37,0xB5,0x80,0x4D,0xB4,0xC4,0xB2,0x37,0x12,0xD5,0x2F,
- 0x56,0x81,0xB0,0xDF,0x3D,0x27,0xA2,0x54,0xE7,0x14,0x65,0x2D,
- 0x72,0xA8,0x97,0xE0,0xA9,0x4A,0x09,0x5E,0x89,0xBE,0x34,0x9A,
- 0x90,0x98,0xC1,0xE8,0xBB,0x01,0x2B,0xC2,0x74,0x74,0x90,0x59,
- 0x0B,0x72,0x62,0x5C,0xFD,0x49,0x63,0x4B,0x38,0x91,0xF1,0x7F,
- 0x13,0x25,0xEB,0x52,0x50,0x47,0xA2,0x8C,0x32,0x28,0x42,0xAC,
- 0xBD,0x7A,0xCC,0x58,0xBE,0x36,0xDA,0x6A,0x24,0x06,0xC7,0xF1,
- 0xDA,0x8D,0x8A,0x3B,0x03,0xFA,0x6F,0x25,0xE5,0x20,0xA7,0xD6,
- 0x6F,0x74,0x61,0x53,0x14,0x81,0x29,0x04,0xB5,0x61,0x12,0x53,
- 0xA3,0xD6,0x09,0x98,0x0C,0x8F,0x1C,0xBB,0xD7,0x1C,0x2C,0xEE,
- 0x56,0x4B,0x74,0x8F,0x4A,0xF8,0xA9,0xD5,
+ static unsigned char dh2048_g[]={
+ 0x02,
};
DH *dh;
if ((dh=DH_new()) == NULL) return(NULL);
- dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL);
- dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL);
+ dh->p=BN_bin2bn(dh2048_p,sizeof(dh2048_p),NULL);
+ dh->g=BN_bin2bn(dh2048_g,sizeof(dh2048_g),NULL);
if ((dh->p == NULL) || (dh->g == NULL))
{ DH_free(dh); return(NULL); }
- dh->length = 160;
return(dh);
}
#endif /* SPLINT */
@@ -231,7 +231,7 @@ daemon_remote_create(struct config_file* cfg)
/* Since we have no certificates and hence no source of
* DH params, let's generate and set them
*/
- if(!SSL_CTX_set_tmp_dh(rc->ctx,get_dh1024())) {
+ if(!SSL_CTX_set_tmp_dh(rc->ctx,get_dh2048())) {
log_crypto_err("Wanted to set DH param, but failed");
return NULL;
}
@@ -389,7 +389,7 @@ add_open(const char* ip, int nr, struct listen_port** list, int noproto_is_err,
/* open fd */
fd = create_tcp_accept_sock(res, 1, &noproto, 0,
- cfg->ip_transparent, 0);
+ cfg->ip_transparent, 0, cfg->ip_freebind);
freeaddrinfo(res);
}
diff --git a/daemon/unbound.c b/daemon/unbound.c
index a981f49842eb..d1de67369827 100644
--- a/daemon/unbound.c
+++ b/daemon/unbound.c
@@ -57,6 +57,7 @@
#include "util/data/msgreply.h"
#include "util/module.h"
#include "util/net_help.h"
+#include "util/ub_event.h"
#include <signal.h>
#include <fcntl.h>
#include <openssl/crypto.h>
@@ -77,22 +78,6 @@
#include <login_cap.h>
#endif
-#ifdef USE_MINI_EVENT
-# ifdef USE_WINSOCK
-# include "util/winsock_event.h"
-# else
-# include "util/mini_event.h"
-# endif
-#else
-# ifdef HAVE_EVENT_H
-# include <event.h>
-# else
-# include "event2/event.h"
-# include "event2/event_struct.h"
-# include "event2/event_compat.h"
-# endif
-#endif
-
#ifdef UB_ON_WINDOWS
# include "winrc/win_svc.h"
#endif
@@ -107,54 +92,6 @@
void* unbound_start_brk = 0;
#endif
-#if !defined(HAVE_EVENT_BASE_GET_METHOD) && (defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP))
-static const char* 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
-
-/** get the event system in use */
-static void get_event_sys(const char** n, const char** s, const char** m)
-{
-#ifdef USE_WINSOCK
- *n = "event";
- *s = "winsock";
- *m = "WSAWaitForMultipleEvents";
-#elif defined(USE_MINI_EVENT)
- *n = "mini-event";
- *s = "internal";
- *m = "select";
-#else
- struct event_base* b;
- *s = event_get_version();
-# ifdef HAVE_EVENT_BASE_GET_METHOD
- *n = "libevent";
- b = event_base_new();
- *m = event_base_get_method(b);
-# elif defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)
- *n = "libev";
- b = (struct event_base*)ev_default_loop(EVFLAG_AUTO);
- *m = ev_backend2str(ev_backend((struct ev_loop*)b));
-# else
- *n = "unknown";
- *m = "not obtainable";
- b = NULL;
-# endif
-# ifdef HAVE_EVENT_BASE_FREE
- event_base_free(b);
-# endif
-#endif
-}
-
/** print usage. */
static void usage()
{
@@ -173,7 +110,7 @@ static void usage()
printf(" service - used to start from services control panel\n");
#endif
printf("Version %s\n", PACKAGE_VERSION);
- get_event_sys(&evnm, &evsys, &evmethod);
+ ub_get_event_sys(NULL, &evnm, &evsys, &evmethod);
printf("linked libs: %s %s (it uses %s), %s\n",
evnm, evsys, evmethod,
#ifdef HAVE_SSL
@@ -230,7 +167,7 @@ checkrlimits(struct config_file* cfg)
struct rlimit rlim;
if(total > 1024 &&
- strncmp(event_get_version(), "mini-event", 10) == 0) {
+ strncmp(ub_event_get_version(), "mini-event", 10) == 0) {
log_warn("too many file descriptors requested. The builtin"
"mini-event cannot handle more than 1024. Config "
"for less fds or compile with libevent");
@@ -244,7 +181,7 @@ checkrlimits(struct config_file* cfg)
total = 1024;
}
if(perthread > 64 &&
- strncmp(event_get_version(), "winsock-event", 13) == 0) {
+ strncmp(ub_event_get_version(), "winsock-event", 13) == 0) {
log_err("too many file descriptors requested. The winsock"
" event handler cannot handle more than 64 per "
" thread. Config for less fds");
diff --git a/daemon/worker.c b/daemon/worker.c
index a74931f02c9b..33a6883f9219 100644
--- a/daemon/worker.c
+++ b/daemon/worker.c
@@ -483,7 +483,6 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
qinfo->qname_len, qinfo->qtype, qinfo->qclass,
worker->scratchpad, &msg, timenow);
if(!dp) { /* no delegation, need to reprime */
- regional_free_all(worker->scratchpad);
return 0;
}
if(must_validate) {
@@ -491,7 +490,6 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
case sec_status_unchecked:
/* some rrsets have not been verified yet, go and
* let validator do that */
- regional_free_all(worker->scratchpad);
return 0;
case sec_status_bogus:
/* some rrsets are bogus, reply servfail */
@@ -499,9 +497,10 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
+ if(!edns_opt_inplace_reply(edns, worker->scratchpad))
+ return 0;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
&msg->qinfo, id, flags, edns);
- regional_free_all(worker->scratchpad);
if(worker->stats.extended) {
worker->stats.ans_bogus++;
worker->stats.ans_rcode[LDNS_RCODE_SERVFAIL]++;
@@ -527,6 +526,8 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
+ if(!edns_opt_inplace_reply(edns, worker->scratchpad))
+ return 0;
msg->rep->flags |= BIT_QR|BIT_RA;
if(!reply_info_answer_encode(&msg->qinfo, msg->rep, id, flags,
repinfo->c->buffer, 0, 1, worker->scratchpad,
@@ -534,7 +535,6 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
&msg->qinfo, id, flags, edns);
}
- regional_free_all(worker->scratchpad);
if(worker->stats.extended) {
if(secure) worker->stats.ans_secure++;
server_stats_insrcode(&worker->stats, repinfo->c->buffer);
@@ -574,7 +574,6 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
bail_out:
rrset_array_unlock_touch(worker->env.rrset_cache,
worker->scratchpad, rep->ref, rep->rrset_count);
- regional_free_all(worker->scratchpad);
return 0;
}
}
@@ -585,11 +584,12 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
+ if(!edns_opt_inplace_reply(edns, worker->scratchpad))
+ return 0;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, id, flags, edns);
rrset_array_unlock_touch(worker->env.rrset_cache,
worker->scratchpad, rep->ref, rep->rrset_count);
- regional_free_all(worker->scratchpad);
if(worker->stats.extended) {
worker->stats.ans_bogus ++;
worker->stats.ans_rcode[LDNS_RCODE_SERVFAIL] ++;
@@ -616,6 +616,8 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
+ if(!edns_opt_inplace_reply(edns, worker->scratchpad))
+ return 0;
if(!reply_info_answer_encode(qinfo, rep, id, flags,
repinfo->c->buffer, timenow, 1, worker->scratchpad,
udpsize, edns, (int)(edns->bits & EDNS_DO), secure)) {
@@ -626,7 +628,6 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
* is bad while holding locks. */
rrset_array_unlock_touch(worker->env.rrset_cache, worker->scratchpad,
rep->ref, rep->rrset_count);
- regional_free_all(worker->scratchpad);
if(worker->stats.extended) {
if(secure) worker->stats.ans_secure++;
server_stats_insrcode(&worker->stats, repinfo->c->buffer);
@@ -658,9 +659,11 @@ reply_and_prefetch(struct worker* worker, struct query_info* qinfo,
* @param pkt: buffer
* @param str: string to put into text record (<255).
* @param edns: edns reply information.
+ * @param worker: worker with scratch region.
*/
static void
-chaos_replystr(sldns_buffer* pkt, const char* str, struct edns_data* edns)
+chaos_replystr(sldns_buffer* pkt, const char* str, struct edns_data* edns,
+ struct worker* worker)
{
size_t len = strlen(str);
unsigned int rd = LDNS_RD_WIRE(sldns_buffer_begin(pkt));
@@ -689,6 +692,8 @@ chaos_replystr(sldns_buffer* pkt, const char* str, struct edns_data* edns)
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->bits &= EDNS_DO;
+ if(!edns_opt_inplace_reply(edns, worker->scratchpad))
+ edns->opt_list = NULL;
attach_edns_record(pkt, edns);
}
@@ -718,13 +723,13 @@ answer_chaos(struct worker* w, struct query_info* qinfo,
char buf[MAXHOSTNAMELEN+1];
if (gethostname(buf, MAXHOSTNAMELEN) == 0) {
buf[MAXHOSTNAMELEN] = 0;
- chaos_replystr(pkt, buf, edns);
+ chaos_replystr(pkt, buf, edns, w);
} else {
log_err("gethostname: %s", strerror(errno));
- chaos_replystr(pkt, "no hostname", edns);
+ chaos_replystr(pkt, "no hostname", edns, w);
}
}
- else chaos_replystr(pkt, cfg->identity, edns);
+ else chaos_replystr(pkt, cfg->identity, edns, w);
return 1;
}
if(query_dname_compare(qinfo->qname,
@@ -735,8 +740,8 @@ answer_chaos(struct worker* w, struct query_info* qinfo,
if(cfg->hide_version)
return 0;
if(cfg->version==NULL || cfg->version[0]==0)
- chaos_replystr(pkt, PACKAGE_STRING, edns);
- else chaos_replystr(pkt, cfg->version, edns);
+ chaos_replystr(pkt, PACKAGE_STRING, edns, w);
+ else chaos_replystr(pkt, cfg->version, edns, w);
return 1;
}
return 0;
@@ -865,7 +870,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
}
goto send_reply;
}
- if((ret=parse_edns_from_pkt(c->buffer, &edns)) != 0) {
+ if((ret=parse_edns_from_pkt(c->buffer, &edns, worker->scratchpad)) != 0) {
struct edns_data reply_edns;
verbose(VERB_ALGO, "worker parse edns: formerror.");
log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
@@ -876,6 +881,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
error_encode(c->buffer, ret, &qinfo,
*(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
sldns_buffer_read_u16_at(c->buffer, 2), &reply_edns);
+ regional_free_all(worker->scratchpad);
server_stats_insrcode(&worker->stats, c->buffer);
goto send_reply;
}
@@ -884,12 +890,14 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
edns.edns_version = EDNS_ADVERTISED_VERSION;
edns.udp_size = EDNS_ADVERTISED_SIZE;
edns.bits &= EDNS_DO;
+ edns.opt_list = NULL;
verbose(VERB_ALGO, "query with bad edns version.");
log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
error_encode(c->buffer, EDNS_RCODE_BADVERS&0xf, &qinfo,
*(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
sldns_buffer_read_u16_at(c->buffer, 2), NULL);
attach_edns_record(c->buffer, &edns);
+ regional_free_all(worker->scratchpad);
goto send_reply;
}
if(edns.edns_present && edns.udp_size < NORMAL_UDP_SIZE &&
@@ -918,6 +926,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
sldns_buffer_write_at(c->buffer, 4,
(uint8_t*)"\0\0\0\0\0\0\0\0", 8);
sldns_buffer_flip(c->buffer);
+ regional_free_all(worker->scratchpad);
goto send_reply;
}
if(worker->stats.extended)
@@ -928,6 +937,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
if(qinfo.qclass == LDNS_RR_CLASS_CH && answer_chaos(worker, &qinfo,
&edns, c->buffer)) {
server_stats_insrcode(&worker->stats, c->buffer);
+ regional_free_all(worker->scratchpad);
goto send_reply;
}
if(local_zones_answer(worker->daemon->local_zones, &qinfo, &edns,
@@ -945,6 +955,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
* might need to bail out based on ACLs now. */
if((ret=deny_refuse_non_local(c, acl, worker, repinfo)) != -1)
{
+ regional_free_all(worker->scratchpad);
if(ret == 1)
goto send_reply;
return ret;
@@ -961,6 +972,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
LDNS_RCODE_SET(sldns_buffer_begin(c->buffer),
LDNS_RCODE_REFUSED);
sldns_buffer_flip(c->buffer);
+ regional_free_all(worker->scratchpad);
server_stats_insrcode(&worker->stats, c->buffer);
log_addr(VERB_ALGO, "refused nonrec (cache snoop) query from",
&repinfo->addr, repinfo->addrlen);
@@ -984,9 +996,11 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
sldns_buffer_read_u16_at(c->buffer, 2),
repinfo, leeway);
rc = 0;
+ regional_free_all(worker->scratchpad);
goto send_reply_rc;
}
lock_rw_unlock(&e->lock);
+ regional_free_all(worker->scratchpad);
goto send_reply;
}
verbose(VERB_ALGO, "answer from the cache failed");
@@ -997,6 +1011,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
*(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
sldns_buffer_read_u16_at(c->buffer, 2), repinfo,
&edns)) {
+ regional_free_all(worker->scratchpad);
goto send_reply;
}
verbose(VERB_ALGO, "answer norec from cache -- "
@@ -1017,6 +1032,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
mesh_new_client(worker->env.mesh, &qinfo,
sldns_buffer_read_u16_at(c->buffer, 2),
&edns, repinfo, *(uint16_t*)(void *)sldns_buffer_begin(c->buffer));
+ regional_free_all(worker->scratchpad);
worker_mem_report(worker, NULL);
return 0;
@@ -1355,8 +1371,9 @@ worker_delete(struct worker* worker)
struct outbound_entry*
worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
uint16_t qclass, uint16_t flags, int dnssec, int want_dnssec,
- int nocaps, struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t* zone, size_t zonelen, struct module_qstate* q)
+ int nocaps, struct edns_option* opt_list,
+ struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
+ size_t zonelen, struct module_qstate* q)
{
struct worker* worker = q->env->worker;
struct outbound_entry* e = (struct outbound_entry*)regional_alloc(
@@ -1366,8 +1383,8 @@ worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
e->qstate = q;
e->qsent = outnet_serviced_query(worker->back, qname,
qnamelen, qtype, qclass, flags, dnssec, want_dnssec, nocaps,
- q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, addr,
- addrlen, zone, zonelen, worker_handle_service_reply, e,
+ q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, opt_list,
+ addr, addrlen, zone, zonelen, worker_handle_service_reply, e,
worker->back->udp_buff);
if(!e->qsent) {
return NULL;
@@ -1412,7 +1429,8 @@ struct outbound_entry* libworker_send_query(uint8_t* ATTR_UNUSED(qname),
size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype),
uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags),
int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec),
- int ATTR_UNUSED(nocaps), struct sockaddr_storage* ATTR_UNUSED(addr),
+ int ATTR_UNUSED(nocaps), struct edns_option* ATTR_UNUSED(opt_list),
+ struct sockaddr_storage* ATTR_UNUSED(addr),
socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone),
size_t ATTR_UNUSED(zonelen), struct module_qstate* ATTR_UNUSED(q))
{
diff --git a/dns64/dns64.c b/dns64/dns64.c
index 0de3f6643341..2fde67841bb3 100644
--- a/dns64/dns64.c
+++ b/dns64/dns64.c
@@ -521,13 +521,14 @@ handle_event_moddone(struct module_qstate* qstate, int id)
* - An internal query.
* - A query for a record type other than AAAA.
* - CD FLAG was set on querier
- * - An AAAA query for which an error was returned.
+ * - An AAAA query for which an error was returned.(qstate.return_rcode)
+ * -> treated as servfail thus synthesize (sec 5.1.3 6147), thus
+ * synthesize in (sec 5.1.2 of RFC6147).
* - A successful AAAA query with an answer.
*/
if ( (enum dns64_qstate)qstate->minfo[id] == DNS64_INTERNAL_QUERY
|| qstate->qinfo.qtype != LDNS_RR_TYPE_AAAA
|| (qstate->query_flags & BIT_CD)
- || qstate->return_rcode != LDNS_RCODE_NOERROR
|| (qstate->return_msg &&
qstate->return_msg->rep &&
reply_find_answer_rrset(&qstate->qinfo,
diff --git a/dnstap/dnstap.c b/dnstap/dnstap.c
index 8c9c4ca9208e..6df2fef3f312 100644
--- a/dnstap/dnstap.c
+++ b/dnstap/dnstap.c
@@ -475,7 +475,7 @@ dt_msg_send_outside_response(struct dt_env *env,
return;
dt_msg_init(env, &dm, DNSTAP__MESSAGE__TYPE__FORWARDER_RESPONSE);
} else {
- if (!env->log_resolver_query_messages)
+ if (!env->log_resolver_response_messages)
return;
dt_msg_init(env, &dm, DNSTAP__MESSAGE__TYPE__RESOLVER_RESPONSE);
}
diff --git a/doc/Changelog b/doc/Changelog
index 6bcc32ab4566..76ba1e661ec6 100644
--- a/doc/Changelog
+++ b/doc/Changelog
@@ -1,3 +1,156 @@
+2 June 2016: Wouter
+ - Fix libubound for edns optlist feature.
+ - Fix distinction between free and CRYPTO_free in dsa and ecdsa alloc.
+ - Fix #752: retry resource temporarily unavailable on control pipe.
+ - un-document localzone tags.
+
+31 May 2016: Wouter
+ - Fix windows service to be created run with limited rights, as a
+ network service account, from Mario Turschmann.
+ - compat strsep implementation.
+ - generic edns option parse and store code.
+ - and also generic edns options for upstream messages (and replies).
+ after parse use edns_opt_find(edns.opt_list, LDNS_EDNS_NSID),
+ to insert use edns_opt_append(edns, region, code, len, bindata) on
+ the opt_list passed to send_query, or in edns_opt_inplace_reply.
+
+30 May 2016: Wouter
+ - Fix time in case answer comes from cache in ub_resolve_event().
+ - Attempted fix for #765: _unboundmodule missing for python3.
+
+27 May 2016: Wouter
+ - Fix #770: Small subgroup attack on DH used in unix pipe on localhost
+ if unbound control uses a unix local named pipe.
+ - Document write permission to directory of trust anchor needed.
+ - Fix #768: Unbound Service Sometimes Can Not Shutdown
+ Completely, WER Report Shown Up. Close handle before closing WSA.
+
+26 May 2016: Wouter
+ - Updated patch from Charles Walker.
+
+24 May 2016: Wouter
+ - disable-dnssec-lame-check config option from Charles Walker.
+ - remove memory leak from lame-check patch.
+ - iana portlist update.
+
+23 May 2016: Wouter
+ - Fix #767: Reference to an expired Internet-Draft in
+ harden-below-nxdomain documentation.
+
+20 May 2016: Ralph
+ - No QNAME minimisation fall-back for NXDOMAIN answers from DNSSEC
+ signed zones.
+ - iana portlist update.
+
+19 May 2016: Wouter
+ - Fix #766: dns64 should synthesize results on timeout/errors.
+
+18 May 2016: Wouter
+ - Fix #761: DNSSEC LAME false positive resolving nic.club.
+
+17 May 2016: Wouter
+ - trunk updated with output of flex 2.6.0.
+
+6 May 2016: Wouter
+ - Fix memory leak in out-of-memory conditions of local zone add.
+
+29 April 2016: Wouter
+ - Fix sldns with static checking fixes copied from getdns.
+
+28 April 2016: Wouter
+ - Fix #759: 0x20 capsforid no longer checks type PTR, for
+ compatibility with cisco dns guard. This lowers false positives.
+
+18 April 2016: Wouter
+ - Fix some malformed reponses to edns queries get fallback to nonedns.
+
+15 April 2016: Wouter
+ - cachedb module event handling design.
+
+14 April 2016: Wouter
+ - cachedb module framework (empty).
+ - iana portlist update.
+
+12 April 2016: Wouter
+ - Fix #753: document dump_requestlist is for first thread.
+
+24 March 2016: Wouter
+ - Document permit-small-holddown for 5011 debug.
+ - Fix #749: unbound-checkconf gets SIGSEGV when use against a
+ malformatted conf file.
+
+23 March 2016: Wouter
+ - OpenSSL 1.1.0 portability, --disable-dsa configure option.
+
+21 March 2016: Wouter
+ - Fix compile of getentropy_linux for SLES11 servicepack 4.
+ - Fix dnstap-log-resolver-response-messages, from Nikolay Edigaryev.
+ - Fix test for openssl to use HMAC_Update for 1.1.0.
+ - acx_nlnetlabs.m4 to v33, with HMAC_Update.
+ - acx_nlnetlabs.m4 to v34, with -ldl -pthread test for libcrypto.
+ - ERR_remove_state deprecated since openssl 1.0.0.
+ - OPENSSL_config is deprecated, removing.
+
+18 March 2016: Ralph
+ - Validate QNAME minimised NXDOMAIN responses.
+ - If QNAME minimisation is enabled, do cache lookup for QTYPE NS in
+ harden-below-nxdomain.
+
+17 March 2016: Ralph
+ - Limit number of QNAME minimisation iterations.
+
+17 March 2016: Wouter
+ - Fix #746: Fix unbound sets CD bit on all forwards.
+ If no trust anchors, it'll not set CD bit when forwarding to another
+ server. If a trust anchor, no CD bit on the first attempt to a
+ forwarder, but CD bit thereafter on repeated attempts to get DNSSEC.
+ - iana portlist update.
+
+16 March 2016: Wouter
+ - Fix ip-transparent for ipv6 on FreeBSD, thanks to Nick Hibma.
+ - Fix ip-transparent for tcp on freebsd.
+
+15 March 2016: Wouter
+ - ip_freebind: yesno option in unbound.conf sets IP_FREEBIND for
+ binding to an IP address while the interface or address is down.
+
+14 March 2016: Wouter
+ - Fix warnings in ifdef corner case, older or unknown libevent.
+ - Fix compile for ub_event code with older libev.
+
+11 March 2016: Wouter
+ - Remove warning about unused parameter in event_pluggable.c.
+ - Fix libev usage of dispatch return value.
+ - No side effects in tolower() call, in case it is a macro.
+ - For test put free in pluggable api in parenthesis.
+
+10 March 2016: Wouter
+ - Fixup backend2str for libev.
+
+09 March 2016: Willem
+ - User defined pluggable event API for libunbound
+ - Fixup of compile fix for pluggable event API from P.Y. Adi
+ Prasaja.
+
+09 March 2016: Wouter
+ - Updated configure and ltmain.sh.
+ - Updated L root IPv6 address.
+
+07 March 2016: Wouter
+ - Fix #747: assert in outnet_serviced_query_stop.
+ - iana ports fetched via https.
+ - iana portlist update.
+
+03 March 2016: Wouter
+ - configure tests for the weak attribute support by the compiler.
+
+02 March 2016: Wouter
+ - 1.5.8 release tag
+ - trunk contains 1.5.9 in development.
+ - iana portlist update.
+ - Fix #745: unbound.py - idn2dname throws UnicodeError when idnname
+ contains trailing dot.
+
24 February 2016: Wouter
- Fix OpenBSD asynclook lock free that gets used later (fix test code).
- Fix that NSEC3 negative cache is used when there is no salt.
diff --git a/doc/README b/doc/README
index c87c62e5f39c..7d0dd3712bca 100644
--- a/doc/README
+++ b/doc/README
@@ -1,4 +1,4 @@
-README for Unbound 1.5.8
+README for Unbound 1.5.9
Copyright 2007 NLnet Labs
http://unbound.net
diff --git a/doc/example.conf.in b/doc/example.conf.in
index b5cc1c93e95d..6e00bdf69de4 100644
--- a/doc/example.conf.in
+++ b/doc/example.conf.in
@@ -1,7 +1,7 @@
#
# Example configuration file.
#
-# See unbound.conf(5) man page, version 1.5.8.
+# See unbound.conf(5) man page, version 1.5.9.
#
# this is a comment.
@@ -93,6 +93,11 @@ server:
# (uses IP_BINDANY on FreeBSD).
# ip-transparent: no
+ # use IP_FREEBIND so the interface: addresses can be non-local
+ # and you can bind to nonexisting IPs and interfaces that are down.
+ # Linux only. On Linux you also have ip-transparent that is similar.
+ # ip-freebind: no
+
# EDNS reassembly buffer to advertise to UDP peers (the actual buffer
# is set with msg-buffer-size). 1480 can solve fragmentation (timeouts).
# edns-buffer-size: 4096
@@ -364,6 +369,9 @@ server:
# into response messages when those sections are not required.
# minimal-responses: no
+ # true to disable DNSSEC lameness check in iterator.
+ # disable-dnssec-lame-check: no
+
# module configuration of the server. A string with identifiers
# separated by spaces. Syntax: "[dns64] [validator] iterator"
# module-config: "validator iterator"
@@ -459,7 +467,8 @@ server:
# If the value 0 is given, missing anchors are not removed.
# keep-missing: 31622400 # 366 days
- # debug option that allows very small holddown times for key rollover
+ # debug option that allows very small holddown times for key rollover,
+ # otherwise the RFC mandates probe intervals must be at least 1 hour.
# permit-small-holddown: no
# the amount of memory to use for the key cache.
diff --git a/doc/libunbound.3.in b/doc/libunbound.3.in
index df4b8fd4f6d7..163a6fa44d0d 100644
--- a/doc/libunbound.3.in
+++ b/doc/libunbound.3.in
@@ -1,4 +1,4 @@
-.TH "libunbound" "3" "Mar 2, 2016" "NLnet Labs" "unbound 1.5.8"
+.TH "libunbound" "3" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
.\"
.\" libunbound.3 -- unbound library functions manual
.\"
@@ -43,7 +43,7 @@
.B ub_ctx_zone_remove,
.B ub_ctx_data_add,
.B ub_ctx_data_remove
-\- Unbound DNS validating resolver 1.5.8 functions.
+\- Unbound DNS validating resolver 1.5.9 functions.
.SH "SYNOPSIS"
.B #include <unbound.h>
.LP
diff --git a/doc/unbound-anchor.8.in b/doc/unbound-anchor.8.in
index de283e5d8f49..1dabc725fa59 100644
--- a/doc/unbound-anchor.8.in
+++ b/doc/unbound-anchor.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-anchor" "8" "Mar 2, 2016" "NLnet Labs" "unbound 1.5.8"
+.TH "unbound-anchor" "8" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
.\"
.\" unbound-anchor.8 -- unbound anchor maintenance utility manual
.\"
diff --git a/doc/unbound-checkconf.8.in b/doc/unbound-checkconf.8.in
index 92be13ffe1be..a4cdf3b9ea96 100644
--- a/doc/unbound-checkconf.8.in
+++ b/doc/unbound-checkconf.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-checkconf" "8" "Mar 2, 2016" "NLnet Labs" "unbound 1.5.8"
+.TH "unbound-checkconf" "8" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
.\"
.\" unbound-checkconf.8 -- unbound configuration checker manual
.\"
diff --git a/doc/unbound-control.8.in b/doc/unbound-control.8.in
index 0e814b812235..3b24b1fa9a8c 100644
--- a/doc/unbound-control.8.in
+++ b/doc/unbound-control.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-control" "8" "Mar 2, 2016" "NLnet Labs" "unbound 1.5.8"
+.TH "unbound-control" "8" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
.\"
.\" unbound-control.8 -- unbound remote control manual
.\"
diff --git a/doc/unbound-host.1.in b/doc/unbound-host.1.in
index 65253ad58866..700382eb9f15 100644
--- a/doc/unbound-host.1.in
+++ b/doc/unbound-host.1.in
@@ -1,4 +1,4 @@
-.TH "unbound\-host" "1" "Mar 2, 2016" "NLnet Labs" "unbound 1.5.8"
+.TH "unbound\-host" "1" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
.\"
.\" unbound-host.1 -- unbound DNS lookup utility
.\"
diff --git a/doc/unbound.8.in b/doc/unbound.8.in
index 4b752bb2c13c..35385b9f1a0d 100644
--- a/doc/unbound.8.in
+++ b/doc/unbound.8.in
@@ -1,4 +1,4 @@
-.TH "unbound" "8" "Mar 2, 2016" "NLnet Labs" "unbound 1.5.8"
+.TH "unbound" "8" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
.\"
.\" unbound.8 -- unbound manual
.\"
@@ -9,7 +9,7 @@
.\"
.SH "NAME"
.B unbound
-\- Unbound DNS validating resolver 1.5.8.
+\- Unbound DNS validating resolver 1.5.9.
.SH "SYNOPSIS"
.B unbound
.RB [ \-h ]
diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in
index 3f84cac998e9..b7f241b80056 100644
--- a/doc/unbound.conf.5.in
+++ b/doc/unbound.conf.5.in
@@ -1,4 +1,4 @@
-.TH "unbound.conf" "5" "Mar 2, 2016" "NLnet Labs" "unbound 1.5.8"
+.TH "unbound.conf" "5" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
.\"
.\" unbound.conf.5 -- unbound.conf manual
.\"
@@ -277,6 +277,13 @@ and with this option you can select which (future) interfaces unbound
provides service on. This option needs unbound to be started with root
permissions on some systems. The option uses IP_BINDANY on FreeBSD systems.
.TP
+.B ip\-freebind: \fI<yes or no>
+If yes, then use IP_FREEBIND socket option on sockets where unbound
+is listening to incoming traffic. Default no. Allows you to bind to
+IP addresses that are nonlocal or do not exist, like when the network
+interface or IP adress is down. Exists only on Linux, where the similar
+ip\-transparent option is also available.
+.TP
.B rrset\-cache\-size: \fI<number>
Number of bytes size of the RRset cache. Default is 4 megabytes.
A plain number is in bytes, append 'k', 'm' or 'g' for kilobytes, megabytes
@@ -570,6 +577,7 @@ might return nxdomain for empty nonterminals (that usually happen for reverse
IP address lookups), and thus may be incompatible with this. To try to avoid
this only DNSSEC-secure nxdomains are used, because the old software does not
have DNSSEC. Default is off.
+Currently, draft\-ietf\-dnsop\-nxdomain\-cut promotes this technique.
.TP
.B harden\-referral\-path: \fI<yes or no>
Harden the referral path by performing additional queries for
@@ -673,6 +681,13 @@ This may cause a slight speedup. The default is no, because the DNS
protocol RFCs mandate these sections, and the additional content could
be of use and save roundtrips for clients.
.TP
+.B disable-dnssec-lame-check: \fI<yes or no>
+If true, disables the DNSSEC lameness check in the iterator. This check
+sees if RRSIGs are present in the answer, when dnssec is expected,
+and retries another authority if RRSIGs are unexpectedly missing.
+The validator will insist in RRSIGs for DNSSEC signed domains regardless
+of this setting, if a trust anchor is loaded.
+.TP
.B module\-config: \fI<"module names">
Module configuration, a list of module names separated by spaces, surround
the string with quotes (""). The modules can be validator, iterator.
@@ -691,7 +706,9 @@ File with trust anchor for one zone, which is tracked with RFC5011 probes.
The probes are several times per month, thus the machine must be online
frequently. The initial file can be one with contents as described in
\fBtrust\-anchor\-file\fR. The file is written to when the anchor is updated,
-so the unbound user must have write permission.
+so the unbound user must have write permission. Write permission to the file,
+but also to the directory it is in (to create a temporary file, which is
+necessary to deal with filesystem full events).
.TP
.B trust\-anchor: \fI<"Resource Record">
A DS or DNSKEY RR for a key to use for validation. Multiple entries can be
diff --git a/iterator/iter_fwd.c b/iterator/iter_fwd.c
index 0feee032c960..3e580ca35513 100644
--- a/iterator/iter_fwd.c
+++ b/iterator/iter_fwd.c
@@ -294,6 +294,7 @@ make_stub_holes(struct iter_forwards* fwd, struct config_file* cfg)
uint8_t* dname;
size_t dname_len;
for(s = cfg->stubs; s; s = s->next) {
+ if(!s->name) continue;
dname = sldns_str2wire_dname(s->name, &dname_len);
if(!dname) {
log_err("cannot parse stub name '%s'", s->name);
diff --git a/iterator/iter_utils.c b/iterator/iter_utils.c
index 58e62fbeb27b..a5aefa9602c2 100644
--- a/iterator/iter_utils.c
+++ b/iterator/iter_utils.c
@@ -590,6 +590,27 @@ iter_dp_is_useless(struct query_info* qinfo, uint16_t qflags,
return 1;
}
+int
+iter_indicates_dnssec_fwd(struct module_env* env, struct query_info *qinfo)
+{
+ struct trust_anchor* a;
+ if(!env || !env->anchors || !qinfo || !qinfo->qname)
+ return 0;
+ /* a trust anchor exists above the name? */
+ if((a=anchors_lookup(env->anchors, qinfo->qname, qinfo->qname_len,
+ qinfo->qclass))) {
+ if(a->numDS == 0 && a->numDNSKEY == 0) {
+ /* insecure trust point */
+ lock_basic_unlock(&a->lock);
+ return 0;
+ }
+ lock_basic_unlock(&a->lock);
+ return 1;
+ }
+ /* no trust anchor above it. */
+ return 0;
+}
+
int
iter_indicates_dnssec(struct module_env* env, struct delegpt* dp,
struct dns_msg* msg, uint16_t dclass)
diff --git a/iterator/iter_utils.h b/iterator/iter_utils.h
index 3a4df3e45968..50c5fc093f6c 100644
--- a/iterator/iter_utils.h
+++ b/iterator/iter_utils.h
@@ -174,6 +174,18 @@ int iter_dp_is_useless(struct query_info* qinfo, uint16_t qflags,
struct delegpt* dp);
/**
+ * See if qname has DNSSEC needs in the forwarding case. This is true if
+ * there is a trust anchor above it. Whether there is an insecure delegation
+ * to the data is unknown, but CD-retry is needed.
+ * @param env: environment with anchors.
+ * @param qinfo: query name and class.
+ * @return true if trust anchor above qname, false if no anchor or insecure
+ * point above qname.
+ */
+int iter_indicates_dnssec_fwd(struct module_env* env,
+ struct query_info *qinfo);
+
+/**
* See if delegation is expected to have DNSSEC information (RRSIGs) in
* its answers, or not. Inspects delegation point (name), trust anchors,
* and delegation message (DS RRset) to determine this.
diff --git a/iterator/iterator.c b/iterator/iterator.c
index b1bf902d583d..139cae4bae0a 100644
--- a/iterator/iterator.c
+++ b/iterator/iterator.c
@@ -82,20 +82,6 @@ iter_init(struct module_env* env, int id)
log_err("iterator: could not apply configuration settings.");
return 0;
}
- if(env->cfg->qname_minimisation) {
- uint8_t dname[LDNS_MAX_DOMAINLEN+1];
- size_t len = sizeof(dname);
- if(sldns_str2wire_dname_buf("ip6.arpa.", dname, &len) != 0) {
- log_err("ip6.arpa. parse error");
- return 0;
- }
- iter_env->ip6arpa_dname = (uint8_t*)malloc(len);
- if(!iter_env->ip6arpa_dname) {
- log_err("malloc failure");
- return 0;
- }
- memcpy(iter_env->ip6arpa_dname, dname, len);
- }
return 1;
}
@@ -117,7 +103,6 @@ iter_deinit(struct module_env* env, int id)
if(!env || !env->modinfo[id])
return;
iter_env = (struct iter_env*)env->modinfo[id];
- free(iter_env->ip6arpa_dname);
free(iter_env->target_fetch_policy);
priv_delete(iter_env->priv);
donotq_delete(iter_env->donotq);
@@ -162,6 +147,7 @@ iter_new(struct module_qstate* qstate, int id)
/* Start with the (current) qname. */
iq->qchase = qstate->qinfo;
outbound_list_init(&iq->outlist);
+ iq->minimise_count = 0;
if (qstate->env->cfg->qname_minimisation)
iq->minimisation_state = INIT_MINIMISE_STATE;
else
@@ -1800,6 +1786,8 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
int tf_policy;
struct delegpt_addr* target;
struct outbound_entry* outq;
+ /* EDNS options to set on outgoing packet */
+ struct edns_option* opt_list = NULL;
/* NOTE: a request will encounter this state for each target it
* needs to send a query to. That is, at least one per referral,
@@ -2009,9 +1997,10 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
}
if(iq->minimisation_state == INIT_MINIMISE_STATE) {
- /* (Re)set qinfo_out to (new) delegation point, except
- * when qinfo_out is already a subdomain of dp. This happens
- * when resolving ip6.arpa dnames. */
+ /* (Re)set qinfo_out to (new) delegation point, except when
+ * qinfo_out is already a subdomain of dp. This happens when
+ * increasing by more than one label at once (QNAMEs with more
+ * than MAX_MINIMISE_COUNT labels). */
if(!(iq->qinfo_out.qname_len
&& dname_subdomain_c(iq->qchase.qname,
iq->qinfo_out.qname)
@@ -2021,28 +2010,47 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
iq->qinfo_out.qname_len = iq->dp->namelen;
iq->qinfo_out.qtype = LDNS_RR_TYPE_NS;
iq->qinfo_out.qclass = iq->qchase.qclass;
+ iq->minimise_count = 0;
}
iq->minimisation_state = MINIMISE_STATE;
}
if(iq->minimisation_state == MINIMISE_STATE) {
- int labdiff = dname_count_labels(iq->qchase.qname) -
+ int qchaselabs = dname_count_labels(iq->qchase.qname);
+ int labdiff = qchaselabs -
dname_count_labels(iq->qinfo_out.qname);
iq->qinfo_out.qname = iq->qchase.qname;
iq->qinfo_out.qname_len = iq->qchase.qname_len;
+ iq->minimise_count++;
- /* Special treatment for ip6.arpa lookups.
- * Reverse IPv6 dname has 34 labels, increment the IP part
- * (usually first 32 labels) by 8 labels (7 more than the
- * default 1 label increment). */
- if(labdiff <= 32 &&
- dname_subdomain_c(iq->qchase.qname, ie->ip6arpa_dname)) {
- labdiff -= 7;
- /* Small chance of zone cut after first label. Stop
- * minimising */
- if(labdiff <= 1)
- labdiff = 0;
+ /* Limit number of iterations for QNAMEs with more
+ * than MAX_MINIMISE_COUNT labels. Send first MINIMISE_ONE_LAB
+ * labels of QNAME always individually.
+ */
+ if(qchaselabs > MAX_MINIMISE_COUNT && labdiff > 1 &&
+ iq->minimise_count > MINIMISE_ONE_LAB) {
+ if(iq->minimise_count < MAX_MINIMISE_COUNT) {
+ int multilabs = qchaselabs - 1 -
+ MINIMISE_ONE_LAB;
+ int extralabs = multilabs /
+ MINIMISE_MULTIPLE_LABS;
+
+ if (MAX_MINIMISE_COUNT - iq->minimise_count >=
+ multilabs % MINIMISE_MULTIPLE_LABS)
+ /* Default behaviour is to add 1 label
+ * every iteration. Therefore, decrement
+ * the extralabs by 1 */
+ extralabs--;
+ if (extralabs < labdiff)
+ labdiff -= extralabs;
+ else
+ labdiff = 1;
+ }
+ /* Last minimised iteration, send all labels with
+ * QTYPE=NS */
+ else
+ labdiff = 1;
}
if(labdiff > 1) {
@@ -2068,7 +2076,6 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
* cached as NOERROR/NODATA */
return 1;
}
-
}
if(iq->minimisation_state == SKIP_MINIMISE_STATE)
/* Do not increment qname, continue incrementing next
@@ -2090,10 +2097,16 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
outq = (*qstate->env->send_query)(
iq->qinfo_out.qname, iq->qinfo_out.qname_len,
iq->qinfo_out.qtype, iq->qinfo_out.qclass,
- iq->chase_flags | (iq->chase_to_rd?BIT_RD:0), EDNS_DO|BIT_CD,
+ iq->chase_flags | (iq->chase_to_rd?BIT_RD:0),
+ /* unset CD if to forwarder(RD set) and not dnssec retry
+ * (blacklist nonempty) and no trust-anchors are configured
+ * above the qname or on the first attempt when dnssec is on */
+ EDNS_DO| ((iq->chase_to_rd||(iq->chase_flags&BIT_RD)!=0)&&
+ !qstate->blacklist&&(!iter_indicates_dnssec_fwd(qstate->env,
+ &iq->qinfo_out)||target->attempts==1)?0:BIT_CD),
iq->dnssec_expected, iq->caps_fallback || is_caps_whitelisted(
- ie, iq), &target->addr, target->addrlen, iq->dp->name,
- iq->dp->namelen, qstate);
+ ie, iq), opt_list, &target->addr, target->addrlen,
+ iq->dp->name, iq->dp->namelen, qstate);
if(!outq) {
log_addr(VERB_DETAIL, "error sending query to auth server",
&target->addr, target->addrlen);
@@ -2161,8 +2174,10 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
* differently. No queries should be sent elsewhere */
type = RESPONSE_TYPE_ANSWER;
}
- if(iq->dnssec_expected && !iq->dnssec_lame_query &&
+ if(!qstate->env->cfg->disable_dnssec_lame_check && iq->dnssec_expected
+ && !iq->dnssec_lame_query &&
!(iq->chase_flags&BIT_RD)
+ && iq->sent_count < DNSSEC_LAME_DETECT_COUNT
&& type != RESPONSE_TYPE_LAME
&& type != RESPONSE_TYPE_REC_LAME
&& type != RESPONSE_TYPE_THROWAWAY
@@ -2250,10 +2265,39 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
if(iq->minimisation_state != DONOT_MINIMISE_STATE) {
/* Best effort qname-minimisation.
* Stop minimising and send full query when RCODE
- * is not NOERROR */
+ * is not NOERROR. */
if(FLAGS_GET_RCODE(iq->response->rep->flags) !=
LDNS_RCODE_NOERROR)
iq->minimisation_state = DONOT_MINIMISE_STATE;
+ if(FLAGS_GET_RCODE(iq->response->rep->flags) ==
+ LDNS_RCODE_NXDOMAIN) {
+ /* Stop resolving when NXDOMAIN is DNSSEC
+ * signed. Based on assumption that namservers
+ * serving signed zones do not return NXDOMAIN
+ * for empty-non-terminals. */
+ if(iq->dnssec_expected)
+ return final_state(iq);
+ /* Make subrequest to validate intermediate
+ * NXDOMAIN if harden-below-nxdomain is
+ * enabled. */
+ if(qstate->env->cfg->harden_below_nxdomain) {
+ struct module_qstate* subq = NULL;
+ log_query_info(VERB_QUERY,
+ "schedule NXDOMAIN validation:",
+ &iq->response->qinfo);
+ if(!generate_sub_request(
+ iq->response->qinfo.qname,
+ iq->response->qinfo.qname_len,
+ iq->response->qinfo.qtype,
+ iq->response->qinfo.qclass,
+ qstate, id, iq,
+ INIT_REQUEST_STATE,
+ FINISHED_STATE, &subq, 1))
+ verbose(VERB_ALGO,
+ "could not validate NXDOMAIN "
+ "response");
+ }
+ }
return next_state(iq, QUERYTARGETS_STATE);
}
return final_state(iq);
@@ -3082,7 +3126,8 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
goto handle_it;
}
/* edns is not examined, but removed from message to help cache */
- if(parse_extract_edns(prs, &edns) != LDNS_RCODE_NOERROR)
+ if(parse_extract_edns(prs, &edns, qstate->env->scratch) !=
+ LDNS_RCODE_NOERROR)
goto handle_it;
/* remove CD-bit, we asked for in case we handle validation ourself */
prs->flags &= ~BIT_CD;
diff --git a/iterator/iterator.h b/iterator/iterator.h
index b7aa82ebe4ed..7c32a74f800b 100644
--- a/iterator/iterator.h
+++ b/iterator/iterator.h
@@ -61,6 +61,20 @@ struct rbtree_t;
#define MAX_REFERRAL_COUNT 130
/** max number of queries-sent-out. Make sure large NS set does not loop */
#define MAX_SENT_COUNT 32
+/** max number of queries for which to perform dnsseclameness detection,
+ * (rrsigs misssing detection) after that, just pick up that response */
+#define DNSSEC_LAME_DETECT_COUNT 4
+/**
+ * max number of QNAME minimisation iterations. Limits number of queries for
+ * QNAMEs with a lot of labels.
+*/
+#define MAX_MINIMISE_COUNT 10
+/**
+ * number of labels from QNAME that are always send individually when using
+ * QNAME minimisation, even when the number of labels of the QNAME is bigger
+ * tham MAX_MINIMISE_COUNT */
+#define MINIMISE_ONE_LAB 4
+#define MINIMISE_MULTIPLE_LABS (MAX_MINIMISE_COUNT - MINIMISE_ONE_LAB)
/** at what query-sent-count to stop target fetch policy */
#define TARGET_FETCH_STOP 3
/** how nice is a server without further information, in msec
@@ -349,7 +363,7 @@ struct iter_qstate {
/** list of pending queries to authoritative servers. */
struct outbound_list outlist;
- /** QNAME minimisation state */
+ /** QNAME minimisation state, RFC7816 */
enum minimisation_state minimisation_state;
/**
@@ -357,6 +371,12 @@ struct iter_qstate {
* when qname minimisation is enabled.
*/
struct query_info qinfo_out;
+
+ /**
+ * Count number of QNAME minisation iterations. Used to limit number of
+ * outgoing queries when QNAME minimisation is enabled.
+ */
+ int minimise_count;
};
/**
diff --git a/libunbound/context.h b/libunbound/context.h
index 31ca09c6db0c..d32c0b00aa03 100644
--- a/libunbound/context.h
+++ b/libunbound/context.h
@@ -49,7 +49,7 @@
struct libworker;
struct tube;
struct sldns_buffer;
-struct event_base;
+struct ub_event_base;
/**
* The context structure
@@ -114,7 +114,7 @@ struct ub_ctx {
struct ub_randstate* seed_rnd;
/** event base for event oriented interface */
- struct event_base* event_base;
+ struct ub_event_base* event_base;
/** libworker for event based interface */
struct libworker* event_worker;
diff --git a/libunbound/libunbound.c b/libunbound/libunbound.c
index 992509e7e27e..69ccb08f45cb 100644
--- a/libunbound/libunbound.c
+++ b/libunbound/libunbound.c
@@ -57,6 +57,7 @@
#include "util/random.h"
#include "util/net_help.h"
#include "util/tube.h"
+#include "util/ub_event.h"
#include "services/modstack.h"
#include "services/localzone.h"
#include "services/cache/infra.h"
@@ -170,6 +171,20 @@ ub_ctx_create(void)
}
struct ub_ctx*
+ub_ctx_create_ub_event(struct ub_event_base* ueb)
+{
+ struct ub_ctx* ctx = ub_ctx_create_nopipe();
+ if(!ctx)
+ return NULL;
+ /* no pipes, but we have the locks to make sure everything works */
+ ctx->created_bg = 0;
+ ctx->dothread = 1; /* the processing is in the same process,
+ makes ub_cancel and ub_ctx_delete do the right thing */
+ ctx->event_base = ueb;
+ return ctx;
+}
+
+struct ub_ctx*
ub_ctx_create_event(struct event_base* eb)
{
struct ub_ctx* ctx = ub_ctx_create_nopipe();
@@ -179,7 +194,11 @@ ub_ctx_create_event(struct event_base* eb)
ctx->created_bg = 0;
ctx->dothread = 1; /* the processing is in the same process,
makes ub_cancel and ub_ctx_delete do the right thing */
- ctx->event_base = eb;
+ ctx->event_base = ub_libevent_event_base(eb);
+ if (!ctx->event_base) {
+ ub_ctx_delete(ctx);
+ return NULL;
+ }
return ctx;
}
@@ -698,6 +717,9 @@ ub_resolve_event(struct ub_ctx* ctx, const char* name, int rrtype,
}
}
+ /* set time in case answer comes from cache */
+ ub_comm_base_now(ctx->event_worker->base);
+
/* create new ctx_query and attempt to add to the list */
q = context_new(ctx, name, rrtype, rrclass, (ub_callback_t)callback,
mydata);
@@ -1323,10 +1345,12 @@ const char* ub_version(void)
int
ub_ctx_set_event(struct ub_ctx* ctx, struct event_base* base) {
+ struct ub_event_base* new_base;
+
if (!ctx || !ctx->event_base || !base) {
return UB_INITFAIL;
}
- if (ctx->event_base == base) {
+ if (ub_libevent_get_event_base(ctx->event_base) == base) {
/* already set */
return UB_NOERROR;
}
@@ -1335,9 +1359,11 @@ ub_ctx_set_event(struct ub_ctx* ctx, struct event_base* base) {
/* destroy the current worker - safe to pass in NULL */
libworker_delete_event(ctx->event_worker);
ctx->event_worker = NULL;
- ctx->event_base = base;
+ new_base = ub_libevent_event_base(base);
+ if (new_base)
+ ctx->event_base = new_base;
ctx->created_bg = 0;
ctx->dothread = 1;
lock_basic_unlock(&ctx->cfglock);
- return UB_NOERROR;
+ return new_base ? UB_NOERROR : UB_INITFAIL;
}
diff --git a/libunbound/libworker.c b/libunbound/libworker.c
index ad1f84ce97d9..2af392706b68 100644
--- a/libunbound/libworker.c
+++ b/libunbound/libworker.c
@@ -119,7 +119,7 @@ libworker_delete_event(struct libworker* w)
/** setup fresh libworker struct */
static struct libworker*
-libworker_setup(struct ub_ctx* ctx, int is_bg, struct event_base* eb)
+libworker_setup(struct ub_ctx* ctx, int is_bg, struct ub_event_base* eb)
{
unsigned int seed;
struct libworker* w = (struct libworker*)calloc(1, sizeof(*w));
@@ -258,7 +258,7 @@ libworker_setup(struct ub_ctx* ctx, int is_bg, struct event_base* eb)
}
struct libworker* libworker_create_event(struct ub_ctx* ctx,
- struct event_base* eb)
+ struct ub_event_base* eb)
{
return libworker_setup(ctx, 0, eb);
}
@@ -581,6 +581,7 @@ setup_qinfo_edns(struct libworker* w, struct ctx_query* q,
edns->ext_rcode = 0;
edns->edns_version = 0;
edns->bits = EDNS_DO;
+ edns->opt_list = NULL;
if(sldns_buffer_capacity(w->back->udp_buff) < 65535)
edns->udp_size = (uint16_t)sldns_buffer_capacity(
w->back->udp_buff);
@@ -822,9 +823,9 @@ void libworker_alloc_cleanup(void* arg)
struct outbound_entry* libworker_send_query(uint8_t* qname, size_t qnamelen,
uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec,
- int want_dnssec, int nocaps, struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t* zone, size_t zonelen,
- struct module_qstate* q)
+ int want_dnssec, int nocaps, struct edns_option* opt_list,
+ struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
+ size_t zonelen, struct module_qstate* q)
{
struct libworker* w = (struct libworker*)q->env->worker;
struct outbound_entry* e = (struct outbound_entry*)regional_alloc(
@@ -834,9 +835,9 @@ struct outbound_entry* libworker_send_query(uint8_t* qname, size_t qnamelen,
e->qstate = q;
e->qsent = outnet_serviced_query(w->back, qname,
qnamelen, qtype, qclass, flags, dnssec, want_dnssec, nocaps,
- q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, addr,
- addrlen, zone, zonelen, libworker_handle_service_reply, e,
- w->back->udp_buff);
+ q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, opt_list,
+ addr, addrlen, zone, zonelen, libworker_handle_service_reply,
+ e, w->back->udp_buff);
if(!e->qsent) {
return NULL;
}
@@ -955,7 +956,8 @@ struct outbound_entry* worker_send_query(uint8_t* ATTR_UNUSED(qname),
size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype),
uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags),
int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec),
- int ATTR_UNUSED(nocaps), struct sockaddr_storage* ATTR_UNUSED(addr),
+ int ATTR_UNUSED(nocaps), struct edns_option* ATTR_UNUSED(opt_list),
+ struct sockaddr_storage* ATTR_UNUSED(addr),
socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone),
size_t ATTR_UNUSED(zonelen), struct module_qstate* ATTR_UNUSED(q))
{
diff --git a/libunbound/libworker.h b/libunbound/libworker.h
index 0103b5d8898d..00143475bbce 100644
--- a/libunbound/libworker.h
+++ b/libunbound/libworker.h
@@ -58,7 +58,7 @@ struct comm_reply;
struct regional;
struct tube;
struct sldns_buffer;
-struct event_base;
+struct ub_event_base;
/**
* The library-worker status structure
@@ -115,7 +115,7 @@ int libworker_fg(struct ub_ctx* ctx, struct ctx_query* q);
* @return new worker or NULL.
*/
struct libworker* libworker_create_event(struct ub_ctx* ctx,
- struct event_base* eb);
+ struct ub_event_base* eb);
/**
* Attach context_query to mesh for callback in event-driven setup.
diff --git a/libunbound/python/libunbound.i b/libunbound/python/libunbound.i
index 50a9b67acf8b..84a536929421 100644
--- a/libunbound/python/libunbound.i
+++ b/libunbound/python/libunbound.i
@@ -945,7 +945,7 @@ int _ub_resolve_async(struct ub_ctx* ctx, char* name, int rrtype, int rrclass, v
:param idnname: (unicode string) IDN name
:returns: (string) domain name
"""
- return '.'.join([encodings.idna.ToASCII(a) for a in idnname.split('.')])
+ return '.'.join([encodings.idna.ToASCII(a) if a else '' for a in idnname.split('.')])
def dname2idn(name):
"""Converts canonic domain name in IDN format to unicode string
diff --git a/libunbound/ubsyms.def b/libunbound/ubsyms.def
index d03a84b1bbc9..0d8e6af91ee2 100644
--- a/libunbound/ubsyms.def
+++ b/libunbound/ubsyms.def
@@ -6,6 +6,7 @@ ub_ctx_async
ub_ctx_config
ub_ctx_create
ub_ctx_create_event
+ub_ctx_create_ub_event
ub_ctx_data_add
ub_ctx_data_remove
ub_ctx_debuglevel
diff --git a/libunbound/unbound-event.h b/libunbound/unbound-event.h
index b80de38de147..432750d77495 100644
--- a/libunbound/unbound-event.h
+++ b/libunbound/unbound-event.h
@@ -36,20 +36,21 @@
/**
* \file
*
- * This file contains the unbound interface for use with libevent.
- * You have to use the same libevent that unbound was compiled with,
- * otherwise it wouldn't work, the event and event_base structures would
- * be different. If unbound is compiled without libevent support then
- * this header file is not supposed to be installed on the system.
+ * This file contains the unbound interface for use with user defined
+ * pluggable event bases.
*
- * Use ub_ctx_create_event_base() to create an unbound context that uses
- * the event base that you have made. Then, use the ub_resolve_event call
- * to add DNS resolve queries to the context. Those then run when you
- * call event_dispatch() on your event_base, and when they are done you
- * get a function callback.
+ * Use ub_ctx_create_event_ub_base() to create an unbound context that uses
+ * the user provided event base API. Then, use the ub_resolve_event call
+ * to add DNS resolve queries to the context. Those then run whith the
+ * provided event_base, and when they are done you get a function callback.
*
* This method does not fork another process or create a thread, the effort
- * is done by the unbound state machines that are connected to the event_base.
+ * is done by the unbound state machines that are connected to the event base.
+ *
+ * It is also possible to provide a libevent based event base by using
+ * ub_ctx_create_event_base(). But you have to use the same libevent that
+ * unbound was compiled with, otherwise it wouldn't work, the event and
+ * event_base structures would be different.
*/
#ifndef _UB_UNBOUND_EVENT_H
#define _UB_UNBOUND_EVENT_H
@@ -62,12 +63,136 @@ struct ub_ctx;
struct ub_result;
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
+
+/** magic number to identify this version of the pluggable event api */
+#define UB_EVENT_MAGIC 0x44d74d78
+
+struct ub_event;
+struct ub_event_base;
+struct timeval;
+
+/**
+ * The Virtual Method Table for and ub_event_base "object"
+ */
+struct ub_event_base_vmt {
+ /** Destructor for the ub_event_base object,
+ * (not called by libunbound) */
+ void (*free)(struct ub_event_base*);
+ /** Run the event loop
+ * (not called by libunbound when using ub_resolve_event) */
+ int (*dispatch)(struct ub_event_base*);
+ /** Exit the given event loop */
+ int (*loopexit)(struct ub_event_base*, struct timeval*);
+ /** Instantiate a new ub_event associated with this event base */
+ struct ub_event* (*new_event)(struct ub_event_base*,
+ int fd, short bits, void (*cb)(int, short, void*), void* arg);
+ /** Instantiate a new signal associated with this event base,
+ * (not called by libunbound) */
+ struct ub_event* (*new_signal)(struct ub_event_base*, int fd,
+ void (*cb)(int, short, void*), void* arg);
+ /** Create a new ub_event associated with the given wsaevent,
+ * (not called by libunbound) */
+ struct ub_event* (*winsock_register_wsaevent)(struct ub_event_base*,
+ void* wsaevent, void (*cb)(int, short, void*), void* arg);
+};
+
+/**
+ * A user defined pluggable event base is registered by providing a
+ * ub_event_base "object" with the ub_ctx_create_ub_event() function.
+ * The magic number must be correct and the Virtual Method Table must be
+ * fully equipped providing the event base API to be used by libunbound.
+ */
+struct ub_event_base {
+ /** magic must be UB_EVENT_MAGIC (0x44d74d78) */
+ unsigned long magic;
+ /** Virtual Method Table for ub_event_base */
+ struct ub_event_base_vmt* vmt;
+};
+
+/**
+ * The Virtual Method Table for and ub_event "object"
+ */
+struct ub_event_vmt {
+ /** Add event bits for this event to fire on.
+ * The event will be deactivated before this function is called. */
+ void (*add_bits)(struct ub_event*, short);
+ /** Configure the event so it will not longer fire on given bits
+ * The event will be deactivated before this function is called. */
+ void (*del_bits)(struct ub_event*, short);
+ /** Change or set the file descriptor on the event
+ * The event will be deactivated before this function is called. */
+ void (*set_fd)(struct ub_event*, int);
+ /** Destructor for the ub_event object */
+ void (*free)(struct ub_event*);
+ /** Activate the event. The given timeval is an timeout value. */
+ int (*add)(struct ub_event*, struct timeval*);
+ /** Deactivate the event */
+ int (*del)(struct ub_event*);
+ /** Reconfigure and activate a timeout event */
+ int (*add_timer)(struct ub_event*, struct ub_event_base*,
+ void (*cb)(int, short, void*), void* arg, struct timeval*);
+ /** Deactivate the timeout event */
+ int (*del_timer)(struct ub_event*);
+ /** Activate a signal event (not called by libunbound). */
+ int (*add_signal)(struct ub_event*, struct timeval*);
+ /** Deactivate a signal event (not called by libunbound). */
+ int (*del_signal)(struct ub_event*);
+ /** Destructor for a ub_event associated with a wsaevent,
+ * (not called by libunbound)
+ */
+ void (*winsock_unregister_wsaevent)(struct ub_event* ev);
+ /** Libunbound will signal the eventloop when a TCP windows socket
+ * will block on next read or write (given by the eventbits), to work
+ * around edge trigger event behaviour of select on windows with TCP.
+ */
+ void (*winsock_tcp_wouldblock)(struct ub_event*, int eventbit);
+};
+
+/**
+ * An "object" comprising a user defined pluggable event.
+ * The magic number must be correct and the Virtual Method Table must be
+ * fully equipped providing the ub_event API to be used by libunbound.
+ */
+struct ub_event {
+ /** magic must be UB_EVENT_MAGIC (0x44d74d78) */
+ unsigned long magic;
+ /** Virtual Method Table for ub_event */
+ struct ub_event_vmt* vmt;
+};
+
typedef void (*ub_event_callback_t)(void*, int, void*, int, int, char*);
/**
* Create a resolving and validation context.
* The information from /etc/resolv.conf and /etc/hosts is not utilised by
* default. Use ub_ctx_resolvconf and ub_ctx_hosts to read them.
+ * @param base: the pluggable event base that the caller has created.
+ * The unbound context uses this event base.
+ * @return a new context. default initialisation.
+ * returns NULL on error.
+ * You must use ub_resolve_event with this context.
+ * Do not call ub_ctx_async, ub_poll, ub_wait, ub_process, this is all done
+ * with the event_base. Setup the options you like with the other functions.
+ */
+struct ub_ctx* ub_ctx_create_ub_event(struct ub_event_base* base);
+
+/**
+ * Create a resolving and validation context.
+ * The information from /etc/resolv.conf and /etc/hosts is not utilised by
+ * default. Use ub_ctx_resolvconf and ub_ctx_hosts to read them.
+ * You have to use the same libevent that unbound was compiled with,
+ * otherwise it wouldn't work, the event and event_base structures would
+ * be different.
* @param base: the event base that the caller has created. The unbound
* context uses this event base.
* @return a new context. default initialisation.
@@ -79,7 +204,10 @@ typedef void (*ub_event_callback_t)(void*, int, void*, int, int, char*);
struct ub_ctx* ub_ctx_create_event(struct event_base* base);
/**
- * Set a new event_base on a context created with ub_ctx_create_event.
+ * Set a new libevent event_base on a context created with ub_ctx_create_event.
+ * You have to use the same libevent that unbound was compiled with,
+ * otherwise it wouldn't work, the event and event_base structures would
+ * be different.
* Any outbound queries will be canceled.
* @param ctx the ub_ctx to update. Must have been created with ub_ctx_create_event
* @param base the new event_base to attach to the ctx
diff --git a/libunbound/worker.h b/libunbound/worker.h
index a531501994af..b8d8dd88a8d9 100644
--- a/libunbound/worker.h
+++ b/libunbound/worker.h
@@ -48,6 +48,7 @@ struct comm_reply;
struct comm_point;
struct module_qstate;
struct tube;
+struct edns_option;
/**
* Worker service routine to send serviced queries to authoritative servers.
@@ -59,6 +60,7 @@ struct tube;
* @param dnssec: if set, EDNS record will have DO bit set.
* @param want_dnssec: signatures needed.
* @param nocaps: ignore capsforid(if in config), do not perturb qname.
+ * @param opt_list: EDNS options on outgoing packet.
* @param addr: where to.
* @param addrlen: length of addr.
* @param zone: delegation point name.
@@ -69,9 +71,9 @@ struct tube;
*/
struct outbound_entry* libworker_send_query(uint8_t* qname, size_t qnamelen,
uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec,
- int want_dnssec, int nocaps, struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t* zone, size_t zonelen,
- struct module_qstate* q);
+ int want_dnssec, int nocaps, struct edns_option* opt_list,
+ struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
+ size_t zonelen, struct module_qstate* q);
/** process incoming replies from the network */
int libworker_handle_reply(struct comm_point* c, void* arg, int error,
@@ -114,6 +116,7 @@ void worker_sighandler(int sig, void* arg);
* @param dnssec: if set, EDNS record will have DO bit set.
* @param want_dnssec: signatures needed.
* @param nocaps: ignore capsforid(if in config), do not perturb qname.
+ * @param opt_list: EDNS options on outgoing packet.
* @param addr: where to.
* @param addrlen: length of addr.
* @param zone: wireformat dname of the zone.
@@ -124,9 +127,9 @@ void worker_sighandler(int sig, void* arg);
*/
struct outbound_entry* worker_send_query(uint8_t* qname, size_t qnamelen,
uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec,
- int want_dnssec, int nocaps, struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t* zone, size_t zonelen,
- struct module_qstate* q);
+ int want_dnssec, int nocaps, struct edns_option* opt_list,
+ struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
+ size_t zonelen, struct module_qstate* q);
/**
* process control messages from the main thread. Frees the control
diff --git a/pythonmod/pythonmod.c b/pythonmod/pythonmod.c
index 48dbc01698cb..6c5e6392df4b 100644
--- a/pythonmod/pythonmod.c
+++ b/pythonmod/pythonmod.c
@@ -141,6 +141,9 @@ int pythonmod_init(struct module_env* env, int id)
#endif
Py_SetProgramName(progname);
Py_NoSiteFlag = 1;
+#if PY_MAJOR_VERSION >= 3
+ PyImport_AppendInittab(SWIG_name, (void*)SWIG_init);
+#endif
Py_Initialize();
PyEval_InitThreads();
SWIG_init();
diff --git a/pythonmod/pythonmod_utils.c b/pythonmod/pythonmod_utils.c
index 5120074e839a..ae694d57693a 100644
--- a/pythonmod/pythonmod_utils.c
+++ b/pythonmod/pythonmod_utils.c
@@ -129,7 +129,8 @@ int createResponse(struct module_qstate* qstate, sldns_buffer* pkt)
return 0;
}
/* edns is not examined, but removed from message to help cache */
- if(parse_extract_edns(prs, &edns) != LDNS_RCODE_NOERROR)
+ if(parse_extract_edns(prs, &edns, qstate->env->scratch) !=
+ LDNS_RCODE_NOERROR)
return 0;
/* remove CD-bit, we asked for in case we handle validation ourself */
diff --git a/services/cache/dns.c b/services/cache/dns.c
index e14e636dbfd0..84db7a77884c 100644
--- a/services/cache/dns.c
+++ b/services/cache/dns.c
@@ -795,6 +795,12 @@ dns_cache_lookup(struct module_env* env,
dname_remove_label(&k.qname, &k.qname_len);
h = query_info_hash(&k, flags);
e = slabhash_lookup(env->msg_cache, h, &k, 0);
+ if(!e && k.qtype != LDNS_RR_TYPE_NS &&
+ env->cfg->qname_minimisation) {
+ k.qtype = LDNS_RR_TYPE_NS;
+ h = query_info_hash(&k, flags);
+ e = slabhash_lookup(env->msg_cache, h, &k, 0);
+ }
if(e) {
struct reply_info* data = (struct reply_info*)e->data;
struct dns_msg* msg;
@@ -810,6 +816,7 @@ dns_cache_lookup(struct module_env* env,
}
lock_rw_unlock(&e->lock);
}
+ k.qtype = qtype;
}
/* fill common RR types for ANY response to avoid requery */
diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c
index be63439e6bed..3083876eead4 100644
--- a/services/listen_dnsport.c
+++ b/services/listen_dnsport.c
@@ -96,10 +96,11 @@ verbose_print_addr(struct addrinfo *addr)
int
create_udp_sock(int family, int socktype, struct sockaddr* addr,
socklen_t addrlen, int v6only, int* inuse, int* noproto,
- int rcv, int snd, int listen, int* reuseport, int transparent)
+ int rcv, int snd, int listen, int* reuseport, int transparent,
+ int freebind)
{
int s;
-#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_USE_MIN_MTU) || defined(IP_TRANSPARENT) || defined(IP_BINDANY)
+#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_USE_MIN_MTU) || defined(IP_TRANSPARENT) || defined(IP_BINDANY) || defined(IP_FREEBIND)
int on=1;
#endif
#ifdef IPV6_MTU
@@ -117,6 +118,9 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
#if !defined(IP_TRANSPARENT) && !defined(IP_BINDANY)
(void)transparent;
#endif
+#if !defined(IP_FREEBIND)
+ (void)freebind;
+#endif
if((s = socket(family, socktype, 0)) == -1) {
*inuse = 0;
#ifndef USE_WINSOCK
@@ -180,6 +184,14 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
#else
(void)reuseport;
#endif /* defined(SO_REUSEPORT) */
+#ifdef IP_FREEBIND
+ if (freebind &&
+ setsockopt(s, IPPROTO_IP, IP_FREEBIND, (void*)&on,
+ (socklen_t)sizeof(on)) < 0) {
+ log_warn("setsockopt(.. IP_FREEBIND ..) failed: %s",
+ strerror(errno));
+ }
+#endif /* IP_FREEBIND */
#ifdef IP_TRANSPARENT
if (transparent &&
setsockopt(s, IPPROTO_IP, IP_TRANSPARENT, (void*)&on,
@@ -190,9 +202,10 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
#elif defined(IP_BINDANY)
if (transparent &&
setsockopt(s, (family==AF_INET6? IPPROTO_IPV6:IPPROTO_IP),
- IP_BINDANY, (void*)&on, (socklen_t)sizeof(on)) < 0) {
- log_warn("setsockopt(.. IP_BINDANY ..) failed: %s",
- strerror(errno));
+ (family == AF_INET6? IPV6_BINDANY:IP_BINDANY),
+ (void*)&on, (socklen_t)sizeof(on)) < 0) {
+ log_warn("setsockopt(.. IP%s_BINDANY ..) failed: %s",
+ (family==AF_INET6?"V6":""), strerror(errno));
}
#endif /* IP_TRANSPARENT || IP_BINDANY */
}
@@ -490,15 +503,18 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
int
create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
- int* reuseport, int transparent, int mss)
+ int* reuseport, int transparent, int mss, int freebind)
{
int s;
-#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_V6ONLY) || defined(IP_TRANSPARENT)
+#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_V6ONLY) || defined(IP_TRANSPARENT) || defined(IP_BINDANY) || defined(IP_FREEBIND)
int on = 1;
#endif
-#ifndef IP_TRANSPARENT
+#if !defined(IP_TRANSPARENT) && !defined(IP_BINDANY)
(void)transparent;
#endif
+#if !defined(IP_FREEBIND)
+ (void)freebind;
+#endif
verbose_print_addr(addr);
*noproto = 0;
if((s = socket(addr->ai_family, addr->ai_socktype, 0)) == -1) {
@@ -553,6 +569,13 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
return -1;
}
#endif /* SO_REUSEADDR */
+#ifdef IP_FREEBIND
+ if (freebind && setsockopt(s, IPPROTO_IP, IP_FREEBIND, (void*)&on,
+ (socklen_t)sizeof(on)) < 0) {
+ log_warn("setsockopt(.. IP_FREEBIND ..) failed: %s",
+ strerror(errno));
+ }
+#endif /* IP_FREEBIND */
#ifdef SO_REUSEPORT
/* try to set SO_REUSEPORT so that incoming
* connections are distributed evenly among the receiving threads.
@@ -599,7 +622,15 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
log_warn("setsockopt(.. IP_TRANSPARENT ..) failed: %s",
strerror(errno));
}
-#endif /* IP_TRANSPARENT */
+#elif defined(IP_BINDANY)
+ if (transparent &&
+ setsockopt(s, (addr->ai_family==AF_INET6? IPPROTO_IPV6:IPPROTO_IP),
+ (addr->ai_family == AF_INET6? IPV6_BINDANY:IP_BINDANY),
+ (void*)&on, (socklen_t)sizeof(on)) < 0) {
+ log_warn("setsockopt(.. IP%s_BINDANY ..) failed: %s",
+ (addr->ai_family==AF_INET6?"V6":""), strerror(errno));
+ }
+#endif /* IP_TRANSPARENT || IP_BINDANY */
if(bind(s, addr->ai_addr, addr->ai_addrlen) != 0) {
#ifndef USE_WINSOCK
/* detect freebsd jail with no ipv6 permission */
@@ -704,7 +735,7 @@ create_local_accept_sock(const char *path, int* noproto)
static int
make_sock(int stype, const char* ifname, const char* port,
struct addrinfo *hints, int v6only, int* noip6, size_t rcv, size_t snd,
- int* reuseport, int transparent, int tcp_mss)
+ int* reuseport, int transparent, int tcp_mss, int freebind)
{
struct addrinfo *res = NULL;
int r, s, inuse, noproto;
@@ -732,7 +763,7 @@ make_sock(int stype, const char* ifname, const char* port,
s = create_udp_sock(res->ai_family, res->ai_socktype,
(struct sockaddr*)res->ai_addr, res->ai_addrlen,
v6only, &inuse, &noproto, (int)rcv, (int)snd, 1,
- reuseport, transparent);
+ reuseport, transparent, freebind);
if(s == -1 && inuse) {
log_err("bind: address already in use");
} else if(s == -1 && noproto && hints->ai_family == AF_INET6){
@@ -740,7 +771,7 @@ make_sock(int stype, const char* ifname, const char* port,
}
} else {
s = create_tcp_accept_sock(res, v6only, &noproto, reuseport,
- transparent, tcp_mss);
+ transparent, tcp_mss, freebind);
if(s == -1 && noproto && hints->ai_family == AF_INET6){
*noip6 = 1;
}
@@ -753,7 +784,7 @@ make_sock(int stype, const char* ifname, const char* port,
static int
make_sock_port(int stype, const char* ifname, const char* port,
struct addrinfo *hints, int v6only, int* noip6, size_t rcv, size_t snd,
- int* reuseport, int transparent, int tcp_mss)
+ int* reuseport, int transparent, int tcp_mss, int freebind)
{
char* s = strchr(ifname, '@');
if(s) {
@@ -775,10 +806,10 @@ make_sock_port(int stype, const char* ifname, const char* port,
(void)strlcpy(p, s+1, sizeof(p));
p[strlen(s+1)]=0;
return make_sock(stype, newif, p, hints, v6only, noip6,
- rcv, snd, reuseport, transparent, tcp_mss);
+ rcv, snd, reuseport, transparent, tcp_mss, freebind);
}
return make_sock(stype, ifname, port, hints, v6only, noip6, rcv, snd,
- reuseport, transparent, tcp_mss);
+ reuseport, transparent, tcp_mss, freebind);
}
/**
@@ -874,13 +905,14 @@ set_recvpktinfo(int s, int family)
* set to false on exit if reuseport failed due to no kernel support.
* @param transparent: set IP_TRANSPARENT socket option.
* @param tcp_mss: maximum segment size of tcp socket. default if zero.
+ * @param freebind: set IP_FREEBIND socket option.
* @return: returns false on error.
*/
static int
ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
struct addrinfo *hints, const char* port, struct listen_port** list,
size_t rcv, size_t snd, int ssl_port, int* reuseport, int transparent,
- int tcp_mss)
+ int tcp_mss, int freebind)
{
int s, noip6=0;
if(!do_udp && !do_tcp)
@@ -888,7 +920,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
if(do_auto) {
if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1,
&noip6, rcv, snd, reuseport, transparent,
- tcp_mss)) == -1) {
+ tcp_mss, freebind)) == -1) {
if(noip6) {
log_warn("IPv6 protocol not available");
return 1;
@@ -916,7 +948,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
/* regular udp socket */
if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1,
&noip6, rcv, snd, reuseport, transparent,
- tcp_mss)) == -1) {
+ tcp_mss, freebind)) == -1) {
if(noip6) {
log_warn("IPv6 protocol not available");
return 1;
@@ -937,7 +969,8 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
atoi(strchr(ifname, '@')+1) == ssl_port) ||
(!strchr(ifname, '@') && atoi(port) == ssl_port));
if((s = make_sock_port(SOCK_STREAM, ifname, port, hints, 1,
- &noip6, 0, 0, reuseport, transparent, tcp_mss)) == -1) {
+ &noip6, 0, 0, reuseport, transparent, tcp_mss,
+ freebind)) == -1) {
if(noip6) {
/*log_warn("IPv6 protocol not available");*/
return 1;
@@ -1095,7 +1128,7 @@ listening_ports_open(struct config_file* cfg, int* reuseport)
cfg->so_rcvbuf, cfg->so_sndbuf,
cfg->ssl_port, reuseport,
cfg->ip_transparent,
- cfg->tcp_mss)) {
+ cfg->tcp_mss, cfg->ip_freebind)) {
listening_ports_free(list);
return NULL;
}
@@ -1108,7 +1141,7 @@ listening_ports_open(struct config_file* cfg, int* reuseport)
cfg->so_rcvbuf, cfg->so_sndbuf,
cfg->ssl_port, reuseport,
cfg->ip_transparent,
- cfg->tcp_mss)) {
+ cfg->tcp_mss, cfg->ip_freebind)) {
listening_ports_free(list);
return NULL;
}
@@ -1123,7 +1156,7 @@ listening_ports_open(struct config_file* cfg, int* reuseport)
cfg->so_rcvbuf, cfg->so_sndbuf,
cfg->ssl_port, reuseport,
cfg->ip_transparent,
- cfg->tcp_mss)) {
+ cfg->tcp_mss, cfg->ip_freebind)) {
listening_ports_free(list);
return NULL;
}
@@ -1136,7 +1169,7 @@ listening_ports_open(struct config_file* cfg, int* reuseport)
cfg->so_rcvbuf, cfg->so_sndbuf,
cfg->ssl_port, reuseport,
cfg->ip_transparent,
- cfg->tcp_mss)) {
+ cfg->tcp_mss, cfg->ip_freebind)) {
listening_ports_free(list);
return NULL;
}
diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h
index 3a46e41b8de6..fbaa48321d0f 100644
--- a/services/listen_dnsport.h
+++ b/services/listen_dnsport.h
@@ -190,11 +190,12 @@ void listen_start_accept(struct listen_dnsport* listen);
* @param reuseport: if nonNULL and true, try to set SO_REUSEPORT on
* listening UDP port. Set to false on return if it failed to do so.
* @param transparent: set IP_TRANSPARENT socket option.
+ * @param freebind: set IP_FREEBIND socket option.
* @return: the socket. -1 on error.
*/
int create_udp_sock(int family, int socktype, struct sockaddr* addr,
socklen_t addrlen, int v6only, int* inuse, int* noproto, int rcv,
- int snd, int listen, int* reuseport, int transparent);
+ int snd, int listen, int* reuseport, int transparent, int freebind);
/**
* Create and bind TCP listening socket
@@ -205,10 +206,11 @@ int create_udp_sock(int family, int socktype, struct sockaddr* addr,
* listening UDP port. Set to false on return if it failed to do so.
* @param transparent: set IP_TRANSPARENT socket option.
* @param mss: maximum segment size of the socket. if zero, leaves the default.
+ * @param freebind: set IP_FREEBIND socket option.
* @return: the socket. -1 on error.
*/
int create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
- int* reuseport, int transparent, int mss);
+ int* reuseport, int transparent, int mss, int freebind);
/**
* Create and bind local listening socket
diff --git a/services/localzone.c b/services/localzone.c
index 1fcac9713a90..fcf6e8dfd7e0 100644
--- a/services/localzone.c
+++ b/services/localzone.c
@@ -94,6 +94,7 @@ local_zone_delete(struct local_zone* z)
lock_rw_destroy(&z->lock);
regional_destroy(z->region);
free(z->name);
+ free(z->taglist);
free(z);
}
@@ -171,6 +172,7 @@ lz_enter_zone_dname(struct local_zones* zones, uint8_t* nm, size_t len,
{
struct local_zone* z = local_zone_create(nm, len, labs, t, c);
if(!z) {
+ free(nm);
log_err("out of memory");
return NULL;
}
@@ -506,6 +508,40 @@ lz_enter_rr_str(struct local_zones* zones, const char* rr)
return r;
}
+/** enter tagstring into zone */
+static int
+lz_enter_zone_tag(struct local_zones* zones, char* zname, uint8_t* list,
+ size_t len, uint16_t rr_class)
+{
+ uint8_t dname[LDNS_MAX_DOMAINLEN+1];
+ size_t dname_len = sizeof(dname);
+ int dname_labs, r = 0;
+ struct local_zone* z;
+
+ if(sldns_str2wire_dname_buf(zname, dname, &dname_len) != 0) {
+ log_err("cannot parse zone name in local-zone-tag: %s", zname);
+ return 0;
+ }
+ dname_labs = dname_count_labels(dname);
+
+ lock_rw_rdlock(&zones->lock);
+ z = local_zones_lookup(zones, dname, dname_len, dname_labs, rr_class);
+ if(!z) {
+ lock_rw_unlock(&zones->lock);
+ log_err("no local-zone for tag %s", zname);
+ return 0;
+ }
+ lock_rw_wrlock(&z->lock);
+ lock_rw_unlock(&zones->lock);
+ free(z->taglist);
+ z->taglist = memdup(list, len);
+ z->taglen = len;
+ if(z->taglist)
+ r = 1;
+ lock_rw_unlock(&z->lock);
+ return r;
+}
+
/** parse local-zone: statements */
static int
lz_enter_zones(struct local_zones* zones, struct config_file* cfg)
@@ -800,6 +836,22 @@ lz_setup_implicit(struct local_zones* zones, struct config_file* cfg)
return 1;
}
+/** enter local-zone-tag info */
+static int
+lz_enter_zone_tags(struct local_zones* zones, struct config_file* cfg)
+{
+ struct config_strbytelist* p;
+ int c = 0;
+ for(p = cfg->local_zone_tags; p; p = p->next) {
+ if(!lz_enter_zone_tag(zones, p->str, p->str2, p->str2len,
+ LDNS_RR_CLASS_IN))
+ return 0;
+ c++;
+ }
+ if(c) verbose(VERB_ALGO, "applied tags to %d local zones", c);
+ return 1;
+}
+
/** enter auth data */
static int
lz_enter_data(struct local_zones* zones, struct config_file* cfg)
@@ -842,6 +894,10 @@ local_zones_apply_cfg(struct local_zones* zones, struct config_file* cfg)
/* setup parent ptrs for lookup during data entry */
init_parents(zones);
+ /* insert local zone tags */
+ if(!lz_enter_zone_tags(zones, cfg)) {
+ return 0;
+ }
/* insert local data */
if(!lz_enter_data(zones, cfg)) {
return 0;
@@ -986,7 +1042,8 @@ local_encode(struct query_info* qinfo, struct edns_data* edns,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
- if(!reply_info_answer_encode(qinfo, &rep,
+ if(!edns_opt_inplace_reply(edns, temp) ||
+ !reply_info_answer_encode(qinfo, &rep,
*(uint16_t*)sldns_buffer_begin(buf),
sldns_buffer_read_u16_at(buf, 2),
buf, 0, 0, temp, udpsize, edns,
@@ -1220,7 +1277,10 @@ struct local_zone* local_zones_add_zone(struct local_zones* zones,
{
/* create */
struct local_zone* z = local_zone_create(name, len, labs, tp, dclass);
- if(!z) return NULL;
+ if(!z) {
+ free(name);
+ return NULL;
+ }
lock_rw_wrlock(&z->lock);
/* find the closest parent */
diff --git a/services/localzone.h b/services/localzone.h
index 3d62a69d191d..964df19383c0 100644
--- a/services/localzone.h
+++ b/services/localzone.h
@@ -115,6 +115,10 @@ struct local_zone {
/** how to process zone */
enum localzone_type type;
+ /** tag bitlist */
+ uint8_t* taglist;
+ /** length of the taglist (in bytes) */
+ size_t taglen;
/** in this region the zone's data is allocated.
* the struct local_zone itself is malloced. */
diff --git a/services/mesh.c b/services/mesh.c
index 8076874ae752..8f74cbe822b0 100644
--- a/services/mesh.c
+++ b/services/mesh.c
@@ -315,6 +315,8 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
s = mesh_state_create(mesh->env, qinfo, qflags&(BIT_RD|BIT_CD), 0, 0);
if(!s) {
log_err("mesh_state_create: out of memory; SERVFAIL");
+ if(!edns_opt_inplace_reply(edns, mesh->env->scratch))
+ edns->opt_list = NULL;
error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, qid, qflags, edns);
comm_point_send_reply(rep);
@@ -338,6 +340,8 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
/* add reply to s */
if(!mesh_state_add_reply(s, edns, rep, qid, qflags, qinfo->qname)) {
log_err("mesh_new_client: out of memory; SERVFAIL");
+ if(!edns_opt_inplace_reply(edns, mesh->env->scratch))
+ edns->opt_list = NULL;
error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, qid, qflags, edns);
comm_point_send_reply(rep);
@@ -809,7 +813,8 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
r->edns.udp_size = EDNS_ADVERTISED_SIZE;
r->edns.ext_rcode = 0;
r->edns.bits &= EDNS_DO;
- if(!reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
+ if(!edns_opt_inplace_reply(&r->edns, m->s.region) ||
+ !reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
r->qflags, r->buf, 0, 1,
m->s.env->scratch, udp_size, &r->edns,
(int)(r->edns.bits & EDNS_DO), secure))
@@ -859,7 +864,9 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
if(prev && prev->qflags == r->qflags &&
prev->edns.edns_present == r->edns.edns_present &&
prev->edns.bits == r->edns.bits &&
- prev->edns.udp_size == r->edns.udp_size) {
+ prev->edns.udp_size == r->edns.udp_size &&
+ edns_opt_list_compare(prev->edns.opt_list, r->edns.opt_list)
+ == 0) {
/* if the previous reply is identical to this one, fix ID */
if(prev->query_reply.c->buffer != r->query_reply.c->buffer)
sldns_buffer_copy(r->query_reply.c->buffer,
@@ -881,7 +888,8 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
r->edns.ext_rcode = 0;
r->edns.bits &= EDNS_DO;
m->s.qinfo.qname = r->qname;
- if(!reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
+ if(!edns_opt_inplace_reply(&r->edns, m->s.region) ||
+ !reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
r->qflags, r->query_reply.c->buffer, 0, 1,
m->s.env->scratch, udp_size, &r->edns,
(int)(r->edns.bits & EDNS_DO), secure))
@@ -973,6 +981,12 @@ int mesh_state_add_cb(struct mesh_state* s, struct edns_data* edns,
r->cb = cb;
r->cb_arg = cb_arg;
r->edns = *edns;
+ if(edns->opt_list) {
+ r->edns.opt_list = edns_opt_copy_region(edns->opt_list,
+ s->s.region);
+ if(!r->edns.opt_list)
+ return 0;
+ }
r->qid = qid;
r->qflags = qflags;
r->next = s->cb_list;
@@ -990,6 +1004,12 @@ int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns,
return 0;
r->query_reply = *rep;
r->edns = *edns;
+ if(edns->opt_list) {
+ r->edns.opt_list = edns_opt_copy_region(edns->opt_list,
+ s->s.region);
+ if(!r->edns.opt_list)
+ return 0;
+ }
r->qid = qid;
r->qflags = qflags;
r->start_time = *s->s.env->now_tv;
@@ -1000,7 +1020,6 @@ int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns,
return 0;
s->reply_list = r;
return 1;
-
}
/**
diff --git a/services/modstack.c b/services/modstack.c
index 49bb2fd15adf..70e066670d5d 100644
--- a/services/modstack.c
+++ b/services/modstack.c
@@ -50,6 +50,9 @@
#ifdef WITH_PYTHONMODULE
#include "pythonmod/pythonmod.h"
#endif
+#ifdef USE_CACHEDB
+#include "cachedb/cachedb.h"
+#endif
/** count number of modules (words) in the string */
static int
@@ -121,6 +124,9 @@ module_list_avail(void)
#ifdef WITH_PYTHONMODULE
"python",
#endif
+#ifdef USE_CACHEDB
+ "cachedb",
+#endif
"validator",
"iterator",
NULL};
@@ -139,6 +145,9 @@ module_funcs_avail(void)
#ifdef WITH_PYTHONMODULE
&pythonmod_get_funcblock,
#endif
+#ifdef USE_CACHEDB
+ &cachedb_get_funcblock,
+#endif
&val_get_funcblock,
&iter_get_funcblock,
NULL};
diff --git a/services/outside_network.c b/services/outside_network.c
index b5e0b2d0a09f..d9e34f46999d 100644
--- a/services/outside_network.c
+++ b/services/outside_network.c
@@ -122,6 +122,8 @@ serviced_cmp(const void* key1, const void* key2)
}
if((r = query_dname_compare(q1->qbuf+10, q2->qbuf+10)) != 0)
return r;
+ if((r = edns_opt_list_compare(q1->opt_list, q2->opt_list)) != 0)
+ return r;
return sockaddr_cmp(&q1->addr, q1->addrlen, &q2->addr, q2->addrlen);
}
@@ -757,6 +759,7 @@ serviced_node_del(rbnode_t* node, void* ATTR_UNUSED(arg))
struct service_callback* p = sq->cblist, *np;
free(sq->qbuf);
free(sq->zone);
+ edns_opt_list_free(sq->opt_list);
while(p) {
np = p->next;
free(p);
@@ -909,13 +912,13 @@ udp_sockport(struct sockaddr_storage* addr, socklen_t addrlen, int port,
sa->sin6_port = (in_port_t)htons((uint16_t)port);
fd = create_udp_sock(AF_INET6, SOCK_DGRAM,
(struct sockaddr*)addr, addrlen, 1, inuse, &noproto,
- 0, 0, 0, NULL, 0);
+ 0, 0, 0, NULL, 0, 0);
} else {
struct sockaddr_in* sa = (struct sockaddr_in*)addr;
sa->sin_port = (in_port_t)htons((uint16_t)port);
fd = create_udp_sock(AF_INET, SOCK_DGRAM,
(struct sockaddr*)addr, addrlen, 1, inuse, &noproto,
- 0, 0, 0, NULL, 0);
+ 0, 0, 0, NULL, 0, 0);
}
return fd;
}
@@ -1219,7 +1222,8 @@ serviced_gen_query(sldns_buffer* buff, uint8_t* qname, size_t qnamelen,
/** lookup serviced query in serviced query rbtree */
static struct serviced_query*
lookup_serviced(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
- struct sockaddr_storage* addr, socklen_t addrlen)
+ struct sockaddr_storage* addr, socklen_t addrlen,
+ struct edns_option* opt_list)
{
struct serviced_query key;
key.node.key = &key;
@@ -1229,6 +1233,7 @@ lookup_serviced(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
memcpy(&key.addr, addr, addrlen);
key.addrlen = addrlen;
key.outnet = outnet;
+ key.opt_list = opt_list;
return (struct serviced_query*)rbtree_search(outnet->serviced, &key);
}
@@ -1237,7 +1242,7 @@ static struct serviced_query*
serviced_create(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
int want_dnssec, int nocaps, int tcp_upstream, int ssl_upstream,
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
- size_t zonelen, int qtype)
+ size_t zonelen, int qtype, struct edns_option* opt_list)
{
struct serviced_query* sq = (struct serviced_query*)malloc(sizeof(*sq));
#ifdef UNBOUND_DEBUG
@@ -1267,6 +1272,16 @@ serviced_create(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
sq->ssl_upstream = ssl_upstream;
memcpy(&sq->addr, addr, addrlen);
sq->addrlen = addrlen;
+ sq->opt_list = NULL;
+ if(opt_list) {
+ sq->opt_list = edns_opt_copy_alloc(opt_list);
+ if(!sq->opt_list) {
+ free(sq->zone);
+ free(sq->qbuf);
+ free(sq);
+ return NULL;
+ }
+ }
sq->outnet = outnet;
sq->cblist = NULL;
sq->pending = NULL;
@@ -1394,6 +1409,7 @@ serviced_encode(struct serviced_query* sq, sldns_buffer* buff, int with_edns)
edns.edns_present = 1;
edns.ext_rcode = 0;
edns.edns_version = EDNS_ADVERTISED_VERSION;
+ edns.opt_list = sq->opt_list;
if(sq->status == serviced_query_UDP_EDNS_FRAG) {
if(addr_is_ip6(&sq->addr, sq->addrlen)) {
if(EDNS_FRAG_SIZE_IP6 < EDNS_ADVERTISED_SIZE)
@@ -1527,7 +1543,10 @@ serviced_callbacks(struct serviced_query* sq, int error, struct comm_point* c,
sq->to_be_deleted = 1;
verbose(VERB_ALGO, "svcd callbacks start");
if(sq->outnet->use_caps_for_id && error == NETEVENT_NOERROR && c &&
- !sq->nocaps) {
+ !sq->nocaps && sq->qtype != LDNS_RR_TYPE_PTR) {
+ /* for type PTR do not check perturbed name in answer,
+ * compatibility with cisco dns guard boxes that mess up
+ * reverse queries 0x20 contents */
/* noerror and nxdomain must have a qname in reply */
if(sldns_buffer_read_u16_at(c->buffer, 4) == 0 &&
(LDNS_RCODE_WIRE(sldns_buffer_begin(c->buffer))
@@ -1708,6 +1727,44 @@ serviced_tcp_send(struct serviced_query* sq, sldns_buffer* buff)
return sq->pending != NULL;
}
+/* see if packet is edns malformed; got zeroes at start.
+ * This is from servers that return malformed packets to EDNS0 queries,
+ * but they return good packets for nonEDNS0 queries.
+ * We try to detect their output; without resorting to a full parse or
+ * check for too many bytes after the end of the packet. */
+static int
+packet_edns_malformed(struct sldns_buffer* buf, int qtype)
+{
+ size_t len;
+ if(sldns_buffer_limit(buf) < LDNS_HEADER_SIZE)
+ return 1; /* malformed */
+ /* they have NOERROR rcode, 1 answer. */
+ if(LDNS_RCODE_WIRE(sldns_buffer_begin(buf)) != LDNS_RCODE_NOERROR)
+ return 0;
+ /* one query (to skip) and answer records */
+ if(LDNS_QDCOUNT(sldns_buffer_begin(buf)) != 1 ||
+ LDNS_ANCOUNT(sldns_buffer_begin(buf)) == 0)
+ return 0;
+ /* skip qname */
+ len = dname_valid(sldns_buffer_at(buf, LDNS_HEADER_SIZE),
+ sldns_buffer_limit(buf)-LDNS_HEADER_SIZE);
+ if(len == 0)
+ return 0;
+ if(len == 1 && qtype == 0)
+ return 0; /* we asked for '.' and type 0 */
+ /* and then 4 bytes (type and class of query) */
+ if(sldns_buffer_limit(buf) < LDNS_HEADER_SIZE + len + 4 + 3)
+ return 0;
+
+ /* and start with 11 zeroes as the answer RR */
+ /* so check the qtype of the answer record, qname=0, type=0 */
+ if(sldns_buffer_at(buf, LDNS_HEADER_SIZE+len+4)[0] == 0 &&
+ sldns_buffer_at(buf, LDNS_HEADER_SIZE+len+4)[1] == 0 &&
+ sldns_buffer_at(buf, LDNS_HEADER_SIZE+len+4)[2] == 0)
+ return 1;
+ return 0;
+}
+
int
serviced_udp_callback(struct comm_point* c, void* arg, int error,
struct comm_reply* rep)
@@ -1778,7 +1835,9 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
||sq->status == serviced_query_UDP_EDNS_FRAG)
&& (LDNS_RCODE_WIRE(sldns_buffer_begin(c->buffer))
== LDNS_RCODE_FORMERR || LDNS_RCODE_WIRE(
- sldns_buffer_begin(c->buffer)) == LDNS_RCODE_NOTIMPL)) {
+ sldns_buffer_begin(c->buffer)) == LDNS_RCODE_NOTIMPL
+ || packet_edns_malformed(c->buffer, sq->qtype)
+ )) {
/* try to get an answer by falling back without EDNS */
verbose(VERB_ALGO, "serviced query: attempt without EDNS");
sq->status = serviced_query_UDP_EDNS_fallback;
@@ -1873,15 +1932,15 @@ struct serviced_query*
outnet_serviced_query(struct outside_network* outnet,
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
uint16_t flags, int dnssec, int want_dnssec, int nocaps,
- int tcp_upstream, int ssl_upstream, struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t* zone, size_t zonelen,
- comm_point_callback_t* callback, void* callback_arg,
+ int tcp_upstream, int ssl_upstream, struct edns_option* opt_list,
+ struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
+ size_t zonelen, comm_point_callback_t* callback, void* callback_arg,
sldns_buffer* buff)
{
struct serviced_query* sq;
struct service_callback* cb;
serviced_gen_query(buff, qname, qnamelen, qtype, qclass, flags);
- sq = lookup_serviced(outnet, buff, dnssec, addr, addrlen);
+ sq = lookup_serviced(outnet, buff, dnssec, addr, addrlen, opt_list);
/* duplicate entries are included in the callback list, because
* there is a counterpart registration by our caller that needs to
* be doubly-removed (with callbacks perhaps). */
@@ -1891,7 +1950,7 @@ outnet_serviced_query(struct outside_network* outnet,
/* make new serviced query entry */
sq = serviced_create(outnet, buff, dnssec, want_dnssec, nocaps,
tcp_upstream, ssl_upstream, addr, addrlen, zone,
- zonelen, (int)qtype);
+ zonelen, (int)qtype, opt_list);
if(!sq) {
free(cb);
return NULL;
@@ -1948,13 +2007,7 @@ void outnet_serviced_query_stop(struct serviced_query* sq, void* cb_arg)
callback_list_remove(sq, cb_arg);
/* if callbacks() routine scheduled deletion, let it do that */
if(!sq->cblist && !sq->to_be_deleted) {
-#ifdef UNBOUND_DEBUG
- rbnode_t* rem =
-#else
- (void)
-#endif
- rbtree_delete(sq->outnet->serviced, sq);
- log_assert(rem); /* should be present */
+ (void)rbtree_delete(sq->outnet->serviced, sq);
serviced_delete(sq);
}
}
diff --git a/services/outside_network.h b/services/outside_network.h
index 36f798d3b419..9a3270ee19a6 100644
--- a/services/outside_network.h
+++ b/services/outside_network.h
@@ -58,6 +58,7 @@ struct port_if;
struct sldns_buffer;
struct serviced_query;
struct dt_env;
+struct edns_option;
/**
* Send queries to outside servers and wait for answers from servers.
@@ -367,6 +368,8 @@ struct serviced_query {
int last_rtt;
/** do we know edns probe status already, for UDP_EDNS queries */
int edns_lame_known;
+ /** edns options to use for sending upstream packet */
+ struct edns_option* opt_list;
/** outside network this is part of */
struct outside_network* outnet;
/** list of interested parties that need callback on results. */
@@ -477,6 +480,8 @@ void pending_delete(struct outside_network* outnet, struct pending* p);
* @param nocaps: ignore use_caps_for_id and use unperturbed qname.
* @param tcp_upstream: use TCP for upstream queries.
* @param ssl_upstream: use SSL for upstream queries.
+ * @param opt_list: pass edns option list (deep copied into serviced query)
+ * these options are set on the outgoing packets.
* @param callback: callback function.
* @param callback_arg: user argument to callback function.
* @param addr: to which server to send the query.
@@ -492,9 +497,9 @@ void pending_delete(struct outside_network* outnet, struct pending* p);
struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
uint16_t flags, int dnssec, int want_dnssec, int nocaps,
- int tcp_upstream, int ssl_upstream, struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t* zone, size_t zonelen,
- comm_point_callback_t* callback, void* callback_arg,
+ int tcp_upstream, int ssl_upstream, struct edns_option* opt_list,
+ struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
+ size_t zonelen, comm_point_callback_t* callback, void* callback_arg,
struct sldns_buffer* buff);
/**
diff --git a/sldns/keyraw.c b/sldns/keyraw.c
index 59e8000f5abf..8d28bf40ab32 100644
--- a/sldns/keyraw.c
+++ b/sldns/keyraw.c
@@ -206,7 +206,6 @@ sldns_key_buf2dsa_raw(unsigned char* key, size_t len)
offset += length;
Y = BN_bin2bn(key+offset, (int)length, NULL);
- offset += length;
/* create the key and set its properties */
if(!Q || !P || !G || !Y || !(dsa = DSA_new())) {
diff --git a/sldns/parseutil.c b/sldns/parseutil.c
index 2a2ebbb08c38..32717616aa4a 100644
--- a/sldns/parseutil.c
+++ b/sldns/parseutil.c
@@ -637,7 +637,7 @@ int sldns_b64_ntop(uint8_t const *src, size_t srclength,
target[o+1] = b64[ ((src[i]&0x03)<<4) | (src[i+1]>>4) ];
target[o+2] = b64[ ((src[i+1]&0x0f)<<2) ];
target[o+3] = pad64;
- i += 2;
+ /* i += 2; */
o += 4;
break;
case 1:
@@ -646,7 +646,7 @@ int sldns_b64_ntop(uint8_t const *src, size_t srclength,
target[o+1] = b64[ ((src[i]&0x03)<<4) ];
target[o+2] = pad64;
target[o+3] = pad64;
- i += 1;
+ /* i += 1; */
o += 4;
break;
case 0:
diff --git a/sldns/rrdef.h b/sldns/rrdef.h
index d9302ec1d191..3365f15fa05e 100644
--- a/sldns/rrdef.h
+++ b/sldns/rrdef.h
@@ -420,7 +420,8 @@ enum sldns_enum_edns_option
LDNS_EDNS_DAU = 5, /* RFC6975 */
LDNS_EDNS_DHU = 6, /* RFC6975 */
LDNS_EDNS_N3U = 7, /* RFC6975 */
- LDNS_EDNS_CLIENT_SUBNET = 8 /* draft-vandergaast-edns-client-subnet */
+ LDNS_EDNS_CLIENT_SUBNET = 8, /* draft-vandergaast-edns-client-subnet */
+ LDNS_EDNS_PADDING = 12 /* RFC7830 */
};
typedef enum sldns_enum_edns_option sldns_edns_option;
diff --git a/sldns/str2wire.c b/sldns/str2wire.c
index c54108332d15..e624e269e33e 100644
--- a/sldns/str2wire.c
+++ b/sldns/str2wire.c
@@ -892,10 +892,10 @@ int sldns_fp2wire_rr_buf(FILE* in, uint8_t* rr, size_t* len, size_t* dname_len,
parse_state?parse_state->default_ttl:0,
(parse_state&&parse_state->origin_len)?
parse_state->origin:NULL,
- parse_state->origin_len,
+ parse_state?parse_state->origin_len:0,
(parse_state&&parse_state->prev_rr_len)?
parse_state->prev_rr:NULL,
- parse_state->prev_rr_len);
+ parse_state?parse_state->prev_rr_len:0);
}
return LDNS_WIREPARSE_ERR_OK;
}
diff --git a/sldns/wire2str.c b/sldns/wire2str.c
index 5cbd78eedb29..639f56fae72e 100644
--- a/sldns/wire2str.c
+++ b/sldns/wire2str.c
@@ -165,6 +165,7 @@ static sldns_lookup_table sldns_edns_options_data[] = {
{ 6, "DHU" },
{ 7, "N3U" },
{ 8, "edns-client-subnet" },
+ { 12, "Padding" },
{ 0, NULL}
};
sldns_lookup_table* sldns_edns_options = sldns_edns_options_data;
@@ -1864,6 +1865,9 @@ int sldns_wire2str_edns_option_print(char** s, size_t* sl,
case LDNS_EDNS_CLIENT_SUBNET:
w += sldns_wire2str_edns_subnet_print(s, sl, optdata, optlen);
break;
+ case LDNS_EDNS_PADDING:
+ w += print_hex_buf(s, sl, optdata, optlen);
+ break;
default:
/* unknown option code */
w += print_hex_buf(s, sl, optdata, optlen);
diff --git a/smallapp/unbound-checkconf.c b/smallapp/unbound-checkconf.c
index ec0771306b9a..b1c70f50787b 100644
--- a/smallapp/unbound-checkconf.c
+++ b/smallapp/unbound-checkconf.c
@@ -412,6 +412,21 @@ morechecks(struct config_file* cfg, const char* fname)
&& strcmp(cfg->module_conf, "python dns64 iterator") != 0
&& strcmp(cfg->module_conf, "python dns64 validator iterator") != 0
#endif
+#ifdef USE_CACHEDB
+ && strcmp(cfg->module_conf, "validator cachedb iterator") != 0
+ && strcmp(cfg->module_conf, "cachedb iterator") != 0
+ && strcmp(cfg->module_conf, "dns64 validator cachedb iterator") != 0
+ && strcmp(cfg->module_conf, "dns64 cachedb iterator") != 0
+ && strcmp(cfg->module_conf, "python dns64 cachedb iterator") != 0
+ && strcmp(cfg->module_conf, "python dns64 validator cachedb iterator") != 0
+ && strcmp(cfg->module_conf, "dns64 python cachedb iterator") != 0
+ && strcmp(cfg->module_conf, "dns64 python validator cachedb iterator") != 0
+ && strcmp(cfg->module_conf, "python cachedb iterator") != 0
+ && strcmp(cfg->module_conf, "python validator cachedb iterator") != 0
+ && strcmp(cfg->module_conf, "cachedb python iterator") != 0
+ && strcmp(cfg->module_conf, "validator cachedb python iterator") != 0
+ && strcmp(cfg->module_conf, "validator python cachedb iterator") != 0
+#endif
) {
fatal_exit("module conf '%s' is not known to work",
cfg->module_conf);
diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c
index fac73b099796..23e265c7074b 100644
--- a/smallapp/unbound-control.c
+++ b/smallapp/unbound-control.c
@@ -102,7 +102,7 @@ usage()
printf(" flush_negative flush all negative data\n");
printf(" flush_stats flush statistics, make zero\n");
printf(" flush_requestlist drop queries that are worked on\n");
- printf(" dump_requestlist show what is worked on\n");
+ printf(" dump_requestlist show what is worked on by first thread\n");
printf(" flush_infra [all | ip] remove ping, edns for one IP or all\n");
printf(" dump_infra show ping and edns entries\n");
printf(" set_option opt: val set option to value, no reload\n");
diff --git a/smallapp/worker_cb.c b/smallapp/worker_cb.c
index 8193bec1b4d8..6ed95ac0107c 100644
--- a/smallapp/worker_cb.c
+++ b/smallapp/worker_cb.c
@@ -103,7 +103,8 @@ struct outbound_entry* worker_send_query(uint8_t* ATTR_UNUSED(qname),
size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype),
uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags),
int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec),
- int ATTR_UNUSED(nocaps), struct sockaddr_storage* ATTR_UNUSED(addr),
+ int ATTR_UNUSED(nocaps), struct edns_option* ATTR_UNUSED(opt_list),
+ struct sockaddr_storage* ATTR_UNUSED(addr),
socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone),
size_t ATTR_UNUSED(zonelen), struct module_qstate* ATTR_UNUSED(q))
{
@@ -135,7 +136,8 @@ struct outbound_entry* libworker_send_query(uint8_t* ATTR_UNUSED(qname),
size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype),
uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags),
int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec),
- int ATTR_UNUSED(nocaps), struct sockaddr_storage* ATTR_UNUSED(addr),
+ int ATTR_UNUSED(nocaps), struct edns_option* ATTR_UNUSED(opt_list),
+ struct sockaddr_storage* ATTR_UNUSED(addr),
socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone),
size_t ATTR_UNUSED(zonelen), struct module_qstate* ATTR_UNUSED(q))
{
diff --git a/testcode/fake_event.c b/testcode/fake_event.c
index e1bec24d1a38..1578b7ddca2f 100644
--- a/testcode/fake_event.c
+++ b/testcode/fake_event.c
@@ -1039,9 +1039,9 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
uint16_t flags, int dnssec, int ATTR_UNUSED(want_dnssec),
int ATTR_UNUSED(nocaps), int ATTR_UNUSED(tcp_upstream),
- int ATTR_UNUSED(ssl_upstream), struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t* zone, size_t zonelen,
- comm_point_callback_t* callback, void* callback_arg,
+ int ATTR_UNUSED(ssl_upstream), struct edns_option* opt_list,
+ struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
+ size_t zonelen, comm_point_callback_t* callback, void* callback_arg,
sldns_buffer* ATTR_UNUSED(buff))
{
struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
@@ -1077,6 +1077,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
edns.edns_version = EDNS_ADVERTISED_VERSION;
edns.udp_size = EDNS_ADVERTISED_SIZE;
edns.bits = 0;
+ edns.opt_list = opt_list;
if(dnssec)
edns.bits = EDNS_DO;
attach_edns_record(pend->buffer, &edns);
@@ -1387,7 +1388,7 @@ void comm_base_set_slow_accept_handlers(struct comm_base* ATTR_UNUSED(b),
(void)start_acc;
}
-struct event_base* comm_base_internal(struct comm_base* ATTR_UNUSED(b))
+struct ub_event_base* comm_base_internal(struct comm_base* ATTR_UNUSED(b))
{
/* no pipe comm possible in testbound */
return NULL;
diff --git a/testcode/petal.c b/testcode/petal.c
index a54181c372f1..24d94a556969 100644
--- a/testcode/petal.c
+++ b/testcode/petal.c
@@ -642,8 +642,6 @@ int main(int argc, char* argv[])
do_service(addr, port, key, cert);
CRYPTO_cleanup_all_ex_data();
- ERR_remove_state(0);
ERR_free_strings();
- RAND_cleanup();
return 0;
}
diff --git a/testcode/unitmain.c b/testcode/unitmain.c
index 0b32dcd86903..e8bb898b0d74 100644
--- a/testcode/unitmain.c
+++ b/testcode/unitmain.c
@@ -380,6 +380,28 @@ config_memsize_test(void)
unit_assert( cfg_parse_memsize("0 Gb", &v) && v==0*1024*1024);
}
+/** test config_file: test tag code */
+static void
+config_tag_test(void)
+{
+ unit_show_func("util/config_file.c", "taglist_intersect");
+ unit_assert( taglist_intersect(
+ (uint8_t*)"\000\000\000", 3, (uint8_t*)"\001\000\001", 3
+ ) == 0);
+ unit_assert( taglist_intersect(
+ (uint8_t*)"\000\000\001", 3, (uint8_t*)"\001\000\001", 3
+ ) == 1);
+ unit_assert( taglist_intersect(
+ (uint8_t*)"\001\000\000", 3, (uint8_t*)"\001\000\001", 3
+ ) == 1);
+ unit_assert( taglist_intersect(
+ (uint8_t*)"\001", 1, (uint8_t*)"\001\000\001", 3
+ ) == 1);
+ unit_assert( taglist_intersect(
+ (uint8_t*)"\001\000\001", 3, (uint8_t*)"\001", 1
+ ) == 1);
+}
+
#include "util/rtt.h"
/** test RTT code */
static void
@@ -564,9 +586,6 @@ main(int argc, char* argv[])
printf("Start of %s unit test.\n", PACKAGE_STRING);
#ifdef HAVE_SSL
ERR_load_crypto_strings();
-# ifdef HAVE_OPENSSL_CONFIG
- OPENSSL_config("unbound");
-# endif
# ifdef USE_GOST
(void)sldns_key_EVP_load_gost_id();
# endif
@@ -580,6 +599,7 @@ main(int argc, char* argv[])
verify_test();
net_test();
config_memsize_test();
+ config_tag_test();
dname_test();
rtt_test();
anchors_test();
@@ -602,7 +622,6 @@ main(int argc, char* argv[])
CONF_modules_free();
# endif
CRYPTO_cleanup_all_ex_data();
- ERR_remove_state(0);
ERR_free_strings();
RAND_cleanup();
#elif defined(HAVE_NSS)
diff --git a/testcode/unitverify.c b/testcode/unitverify.c
index 9cb0eb99e7cc..f6445e2815c4 100644
--- a/testcode/unitverify.c
+++ b/testcode/unitverify.c
@@ -497,12 +497,14 @@ verify_test(void)
{
unit_show_feature("signature verify");
verifytest_file("testdata/test_signatures.1", "20070818005004");
+#ifdef USE_DSA
verifytest_file("testdata/test_signatures.2", "20080414005004");
verifytest_file("testdata/test_signatures.3", "20080416005004");
verifytest_file("testdata/test_signatures.4", "20080416005004");
verifytest_file("testdata/test_signatures.5", "20080416005004");
verifytest_file("testdata/test_signatures.6", "20080416005004");
verifytest_file("testdata/test_signatures.7", "20070829144150");
+#endif /* USE_DSA */
verifytest_file("testdata/test_signatures.8", "20070829144150");
#if (defined(HAVE_EVP_SHA256) || defined(HAVE_NSS) || defined(HAVE_NETTLE)) && defined(USE_SHA2)
verifytest_file("testdata/test_sigs.rsasha256", "20070829144150");
diff --git a/testdata/val_deleg_nons.rpl b/testdata/val_deleg_nons.rpl
new file mode 100644
index 000000000000..83cf69232924
--- /dev/null
+++ b/testdata/val_deleg_nons.rpl
@@ -0,0 +1,268 @@
+; config options
+; The island of trust is at example.com
+server:
+ trust-anchor: "example.com. 3600 IN DS 2854 3 1 46e4ffc6e9a4793b488954bd3f0cc6af0dfb201b"
+ val-override-date: "20070916134226"
+ target-fetch-policy: "0 0 0 0 0"
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test validator with unsigned delegation with no NS bit in NSEC
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 100
+ ADDRESS 193.0.14.129
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN A
+SECTION AUTHORITY
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+ ADDRESS 192.5.6.30
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION ANSWER
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN A
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+ns.example.com. IN AAAA
+SECTION ANSWER
+ENTRY_END
+RANGE_END
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns.example.com. IN AAAA
+SECTION ANSWER
+SECTION AUTHORITY
+example.com. IN SOA alfa.ns.example.com.cz. hostmaster.example.com. 2010030800 10800 86400 604800 86400
+example.com. 3600 IN RRSIG SOA 3 2 3600 20070926134150 20070829134150 2854 example.com. ADsxLOHjxFzwFmwIiGOubqD9nKWAp4RccRIXQ0+EAUGfSDZMCB0ZiFA= ;{id = 2854}
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns3.example.com. IN AAAA
+SECTION ANSWER
+SECTION AUTHORITY
+example.com. IN SOA alfa.ns.example.com.cz. hostmaster.example.com. 2010030800 10800 86400 604800 86400
+example.com. 3600 IN RRSIG SOA 3 2 3600 20070926134150 20070829134150 2854 example.com. ADsxLOHjxFzwFmwIiGOubqD9nKWAp4RccRIXQ0+EAUGfSDZMCB0ZiFA= ;{id = 2854}
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns.example.com. IN A
+SECTION ANSWER
+ns.example.com. IN A 1.2.3.4
+ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION ANSWER
+example.com. IN NS ns.example.com.
+example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
+ENTRY_END
+
+; response to DNSKEY priming query
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN DNSKEY
+SECTION ANSWER
+example.com. 3600 IN DNSKEY 256 3 3 ALXLUsWqUrY3JYER3T4TBJII s70j+sDS/UT2QRp61SE7S3E EXopNXoFE73JLRmvpi/UrOO/Vz4Se 6wXv/CYCKjGw06U4WRgR YXcpEhJROyNapmdIKSx hOzfLVE1gqA0PweZR8d tY3aNQSRn3sPpwJr6Mi /PqQKAMMrZ9ckJpf1+b QMOOvxgzz2U1GS18b3y ZKcgTMEaJzd/GZYzi/B N2DzQ0MsrSwYXfsNLFO Bbs8PJMW4LYIxeeOe6rUgkWOF 7CC9Dh/dduQ1QrsJhmZAEFfd6ByYV+ ;{id = 2854 (zsk), size = 1688b}
+example.com. 3600 IN RRSIG DNSKEY 3 2 3600 20070926134802 20070829134802 2854 example.com. MCwCFG1yhRNtTEa3Eno2zhVVuy2EJX3wAhQeLyUp6+UXcpC5qGNu9tkrTEgPUg== ;{id = 2854}
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
+ENTRY_END
+
+; response to query of interest
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo.www.example.com. IN A
+SECTION ANSWER
+foo.www.example.com. IN A 1.2.3.4
+; unsigned, no delegation.
+ENTRY_END
+
+; DS query
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+www.example.com. IN DS
+SECTION ANSWER
+SECTION AUTHORITY
+; NSEC3 here: 1 0 1 1234
+; www.example.com. -> h8c0nvkuibedn7ia997iegdl7h0i6h8b.
+h8c0nvkuibedn7ia997iegdl7h0i6h8b.example.com. IN NSEC3 1 0 1 1234 h8c0nvkuibedn7ia997iegdl7h0i6h8c TXT
+h8c0nvkuibedn7ia997iegdl7h0i6h8b.example.com. 3600 IN RRSIG NSEC3 3 3 3600 20070926134150 20070829134150 2854 example.com. AH+bPQZST3COwJ1vSe05N7E5BM2GmXzJUKsiWwXKrmm/XjYKSxSuNPE=
+
+;www.example.com. IN NSEC zzz.example.com. RRSIG NSEC
+;www.example.com. 3600 IN RRSIG NSEC 3 3 3600 20070926134150 20070829134150 2854 example.com. AA9Dm626WvHXHPQXJkVyjyTqJ/dCHfZgt6PWCn9gd8ZmPxyl3STW3iI=
+example.com. IN SOA alfa.ns.example.com.cz. hostmaster.example.com. 2010030800 10800 86400 604800 86400
+example.com. 3600 IN RRSIG SOA 3 2 3600 20070926134150 20070829134150 2854 example.com. ADsxLOHjxFzwFmwIiGOubqD9nKWAp4RccRIXQ0+EAUGfSDZMCB0ZiFA= ;{id = 2854}
+SECTION ADDITIONAL
+ENTRY_END
+
+; DS query for foo.www.example.com returns the referral without record.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+foo.www.example.com. IN DS
+SECTION ANSWER
+SECTION AUTHORITY
+mipf0g23547qunto04vboegh9vadsrpo.example.com. IN NSEC3 1 0 1 1234 mipf0g23547qunto04vboegh9vadsrpq TXT
+mipf0g23547qunto04vboegh9vadsrpo.example.com. 3600 IN RRSIG NSEC3 3 3 3600 20070926134150 20070829134150 2854 example.com. ADc6JrdKuTmIJe4sAjpKZSUZKdHdfhmREk2F5A5cftU9053b0/3ILQM=
+
+example.com. IN SOA alfa.ns.example.com.cz. hostmaster.example.com. 2010030800 10800 86400 604800 86400
+example.com. 3600 IN RRSIG SOA 3 2 3600 20070926134150 20070829134150 2854 example.com. ADsxLOHjxFzwFmwIiGOubqD9nKWAp4RccRIXQ0+EAUGfSDZMCB0ZiFA= ;{id = 2854}
+
+
+;www.example.com. IN NS ns3.example.com.
+;h8c0nvkuibedn7ia997iegdl7h0i6h8b.example.com. IN NSEC3 1 0 1 1234 h8c0nvkuibedn7ia997iegdl7h0i6h8c TXT
+;h8c0nvkuibedn7ia997iegdl7h0i6h8b.example.com. 3600 IN RRSIG NSEC3 3 3 3600 20070926134150 20070829134150 2854 example.com. AH+bPQZST3COwJ1vSe05N7E5BM2GmXzJUKsiWwXKrmm/XjYKSxSuNPE=
+;SECTION ADDITIONAL
+;ns3.example.com. IN A 1.2.3.5
+
+
+; NSEC3 here: 1 0 1 1234
+; www.example.com. -> h8c0nvkuibedn7ia997iegdl7h0i6h8b.
+; *.www.example.com. -> cg2lpgpr8k7ck69h7bqu3od9pkht2o79.
+; foo.www.example.com. -> mipf0g23547qunto04vboegh9vadsrpo.
+
+;h8c0nvkuibedn7ia997iegdl7h0i6h8b.example.com. IN NSEC3 1 0 1 1234 h8c0nvkuibedn7ia997iegdl7h0i6h8c TXT
+;h8c0nvkuibedn7ia997iegdl7h0i6h8b.example.com. 3600 IN RRSIG NSEC3 3 3 3600 20070926134150 20070829134150 2854 example.com. AH+bPQZST3COwJ1vSe05N7E5BM2GmXzJUKsiWwXKrmm/XjYKSxSuNPE=
+;cg2lpgpr8k7ck69h7bqu3od9pkht2o78.example.com. IN NSEC3 1 0 1 1234 cg2lpgpr8k7ck69h7bqu3od9pkht2o89 TXT
+;cg2lpgpr8k7ck69h7bqu3od9pkht2o78.example.com. 3600 IN RRSIG NSEC3 3 3 3600 20070926134150 20070829134150 2854 example.com. ACzxBHMyDB5tTrXijboPSsB0ws1lJe3/B62QNAMcZv7l9DYNDEDKsXY=
+;mipf0g23547qunto04vboegh9vadsrph.example.com. IN NSEC3 1 0 1 1234 mipf0g23547qunto04vboegh9vadsrpp TXT
+;mipf0g23547qunto04vboegh9vadsrph.example.com. 3600 IN RRSIG NSEC3 3 3 3600 20070926134150 20070829134150 2854 example.com. AG2B7lrIVtBgg+WIt0yNYekGDBKkY7xkKfI0GLQ8q3brGy/+jubxba0=
+
+;www.example.com. IN NSEC zzz.example.com. RRSIG NSEC
+;www.example.com. 3600 IN RRSIG NSEC 3 3 3600 20070926134150 20070829134150 2854 example.com. AA9Dm626WvHXHPQXJkVyjyTqJ/dCHfZgt6PWCn9gd8ZmPxyl3STW3iI=
+
+;example.com. IN SOA alfa.ns.example.com.cz. hostmaster.example.com. 2010030800 10800 86400 604800 86400
+;example.com. 3600 IN RRSIG SOA 3 2 3600 20070926134150 20070829134150 2854 example.com. ADsxLOHjxFzwFmwIiGOubqD9nKWAp4RccRIXQ0+EAUGfSDZMCB0ZiFA= ;{id = 2854}
+SECTION ADDITIONAL
+ENTRY_END
+
+RANGE_END
+
+; ns3.example.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.5
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+foo.www.example.com. IN DS
+SECTION ANSWER
+SECTION AUTHORITY
+foo.www.example.com. IN SOA alfa.ns.example.com.cz. hostmaster.example.com. 2010030800 10800 86400 604800 86400
+SECTION ADDITIONAL
+ENTRY_END
+RANGE_END
+
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+foo.www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA DO SERVFAIL
+SECTION QUESTION
+foo.www.example.com. IN A
+SECTION ANSWER
+ENTRY_END
+
+SCENARIO_END
diff --git a/util/config_file.c b/util/config_file.c
index f9b1531c23dc..3e72bcad06b1 100644
--- a/util/config_file.c
+++ b/util/config_file.c
@@ -163,6 +163,7 @@ config_create(void)
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;
@@ -237,6 +238,7 @@ config_create(void)
if(!(cfg->dnstap_socket_path = strdup(DNSTAP_SOCKET_PATH)))
goto error_exit;
#endif
+ cfg->disable_dnssec_lame_check = 0;
cfg->ratelimit = 0;
cfg->ratelimit_slabs = 4;
cfg->ratelimit_size = 4*1024*1024;
@@ -393,6 +395,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
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)
@@ -473,6 +476,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
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)
else if(strcmp(opt, "ratelimit:") == 0) {
IS_NUMBER_OR_ZERO; cfg->ratelimit = atoi(val);
infra_dp_ratelimit=cfg->ratelimit;
@@ -481,9 +485,11 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_POW2("ratelimit-slabs:", ratelimit_slabs)
else S_NUMBER_OR_ZERO("ratelimit-factor:", ratelimit_factor)
else S_YNO("qname-minimisation:", qname_minimisation)
+ 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)
+ } 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); }
@@ -504,7 +510,8 @@ int config_set_option(struct config_file* cfg, const char* opt,
* stub-zone, name, stub-addr, stub-host, stub-prime
* forward-first, stub-first,
* forward-zone, name, forward-addr, forward-host,
- * ratelimit-for-domain, ratelimit-below-domain */
+ * ratelimit-for-domain, ratelimit-below-domain,
+ * local-zone-tag */
return 0;
}
return 1;
@@ -628,9 +635,23 @@ config_collate_cat(struct config_strlist* list)
/** 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\n", p->str, p->str2); \
+ for(p = cfg->lst; p; p = p->next) { \
+ snprintf(buf, len, "%s %s", p->str, p->str2); \
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
@@ -664,6 +685,7 @@ config_get_option(struct config_file* cfg, const char* opt,
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)
@@ -750,6 +772,7 @@ config_get_option(struct config_file* cfg, const char* opt,
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, "ratelimit", ratelimit)
else O_MEM(opt, "ratelimit-size", ratelimit_size)
else O_DEC(opt, "ratelimit-slabs", ratelimit_slabs)
@@ -759,6 +782,8 @@ config_get_option(struct config_file* cfg, const char* opt,
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_IFC(opt, "define-tag", num_tags, tagname)
+ else O_LTG(opt, "local-zone-tag", local_zone_tags)
/* not here:
* outgoing-permit, outgoing-avoid - have list of ports
* local-zone - zones and nodefault variables
@@ -931,6 +956,33 @@ config_delstubs(struct config_stub* p)
}
}
+/** 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);
+}
+
+/** delete stringbytelist */
+static 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)
{
@@ -943,18 +995,8 @@ config_delete(struct config_file* cfg)
free(cfg->target_fetch_policy);
free(cfg->ssl_service_key);
free(cfg->ssl_service_pem);
- if(cfg->ifs) {
- int i;
- for(i=0; i<cfg->num_ifs; i++)
- free(cfg->ifs[i]);
- free(cfg->ifs);
- }
- if(cfg->out_ifs) {
- int i;
- for(i=0; i<cfg->num_out_ifs; i++)
- free(cfg->out_ifs[i]);
- free(cfg->out_ifs);
- }
+ 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_delstrlist(cfg->donotqueryaddrs);
@@ -978,6 +1020,8 @@ config_delete(struct config_file* cfg)
config_deldblstrlist(cfg->local_zones);
config_delstrlist(cfg->local_zones_nodefault);
config_delstrlist(cfg->local_data);
+ config_del_strarray(cfg->tagname, cfg->num_tags);
+ config_del_strbytelist(cfg->local_zone_tags);
config_delstrlist(cfg->control_ifs);
free(cfg->server_key_file);
free(cfg->server_cert_file);
@@ -1166,6 +1210,24 @@ cfg_str2list_insert(struct config_str2list** head, char* item, char* i2)
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)
{
@@ -1270,6 +1332,122 @@ cfg_parse_memsize(const char* str, size_t* res)
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);
+ 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)
{
diff --git a/util/config_file.h b/util/config_file.h
index ef823fb88d3a..a51cdb464c0c 100644
--- a/util/config_file.h
+++ b/util/config_file.h
@@ -44,6 +44,7 @@
struct config_stub;
struct config_strlist;
struct config_str2list;
+struct config_strbytelist;
struct module_qstate;
struct sock_list;
struct ub_packed_rrset_key;
@@ -142,6 +143,8 @@ struct config_file {
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;
@@ -293,6 +296,12 @@ struct config_file {
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;
+ /** 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;
@@ -358,6 +367,9 @@ struct config_file {
/** 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 0 is off, otherwise qps (unless overridden) */
int ratelimit;
/** number of slabs for ratelimit cache */
@@ -421,6 +433,19 @@ struct config_str2list {
char* str2;
};
+/**
+ * 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 */
@@ -560,6 +585,17 @@ int cfg_strlist_insert(struct config_strlist** head, char* item);
int cfg_str2list_insert(struct config_str2list** head, char* item, char* i2);
/**
+ * Insert string into strbytelist.
+ * @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.
+ * @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
@@ -625,6 +661,54 @@ int cfg_count_numbers(const char* str);
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".
diff --git a/util/configlexer.c b/util/configlexer.c
index e09899c202ba..bd510369c25f 100644
--- a/util/configlexer.c
+++ b/util/configlexer.c
@@ -9,8 +9,8 @@
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 39
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 0
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
@@ -143,7 +143,15 @@ typedef unsigned int flex_uint32_t;
/* 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.
@@ -176,7 +184,7 @@ extern FILE *yyin, *yyout;
do \
{ \
/* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
+ yy_size_t yyless_macro_arg = (n); \
YY_LESS_LINENO(yyless_macro_arg);\
*yy_cp = (yy_hold_char); \
YY_RESTORE_YY_MORE_OFFSET \
@@ -346,11 +354,17 @@ 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
@@ -364,8 +378,8 @@ static void yy_fatal_error (yyconst char msg[] );
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 179
-#define YY_END_OF_BUFFER 180
+#define YY_NUM_RULES 183
+#define YY_END_OF_BUFFER 184
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -373,209 +387,214 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[1800] =
+static yyconst flex_int16_t yy_accept[1847] =
{ 0,
- 1, 1, 161, 161, 165, 165, 169, 169, 173, 173,
- 1, 1, 180, 177, 1, 159, 159, 178, 2, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 178,
- 161, 162, 162, 163, 178, 165, 166, 166, 167, 178,
- 172, 169, 170, 170, 171, 178, 173, 174, 174, 175,
- 178, 176, 160, 2, 164, 176, 178, 177, 0, 1,
- 2, 2, 2, 2, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 161, 0, 165, 0,
- 172, 0, 169, 173, 0, 176, 0, 2, 2, 176,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 176, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 176, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 73, 177, 177, 177, 177, 177, 177,
- 7, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 176, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 176, 177, 177, 177, 177, 177, 33, 177, 177, 177,
- 177, 177, 177, 177, 177, 140, 177, 13, 14, 177,
- 16, 15, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 133, 177, 177, 177, 177, 177, 177, 177,
- 3, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 176, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 168, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 36, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 37, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 18, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 88, 168, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 87, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 71,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 23, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 34, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 35, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 25,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 153,
- 177, 177, 177, 177, 177, 177, 29, 177, 30, 177,
- 177, 177, 74, 177, 75, 177, 72, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 6, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 90,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 26, 177, 177, 177, 177, 177, 116,
- 115, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 38, 177, 177, 177,
- 177, 177, 177, 177, 177, 77, 76, 177, 177, 177,
- 177, 177, 177, 177, 112, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 56, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 60, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 114,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 5,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 108, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 126, 177, 109, 177, 138, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 24, 177, 177, 177,
- 177, 79, 177, 80, 78, 177, 177, 177, 177, 177,
- 177, 177, 86, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 110, 177, 177, 177, 177,
- 137, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 70, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 31,
-
- 177, 177, 20, 177, 177, 177, 17, 177, 95, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 45, 47, 177, 177, 177, 177, 177,
- 177, 177, 177, 141, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 81, 177, 177,
- 177, 177, 177, 177, 85, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 89, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 132, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 99,
- 177, 103, 177, 177, 177, 177, 84, 177, 177, 66,
- 177, 124, 177, 177, 177, 177, 139, 177, 177, 177,
- 177, 177, 177, 177, 146, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 102, 177, 177, 177,
- 177, 177, 48, 49, 177, 177, 32, 55, 104, 177,
- 117, 113, 177, 177, 41, 177, 106, 177, 177, 177,
- 177, 177, 8, 177, 177, 177, 69, 177, 177, 177,
- 177, 155, 177, 123, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 91, 145, 177, 177, 177, 177, 177, 177, 177,
- 177, 134, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 105, 177, 40,
- 42, 177, 177, 177, 177, 177, 177, 177, 68, 177,
- 177, 177, 177, 154, 177, 177, 177, 177, 128, 21,
- 22, 177, 177, 177, 177, 177, 177, 177, 65, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 130,
- 127, 177, 177, 177, 177, 177, 177, 177, 177, 39,
- 177, 177, 177, 177, 177, 177, 177, 12, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 11, 177, 177,
- 19, 177, 177, 177, 158, 177, 43, 177, 136, 129,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 98, 97, 177, 177, 131, 125, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 50, 177, 177, 135, 177,
- 177, 177, 177, 177, 177, 177, 177, 44, 177, 177,
- 177, 92, 94, 118, 177, 177, 177, 96, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 142, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 119, 177, 177, 27, 177, 177, 177, 4, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 144, 177, 177, 122, 177, 177,
- 177, 177, 177, 177, 177, 53, 177, 28, 177, 10,
- 177, 177, 177, 177, 177, 120, 57, 177, 177, 177,
- 101, 177, 177, 177, 177, 177, 177, 177, 143, 82,
- 177, 177, 177, 177, 59, 63, 58, 177, 51, 177,
- 9, 177, 177, 156, 177, 177, 100, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 64, 62, 177,
- 52, 177, 111, 177, 121, 177, 177, 93, 46, 177,
-
- 177, 177, 177, 177, 177, 83, 61, 54, 157, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 67, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 107, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 149, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 147, 177, 150,
- 151, 177, 177, 177, 177, 177, 148, 152, 0
-
+ 1, 1, 165, 165, 169, 169, 173, 173, 177, 177,
+ 1, 1, 184, 181, 1, 163, 163, 182, 2, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 182,
+ 165, 166, 166, 167, 182, 169, 170, 170, 171, 182,
+ 176, 173, 174, 174, 175, 182, 177, 178, 178, 179,
+ 182, 180, 164, 2, 168, 180, 182, 181, 0, 1,
+ 2, 2, 2, 2, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 165, 0, 169, 0,
+ 176, 0, 173, 177, 0, 180, 0, 2, 2, 180,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 181, 181, 181, 181, 180, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 180, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 74, 181, 181, 181, 181, 181, 181, 7, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 180, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 180, 181, 181, 181, 181, 181, 34, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 143, 181,
+ 13, 14, 181, 16, 15, 181, 181, 181, 181, 181,
+
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 134, 181, 181, 181,
+ 181, 181, 181, 181, 3, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 180, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 172, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 37, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 38, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 18, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 89, 172, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 88, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 72,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 23, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 35, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 36, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 25, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 157, 181, 181, 181, 181, 181, 181, 29,
+ 181, 30, 181, 181, 181, 75, 181, 76, 181, 73,
+
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 6, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 141,
+ 181, 181, 181, 181, 91, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 26, 181,
+ 181, 181, 181, 181, 181, 117, 181, 116, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 181, 181, 181, 39, 181, 181, 181, 181, 181, 181,
+ 181, 181, 78, 77, 181, 181, 181, 181, 181, 181,
+ 181, 113, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 57, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 61, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 33, 181, 181, 181, 181, 181, 181, 181, 115,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 5,
+
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 109, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 127, 181, 110, 181, 181, 139, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 24, 181, 181,
+ 181, 181, 80, 181, 81, 79, 181, 181, 181, 181,
+ 181, 181, 181, 87, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 111, 181, 181, 181,
+
+ 181, 181, 138, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 71, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 31, 181, 181, 20, 181, 181, 181, 17, 181,
+ 96, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 46, 48, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 144, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 82, 181, 181, 181, 181, 181, 181, 86, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 181, 181, 181, 181, 181, 181, 90, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 133, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 100, 181, 104, 181, 181, 181, 181,
+ 85, 181, 181, 67, 181, 125, 181, 181, 181, 181,
+ 181, 140, 181, 181, 181, 181, 181, 181, 181, 149,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 103, 181, 181, 181, 181, 181, 49, 50, 181,
+ 181, 32, 56, 105, 181, 118, 142, 114, 181, 181,
+
+ 42, 181, 107, 181, 181, 181, 181, 181, 8, 181,
+ 181, 181, 70, 181, 181, 181, 181, 159, 181, 124,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 92, 148,
+ 181, 181, 181, 181, 181, 181, 181, 181, 135, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 106, 181, 41, 43, 181, 181,
+ 181, 181, 181, 181, 181, 69, 181, 181, 181, 181,
+ 158, 181, 181, 181, 181, 129, 21, 22, 181, 181,
+
+ 181, 181, 181, 181, 181, 66, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 131, 128, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 40, 181, 181,
+ 181, 181, 181, 181, 181, 12, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 11, 181, 181, 19, 181,
+ 181, 181, 162, 181, 44, 181, 137, 130, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 99,
+ 98, 181, 181, 132, 126, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 51, 181, 181, 136, 181, 181,
+
+ 181, 181, 181, 181, 181, 181, 45, 181, 181, 181,
+ 93, 95, 119, 181, 181, 181, 97, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 145, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 120, 181, 181, 27, 181, 181, 181, 4, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 147, 181, 181, 123, 181,
+ 181, 181, 181, 181, 181, 181, 54, 181, 28, 181,
+ 10, 181, 181, 181, 181, 181, 121, 58, 181, 181,
+ 181, 102, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 146, 83, 181, 181, 181, 181, 60, 64, 59, 181,
+ 52, 181, 9, 181, 181, 160, 181, 181, 101, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 65, 63, 181, 53, 181, 112, 181, 122, 181, 181,
+ 94, 47, 181, 181, 181, 181, 181, 181, 181, 84,
+ 62, 55, 161, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 68, 181, 156, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+
+ 181, 108, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 152, 181, 181, 181, 181, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 150, 181, 153, 154, 181, 181,
+ 181, 181, 181, 151, 155, 0
} ;
-static yyconst flex_int32_t yy_ec[256] =
+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,
@@ -607,7 +626,7 @@ static yyconst flex_int32_t yy_ec[256] =
1, 1, 1, 1, 1
} ;
-static yyconst flex_int32_t yy_meta[66] =
+static yyconst YY_CHAR yy_meta[66] =
{ 0,
1, 2, 3, 4, 5, 1, 6, 1, 1, 1,
1, 7, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -618,415 +637,423 @@ static yyconst flex_int32_t yy_meta[66] =
1, 1, 1, 1, 1
} ;
-static yyconst flex_int16_t yy_base[1814] =
+static yyconst flex_uint16_t yy_base[1861] =
{ 0,
0, 0, 63, 66, 69, 71, 77, 83, 88, 91,
- 129, 135, 344, 303, 95, 5211, 5211, 5211, 107, 110,
+ 129, 135, 355, 314, 95, 5329, 5329, 5329, 107, 110,
142, 180, 108, 50, 145, 172, 118, 148, 121, 181,
197, 166, 241, 137, 225, 260, 233, 228, 257, 116,
- 263, 5211, 5211, 5211, 94, 244, 5211, 5211, 5211, 96,
- 221, 251, 5211, 5211, 5211, 304, 212, 5211, 5211, 5211,
- 102, 208, 5211, 308, 5211, 268, 318, 206, 322, 111,
+ 263, 5329, 5329, 5329, 94, 244, 5329, 5329, 5329, 96,
+ 221, 251, 5329, 5329, 5329, 304, 212, 5329, 5329, 5329,
+ 102, 208, 5329, 308, 5329, 268, 318, 206, 322, 111,
0, 326, 0, 0, 201, 170, 217, 317, 193, 309,
- 312, 307, 183, 310, 332, 313, 311, 328, 330, 245,
- 336, 335, 358, 156, 347, 362, 376, 357, 355, 382,
-
- 363, 385, 373, 388, 372, 384, 391, 399, 411, 403,
- 426, 404, 408, 418, 413, 419, 438, 429, 448, 434,
- 439, 415, 460, 453, 445, 459, 164, 174, 141, 296,
- 134, 498, 165, 122, 312, 115, 502, 508, 0, 475,
- 494, 443, 491, 501, 488, 496, 492, 521, 515, 517,
- 525, 569, 513, 510, 526, 527, 528, 538, 547, 542,
- 552, 548, 555, 571, 579, 565, 570, 575, 594, 605,
- 608, 600, 593, 612, 610, 622, 623, 617, 616, 619,
- 613, 628, 626, 637, 641, 642, 643, 639, 652, 640,
- 664, 667, 651, 663, 666, 680, 668, 676, 695, 681,
-
- 684, 700, 685, 686, 693, 708, 711, 710, 703, 707,
- 709, 706, 736, 720, 344, 740, 748, 726, 735, 751,
- 752, 746, 744, 743, 758, 760, 764, 768, 762, 769,
- 781, 771, 797, 775, 770, 785, 792, 809, 807, 799,
- 796, 805, 801, 812, 806, 844, 254, 826, 831, 827,
- 841, 852, 481, 830, 854, 845, 858, 853, 839, 868,
- 856, 862, 888, 870, 880, 889, 904, 897, 892, 890,
- 894, 900, 903, 920, 960, 923, 930, 921, 924, 929,
- 926, 908, 931, 957, 940, 953, 956, 958, 980, 964,
- 970, 983, 1010, 973, 995, 996, 1000, 990, 1020, 998,
-
- 1004, 1026, 1019, 1025, 1029, 1023, 1002, 1013, 1036, 1040,
- 1053, 1059, 1045, 1065, 1069, 1047, 1061, 1067, 1072, 1077,
- 1082, 1062, 1089, 5211, 1097, 1080, 1092, 1075, 1088, 1106,
- 5211, 1093, 1102, 1107, 1116, 1114, 1125, 1124, 1135, 1119,
- 1117, 1115, 1134, 1140, 1142, 1144, 1149, 1195, 1150, 1153,
- 1157, 1183, 1151, 1165, 1189, 1131, 1192, 1171, 1179, 1187,
- 1205, 1182, 1220, 1199, 1214, 1212, 1230, 1209, 1228, 1219,
- 1229, 1235, 1126, 1232, 1238, 1246, 1248, 1255, 1262, 1272,
- 1253, 1274, 1279, 1257, 1283, 1286, 1291, 1267, 1287, 1293,
- 1295, 1294, 1299, 1276, 1306, 1302, 1303, 1324, 1310, 1311,
-
- 1322, 1321, 1315, 1334, 1338, 1346, 1342, 1339, 1348, 1344,
- 1364, 1361, 1375, 1355, 1380, 1373, 1366, 1382, 1368, 1385,
- 1386, 1387, 1398, 1388, 1391, 1410, 1411, 1418, 1426, 1422,
- 1408, 1428, 1414, 1415, 1425, 1419, 1446, 1431, 1441, 1416,
- 1447, 1468, 1451, 1453, 1464, 1471, 1458, 1474, 1460, 1463,
- 1473, 1477, 1483, 1487, 1500, 1502, 1490, 1509, 1503, 1504,
- 1514, 1517, 1521, 1501, 1541, 1524, 5211, 1497, 1534, 1528,
- 1535, 1529, 1536, 1532, 1580, 5211, 1551, 5211, 5211, 1556,
- 5211, 5211, 1561, 1568, 1567, 1576, 1629, 1577, 1569, 1583,
- 1588, 1579, 1598, 1610, 1607, 1612, 1618, 1624, 1637, 1625,
-
- 1626, 1640, 1635, 1654, 1650, 1658, 1656, 1590, 1670, 1682,
- 1669, 1673, 1681, 1683, 1666, 1675, 1687, 1671, 1695, 1693,
- 1708, 1686, 5211, 1703, 1706, 1716, 1709, 1724, 1711, 1734,
- 5211, 1720, 1722, 1735, 1728, 1736, 1739, 1751, 1740, 1747,
- 1750, 1761, 1762, 1767, 1757, 1771, 1766, 1783, 1785, 1778,
- 1787, 1789, 1790, 1781, 1798, 1794, 1808, 1786, 1807, 1819,
- 1803, 1824, 1827, 1817, 1833, 1821, 1812, 1828, 1825, 1870,
- 1839, 1826, 1831, 1834, 1857, 1851, 1860, 1867, 1878, 1880,
- 1872, 1876, 1861, 1896, 1905, 1900, 1913, 1903, 1920, 1902,
- 1922, 1923, 1926, 1927, 1930, 1909, 1933, 1941, 5211, 1960,
-
- 1956, 1946, 1950, 1968, 1962, 1951, 1953, 1966, 1955, 1971,
- 1961, 1977, 1990, 1983, 5211, 1986, 1982, 1992, 1979, 2009,
- 2010, 2003, 2019, 1989, 2008, 5211, 2028, 2039, 2022, 2017,
- 2018, 2035, 2033, 2048, 2036, 2049, 2056, 2058, 2052, 2063,
- 2029, 2062, 2055, 2083, 2074, 2075, 2077, 2080, 2082, 2098,
- 5211, 2081, 2102, 2095, 2100, 2115, 2119, 2101, 2117, 2104,
- 2120, 2124, 120, 2122, 2126, 2118, 2127, 5211, 76, 2141,
- 2133, 2138, 2142, 2145, 2151, 2154, 2143, 2160, 2161, 2162,
- 2171, 2165, 2172, 2173, 2176, 2189, 2182, 2196, 2200, 2199,
- 2198, 2207, 2193, 2204, 2203, 2209, 2214, 2223, 2239, 2235,
-
- 2230, 2232, 2241, 2237, 2233, 2240, 2236, 2250, 2238, 2231,
- 2264, 5211, 2286, 2270, 2277, 2267, 2288, 2278, 2296, 2276,
- 2297, 2289, 2292, 2303, 2305, 2304, 2313, 2307, 2312, 2322,
- 2323, 2320, 2314, 2330, 2339, 2342, 2365, 2350, 2332, 5211,
- 2349, 2340, 2345, 2359, 2360, 2348, 2369, 2376, 2377, 2375,
- 2372, 2394, 2390, 2398, 5211, 2404, 2395, 2409, 2413, 2396,
- 2414, 2421, 2419, 2410, 2424, 2425, 2434, 2437, 2417, 2436,
- 2440, 5211, 2449, 2453, 2445, 2458, 2459, 2451, 2460, 2473,
- 2455, 2456, 2462, 2474, 2464, 2469, 2472, 2491, 2483, 2480,
- 2486, 2507, 2493, 2509, 5211, 2526, 2515, 2517, 2521, 2513,
-
- 2532, 2529, 2534, 2519, 2531, 2537, 2542, 2544, 2543, 2564,
- 2548, 2554, 2553, 2561, 2570, 2559, 2572, 2580, 2574, 2565,
- 2589, 2581, 2603, 2590, 2597, 2617, 2619, 2620, 2625, 5211,
- 2618, 2604, 2623, 2613, 2614, 2639, 2632, 2615, 2624, 2630,
- 2644, 2631, 2666, 2646, 2648, 2649, 2650, 2658, 2653, 2664,
- 2677, 2681, 2670, 2683, 2685, 2673, 2693, 2690, 2712, 5211,
- 2699, 2698, 2716, 2720, 2707, 2711, 5211, 2705, 5211, 2717,
- 2732, 2739, 5211, 2728, 5211, 2736, 5211, 2734, 2741, 2725,
- 2745, 2748, 2751, 2738, 2757, 2754, 2772, 2749, 2766, 2775,
- 2763, 2780, 5211, 2768, 2778, 2787, 2789, 2776, 2790, 2799,
-
- 2791, 2818, 2817, 2828, 2805, 2831, 2815, 2830, 2827, 5211,
- 2812, 2839, 2834, 2821, 2847, 2832, 2857, 2842, 2859, 2845,
- 2868, 2879, 2875, 2863, 2866, 2867, 2877, 2883, 2873, 2894,
- 2888, 2900, 2889, 2891, 2893, 2903, 2910, 2906, 2928, 2909,
- 2915, 2925, 2920, 5211, 2926, 2930, 2936, 2942, 2932, 5211,
- 5211, 2901, 2947, 2955, 2949, 2952, 2964, 2977, 2958, 2968,
- 2971, 2953, 2980, 2972, 2970, 2985, 2991, 2981, 2978, 3008,
- 2998, 3010, 2997, 3025, 3022, 3020, 5211, 3036, 3021, 3046,
- 3037, 3024, 3049, 3041, 3047, 5211, 5211, 3051, 3042, 3057,
- 3053, 3061, 3063, 3067, 5211, 3069, 3083, 3086, 3088, 3090,
-
- 3092, 3077, 3082, 3098, 3094, 3096, 3099, 3117, 3112, 3109,
- 3120, 3115, 3128, 3137, 3138, 3140, 5211, 3136, 3143, 3139,
- 3144, 3148, 3142, 3135, 3147, 3164, 3160, 3167, 3183, 3189,
- 3169, 3174, 3168, 3192, 3177, 3198, 3199, 3201, 3206, 3200,
- 5211, 3210, 3194, 3215, 3204, 3208, 3213, 3222, 3231, 3226,
- 3227, 3238, 3228, 3237, 3236, 3252, 3233, 3260, 3242, 5211,
- 3258, 3266, 3253, 3269, 3272, 3256, 3289, 3265, 3284, 5211,
- 3292, 3302, 3285, 3294, 3306, 3308, 3307, 3309, 3304, 3295,
- 3311, 3298, 3317, 3321, 3319, 3322, 3328, 3332, 3337, 3347,
- 3349, 3354, 3357, 3356, 3340, 3348, 3364, 3363, 3369, 3375,
-
- 3360, 3365, 3397, 3370, 3390, 3387, 3376, 3402, 3383, 3410,
- 3395, 5211, 3408, 3414, 3412, 3416, 3398, 3413, 3422, 3417,
- 3421, 5211, 3426, 5211, 3424, 5211, 3435, 3433, 3432, 3446,
- 3438, 3442, 3460, 3462, 3470, 3454, 5211, 3474, 3453, 3463,
- 3469, 5211, 3476, 5211, 5211, 3477, 3479, 3481, 3483, 3484,
- 3505, 3509, 5211, 3508, 3494, 3516, 3513, 3497, 3511, 3519,
- 3521, 3499, 3524, 3510, 3527, 5211, 3548, 3554, 3537, 3550,
- 5211, 3549, 3561, 3541, 3557, 3568, 3560, 3564, 3575, 3551,
- 3576, 3574, 3572, 3592, 5211, 3586, 3590, 3607, 3608, 3595,
- 3591, 3612, 3616, 3613, 3602, 3635, 3622, 3619, 3618, 5211,
-
- 3645, 3648, 5211, 3639, 3634, 3640, 5211, 3657, 5211, 3658,
- 3655, 3651, 3659, 3633, 3660, 3665, 3674, 3684, 3689, 3685,
- 3673, 3691, 3682, 5211, 5211, 3704, 3696, 3706, 3707, 3701,
- 3692, 3709, 3717, 5211, 3697, 3725, 3715, 3712, 3740, 3728,
- 3731, 3743, 3744, 3735, 3751, 3733, 3734, 5211, 3741, 3739,
- 3757, 3758, 3769, 3761, 5211, 3787, 3786, 3780, 3778, 3784,
- 3794, 3798, 3799, 3785, 3788, 3802, 3804, 3810, 3811, 3817,
- 3818, 3813, 5211, 3828, 3823, 3815, 3835, 3821, 3837, 3838,
- 3851, 3836, 3827, 3854, 3853, 3847, 5211, 3829, 3848, 3862,
- 3878, 3858, 3864, 3884, 3860, 3887, 3881, 3880, 3895, 3868,
-
- 3889, 3876, 3896, 3891, 3903, 3916, 3907, 3662, 3922, 5211,
- 3911, 5211, 3923, 3934, 3940, 3936, 5211, 3927, 3938, 5211,
- 3929, 5211, 3943, 3939, 3955, 3951, 5211, 3957, 3962, 3959,
- 3965, 3966, 3964, 3978, 5211, 3981, 3987, 3988, 3989, 3991,
- 3982, 3993, 3999, 3995, 4002, 4007, 5211, 4009, 4023, 4003,
- 4024, 4029, 5211, 5211, 4021, 4036, 5211, 5211, 5211, 4033,
- 5211, 5211, 4034, 4041, 5211, 4042, 5211, 4047, 4043, 4038,
- 4045, 4048, 5211, 4030, 4061, 4077, 5211, 4069, 4083, 4064,
- 4070, 5211, 4084, 5211, 4081, 4087, 4076, 4088, 4092, 4095,
- 4098, 4094, 4100, 4111, 4112, 4114, 4102, 4108, 4130, 4122,
-
- 4110, 4120, 4119, 4137, 4129, 4142, 4144, 4147, 4149, 4148,
- 4162, 5211, 5211, 4145, 4150, 4151, 4163, 4171, 4164, 4167,
- 4181, 5211, 4186, 4187, 4190, 4188, 4198, 4200, 4204, 4202,
- 4199, 4205, 4201, 4207, 4214, 4230, 4217, 5211, 4223, 5211,
- 5211, 4231, 4236, 4238, 4225, 4241, 4253, 4250, 5211, 4246,
- 4252, 4255, 4257, 5211, 4271, 4266, 4272, 4274, 5211, 5211,
- 5211, 4275, 4265, 4280, 4286, 4290, 4277, 4292, 5211, 4279,
- 4303, 4304, 4305, 4310, 4311, 4209, 4319, 4315, 4325, 5211,
- 5211, 4330, 4329, 4323, 4331, 4326, 4335, 4334, 4332, 5211,
- 4342, 4336, 4351, 4356, 4366, 4372, 4367, 5211, 4355, 4357,
-
- 4360, 4380, 4369, 4381, 4385, 4378, 4384, 5211, 4400, 4397,
- 5211, 4391, 4405, 4399, 5211, 4420, 5211, 4398, 5211, 5211,
- 4403, 4427, 4426, 4431, 4433, 4434, 4417, 4424, 4443, 4440,
- 4441, 5211, 5211, 4436, 4447, 5211, 5211, 4458, 4452, 4446,
- 4439, 4463, 4471, 4461, 4470, 4462, 4482, 4486, 4479, 4488,
- 4472, 4474, 4485, 4491, 4496, 5211, 4517, 4521, 5211, 4507,
- 4526, 4527, 4519, 4514, 4530, 4520, 4523, 5211, 4536, 4537,
- 4510, 5211, 5211, 5211, 4534, 4541, 4556, 5211, 4562, 4561,
- 4551, 4552, 4569, 4557, 4581, 4555, 4585, 5211, 4568, 4576,
- 4586, 4589, 4590, 4588, 4592, 4597, 4601, 4583, 4621, 4603,
-
- 5211, 4623, 4620, 5211, 4627, 4614, 4612, 5211, 4628, 4626,
- 4615, 4643, 4644, 4632, 4633, 4638, 4646, 4654, 4648, 4652,
- 4650, 4667, 4665, 4674, 5211, 4676, 4661, 5211, 4681, 4673,
- 4684, 4690, 4691, 4697, 4693, 5211, 4699, 5211, 4701, 5211,
- 4704, 4692, 4696, 4712, 4710, 5211, 5211, 4713, 4722, 4725,
- 5211, 4729, 4723, 4709, 4728, 4741, 4724, 4733, 5211, 5211,
- 4726, 4743, 4747, 4760, 5211, 5211, 5211, 4763, 5211, 4762,
- 5211, 4767, 4755, 5211, 4775, 4761, 5211, 4765, 4777, 4778,
- 4754, 4780, 4787, 4792, 4793, 4782, 4784, 5211, 5211, 4799,
- 5211, 4800, 5211, 4812, 5211, 4803, 4816, 5211, 5211, 4820,
-
- 4804, 4824, 4794, 4805, 4821, 5211, 5211, 5211, 5211, 4830,
- 4826, 4825, 4814, 4831, 4839, 4842, 4844, 4836, 4845, 4857,
- 4863, 4850, 4864, 4874, 4866, 5211, 4870, 4869, 4878, 4882,
- 4873, 4886, 4884, 4890, 4889, 4897, 4905, 4900, 4893, 4916,
- 4909, 4922, 4924, 4933, 4934, 4925, 4926, 4940, 4935, 4945,
- 4949, 4951, 4954, 4950, 5211, 4952, 4955, 4956, 4967, 4958,
- 4965, 4969, 4986, 4992, 4984, 4991, 4985, 4999, 4996, 5001,
- 4990, 5000, 5002, 5211, 5017, 5019, 5014, 5015, 5036, 5020,
- 5026, 5042, 5038, 5047, 5040, 5050, 5048, 5211, 5051, 5211,
- 5211, 5052, 5049, 5061, 5058, 5059, 5211, 5211, 5211, 5119,
-
- 5126, 5133, 5140, 5147, 82, 5154, 5161, 5168, 5175, 5182,
- 5189, 5196, 5203
+ 318, 310, 183, 312, 336, 311, 307, 341, 343, 245,
+ 335, 350, 363, 156, 346, 370, 371, 357, 358, 376,
+
+ 387, 391, 393, 398, 386, 397, 385, 399, 414, 408,
+ 429, 412, 421, 422, 424, 418, 352, 435, 439, 450,
+ 438, 431, 467, 448, 459, 455, 164, 174, 141, 296,
+ 134, 509, 165, 122, 312, 115, 513, 517, 0, 486,
+ 487, 488, 496, 510, 501, 506, 502, 515, 529, 526,
+ 533, 536, 542, 586, 538, 508, 541, 532, 548, 545,
+ 553, 549, 559, 560, 565, 576, 582, 584, 569, 597,
+ 598, 622, 618, 610, 609, 620, 616, 624, 627, 625,
+ 626, 629, 638, 634, 641, 642, 647, 659, 655, 651,
+ 667, 653, 665, 646, 661, 674, 682, 697, 677, 688,
+
+ 678, 699, 711, 710, 701, 695, 722, 723, 715, 725,
+ 716, 718, 719, 724, 728, 745, 752, 734, 344, 763,
+ 765, 751, 755, 768, 769, 774, 738, 762, 784, 772,
+ 778, 782, 788, 786, 795, 813, 815, 798, 817, 801,
+ 805, 812, 790, 827, 825, 836, 811, 828, 845, 847,
+ 863, 254, 857, 850, 846, 862, 869, 868, 874, 880,
+ 876, 877, 887, 890, 835, 892, 895, 908, 888, 904,
+ 907, 928, 927, 935, 922, 918, 930, 955, 937, 1000,
+ 926, 952, 945, 946, 962, 943, 940, 957, 971, 979,
+ 981, 982, 999, 990, 984, 1006, 1004, 1009, 1017, 1036,
+
+ 1018, 1024, 1032, 1039, 1052, 1001, 1037, 1042, 1049, 1041,
+ 1057, 1066, 1051, 1061, 1065, 1067, 1068, 1069, 1089, 1097,
+ 1078, 1103, 1107, 1085, 1099, 1098, 1105, 1113, 1115, 1100,
+ 1118, 5329, 1122, 1117, 1131, 1134, 1132, 1141, 5329, 1135,
+ 1136, 1137, 1158, 1148, 1162, 1161, 1164, 1154, 1149, 1165,
+ 1170, 1175, 1168, 1177, 1184, 1230, 1185, 1187, 1191, 1220,
+ 1212, 1201, 1222, 1183, 1226, 1228, 1232, 1245, 1218, 1202,
+ 1235, 1252, 1247, 1253, 1265, 1279, 1264, 1259, 1271, 1270,
+ 1281, 1273, 1286, 1282, 1287, 1274, 1297, 1296, 1291, 1319,
+ 1309, 1320, 1325, 1331, 1328, 1330, 1335, 1311, 1334, 1329,
+
+ 1344, 1337, 1338, 1347, 1346, 1345, 1349, 1372, 1351, 1378,
+ 1364, 1376, 1371, 1387, 1377, 1389, 1391, 1383, 1407, 1396,
+ 1405, 1412, 1404, 1419, 1423, 1427, 1428, 1411, 1422, 1431,
+ 1432, 1438, 1435, 1470, 1448, 1456, 1446, 1462, 1473, 1478,
+ 1475, 1453, 1479, 1466, 1467, 1463, 1487, 1488, 1486, 1501,
+ 1499, 1505, 1483, 1502, 1504, 1524, 1526, 1522, 1531, 1511,
+ 1518, 1528, 1532, 1535, 1549, 1560, 1564, 1543, 1566, 1562,
+ 1558, 1570, 1574, 1576, 1557, 1581, 1585, 5329, 1583, 1586,
+ 1591, 1599, 1596, 1619, 1608, 1602, 1600, 1648, 5329, 1609,
+ 5329, 5329, 1615, 5329, 5329, 1622, 1628, 1635, 1623, 1697,
+
+ 1649, 1638, 1644, 1661, 1645, 1666, 1662, 1680, 1678, 1681,
+ 1700, 1687, 1683, 1702, 1691, 1713, 1712, 1722, 1718, 1717,
+ 1729, 1737, 1641, 1745, 1743, 1747, 1744, 1749, 1736, 1750,
+ 1751, 1748, 1765, 1760, 1770, 1764, 5329, 1777, 1779, 1766,
+ 1775, 1797, 1784, 1806, 5329, 1780, 1795, 1787, 1785, 1796,
+ 1810, 1811, 1815, 1813, 1802, 1825, 1827, 1833, 1843, 1829,
+ 1836, 1855, 1857, 1858, 1840, 1852, 1860, 1848, 1870, 1876,
+ 1875, 1856, 1867, 1877, 1861, 1890, 1893, 1884, 1891, 1887,
+ 1885, 1886, 1896, 1941, 1914, 1920, 1913, 1904, 1933, 1934,
+ 1927, 1907, 1931, 1959, 1938, 1970, 1961, 1955, 1960, 1964,
+
+ 1968, 1943, 1998, 1971, 1987, 1980, 1988, 2002, 2008, 2001,
+ 2018, 2015, 2011, 2012, 5329, 2021, 2017, 2022, 2010, 2026,
+ 2047, 2027, 2048, 2039, 2049, 2037, 2060, 2042, 2053, 2054,
+ 2064, 5329, 2051, 2059, 2073, 2066, 2090, 2091, 2092, 2098,
+ 2076, 2089, 5329, 2109, 2106, 2105, 2097, 2093, 2112, 2094,
+ 2128, 2121, 2125, 2138, 2139, 2133, 2140, 2144, 2141, 2129,
+ 2148, 2135, 2160, 2161, 2169, 2158, 2159, 5329, 2165, 2186,
+ 2173, 2185, 2198, 2199, 2178, 2201, 2188, 2190, 2191, 120,
+ 2196, 2210, 2202, 2208, 5329, 76, 2213, 2217, 2216, 2226,
+ 2242, 2234, 2240, 2235, 2237, 2247, 2241, 2231, 2248, 2258,
+
+ 2238, 2270, 2266, 2263, 2265, 2267, 2285, 2283, 2282, 2277,
+ 2292, 2278, 2290, 2297, 2284, 2301, 2308, 2316, 2312, 2310,
+ 2317, 2324, 2322, 2319, 2315, 2323, 2339, 2340, 2333, 2347,
+ 5329, 2344, 2343, 2354, 2349, 2359, 2361, 2379, 2358, 2376,
+ 2386, 2365, 2384, 2398, 2394, 2392, 2396, 2406, 2399, 2404,
+ 2388, 2400, 2403, 2414, 2411, 2428, 2451, 2436, 2435, 5329,
+ 2443, 2424, 2430, 2441, 2453, 2458, 2457, 2473, 2468, 2434,
+ 2431, 2486, 2474, 2488, 5329, 2487, 2492, 2483, 2491, 2484,
+ 2493, 2500, 2506, 2501, 2507, 2514, 2518, 2524, 2508, 2530,
+ 2531, 5329, 2534, 2541, 2535, 2546, 2545, 2528, 2532, 2544,
+
+ 2549, 2533, 2550, 2564, 2555, 2567, 2562, 2565, 2568, 2560,
+ 2572, 2581, 2597, 2577, 2593, 5329, 2582, 2614, 2594, 2608,
+ 2617, 2604, 2626, 2625, 2612, 2613, 2607, 2620, 2631, 2624,
+ 2628, 2645, 2639, 2635, 2647, 2652, 2653, 2651, 2659, 2666,
+ 2672, 2665, 2662, 2675, 2676, 2680, 2691, 2689, 2709, 2686,
+ 2705, 5329, 2708, 2707, 2694, 2710, 2713, 2703, 2724, 2729,
+ 2725, 2726, 2720, 2731, 2735, 2730, 2736, 2740, 2742, 2747,
+ 2751, 2743, 2733, 2775, 2777, 2767, 2778, 2781, 2771, 2786,
+ 2774, 2813, 5329, 2769, 2790, 2794, 2793, 2798, 2804, 5329,
+ 2809, 5329, 2823, 2829, 2833, 5329, 2834, 5329, 2835, 5329,
+
+ 2836, 2837, 2826, 2822, 2844, 2843, 2852, 2851, 2849, 2871,
+ 2855, 2862, 2876, 2864, 2879, 5329, 2863, 2874, 2885, 2882,
+ 2875, 2896, 2908, 2898, 2903, 2892, 2924, 2901, 2930, 5329,
+ 2913, 2929, 2912, 2928, 5329, 2909, 2936, 2926, 2922, 2944,
+ 2945, 2941, 2943, 2954, 2951, 2963, 2971, 2974, 2964, 2961,
+ 2965, 2978, 2988, 2972, 2989, 2987, 2991, 2979, 2984, 2993,
+ 3003, 3007, 3012, 3030, 3008, 3009, 3018, 3006, 5329, 3037,
+ 3033, 3026, 3035, 3039, 3031, 5329, 3023, 5329, 3049, 3058,
+ 3062, 3055, 3054, 3053, 3074, 3064, 3081, 3079, 3075, 3080,
+ 3069, 3070, 3076, 3097, 3090, 3094, 3103, 3089, 3114, 3113,
+
+ 3128, 3125, 3108, 5329, 3131, 3120, 3132, 3127, 3124, 3150,
+ 3135, 3154, 5329, 5329, 3141, 3153, 3151, 3155, 3171, 3156,
+ 3161, 5329, 3165, 3182, 3168, 3184, 3192, 3178, 3180, 3193,
+ 3191, 3188, 3210, 3209, 3211, 3206, 3214, 3215, 3204, 3220,
+ 3228, 3229, 3234, 5329, 3235, 3230, 3243, 3233, 3241, 3242,
+ 3252, 3248, 3253, 3262, 3254, 3250, 3276, 3286, 3266, 3269,
+ 3275, 3283, 3277, 3294, 3299, 3296, 3290, 3302, 5329, 3310,
+ 3289, 3312, 3293, 3309, 3324, 3316, 3328, 3311, 3326, 3323,
+ 3329, 5329, 3321, 3333, 3330, 3337, 3343, 3339, 3360, 5329,
+ 3356, 3372, 3362, 3368, 3369, 3353, 3381, 3358, 3385, 5329,
+
+ 3386, 3397, 3380, 3387, 3402, 3407, 3410, 3411, 3406, 3399,
+ 3398, 3408, 3427, 3404, 3413, 3431, 3421, 3426, 3435, 3446,
+ 3442, 3441, 3444, 3456, 3440, 3462, 3468, 3465, 3474, 3479,
+ 3454, 3472, 3489, 3478, 3482, 3481, 3469, 3495, 3475, 3502,
+ 3488, 5329, 3501, 3509, 3512, 3514, 3498, 3513, 3521, 3517,
+ 3524, 5329, 3525, 5329, 3529, 3522, 5329, 3531, 3535, 3527,
+ 3546, 3545, 3548, 3538, 3559, 3570, 3554, 5329, 3575, 3553,
+ 3569, 3574, 5329, 3577, 5329, 5329, 3573, 3565, 3589, 3582,
+ 3592, 3605, 3584, 5329, 3601, 3597, 3611, 3604, 3600, 3606,
+ 3610, 3624, 3603, 3626, 3623, 3627, 5329, 3637, 3644, 3634,
+
+ 3648, 3649, 5329, 3645, 3657, 3639, 3662, 3675, 3673, 3676,
+ 3669, 3663, 3664, 3688, 3682, 3672, 5329, 3679, 3697, 3701,
+ 3712, 3702, 3696, 3692, 3721, 3725, 3706, 3722, 3728, 3723,
+ 3724, 5329, 3737, 3741, 5329, 3743, 3740, 3749, 5329, 3766,
+ 5329, 3768, 3720, 3750, 3762, 3778, 3770, 3780, 3763, 3777,
+ 3783, 3773, 3784, 3795, 3792, 5329, 5329, 3791, 3787, 3794,
+ 3815, 3805, 3802, 3828, 3821, 3825, 5329, 3806, 3822, 3811,
+ 3830, 3832, 3823, 3819, 3836, 3847, 3850, 3855, 3840, 3852,
+ 5329, 3846, 3856, 3857, 3854, 3858, 3867, 5329, 3886, 3887,
+ 3878, 3881, 3893, 3898, 3889, 3900, 3894, 3897, 3901, 3904,
+
+ 3911, 3913, 3912, 3919, 3923, 3915, 5329, 3924, 3930, 3916,
+ 3941, 3926, 3939, 3946, 3947, 3952, 3950, 3940, 3951, 3954,
+ 5329, 3938, 3937, 3965, 3979, 3984, 3967, 3988, 3972, 3990,
+ 3992, 3977, 3995, 3968, 3996, 3981, 4007, 3999, 3994, 4015,
+ 4017, 4036, 4029, 5329, 4018, 5329, 4026, 4039, 4041, 4045,
+ 5329, 4028, 4048, 5329, 4037, 5329, 4044, 4056, 4032, 4065,
+ 4069, 5329, 4078, 4066, 4081, 4073, 4072, 4068, 4088, 5329,
+ 4090, 4095, 4091, 4092, 4083, 4106, 4107, 4108, 4118, 4105,
+ 4121, 5329, 4110, 4124, 4135, 4131, 4134, 5329, 5329, 4130,
+ 4140, 5329, 5329, 5329, 4142, 5329, 5329, 5329, 4138, 4146,
+
+ 5329, 4149, 5329, 4156, 4158, 4148, 4150, 4155, 5329, 4161,
+ 4162, 4178, 5329, 4170, 4185, 4166, 4175, 5329, 4192, 5329,
+ 4189, 4193, 4182, 4198, 4200, 4204, 4208, 4201, 4197, 4202,
+ 4206, 4220, 4221, 4216, 4210, 4225, 4212, 4224, 4233, 4230,
+ 4235, 4237, 4245, 4251, 4253, 4250, 4266, 4268, 5329, 5329,
+ 4259, 4257, 4265, 4270, 4280, 4271, 4281, 4273, 5329, 4288,
+ 4294, 4297, 4295, 4293, 4301, 4296, 4286, 4309, 4329, 4315,
+ 4320, 4321, 4322, 4314, 5329, 4324, 5329, 5329, 4325, 4341,
+ 4350, 4338, 4337, 4357, 4354, 5329, 4348, 4362, 4359, 4356,
+ 5329, 4373, 4360, 4374, 4376, 5329, 5329, 5329, 4377, 4370,
+
+ 4382, 4383, 4389, 4380, 4387, 5329, 4393, 4397, 4406, 4398,
+ 4412, 4417, 4427, 4423, 4430, 4431, 5329, 5329, 4419, 4438,
+ 4433, 4436, 4434, 4447, 4440, 4444, 4439, 5329, 4442, 4455,
+ 4464, 4470, 4471, 4482, 4472, 5329, 4465, 4466, 4468, 4485,
+ 4469, 4492, 4490, 4494, 4498, 5329, 4496, 4507, 5329, 4512,
+ 4504, 4509, 5329, 4521, 5329, 4526, 5329, 5329, 4513, 4534,
+ 4538, 4527, 4537, 4542, 4528, 4530, 4554, 4552, 4555, 5329,
+ 5329, 4550, 4562, 5329, 5329, 4558, 4549, 4565, 4557, 4560,
+ 4564, 4572, 4569, 4587, 4579, 4573, 4602, 4592, 4599, 4589,
+ 4584, 4611, 4597, 4601, 5329, 4612, 4615, 5329, 4605, 4613,
+
+ 4629, 4625, 4626, 4627, 4630, 4637, 5329, 4640, 4639, 4638,
+ 5329, 5329, 5329, 4650, 4657, 4653, 5329, 4654, 4660, 4652,
+ 4675, 4667, 4678, 4673, 4679, 4668, 4674, 5329, 4684, 4677,
+ 4697, 4694, 4699, 4696, 4690, 4705, 4702, 4701, 4714, 4718,
+ 5329, 4716, 4717, 5329, 4731, 4726, 4715, 5329, 4732, 4734,
+ 4725, 4750, 4751, 4736, 4744, 4742, 4757, 4754, 4752, 4764,
+ 4763, 4761, 4774, 4769, 4776, 5329, 4785, 4773, 5329, 4793,
+ 4783, 4799, 4802, 4805, 4806, 4803, 5329, 4809, 5329, 4810,
+ 5329, 4815, 4807, 4813, 4816, 4812, 5329, 5329, 4819, 4818,
+ 4823, 5329, 4836, 4835, 4843, 4834, 4837, 4839, 4838, 4855,
+
+ 5329, 5329, 4849, 4858, 4867, 4868, 5329, 5329, 5329, 4871,
+ 5329, 4873, 5329, 4875, 4874, 5329, 4881, 4876, 5329, 4879,
+ 4889, 4890, 4887, 4880, 4894, 4899, 4906, 4907, 4903, 4910,
+ 5329, 5329, 4913, 5329, 4923, 5329, 4925, 5329, 4915, 4928,
+ 5329, 5329, 4932, 4945, 4917, 4938, 4934, 4930, 4944, 5329,
+ 5329, 5329, 5329, 4942, 4947, 4952, 4951, 4949, 4959, 4965,
+ 4957, 4970, 4966, 4974, 4988, 4984, 4991, 4973, 4987, 5003,
+ 4992, 5329, 4990, 5329, 4994, 5007, 5011, 5008, 5014, 5001,
+ 5010, 5012, 5023, 5029, 5025, 5021, 5038, 5040, 5045, 5050,
+ 5052, 5056, 5041, 5049, 5062, 5067, 5066, 5071, 5068, 5072,
+
+ 5065, 5329, 5070, 5077, 5081, 5093, 5102, 5104, 5088, 5110,
+ 5112, 5114, 5115, 5097, 5121, 5118, 5128, 5131, 5127, 5134,
+ 5329, 5139, 5142, 5137, 5138, 5159, 5148, 5149, 5162, 5151,
+ 5165, 5170, 5173, 5174, 5329, 5177, 5329, 5329, 5180, 5169,
+ 5179, 5191, 5193, 5329, 5329, 5329, 5237, 5244, 5251, 5258,
+ 5265, 82, 5272, 5279, 5286, 5293, 5300, 5307, 5314, 5321
} ;
-static yyconst flex_int16_t yy_def[1814] =
+static yyconst flex_int16_t yy_def[1861] =
{ 0,
- 1799, 1, 1800, 1800, 1801, 1801, 1802, 1802, 1803, 1803,
- 1804, 1804, 1799, 1805, 1799, 1799, 1799, 1799, 1806, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1807, 1799, 1799, 1799, 1807, 1808, 1799, 1799, 1799, 1808,
- 1809, 1799, 1799, 1799, 1799, 1809, 1810, 1799, 1799, 1799,
- 1810, 1811, 1799, 1812, 1799, 1811, 1811, 1805, 1805, 1799,
- 1813, 1806, 1813, 1806, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1807, 1807, 1808, 1808,
- 1809, 1809, 1799, 1810, 1810, 1811, 1811, 1812, 1812, 1811,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1811, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1811, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805,
- 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1811, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1811, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1799, 1799, 1805,
- 1799, 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1811, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1811, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799,
- 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1799, 1805,
- 1805, 1805, 1799, 1805, 1799, 1805, 1799, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1799,
- 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1799, 1799, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1799, 1805, 1799, 1805, 1799, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805,
- 1805, 1799, 1805, 1799, 1799, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805,
- 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799,
-
- 1805, 1805, 1799, 1805, 1805, 1805, 1799, 1805, 1799, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1799, 1799, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805,
- 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799,
- 1805, 1799, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1799,
- 1805, 1799, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805,
- 1805, 1805, 1799, 1799, 1805, 1805, 1799, 1799, 1799, 1805,
- 1799, 1799, 1805, 1805, 1799, 1805, 1799, 1805, 1805, 1805,
- 1805, 1805, 1799, 1805, 1805, 1805, 1799, 1805, 1805, 1805,
- 1805, 1799, 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1799, 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1799,
- 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805,
- 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1799, 1799,
- 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799,
- 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805,
- 1799, 1805, 1805, 1805, 1799, 1805, 1799, 1805, 1799, 1799,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1799, 1799, 1805, 1805, 1799, 1799, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1799, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805,
- 1805, 1799, 1799, 1799, 1805, 1805, 1805, 1799, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
-
- 1799, 1805, 1805, 1799, 1805, 1805, 1805, 1799, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1799, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1799, 1805, 1799,
- 1805, 1805, 1805, 1805, 1805, 1799, 1799, 1805, 1805, 1805,
- 1799, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1799,
- 1805, 1805, 1805, 1805, 1799, 1799, 1799, 1805, 1799, 1805,
- 1799, 1805, 1805, 1799, 1805, 1805, 1799, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1799, 1805,
- 1799, 1805, 1799, 1805, 1799, 1805, 1805, 1799, 1799, 1805,
-
- 1805, 1805, 1805, 1805, 1805, 1799, 1799, 1799, 1799, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1799, 1805, 1805, 1805, 1805, 1805, 1805,
- 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1799, 1805, 1799,
- 1799, 1805, 1805, 1805, 1805, 1805, 1799, 1799, 0, 1799,
-
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799
+ 1846, 1, 1847, 1847, 1848, 1848, 1849, 1849, 1850, 1850,
+ 1851, 1851, 1846, 1852, 1846, 1846, 1846, 1846, 1853, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1854, 1846, 1846, 1846, 1854, 1855, 1846, 1846, 1846, 1855,
+ 1856, 1846, 1846, 1846, 1846, 1856, 1857, 1846, 1846, 1846,
+ 1857, 1858, 1846, 1859, 1846, 1858, 1858, 1852, 1852, 1846,
+ 1860, 1853, 1860, 1853, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1854, 1854, 1855, 1855,
+ 1856, 1856, 1846, 1857, 1857, 1858, 1858, 1859, 1859, 1858,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1858, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1858, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1858, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1858, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852,
+ 1846, 1846, 1852, 1846, 1846, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1858, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1846, 1858, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1846,
+ 1852, 1846, 1852, 1852, 1852, 1846, 1852, 1846, 1852, 1846,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846,
+ 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1846, 1846, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1846, 1852, 1852, 1846, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852,
+ 1852, 1852, 1846, 1852, 1846, 1846, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852,
+
+ 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1846, 1852, 1852, 1852, 1846, 1852,
+ 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1846, 1846, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1846, 1852, 1846, 1852, 1852, 1852, 1852,
+ 1846, 1852, 1852, 1846, 1852, 1846, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1846, 1846, 1852,
+ 1852, 1846, 1846, 1846, 1852, 1846, 1846, 1846, 1852, 1852,
+
+ 1846, 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1846, 1852,
+ 1852, 1852, 1846, 1852, 1852, 1852, 1852, 1846, 1852, 1846,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1846,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1846, 1852, 1846, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852,
+ 1846, 1852, 1852, 1852, 1852, 1846, 1846, 1846, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1846, 1852,
+ 1852, 1852, 1846, 1852, 1846, 1852, 1846, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846,
+ 1846, 1852, 1852, 1846, 1846, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1846, 1852, 1852,
+
+ 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1852,
+ 1846, 1846, 1846, 1852, 1852, 1852, 1846, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1846, 1852, 1852, 1846, 1852, 1852, 1852, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1852, 1846, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1846, 1852, 1846, 1852,
+ 1846, 1852, 1852, 1852, 1852, 1852, 1846, 1846, 1852, 1852,
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1846, 1846, 1852, 1852, 1852, 1852, 1846, 1846, 1846, 1852,
+ 1846, 1852, 1846, 1852, 1852, 1846, 1852, 1852, 1846, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1846, 1846, 1852, 1846, 1852, 1846, 1852, 1846, 1852, 1852,
+ 1846, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1846,
+ 1846, 1846, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1846, 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+
+ 1852, 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1846, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1846, 1852, 1846, 1846, 1852, 1852,
+ 1852, 1852, 1852, 1846, 1846, 0, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846
} ;
-static yyconst flex_int16_t yy_nxt[5277] =
+static yyconst flex_uint16_t yy_nxt[5395] =
{ 0,
14, 15, 16, 17, 18, 19, 18, 14, 14, 14,
14, 18, 20, 14, 21, 22, 23, 24, 14, 25,
@@ -1041,576 +1068,590 @@ static yyconst flex_int16_t yy_nxt[5277] =
71, 45, 129, 88, 45, 134, 134, 50, 73, 50,
73, 73, 70, 73, 137, 56, 71, 68, 73, 68,
- 68, 56, 68, 86, 75, 76, 61, 68, 776, 61,
+ 68, 56, 68, 86, 75, 76, 61, 68, 796, 61,
15, 16, 17, 63, 64, 65, 15, 16, 17, 63,
64, 65, 77, 87, 95, 74, 69, 97, 69, 66,
86, 75, 76, 137, 78, 66, 69, 89, 69, 69,
- 135, 79, 111, 165, 96, 90, 133, 67, 80, 77,
+ 135, 79, 111, 167, 96, 90, 133, 67, 80, 77,
87, 95, 132, 67, 97, 69, 66, 127, 127, 130,
69, 78, 66, 69, 89, 142, 69, 91, 79, 111,
92, 96, 90, 98, 69, 80, 81, 93, 105, 94,
82, 99, 128, 83, 69, 84, 85, 100, 69, 102,
- 69, 101, 142, 103, 91, 141, 150, 92, 69, 69,
+ 69, 101, 142, 103, 91, 141, 152, 92, 69, 69,
98, 69, 146, 81, 93, 105, 94, 82, 99, 104,
83, 69, 84, 85, 100, 69, 102, 112, 101, 69,
- 103, 113, 141, 150, 69, 120, 137, 121, 143, 146,
+ 103, 113, 141, 152, 69, 120, 137, 121, 143, 146,
135, 114, 133, 123, 115, 69, 104, 106, 124, 132,
- 158, 107, 122, 69, 112, 324, 69, 108, 113, 125,
+ 160, 107, 122, 69, 112, 332, 69, 108, 113, 125,
109, 69, 120, 126, 121, 143, 116, 110, 114, 69,
- 123, 115, 130, 69, 106, 124, 117, 158, 107, 122,
+ 123, 115, 130, 69, 106, 124, 117, 160, 107, 122,
118, 119, 69, 140, 108, 69, 125, 109, 69, 129,
126, 128, 129, 116, 110, 131, 137, 131, 131, 73,
131, 73, 73, 117, 73, 134, 134, 118, 119, 136,
140, 136, 136, 68, 136, 68, 68, 73, 68, 73,
- 73, 144, 73, 68, 147, 148, 149, 73, 154, 152,
- 151, 69, 155, 1799, 145, 69, 139, 69, 69, 69,
- 69, 69, 159, 290, 1799, 69, 153, 156, 144, 157,
- 160, 147, 148, 149, 74, 154, 69, 151, 69, 155,
- 69, 145, 161, 69, 69, 162, 1799, 166, 167, 159,
- 172, 174, 69, 153, 156, 69, 157, 160, 163, 164,
- 169, 176, 171, 69, 170, 69, 69, 173, 168, 161,
-
- 69, 69, 162, 178, 166, 167, 180, 172, 174, 175,
- 69, 69, 177, 179, 69, 163, 164, 169, 176, 171,
- 69, 170, 69, 69, 173, 168, 69, 182, 181, 69,
- 178, 183, 187, 180, 184, 186, 175, 69, 185, 177,
- 179, 69, 69, 189, 188, 191, 69, 197, 190, 69,
- 205, 69, 192, 69, 182, 181, 69, 69, 183, 187,
- 193, 184, 186, 195, 69, 185, 196, 69, 201, 200,
- 189, 188, 69, 198, 197, 190, 69, 69, 1799, 192,
- 194, 69, 1799, 69, 1799, 1799, 69, 193, 202, 203,
- 195, 69, 331, 196, 199, 201, 200, 69, 69, 131,
-
- 198, 131, 131, 136, 131, 136, 136, 194, 136, 73,
- 204, 73, 73, 137, 73, 202, 203, 206, 208, 69,
- 207, 199, 209, 210, 214, 222, 69, 1799, 211, 69,
- 69, 213, 69, 212, 69, 215, 1799, 204, 1799, 69,
- 223, 1799, 224, 226, 206, 208, 139, 207, 69, 209,
- 210, 69, 222, 69, 227, 69, 216, 1799, 213, 69,
- 212, 225, 1799, 69, 69, 69, 69, 223, 229, 224,
- 226, 233, 228, 1799, 1799, 230, 69, 232, 231, 1799,
- 69, 227, 239, 216, 217, 69, 69, 234, 225, 218,
- 69, 235, 1799, 69, 219, 229, 237, 238, 233, 228,
-
- 220, 221, 230, 69, 232, 231, 240, 69, 69, 69,
- 236, 217, 241, 69, 234, 243, 218, 69, 235, 246,
- 244, 219, 242, 237, 238, 245, 247, 220, 221, 248,
- 249, 69, 69, 240, 1799, 250, 252, 236, 69, 1799,
- 251, 1799, 1799, 69, 253, 254, 69, 244, 69, 242,
- 69, 69, 245, 247, 69, 69, 256, 69, 258, 255,
- 69, 69, 250, 252, 69, 257, 69, 251, 261, 259,
- 260, 253, 254, 262, 265, 69, 267, 69, 69, 69,
- 69, 69, 266, 256, 268, 258, 255, 269, 273, 69,
- 69, 275, 257, 263, 264, 261, 259, 260, 270, 271,
-
- 262, 69, 69, 267, 69, 69, 69, 272, 278, 266,
- 274, 268, 280, 276, 69, 281, 279, 283, 69, 69,
- 263, 264, 69, 137, 69, 270, 271, 282, 286, 284,
- 277, 69, 289, 69, 272, 278, 285, 274, 69, 280,
- 276, 69, 287, 279, 69, 69, 69, 69, 69, 69,
- 288, 298, 291, 293, 282, 286, 284, 277, 69, 289,
- 292, 294, 1799, 285, 69, 295, 297, 296, 299, 287,
- 300, 302, 1799, 69, 69, 1799, 301, 288, 69, 291,
- 293, 69, 69, 307, 69, 310, 69, 292, 294, 69,
- 69, 304, 295, 297, 296, 299, 69, 300, 69, 303,
-
- 69, 305, 69, 301, 309, 306, 69, 69, 69, 69,
- 307, 308, 310, 69, 311, 312, 313, 1799, 304, 69,
- 1799, 314, 315, 69, 316, 318, 303, 317, 305, 321,
- 69, 309, 306, 319, 69, 69, 320, 69, 308, 69,
- 325, 311, 312, 69, 69, 69, 332, 69, 314, 315,
- 69, 316, 318, 328, 317, 1799, 321, 322, 323, 326,
- 319, 329, 327, 320, 69, 69, 333, 325, 69, 69,
- 337, 334, 330, 332, 335, 338, 336, 69, 340, 69,
- 328, 1799, 69, 69, 322, 323, 326, 339, 329, 327,
- 69, 69, 69, 333, 69, 343, 69, 337, 334, 330,
-
- 69, 335, 341, 336, 342, 340, 69, 344, 69, 347,
- 345, 348, 346, 349, 339, 371, 350, 355, 69, 1799,
- 353, 352, 343, 1799, 351, 354, 69, 69, 69, 341,
- 69, 342, 69, 356, 344, 69, 347, 345, 69, 346,
- 349, 69, 69, 350, 355, 357, 69, 353, 352, 365,
- 366, 351, 354, 367, 368, 369, 1799, 370, 69, 137,
- 356, 69, 69, 376, 69, 372, 374, 69, 69, 69,
- 1799, 379, 357, 358, 359, 1799, 365, 366, 69, 375,
- 367, 368, 369, 360, 370, 361, 362, 363, 373, 377,
- 364, 69, 372, 374, 69, 69, 69, 380, 69, 381,
-
- 358, 359, 69, 388, 384, 378, 375, 1799, 69, 398,
- 360, 69, 361, 362, 363, 373, 377, 364, 69, 382,
- 383, 69, 385, 386, 380, 387, 381, 390, 69, 391,
- 388, 384, 378, 69, 69, 389, 69, 1799, 69, 394,
- 69, 395, 69, 397, 396, 399, 392, 1799, 69, 385,
- 386, 69, 387, 400, 390, 401, 391, 69, 69, 393,
- 1799, 69, 389, 69, 69, 402, 394, 69, 395, 404,
- 397, 396, 399, 392, 69, 403, 406, 405, 69, 407,
- 400, 408, 401, 69, 1799, 69, 393, 410, 1799, 411,
- 409, 69, 402, 1799, 413, 418, 404, 69, 412, 69,
-
- 69, 414, 403, 69, 405, 69, 407, 69, 408, 415,
- 69, 417, 416, 69, 410, 69, 411, 409, 69, 419,
- 69, 413, 418, 424, 421, 412, 69, 69, 414, 420,
- 69, 69, 423, 422, 425, 69, 415, 467, 417, 416,
- 69, 426, 428, 427, 69, 69, 419, 431, 429, 432,
- 430, 421, 69, 69, 69, 69, 420, 69, 434, 423,
- 422, 425, 69, 69, 69, 447, 433, 450, 426, 69,
- 427, 435, 69, 69, 431, 429, 432, 430, 69, 436,
- 69, 442, 69, 443, 444, 434, 1799, 69, 69, 69,
- 445, 69, 447, 433, 450, 69, 448, 452, 435, 446,
-
- 1799, 449, 453, 69, 451, 1799, 436, 437, 442, 69,
- 443, 444, 438, 454, 439, 456, 462, 69, 1799, 458,
- 69, 69, 440, 448, 452, 69, 446, 69, 449, 453,
- 69, 451, 441, 69, 437, 455, 457, 69, 460, 438,
- 454, 439, 456, 69, 459, 461, 458, 69, 464, 440,
- 69, 463, 69, 465, 466, 468, 1799, 69, 69, 441,
- 470, 469, 455, 457, 480, 460, 69, 69, 137, 472,
- 69, 459, 461, 69, 471, 464, 69, 477, 463, 475,
- 465, 466, 468, 476, 69, 478, 69, 470, 469, 473,
- 479, 69, 474, 69, 481, 69, 472, 482, 483, 484,
-
- 69, 471, 487, 485, 477, 69, 1799, 490, 486, 488,
- 69, 1799, 69, 491, 69, 489, 473, 69, 492, 474,
- 1799, 69, 501, 498, 69, 69, 484, 1799, 493, 69,
- 485, 69, 69, 69, 490, 486, 488, 69, 494, 497,
- 69, 69, 489, 495, 69, 492, 500, 496, 69, 69,
- 498, 499, 503, 69, 502, 493, 1799, 1799, 506, 69,
- 69, 504, 69, 507, 508, 494, 497, 1799, 511, 513,
- 495, 509, 69, 500, 496, 518, 69, 69, 499, 503,
- 69, 502, 69, 505, 69, 506, 69, 510, 504, 515,
- 507, 508, 512, 69, 514, 516, 513, 1799, 509, 69,
-
- 520, 519, 69, 521, 69, 522, 69, 517, 1799, 523,
- 505, 69, 524, 69, 510, 525, 515, 526, 69, 512,
- 69, 514, 516, 69, 69, 69, 69, 520, 519, 69,
- 521, 527, 528, 530, 517, 532, 69, 531, 533, 524,
- 1799, 534, 525, 535, 536, 542, 69, 529, 69, 69,
- 538, 540, 69, 69, 69, 537, 69, 69, 527, 528,
- 69, 539, 532, 69, 69, 533, 69, 541, 534, 69,
- 535, 536, 542, 543, 529, 544, 547, 538, 540, 69,
- 549, 545, 537, 546, 69, 69, 548, 551, 539, 69,
- 550, 69, 1799, 552, 541, 554, 69, 553, 69, 555,
-
- 543, 69, 69, 547, 570, 556, 69, 549, 545, 69,
- 546, 69, 69, 548, 551, 69, 557, 550, 558, 559,
- 552, 69, 554, 561, 553, 69, 555, 560, 69, 562,
- 563, 564, 556, 566, 1799, 69, 565, 1799, 69, 69,
- 69, 69, 69, 557, 569, 558, 559, 69, 574, 571,
- 561, 572, 137, 567, 560, 69, 562, 563, 564, 69,
- 566, 568, 69, 565, 573, 575, 69, 69, 576, 1799,
- 69, 569, 69, 69, 69, 574, 571, 582, 572, 69,
- 567, 584, 586, 587, 583, 585, 1799, 1799, 568, 69,
- 599, 573, 575, 595, 69, 576, 577, 1799, 596, 69,
-
- 578, 615, 598, 579, 582, 69, 69, 69, 584, 586,
- 580, 583, 585, 581, 69, 69, 600, 69, 69, 597,
- 595, 69, 601, 577, 603, 596, 69, 578, 69, 598,
- 579, 1799, 1799, 602, 604, 1799, 69, 580, 605, 1799,
- 581, 588, 589, 600, 590, 69, 597, 591, 69, 601,
- 69, 603, 592, 606, 610, 607, 69, 608, 593, 594,
- 602, 604, 69, 69, 69, 605, 611, 69, 588, 589,
- 609, 590, 614, 69, 591, 69, 612, 616, 69, 592,
- 606, 610, 607, 618, 608, 593, 594, 613, 69, 617,
- 619, 623, 69, 611, 69, 622, 69, 609, 1799, 614,
-
- 620, 625, 621, 612, 69, 624, 626, 69, 69, 69,
- 618, 69, 627, 69, 613, 628, 629, 619, 623, 69,
- 69, 69, 622, 630, 69, 69, 631, 620, 625, 621,
- 632, 69, 624, 69, 633, 1799, 634, 635, 639, 627,
- 1799, 69, 1799, 629, 69, 1799, 69, 69, 636, 69,
- 630, 1799, 638, 631, 69, 645, 637, 632, 69, 641,
- 69, 633, 69, 634, 635, 639, 69, 640, 651, 642,
- 643, 644, 69, 69, 69, 636, 646, 69, 69, 638,
- 647, 648, 645, 637, 650, 69, 641, 649, 69, 69,
- 654, 653, 655, 656, 640, 69, 642, 643, 644, 69,
-
- 69, 662, 652, 646, 69, 69, 659, 647, 648, 69,
- 661, 650, 658, 660, 649, 664, 69, 657, 653, 69,
- 656, 69, 663, 69, 69, 69, 666, 69, 69, 652,
- 1799, 665, 69, 659, 667, 668, 69, 661, 669, 658,
- 660, 69, 664, 670, 657, 69, 69, 673, 671, 663,
- 69, 672, 683, 674, 682, 69, 675, 69, 665, 69,
- 685, 667, 69, 69, 69, 137, 69, 684, 1799, 69,
- 670, 69, 69, 686, 673, 671, 687, 69, 672, 683,
- 674, 682, 689, 675, 676, 688, 677, 685, 693, 69,
- 678, 1799, 679, 695, 684, 69, 691, 680, 69, 69,
-
- 686, 694, 681, 687, 690, 69, 692, 698, 69, 689,
- 69, 676, 688, 677, 69, 693, 69, 678, 69, 679,
- 695, 696, 697, 691, 680, 699, 703, 705, 694, 681,
- 700, 690, 701, 692, 69, 707, 704, 1799, 69, 711,
- 69, 69, 708, 69, 712, 706, 709, 69, 696, 697,
- 702, 69, 699, 703, 705, 710, 713, 700, 69, 701,
- 69, 69, 707, 704, 69, 69, 711, 714, 69, 708,
- 715, 69, 706, 709, 717, 718, 716, 702, 719, 69,
- 721, 720, 710, 713, 69, 723, 722, 724, 69, 69,
- 728, 69, 725, 69, 69, 732, 737, 715, 69, 69,
-
- 69, 717, 726, 716, 69, 719, 69, 721, 720, 69,
- 727, 730, 723, 722, 724, 69, 729, 69, 731, 725,
- 69, 69, 732, 735, 69, 733, 734, 69, 69, 726,
- 69, 736, 738, 1799, 1799, 739, 743, 727, 730, 740,
- 755, 69, 744, 729, 1799, 731, 69, 69, 69, 745,
- 735, 741, 733, 734, 742, 69, 69, 69, 736, 738,
- 69, 746, 748, 743, 747, 750, 69, 69, 749, 744,
- 1799, 69, 751, 69, 69, 752, 745, 69, 741, 753,
- 754, 742, 756, 1799, 757, 1799, 69, 69, 746, 748,
- 69, 747, 750, 69, 69, 749, 69, 758, 763, 751,
-
- 69, 69, 752, 759, 762, 760, 753, 754, 761, 756,
- 765, 757, 69, 69, 764, 69, 766, 767, 69, 69,
- 69, 69, 769, 768, 758, 763, 770, 771, 772, 1799,
- 759, 762, 760, 69, 773, 761, 69, 765, 69, 69,
- 69, 764, 69, 766, 767, 774, 778, 775, 779, 784,
- 768, 777, 785, 69, 771, 69, 69, 69, 69, 782,
- 69, 773, 69, 780, 69, 69, 781, 786, 788, 783,
- 787, 69, 774, 778, 775, 779, 69, 790, 777, 69,
- 69, 69, 1799, 69, 795, 789, 782, 1799, 791, 69,
- 780, 793, 69, 781, 786, 788, 783, 787, 69, 69,
-
- 69, 792, 794, 69, 790, 796, 797, 1799, 799, 69,
- 69, 69, 789, 798, 69, 791, 800, 801, 793, 806,
- 69, 803, 804, 802, 805, 1799, 1799, 69, 792, 794,
- 808, 69, 796, 797, 69, 799, 69, 69, 69, 807,
- 798, 69, 69, 800, 801, 69, 806, 69, 803, 804,
- 802, 805, 69, 809, 810, 811, 812, 808, 813, 814,
- 815, 69, 821, 816, 820, 818, 807, 819, 69, 69,
- 69, 69, 817, 69, 69, 69, 69, 69, 69, 69,
- 809, 810, 811, 812, 822, 813, 814, 815, 69, 821,
- 816, 820, 818, 823, 819, 824, 825, 1799, 826, 817,
-
- 1799, 828, 69, 829, 827, 69, 831, 830, 69, 832,
- 835, 822, 834, 833, 69, 69, 69, 836, 1799, 839,
- 837, 844, 824, 825, 69, 826, 69, 69, 828, 838,
- 69, 827, 840, 831, 69, 69, 832, 845, 841, 834,
- 833, 69, 69, 69, 836, 69, 839, 837, 842, 843,
- 69, 69, 69, 1799, 854, 846, 838, 847, 69, 840,
- 69, 69, 853, 1799, 855, 841, 856, 859, 69, 1799,
- 69, 860, 1799, 861, 857, 842, 843, 69, 69, 858,
- 69, 854, 846, 69, 847, 848, 69, 69, 69, 853,
- 849, 855, 850, 856, 851, 863, 852, 69, 69, 862,
-
- 861, 857, 864, 69, 865, 867, 858, 69, 866, 869,
- 69, 871, 848, 69, 69, 69, 868, 849, 870, 850,
- 1799, 851, 863, 852, 873, 875, 862, 874, 69, 864,
- 877, 865, 69, 69, 69, 866, 69, 876, 871, 872,
- 879, 878, 69, 868, 880, 870, 883, 69, 69, 882,
- 881, 69, 69, 884, 874, 69, 886, 69, 885, 69,
- 887, 888, 69, 69, 876, 889, 872, 879, 878, 896,
- 1799, 880, 69, 883, 69, 69, 882, 881, 69, 890,
- 884, 891, 892, 69, 893, 885, 894, 69, 888, 69,
- 895, 69, 900, 69, 69, 899, 69, 69, 69, 897,
-
- 69, 901, 69, 902, 1799, 898, 890, 69, 891, 892,
- 69, 69, 69, 894, 903, 905, 904, 895, 69, 900,
- 1799, 69, 899, 906, 69, 908, 897, 907, 901, 69,
- 902, 69, 898, 909, 913, 911, 912, 910, 914, 915,
- 1799, 903, 905, 904, 916, 69, 1799, 69, 1799, 918,
- 906, 69, 908, 69, 907, 69, 917, 69, 921, 69,
- 1799, 913, 911, 912, 69, 914, 920, 69, 919, 69,
- 69, 916, 69, 922, 923, 69, 918, 925, 927, 924,
- 69, 69, 69, 917, 926, 921, 69, 928, 931, 930,
- 933, 69, 69, 920, 934, 919, 929, 69, 932, 69,
-
- 922, 923, 69, 69, 925, 927, 924, 936, 69, 935,
- 69, 926, 69, 939, 928, 931, 930, 933, 69, 69,
- 937, 934, 938, 929, 940, 932, 941, 69, 69, 944,
- 1799, 1799, 942, 945, 936, 69, 935, 943, 947, 946,
- 939, 69, 69, 951, 948, 952, 949, 937, 956, 938,
- 950, 69, 69, 69, 953, 69, 69, 69, 69, 942,
- 945, 69, 69, 69, 943, 947, 946, 954, 69, 69,
- 69, 948, 952, 957, 955, 956, 958, 69, 959, 960,
- 961, 953, 69, 962, 69, 963, 69, 69, 69, 965,
- 964, 69, 1799, 967, 954, 966, 69, 970, 1799, 968,
-
- 969, 955, 69, 958, 69, 959, 960, 961, 69, 977,
- 962, 69, 963, 971, 972, 69, 965, 964, 981, 69,
- 967, 69, 966, 69, 970, 973, 968, 969, 69, 974,
- 976, 69, 978, 983, 982, 979, 69, 69, 980, 986,
- 971, 972, 975, 69, 984, 69, 985, 987, 988, 69,
- 69, 990, 973, 989, 69, 69, 974, 976, 69, 978,
- 983, 982, 979, 69, 994, 980, 69, 993, 995, 975,
- 69, 984, 69, 992, 69, 988, 69, 69, 990, 69,
- 989, 991, 998, 69, 997, 996, 69, 69, 999, 69,
- 1000, 994, 69, 1001, 993, 69, 1002, 1003, 1799, 1005,
-
- 992, 69, 1799, 1004, 69, 1006, 69, 1007, 991, 998,
- 69, 997, 996, 69, 69, 999, 69, 1000, 69, 1009,
- 1001, 1008, 1010, 1002, 1003, 69, 1005, 69, 69, 69,
- 1004, 1011, 1006, 1012, 1007, 1013, 1014, 69, 1015, 1026,
- 1016, 1017, 1799, 69, 1018, 1799, 1009, 1019, 1008, 1010,
- 69, 1020, 1022, 69, 1799, 69, 69, 1021, 1011, 69,
- 1012, 1023, 1028, 1014, 1024, 69, 69, 1016, 69, 69,
- 69, 1018, 69, 1027, 1019, 1029, 1025, 69, 1020, 1022,
- 69, 1030, 1031, 69, 1021, 69, 1032, 1033, 1023, 1028,
- 1038, 1024, 1034, 1037, 1799, 69, 1035, 69, 1036, 1041,
-
- 1027, 69, 1029, 1025, 69, 69, 69, 1039, 1030, 1031,
- 1040, 69, 1060, 69, 1033, 69, 1042, 69, 1043, 1034,
- 1037, 69, 1044, 1035, 1045, 1036, 69, 69, 1046, 69,
- 1048, 69, 69, 1047, 1039, 1049, 1799, 1040, 69, 69,
- 1050, 69, 1054, 1042, 69, 1043, 1051, 69, 69, 1044,
- 1052, 1045, 1053, 69, 1056, 1046, 1055, 1048, 69, 1059,
- 1047, 1061, 1057, 69, 69, 1058, 69, 1050, 69, 1054,
- 69, 1062, 1064, 1051, 69, 1069, 1063, 1052, 1068, 1053,
- 69, 1056, 1070, 1055, 1071, 69, 1059, 69, 1061, 1057,
- 69, 69, 1058, 69, 1065, 1074, 69, 1066, 1062, 1064,
-
- 1067, 1073, 69, 1063, 1072, 1068, 69, 1078, 69, 69,
- 69, 1071, 1075, 1082, 1076, 69, 69, 1077, 69, 69,
- 1079, 1065, 1074, 69, 1066, 1080, 1799, 1067, 1073, 69,
- 1081, 1072, 1799, 1799, 1078, 69, 69, 1083, 1799, 1075,
- 1082, 1076, 1085, 1088, 1077, 1086, 69, 1079, 69, 1087,
- 1089, 1084, 1080, 1090, 1091, 1092, 1093, 1081, 69, 69,
- 69, 1095, 69, 69, 1083, 1094, 1098, 1096, 1101, 1085,
- 1097, 1799, 1086, 1799, 69, 69, 1087, 1089, 1084, 69,
- 69, 1091, 1092, 1100, 69, 69, 1099, 69, 1095, 69,
- 1102, 69, 1094, 1098, 1096, 69, 1103, 1097, 1105, 69,
-
- 1104, 69, 1106, 1799, 1107, 69, 1108, 69, 1111, 1112,
- 1100, 1110, 1109, 1099, 1114, 69, 1118, 1102, 1799, 1113,
- 69, 69, 1115, 1103, 69, 1105, 69, 1104, 69, 1106,
- 69, 1107, 69, 1108, 69, 1111, 69, 69, 1110, 1109,
- 1116, 1114, 1117, 1119, 1120, 1121, 1113, 69, 1122, 1115,
- 69, 1124, 1123, 69, 1126, 69, 1125, 1799, 69, 1799,
- 1128, 1131, 1127, 1132, 1799, 1130, 69, 1116, 1129, 1117,
- 1119, 1120, 1121, 69, 69, 69, 69, 69, 69, 1123,
- 69, 69, 69, 1125, 1133, 69, 69, 1128, 1131, 1127,
- 1132, 1135, 1130, 1136, 1137, 1129, 1138, 1134, 69, 1141,
-
- 1799, 1139, 69, 1142, 1140, 69, 69, 69, 1143, 1144,
- 1145, 1133, 69, 1147, 1148, 69, 1146, 1149, 1135, 1153,
- 1136, 69, 1151, 1150, 1134, 1154, 1141, 69, 1139, 1155,
- 69, 1140, 69, 1799, 1799, 1143, 69, 69, 69, 69,
- 1152, 1148, 69, 1146, 69, 1162, 69, 1799, 69, 1799,
- 1150, 69, 1154, 69, 1156, 1157, 1158, 1160, 1161, 1163,
- 69, 1159, 1164, 1166, 69, 69, 69, 1152, 1165, 69,
- 1167, 69, 1168, 1169, 69, 69, 69, 1171, 1170, 1172,
- 69, 1156, 1157, 1158, 1160, 1161, 1163, 1173, 1159, 1164,
- 69, 69, 1174, 1175, 69, 1165, 69, 1167, 69, 1168,
-
- 1169, 1176, 1177, 69, 69, 1170, 1172, 69, 1179, 1180,
- 69, 1178, 1182, 1183, 1173, 1184, 1181, 1799, 1185, 1174,
- 1175, 1190, 69, 69, 1187, 1186, 1188, 69, 1176, 1177,
- 69, 1191, 69, 69, 1194, 1179, 69, 1799, 1178, 1182,
- 69, 1189, 69, 1181, 69, 69, 69, 69, 1190, 69,
- 1192, 1187, 1186, 1188, 1195, 69, 1193, 69, 1191, 69,
- 69, 1194, 1196, 1197, 1198, 1200, 69, 1203, 1189, 1199,
- 69, 1206, 1204, 1205, 1207, 69, 1208, 1192, 69, 1201,
- 1209, 1195, 1210, 1193, 1202, 69, 69, 69, 1212, 1196,
- 1197, 1198, 69, 1214, 69, 69, 1199, 1211, 69, 1204,
-
- 1205, 69, 69, 69, 1213, 1215, 1201, 69, 69, 1218,
- 1216, 1202, 1217, 69, 69, 1212, 1219, 1220, 1221, 1799,
- 1214, 69, 1222, 1224, 1211, 69, 1223, 1225, 69, 1226,
- 1227, 1799, 1215, 69, 1229, 69, 69, 1216, 1228, 1217,
- 69, 1230, 1231, 1219, 1234, 1221, 69, 1232, 69, 1222,
- 69, 69, 69, 1223, 69, 69, 1226, 1227, 1233, 69,
- 69, 1229, 69, 1235, 69, 1228, 1236, 1237, 1230, 1231,
- 69, 69, 1238, 69, 1232, 1239, 69, 1241, 1240, 1242,
- 69, 1799, 1245, 1246, 69, 1233, 1243, 1248, 1251, 1247,
- 1235, 69, 69, 1236, 1237, 1799, 1253, 1244, 69, 1238,
-
- 69, 69, 1239, 1249, 1250, 1240, 1242, 69, 69, 1245,
- 1246, 1252, 69, 1243, 69, 69, 1247, 69, 1254, 69,
- 1255, 69, 69, 1253, 1244, 1257, 1256, 1799, 1258, 1260,
- 1249, 1250, 69, 1259, 1261, 69, 1264, 69, 1252, 1799,
- 1799, 1266, 1262, 69, 1263, 1254, 69, 69, 69, 69,
- 1265, 69, 1257, 1256, 69, 1258, 1260, 69, 1267, 69,
- 1259, 1261, 69, 1264, 1268, 69, 1270, 1269, 1266, 1262,
- 1271, 1263, 1273, 1275, 1272, 69, 1277, 1265, 1274, 69,
- 1278, 1276, 1280, 1281, 1799, 1267, 69, 69, 69, 69,
- 1282, 1268, 69, 1270, 1269, 69, 1283, 1271, 69, 69,
-
- 1275, 1272, 69, 1277, 1279, 1274, 69, 1278, 1276, 1280,
- 69, 1284, 69, 69, 69, 1286, 1285, 1282, 1287, 1291,
- 1288, 1289, 1290, 1283, 69, 1294, 1293, 1799, 69, 69,
- 69, 1279, 1292, 69, 1799, 1297, 1799, 1799, 1284, 1298,
- 69, 1299, 1286, 1285, 1310, 69, 69, 1288, 1289, 1290,
- 69, 69, 1294, 1293, 69, 1295, 69, 69, 1296, 1292,
- 69, 1300, 1297, 1302, 1301, 1303, 1298, 1304, 1299, 1398,
- 1799, 69, 69, 69, 1305, 1306, 1312, 69, 69, 1309,
- 1311, 1307, 1295, 69, 1317, 1296, 69, 1308, 1300, 69,
- 1302, 1301, 1303, 69, 1304, 69, 69, 69, 69, 1314,
-
- 69, 1305, 1306, 69, 1313, 1315, 1309, 1311, 1307, 1316,
- 1318, 69, 69, 1319, 1308, 1320, 1321, 1322, 1799, 1323,
- 69, 1325, 69, 69, 1324, 1326, 1314, 69, 1327, 69,
- 69, 1313, 1315, 1328, 69, 69, 1316, 1318, 1331, 69,
- 1319, 1329, 69, 1321, 69, 69, 1323, 69, 1325, 1330,
- 69, 1324, 1326, 69, 1335, 69, 1332, 1333, 1334, 1336,
- 1328, 1337, 1799, 69, 1340, 1331, 69, 1338, 1329, 69,
- 1339, 69, 69, 69, 1342, 1341, 1330, 69, 69, 69,
- 1799, 69, 69, 1332, 1333, 1334, 1336, 1343, 1337, 69,
- 1344, 1340, 1345, 1346, 1338, 69, 69, 1339, 1347, 69,
-
- 1348, 1342, 1341, 1350, 1349, 1799, 1352, 69, 1351, 1353,
- 1354, 1355, 1356, 1357, 1343, 1358, 69, 1344, 69, 1345,
- 1346, 1359, 69, 69, 69, 69, 69, 1348, 1361, 1362,
- 1350, 1349, 69, 1352, 1365, 1351, 69, 69, 1355, 1356,
- 69, 1360, 69, 1363, 1364, 1366, 1367, 1373, 69, 69,
- 1368, 69, 1370, 69, 1369, 69, 69, 1374, 1377, 69,
- 1378, 69, 1799, 1371, 1799, 69, 69, 69, 1360, 1382,
- 1363, 1364, 1366, 69, 69, 69, 69, 1368, 1372, 1370,
- 1375, 1369, 1379, 1376, 1374, 69, 69, 1378, 1380, 69,
- 1371, 69, 69, 1381, 1383, 1384, 69, 1385, 69, 1386,
-
- 69, 1387, 69, 1388, 1390, 1372, 69, 1375, 1392, 1379,
- 1376, 1389, 1393, 1391, 69, 1380, 69, 1394, 69, 69,
- 1381, 1383, 69, 1395, 1385, 69, 1386, 69, 1387, 69,
- 1388, 1390, 1397, 69, 69, 1392, 1396, 1399, 1389, 1393,
- 1391, 69, 1400, 1401, 1394, 69, 1402, 1403, 1404, 69,
- 1395, 1799, 1408, 1406, 69, 1410, 1405, 1409, 1407, 1397,
- 69, 69, 1412, 1396, 1399, 69, 1799, 69, 1413, 1400,
- 1401, 1415, 69, 1402, 69, 1404, 69, 69, 69, 1408,
- 1406, 69, 1410, 1405, 1409, 1407, 1411, 1414, 1416, 69,
- 1419, 1417, 1799, 69, 1418, 69, 1420, 69, 1415, 1422,
-
- 69, 1421, 69, 69, 69, 1423, 1799, 1425, 1426, 1429,
- 1433, 1428, 1799, 1411, 1414, 1416, 69, 1419, 1417, 69,
- 69, 1418, 1424, 1420, 1430, 69, 69, 69, 1421, 69,
- 1427, 69, 1423, 69, 1425, 1426, 1431, 69, 1428, 1432,
- 69, 69, 1435, 1434, 1438, 69, 1436, 69, 1437, 1424,
- 1439, 1430, 1440, 1441, 1442, 1443, 1799, 1427, 1799, 69,
- 1447, 69, 69, 1431, 1446, 1444, 1432, 69, 69, 1435,
- 1434, 69, 69, 1436, 69, 1437, 69, 1439, 1445, 69,
- 69, 69, 1443, 69, 1448, 69, 69, 1447, 1449, 1450,
- 1451, 1446, 1444, 1452, 1799, 1454, 1453, 1455, 1799, 69,
-
- 1456, 1457, 69, 1459, 1458, 1445, 1460, 69, 69, 1461,
- 1799, 1448, 1799, 1799, 69, 69, 1450, 1462, 1467, 69,
- 1452, 69, 69, 1453, 1455, 69, 69, 1456, 1457, 1463,
- 69, 1458, 69, 69, 1464, 1465, 69, 1466, 69, 1468,
- 69, 1469, 1470, 1473, 1462, 1467, 69, 1471, 69, 69,
- 69, 1472, 69, 1799, 1475, 1799, 1463, 69, 69, 1480,
- 69, 1464, 1465, 1478, 1466, 1479, 1468, 69, 69, 1470,
- 1473, 1476, 1474, 1481, 1471, 69, 1482, 1477, 1472, 1483,
- 69, 1475, 69, 69, 1484, 69, 69, 69, 69, 69,
- 1478, 1486, 1479, 1489, 1485, 1487, 1488, 1490, 1476, 1474,
-
- 69, 69, 69, 1482, 1477, 69, 1483, 1491, 1492, 69,
- 1498, 1484, 1499, 1799, 1493, 1799, 1534, 1799, 1486, 69,
- 1489, 1485, 1487, 1488, 69, 69, 69, 1494, 69, 1495,
- 1500, 1496, 1497, 1501, 1491, 1492, 69, 69, 69, 69,
- 69, 1493, 69, 69, 1502, 69, 1503, 69, 1504, 1508,
- 1507, 1509, 69, 1505, 1494, 69, 1495, 1500, 1496, 1497,
- 1501, 69, 1506, 69, 1511, 1512, 1515, 1514, 69, 69,
- 1510, 1502, 1513, 1503, 69, 1504, 69, 1507, 1509, 69,
- 1505, 1516, 1517, 1519, 69, 1520, 1799, 1521, 69, 1506,
- 69, 69, 1512, 69, 1514, 69, 1518, 1510, 1522, 1513,
-
- 1523, 1799, 1524, 69, 69, 1528, 1525, 1526, 1516, 69,
- 69, 1527, 69, 69, 1521, 69, 1799, 69, 69, 1529,
- 1530, 1532, 1533, 1518, 69, 1522, 1536, 1523, 69, 1524,
- 69, 1531, 1528, 1525, 1526, 1535, 1537, 1538, 1527, 1540,
- 1799, 69, 69, 69, 1539, 1799, 1529, 1530, 69, 69,
- 1544, 1541, 1542, 69, 1543, 1545, 1546, 69, 1531, 1799,
- 1799, 69, 1535, 69, 69, 1547, 1540, 69, 69, 69,
- 69, 1539, 69, 69, 69, 1548, 1549, 1544, 1541, 1542,
- 69, 1543, 1545, 1546, 1551, 1553, 1550, 1552, 1554, 69,
- 1555, 1556, 1547, 69, 69, 69, 1559, 1560, 69, 1557,
-
- 1561, 1558, 1548, 1549, 69, 69, 1564, 69, 1799, 1568,
- 69, 1551, 1553, 1550, 1552, 1554, 69, 1555, 69, 69,
- 1562, 1563, 69, 69, 1560, 1566, 1557, 1561, 1558, 69,
- 1565, 1799, 1567, 1564, 1569, 69, 69, 69, 69, 1570,
- 1571, 69, 1572, 69, 1573, 1574, 1575, 1562, 1563, 1576,
- 1577, 1578, 1566, 1580, 1581, 69, 1579, 1565, 69, 1567,
- 1799, 1569, 69, 1799, 69, 69, 1570, 1571, 1584, 69,
- 1586, 69, 69, 1575, 69, 1585, 1576, 69, 69, 69,
- 1580, 69, 1588, 1579, 69, 69, 1582, 1583, 1587, 1590,
- 69, 1589, 1591, 1799, 1592, 1584, 69, 1586, 1593, 69,
-
- 69, 69, 1585, 1596, 1595, 1598, 1594, 1799, 69, 69,
- 69, 1597, 69, 1582, 1583, 1587, 1590, 69, 1589, 1591,
- 69, 1592, 1599, 69, 69, 1593, 69, 1600, 1601, 69,
- 1596, 1595, 1598, 1594, 69, 1602, 1603, 1604, 1597, 1606,
- 1607, 1608, 1605, 1610, 1609, 69, 1613, 1799, 69, 1599,
- 1614, 1799, 69, 1615, 1600, 69, 1611, 69, 69, 69,
- 1612, 69, 1602, 1603, 69, 69, 1606, 1607, 69, 1605,
- 1610, 1609, 69, 1613, 69, 69, 1616, 1614, 1617, 69,
- 1615, 1618, 1619, 1611, 1620, 1621, 1622, 1612, 1623, 69,
- 69, 1624, 1799, 69, 69, 69, 1625, 1628, 1626, 69,
-
- 69, 1799, 1627, 1616, 1629, 1617, 69, 69, 1618, 1619,
- 1630, 1620, 1621, 1622, 69, 1631, 1633, 1634, 1624, 69,
- 1635, 69, 1632, 69, 69, 1626, 69, 69, 69, 1627,
- 69, 1629, 1636, 1637, 1638, 69, 1639, 1630, 1640, 69,
- 1643, 69, 1631, 1633, 1634, 1641, 1642, 1635, 1645, 1632,
- 69, 1644, 69, 69, 1646, 1647, 1649, 1651, 69, 69,
- 1637, 69, 1648, 1639, 69, 69, 69, 1643, 1654, 1650,
- 69, 69, 1641, 1642, 1656, 1645, 69, 1652, 1644, 1653,
- 1655, 69, 69, 1649, 69, 1659, 69, 1660, 69, 1648,
- 69, 1661, 69, 1657, 1658, 1654, 1650, 1662, 1663, 69,
-
- 1664, 1665, 1666, 69, 1652, 69, 1653, 1655, 1667, 1668,
- 1669, 69, 69, 1670, 69, 1671, 1673, 1672, 1661, 69,
- 1657, 1658, 69, 1674, 1662, 1663, 1675, 1664, 69, 69,
- 69, 69, 1676, 1677, 69, 69, 1668, 69, 1681, 69,
- 1670, 1678, 69, 1673, 1672, 1679, 1680, 69, 69, 1686,
- 69, 69, 1799, 1675, 1688, 1682, 1685, 1687, 1689, 1676,
- 69, 69, 69, 69, 69, 1681, 69, 69, 1678, 1683,
- 1684, 69, 1679, 1680, 1691, 1690, 1686, 1692, 1693, 69,
- 1694, 69, 1682, 1685, 1687, 69, 1695, 1696, 1698, 1699,
- 1700, 1799, 69, 69, 1697, 1706, 1683, 1684, 69, 69,
-
- 69, 69, 1690, 69, 1692, 69, 1701, 1694, 1703, 1704,
- 1707, 1708, 1705, 69, 1696, 69, 69, 1700, 69, 1702,
- 69, 1697, 69, 1709, 1715, 69, 1710, 1712, 1711, 1713,
- 69, 69, 69, 1701, 1716, 1703, 1704, 69, 69, 1705,
- 1714, 69, 69, 69, 1721, 1718, 1702, 1726, 1717, 1720,
- 69, 1715, 69, 1710, 69, 1711, 1713, 1719, 69, 69,
- 1722, 1716, 69, 69, 69, 1727, 1723, 1714, 69, 69,
- 1725, 1721, 1718, 1728, 69, 1717, 1720, 69, 1724, 1729,
- 69, 1732, 69, 69, 1719, 1736, 1730, 1722, 69, 1737,
- 1731, 1733, 1727, 1723, 1799, 69, 1734, 1725, 1738, 1735,
-
- 1728, 69, 69, 1799, 69, 1724, 1729, 69, 69, 1746,
- 1739, 69, 69, 1730, 1740, 1741, 69, 1731, 1733, 1742,
- 69, 1743, 69, 1734, 69, 1738, 1735, 69, 69, 1744,
- 1745, 69, 1747, 1754, 1749, 69, 1746, 1739, 69, 1748,
- 1750, 1740, 1741, 69, 1799, 1799, 1742, 69, 1743, 1751,
- 1752, 1755, 1799, 1756, 69, 1753, 1744, 1745, 1759, 1747,
- 69, 1749, 69, 69, 69, 1799, 1748, 1750, 1762, 1799,
- 1766, 69, 69, 69, 1761, 1757, 1751, 1752, 69, 1758,
- 1756, 1767, 1753, 69, 1760, 1763, 1764, 69, 69, 69,
- 69, 1765, 69, 69, 69, 1762, 69, 1766, 1769, 1768,
-
- 1771, 1761, 1757, 69, 1770, 69, 1758, 69, 1767, 1772,
- 1774, 1760, 1763, 1764, 1775, 1773, 1778, 1799, 1765, 1776,
- 1777, 1799, 69, 69, 69, 1769, 1768, 1771, 69, 69,
- 69, 1770, 1779, 1780, 69, 1781, 1772, 69, 69, 69,
- 69, 1775, 1773, 1778, 1782, 1783, 1776, 1777, 1784, 1788,
- 1785, 1790, 69, 69, 1787, 69, 1786, 69, 69, 1779,
- 1780, 1791, 1781, 1799, 69, 1789, 1792, 1793, 1794, 1797,
- 1798, 1782, 1783, 1799, 69, 1784, 69, 1785, 69, 1795,
- 69, 1787, 1799, 1786, 1799, 69, 69, 69, 69, 69,
- 69, 1796, 1789, 1792, 1793, 1794, 69, 69, 1799, 69,
-
- 1799, 1799, 1799, 1799, 1799, 1799, 1795, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1796, 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, 1799, 72, 72, 72,
- 72, 127, 127, 1799, 1799, 1799, 127, 127, 129, 129,
- 1799, 1799, 129, 1799, 129, 131, 1799, 1799, 1799, 1799,
- 1799, 131, 134, 134, 1799, 1799, 1799, 134, 134, 136,
- 1799, 1799, 1799, 1799, 1799, 136, 138, 138, 1799, 138,
-
- 138, 138, 138, 73, 73, 1799, 73, 73, 73, 73,
- 13, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799
+ 73, 144, 73, 68, 147, 148, 156, 73, 157, 150,
+ 151, 149, 153, 154, 145, 69, 139, 69, 69, 69,
+ 69, 161, 69, 297, 1846, 69, 69, 1846, 144, 193,
+ 155, 147, 148, 156, 74, 157, 150, 151, 149, 153,
+ 158, 145, 159, 69, 69, 162, 168, 163, 161, 69,
+ 164, 69, 69, 174, 69, 171, 169, 155, 69, 172,
+ 69, 175, 173, 165, 166, 69, 69, 158, 1846, 159,
+
+ 182, 69, 162, 168, 163, 176, 170, 164, 69, 69,
+ 174, 178, 171, 169, 69, 177, 172, 180, 175, 173,
+ 165, 166, 179, 69, 69, 69, 181, 182, 183, 69,
+ 184, 69, 176, 170, 185, 69, 69, 69, 178, 186,
+ 1846, 187, 177, 188, 180, 189, 69, 192, 190, 179,
+ 69, 195, 69, 181, 191, 183, 69, 184, 194, 69,
+ 69, 185, 69, 199, 202, 198, 186, 69, 187, 69,
+ 188, 196, 189, 69, 192, 190, 69, 69, 195, 197,
+ 200, 191, 203, 1846, 204, 194, 69, 1846, 69, 1846,
+ 199, 202, 198, 69, 1846, 207, 1846, 69, 196, 1846,
+
+ 205, 201, 1846, 206, 1846, 69, 197, 200, 1846, 203,
+ 131, 204, 131, 131, 136, 131, 136, 136, 73, 136,
+ 73, 73, 208, 73, 137, 69, 69, 205, 201, 209,
+ 206, 210, 211, 212, 69, 213, 214, 1846, 227, 69,
+ 69, 215, 216, 218, 69, 217, 69, 1846, 69, 208,
+ 226, 1846, 219, 69, 1846, 139, 209, 228, 210, 211,
+ 212, 231, 213, 230, 69, 227, 229, 69, 215, 216,
+ 69, 69, 217, 220, 69, 233, 69, 226, 232, 69,
+ 69, 237, 234, 69, 228, 235, 69, 69, 231, 236,
+ 230, 69, 238, 229, 239, 1846, 243, 69, 69, 240,
+
+ 220, 221, 233, 69, 244, 232, 222, 69, 237, 234,
+ 245, 223, 235, 241, 69, 242, 236, 224, 225, 238,
+ 69, 239, 69, 243, 69, 248, 240, 251, 221, 246,
+ 249, 253, 252, 222, 254, 69, 69, 245, 223, 247,
+ 241, 250, 242, 255, 224, 225, 257, 69, 69, 1846,
+ 256, 259, 1846, 270, 69, 1846, 69, 249, 69, 252,
+ 69, 261, 69, 69, 69, 69, 247, 69, 250, 258,
+ 255, 262, 69, 257, 260, 263, 69, 256, 259, 69,
+ 69, 264, 265, 266, 69, 69, 267, 272, 261, 69,
+ 277, 69, 271, 69, 268, 269, 258, 69, 262, 69,
+
+ 273, 260, 263, 69, 274, 69, 278, 275, 264, 265,
+ 266, 276, 69, 267, 272, 69, 69, 277, 280, 271,
+ 69, 268, 269, 281, 283, 284, 69, 273, 279, 1846,
+ 286, 287, 288, 69, 275, 69, 1846, 69, 276, 137,
+ 282, 285, 289, 292, 291, 305, 296, 290, 69, 69,
+ 281, 283, 284, 69, 69, 279, 69, 69, 287, 294,
+ 69, 69, 69, 69, 293, 295, 69, 282, 285, 289,
+ 292, 291, 69, 296, 290, 298, 69, 299, 300, 1846,
+ 1846, 301, 302, 69, 303, 309, 294, 306, 308, 69,
+ 69, 293, 295, 69, 304, 1846, 307, 321, 1846, 1846,
+
+ 69, 69, 298, 69, 299, 300, 69, 69, 301, 302,
+ 69, 303, 69, 310, 306, 308, 69, 311, 312, 313,
+ 69, 304, 69, 307, 69, 314, 69, 316, 69, 315,
+ 318, 326, 317, 69, 319, 320, 69, 1846, 1846, 69,
+ 310, 322, 346, 69, 311, 312, 313, 1846, 323, 69,
+ 69, 69, 314, 69, 316, 69, 315, 318, 326, 317,
+ 327, 319, 320, 69, 324, 69, 69, 325, 322, 328,
+ 329, 333, 336, 69, 69, 323, 330, 331, 334, 339,
+ 1846, 335, 337, 69, 69, 69, 1846, 327, 69, 338,
+ 340, 324, 341, 343, 325, 69, 328, 329, 333, 336,
+
+ 69, 69, 342, 330, 331, 334, 69, 69, 335, 337,
+ 344, 348, 69, 351, 69, 69, 338, 340, 69, 341,
+ 343, 345, 349, 347, 350, 69, 69, 355, 69, 342,
+ 69, 352, 1846, 69, 353, 356, 354, 344, 348, 1846,
+ 351, 1846, 69, 357, 361, 69, 69, 379, 345, 349,
+ 347, 350, 373, 360, 355, 362, 69, 1846, 352, 358,
+ 69, 353, 365, 354, 69, 69, 69, 359, 69, 363,
+ 357, 361, 374, 69, 378, 69, 376, 375, 69, 373,
+ 360, 69, 362, 137, 69, 364, 358, 1846, 377, 365,
+ 69, 380, 1846, 69, 359, 69, 363, 383, 1846, 374,
+
+ 69, 378, 381, 376, 375, 382, 385, 387, 384, 69,
+ 1846, 389, 364, 366, 367, 377, 399, 69, 380, 69,
+ 69, 386, 69, 368, 383, 369, 370, 371, 69, 381,
+ 372, 388, 382, 391, 387, 384, 390, 69, 69, 69,
+ 366, 367, 69, 399, 69, 392, 393, 69, 386, 394,
+ 368, 395, 369, 370, 371, 69, 69, 372, 388, 396,
+ 391, 404, 69, 390, 397, 398, 400, 401, 408, 402,
+ 69, 407, 1846, 405, 69, 69, 394, 69, 395, 69,
+ 69, 406, 403, 411, 410, 412, 396, 69, 404, 69,
+ 69, 397, 398, 400, 401, 69, 402, 409, 407, 69,
+
+ 405, 413, 415, 69, 69, 69, 69, 69, 406, 403,
+ 411, 410, 412, 414, 417, 416, 69, 418, 1846, 419,
+ 421, 420, 1846, 69, 409, 422, 1846, 69, 413, 415,
+ 425, 423, 424, 1846, 426, 69, 69, 69, 69, 1846,
+ 414, 69, 416, 69, 418, 69, 419, 421, 420, 427,
+ 428, 69, 422, 69, 429, 69, 69, 425, 423, 424,
+ 69, 426, 434, 430, 431, 435, 432, 433, 436, 69,
+ 69, 439, 69, 69, 69, 69, 427, 428, 437, 69,
+ 438, 429, 441, 440, 445, 443, 69, 69, 1846, 434,
+ 430, 431, 69, 432, 433, 436, 69, 442, 1846, 69,
+
+ 69, 444, 69, 69, 446, 437, 69, 438, 69, 441,
+ 440, 445, 443, 69, 447, 69, 453, 454, 455, 461,
+ 1846, 69, 69, 69, 442, 69, 458, 456, 444, 69,
+ 1846, 446, 459, 1846, 460, 467, 457, 1846, 462, 69,
+ 69, 447, 448, 453, 454, 455, 461, 449, 466, 450,
+ 69, 468, 1846, 458, 463, 464, 69, 451, 69, 459,
+ 69, 460, 467, 457, 69, 462, 69, 452, 69, 448,
+ 69, 465, 469, 69, 449, 466, 450, 470, 468, 471,
+ 472, 463, 464, 69, 451, 69, 473, 474, 475, 477,
+ 69, 69, 478, 480, 452, 476, 479, 69, 465, 469,
+
+ 483, 482, 69, 137, 470, 481, 471, 472, 69, 69,
+ 485, 69, 69, 484, 474, 475, 477, 69, 486, 69,
+ 69, 487, 476, 479, 69, 69, 488, 483, 482, 69,
+ 489, 491, 481, 490, 69, 69, 492, 485, 493, 494,
+ 484, 495, 496, 497, 499, 486, 1846, 69, 487, 69,
+ 498, 500, 501, 504, 502, 1846, 1846, 69, 69, 1846,
+ 490, 505, 1846, 69, 1846, 1846, 69, 69, 69, 69,
+ 497, 499, 69, 69, 506, 69, 69, 498, 503, 501,
+ 510, 502, 69, 69, 69, 69, 507, 69, 505, 69,
+ 511, 508, 513, 512, 515, 509, 514, 516, 1846, 520,
+
+ 1846, 506, 69, 517, 1846, 503, 518, 510, 1846, 69,
+ 69, 525, 522, 507, 69, 69, 69, 511, 508, 513,
+ 512, 69, 509, 514, 516, 69, 520, 69, 519, 69,
+ 517, 521, 523, 518, 69, 524, 526, 527, 532, 522,
+ 530, 528, 69, 69, 529, 69, 1846, 531, 533, 69,
+ 69, 535, 534, 540, 1846, 519, 1846, 69, 521, 523,
+ 69, 69, 524, 526, 527, 69, 69, 530, 528, 69,
+ 69, 529, 538, 69, 531, 533, 69, 536, 535, 534,
+ 539, 537, 541, 547, 69, 544, 69, 542, 546, 545,
+ 558, 69, 548, 551, 69, 549, 550, 1846, 1846, 538,
+
+ 69, 69, 543, 553, 69, 69, 554, 539, 69, 541,
+ 547, 69, 1846, 69, 542, 546, 69, 69, 552, 548,
+ 551, 69, 549, 550, 69, 69, 69, 555, 556, 543,
+ 553, 557, 559, 554, 560, 1846, 561, 69, 565, 69,
+ 69, 562, 69, 69, 563, 552, 1846, 564, 566, 69,
+ 568, 569, 567, 1846, 555, 556, 69, 1846, 557, 559,
+ 69, 560, 69, 561, 69, 565, 69, 570, 562, 69,
+ 69, 563, 573, 69, 564, 566, 571, 568, 569, 567,
+ 572, 69, 575, 576, 574, 1846, 577, 69, 578, 580,
+ 584, 579, 1846, 581, 570, 69, 69, 1846, 69, 573,
+
+ 69, 582, 69, 571, 69, 583, 586, 572, 137, 575,
+ 576, 574, 69, 577, 69, 578, 580, 585, 579, 69,
+ 581, 69, 587, 69, 69, 588, 589, 590, 582, 69,
+ 603, 591, 583, 586, 69, 598, 592, 69, 69, 1846,
+ 69, 1846, 600, 599, 585, 601, 69, 69, 633, 587,
+ 602, 1846, 588, 69, 590, 1846, 615, 69, 591, 1846,
+ 69, 69, 598, 592, 593, 611, 69, 612, 594, 600,
+ 599, 595, 601, 69, 617, 614, 69, 602, 596, 69,
+ 613, 597, 69, 69, 616, 1846, 69, 69, 1846, 1846,
+ 619, 593, 611, 1846, 612, 594, 623, 620, 595, 69,
+
+ 69, 617, 614, 622, 69, 596, 618, 613, 597, 604,
+ 605, 616, 606, 1846, 621, 607, 69, 619, 69, 69,
+ 608, 69, 625, 623, 620, 69, 609, 610, 1846, 69,
+ 622, 627, 624, 618, 628, 69, 604, 605, 69, 606,
+ 69, 621, 607, 626, 629, 631, 630, 608, 632, 625,
+ 69, 69, 634, 609, 610, 69, 69, 635, 627, 624,
+ 69, 628, 1846, 637, 636, 639, 640, 69, 638, 641,
+ 626, 629, 631, 630, 69, 69, 643, 645, 642, 644,
+ 649, 69, 69, 69, 635, 69, 69, 69, 69, 69,
+ 637, 636, 639, 640, 646, 638, 641, 647, 69, 648,
+
+ 650, 1846, 69, 69, 69, 642, 644, 649, 69, 651,
+ 652, 656, 655, 69, 1846, 69, 658, 69, 69, 657,
+ 653, 646, 69, 69, 647, 69, 648, 650, 654, 659,
+ 662, 661, 664, 69, 69, 69, 651, 652, 656, 655,
+ 69, 660, 663, 658, 69, 665, 657, 653, 69, 69,
+ 667, 69, 666, 69, 668, 654, 659, 662, 661, 664,
+ 669, 670, 671, 69, 672, 69, 1846, 69, 660, 663,
+ 674, 69, 665, 673, 69, 675, 676, 667, 69, 666,
+ 677, 69, 678, 679, 683, 681, 69, 669, 670, 680,
+ 69, 682, 684, 69, 69, 69, 69, 674, 69, 69,
+
+ 673, 685, 675, 676, 686, 69, 688, 677, 69, 678,
+ 687, 691, 681, 69, 69, 69, 680, 689, 682, 684,
+ 690, 1846, 69, 69, 69, 69, 699, 692, 69, 69,
+ 1846, 137, 706, 688, 69, 700, 1846, 687, 691, 701,
+ 702, 1846, 69, 705, 689, 69, 1846, 690, 703, 1846,
+ 717, 69, 69, 699, 692, 693, 707, 694, 69, 706,
+ 704, 695, 700, 696, 709, 69, 701, 702, 697, 69,
+ 705, 69, 69, 698, 708, 703, 69, 712, 1846, 69,
+ 713, 69, 693, 707, 694, 716, 710, 704, 695, 715,
+ 696, 709, 714, 69, 722, 697, 711, 69, 69, 69,
+
+ 698, 708, 69, 723, 712, 724, 69, 713, 69, 69,
+ 718, 725, 716, 710, 726, 719, 715, 720, 69, 714,
+ 728, 722, 731, 711, 727, 69, 69, 732, 733, 1846,
+ 723, 734, 724, 737, 736, 721, 69, 718, 725, 69,
+ 69, 726, 719, 729, 720, 730, 69, 728, 69, 69,
+ 69, 727, 735, 69, 732, 69, 69, 739, 734, 69,
+ 69, 736, 721, 738, 69, 69, 741, 743, 740, 742,
+ 729, 748, 730, 745, 747, 69, 744, 69, 746, 735,
+ 69, 749, 752, 757, 739, 69, 69, 69, 750, 69,
+ 738, 69, 69, 741, 743, 740, 742, 69, 69, 751,
+
+ 745, 747, 69, 744, 69, 746, 753, 754, 749, 752,
+ 756, 69, 755, 758, 69, 750, 759, 1846, 761, 763,
+ 760, 762, 764, 1846, 765, 767, 751, 69, 69, 69,
+ 69, 69, 69, 753, 754, 69, 69, 756, 766, 755,
+ 758, 770, 768, 69, 69, 761, 763, 69, 762, 764,
+ 69, 765, 767, 769, 771, 775, 772, 774, 777, 69,
+ 773, 776, 778, 69, 779, 766, 69, 69, 770, 768,
+ 1846, 69, 1846, 69, 783, 784, 69, 69, 69, 69,
+ 769, 771, 69, 772, 774, 777, 69, 773, 776, 778,
+ 780, 779, 781, 782, 785, 787, 69, 69, 69, 69,
+
+ 786, 783, 784, 69, 791, 789, 790, 69, 788, 1846,
+ 1846, 69, 792, 1846, 795, 794, 69, 780, 793, 781,
+ 782, 785, 787, 69, 69, 797, 69, 786, 69, 69,
+ 798, 791, 799, 804, 69, 788, 69, 69, 801, 69,
+ 69, 795, 794, 802, 800, 793, 69, 803, 69, 805,
+ 806, 69, 797, 1846, 69, 69, 807, 798, 1846, 799,
+ 808, 812, 809, 810, 69, 801, 813, 811, 815, 69,
+ 802, 800, 69, 69, 803, 69, 69, 806, 69, 69,
+ 69, 816, 819, 807, 814, 69, 69, 808, 812, 809,
+ 810, 817, 818, 813, 811, 815, 69, 821, 820, 822,
+
+ 823, 69, 824, 69, 69, 69, 825, 826, 69, 819,
+ 827, 814, 1846, 828, 829, 69, 69, 830, 817, 818,
+ 69, 69, 69, 69, 821, 820, 822, 823, 69, 824,
+ 69, 832, 833, 825, 826, 69, 834, 827, 831, 69,
+ 828, 829, 836, 835, 830, 837, 69, 839, 69, 838,
+ 69, 845, 840, 69, 69, 69, 841, 69, 832, 833,
+ 69, 69, 69, 834, 843, 831, 842, 844, 846, 836,
+ 835, 69, 837, 847, 839, 849, 838, 69, 69, 840,
+ 848, 69, 69, 841, 850, 69, 851, 69, 853, 856,
+ 852, 843, 69, 842, 844, 846, 69, 69, 855, 69,
+
+ 847, 854, 849, 69, 857, 858, 859, 848, 860, 1846,
+ 867, 850, 861, 865, 69, 853, 856, 69, 862, 863,
+ 864, 868, 69, 1846, 69, 855, 69, 869, 854, 866,
+ 69, 857, 69, 859, 69, 860, 69, 69, 69, 861,
+ 865, 69, 69, 870, 69, 862, 863, 864, 876, 69,
+ 879, 1846, 69, 1846, 869, 1846, 866, 877, 878, 880,
+ 882, 881, 69, 888, 883, 1846, 69, 889, 69, 69,
+ 870, 871, 69, 69, 69, 876, 872, 879, 873, 69,
+ 874, 69, 875, 884, 877, 878, 880, 885, 881, 69,
+ 888, 69, 886, 887, 889, 69, 69, 890, 871, 892,
+
+ 891, 893, 896, 872, 898, 873, 69, 874, 894, 875,
+ 884, 69, 69, 895, 885, 897, 899, 900, 1846, 886,
+ 887, 69, 69, 902, 69, 69, 69, 891, 893, 69,
+ 69, 69, 901, 903, 904, 894, 905, 906, 69, 69,
+ 895, 909, 897, 899, 69, 69, 69, 907, 910, 908,
+ 902, 911, 69, 912, 915, 916, 69, 919, 914, 901,
+ 903, 904, 69, 905, 906, 913, 69, 918, 69, 69,
+ 69, 69, 69, 69, 907, 1846, 908, 925, 911, 69,
+ 917, 915, 69, 69, 69, 914, 922, 69, 69, 920,
+ 923, 924, 913, 69, 918, 921, 927, 929, 69, 926,
+
+ 69, 928, 69, 69, 925, 69, 69, 917, 930, 932,
+ 69, 931, 933, 922, 936, 69, 920, 923, 924, 69,
+ 69, 934, 921, 927, 929, 935, 926, 937, 928, 939,
+ 938, 69, 69, 940, 942, 69, 932, 1846, 931, 933,
+ 941, 936, 69, 943, 944, 69, 69, 946, 1846, 945,
+ 69, 69, 69, 947, 937, 69, 939, 938, 69, 948,
+ 949, 942, 69, 69, 69, 951, 69, 941, 950, 69,
+ 943, 944, 952, 69, 946, 956, 945, 69, 953, 954,
+ 947, 955, 960, 69, 957, 69, 948, 949, 958, 69,
+ 69, 69, 951, 962, 959, 950, 965, 69, 967, 952,
+
+ 69, 961, 956, 69, 69, 953, 954, 964, 955, 960,
+ 69, 957, 963, 69, 69, 958, 966, 968, 69, 969,
+ 962, 959, 970, 971, 69, 967, 972, 69, 961, 69,
+ 1846, 975, 69, 974, 964, 976, 977, 984, 973, 963,
+ 978, 69, 1846, 69, 968, 69, 69, 69, 69, 970,
+ 971, 69, 983, 972, 1846, 979, 980, 981, 69, 991,
+ 974, 982, 69, 69, 69, 973, 985, 69, 69, 69,
+ 986, 69, 987, 69, 69, 990, 989, 988, 69, 983,
+ 69, 69, 979, 980, 981, 69, 991, 992, 982, 69,
+ 994, 993, 1846, 985, 995, 997, 996, 986, 999, 987,
+
+ 1003, 1004, 990, 989, 988, 69, 998, 69, 1006, 69,
+ 1005, 1008, 69, 69, 992, 69, 69, 994, 993, 69,
+ 1846, 995, 997, 996, 69, 999, 1000, 1003, 69, 1007,
+ 1001, 69, 69, 998, 1846, 1006, 69, 1005, 1009, 1010,
+ 1012, 1011, 69, 1002, 1846, 1013, 1014, 69, 1846, 1016,
+ 1015, 69, 1017, 1000, 1846, 1846, 1007, 1001, 1018, 1020,
+ 69, 69, 1022, 1846, 69, 1009, 1010, 69, 1011, 1019,
+ 1002, 69, 69, 69, 69, 69, 1016, 1015, 1021, 1017,
+ 1023, 69, 69, 1024, 1026, 1018, 1020, 69, 1025, 69,
+ 69, 1027, 1030, 69, 1028, 1029, 1019, 1032, 1033, 1031,
+
+ 69, 69, 69, 1846, 1846, 1021, 1034, 1023, 1039, 69,
+ 1024, 1026, 69, 69, 69, 1025, 1038, 69, 1027, 1030,
+ 69, 1028, 1029, 69, 1032, 1033, 1031, 1035, 1036, 1037,
+ 69, 1040, 1041, 1034, 69, 1039, 69, 1042, 1043, 69,
+ 1044, 69, 1045, 1038, 1047, 1046, 69, 69, 1048, 1049,
+ 69, 69, 1054, 1050, 1035, 1036, 1037, 1055, 1051, 1041,
+ 69, 1052, 69, 1056, 69, 1043, 69, 69, 69, 1045,
+ 1057, 1047, 1046, 1053, 69, 1048, 1049, 1059, 1060, 69,
+ 1050, 69, 69, 69, 1055, 1051, 1061, 1058, 1052, 69,
+ 1056, 1063, 69, 1062, 1065, 1066, 1064, 1057, 1069, 69,
+
+ 1053, 69, 69, 69, 1059, 1068, 1067, 1070, 1071, 69,
+ 69, 1846, 69, 1061, 1058, 1072, 69, 69, 1063, 1846,
+ 1062, 1065, 69, 1064, 1073, 69, 69, 69, 1074, 69,
+ 1075, 69, 1068, 1067, 1070, 1071, 1076, 1077, 1081, 1078,
+ 1079, 69, 1072, 1080, 69, 69, 69, 69, 1082, 1083,
+ 69, 1073, 1084, 1085, 1089, 1074, 69, 1075, 1088, 1086,
+ 1090, 69, 1087, 1076, 69, 1081, 1078, 1079, 69, 69,
+ 1080, 69, 1091, 69, 1094, 69, 1083, 69, 1092, 1084,
+ 1085, 1089, 1093, 1095, 1098, 1088, 1086, 69, 1099, 1087,
+ 1100, 69, 69, 69, 1096, 1104, 69, 1097, 1103, 1091,
+
+ 69, 1094, 69, 1105, 1102, 1092, 1101, 69, 69, 1093,
+ 1095, 1098, 69, 69, 69, 1109, 1110, 69, 69, 69,
+ 1106, 1096, 1104, 1108, 1097, 1103, 1107, 69, 69, 1112,
+ 1105, 1102, 69, 1101, 1111, 69, 1846, 1117, 1118, 1120,
+ 1113, 69, 1109, 1110, 1121, 1115, 69, 1106, 1116, 1119,
+ 1108, 69, 69, 1107, 1114, 1122, 1112, 1123, 69, 1124,
+ 1127, 1111, 69, 69, 1117, 69, 69, 1113, 1125, 69,
+ 69, 1121, 1115, 69, 1126, 1116, 1119, 1128, 1131, 69,
+ 1129, 1114, 1122, 1132, 1136, 1130, 1124, 1127, 69, 69,
+ 1133, 69, 69, 69, 69, 1125, 1134, 1135, 1139, 69,
+
+ 1137, 1126, 1142, 69, 1128, 1846, 69, 1129, 1138, 69,
+ 1132, 1136, 1130, 1143, 1140, 1846, 69, 1133, 69, 1141,
+ 69, 1148, 69, 1134, 1135, 1139, 69, 1137, 1144, 69,
+ 69, 69, 1145, 1150, 1146, 1138, 1147, 1151, 1149, 1152,
+ 1143, 1140, 69, 1153, 69, 1154, 1141, 69, 69, 69,
+ 1156, 1155, 69, 69, 1157, 1144, 1158, 1159, 69, 1145,
+ 1150, 1146, 1160, 1147, 1151, 1149, 69, 69, 69, 1163,
+ 1153, 69, 69, 69, 1162, 1161, 1167, 1156, 1155, 69,
+ 69, 69, 1164, 1158, 1159, 1166, 69, 1168, 69, 1160,
+ 69, 69, 69, 1169, 1173, 1165, 1163, 1178, 1170, 1171,
+
+ 69, 1162, 1161, 1167, 69, 1175, 1172, 69, 1174, 1164,
+ 1176, 1177, 1166, 69, 69, 69, 1179, 1180, 1181, 1182,
+ 1184, 69, 1165, 1186, 69, 1170, 1171, 69, 69, 1183,
+ 1193, 69, 69, 1172, 69, 1174, 1185, 69, 1177, 1846,
+ 69, 1197, 1191, 1179, 1846, 1181, 1195, 69, 69, 69,
+ 69, 1187, 1188, 1189, 69, 1199, 1183, 1192, 1190, 69,
+ 1194, 69, 69, 1185, 69, 1196, 69, 69, 69, 1191,
+ 1200, 69, 1201, 1195, 1198, 69, 1202, 69, 1187, 1188,
+ 1189, 69, 1199, 1203, 1192, 1190, 1205, 1194, 1204, 1206,
+ 1207, 69, 1196, 1208, 69, 1209, 69, 1200, 69, 1201,
+
+ 69, 1198, 1211, 1202, 1212, 1214, 69, 69, 1846, 1215,
+ 69, 1213, 1210, 1205, 1216, 1204, 1206, 1207, 69, 69,
+ 1208, 1217, 1209, 69, 69, 69, 1219, 1218, 1221, 1211,
+ 1220, 1222, 1214, 1224, 1846, 69, 69, 69, 1213, 1210,
+ 69, 1223, 69, 1226, 69, 69, 69, 1227, 69, 69,
+ 1225, 69, 1232, 1219, 1218, 1221, 1228, 1220, 1222, 69,
+ 1224, 1229, 1231, 1230, 69, 69, 1233, 1235, 1223, 69,
+ 1226, 1234, 1236, 69, 1227, 1238, 1239, 1225, 69, 69,
+ 69, 1240, 69, 1228, 69, 1241, 1242, 1237, 1229, 1231,
+ 1230, 1243, 69, 1233, 69, 1244, 1245, 1247, 1234, 1236,
+
+ 69, 1246, 1250, 69, 1248, 1249, 69, 69, 1251, 1252,
+ 69, 1253, 69, 69, 1237, 1254, 69, 69, 1243, 69,
+ 69, 1255, 1244, 1256, 1247, 1257, 69, 69, 1246, 1258,
+ 1259, 1248, 1249, 69, 1261, 1251, 69, 1260, 1253, 69,
+ 69, 1263, 1254, 1264, 1262, 1265, 1267, 69, 1255, 1846,
+ 69, 69, 69, 1272, 1266, 69, 1258, 1259, 1268, 69,
+ 69, 1261, 69, 69, 1260, 69, 1269, 69, 1263, 69,
+ 1264, 1262, 1265, 69, 1270, 1273, 69, 1274, 1271, 1275,
+ 1272, 1266, 1278, 69, 69, 1268, 69, 1276, 1281, 1279,
+ 1283, 69, 69, 1269, 1280, 1288, 1284, 69, 1277, 1282,
+
+ 1846, 1270, 1273, 69, 1286, 1271, 1275, 69, 69, 1278,
+ 1285, 69, 69, 69, 1276, 69, 1279, 1283, 1287, 1289,
+ 69, 1280, 69, 1291, 1292, 1277, 1282, 69, 1290, 1294,
+ 69, 1286, 1293, 1295, 1846, 69, 1846, 1285, 69, 69,
+ 1297, 69, 69, 69, 69, 1287, 1289, 1296, 69, 69,
+ 1291, 1292, 1298, 1301, 1299, 1290, 1294, 1302, 1300, 1293,
+ 1295, 69, 69, 1303, 69, 69, 1304, 1297, 1307, 1305,
+ 1306, 1315, 69, 1846, 1296, 69, 1308, 69, 1309, 1298,
+ 1301, 1299, 69, 69, 1302, 1300, 69, 69, 1310, 1311,
+ 1303, 1318, 1312, 1304, 1314, 69, 1305, 1306, 1313, 1325,
+
+ 69, 69, 69, 1308, 1316, 1309, 1317, 69, 1846, 1319,
+ 69, 69, 1321, 69, 69, 1310, 1311, 69, 1318, 1312,
+ 69, 1314, 1320, 1846, 1322, 1313, 69, 1324, 1323, 1328,
+ 69, 1316, 1846, 1317, 69, 69, 1319, 1326, 1327, 69,
+ 69, 1331, 1329, 1332, 69, 1330, 1341, 1333, 1846, 1320,
+ 69, 1322, 1846, 1334, 1324, 1323, 1328, 1335, 69, 69,
+ 69, 69, 69, 69, 1326, 1327, 69, 1336, 1331, 1329,
+ 1332, 1337, 1330, 1341, 1333, 69, 1338, 1846, 69, 69,
+ 1334, 69, 1343, 1339, 1335, 1340, 1342, 69, 69, 1344,
+ 1345, 1346, 1348, 1347, 1336, 1351, 1846, 1350, 1337, 1349,
+
+ 69, 69, 1354, 1338, 69, 1356, 69, 1355, 69, 1343,
+ 1339, 69, 1340, 1342, 1352, 69, 69, 1345, 69, 1348,
+ 1347, 69, 69, 1353, 1350, 69, 1349, 1357, 1358, 69,
+ 69, 1359, 69, 69, 1355, 1360, 1362, 1361, 1364, 1846,
+ 69, 1352, 1363, 69, 69, 1365, 1369, 1370, 1367, 69,
+ 1353, 1846, 1368, 69, 1357, 1358, 1366, 69, 1359, 69,
+ 69, 69, 1371, 69, 1361, 1364, 69, 1846, 69, 1363,
+ 69, 1373, 1365, 1369, 69, 1367, 1372, 1374, 69, 1368,
+ 1376, 1380, 1375, 1366, 69, 69, 1379, 1378, 69, 1371,
+ 69, 1377, 69, 69, 69, 69, 69, 1382, 1373, 1381,
+
+ 1388, 1383, 1384, 1372, 1374, 69, 1385, 1376, 1380, 1375,
+ 1387, 1389, 1392, 1379, 1378, 1393, 69, 1386, 1377, 69,
+ 1390, 1391, 1394, 1396, 69, 69, 1381, 69, 1383, 1384,
+ 1397, 69, 69, 1385, 1398, 69, 69, 1387, 69, 69,
+ 1400, 1401, 69, 1395, 1386, 1399, 1402, 1390, 1391, 69,
+ 69, 69, 1403, 69, 69, 1404, 1405, 69, 1846, 1407,
+ 1406, 69, 69, 1409, 69, 1413, 1411, 1400, 69, 1414,
+ 1395, 1415, 1399, 1402, 1408, 69, 69, 69, 69, 69,
+ 1410, 1412, 1404, 1405, 69, 69, 1407, 1406, 69, 69,
+ 69, 1416, 69, 1411, 1417, 1418, 1414, 1419, 1415, 1420,
+
+ 1424, 1408, 1422, 69, 1426, 69, 69, 1410, 1412, 1421,
+ 69, 1425, 1423, 1428, 1431, 69, 1846, 69, 1416, 69,
+ 1427, 1417, 69, 1429, 1419, 1430, 69, 1424, 69, 1422,
+ 69, 1426, 69, 69, 69, 1432, 1421, 69, 1425, 1423,
+ 1428, 1431, 1433, 1434, 1435, 69, 1437, 1427, 1439, 1436,
+ 1429, 1438, 1430, 69, 1442, 69, 69, 1440, 1445, 1846,
+ 1444, 1846, 1432, 1447, 69, 1441, 69, 69, 1443, 1433,
+ 69, 1435, 1446, 1437, 69, 69, 1436, 69, 1438, 69,
+ 1449, 1442, 69, 69, 1440, 1445, 69, 1444, 1448, 1450,
+ 1447, 1451, 1441, 1452, 69, 1443, 1453, 1454, 1455, 1446,
+
+ 1456, 1846, 1459, 69, 69, 1457, 69, 69, 1460, 1458,
+ 69, 69, 1466, 1846, 1461, 1448, 69, 1846, 1451, 69,
+ 1452, 69, 1463, 1453, 1454, 1455, 69, 1456, 69, 69,
+ 69, 1462, 1457, 69, 1465, 1460, 1458, 1468, 1467, 1464,
+ 1469, 1461, 1470, 69, 69, 69, 69, 1472, 69, 1463,
+ 1471, 1846, 1474, 1475, 1476, 1473, 69, 1477, 1462, 69,
+ 1478, 1465, 69, 1479, 1468, 1467, 1464, 1469, 69, 69,
+ 1480, 1483, 69, 69, 1472, 1481, 69, 1471, 69, 1474,
+ 69, 1476, 1473, 1482, 69, 1485, 69, 69, 69, 1486,
+ 1487, 1484, 1488, 69, 69, 1489, 69, 1480, 1483, 69,
+
+ 69, 1490, 1481, 1491, 69, 1492, 1493, 1494, 69, 1846,
+ 1482, 1496, 1485, 69, 1495, 1497, 69, 1487, 1484, 1498,
+ 69, 1506, 1489, 69, 1499, 1501, 1500, 69, 1490, 1502,
+ 69, 69, 1492, 1493, 1494, 69, 69, 1504, 69, 69,
+ 69, 1495, 69, 1503, 69, 1507, 69, 1505, 69, 1508,
+ 69, 1499, 1501, 1500, 69, 1509, 1502, 1510, 69, 69,
+ 1512, 1517, 69, 69, 1504, 1511, 1513, 1515, 69, 1516,
+ 1503, 69, 1507, 69, 1505, 69, 1508, 1518, 1514, 1846,
+ 1519, 1846, 1509, 69, 1510, 1527, 1521, 1512, 69, 69,
+ 1520, 69, 1511, 1513, 1515, 69, 1516, 69, 1522, 1528,
+
+ 1524, 1523, 1525, 69, 69, 1514, 69, 1519, 69, 69,
+ 1526, 69, 1527, 1521, 1529, 1530, 1535, 1520, 69, 69,
+ 1536, 1531, 1532, 1534, 69, 1522, 69, 1524, 1523, 1525,
+ 1533, 69, 69, 69, 69, 69, 1537, 1526, 1541, 69,
+ 1846, 1529, 1530, 1535, 1538, 1542, 1539, 69, 1531, 1532,
+ 1534, 1540, 69, 69, 1543, 1545, 1544, 1533, 69, 69,
+ 69, 1546, 69, 69, 1547, 1541, 1548, 69, 1549, 1550,
+ 1553, 1538, 1542, 1539, 1551, 69, 69, 1552, 1540, 69,
+ 1554, 1543, 1545, 1544, 1555, 1557, 69, 1558, 69, 1559,
+ 1556, 1547, 69, 1548, 69, 69, 1550, 69, 69, 1562,
+
+ 69, 1551, 1561, 1560, 1552, 1563, 1565, 1554, 69, 1846,
+ 1564, 69, 69, 1567, 69, 69, 1559, 1556, 69, 1566,
+ 69, 69, 1568, 1570, 1569, 69, 1562, 69, 1571, 1561,
+ 1560, 69, 1563, 1565, 1572, 69, 69, 1564, 1846, 1573,
+ 1567, 1574, 1575, 1576, 69, 1577, 1566, 1846, 1578, 1568,
+ 69, 1569, 1579, 1846, 1580, 69, 1585, 69, 1846, 1582,
+ 1583, 69, 1584, 1846, 1846, 69, 1573, 1846, 69, 69,
+ 1576, 69, 69, 1581, 69, 1578, 69, 69, 69, 1579,
+ 69, 1580, 69, 1585, 1586, 69, 1582, 1583, 1587, 1584,
+ 1588, 1589, 1591, 69, 1590, 1592, 1595, 1593, 1594, 1596,
+
+ 1581, 1598, 69, 69, 69, 1846, 69, 69, 69, 69,
+ 69, 1586, 1597, 1599, 1600, 1587, 1601, 1588, 1589, 1591,
+ 69, 1590, 1592, 69, 1593, 1594, 1596, 1603, 69, 1604,
+ 69, 1602, 69, 1606, 69, 1605, 69, 1607, 1611, 1597,
+ 1599, 1600, 69, 1601, 1608, 69, 1609, 69, 1612, 1846,
+ 69, 69, 1610, 1613, 1603, 1615, 1604, 1614, 1602, 69,
+ 1606, 1616, 1605, 1617, 69, 69, 69, 1619, 69, 1620,
+ 1618, 1608, 69, 1609, 1621, 69, 69, 1622, 1623, 1610,
+ 69, 1624, 1615, 1628, 1614, 1632, 1625, 69, 69, 1627,
+ 69, 1626, 69, 69, 1619, 69, 69, 1618, 69, 1629,
+
+ 69, 1621, 69, 69, 1622, 1623, 1630, 69, 1624, 1631,
+ 69, 69, 1632, 1625, 1633, 1635, 1627, 69, 1626, 1634,
+ 1636, 1637, 69, 1641, 1644, 69, 1629, 69, 1639, 1642,
+ 69, 1638, 1640, 1630, 1643, 69, 1631, 69, 1648, 69,
+ 69, 1633, 1635, 69, 1645, 1646, 1634, 1636, 1637, 69,
+ 69, 69, 1647, 69, 1649, 1639, 1642, 1650, 1638, 1640,
+ 1651, 1643, 1652, 69, 69, 69, 1654, 69, 69, 1655,
+ 1657, 1645, 1646, 1656, 1653, 69, 69, 69, 69, 1647,
+ 1658, 1649, 1660, 1659, 1650, 1666, 1664, 1651, 69, 1652,
+ 69, 69, 69, 1654, 1662, 69, 1655, 1657, 69, 1661,
+
+ 1656, 1653, 1663, 1668, 1665, 69, 69, 1658, 1669, 1670,
+ 1659, 69, 69, 69, 1667, 69, 69, 69, 1675, 1671,
+ 1673, 1662, 69, 1672, 1674, 1677, 1661, 1679, 69, 1663,
+ 1668, 1665, 69, 1680, 69, 69, 1670, 69, 1676, 69,
+ 69, 1667, 1681, 69, 1684, 1675, 1671, 1673, 1678, 1683,
+ 1672, 1674, 69, 69, 69, 69, 69, 1682, 1686, 1685,
+ 1680, 1687, 1688, 69, 69, 1676, 1689, 1690, 1692, 69,
+ 69, 1684, 69, 1691, 69, 1678, 1683, 1693, 1695, 1696,
+ 69, 1698, 69, 1694, 1682, 1686, 1685, 1701, 69, 69,
+ 69, 1697, 69, 1689, 1690, 69, 1702, 1699, 1700, 69,
+
+ 1691, 69, 69, 1703, 1693, 1695, 1696, 69, 1705, 1704,
+ 1694, 69, 69, 1707, 69, 1706, 1708, 1709, 1697, 1710,
+ 1711, 69, 1712, 69, 1699, 1700, 1713, 1716, 1717, 1719,
+ 1703, 69, 1714, 1715, 1846, 1705, 1704, 69, 1718, 1720,
+ 69, 69, 1706, 69, 69, 69, 1710, 69, 69, 1712,
+ 69, 69, 1721, 69, 69, 1717, 69, 69, 1722, 1714,
+ 1715, 69, 1723, 1724, 1725, 1718, 1720, 1726, 1727, 1731,
+ 1728, 1729, 69, 69, 69, 69, 69, 69, 1732, 1721,
+ 1730, 69, 1734, 1733, 1846, 1722, 1736, 69, 1735, 1723,
+ 1724, 1725, 1738, 69, 1726, 1727, 69, 1728, 1729, 1737,
+
+ 1741, 1742, 1739, 1743, 1846, 69, 69, 1730, 1740, 69,
+ 1733, 69, 69, 69, 69, 1735, 1744, 69, 69, 69,
+ 1745, 1750, 1747, 1748, 1751, 69, 1737, 69, 69, 1739,
+ 1743, 1746, 69, 1749, 1752, 1740, 1753, 69, 1754, 1846,
+ 1755, 69, 1758, 1744, 69, 69, 1756, 1745, 69, 1747,
+ 1748, 69, 1757, 69, 1759, 69, 1846, 1763, 1746, 1761,
+ 1749, 69, 1846, 69, 1760, 1754, 69, 1755, 69, 1758,
+ 69, 1762, 69, 1756, 1765, 1766, 69, 1772, 1764, 1767,
+ 69, 1759, 69, 69, 1763, 69, 1761, 69, 1768, 69,
+ 69, 1760, 1769, 1770, 1773, 69, 1771, 69, 1762, 1774,
+
+ 1775, 1765, 1766, 69, 69, 1764, 1767, 1776, 69, 1777,
+ 1779, 69, 69, 1778, 1783, 1768, 1781, 1780, 1784, 1769,
+ 1770, 1773, 69, 1771, 1782, 69, 69, 1775, 69, 69,
+ 69, 1787, 69, 1785, 1776, 1788, 1777, 1793, 1786, 69,
+ 1778, 69, 1789, 1781, 1780, 69, 69, 1790, 69, 69,
+ 69, 1782, 69, 1791, 1794, 1792, 1801, 1796, 1787, 69,
+ 1785, 69, 1788, 69, 1793, 1786, 1797, 69, 1798, 1789,
+ 1795, 1800, 1799, 1802, 1790, 1806, 69, 1846, 69, 69,
+ 1791, 1794, 1792, 69, 1796, 1803, 1809, 69, 69, 1808,
+ 69, 1846, 1846, 1797, 69, 1798, 1804, 1795, 1800, 1799,
+
+ 69, 1805, 1807, 69, 69, 69, 69, 1810, 69, 69,
+ 69, 1811, 1803, 1809, 1813, 69, 1808, 1812, 1815, 69,
+ 1814, 1846, 1816, 1804, 1817, 1846, 69, 1820, 1805, 1807,
+ 1818, 69, 1821, 1819, 1810, 69, 1822, 1846, 1811, 1846,
+ 69, 1813, 69, 1825, 1812, 1815, 1823, 1814, 69, 1816,
+ 69, 1817, 69, 69, 1820, 1827, 69, 1818, 1828, 69,
+ 1819, 1824, 1835, 1822, 1826, 69, 69, 1829, 1830, 69,
+ 1825, 1831, 69, 1823, 1834, 69, 69, 69, 1832, 1833,
+ 69, 1837, 1827, 1836, 1838, 1828, 69, 69, 1824, 69,
+ 1846, 1826, 1839, 1840, 1829, 1830, 1841, 69, 1831, 1842,
+
+ 69, 1834, 1844, 69, 1845, 1832, 1833, 69, 69, 1843,
+ 1836, 69, 69, 1846, 1846, 69, 1846, 69, 69, 1839,
+ 1840, 1846, 1846, 1841, 1846, 1846, 1842, 1846, 1846, 69,
+ 1846, 69, 1846, 1846, 1846, 1846, 1843, 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, 1846, 72, 72, 72, 72, 127,
+ 127, 1846, 1846, 1846, 127, 127, 129, 129, 1846, 1846,
+ 129, 1846, 129, 131, 1846, 1846, 1846, 1846, 1846, 131,
+
+ 134, 134, 1846, 1846, 1846, 134, 134, 136, 1846, 1846,
+ 1846, 1846, 1846, 136, 138, 138, 1846, 138, 138, 138,
+ 138, 73, 73, 1846, 73, 73, 73, 73, 13, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846
+
} ;
-static yyconst flex_int16_t yy_chk[5277] =
+static yyconst flex_int16_t yy_chk[5395] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -1620,15 +1661,15 @@ static yyconst flex_int16_t yy_chk[5277] =
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, 24, 6, 7, 7,
- 7, 7, 1805, 7, 8, 8, 8, 8, 24, 8,
+ 7, 7, 1852, 7, 8, 8, 8, 8, 24, 8,
9, 9, 9, 10, 10, 10, 15, 45, 45, 50,
15, 3, 50, 24, 4, 61, 61, 5, 19, 6,
- 19, 19, 70, 19, 669, 7, 70, 40, 19, 40,
- 40, 8, 40, 23, 20, 20, 9, 40, 663, 10,
+ 19, 19, 70, 19, 686, 7, 70, 40, 19, 40,
+ 40, 8, 40, 23, 20, 20, 9, 40, 680, 10,
11, 11, 11, 11, 11, 11, 12, 12, 12, 12,
12, 12, 20, 23, 27, 19, 23, 29, 20, 11,
- 23, 20, 20, 136, 21, 12, 27, 25, 663, 29,
+ 23, 20, 20, 136, 21, 12, 27, 25, 680, 29,
134, 21, 34, 94, 28, 25, 133, 11, 21, 20,
23, 27, 131, 12, 29, 34, 11, 128, 128, 129,
21, 21, 12, 25, 25, 76, 28, 26, 21, 34,
@@ -1640,558 +1681,572 @@ static yyconst flex_int16_t yy_chk[5277] =
22, 79, 22, 22, 30, 31, 31, 35, 30, 75,
31, 35, 75, 83, 68, 37, 62, 37, 77, 79,
57, 35, 52, 38, 35, 77, 31, 33, 38, 51,
- 90, 33, 37, 35, 35, 247, 38, 33, 35, 39,
+ 90, 33, 37, 35, 35, 252, 38, 33, 35, 39,
33, 37, 37, 39, 37, 77, 36, 33, 35, 33,
38, 35, 46, 90, 33, 38, 36, 90, 33, 37,
- 36, 36, 247, 66, 33, 39, 39, 33, 36, 130,
+ 36, 36, 252, 66, 33, 39, 39, 33, 36, 130,
39, 41, 130, 36, 33, 56, 66, 56, 56, 64,
56, 64, 64, 36, 64, 135, 135, 36, 36, 67,
66, 67, 67, 69, 67, 69, 69, 72, 69, 72,
- 72, 78, 72, 69, 80, 81, 82, 72, 86, 85,
- 84, 14, 87, 13, 78, 82, 64, 80, 84, 87,
- 81, 86, 91, 215, 0, 78, 85, 88, 78, 89,
- 92, 80, 81, 82, 72, 86, 88, 84, 89, 87,
- 85, 78, 93, 92, 91, 93, 0, 95, 96, 91,
- 99, 101, 215, 85, 88, 95, 89, 92, 93, 93,
- 97, 103, 98, 99, 97, 98, 93, 100, 96, 93,
-
- 96, 101, 93, 105, 95, 96, 107, 99, 101, 102,
- 105, 103, 104, 106, 97, 93, 93, 97, 103, 98,
- 100, 97, 106, 102, 100, 96, 104, 109, 108, 107,
- 105, 109, 113, 107, 110, 112, 102, 108, 111, 104,
- 106, 110, 112, 115, 114, 117, 113, 122, 116, 109,
- 142, 115, 118, 122, 109, 108, 114, 116, 109, 113,
- 119, 110, 112, 120, 111, 111, 121, 118, 125, 124,
- 115, 114, 120, 123, 122, 116, 117, 121, 0, 118,
- 119, 142, 0, 125, 0, 0, 119, 119, 126, 140,
- 120, 124, 253, 121, 123, 125, 124, 126, 123, 132,
-
- 123, 132, 132, 137, 132, 137, 137, 119, 137, 138,
- 141, 138, 138, 140, 138, 126, 140, 143, 145, 253,
- 144, 123, 146, 147, 150, 153, 145, 0, 148, 143,
- 147, 149, 141, 148, 146, 151, 0, 141, 0, 144,
- 154, 0, 155, 157, 143, 145, 138, 144, 154, 146,
- 147, 153, 153, 149, 158, 150, 151, 0, 149, 148,
- 148, 156, 0, 151, 155, 156, 157, 154, 160, 155,
- 157, 163, 159, 0, 0, 161, 158, 162, 161, 0,
- 160, 158, 168, 151, 152, 159, 162, 164, 156, 152,
- 161, 165, 0, 163, 152, 160, 166, 167, 163, 159,
-
- 152, 152, 161, 166, 162, 161, 169, 152, 167, 164,
- 165, 152, 170, 168, 164, 171, 152, 165, 165, 174,
- 172, 152, 170, 166, 167, 173, 175, 152, 152, 176,
- 177, 173, 169, 169, 0, 178, 180, 165, 172, 0,
- 179, 0, 0, 170, 181, 182, 171, 172, 175, 170,
- 174, 181, 173, 175, 179, 178, 184, 180, 186, 183,
- 176, 177, 178, 180, 183, 185, 182, 179, 189, 187,
- 188, 181, 182, 190, 192, 184, 194, 188, 190, 185,
- 186, 187, 193, 184, 195, 186, 183, 196, 200, 193,
- 189, 201, 185, 191, 191, 189, 187, 188, 197, 198,
-
- 190, 194, 191, 194, 195, 192, 197, 199, 203, 193,
- 200, 195, 205, 202, 198, 206, 204, 208, 196, 200,
- 191, 191, 201, 203, 204, 197, 198, 207, 211, 209,
- 202, 205, 214, 199, 199, 203, 210, 200, 202, 205,
- 202, 209, 212, 204, 212, 210, 206, 211, 208, 207,
- 213, 223, 216, 218, 207, 211, 209, 202, 214, 214,
- 217, 219, 0, 210, 218, 220, 222, 221, 224, 212,
- 225, 227, 0, 219, 213, 0, 226, 213, 216, 216,
- 218, 224, 223, 232, 222, 235, 217, 217, 219, 220,
- 221, 229, 220, 222, 221, 224, 225, 225, 226, 228,
-
- 229, 230, 227, 226, 234, 231, 228, 230, 235, 232,
- 232, 233, 235, 234, 236, 237, 238, 0, 229, 231,
- 0, 239, 240, 236, 241, 242, 228, 241, 230, 245,
- 237, 234, 231, 243, 241, 233, 244, 240, 233, 243,
- 248, 236, 237, 242, 245, 239, 254, 238, 239, 240,
- 244, 241, 242, 250, 241, 0, 245, 246, 246, 249,
- 243, 251, 249, 244, 248, 250, 255, 248, 254, 249,
- 259, 256, 252, 254, 257, 260, 258, 259, 262, 251,
- 250, 0, 246, 256, 246, 246, 249, 261, 251, 249,
- 252, 258, 255, 255, 261, 264, 257, 259, 256, 252,
-
- 262, 257, 263, 258, 263, 262, 260, 265, 264, 266,
- 265, 267, 265, 268, 261, 282, 269, 273, 265, 0,
- 271, 270, 264, 0, 269, 272, 263, 266, 270, 263,
- 269, 263, 271, 273, 265, 268, 266, 265, 272, 265,
- 268, 273, 267, 269, 273, 274, 282, 271, 270, 276,
- 277, 269, 272, 278, 279, 280, 0, 281, 274, 278,
- 273, 276, 279, 287, 281, 283, 285, 280, 277, 283,
- 0, 290, 274, 275, 275, 0, 276, 277, 285, 286,
- 278, 279, 280, 275, 281, 275, 275, 275, 284, 288,
- 275, 286, 283, 285, 287, 284, 288, 291, 275, 292,
-
- 275, 275, 290, 298, 294, 289, 286, 0, 291, 307,
- 275, 294, 275, 275, 275, 284, 288, 275, 289, 293,
- 293, 292, 295, 296, 291, 297, 292, 300, 298, 301,
- 298, 294, 289, 295, 296, 299, 300, 0, 297, 303,
- 307, 304, 301, 306, 305, 308, 302, 0, 293, 295,
- 296, 308, 297, 309, 300, 310, 301, 303, 299, 302,
- 0, 306, 299, 304, 302, 311, 303, 305, 304, 313,
- 306, 305, 308, 302, 309, 312, 315, 314, 310, 316,
- 309, 317, 310, 313, 0, 316, 302, 319, 0, 320,
- 318, 311, 311, 0, 322, 328, 313, 312, 321, 317,
-
- 322, 323, 312, 314, 314, 318, 316, 315, 317, 325,
- 319, 327, 326, 328, 319, 320, 320, 318, 326, 329,
- 321, 322, 328, 335, 332, 321, 329, 323, 323, 330,
- 327, 332, 334, 333, 336, 325, 325, 373, 327, 326,
- 333, 337, 339, 338, 330, 334, 329, 342, 340, 343,
- 341, 332, 336, 342, 335, 341, 330, 340, 345, 334,
- 333, 336, 338, 337, 373, 353, 344, 356, 337, 356,
- 338, 346, 343, 339, 342, 340, 343, 341, 344, 347,
- 345, 349, 346, 350, 351, 345, 0, 347, 349, 353,
- 352, 350, 353, 344, 356, 351, 354, 358, 346, 352,
-
- 0, 355, 359, 354, 357, 0, 347, 348, 349, 358,
- 350, 351, 348, 360, 348, 362, 368, 359, 0, 364,
- 362, 352, 348, 354, 358, 360, 352, 355, 355, 359,
- 357, 357, 348, 348, 348, 361, 363, 364, 366, 348,
- 360, 348, 362, 361, 365, 367, 364, 368, 370, 348,
- 366, 369, 365, 371, 372, 374, 0, 370, 363, 348,
- 376, 375, 361, 363, 384, 366, 369, 371, 367, 378,
- 374, 365, 367, 372, 377, 370, 375, 381, 369, 380,
- 371, 372, 374, 380, 376, 382, 377, 376, 375, 379,
- 383, 381, 379, 378, 385, 384, 378, 386, 387, 388,
-
- 379, 377, 391, 389, 381, 388, 0, 394, 390, 392,
- 380, 0, 382, 395, 394, 393, 379, 383, 396, 379,
- 0, 385, 403, 400, 386, 389, 388, 0, 397, 387,
- 389, 390, 392, 391, 394, 390, 392, 393, 398, 399,
- 396, 397, 393, 398, 395, 396, 402, 398, 399, 400,
- 400, 401, 405, 403, 404, 397, 0, 0, 407, 402,
- 401, 406, 398, 408, 409, 398, 399, 0, 412, 414,
- 398, 410, 404, 402, 398, 419, 405, 408, 401, 405,
- 407, 404, 410, 406, 406, 407, 409, 411, 406, 416,
- 408, 409, 413, 414, 415, 417, 414, 0, 410, 412,
-
- 421, 420, 411, 422, 417, 423, 419, 418, 0, 423,
- 406, 416, 424, 413, 411, 425, 416, 426, 415, 413,
- 418, 415, 417, 420, 421, 422, 424, 421, 420, 425,
- 422, 427, 428, 429, 418, 430, 423, 429, 431, 424,
- 0, 432, 425, 433, 434, 440, 431, 428, 426, 427,
- 436, 438, 433, 434, 440, 435, 428, 436, 427, 428,
- 430, 437, 430, 435, 429, 431, 432, 439, 432, 438,
- 433, 434, 440, 441, 428, 442, 445, 436, 438, 439,
- 447, 443, 435, 444, 437, 441, 446, 449, 437, 443,
- 448, 444, 0, 450, 439, 452, 447, 451, 449, 453,
-
- 441, 450, 445, 445, 468, 454, 442, 447, 443, 446,
- 444, 451, 448, 446, 449, 452, 455, 448, 456, 457,
- 450, 453, 452, 459, 451, 454, 453, 458, 457, 460,
- 461, 462, 454, 464, 0, 468, 463, 0, 455, 464,
- 456, 459, 460, 455, 466, 456, 457, 458, 472, 469,
- 459, 470, 461, 465, 458, 462, 460, 461, 462, 463,
- 464, 465, 466, 463, 471, 473, 470, 472, 474, 0,
- 474, 466, 469, 471, 473, 472, 469, 477, 470, 465,
- 465, 483, 485, 486, 480, 484, 0, 0, 465, 477,
- 492, 471, 473, 488, 480, 474, 475, 0, 489, 483,
-
- 475, 508, 491, 475, 477, 485, 484, 489, 483, 485,
- 475, 480, 484, 475, 486, 488, 493, 492, 475, 490,
- 488, 490, 494, 475, 496, 489, 491, 475, 508, 491,
- 475, 0, 0, 495, 497, 0, 493, 475, 498, 0,
- 475, 487, 487, 493, 487, 495, 490, 487, 494, 494,
- 496, 496, 487, 499, 503, 500, 497, 501, 487, 487,
- 495, 497, 498, 500, 501, 498, 504, 487, 487, 487,
- 502, 487, 507, 503, 487, 499, 505, 509, 502, 487,
- 499, 503, 500, 511, 501, 487, 487, 506, 505, 510,
- 512, 516, 504, 504, 507, 515, 506, 502, 0, 507,
-
- 513, 518, 514, 505, 515, 517, 519, 511, 509, 518,
- 511, 512, 520, 516, 506, 521, 522, 512, 516, 513,
- 510, 514, 515, 524, 522, 517, 525, 513, 518, 514,
- 526, 520, 517, 519, 527, 0, 528, 529, 533, 520,
- 0, 524, 0, 522, 525, 0, 521, 527, 530, 529,
- 524, 0, 532, 525, 526, 539, 530, 526, 532, 535,
- 533, 527, 528, 528, 529, 533, 535, 534, 545, 536,
- 537, 538, 530, 534, 536, 530, 540, 537, 539, 532,
- 541, 542, 539, 530, 544, 540, 535, 543, 541, 538,
- 548, 547, 549, 550, 534, 545, 536, 537, 538, 542,
-
- 543, 556, 546, 540, 547, 544, 553, 541, 542, 546,
- 555, 544, 552, 554, 543, 558, 550, 551, 547, 554,
- 550, 548, 557, 549, 558, 551, 560, 552, 553, 546,
- 0, 559, 556, 553, 561, 562, 555, 555, 563, 552,
- 554, 561, 558, 564, 551, 559, 557, 567, 565, 557,
- 567, 566, 572, 568, 571, 564, 569, 560, 559, 566,
- 574, 561, 562, 569, 572, 563, 568, 573, 0, 573,
- 564, 565, 574, 575, 567, 565, 576, 571, 566, 572,
- 568, 571, 578, 569, 570, 577, 570, 574, 581, 576,
- 570, 0, 570, 583, 573, 575, 580, 570, 577, 583,
-
- 575, 582, 570, 576, 579, 578, 580, 586, 570, 578,
- 581, 570, 577, 570, 582, 581, 579, 570, 580, 570,
- 583, 584, 585, 580, 570, 587, 588, 590, 582, 570,
- 587, 579, 587, 580, 584, 592, 589, 0, 586, 596,
- 590, 588, 593, 585, 597, 591, 594, 596, 584, 585,
- 587, 587, 587, 588, 590, 595, 598, 587, 589, 587,
- 591, 592, 592, 589, 593, 594, 596, 600, 595, 593,
- 601, 597, 591, 594, 603, 604, 602, 587, 605, 598,
- 607, 606, 595, 598, 602, 609, 608, 610, 603, 606,
- 614, 607, 611, 609, 601, 619, 624, 601, 600, 611,
-
- 605, 603, 612, 602, 608, 605, 604, 607, 606, 610,
- 613, 617, 609, 608, 610, 612, 616, 619, 618, 611,
- 617, 614, 619, 622, 616, 620, 621, 624, 613, 612,
- 618, 623, 625, 0, 0, 627, 629, 613, 617, 627,
- 641, 622, 630, 616, 0, 618, 625, 620, 621, 631,
- 622, 628, 620, 621, 628, 630, 631, 623, 623, 625,
- 629, 632, 634, 629, 633, 636, 627, 641, 635, 630,
- 0, 633, 637, 632, 635, 638, 631, 628, 628, 639,
- 640, 628, 642, 0, 643, 0, 634, 636, 632, 634,
- 639, 633, 636, 643, 637, 635, 638, 644, 649, 637,
-
- 642, 640, 638, 645, 648, 646, 639, 640, 647, 642,
- 652, 643, 645, 646, 650, 647, 653, 654, 648, 652,
- 649, 644, 656, 655, 644, 649, 657, 658, 659, 0,
- 645, 648, 646, 654, 660, 647, 650, 652, 655, 658,
- 653, 650, 660, 653, 654, 661, 665, 662, 666, 673,
- 655, 664, 674, 656, 658, 659, 666, 657, 661, 671,
- 664, 660, 662, 667, 665, 667, 670, 675, 677, 672,
- 676, 671, 661, 665, 662, 666, 672, 679, 664, 670,
- 673, 677, 0, 674, 684, 678, 671, 0, 680, 675,
- 667, 682, 676, 670, 675, 677, 672, 676, 678, 679,
-
- 680, 681, 683, 682, 679, 685, 686, 0, 688, 681,
- 683, 684, 678, 687, 685, 680, 689, 690, 682, 695,
- 687, 692, 693, 691, 694, 0, 0, 686, 681, 683,
- 697, 693, 685, 686, 688, 688, 691, 690, 689, 696,
- 687, 695, 694, 689, 690, 692, 695, 696, 692, 693,
- 691, 694, 697, 698, 699, 700, 701, 697, 702, 703,
- 704, 698, 710, 705, 709, 707, 696, 708, 701, 710,
- 702, 705, 706, 700, 707, 704, 709, 699, 706, 703,
- 698, 699, 700, 701, 711, 702, 703, 704, 708, 710,
- 705, 709, 707, 713, 708, 714, 715, 0, 716, 706,
-
- 0, 718, 711, 719, 717, 716, 720, 719, 714, 721,
- 724, 711, 723, 722, 720, 715, 718, 725, 0, 728,
- 726, 733, 714, 715, 713, 716, 717, 722, 718, 727,
- 723, 717, 729, 720, 719, 721, 721, 734, 730, 723,
- 722, 724, 726, 725, 725, 728, 728, 726, 731, 732,
- 729, 727, 733, 0, 739, 735, 727, 736, 732, 729,
- 730, 731, 738, 0, 741, 730, 742, 745, 734, 0,
- 739, 745, 0, 746, 743, 731, 732, 735, 742, 744,
- 736, 739, 735, 743, 736, 737, 746, 741, 738, 738,
- 737, 741, 737, 742, 737, 748, 737, 744, 745, 747,
-
- 746, 743, 749, 737, 750, 752, 744, 747, 751, 754,
- 751, 757, 737, 750, 748, 749, 753, 737, 756, 737,
- 0, 737, 748, 737, 759, 761, 747, 760, 753, 749,
- 763, 750, 752, 757, 760, 751, 754, 762, 757, 758,
- 765, 764, 756, 753, 766, 756, 769, 758, 764, 768,
- 767, 759, 761, 770, 760, 769, 773, 763, 771, 762,
- 774, 775, 765, 766, 762, 776, 758, 765, 764, 783,
- 0, 766, 767, 769, 770, 768, 768, 767, 771, 777,
- 770, 778, 779, 775, 780, 771, 781, 773, 775, 778,
- 782, 774, 786, 781, 782, 785, 776, 777, 779, 784,
-
- 783, 787, 785, 788, 0, 784, 777, 786, 778, 779,
- 787, 780, 784, 781, 789, 791, 790, 782, 790, 786,
- 0, 789, 785, 792, 791, 794, 784, 793, 787, 788,
- 788, 793, 784, 796, 799, 797, 798, 796, 800, 801,
- 0, 789, 791, 790, 802, 792, 0, 794, 0, 804,
- 792, 800, 794, 797, 793, 798, 803, 804, 807, 799,
- 0, 799, 797, 798, 796, 800, 806, 802, 805, 805,
- 801, 802, 803, 808, 809, 806, 804, 811, 813, 810,
- 807, 809, 808, 803, 812, 807, 811, 814, 817, 816,
- 819, 813, 812, 806, 820, 805, 815, 816, 818, 814,
-
- 808, 809, 810, 820, 811, 813, 810, 822, 815, 821,
- 817, 812, 819, 825, 814, 817, 816, 819, 818, 822,
- 823, 820, 824, 815, 826, 818, 827, 821, 824, 831,
- 0, 0, 828, 832, 822, 825, 821, 829, 834, 833,
- 825, 823, 832, 837, 835, 838, 836, 823, 842, 824,
- 836, 834, 835, 838, 839, 826, 831, 827, 828, 828,
- 832, 833, 839, 829, 829, 834, 833, 840, 840, 842,
- 837, 835, 838, 843, 841, 842, 844, 836, 845, 846,
- 847, 839, 841, 848, 844, 849, 845, 846, 847, 851,
- 850, 849, 0, 853, 840, 852, 848, 856, 0, 854,
-
- 855, 841, 850, 844, 843, 845, 846, 847, 853, 862,
- 848, 856, 849, 857, 858, 851, 851, 850, 866, 852,
- 853, 854, 852, 855, 856, 859, 854, 855, 858, 859,
- 861, 857, 863, 870, 868, 864, 862, 861, 865, 874,
- 857, 858, 859, 868, 871, 865, 872, 876, 878, 866,
- 859, 880, 859, 879, 863, 870, 859, 861, 864, 863,
- 870, 868, 864, 880, 884, 865, 874, 883, 885, 859,
- 871, 871, 878, 882, 876, 878, 884, 872, 880, 879,
- 879, 881, 888, 881, 887, 886, 882, 888, 889, 883,
- 890, 884, 886, 891, 883, 885, 892, 894, 0, 896,
-
- 882, 891, 0, 895, 889, 897, 894, 898, 881, 888,
- 887, 887, 886, 890, 898, 889, 895, 890, 892, 900,
- 891, 899, 901, 892, 894, 896, 896, 897, 899, 901,
- 895, 902, 897, 903, 898, 904, 905, 900, 906, 916,
- 907, 908, 0, 905, 909, 0, 900, 911, 899, 901,
- 911, 912, 914, 907, 0, 903, 902, 913, 902, 914,
- 903, 915, 918, 905, 915, 909, 904, 907, 908, 906,
- 916, 909, 913, 917, 911, 919, 915, 912, 912, 914,
- 918, 920, 921, 920, 913, 915, 922, 923, 915, 918,
- 928, 915, 924, 927, 0, 917, 925, 919, 926, 931,
-
- 917, 924, 919, 915, 925, 926, 921, 929, 920, 921,
- 930, 929, 952, 923, 923, 927, 932, 922, 933, 924,
- 927, 928, 934, 925, 935, 926, 931, 933, 936, 934,
- 938, 935, 930, 937, 929, 939, 0, 930, 932, 952,
- 940, 936, 945, 932, 938, 933, 941, 940, 937, 934,
- 942, 935, 943, 941, 947, 936, 946, 938, 943, 949,
- 937, 953, 948, 942, 945, 948, 939, 940, 946, 945,
- 949, 954, 956, 941, 947, 960, 955, 942, 959, 943,
- 948, 947, 961, 946, 962, 953, 949, 955, 953, 948,
- 956, 962, 948, 954, 957, 965, 959, 958, 954, 956,
-
- 958, 964, 957, 955, 963, 959, 960, 969, 965, 961,
- 964, 962, 966, 973, 967, 958, 969, 968, 963, 968,
- 970, 957, 965, 966, 958, 971, 0, 958, 964, 967,
- 972, 963, 0, 0, 969, 973, 971, 974, 0, 966,
- 973, 967, 975, 978, 968, 975, 970, 970, 972, 976,
- 979, 974, 971, 980, 981, 982, 983, 972, 976, 979,
- 975, 985, 982, 974, 974, 984, 989, 985, 992, 975,
- 988, 0, 975, 0, 978, 981, 976, 979, 974, 984,
- 989, 981, 982, 991, 980, 985, 990, 983, 985, 988,
- 993, 991, 984, 989, 985, 990, 994, 988, 997, 992,
-
- 996, 993, 998, 0, 999, 994, 1000, 996, 1003, 1004,
- 991, 1002, 1001, 990, 1006, 1002, 1010, 993, 0, 1005,
- 1003, 997, 1007, 994, 998, 997, 999, 996, 1000, 998,
- 1001, 999, 1005, 1000, 1006, 1003, 1004, 1007, 1002, 1001,
- 1008, 1006, 1009, 1011, 1012, 1013, 1005, 1010, 1014, 1007,
- 1009, 1016, 1015, 1012, 1019, 1008, 1018, 0, 1011, 0,
- 1021, 1024, 1020, 1025, 0, 1023, 1013, 1008, 1022, 1009,
- 1011, 1012, 1013, 1024, 1018, 1014, 1015, 1020, 1016, 1015,
- 1023, 1019, 1021, 1018, 1026, 1025, 1022, 1021, 1024, 1020,
- 1025, 1027, 1023, 1028, 1029, 1022, 1030, 1026, 1027, 1033,
-
- 0, 1031, 1026, 1034, 1032, 1028, 1033, 1031, 1035, 1036,
- 1037, 1026, 1032, 1039, 1040, 1035, 1038, 1042, 1027, 1046,
- 1028, 1029, 1044, 1043, 1026, 1047, 1033, 1030, 1031, 1048,
- 1034, 1032, 1043, 0, 0, 1035, 1036, 1037, 1040, 1038,
- 1045, 1040, 1045, 1038, 1039, 1052, 1046, 0, 1042, 0,
- 1043, 1047, 1047, 1044, 1049, 1049, 1049, 1050, 1051, 1053,
- 1048, 1049, 1054, 1056, 1050, 1051, 1053, 1045, 1055, 1049,
- 1057, 1057, 1058, 1059, 1055, 1054, 1052, 1062, 1061, 1063,
- 1059, 1049, 1049, 1049, 1050, 1051, 1053, 1064, 1049, 1054,
- 1056, 1063, 1065, 1066, 1066, 1055, 1061, 1057, 1058, 1058,
-
- 1059, 1067, 1068, 1068, 1062, 1061, 1063, 1064, 1071, 1072,
- 1065, 1069, 1074, 1075, 1064, 1076, 1073, 0, 1077, 1065,
- 1066, 1082, 1069, 1073, 1079, 1078, 1080, 1067, 1067, 1068,
- 1071, 1083, 1074, 1080, 1086, 1071, 1082, 0, 1069, 1074,
- 1072, 1081, 1079, 1073, 1075, 1077, 1076, 1078, 1082, 1081,
- 1084, 1079, 1078, 1080, 1087, 1083, 1085, 1085, 1083, 1084,
- 1086, 1086, 1088, 1089, 1090, 1092, 1087, 1094, 1081, 1091,
- 1088, 1097, 1095, 1096, 1098, 1089, 1099, 1084, 1095, 1093,
- 1099, 1087, 1100, 1085, 1093, 1090, 1096, 1091, 1102, 1088,
- 1089, 1090, 1092, 1104, 1094, 1093, 1091, 1101, 1101, 1095,
-
- 1096, 1098, 1097, 1102, 1103, 1105, 1093, 1099, 1104, 1108,
- 1106, 1093, 1107, 1100, 1107, 1102, 1109, 1110, 1111, 0,
- 1104, 1109, 1113, 1115, 1101, 1106, 1114, 1116, 1105, 1117,
- 1118, 0, 1105, 1111, 1120, 1103, 1117, 1106, 1119, 1107,
- 1108, 1121, 1123, 1109, 1128, 1111, 1113, 1125, 1110, 1113,
- 1115, 1118, 1114, 1114, 1116, 1120, 1117, 1118, 1127, 1121,
- 1119, 1120, 1125, 1129, 1123, 1119, 1130, 1131, 1121, 1123,
- 1129, 1128, 1132, 1127, 1125, 1133, 1131, 1135, 1134, 1136,
- 1132, 0, 1139, 1140, 1130, 1127, 1138, 1143, 1148, 1141,
- 1129, 1139, 1136, 1130, 1131, 0, 1150, 1138, 1133, 1132,
-
- 1134, 1140, 1133, 1146, 1147, 1134, 1136, 1141, 1135, 1139,
- 1140, 1149, 1138, 1138, 1143, 1146, 1141, 1147, 1151, 1148,
- 1152, 1149, 1150, 1150, 1138, 1155, 1154, 0, 1156, 1158,
- 1146, 1147, 1155, 1157, 1159, 1158, 1162, 1162, 1149, 0,
- 0, 1164, 1160, 1151, 1161, 1151, 1154, 1152, 1164, 1159,
- 1163, 1157, 1155, 1154, 1156, 1156, 1158, 1160, 1165, 1161,
- 1157, 1159, 1163, 1162, 1167, 1165, 1169, 1168, 1164, 1160,
- 1170, 1161, 1173, 1175, 1172, 1169, 1177, 1163, 1174, 1174,
- 1178, 1176, 1180, 1181, 0, 1165, 1167, 1172, 1170, 1180,
- 1182, 1167, 1168, 1169, 1168, 1175, 1183, 1170, 1177, 1173,
-
- 1175, 1172, 1178, 1177, 1179, 1174, 1176, 1178, 1176, 1180,
- 1183, 1184, 1182, 1179, 1181, 1187, 1186, 1182, 1188, 1192,
- 1189, 1190, 1191, 1183, 1186, 1195, 1194, 0, 1187, 1191,
- 1184, 1179, 1193, 1190, 0, 1197, 0, 0, 1184, 1198,
- 1195, 1199, 1187, 1186, 1214, 1188, 1189, 1189, 1190, 1191,
- 1192, 1194, 1195, 1194, 1193, 1196, 1199, 1198, 1196, 1193,
- 1197, 1201, 1197, 1204, 1202, 1205, 1198, 1206, 1199, 1308,
- 0, 1214, 1205, 1196, 1208, 1210, 1216, 1204, 1206, 1213,
- 1215, 1211, 1196, 1201, 1221, 1196, 1202, 1212, 1201, 1212,
- 1204, 1202, 1205, 1211, 1206, 1208, 1210, 1213, 1215, 1218,
-
- 1308, 1208, 1210, 1216, 1217, 1219, 1213, 1215, 1211, 1220,
- 1222, 1221, 1217, 1223, 1212, 1226, 1227, 1228, 0, 1229,
- 1223, 1231, 1218, 1220, 1230, 1232, 1218, 1219, 1233, 1222,
- 1231, 1217, 1219, 1235, 1227, 1235, 1220, 1222, 1238, 1230,
- 1223, 1236, 1226, 1227, 1228, 1229, 1229, 1232, 1231, 1237,
- 1238, 1230, 1232, 1237, 1242, 1233, 1239, 1240, 1241, 1243,
- 1235, 1244, 0, 1236, 1247, 1238, 1240, 1245, 1236, 1241,
- 1246, 1246, 1247, 1244, 1250, 1249, 1237, 1250, 1239, 1249,
- 0, 1242, 1243, 1239, 1240, 1241, 1243, 1251, 1244, 1245,
- 1252, 1247, 1253, 1254, 1245, 1251, 1252, 1246, 1256, 1254,
-
- 1257, 1250, 1249, 1259, 1258, 0, 1261, 1253, 1260, 1262,
- 1263, 1264, 1265, 1266, 1251, 1267, 1259, 1252, 1258, 1253,
- 1254, 1268, 1260, 1264, 1257, 1256, 1265, 1257, 1270, 1271,
- 1259, 1258, 1261, 1261, 1275, 1260, 1262, 1263, 1264, 1265,
- 1266, 1269, 1267, 1272, 1274, 1276, 1277, 1282, 1268, 1269,
- 1278, 1272, 1280, 1276, 1279, 1270, 1271, 1283, 1286, 1278,
- 1288, 1275, 0, 1281, 0, 1283, 1274, 1288, 1269, 1292,
- 1272, 1274, 1276, 1277, 1282, 1279, 1280, 1278, 1281, 1280,
- 1284, 1279, 1289, 1285, 1283, 1286, 1289, 1288, 1290, 1281,
- 1281, 1285, 1284, 1291, 1293, 1294, 1292, 1295, 1295, 1296,
-
- 1290, 1297, 1293, 1298, 1300, 1281, 1300, 1284, 1302, 1289,
- 1285, 1299, 1303, 1301, 1302, 1290, 1291, 1304, 1298, 1297,
- 1291, 1293, 1294, 1305, 1295, 1296, 1296, 1301, 1297, 1304,
- 1298, 1300, 1307, 1299, 1303, 1302, 1306, 1309, 1299, 1303,
- 1301, 1305, 1311, 1313, 1304, 1307, 1314, 1315, 1316, 1311,
- 1305, 0, 1321, 1318, 1306, 1324, 1316, 1323, 1319, 1307,
- 1309, 1313, 1326, 1306, 1309, 1318, 0, 1321, 1328, 1311,
- 1313, 1330, 1314, 1314, 1316, 1316, 1319, 1324, 1315, 1321,
- 1318, 1323, 1324, 1316, 1323, 1319, 1325, 1329, 1331, 1326,
- 1334, 1332, 0, 1325, 1333, 1328, 1336, 1330, 1330, 1338,
-
- 1329, 1337, 1333, 1331, 1332, 1339, 0, 1341, 1342, 1345,
- 1350, 1344, 0, 1325, 1329, 1331, 1334, 1334, 1332, 1336,
- 1341, 1333, 1340, 1336, 1346, 1337, 1338, 1339, 1337, 1340,
- 1343, 1342, 1339, 1344, 1341, 1342, 1348, 1343, 1344, 1349,
- 1345, 1350, 1352, 1351, 1360, 1346, 1355, 1348, 1356, 1340,
- 1363, 1346, 1364, 1366, 1368, 1369, 0, 1343, 0, 1355,
- 1374, 1349, 1351, 1348, 1372, 1370, 1349, 1352, 1374, 1352,
- 1351, 1360, 1363, 1355, 1356, 1356, 1370, 1363, 1371, 1364,
- 1366, 1369, 1369, 1371, 1375, 1368, 1372, 1374, 1376, 1378,
- 1379, 1372, 1370, 1380, 0, 1383, 1381, 1385, 0, 1375,
-
- 1386, 1387, 1380, 1389, 1388, 1371, 1390, 1378, 1381, 1391,
- 0, 1375, 0, 0, 1387, 1376, 1378, 1392, 1397, 1385,
- 1380, 1379, 1383, 1381, 1385, 1386, 1388, 1386, 1387, 1393,
- 1389, 1388, 1392, 1390, 1394, 1395, 1391, 1396, 1393, 1398,
- 1397, 1399, 1400, 1403, 1392, 1397, 1398, 1401, 1401, 1394,
- 1395, 1402, 1396, 0, 1405, 0, 1393, 1403, 1402, 1410,
- 1400, 1394, 1395, 1408, 1396, 1409, 1398, 1405, 1399, 1400,
- 1403, 1406, 1404, 1411, 1401, 1404, 1414, 1407, 1402, 1415,
- 1406, 1405, 1407, 1414, 1416, 1408, 1410, 1409, 1415, 1416,
- 1408, 1418, 1409, 1421, 1417, 1419, 1420, 1423, 1406, 1404,
-
- 1411, 1417, 1419, 1414, 1407, 1420, 1415, 1424, 1425, 1418,
- 1431, 1416, 1432, 0, 1426, 0, 1476, 0, 1418, 1421,
- 1421, 1417, 1419, 1420, 1423, 1424, 1426, 1427, 1425, 1428,
- 1433, 1429, 1430, 1434, 1424, 1425, 1427, 1431, 1428, 1433,
- 1430, 1426, 1429, 1432, 1435, 1434, 1436, 1476, 1437, 1444,
- 1443, 1445, 1435, 1439, 1427, 1437, 1428, 1433, 1429, 1430,
- 1434, 1439, 1442, 1445, 1447, 1448, 1452, 1451, 1436, 1442,
- 1446, 1435, 1450, 1436, 1443, 1437, 1444, 1443, 1445, 1446,
- 1439, 1453, 1455, 1457, 1450, 1458, 0, 1462, 1448, 1442,
- 1451, 1447, 1448, 1452, 1451, 1453, 1456, 1446, 1463, 1450,
-
- 1464, 0, 1465, 1463, 1456, 1470, 1466, 1467, 1453, 1455,
- 1457, 1468, 1458, 1462, 1462, 1467, 0, 1470, 1464, 1471,
- 1472, 1474, 1475, 1456, 1465, 1463, 1478, 1464, 1466, 1465,
- 1468, 1473, 1470, 1466, 1467, 1477, 1479, 1482, 1468, 1484,
- 0, 1471, 1472, 1473, 1483, 0, 1471, 1472, 1474, 1475,
- 1488, 1485, 1486, 1478, 1487, 1489, 1491, 1477, 1473, 0,
- 0, 1484, 1477, 1479, 1486, 1492, 1484, 1483, 1482, 1485,
- 1489, 1483, 1488, 1487, 1492, 1493, 1494, 1488, 1485, 1486,
- 1491, 1487, 1489, 1491, 1496, 1499, 1495, 1497, 1500, 1493,
- 1501, 1502, 1492, 1499, 1494, 1500, 1505, 1506, 1501, 1503,
-
- 1507, 1504, 1493, 1494, 1495, 1497, 1512, 1503, 0, 1518,
- 1496, 1496, 1499, 1495, 1497, 1500, 1506, 1501, 1502, 1504,
- 1509, 1510, 1507, 1505, 1506, 1514, 1503, 1507, 1504, 1512,
- 1513, 0, 1516, 1512, 1521, 1510, 1518, 1514, 1509, 1522,
- 1523, 1521, 1524, 1513, 1525, 1526, 1527, 1509, 1510, 1528,
- 1529, 1530, 1514, 1534, 1535, 1527, 1531, 1513, 1516, 1516,
- 0, 1521, 1528, 0, 1523, 1522, 1522, 1523, 1539, 1524,
- 1541, 1525, 1526, 1527, 1534, 1540, 1528, 1541, 1530, 1531,
- 1534, 1529, 1543, 1531, 1540, 1535, 1538, 1538, 1542, 1545,
- 1539, 1544, 1546, 0, 1547, 1539, 1538, 1541, 1548, 1544,
-
- 1546, 1542, 1540, 1551, 1550, 1553, 1549, 0, 1545, 1543,
- 1551, 1552, 1552, 1538, 1538, 1542, 1545, 1549, 1544, 1546,
- 1547, 1547, 1554, 1553, 1548, 1548, 1550, 1555, 1557, 1554,
- 1551, 1550, 1553, 1549, 1555, 1558, 1560, 1561, 1552, 1563,
- 1564, 1565, 1562, 1567, 1566, 1560, 1571, 0, 1571, 1554,
- 1575, 0, 1564, 1576, 1555, 1557, 1569, 1563, 1566, 1558,
- 1570, 1567, 1558, 1560, 1561, 1562, 1563, 1564, 1565, 1562,
- 1567, 1566, 1575, 1571, 1569, 1570, 1577, 1575, 1579, 1576,
- 1576, 1580, 1581, 1569, 1582, 1583, 1584, 1570, 1585, 1581,
- 1582, 1586, 0, 1586, 1577, 1584, 1587, 1591, 1589, 1580,
-
- 1579, 0, 1590, 1577, 1592, 1579, 1589, 1583, 1580, 1581,
- 1593, 1582, 1583, 1584, 1590, 1594, 1596, 1597, 1586, 1585,
- 1598, 1598, 1595, 1587, 1591, 1589, 1594, 1592, 1593, 1590,
- 1595, 1592, 1599, 1600, 1602, 1596, 1603, 1593, 1605, 1597,
- 1609, 1600, 1594, 1596, 1597, 1606, 1607, 1598, 1611, 1595,
- 1607, 1610, 1606, 1611, 1612, 1613, 1615, 1617, 1603, 1599,
- 1600, 1602, 1614, 1603, 1610, 1605, 1609, 1609, 1620, 1616,
- 1614, 1615, 1606, 1607, 1622, 1611, 1616, 1618, 1610, 1619,
- 1621, 1612, 1613, 1615, 1617, 1624, 1619, 1626, 1621, 1614,
- 1620, 1627, 1618, 1623, 1623, 1620, 1616, 1629, 1630, 1627,
-
- 1631, 1632, 1633, 1623, 1618, 1622, 1619, 1621, 1634, 1635,
- 1637, 1630, 1624, 1639, 1626, 1641, 1643, 1642, 1627, 1629,
- 1623, 1623, 1631, 1644, 1629, 1630, 1645, 1631, 1632, 1633,
- 1642, 1635, 1648, 1649, 1643, 1634, 1635, 1637, 1654, 1639,
- 1639, 1650, 1641, 1643, 1642, 1652, 1653, 1654, 1645, 1658,
- 1644, 1648, 0, 1645, 1662, 1655, 1657, 1661, 1663, 1648,
- 1649, 1653, 1657, 1650, 1661, 1654, 1655, 1652, 1650, 1656,
- 1656, 1658, 1652, 1653, 1668, 1664, 1658, 1670, 1672, 1656,
- 1673, 1662, 1655, 1657, 1661, 1663, 1675, 1676, 1679, 1680,
- 1681, 0, 1681, 1673, 1678, 1687, 1656, 1656, 1664, 1676,
-
- 1670, 1668, 1664, 1678, 1670, 1672, 1682, 1673, 1684, 1685,
- 1690, 1692, 1686, 1675, 1676, 1679, 1680, 1681, 1682, 1683,
- 1686, 1678, 1687, 1694, 1703, 1683, 1696, 1700, 1697, 1701,
- 1684, 1685, 1703, 1682, 1704, 1684, 1685, 1690, 1692, 1686,
- 1702, 1696, 1701, 1704, 1713, 1710, 1683, 1718, 1705, 1712,
- 1694, 1703, 1713, 1696, 1697, 1697, 1701, 1711, 1700, 1705,
- 1714, 1704, 1702, 1712, 1711, 1719, 1715, 1702, 1710, 1714,
- 1717, 1713, 1710, 1720, 1718, 1705, 1712, 1715, 1716, 1721,
- 1716, 1724, 1717, 1719, 1711, 1729, 1722, 1714, 1722, 1730,
- 1723, 1725, 1719, 1715, 0, 1720, 1727, 1717, 1731, 1728,
-
- 1720, 1721, 1723, 0, 1725, 1716, 1721, 1728, 1727, 1739,
- 1732, 1731, 1724, 1722, 1733, 1734, 1729, 1723, 1725, 1735,
- 1730, 1736, 1733, 1727, 1732, 1731, 1728, 1735, 1734, 1737,
- 1738, 1739, 1740, 1747, 1742, 1736, 1739, 1732, 1738, 1741,
- 1743, 1733, 1734, 1737, 0, 0, 1735, 1741, 1736, 1744,
- 1745, 1748, 0, 1749, 1740, 1746, 1737, 1738, 1752, 1740,
- 1742, 1742, 1743, 1746, 1747, 0, 1741, 1743, 1756, 0,
- 1760, 1744, 1745, 1749, 1754, 1750, 1744, 1745, 1748, 1751,
- 1749, 1761, 1746, 1750, 1753, 1757, 1758, 1751, 1754, 1752,
- 1756, 1759, 1753, 1757, 1758, 1756, 1760, 1760, 1763, 1762,
-
- 1765, 1754, 1750, 1761, 1764, 1759, 1751, 1762, 1761, 1766,
- 1768, 1753, 1757, 1758, 1769, 1767, 1772, 0, 1759, 1770,
- 1771, 0, 1765, 1767, 1763, 1763, 1762, 1765, 1771, 1766,
- 1764, 1764, 1773, 1775, 1769, 1776, 1766, 1768, 1772, 1770,
- 1773, 1769, 1767, 1772, 1777, 1778, 1770, 1771, 1779, 1783,
- 1780, 1785, 1777, 1778, 1782, 1775, 1781, 1776, 1780, 1773,
- 1775, 1786, 1776, 0, 1781, 1784, 1787, 1789, 1792, 1795,
- 1796, 1777, 1778, 0, 1779, 1779, 1783, 1780, 1785, 1793,
- 1782, 1782, 0, 1781, 0, 1784, 1787, 1793, 1786, 1789,
- 1792, 1794, 1784, 1787, 1789, 1792, 1795, 1796, 0, 1794,
-
- 0, 0, 0, 0, 0, 0, 1793, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1794, 1800,
- 1800, 1800, 1800, 1800, 1800, 1800, 1801, 1801, 1801, 1801,
- 1801, 1801, 1801, 1802, 1802, 1802, 1802, 1802, 1802, 1802,
- 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1804, 1804, 1804,
- 1804, 1804, 1804, 1804, 1806, 1806, 0, 1806, 1806, 1806,
- 1806, 1807, 1807, 0, 0, 0, 1807, 1807, 1808, 1808,
- 0, 0, 1808, 0, 1808, 1809, 0, 0, 0, 0,
- 0, 1809, 1810, 1810, 0, 0, 0, 1810, 1810, 1811,
- 0, 0, 0, 0, 0, 1811, 1812, 1812, 0, 1812,
-
- 1812, 1812, 1812, 1813, 1813, 0, 1813, 1813, 1813, 1813,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799,
- 1799, 1799, 1799, 1799, 1799, 1799
+ 72, 78, 72, 69, 80, 81, 86, 72, 87, 82,
+ 82, 81, 84, 85, 78, 87, 64, 80, 82, 86,
+ 84, 91, 14, 219, 13, 78, 81, 0, 78, 117,
+ 85, 80, 81, 86, 72, 87, 82, 82, 81, 84,
+ 88, 78, 89, 91, 85, 92, 95, 93, 91, 88,
+ 93, 89, 219, 99, 95, 97, 96, 85, 92, 97,
+ 117, 100, 98, 93, 93, 98, 99, 88, 0, 89,
+
+ 107, 93, 92, 95, 93, 101, 96, 93, 96, 97,
+ 99, 103, 97, 96, 100, 102, 97, 105, 100, 98,
+ 93, 93, 104, 107, 105, 101, 106, 107, 108, 102,
+ 109, 103, 101, 96, 109, 106, 104, 108, 103, 110,
+ 0, 111, 102, 112, 105, 113, 110, 116, 114, 104,
+ 112, 119, 109, 106, 115, 108, 116, 109, 118, 113,
+ 114, 109, 115, 122, 124, 121, 110, 111, 111, 122,
+ 112, 119, 113, 118, 116, 114, 121, 119, 119, 120,
+ 123, 115, 125, 0, 126, 118, 124, 0, 120, 0,
+ 122, 124, 121, 126, 0, 142, 0, 125, 119, 0,
+
+ 140, 123, 0, 141, 0, 123, 120, 123, 0, 125,
+ 132, 126, 132, 132, 137, 132, 137, 137, 138, 137,
+ 138, 138, 143, 138, 140, 141, 142, 140, 123, 144,
+ 141, 145, 146, 147, 143, 148, 149, 0, 156, 145,
+ 147, 149, 150, 152, 146, 151, 156, 0, 144, 143,
+ 155, 0, 153, 148, 0, 138, 144, 157, 145, 146,
+ 147, 160, 148, 159, 150, 156, 158, 149, 149, 150,
+ 158, 151, 151, 153, 152, 162, 155, 155, 161, 157,
+ 153, 165, 163, 160, 157, 163, 159, 162, 160, 164,
+ 159, 161, 166, 158, 167, 0, 169, 163, 164, 167,
+
+ 153, 154, 162, 165, 170, 161, 154, 169, 165, 163,
+ 171, 154, 163, 167, 166, 168, 164, 154, 154, 166,
+ 167, 167, 168, 169, 154, 173, 167, 176, 154, 172,
+ 174, 178, 177, 154, 179, 170, 171, 171, 154, 172,
+ 167, 175, 168, 180, 154, 154, 182, 175, 174, 0,
+ 181, 184, 0, 194, 177, 0, 173, 174, 176, 177,
+ 172, 186, 178, 180, 181, 179, 172, 182, 175, 183,
+ 180, 187, 184, 182, 185, 188, 183, 181, 184, 185,
+ 186, 189, 190, 191, 194, 187, 192, 196, 186, 190,
+ 201, 192, 195, 189, 193, 193, 183, 188, 187, 195,
+
+ 197, 185, 188, 193, 198, 191, 202, 199, 189, 190,
+ 191, 200, 196, 192, 196, 199, 201, 201, 203, 195,
+ 197, 193, 193, 204, 205, 206, 200, 197, 202, 0,
+ 208, 209, 210, 206, 199, 198, 0, 202, 200, 205,
+ 204, 207, 211, 214, 213, 227, 218, 212, 204, 203,
+ 204, 205, 206, 209, 211, 202, 212, 213, 209, 216,
+ 207, 208, 214, 210, 215, 217, 215, 204, 207, 211,
+ 214, 213, 218, 218, 212, 220, 227, 221, 222, 0,
+ 0, 223, 224, 216, 225, 231, 216, 228, 230, 222,
+ 217, 215, 217, 223, 226, 0, 229, 243, 0, 0,
+
+ 228, 220, 220, 221, 221, 222, 224, 225, 223, 224,
+ 230, 225, 226, 232, 228, 230, 231, 233, 234, 235,
+ 232, 226, 229, 229, 234, 236, 233, 238, 243, 237,
+ 240, 247, 239, 235, 241, 242, 238, 0, 0, 240,
+ 232, 244, 265, 241, 233, 234, 235, 0, 245, 247,
+ 242, 236, 236, 237, 238, 239, 237, 240, 247, 239,
+ 248, 241, 242, 245, 246, 244, 248, 246, 244, 249,
+ 250, 253, 255, 265, 246, 245, 251, 251, 254, 258,
+ 0, 254, 256, 249, 255, 250, 0, 248, 254, 257,
+ 259, 246, 260, 262, 246, 253, 249, 250, 253, 255,
+
+ 256, 251, 261, 251, 251, 254, 258, 257, 254, 256,
+ 263, 267, 259, 269, 261, 262, 257, 259, 260, 260,
+ 262, 264, 268, 266, 268, 263, 269, 271, 264, 261,
+ 266, 270, 0, 267, 270, 272, 270, 263, 267, 0,
+ 269, 0, 270, 273, 276, 271, 268, 287, 264, 268,
+ 266, 268, 281, 275, 271, 277, 276, 0, 270, 274,
+ 275, 270, 279, 270, 281, 273, 272, 274, 277, 278,
+ 273, 276, 282, 274, 286, 279, 284, 283, 287, 281,
+ 275, 286, 277, 283, 284, 278, 274, 0, 285, 279,
+ 282, 288, 0, 278, 274, 288, 278, 291, 0, 282,
+
+ 285, 286, 289, 284, 283, 290, 293, 295, 292, 289,
+ 0, 297, 278, 280, 280, 285, 306, 290, 288, 291,
+ 292, 294, 295, 280, 291, 280, 280, 280, 294, 289,
+ 280, 296, 290, 299, 295, 292, 298, 293, 280, 306,
+ 280, 280, 297, 306, 296, 300, 300, 298, 294, 301,
+ 280, 302, 280, 280, 280, 299, 301, 280, 296, 303,
+ 299, 310, 302, 298, 304, 305, 307, 308, 314, 309,
+ 303, 313, 0, 311, 300, 307, 301, 304, 302, 310,
+ 308, 312, 309, 317, 316, 318, 303, 309, 310, 313,
+ 305, 304, 305, 307, 308, 311, 309, 315, 313, 314,
+
+ 311, 319, 321, 315, 312, 316, 317, 318, 312, 309,
+ 317, 316, 318, 320, 323, 322, 321, 324, 0, 325,
+ 327, 326, 0, 324, 315, 328, 0, 319, 319, 321,
+ 331, 329, 330, 0, 333, 320, 326, 325, 330, 0,
+ 320, 322, 322, 327, 324, 323, 325, 327, 326, 334,
+ 335, 328, 328, 329, 336, 334, 331, 331, 329, 330,
+ 333, 333, 342, 337, 338, 343, 340, 341, 344, 335,
+ 337, 347, 336, 340, 341, 342, 334, 335, 345, 338,
+ 346, 336, 349, 348, 353, 351, 344, 349, 0, 342,
+ 337, 338, 348, 340, 341, 344, 343, 350, 0, 346,
+
+ 345, 352, 347, 350, 354, 345, 353, 346, 351, 349,
+ 348, 353, 351, 352, 355, 354, 357, 358, 359, 364,
+ 0, 364, 355, 357, 350, 358, 361, 360, 352, 359,
+ 0, 354, 362, 0, 363, 370, 360, 0, 365, 362,
+ 370, 355, 356, 357, 358, 359, 364, 356, 369, 356,
+ 361, 371, 0, 361, 366, 367, 369, 356, 360, 362,
+ 363, 363, 370, 360, 365, 365, 366, 356, 356, 356,
+ 367, 368, 372, 371, 356, 369, 356, 373, 371, 374,
+ 375, 366, 367, 368, 356, 373, 376, 377, 378, 380,
+ 372, 374, 381, 383, 356, 379, 382, 378, 368, 372,
+
+ 386, 385, 377, 375, 373, 384, 374, 375, 380, 379,
+ 388, 382, 386, 387, 377, 378, 380, 376, 389, 381,
+ 384, 389, 379, 382, 383, 385, 390, 386, 385, 389,
+ 390, 392, 384, 391, 388, 387, 393, 388, 394, 395,
+ 387, 396, 397, 398, 400, 389, 0, 391, 389, 398,
+ 399, 401, 402, 405, 403, 0, 0, 390, 392, 0,
+ 391, 406, 0, 393, 0, 0, 395, 400, 396, 394,
+ 398, 400, 399, 397, 407, 402, 403, 399, 404, 402,
+ 409, 403, 401, 406, 405, 404, 408, 407, 406, 409,
+ 410, 408, 412, 411, 414, 408, 413, 415, 0, 418,
+
+ 0, 407, 411, 416, 0, 404, 417, 409, 0, 413,
+ 408, 423, 420, 408, 412, 415, 410, 410, 408, 412,
+ 411, 418, 408, 413, 415, 414, 418, 416, 417, 417,
+ 416, 419, 421, 417, 420, 422, 424, 425, 430, 420,
+ 428, 426, 423, 421, 427, 419, 0, 429, 431, 428,
+ 422, 433, 432, 437, 0, 417, 0, 424, 419, 421,
+ 429, 425, 422, 424, 425, 426, 427, 428, 426, 430,
+ 431, 427, 435, 433, 429, 431, 432, 434, 433, 432,
+ 436, 434, 438, 442, 437, 440, 435, 439, 441, 440,
+ 453, 442, 443, 446, 436, 444, 445, 0, 0, 435,
+
+ 438, 446, 439, 448, 444, 445, 449, 436, 434, 438,
+ 442, 439, 0, 441, 439, 441, 440, 443, 447, 443,
+ 446, 453, 444, 445, 449, 447, 448, 450, 451, 439,
+ 448, 452, 454, 449, 455, 0, 456, 451, 460, 450,
+ 454, 457, 455, 452, 458, 447, 0, 459, 461, 460,
+ 463, 464, 462, 0, 450, 451, 461, 0, 452, 454,
+ 458, 455, 456, 456, 457, 460, 462, 465, 457, 459,
+ 463, 458, 468, 464, 459, 461, 466, 463, 464, 462,
+ 467, 468, 470, 471, 469, 0, 472, 465, 473, 475,
+ 479, 474, 0, 476, 465, 475, 471, 0, 466, 468,
+
+ 470, 476, 467, 466, 469, 477, 481, 467, 472, 470,
+ 471, 469, 473, 472, 474, 473, 475, 480, 474, 476,
+ 476, 479, 482, 477, 480, 483, 484, 485, 476, 481,
+ 499, 486, 477, 481, 483, 490, 487, 482, 487, 0,
+ 486, 0, 496, 493, 480, 497, 485, 490, 523, 482,
+ 498, 0, 483, 493, 485, 0, 505, 484, 486, 0,
+ 496, 499, 490, 487, 488, 501, 497, 502, 488, 496,
+ 493, 488, 497, 498, 507, 504, 502, 498, 488, 523,
+ 503, 488, 503, 505, 506, 0, 488, 501, 0, 0,
+ 509, 488, 501, 0, 502, 488, 513, 510, 488, 504,
+
+ 507, 507, 504, 512, 506, 488, 508, 503, 488, 500,
+ 500, 506, 500, 0, 511, 500, 509, 509, 508, 510,
+ 500, 513, 515, 513, 510, 512, 500, 500, 0, 515,
+ 512, 517, 514, 508, 518, 500, 500, 500, 511, 500,
+ 514, 511, 500, 516, 519, 521, 520, 500, 522, 515,
+ 517, 516, 524, 500, 500, 520, 519, 525, 517, 514,
+ 518, 518, 0, 527, 526, 529, 530, 521, 528, 531,
+ 516, 519, 521, 520, 529, 522, 533, 535, 532, 534,
+ 540, 525, 527, 524, 525, 526, 532, 528, 530, 531,
+ 527, 526, 529, 530, 536, 528, 531, 538, 534, 539,
+
+ 541, 0, 536, 533, 540, 532, 534, 540, 535, 542,
+ 543, 547, 546, 541, 0, 538, 549, 539, 546, 548,
+ 544, 536, 543, 549, 538, 548, 539, 541, 544, 550,
+ 553, 552, 555, 547, 550, 542, 542, 543, 547, 546,
+ 555, 551, 554, 549, 544, 556, 548, 544, 551, 552,
+ 558, 554, 557, 553, 559, 544, 550, 553, 552, 555,
+ 560, 561, 562, 556, 563, 557, 0, 560, 551, 554,
+ 565, 558, 556, 564, 561, 566, 567, 558, 565, 557,
+ 568, 559, 569, 570, 574, 572, 568, 560, 561, 571,
+ 566, 573, 575, 562, 572, 563, 564, 565, 567, 575,
+
+ 564, 576, 566, 567, 577, 573, 579, 568, 569, 569,
+ 578, 582, 572, 571, 570, 574, 571, 580, 573, 575,
+ 581, 0, 578, 581, 582, 580, 585, 583, 576, 579,
+ 0, 577, 592, 579, 583, 586, 0, 578, 582, 587,
+ 588, 0, 588, 591, 580, 592, 0, 581, 589, 0,
+ 602, 587, 585, 585, 583, 584, 593, 584, 586, 592,
+ 590, 584, 586, 584, 595, 591, 587, 588, 584, 593,
+ 591, 589, 590, 584, 594, 589, 595, 597, 0, 584,
+ 598, 602, 584, 593, 584, 601, 596, 590, 584, 600,
+ 584, 595, 599, 598, 604, 584, 596, 594, 599, 597,
+
+ 584, 594, 600, 605, 597, 606, 601, 598, 596, 604,
+ 603, 607, 601, 596, 608, 603, 600, 603, 606, 599,
+ 610, 604, 613, 596, 609, 605, 607, 614, 616, 0,
+ 605, 617, 606, 620, 619, 603, 603, 603, 607, 610,
+ 608, 608, 603, 611, 603, 612, 609, 610, 619, 613,
+ 614, 609, 618, 612, 614, 617, 611, 622, 617, 616,
+ 618, 619, 603, 621, 620, 622, 624, 626, 623, 625,
+ 611, 631, 612, 628, 630, 626, 627, 624, 629, 618,
+ 628, 633, 636, 641, 622, 621, 623, 625, 634, 633,
+ 621, 629, 630, 624, 626, 623, 625, 634, 627, 635,
+
+ 628, 630, 631, 627, 636, 629, 637, 638, 633, 636,
+ 640, 635, 639, 642, 641, 634, 644, 0, 645, 646,
+ 644, 645, 647, 0, 648, 650, 635, 642, 637, 638,
+ 639, 648, 650, 637, 638, 647, 640, 640, 649, 639,
+ 642, 653, 651, 646, 645, 645, 646, 644, 645, 647,
+ 649, 648, 650, 652, 654, 658, 655, 657, 660, 652,
+ 656, 659, 661, 653, 662, 649, 651, 660, 653, 651,
+ 0, 656, 0, 662, 666, 667, 654, 655, 657, 659,
+ 652, 654, 658, 655, 657, 660, 661, 656, 659, 661,
+ 663, 662, 664, 665, 669, 671, 666, 667, 663, 664,
+
+ 670, 666, 667, 669, 675, 673, 674, 665, 672, 0,
+ 0, 671, 676, 0, 679, 678, 675, 663, 677, 664,
+ 665, 669, 671, 672, 670, 681, 677, 670, 678, 679,
+ 682, 675, 683, 690, 681, 672, 673, 674, 687, 676,
+ 683, 679, 678, 688, 684, 677, 684, 689, 682, 691,
+ 692, 687, 681, 0, 689, 688, 693, 682, 0, 683,
+ 694, 698, 695, 696, 690, 687, 699, 697, 701, 698,
+ 688, 684, 692, 694, 689, 695, 701, 692, 693, 697,
+ 691, 702, 705, 693, 700, 696, 699, 694, 698, 695,
+ 696, 703, 704, 699, 697, 701, 700, 707, 706, 708,
+
+ 709, 704, 710, 705, 703, 706, 711, 712, 702, 705,
+ 713, 700, 0, 714, 715, 710, 712, 716, 703, 704,
+ 709, 708, 715, 707, 707, 706, 708, 709, 713, 710,
+ 711, 718, 719, 711, 712, 714, 720, 713, 717, 716,
+ 714, 715, 722, 721, 716, 723, 717, 725, 720, 724,
+ 719, 732, 726, 725, 718, 721, 727, 724, 718, 719,
+ 723, 726, 722, 720, 729, 717, 728, 730, 733, 722,
+ 721, 729, 723, 734, 725, 736, 724, 727, 728, 726,
+ 735, 733, 732, 727, 737, 730, 738, 735, 739, 742,
+ 738, 729, 734, 728, 730, 733, 739, 736, 741, 737,
+
+ 734, 740, 736, 742, 743, 744, 745, 735, 746, 0,
+ 753, 737, 747, 751, 740, 739, 742, 738, 748, 749,
+ 750, 754, 743, 0, 741, 741, 751, 755, 740, 752,
+ 746, 743, 745, 745, 747, 746, 744, 749, 752, 747,
+ 751, 753, 750, 756, 748, 748, 749, 750, 758, 755,
+ 762, 0, 754, 0, 755, 0, 752, 759, 761, 763,
+ 765, 764, 762, 770, 765, 0, 756, 771, 763, 771,
+ 756, 757, 770, 759, 758, 758, 757, 762, 757, 764,
+ 757, 761, 757, 766, 759, 761, 763, 767, 764, 757,
+ 770, 765, 768, 769, 771, 767, 766, 772, 757, 774,
+
+ 773, 776, 779, 757, 781, 757, 769, 757, 777, 757,
+ 766, 768, 773, 778, 767, 780, 782, 783, 0, 768,
+ 769, 778, 780, 785, 772, 776, 774, 773, 776, 779,
+ 777, 781, 784, 786, 787, 777, 788, 789, 782, 784,
+ 778, 793, 780, 782, 783, 785, 789, 790, 794, 791,
+ 785, 795, 786, 796, 799, 800, 787, 803, 798, 784,
+ 786, 787, 788, 788, 789, 797, 798, 802, 790, 791,
+ 799, 802, 793, 795, 790, 0, 791, 808, 795, 794,
+ 801, 799, 800, 797, 796, 798, 805, 801, 803, 804,
+ 806, 807, 797, 805, 802, 804, 810, 812, 810, 809,
+
+ 807, 811, 804, 808, 808, 806, 809, 801, 813, 815,
+ 811, 814, 817, 805, 819, 814, 804, 806, 807, 812,
+ 817, 818, 804, 810, 812, 818, 809, 820, 811, 822,
+ 821, 815, 819, 823, 825, 813, 815, 0, 814, 817,
+ 824, 819, 822, 826, 827, 827, 820, 829, 0, 828,
+ 825, 826, 818, 830, 820, 821, 822, 821, 828, 831,
+ 832, 825, 830, 824, 823, 834, 831, 824, 833, 829,
+ 826, 827, 835, 834, 829, 839, 828, 833, 836, 837,
+ 830, 838, 843, 832, 840, 835, 831, 832, 841, 838,
+ 836, 837, 834, 845, 842, 833, 848, 839, 850, 835,
+
+ 843, 844, 839, 842, 840, 836, 837, 847, 838, 843,
+ 841, 840, 846, 844, 845, 841, 849, 851, 846, 853,
+ 845, 842, 854, 855, 850, 850, 856, 848, 844, 847,
+ 0, 859, 855, 858, 847, 859, 860, 866, 857, 846,
+ 860, 858, 0, 851, 851, 854, 853, 849, 856, 854,
+ 855, 857, 865, 856, 0, 861, 862, 863, 863, 873,
+ 858, 864, 859, 861, 862, 857, 867, 860, 866, 864,
+ 868, 873, 869, 865, 867, 872, 871, 870, 868, 865,
+ 869, 872, 861, 862, 863, 870, 873, 874, 864, 871,
+ 876, 875, 0, 867, 877, 879, 878, 868, 881, 869,
+
+ 884, 885, 872, 871, 870, 876, 880, 884, 887, 879,
+ 886, 889, 881, 874, 874, 875, 877, 876, 875, 878,
+ 0, 877, 879, 878, 880, 881, 882, 884, 885, 888,
+ 882, 887, 886, 880, 0, 887, 888, 886, 891, 893,
+ 895, 894, 889, 882, 0, 897, 899, 891, 0, 902,
+ 901, 882, 903, 882, 0, 0, 888, 882, 904, 906,
+ 904, 893, 908, 0, 903, 891, 893, 894, 894, 905,
+ 882, 895, 897, 899, 901, 902, 902, 901, 907, 903,
+ 909, 906, 905, 910, 912, 904, 906, 909, 911, 908,
+ 907, 913, 917, 911, 914, 915, 905, 919, 920, 918,
+
+ 912, 917, 914, 0, 0, 907, 921, 909, 926, 910,
+ 910, 912, 918, 921, 913, 911, 925, 915, 913, 917,
+ 920, 914, 915, 919, 919, 920, 918, 922, 923, 924,
+ 926, 927, 928, 921, 922, 926, 924, 929, 931, 928,
+ 932, 925, 933, 925, 936, 934, 923, 936, 937, 938,
+ 933, 931, 941, 939, 922, 923, 924, 942, 940, 928,
+ 939, 940, 927, 943, 938, 931, 934, 932, 929, 933,
+ 944, 936, 934, 940, 937, 937, 938, 946, 947, 942,
+ 939, 943, 940, 941, 942, 940, 948, 945, 940, 945,
+ 943, 950, 944, 949, 952, 953, 951, 944, 956, 950,
+
+ 940, 946, 949, 951, 946, 955, 954, 957, 958, 947,
+ 954, 0, 948, 948, 945, 959, 952, 958, 950, 0,
+ 949, 952, 959, 951, 960, 956, 953, 955, 961, 957,
+ 962, 960, 955, 954, 957, 958, 963, 964, 968, 965,
+ 966, 961, 959, 967, 968, 962, 965, 966, 970, 971,
+ 963, 960, 972, 973, 977, 961, 967, 962, 975, 974,
+ 979, 977, 974, 963, 972, 968, 965, 966, 964, 975,
+ 967, 971, 980, 973, 983, 970, 971, 974, 981, 972,
+ 973, 977, 982, 984, 986, 975, 974, 979, 987, 974,
+ 988, 984, 983, 982, 985, 992, 980, 985, 991, 980,
+
+ 981, 983, 986, 993, 990, 981, 989, 991, 992, 982,
+ 984, 986, 985, 989, 993, 997, 998, 988, 990, 987,
+ 994, 985, 992, 996, 985, 991, 995, 998, 995, 1000,
+ 993, 990, 996, 989, 999, 994, 0, 1003, 1005, 1007,
+ 1001, 997, 997, 998, 1008, 1002, 1003, 994, 1002, 1006,
+ 996, 1000, 999, 995, 1001, 1009, 1000, 1010, 1006, 1011,
+ 1015, 999, 1009, 1002, 1003, 1008, 1001, 1001, 1012, 1005,
+ 1007, 1008, 1002, 1011, 1012, 1002, 1006, 1016, 1019, 1015,
+ 1017, 1001, 1009, 1020, 1025, 1018, 1011, 1015, 1010, 1017,
+ 1021, 1016, 1012, 1018, 1020, 1012, 1023, 1024, 1028, 1021,
+
+ 1026, 1012, 1031, 1023, 1016, 0, 1025, 1017, 1027, 1019,
+ 1020, 1025, 1018, 1032, 1029, 0, 1028, 1021, 1029, 1030,
+ 1024, 1037, 1026, 1023, 1024, 1028, 1032, 1026, 1033, 1031,
+ 1027, 1030, 1034, 1039, 1035, 1027, 1036, 1040, 1038, 1041,
+ 1032, 1029, 1039, 1042, 1036, 1043, 1030, 1034, 1033, 1035,
+ 1046, 1045, 1037, 1038, 1047, 1033, 1048, 1049, 1040, 1034,
+ 1039, 1035, 1050, 1036, 1040, 1038, 1041, 1042, 1046, 1053,
+ 1042, 1048, 1043, 1045, 1052, 1051, 1056, 1046, 1045, 1049,
+ 1050, 1047, 1054, 1048, 1049, 1055, 1052, 1057, 1056, 1050,
+ 1051, 1053, 1055, 1058, 1062, 1054, 1053, 1067, 1059, 1060,
+
+ 1054, 1052, 1051, 1056, 1059, 1064, 1061, 1060, 1063, 1054,
+ 1065, 1066, 1055, 1061, 1057, 1063, 1068, 1070, 1071, 1072,
+ 1074, 1062, 1054, 1076, 1058, 1059, 1060, 1071, 1067, 1073,
+ 1080, 1073, 1064, 1061, 1066, 1063, 1075, 1065, 1066, 0,
+ 1068, 1085, 1078, 1068, 0, 1071, 1083, 1074, 1070, 1078,
+ 1072, 1077, 1077, 1077, 1076, 1087, 1073, 1079, 1077, 1083,
+ 1081, 1080, 1075, 1075, 1079, 1084, 1077, 1081, 1085, 1078,
+ 1088, 1084, 1089, 1083, 1086, 1086, 1091, 1088, 1077, 1077,
+ 1077, 1087, 1087, 1092, 1079, 1077, 1094, 1081, 1093, 1095,
+ 1096, 1096, 1084, 1097, 1091, 1098, 1098, 1088, 1089, 1089,
+
+ 1093, 1086, 1101, 1091, 1102, 1104, 1094, 1095, 0, 1105,
+ 1092, 1103, 1099, 1094, 1106, 1093, 1095, 1096, 1103, 1097,
+ 1097, 1107, 1098, 1099, 1101, 1104, 1109, 1108, 1111, 1101,
+ 1110, 1112, 1104, 1114, 0, 1102, 1111, 1110, 1103, 1099,
+ 1105, 1113, 1114, 1116, 1109, 1106, 1112, 1117, 1107, 1108,
+ 1115, 1115, 1122, 1109, 1108, 1111, 1118, 1110, 1112, 1117,
+ 1114, 1119, 1121, 1120, 1118, 1113, 1123, 1124, 1113, 1116,
+ 1116, 1123, 1125, 1119, 1117, 1127, 1128, 1115, 1125, 1122,
+ 1121, 1129, 1123, 1118, 1120, 1129, 1130, 1126, 1119, 1121,
+ 1120, 1131, 1131, 1123, 1124, 1132, 1133, 1135, 1123, 1125,
+
+ 1126, 1134, 1138, 1128, 1136, 1137, 1127, 1137, 1139, 1140,
+ 1132, 1141, 1129, 1139, 1126, 1143, 1134, 1130, 1131, 1136,
+ 1135, 1144, 1132, 1145, 1135, 1146, 1141, 1133, 1134, 1147,
+ 1148, 1136, 1137, 1138, 1150, 1139, 1147, 1149, 1141, 1143,
+ 1140, 1153, 1143, 1155, 1151, 1156, 1159, 1144, 1144, 0,
+ 1145, 1148, 1146, 1164, 1158, 1150, 1147, 1148, 1160, 1149,
+ 1156, 1150, 1151, 1153, 1149, 1160, 1161, 1155, 1153, 1158,
+ 1155, 1151, 1156, 1159, 1162, 1165, 1164, 1166, 1163, 1167,
+ 1164, 1158, 1170, 1162, 1161, 1160, 1163, 1169, 1174, 1171,
+ 1178, 1170, 1167, 1161, 1172, 1183, 1179, 1165, 1169, 1177,
+
+ 0, 1162, 1165, 1178, 1181, 1163, 1167, 1171, 1166, 1170,
+ 1180, 1177, 1172, 1169, 1169, 1174, 1171, 1178, 1182, 1185,
+ 1180, 1172, 1183, 1187, 1188, 1169, 1177, 1179, 1186, 1190,
+ 1181, 1181, 1189, 1191, 0, 1186, 0, 1180, 1189, 1185,
+ 1193, 1193, 1188, 1182, 1190, 1182, 1185, 1192, 1191, 1187,
+ 1187, 1188, 1194, 1198, 1195, 1186, 1190, 1199, 1196, 1189,
+ 1191, 1195, 1192, 1200, 1194, 1196, 1201, 1193, 1205, 1202,
+ 1204, 1213, 1200, 0, 1192, 1198, 1206, 1206, 1207, 1194,
+ 1198, 1195, 1199, 1204, 1199, 1196, 1201, 1202, 1208, 1209,
+ 1200, 1216, 1210, 1201, 1212, 1205, 1202, 1204, 1211, 1224,
+
+ 1207, 1212, 1213, 1206, 1214, 1207, 1215, 1211, 0, 1218,
+ 1216, 1209, 1220, 1208, 1210, 1208, 1209, 1218, 1216, 1210,
+ 1215, 1212, 1219, 0, 1221, 1211, 1214, 1223, 1222, 1227,
+ 1224, 1214, 0, 1215, 1223, 1219, 1218, 1225, 1226, 1220,
+ 1222, 1229, 1228, 1230, 1227, 1228, 1243, 1231, 0, 1219,
+ 1221, 1221, 0, 1233, 1223, 1222, 1227, 1234, 1243, 1225,
+ 1228, 1230, 1231, 1226, 1225, 1226, 1229, 1236, 1229, 1228,
+ 1230, 1237, 1228, 1243, 1231, 1233, 1238, 0, 1237, 1234,
+ 1233, 1236, 1245, 1240, 1234, 1242, 1244, 1238, 1244, 1246,
+ 1247, 1248, 1250, 1249, 1236, 1253, 0, 1252, 1237, 1251,
+
+ 1245, 1249, 1258, 1238, 1240, 1260, 1242, 1259, 1247, 1245,
+ 1240, 1252, 1242, 1244, 1254, 1250, 1246, 1247, 1248, 1250,
+ 1249, 1251, 1253, 1255, 1252, 1259, 1251, 1261, 1262, 1258,
+ 1255, 1263, 1260, 1254, 1259, 1264, 1266, 1265, 1269, 0,
+ 1263, 1254, 1268, 1262, 1268, 1270, 1274, 1275, 1272, 1270,
+ 1255, 0, 1273, 1261, 1261, 1262, 1271, 1274, 1263, 1265,
+ 1269, 1273, 1276, 1266, 1265, 1269, 1264, 0, 1271, 1268,
+ 1272, 1278, 1270, 1274, 1275, 1272, 1277, 1279, 1279, 1273,
+ 1282, 1286, 1280, 1271, 1282, 1276, 1285, 1284, 1277, 1276,
+ 1280, 1283, 1285, 1278, 1283, 1284, 1286, 1289, 1278, 1287,
+
+ 1295, 1290, 1291, 1277, 1279, 1287, 1292, 1282, 1286, 1280,
+ 1294, 1296, 1299, 1285, 1284, 1300, 1291, 1293, 1283, 1292,
+ 1297, 1298, 1301, 1303, 1289, 1290, 1287, 1295, 1290, 1291,
+ 1304, 1293, 1297, 1292, 1305, 1298, 1294, 1294, 1296, 1299,
+ 1308, 1309, 1300, 1302, 1293, 1306, 1310, 1297, 1298, 1301,
+ 1303, 1302, 1311, 1306, 1310, 1312, 1313, 1304, 0, 1315,
+ 1314, 1305, 1308, 1316, 1312, 1320, 1318, 1308, 1309, 1322,
+ 1302, 1323, 1306, 1310, 1315, 1323, 1322, 1313, 1318, 1311,
+ 1317, 1319, 1312, 1313, 1314, 1315, 1315, 1314, 1317, 1319,
+ 1316, 1324, 1320, 1318, 1325, 1326, 1322, 1327, 1323, 1328,
+
+ 1332, 1315, 1330, 1324, 1334, 1327, 1334, 1317, 1319, 1329,
+ 1329, 1333, 1331, 1336, 1339, 1332, 0, 1325, 1324, 1336,
+ 1335, 1325, 1326, 1337, 1327, 1338, 1328, 1332, 1330, 1330,
+ 1331, 1334, 1339, 1333, 1335, 1340, 1329, 1338, 1333, 1331,
+ 1336, 1339, 1341, 1342, 1343, 1337, 1347, 1335, 1349, 1345,
+ 1337, 1348, 1338, 1340, 1352, 1341, 1345, 1350, 1357, 0,
+ 1355, 0, 1340, 1359, 1347, 1350, 1352, 1343, 1353, 1341,
+ 1359, 1343, 1358, 1347, 1342, 1355, 1345, 1348, 1348, 1349,
+ 1361, 1352, 1357, 1350, 1350, 1357, 1353, 1355, 1360, 1363,
+ 1359, 1364, 1350, 1365, 1358, 1353, 1366, 1367, 1368, 1358,
+
+ 1369, 0, 1373, 1360, 1364, 1371, 1368, 1361, 1374, 1372,
+ 1367, 1366, 1380, 0, 1375, 1360, 1363, 0, 1364, 1365,
+ 1365, 1375, 1377, 1366, 1367, 1368, 1369, 1369, 1371, 1373,
+ 1374, 1376, 1371, 1372, 1379, 1374, 1372, 1383, 1381, 1378,
+ 1384, 1375, 1385, 1380, 1376, 1377, 1378, 1387, 1383, 1377,
+ 1386, 0, 1391, 1395, 1399, 1390, 1379, 1400, 1376, 1381,
+ 1402, 1379, 1384, 1404, 1383, 1381, 1378, 1384, 1390, 1386,
+ 1405, 1408, 1387, 1385, 1387, 1406, 1399, 1386, 1391, 1391,
+ 1395, 1399, 1390, 1407, 1400, 1411, 1406, 1402, 1407, 1412,
+ 1414, 1410, 1415, 1408, 1404, 1416, 1405, 1405, 1408, 1410,
+
+ 1411, 1417, 1406, 1419, 1416, 1421, 1422, 1423, 1414, 0,
+ 1407, 1425, 1411, 1417, 1424, 1426, 1412, 1414, 1410, 1427,
+ 1423, 1435, 1416, 1415, 1428, 1430, 1429, 1421, 1417, 1431,
+ 1419, 1422, 1421, 1422, 1423, 1429, 1424, 1433, 1425, 1428,
+ 1430, 1424, 1426, 1432, 1431, 1436, 1427, 1434, 1435, 1437,
+ 1437, 1428, 1430, 1429, 1434, 1438, 1431, 1439, 1432, 1433,
+ 1441, 1446, 1438, 1436, 1433, 1440, 1442, 1444, 1440, 1445,
+ 1432, 1439, 1436, 1441, 1434, 1442, 1437, 1447, 1443, 0,
+ 1448, 0, 1438, 1443, 1439, 1458, 1452, 1441, 1446, 1444,
+ 1451, 1445, 1440, 1442, 1444, 1452, 1445, 1451, 1453, 1460,
+
+ 1455, 1454, 1456, 1453, 1447, 1443, 1448, 1448, 1454, 1456,
+ 1457, 1458, 1458, 1452, 1461, 1462, 1467, 1451, 1455, 1457,
+ 1468, 1463, 1464, 1466, 1467, 1453, 1460, 1455, 1454, 1456,
+ 1465, 1464, 1461, 1463, 1466, 1462, 1469, 1457, 1473, 1465,
+ 0, 1461, 1462, 1467, 1470, 1474, 1471, 1468, 1463, 1464,
+ 1466, 1472, 1474, 1470, 1476, 1480, 1479, 1465, 1471, 1472,
+ 1473, 1481, 1476, 1479, 1482, 1473, 1483, 1469, 1484, 1485,
+ 1489, 1470, 1474, 1471, 1487, 1483, 1482, 1488, 1472, 1480,
+ 1490, 1476, 1480, 1479, 1492, 1494, 1487, 1495, 1481, 1499,
+ 1493, 1482, 1485, 1483, 1490, 1484, 1485, 1489, 1493, 1502,
+
+ 1488, 1487, 1501, 1500, 1488, 1503, 1505, 1490, 1500, 0,
+ 1504, 1492, 1494, 1508, 1495, 1499, 1499, 1493, 1504, 1507,
+ 1501, 1502, 1509, 1511, 1510, 1505, 1502, 1503, 1512, 1501,
+ 1500, 1507, 1503, 1505, 1513, 1508, 1510, 1504, 0, 1514,
+ 1508, 1515, 1516, 1519, 1509, 1520, 1507, 0, 1521, 1509,
+ 1511, 1510, 1522, 0, 1523, 1512, 1529, 1519, 0, 1525,
+ 1526, 1514, 1527, 0, 0, 1513, 1514, 0, 1515, 1516,
+ 1519, 1521, 1523, 1524, 1522, 1521, 1520, 1527, 1525, 1522,
+ 1529, 1523, 1526, 1529, 1530, 1524, 1525, 1526, 1531, 1527,
+ 1532, 1533, 1535, 1530, 1534, 1537, 1540, 1538, 1539, 1541,
+
+ 1524, 1543, 1531, 1537, 1538, 0, 1539, 1541, 1532, 1533,
+ 1535, 1530, 1542, 1544, 1545, 1531, 1547, 1532, 1533, 1535,
+ 1534, 1534, 1537, 1540, 1538, 1539, 1541, 1550, 1543, 1551,
+ 1542, 1548, 1544, 1554, 1547, 1552, 1545, 1556, 1562, 1542,
+ 1544, 1545, 1551, 1547, 1559, 1548, 1560, 1552, 1563, 0,
+ 1550, 1559, 1561, 1564, 1550, 1566, 1551, 1565, 1548, 1554,
+ 1554, 1567, 1552, 1568, 1556, 1562, 1565, 1572, 1566, 1573,
+ 1569, 1559, 1560, 1560, 1576, 1563, 1561, 1577, 1577, 1561,
+ 1564, 1578, 1566, 1582, 1565, 1586, 1579, 1577, 1572, 1581,
+ 1568, 1580, 1567, 1569, 1572, 1579, 1576, 1569, 1580, 1583,
+
+ 1573, 1576, 1581, 1578, 1577, 1577, 1584, 1583, 1578, 1585,
+ 1582, 1586, 1586, 1579, 1587, 1589, 1581, 1585, 1580, 1588,
+ 1590, 1591, 1591, 1596, 1600, 1584, 1583, 1590, 1593, 1597,
+ 1588, 1592, 1594, 1584, 1599, 1593, 1585, 1589, 1604, 1594,
+ 1587, 1587, 1589, 1599, 1601, 1602, 1588, 1590, 1591, 1592,
+ 1596, 1600, 1603, 1597, 1605, 1593, 1597, 1606, 1592, 1594,
+ 1608, 1599, 1609, 1602, 1603, 1604, 1614, 1601, 1605, 1615,
+ 1618, 1601, 1602, 1616, 1610, 1606, 1610, 1609, 1608, 1603,
+ 1619, 1605, 1621, 1620, 1606, 1627, 1625, 1608, 1614, 1609,
+ 1620, 1616, 1618, 1614, 1623, 1615, 1615, 1618, 1619, 1622,
+
+ 1616, 1610, 1624, 1630, 1626, 1622, 1626, 1619, 1631, 1632,
+ 1620, 1624, 1627, 1621, 1629, 1630, 1623, 1625, 1637, 1633,
+ 1635, 1623, 1629, 1634, 1636, 1639, 1622, 1642, 1635, 1624,
+ 1630, 1626, 1632, 1643, 1634, 1631, 1632, 1633, 1638, 1638,
+ 1637, 1629, 1645, 1636, 1649, 1637, 1633, 1635, 1640, 1647,
+ 1634, 1636, 1639, 1647, 1642, 1643, 1640, 1646, 1651, 1650,
+ 1643, 1652, 1653, 1651, 1646, 1638, 1654, 1655, 1657, 1645,
+ 1649, 1649, 1650, 1656, 1654, 1640, 1647, 1658, 1660, 1661,
+ 1656, 1663, 1655, 1659, 1646, 1651, 1650, 1665, 1652, 1653,
+ 1659, 1662, 1658, 1654, 1655, 1657, 1667, 1664, 1664, 1662,
+
+ 1656, 1661, 1660, 1668, 1658, 1660, 1661, 1664, 1671, 1670,
+ 1659, 1668, 1663, 1673, 1665, 1672, 1674, 1675, 1662, 1676,
+ 1678, 1671, 1680, 1667, 1664, 1664, 1682, 1685, 1686, 1690,
+ 1668, 1670, 1683, 1684, 0, 1671, 1670, 1672, 1689, 1691,
+ 1673, 1676, 1672, 1674, 1675, 1683, 1676, 1678, 1680, 1680,
+ 1686, 1684, 1693, 1682, 1685, 1686, 1690, 1689, 1694, 1683,
+ 1684, 1691, 1695, 1696, 1697, 1689, 1691, 1698, 1698, 1704,
+ 1699, 1700, 1696, 1694, 1693, 1697, 1699, 1698, 1705, 1693,
+ 1703, 1695, 1710, 1706, 0, 1694, 1714, 1703, 1712, 1695,
+ 1696, 1697, 1717, 1700, 1698, 1698, 1704, 1699, 1700, 1715,
+
+ 1721, 1722, 1718, 1723, 0, 1705, 1706, 1703, 1720, 1710,
+ 1706, 1712, 1715, 1714, 1718, 1712, 1724, 1720, 1724, 1717,
+ 1725, 1730, 1727, 1728, 1733, 1723, 1715, 1721, 1722, 1718,
+ 1723, 1726, 1725, 1729, 1735, 1720, 1737, 1726, 1739, 0,
+ 1740, 1729, 1745, 1724, 1727, 1728, 1743, 1725, 1730, 1727,
+ 1728, 1733, 1744, 1739, 1746, 1745, 0, 1754, 1726, 1748,
+ 1729, 1735, 0, 1737, 1747, 1739, 1740, 1740, 1748, 1745,
+ 1743, 1749, 1747, 1743, 1756, 1757, 1746, 1763, 1755, 1758,
+ 1754, 1746, 1749, 1744, 1754, 1755, 1748, 1758, 1759, 1757,
+ 1756, 1747, 1760, 1761, 1764, 1761, 1762, 1759, 1749, 1765,
+
+ 1766, 1756, 1757, 1760, 1763, 1755, 1758, 1767, 1762, 1768,
+ 1770, 1768, 1764, 1769, 1776, 1759, 1773, 1771, 1777, 1760,
+ 1761, 1764, 1766, 1762, 1775, 1769, 1765, 1766, 1773, 1767,
+ 1771, 1780, 1775, 1778, 1767, 1781, 1768, 1786, 1779, 1780,
+ 1769, 1770, 1782, 1773, 1771, 1776, 1778, 1783, 1781, 1777,
+ 1782, 1775, 1779, 1784, 1787, 1785, 1794, 1789, 1780, 1786,
+ 1778, 1783, 1781, 1785, 1786, 1779, 1790, 1784, 1791, 1782,
+ 1788, 1793, 1792, 1795, 1783, 1799, 1787, 0, 1788, 1793,
+ 1784, 1787, 1785, 1789, 1789, 1796, 1803, 1794, 1790, 1801,
+ 1791, 0, 0, 1790, 1792, 1791, 1797, 1788, 1793, 1792,
+
+ 1795, 1798, 1800, 1801, 1797, 1796, 1799, 1804, 1803, 1798,
+ 1800, 1805, 1796, 1803, 1807, 1804, 1801, 1806, 1809, 1805,
+ 1808, 0, 1810, 1797, 1811, 0, 1809, 1814, 1798, 1800,
+ 1812, 1806, 1815, 1813, 1804, 1814, 1816, 0, 1805, 0,
+ 1807, 1807, 1808, 1819, 1806, 1809, 1817, 1808, 1810, 1810,
+ 1811, 1811, 1812, 1813, 1814, 1822, 1816, 1812, 1823, 1815,
+ 1813, 1818, 1830, 1816, 1820, 1819, 1817, 1824, 1825, 1818,
+ 1819, 1826, 1820, 1817, 1829, 1824, 1825, 1822, 1827, 1828,
+ 1823, 1832, 1822, 1831, 1833, 1823, 1827, 1828, 1818, 1830,
+ 0, 1820, 1834, 1836, 1824, 1825, 1839, 1826, 1826, 1840,
+
+ 1829, 1829, 1842, 1831, 1843, 1827, 1828, 1840, 1832, 1841,
+ 1831, 1833, 1834, 0, 0, 1836, 0, 1841, 1839, 1834,
+ 1836, 0, 0, 1839, 0, 0, 1840, 0, 0, 1842,
+ 0, 1843, 0, 0, 0, 0, 1841, 1847, 1847, 1847,
+ 1847, 1847, 1847, 1847, 1848, 1848, 1848, 1848, 1848, 1848,
+ 1848, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1850, 1850,
+ 1850, 1850, 1850, 1850, 1850, 1851, 1851, 1851, 1851, 1851,
+ 1851, 1851, 1853, 1853, 0, 1853, 1853, 1853, 1853, 1854,
+ 1854, 0, 0, 0, 1854, 1854, 1855, 1855, 0, 0,
+ 1855, 0, 1855, 1856, 0, 0, 0, 0, 0, 1856,
+
+ 1857, 1857, 0, 0, 0, 1857, 1857, 1858, 0, 0,
+ 0, 0, 0, 1858, 1859, 1859, 0, 1859, 1859, 1859,
+ 1859, 1860, 1860, 0, 1860, 1860, 1860, 1860, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846
+
} ;
static yy_state_type yy_last_accepting_state;
@@ -2396,7 +2451,7 @@ static void config_end_include(void)
#define YY_NO_INPUT 1
#endif
-#line 2398 "<stdout>"
+#line 2453 "<stdout>"
#define INITIAL 0
#define quotedstring 1
@@ -2434,11 +2489,11 @@ void yyset_extra (YY_EXTRA_TYPE user_defined );
FILE *yyget_in (void );
-void yyset_in (FILE * in_str );
+void yyset_in (FILE * _in_str );
FILE *yyget_out (void );
-void yyset_out (FILE * out_str );
+void yyset_out (FILE * _out_str );
yy_size_t yyget_leng (void );
@@ -2446,7 +2501,7 @@ char *yyget_text (void );
int yyget_lineno (void );
-void yyset_lineno (int line_number );
+void yyset_lineno (int _line_number );
/* Macros after this point can all be overridden by user definitions in
* section 1.
@@ -2460,6 +2515,10 @@ extern int yywrap (void );
#endif
#endif
+#ifndef YY_NO_UNPUT
+
+#endif
+
#ifndef yytext_ptr
static void yy_flex_strncpy (char *,yyconst char *,int );
#endif
@@ -2480,7 +2539,12 @@ static int input (void );
/* 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. */
@@ -2567,7 +2631,7 @@ extern int yylex (void);
/* Code executed at the end of each rule. */
#ifndef YY_BREAK
-#define YY_BREAK break;
+#define YY_BREAK /*LINTED*/break;
#endif
#define YY_RULE_SETUP \
@@ -2577,9 +2641,9 @@ extern int yylex (void);
*/
YY_DECL
{
- register yy_state_type yy_current_state;
- register char *yy_cp, *yy_bp;
- register int yy_act;
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
if ( !(yy_init) )
{
@@ -2610,9 +2674,9 @@ YY_DECL
{
#line 201 "util/configlexer.lex"
-#line 2612 "<stdout>"
+#line 2676 "<stdout>"
- while ( 1 ) /* loops until end-of-file is reached */
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
(yy_more_len) = 0;
if ( (yy_more_flag) )
@@ -2634,7 +2698,7 @@ YY_DECL
yy_match:
do
{
- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+ 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;
@@ -2643,13 +2707,13 @@ yy_match:
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 >= 1800 )
+ if ( yy_current_state >= 1847 )
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] != 5211 );
+ while ( yy_base[yy_current_state] != 5329 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
@@ -2839,675 +2903,695 @@ YY_RULE_SETUP
case 33:
YY_RULE_SETUP
#line 237 "util/configlexer.lex"
-{ YDVAR(1, VAR_CHROOT) }
+{ YDVAR(1, VAR_IP_FREEBIND) }
YY_BREAK
case 34:
YY_RULE_SETUP
#line 238 "util/configlexer.lex"
-{ YDVAR(1, VAR_USERNAME) }
+{ YDVAR(1, VAR_CHROOT) }
YY_BREAK
case 35:
YY_RULE_SETUP
#line 239 "util/configlexer.lex"
-{ YDVAR(1, VAR_DIRECTORY) }
+{ YDVAR(1, VAR_USERNAME) }
YY_BREAK
case 36:
YY_RULE_SETUP
#line 240 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOGFILE) }
+{ YDVAR(1, VAR_DIRECTORY) }
YY_BREAK
case 37:
YY_RULE_SETUP
#line 241 "util/configlexer.lex"
-{ YDVAR(1, VAR_PIDFILE) }
+{ YDVAR(1, VAR_LOGFILE) }
YY_BREAK
case 38:
YY_RULE_SETUP
#line 242 "util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_HINTS) }
+{ YDVAR(1, VAR_PIDFILE) }
YY_BREAK
case 39:
YY_RULE_SETUP
#line 243 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
+{ YDVAR(1, VAR_ROOT_HINTS) }
YY_BREAK
case 40:
YY_RULE_SETUP
#line 244 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
+{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
YY_BREAK
case 41:
YY_RULE_SETUP
#line 245 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
+{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
YY_BREAK
case 42:
YY_RULE_SETUP
#line 246 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
+{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
YY_BREAK
case 43:
YY_RULE_SETUP
#line 247 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
+{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
YY_BREAK
case 44:
YY_RULE_SETUP
#line 248 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
+{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
YY_BREAK
case 45:
YY_RULE_SETUP
#line 249 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_TTL) }
+{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
YY_BREAK
case 46:
YY_RULE_SETUP
#line 250 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
+{ YDVAR(1, VAR_CACHE_MAX_TTL) }
YY_BREAK
case 47:
YY_RULE_SETUP
#line 251 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MIN_TTL) }
+{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
YY_BREAK
case 48:
YY_RULE_SETUP
#line 252 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_HOST_TTL) }
+{ YDVAR(1, VAR_CACHE_MIN_TTL) }
YY_BREAK
case 49:
YY_RULE_SETUP
#line 253 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_LAME_TTL) }
+{ YDVAR(1, VAR_INFRA_HOST_TTL) }
YY_BREAK
case 50:
YY_RULE_SETUP
#line 254 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
+{ YDVAR(1, VAR_INFRA_LAME_TTL) }
YY_BREAK
case 51:
YY_RULE_SETUP
#line 255 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
+{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
YY_BREAK
case 52:
YY_RULE_SETUP
#line 256 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
+{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
YY_BREAK
case 53:
YY_RULE_SETUP
#line 257 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
+{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
YY_BREAK
case 54:
YY_RULE_SETUP
#line 258 "util/configlexer.lex"
-{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
+{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
YY_BREAK
case 55:
YY_RULE_SETUP
#line 259 "util/configlexer.lex"
-{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
+{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
YY_BREAK
case 56:
YY_RULE_SETUP
#line 260 "util/configlexer.lex"
-{ YDVAR(1, VAR_DELAY_CLOSE) }
+{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
YY_BREAK
case 57:
YY_RULE_SETUP
#line 261 "util/configlexer.lex"
-{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
+{ YDVAR(1, VAR_DELAY_CLOSE) }
YY_BREAK
case 58:
YY_RULE_SETUP
#line 262 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
+{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
YY_BREAK
case 59:
YY_RULE_SETUP
#line 263 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
+{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
YY_BREAK
case 60:
YY_RULE_SETUP
#line 264 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_GLUE) }
+{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
YY_BREAK
case 61:
YY_RULE_SETUP
#line 265 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
+{ YDVAR(1, VAR_HARDEN_GLUE) }
YY_BREAK
case 62:
YY_RULE_SETUP
#line 266 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
+{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
YY_BREAK
case 63:
YY_RULE_SETUP
#line 267 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
+{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
YY_BREAK
case 64:
YY_RULE_SETUP
#line 268 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
+{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
YY_BREAK
case 65:
YY_RULE_SETUP
#line 269 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
+{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
YY_BREAK
case 66:
YY_RULE_SETUP
#line 270 "util/configlexer.lex"
-{ YDVAR(1, VAR_CAPS_WHITELIST) }
+{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
YY_BREAK
case 67:
YY_RULE_SETUP
#line 271 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
+{ YDVAR(1, VAR_CAPS_WHITELIST) }
YY_BREAK
case 68:
YY_RULE_SETUP
#line 272 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
+{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
YY_BREAK
case 69:
YY_RULE_SETUP
#line 273 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
+{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
YY_BREAK
case 70:
YY_RULE_SETUP
#line 274 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH_KEY) }
+{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
YY_BREAK
case 71:
YY_RULE_SETUP
#line 275 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH) }
+{ YDVAR(1, VAR_PREFETCH_KEY) }
YY_BREAK
case 72:
YY_RULE_SETUP
#line 276 "util/configlexer.lex"
-{ YDVAR(0, VAR_STUB_ZONE) }
+{ YDVAR(1, VAR_PREFETCH) }
YY_BREAK
case 73:
YY_RULE_SETUP
#line 277 "util/configlexer.lex"
-{ YDVAR(1, VAR_NAME) }
+{ YDVAR(0, VAR_STUB_ZONE) }
YY_BREAK
case 74:
YY_RULE_SETUP
#line 278 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_ADDR) }
+{ YDVAR(1, VAR_NAME) }
YY_BREAK
case 75:
YY_RULE_SETUP
#line 279 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_HOST) }
+{ YDVAR(1, VAR_STUB_ADDR) }
YY_BREAK
case 76:
YY_RULE_SETUP
#line 280 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_PRIME) }
+{ YDVAR(1, VAR_STUB_HOST) }
YY_BREAK
case 77:
YY_RULE_SETUP
#line 281 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_FIRST) }
+{ YDVAR(1, VAR_STUB_PRIME) }
YY_BREAK
case 78:
YY_RULE_SETUP
#line 282 "util/configlexer.lex"
-{ YDVAR(0, VAR_FORWARD_ZONE) }
+{ YDVAR(1, VAR_STUB_FIRST) }
YY_BREAK
case 79:
YY_RULE_SETUP
#line 283 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_ADDR) }
+{ YDVAR(0, VAR_FORWARD_ZONE) }
YY_BREAK
case 80:
YY_RULE_SETUP
#line 284 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_HOST) }
+{ YDVAR(1, VAR_FORWARD_ADDR) }
YY_BREAK
case 81:
YY_RULE_SETUP
#line 285 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_FIRST) }
+{ YDVAR(1, VAR_FORWARD_HOST) }
YY_BREAK
case 82:
YY_RULE_SETUP
#line 286 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
+{ YDVAR(1, VAR_FORWARD_FIRST) }
YY_BREAK
case 83:
YY_RULE_SETUP
#line 287 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
+{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
YY_BREAK
case 84:
YY_RULE_SETUP
#line 288 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL) }
+{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
YY_BREAK
case 85:
YY_RULE_SETUP
#line 289 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_IDENTITY) }
+{ YDVAR(2, VAR_ACCESS_CONTROL) }
YY_BREAK
case 86:
YY_RULE_SETUP
#line 290 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_VERSION) }
+{ YDVAR(1, VAR_HIDE_IDENTITY) }
YY_BREAK
case 87:
YY_RULE_SETUP
#line 291 "util/configlexer.lex"
-{ YDVAR(1, VAR_IDENTITY) }
+{ YDVAR(1, VAR_HIDE_VERSION) }
YY_BREAK
case 88:
YY_RULE_SETUP
#line 292 "util/configlexer.lex"
-{ YDVAR(1, VAR_VERSION) }
+{ YDVAR(1, VAR_IDENTITY) }
YY_BREAK
case 89:
YY_RULE_SETUP
#line 293 "util/configlexer.lex"
-{ YDVAR(1, VAR_MODULE_CONF) }
+{ YDVAR(1, VAR_VERSION) }
YY_BREAK
case 90:
YY_RULE_SETUP
#line 294 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR) }
+{ YDVAR(1, VAR_MODULE_CONF) }
YY_BREAK
case 91:
YY_RULE_SETUP
#line 295 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
+{ YDVAR(1, VAR_DLV_ANCHOR) }
YY_BREAK
case 92:
YY_RULE_SETUP
#line 296 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
YY_BREAK
case 93:
YY_RULE_SETUP
#line 297 "util/configlexer.lex"
-{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
YY_BREAK
case 94:
YY_RULE_SETUP
#line 298 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
+{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
YY_BREAK
case 95:
YY_RULE_SETUP
#line 299 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR) }
+{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
YY_BREAK
case 96:
YY_RULE_SETUP
#line 300 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
+{ YDVAR(1, VAR_TRUST_ANCHOR) }
YY_BREAK
case 97:
YY_RULE_SETUP
#line 301 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
+{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
YY_BREAK
case 98:
YY_RULE_SETUP
#line 302 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
YY_BREAK
case 99:
YY_RULE_SETUP
#line 303 "util/configlexer.lex"
-{ YDVAR(1, VAR_BOGUS_TTL) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
YY_BREAK
case 100:
YY_RULE_SETUP
#line 304 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
+{ YDVAR(1, VAR_BOGUS_TTL) }
YY_BREAK
case 101:
YY_RULE_SETUP
#line 305 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
+{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
YY_BREAK
case 102:
YY_RULE_SETUP
#line 306 "util/configlexer.lex"
-{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
+{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
YY_BREAK
case 103:
YY_RULE_SETUP
#line 307 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
+{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
YY_BREAK
case 104:
YY_RULE_SETUP
#line 308 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
+{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
YY_BREAK
case 105:
YY_RULE_SETUP
#line 309 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
+{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
YY_BREAK
case 106:
YY_RULE_SETUP
#line 310 "util/configlexer.lex"
-{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
+{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
YY_BREAK
case 107:
YY_RULE_SETUP
#line 311 "util/configlexer.lex"
-{
- YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
+{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
YY_BREAK
case 108:
YY_RULE_SETUP
-#line 313 "util/configlexer.lex"
-{ YDVAR(1, VAR_ADD_HOLDDOWN) }
+#line 312 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
YY_BREAK
case 109:
YY_RULE_SETUP
#line 314 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEL_HOLDDOWN) }
+{ YDVAR(1, VAR_ADD_HOLDDOWN) }
YY_BREAK
case 110:
YY_RULE_SETUP
#line 315 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEEP_MISSING) }
+{ YDVAR(1, VAR_DEL_HOLDDOWN) }
YY_BREAK
case 111:
YY_RULE_SETUP
#line 316 "util/configlexer.lex"
-{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
+{ YDVAR(1, VAR_KEEP_MISSING) }
YY_BREAK
case 112:
YY_RULE_SETUP
#line 317 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSLOG) }
+{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
YY_BREAK
case 113:
YY_RULE_SETUP
#line 318 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TIME_ASCII) }
+{ YDVAR(1, VAR_USE_SYSLOG) }
YY_BREAK
case 114:
YY_RULE_SETUP
#line 319 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_QUERIES) }
+{ YDVAR(1, VAR_LOG_TIME_ASCII) }
YY_BREAK
case 115:
YY_RULE_SETUP
#line 320 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE) }
+{ YDVAR(1, VAR_LOG_QUERIES) }
YY_BREAK
case 116:
YY_RULE_SETUP
#line 321 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA) }
+{ YDVAR(2, VAR_LOCAL_ZONE) }
YY_BREAK
case 117:
YY_RULE_SETUP
#line 322 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
+{ YDVAR(1, VAR_LOCAL_DATA) }
YY_BREAK
case 118:
YY_RULE_SETUP
#line 323 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
+{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
YY_BREAK
case 119:
YY_RULE_SETUP
#line 324 "util/configlexer.lex"
-{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
+{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
YY_BREAK
case 120:
YY_RULE_SETUP
#line 325 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
+{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
YY_BREAK
case 121:
YY_RULE_SETUP
#line 326 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
+{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
YY_BREAK
case 122:
YY_RULE_SETUP
#line 327 "util/configlexer.lex"
-{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
+{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
YY_BREAK
case 123:
YY_RULE_SETUP
#line 328 "util/configlexer.lex"
-{ YDVAR(0, VAR_REMOTE_CONTROL) }
+{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
YY_BREAK
case 124:
YY_RULE_SETUP
#line 329 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_ENABLE) }
+{ YDVAR(0, VAR_REMOTE_CONTROL) }
YY_BREAK
case 125:
YY_RULE_SETUP
#line 330 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_INTERFACE) }
+{ YDVAR(1, VAR_CONTROL_ENABLE) }
YY_BREAK
case 126:
YY_RULE_SETUP
#line 331 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_PORT) }
+{ YDVAR(1, VAR_CONTROL_INTERFACE) }
YY_BREAK
case 127:
YY_RULE_SETUP
#line 332 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_USE_CERT) }
+{ YDVAR(1, VAR_CONTROL_PORT) }
YY_BREAK
case 128:
YY_RULE_SETUP
#line 333 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_KEY_FILE) }
+{ YDVAR(1, VAR_CONTROL_USE_CERT) }
YY_BREAK
case 129:
YY_RULE_SETUP
#line 334 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_CERT_FILE) }
+{ YDVAR(1, VAR_SERVER_KEY_FILE) }
YY_BREAK
case 130:
YY_RULE_SETUP
#line 335 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
+{ YDVAR(1, VAR_SERVER_CERT_FILE) }
YY_BREAK
case 131:
YY_RULE_SETUP
#line 336 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
+{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
YY_BREAK
case 132:
YY_RULE_SETUP
#line 337 "util/configlexer.lex"
-{ YDVAR(1, VAR_PYTHON_SCRIPT) }
+{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
YY_BREAK
case 133:
YY_RULE_SETUP
#line 338 "util/configlexer.lex"
-{ YDVAR(0, VAR_PYTHON) }
+{ YDVAR(1, VAR_PYTHON_SCRIPT) }
YY_BREAK
case 134:
YY_RULE_SETUP
#line 339 "util/configlexer.lex"
-{ YDVAR(1, VAR_DOMAIN_INSECURE) }
+{ YDVAR(0, VAR_PYTHON) }
YY_BREAK
case 135:
YY_RULE_SETUP
#line 340 "util/configlexer.lex"
-{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
+{ YDVAR(1, VAR_DOMAIN_INSECURE) }
YY_BREAK
case 136:
YY_RULE_SETUP
#line 341 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
+{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
YY_BREAK
case 137:
YY_RULE_SETUP
#line 342 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_UDP_SIZE) }
+{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
YY_BREAK
case 138:
YY_RULE_SETUP
#line 343 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_PREFIX) }
+{ YDVAR(1, VAR_MAX_UDP_SIZE) }
YY_BREAK
case 139:
YY_RULE_SETUP
#line 344 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_SYNTHALL) }
+{ YDVAR(1, VAR_DNS64_PREFIX) }
YY_BREAK
case 140:
YY_RULE_SETUP
#line 345 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSTAP) }
+{ YDVAR(1, VAR_DNS64_SYNTHALL) }
YY_BREAK
case 141:
YY_RULE_SETUP
#line 346 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_ENABLE) }
+{ YDVAR(1, VAR_DEFINE_TAG) }
YY_BREAK
case 142:
YY_RULE_SETUP
#line 347 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
+{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
YY_BREAK
case 143:
YY_RULE_SETUP
#line 348 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
+{ YDVAR(0, VAR_DNSTAP) }
YY_BREAK
case 144:
YY_RULE_SETUP
#line 349 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
+{ YDVAR(1, VAR_DNSTAP_ENABLE) }
YY_BREAK
case 145:
YY_RULE_SETUP
#line 350 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
+{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
YY_BREAK
case 146:
YY_RULE_SETUP
#line 351 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_VERSION) }
+{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
YY_BREAK
case 147:
YY_RULE_SETUP
#line 352 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
+{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
YY_BREAK
case 148:
YY_RULE_SETUP
-#line 354 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
+#line 353 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
YY_BREAK
case 149:
YY_RULE_SETUP
-#line 356 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
+#line 354 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_VERSION) }
YY_BREAK
case 150:
YY_RULE_SETUP
-#line 358 "util/configlexer.lex"
+#line 355 "util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
YY_BREAK
case 151:
YY_RULE_SETUP
-#line 360 "util/configlexer.lex"
+#line 357 "util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
YY_BREAK
case 152:
YY_RULE_SETUP
-#line 362 "util/configlexer.lex"
+#line 359 "util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
YY_BREAK
case 153:
YY_RULE_SETUP
-#line 364 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT) }
+#line 361 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
YY_BREAK
case 154:
YY_RULE_SETUP
-#line 365 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SLABS) }
+#line 363 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
YY_BREAK
case 155:
YY_RULE_SETUP
-#line 366 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SIZE) }
+#line 365 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
YY_BREAK
case 156:
YY_RULE_SETUP
#line 367 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
+{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
YY_BREAK
case 157:
YY_RULE_SETUP
#line 368 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
+{ YDVAR(1, VAR_RATELIMIT) }
YY_BREAK
case 158:
YY_RULE_SETUP
#line 369 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_RATELIMIT_SLABS) }
YY_BREAK
case 159:
-/* rule 159 can match eol */
YY_RULE_SETUP
#line 370 "util/configlexer.lex"
-{ LEXOUT(("NL\n")); cfg_parser->line++; }
+{ YDVAR(1, VAR_RATELIMIT_SIZE) }
YY_BREAK
-/* Quoted strings. Strip leading and ending quotes */
case 160:
YY_RULE_SETUP
+#line 371 "util/configlexer.lex"
+{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
+ YY_BREAK
+case 161:
+YY_RULE_SETUP
+#line 372 "util/configlexer.lex"
+{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
+ YY_BREAK
+case 162:
+YY_RULE_SETUP
#line 373 "util/configlexer.lex"
+{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+ YY_BREAK
+case 163:
+/* rule 163 can match eol */
+YY_RULE_SETUP
+#line 374 "util/configlexer.lex"
+{ LEXOUT(("NL\n")); cfg_parser->line++; }
+ YY_BREAK
+/* Quoted strings. Strip leading and ending quotes */
+case 164:
+YY_RULE_SETUP
+#line 377 "util/configlexer.lex"
{ BEGIN(quotedstring); LEXOUT(("QS ")); }
YY_BREAK
case YY_STATE_EOF(quotedstring):
-#line 374 "util/configlexer.lex"
+#line 378 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 161:
+case 165:
YY_RULE_SETUP
-#line 379 "util/configlexer.lex"
+#line 383 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 162:
-/* rule 162 can match eol */
+case 166:
+/* rule 166 can match eol */
YY_RULE_SETUP
-#line 380 "util/configlexer.lex"
+#line 384 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end \"");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 163:
+case 167:
YY_RULE_SETUP
-#line 382 "util/configlexer.lex"
+#line 386 "util/configlexer.lex"
{
LEXOUT(("QE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -3520,34 +3604,34 @@ YY_RULE_SETUP
}
YY_BREAK
/* Single Quoted strings. Strip leading and ending quotes */
-case 164:
+case 168:
YY_RULE_SETUP
-#line 394 "util/configlexer.lex"
+#line 398 "util/configlexer.lex"
{ BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
YY_BREAK
case YY_STATE_EOF(singlequotedstr):
-#line 395 "util/configlexer.lex"
+#line 399 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 165:
+case 169:
YY_RULE_SETUP
-#line 400 "util/configlexer.lex"
+#line 404 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 166:
-/* rule 166 can match eol */
+case 170:
+/* rule 170 can match eol */
YY_RULE_SETUP
-#line 401 "util/configlexer.lex"
+#line 405 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end '");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 167:
+case 171:
YY_RULE_SETUP
-#line 403 "util/configlexer.lex"
+#line 407 "util/configlexer.lex"
{
LEXOUT(("SQE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -3560,38 +3644,38 @@ YY_RULE_SETUP
}
YY_BREAK
/* include: directive */
-case 168:
+case 172:
YY_RULE_SETUP
-#line 415 "util/configlexer.lex"
+#line 419 "util/configlexer.lex"
{
LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
YY_BREAK
case YY_STATE_EOF(include):
-#line 417 "util/configlexer.lex"
+#line 421 "util/configlexer.lex"
{
yyerror("EOF inside include directive");
BEGIN(inc_prev);
}
YY_BREAK
-case 169:
+case 173:
YY_RULE_SETUP
-#line 421 "util/configlexer.lex"
+#line 425 "util/configlexer.lex"
{ LEXOUT(("ISP ")); /* ignore */ }
YY_BREAK
-case 170:
-/* rule 170 can match eol */
+case 174:
+/* rule 174 can match eol */
YY_RULE_SETUP
-#line 422 "util/configlexer.lex"
+#line 426 "util/configlexer.lex"
{ LEXOUT(("NL\n")); cfg_parser->line++;}
YY_BREAK
-case 171:
+case 175:
YY_RULE_SETUP
-#line 423 "util/configlexer.lex"
+#line 427 "util/configlexer.lex"
{ LEXOUT(("IQS ")); BEGIN(include_quoted); }
YY_BREAK
-case 172:
+case 176:
YY_RULE_SETUP
-#line 424 "util/configlexer.lex"
+#line 428 "util/configlexer.lex"
{
LEXOUT(("Iunquotedstr(%s) ", yytext));
config_start_include_glob(yytext);
@@ -3599,27 +3683,27 @@ YY_RULE_SETUP
}
YY_BREAK
case YY_STATE_EOF(include_quoted):
-#line 429 "util/configlexer.lex"
+#line 433 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
BEGIN(inc_prev);
}
YY_BREAK
-case 173:
+case 177:
YY_RULE_SETUP
-#line 433 "util/configlexer.lex"
+#line 437 "util/configlexer.lex"
{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 174:
-/* rule 174 can match eol */
+case 178:
+/* rule 178 can match eol */
YY_RULE_SETUP
-#line 434 "util/configlexer.lex"
+#line 438 "util/configlexer.lex"
{ yyerror("newline before \" in include name");
cfg_parser->line++; BEGIN(inc_prev); }
YY_BREAK
-case 175:
+case 179:
YY_RULE_SETUP
-#line 436 "util/configlexer.lex"
+#line 440 "util/configlexer.lex"
{
LEXOUT(("IQE "));
yytext[yyleng - 1] = '\0';
@@ -3629,7 +3713,7 @@ YY_RULE_SETUP
YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(val):
-#line 442 "util/configlexer.lex"
+#line 446 "util/configlexer.lex"
{
LEXOUT(("LEXEOF "));
yy_set_bol(1); /* Set beginning of line, so "^" rules match. */
@@ -3641,33 +3725,33 @@ case YY_STATE_EOF(val):
}
}
YY_BREAK
-case 176:
+case 180:
YY_RULE_SETUP
-#line 453 "util/configlexer.lex"
+#line 457 "util/configlexer.lex"
{ LEXOUT(("unquotedstr(%s) ", yytext));
if(--num_args == 0) { BEGIN(INITIAL); }
yylval.str = strdup(yytext); return STRING_ARG; }
YY_BREAK
-case 177:
+case 181:
YY_RULE_SETUP
-#line 457 "util/configlexer.lex"
+#line 461 "util/configlexer.lex"
{
ub_c_error_msg("unknown keyword '%s'", yytext);
}
YY_BREAK
-case 178:
+case 182:
YY_RULE_SETUP
-#line 461 "util/configlexer.lex"
+#line 465 "util/configlexer.lex"
{
ub_c_error_msg("stray '%s'", yytext);
}
YY_BREAK
-case 179:
+case 183:
YY_RULE_SETUP
-#line 465 "util/configlexer.lex"
+#line 469 "util/configlexer.lex"
ECHO;
YY_BREAK
-#line 3669 "<stdout>"
+#line 3753 "<stdout>"
case YY_END_OF_BUFFER:
{
@@ -3808,9 +3892,9 @@ ECHO;
*/
static int yy_get_next_buffer (void)
{
- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
- register char *source = (yytext_ptr);
- register int number_to_move, i;
+ 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] )
@@ -3839,7 +3923,7 @@ static int yy_get_next_buffer (void)
/* Try to read more data. */
/* First move last chars to start of buffer. */
- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+ number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1;
for ( i = 0; i < number_to_move; ++i )
*(dest++) = *(source++);
@@ -3942,14 +4026,14 @@ static int yy_get_next_buffer (void)
static yy_state_type yy_get_previous_state (void)
{
- register yy_state_type yy_current_state;
- register char *yy_cp;
+ 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 )
{
- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ 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;
@@ -3958,7 +4042,7 @@ static int yy_get_next_buffer (void)
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 >= 1800 )
+ if ( yy_current_state >= 1847 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -3974,10 +4058,10 @@ static int yy_get_next_buffer (void)
*/
static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
{
- register int yy_is_jam;
- register char *yy_cp = (yy_c_buf_p);
+ int yy_is_jam;
+ char *yy_cp = (yy_c_buf_p);
- register YY_CHAR yy_c = 1;
+ YY_CHAR yy_c = 1;
if ( yy_accept[yy_current_state] )
{
(yy_last_accepting_state) = yy_current_state;
@@ -3986,15 +4070,19 @@ static int yy_get_next_buffer (void)
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 >= 1800 )
+ if ( yy_current_state >= 1847 )
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 == 1799);
+ yy_is_jam = (yy_current_state == 1846);
return yy_is_jam ? 0 : yy_current_state;
}
+#ifndef YY_NO_UNPUT
+
+#endif
+
#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput (void)
@@ -4144,7 +4232,7 @@ static void yy_load_buffer_state (void)
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
- b->yy_buf_size = size;
+ 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.
@@ -4299,7 +4387,7 @@ static void yyensure_buffer_stack (void)
* 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;
+ 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*)
);
@@ -4316,7 +4404,7 @@ static void yyensure_buffer_stack (void)
if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
/* Increase the buffer to prepare for a possible push. */
- int grow_size = 8 /* arbitrary grow size */;
+ 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
@@ -4424,7 +4512,7 @@ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len
static void yy_fatal_error (yyconst char* msg )
{
- (void) fprintf( stderr, "%s\n", msg );
+ (void) fprintf( stderr, "%s\n", msg );
exit( YY_EXIT_FAILURE );
}
@@ -4435,7 +4523,7 @@ static void yy_fatal_error (yyconst char* msg )
do \
{ \
/* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
+ 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; \
@@ -4490,29 +4578,29 @@ char *yyget_text (void)
}
/** Set the current line number.
- * @param line_number
+ * @param _line_number line number
*
*/
-void yyset_lineno (int line_number )
+void yyset_lineno (int _line_number )
{
- yylineno = line_number;
+ yylineno = _line_number;
}
/** Set the input stream. This does not discard the current
* input buffer.
- * @param in_str A readable stream.
+ * @param _in_str A readable stream.
*
* @see yy_switch_to_buffer
*/
-void yyset_in (FILE * in_str )
+void yyset_in (FILE * _in_str )
{
- yyin = in_str ;
+ yyin = _in_str ;
}
-void yyset_out (FILE * out_str )
+void yyset_out (FILE * _out_str )
{
- yyout = out_str ;
+ yyout = _out_str ;
}
int yyget_debug (void)
@@ -4520,9 +4608,9 @@ int yyget_debug (void)
return yy_flex_debug;
}
-void yyset_debug (int bdebug )
+void yyset_debug (int _bdebug )
{
- yy_flex_debug = bdebug ;
+ yy_flex_debug = _bdebug ;
}
static int yy_init_globals (void)
@@ -4582,7 +4670,8 @@ int yylex_destroy (void)
#ifndef yytext_ptr
static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
{
- register int i;
+
+ int i;
for ( i = 0; i < n; ++i )
s1[i] = s2[i];
}
@@ -4591,7 +4680,7 @@ static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst char * s )
{
- register int n;
+ int n;
for ( n = 0; s[n]; ++n )
;
@@ -4601,11 +4690,12 @@ static int yy_flex_strlen (yyconst char * s )
void *yyalloc (yy_size_t size )
{
- return (void *) malloc( 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
@@ -4618,12 +4708,12 @@ void *yyrealloc (void * ptr, yy_size_t size )
void yyfree (void * ptr )
{
- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
}
#define YYTABLES_NAME "yytables"
-#line 465 "util/configlexer.lex"
+#line 469 "util/configlexer.lex"
diff --git a/util/configlexer.lex b/util/configlexer.lex
index 6fbf0a839c81..58d642c1da22 100644
--- a/util/configlexer.lex
+++ b/util/configlexer.lex
@@ -234,6 +234,7 @@ 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) }
@@ -342,6 +343,8 @@ 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) }
dnstap{COLON} { YDVAR(0, VAR_DNSTAP) }
dnstap-enable{COLON} { YDVAR(1, VAR_DNSTAP_ENABLE) }
dnstap-socket-path{COLON} { YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
@@ -361,6 +364,7 @@ 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) }
ratelimit{COLON} { YDVAR(1, VAR_RATELIMIT) }
ratelimit-slabs{COLON} { YDVAR(1, VAR_RATELIMIT_SLABS) }
ratelimit-size{COLON} { YDVAR(1, VAR_RATELIMIT_SIZE) }
diff --git a/util/configparser.c b/util/configparser.c
index 8f748f87acd4..01e37d45c23c 100644
--- a/util/configparser.c
+++ b/util/configparser.c
@@ -277,16 +277,20 @@ extern int yydebug;
VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES = 408,
VAR_HARDEN_ALGO_DOWNGRADE = 409,
VAR_IP_TRANSPARENT = 410,
- VAR_RATELIMIT = 411,
- VAR_RATELIMIT_SLABS = 412,
- VAR_RATELIMIT_SIZE = 413,
- VAR_RATELIMIT_FOR_DOMAIN = 414,
- VAR_RATELIMIT_BELOW_DOMAIN = 415,
- VAR_RATELIMIT_FACTOR = 416,
- VAR_CAPS_WHITELIST = 417,
- VAR_CACHE_MAX_NEGATIVE_TTL = 418,
- VAR_PERMIT_SMALL_HOLDDOWN = 419,
- VAR_QNAME_MINIMISATION = 420
+ VAR_DISABLE_DNSSEC_LAME_CHECK = 411,
+ VAR_RATELIMIT = 412,
+ VAR_RATELIMIT_SLABS = 413,
+ VAR_RATELIMIT_SIZE = 414,
+ VAR_RATELIMIT_FOR_DOMAIN = 415,
+ VAR_RATELIMIT_BELOW_DOMAIN = 416,
+ VAR_RATELIMIT_FACTOR = 417,
+ VAR_CAPS_WHITELIST = 418,
+ VAR_CACHE_MAX_NEGATIVE_TTL = 419,
+ VAR_PERMIT_SMALL_HOLDDOWN = 420,
+ VAR_QNAME_MINIMISATION = 421,
+ VAR_IP_FREEBIND = 422,
+ VAR_DEFINE_TAG = 423,
+ VAR_LOCAL_ZONE_TAG = 424
};
#endif
/* Tokens. */
@@ -443,16 +447,20 @@ extern int yydebug;
#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 408
#define VAR_HARDEN_ALGO_DOWNGRADE 409
#define VAR_IP_TRANSPARENT 410
-#define VAR_RATELIMIT 411
-#define VAR_RATELIMIT_SLABS 412
-#define VAR_RATELIMIT_SIZE 413
-#define VAR_RATELIMIT_FOR_DOMAIN 414
-#define VAR_RATELIMIT_BELOW_DOMAIN 415
-#define VAR_RATELIMIT_FACTOR 416
-#define VAR_CAPS_WHITELIST 417
-#define VAR_CACHE_MAX_NEGATIVE_TTL 418
-#define VAR_PERMIT_SMALL_HOLDDOWN 419
-#define VAR_QNAME_MINIMISATION 420
+#define VAR_DISABLE_DNSSEC_LAME_CHECK 411
+#define VAR_RATELIMIT 412
+#define VAR_RATELIMIT_SLABS 413
+#define VAR_RATELIMIT_SIZE 414
+#define VAR_RATELIMIT_FOR_DOMAIN 415
+#define VAR_RATELIMIT_BELOW_DOMAIN 416
+#define VAR_RATELIMIT_FACTOR 417
+#define VAR_CAPS_WHITELIST 418
+#define VAR_CACHE_MAX_NEGATIVE_TTL 419
+#define VAR_PERMIT_SMALL_HOLDDOWN 420
+#define VAR_QNAME_MINIMISATION 421
+#define VAR_IP_FREEBIND 422
+#define VAR_DEFINE_TAG 423
+#define VAR_LOCAL_ZONE_TAG 424
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -463,7 +471,7 @@ union YYSTYPE
char* str;
-#line 467 "util/configparser.c" /* yacc.c:355 */
+#line 475 "util/configparser.c" /* yacc.c:355 */
};
typedef union YYSTYPE YYSTYPE;
@@ -480,7 +488,7 @@ int yyparse (void);
/* Copy the second part of user declarations. */
-#line 484 "util/configparser.c" /* yacc.c:358 */
+#line 492 "util/configparser.c" /* yacc.c:358 */
#ifdef short
# undef short
@@ -722,21 +730,21 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 2
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 310
+#define YYLAST 319
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 166
+#define YYNTOKENS 170
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 171
+#define YYNNTS 175
/* YYNRULES -- Number of rules. */
-#define YYNRULES 327
+#define YYNRULES 335
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 482
+#define YYNSTATES 495
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
by yylex, with out-of-bounds checking. */
#define YYUNDEFTOK 2
-#define YYMAXUTOK 420
+#define YYMAXUTOK 424
#define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -787,46 +795,47 @@ static const yytype_uint8 yytranslate[] =
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
+ 165, 166, 167, 168, 169
};
#if YYDEBUG
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
- 0, 130, 130, 130, 131, 131, 132, 132, 133, 133,
- 137, 142, 143, 144, 144, 144, 145, 145, 146, 146,
- 146, 147, 147, 148, 148, 148, 149, 149, 149, 150,
- 150, 151, 151, 152, 152, 153, 153, 154, 154, 155,
- 155, 156, 156, 157, 157, 158, 158, 158, 159, 159,
- 159, 160, 160, 160, 161, 161, 162, 162, 163, 163,
- 164, 164, 165, 165, 165, 166, 166, 167, 167, 168,
- 168, 168, 169, 169, 170, 170, 171, 171, 172, 172,
- 172, 173, 173, 174, 174, 175, 175, 176, 176, 177,
- 177, 178, 178, 178, 179, 179, 180, 180, 180, 181,
- 181, 181, 182, 182, 182, 183, 183, 183, 184, 184,
- 184, 185, 185, 185, 186, 186, 187, 187, 188, 188,
- 189, 189, 190, 190, 190, 191, 191, 192, 192, 193,
- 193, 194, 194, 196, 208, 209, 210, 210, 210, 210,
- 210, 212, 224, 225, 226, 226, 226, 226, 228, 237,
- 246, 257, 266, 275, 284, 297, 312, 321, 330, 339,
- 348, 357, 366, 375, 384, 393, 402, 411, 420, 429,
- 438, 445, 452, 461, 470, 484, 493, 502, 509, 516,
- 523, 531, 538, 545, 552, 559, 567, 575, 583, 590,
- 597, 606, 615, 622, 629, 637, 645, 655, 665, 678,
- 689, 697, 710, 719, 728, 737, 747, 757, 765, 778,
- 787, 795, 804, 812, 825, 834, 841, 851, 861, 871,
- 881, 891, 901, 911, 921, 928, 935, 942, 951, 960,
- 969, 976, 986, 1003, 1010, 1028, 1041, 1054, 1063, 1072,
- 1081, 1090, 1100, 1110, 1119, 1128, 1135, 1144, 1153, 1162,
- 1171, 1179, 1192, 1200, 1224, 1231, 1246, 1256, 1266, 1273,
- 1280, 1289, 1298, 1306, 1319, 1332, 1345, 1354, 1364, 1374,
- 1381, 1388, 1397, 1407, 1417, 1424, 1431, 1440, 1445, 1446,
- 1447, 1447, 1447, 1448, 1448, 1448, 1449, 1449, 1451, 1461,
- 1470, 1477, 1487, 1494, 1501, 1508, 1515, 1520, 1521, 1522,
- 1522, 1523, 1523, 1524, 1524, 1525, 1526, 1527, 1528, 1529,
- 1530, 1532, 1540, 1547, 1555, 1563, 1570, 1577, 1586, 1595,
- 1604, 1613, 1622, 1631, 1636, 1637, 1638, 1640
+ 0, 131, 131, 131, 132, 132, 133, 133, 134, 134,
+ 138, 143, 144, 145, 145, 145, 146, 146, 147, 147,
+ 147, 148, 148, 149, 149, 149, 150, 150, 150, 151,
+ 151, 152, 152, 153, 153, 154, 154, 155, 155, 156,
+ 156, 157, 157, 158, 158, 159, 159, 159, 160, 160,
+ 160, 161, 161, 161, 162, 162, 163, 163, 164, 164,
+ 165, 165, 166, 166, 166, 167, 167, 168, 168, 169,
+ 169, 169, 170, 170, 171, 171, 172, 172, 173, 173,
+ 173, 174, 174, 175, 175, 176, 176, 177, 177, 178,
+ 178, 179, 179, 179, 180, 180, 181, 181, 181, 182,
+ 182, 182, 183, 183, 183, 184, 184, 184, 185, 185,
+ 185, 186, 186, 186, 187, 187, 188, 188, 189, 189,
+ 190, 190, 191, 191, 191, 192, 192, 193, 193, 194,
+ 194, 195, 195, 196, 196, 196, 197, 199, 211, 212,
+ 213, 213, 213, 213, 213, 215, 227, 228, 229, 229,
+ 229, 229, 231, 240, 249, 260, 269, 278, 287, 300,
+ 315, 324, 333, 342, 351, 360, 369, 378, 387, 396,
+ 405, 414, 423, 432, 441, 448, 455, 464, 473, 487,
+ 496, 505, 512, 519, 526, 534, 541, 548, 555, 562,
+ 570, 578, 586, 593, 600, 609, 618, 625, 632, 640,
+ 648, 658, 668, 678, 691, 702, 710, 723, 732, 741,
+ 750, 760, 770, 778, 791, 800, 808, 817, 825, 838,
+ 847, 854, 864, 874, 884, 894, 904, 914, 924, 934,
+ 941, 948, 955, 964, 973, 982, 989, 999, 1016, 1023,
+ 1041, 1054, 1067, 1076, 1085, 1094, 1103, 1113, 1123, 1132,
+ 1141, 1148, 1157, 1166, 1175, 1184, 1192, 1205, 1213, 1237,
+ 1244, 1259, 1269, 1279, 1286, 1293, 1302, 1316, 1335, 1344,
+ 1352, 1365, 1378, 1391, 1400, 1410, 1420, 1427, 1434, 1443,
+ 1453, 1463, 1470, 1477, 1486, 1491, 1492, 1493, 1493, 1493,
+ 1494, 1494, 1494, 1495, 1495, 1497, 1507, 1516, 1523, 1533,
+ 1540, 1547, 1554, 1561, 1566, 1567, 1568, 1568, 1569, 1569,
+ 1570, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1578, 1586,
+ 1593, 1601, 1609, 1616, 1623, 1632, 1641, 1650, 1659, 1668,
+ 1677, 1682, 1683, 1684, 1686, 1692
};
#endif
@@ -888,15 +897,17 @@ static const char *const yytname[] =
"VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES",
"VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES",
"VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES",
- "VAR_HARDEN_ALGO_DOWNGRADE", "VAR_IP_TRANSPARENT", "VAR_RATELIMIT",
- "VAR_RATELIMIT_SLABS", "VAR_RATELIMIT_SIZE", "VAR_RATELIMIT_FOR_DOMAIN",
+ "VAR_HARDEN_ALGO_DOWNGRADE", "VAR_IP_TRANSPARENT",
+ "VAR_DISABLE_DNSSEC_LAME_CHECK", "VAR_RATELIMIT", "VAR_RATELIMIT_SLABS",
+ "VAR_RATELIMIT_SIZE", "VAR_RATELIMIT_FOR_DOMAIN",
"VAR_RATELIMIT_BELOW_DOMAIN", "VAR_RATELIMIT_FACTOR",
"VAR_CAPS_WHITELIST", "VAR_CACHE_MAX_NEGATIVE_TTL",
- "VAR_PERMIT_SMALL_HOLDDOWN", "VAR_QNAME_MINIMISATION", "$accept",
- "toplevelvars", "toplevelvar", "serverstart", "contents_server",
- "content_server", "stubstart", "contents_stub", "content_stub",
- "forwardstart", "contents_forward", "content_forward",
- "server_num_threads", "server_verbosity", "server_statistics_interval",
+ "VAR_PERMIT_SMALL_HOLDDOWN", "VAR_QNAME_MINIMISATION", "VAR_IP_FREEBIND",
+ "VAR_DEFINE_TAG", "VAR_LOCAL_ZONE_TAG", "$accept", "toplevelvars",
+ "toplevelvar", "serverstart", "contents_server", "content_server",
+ "stubstart", "contents_stub", "content_stub", "forwardstart",
+ "contents_forward", "content_forward", "server_num_threads",
+ "server_verbosity", "server_statistics_interval",
"server_statistics_cumulative", "server_extended_statistics",
"server_port", "server_interface", "server_outgoing_interface",
"server_outgoing_range", "server_outgoing_port_permit",
@@ -914,54 +925,55 @@ static const char *const yytname[] =
"server_domain_insecure", "server_hide_identity", "server_hide_version",
"server_identity", "server_version", "server_so_rcvbuf",
"server_so_sndbuf", "server_so_reuseport", "server_ip_transparent",
- "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_val_log_level",
- "server_val_nsec3_keysize_iterations", "server_add_holddown",
- "server_del_holddown", "server_keep_missing",
+ "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_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_ratelimit", "server_ratelimit_size",
- "server_ratelimit_slabs", "server_ratelimit_for_domain",
- "server_ratelimit_below_domain", "server_ratelimit_factor",
- "server_qname_minimisation", "stub_name", "stub_host", "stub_addr",
- "stub_first", "stub_prime", "forward_name", "forward_host",
- "forward_addr", "forward_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",
+ "server_dns64_synthall", "server_define_tag", "server_local_zone_tag",
+ "server_ratelimit", "server_ratelimit_size", "server_ratelimit_slabs",
+ "server_ratelimit_for_domain", "server_ratelimit_below_domain",
+ "server_ratelimit_factor", "server_qname_minimisation", "stub_name",
+ "stub_host", "stub_addr", "stub_first", "stub_prime", "forward_name",
+ "forward_host", "forward_addr", "forward_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", YY_NULLPTR
+ "contents_py", "content_py", "py_script",
+ "server_disable_dnssec_lame_check", YY_NULLPTR
};
#endif
@@ -986,7 +998,7 @@ static const yytype_uint16 yytoknum[] =
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
+ 415, 416, 417, 418, 419, 420, 421, 422, 423, 424
};
# endif
@@ -1007,18 +1019,20 @@ static const yytype_int16 yypact[] =
-81, 118, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -12, 39, 47, 40,
36, -80, 18, 19, 20, 24, 25, 26, 69, 72,
- 73, 74, 75, 80, 109, 120, 129, 130, 144, 145,
- 146, 147, 149, 150, 151, 152, 153, 155, 156, 157,
- 158, 159, 161, 162, 163, 164, 165, 166, 180, 181,
- 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
- 192, 193, 194, 195, 196, 197, 199, 200, 201, 202,
- 203, 204, 205, 206, 207, 208, 209, 210, 211, 212,
- 213, 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, 250, 251, 252, 253, 254,
- 255, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, 266, -81, -81, -81, -81, -81, -81, -81, -81,
+ 73, 74, 75, 80, 109, 120, 129, 130, 149, 150,
+ 151, 152, 153, 155, 156, 157, 158, 159, 161, 162,
+ 163, 164, 165, 166, 180, 181, 182, 183, 184, 185,
+ 186, 187, 188, 189, 190, 191, 192, 193, 194, 195,
+ 196, 197, 199, 200, 201, 202, 203, 204, 205, 206,
+ 207, 208, 209, 210, 211, 212, 213, 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, 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, -81, -81, -81, -81,
+ -81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
+ -81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
@@ -1029,30 +1043,29 @@ static const yytype_int16 yypact[] =
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
+ -81, 275, 276, 277, 278, 279, -81, -81, -81, -81,
+ -81, -81, 280, 281, 282, 283, -81, -81, -81, -81,
+ -81, 284, 285, 286, 287, 288, 289, 290, 291, -81,
+ -81, -81, -81, -81, -81, -81, -81, -81, 292, 293,
+ 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, -81, -81, 267, 268, 269, 270, 271, -81, -81,
- -81, -81, -81, -81, 272, 273, 274, 275, -81, -81,
- -81, -81, -81, 276, 277, 278, 279, 280, 281, 282,
- 283, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- 284, 285, 286, 287, 288, 289, 290, 291, 292, 293,
- 294, 295, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, -81, -81, -81, -81, 296, -81, -81, -81, -81,
+ -81, -81, -81, 304, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, -81, -81, 297, 298, -81, -81, -81, -81, -81,
+ -81, 305, 306, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, 299, 300, -81, -81, -81, -81, -81, -81, -81,
+ 307, 308, -81, -81, -81, -81, -81, -81, -81, 309,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, -81
+ -81, -81, -81, -81, -81
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1060,8 +1073,8 @@ static const yytype_int16 yypact[] =
means the default is an error. */
static const yytype_uint16 yydefact[] =
{
- 2, 0, 1, 10, 133, 141, 277, 323, 296, 3,
- 12, 135, 143, 279, 298, 325, 4, 5, 6, 8,
+ 2, 0, 1, 10, 137, 145, 284, 330, 303, 3,
+ 12, 139, 147, 286, 305, 332, 4, 5, 6, 8,
9, 7, 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,
@@ -1074,41 +1087,42 @@ static const yytype_uint16 yydefact[] =
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, 11, 13, 14, 72, 75, 84, 15, 23,
- 63, 16, 76, 77, 34, 56, 71, 17, 18, 19,
- 20, 21, 22, 106, 107, 108, 109, 110, 73, 62,
- 88, 105, 24, 25, 26, 27, 28, 64, 78, 79,
- 94, 50, 60, 51, 89, 44, 45, 46, 47, 98,
- 102, 114, 122, 99, 57, 29, 30, 31, 86, 115,
- 116, 117, 32, 33, 35, 36, 38, 39, 37, 120,
- 40, 41, 42, 48, 67, 103, 81, 121, 74, 129,
- 82, 83, 100, 101, 87, 43, 65, 68, 49, 52,
- 90, 91, 66, 130, 92, 53, 54, 55, 104, 93,
- 61, 95, 96, 97, 131, 58, 59, 80, 69, 70,
- 85, 111, 112, 113, 118, 119, 123, 125, 124, 126,
- 127, 128, 132, 0, 0, 0, 0, 0, 134, 136,
- 137, 138, 140, 139, 0, 0, 0, 0, 142, 144,
- 145, 146, 147, 0, 0, 0, 0, 0, 0, 0,
- 0, 278, 280, 282, 281, 287, 283, 284, 285, 286,
+ 0, 0, 0, 0, 0, 0, 11, 13, 14, 72,
+ 75, 84, 15, 23, 63, 16, 76, 77, 34, 56,
+ 71, 17, 18, 19, 20, 21, 22, 106, 107, 108,
+ 109, 110, 73, 62, 88, 105, 24, 25, 26, 27,
+ 28, 64, 78, 79, 94, 50, 60, 51, 89, 44,
+ 45, 46, 47, 98, 102, 114, 122, 133, 99, 57,
+ 29, 30, 31, 86, 115, 116, 117, 32, 33, 35,
+ 36, 38, 39, 37, 120, 40, 41, 42, 48, 67,
+ 103, 81, 121, 74, 129, 82, 83, 100, 101, 87,
+ 43, 65, 68, 49, 52, 90, 91, 66, 130, 92,
+ 53, 54, 55, 104, 93, 61, 95, 96, 97, 131,
+ 58, 59, 80, 69, 70, 85, 111, 112, 113, 118,
+ 119, 134, 135, 123, 125, 124, 126, 127, 128, 132,
+ 136, 0, 0, 0, 0, 0, 138, 140, 141, 142,
+ 144, 143, 0, 0, 0, 0, 146, 148, 149, 150,
+ 151, 0, 0, 0, 0, 0, 0, 0, 0, 285,
+ 287, 289, 288, 294, 290, 291, 292, 293, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 297, 299, 300, 301, 302, 303, 304, 305,
- 306, 307, 308, 309, 310, 0, 324, 326, 149, 148,
- 153, 156, 154, 162, 163, 164, 165, 166, 167, 177,
- 178, 179, 180, 181, 200, 201, 202, 207, 208, 159,
- 209, 210, 213, 211, 212, 215, 216, 217, 230, 190,
- 191, 192, 193, 218, 233, 186, 188, 234, 240, 241,
- 242, 160, 199, 250, 251, 187, 245, 174, 155, 182,
- 231, 237, 219, 0, 0, 254, 161, 150, 173, 223,
- 151, 157, 158, 183, 184, 252, 221, 225, 226, 152,
- 255, 203, 229, 175, 189, 235, 236, 239, 244, 185,
- 248, 246, 247, 194, 198, 227, 228, 195, 196, 220,
- 243, 176, 168, 169, 170, 171, 172, 256, 257, 258,
- 204, 205, 206, 214, 259, 260, 222, 197, 261, 263,
- 262, 0, 0, 266, 224, 238, 249, 267, 268, 269,
- 270, 272, 271, 273, 274, 275, 276, 288, 290, 289,
- 292, 293, 294, 295, 291, 311, 312, 313, 314, 315,
- 316, 317, 318, 319, 320, 321, 322, 327, 232, 253,
- 264, 265
+ 304, 306, 307, 308, 309, 310, 311, 312, 313, 314,
+ 315, 316, 317, 0, 331, 333, 153, 152, 157, 160,
+ 158, 166, 167, 168, 169, 170, 171, 181, 182, 183,
+ 184, 185, 205, 206, 207, 212, 213, 163, 214, 215,
+ 218, 216, 217, 220, 221, 222, 235, 194, 195, 196,
+ 197, 223, 238, 190, 192, 239, 245, 246, 247, 164,
+ 204, 255, 256, 191, 250, 178, 159, 186, 236, 242,
+ 224, 0, 0, 259, 165, 154, 177, 228, 155, 161,
+ 162, 187, 188, 257, 226, 230, 231, 156, 260, 208,
+ 234, 179, 193, 240, 241, 244, 249, 189, 253, 251,
+ 252, 198, 203, 232, 233, 199, 200, 225, 248, 180,
+ 172, 173, 174, 175, 176, 261, 262, 263, 209, 210,
+ 211, 219, 264, 265, 227, 201, 335, 268, 270, 269,
+ 0, 0, 273, 229, 243, 254, 274, 202, 266, 0,
+ 275, 276, 277, 279, 278, 280, 281, 282, 283, 295,
+ 297, 296, 299, 300, 301, 302, 298, 318, 319, 320,
+ 321, 322, 323, 324, 325, 326, 327, 328, 329, 334,
+ 237, 258, 271, 272, 267
};
/* YYPGOTO[NTERM-NUM]. */
@@ -1131,30 +1145,30 @@ static const yytype_int8 yypgoto[] =
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81
+ -81, -81, -81, -81, -81
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- -1, 1, 9, 10, 16, 142, 11, 17, 268, 12,
- 18, 278, 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, 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, 269, 270, 271, 272, 273, 279, 280, 281,
- 282, 13, 19, 291, 292, 293, 294, 295, 296, 297,
- 298, 299, 14, 20, 312, 313, 314, 315, 316, 317,
- 318, 319, 320, 321, 322, 323, 324, 15, 21, 326,
- 327
+ -1, 1, 9, 10, 16, 146, 11, 17, 276, 12,
+ 18, 286, 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,
+ 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, 277, 278, 279, 280, 281,
+ 287, 288, 289, 290, 13, 19, 299, 300, 301, 302,
+ 303, 304, 305, 306, 307, 14, 20, 320, 321, 322,
+ 323, 324, 325, 326, 327, 328, 329, 330, 331, 332,
+ 15, 21, 334, 335, 270
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@@ -1164,36 +1178,36 @@ static const yytype_uint16 yytable[] =
{
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, 325, 328, 329,
- 330, 49, 50, 51, 331, 332, 333, 52, 53, 54,
+ 42, 43, 44, 45, 46, 47, 48, 333, 336, 337,
+ 338, 49, 50, 51, 339, 340, 341, 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, 263, 334,
- 264, 265, 335, 336, 337, 338, 274, 93, 94, 95,
- 339, 96, 97, 98, 275, 276, 99, 100, 101, 102,
+ 85, 86, 87, 88, 89, 90, 91, 92, 271, 342,
+ 272, 273, 343, 344, 345, 346, 282, 93, 94, 95,
+ 347, 96, 97, 98, 283, 284, 99, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
- 113, 114, 115, 116, 117, 118, 119, 120, 2, 340,
+ 113, 114, 115, 116, 117, 118, 119, 120, 2, 348,
121, 122, 123, 124, 125, 126, 127, 128, 129, 3,
- 341, 283, 284, 285, 286, 287, 288, 289, 290, 342,
- 343, 266, 130, 131, 132, 133, 134, 135, 136, 137,
- 138, 139, 140, 141, 344, 345, 346, 347, 4, 348,
- 349, 350, 351, 352, 5, 353, 354, 355, 356, 357,
- 267, 358, 359, 360, 361, 362, 363, 277, 300, 301,
- 302, 303, 304, 305, 306, 307, 308, 309, 310, 311,
- 364, 365, 366, 367, 368, 369, 370, 371, 372, 373,
- 374, 375, 376, 377, 378, 379, 380, 381, 6, 382,
- 383, 384, 385, 386, 387, 388, 389, 390, 391, 392,
- 393, 394, 395, 396, 7, 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, 8,
- 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
+ 349, 291, 292, 293, 294, 295, 296, 297, 298, 350,
+ 351, 274, 130, 131, 132, 133, 134, 135, 136, 137,
+ 138, 139, 140, 141, 142, 143, 144, 145, 4, 352,
+ 353, 354, 355, 356, 5, 357, 358, 359, 360, 361,
+ 275, 362, 363, 364, 365, 366, 367, 285, 308, 309,
+ 310, 311, 312, 313, 314, 315, 316, 317, 318, 319,
+ 368, 369, 370, 371, 372, 373, 374, 375, 376, 377,
+ 378, 379, 380, 381, 382, 383, 384, 385, 6, 386,
+ 387, 388, 389, 390, 391, 392, 393, 394, 395, 396,
+ 397, 398, 399, 400, 7, 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, 8,
+ 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
};
static const yytype_uint8 yycheck[] =
@@ -1213,7 +1227,7 @@ static const yytype_uint8 yycheck[] =
132, 133, 134, 135, 136, 137, 138, 139, 140, 11,
10, 91, 92, 93, 94, 95, 96, 97, 98, 10,
10, 102, 154, 155, 156, 157, 158, 159, 160, 161,
- 162, 163, 164, 165, 10, 10, 10, 10, 40, 10,
+ 162, 163, 164, 165, 166, 167, 168, 169, 40, 10,
10, 10, 10, 10, 46, 10, 10, 10, 10, 10,
131, 10, 10, 10, 10, 10, 10, 130, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151, 152, 153,
@@ -1229,16 +1243,16 @@ static const yytype_uint8 yycheck[] =
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
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const yytype_uint16 yystos[] =
{
- 0, 167, 0, 11, 40, 46, 90, 106, 141, 168,
- 169, 172, 175, 307, 318, 333, 170, 173, 176, 308,
- 319, 334, 12, 13, 14, 15, 16, 17, 18, 19,
+ 0, 171, 0, 11, 40, 46, 90, 106, 141, 172,
+ 173, 176, 179, 314, 325, 340, 174, 177, 180, 315,
+ 326, 341, 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, 43,
44, 45, 49, 50, 51, 52, 53, 54, 55, 56,
@@ -1250,7 +1264,7 @@ static const yytype_uint16 yystos[] =
119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
129, 132, 133, 134, 135, 136, 137, 138, 139, 140,
154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
- 164, 165, 171, 178, 179, 180, 181, 182, 183, 184,
+ 164, 165, 166, 167, 168, 169, 175, 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,
@@ -1262,13 +1276,14 @@ static const yytype_uint16 yystos[] =
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, 39, 41, 42, 102, 131, 174, 298,
- 299, 300, 301, 302, 39, 47, 48, 130, 177, 303,
- 304, 305, 306, 91, 92, 93, 94, 95, 96, 97,
- 98, 309, 310, 311, 312, 313, 314, 315, 316, 317,
- 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
- 152, 153, 320, 321, 322, 323, 324, 325, 326, 327,
- 328, 329, 330, 331, 332, 107, 335, 336, 10, 10,
+ 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
+ 344, 39, 41, 42, 102, 131, 178, 305, 306, 307,
+ 308, 309, 39, 47, 48, 130, 181, 310, 311, 312,
+ 313, 91, 92, 93, 94, 95, 96, 97, 98, 316,
+ 317, 318, 319, 320, 321, 322, 323, 324, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151, 152, 153,
+ 327, 328, 329, 330, 331, 332, 333, 334, 335, 336,
+ 337, 338, 339, 107, 342, 343, 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,
@@ -1284,28 +1299,28 @@ static const yytype_uint16 yystos[] =
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, 166, 167, 167, 168, 168, 168, 168, 168, 168,
- 169, 170, 170, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 172, 173, 173, 174, 174, 174, 174,
- 174, 175, 176, 176, 177, 177, 177, 177, 178, 179,
- 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+ 0, 170, 171, 171, 172, 172, 172, 172, 172, 172,
+ 173, 174, 174, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 176, 177, 177,
+ 178, 178, 178, 178, 178, 179, 180, 180, 181, 181,
+ 181, 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,
@@ -1317,12 +1332,13 @@ static const yytype_uint16 yyr1[] =
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, 308,
- 309, 309, 309, 309, 309, 309, 309, 309, 310, 311,
- 312, 313, 314, 315, 316, 317, 318, 319, 319, 320,
- 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
- 320, 321, 322, 323, 324, 325, 326, 327, 328, 329,
- 330, 331, 332, 333, 334, 334, 335, 336
+ 300, 301, 302, 303, 304, 305, 306, 307, 308, 309,
+ 310, 311, 312, 313, 314, 315, 315, 316, 316, 316,
+ 316, 316, 316, 316, 316, 317, 318, 319, 320, 321,
+ 322, 323, 324, 325, 326, 326, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327, 328, 329,
+ 330, 331, 332, 333, 334, 335, 336, 337, 338, 339,
+ 340, 341, 341, 342, 343, 344
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
@@ -1341,8 +1357,9 @@ static const yytype_uint8 yyr2[] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
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, 2, 0, 1, 1, 1, 1, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 0,
+ 1, 1, 1, 1, 1, 1, 2, 0, 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,
@@ -1350,17 +1367,17 @@ static const yytype_uint8 yyr2[] =
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 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, 3, 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, 3, 3, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 1, 2, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+ 2, 2, 2, 2, 2, 2, 2, 3, 2, 2,
+ 2, 3, 3, 2, 2, 2, 2, 2, 2, 2,
+ 2, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 2, 0, 1, 2, 2
};
@@ -2037,15 +2054,15 @@ yyreduce:
switch (yyn)
{
case 10:
-#line 138 "util/configparser.y" /* yacc.c:1646 */
+#line 139 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(server:)\n"));
}
-#line 2045 "util/configparser.c" /* yacc.c:1646 */
+#line 2062 "util/configparser.c" /* yacc.c:1646 */
break;
- case 133:
-#line 197 "util/configparser.y" /* yacc.c:1646 */
+ case 137:
+#line 200 "util/configparser.y" /* yacc.c:1646 */
{
struct config_stub* s;
OUTYY(("\nP(stub_zone:)\n"));
@@ -2056,11 +2073,11 @@ yyreduce:
} else
yyerror("out of memory");
}
-#line 2060 "util/configparser.c" /* yacc.c:1646 */
+#line 2077 "util/configparser.c" /* yacc.c:1646 */
break;
- case 141:
-#line 213 "util/configparser.y" /* yacc.c:1646 */
+ case 145:
+#line 216 "util/configparser.y" /* yacc.c:1646 */
{
struct config_stub* s;
OUTYY(("\nP(forward_zone:)\n"));
@@ -2071,11 +2088,11 @@ yyreduce:
} else
yyerror("out of memory");
}
-#line 2075 "util/configparser.c" /* yacc.c:1646 */
+#line 2092 "util/configparser.c" /* yacc.c:1646 */
break;
- case 148:
-#line 229 "util/configparser.y" /* yacc.c:1646 */
+ case 152:
+#line 232 "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)
@@ -2083,11 +2100,11 @@ yyreduce:
else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2087 "util/configparser.c" /* yacc.c:1646 */
+#line 2104 "util/configparser.c" /* yacc.c:1646 */
break;
- case 149:
-#line 238 "util/configparser.y" /* yacc.c:1646 */
+ case 153:
+#line 241 "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)
@@ -2095,11 +2112,11 @@ yyreduce:
else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2099 "util/configparser.c" /* yacc.c:1646 */
+#line 2116 "util/configparser.c" /* yacc.c:1646 */
break;
- case 150:
-#line 247 "util/configparser.y" /* yacc.c:1646 */
+ case 154:
+#line 250 "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)
@@ -2109,11 +2126,11 @@ yyreduce:
else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2113 "util/configparser.c" /* yacc.c:1646 */
+#line 2130 "util/configparser.c" /* yacc.c:1646 */
break;
- case 151:
-#line 258 "util/configparser.y" /* yacc.c:1646 */
+ case 155:
+#line 261 "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)
@@ -2121,11 +2138,11 @@ yyreduce:
else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2125 "util/configparser.c" /* yacc.c:1646 */
+#line 2142 "util/configparser.c" /* yacc.c:1646 */
break;
- case 152:
-#line 267 "util/configparser.y" /* yacc.c:1646 */
+ case 156:
+#line 270 "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)
@@ -2133,11 +2150,11 @@ yyreduce:
else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2137 "util/configparser.c" /* yacc.c:1646 */
+#line 2154 "util/configparser.c" /* yacc.c:1646 */
break;
- case 153:
-#line 276 "util/configparser.y" /* yacc.c:1646 */
+ case 157:
+#line 279 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2145,11 +2162,11 @@ yyreduce:
else cfg_parser->cfg->port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2149 "util/configparser.c" /* yacc.c:1646 */
+#line 2166 "util/configparser.c" /* yacc.c:1646 */
break;
- case 154:
-#line 285 "util/configparser.y" /* yacc.c:1646 */
+ case 158:
+#line 288 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->num_ifs == 0)
@@ -2161,11 +2178,11 @@ yyreduce:
else
cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str);
}
-#line 2165 "util/configparser.c" /* yacc.c:1646 */
+#line 2182 "util/configparser.c" /* yacc.c:1646 */
break;
- case 155:
-#line 298 "util/configparser.y" /* yacc.c:1646 */
+ case 159:
+#line 301 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->num_out_ifs == 0)
@@ -2179,11 +2196,11 @@ yyreduce:
cfg_parser->cfg->out_ifs[
cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str);
}
-#line 2183 "util/configparser.c" /* yacc.c:1646 */
+#line 2200 "util/configparser.c" /* yacc.c:1646 */
break;
- case 156:
-#line 313 "util/configparser.y" /* yacc.c:1646 */
+ case 160:
+#line 316 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2191,11 +2208,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2195 "util/configparser.c" /* yacc.c:1646 */
+#line 2212 "util/configparser.c" /* yacc.c:1646 */
break;
- case 157:
-#line 322 "util/configparser.y" /* yacc.c:1646 */
+ case 161:
+#line 325 "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,
@@ -2203,11 +2220,11 @@ yyreduce:
yyerror("port number or range (\"low-high\") expected");
free((yyvsp[0].str));
}
-#line 2207 "util/configparser.c" /* yacc.c:1646 */
+#line 2224 "util/configparser.c" /* yacc.c:1646 */
break;
- case 158:
-#line 331 "util/configparser.y" /* yacc.c:1646 */
+ case 162:
+#line 334 "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,
@@ -2215,11 +2232,11 @@ yyreduce:
yyerror("port number or range (\"low-high\") expected");
free((yyvsp[0].str));
}
-#line 2219 "util/configparser.c" /* yacc.c:1646 */
+#line 2236 "util/configparser.c" /* yacc.c:1646 */
break;
- case 159:
-#line 340 "util/configparser.y" /* yacc.c:1646 */
+ case 163:
+#line 343 "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)
@@ -2227,11 +2244,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2231 "util/configparser.c" /* yacc.c:1646 */
+#line 2248 "util/configparser.c" /* yacc.c:1646 */
break;
- case 160:
-#line 349 "util/configparser.y" /* yacc.c:1646 */
+ case 164:
+#line 352 "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)
@@ -2239,11 +2256,11 @@ yyreduce:
else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2243 "util/configparser.c" /* yacc.c:1646 */
+#line 2260 "util/configparser.c" /* yacc.c:1646 */
break;
- case 161:
-#line 358 "util/configparser.y" /* yacc.c:1646 */
+ case 165:
+#line 361 "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)
@@ -2251,11 +2268,11 @@ yyreduce:
else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2255 "util/configparser.c" /* yacc.c:1646 */
+#line 2272 "util/configparser.c" /* yacc.c:1646 */
break;
- case 162:
-#line 367 "util/configparser.y" /* yacc.c:1646 */
+ case 166:
+#line 370 "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)
@@ -2263,11 +2280,11 @@ yyreduce:
else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2267 "util/configparser.c" /* yacc.c:1646 */
+#line 2284 "util/configparser.c" /* yacc.c:1646 */
break;
- case 163:
-#line 376 "util/configparser.y" /* yacc.c:1646 */
+ case 167:
+#line 379 "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)
@@ -2275,11 +2292,11 @@ yyreduce:
else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2279 "util/configparser.c" /* yacc.c:1646 */
+#line 2296 "util/configparser.c" /* yacc.c:1646 */
break;
- case 164:
-#line 385 "util/configparser.y" /* yacc.c:1646 */
+ case 168:
+#line 388 "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)
@@ -2287,11 +2304,11 @@ yyreduce:
else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2291 "util/configparser.c" /* yacc.c:1646 */
+#line 2308 "util/configparser.c" /* yacc.c:1646 */
break;
- case 165:
-#line 394 "util/configparser.y" /* yacc.c:1646 */
+ case 169:
+#line 397 "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)
@@ -2299,11 +2316,11 @@ yyreduce:
else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2303 "util/configparser.c" /* yacc.c:1646 */
+#line 2320 "util/configparser.c" /* yacc.c:1646 */
break;
- case 166:
-#line 403 "util/configparser.y" /* yacc.c:1646 */
+ case 170:
+#line 406 "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)
@@ -2311,11 +2328,11 @@ yyreduce:
else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2315 "util/configparser.c" /* yacc.c:1646 */
+#line 2332 "util/configparser.c" /* yacc.c:1646 */
break;
- case 167:
-#line 412 "util/configparser.y" /* yacc.c:1646 */
+ case 171:
+#line 415 "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)
@@ -2323,11 +2340,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2327 "util/configparser.c" /* yacc.c:1646 */
+#line 2344 "util/configparser.c" /* yacc.c:1646 */
break;
- case 168:
-#line 421 "util/configparser.y" /* yacc.c:1646 */
+ case 172:
+#line 424 "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)
@@ -2335,11 +2352,11 @@ yyreduce:
else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2339 "util/configparser.c" /* yacc.c:1646 */
+#line 2356 "util/configparser.c" /* yacc.c:1646 */
break;
- case 169:
-#line 430 "util/configparser.y" /* yacc.c:1646 */
+ case 173:
+#line 433 "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)
@@ -2347,31 +2364,31 @@ yyreduce:
else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2351 "util/configparser.c" /* yacc.c:1646 */
+#line 2368 "util/configparser.c" /* yacc.c:1646 */
break;
- case 170:
-#line 439 "util/configparser.y" /* yacc.c:1646 */
+ case 174:
+#line 442 "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 2361 "util/configparser.c" /* yacc.c:1646 */
+#line 2378 "util/configparser.c" /* yacc.c:1646 */
break;
- case 171:
-#line 446 "util/configparser.y" /* yacc.c:1646 */
+ case 175:
+#line 449 "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 2371 "util/configparser.c" /* yacc.c:1646 */
+#line 2388 "util/configparser.c" /* yacc.c:1646 */
break;
- case 172:
-#line 453 "util/configparser.y" /* yacc.c:1646 */
+ case 176:
+#line 456 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2379,11 +2396,11 @@ yyreduce:
else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2383 "util/configparser.c" /* yacc.c:1646 */
+#line 2400 "util/configparser.c" /* yacc.c:1646 */
break;
- case 173:
-#line 462 "util/configparser.y" /* yacc.c:1646 */
+ case 177:
+#line 465 "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)
@@ -2391,11 +2408,11 @@ yyreduce:
else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2395 "util/configparser.c" /* yacc.c:1646 */
+#line 2412 "util/configparser.c" /* yacc.c:1646 */
break;
- case 174:
-#line 471 "util/configparser.y" /* yacc.c:1646 */
+ case 178:
+#line 474 "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)
@@ -2408,11 +2425,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 2412 "util/configparser.c" /* yacc.c:1646 */
+#line 2429 "util/configparser.c" /* yacc.c:1646 */
break;
- case 175:
-#line 485 "util/configparser.y" /* yacc.c:1646 */
+ case 179:
+#line 488 "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)
@@ -2420,11 +2437,11 @@ yyreduce:
else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2424 "util/configparser.c" /* yacc.c:1646 */
+#line 2441 "util/configparser.c" /* yacc.c:1646 */
break;
- case 176:
-#line 494 "util/configparser.y" /* yacc.c:1646 */
+ case 180:
+#line 497 "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)
@@ -2432,145 +2449,145 @@ yyreduce:
else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2436 "util/configparser.c" /* yacc.c:1646 */
+#line 2453 "util/configparser.c" /* yacc.c:1646 */
break;
- case 177:
-#line 503 "util/configparser.y" /* yacc.c:1646 */
+ case 181:
+#line 506 "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 2446 "util/configparser.c" /* yacc.c:1646 */
+#line 2463 "util/configparser.c" /* yacc.c:1646 */
break;
- case 178:
-#line 510 "util/configparser.y" /* yacc.c:1646 */
+ case 182:
+#line 513 "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 2456 "util/configparser.c" /* yacc.c:1646 */
+#line 2473 "util/configparser.c" /* yacc.c:1646 */
break;
- case 179:
-#line 517 "util/configparser.y" /* yacc.c:1646 */
+ case 183:
+#line 520 "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);
}
-#line 2466 "util/configparser.c" /* yacc.c:1646 */
+#line 2483 "util/configparser.c" /* yacc.c:1646 */
break;
- case 180:
-#line 524 "util/configparser.y" /* yacc.c:1646 */
+ case 184:
+#line 527 "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 2477 "util/configparser.c" /* yacc.c:1646 */
+#line 2494 "util/configparser.c" /* yacc.c:1646 */
break;
- case 181:
-#line 532 "util/configparser.y" /* yacc.c:1646 */
+ case 185:
+#line 535 "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 2487 "util/configparser.c" /* yacc.c:1646 */
+#line 2504 "util/configparser.c" /* yacc.c:1646 */
break;
- case 182:
-#line 539 "util/configparser.y" /* yacc.c:1646 */
+ case 186:
+#line 542 "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 2497 "util/configparser.c" /* yacc.c:1646 */
+#line 2514 "util/configparser.c" /* yacc.c:1646 */
break;
- case 183:
-#line 546 "util/configparser.y" /* yacc.c:1646 */
+ case 187:
+#line 549 "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 2507 "util/configparser.c" /* yacc.c:1646 */
+#line 2524 "util/configparser.c" /* yacc.c:1646 */
break;
- case 184:
-#line 553 "util/configparser.y" /* yacc.c:1646 */
+ case 188:
+#line 556 "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 2517 "util/configparser.c" /* yacc.c:1646 */
+#line 2534 "util/configparser.c" /* yacc.c:1646 */
break;
- case 185:
-#line 560 "util/configparser.y" /* yacc.c:1646 */
+ case 189:
+#line 563 "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 2528 "util/configparser.c" /* yacc.c:1646 */
+#line 2545 "util/configparser.c" /* yacc.c:1646 */
break;
- case 186:
-#line 568 "util/configparser.y" /* yacc.c:1646 */
+ case 190:
+#line 571 "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 2539 "util/configparser.c" /* yacc.c:1646 */
+#line 2556 "util/configparser.c" /* yacc.c:1646 */
break;
- case 187:
-#line 576 "util/configparser.y" /* yacc.c:1646 */
+ case 191:
+#line 579 "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 2550 "util/configparser.c" /* yacc.c:1646 */
+#line 2567 "util/configparser.c" /* yacc.c:1646 */
break;
- case 188:
-#line 584 "util/configparser.y" /* yacc.c:1646 */
+ case 192:
+#line 587 "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 2560 "util/configparser.c" /* yacc.c:1646 */
+#line 2577 "util/configparser.c" /* yacc.c:1646 */
break;
- case 189:
-#line 591 "util/configparser.y" /* yacc.c:1646 */
+ case 193:
+#line 594 "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 2570 "util/configparser.c" /* yacc.c:1646 */
+#line 2587 "util/configparser.c" /* yacc.c:1646 */
break;
- case 190:
-#line 598 "util/configparser.y" /* yacc.c:1646 */
+ case 194:
+#line 601 "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)
@@ -2578,11 +2595,11 @@ yyreduce:
else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2582 "util/configparser.c" /* yacc.c:1646 */
+#line 2599 "util/configparser.c" /* yacc.c:1646 */
break;
- case 191:
-#line 607 "util/configparser.y" /* yacc.c:1646 */
+ case 195:
+#line 610 "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)
@@ -2590,53 +2607,53 @@ yyreduce:
else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2594 "util/configparser.c" /* yacc.c:1646 */
+#line 2611 "util/configparser.c" /* yacc.c:1646 */
break;
- case 192:
-#line 616 "util/configparser.y" /* yacc.c:1646 */
+ case 196:
+#line 619 "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 2604 "util/configparser.c" /* yacc.c:1646 */
+#line 2621 "util/configparser.c" /* yacc.c:1646 */
break;
- case 193:
-#line 623 "util/configparser.y" /* yacc.c:1646 */
+ case 197:
+#line 626 "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 2614 "util/configparser.c" /* yacc.c:1646 */
+#line 2631 "util/configparser.c" /* yacc.c:1646 */
break;
- case 194:
-#line 630 "util/configparser.y" /* yacc.c:1646 */
+ case 198:
+#line 633 "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 2625 "util/configparser.c" /* yacc.c:1646 */
+#line 2642 "util/configparser.c" /* yacc.c:1646 */
break;
- case 195:
-#line 638 "util/configparser.y" /* yacc.c:1646 */
+ case 199:
+#line 641 "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 2636 "util/configparser.c" /* yacc.c:1646 */
+#line 2653 "util/configparser.c" /* yacc.c:1646 */
break;
- case 196:
-#line 646 "util/configparser.y" /* yacc.c:1646 */
+ case 200:
+#line 649 "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)
@@ -2645,11 +2662,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2649 "util/configparser.c" /* yacc.c:1646 */
+#line 2666 "util/configparser.c" /* yacc.c:1646 */
break;
- case 197:
-#line 656 "util/configparser.y" /* yacc.c:1646 */
+ case 201:
+#line 659 "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)
@@ -2658,11 +2675,24 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2662 "util/configparser.c" /* yacc.c:1646 */
+#line 2679 "util/configparser.c" /* yacc.c:1646 */
break;
- case 198:
-#line 666 "util/configparser.y" /* yacc.c:1646 */
+ case 202:
+#line 669 "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 2692 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 203:
+#line 679 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2674,11 +2704,11 @@ yyreduce:
else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2678 "util/configparser.c" /* yacc.c:1646 */
+#line 2708 "util/configparser.c" /* yacc.c:1646 */
break;
- case 199:
-#line 679 "util/configparser.y" /* yacc.c:1646 */
+ case 204:
+#line 692 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2688,22 +2718,22 @@ yyreduce:
else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2692 "util/configparser.c" /* yacc.c:1646 */
+#line 2722 "util/configparser.c" /* yacc.c:1646 */
break;
- case 200:
-#line 690 "util/configparser.y" /* yacc.c:1646 */
+ case 205:
+#line 703 "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 2703 "util/configparser.c" /* yacc.c:1646 */
+#line 2733 "util/configparser.c" /* yacc.c:1646 */
break;
- case 201:
-#line 698 "util/configparser.y" /* yacc.c:1646 */
+ case 206:
+#line 711 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2715,11 +2745,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 2719 "util/configparser.c" /* yacc.c:1646 */
+#line 2749 "util/configparser.c" /* yacc.c:1646 */
break;
- case 202:
-#line 711 "util/configparser.y" /* yacc.c:1646 */
+ case 207:
+#line 724 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2727,11 +2757,11 @@ yyreduce:
else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2731 "util/configparser.c" /* yacc.c:1646 */
+#line 2761 "util/configparser.c" /* yacc.c:1646 */
break;
- case 203:
-#line 720 "util/configparser.y" /* yacc.c:1646 */
+ case 208:
+#line 733 "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)
@@ -2739,11 +2769,11 @@ yyreduce:
else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2743 "util/configparser.c" /* yacc.c:1646 */
+#line 2773 "util/configparser.c" /* yacc.c:1646 */
break;
- case 204:
-#line 729 "util/configparser.y" /* yacc.c:1646 */
+ case 209:
+#line 742 "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)
@@ -2751,11 +2781,11 @@ yyreduce:
else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2755 "util/configparser.c" /* yacc.c:1646 */
+#line 2785 "util/configparser.c" /* yacc.c:1646 */
break;
- case 205:
-#line 738 "util/configparser.y" /* yacc.c:1646 */
+ case 210:
+#line 751 "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)
@@ -2764,11 +2794,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2768 "util/configparser.c" /* yacc.c:1646 */
+#line 2798 "util/configparser.c" /* yacc.c:1646 */
break;
- case 206:
-#line 748 "util/configparser.y" /* yacc.c:1646 */
+ case 211:
+#line 761 "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)
@@ -2777,22 +2807,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2781 "util/configparser.c" /* yacc.c:1646 */
+#line 2811 "util/configparser.c" /* yacc.c:1646 */
break;
- case 207:
-#line 758 "util/configparser.y" /* yacc.c:1646 */
+ case 212:
+#line 771 "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 2792 "util/configparser.c" /* yacc.c:1646 */
+#line 2822 "util/configparser.c" /* yacc.c:1646 */
break;
- case 208:
-#line 766 "util/configparser.y" /* yacc.c:1646 */
+ case 213:
+#line 779 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2804,11 +2834,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 2808 "util/configparser.c" /* yacc.c:1646 */
+#line 2838 "util/configparser.c" /* yacc.c:1646 */
break;
- case 209:
-#line 779 "util/configparser.y" /* yacc.c:1646 */
+ case 214:
+#line 792 "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)
@@ -2816,22 +2846,22 @@ yyreduce:
else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2820 "util/configparser.c" /* yacc.c:1646 */
+#line 2850 "util/configparser.c" /* yacc.c:1646 */
break;
- case 210:
-#line 788 "util/configparser.y" /* yacc.c:1646 */
+ case 215:
+#line 801 "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 2831 "util/configparser.c" /* yacc.c:1646 */
+#line 2861 "util/configparser.c" /* yacc.c:1646 */
break;
- case 211:
-#line 796 "util/configparser.y" /* yacc.c:1646 */
+ case 216:
+#line 809 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2839,22 +2869,22 @@ yyreduce:
else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2843 "util/configparser.c" /* yacc.c:1646 */
+#line 2873 "util/configparser.c" /* yacc.c:1646 */
break;
- case 212:
-#line 805 "util/configparser.y" /* yacc.c:1646 */
+ case 217:
+#line 818 "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 2854 "util/configparser.c" /* yacc.c:1646 */
+#line 2884 "util/configparser.c" /* yacc.c:1646 */
break;
- case 213:
-#line 813 "util/configparser.y" /* yacc.c:1646 */
+ case 218:
+#line 826 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2866,11 +2896,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 2870 "util/configparser.c" /* yacc.c:1646 */
+#line 2900 "util/configparser.c" /* yacc.c:1646 */
break;
- case 214:
-#line 826 "util/configparser.y" /* yacc.c:1646 */
+ case 219:
+#line 839 "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)
@@ -2878,21 +2908,21 @@ yyreduce:
else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2882 "util/configparser.c" /* yacc.c:1646 */
+#line 2912 "util/configparser.c" /* yacc.c:1646 */
break;
- case 215:
-#line 835 "util/configparser.y" /* yacc.c:1646 */
+ case 220:
+#line 848 "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 2892 "util/configparser.c" /* yacc.c:1646 */
+#line 2922 "util/configparser.c" /* yacc.c:1646 */
break;
- case 216:
-#line 842 "util/configparser.y" /* yacc.c:1646 */
+ case 221:
+#line 855 "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)
@@ -2901,11 +2931,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2905 "util/configparser.c" /* yacc.c:1646 */
+#line 2935 "util/configparser.c" /* yacc.c:1646 */
break;
- case 217:
-#line 852 "util/configparser.y" /* yacc.c:1646 */
+ case 222:
+#line 865 "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)
@@ -2914,11 +2944,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2918 "util/configparser.c" /* yacc.c:1646 */
+#line 2948 "util/configparser.c" /* yacc.c:1646 */
break;
- case 218:
-#line 862 "util/configparser.y" /* yacc.c:1646 */
+ case 223:
+#line 875 "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)
@@ -2927,11 +2957,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2931 "util/configparser.c" /* yacc.c:1646 */
+#line 2961 "util/configparser.c" /* yacc.c:1646 */
break;
- case 219:
-#line 872 "util/configparser.y" /* yacc.c:1646 */
+ case 224:
+#line 885 "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)
@@ -2940,11 +2970,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2944 "util/configparser.c" /* yacc.c:1646 */
+#line 2974 "util/configparser.c" /* yacc.c:1646 */
break;
- case 220:
-#line 882 "util/configparser.y" /* yacc.c:1646 */
+ case 225:
+#line 895 "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)
@@ -2953,11 +2983,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2957 "util/configparser.c" /* yacc.c:1646 */
+#line 2987 "util/configparser.c" /* yacc.c:1646 */
break;
- case 221:
-#line 892 "util/configparser.y" /* yacc.c:1646 */
+ case 226:
+#line 905 "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)
@@ -2966,11 +2996,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2970 "util/configparser.c" /* yacc.c:1646 */
+#line 3000 "util/configparser.c" /* yacc.c:1646 */
break;
- case 222:
-#line 902 "util/configparser.y" /* yacc.c:1646 */
+ case 227:
+#line 915 "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)
@@ -2979,11 +3009,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2983 "util/configparser.c" /* yacc.c:1646 */
+#line 3013 "util/configparser.c" /* yacc.c:1646 */
break;
- case 223:
-#line 912 "util/configparser.y" /* yacc.c:1646 */
+ case 228:
+#line 925 "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)
@@ -2992,41 +3022,41 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2996 "util/configparser.c" /* yacc.c:1646 */
+#line 3026 "util/configparser.c" /* yacc.c:1646 */
break;
- case 224:
-#line 922 "util/configparser.y" /* yacc.c:1646 */
+ case 229:
+#line 935 "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 3006 "util/configparser.c" /* yacc.c:1646 */
+#line 3036 "util/configparser.c" /* yacc.c:1646 */
break;
- case 225:
-#line 929 "util/configparser.y" /* yacc.c:1646 */
+ case 230:
+#line 942 "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 3016 "util/configparser.c" /* yacc.c:1646 */
+#line 3046 "util/configparser.c" /* yacc.c:1646 */
break;
- case 226:
-#line 936 "util/configparser.y" /* yacc.c:1646 */
+ case 231:
+#line 949 "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 3026 "util/configparser.c" /* yacc.c:1646 */
+#line 3056 "util/configparser.c" /* yacc.c:1646 */
break;
- case 227:
-#line 943 "util/configparser.y" /* yacc.c:1646 */
+ case 232:
+#line 956 "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)
@@ -3034,11 +3064,11 @@ yyreduce:
else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3038 "util/configparser.c" /* yacc.c:1646 */
+#line 3068 "util/configparser.c" /* yacc.c:1646 */
break;
- case 228:
-#line 952 "util/configparser.y" /* yacc.c:1646 */
+ case 233:
+#line 965 "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)
@@ -3046,11 +3076,11 @@ yyreduce:
else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3050 "util/configparser.c" /* yacc.c:1646 */
+#line 3080 "util/configparser.c" /* yacc.c:1646 */
break;
- case 229:
-#line 961 "util/configparser.y" /* yacc.c:1646 */
+ case 234:
+#line 974 "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)
@@ -3058,21 +3088,21 @@ yyreduce:
else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3062 "util/configparser.c" /* yacc.c:1646 */
+#line 3092 "util/configparser.c" /* yacc.c:1646 */
break;
- case 230:
-#line 970 "util/configparser.y" /* yacc.c:1646 */
+ case 235:
+#line 983 "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 3072 "util/configparser.c" /* yacc.c:1646 */
+#line 3102 "util/configparser.c" /* yacc.c:1646 */
break;
- case 231:
-#line 977 "util/configparser.y" /* yacc.c:1646 */
+ case 236:
+#line 990 "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)
@@ -3081,11 +3111,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3085 "util/configparser.c" /* yacc.c:1646 */
+#line 3115 "util/configparser.c" /* yacc.c:1646 */
break;
- case 232:
-#line 987 "util/configparser.y" /* yacc.c:1646 */
+ case 237:
+#line 1000 "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 &&
@@ -3101,21 +3131,21 @@ yyreduce:
fatal_exit("out of memory adding acl");
}
}
-#line 3105 "util/configparser.c" /* yacc.c:1646 */
+#line 3135 "util/configparser.c" /* yacc.c:1646 */
break;
- case 233:
-#line 1004 "util/configparser.y" /* yacc.c:1646 */
+ case 238:
+#line 1017 "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 3115 "util/configparser.c" /* yacc.c:1646 */
+#line 3145 "util/configparser.c" /* yacc.c:1646 */
break;
- case 234:
-#line 1011 "util/configparser.y" /* yacc.c:1646 */
+ case 239:
+#line 1024 "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) {
@@ -3132,11 +3162,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3136 "util/configparser.c" /* yacc.c:1646 */
+#line 3166 "util/configparser.c" /* yacc.c:1646 */
break;
- case 235:
-#line 1029 "util/configparser.y" /* yacc.c:1646 */
+ case 240:
+#line 1042 "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) {
@@ -3148,11 +3178,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3152 "util/configparser.c" /* yacc.c:1646 */
+#line 3182 "util/configparser.c" /* yacc.c:1646 */
break;
- case 236:
-#line 1042 "util/configparser.y" /* yacc.c:1646 */
+ case 241:
+#line 1055 "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) {
@@ -3164,11 +3194,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3168 "util/configparser.c" /* yacc.c:1646 */
+#line 3198 "util/configparser.c" /* yacc.c:1646 */
break;
- case 237:
-#line 1055 "util/configparser.y" /* yacc.c:1646 */
+ case 242:
+#line 1068 "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)
@@ -3176,11 +3206,11 @@ yyreduce:
else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3180 "util/configparser.c" /* yacc.c:1646 */
+#line 3210 "util/configparser.c" /* yacc.c:1646 */
break;
- case 238:
-#line 1064 "util/configparser.y" /* yacc.c:1646 */
+ case 243:
+#line 1077 "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)
@@ -3188,11 +3218,11 @@ yyreduce:
else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3192 "util/configparser.c" /* yacc.c:1646 */
+#line 3222 "util/configparser.c" /* yacc.c:1646 */
break;
- case 239:
-#line 1073 "util/configparser.y" /* yacc.c:1646 */
+ case 244:
+#line 1086 "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)
@@ -3200,11 +3230,11 @@ yyreduce:
else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3204 "util/configparser.c" /* yacc.c:1646 */
+#line 3234 "util/configparser.c" /* yacc.c:1646 */
break;
- case 240:
-#line 1082 "util/configparser.y" /* yacc.c:1646 */
+ case 245:
+#line 1095 "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)
@@ -3212,11 +3242,11 @@ yyreduce:
else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3216 "util/configparser.c" /* yacc.c:1646 */
+#line 3246 "util/configparser.c" /* yacc.c:1646 */
break;
- case 241:
-#line 1091 "util/configparser.y" /* yacc.c:1646 */
+ case 246:
+#line 1104 "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)
@@ -3225,11 +3255,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3229 "util/configparser.c" /* yacc.c:1646 */
+#line 3259 "util/configparser.c" /* yacc.c:1646 */
break;
- case 242:
-#line 1101 "util/configparser.y" /* yacc.c:1646 */
+ case 247:
+#line 1114 "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)
@@ -3238,11 +3268,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3242 "util/configparser.c" /* yacc.c:1646 */
+#line 3272 "util/configparser.c" /* yacc.c:1646 */
break;
- case 243:
-#line 1111 "util/configparser.y" /* yacc.c:1646 */
+ case 248:
+#line 1124 "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)
@@ -3250,11 +3280,11 @@ yyreduce:
else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3254 "util/configparser.c" /* yacc.c:1646 */
+#line 3284 "util/configparser.c" /* yacc.c:1646 */
break;
- case 244:
-#line 1120 "util/configparser.y" /* yacc.c:1646 */
+ case 249:
+#line 1133 "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)
@@ -3262,21 +3292,21 @@ yyreduce:
else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3266 "util/configparser.c" /* yacc.c:1646 */
+#line 3296 "util/configparser.c" /* yacc.c:1646 */
break;
- case 245:
-#line 1129 "util/configparser.y" /* yacc.c:1646 */
+ case 250:
+#line 1142 "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 3276 "util/configparser.c" /* yacc.c:1646 */
+#line 3306 "util/configparser.c" /* yacc.c:1646 */
break;
- case 246:
-#line 1136 "util/configparser.y" /* yacc.c:1646 */
+ case 251:
+#line 1149 "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)
@@ -3284,11 +3314,11 @@ yyreduce:
else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3288 "util/configparser.c" /* yacc.c:1646 */
+#line 3318 "util/configparser.c" /* yacc.c:1646 */
break;
- case 247:
-#line 1145 "util/configparser.y" /* yacc.c:1646 */
+ case 252:
+#line 1158 "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)
@@ -3296,11 +3326,11 @@ yyreduce:
else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3300 "util/configparser.c" /* yacc.c:1646 */
+#line 3330 "util/configparser.c" /* yacc.c:1646 */
break;
- case 248:
-#line 1154 "util/configparser.y" /* yacc.c:1646 */
+ case 253:
+#line 1167 "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)
@@ -3308,11 +3338,11 @@ yyreduce:
else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3312 "util/configparser.c" /* yacc.c:1646 */
+#line 3342 "util/configparser.c" /* yacc.c:1646 */
break;
- case 249:
-#line 1163 "util/configparser.y" /* yacc.c:1646 */
+ case 254:
+#line 1176 "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)
@@ -3321,22 +3351,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3325 "util/configparser.c" /* yacc.c:1646 */
+#line 3355 "util/configparser.c" /* yacc.c:1646 */
break;
- case 250:
-#line 1172 "util/configparser.y" /* yacc.c:1646 */
+ case 255:
+#line 1185 "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 3336 "util/configparser.c" /* yacc.c:1646 */
+#line 3366 "util/configparser.c" /* yacc.c:1646 */
break;
- case 251:
-#line 1180 "util/configparser.y" /* yacc.c:1646 */
+ case 256:
+#line 1193 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3348,22 +3378,22 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3352 "util/configparser.c" /* yacc.c:1646 */
+#line 3382 "util/configparser.c" /* yacc.c:1646 */
break;
- case 252:
-#line 1193 "util/configparser.y" /* yacc.c:1646 */
+ case 257:
+#line 1206 "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 3363 "util/configparser.c" /* yacc.c:1646 */
+#line 3393 "util/configparser.c" /* yacc.c:1646 */
break;
- case 253:
-#line 1201 "util/configparser.y" /* yacc.c:1646 */
+ case 258:
+#line 1214 "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 &&
@@ -3386,21 +3416,21 @@ yyreduce:
fatal_exit("out of memory adding local-zone");
}
}
-#line 3390 "util/configparser.c" /* yacc.c:1646 */
+#line 3420 "util/configparser.c" /* yacc.c:1646 */
break;
- case 254:
-#line 1225 "util/configparser.y" /* yacc.c:1646 */
+ case 259:
+#line 1238 "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 3400 "util/configparser.c" /* yacc.c:1646 */
+#line 3430 "util/configparser.c" /* yacc.c:1646 */
break;
- case 255:
-#line 1232 "util/configparser.y" /* yacc.c:1646 */
+ case 260:
+#line 1245 "util/configparser.y" /* yacc.c:1646 */
{
char* ptr;
OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -3414,11 +3444,11 @@ yyreduce:
yyerror("local-data-ptr could not be reversed");
}
}
-#line 3418 "util/configparser.c" /* yacc.c:1646 */
+#line 3448 "util/configparser.c" /* yacc.c:1646 */
break;
- case 256:
-#line 1247 "util/configparser.y" /* yacc.c:1646 */
+ case 261:
+#line 1260 "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)
@@ -3427,11 +3457,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3431 "util/configparser.c" /* yacc.c:1646 */
+#line 3461 "util/configparser.c" /* yacc.c:1646 */
break;
- case 257:
-#line 1257 "util/configparser.y" /* yacc.c:1646 */
+ case 262:
+#line 1270 "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)
@@ -3440,31 +3470,31 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3444 "util/configparser.c" /* yacc.c:1646 */
+#line 3474 "util/configparser.c" /* yacc.c:1646 */
break;
- case 258:
-#line 1267 "util/configparser.y" /* yacc.c:1646 */
+ case 263:
+#line 1280 "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 3454 "util/configparser.c" /* yacc.c:1646 */
+#line 3484 "util/configparser.c" /* yacc.c:1646 */
break;
- case 259:
-#line 1274 "util/configparser.y" /* yacc.c:1646 */
+ case 264:
+#line 1287 "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 3464 "util/configparser.c" /* yacc.c:1646 */
+#line 3494 "util/configparser.c" /* yacc.c:1646 */
break;
- case 260:
-#line 1281 "util/configparser.y" /* yacc.c:1646 */
+ case 265:
+#line 1294 "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)
@@ -3472,11 +3502,50 @@ yyreduce:
else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3476 "util/configparser.c" /* yacc.c:1646 */
+#line 3506 "util/configparser.c" /* yacc.c:1646 */
break;
- case 261:
-#line 1290 "util/configparser.y" /* yacc.c:1646 */
+ case 266:
+#line 1303 "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 3523 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 267:
+#line 1317 "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 3545 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 268:
+#line 1336 "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)
@@ -3484,22 +3553,22 @@ yyreduce:
else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3488 "util/configparser.c" /* yacc.c:1646 */
+#line 3557 "util/configparser.c" /* yacc.c:1646 */
break;
- case 262:
-#line 1299 "util/configparser.y" /* yacc.c:1646 */
+ case 269:
+#line 1345 "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 3499 "util/configparser.c" /* yacc.c:1646 */
+#line 3568 "util/configparser.c" /* yacc.c:1646 */
break;
- case 263:
-#line 1307 "util/configparser.y" /* yacc.c:1646 */
+ case 270:
+#line 1353 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3511,11 +3580,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3515 "util/configparser.c" /* yacc.c:1646 */
+#line 3584 "util/configparser.c" /* yacc.c:1646 */
break;
- case 264:
-#line 1320 "util/configparser.y" /* yacc.c:1646 */
+ case 271:
+#line 1366 "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) {
@@ -3527,11 +3596,11 @@ yyreduce:
"ratelimit-for-domain");
}
}
-#line 3531 "util/configparser.c" /* yacc.c:1646 */
+#line 3600 "util/configparser.c" /* yacc.c:1646 */
break;
- case 265:
-#line 1333 "util/configparser.y" /* yacc.c:1646 */
+ case 272:
+#line 1379 "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) {
@@ -3543,11 +3612,11 @@ yyreduce:
"ratelimit-below-domain");
}
}
-#line 3547 "util/configparser.c" /* yacc.c:1646 */
+#line 3616 "util/configparser.c" /* yacc.c:1646 */
break;
- case 266:
-#line 1346 "util/configparser.y" /* yacc.c:1646 */
+ case 273:
+#line 1392 "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)
@@ -3555,11 +3624,11 @@ yyreduce:
else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3559 "util/configparser.c" /* yacc.c:1646 */
+#line 3628 "util/configparser.c" /* yacc.c:1646 */
break;
- case 267:
-#line 1355 "util/configparser.y" /* yacc.c:1646 */
+ case 274:
+#line 1401 "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)
@@ -3568,11 +3637,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3572 "util/configparser.c" /* yacc.c:1646 */
+#line 3641 "util/configparser.c" /* yacc.c:1646 */
break;
- case 268:
-#line 1365 "util/configparser.y" /* yacc.c:1646 */
+ case 275:
+#line 1411 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->stubs->name)
@@ -3581,31 +3650,31 @@ yyreduce:
free(cfg_parser->cfg->stubs->name);
cfg_parser->cfg->stubs->name = (yyvsp[0].str);
}
-#line 3585 "util/configparser.c" /* yacc.c:1646 */
+#line 3654 "util/configparser.c" /* yacc.c:1646 */
break;
- case 269:
-#line 1375 "util/configparser.y" /* yacc.c:1646 */
+ case 276:
+#line 1421 "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 3595 "util/configparser.c" /* yacc.c:1646 */
+#line 3664 "util/configparser.c" /* yacc.c:1646 */
break;
- case 270:
-#line 1382 "util/configparser.y" /* yacc.c:1646 */
+ case 277:
+#line 1428 "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 3605 "util/configparser.c" /* yacc.c:1646 */
+#line 3674 "util/configparser.c" /* yacc.c:1646 */
break;
- case 271:
-#line 1389 "util/configparser.y" /* yacc.c:1646 */
+ case 278:
+#line 1435 "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)
@@ -3613,11 +3682,11 @@ yyreduce:
else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3617 "util/configparser.c" /* yacc.c:1646 */
+#line 3686 "util/configparser.c" /* yacc.c:1646 */
break;
- case 272:
-#line 1398 "util/configparser.y" /* yacc.c:1646 */
+ case 279:
+#line 1444 "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)
@@ -3626,11 +3695,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3630 "util/configparser.c" /* yacc.c:1646 */
+#line 3699 "util/configparser.c" /* yacc.c:1646 */
break;
- case 273:
-#line 1408 "util/configparser.y" /* yacc.c:1646 */
+ case 280:
+#line 1454 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->forwards->name)
@@ -3639,31 +3708,31 @@ yyreduce:
free(cfg_parser->cfg->forwards->name);
cfg_parser->cfg->forwards->name = (yyvsp[0].str);
}
-#line 3643 "util/configparser.c" /* yacc.c:1646 */
+#line 3712 "util/configparser.c" /* yacc.c:1646 */
break;
- case 274:
-#line 1418 "util/configparser.y" /* yacc.c:1646 */
+ case 281:
+#line 1464 "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 3653 "util/configparser.c" /* yacc.c:1646 */
+#line 3722 "util/configparser.c" /* yacc.c:1646 */
break;
- case 275:
-#line 1425 "util/configparser.y" /* yacc.c:1646 */
+ case 282:
+#line 1471 "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 3663 "util/configparser.c" /* yacc.c:1646 */
+#line 3732 "util/configparser.c" /* yacc.c:1646 */
break;
- case 276:
-#line 1432 "util/configparser.y" /* yacc.c:1646 */
+ case 283:
+#line 1478 "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)
@@ -3671,19 +3740,19 @@ yyreduce:
else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3675 "util/configparser.c" /* yacc.c:1646 */
+#line 3744 "util/configparser.c" /* yacc.c:1646 */
break;
- case 277:
-#line 1441 "util/configparser.y" /* yacc.c:1646 */
+ case 284:
+#line 1487 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(remote-control:)\n"));
}
-#line 3683 "util/configparser.c" /* yacc.c:1646 */
+#line 3752 "util/configparser.c" /* yacc.c:1646 */
break;
- case 288:
-#line 1452 "util/configparser.y" /* yacc.c:1646 */
+ case 295:
+#line 1498 "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)
@@ -3692,11 +3761,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3696 "util/configparser.c" /* yacc.c:1646 */
+#line 3765 "util/configparser.c" /* yacc.c:1646 */
break;
- case 289:
-#line 1462 "util/configparser.y" /* yacc.c:1646 */
+ case 296:
+#line 1508 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3704,21 +3773,21 @@ yyreduce:
else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3708 "util/configparser.c" /* yacc.c:1646 */
+#line 3777 "util/configparser.c" /* yacc.c:1646 */
break;
- case 290:
-#line 1471 "util/configparser.y" /* yacc.c:1646 */
+ case 297:
+#line 1517 "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 3718 "util/configparser.c" /* yacc.c:1646 */
+#line 3787 "util/configparser.c" /* yacc.c:1646 */
break;
- case 291:
-#line 1478 "util/configparser.y" /* yacc.c:1646 */
+ case 298:
+#line 1524 "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)
@@ -3727,122 +3796,122 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3731 "util/configparser.c" /* yacc.c:1646 */
+#line 3800 "util/configparser.c" /* yacc.c:1646 */
break;
- case 292:
-#line 1488 "util/configparser.y" /* yacc.c:1646 */
+ case 299:
+#line 1534 "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 3741 "util/configparser.c" /* yacc.c:1646 */
+#line 3810 "util/configparser.c" /* yacc.c:1646 */
break;
- case 293:
-#line 1495 "util/configparser.y" /* yacc.c:1646 */
+ case 300:
+#line 1541 "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 3751 "util/configparser.c" /* yacc.c:1646 */
+#line 3820 "util/configparser.c" /* yacc.c:1646 */
break;
- case 294:
-#line 1502 "util/configparser.y" /* yacc.c:1646 */
+ case 301:
+#line 1548 "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 3761 "util/configparser.c" /* yacc.c:1646 */
+#line 3830 "util/configparser.c" /* yacc.c:1646 */
break;
- case 295:
-#line 1509 "util/configparser.y" /* yacc.c:1646 */
+ case 302:
+#line 1555 "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 3771 "util/configparser.c" /* yacc.c:1646 */
+#line 3840 "util/configparser.c" /* yacc.c:1646 */
break;
- case 296:
-#line 1516 "util/configparser.y" /* yacc.c:1646 */
+ case 303:
+#line 1562 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(dnstap:)\n"));
}
-#line 3779 "util/configparser.c" /* yacc.c:1646 */
+#line 3848 "util/configparser.c" /* yacc.c:1646 */
break;
- case 311:
-#line 1533 "util/configparser.y" /* yacc.c:1646 */
+ case 318:
+#line 1579 "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 3790 "util/configparser.c" /* yacc.c:1646 */
+#line 3859 "util/configparser.c" /* yacc.c:1646 */
break;
- case 312:
-#line 1541 "util/configparser.y" /* yacc.c:1646 */
+ case 319:
+#line 1587 "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 3800 "util/configparser.c" /* yacc.c:1646 */
+#line 3869 "util/configparser.c" /* yacc.c:1646 */
break;
- case 313:
-#line 1548 "util/configparser.y" /* yacc.c:1646 */
+ case 320:
+#line 1594 "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 3811 "util/configparser.c" /* yacc.c:1646 */
+#line 3880 "util/configparser.c" /* yacc.c:1646 */
break;
- case 314:
-#line 1556 "util/configparser.y" /* yacc.c:1646 */
+ case 321:
+#line 1602 "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 3822 "util/configparser.c" /* yacc.c:1646 */
+#line 3891 "util/configparser.c" /* yacc.c:1646 */
break;
- case 315:
-#line 1564 "util/configparser.y" /* yacc.c:1646 */
+ case 322:
+#line 1610 "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 3832 "util/configparser.c" /* yacc.c:1646 */
+#line 3901 "util/configparser.c" /* yacc.c:1646 */
break;
- case 316:
-#line 1571 "util/configparser.y" /* yacc.c:1646 */
+ case 323:
+#line 1617 "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 3842 "util/configparser.c" /* yacc.c:1646 */
+#line 3911 "util/configparser.c" /* yacc.c:1646 */
break;
- case 317:
-#line 1578 "util/configparser.y" /* yacc.c:1646 */
+ case 324:
+#line 1624 "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)
@@ -3850,11 +3919,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_resolver_query_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 3854 "util/configparser.c" /* yacc.c:1646 */
+#line 3923 "util/configparser.c" /* yacc.c:1646 */
break;
- case 318:
-#line 1587 "util/configparser.y" /* yacc.c:1646 */
+ case 325:
+#line 1633 "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)
@@ -3862,11 +3931,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_resolver_response_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 3866 "util/configparser.c" /* yacc.c:1646 */
+#line 3935 "util/configparser.c" /* yacc.c:1646 */
break;
- case 319:
-#line 1596 "util/configparser.y" /* yacc.c:1646 */
+ case 326:
+#line 1642 "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)
@@ -3874,11 +3943,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_client_query_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 3878 "util/configparser.c" /* yacc.c:1646 */
+#line 3947 "util/configparser.c" /* yacc.c:1646 */
break;
- case 320:
-#line 1605 "util/configparser.y" /* yacc.c:1646 */
+ case 327:
+#line 1651 "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)
@@ -3886,11 +3955,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_client_response_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 3890 "util/configparser.c" /* yacc.c:1646 */
+#line 3959 "util/configparser.c" /* yacc.c:1646 */
break;
- case 321:
-#line 1614 "util/configparser.y" /* yacc.c:1646 */
+ case 328:
+#line 1660 "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)
@@ -3898,11 +3967,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 3902 "util/configparser.c" /* yacc.c:1646 */
+#line 3971 "util/configparser.c" /* yacc.c:1646 */
break;
- case 322:
-#line 1623 "util/configparser.y" /* yacc.c:1646 */
+ case 329:
+#line 1669 "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)
@@ -3910,29 +3979,42 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 3914 "util/configparser.c" /* yacc.c:1646 */
+#line 3983 "util/configparser.c" /* yacc.c:1646 */
break;
- case 323:
-#line 1632 "util/configparser.y" /* yacc.c:1646 */
+ case 330:
+#line 1678 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(python:)\n"));
}
-#line 3922 "util/configparser.c" /* yacc.c:1646 */
+#line 3991 "util/configparser.c" /* yacc.c:1646 */
break;
- case 327:
-#line 1641 "util/configparser.y" /* yacc.c:1646 */
+ case 334:
+#line 1687 "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 3932 "util/configparser.c" /* yacc.c:1646 */
+#line 4001 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 335:
+#line 1693 "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 4014 "util/configparser.c" /* yacc.c:1646 */
break;
-#line 3936 "util/configparser.c" /* yacc.c:1646 */
+#line 4018 "util/configparser.c" /* yacc.c:1646 */
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@@ -4160,7 +4242,7 @@ yyreturn:
#endif
return yyresult;
}
-#line 1646 "util/configparser.y" /* yacc.c:1906 */
+#line 1701 "util/configparser.y" /* yacc.c:1906 */
/* parse helper routines could be here */
diff --git a/util/configparser.h b/util/configparser.h
index e6c4993e62a4..135e4449a6ab 100644
--- a/util/configparser.h
+++ b/util/configparser.h
@@ -198,16 +198,20 @@ extern int yydebug;
VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES = 408,
VAR_HARDEN_ALGO_DOWNGRADE = 409,
VAR_IP_TRANSPARENT = 410,
- VAR_RATELIMIT = 411,
- VAR_RATELIMIT_SLABS = 412,
- VAR_RATELIMIT_SIZE = 413,
- VAR_RATELIMIT_FOR_DOMAIN = 414,
- VAR_RATELIMIT_BELOW_DOMAIN = 415,
- VAR_RATELIMIT_FACTOR = 416,
- VAR_CAPS_WHITELIST = 417,
- VAR_CACHE_MAX_NEGATIVE_TTL = 418,
- VAR_PERMIT_SMALL_HOLDDOWN = 419,
- VAR_QNAME_MINIMISATION = 420
+ VAR_DISABLE_DNSSEC_LAME_CHECK = 411,
+ VAR_RATELIMIT = 412,
+ VAR_RATELIMIT_SLABS = 413,
+ VAR_RATELIMIT_SIZE = 414,
+ VAR_RATELIMIT_FOR_DOMAIN = 415,
+ VAR_RATELIMIT_BELOW_DOMAIN = 416,
+ VAR_RATELIMIT_FACTOR = 417,
+ VAR_CAPS_WHITELIST = 418,
+ VAR_CACHE_MAX_NEGATIVE_TTL = 419,
+ VAR_PERMIT_SMALL_HOLDDOWN = 420,
+ VAR_QNAME_MINIMISATION = 421,
+ VAR_IP_FREEBIND = 422,
+ VAR_DEFINE_TAG = 423,
+ VAR_LOCAL_ZONE_TAG = 424
};
#endif
/* Tokens. */
@@ -364,16 +368,20 @@ extern int yydebug;
#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 408
#define VAR_HARDEN_ALGO_DOWNGRADE 409
#define VAR_IP_TRANSPARENT 410
-#define VAR_RATELIMIT 411
-#define VAR_RATELIMIT_SLABS 412
-#define VAR_RATELIMIT_SIZE 413
-#define VAR_RATELIMIT_FOR_DOMAIN 414
-#define VAR_RATELIMIT_BELOW_DOMAIN 415
-#define VAR_RATELIMIT_FACTOR 416
-#define VAR_CAPS_WHITELIST 417
-#define VAR_CACHE_MAX_NEGATIVE_TTL 418
-#define VAR_PERMIT_SMALL_HOLDDOWN 419
-#define VAR_QNAME_MINIMISATION 420
+#define VAR_DISABLE_DNSSEC_LAME_CHECK 411
+#define VAR_RATELIMIT 412
+#define VAR_RATELIMIT_SLABS 413
+#define VAR_RATELIMIT_SIZE 414
+#define VAR_RATELIMIT_FOR_DOMAIN 415
+#define VAR_RATELIMIT_BELOW_DOMAIN 416
+#define VAR_RATELIMIT_FACTOR 417
+#define VAR_CAPS_WHITELIST 418
+#define VAR_CACHE_MAX_NEGATIVE_TTL 419
+#define VAR_PERMIT_SMALL_HOLDDOWN 420
+#define VAR_QNAME_MINIMISATION 421
+#define VAR_IP_FREEBIND 422
+#define VAR_DEFINE_TAG 423
+#define VAR_LOCAL_ZONE_TAG 424
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -384,7 +392,7 @@ union YYSTYPE
char* str;
-#line 388 "util/configparser.h" /* yacc.c:1909 */
+#line 396 "util/configparser.h" /* yacc.c:1909 */
};
typedef union YYSTYPE YYSTYPE;
diff --git a/util/configparser.y b/util/configparser.y
index ea7acdb597ed..4ff18f0ce5c7 100644
--- a/util/configparser.y
+++ b/util/configparser.y
@@ -121,10 +121,11 @@ extern struct config_parser_state* cfg_parser;
%token VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES
%token VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES
%token VAR_HARDEN_ALGO_DOWNGRADE VAR_IP_TRANSPARENT
+%token VAR_DISABLE_DNSSEC_LAME_CHECK
%token VAR_RATELIMIT VAR_RATELIMIT_SLABS VAR_RATELIMIT_SIZE
%token VAR_RATELIMIT_FOR_DOMAIN VAR_RATELIMIT_BELOW_DOMAIN VAR_RATELIMIT_FACTOR
%token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL VAR_PERMIT_SMALL_HOLDDOWN
-%token VAR_QNAME_MINIMISATION
+%token VAR_QNAME_MINIMISATION VAR_IP_FREEBIND VAR_DEFINE_TAG VAR_LOCAL_ZONE_TAG
%%
toplevelvars: /* empty */ | toplevelvars toplevelvar ;
@@ -191,7 +192,9 @@ content_server: server_num_threads | server_verbosity | server_port |
server_ratelimit_size | server_ratelimit_for_domain |
server_ratelimit_below_domain | server_ratelimit_factor |
server_caps_whitelist | server_cache_max_negative_ttl |
- server_permit_small_holddown | server_qname_minimisation
+ server_permit_small_holddown | server_qname_minimisation |
+ server_ip_freebind | server_define_tag | server_local_zone_tag |
+ server_disable_dnssec_lame_check
;
stubstart: VAR_STUB_ZONE
{
@@ -662,6 +665,16 @@ server_ip_transparent: VAR_IP_TRANSPARENT STRING_ARG
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));
@@ -1286,6 +1299,39 @@ server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG
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_ratelimit: VAR_RATELIMIT STRING_ARG
{
OUTYY(("P(server_ratelimit:%s)\n", $2));
@@ -1643,6 +1689,15 @@ py_script: VAR_PYTHON_SCRIPT STRING_ARG
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);
+ }
%%
/* parse helper routines could be here */
diff --git a/util/data/dname.c b/util/data/dname.c
index 79bf52ad4728..8fc475f7f3f1 100644
--- a/util/data/dname.c
+++ b/util/data/dname.c
@@ -256,11 +256,13 @@ dname_pkt_compare(sldns_buffer* pkt, uint8_t* d1, uint8_t* d2)
log_assert(len1 == len2 && len1 != 0);
/* compare labels */
while(len1--) {
- if(tolower((unsigned char)*d1++) != tolower((unsigned char)*d2++)) {
- if(tolower((unsigned char)d1[-1]) < tolower((unsigned char)d2[-1]))
+ 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++;
@@ -281,8 +283,10 @@ dname_query_hash(uint8_t* dname, hashvalue_t h)
log_assert(lablen <= LDNS_MAX_LABELLEN);
labuf[0] = lablen;
i=0;
- while(lablen--)
- labuf[++i] = (uint8_t)tolower((unsigned char)*dname++);
+ while(lablen--) {
+ labuf[++i] = (uint8_t)tolower((unsigned char)*dname);
+ dname++;
+ }
h = hashlittle(labuf, labuf[0] + 1, h);
lablen = *dname++;
}
@@ -309,8 +313,10 @@ dname_pkt_hash(sldns_buffer* pkt, uint8_t* dname, hashvalue_t h)
log_assert(lablen <= LDNS_MAX_LABELLEN);
labuf[0] = lablen;
i=0;
- while(lablen--)
- labuf[++i] = (uint8_t)tolower((unsigned char)*dname++);
+ while(lablen--) {
+ labuf[++i] = (uint8_t)tolower((unsigned char)*dname);
+ dname++;
+ }
h = hashlittle(labuf, labuf[0] + 1, h);
lablen = *dname++;
}
diff --git a/util/data/msgencode.c b/util/data/msgencode.c
index 43464e9bbe0c..034bb24bd6e4 100644
--- a/util/data/msgencode.c
+++ b/util/data/msgencode.c
@@ -717,16 +717,23 @@ reply_info_encode(struct query_info* qinfo, struct reply_info* rep,
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;
- /* domain root '.' + type + class + ttl + rdatalen(=0) */
- return 1 + 2 + 2 + 4 + 2;
+ 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 */
@@ -742,7 +749,18 @@ attach_edns_record(sldns_buffer* pkt, struct edns_data* edns)
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);
}
diff --git a/util/data/msgparse.c b/util/data/msgparse.c
index 108c9dacb39b..1d565c1ea280 100644
--- a/util/data/msgparse.c
+++ b/util/data/msgparse.c
@@ -38,6 +38,7 @@
*/
#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"
@@ -933,13 +934,41 @@ parse_packet(sldns_buffer* pkt, struct msg_parse* msg, struct regional* region)
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)
+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) {
@@ -986,13 +1015,25 @@ parse_extract_edns(struct msg_parse* msg, struct edns_data* edns)
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);
- /* ignore rdata and rrsigs */
+ 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)
+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);
@@ -1017,6 +1058,17 @@ parse_edns_from_pkt(sldns_buffer* pkt, struct edns_data* edns)
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);
- /* ignore rdata and rrsigs */
+ 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;
}
diff --git a/util/data/msgparse.h b/util/data/msgparse.h
index 44497c8ca381..cae988ff9950 100644
--- a/util/data/msgparse.h
+++ b/util/data/msgparse.h
@@ -69,6 +69,7 @@ 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
@@ -202,7 +203,8 @@ struct rr_parse {
/**
* EDNS data storage
- * EDNS rdata is ignored.
+ * rdata is parsed in a list (has accessor functions). allocated in a
+ * region.
*/
struct edns_data {
/** if EDNS OPT record was present */
@@ -215,6 +217,22 @@ struct edns_data {
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;
};
/**
@@ -249,10 +267,12 @@ int parse_packet(struct sldns_buffer* pkt, struct msg_parse* msg,
* @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);
+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.
@@ -260,10 +280,12 @@ int parse_extract_edns(struct msg_parse* msg, struct edns_data* edns);
* 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);
+int parse_edns_from_pkt(struct sldns_buffer* pkt, struct edns_data* edns,
+ struct regional* region);
/**
* Calculate hash value for rrset in packet.
diff --git a/util/data/msgreply.c b/util/data/msgreply.c
index 06593ffe1b27..f8a24918dcad 100644
--- a/util/data/msgreply.c
+++ b/util/data/msgreply.c
@@ -461,7 +461,7 @@ int reply_info_parse(sldns_buffer* pkt, struct alloc_cache* alloc,
if((ret = parse_packet(pkt, msg, region)) != 0) {
return ret;
}
- if((ret = parse_extract_edns(msg, edns)) != 0)
+ if((ret = parse_extract_edns(msg, edns, region)) != 0)
return ret;
/* parse OK, allocate return structures */
@@ -857,3 +857,155 @@ reply_all_rrsets_secure(struct reply_info* rep)
}
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 = 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_inplace_reply(struct edns_data* edns, struct regional* region)
+{
+ (void)region;
+ /* remove all edns options from the reply, because only the
+ * options that we understand should be in the reply
+ * (sec 6.1.2 RFC 6891) */
+ edns->opt_list = NULL;
+ 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) {
+ 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_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/util/data/msgreply.h b/util/data/msgreply.h
index 708897950089..b542b75e6970 100644
--- a/util/data/msgreply.h
+++ b/util/data/msgreply.h
@@ -437,4 +437,56 @@ void log_dns_msg(const char* str, struct query_info* qinfo,
void log_query_info(enum verbosity_value v, const char* str,
struct query_info* qinf);
+/**
+ * Append edns option to edns data structure
+ */
+int edns_opt_append(struct edns_data* edns, struct regional* region,
+ uint16_t code, size_t len, uint8_t* data);
+
+/**
+ * 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_find(struct edns_option* list, uint16_t code);
+
+/**
+ * Transform edns data structure from query structure into reply structure.
+ * In place transform, for errors and cache replies.
+ * @param edns: on input contains the edns from the query. On output contains
+ * the edns for the answer. Add new options to the opt_list to put them
+ * in the answer (allocated in the region, with edns_opt_append).
+ * @param region: to allocate stuff in.
+ * @return false on failure (servfail to client, or for some error encodings,
+ * no EDNS options in the answer).
+ */
+int edns_opt_inplace_reply(struct edns_data* edns, struct regional* region);
+
+/**
+ * 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/util/fptr_wlist.c b/util/fptr_wlist.c
index 1397e9c1359d..80a23f20361b 100644
--- a/util/fptr_wlist.c
+++ b/util/fptr_wlist.c
@@ -78,6 +78,9 @@
#ifdef WITH_PYTHONMODULE
#include "pythonmod/pythonmod.h"
#endif
+#ifdef USE_CACHEDB
+#include "cachedb/cachedb.h"
+#endif
int
fptr_whitelist_comm_point(comm_point_callback_t *fptr)
@@ -264,8 +267,8 @@ int
fptr_whitelist_modenv_send_query(struct outbound_entry* (*fptr)(
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
uint16_t flags, int dnssec, int want_dnssec, int nocaps,
- struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t* zone, size_t zonelen,
+ struct edns_option* opt_list, struct sockaddr_storage* addr,
+ socklen_t addrlen, uint8_t* zone, size_t zonelen,
struct module_qstate* q))
{
if(fptr == &worker_send_query) return 1;
@@ -315,6 +318,9 @@ fptr_whitelist_mod_init(int (*fptr)(struct module_env* env, int id))
#ifdef WITH_PYTHONMODULE
else if(fptr == &pythonmod_init) return 1;
#endif
+#ifdef USE_CACHEDB
+ else if(fptr == &cachedb_init) return 1;
+#endif
return 0;
}
@@ -327,6 +333,9 @@ fptr_whitelist_mod_deinit(void (*fptr)(struct module_env* env, int id))
#ifdef WITH_PYTHONMODULE
else if(fptr == &pythonmod_deinit) return 1;
#endif
+#ifdef USE_CACHEDB
+ else if(fptr == &cachedb_deinit) return 1;
+#endif
return 0;
}
@@ -340,6 +349,9 @@ fptr_whitelist_mod_operate(void (*fptr)(struct module_qstate* qstate,
#ifdef WITH_PYTHONMODULE
else if(fptr == &pythonmod_operate) return 1;
#endif
+#ifdef USE_CACHEDB
+ else if(fptr == &cachedb_operate) return 1;
+#endif
return 0;
}
@@ -353,6 +365,9 @@ fptr_whitelist_mod_inform_super(void (*fptr)(
#ifdef WITH_PYTHONMODULE
else if(fptr == &pythonmod_inform_super) return 1;
#endif
+#ifdef USE_CACHEDB
+ else if(fptr == &cachedb_inform_super) return 1;
+#endif
return 0;
}
@@ -366,6 +381,9 @@ fptr_whitelist_mod_clear(void (*fptr)(struct module_qstate* qstate,
#ifdef WITH_PYTHONMODULE
else if(fptr == &pythonmod_clear) return 1;
#endif
+#ifdef USE_CACHEDB
+ else if(fptr == &cachedb_clear) return 1;
+#endif
return 0;
}
@@ -378,6 +396,9 @@ fptr_whitelist_mod_get_mem(size_t (*fptr)(struct module_env* env, int id))
#ifdef WITH_PYTHONMODULE
else if(fptr == &pythonmod_get_mem) return 1;
#endif
+#ifdef USE_CACHEDB
+ else if(fptr == &cachedb_get_mem) return 1;
+#endif
return 0;
}
diff --git a/util/fptr_wlist.h b/util/fptr_wlist.h
index 10de5d816772..98ca21bb9671 100644
--- a/util/fptr_wlist.h
+++ b/util/fptr_wlist.h
@@ -212,7 +212,7 @@ int fptr_whitelist_hash_markdelfunc(lruhash_markdelfunc_t fptr);
int fptr_whitelist_modenv_send_query(struct outbound_entry* (*fptr)(
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
uint16_t flags, int dnssec, int want_dnssec, int nocaps,
- struct sockaddr_storage* addr, socklen_t addrlen,
+ struct edns_option*, struct sockaddr_storage* addr, socklen_t addrlen,
uint8_t* zone, size_t zonelen,
struct module_qstate* q));
diff --git a/util/iana_ports.inc b/util/iana_ports.inc
index df5a560aff08..3856488ba347 100644
--- a/util/iana_ports.inc
+++ b/util/iana_ports.inc
@@ -3844,6 +3844,8 @@
4412,
4413,
4416,
+4418,
+4420,
4425,
4426,
4430,
@@ -3904,6 +3906,7 @@
4599,
4600,
4601,
+4621,
4658,
4659,
4660,
@@ -4222,6 +4225,7 @@
5436,
5437,
5443,
+5450,
5453,
5454,
5455,
@@ -4598,6 +4602,7 @@
7201,
7227,
7235,
+7244,
7262,
7272,
7273,
@@ -4651,6 +4656,7 @@
7570,
7574,
7588,
+7606,
7624,
7627,
7628,
@@ -5269,6 +5275,7 @@
23004,
23005,
23272,
+23294,
23333,
23400,
23401,
diff --git a/util/module.h b/util/module.h
index b9dde36e2f3c..c3ce8a40eda2 100644
--- a/util/module.h
+++ b/util/module.h
@@ -214,6 +214,8 @@ struct module_env {
* 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 opt_list: set these EDNS options on the outgoing packet.
+ * or NULL if none (the list is deep-copied).
* @param addr: where to.
* @param addrlen: length of addr.
* @param zone: delegation point name.
@@ -226,9 +228,9 @@ struct module_env {
*/
struct outbound_entry* (*send_query)(uint8_t* qname, size_t qnamelen,
uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec,
- int want_dnssec, int nocaps, struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t* zone, size_t zonelen,
- struct module_qstate* q);
+ int want_dnssec, int nocaps, struct edns_option* opt_list,
+ struct sockaddr_storage* addr, socklen_t addrlen,
+ uint8_t* zone, size_t zonelen, struct module_qstate* q);
/**
* Detach-subqueries.
diff --git a/util/net_help.c b/util/net_help.c
index eb03cd0ae6d2..5d6c033d6597 100644
--- a/util/net_help.c
+++ b/util/net_help.c
@@ -783,7 +783,7 @@ void* outgoing_ssl_fd(void* sslctx, int fd)
#endif
}
-#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED)
+#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK)
/** global lock list for openssl locks */
static lock_basic_t *ub_openssl_locks = NULL;
@@ -808,7 +808,7 @@ ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
int ub_openssl_lock_init(void)
{
-#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED)
+#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK)
int i;
ub_openssl_locks = (lock_basic_t*)reallocarray(
NULL, (size_t)CRYPTO_num_locks(), sizeof(lock_basic_t));
@@ -825,7 +825,7 @@ int ub_openssl_lock_init(void)
void ub_openssl_lock_delete(void)
{
-#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED)
+#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK)
int i;
if(!ub_openssl_locks)
return;
diff --git a/util/netevent.c b/util/netevent.c
index b827e6540b1f..bdb35739327b 100644
--- a/util/netevent.c
+++ b/util/netevent.c
@@ -40,6 +40,7 @@
*/
#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"
@@ -89,48 +90,29 @@
#define NUM_UDP_PER_SELECT 1
#endif
-/* 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 */
-
/**
- * The internal event structure for keeping libevent info for the event.
+ * 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;
- /** libevent event type, alloced here */
- struct event ev;
+ /** ub_event event type */
+ struct ub_event* ev;
};
/**
* Internal base structure, so that every thread has its own events.
*/
struct internal_base {
- /** libevent event_base type. */
- struct event_base* 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 event slow_accept;
+ struct ub_event* slow_accept;
/** true if slow_accept is enabled */
int slow_accept_enabled;
};
@@ -139,10 +121,12 @@ struct internal_base {
* 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;
- /** libevent event type, alloced here */
- struct event ev;
+ /** ub_event event type */
+ struct ub_event* ev;
/** is timer enabled */
uint8_t enabled;
};
@@ -151,8 +135,8 @@ struct internal_timer {
* Internal signal structure, to store signal event in.
*/
struct internal_signal {
- /** libevent event type, alloced here */
- struct event ev;
+ /** ub_event event type */
+ struct ub_event* ev;
/** next in signal list */
struct internal_signal* next;
};
@@ -164,26 +148,13 @@ static struct comm_point* comm_point_create_tcp_handler(
/* -------- End of local definitions -------- */
-#ifdef USE_MINI_EVENT
-/** minievent updates the time when it blocks. */
-#define comm_base_now(x) /* nothing to do */
-#else /* !USE_MINI_EVENT */
-/** fillup the time values in the event base */
-static void
-comm_base_now(struct comm_base* b)
-{
- if(gettimeofday(&b->eb->now, NULL) < 0) {
- log_err("gettimeofday: %s", strerror(errno));
- }
- b->eb->secs = (time_t)b->eb->now.tv_sec;
-}
-#endif /* USE_MINI_EVENT */
-
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));
@@ -191,55 +162,20 @@ comm_base_create(int sigs)
free(b);
return NULL;
}
-#ifdef USE_MINI_EVENT
- (void)sigs;
- /* use mini event time-sharing feature */
- b->eb->base = event_init(&b->eb->secs, &b->eb->now);
-#else
-# if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)
- /* libev */
- if(sigs)
- b->eb->base=(struct event_base *)ev_default_loop(EVFLAG_AUTO);
- else
- b->eb->base=(struct event_base *)ev_loop_new(EVFLAG_AUTO);
-# else
- (void)sigs;
-# ifdef HAVE_EVENT_BASE_NEW
- b->eb->base = event_base_new();
-# else
- b->eb->base = event_init();
-# endif
-# endif
-#endif
+ 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;
}
- comm_base_now(b);
- /* avoid event_get_method call which causes crashes even when
- * not printing, because its result is passed */
- verbose(VERB_ALGO,
-#if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)
- "libev"
-#elif defined(USE_MINI_EVENT)
- "event "
-#else
- "libevent "
-#endif
- "%s uses %s method.",
- event_get_version(),
-#ifdef HAVE_EVENT_BASE_GET_METHOD
- event_base_get_method(b->eb->base)
-#else
- "not_obtainable"
-#endif
- );
+ 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 event_base* base)
+comm_base_create_event(struct ub_event_base* base)
{
struct comm_base* b = (struct comm_base*)calloc(1,
sizeof(struct comm_base));
@@ -251,7 +187,7 @@ comm_base_create_event(struct event_base* base)
return NULL;
}
b->eb->base = base;
- comm_base_now(b);
+ ub_comm_base_now(b);
return b;
}
@@ -261,18 +197,12 @@ comm_base_delete(struct comm_base* b)
if(!b)
return;
if(b->eb->slow_accept_enabled) {
- if(event_del(&b->eb->slow_accept) != 0) {
+ if(ub_event_del(b->eb->slow_accept) != 0) {
log_err("could not event_del slow_accept");
}
+ ub_event_free(b->eb->slow_accept);
}
-#ifdef USE_MINI_EVENT
- event_base_free(b->eb->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(b->eb->base);
-#endif /* HAVE_EVENT_BASE_FREE and HAVE_EVENT_BASE_ONCE */
+ ub_event_base_free(b->eb->base);
b->eb->base = NULL;
free(b->eb);
free(b);
@@ -284,9 +214,10 @@ comm_base_delete_no_base(struct comm_base* b)
if(!b)
return;
if(b->eb->slow_accept_enabled) {
- if(event_del(&b->eb->slow_accept) != 0) {
+ 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);
@@ -304,8 +235,8 @@ void
comm_base_dispatch(struct comm_base* b)
{
int retval;
- retval = event_base_dispatch(b->eb->base);
- if(retval != 0) {
+ retval = ub_event_base_dispatch(b->eb->base);
+ if(retval < 0) {
fatal_exit("event_dispatch returned error %d, "
"errno is %s", retval, strerror(errno));
}
@@ -313,7 +244,7 @@ comm_base_dispatch(struct comm_base* b)
void comm_base_exit(struct comm_base* b)
{
- if(event_base_loopexit(b->eb->base, NULL) != 0) {
+ if(ub_event_base_loopexit(b->eb->base) != 0) {
log_err("Could not loopexit");
}
}
@@ -326,7 +257,7 @@ void comm_base_set_slow_accept_handlers(struct comm_base* b,
b->cb_arg = arg;
}
-struct event_base* comm_base_internal(struct comm_base* b)
+struct ub_event_base* comm_base_internal(struct comm_base* b)
{
return b->eb->base;
}
@@ -648,10 +579,10 @@ comm_point_udp_ancil_callback(int fd, short event, void* arg)
rep.c = (struct comm_point*)arg;
log_assert(rep.c->type == comm_udp);
- if(!(event&EV_READ))
+ if(!(event&UB_EV_READ))
return;
log_assert(rep.c && rep.c->buffer && rep.c->fd == fd);
- comm_base_now(rep.c->ev->base);
+ 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);
@@ -736,10 +667,10 @@ comm_point_udp_callback(int fd, short event, void* arg)
rep.c = (struct comm_point*)arg;
log_assert(rep.c->type == comm_udp);
- if(!(event&EV_READ))
+ if(!(event&UB_EV_READ))
return;
log_assert(rep.c && rep.c->buffer && rep.c->fd == fd);
- comm_base_now(rep.c->ev->base);
+ 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);
@@ -839,15 +770,16 @@ int comm_point_perform_accept(struct comm_point* c,
/* set timeout, no mallocs */
tv.tv_sec = NETEVENT_SLOW_ACCEPT_TIME/1000;
tv.tv_usec = NETEVENT_SLOW_ACCEPT_TIME%1000;
- event_set(&b->eb->slow_accept, -1, EV_TIMEOUT,
+ b->eb->slow_accept = ub_event_new(b->eb->base,
+ -1, UB_EV_TIMEOUT,
comm_base_handle_slow_accept, b);
- if(event_base_set(b->eb->base,
- &b->eb->slow_accept) != 0) {
+ if(b->eb->slow_accept == NULL) {
/* we do not want to log here, because
* that would spam the logfiles.
* error: "event_base_set failed." */
}
- if(event_add(&b->eb->slow_accept, &tv) != 0) {
+ else if(ub_event_add(b->eb->slow_accept, &tv)
+ != 0) {
/* we do not want to log here,
* error: "event_add failed." */
}
@@ -861,7 +793,7 @@ int comm_point_perform_accept(struct comm_point* c,
WSAGetLastError() == WSAECONNRESET)
return -1;
if(WSAGetLastError() == WSAEWOULDBLOCK) {
- winsock_tcp_wouldblock(&c->ev->ev, EV_READ);
+ ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ);
return -1;
}
log_err_addr("accept failed", wsa_strerror(WSAGetLastError()),
@@ -885,14 +817,14 @@ static long win_bio_cb(BIO *b, int oper, const char* ATTR_UNUSED(argp),
if( (oper == (BIO_CB_READ|BIO_CB_RETURN) && argl == 0) ||
(oper == (BIO_CB_GETS|BIO_CB_RETURN) && argl == 0)) {
if(WSAGetLastError() == WSAEWOULDBLOCK)
- winsock_tcp_wouldblock((struct event*)
- BIO_get_callback_arg(b), EV_READ);
+ 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)
- winsock_tcp_wouldblock((struct event*)
- BIO_get_callback_arg(b), EV_WRITE);
+ ub_winsock_tcp_wouldblock((struct ub_event*)
+ BIO_get_callback_arg(b), UB_EV_WRITE);
}
/* return original return value */
return retvalue;
@@ -905,9 +837,9 @@ 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_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);
+ BIO_set_callback_arg(SSL_get_wbio(ssl), (char*)c->ev->ev);
}
#endif
@@ -917,11 +849,11 @@ 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 & EV_READ)) {
+ if(!(event & UB_EV_READ)) {
log_info("ignoring tcp accept event %d", (int)event);
return;
}
- comm_base_now(c->ev->base);
+ ub_comm_base_now(c->ev->base);
/* find free tcp handler. */
if(!c->tcp_free) {
log_warn("accepted too many tcp, connections full");
@@ -1297,7 +1229,8 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok)
if(WSAGetLastError() == WSAEINPROGRESS)
return 1;
if(WSAGetLastError() == WSAEWOULDBLOCK) {
- winsock_tcp_wouldblock(&c->ev->ev, EV_READ);
+ ub_winsock_tcp_wouldblock(c->ev->ev,
+ UB_EV_READ);
return 1;
}
log_err_addr("read (in tcp s)",
@@ -1342,7 +1275,7 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok)
if(WSAGetLastError() == WSAEINPROGRESS)
return 1;
if(WSAGetLastError() == WSAEWOULDBLOCK) {
- winsock_tcp_wouldblock(&c->ev->ev, EV_READ);
+ ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ);
return 1;
}
log_err_addr("read (in tcp r)",
@@ -1401,7 +1334,7 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
if(error == WSAEINPROGRESS)
return 1;
else if(error == WSAEWOULDBLOCK) {
- winsock_tcp_wouldblock(&c->ev->ev, EV_WRITE);
+ ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE);
return 1;
} else if(error != 0 && verbosity < 2)
return 0;
@@ -1451,7 +1384,8 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
if(WSAGetLastError() == WSAEINPROGRESS)
return 1;
if(WSAGetLastError() == WSAEWOULDBLOCK) {
- winsock_tcp_wouldblock(&c->ev->ev, EV_WRITE);
+ ub_winsock_tcp_wouldblock(c->ev->ev,
+ UB_EV_WRITE);
return 1;
}
log_err_addr("tcp send s",
@@ -1483,7 +1417,7 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
if(WSAGetLastError() == WSAEINPROGRESS)
return 1;
if(WSAGetLastError() == WSAEWOULDBLOCK) {
- winsock_tcp_wouldblock(&c->ev->ev, EV_WRITE);
+ ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE);
return 1;
}
log_err_addr("tcp send r", wsa_strerror(WSAGetLastError()),
@@ -1505,9 +1439,9 @@ 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);
- comm_base_now(c->ev->base);
+ ub_comm_base_now(c->ev->base);
- if(event&EV_READ) {
+ if(event&UB_EV_READ) {
if(!comm_point_tcp_handle_read(fd, c, 0)) {
reclaim_tcp_handler(c);
if(!c->tcp_do_close) {
@@ -1519,7 +1453,7 @@ comm_point_tcp_handle_callback(int fd, short event, void* arg)
}
return;
}
- if(event&EV_WRITE) {
+ if(event&UB_EV_WRITE) {
if(!comm_point_tcp_handle_write(fd, c)) {
reclaim_tcp_handler(c);
if(!c->tcp_do_close) {
@@ -1531,7 +1465,7 @@ comm_point_tcp_handle_callback(int fd, short event, void* arg)
}
return;
}
- if(event&EV_TIMEOUT) {
+ if(event&UB_EV_TIMEOUT) {
verbose(VERB_QUERY, "tcp took too long, dropped");
reclaim_tcp_handler(c);
if(!c->tcp_do_close) {
@@ -1548,9 +1482,9 @@ 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);
- comm_base_now(c->ev->base);
+ ub_comm_base_now(c->ev->base);
- if(event&EV_READ) {
+ 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,
@@ -1567,9 +1501,9 @@ void comm_point_raw_handle_callback(int ATTR_UNUSED(fd),
struct comm_point* c = (struct comm_point*)arg;
int err = NETEVENT_NOERROR;
log_assert(c->type == comm_raw);
- comm_base_now(c->ev->base);
+ ub_comm_base_now(c->ev->base);
- if(event&EV_TIMEOUT)
+ 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);
@@ -1609,15 +1543,16 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer,
c->inuse = 0;
c->callback = callback;
c->cb_arg = callback_arg;
- evbits = EV_READ | EV_PERSIST;
- /* libevent stuff */
- event_set(&c->ev->ev, c->fd, evbits, comm_point_udp_callback, c);
- if(event_base_set(base->eb->base, &c->ev->ev) != 0) {
+ 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 && event_add(&c->ev->ev, c->timeout) != 0 ) {
+ 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;
@@ -1660,15 +1595,16 @@ comm_point_create_udp_ancil(struct comm_base *base, int fd,
c->tcp_check_nb_connect = 0;
c->callback = callback;
c->cb_arg = callback_arg;
- evbits = EV_READ | EV_PERSIST;
- /* libevent stuff */
- event_set(&c->ev->ev, c->fd, evbits, comm_point_udp_ancil_callback, c);
- if(event_base_set(base->eb->base, &c->ev->ev) != 0) {
+ 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 && event_add(&c->ev->ev, c->timeout) != 0 ) {
+ 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;
@@ -1725,10 +1661,11 @@ comm_point_create_tcp_handler(struct comm_base *base,
/* add to parent free list */
c->tcp_free = parent->tcp_free;
parent->tcp_free = c;
- /* libevent stuff */
- evbits = EV_PERSIST | EV_READ | EV_TIMEOUT;
- event_set(&c->ev->ev, c->fd, evbits, comm_point_tcp_handle_callback, c);
- if(event_base_set(base->eb->base, &c->ev->ev) != 0)
+ /* 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;
@@ -1780,17 +1717,20 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num, size_t bufsize,
c->tcp_check_nb_connect = 0;
c->callback = NULL;
c->cb_arg = NULL;
- evbits = EV_READ | EV_PERSIST;
- /* libevent stuff */
- event_set(&c->ev->ev, c->fd, evbits, comm_point_tcp_accept_callback, c);
- if(event_base_set(base->eb->base, &c->ev->ev) != 0 ||
- event_add(&c->ev->ev, c->timeout) != 0 )
- {
+ 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,
@@ -1843,11 +1783,12 @@ comm_point_create_tcp_out(struct comm_base *base, size_t bufsize,
c->repinfo.c = c;
c->callback = callback;
c->cb_arg = callback_arg;
- evbits = EV_PERSIST | EV_WRITE;
- event_set(&c->ev->ev, c->fd, evbits, comm_point_tcp_handle_callback, c);
- if(event_base_set(base->eb->base, &c->ev->ev) != 0)
+ 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 basetset tcpout event");
+ log_err("could not baseset tcpout event");
sldns_buffer_free(c->buffer);
free(c->ev);
free(c);
@@ -1895,14 +1836,19 @@ comm_point_create_local(struct comm_base *base, int fd, size_t bufsize,
c->tcp_check_nb_connect = 0;
c->callback = callback;
c->cb_arg = callback_arg;
- /* libevent stuff */
- evbits = EV_PERSIST | EV_READ;
- event_set(&c->ev->ev, c->fd, evbits, comm_point_local_handle_callback,
- c);
- if(event_base_set(base->eb->base, &c->ev->ev) != 0 ||
- event_add(&c->ev->ev, c->timeout) != 0 )
- {
+ /* 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;
@@ -1943,16 +1889,21 @@ comm_point_create_raw(struct comm_base* base, int fd, int writing,
c->tcp_check_nb_connect = 0;
c->callback = callback;
c->cb_arg = callback_arg;
- /* libevent stuff */
+ /* ub_event stuff */
if(writing)
- evbits = EV_PERSIST | EV_WRITE;
- else evbits = EV_PERSIST | EV_READ;
- event_set(&c->ev->ev, c->fd, evbits, comm_point_raw_handle_callback,
- c);
- if(event_base_set(base->eb->base, &c->ev->ev) != 0 ||
- event_add(&c->ev->ev, c->timeout) != 0 )
- {
+ 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;
@@ -1966,7 +1917,7 @@ comm_point_close(struct comm_point* c)
if(!c)
return;
if(c->fd != -1)
- if(event_del(&c->ev->ev) != 0) {
+ 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 */
@@ -2002,6 +1953,7 @@ comm_point_delete(struct comm_point* c)
free(c->timeout);
if(c->type == comm_tcp || c->type == comm_local)
sldns_buffer_free(c->buffer);
+ ub_event_free(c->ev->ev);
free(c->ev);
free(c);
}
@@ -2051,7 +2003,7 @@ void
comm_point_stop_listening(struct comm_point* c)
{
verbose(VERB_ALGO, "comm point stop listening %d", c->fd);
- if(event_del(&c->ev->ev) != 0) {
+ if(ub_event_del(c->ev->ev) != 0) {
log_err("event_del error to stoplisten");
}
}
@@ -2074,17 +2026,17 @@ comm_point_start_listening(struct comm_point* c, int newfd, int sec)
return;
}
}
- c->ev->ev.ev_events |= EV_TIMEOUT;
+ ub_event_add_bits(c->ev->ev, UB_EV_TIMEOUT);
#ifndef S_SPLINT_S /* splint fails on struct timeval. */
c->timeout->tv_sec = sec;
c->timeout->tv_usec = 0;
#endif /* S_SPLINT_S */
}
if(c->type == comm_tcp) {
- c->ev->ev.ev_events &= ~(EV_READ|EV_WRITE);
+ ub_event_del_bits(c->ev->ev, UB_EV_READ|UB_EV_WRITE);
if(c->tcp_is_reading)
- c->ev->ev.ev_events |= EV_READ;
- else c->ev->ev.ev_events |= EV_WRITE;
+ 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) {
@@ -2095,9 +2047,9 @@ comm_point_start_listening(struct comm_point* c, int newfd, int sec)
#endif
}
c->fd = newfd;
- c->ev->ev.ev_fd = c->fd;
+ ub_event_set_fd(c->ev->ev, c->fd);
}
- if(event_add(&c->ev->ev, sec==0?NULL:c->timeout) != 0) {
+ if(ub_event_add(c->ev->ev, sec==0?NULL:c->timeout) != 0) {
log_err("event_add failed. in cpsl.");
}
}
@@ -2105,13 +2057,13 @@ comm_point_start_listening(struct comm_point* c, int newfd, int sec)
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(event_del(&c->ev->ev) != 0) {
+ if(ub_event_del(c->ev->ev) != 0) {
log_err("event_del error to cplf");
}
- c->ev->ev.ev_events &= ~(EV_READ|EV_WRITE);
- if(rd) c->ev->ev.ev_events |= EV_READ;
- if(wr) c->ev->ev.ev_events |= EV_WRITE;
- if(event_add(&c->ev->ev, c->timeout) != 0) {
+ 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.");
}
}
@@ -2137,29 +2089,24 @@ size_t comm_point_get_mem(struct comm_point* c)
struct comm_timer*
comm_timer_create(struct comm_base* base, void (*cb)(void*), void* cb_arg)
{
- struct comm_timer *tm = (struct comm_timer*)calloc(1,
- sizeof(struct comm_timer));
- if(!tm)
- return NULL;
- tm->ev_timer = (struct internal_timer*)calloc(1,
+ struct internal_timer *tm = (struct internal_timer*)calloc(1,
sizeof(struct internal_timer));
- if(!tm->ev_timer) {
+ if(!tm) {
log_err("malloc failed");
- free(tm);
return NULL;
}
- tm->ev_timer->base = base;
- tm->callback = cb;
- tm->cb_arg = cb_arg;
- event_set(&tm->ev_timer->ev, -1, EV_TIMEOUT,
- comm_timer_callback, tm);
- if(event_base_set(base->eb->base, &tm->ev_timer->ev) != 0) {
+ 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->ev_timer);
free(tm);
return NULL;
}
- return tm;
+ return &tm->super;
}
void
@@ -2167,7 +2114,7 @@ comm_timer_disable(struct comm_timer* timer)
{
if(!timer)
return;
- evtimer_del(&timer->ev_timer->ev);
+ ub_timer_del(timer->ev_timer->ev);
timer->ev_timer->enabled = 0;
}
@@ -2177,12 +2124,8 @@ comm_timer_set(struct comm_timer* timer, struct timeval* tv)
log_assert(tv);
if(timer->ev_timer->enabled)
comm_timer_disable(timer);
- event_set(&timer->ev_timer->ev, -1, EV_TIMEOUT,
- comm_timer_callback, timer);
- if(event_base_set(timer->ev_timer->base->eb->base,
- &timer->ev_timer->ev) != 0)
- log_err("comm_timer_set: set_base failed.");
- if(evtimer_add(&timer->ev_timer->ev, tv) != 0)
+ 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;
}
@@ -2193,17 +2136,20 @@ 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);
- free(timer);
}
void
comm_timer_callback(int ATTR_UNUSED(fd), short event, void* arg)
{
struct comm_timer* tm = (struct comm_timer*)arg;
- if(!(event&EV_TIMEOUT))
+ if(!(event&UB_EV_TIMEOUT))
return;
- comm_base_now(tm->ev_timer->base);
+ 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);
@@ -2216,9 +2162,9 @@ comm_timer_is_set(struct comm_timer* timer)
}
size_t
-comm_timer_get_mem(struct comm_timer* timer)
+comm_timer_get_mem(struct comm_timer* ATTR_UNUSED(timer))
{
- return sizeof(*timer) + sizeof(struct internal_timer);
+ return sizeof(struct internal_timer);
}
struct comm_signal*
@@ -2242,9 +2188,9 @@ void
comm_signal_callback(int sig, short event, void* arg)
{
struct comm_signal* comsig = (struct comm_signal*)arg;
- if(!(event & EV_SIGNAL))
+ if(!(event & UB_EV_SIGNAL))
return;
- comm_base_now(comsig->base);
+ ub_comm_base_now(comsig->base);
fptr_ok(fptr_whitelist_comm_signal(comsig->callback));
(*comsig->callback)(sig, comsig->cb_arg);
}
@@ -2260,14 +2206,16 @@ comm_signal_bind(struct comm_signal* comsig, int sig)
}
log_assert(comsig);
/* add signal event */
- signal_set(&entry->ev, sig, comm_signal_callback, comsig);
- if(event_base_set(comsig->base->eb->base, &entry->ev) != 0) {
- log_err("Could not set signal base");
+ 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(signal_add(&entry->ev, NULL) != 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;
}
@@ -2286,7 +2234,8 @@ comm_signal_delete(struct comm_signal* comsig)
p=comsig->ev_signal;
while(p) {
np = p->next;
- signal_del(&p->ev);
+ ub_signal_del(p->ev);
+ ub_event_free(p->ev);
free(p);
p = np;
}
diff --git a/util/netevent.h b/util/netevent.h
index 4b87cdba9e51..bdcddd848bd0 100644
--- a/util/netevent.h
+++ b/util/netevent.h
@@ -63,12 +63,12 @@
struct sldns_buffer;
struct comm_point;
struct comm_reply;
-struct event_base;
+struct ub_event_base;
/* internal event notification data storage structure. */
struct internal_event;
struct internal_base;
-struct internal_timer;
+struct internal_timer; /* A sub struct of the comm_timer super struct */
/** callback from communication point function type */
typedef int comm_point_callback_t(struct comm_point*, void*, int,
@@ -265,7 +265,7 @@ struct comm_point {
* Structure only for making timeout events.
*/
struct comm_timer {
- /** the internal event stuff */
+ /** the internal event stuff (derived) */
struct internal_timer* ev_timer;
/** callback function, takes user arg only */
@@ -301,12 +301,12 @@ struct comm_signal {
struct comm_base* comm_base_create(int sigs);
/**
- * Create comm base that uses the given event_base (underlying event
- * mechanism pointer).
- * @param base: underlying lib event base.
+ * 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 event_base* base);
+struct comm_base* comm_base_create_event(struct ub_event_base* base);
/**
* Delete comm base structure but not the underlying lib event base.
@@ -357,9 +357,9 @@ void comm_base_set_slow_accept_handlers(struct comm_base* b,
/**
* Access internal data structure (for util/tube.c on windows)
* @param b: comm base
- * @return event_base. Could be libevent, or internal event handler.
+ * @return ub_event_base.
*/
-struct event_base* comm_base_internal(struct comm_base* b);
+struct ub_event_base* comm_base_internal(struct comm_base* b);
/**
* Create an UDP comm point. Calls malloc.
diff --git a/util/tube.c b/util/tube.c
index 0535474386b5..e525f1ccd8aa 100644
--- a/util/tube.c
+++ b/util/tube.c
@@ -44,6 +44,7 @@
#include "util/net_help.h"
#include "util/netevent.h"
#include "util/fptr_wlist.h"
+#include "util/ub_event.h"
#ifndef USE_WINSOCK
/* on unix */
@@ -303,6 +304,8 @@ int tube_write_msg(struct tube* tube, uint8_t* buf, uint32_t len,
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;
@@ -312,6 +315,8 @@ int tube_write_msg(struct tube* tube, uint8_t* buf, uint32_t len,
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;
@@ -537,7 +542,7 @@ void tube_close_write(struct tube* ATTR_UNUSED(tube))
void tube_remove_bg_listen(struct tube* tube)
{
verbose(VERB_ALGO, "tube remove_bg_listen");
- winsock_unregister_wsaevent(&tube->ev_listen);
+ ub_winsock_unregister_wsaevent(tube->ev_listen);
}
void tube_remove_bg_write(struct tube* tube)
@@ -668,8 +673,9 @@ int tube_setup_bg_listen(struct tube* tube, struct comm_base* base,
tube->listen_arg = arg;
if(!comm_base_internal(base))
return 1; /* ignore when no comm base - testing */
- return winsock_register_wsaevent(comm_base_internal(base),
- &tube->ev_listen, tube->event, &tube_handle_signal, tube);
+ 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),
diff --git a/util/tube.h b/util/tube.h
index 6cc60502b34b..7971b776ae1f 100644
--- a/util/tube.h
+++ b/util/tube.h
@@ -48,7 +48,6 @@ struct tube;
struct tube_res_list;
#ifdef USE_WINSOCK
#include "util/locks.h"
-#include "util/winsock_event.h"
#endif
/**
@@ -99,7 +98,7 @@ struct tube {
/** the windows sockets event (signaled if items in pipe) */
WSAEVENT event;
/** winsock event storage when registered with event base */
- struct event ev_listen;
+ struct ub_event* ev_listen;
/** lock on the list of outstanding items */
lock_basic_t res_lock;
diff --git a/util/ub_event.c b/util/ub_event.c
new file mode 100644
index 000000000000..af2a18ea0fc8
--- /dev/null
+++ b/util/ub_event.c
@@ -0,0 +1,448 @@
+/*
+ * 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) \
+ (((union {struct ub_event_base* a; struct event_base* b;})x).b)
+#define AS_UB_EVENT_BASE(x) \
+ (((union {struct event_base* a; struct ub_event_base* b;})x).b)
+#define AS_EVENT(x) \
+ (((union {struct ub_event* a; struct event* b;})x).b)
+#define AS_UB_EVENT(x) \
+ (((union {struct event* a; struct ub_event* b;})x).b)
+
+const char* ub_event_get_version()
+{
+ 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/util/ub_event.h b/util/ub_event.h
new file mode 100644
index 000000000000..cb42e7a7d23b
--- /dev/null
+++ b/util/ub_event.h
@@ -0,0 +1,127 @@
+/*
+ * 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();
+/** 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/util/ub_event_pluggable.c b/util/ub_event_pluggable.c
new file mode 100644
index 000000000000..5c517555e71b
--- /dev/null
+++ b/util/ub_event_pluggable.c
@@ -0,0 +1,694 @@
+/*
+ * 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) \
+ (((union {struct ub_event_base* a; struct my_event_base* b;})x).b)
+#define AS_MY_EVENT(x) \
+ (((union {struct ub_event* a; struct my_event* b;})x).b)
+
+const char* ub_event_get_version()
+{
+ 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->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->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->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->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/validator/autotrust.c b/validator/autotrust.c
index f8c9c8c63f94..232397c31069 100644
--- a/validator/autotrust.c
+++ b/validator/autotrust.c
@@ -2333,6 +2333,7 @@ probe_anchor(struct module_env* env, struct trust_anchor* tp)
edns.ext_rcode = 0;
edns.edns_version = 0;
edns.bits = EDNS_DO;
+ edns.opt_list = NULL;
if(sldns_buffer_capacity(buf) < 65535)
edns.udp_size = (uint16_t)sldns_buffer_capacity(buf);
else edns.udp_size = 65535;
diff --git a/validator/val_anchor.c b/validator/val_anchor.c
index bc9f8b8773f9..4d470b69227d 100644
--- a/validator/val_anchor.c
+++ b/validator/val_anchor.c
@@ -1030,6 +1030,8 @@ anchors_assemble_rrsets(struct val_anchors* anchors)
")", b);
(void)rbtree_delete(anchors->tree, &ta->node);
lock_basic_unlock(&ta->lock);
+ if(anchors->dlv_anchor == ta)
+ anchors->dlv_anchor = NULL;
anchors_delfunc(&ta->node, NULL);
ta = next;
continue;
diff --git a/validator/val_secalgo.c b/validator/val_secalgo.c
index baa4dae1a871..11c8cd16e8f9 100644
--- a/validator/val_secalgo.c
+++ b/validator/val_secalgo.c
@@ -98,6 +98,12 @@ secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
}
}
+void
+secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
+{
+ (void)SHA256(buf, len, res);
+}
+
/**
* Return size of DS digest according to its hash algorithm.
* @param algo: DS digest algo.
@@ -186,8 +192,10 @@ dnskey_algo_id_is_supported(int id)
case LDNS_RSAMD5:
/* RFC 6725 deprecates RSAMD5 */
return 0;
+#ifdef USE_DSA
case LDNS_DSA:
case LDNS_DSA_NSEC3:
+#endif
case LDNS_RSASHA1:
case LDNS_RSASHA1_NSEC3:
#if defined(HAVE_EVP_SHA256) && defined(USE_SHA2)
@@ -227,6 +235,7 @@ log_crypto_error(const char* str, unsigned long e)
log_err("%s crypto %s", str, buf);
}
+#ifdef USE_DSA
/**
* Setup DSA key digest in DER encoding ...
* @param sig: input is signature output alloced ptr (unless failure).
@@ -268,6 +277,7 @@ setup_dsa_sig(unsigned char** sig, unsigned int* len)
DSA_SIG_free(dsasig);
return 1;
}
+#endif /* USE_DSA */
#ifdef USE_ECDSA
/**
@@ -281,32 +291,61 @@ setup_dsa_sig(unsigned char** sig, unsigned int* len)
static int
setup_ecdsa_sig(unsigned char** sig, unsigned int* len)
{
- ECDSA_SIG* ecdsa_sig;
- int newlen;
+ /* convert from two BIGNUMs in the rdata buffer, to ASN notation.
+ * ASN preable: 30440220 <R 32bytefor256> 0220 <S 32bytefor256>
+ * the '20' is the length of that field (=bnsize).
+i * the '44' is the total remaining length.
+ * if negative, start with leading zero.
+ * if starts with 00s, remove them from the number.
+ */
+ uint8_t pre[] = {0x30, 0x44, 0x02, 0x20};
+ int pre_len = 4;
+ uint8_t mid[] = {0x02, 0x20};
+ int mid_len = 2;
+ int raw_sig_len, r_high, s_high, r_rem=0, s_rem=0;
int bnsize = (int)((*len)/2);
+ unsigned char* d = *sig;
+ uint8_t* p;
/* if too short or not even length, fails */
if(*len < 16 || bnsize*2 != (int)*len)
return 0;
- /* use the raw data to parse two evenly long BIGNUMs, "r | s". */
- ecdsa_sig = ECDSA_SIG_new();
- if(!ecdsa_sig) return 0;
- ecdsa_sig->r = BN_bin2bn(*sig, bnsize, ecdsa_sig->r);
- ecdsa_sig->s = BN_bin2bn(*sig+bnsize, bnsize, ecdsa_sig->s);
- if(!ecdsa_sig->r || !ecdsa_sig->s) {
- ECDSA_SIG_free(ecdsa_sig);
- return 0;
- }
- /* spool it into ASN format */
- *sig = NULL;
- newlen = i2d_ECDSA_SIG(ecdsa_sig, sig);
- if(newlen <= 0) {
- ECDSA_SIG_free(ecdsa_sig);
- free(*sig);
+ /* strip leading zeroes from r (but not last one) */
+ while(r_rem < bnsize-1 && d[r_rem] == 0)
+ r_rem++;
+ /* strip leading zeroes from s (but not last one) */
+ while(s_rem < bnsize-1 && d[bnsize+s_rem] == 0)
+ s_rem++;
+
+ r_high = ((d[0+r_rem]&0x80)?1:0);
+ s_high = ((d[bnsize+s_rem]&0x80)?1:0);
+ raw_sig_len = pre_len + r_high + bnsize - r_rem + mid_len +
+ s_high + bnsize - s_rem;
+ *sig = (unsigned char*)malloc((size_t)raw_sig_len);
+ if(!*sig)
return 0;
+ p = (uint8_t*)*sig;
+ p[0] = pre[0];
+ p[1] = (uint8_t)(raw_sig_len-2);
+ p[2] = pre[2];
+ p[3] = (uint8_t)(bnsize + r_high - r_rem);
+ p += 4;
+ if(r_high) {
+ *p = 0;
+ p += 1;
}
- *len = (unsigned int)newlen;
- ECDSA_SIG_free(ecdsa_sig);
+ memmove(p, d+r_rem, (size_t)bnsize-r_rem);
+ p += bnsize-r_rem;
+ memmove(p, mid, (size_t)mid_len-1);
+ p += mid_len-1;
+ *p = (uint8_t)(bnsize + s_high - s_rem);
+ p += 1;
+ if(s_high) {
+ *p = 0;
+ p += 1;
+ }
+ memmove(p, d+bnsize+s_rem, (size_t)bnsize-s_rem);
+ *len = (unsigned int)raw_sig_len;
return 1;
}
#endif /* USE_ECDSA */
@@ -325,10 +364,13 @@ static int
setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type,
unsigned char* key, size_t keylen)
{
+#ifdef USE_DSA
DSA* dsa;
+#endif
RSA* rsa;
switch(algo) {
+#ifdef USE_DSA
case LDNS_DSA:
case LDNS_DSA_NSEC3:
*evp_key = EVP_PKEY_new();
@@ -350,6 +392,7 @@ setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type,
*digest_type = EVP_dss1();
break;
+#endif /* USE_DSA */
case LDNS_RSASHA1:
case LDNS_RSASHA1_NSEC3:
#if defined(HAVE_EVP_SHA256) && defined(USE_SHA2)
@@ -508,8 +551,8 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
char** reason)
{
const EVP_MD *digest_type;
- EVP_MD_CTX ctx;
- int res, dofree = 0;
+ EVP_MD_CTX* ctx;
+ int res, dofree = 0, docrypto_free = 0;
EVP_PKEY *evp_key = NULL;
if(!setup_key_digest(algo, &evp_key, &digest_type, key, keylen)) {
@@ -518,6 +561,7 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
EVP_PKEY_free(evp_key);
return sec_status_bogus;
}
+#ifdef USE_DSA
/* if it is a DSA signature in bind format, convert to DER format */
if((algo == LDNS_DSA || algo == LDNS_DSA_NSEC3) &&
sigblock_len == 1+2*SHA_DIGEST_LENGTH) {
@@ -527,10 +571,14 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
EVP_PKEY_free(evp_key);
return sec_status_bogus;
}
- dofree = 1;
+ docrypto_free = 1;
}
+#endif
+#if defined(USE_ECDSA) && defined(USE_DSA)
+ else
+#endif
#ifdef USE_ECDSA
- else if(algo == LDNS_ECDSAP256SHA256 || algo == LDNS_ECDSAP384SHA384) {
+ if(algo == LDNS_ECDSAP256SHA256 || algo == LDNS_ECDSAP384SHA384) {
/* EVP uses ASN prefix on sig, which is not in the wire data */
if(!setup_ecdsa_sig(&sigblock, &sigblock_len)) {
verbose(VERB_QUERY, "verify: failed to setup ECDSA sig");
@@ -543,32 +591,48 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
#endif /* USE_ECDSA */
/* do the signature cryptography work */
- EVP_MD_CTX_init(&ctx);
- if(EVP_VerifyInit(&ctx, digest_type) == 0) {
- verbose(VERB_QUERY, "verify: EVP_VerifyInit failed");
+#ifdef HAVE_EVP_MD_CTX_NEW
+ ctx = EVP_MD_CTX_new();
+#else
+ ctx = (EVP_MD_CTX*)malloc(sizeof(*ctx));
+ if(ctx) EVP_MD_CTX_init(ctx);
+#endif
+ if(!ctx) {
+ log_err("EVP_MD_CTX_new: malloc failure");
EVP_PKEY_free(evp_key);
if(dofree) free(sigblock);
+ else if(docrypto_free) CRYPTO_free(sigblock);
return sec_status_unchecked;
}
- if(EVP_VerifyUpdate(&ctx, (unsigned char*)sldns_buffer_begin(buf),
- (unsigned int)sldns_buffer_limit(buf)) == 0) {
- verbose(VERB_QUERY, "verify: EVP_VerifyUpdate failed");
+ if(EVP_VerifyInit(ctx, digest_type) == 0) {
+ verbose(VERB_QUERY, "verify: EVP_VerifyInit failed");
+ EVP_MD_CTX_destroy(ctx);
EVP_PKEY_free(evp_key);
if(dofree) free(sigblock);
+ else if(docrypto_free) CRYPTO_free(sigblock);
return sec_status_unchecked;
}
-
- res = EVP_VerifyFinal(&ctx, sigblock, sigblock_len, evp_key);
- if(EVP_MD_CTX_cleanup(&ctx) == 0) {
- verbose(VERB_QUERY, "verify: EVP_MD_CTX_cleanup failed");
+ if(EVP_VerifyUpdate(ctx, (unsigned char*)sldns_buffer_begin(buf),
+ (unsigned int)sldns_buffer_limit(buf)) == 0) {
+ verbose(VERB_QUERY, "verify: EVP_VerifyUpdate failed");
+ EVP_MD_CTX_destroy(ctx);
EVP_PKEY_free(evp_key);
if(dofree) free(sigblock);
+ else if(docrypto_free) CRYPTO_free(sigblock);
return sec_status_unchecked;
}
+
+ res = EVP_VerifyFinal(ctx, sigblock, sigblock_len, evp_key);
+#ifdef HAVE_EVP_MD_CTX_NEW
+ EVP_MD_CTX_destroy(ctx);
+#else
+ EVP_MD_CTX_cleanup(ctx);
+ free(ctx);
+#endif
EVP_PKEY_free(evp_key);
- if(dofree)
- free(sigblock);
+ if(dofree) free(sigblock);
+ else if(docrypto_free) CRYPTO_free(sigblock);
if(res == 1) {
return sec_status_secure;
@@ -620,6 +684,12 @@ secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
}
}
+void
+secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
+{
+ (void)HASH_HashBuf(HASH_AlgSHA256, res, buf, (unsigned long)len);
+}
+
size_t
ds_digest_size_supported(int algo)
{
@@ -678,8 +748,10 @@ dnskey_algo_id_is_supported(int id)
case LDNS_RSAMD5:
/* RFC 6725 deprecates RSAMD5 */
return 0;
+#ifdef USE_DSA
case LDNS_DSA:
case LDNS_DSA_NSEC3:
+#endif
case LDNS_RSASHA1:
case LDNS_RSASHA1_NSEC3:
#ifdef USE_SHA2
@@ -920,6 +992,7 @@ nss_setup_key_digest(int algo, SECKEYPublicKey** pubkey, HASH_HashType* htype,
*/
switch(algo) {
+#ifdef USE_DSA
case LDNS_DSA:
case LDNS_DSA_NSEC3:
*pubkey = nss_buf2dsa(key, keylen);
@@ -930,6 +1003,7 @@ nss_setup_key_digest(int algo, SECKEYPublicKey** pubkey, HASH_HashType* htype,
*htype = HASH_AlgSHA1;
/* no prefix for DSA verification */
break;
+#endif
case LDNS_RSASHA1:
case LDNS_RSASHA1_NSEC3:
#ifdef USE_SHA2
@@ -1046,6 +1120,7 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
return sec_status_bogus;
}
+#ifdef USE_DSA
/* need to convert DSA, ECDSA signatures? */
if((algo == LDNS_DSA || algo == LDNS_DSA_NSEC3)) {
if(sigblock_len == 1+2*SHA1_LENGTH) {
@@ -1068,6 +1143,7 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
SECITEM_FreeItem(p, PR_TRUE);
}
}
+#endif /* USE_DSA */
/* do the signature cryptography work */
/* hash the data */
@@ -1206,6 +1282,12 @@ secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
}
}
+void
+secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
+{
+ _digest_nettle(SHA256_DIGEST_SIZE, (uint8_t*)buf, len, res);
+}
+
/**
* Return size of DS digest according to its hash algorithm.
* @param algo: DS digest algo.
@@ -1263,8 +1345,10 @@ dnskey_algo_id_is_supported(int id)
{
/* uses libnettle */
switch(id) {
+#ifdef USE_DSA
case LDNS_DSA:
case LDNS_DSA_NSEC3:
+#endif
case LDNS_RSASHA1:
case LDNS_RSASHA1_NSEC3:
#ifdef USE_SHA2
@@ -1541,6 +1625,7 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
}
switch(algo) {
+#ifdef USE_DSA
case LDNS_DSA:
case LDNS_DSA_NSEC3:
*reason = _verify_nettle_dsa(buf, sigblock, sigblock_len, key, keylen);
@@ -1548,6 +1633,7 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
return sec_status_bogus;
else
return sec_status_secure;
+#endif /* USE_DSA */
case LDNS_RSASHA1:
case LDNS_RSASHA1_NSEC3:
diff --git a/validator/val_secalgo.h b/validator/val_secalgo.h
index 589f1f11db63..52aaeb9f6d36 100644
--- a/validator/val_secalgo.h
+++ b/validator/val_secalgo.h
@@ -60,6 +60,14 @@ int secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
unsigned char* res);
/**
+ * Calculate the sha256 hash for the data buffer into the result.
+ * @param buf: buffer to digest.
+ * @param len: length of the buffer to digest.
+ * @param res: result is stored here (space 256/8 bytes).
+ */
+void secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res);
+
+/**
* Return size of DS digest according to its hash algorithm.
* @param algo: DS digest algo.
* @return size in bytes of digest, or 0 if not supported.
diff --git a/winrc/w_inst.c b/winrc/w_inst.c
index d0de73b5bcbd..a9f1defa1100 100644
--- a/winrc/w_inst.c
+++ b/winrc/w_inst.c
@@ -231,8 +231,8 @@ wsvc_install(FILE* out, const char* rename)
NULL, /* no load ordering group */
NULL, /* no tag identifier */
NULL, /* no deps */
- NULL, /* on LocalSystem */
- NULL /* no password */
+ (LPCTSTR)"NT AUTHORITY\\NetworkService", /* network service account with restricted rights */
+ "" /* no password (must be an empty string) */
);
if(!sv) {
CloseServiceHandle(scm);
diff --git a/winrc/win_svc.c b/winrc/win_svc.c
index 9d6926dbe590..74ace69fb19e 100644
--- a/winrc/win_svc.c
+++ b/winrc/win_svc.c
@@ -51,7 +51,7 @@
#include "daemon/remote.h"
#include "util/config_file.h"
#include "util/netevent.h"
-#include "util/winsock_event.h"
+#include "util/ub_event.h"
/** global service status */
static SERVICE_STATUS service_status;
@@ -60,7 +60,7 @@ static SERVICE_STATUS_HANDLE service_status_handle;
/** global service stop event */
static WSAEVENT service_stop_event = NULL;
/** event struct for stop callbacks */
-static struct event service_stop_ev;
+static struct ub_event* service_stop_ev = NULL;
/** if stop even means shutdown or restart */
static int service_stop_shutdown = 0;
/** config file to open. global communication to service_main() */
@@ -453,9 +453,9 @@ service_main(DWORD ATTR_UNUSED(argc), LPTSTR* ATTR_UNUSED(argv))
/* exit */
verbose(VERB_ALGO, "winservice - cleanup.");
report_status(SERVICE_STOP_PENDING, NO_ERROR, 0);
+ if(service_stop_event) (void)WSACloseEvent(service_stop_event);
service_deinit(daemon, cfg);
free(service_cfgfile);
- if(service_stop_event) (void)WSACloseEvent(service_stop_event);
verbose(VERB_QUERY, "winservice - full stop");
report_status(SERVICE_STOPPED, NO_ERROR, 0);
}
@@ -600,9 +600,9 @@ void wsvc_setup_worker(struct worker* worker)
/* if not started with -w service, do nothing */
if(!service_stop_event)
return;
- if(!winsock_register_wsaevent(comm_base_internal(worker->base),
- &service_stop_ev, service_stop_event,
- &worker_win_stop_cb, worker)) {
+ if(!(service_stop_ev = ub_winsock_register_wsaevent(
+ comm_base_internal(worker->base), service_stop_event,
+ &worker_win_stop_cb, worker))) {
fatal_exit("could not register wsaevent");
return;
}