]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- unbound-control forward_add, forward_remove, stub_add, stub_remove
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 15 Feb 2012 14:35:28 +0000 (14:35 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 15 Feb 2012 14:35:28 +0000 (14:35 +0000)
  can modify stubs and forwards for running unbound (on mobile computer)
  they can also add and remove domain-insecure for the zone.

git-svn-id: file:///svn/unbound/trunk@2623 be551aaa-1e26-0410-a405-d3ace91eadb9

13 files changed:
Makefile.in
daemon/remote.c
daemon/worker.c
doc/Changelog
doc/unbound-control.8.in
iterator/iter_fwd.c
iterator/iter_fwd.h
iterator/iter_hints.c
iterator/iter_hints.h
smallapp/unbound-control.c
validator/val_anchor.c
validator/val_anchor.h
validator/validator.c

index 4c26f52f7de258564c9825003f5fe2f8788ac34b..6bc39f902fc4af27cd012130fa6eea0136e9c4a5 100644 (file)
@@ -529,88 +529,78 @@ depend:
 
 # Dependencies
 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 $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h \
- $(srcdir)/util/data/dname.h $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.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 $(srcdir)/services/cache/rrset.h \
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/util/data/dname.h $(srcdir)/util/module.h \
+ $(srcdir)/util/data/msgparse.h \
  $(srcdir)/util/net_help.h \
  $(srcdir)/util/regional.h $(srcdir)/util/config_file.h
 infra.lo infra.o: $(srcdir)/services/cache/infra.c config.h \
- $(srcdir)/services/cache/infra.h \
- $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/rtt.h \
- $(srcdir)/util/storage/slabhash.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h $(srcdir)/iterator/iterator.h \
+ $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
+ $(srcdir)/util/rtt.h $(srcdir)/util/storage/slabhash.h $(srcdir)/util/storage/lookup3.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h $(srcdir)/iterator/iterator.h \
  $(srcdir)/services/outbound_list.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h \
  
 rrset.lo rrset.o: $(srcdir)/services/cache/rrset.c config.h $(srcdir)/services/cache/rrset.h \
  $(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)/util/config_file.h \
- $(srcdir)/util/data/msgreply.h $(srcdir)/util/regional.h $(srcdir)/util/alloc.h
+ $(srcdir)/util/config_file.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/regional.h $(srcdir)/util/alloc.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)/util/storage/lookup3.h
 msgencode.lo msgencode.o: $(srcdir)/util/data/msgencode.c config.h \
- $(srcdir)/util/data/msgencode.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/data/msgparse.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/regional.h $(srcdir)/util/net_help.h
+ $(srcdir)/util/data/msgencode.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/data/msgparse.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/util/regional.h $(srcdir)/util/net_help.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)/util/net_help.h \
- $(srcdir)/util/data/dname.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lookup3.h \
- $(srcdir)/util/regional.h
+ $(srcdir)/util/data/msgparse.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
+ $(srcdir)/util/net_help.h $(srcdir)/util/data/dname.h $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/storage/lookup3.h $(srcdir)/util/regional.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 \
- $(srcdir)/util/data/dname.h $(srcdir)/util/regional.h $(srcdir)/util/data/msgparse.h \
- $(srcdir)/util/data/msgencode.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 $(srcdir)/util/data/dname.h $(srcdir)/util/regional.h \
+ $(srcdir)/util/data/msgparse.h $(srcdir)/util/data/msgencode.h
 packed_rrset.lo packed_rrset.o: $(srcdir)/util/data/packed_rrset.c config.h \
  $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
  $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/alloc.h $(srcdir)/util/regional.h \
  $(srcdir)/util/net_help.h
 iterator.lo iterator.o: $(srcdir)/iterator/iterator.c config.h \
- $(srcdir)/iterator/iterator.h \
- $(srcdir)/services/outbound_list.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/module.h \
- $(srcdir)/util/data/msgparse.h $(srcdir)/iterator/iter_utils.h $(srcdir)/iterator/iter_resptype.h \
- $(srcdir)/iterator/iter_hints.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
- $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_donotq.h $(srcdir)/iterator/iter_delegpt.h \
- $(srcdir)/iterator/iter_scrub.h $(srcdir)/iterator/iter_priv.h $(srcdir)/validator/val_neg.h \
- $(srcdir)/services/cache/dns.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/util/netevent.h \
- $(srcdir)/util/net_help.h $(srcdir)/util/regional.h $(srcdir)/util/data/dname.h $(srcdir)/util/data/msgencode.h \
- $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h \
- $(srcdir)/util/config_file.h
+ $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.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/module.h $(srcdir)/util/data/msgparse.h $(srcdir)/iterator/iter_utils.h \
+ $(srcdir)/iterator/iter_resptype.h $(srcdir)/iterator/iter_hints.h $(srcdir)/util/storage/dnstree.h \
+ $(srcdir)/util/rbtree.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_donotq.h \
+ $(srcdir)/iterator/iter_delegpt.h $(srcdir)/iterator/iter_scrub.h $(srcdir)/iterator/iter_priv.h \
+ $(srcdir)/validator/val_neg.h $(srcdir)/services/cache/dns.h $(srcdir)/services/cache/infra.h \
+ $(srcdir)/util/rtt.h $(srcdir)/util/netevent.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h \
+ $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h $(srcdir)/util/config_file.h
 iter_delegpt.lo iter_delegpt.o: $(srcdir)/iterator/iter_delegpt.c config.h $(srcdir)/iterator/iter_delegpt.h \
  $(srcdir)/util/log.h \
- $(srcdir)/services/cache/dns.h \
- $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/services/cache/dns.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/regional.h \
  $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h
 iter_donotq.lo iter_donotq.o: $(srcdir)/iterator/iter_donotq.c config.h $(srcdir)/iterator/iter_donotq.h \
  $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/regional.h $(srcdir)/util/log.h \
- $(srcdir)/util/config_file.h \
- $(srcdir)/util/net_help.h
+ $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h
 iter_fwd.lo iter_fwd.o: $(srcdir)/iterator/iter_fwd.c config.h \
- $(srcdir)/iterator/iter_fwd.h \
- $(srcdir)/util/rbtree.h $(srcdir)/iterator/iter_delegpt.h $(srcdir)/util/log.h $(srcdir)/util/regional.h \
+ $(srcdir)/iterator/iter_fwd.h $(srcdir)/util/rbtree.h $(srcdir)/iterator/iter_delegpt.h $(srcdir)/util/log.h \
  $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/util/data/dname.h \
  $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h
 iter_hints.lo iter_hints.o: $(srcdir)/iterator/iter_hints.c config.h \
- $(srcdir)/iterator/iter_hints.h \
- $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/iterator/iter_delegpt.h $(srcdir)/util/log.h \
- $(srcdir)/util/regional.h $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h
+ $(srcdir)/iterator/iter_hints.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/iterator/iter_delegpt.h $(srcdir)/util/log.h $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h
 iter_priv.lo iter_priv.o: $(srcdir)/iterator/iter_priv.c config.h \
- $(srcdir)/iterator/iter_priv.h \
- $(srcdir)/util/rbtree.h \
- $(srcdir)/util/regional.h $(srcdir)/util/log.h $(srcdir)/util/config_file.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/iterator/iter_priv.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/util/regional.h \
+ $(srcdir)/util/log.h $(srcdir)/util/config_file.h $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/data/msgparse.h \
  $(srcdir)/util/net_help.h \
  $(srcdir)/util/storage/dnstree.h
 iter_resptype.lo iter_resptype.o: $(srcdir)/iterator/iter_resptype.c config.h \
@@ -619,9 +609,8 @@ iter_resptype.lo iter_resptype.o: $(srcdir)/iterator/iter_resptype.c config.h \
  $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/net_help.h \
  $(srcdir)/util/data/dname.h
 iter_scrub.lo iter_scrub.o: $(srcdir)/iterator/iter_scrub.c config.h $(srcdir)/iterator/iter_scrub.h \
- $(srcdir)/iterator/iterator.h \
- $(srcdir)/services/outbound_list.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)/iterator/iterator.h $(srcdir)/services/outbound_list.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/module.h \
  $(srcdir)/util/data/msgparse.h \
  $(srcdir)/iterator/iter_priv.h $(srcdir)/util/rbtree.h $(srcdir)/services/cache/rrset.h \
@@ -629,9 +618,8 @@ iter_scrub.lo iter_scrub.o: $(srcdir)/iterator/iter_scrub.c config.h $(srcdir)/i
  $(srcdir)/util/config_file.h $(srcdir)/util/data/dname.h $(srcdir)/util/alloc.h
 iter_utils.lo iter_utils.o: $(srcdir)/iterator/iter_utils.c config.h $(srcdir)/iterator/iter_utils.h \
  $(srcdir)/iterator/iter_resptype.h \
- $(srcdir)/iterator/iterator.h \
- $(srcdir)/services/outbound_list.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)/iterator/iterator.h $(srcdir)/services/outbound_list.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/module.h \
  $(srcdir)/util/data/msgparse.h \
  $(srcdir)/iterator/iter_hints.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
@@ -647,11 +635,10 @@ listen_dnsport.lo listen_dnsport.o: $(srcdir)/services/listen_dnsport.c config.h
  $(srcdir)/services/outside_network.h $(srcdir)/util/rbtree.h $(srcdir)/util/log.h $(srcdir)/util/config_file.h \
  $(srcdir)/util/net_help.h
 localzone.lo localzone.o: $(srcdir)/services/localzone.c config.h \
- $(srcdir)/services/localzone.h \
- $(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/regional.h $(srcdir)/util/config_file.h \
- $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/packed_rrset.h \
- $(srcdir)/util/data/msgencode.h $(srcdir)/util/net_help.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/msgparse.h
+ $(srcdir)/services/localzone.h $(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
+ $(srcdir)/util/regional.h $(srcdir)/util/config_file.h $(srcdir)/util/data/dname.h \
+ $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgencode.h \
+ $(srcdir)/util/net_help.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h
 mesh.lo mesh.o: $(srcdir)/services/mesh.c config.h \
  $(srcdir)/services/mesh.h \
  $(srcdir)/util/rbtree.h $(srcdir)/util/netevent.h $(srcdir)/util/data/msgparse.h \
@@ -662,13 +649,11 @@ mesh.lo mesh.o: $(srcdir)/services/mesh.c config.h \
  $(srcdir)/util/tube.h $(srcdir)/util/alloc.h $(srcdir)/util/config_file.h
 modstack.lo modstack.o: $(srcdir)/services/modstack.c config.h $(srcdir)/services/modstack.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/msgreply.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/data/msgparse.h \
- $(srcdir)/util/fptr_wlist.h \
- $(srcdir)/util/netevent.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
- $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/validator/validator.h \
- $(srcdir)/validator/val_utils.h $(srcdir)/pythonmod/pythonmod.h
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/netevent.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h \
+ $(srcdir)/util/rbtree.h $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h \
+ $(srcdir)/validator/validator.h $(srcdir)/validator/val_utils.h $(srcdir)/pythonmod/pythonmod.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 \
@@ -679,8 +664,7 @@ outside_network.lo outside_network.o: $(srcdir)/services/outside_network.c confi
  $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/rtt.h $(srcdir)/util/data/msgparse.h \
  $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgencode.h \
  $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h $(srcdir)/util/random.h $(srcdir)/util/fptr_wlist.h \
- $(srcdir)/util/module.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h \
+ $(srcdir)/util/module.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h
 alloc.lo alloc.o: $(srcdir)/util/alloc.c config.h $(srcdir)/util/alloc.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
  $(srcdir)/util/regional.h \
  $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
@@ -703,38 +687,35 @@ configparser.lo configparser.o: util/configparser.c config.h $(srcdir)/util/conf
  
 fptr_wlist.lo fptr_wlist.o: $(srcdir)/util/fptr_wlist.c config.h $(srcdir)/util/fptr_wlist.h \
  $(srcdir)/util/netevent.h \
- $(srcdir)/util/storage/lruhash.h \
- $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/module.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/data/msgparse.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 $(srcdir)/daemon/worker.h $(srcdir)/util/alloc.h $(srcdir)/daemon/stats.h \
- $(srcdir)/util/timehist.h $(srcdir)/daemon/remote.h \
- $(srcdir)/services/outside_network.h $(srcdir)/services/localzone.h $(srcdir)/services/cache/infra.h \
- $(srcdir)/util/rtt.h $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h \
- $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/iterator/iter_fwd.h \
- $(srcdir)/validator/validator.h $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_anchor.h \
- $(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)/util/storage/dnstree.h \
- $(srcdir)/libunbound/libworker.h $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound.h \
- $(srcdir)/util/config_file.h $(srcdir)/pythonmod/pythonmod.h
+ $(srcdir)/util/timehist.h $(srcdir)/daemon/remote.h $(srcdir)/services/outside_network.h \
+ $(srcdir)/services/localzone.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h \
+ $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h $(srcdir)/iterator/iterator.h \
+ $(srcdir)/services/outbound_list.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/validator/validator.h \
+ $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_anchor.h $(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)/util/storage/dnstree.h $(srcdir)/libunbound/libworker.h \
+ $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound.h $(srcdir)/util/config_file.h \
+ $(srcdir)/pythonmod/pythonmod.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
 mini_event.lo mini_event.o: $(srcdir)/util/mini_event.c config.h $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h \
  $(srcdir)/util/fptr_wlist.h $(srcdir)/util/netevent.h \
- $(srcdir)/util/storage/lruhash.h \
- $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/module.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/data/msgparse.h \
  $(srcdir)/util/tube.h \
  $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h
 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/msgreply.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/data/msgparse.h \
  
 netevent.lo netevent.o: $(srcdir)/util/netevent.c config.h \
@@ -742,20 +723,17 @@ netevent.lo netevent.o: $(srcdir)/util/netevent.c config.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)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
- $(srcdir)/services/modstack.h \
- $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h
+ $(srcdir)/services/modstack.h $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.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 $(srcdir)/util/regional.h \
+ $(srcdir)/util/data/msgparse.h $(srcdir)/util/regional.h
 random.lo random.o: $(srcdir)/util/random.c config.h $(srcdir)/util/random.h $(srcdir)/util/log.h \
  
 rbtree.lo rbtree.o: $(srcdir)/util/rbtree.c config.h $(srcdir)/util/log.h \
- $(srcdir)/util/fptr_wlist.h \
- $(srcdir)/util/netevent.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/netevent.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
+ $(srcdir)/util/log.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/data/msgparse.h \
  $(srcdir)/util/tube.h \
  $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h
@@ -770,8 +748,7 @@ dnstree.lo dnstree.o: $(srcdir)/util/storage/dnstree.c config.h $(srcdir)/util/s
 lookup3.lo lookup3.o: $(srcdir)/util/storage/lookup3.c config.h $(srcdir)/util/storage/lookup3.h
 lruhash.lo lruhash.o: $(srcdir)/util/storage/lruhash.c config.h $(srcdir)/util/storage/lruhash.h \
  $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/util/fptr_wlist.h \
- $(srcdir)/util/netevent.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/netevent.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
  $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/data/msgparse.h \
  $(srcdir)/util/tube.h \
@@ -790,79 +767,71 @@ tube.lo tube.o: $(srcdir)/util/tube.c config.h $(srcdir)/util/tube.h $(srcdir)/u
  $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.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 \
- $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/validator/val_anchor.h $(srcdir)/validator/val_utils.h \
- $(srcdir)/validator/val_sigcrypt.h $(srcdir)/util/data/dname.h $(srcdir)/util/module.h \
- $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/util/net_help.h \
+ $(srcdir)/validator/autotrust.h $(srcdir)/util/rbtree.h $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/validator/val_anchor.h \
+ $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_sigcrypt.h $(srcdir)/util/data/dname.h \
+ $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/util/net_help.h \
  $(srcdir)/util/config_file.h $(srcdir)/util/regional.h $(srcdir)/util/random.h $(srcdir)/services/mesh.h \
  $(srcdir)/util/netevent.h $(srcdir)/services/modstack.h $(srcdir)/services/cache/rrset.h \
  $(srcdir)/util/storage/slabhash.h $(srcdir)/validator/val_kcache.h
 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/regional.h $(srcdir)/util/config_file.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/regional.h \
+ $(srcdir)/util/config_file.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 \
- $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_anchor.h $(srcdir)/util/rbtree.h \
- $(srcdir)/validator/val_kcache.h $(srcdir)/util/storage/slabhash.h $(srcdir)/validator/val_kentry.h \
- $(srcdir)/validator/val_nsec.h $(srcdir)/validator/val_nsec3.h $(srcdir)/validator/val_neg.h \
- $(srcdir)/validator/val_sigcrypt.h $(srcdir)/validator/autotrust.h $(srcdir)/services/cache/dns.h \
- $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h $(srcdir)/util/config_file.h \
- $(srcdir)/util/fptr_wlist.h $(srcdir)/util/netevent.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h \
- $(srcdir)/services/modstack.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 $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_anchor.h \
+ $(srcdir)/util/rbtree.h $(srcdir)/validator/val_kcache.h $(srcdir)/util/storage/slabhash.h \
+ $(srcdir)/validator/val_kentry.h $(srcdir)/validator/val_nsec.h $(srcdir)/validator/val_nsec3.h \
+ $(srcdir)/validator/val_neg.h $(srcdir)/validator/val_sigcrypt.h $(srcdir)/validator/autotrust.h \
+ $(srcdir)/services/cache/dns.h $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h \
+ $(srcdir)/util/config_file.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/netevent.h $(srcdir)/util/tube.h \
+ $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h
 val_kcache.lo val_kcache.o: $(srcdir)/validator/val_kcache.c config.h $(srcdir)/validator/val_kcache.h \
  $(srcdir)/util/storage/slabhash.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/validator/val_kentry.h \
- $(srcdir)/util/config_file.h $(srcdir)/util/data/dname.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/validator/val_kentry.h $(srcdir)/util/config_file.h $(srcdir)/util/data/dname.h \
+ $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/data/msgparse.h \
  
 val_kentry.lo val_kentry.o: $(srcdir)/validator/val_kentry.c config.h \
- $(srcdir)/validator/val_kentry.h \
- $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/data/packed_rrset.h \
- $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/regional.h $(srcdir)/util/net_help.h
-val_neg.lo val_neg.o: $(srcdir)/validator/val_neg.c config.h \
- $(srcdir)/validator/val_neg.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
+ $(srcdir)/validator/val_kentry.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
+ $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lookup3.h \
+ $(srcdir)/util/regional.h $(srcdir)/util/net_help.h
+val_neg.lo val_neg.o: $(srcdir)/validator/val_neg.c config.h $(srcdir)/validator/val_neg.h $(srcdir)/util/locks.h \
+ $(srcdir)/util/log.h \
  $(srcdir)/util/rbtree.h \
  $(srcdir)/validator/val_nsec.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
- $(srcdir)/validator/val_nsec3.h \
- $(srcdir)/validator/val_utils.h $(srcdir)/util/data/dname.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h $(srcdir)/services/cache/rrset.h \
- $(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/dns.h
-val_nsec3.lo val_nsec3.o: $(srcdir)/validator/val_nsec3.c config.h \
- $(srcdir)/validator/val_nsec3.h $(srcdir)/util/rbtree.h $(srcdir)/util/data/packed_rrset.h \
- $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/validator/validator.h \
- $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h \
- $(srcdir)/validator/val_utils.h \
- $(srcdir)/validator/val_kentry.h $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h \
- $(srcdir)/util/regional.h $(srcdir)/util/net_help.h $(srcdir)/util/data/dname.h $(srcdir)/validator/val_nsec.h
+ $(srcdir)/validator/val_nsec3.h $(srcdir)/validator/val_utils.h $(srcdir)/util/data/dname.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h \
+ $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/dns.h
+val_nsec3.lo val_nsec3.o: $(srcdir)/validator/val_nsec3.c config.h $(srcdir)/validator/val_nsec3.h \
+ $(srcdir)/util/rbtree.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/log.h \
+ $(srcdir)/validator/validator.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
+ $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_kentry.h $(srcdir)/services/cache/rrset.h \
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/util/regional.h $(srcdir)/util/net_help.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/validator/val_nsec.h
 val_nsec.lo val_nsec.o: $(srcdir)/validator/val_nsec.c config.h \
- $(srcdir)/validator/val_nsec.h \
- $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/validator/val_utils.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/net_help.h $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/validator/val_nsec.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/validator/val_utils.h $(srcdir)/util/data/msgreply.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h \
  $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h
 val_sigcrypt.lo val_sigcrypt.o: $(srcdir)/validator/val_sigcrypt.c config.h \
- $(srcdir)/validator/val_sigcrypt.h \
- $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/validator/validator.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/msgparse.h $(srcdir)/validator/val_utils.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/rbtree.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h \
+ $(srcdir)/validator/val_sigcrypt.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/validator/validator.h $(srcdir)/util/module.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/validator/val_utils.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/util/rbtree.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h
 val_utils.lo val_utils.o: $(srcdir)/validator/val_utils.c config.h $(srcdir)/validator/val_utils.h \
  $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/validator/validator.h \
- $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h \
- $(srcdir)/validator/val_kentry.h \
- $(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/config_file.h
+ $(srcdir)/validator/validator.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
+ $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/validator/val_kentry.h $(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/config_file.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 \
@@ -875,8 +844,7 @@ unitdname.lo unitdname.o: $(srcdir)/testcode/unitdname.c config.h \
  $(srcdir)/util/locks.h
 unitlruhash.lo unitlruhash.o: $(srcdir)/testcode/unitlruhash.c config.h $(srcdir)/testcode/unitmain.h \
  $(srcdir)/util/log.h \
- $(srcdir)/util/storage/lruhash.h \
- $(srcdir)/util/locks.h $(srcdir)/util/storage/slabhash.h
+ $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/storage/slabhash.h
 unitmain.lo unitmain.o: $(srcdir)/testcode/unitmain.c config.h \
  $(srcdir)/util/log.h \
  $(srcdir)/testcode/unitmain.h $(srcdir)/util/alloc.h $(srcdir)/util/locks.h $(srcdir)/util/net_help.h \
@@ -900,14 +868,12 @@ unitslabhash.lo unitslabhash.o: $(srcdir)/testcode/unitslabhash.c config.h $(src
  $(srcdir)/util/log.h \
  $(srcdir)/util/storage/slabhash.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h
 unitverify.lo unitverify.o: $(srcdir)/testcode/unitverify.c config.h $(srcdir)/util/log.h \
- $(srcdir)/testcode/unitmain.h \
- $(srcdir)/validator/val_sigcrypt.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
- $(srcdir)/util/locks.h \
- $(srcdir)/validator/val_nsec.h \
- $(srcdir)/validator/val_nsec3.h $(srcdir)/util/rbtree.h $(srcdir)/validator/validator.h $(srcdir)/util/module.h \
- $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h \
- $(srcdir)/validator/val_utils.h \
- $(srcdir)/testcode/ldns-testpkts.h \
+ $(srcdir)/testcode/unitmain.h $(srcdir)/validator/val_sigcrypt.h $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
+ $(srcdir)/validator/val_nsec.h $(srcdir)/validator/val_nsec3.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/validator/validator.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
+ $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/validator/val_utils.h $(srcdir)/testcode/ldns-testpkts.h \
  $(srcdir)/util/data/dname.h \
  $(srcdir)/util/regional.h $(srcdir)/util/alloc.h $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h
 readhex.lo readhex.o: $(srcdir)/testcode/readhex.c config.h $(srcdir)/testcode/readhex.h \
@@ -916,8 +882,7 @@ ldns-testpkts.lo ldns-testpkts.o: $(srcdir)/testcode/ldns-testpkts.c config.h \
  $(srcdir)/testcode/ldns-testpkts.h
 acl_list.lo acl_list.o: $(srcdir)/daemon/acl_list.c config.h $(srcdir)/daemon/acl_list.h \
  $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/regional.h $(srcdir)/util/log.h \
- $(srcdir)/util/config_file.h \
- $(srcdir)/util/net_help.h
+ $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h
 cachedump.lo cachedump.o: $(srcdir)/daemon/cachedump.c config.h \
  $(srcdir)/daemon/cachedump.h \
  $(srcdir)/daemon/remote.h $(srcdir)/daemon/worker.h $(srcdir)/util/netevent.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
@@ -951,9 +916,9 @@ remote.lo remote.o: $(srcdir)/daemon/remote.c config.h \
  $(srcdir)/util/rtt.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h $(srcdir)/services/localzone.h \
  $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/data/dname.h $(srcdir)/validator/validator.h \
  $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_kcache.h $(srcdir)/validator/val_kentry.h \
- $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/iterator/iter_fwd.h \
- $(srcdir)/iterator/iter_hints.h $(srcdir)/util/storage/dnstree.h $(srcdir)/iterator/iter_delegpt.h \
- $(srcdir)/services/outside_network.h
+ $(srcdir)/validator/val_anchor.h $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h \
+ $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h $(srcdir)/util/storage/dnstree.h \
+ $(srcdir)/iterator/iter_delegpt.h $(srcdir)/services/outside_network.h
 stats.lo stats.o: $(srcdir)/daemon/stats.c config.h \
  $(srcdir)/daemon/stats.h \
  $(srcdir)/util/timehist.h $(srcdir)/daemon/worker.h $(srcdir)/util/netevent.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
@@ -968,8 +933,8 @@ unbound.lo unbound.o: $(srcdir)/daemon/unbound.c config.h $(srcdir)/util/log.h \
  $(srcdir)/util/config_file.h $(srcdir)/util/storage/slabhash.h $(srcdir)/util/storage/lruhash.h \
  $(srcdir)/services/listen_dnsport.h $(srcdir)/util/netevent.h $(srcdir)/services/cache/rrset.h \
  $(srcdir)/util/data/packed_rrset.h \
- $(srcdir)/services/cache/infra.h \
- $(srcdir)/util/rtt.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/module.h \
+ $(srcdir)/util/data/msgparse.h \
  $(srcdir)/util/net_help.h \
  $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h
 worker.lo worker.o: $(srcdir)/daemon/worker.c config.h \
@@ -978,8 +943,7 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h \
  $(srcdir)/util/locks.h $(srcdir)/util/alloc.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/storage/lruhash.h \
  $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/daemon/stats.h \
  $(srcdir)/util/timehist.h $(srcdir)/util/module.h $(srcdir)/daemon/daemon.h $(srcdir)/services/modstack.h \
- $(srcdir)/daemon/remote.h \
- $(srcdir)/daemon/acl_list.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/daemon/remote.h $(srcdir)/daemon/acl_list.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
  $(srcdir)/util/config_file.h $(srcdir)/util/regional.h $(srcdir)/util/storage/slabhash.h \
  $(srcdir)/services/listen_dnsport.h $(srcdir)/services/outside_network.h \
  $(srcdir)/services/outbound_list.h $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h \
@@ -1003,8 +967,7 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h \
  $(srcdir)/util/locks.h $(srcdir)/util/alloc.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/storage/lruhash.h \
  $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/daemon/stats.h \
  $(srcdir)/util/timehist.h $(srcdir)/util/module.h $(srcdir)/daemon/daemon.h $(srcdir)/services/modstack.h \
- $(srcdir)/daemon/remote.h \
- $(srcdir)/daemon/acl_list.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/daemon/remote.h $(srcdir)/daemon/acl_list.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
  $(srcdir)/util/config_file.h $(srcdir)/util/regional.h $(srcdir)/util/storage/slabhash.h \
  $(srcdir)/services/listen_dnsport.h $(srcdir)/services/outside_network.h \
  $(srcdir)/services/outbound_list.h $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h \
@@ -1013,8 +976,7 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h \
  $(srcdir)/iterator/iter_fwd.h $(srcdir)/validator/autotrust.h
 acl_list.lo acl_list.o: $(srcdir)/daemon/acl_list.c config.h $(srcdir)/daemon/acl_list.h \
  $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/regional.h $(srcdir)/util/log.h \
- $(srcdir)/util/config_file.h \
- $(srcdir)/util/net_help.h
+ $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h
 daemon.lo daemon.o: $(srcdir)/daemon/daemon.c config.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 \
@@ -1043,11 +1005,10 @@ fake_event.lo fake_event.o: $(srcdir)/testcode/fake_event.c config.h $(srcdir)/t
  $(srcdir)/util/netevent.h \
  $(srcdir)/util/net_help.h \
  $(srcdir)/util/log.h $(srcdir)/util/data/msgparse.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
- $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/config_file.h $(srcdir)/services/listen_dnsport.h $(srcdir)/services/outside_network.h \
- $(srcdir)/util/rbtree.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/testcode/replay.h \
- $(srcdir)/testcode/ldns-testpkts.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgencode.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/util/config_file.h $(srcdir)/services/listen_dnsport.h \
+ $(srcdir)/services/outside_network.h $(srcdir)/util/rbtree.h $(srcdir)/services/cache/infra.h \
+ $(srcdir)/util/rtt.h $(srcdir)/testcode/replay.h $(srcdir)/testcode/ldns-testpkts.h \
  $(srcdir)/util/fptr_wlist.h \
  $(srcdir)/util/module.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h
 lock_verify.lo lock_verify.o: $(srcdir)/testcode/lock_verify.c config.h $(srcdir)/util/log.h \
@@ -1074,9 +1035,8 @@ memstats.lo memstats.o: $(srcdir)/testcode/memstats.c config.h $(srcdir)/util/lo
  $(srcdir)/util/tube.h \
  $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h
 unbound-checkconf.lo unbound-checkconf.o: $(srcdir)/smallapp/unbound-checkconf.c config.h $(srcdir)/util/log.h \
- $(srcdir)/util/config_file.h \
- $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/config_file.h $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/data/msgparse.h \
  $(srcdir)/util/net_help.h \
  $(srcdir)/util/regional.h $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h \
@@ -1095,20 +1055,20 @@ context.lo context.o: $(srcdir)/libunbound/context.c config.h $(srcdir)/libunbou
  $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
  $(srcdir)/util/module.h \
  $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h \
- $(srcdir)/util/config_file.h \
- $(srcdir)/util/net_help.h $(srcdir)/services/localzone.h $(srcdir)/services/cache/rrset.h \
- $(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h
+ $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/services/localzone.h \
+ $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/infra.h \
+ $(srcdir)/util/rtt.h
 libunbound.lo libunbound.o: $(srcdir)/libunbound/libunbound.c $(srcdir)/libunbound/unbound.h 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)/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)/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/rtt.h \
- $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.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)/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/rtt.h $(srcdir)/services/cache/rrset.h \
+ $(srcdir)/util/storage/slabhash.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 \
@@ -1127,31 +1087,26 @@ asynclook.lo asynclook.o: $(srcdir)/testcode/asynclook.c config.h $(srcdir)/libu
  $(srcdir)/util/storage/lruhash.h \
  
 streamtcp.lo streamtcp.o: $(srcdir)/testcode/streamtcp.c config.h \
- $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/util/net_help.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/util/locks.h \
+ $(srcdir)/util/log.h $(srcdir)/util/net_help.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/msgparse.h \
  $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
- $(srcdir)/util/data/dname.h \
+ $(srcdir)/util/data/dname.h
 perf.lo perf.o: $(srcdir)/testcode/perf.c config.h \
- $(srcdir)/util/log.h $(srcdir)/util/locks.h \
- $(srcdir)/util/net_help.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/msgreply.h \
+ $(srcdir)/util/log.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/net_help.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/msgreply.h \
  $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h
 delayer.lo delayer.o: $(srcdir)/testcode/delayer.c config.h $(srcdir)/util/net_help.h $(srcdir)/util/log.h \
  $(srcdir)/util/config_file.h
 harvest.lo harvest.o: $(srcdir)/testcode/harvest.c config.h \
  $(srcdir)/libunbound/unbound.h
-unbound-control.lo unbound-control.o: $(srcdir)/smallapp/unbound-control.c config.h \
- $(srcdir)/util/log.h \
- $(srcdir)/util/config_file.h \
- $(srcdir)/util/locks.h $(srcdir)/util/net_help.h
+unbound-control.lo unbound-control.o: $(srcdir)/smallapp/unbound-control.c config.h $(srcdir)/util/log.h \
+ $(srcdir)/util/config_file.h $(srcdir)/util/locks.h $(srcdir)/util/net_help.h
 unbound-anchor.lo unbound-anchor.o: $(srcdir)/smallapp/unbound-anchor.c config.h $(srcdir)/libunbound/unbound.h \
  
-petal.lo petal.o: $(srcdir)/testcode/petal.c config.h \
+petal.lo petal.o: $(srcdir)/testcode/petal.c config.h
 pythonmod_utils.lo pythonmod_utils.o: $(srcdir)/pythonmod/pythonmod_utils.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/msgreply.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/data/msgparse.h \
  $(srcdir)/util/netevent.h \
  $(srcdir)/util/net_help.h $(srcdir)/services/cache/dns.h $(srcdir)/services/cache/rrset.h \
@@ -1164,8 +1119,8 @@ win_svc.lo win_svc.o: $(srcdir)/winrc/win_svc.c config.h $(srcdir)/winrc/win_svc
  $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/packed_rrset.h \
  $(srcdir)/util/data/msgparse.h \
  $(srcdir)/daemon/stats.h \
- $(srcdir)/util/timehist.h $(srcdir)/util/module.h $(srcdir)/daemon/remote.h \
- $(srcdir)/util/config_file.h $(srcdir)/util/winsock_event.h
+ $(srcdir)/util/timehist.h $(srcdir)/util/module.h $(srcdir)/daemon/remote.h $(srcdir)/util/config_file.h \
+ $(srcdir)/util/winsock_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
index 5936cc3071eed52ddb687ceeaa827988cace0f91..9c683bc75784fec8d4a8bbebf3a2f76aa053b2b4 100644 (file)
@@ -68,6 +68,7 @@
 #include "validator/validator.h"
 #include "validator/val_kcache.h"
 #include "validator/val_kentry.h"
+#include "validator/val_anchor.h"
 #include "iterator/iterator.h"
 #include "iterator/iter_fwd.h"
 #include "iterator/iter_hints.h"
@@ -1337,12 +1338,12 @@ print_root_fwds(SSL* ssl, struct iter_forwards* fwds, uint8_t* root)
 
 /** parse args into delegpt */
 static struct delegpt*
-parse_delegpt(SSL* ssl, char* args, uint8_t* root)
+parse_delegpt(SSL* ssl, char* args, uint8_t* nm, int allow_names)
 {
        /* parse args and add in */
        char* p = args;
        char* todo;
-       struct delegpt* dp = delegpt_create_mlc(root);
+       struct delegpt* dp = delegpt_create_mlc(nm);
        struct sockaddr_storage addr;
        socklen_t addrlen;
        if(!dp) {
@@ -1358,14 +1359,37 @@ parse_delegpt(SSL* ssl, char* args, uint8_t* root)
                }
                /* parse address */
                if(!extstrtoaddr(todo, &addr, &addrlen)) {
-                       (void)ssl_printf(ssl, "error cannot parse"
-                               " IP address '%s'\n", todo);
-                       return NULL;
-               }
-               /* add address */
-               if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0)) {
-                       (void)ssl_printf(ssl, "error out of memory\n");
-                       return NULL;
+                       if(allow_names) {
+                               uint8_t* n = NULL;
+                               size_t ln;
+                               int lb;
+                               if(!parse_arg_name(ssl, todo, &n, &ln, &lb)) {
+                                       (void)ssl_printf(ssl, "error cannot "
+                                               "parse IP address or name "
+                                               "'%s'\n", todo);
+                                       delegpt_free_mlc(dp);
+                                       return NULL;
+                               }
+                               if(!delegpt_add_ns_mlc(dp, n, 0)) {
+                                       (void)ssl_printf(ssl, "error out of memory\n");
+                                       delegpt_free_mlc(dp);
+                                       return NULL;
+                               }
+                               free(n);
+
+                       } else {
+                               (void)ssl_printf(ssl, "error cannot parse"
+                                       " IP address '%s'\n", todo);
+                               delegpt_free_mlc(dp);
+                               return NULL;
+                       }
+               } else {
+                       /* add address */
+                       if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0)) {
+                               (void)ssl_printf(ssl, "error out of memory\n");
+                               delegpt_free_mlc(dp);
+                               return NULL;
+                       }
                }
        }
        return dp;
@@ -1393,16 +1417,186 @@ do_forward(SSL* ssl, struct worker* worker, char* args)
                forwards_delete_zone(fwd, LDNS_RR_CLASS_IN, root);
        } else {
                struct delegpt* dp;
-               if(!(dp = parse_delegpt(ssl, args, root)))
+               if(!(dp = parse_delegpt(ssl, args, root, 0)))
                        return;
                if(!forwards_add_zone(fwd, LDNS_RR_CLASS_IN, dp)) {
                        (void)ssl_printf(ssl, "error out of memory\n");
+                       delegpt_free_mlc(dp);
+                       return;
+               }
+       }
+       send_ok(ssl);
+}
+
+static int
+parse_fs_args(SSL* ssl, char* args, uint8_t** nm, struct delegpt** dp,
+       int* insecure, int* prime)
+{
+       char* zonename;
+       char* rest;
+       size_t nmlen;
+       int nmlabs;
+       /* parse all -x args */
+       while(args[0] == '+') {
+               if(!find_arg2(ssl, args, &rest))
+                       return 0;
+               while(*(++args) != 0) {
+                       if(*args == 'i' && insecure)
+                               *insecure = 1;
+                       else if(*args == 'p' && prime)
+                               *prime = 1;
+                       else {
+                               (void)ssl_printf(ssl, "error: unknown option %s\n", args);
+                               return 0;
+                       }
+               }
+               args = rest;
+       }
+       /* parse name */
+       if(dp) {
+               if(!find_arg2(ssl, args, &rest))
+                       return 0;
+               zonename = args;
+               args = rest;
+       } else  zonename = args;
+       if(!parse_arg_name(ssl, zonename, nm, &nmlen, &nmlabs))
+               return 0;
+
+       /* parse dp */
+       if(dp) {
+               if(!(*dp = parse_delegpt(ssl, args, *nm, 1))) {
+                       free(*nm);
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+/** do the forward_add command */
+static void
+do_forward_add(SSL* ssl, struct worker* worker, char* args)
+{
+       struct iter_forwards* fwd = worker->env.fwds;
+       int insecure = 0;
+       uint8_t* nm = NULL;
+       struct delegpt* dp = NULL;
+       if(!parse_fs_args(ssl, args, &nm, &dp, &insecure, NULL)) {
+               return;
+       }
+       if(insecure) {
+               if(!anchors_add_insecure(worker->env.anchors, LDNS_RR_CLASS_IN,
+                       nm)) {
+                       (void)ssl_printf(ssl, "error out of memory\n");
+                       delegpt_free_mlc(dp);
+                       free(nm);
+                       return;
+               }
+       }
+       if(!forwards_add_zone(fwd, LDNS_RR_CLASS_IN, dp)) {
+               (void)ssl_printf(ssl, "error out of memory\n");
+               delegpt_free_mlc(dp);
+               free(nm);
+               return;
+       }
+       free(nm);
+       send_ok(ssl);
+}
+
+/** do the forward_remove command */
+static void
+do_forward_remove(SSL* ssl, struct worker* worker, char* args)
+{
+       struct iter_forwards* fwd = worker->env.fwds;
+       int insecure = 0;
+       uint8_t* nm = NULL;
+       if(!parse_fs_args(ssl, args, &nm, NULL, &insecure, NULL)) {
+               free(nm);
+               return;
+       }
+       if(insecure)
+               anchors_delete_insecure(worker->env.anchors, LDNS_RR_CLASS_IN,
+                       nm);
+       forwards_delete_zone(fwd, LDNS_RR_CLASS_IN, nm);
+       free(nm);
+       send_ok(ssl);
+}
+
+static struct iter_hints*
+get_iter_hints(struct worker* worker)
+{
+       int m;
+       struct iter_env* ie;
+       m = modstack_find(&worker->env.mesh->mods, "iterator");
+       if(m == -1)
+               return NULL;
+       ie = (struct iter_env*)worker->env.modinfo[m];
+       return ie->hints;
+}
+
+/** do the stub_add command */
+static void
+do_stub_add(SSL* ssl, struct worker* worker, char* args)
+{
+       struct iter_forwards* fwd = worker->env.fwds;
+       struct iter_hints* hints = get_iter_hints(worker);
+       int insecure = 0, prime = 0;
+       uint8_t* nm = NULL;
+       struct delegpt* dp = NULL;
+       if(!parse_fs_args(ssl, args, &nm, &dp, &insecure, &prime)) {
+               return;
+       }
+       if(insecure) {
+               if(!anchors_add_insecure(worker->env.anchors, LDNS_RR_CLASS_IN,
+                       nm)) {
+                       (void)ssl_printf(ssl, "error out of memory\n");
+                       delegpt_free_mlc(dp);
+                       free(nm);
                        return;
                }
        }
+       if(!forwards_add_stub_hole(fwd, LDNS_RR_CLASS_IN, nm)) {
+               if(insecure) anchors_delete_insecure(worker->env.anchors,
+                       LDNS_RR_CLASS_IN, nm);
+               (void)ssl_printf(ssl, "error out of memory\n");
+               delegpt_free_mlc(dp);
+               free(nm);
+               return;
+       }
+       if(!hints_add_stub(hints, LDNS_RR_CLASS_IN, dp, !prime)) {
+               (void)ssl_printf(ssl, "error out of memory\n");
+               forwards_delete_stub_hole(fwd, LDNS_RR_CLASS_IN, nm);
+               if(insecure) anchors_delete_insecure(worker->env.anchors,
+                       LDNS_RR_CLASS_IN, nm);
+               delegpt_free_mlc(dp);
+               free(nm);
+               return;
+       }
+       free(nm);
+       send_ok(ssl);
+}
+
+/** do the stub_remove command */
+static void
+do_stub_remove(SSL* ssl, struct worker* worker, char* args)
+{
+       struct iter_forwards* fwd = worker->env.fwds;
+       struct iter_hints* hints = get_iter_hints(worker);
+       int insecure = 0;
+       uint8_t* nm = NULL;
+       if(!parse_fs_args(ssl, args, &nm, NULL, &insecure, NULL)) {
+               free(nm);
+               return;
+       }
+       if(insecure)
+               anchors_delete_insecure(worker->env.anchors, LDNS_RR_CLASS_IN,
+                       nm);
+       forwards_delete_stub_hole(fwd, LDNS_RR_CLASS_IN, nm);
+       hints_delete_stub(hints, LDNS_RR_CLASS_IN, nm);
+       free(nm);
        send_ok(ssl);
 }
 
+
 /** do the status command */
 static void
 do_status(SSL* ssl, struct worker* worker)
@@ -1779,6 +1973,26 @@ execute_cmd(struct daemon_remote* rc, SSL* ssl, char* cmd,
        } else if(cmdcmp(p, "list_local_data", 15)) {
                do_list_local_data(ssl, worker);
                return;
+       } else if(cmdcmp(p, "stub_add", 8)) {
+               /* must always distribute this cmd */
+               if(rc) distribute_cmd(rc, ssl, cmd);
+               do_stub_add(ssl, worker, skipwhite(p+8));
+               return;
+       } else if(cmdcmp(p, "stub_remove", 11)) {
+               /* must always distribute this cmd */
+               if(rc) distribute_cmd(rc, ssl, cmd);
+               do_stub_remove(ssl, worker, skipwhite(p+11));
+               return;
+       } else if(cmdcmp(p, "forward_add", 11)) {
+               /* must always distribute this cmd */
+               if(rc) distribute_cmd(rc, ssl, cmd);
+               do_forward_add(ssl, worker, skipwhite(p+11));
+               return;
+       } else if(cmdcmp(p, "forward_remove", 14)) {
+               /* must always distribute this cmd */
+               if(rc) distribute_cmd(rc, ssl, cmd);
+               do_forward_remove(ssl, worker, skipwhite(p+14));
+               return;
        } else if(cmdcmp(p, "forward", 7)) {
                /* must always distribute this cmd */
                if(rc) distribute_cmd(rc, ssl, cmd);
index 11d7c810820541ea5c858ca0b56f8e449ee8cd94..b6ad9dab6491a6ba5549d2b002aa88afdbb10763 100644 (file)
@@ -148,7 +148,7 @@ worker_mem_report(struct worker* ATTR_UNUSED(worker),
 #ifdef UNBOUND_ALLOC_STATS
        /* debug func in validator module */
        size_t total, front, back, mesh, msg, rrset, infra, ac, superac;
-       size_t me, iter, val;
+       size_t me, iter, val, anch;
        int i;
        if(verbosity < VERB_ALGO) 
                return;
@@ -160,6 +160,7 @@ worker_mem_report(struct worker* ATTR_UNUSED(worker),
        mesh = mesh_get_mem(worker->env.mesh);
        ac = alloc_get_mem(&worker->alloc);
        superac = alloc_get_mem(&worker->daemon->superalloc);
+       anch = anchors_get_mem(worker->env.anchors);
        iter = 0;
        val = 0;
        for(i=0; i<worker->env.mesh->mods.num; i++) {
@@ -185,12 +186,12 @@ worker_mem_report(struct worker* ATTR_UNUSED(worker),
        }
        total = front+back+mesh+msg+rrset+infra+iter+val+ac+superac+me;
        log_info("Memory conditions: %u front=%u back=%u mesh=%u msg=%u "
-               "rrset=%u infra=%u iter=%u val=%u "
+               "rrset=%u infra=%u iter=%u val=%u anchors=%u "
                "alloccache=%u globalalloccache=%u me=%u",
                (unsigned)total, (unsigned)front, (unsigned)back, 
                (unsigned)mesh, (unsigned)msg, (unsigned)rrset, 
-               (unsigned)infra, (unsigned)iter, (unsigned)val, (unsigned)ac, 
-               (unsigned)superac, (unsigned)me);
+               (unsigned)infra, (unsigned)iter, (unsigned)val, (unsigned)anch,
+               (unsigned)ac, (unsigned)superac, (unsigned)me);
        debug_total_mem(total);
 #else /* no UNBOUND_ALLOC_STATS */
        size_t val = 0;
index 113d33592d7c10fbb16675124d04eb6ff57e989c..007f538c7c6e6ca8f0b93e18d16f318ec1e5e6fe 100644 (file)
@@ -1,6 +1,9 @@
 15 February 2012: Wouter
        - Fix forward-zone memory, uses malloc and frees original root dp.
        - iter hints (stubs) uses malloc inside for more dynamicity.
+       - unbound-control forward_add, forward_remove, stub_add, stub_remove
+         can modify stubs and forwards for running unbound (on mobile computer)
+         they can also add and remove domain-insecure for the zone.
 
 14 February 2012: Wouter
        - Fix sticky NS (ghost domain problem) if prefetch is yes.
index dab5d7e7bfd17c118ac393f0f94e5f3850364c31..a095eb7a63efb637bc6befccbf7c7adc4e1c0ff9 100644 (file)
@@ -190,6 +190,27 @@ List the local zones in use.  These are printed one per line with zone type.
 .B list_local_data
 List the local data RRs in use.  The resource records are printed.
 .TP
+.B forward_add \fR[\fI+i\fR] \fIzone addr ...
+Add a new forward zone to running unbound.  With +i option also adds a
+\fIdomain\-insecure\fR for the zone (so it can resolve insecurely if you have
+a DNSSEC root trust anchor configured for other names).
+The addr can be IP4, IP6 or nameserver names, like \fIforward-zone\fR config
+in unbound.conf.
+.TP
+.B forward_remove \fR[\fI+i\fR] \fIzone
+Remove a forward zone from running unbound.  The +i also removes a
+\fIdomain\-insecure\fR for the zone.
+.TP
+.B stub_add \fR[\fI+ip\fR] \fIzone addr ...
+Add a new stub zone to running unbound.  With +i option also adds a
+\fIdomain\-insecure\fR for the zone.  With +p the stub zone is set to prime,
+without it it is set to notprime.  The addr can be IP4, IP6 or nameserver
+names, like the \fIstub-zone\fR config in unbound.conf.
+.TP
+.B stub_remove \fR[\fI+i\fR] \fIzone
+Remove a stub zone from running unbound.  The +i also removes a
+\fIdomain\-insecure\fR for the zone.
+.TP
 .B forward \fR[\fIoff\fR | \fIaddr ...\fR ]
 Setup forwarding mode.  Configures if the server should ask other upstream
 nameservers, should go to the internet root nameservers itself, or show 
index 8d355f44167da539fbd691053a2be8465dc62931..697b209f9578fe9c3a225cff26f6733ffe4c0198 100644 (file)
@@ -284,28 +284,35 @@ need_hole_insert(rbtree_t* tree, struct iter_forward_zone* zone)
        return 0; /* no forwards above, no holes needed */
 }
 
+/** insert a stub hole (if necessary) for stub name */
+static int
+fwd_add_stub_hole(struct iter_forwards* fwd, uint16_t c, uint8_t* nm)
+{
+       struct iter_forward_zone key;
+       key.node.key = &key;
+       key.dclass = c;
+       key.name = nm;
+       key.namelabs = dname_count_size_labels(key.name, &key.namelen);
+       if(need_hole_insert(fwd->tree, &key)) {
+               return forwards_insert_data(fwd, key.dclass, key.name,
+                       key.namelen, key.namelabs, NULL);
+       }
+       return 1;
+}
+
 /** make NULL entries for stubs */
 static int
 make_stub_holes(struct iter_forwards* fwd, struct config_file* cfg)
 {
        struct config_stub* s;
-       struct iter_forward_zone key;
-       key.node.key = &key;
-       key.dclass = LDNS_RR_CLASS_IN;
        for(s = cfg->stubs; s; s = s->next) {
                ldns_rdf* rdf = ldns_dname_new_frm_str(s->name);
                if(!rdf) {
                        log_err("cannot parse stub name '%s'", s->name);
                        return 0;
                }
-               key.name = ldns_rdf_data(rdf);
-               key.namelabs = dname_count_size_labels(key.name, &key.namelen);
-               if(!need_hole_insert(fwd->tree, &key)) {
-                       ldns_rdf_deep_free(rdf);
-                       continue;
-               }
-               if(!forwards_insert_data(fwd, key.dclass, key.name, 
-                       key.namelen, key.namelabs, NULL)) {
+               if(!fwd_add_stub_hole(fwd, LDNS_RR_CLASS_IN,
+                               ldns_rdf_data(rdf))) {
                        ldns_rdf_deep_free(rdf);
                        log_err("out of memory");
                        return 0;
@@ -453,8 +460,8 @@ forwards_add_zone(struct iter_forwards* fwd, uint16_t c, struct delegpt* dp)
 {
        struct iter_forward_zone *z;
        if((z=fwd_zone_find(fwd, c, dp->name)) != NULL) {
-               fwd_zone_free(z);
                (void)rbtree_delete(fwd->tree, &z->node);
+               fwd_zone_free(z);
        }
        if(!forwards_insert(fwd, c, dp))
                return 0;
@@ -468,8 +475,31 @@ forwards_delete_zone(struct iter_forwards* fwd, uint16_t c, uint8_t* nm)
        struct iter_forward_zone *z;
        if(!(z=fwd_zone_find(fwd, c, nm)))
                return; /* nothing to do */
+       (void)rbtree_delete(fwd->tree, &z->node);
        fwd_zone_free(z);
+       fwd_init_parents(fwd);
+}
+
+int
+forwards_add_stub_hole(struct iter_forwards* fwd, uint16_t c, uint8_t* nm)
+{
+       if(!fwd_add_stub_hole(fwd, c, nm)) {
+               return 0;
+       }
+       fwd_init_parents(fwd);
+       return 1;
+}
+
+void
+forwards_delete_stub_hole(struct iter_forwards* fwd, uint16_t c, uint8_t* nm)
+{
+       struct iter_forward_zone *z;
+       if(!(z=fwd_zone_find(fwd, c, nm)))
+               return; /* nothing to do */
+       if(z->dp != NULL)
+               return; /* not a stub hole */
        (void)rbtree_delete(fwd->tree, &z->node);
+       fwd_zone_free(z);
        fwd_init_parents(fwd);
 }
 
index b66687f0b48afba6017dd26466928b020802e92f..dbb84f226126f64732126360312989cacfd9556d 100644 (file)
@@ -45,7 +45,6 @@
 #include "util/rbtree.h"
 struct config_file;
 struct delegpt;
-struct regional;
 
 /**
  * Iterator forward zones structure
@@ -152,9 +151,7 @@ int fwd_cmp(const void* k1, const void* k2);
  * @param fwd: the forward data structure
  * @param c: class of zone
  * @param dp: delegation point with name and target nameservers for new
- *     forward zone. This delegation point and all its data must be
- *     malloced in the fwd->region. (then it is freed when the fwd is
- *     deleted).
+ *     forward zone. malloced.
  * @return false on failure (out of memory);
  */
 int forwards_add_zone(struct iter_forwards* fwd, uint16_t c, 
@@ -162,12 +159,31 @@ int forwards_add_zone(struct iter_forwards* fwd, uint16_t c,
 
 /**
  * Remove zone from forward structure. For external use since it 
- * recalcs the tree parents. Does not actually release any memory, the region 
- * is unchanged.
+ * recalcs the tree parents.
  * @param fwd: the forward data structure
  * @param c: class of zone
  * @param nm: name of zone (in uncompressed wireformat).
  */
 void forwards_delete_zone(struct iter_forwards* fwd, uint16_t c, uint8_t* nm);
 
+/**
+ * Add stub hole (empty entry in forward table, that makes resolution skip
+ * a forward-zone because the stub zone should override the forward zone).
+ * Does not add one if not necessary.
+ * @param fwd: the forward data structure
+ * @param c: class of zone
+ * @param nm: name of zone (in uncompressed wireformat).
+ * @return false on failure (out of memory);
+ */
+int forwards_add_stub_hole(struct iter_forwards* fwd, uint16_t c, uint8_t* nm);
+
+/**
+ * Remove stub hole, if one exists.
+ * @param fwd: the forward data structure
+ * @param c: class of zone
+ * @param nm: name of zone (in uncompressed wireformat).
+ */
+void forwards_delete_stub_hole(struct iter_forwards* fwd, uint16_t c,
+       uint8_t* nm);
+
 #endif /* ITERATOR_ITER_FWD_H */
index c032be92647a2e989c8760cdfe7bfab77470324c..0e1034b62a87f53b0f89fbcfe3441fa6993334c7 100644 (file)
@@ -44,7 +44,6 @@
 #include <ldns/rr.h>
 #include "iterator/iter_hints.h"
 #include "iterator/iter_delegpt.h"
-#include "util/regional.h"
 #include "util/log.h"
 #include "util/config_file.h"
 #include "util/net_help.h"
@@ -499,3 +498,34 @@ hints_get_mem(struct iter_hints* hints)
        }
        return s;
 }
+
+int 
+hints_add_stub(struct iter_hints* hints, uint16_t c, struct delegpt* dp,
+       int noprime)
+{
+       struct iter_hints_stub *z;
+       if((z=(struct iter_hints_stub*)name_tree_find(&hints->tree,
+               dp->name, dp->namelen, dp->namelabs, c)) != NULL) {
+               (void)rbtree_delete(&hints->tree, &z->node);
+               hints_stub_free(z);
+       }
+       if(!hints_insert(hints, c, dp, noprime))
+               return 0;
+       name_tree_init_parents(&hints->tree);
+       return 1;
+}
+
+void 
+hints_delete_stub(struct iter_hints* hints, uint16_t c, uint8_t* nm)
+{
+       struct iter_hints_stub *z;
+       size_t len;
+       int labs = dname_count_size_labels(nm, &len);
+       if(!(z=(struct iter_hints_stub*)name_tree_find(&hints->tree,
+               nm, len, labs, c)))
+               return; /* nothing to do */
+       (void)rbtree_delete(&hints->tree, &z->node);
+       hints_stub_free(z);
+       name_tree_init_parents(&hints->tree);
+}
+
index 6135bfacbd2b9ff6c02978f21d444a1fbd80062e..7cac811ecd1ce2b2b4fedc1fffe9bc63e316f2de 100644 (file)
@@ -46,7 +46,6 @@
 struct iter_env;
 struct config_file;
 struct delegpt;
-struct regional;
 
 /**
  * Iterator hints structure
@@ -137,4 +136,26 @@ struct iter_hints_stub* hints_lookup_stub(struct iter_hints* hints,
  */
 size_t hints_get_mem(struct iter_hints* hints);
 
+/**
+ * Add stub to hints structure. For external use since it recalcs 
+ * the tree parents.
+ * @param hints: the hints data structure
+ * @param c: class of zone
+ * @param dp: delegation point with name and target nameservers for new
+ *     hints stub. malloced.
+ * @param noprime: set noprime option to true or false on new hint stub.
+ * @return false on failure (out of memory);
+ */
+int hints_add_stub(struct iter_hints* hints, uint16_t c, struct delegpt* dp,
+       int noprime);
+
+/**
+ * Remove stub from hints structure. For external use since it 
+ * recalcs the tree parents.
+ * @param hints: the hints data structure
+ * @param c: class of stub zone
+ * @param nm: name of stub zone (in uncompressed wireformat).
+ */
+void hints_delete_stub(struct iter_hints* hints, uint16_t c, uint8_t* nm);
+
 #endif /* ITERATOR_ITER_HINTS_H */
index a872f92aa51285d1c72779b7500137c36e202783..757d2798872147f3e7860972a4f898016db0740f 100644 (file)
@@ -104,6 +104,12 @@ usage()
        printf("  list_forwards                 list forward-zones in use\n");
        printf("  list_local_zones              list local-zones in use\n");
        printf("  list_local_data               list local-data RRs in use\n");
+       printf("  forward_add [+i] zone addr..  add forward-zone with servers\n");
+       printf("  forward_remove [+i] zone      remove forward zone\n");
+       printf("  stub_add [+ip] zone addr..    add stub-zone with servers\n");
+       printf("  stub_remove [+i] zone         remove stub zone\n");
+       printf("                +i              also do dnssec insecure point\n");
+       printf("                +p              set stub to use priming\n");
        printf("  forward [off | addr ...]      without arg show forward setup\n");
        printf("                                or off to turn off root forwarding\n");
        printf("                                or give list of ip addresses\n");
index 72338b0f8bfe3914aeaf9b99519643c6b27850c4..909afd62bb9df6b5a5c870e42a148ea919dcf88d 100644 (file)
@@ -49,7 +49,6 @@
 #include "util/data/dname.h"
 #include "util/log.h"
 #include "util/net_help.h"
-#include "util/regional.h"
 #include "util/config_file.h"
 #ifdef HAVE_GLOB_H
 #include <glob.h>
@@ -77,11 +76,6 @@ anchors_create(void)
        struct val_anchors* a = (struct val_anchors*)calloc(1, sizeof(*a));
        if(!a)
                return NULL;
-       a->region = regional_create();
-       if(!a->region) {
-               free(a);
-               return NULL;
-       }
        a->tree = rbtree_create(anchor_cmp);
        if(!a->tree) {
                anchors_delete(a);
@@ -98,15 +92,45 @@ anchors_create(void)
        return a;
 }
 
+/** delete assembled rrset */
+static void
+assembled_rrset_delete(struct ub_packed_rrset_key* pkey)
+{
+       if(!pkey) return;
+       if(pkey->entry.data) {
+               struct packed_rrset_data* pd = (struct packed_rrset_data*)
+                       pkey->entry.data;
+               free(pd->rr_data);
+               free(pd->rr_ttl);
+               free(pd->rr_len);
+               free(pd);
+       }
+       free(pkey->rk.dname);
+       free(pkey);
+}
+
 /** destroy locks in tree and delete autotrust anchors */
 static void
 anchors_delfunc(rbnode_t* elem, void* ATTR_UNUSED(arg))
 {
        struct trust_anchor* ta = (struct trust_anchor*)elem;
+       if(!ta) return;
        if(ta->autr) {
                autr_point_delete(ta);
        } else {
+               struct ta_key* p, *np;
                lock_basic_destroy(&ta->lock);
+               free(ta->name);
+               p = ta->keylist;
+               while(p) {
+                       np = p->next;
+                       free(p->data);
+                       free(p);
+                       p = np;
+               }
+               assembled_rrset_delete(ta->ds_rrset);
+               assembled_rrset_delete(ta->dnskey_rrset);
+               free(ta);
        }
 }
 
@@ -118,9 +142,9 @@ anchors_delete(struct val_anchors* anchors)
        lock_unprotect(&anchors->lock, anchors->autr);
        lock_unprotect(&anchors->lock, anchors);
        lock_basic_destroy(&anchors->lock);
-       traverse_postorder(anchors->tree, anchors_delfunc, NULL);
+       if(anchors->tree)
+               traverse_postorder(anchors->tree, anchors_delfunc, NULL);
        free(anchors->tree);
-       regional_destroy(anchors->region);
        autr_global_delete(anchors->autr);
        free(anchors);
 }
@@ -193,30 +217,34 @@ anchor_find(struct val_anchors* anchors, uint8_t* name, int namelabs,
 /** create new trust anchor object */
 static struct trust_anchor*
 anchor_new_ta(struct val_anchors* anchors, uint8_t* name, int namelabs,
-       size_t namelen, uint16_t dclass)
+       size_t namelen, uint16_t dclass, int lockit)
 {
 #ifdef UNBOUND_DEBUG
        rbnode_t* r;
 #endif
-       struct trust_anchor* ta = (struct trust_anchor*)regional_alloc(
-               anchors->region, sizeof(struct trust_anchor));
+       struct trust_anchor* ta = (struct trust_anchor*)malloc(
+               sizeof(struct trust_anchor));
        if(!ta)
                return NULL;
        memset(ta, 0, sizeof(*ta));
        ta->node.key = ta;
-       ta->name = regional_alloc_init(anchors->region, name, namelen);
-       if(!ta->name)
+       ta->name = memdup(name, namelen);
+       if(!ta->name) {
+               free(ta);
                return NULL;
+       }
        ta->namelabs = namelabs;
        ta->namelen = namelen;
        ta->dclass = dclass;
        lock_basic_init(&ta->lock);
-       lock_basic_lock(&anchors->lock);
+       if(lockit)
+               lock_basic_lock(&anchors->lock);
 #ifdef UNBOUND_DEBUG
        r =
 #endif
        rbtree_insert(anchors->tree, &ta->node);
-       lock_basic_unlock(&anchors->lock);
+       if(lockit)
+               lock_basic_unlock(&anchors->lock);
        log_assert(r != NULL);
        return ta;
 }
@@ -237,17 +265,17 @@ anchor_find_key(struct trust_anchor* ta, uint8_t* rdata, size_t rdata_len,
        
 /** create new trustanchor key */
 static struct ta_key*
-anchor_new_ta_key(struct val_anchors* anchors, uint8_t* rdata, size_t rdata_len,
-       uint16_t type)
+anchor_new_ta_key(uint8_t* rdata, size_t rdata_len, uint16_t type)
 {
-       struct ta_key* k = (struct ta_key*)regional_alloc(anchors->region,
-               sizeof(*k));
+       struct ta_key* k = (struct ta_key*)malloc(sizeof(*k));
        if(!k)
                return NULL;
        memset(k, 0, sizeof(*k));
-       k->data = regional_alloc_init(anchors->region, rdata, rdata_len);
-       if(!k->data)
+       k->data = memdup(rdata, rdata_len);
+       if(!k->data) {
+               free(k);
                return NULL;
+       }
        k->len = rdata_len;
        k->type = type;
        return k;
@@ -282,7 +310,7 @@ anchor_store_new_key(struct val_anchors* anchors, uint8_t* name, uint16_t type,
        /* lookup or create trustanchor */
        ta = anchor_find(anchors, name, namelabs, namelen, dclass);
        if(!ta) {
-               ta = anchor_new_ta(anchors, name, namelabs, namelen, dclass);
+               ta = anchor_new_ta(anchors, name, namelabs, namelen, dclass, 1);
                if(!ta)
                        return NULL;
                lock_basic_lock(&ta->lock);
@@ -296,7 +324,7 @@ anchor_store_new_key(struct val_anchors* anchors, uint8_t* name, uint16_t type,
                lock_basic_unlock(&ta->lock);
                return ta;
        }
-       k = anchor_new_ta_key(anchors, rdata, rdata_len, type);
+       k = anchor_new_ta_key(rdata, rdata_len, type);
        if(!k) {
                lock_basic_unlock(&ta->lock);
                return NULL;
@@ -826,55 +854,73 @@ anchor_read_bind_file_wild(struct val_anchors* anchors, ldns_buffer* buffer,
 
 /** 
  * Assemble an rrset structure for the type 
- * @param region: allocated in this region.
  * @param ta: trust anchor.
  * @param num: number of items to fetch from list.
  * @param type: fetch only items of this type.
  * @return rrset or NULL on error.
  */
 static struct ub_packed_rrset_key*
-assemble_it(struct regional* region, struct trust_anchor* ta, size_t num, 
-       uint16_t type)
+assemble_it(struct trust_anchor* ta, size_t num, uint16_t type)
 {
        struct ub_packed_rrset_key* pkey = (struct ub_packed_rrset_key*)
-               regional_alloc(region, sizeof(*pkey));
+               malloc(sizeof(*pkey));
        struct packed_rrset_data* pd;
        struct ta_key* tk;
        size_t i;
        if(!pkey)
                return NULL;
        memset(pkey, 0, sizeof(*pkey));
-       pkey->rk.dname = regional_alloc_init(region, ta->name, ta->namelen);
-       if(!pkey->rk.dname)
+       pkey->rk.dname = memdup(ta->name, ta->namelen);
+       if(!pkey->rk.dname) {
+               free(pkey);
                return NULL;
-       
+       }
+
        pkey->rk.dname_len = ta->namelen;
        pkey->rk.type = htons(type);
        pkey->rk.rrset_class = htons(ta->dclass);
        /* The rrset is build in an uncompressed way. This means it
         * cannot be copied in the normal way. */
-       pd = (struct packed_rrset_data*)regional_alloc(region, sizeof(*pd));
-       if(!pd)
+       pd = (struct packed_rrset_data*)malloc(sizeof(*pd));
+       if(!pd) {
+               free(pkey->rk.dname);
+               free(pkey);
                return NULL;
+       }
        memset(pd, 0, sizeof(*pd));
        pd->count = num;
        pd->trust = rrset_trust_ultimate;
-       pd->rr_len = (size_t*)regional_alloc(region, num*sizeof(size_t));
-       if(!pd->rr_len)
+       pd->rr_len = (size_t*)malloc(num*sizeof(size_t));
+       if(!pd->rr_len) {
+               free(pd);
+               free(pkey->rk.dname);
+               free(pkey);
                return NULL;
-       pd->rr_ttl = (uint32_t*)regional_alloc(region, num*sizeof(uint32_t));
-       if(!pd->rr_ttl)
+       }
+       pd->rr_ttl = (uint32_t*)malloc(num*sizeof(uint32_t));
+       if(!pd->rr_ttl) {
+               free(pd->rr_len);
+               free(pd);
+               free(pkey->rk.dname);
+               free(pkey);
                return NULL;
-       pd->rr_data = (uint8_t**)regional_alloc(region, num*sizeof(uint8_t*));
-       if(!pd->rr_data)
+       }
+       pd->rr_data = (uint8_t**)malloc(num*sizeof(uint8_t*));
+       if(!pd->rr_data) {
+               free(pd->rr_ttl);
+               free(pd->rr_len);
+               free(pd);
+               free(pkey->rk.dname);
+               free(pkey);
                return NULL;
+       }
        /* fill in rrs */
        i=0;
        for(tk = ta->keylist; tk; tk = tk->next) {
                if(tk->type != type)
                        continue;
                pd->rr_len[i] = tk->len;
-               /* reuse data ptr to allocation in region */
+               /* reuse data ptr to allocation in talist */
                pd->rr_data[i] = tk->data;
                pd->rr_ttl[i] = 0;
                i++;
@@ -890,17 +936,16 @@ assemble_it(struct regional* region, struct trust_anchor* ta, size_t num,
  * @return: false on error.
  */
 static int
-anchors_assemble(struct val_anchors* anchors, struct trust_anchor* ta)
+anchors_assemble(struct trust_anchor* ta)
 {
        if(ta->numDS > 0) {
-               ta->ds_rrset = assemble_it(anchors->region, ta,
-                       ta->numDS, LDNS_RR_TYPE_DS);
+               ta->ds_rrset = assemble_it(ta, ta->numDS, LDNS_RR_TYPE_DS);
                if(!ta->ds_rrset)
                        return 0;
        }
        if(ta->numDNSKEY > 0) {
-               ta->dnskey_rrset = assemble_it(anchors->region, ta,
-                       ta->numDNSKEY, LDNS_RR_TYPE_DNSKEY);
+               ta->dnskey_rrset = assemble_it(ta, ta->numDNSKEY,
+                       LDNS_RR_TYPE_DNSKEY);
                if(!ta->dnskey_rrset)
                        return 0;
        }
@@ -961,7 +1006,7 @@ anchors_assemble_rrsets(struct val_anchors* anchors)
                        ta = next; /* skip */
                        continue;
                }
-               if(!anchors_assemble(anchors, ta)) {
+               if(!anchors_assemble(ta)) {
                        log_err("out of memory");
                        lock_basic_unlock(&ta->lock);
                        lock_basic_unlock(&anchors->lock);
@@ -1146,5 +1191,72 @@ anchors_lookup(struct val_anchors* anchors,
 size_t 
 anchors_get_mem(struct val_anchors* anchors)
 {
-       return sizeof(*anchors) + regional_get_mem(anchors->region);
+       struct trust_anchor *ta;
+       size_t s = sizeof(*anchors);
+       RBTREE_FOR(ta, struct trust_anchor*, anchors->tree) {
+               s += sizeof(*ta) + ta->namelen;
+               /* keys and so on */
+       }
+       return s;
+}
+
+int
+anchors_add_insecure(struct val_anchors* anchors, uint16_t c, uint8_t* nm)
+{
+       struct trust_anchor key;
+       key.node.key = &key;
+       key.name = nm;
+       key.namelabs = dname_count_size_labels(nm, &key.namelen);
+       key.dclass = c;
+       lock_basic_lock(&anchors->lock);
+       if(rbtree_search(anchors->tree, &key)) {
+               lock_basic_unlock(&anchors->lock);
+               /* nothing to do, already an anchor or insecure point */
+               return 1;
+       }
+       if(!anchor_new_ta(anchors, nm, key.namelabs, key.namelen, c, 0)) {
+               log_err("out of memory");
+               lock_basic_unlock(&anchors->lock);
+               return 0;
+       }
+       /* no other contents in new ta, because it is insecure point */
+       anchors_init_parents_locked(anchors);
+       lock_basic_unlock(&anchors->lock);
+       return 1;
+}
+
+void
+anchors_delete_insecure(struct val_anchors* anchors, uint16_t c,
+        uint8_t* nm)
+{
+       struct trust_anchor key;
+       struct trust_anchor* ta;
+       key.node.key = &key;
+       key.name = nm;
+       key.namelabs = dname_count_size_labels(nm, &key.namelen);
+       key.dclass = c;
+       lock_basic_lock(&anchors->lock);
+       if(!(ta=(struct trust_anchor*)rbtree_search(anchors->tree, &key))) {
+               lock_basic_unlock(&anchors->lock);
+               /* nothing there */
+               return;
+       }
+       /* lock it to drive away other threads that use it */
+       lock_basic_lock(&ta->lock);
+       /* see if its really an insecure point */
+       if(ta->keylist || ta->autr || ta->numDS || ta->numDNSKEY) {
+               lock_basic_unlock(&ta->lock);
+               /* its not an insecure point, do not remove it */
+               return;
+       }
+       lock_basic_unlock(&ta->lock);
+
+       /* remove from tree */
+       rbtree_delete(anchors->tree, &ta->node);
+       anchors_init_parents_locked(anchors);
+       lock_basic_unlock(&anchors->lock);
+
+       /* actual free of data */
+       anchors_delfunc(&ta->node, NULL);
 }
+
index d2f3afc43f19753e35fd5269eb7ad5a1664f335c..5a3ad409a83e30bc71a046afda8c761571af19de 100644 (file)
@@ -43,7 +43,6 @@
 #define VALIDATOR_VAL_ANCHOR_H
 #include "util/rbtree.h"
 #include "util/locks.h"
-struct regional;
 struct trust_anchor;
 struct config_file;
 struct ub_packed_rrset_key;
@@ -60,11 +59,6 @@ struct autr_global_data;
 struct val_anchors {
        /** lock on trees */
        lock_basic_t lock;
-       /** 
-        * region where trust anchors are allocated.
-        * Autotrust anchors are malloced so they can be updated. 
-        */
-       struct regional* region;
        /**
         * Anchors are store in this tree. Sort order is chosen, so that
         * dnames are in nsec-like order. A lookup on class, name will return
@@ -111,7 +105,6 @@ struct trust_anchor {
        struct trust_anchor* parent;
        /** 
         * List of DS or DNSKEY rrs that form the trust anchor.
-        * It is allocated in the region.
         */
        struct ta_key* keylist;
        /** Autotrust anchor point data, or NULL */
@@ -203,4 +196,23 @@ size_t anchors_get_mem(struct val_anchors* anchors);
 /** compare two trust anchors */
 int anchor_cmp(const void* k1, const void* k2);
 
+/**
+ * Add insecure point trust anchor.  For external use (locks and init_parents)
+ * @param anchors: anchor storage.
+ * @param c: class.
+ * @param nm: name of insecure trust point.
+ * @return false on alloc failure.
+ */
+int anchors_add_insecure(struct val_anchors* anchors, uint16_t c, uint8_t* nm);
+
+/**
+ * Delete insecure point trust anchor.  Does not remove if no such point.
+ * For external use (locks and init_parents)
+ * @param anchors: anchor storage.
+ * @param c: class.
+ * @param nm: name of insecure trust point.
+ */
+void anchors_delete_insecure(struct val_anchors* anchors, uint16_t c,
+       uint8_t* nm);
+
 #endif /* VALIDATOR_VAL_ANCHOR_H */
index c05a8cf972881f23be9a720df81e5aaa97af7832..19e1f9006bce163ddfe90d99f97281270ccb6822 100644 (file)
@@ -2923,7 +2923,6 @@ val_get_mem(struct module_env* env, int id)
                return 0;
        return sizeof(*ve) + key_cache_get_mem(ve->kcache) + 
                val_neg_get_mem(ve->neg_cache) +
-               anchors_get_mem(env->anchors) + 
                sizeof(size_t)*2*ve->nsec3_keyiter_count;
 }