summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2014-10-26 14:58:28 +0100
committerIan Jackson <ijackson@chiark.greenend.org.uk>2014-10-26 14:58:28 +0100
commit312fa1152b79fc62a4ed0f7d2782e059d350761f (patch)
treec4ed86a5a3e83fdf9e72fd256c7231e6f42ddf4c
Import adns_1.5.0~rc1.orig.tar.gz
[dgit import orig adns_1.5.0~rc1.orig.tar.gz]
-rw-r--r--.gitignore40
-rw-r--r--COPYING674
-rw-r--r--GPL-vs-LGPL95
-rw-r--r--INSTALL132
-rw-r--r--Makefile.in93
-rw-r--r--NEWS70
-rw-r--r--README170
-rw-r--r--README.html232
-rwxr-xr-xRELEASE-CHECKLIST94
-rw-r--r--TODO14
-rw-r--r--acconfig.h115
-rw-r--r--aclocal.m467
-rw-r--r--changelog450
-rw-r--r--client/Makefile.in82
-rw-r--r--client/addrtext.c197
-rw-r--r--client/adh-main.c274
-rw-r--r--client/adh-opts.c367
-rw-r--r--client/adh-query.c322
-rw-r--r--client/adnsheloex.c300
-rw-r--r--client/adnshost.h129
-rw-r--r--client/adnslogres.c299
-rw-r--r--client/adnsresfilter.c474
-rw-r--r--client/adnstest.c358
-rw-r--r--client/client.h53
-rw-r--r--client/fanftest.c85
-rw-r--r--common.make.in63
-rwxr-xr-xconfigure5342
-rw-r--r--configure.in153
-rw-r--r--dynamic/Makefile.in55
-rwxr-xr-xinstall-sh250
-rw-r--r--regress/Makefile.in91
-rwxr-xr-xregress/addcases29
-rw-r--r--regress/adnshost-xinitflags.text1
-rw-r--r--regress/adnslogres-xinitflags.text1
-rw-r--r--regress/adnsresfilter-xinitflags.text1
-rw-r--r--regress/case-1stservbroken.err0
-rw-r--r--regress/case-1stservbroken.out39
-rw-r--r--regress/case-1stservbroken.sys183
-rw-r--r--regress/case-1stservtotcp.err0
-rw-r--r--regress/case-1stservtotcp.out37
-rw-r--r--regress/case-1stservtotcp.sys159
-rw-r--r--regress/case-2ndservok.err0
-rw-r--r--regress/case-2ndservok.out6
-rw-r--r--regress/case-2ndservok.sys47
-rw-r--r--regress/case-2ndservtcp.err0
-rw-r--r--regress/case-2ndservtcp.out37
-rw-r--r--regress/case-2ndservtcp.sys168
-rw-r--r--regress/case-aaaa-simple.err0
-rw-r--r--regress/case-aaaa-simple.out5
-rw-r--r--regress/case-aaaa-simple.sys40
-rw-r--r--regress/case-aaaa-sort.err0
-rw-r--r--regress/case-aaaa-sort.out10
-rw-r--r--regress/case-aaaa-sort.sys45
-rw-r--r--regress/case-abbrev.err0
-rw-r--r--regress/case-abbrev.out40
-rw-r--r--regress/case-abbrev.sys265
-rw-r--r--regress/case-abbrevto.err0
-rw-r--r--regress/case-abbrevto.out32
-rw-r--r--regress/case-abbrevto.sys1164
-rw-r--r--regress/case-addr-multi-af.err0
-rw-r--r--regress/case-addr-multi-af.out164
-rw-r--r--regress/case-addr-multi-af.sys1236
-rw-r--r--regress/case-adh-cancel.err2
-rw-r--r--regress/case-adh-cancel.out2
-rw-r--r--regress/case-adh-cancel.sys73
-rw-r--r--regress/case-adh-cancel2.err1
-rw-r--r--regress/case-adh-cancel2.out1
-rw-r--r--regress/case-adh-cancel2.sys59
-rw-r--r--regress/case-adh-cancel3.err2
-rw-r--r--regress/case-adh-cancel3.out1
-rw-r--r--regress/case-adh-cancel3.sys90
-rw-r--r--regress/case-adh-norm.err1
-rw-r--r--regress/case-adh-norm.out2
-rw-r--r--regress/case-adh-norm.sys34
-rw-r--r--regress/case-adh-pipe.err1
-rw-r--r--regress/case-adh-pipe.out2
-rw-r--r--regress/case-adh-pipe.sys48
-rw-r--r--regress/case-alr-norm.err29
-rw-r--r--regress/case-alr-norm.in10
-rw-r--r--regress/case-alr-norm.out11
-rw-r--r--regress/case-alr-norm.sys475
-rw-r--r--regress/case-alr-slow.err27
-rw-r--r--regress/case-alr-slow.in10
-rw-r--r--regress/case-alr-slow.out11
-rw-r--r--regress/case-alr-slow.sys490
-rw-r--r--regress/case-arf-norm.err2
-rw-r--r--regress/case-arf-norm.out1
-rw-r--r--regress/case-arf-norm.sys324
-rw-r--r--regress/case-arf-text.err1
-rw-r--r--regress/case-arf-text.out1
-rw-r--r--regress/case-arf-text.sys63
-rw-r--r--regress/case-bogus-sortlist.err1
-rw-r--r--regress/case-bogus-sortlist.out7
-rw-r--r--regress/case-bogus-sortlist.sys2
-rw-r--r--regress/case-brokenmail.err0
-rw-r--r--regress/case-brokenmail.out38
-rw-r--r--regress/case-brokenmail.sys516
-rw-r--r--regress/case-child.err0
-rw-r--r--regress/case-child.out5
-rw-r--r--regress/case-child.sys58
-rw-r--r--regress/case-cnametocname.err0
-rw-r--r--regress/case-cnametocname.out5
-rw-r--r--regress/case-cnametocname.sys39
-rw-r--r--regress/case-comprinf.err0
-rw-r--r--regress/case-comprinf.out4
-rw-r--r--regress/case-comprinf.sys35
-rw-r--r--regress/case-connfail.err0
-rw-r--r--regress/case-connfail.out9
-rw-r--r--regress/case-connfail.sys78
-rw-r--r--regress/case-datapluscname.err0
-rw-r--r--regress/case-datapluscname.out39
-rw-r--r--regress/case-datapluscname.sys233
-rw-r--r--regress/case-datapluscnamewait.err0
-rw-r--r--regress/case-datapluscnamewait.out78
-rw-r--r--regress/case-datapluscnamewait.sys1492
-rw-r--r--regress/case-dh-ptr-aaaa.err1
-rw-r--r--regress/case-dh-ptr-aaaa.out2
-rw-r--r--regress/case-dh-ptr-aaaa.sys68
-rw-r--r--regress/case-flags10.err1
-rw-r--r--regress/case-flags10.out2
-rw-r--r--regress/case-flags10.sys15
-rw-r--r--regress/case-flags9.err0
-rw-r--r--regress/case-flags9.out5
-rw-r--r--regress/case-flags9.sys34
-rw-r--r--regress/case-formerr.err0
-rw-r--r--regress/case-formerr.out19
-rw-r--r--regress/case-formerr.sys330
-rw-r--r--regress/case-lockup.err0
-rw-r--r--regress/case-lockup.out4
-rw-r--r--regress/case-lockup.sys135
-rw-r--r--regress/case-longdom0.err0
-rw-r--r--regress/case-longdom0.out4
-rw-r--r--regress/case-longdom0.sys47
-rw-r--r--regress/case-longdom1.err0
-rw-r--r--regress/case-longdom1.out4
-rw-r--r--regress/case-longdom1.sys15
-rw-r--r--regress/case-longdomsrch0.err0
-rw-r--r--regress/case-longdomsrch0.out4
-rw-r--r--regress/case-longdomsrch0.sys15
-rw-r--r--regress/case-longdomsrch1.err0
-rw-r--r--regress/case-longdomsrch1.out4
-rw-r--r--regress/case-longdomsrch1.sys47
-rw-r--r--regress/case-longdomsrch1b.err0
-rw-r--r--regress/case-longdomsrch1b.out4
-rw-r--r--regress/case-longdomsrch1b.sys46
-rw-r--r--regress/case-longdomsrch2.err0
-rw-r--r--regress/case-longdomsrch2.out4
-rw-r--r--regress/case-longdomsrch2.sys72
-rw-r--r--regress/case-longlab0.err0
-rw-r--r--regress/case-longlab0.out4
-rw-r--r--regress/case-longlab0.sys37
-rw-r--r--regress/case-longlab1.err0
-rw-r--r--regress/case-longlab1.out4
-rw-r--r--regress/case-longlab1.sys15
-rw-r--r--regress/case-mailboxes.err0
-rw-r--r--regress/case-mailboxes.out10
-rw-r--r--regress/case-mailboxes.sys35
-rw-r--r--regress/case-manya.err0
-rw-r--r--regress/case-manya.out8
-rw-r--r--regress/case-manya.sys36
-rw-r--r--regress/case-manyptrwrong.err0
-rw-r--r--regress/case-manyptrwrong.out127
-rw-r--r--regress/case-manyptrwrong.sys1287
-rw-r--r--regress/case-manyptrwrongrem.err0
-rw-r--r--regress/case-manyptrwrongrem.out127
-rw-r--r--regress/case-manyptrwrongrem.sys1145
-rw-r--r--regress/case-manyptrwrongrst.err0
-rw-r--r--regress/case-manyptrwrongrst.out132
-rw-r--r--regress/case-manyptrwrongrst.sys1215
-rw-r--r--regress/case-manyptrwrongrty.err0
-rw-r--r--regress/case-manyptrwrongrty.out143
-rw-r--r--regress/case-manyptrwrongrty.sys1436
-rw-r--r--regress/case-ndots-as.err0
-rw-r--r--regress/case-ndots-as.out16
-rw-r--r--regress/case-ndots-as.sys316
-rw-r--r--regress/case-ndots.err0
-rw-r--r--regress/case-ndots.out16
-rw-r--r--regress/case-ndots.sys277
-rw-r--r--regress/case-ndotsbad.err1
-rw-r--r--regress/case-ndotsbad.out3
-rw-r--r--regress/case-ndotsbad.sys2
-rw-r--r--regress/case-noinfto.err0
-rw-r--r--regress/case-noinfto.out4
-rw-r--r--regress/case-noinfto.sys123
-rw-r--r--regress/case-norecurse.err0
-rw-r--r--regress/case-norecurse.out56
-rw-r--r--regress/case-norecurse.sys636
-rw-r--r--regress/case-norecurse2.err0
-rw-r--r--regress/case-norecurse2.out60
-rw-r--r--regress/case-norecurse2.sys1224
-rw-r--r--regress/case-norecurse3.err0
-rw-r--r--regress/case-norecurse3.out32
-rw-r--r--regress/case-norecurse3.sys488
-rw-r--r--regress/case-norm.err0
-rw-r--r--regress/case-norm.out5
-rw-r--r--regress/case-norm.sys34
-rw-r--r--regress/case-owner.err0
-rw-r--r--regress/case-owner.out36
-rw-r--r--regress/case-owner.sys267
-rw-r--r--regress/case-poll.err0
-rw-r--r--regress/case-poll.out5
-rw-r--r--regress/case-poll.sys34
-rw-r--r--regress/case-polltimeout.err0
-rw-r--r--regress/case-polltimeout.out4
-rw-r--r--regress/case-polltimeout.sys135
-rw-r--r--regress/case-ptr-aaaa-caps.err0
-rw-r--r--regress/case-ptr-aaaa-caps.out5
-rw-r--r--regress/case-ptr-aaaa-caps.sys73
-rw-r--r--regress/case-ptr-aaaa-check.err0
-rw-r--r--regress/case-ptr-aaaa-check.out5
-rw-r--r--regress/case-ptr-aaaa-check.sys68
-rw-r--r--regress/case-ptr-aaaa-mismatch.err0
-rw-r--r--regress/case-ptr-aaaa-mismatch.out4
-rw-r--r--regress/case-ptr-aaaa-mismatch.sys68
-rw-r--r--regress/case-ptr-aaaa-plain.err0
-rw-r--r--regress/case-ptr-aaaa-plain.out5
-rw-r--r--regress/case-ptr-aaaa-plain.sys43
-rw-r--r--regress/case-ptr-aaaa.err0
-rw-r--r--regress/case-ptr-aaaa.out5
-rw-r--r--regress/case-ptr-aaaa.sys68
-rw-r--r--regress/case-ptrbaddom.err0
-rw-r--r--regress/case-ptrbaddom.out7
-rw-r--r--regress/case-ptrbaddom.sys36
-rw-r--r--regress/case-ptrbaddom2.err0
-rw-r--r--regress/case-ptrbaddom2.out8
-rw-r--r--regress/case-ptrbaddom2.sys15
-rw-r--r--regress/case-quote.err0
-rw-r--r--regress/case-quote.out28
-rw-r--r--regress/case-quote.sys211
-rw-r--r--regress/case-rootquery.err0
-rw-r--r--regress/case-rootquery.out8
-rw-r--r--regress/case-rootquery.sys73
-rw-r--r--regress/case-rootqueryall-as.err0
-rw-r--r--regress/case-rootqueryall-as.out118
-rw-r--r--regress/case-rootqueryall-as.sys559
-rw-r--r--regress/case-rootqueryall.err0
-rw-r--r--regress/case-rootqueryall.out127
-rw-r--r--regress/case-rootqueryall.sys925
-rw-r--r--regress/case-rr_addr-binary-compat.err0
-rw-r--r--regress/case-rr_addr-binary-compat.out18
-rw-r--r--regress/case-rr_addr-binary-compat.sys63
-rw-r--r--regress/case-search-as.err0
-rw-r--r--regress/case-search-as.out14
-rw-r--r--regress/case-search-as.sys131
-rw-r--r--regress/case-search.err0
-rw-r--r--regress/case-search.out14
-rw-r--r--regress/case-search.sys133
-rw-r--r--regress/case-searchabs.err0
-rw-r--r--regress/case-searchabs.out5
-rw-r--r--regress/case-searchabs.sys72
-rw-r--r--regress/case-sillyrp.err0
-rw-r--r--regress/case-sillyrp.out22
-rw-r--r--regress/case-sillyrp.sys183
-rw-r--r--regress/case-srvbaddom.err6
-rw-r--r--regress/case-srvbaddom.out1
-rw-r--r--regress/case-srvbaddom.sys50
-rw-r--r--regress/case-srvha.err1
-rw-r--r--regress/case-srvha.out7
-rw-r--r--regress/case-srvha.sys103
-rw-r--r--regress/case-srvok.err1
-rw-r--r--regress/case-srvok.out7
-rw-r--r--regress/case-srvok.sys85
-rw-r--r--regress/case-srvqudom.err6
-rw-r--r--regress/case-srvqudom.out1
-rw-r--r--regress/case-srvqudom.sys104
-rw-r--r--regress/case-srvsort.err1
-rw-r--r--regress/case-srvsort.out29
-rw-r--r--regress/case-srvsort.sys187
-rw-r--r--regress/case-tcpallfail.err0
-rw-r--r--regress/case-tcpallfail.out34
-rw-r--r--regress/case-tcpallfail.sys63
-rw-r--r--regress/case-tcpblock.err0
-rw-r--r--regress/case-tcpblock.out33
-rw-r--r--regress/case-tcpblock.sys109
-rw-r--r--regress/case-tcpblockbrk.err0
-rw-r--r--regress/case-tcpblockbrk.out35
-rw-r--r--regress/case-tcpblockbrk.sys139
-rw-r--r--regress/case-tcpblockwr.err0
-rw-r--r--regress/case-tcpblockwr.out105
-rw-r--r--regress/case-tcpblockwr.sys605
-rw-r--r--regress/case-tcpbreakin.err0
-rw-r--r--regress/case-tcpbreakin.out8
-rw-r--r--regress/case-tcpbreakin.sys114
-rw-r--r--regress/case-tcpmultipart.err0
-rw-r--r--regress/case-tcpmultipart.out71
-rw-r--r--regress/case-tcpmultipart.sys248
-rw-r--r--regress/case-tcpptr.err0
-rw-r--r--regress/case-tcpptr.out6
-rw-r--r--regress/case-tcpptr.sys88
-rw-r--r--regress/case-timeout.err0
-rw-r--r--regress/case-timeout.out4
-rw-r--r--regress/case-timeout.sys135
-rw-r--r--regress/case-trunc.err0
-rw-r--r--regress/case-trunc.out4
-rw-r--r--regress/case-trunc.sys34
-rw-r--r--regress/case-unknown-flags-harmless.err0
-rw-r--r--regress/case-unknown-flags-harmless.out5
-rw-r--r--regress/case-unknown-flags-harmless.sys34
-rw-r--r--regress/case-unknown-flags-init.err1
-rw-r--r--regress/case-unknown-flags-init.out1
-rw-r--r--regress/case-unknown-flags-init.sys2
-rw-r--r--regress/case-unknown-flags-query.err0
-rw-r--r--regress/case-unknown-flags-query.out3
-rw-r--r--regress/case-unknown-flags-query.sys15
-rw-r--r--regress/case-unknown-flags-type.err0
-rw-r--r--regress/case-unknown-flags-type.out3
-rw-r--r--regress/case-unknown-flags-type.sys15
-rw-r--r--regress/case-unknown2.err1
-rw-r--r--regress/case-unknown2.out5
-rw-r--r--regress/case-unknown2.sys66
-rw-r--r--regress/case-unknown33.err1
-rw-r--r--regress/case-unknown33.out2
-rw-r--r--regress/case-unknown33.sys37
-rw-r--r--regress/case-unknown5.err1
-rw-r--r--regress/case-unknown5.out2
-rw-r--r--regress/case-unknown5.sys45
-rw-r--r--regress/case-unknownq.err0
-rw-r--r--regress/case-unknownq.out3
-rw-r--r--regress/case-unknownq.sys15
-rw-r--r--regress/case-unkopts.err0
-rw-r--r--regress/case-unkopts.out10
-rw-r--r--regress/case-unkopts.sys34
-rw-r--r--regress/case-v6-map.err0
-rw-r--r--regress/case-v6-map.out11
-rw-r--r--regress/case-v6-map.sys79
-rw-r--r--regress/case-v6-transport-simple.err0
-rw-r--r--regress/case-v6-transport-simple.out34
-rw-r--r--regress/case-v6-transport-simple.sys221
-rwxr-xr-xregress/checkall70
-rwxr-xr-xregress/gdbwrap37
-rwxr-xr-xregress/hack-query-ids17
-rw-r--r--regress/harness.h44
-rw-r--r--regress/harness.h.m471
-rw-r--r--regress/hcommon.c304
-rw-r--r--regress/hcommon.c.m4328
-rw-r--r--regress/hmacros.i4140
-rw-r--r--regress/hplayback.c594
-rw-r--r--regress/hplayback.c.m4389
-rw-r--r--regress/hrecord.c257
-rw-r--r--regress/hrecord.c.m4158
-rw-r--r--regress/hredirect.h44
-rw-r--r--regress/hredirect.h.m439
-rw-r--r--regress/hsyscalls.h32
-rw-r--r--regress/hsyscalls.h.m445
-rw-r--r--regress/hsyscalls.i4143
-rw-r--r--regress/init-1stservbroken.text3
-rw-r--r--regress/init-1stservto.text3
-rw-r--r--regress/init-2ndserver.text3
-rw-r--r--regress/init-anarres.text2
-rw-r--r--regress/init-bogus-sortlist.text3
-rw-r--r--regress/init-default.text3
-rw-r--r--regress/init-distorted-v6.text3
-rw-r--r--regress/init-distorted.text3
-rw-r--r--regress/init-manyptrwrong.text1
-rw-r--r--regress/init-ncipher.text3
-rw-r--r--regress/init-ndots.text4
-rw-r--r--regress/init-ndots100.text4
-rw-r--r--regress/init-ndotsbad.text4
-rw-r--r--regress/init-noserver.text2
-rw-r--r--regress/init-tunnel.text3
-rw-r--r--regress/init-unkopts.text11
-rwxr-xr-xregress/m1test107
-rwxr-xr-xregress/r1test109
-rw-r--r--settings.make.in39
-rw-r--r--src/Makefile.in50
-rw-r--r--src/addrfam.c646
-rw-r--r--src/adns.h1067
-rw-r--r--src/adns.make24
-rw-r--r--src/check.c224
-rw-r--r--src/config.h.in98
-rw-r--r--src/dlist.h53
-rw-r--r--src/event.c732
-rw-r--r--src/general.c384
-rw-r--r--src/internal.h947
-rw-r--r--src/parse.c261
-rw-r--r--src/poll.c130
-rw-r--r--src/query.c677
-rw-r--r--src/reply.c390
-rw-r--r--src/setup.c843
-rw-r--r--src/transmit.c289
-rw-r--r--src/tvarith.h40
-rw-r--r--src/types.c1712
382 files changed, 47452 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..973a480
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,40 @@
+Makefile
+config.log
+config.cache
+config.status
+autom4te.cache
+dist_tmp
+adns-*.tar.gz
+adns-*.tar.gz.sig
+common.make
+settings.make
+*.tmp*
+*.o
+*.so
+*.a
+*~
+adnshost.txt
+x.gdb
+client/Makefile
+client/adnstest_s
+client/fanftest_s
+client/addrtext_s
+client/adnslogres
+client/adnslogres_s
+client/adnsheloex
+client/adnsheloex_s
+client/adnshost
+client/adnshost_s
+client/adnsresfilter
+client/adnsresfilter_s
+dynamic/Makefile
+dynamic/libadns.so.*
+regress/Makefile
+regress/*_record
+regress/*_playback
+regress/output-*.*
+regress/pipe.out
+regress/pipe.err
+src/Makefile
+src/config.h
+web
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/GPL-vs-LGPL b/GPL-vs-LGPL
new file mode 100644
index 0000000..4dc8267
--- /dev/null
+++ b/GPL-vs-LGPL
@@ -0,0 +1,95 @@
+ GPL vs LGPL, in the context of adns
+ -----------------------------------
+
+Several people have asked me to release GNU adns under the GNU Lesser
+General Public Licence (LGPL, formerly the Library GPL) instead of the
+`stronger' GPL. This file is intended to answer most of these
+questions. If you still have questions or comments, please mail me at
+<adns-maint@chiark.greenend.org.uk>.
+
+Typically there are two or three kinds of situation where people make
+this request: the first is where another free software project
+currently using a GPL-incompatible licence, wishes to use adns. The
+second case, which often overlaps with the first, is where a free
+software project is currently using an MIT-like licence or the LGPL
+and fear `GPL infection'. The third case is where someone is
+developing a proprietary program and wishes to make use of adns but
+doesn't wish to make their program free software
+
+
+1. GPL-incompatible free software licences
+------------------------------------------
+
+Regrettably, there are a number of free software licences (and
+semi-free licences) in existence which are not compatible with the
+GPL. That is, they impose restrictions which are not present in the
+GPL, and therefore distributing a whole work which contains both such
+a program and a GPL'd program is not possible: either the combination
+would have to be distributed under the GPL (violating the restrictions
+made by the original author), or under the GPL-incompatible licence
+(violating the GPL).
+
+I may be prepared to make exceptions for such a licence. Please
+contact me at <adns-maint@chiark.greenend.org.uk> with the full text
+of the GPL-incompatible licence. However, I would usually prefer it
+if you could use a GPL-compatible licence for your project instead.
+
+
+2. GPL-avoiding projects (MIT licence, et al)
+---------------------------------------------
+
+Some free software projects prefer to avoid the GPL and other licences
+which force the software always to be free. Instead they use
+something like the MIT X licence, which allows proprietary versions of
+their software, or the in the case of some free libraries, the LGPL,
+which allows proprietary applications. I have to say that I think
+these people are misguided, but that doesn't mean that they don't have
+a perfect right to do that.
+
+Some of these people think that merely writing to an interface
+provided by GPL'd software will cause their program to become GPL'd
+too, even if they don't distribute the GPL'd software. I don't think
+this is the case. I'm perfectly happy for non-GPL'd but
+GPL-compatible software to refer to adns in its source code. However,
+I think that exectuables (or compiled libraries) which contain or are
+dynamically linked against adns must be GPL'd; likewise executable
+programs (whether compiled or in an interpreted language) which
+require utilities from adns to function properly must be GPL'd.
+
+So, you can distribute your non-GPL'd program source which needs adns
+to compile (provided it's under a GPL-compatible licence), but people
+who wish to distribute binaries must do so under the terms of the GNU
+GPL. This may make sense for some GPL-avoiding free software
+projects; people can still make proprietary programs from your code,
+provided that they make some provision to replace adns with something
+whose copyright allows proprietary versions.
+
+However, this doesn't make much sense for the authors of LGPL'd
+libraries. All I can say to them is to ask which is more important:
+that their library be well-constructed and use all the best technology
+available as free software, or whether it is worth degrading quality
+of their library in order to allow proprietary programs to use it !
+
+To help the case of LGPL'd libraries for which adns is not a vital
+component - for example, a library which provides access to other
+libraries so that programs which use it need only use certain parts,
+I have released adns.h (just the public header file) under the LGPL as
+well as the GPL. See the copyright notice in adns.h for details.
+Note that this will not help you if it adns is essential to the
+functioning of your library, because all programs using your library
+must link against both your library and adns and so must be GPL'd.
+
+
+For some information and views from the Free Software Foundation on
+free software licensing, visit:
+
+ Various licenses and comments about them
+ at http://www.fsf.org/philosophy/license-list.html
+
+ Why you shouldn't use the Library GPL for your next library
+ at http://www.fsf.org/philosophy/why-not-lgpl.html
+
+
+Local variables:
+mode: text
+End:
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..a0a2196
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,132 @@
+INSTALLATION INSTRUCTIONS for GNU ADNS
+
+1. Read the security note below.
+
+2. Standard GNU package build process:
+ $ ./configure [--disable-dynamic] [--prefix=... ...]
+ $ make
+ # make install
+
+Unfortunately, there is no comprehensive documentation yet. For now,
+use the comments in the public header file adns.h, and for the C
+programs their usage messages. If you find this information
+ambiguous, incomplete or wrong, please report it as a bug.
+
+
+TESTED PLATFORMS
+
+The following platforms have been tested at at least some point and
+should work - please report if they don't:
+ adns version OS
+ 1.0 Linux glibc 2.1 (actually tested on Debian 2.2)
+ 1.0 Solaris 2.6, 2.7, 2.8 [3]
+ 1.0 FreeBSD 3.2, 4.0 (no poll(2), so no adnsresfilter)
+The following work, but only with --disable-dynamic:
+ 1.0 IRIX 6.5 *not* with GCC [1], [2]
+ 1.0 AIX 4.1.5
+ 1.0 HP-UX 10.20, 11.00
+ 1.1 Darwin (kernel 7.5.1)
+Later versions of the same OS should work too. Usually entries in
+this table mean adns passes its own regression test, when compiled
+with GCC, and appears to install and run correctly. If you have more
+information for this table please let me know.
+
+Notes/known problems:
+ [1] IRIX 6.5 inet_ntoa seems to break with GCC.
+ [2] The SGI IRIX compiler produces many spurious warnings.
+ [3] Dynamically linked, needs some help to find libadns.so.1.0.
+
+The following platforms are known to be deficient and will not work:
+ Solaris 2.5 Lacks vsnprintf - install glibc ?
+ TruUnix64 (DEC UNIX 4.0f) Lacks vsnprintf - install glibc ?
+Please don't report these problems unless you have a nice,
+straightforward solution or workaround for them. (I don't consider
+including a `vsnprintf' implementation nice, so don't send me one.)
+
+
+PORTABILITY INFORMATION
+
+You will find that adns requires a reasonably standard and up to date
+system. Systems which are neither GNU nor UNIX are not supported.
+
+The build system assumes by default that you have ELF shared
+libraries, and that the directory in which libadns.so.1 will be
+installed is on your dynamic library search path. If your system
+doesn't have ELF shared libraries then dynamic linking is not
+supported by adns. Use the --disable-shared configure option.
+Please don't send me patches to use libtool (which I dislike).
+
+Compilers other than GNU C should work, but are not well-tested. Feel
+free to send me patches to improve the situation. However, the
+Makefiles only know how to use GCC to make dynamic libraries.
+
+The adnsresfilter utility uses `tsearch' from the C library (a la SVID
+and X/Open). If you don't have tsearch configure will arrange for
+adnsresfilter not to be built. To fix this, install a C library
+containing tsearch, such as the GNU C library. It is best if tsearch
+uses an automatically-balancing tree algorithm, like the glibc version
+does. Simple binary trees may perform badly.
+
+If you change the m4 input files in regress/ you may need GNU m4.
+
+You will probably find that GNU Make is required.
+Please do not report this as a bug; install GNU Make instead.
+
+
+SECURITY AND PERFORMANCE - AN IMPORTANT NOTE
+
+adns is not a `full-service resolver': it does no caching of responses
+at all, and has no defence against bad nameservers or fake packets
+which appear to come from your real nameservers. It relies on the
+full-service resolvers listed in resolv.conf to handle these tasks.
+
+For secure and reasonable operation you MUST run a full-service
+nameserver on the same system as your adns applications, or on the
+same local, fully trusted network. You MUST only list such
+nameservers in the adns configuration (eg resolv.conf).
+
+You MUST use a firewall or other means to block packets which appear
+to come from these nameservers, but which were actually sent by other,
+untrusted, entities.
+
+Furthermore, adns is not DNSSEC-aware in this version; it doesn't
+understand even how to ask a DNSSEC-aware nameserver to perform the
+DNSSEC cryptographic signature checking.
+
+
+COPYRIGHT
+
+This file, INSTALL, contains installation instructions and other
+details for adns. It is
+ Copyright (C) 1997-2000 Ian Jackson <ijackson@chiark.greenend.org.uk>
+
+adns is
+ Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ Copyright (C) 2014 Mark Wooding
+ Copyright (C) 1999-2000,2003,2006 Tony Finch <dot@dotat.at> [1]
+ Copyright (C) 1991 Massachusetts Institute of Technology [2]
+
+adns is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with adns as the file COPYING; if not, email me at the address
+above or write to the Free Software Foundation.
+
+[1] Tony Finch holds the original copyright on client/adnslogres.c,
+ client/adnsheloex.c and client/fanftest.c, and some modifications
+ to those files.
+[2] MIT hold the original copyright on the included install-sh,
+ which came via GNU autoconf.
+
+
+# Local variables:
+# mode: text
+# End:
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..68146ba
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,93 @@
+# Makefile[.in] - top-level Makefile
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+include ./common.make
+
+# Remember to change ADNS_VERSION_STRING in client/client.h too, and
+# possibly library soname (MAJOR and MINOR in common.make.in).
+DISTVERSION= 1.5.0~rc1
+
+srcdir= @srcdir@
+VPATH= @srcdir@
+
+ENABLE_DYNAMIC= @ENABLE_DYNAMIC@
+ifeq ($(ENABLE_DYNAMIC),elf)
+SUBDIRS_DYNAMIC=dynamic
+else
+SUBDIRS_DYNAMIC=
+endif
+
+WEBDIR=web
+
+SUBDIRS= src $(SUBDIRS_DYNAMIC) client regress
+
+all install uninstall clean distclean mostlyclean maintainer-clean distprep:
+ set -e; for d in $(SUBDIRS); do $(MAKE) -C $$d $@; done
+ $(MAKE) $@-here
+
+all-here install-here uninstall-here distprep-here: README
+
+clean-here mostlyclean-here:
+ rm -f *~ ./#*# core *.orig *.rej adns-*.tar.gz
+ rm -rf dist_tmp web adnshost.txt
+
+distclean-here maintainer-clean-here: clean-here
+ rm -f settings.make common.make
+ rm -f config.cache config.log config.status Makefile
+
+install-strip:
+ $(MAKE) INSTALL_PROGRAM_FLAGS=-s
+
+dist_tmp=dist_tmp/adns-$(DISTVERSION)
+dist: distprep
+ rm -rf dist_tmp*
+ mkdir dist_tmp $(dist_tmp)
+ find \( -name .git -o -name dist_tmp* \) -prune -o -type d -print | \
+ sed -e 's#.*#mkdir -p $(dist_tmp)/&#' | sh
+ find \( -name .git -o -name dist_tmp* \) -prune -o -type f -print | \
+ sed -e 's#.*#ln & $(dist_tmp)/&#' | sh
+ $(MAKE) -C dist_tmp/adns-$(DISTVERSION) distclean
+ cd dist_tmp && tar cf ../$(dist_tmp).tar `basename $(dist_tmp)`
+ gzip -9 $(dist_tmp).tar
+ mv $(dist_tmp).tar.gz .
+
+adnshost.txt: all
+ client/adnshost_s --help >$@.tmp && mv -f $@.tmp $@
+
+web-install: adnshost.txt
+ test -e $(WEBDIR) || mkdir $(WEBDIR)
+ $(INSTALL_DATA) $(srcdir)/README.html $(WEBDIR)/
+ $(INSTALL_DATA) $(srcdir)/src/adns.h $(WEBDIR)/adns.h.txt
+ $(INSTALL_DATA) COPYING $(WEBDIR)/COPYING.txt
+ $(INSTALL_DATA) adnshost.txt $(WEBDIR)/
+
+check: all
+ $(MAKE) -C regress check
+
+README: README.html
+ lynx -dump -number_links -cfg=/dev/null $(srcdir)/README.html >README.tmp
+ mv -f README.tmp $(srcdir)/README
+
+TAGS info dvi:
+ # do nothing
+
+.PHONY: install #people with case-insensitive filesystems lose otherwise!
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..541cc02
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,70 @@
+Changes in adns 1.5.0, since adns 1.4, are:
+
+ New features:
+
+ * This release provides full IPv6 support. Applications can request
+ AAAA records (containing IPv6 addresses) as well as, or instead of,
+ A records (containing IPv4 addresses). adns 1.5 can speak to
+ nameservers over IPv6.
+
+ * adns_addr2text and adns_text2addr: Convenient C functions for
+ converting between addresses and address literals. These carry
+ less baggage than getaddrinfo and getnameinfo.
+
+ Bugfixes:
+
+ * We fix a crashing bug in adnslogres. (Debian#392102.)
+
+ * Previously, parsing of some adns_specific options in resolv.conf
+ would go awry if multiple options were specified on the same line.
+ (Fixed since 1.5.0~rc0.)
+
+ * adns now knows to ignore more things in resolv.conf, rather than
+ warn about them, and there's also an option to disable all of these
+ warnings. (Debian#411263.) (Fixed since 1.5.0~rc0.)
+
+ * Previously, some harmless but wrong owner names for checked ptr
+ queries would be accepted; now they are rejected with `Domain
+ invalid for particular DNS query type'.
+
+ Other:
+
+ * There are some minor API/ABI changes and improvements, for future
+ proofing.
+
+ * There are also some build system, test suite and coding style
+ improvements.
+
+ * Licence is now GPLv3.
+
+Compatibility:
+
+ adns 1.5 is fully forwards API- and ABI-compatible with 1.4.
+
+ adns 1.5 is not backwards ABI-compatible, in the sense that
+ applications built against adns 1.5 but run with adns 1.4 may
+ experience `Function not implemented' errors, or `symbol lookup
+ error' due to undefined symbols. But applications built against 1.4
+ will not experience data corruption due to ABI mismatches.
+
+ adns_r_addr queries (general `address' queries where the application
+ does not specify the kind of address) used to only return AF_INET
+ (IPv4) addresses. To avoid surprising existing applications,
+ AF_INET6 (IPv6) addresses will be returned only if the application
+ explicitly states its support for handling a mixture of address
+ families in the results from adns_r_addr. In a future version of
+ adns this will become the default.
+
+ adnshost and the other command-line utilities are fully forward- and
+ backward-compatible, except that in adns 1.5, adnshost will return
+ IPv6 as well as IPv4 information if simply asked for `addresses'.
+ Calling programs which did not ask for a specific address type ought
+ to cope with this.
+
+ The API in 1.5.0 also fixes a technical nonconformance to the C
+ specification. On platforms where an `enum' type might be an
+ integer type whose size is bits is not a power of two, there could
+ be an incompatible ABI change between 1.4 and 1.5 - but we don't
+ think there are many (if any) such platforms which are sufficiently
+ POSIX-like for adns. (Changed since 1.5.0~rc0.)
+
diff --git a/README b/README
new file mode 100644
index 0000000..b5ba96d
--- /dev/null
+++ b/README
@@ -0,0 +1,170 @@
+ GNU adns
+
+ Advanced, easy to use, asynchronous-capable DNS client library and
+ utilities.
+
+ adns is a resolver library for C (and C++) programs, and a collection
+ of useful DNS resolver utilities.
+
+C library
+
+ In contrast with the standard interfaces, gethostbyname et al and
+ libresolv, it has the following features:
+ * It is reasonably easy to use for simple programs which just want to
+ translate names to addresses, look up MX records, etc.
+ * It can be used in an asynchronous, non-blocking, manner. Many
+ queries can be handled simultaneously.
+ * Responses are decoded automatically into a natural representation
+ for a C program - there is no need to deal with DNS packet and
+ RRDATA formats.
+ * Sanity checking (eg, name syntax checking, reverse/forward
+ correspondence, CNAME pointing to CNAME) is performed automatically
+ by default.
+ * Time-to-live, CNAME and other similar information is returned in an
+ easy-to-use form, without getting in the way.
+ * There is no global state in the library; resolver state is an
+ opaque data structure which the client creates explicitly. A
+ program can have several instances of the resolver.
+ * Errors are reported to the application in a way that distinguishes
+ the various causes of failure properly.
+ * adns understands conventional resolv.conf, but this can overridden
+ by environment variables.
+ * Flexibility. For example, the application can tell adns to: ignore
+ environment variables (for setuid programs), disable hostname
+ syntax sanity checks to return arbitrary data, override or ignore
+ resolv.conf in favour of supplied configuration, etc.
+ * Believed to be correct ! For example, will correctly back off to
+ TCP in case of long replies or queries, or to other nameservers if
+ several are available. It has sensible handling of bad responses
+ etc.
+
+DNS utility programs
+
+ adns also comes with a number of utility programs for use from the
+ command line and in scripts:
+ * adnslogres is a much faster version of Apache's logresolv program.
+ * adnsresfilter is a filter which copies its input to its output,
+ replacing IP addresses by the corresponding names, without unduly
+ delaying the output. For example, you can usefully pipe the output
+ of netstat -n, tcpdump -ln, and the like, into it.
+ * adnshost is a general-purpose DNS lookup utility which can be used
+ easily in from the command line and from shell scripts to do simple
+ lookups. In a more advanced mode it can be used as a
+ general-purpose DNS helper program for scripting languages which
+ can invoke and communicate with subprocesses. See the [1]adnshost
+ usage message for a summary of its capabilities.
+
+Documentation
+
+ I'm afraid there is no manual yet. However, competent C programmers
+ should be able to use the library based on the [2]commented adns.h
+ header file, and the usage messages for the programs should be
+ sufficient.
+
+Feedback
+
+ I'd be pleased if you would let me know if you're using my library in
+ your project, and what you think of it.
+
+ Bug reports should be reported to the [3]GNU Debbugs. Send an email to
+ submit@debbugs.gnu.org and at the top of your email, in a paragraph of
+ its own, write the single line
+Package: adns
+
+ Your bug report will be published via to the adns-discuss list.
+
+ Feedback and discussion takes place on the adns-discuss list. You can
+ mail me privately at ijackson@chiark.greenend.org.uk.
+
+Mailinglists
+
+ I have set up mailinglists adns-announce and adns-discuss. The
+ announcements list is moderated and will contain only announcements of
+ important bugs, new versions, etc.
+
+ There are [4]archives and subscription web pages, or you can subscribe
+ by sending mail containing the word `subscribe' to
+ adns-announce-REQUEST@chiark.greenend.org.uk or
+ adns-discuss-REQUEST@chiark.greenend.org.uk.
+
+Documentation
+
+ * [5]adns.h API header file with documentation comments
+ * [6]usage message for adnshost
+
+Download and source code
+
+ * The [7]current release as a gzipped tarfile.
+ * [8]Previous versions and other files (including OpenPGP
+ signatures).
+ * [9]master git (version control) repository browser.
+
+ adns is also available from the [10]GNU Project FTP servers and their
+ [11]mirrors.
+
+Installation note
+
+ adns requires a real nameserver like BIND running on the same system or
+ a nearby one, which must be willing to provide `recursive service'.
+ I.e., adns is a `stub resolver'.
+
+ adns requires that your real nameserver is on the same machine, or
+ connected via a secure network, so that an attacker cannot fake the
+ replies to adns's queries.
+
+References and related projects
+
+ * [12]Python bindings by Andy Dustman.
+ * [13]liboop event loop library has a built-in binding for adns.
+ * [14]port to MS Visual Studio 6 C++ by Jarle Aase.
+
+Copyright and licensing
+
+ adns is Copyright 1997-2000,2003,2006,2014 Ian Jackson, Copyright 2014
+ Mark Wooding, Copyright 1999-2000,2003,2006 Tony Finch, and Copyright
+ (C) 1991 Massachusetts Institute of Technology.
+
+ adns is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ This program and documentation is distributed in the hope that it will
+ be useful, but without any warranty; without even the implied warranty
+ of merchantability or fitness for a particular purpose. See the [15]GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with adns, or one should be available above; if not, write to the
+ [16]Free Software Foundation or email ijackson@chiark.greenend.org.uk.
+ __________________________________________________________________
+
+ Ian Jackson / ijackson@chiark.greenend.org.uk.
+
+ [17]GNU home page; [18]chiark home page; [19]site or mirror home page
+
+ This web page is Copyright (C)1996-2005,2014 Ian Jackson. See the
+ [20]Copyright/acknowledgements.
+
+References
+
+ 1. http://www.chiark.greenend.org.uk/~ian/adns/docs/adnshost.txt
+ 2. http://www.chiark.greenend.org.uk/~ian/adns/docs/adns.h.txt
+ 3. http://debbugs.gnu.org/
+ 4. http://www.chiark.greenend.org.uk/mailman/listinfo
+ 5. http://www.chiark.greenend.org.uk/~ian/adns/docs/adns.h.txt
+ 6. http://www.chiark.greenend.org.uk/~ian/adns/docs/adnshost.txt
+ 7. http://www.chiark.greenend.org.uk/~ian/adns/adns.tar.gz
+ 8. http://www.chiark.greenend.org.uk/~ian/adns/ftp/
+ 9. http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git/adns.git/
+ 10. http://www.gnu.org/
+ 11. http://www.gnu.org/order/ftp.html
+ 12. http://code.google.com/p/adns-python
+ 13. http://www.lysator.liu.se/liboop/
+ 14. http://adns.jgaa.com/
+ 15. http://www.chiark.greenend.org.uk/~ian/adns/docs/COPYING.txt
+ 16. http://www.fsf.org/
+ 17. http://www.gnu.org/
+ 18. http://www.chiark.greenend.org.uk/
+ 19. file://localhost/
+ 20. http://www.chiark.greenend.org.uk/~ian/sw-www-copy.html
diff --git a/README.html b/README.html
new file mode 100644
index 0000000..3d7c06e
--- /dev/null
+++ b/README.html
@@ -0,0 +1,232 @@
+<html><head><title>adns - advanced, alternative, asynchronous resolver</title>
+<link rev="made" href="mailto:adns-maint@chiark.greenend.org.uk">
+<meta name="keywords" content="adns">
+</head>
+<body>
+<h1>GNU adns</h1>
+
+<strong>Advanced, easy to use, asynchronous-capable DNS client
+library and utilities.</strong>
+
+<!-- Note: this file must contain portable HTML ! -->
+<!-- -->
+<!-- It is served on the GNU site and also from my own system, -->
+<!-- under the URL http://www.chiark.greenend.org.uk/adns/ -->
+<!-- Please ensure that all links continine to be correct -->
+<!-- both for www.gnu.org and chiark. -->
+<!-- -->
+
+<p>
+
+adns is a resolver library for C (and C++) programs, and a collection
+of useful DNS resolver utilities.
+
+
+<h2>C library</h2>
+
+In contrast with the standard interfaces, gethostbyname et al and
+libresolv, it has the following features:
+
+<ul>
+
+<li>It is reasonably easy to use for simple programs which just want
+to translate names to addresses, look up MX records, etc.
+
+<li>It can be used in an asynchronous, non-blocking, manner. Many
+queries can be handled simultaneously.
+
+<li>Responses are decoded automatically into a natural representation
+for a C program - there is no need to deal with DNS packet and RRDATA
+formats.
+
+<li>Sanity checking (eg, name syntax checking, reverse/forward
+correspondence, CNAME pointing to CNAME) is performed automatically
+by default.
+
+<li>Time-to-live, CNAME and other similar information is returned in
+an easy-to-use form, without getting in the way.
+
+<li>There is no global state in the library; resolver state is an
+opaque data structure which the client creates explicitly. A program
+can have several instances of the resolver.
+
+<li>Errors are reported to the application in a way that distinguishes
+the various causes of failure properly.
+
+<li>adns understands conventional resolv.conf, but this can overridden
+by environment variables.
+
+<li>Flexibility. For example, the application can tell adns to:
+ignore environment variables (for setuid programs), disable hostname
+syntax sanity checks to return arbitrary data, override or ignore
+resolv.conf in favour of supplied configuration, etc.
+
+<li>Believed to be correct ! For example, will correctly back off to
+TCP in case of long replies or queries, or to other nameservers if
+several are available. It has sensible handling of bad responses etc.
+
+</ul>
+
+<h2>DNS utility programs</h2>
+
+adns also comes with a number of utility programs for use from the
+command line and in scripts:
+
+<ul>
+
+<li><code>adnslogres</code> is a much faster version of Apache's
+logresolv program.
+
+<li><code>adnsresfilter</code> is a filter which copies its input to
+its output, replacing IP addresses by the corresponding names, without
+unduly delaying the output. For example, you can usefully pipe the
+output of netstat -n, tcpdump -ln, and the like, into it.
+
+<li><code>adnshost</code> is a general-purpose DNS lookup utility
+which can be used easily in from the command line and from shell
+scripts to do simple lookups. In a more advanced mode it can be used
+as a general-purpose DNS helper program for scripting languages which
+can invoke and communicate with subprocesses. See the
+<A href="http://www.chiark.greenend.org.uk/~ian/adns/docs/adnshost.txt">adnshost
+usage message</A> for a summary of its capabilities.
+
+</ul>
+
+<h2>Documentation</h2>
+
+I'm afraid there is no manual yet. However, competent C programmers
+should be able to use the library based on the
+<A href="http://www.chiark.greenend.org.uk/~ian/adns/docs/adns.h.txt">commented
+adns.h header file</A>, and the usage messages for the programs should
+be sufficient.
+
+<h2>Feedback</h2>
+
+I'd be pleased if you would let me know if you're using my library in
+your project, and what you think of it.
+
+<p>
+
+Bug reports should be reported to the
+<a href="http://debbugs.gnu.org/">GNU Debbugs</a>. Send an email
+to <code>submit@debbugs.gnu.org</code> and at the top of your email,
+in a paragraph of its own, write the single line
+<pre>
+Package: adns
+</pre>
+Your bug report will be published via to the adns-discuss list.
+
+<p>
+
+Feedback and discussion takes place on the <code>adns-discuss</code>
+list. You can mail me privately
+at <code>ijackson@chiark.greenend.org.uk</code>.
+
+<h2>Mailinglists</h2>
+
+I have set up mailinglists <code>adns-announce</code> and
+<code>adns-discuss</code>. The announcements list is moderated and
+will contain only announcements of important bugs, new versions, etc.
+
+<p>
+
+There are
+<A href="http://www.chiark.greenend.org.uk/mailman/listinfo">archives
+and subscription web pages</A>, or you can subscribe by sending mail
+containing the word `subscribe' to
+<code>adns-announce-REQUEST@chiark.greenend.org.uk</code> or
+<code>adns-discuss-REQUEST@chiark.greenend.org.uk</code>.
+
+<h2>Documentation</h2>
+
+<ul>
+<li><A href="http://www.chiark.greenend.org.uk/~ian/adns/docs/adns.h.txt">adns.h
+ API header file with documentation comments</A>
+<li><A href="http://www.chiark.greenend.org.uk/~ian/adns/docs/adnshost.txt">usage
+ message for adnshost</A>
+</ul>
+
+<h2>Download and source code</h2>
+
+<ul>
+<li>The <A href="http://www.chiark.greenend.org.uk/~ian/adns/adns.tar.gz">current
+ release</A> as a gzipped tarfile.
+<li><A href="http://www.chiark.greenend.org.uk/~ian/adns/ftp/">Previous
+ versions</A> and other files (including OpenPGP signatures).
+<li><A href="http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git/adns.git/">master
+ git (version control) repository browser</a>.
+</ul>
+
+adns is also available from the
+<A href="http://www.gnu.org/">GNU Project</A> FTP servers and their
+<A href="http://www.gnu.org/order/ftp.html">mirrors</A>.
+
+<h2>Installation note</h2>
+
+adns requires a real nameserver like BIND running on the same system
+or a nearby one, which must be willing to provide `recursive service'.
+I.e., adns is a `stub resolver'.
+
+<p>
+adns requires that your real nameserver is on the same machine, or
+connected via a secure network, so that an attacker cannot fake the
+replies to adns's queries.
+
+<h2>References and related projects</h2>
+
+<ul>
+<li><a href="http://code.google.com/p/adns-python">Python bindings</a>
+ by Andy Dustman.
+<!-- <li><a href="http://cryp.to/hsdns/">Haskell bindings</a>
+ by Peter Simons. -->
+<li><a href="http://www.lysator.liu.se/liboop/">liboop event loop library</a>
+ has a built-in binding for adns.
+<li><a href="http://adns.jgaa.com/">port to MS Visual Studio 6 C++</a>
+ by Jarle Aase.
+</ul>
+
+<h2>Copyright and licensing</h2>
+
+<kbd>adns</kbd> is Copyright 1997-2000,2003,2006,2014 Ian Jackson,
+Copyright 2014 Mark Wooding, Copyright 1999-2000,2003,2006 Tony Finch,
+and Copyright (C) 1991 Massachusetts Institute of Technology.
+
+<p>
+
+<kbd>adns</kbd> is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3 of the License, or (at
+your option) any later version.
+
+<p>
+
+This program and documentation is distributed in the hope that it will
+be useful, but <em>without any warranty</em>; without even the implied
+warranty of <em>merchantability</em> or <em>fitness for a particular
+purpose</em>. See the
+<A href="http://www.chiark.greenend.org.uk/~ian/adns/docs/COPYING.txt">GNU
+General Public License</A> for more details.
+
+<p>
+
+You should have received a copy of the GNU General Public License
+along with <kbd>adns</kbd>, or one should be available above; if not,
+write to the <A href="http://www.fsf.org/">Free Software Foundation</A>
+or email <code>ijackson@chiark.greenend.org.uk</code>.
+
+<p>
+
+<hr>
+Ian Jackson / <tt>ijackson@chiark.greenend.org.uk</tt>.
+<p>
+
+<A href="http://www.gnu.org/">GNU home page</A>;
+<A href="http://www.chiark.greenend.org.uk/">chiark home page</A>;
+<A href="/">site or mirror home page</A>
+<p>
+
+This web page is Copyright (C)1996-2005,2014 Ian Jackson. See the
+<A href="http://www.chiark.greenend.org.uk/~ian/sw-www-copy.html">Copyright/acknowledgements</A>.
+
+</body>
+</html>
diff --git a/RELEASE-CHECKLIST b/RELEASE-CHECKLIST
new file mode 100755
index 0000000..d2fb527
--- /dev/null
+++ b/RELEASE-CHECKLIST
@@ -0,0 +1,94 @@
+#!/bin/bash
+# This is for the benefit of the upstream maintainers of GNU adns
+#
+# * Maybe rerun autoconf
+# * Ensure changelog reflects changes
+# * Ensure NEWS reflects changes
+# * Maybe update MAJOR and/or MINOR in common.make.in
+# * Update DISTVERSION in Makefile.in
+# * Update ADNS_VERSION_STRING in client/client.h
+#
+# * Run this script
+# ./RELEASE-CHECKLIST [--real] <version>
+#
+# * On chiark, maybe, replace ~ian/public-html/adns/current
+# with symlink to web-$(version) (as directed by script)
+#
+# * Send release announcement (use last one as template)
+#
+# * Update DISTVERSION, ADNS_VERSION_STRING and start new changelog entry
+
+set -e
+
+fail () { echo >&2 "$0: $*"; exit 16; }
+
+real=false
+if [ "x$1" = x--real ]; then
+ real=true; shift
+fi
+
+if [ $# != 1 ]; then fail "wrong # arguments"; fi
+wantversion="$1"
+
+version=`sed -n <Makefile.in 's/^DISTVERSION=[ ]*//p'`
+
+if [ "x$version" != "x$wantversion" ]; then
+ fail "you say version $wantversion but tree is $version"
+fi
+
+gpgkey='-u 0x48B50D39'
+chiark=chiark:/u/ian/public-html/adns
+chiarkftp=$chiark/ftp
+
+x () { echo "----- $* -----"; "$@"; }
+wx () { if $real; then x "$@"; else echo "WOULD: $*"; fi; }
+
+x git clean -xdff
+x ./configure
+x make -j4
+x make check
+x make dist
+rm -rf web
+x make web-install
+
+distdir=adns-$version
+distfile=$distdir.tar.gz
+x test -f $distfile
+
+rm -rf dist_tmp
+mkdir dist_tmp
+cd dist_tmp
+tar axf ../$distfile
+cd $distdir
+git init --quiet
+git fetch --quiet ../.. HEAD
+git add .
+git commit --quiet -m T
+git diff --exit-code FETCH_HEAD
+cd ../..
+
+tag=adns-${version//\~/-}
+webout=docs-$version
+
+wx gpg --detach-sign $distfile
+wx git tag -s $gpgkey -m "adns release $version" $tag
+wx git push origin $tag~0:master $tag
+
+distfiles="$distfile $distfile.sig"
+wx rsync -vP $distfiles $chiarkftp/
+
+wx rsync -rvP web/. $chiark/$webout
+
+wx sha256sum $distfiles
+
+if ! $real; then echo "NOT REAL"; exit 0; fi
+
+cat <<END
+
+TO UPDATE WEB PAGE DOCS:
+ ssh ${chiark%%:*}
+ cd ${chiark#*:}
+ rm -f docs.tmp
+ ln -s $webout docs.tmp
+ mv -Tf docs.tmp docs
+END
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..596ce28
--- /dev/null
+++ b/TODO
@@ -0,0 +1,14 @@
+WISHLIST:
+* Make timeouts configurable.
+* `fake' reverse queries (give nnn.nnn.nnn.nnn either always or on error)
+* `fake' forward queries (allow nnn.nnn.nnn.nnn -> A)
+* DNSSEC compatibility - be able to retreive KEY and SIG RRs
+* DNSSEC minimum functionality - ignore Additional when AD set.
+* IPv6 name<->address translation - but which version ??
+* IPv6 transport.
+* Threadsafe version/mode.
+* Caching in the library.
+* Make port configurable in config file.
+* `Nameserver sent bad response' should produce a hexdump in the log
+ (see eg mail to ian@davenant Mon, 25 Oct 2004 14:19:46 +0100 re
+ `compressed datagram contains loop')
diff --git a/acconfig.h b/acconfig.h
new file mode 100644
index 0000000..af61b7d
--- /dev/null
+++ b/acconfig.h
@@ -0,0 +1,115 @@
+/*
+ * acconfig.h
+ * input file for autoheader/autoconf/configure: extra stuff for config.h
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+/* Define if inline functions a la GCC are available. */
+#undef HAVE_INLINE
+
+/* Define if function attributes a la GCC 2.5 and higher are available. */
+#undef HAVE_GNUC25_ATTRIB
+
+/* Define if constant functions a la GCC 2.5 and higher are available. */
+#undef HAVE_GNUC25_CONST
+
+/* Define if nonreturning functions a la GCC 2.5 and higher are available. */
+#undef HAVE_GNUC25_NORETURN
+
+/* Define if printf-format argument lists a la GCC are available. */
+#undef HAVE_GNUC25_PRINTFFORMAT
+
+/* Define if we want to include rpc/types.h. Crap BSDs put INADDR_LOOPBACK there. */
+#undef HAVEUSE_RPCTYPES_H
+
+@BOTTOM@
+
+/* Use the definitions: */
+
+#ifndef HAVE_INLINE
+#define inline
+#endif
+
+#ifdef HAVE_POLL
+#include <sys/poll.h>
+#else
+/* kludge it up */
+struct pollfd { int fd; short events; short revents; };
+#define POLLIN 1
+#define POLLPRI 2
+#define POLLOUT 4
+#endif
+
+/* GNU C attributes. */
+#ifndef FUNCATTR
+#ifdef HAVE_GNUC25_ATTRIB
+#define FUNCATTR(x) __attribute__(x)
+#else
+#define FUNCATTR(x)
+#endif
+#endif
+
+/* GNU C printf formats, or null. */
+#ifndef ATTRPRINTF
+#ifdef HAVE_GNUC25_PRINTFFORMAT
+#define ATTRPRINTF(si,tc) format(printf,si,tc)
+#else
+#define ATTRPRINTF(si,tc)
+#endif
+#endif
+#ifndef PRINTFFORMAT
+#define PRINTFFORMAT(si,tc) FUNCATTR((ATTRPRINTF(si,tc)))
+#endif
+
+/* GNU C nonreturning functions, or null. */
+#ifndef ATTRNORETURN
+#ifdef HAVE_GNUC25_NORETURN
+#define ATTRNORETURN noreturn
+#else
+#define ATTRNORETURN
+#endif
+#endif
+#ifndef NONRETURNING
+#define NONRETURNING FUNCATTR((ATTRNORETURN))
+#endif
+
+/* Combination of both the above. */
+#ifndef NONRETURNPRINTFFORMAT
+#define NONRETURNPRINTFFORMAT(si,tc) FUNCATTR((ATTRPRINTF(si,tc),ATTRNORETURN))
+#endif
+
+/* GNU C constant functions, or null. */
+#ifndef ATTRCONST
+#ifdef HAVE_GNUC25_CONST
+#define ATTRCONST const
+#else
+#define ATTRCONST
+#endif
+#endif
+#ifndef CONSTANT
+#define CONSTANT FUNCATTR((ATTRCONST))
+#endif
+
+#ifdef HAVEUSE_RPCTYPES_H
+#include <rpc/types.h>
+#endif
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..12b3b56
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,67 @@
+# aclocal.m4 - package-specific macros for autoconf
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+dnl DPKG_CACHED_TRY_COMPILE(<description>,<cachevar>,<include>,<program>,<ifyes>,<ifno>)
+define(DPKG_CACHED_TRY_COMPILE,[
+ AC_MSG_CHECKING($1)
+ AC_CACHE_VAL($2,[
+ AC_TRY_COMPILE([$3],[$4],[$2=yes],[$2=no])
+ ])
+ if test "x$$2" = xyes; then
+ true
+ $5
+ else
+ true
+ $6
+ fi
+])
+
+define(ADNS_C_GCCATTRIB,[
+ DPKG_CACHED_TRY_COMPILE(__attribute__((,,)),adns_cv_c_attribute_supported,,
+ [extern int testfunction(int x) __attribute__((,,))],
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_GNUC25_ATTRIB)
+ DPKG_CACHED_TRY_COMPILE(__attribute__((noreturn)),adns_cv_c_attribute_noreturn,,
+ [extern int testfunction(int x) __attribute__((noreturn))],
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_GNUC25_NORETURN),
+ AC_MSG_RESULT(no))
+ DPKG_CACHED_TRY_COMPILE(__attribute__((const)),adns_cv_c_attribute_const,,
+ [extern int testfunction(int x) __attribute__((const))],
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_GNUC25_CONST),
+ AC_MSG_RESULT(no))
+ DPKG_CACHED_TRY_COMPILE(__attribute__((format...)),adns_cv_attribute_format,,
+ [extern int testfunction(char *y, ...) __attribute__((format(printf,1,2)))],
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_GNUC25_PRINTFFORMAT),
+ AC_MSG_RESULT(no)),
+ AC_MSG_RESULT(no))
+])
+
+define(ADNS_C_GETFUNC,[
+ AC_CHECK_FUNC([$1],,[
+ AC_CHECK_LIB([$2],[$1],[$3],[
+ AC_MSG_ERROR([cannot find library function $1])
+ ])
+ ])
+])
diff --git a/changelog b/changelog
new file mode 100644
index 0000000..3a6f1be
--- /dev/null
+++ b/changelog
@@ -0,0 +1,450 @@
+adns (1.5.0~rc1) UPSTREAM; urgency=low
+
+ ABI/API changes:
+ * Provide adns_qf_cname_strict flag, currently ignored because it's the
+ default. This will allow us to make this not the default in the future
+ while retaining forward and backward API and ABI compatibility.
+ * Add `sizeforce' enum member value to force enum types in the APIs to be
+ big (which will avoids theoretical future ABI-incompatibility).
+ * Reject unknown flags passed by our caller. This will make it ABI-safe
+ (although not ABI-backward-compatible) to add new flags in the future,
+ as newer clients running against this old library will get ENOSYS.
+
+ resolv.conf parsing:
+ * Support `adns_ignoreunkcfg' resolv.conf option to ignore unknown
+ options and keywords in resolv.conf.
+ * Ignore various BIND9 resolv.conf keywords and options.
+ * Fix resolv.conf option word splitting.
+
+ Tests, build system, coding style, etc.:
+ * Test cases show rrtype flag values in hex.
+ * Parallelise `make check'.
+ * Make vbuf__append_quoted1035 no longer extern (there are no out-of-file
+ callers).
+ * Remove all RCSids.
+ * When releasing, check that the `make dist' tarball is identical to git.
+ And provide a test mode for the RELEASE-CHECKLIST doc/script.
+ * Add `make dist' tarball signature to .gitignore.
+ * More correctly and effectively work around bugs in make (Debian #4073,
+ #756123) affecting regress.
+
+ -- Ian Jackson <ijackson@chiark.greenend.org.uk> Sun, 26 Oct 2014 13:24:00 +0000
+
+adns (1.5.0~rc0) UPSTREAM; urgency=low
+
+ New features:
+ * Support for queries about IPv6 data in all applicable adns
+ query types (including AAAA, PTR, and adns_r_addr queries).
+ (Thanks very much to Mark Wooding.)
+ * Support for transport over IPv6. (Thanks to Mark Wooding again.)
+ * adns_addr2text and adns_text2addr: Convenient functions for
+ converting between addresses and address literals.
+
+ Bugfixes:
+ * Fix a crashing bug in adnslogres. (Debian#392102.)
+ * Do all checks of checked PTR owner name before actually sending the
+ query, and reject IPv4 PTR owner names whose labels have leading zero
+ digits or values >255.
+
+ Build system fixes and improvements:
+ * `make clean' removes the pipes.
+ * Work around bugs in make (Debian #4073, #756123) affecting regress.
+ * Do not include Makefile and src/config.h in distribution tarball.
+
+ Regression test debugging improvements:
+ * Provide gdbwrap convenience script.
+ * Honour ADNS_TEST_DEBUG env. var. (Mark Wooding.)
+
+ Other improvements:
+ * Licence changed to GPLv3 (still LGPLv2 for adns.h).
+ * Source code cleanups. (Some from Mark Wooding.)
+ * Now in git.
+ * Documentation and webpage updates.
+
+ -- Ian Jackson <ijackson@chiark.greenend.org.uk> Mon, 20 Oct 2014 01:29:50 +0100
+
+adns (1.4); urgency=low
+
+ Improvements for multithreaded programs:
+ * New documentation comment in adns.h explaining thread guarantees
+ (or lack of them), replaces `single-threaded' note at the top.
+ * Fix string conversion of adns_r_addr not to use a static buffer
+ (function csp_addr) so as to make thread promise true.
+ * Make an internal variable const-correct (expectdomain in pa_ptr).
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Tue, 17 Oct 2006 17:05:08 +0100
+
+adns (1.3); urgency=low
+
+ Portability fixes:
+ * Cast ptrdiff_t to int for %.*s length in adnsheloex and adnslogres,
+ as is required. (Report from Jim Meyering.)
+ * In configure.in, quote macro name argument to define() to
+ suppress spurious autoconf error. (Report from Mihai Ibanescu.)
+ * Use autoconf's values for {bin,lib,include}dir rather than inventing
+ our own from @exec_prefix@, making configure --libdir work.
+ (Patch from Mihai Ibanescu.)
+ * Remove spurious `_' from {bin,lib,include}dir Makefile variables.
+ (Report from Mihai Ibanescu.)
+ * Do away with `mismatch' variable in parse.c:adns__findrr_anychk so that
+ overzealous GCC cannot complain about members of eo_fls being
+ uninitialised. (Report from Jim Meyering.)
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Tue, 6 Jun 2006 20:22:30 +0100
+
+adns (1.2); urgency=medium
+
+ New features:
+ * Support for SRV RRs.
+ * Support for unknown RR types (according to RFC3597) via adns_r_unknown.
+ * Allow `;'-comments in resolv.conf (report from Colin Charles).
+ * New adnsheloex client courtesy of Tony Finch.
+ * New adns_init_logfn etc. for having logging use a callback function.
+
+ Bugfixes:
+ * Fix error in prototype in definition of adns__parse_domain.
+ * Add missing ENOTSOCK to hcommon.c.m4 (was already in hcommon.c!)
+
+ Portability fixes prompted by Bernd Eckenfels, the Debian maintainer:
+ * Correct type of various printf arguments: ptrdiff_t != int.
+ * Do not print size of leaked blocks of memory (this causes
+ a spurious regression test failure on some platforms).
+ * Provide adns_if_none and adns_qf_none (which will help with compilers
+ which complain about plain `0' being passed where an enum is wanted).
+ * adnstest converts some errno values to EFOOBAR: all of the ones
+ mentioned in adns.h, at least. This makes the regression test
+ more portable (fixes problem noticed by Bernd Eckenfels).
+ * Add -Wno-pointer-sign if GCC has that option.
+
+ Documentation improvements:
+ * Add documentation comment by definition of adns_r_ptr_raw type enum.
+ * Document in adns.h EINVAL from adns_init meaning bad configuration.
+ * Include several new references to related programs to README.html.
+ * Redacted the TODO list.
+ * New LICENCE.WAIVERS file for GPL-incompatility workarounds.
+ * Clarified GPL-vs-LGPL: a bit less hostile and a bit more mercenary.
+ * Copyright notices updated.
+
+ Packaging changes:
+ * Update MINOR to 2 and DISTVERSION and ADNS_VERSION_STRING to 1.2.
+ * Reran autoconf/autoheader (autoconf Debian 2.13-54).
+ * Create $(bin_dir) and $(lib_dir) on `make install', and also
+ make a libadns.so.1 -> libadns.so.1.<minor> link. (Suggestions
+ and patch from Nix of esperi.org.uk.)
+ * Add .PHONY: install to Makefile, to help people with demented fs's.
+ * Darwin listed in INSTALL.
+
+ Minor test harness improvements:
+ * Hgettimeofday calls Tensurerecordfile (was Tensureinput/outputfile).
+ * Add bind(2) and listen(2) wrappers (for epithet, but harmless in adns).
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Sat, 8 Apr 2006 15:41:28 +0100
+
+adns (1.1); urgency=medium
+
+ Major bugfixes:
+ * Do not spin if connect() fails immediately (!)
+ * Stop searching on a CNAME (even if it's broken).
+ * When search list runs out, _qf_owner sets owner to query domain.
+ * Fix bogus multiple updates to p in transmit.c (!)
+
+ Portability improvements:
+ * Fix up spurious #undef's in hredirect.h.
+ * Don't use <sys/select.h> any more, it was a mistake made in pre-1.0
+ (and there doesn't seem to be much explanation why).
+ * Understand and sort of check OpenBSD `lookup' resolv.conf directive.
+ * #include <stdlib.h> in internal.h (for abort etc).
+ * Always #include <sys/types.h> before <sys/socket.h> (for FreeBSD 4.6).
+
+ Cosmetic and documentation improvements:
+ * Added wishlist entry re configurable port no.
+ * Problem with SERVFAIL in TODO.
+ * README.html: mentioned Jarle Aase's Windows port, and other fixes.
+ * Some better source code formatting/wrapping.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Tue, 1 Jul 2003 22:55:29 +0100
+
+adns (1.0); urgency=medium
+
+ Bugfixes:
+ * Treat 8-bit characters in email addrs as RFC822 `special' (=> quote).
+ * Fix incorrect `compressed datagram contains loop' error.
+ * Actually compile shared libraries by default !
+ * Fix adnsresfilter usage message to include correct default timeout.
+
+ General improvements:
+ * adnshost, adnslogres, adnsresfilter have options for config override.
+ * adnsresfilter has --debug option.
+ * Improvements to adnslogres (incl. new -c option) from Tony Finch.
+ * adnslogres has --help option, all utilities support --version.
+ * Documentation improved somewhat, including new GPL-vs-LGPL file.
+
+ Changes for non-BETA release:
+ * Change shared library soname to 1.0.
+ * Do not install adnstest test utility.
+
+ Regression test improvements:
+ * Tests now include adnshost, adnslogres and adnsresfilter.
+ * Test cancellation both before and after query completion.
+
+ Portability fixes and cleanups:
+ * adnstest: setvbuf(stdout,...) before we do first output.
+ * Cope with compilers that don't do `inline'.
+ * Add and fix various missing system #includes.
+ * Find install-sh properly when we need to use it, and chmod it +x.
+ * Do not use variadic macro, use stdarg instead (adnslogres.c).
+ * Regression tests work even if some syscalls are already macros.
+ * #include "config.h" before "adns.h".
+ * Cast a sizeof(...) in src/event.c to unsigned long before printing.
+ * Add pre-generated versions of m4-generated files in regress/.
+ * Kill bogus warning, adh-main.c: `arg2' might be used uninitialized ...
+ * Add extra {...} near adnslogres.c:167 to kill spurious warning.
+ * Use `printf' instead of `echo -n'.
+ * Add list of tested platforms in INSTALL file.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Sun, 17 Sep 2000 15:15:58 +0100
+
+adns (0.9) BETA; urgency=high
+
+ Bug fixes:
+ * Don't make _processany always kill the TCP connection with the message
+ `TCP connection failed: poll/select: exceptional condition detected'.
+ * Call MEM_ROUND in __transfer_interim (avoids assert fail
+ `qu->interim_allocd>=0' on some platforms eg 64 bit).
+ * adnsresfilter doesn't resolve textual prefixes of addresses (eg,
+ 10.0.0.1 out of 10.0.0.123) if input happens to block at that point.
+ * Do not spin if TCP connection blocks for writing (and add test case).
+ * Fail queries if TCP dies repeatedly, rather than retrying many times.
+ * Do not abort in a couple of places if TCP unexpectedly broken.
+ * Do not free something twice if query fails and is then cancelled.
+
+ Portability/compilation fixes:
+ * Move `extern "C" {' to after #include <...>'s.
+ * Pass LDFLAGS from configure on to ld via settings.make.in.
+ * make clean deletes *.so and *.so.* files.
+ * New --disable-dynamic configure option for non-ELF systems.
+ * Use AC_PROG_INSTALL (=> perhaps install-sh), to avoid bad `install'.
+
+ Minor improvements:
+ * Do not print warning if sendto() gives EAGAIN.
+ * adnsresfilter default timeout changed to 1000ms.
+ * m1test script can invoke `hrecord' differently.
+ * regress/output-<case>.report file contains more useful info.
+ * TODO list and other docs updated slightly.
+ * Referrals with RD+RA set, or RCODE=Refused, don't generate warnings,
+ just debug messages. BIND does this kind of thing all the time.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Wed, 9 Aug 2000 16:59:28 +0100
+
+adns (0.8) BETA; urgency=medium
+
+ Bugfixes:
+ * Race near adns_beforeselect which could cause infinite timeout fixed
+ (it's now less agressive, and will more often return a zero timeout.)
+ * Fixed infrequent race causing assertion failure in adns__tcp_broken
+ `ads->tcpstate == server_connecting || ads->tcpstate == server_ok'.
+ * Spurious `server failure on unidentifiable query' warning suppressed.
+ * If we get a referral, don't also always complain falsely about RD==0.
+ * adnslogres: cast chars to unsigned char before using ctype.h macros.
+ * In _beforeselect, global failure now means zero timeout, and in
+ tcp_events, really never try to do anything with the TCP connection if
+ act is zero. This might possibly cause an infinite delay (ie, lockup)
+ if things go badly wrong *and* a really unlikely race happens.
+ * Test suite `lines of syscall left' value is correct; !0 is failure.
+
+ Portability fixes:
+ * install-sh (from autoconf 2.12 Debian r13) included.
+ * adnslogres: do not call equivalent of printf("%.*s",0,(char*)0).
+
+ Documentation improvements:
+ * Security/performance note added, about local nameservers and DNSSEC.
+ * Documented that adns_rr_info _rr_hostaddr ( ) for address list
+ means permanent failure, and ? means temporary failure.
+ * Typo (*now for now in _beforeselect description) in adns.h fixed.
+ * Copyright notices updated.
+
+ Changes to produce more defensive code:
+ * In adns_wait, assert that the timeout is not infinite.
+ * Make qu->id start out as -2 when initially allocated.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Sun, 7 May 2000 23:37:13 +0100
+
+adns (0.7) BETA; urgency=medium
+
+ * New adns_submit_reverse_any for eg RBL lookups, and corresponding
+ option to adnshost.
+ * README updated (from www home page).
+
+ * In answers, quote all except alphanums and - _ / + (and document).
+ * Don't reject specials in cnames even without adns_qf_quotefail_cname.
+ * Better checking of long domain names and labels in queries.
+ * answer->owner may be null on error. Documented, and adnshost copes.
+ * Better reporting of unexpected or weird replies from nameserver.
+ * Add test case for recursion (infinite loop) domain compression.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Thu, 2 Mar 2000 01:55:53 +0000
+
+adns (0.6) BETA; urgency=high
+
+ Core library bugfixes:
+ * Avoid infinite timeouts, causing lockup, when they should be zero !
+ * TCP handling revamped (avoids undefined behaviour due to reentrancy).
+ * Do not fail assertion if _qf_owner, _qf_search, domain ends in `.'.
+ * Many memory leaks fixed.
+
+ Cool new utility:
+ * adnsresfilter is like `cat' but converts addresses to names without
+ delaying the output. Pipe `netstat -n', `tcpdump -ln', etc. into it.
+
+ Test and client program bug and portability fixes:
+ * Dynamic library building works properly.
+ * adnshost prints somewhat better messages about some wrong usages.
+ * Include <stdlib.h> and <sys/types.h> in adnshost.h.
+ * adnslogres: parsing and error checking improved (Tony Finch).
+ * Regression tests can cope with zero-length reads.
+ * Regression tests check for memory leaks.
+ * adnstest copes with empty query type list.
+ * adnstest uninitialised memory bug fixed.
+
+ General improvements
+ * Better control of adnshost output and error messages (new -F options).
+ * New adns_if_logpid option (functionality suggested by Tony Finch).
+ * New fanftest test program from Tony Finch (ignored by `make install').
+ * Reads /etc/resolv-adns.conf if it exists.
+ * Declare flags parameters as enums again, not ints.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Wed, 24 Nov 1999 17:13:03 +0000
+
+adns (0.5) unstable; urgency=high
+
+ New features:
+ * adnslogres, ~100x faster replacement for Apache logresolve;
+ Thanks to Tony Finch for the program and the performance figure.
+ * Internal consistency checking with assert if right options set.
+ * adns_wait_poll function like adns_wait but uses poll, not select.
+ * adns_reverse_submit function for easy in-addr queries.
+ * adns_errtypeabbrev funcion for getting eg "permfail" from _s_nodata.
+ * adnshost utility for scripts and the like (rather alpha).
+
+ Incompatible changes:
+ * RRs with mailboxes never rejected due to strange chars if _raw.
+ * Lack of a mailbox produces `.' not `<>'.
+ * Better usage messages (and no default query domain) for adnstest.
+ * Return EAGAIN from _check instead of EWOULDBLOCK.
+ * adns_rr_info on _r_mx etc. shows status type abbrev and status number.
+
+ Bugfixes:
+ * Do not invoke __autosys indirectly from __procdgram (result: coredump
+ usually in memmove, unless adns_if_noautosys was used).
+ * Do not scramble innards when a query on the output queue is cancelled.
+ * Do not close tcp socket twice.
+ * Mailboxes containing spaces in their names are quoted.
+ * Give ESRCH, not EAGAIN, if _check called with no queries outstanding.
+ * adns_rr_hostaddr naddrs is -1 on temporary failure (as documented).
+ * Reject TXT RRs with no strings.
+ * Correct error messages for qname CNAME foo, foo CNAME bar.
+ * adns_processany actually does something.
+ * Fixed typos in adns.h.
+
+ General improvements:
+ * Promise not to change fds in adns_beforepoll (if now is specified).
+ * Improved textual error string for _s_prohibitedcname.
+ * New comment in adns_processany and return 0 (not r which is 0).
+ * Documentation of resolv.conf directives and options, and of environment
+ variables understood, in adns.h
+ * Regression test scripts set EF_DISABLE_BANNER (for Electric Fence).
+
+ Portability and build improvements:
+ * Give install the '-c' flag (otherwise some delete the original !).
+ * Do not remove top-level Makefile on `make clean'.
+ * Don't complain so much about poll(2) tests if not available.
+ * Do not give -u 0 -g 0 options to install.
+ * Remove trailing , from some enums in adns.h.
+ * Dynamically linked clients now made with -l, so as to avoid rpath.
+ * Do not use $^ in make rules (should help with non-GNU make).
+ * Declare flags parameters as ints not enums because C++ is crap.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Wed, 13 Oct 1999 02:24:35 +0100
+
+adns (0.4) unstable; urgency=high
+
+ General important bugfixes:
+ * make _qf_owner work if _qf_search not specified, and test it (oops!)
+ * ads->configerrno now initialised (in setup.c).
+ * timercmp(,,<=) doesn't work - use !timercmp(,,>).
+ * Changed memory semantics of internal queries to fix bugs.
+ * Restarting a TCP-using query (eg due to CNAME) doesn't abort.
+
+ Fixes for handling of broken kinds of reply:
+ * Only accept a reply from the subset of servers we sent the query.
+ * Ignore CNAME(s) in answer after RR(s) (and test).
+
+ Other bugfixes and improvements:
+ * adns_s_systemfail is in table of errors (for eg adns_strerror).
+ * Do not ship config.cache, Makefile, etc.
+ * Improvements to install instructions, TODO, etc.
+ * Regression tests compile on systems without poll(2).
+ * Do not install adnstest_s.
+ * _submit returns ENOSYS, not adns_s_unknownquery; documented, tested.
+ * <adns.h> includes <sys/types.h>, <sys/time.h>, <unistd.h>.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Thu, 5 Aug 1999 01:17:38 +0100
+
+adns (0.3) unstable; urgency=low
+
+ Incompatible changes:
+ * Low adns_status values (below adns_s_max_tempfail) renumbered to make
+ room for future locally-induced and locally-detected errors.
+ * Event loop functions for use by select(2) renamed and tidied up.
+
+ Features / improvements:
+ * New adns_errabbrev() for getting status abbreviation strings.
+ * regress/checkall prints summary list of failed tests, if any.
+ * Event loop functions for poll(2), and some raw variants.
+ * adnstest has ability to use poll(2), and user can set initflags.
+ * checkall prints passed list as well as failed list, if any failed.
+ * You can iterate over outstanding queries (but only once at a time).
+
+ Bugfixes:
+ * Non-RFC822 mailbox `domain' formatting now works, and clarified.
+ * Rejection of bad characters in domains (without quoteok) works.
+ * Clean up parents from adns->childw (otherwise would abort/segfault).
+ * In adnstest, allocate enough space for, and terminate, query types.
+ * In adnstest, don't print errno values as adns_status values.
+
+ * Added TODO file.
+ * Made adnstest.c test context pointers.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Thu, 15 Jul 1999 00:23:12 +0100
+
+adns (0.2) experimental; urgency=low
+
+ Portability fixes for compilation on various platforms:
+ * Include <sys/socket.h> and <netinet/in.h> in files with <arpa/inet.h>.
+ * Don't use GCC union assignment feature (.rrs=0 => .rrs.untyped=0).
+ * Explictly cast things to [const] struct sockaddr* in syscall args.
+ * Check whether we need -lsocket.
+ * Include <sys/times.h> in a few more files.
+ * Include <unistd.h> and <sys/time.h> for select.
+ * Look for inet_aton and inet_ntoa (in -lnsl and -lsocket).
+ * LDLIBS removed from dependency lists (some makes don't support this).
+ * An `ambiguous else' warning from some compilers in types.c is removed.
+
+ Other changes:
+ * Added COPYING (copy of the GPL).
+ * Regression test failure output improved.
+ * Missing targets in regress/Makefile.in added.
+ * Regression test doesn't rely on value of fcntl flags eg O_NONBLOCK.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Thu, 20 May 1999 00:27:32 +0100
+
+adns (0.1) experimental; urgency=low
+
+ * Initial public alpha release.
+
+ -- Ian Jackson <ian@davenant.greenend.org.uk> Sat, 17 April 1999 17:42:19
+
+Local variables:
+mode: debian-changelog
+fill-column: 75
+End:
diff --git a/client/Makefile.in b/client/Makefile.in
new file mode 100644
index 0000000..e97259c
--- /dev/null
+++ b/client/Makefile.in
@@ -0,0 +1,82 @@
+# client/Makefile - client program(s) Makefile
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+srcdir= @srcdir@
+VPATH= @srcdir@
+
+PROGS_SYSDEP= @PROGS_HAVE_TSEARCH@
+ENABLE_DYNAMIC= @ENABLE_DYNAMIC@
+
+PROGRAMS= adnslogres adnsheloex adnshost $(PROGS_SYSDEP)
+PROGRAMS_LOCAL= fanftest adnstest addrtext
+PROGRAMS_ALL= $(PROGRAMS) $(PROGRAMS_LOCAL)
+
+STATIC_LIB= ../src/libadns.a
+
+ifeq ($(ENABLE_DYNAMIC),elf)
+DYNAMIC_DEP= ../dynamic/$(SHLIBFILE)
+DYNAMIC_LINK= -L../dynamic -ladns
+DYNAMIC_SUFFIX= _s
+else
+DYNAMIC_DEP= $(STATIC_LIB)
+DYNAMIC_LINK= $(STATIC_LIB)
+DYNAMIC_SUFFIX=
+endif
+
+TARG_INSTALL= $(PROGRAMS)
+TARG_LOCAL= $(addsuffix $(DYNAMIC_SUFFIX), $(PROGRAMS_ALL))
+TARGETS= $(TARG_LOCAL) $(TARG_INSTALL)
+include ../settings.make
+
+ADNSDIR= $(srcdir)/../src
+DIRCFLAGS= -I. -I../src -I$(ADNSDIR)
+
+TARG_OBJS= $(addsuffix .o, $(PROGRAMS_ALL))
+ADH_OBJS= adh-main.o adh-opts.o adh-query.o
+ALL_OBJS= $(ADH_OBJS) $(TARG_OBJS)
+
+
+all: $(TARGETS)
+
+install: $(TARG_INSTALL)
+ mkdir -p $(bindir)
+ set -xe; for f in $(TARG_INSTALL); \
+ do $(INSTALL_PROGRAM) $$f $(bindir)/$$f; done
+
+uninstall:
+ for f in $(TARGETS); do rm -f $(bindir)/$$f; done
+
+adnshost: $(ADH_OBJS) $(DYNAMIC_DEP)
+ $(CC) $(LDFLAGS) $(ADH_OBJS) $(DYNAMIC_LINK) -o $@ $(LDLIBS)
+
+adnshost_s: $(ADH_OBJS) $(STATIC_LIB)
+ $(CC) $(LDFLAGS) $(ADH_OBJS) $(STATIC_LIB) -o $@ $(LDLIBS)
+
+$(ADH_OBJS): adnshost.h
+$(ALL_OBJS): $(ADNSDIR)/adns.h ../src/config.h
+adnsresfilter.o: $(ADNSDIR)/tvarith.h
+
+%: %.o $(DYNAMIC_DEP)
+ $(CC) $(LDFLAGS) $< $(DYNAMIC_LINK) -o $@ $(LDLIBS)
+
+%_s: %.o $(STATIC_LIB)
+ $(CC) $(LDFLAGS) $< $(STATIC_LIB) -o $@ $(LDLIBS)
diff --git a/client/addrtext.c b/client/addrtext.c
new file mode 100644
index 0000000..7cc7111
--- /dev/null
+++ b/client/addrtext.c
@@ -0,0 +1,197 @@
+/*
+ some test cases
+
+
+ ./addrtext_s fe80::1%wlanx
+ ./addrtext_s fe80::1%wlan0
+ ./addrtext_s fe80::1%23
+ ./addrtext_s fe80::1%1
+ ./addrtext_s 2001:ba8:1e3::%wlan0
+ ./addrtext_s 2001:ba8:1e3::%23
+ ./addrtext_s 2001:ba8:1e3::%1 # normally lo
+ ./addrtext_s 127.0.0.1x
+ ./addrtext_s 172.18.45.6
+ ./addrtext_s 12345
+
+
+ */
+
+/*
+ * addrtext.c
+ * - test program for address<->string conversion, not part of the library
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <stdbool.h>
+#include <string.h>
+#include <errno.h>
+#include <inttypes.h>
+
+#include "config.h"
+#include "adns.h"
+
+#define PORT 1234
+
+#define STRING(x) STRING2(x)
+#define STRING2(x) #x
+
+static int fails;
+
+static void hex(const void *data_v, int l) {
+ const uint8_t *data= data_v;
+ int i;
+ for (i=0; i<l; i++)
+ printf("%02x",data[i]);
+}
+
+static void dump(const char *pfx, struct sockaddr *sa, socklen_t salen) {
+ int i;
+ printf(" %s: ",pfx);
+ hex(sa, salen);
+
+ for (i=0; i<salen; i++)
+ printf("%02x",((const uint8_t*)sa)[i]);
+
+ printf(" %d ", sa->sa_family);
+
+ switch (sa->sa_family) {
+ case AF_INET: {
+ const struct sockaddr_in *s = (const void*)sa;
+ printf(".port=%d .addr=%08"PRIx32"",
+ ntohs(s->sin_port),
+ (uint32_t)ntohl(s->sin_addr.s_addr));
+ break;
+ }
+ case AF_INET6: {
+ const struct sockaddr_in6 *s = (const void*)sa;
+ printf(".port=%d .flowinfo=%08"PRIx32" .scope_id=%08"PRIx32" .addr=",
+ ntohs(s->sin6_port),
+ (uint32_t)ntohl(s->sin6_flowinfo),
+ (uint32_t)ntohl(s->sin6_scope_id));
+ hex(&s->sin6_addr, sizeof(s->sin6_addr));
+ break;
+ }
+ }
+ printf("\n");
+}
+
+static void dotest(const char *input) {
+ adns_sockaddr ours;
+ socklen_t socklen;
+ struct addrinfo aip;
+ struct addrinfo *air=0;
+ char ourbuf[ADNS_ADDR2TEXT_BUFLEN];
+ char theirbuf[ADNS_ADDR2TEXT_BUFLEN];
+
+ memset(&ours,0,sizeof(ours));
+
+ socklen= sizeof(ours);
+ int our_r= adns_text2addr(input,PORT,0,&ours.sa,&socklen);
+
+ memset(&aip,0,sizeof(aip));
+ aip.ai_flags= AI_NUMERICHOST|AI_NUMERICSERV;
+ aip.ai_socktype= SOCK_DGRAM;
+ aip.ai_protocol= IPPROTO_UDP;
+ air= 0;
+ int libc_r= getaddrinfo(input,STRING(PORT),&aip,&air);
+ printf("`%s': us %s; libc %s, air=%p",
+ input, strerror(our_r), libc_r ? gai_strerror(libc_r) : "0", air);
+ if (air)
+ printf(" .family=%d .socklen=%ld .addr=%p .next=%p",
+ air->ai_family, (long)air->ai_addrlen, air->ai_addr, air->ai_next);
+ printf(":");
+
+ if (libc_r==EAI_NONAME && !air) {
+ if (strchr(input,'%') && (our_r==ENOSYS || our_r==ENXIO)) {
+ printf(" bad-scope");
+ goto ok;
+ }
+ if (strchr(input,'%') && our_r==ENOSYS) {
+ printf(" bad-scope");
+ goto ok;
+ }
+ if (our_r==EINVAL) {
+ printf(" invalid");
+ goto ok;
+ }
+ }
+ printf(" valid");
+
+#define FAIL do{ printf(" | FAIL\n"); fails++; }while(0)
+#define WANT(x) if (!(x)) { printf(" not %s",STRING(x)); FAIL; return; } else;
+
+ WANT(!our_r);
+ WANT(!libc_r);
+ WANT(air);
+ WANT(air->ai_addr);
+ WANT(!air->ai_next);
+ if (air->ai_addrlen!=socklen || memcmp(&ours,air->ai_addr,socklen)) {
+ printf(" mismatch");
+ FAIL;
+ dump("ours",&ours.sa,socklen);
+ dump("libc",air->ai_addr,air->ai_addrlen);
+ return;
+ }
+
+ printf(" |");
+
+ int ourbuflen= sizeof(ourbuf);
+ int ourport;
+ our_r= adns_addr2text(&ours.sa,0, ourbuf,&ourbuflen, &ourport);
+
+ printf(" us %s",strerror(our_r));
+ if (!our_r)
+ printf(" `%s'",ourbuf);
+
+ size_t theirbuflen= sizeof(theirbuf);
+ libc_r= getnameinfo(&ours.sa,socklen, theirbuf,theirbuflen, 0,0,
+ NI_NUMERICHOST|NI_NUMERICSERV);
+ printf("; libc %s", libc_r ? gai_strerror(libc_r) : "0");
+ if (!libc_r)
+ printf(" `%s'",theirbuf);
+
+ printf(":");
+
+ WANT(!our_r);
+ WANT(!libc_r);
+ WANT(ourport==PORT);
+ if (strcmp(ourbuf,theirbuf)) {
+ printf(" mismatch");
+ FAIL;
+ return;
+ }
+
+ ok:
+ printf(" | PASS\n");
+}
+
+int main(int argc, char **argv) {
+ const char *arg;
+ while ((arg= *++argv)) {
+ dotest(arg);
+ }
+ return !!fails;
+}
diff --git a/client/adh-main.c b/client/adh-main.c
new file mode 100644
index 0000000..c77aa5d
--- /dev/null
+++ b/client/adh-main.c
@@ -0,0 +1,274 @@
+/*
+ * adh-main.c
+ * - useful general-purpose resolver client program
+ * main program and useful subroutines
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include "adnshost.h"
+
+int rcode;
+const char *config_text;
+
+static int used, avail;
+static char *buf;
+
+void quitnow(int rc) {
+ if (ads) adns_finish(ads);
+ free(buf);
+ free(ov_id);
+ exit(rc);
+}
+
+void sysfail(const char *what, int errnoval) {
+ fprintf(stderr,"adnshost failed: %s: %s\n",what,strerror(errnoval));
+ quitnow(10);
+}
+
+void usageerr(const char *fmt, ...) {
+ va_list al;
+ fputs("adnshost usage error: ",stderr);
+ va_start(al,fmt);
+ vfprintf(stderr,fmt,al);
+ va_end(al);
+ putc('\n',stderr);
+ quitnow(11);
+}
+
+void outerr(void) {
+ sysfail("write to stdout",errno);
+}
+
+void *xmalloc(size_t sz) {
+ void *p;
+
+ p= malloc(sz); if (!p) sysfail("malloc",sz);
+ return p;
+}
+
+char *xstrsave(const char *str) {
+ char *p;
+
+ p= xmalloc(strlen(str)+1);
+ strcpy(p,str);
+ return p;
+}
+
+void of_config(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ config_text= arg;
+}
+
+void of_type(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ static const struct typename {
+ adns_rrtype type;
+ const char *desc;
+ } typenames[]= {
+ /* enhanced versions */
+ { adns_r_ns, "ns" },
+ { adns_r_soa, "soa" },
+ { adns_r_ptr, "ptr" },
+ { adns_r_mx, "mx" },
+ { adns_r_rp, "rp" },
+ { adns_r_srv, "srv" },
+ { adns_r_addr, "addr" },
+
+ /* types with only one version */
+ { adns_r_cname, "cname" },
+ { adns_r_hinfo, "hinfo" },
+ { adns_r_txt, "txt" },
+
+ /* raw versions */
+ { adns_r_a, "a" },
+ { adns_r_aaaa, "aaaa" },
+ { adns_r_ns_raw, "ns-" },
+ { adns_r_soa_raw, "soa-" },
+ { adns_r_ptr_raw, "ptr-" },
+ { adns_r_mx_raw, "mx-" },
+ { adns_r_rp_raw, "rp-" },
+ { adns_r_srv_raw, "srv-" },
+
+ { adns_r_none, 0 }
+ };
+
+ const struct typename *tnp;
+ unsigned long unknowntype;
+ char *ep;
+
+ if (strlen(arg) > 4 && !memcmp(arg,"type",4) &&
+ (unknowntype= strtoul(arg+4, &ep, 10), !*ep) && unknowntype < 65536) {
+ ov_type= unknowntype | adns_r_unknown;
+ return;
+ }
+
+ for (tnp=typenames;
+ tnp->type && strcmp(arg,tnp->desc);
+ tnp++);
+ if (!tnp->type) usageerr("unknown RR type %s",arg);
+ ov_type= tnp->type;
+}
+
+static void process_optarg(const char *arg,
+ const char *const **argv_p,
+ const char *value) {
+ const struct optioninfo *oip;
+ const char *arg2;
+ int invert;
+
+ if (arg[0] == '-' || arg[0] == '+') {
+ if (arg[0] == '-' && arg[1] == '-') {
+ if (!strncmp(arg,"--no-",5)) {
+ invert= 1;
+ oip= opt_findl(arg+5);
+ } else {
+ invert= 0;
+ oip= opt_findl(arg+2);
+ }
+ if (oip->type == ot_funcarg) {
+ arg= argv_p ? *++(*argv_p) : value;
+ if (!arg) usageerr("option --%s requires a value argument",oip->lopt);
+ arg2= 0;
+ } else if (oip->type == ot_funcarg2) {
+ assert(argv_p);
+ arg= *++(*argv_p);
+ arg2= arg ? *++(*argv_p) : 0;
+ if (!arg || !arg2)
+ usageerr("option --%s requires two more arguments", oip->lopt);
+ } else {
+ if (value) usageerr("option --%s does not take a value",oip->lopt);
+ arg= 0;
+ arg2= 0;
+ }
+ opt_do(oip,invert,arg,arg2);
+ } else if (arg[0] == '-' && arg[1] == 0) {
+ arg= argv_p ? *++(*argv_p) : value;
+ if (!arg) usageerr("option `-' must be followed by a domain");
+ query_do(arg);
+ } else { /* arg[1] != '-', != '\0' */
+ invert= (arg[0] == '+');
+ ++arg;
+ while (*arg) {
+ oip= opt_finds(&arg);
+ if (oip->type == ot_funcarg) {
+ if (!*arg) {
+ arg= argv_p ? *++(*argv_p) : value;
+ if (!arg) usageerr("option -%s requires a value argument",oip->sopt);
+ } else {
+ if (value) usageerr("two values for option -%s given !",oip->sopt);
+ }
+ opt_do(oip,invert,arg,0);
+ arg= "";
+ } else {
+ if (value) usageerr("option -%s does not take a value",oip->sopt);
+ opt_do(oip,invert,0,0);
+ }
+ }
+ }
+ } else { /* arg[0] != '-' */
+ query_do(arg);
+ }
+}
+
+static void read_stdin(void) {
+ int anydone, r;
+ char *newline, *space;
+
+ anydone= 0;
+ while (!anydone || used) {
+ while (!(newline= memchr(buf,'\n',used))) {
+ if (used == avail) {
+ avail += 20; avail <<= 1;
+ buf= realloc(buf,avail);
+ if (!buf) sysfail("realloc stdin buffer",errno);
+ }
+ do {
+ r= read(0,buf+used,avail-used);
+ } while (r < 0 && errno == EINTR);
+ if (r == 0) {
+ if (used) {
+ /* fake up final newline */
+ buf[used++]= '\n';
+ r= 1;
+ } else {
+ ov_pipe= 0;
+ return;
+ }
+ }
+ if (r < 0) sysfail("read stdin",errno);
+ used += r;
+ }
+ *newline++= 0;
+ space= strchr(buf,' ');
+ if (space) *space++= 0;
+ process_optarg(buf,0,space);
+ used -= (newline-buf);
+ memmove(buf,newline,used);
+ anydone= 1;
+ }
+}
+
+int main(int argc, const char *const *argv) {
+ struct timeval *tv, tvbuf;
+ adns_query qu;
+ void *qun_v;
+ adns_answer *answer;
+ int r, maxfd;
+ fd_set readfds, writefds, exceptfds;
+ const char *arg;
+
+ while ((arg= *++argv)) process_optarg(arg,&argv,0);
+
+ if (!ov_pipe && !ads) usageerr("no domains given, and -f/--pipe not used; try --help");
+
+ ensure_adns_init();
+
+ for (;;) {
+ for (;;) {
+ qu= ov_asynch ? 0 : outstanding.head ? outstanding.head->qu : 0;
+ r= adns_check(ads,&qu,&answer,&qun_v);
+ if (r == EAGAIN) break;
+ if (r == ESRCH) { if (!ov_pipe) goto x_quit; else break; }
+ assert(!r);
+ query_done(qun_v,answer);
+ }
+ maxfd= 0;
+ FD_ZERO(&readfds);
+ FD_ZERO(&writefds);
+ FD_ZERO(&exceptfds);
+ if (ov_pipe) {
+ maxfd= 1;
+ FD_SET(0,&readfds);
+ }
+ tv= 0;
+ adns_beforeselect(ads, &maxfd, &readfds,&writefds,&exceptfds, &tv,&tvbuf,0);
+ r= select(maxfd, &readfds,&writefds,&exceptfds, tv);
+ if (r == -1) {
+ if (errno == EINTR) continue;
+ sysfail("select",errno);
+ }
+ adns_afterselect(ads, maxfd, &readfds,&writefds,&exceptfds, 0);
+ if (ov_pipe && FD_ISSET(0,&readfds)) read_stdin();
+ }
+x_quit:
+ if (fclose(stdout)) outerr();
+ quitnow(rcode);
+}
diff --git a/client/adh-opts.c b/client/adh-opts.c
new file mode 100644
index 0000000..04664eb
--- /dev/null
+++ b/client/adh-opts.c
@@ -0,0 +1,367 @@
+/*
+ * adh-opts.c
+ * - useful general-purpose resolver client program
+ * option handling tables etc.
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include "adnshost.h"
+
+int ov_env=1, ov_pipe=0, ov_asynch=0;
+int ov_verbose= 0;
+adns_rrtype ov_type= adns_r_none;
+int ov_search=0, ov_qc_query=0, ov_qc_anshost=0, ov_qc_cname=1;
+int ov_tcp=0, ov_cname=0, ov_afflags=0, ov_v6map=0, ov_format=fmt_default;
+char *ov_id= 0;
+struct perqueryflags_remember ov_pqfr = { 1,1,1, tm_none };
+
+static const struct optioninfo global_options[]= {
+ { ot_desconly, "global binary options:" },
+ { ot_flag, "Do not look at environment variables at all",
+ "e", "env", &ov_env, 0 },
+ { ot_flag, "Read queries on stdin instead of using args",
+ "f", "pipe", &ov_pipe, 1 },
+ { ot_flag, "Allow answers to be reordered",
+ "a", "asynch", &ov_asynch, 1 },
+
+ { ot_desconly, "answer/error output format and destination (see below):" },
+ { ot_value, "Answers to stdout, errors as messages to stderr (default)",
+ "Fs", "fmt-simple", &ov_format, fmt_simple },
+ { ot_value, "Answers and errors both to stdout in parseable format",
+ "Fi", "fmt-inline", &ov_format, fmt_inline },
+ { ot_value, "Fully-parseable output format (default for --asynch)",
+ "Fa", "fmt-asynch", &ov_format, fmt_asynch },
+
+ { ot_desconly, "global verbosity level:" },
+ { ot_value, "Do not print anything to stderr",
+ "Vq", "quiet", &ov_verbose, adns_if_noerrprint },
+ { ot_value, "Report unexpected kinds of problem only (default)",
+ "Vn", "no-quiet", &ov_verbose, 0 },
+ { ot_value, "Debugging mode",
+ "Vd", "debug", &ov_verbose, adns_if_debug },
+
+ { ot_desconly, "other global options:" },
+ { ot_funcarg, "Configuration to use instead of /etc/resolv.conf",
+ 0, "config", 0,0, of_config, "<config-text>" },
+ { ot_func, "Print version number",
+ 0, "version", 0,0, of_version },
+ { ot_func, "Print usage information",
+ 0, "help", 0,0, of_help },
+
+ { ot_end }
+};
+
+static const struct optioninfo perquery_options[]= {
+ { ot_desconly, "per-query options:" },
+ { ot_funcarg, "Query type (see below)",
+ "t", "type", 0,0, &of_type, "type" },
+ { ot_funcarg, "Do reverse query (address -> name lookup)",
+ "i", "ptr", 0,0, &of_ptr, "addr" },
+ { ot_funcarg2, "Lookup in in-addr-like `zone' (eg MAPS RBL)",
+ 0, "reverse", 0,0, &of_reverse, "addr","zone" },
+
+ { ot_desconly, "per-query binary options:" },
+ { ot_flag, "Use the search list",
+ "s", "search", &ov_search, 1 },
+ { ot_flag, "Let query domains contain quote-requiring chars",
+ "Qq", "qc-query", &ov_qc_query, 1 },
+ { ot_flag, "Let hostnames in answers contain ...",
+ "Qa", "qc-anshost", &ov_qc_anshost, 1 },
+ { ot_flag, "Prevent CNAME target domains from containing ...",
+ "Qc", "qc-cname", &ov_qc_cname, 0 },
+ { ot_flag, "Force use of a virtual circuit",
+ "u", "tcp", &ov_tcp, 1 },
+ { ot_flag, "Do not display owner name in output",
+ "Do", "show-owner", &ov_pqfr.show_owner, 0 },
+ { ot_flag, "Do not display RR type in output",
+ "Dt", "show-type", &ov_pqfr.show_type, 0 },
+ { ot_flag, "Do not display CNAME target in output",
+ "Dc", "show-cname", &ov_pqfr.show_cname, 0 },
+
+ { ot_desconly, "per-query TTL mode (NB TTL is minimum across all info in reply):" },
+ { ot_value, "Show the TTL as a TTL",
+ "Tt", "ttl-ttl", &ov_pqfr.ttl, tm_rel },
+ { ot_value, "Show the TTL as a time_t when the data might expire",
+ "Ta", "ttl-abs", &ov_pqfr.ttl, tm_abs },
+ { ot_value, "Do not show the TTL (default)",
+ "Tn", "no-ttl", &ov_pqfr.ttl, tm_none },
+
+ { ot_desconly, "per-query address family options (for `addr' etc.):" },
+ { ot_value, "Only return IPv4 addresses",
+ "A4", "--addr-ipv4-only", &ov_afflags, adns_qf_want_ipv4 },
+ { ot_value, "Only return IPv6 addresses",
+ "A6", "--addr-ipv6-only", &ov_afflags, adns_qf_want_ipv6 },
+ { ot_value, "Return all available addresses (default)",
+ "Aa", "--addr-all", &ov_afflags, 0 },
+ { ot_flag, "Return IPv4 addresses as IPv6-mapped",
+ "Am", "--addr-ipv6-mapped", &ov_v6map, 1 },
+
+ { ot_desconly, "per-query CNAME handling mode:" },
+ { ot_value, "Call it an error if a CNAME is found",
+ "Cf", "cname-reject", &ov_cname, adns_qf_cname_forbid },
+ { ot_value, "Allow references to CNAMEs in other RRs",
+ "Cl", "cname-loose", &ov_cname, adns_qf_cname_loose },
+ { ot_value, "CNAME ok for query domain, but not in RRs (default)",
+ "Cs", "cname-ok", &ov_cname, 0 },
+
+ { ot_desconly, "asynchronous/pipe mode options:" },
+ { ot_funcarg, "Set <id>, default is decimal sequence starting 0",
+ 0, "asynch-id", 0,0, &of_asynch_id, "id" },
+ { ot_funcarg, "Cancel the query with id <id> (no error if not found)",
+ 0, "cancel-id", 0,0, &of_cancel_id, "id" },
+
+ { ot_end }
+};
+
+static void printusage(void) {
+ static const struct optioninfo *const all_optiontables[]= {
+ global_options, perquery_options, 0
+ };
+
+ const struct optioninfo *const *oiap, *oip=0;
+ int maxsopt, maxlopt, l;
+
+ maxsopt= maxlopt= 0;
+
+ for (oiap=all_optiontables; *oiap; oiap++) {
+ for (oip=*oiap; oip->type != ot_end; oip++) {
+ if (oip->type == ot_funcarg) continue;
+ if (oip->sopt) { l= strlen(oip->sopt); if (l>maxsopt) maxsopt= l; }
+ if (oip->lopt) {
+ l= strlen(oip->lopt);
+ if (oip->type == ot_flag && !oip->value) l+= 3;
+ if (l>maxlopt) maxlopt= l;
+ }
+ }
+ }
+
+ fputs("usage: adnshost [global-opts] [query-opts] query-domain\n"
+ " [[query-opts] query-domain ...]\n"
+ " adnshost [global-opts] [query-opts] -f|--pipe\n",
+ stdout);
+
+ for (oiap=all_optiontables; *oiap; oiap++) {
+ putchar('\n');
+ for (oip=*oiap; oip->type != ot_end; oip++) {
+ switch (oip->type) {
+ case ot_flag:
+ if (!oip->value) {
+ if (oip->sopt) {
+ printf(" +%-*s --no-%-*s %s\n",
+ maxsopt, oip->sopt,
+ maxlopt-2, oip->lopt,
+ oip->desc);
+ } else {
+ printf(" --no-%-*s %s\n",
+ maxlopt+maxsopt+1, oip->lopt,
+ oip->desc);
+ }
+ break;
+ }
+ case ot_value: case ot_func: /* fall through */
+ if (oip->sopt) {
+ printf(" -%-*s --%-*s %s\n",
+ maxsopt, oip->sopt,
+ maxlopt+1, oip->lopt,
+ oip->desc);
+ } else {
+ printf(" --%-*s %s\n",
+ maxlopt+maxsopt+3, oip->lopt,
+ oip->desc);
+ }
+ break;
+ case ot_funcarg:
+ if (oip->sopt) {
+ l= (maxlopt + maxsopt - 9 -
+ (strlen(oip->sopt) + strlen(oip->lopt) + 2*strlen(oip->argdesc)));
+ printf(" -%s<%s> / --%s <%s>%*s%s\n",
+ oip->sopt, oip->argdesc, oip->lopt, oip->argdesc,
+ l>2 ? l : 2, "",
+ oip->desc);
+ } else {
+ l= (maxlopt + maxsopt + 1 -
+ (strlen(oip->lopt) + strlen(oip->argdesc)));
+ printf(" --%s <%s>%*s%s\n",
+ oip->lopt, oip->argdesc,
+ l>2 ? l : 2, "",
+ oip->desc);
+ }
+ break;
+ case ot_funcarg2:
+ assert(!oip->sopt);
+ l= (maxlopt + maxsopt - 2 -
+ (strlen(oip->lopt) + strlen(oip->argdesc) + strlen(oip->argdesc2)));
+ printf(" --%s <%s> <%s>%*s%s\n",
+ oip->lopt, oip->argdesc, oip->argdesc2,
+ l>2 ? l : 2, "",
+ oip->desc);
+ break;
+ case ot_desconly:
+ printf("%s\n", oip->desc);
+ break;
+ default:
+ abort();
+ }
+ }
+ }
+
+ printf("\nEscaping domains which might start with `-':\n"
+ " - %-*s Next argument is a domain, but more options may follow\n",
+ maxlopt+maxsopt+3, "<domain>");
+
+ fputs("\n"
+ "Query domains should always be quoted according to master file format.\n"
+ "\n"
+ "For binary options, --FOO and --no-FOO are opposites, as are\n"
+ "-X and +X. In each case the default is the one not listed.\n"
+ "Per query options stay set a particular way until they are reset,\n"
+ "whether they appear on the command line or on stdin.\n"
+ "All global options must preceed the first query domain.\n"
+ "\n"
+ "With -f, the input should be lines with either an option, possibly\n"
+ "with a value argument (separated from the option by a space if it's a long\n"
+ "option), or a domain (possibly preceded by a hyphen and a space to\n"
+ "distinguish it from an option).\n"
+ "\n"
+ "Output format is master file format without class or TTL by default:\n"
+ " [<owner>] [<ttl>] [<type>] <data>\n"
+ "or if the <owner> domain refers to a CNAME and --show-cname is on\n"
+ " [<owner>] [<ttl>] CNAME <cname>\n"
+ " [<cname>] [<ttl>] <type> <data>\n"
+ "When a query fails you get an error message to stderr (with --fmt-simple).\n"
+ "Specify --fmt-inline for lines like this (broken here for readability):\n"
+ " ; failed <statustype> <statusnum> <statusabbrev> \\\n"
+ " [<owner>] [<ttl>] [<cname>] \"<status string>\"\n"
+ "If you use --fmt-asynch, which is the default for --asynch,\n"
+ "each answer (success or failure) is preceded by a line\n"
+ " <id> <nrrs> <statustype> <statusnum> <statusabbrev> \\\n"
+ " [<owner>] [<ttl>] [<cname>] \"<status string>\"\n"
+ "where <nrrs> is the number of RRs that follow and <cname> will be `$' or\n"
+ "the CNAME target; the CNAME indirection and error formats above are not used.\n"
+ "\n"
+ "Exit status:\n"
+ " 0 all went well\n"
+ " 1-6 at least one query failed with statustype:\n"
+ " 1 localfail )\n"
+ " 2 remotefail ) temporary errors\n"
+ " 3 tempfail __)_________________\n"
+ " 4 misconfig )\n"
+ " 5 misquery ) permanent errors\n"
+ " 6 permfail )\n"
+ " 10 system trouble\n"
+ " 11 usage problems\n"
+ "\n"
+ "Query types (see adns.h; default is addr):\n"
+ " ns soa ptr mx rp srv addr - enhanced versions\n"
+ " cname hinfo txt - types with only one version\n"
+ " a aaaa ns- soa- ptr- mx- rp- srv- - _raw versions\n"
+ " type<number> - `unknown' type, RFC3597\n"
+ "Default is addr, or ptr for -i/--ptr queries\n",
+ stdout);
+ if (ferror(stdout)) sysfail("write usage message",errno);
+}
+
+void of_version(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ VERSION_PRINT_QUIT("adnshost");
+}
+
+void of_help(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ printusage();
+ if (fclose(stdout)) sysfail("finish writing output",errno);
+ quitnow(0);
+}
+
+typedef int comparer_type(const char **optp, const struct optioninfo *entry);
+
+static int oc_long(const char **optp, const struct optioninfo *entry) {
+ return entry->lopt && !strcmp(*optp,entry->lopt);
+}
+
+static int oc_short(const char **optp, const struct optioninfo *entry) {
+ const char *sopt;
+ int l;
+
+ sopt= entry->sopt;
+ if (!sopt) return 0;
+ l= strlen(sopt);
+ if (memcmp(*optp,sopt,l)) return 0;
+ (*optp) += l;
+ return 1;
+}
+
+static const struct optioninfo *find1(const char **optp,
+ const struct optioninfo *table,
+ comparer_type *comparer) {
+ for (;;) {
+ if (table->type == ot_end) return 0;
+ if (comparer(optp,table)) return table;
+ table++;
+ }
+}
+
+static const struct optioninfo *find(const char **optp,
+ const char *prefix,
+ comparer_type *comparer) {
+ const struct optioninfo *oip;
+ const char *opt;
+
+ opt= *optp;
+ oip= find1(optp,perquery_options,comparer);
+ if (oip) return oip;
+ oip= find1(optp,global_options,comparer);
+ if (!oip) usageerr("unknown option %s%s",prefix,opt);
+ if (ads) usageerr("global option %s%s specified after query domain(s)",prefix,opt);
+ return oip;
+}
+
+const struct optioninfo *opt_findl(const char *opt) { return find(&opt,"--",oc_long); }
+const struct optioninfo *opt_finds(const char **optp) { return find(optp,"-",oc_short); }
+
+static void noninvert(const struct optioninfo *oip) NONRETURNING;
+static void noninvert(const struct optioninfo *oip) {
+ usageerr("option %s%s%s%s%s may not be inverted",
+ oip->sopt ? "-" : "", oip->sopt ? oip->sopt : "",
+ oip->lopt && oip->sopt ? " / " : "",
+ oip->lopt ? "--" : "", oip->lopt ? oip->lopt : "");
+}
+
+void opt_do(const struct optioninfo *oip, int invert,
+ const char *arg, const char *arg2) {
+ switch (oip->type) {
+ case ot_flag:
+ assert(!arg);
+ *oip->storep= !invert;
+ return;
+ case ot_value:
+ assert(!arg);
+ if (invert) noninvert(oip);
+ *oip->storep= oip->value;
+ return;
+ case ot_func: case ot_funcarg: case ot_funcarg2:
+ if (invert) noninvert(oip);
+ oip->func(oip,arg,arg2);
+ return;
+ default:
+ abort();
+ }
+}
diff --git a/client/adh-query.c b/client/adh-query.c
new file mode 100644
index 0000000..55b23e7
--- /dev/null
+++ b/client/adh-query.c
@@ -0,0 +1,322 @@
+/*
+ * adh-query.c
+ * - useful general-purpose resolver client program
+ * make queries and print answers
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include "adnshost.h"
+
+adns_state ads;
+struct outstanding_list outstanding;
+
+static unsigned long idcounter;
+
+void ensure_adns_init(void) {
+ adns_initflags initflags;
+ int r;
+
+ if (ads) return;
+
+ if (signal(SIGPIPE,SIG_IGN) == SIG_ERR) sysfail("ignore SIGPIPE",errno);
+
+ initflags= adns_if_noautosys|adns_if_nosigpipe|ov_verbose;
+ if (!ov_env) initflags |= adns_if_noenv;
+
+ if (config_text) {
+ r= adns_init_strcfg(&ads, initflags, stderr, config_text);
+ } else {
+ r= adns_init(&ads, initflags, 0);
+ }
+ if (r) sysfail("adns_init",r);
+
+ if (ov_format == fmt_default)
+ ov_format= ov_asynch ? fmt_asynch : fmt_simple;
+}
+
+void type_info(adns_rrtype type, const char **typename_r,
+ const void *datap, char **data_r) {
+ static char buf[12];
+ adns_status st;
+
+ st= adns_rr_info(type, typename_r, 0,0, datap,data_r);
+ if (st == adns_s_nomemory) sysfail("adns_rr_info failed",ENOMEM);
+ assert(!st);
+ if (typename_r && !*typename_r) {
+ sprintf(buf,"TYPE%d", (int)(type & adns_rrt_typemask));
+ *typename_r= buf;
+ }
+}
+
+static void prep_query(struct query_node **qun_r, int *quflags_r) {
+ struct query_node *qun;
+ char idbuf[20];
+
+ if (ov_pipe && !ads) usageerr("-f/--pipe not consistent with domains on command line");
+ ensure_adns_init();
+
+ qun= malloc(sizeof(*qun));
+ qun->pqfr= ov_pqfr;
+ if (ov_id) {
+ qun->id= xstrsave(ov_id);
+ } else {
+ sprintf(idbuf,"%lu",idcounter++);
+ idcounter &= 0x0fffffffflu;
+ qun->id= xstrsave(idbuf);
+ }
+
+ *quflags_r=
+ (ov_search ? adns_qf_search : 0) |
+ (ov_tcp ? adns_qf_usevc : 0) |
+ ((ov_pqfr.show_owner || ov_format == fmt_simple) ? adns_qf_owner : 0) |
+ (ov_qc_query ? adns_qf_quoteok_query : 0) |
+ (ov_qc_anshost ? adns_qf_quoteok_anshost : 0) |
+ (ov_qc_cname ? 0 : adns_qf_quoteok_cname) |
+ (ov_v6map ? adns_qf_ipv6_mapv4 : 0) |
+ ov_cname | ov_afflags;
+
+ *qun_r= qun;
+}
+
+static void sockaddr_aton(const char *text, adns_rr_addr *a) {
+ int err;
+
+ a->len= sizeof(a->addr);
+ err= adns_text2addr(text,0,adns_qf_addrlit_scope_forbid,
+ &a->addr.sa,&a->len);
+ if (err == EINVAL) usageerr("invalid IP address %s",text);
+ else if (err) sysfail("adns_text2addr",err);
+}
+
+void of_ptr(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ struct query_node *qun;
+ int quflags, r;
+ adns_rr_addr a;
+
+ sockaddr_aton(arg,&a);
+ prep_query(&qun,&quflags);
+ qun->owner= xstrsave(arg);
+ r= adns_submit_reverse(ads, &a.addr.sa,
+ ov_type == adns_r_none ? adns_r_ptr : ov_type,
+ quflags,
+ qun,
+ &qun->qu);
+ if (r) sysfail("adns_submit_reverse",r);
+
+ LIST_LINK_TAIL(outstanding,qun);
+}
+
+void of_reverse(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ struct query_node *qun;
+ int quflags, r;
+ adns_rr_addr a;
+
+ sockaddr_aton(arg,&a);
+ prep_query(&qun,&quflags);
+ qun->owner= xmalloc(strlen(arg) + strlen(arg2) + 2);
+ sprintf(qun->owner, "%s %s", arg,arg2);
+ r= adns_submit_reverse_any(ads, &a.addr.sa,arg2,
+ ov_type == adns_r_none ? adns_r_txt : ov_type,
+ quflags,
+ qun,
+ &qun->qu);
+ if (r) sysfail("adns_submit_reverse",r);
+
+ LIST_LINK_TAIL(outstanding,qun);
+}
+
+void query_do(const char *domain) {
+ struct query_node *qun;
+ int quflags, r;
+
+ prep_query(&qun,&quflags);
+ qun->owner= xstrsave(domain);
+ r= adns_submit(ads, domain,
+ ov_type == adns_r_none ? adns_r_addr : ov_type,
+ quflags,
+ qun,
+ &qun->qu);
+ if (r) sysfail("adns_submit",r);
+
+ LIST_LINK_TAIL(outstanding,qun);
+}
+
+static void dequeue_query(struct query_node *qun) {
+ LIST_UNLINK(outstanding,qun);
+ free(qun->id);
+ free(qun->owner);
+ free(qun);
+}
+
+static void print_withspace(const char *str) {
+ if (printf("%s ", str) == EOF) outerr();
+}
+
+static void print_ttl(struct query_node *qun, adns_answer *answer) {
+ unsigned long ttl;
+ time_t now;
+
+ switch (qun->pqfr.ttl) {
+ case tm_none:
+ return;
+ case tm_rel:
+ if (time(&now) == (time_t)-1) sysfail("get current time",errno);
+ ttl= answer->expires < now ? 0 : answer->expires - now;
+ break;
+ case tm_abs:
+ ttl= answer->expires;
+ break;
+ default:
+ abort();
+ }
+ if (printf("%lu ",ttl) == EOF) outerr();
+}
+
+static const char *owner_show(struct query_node *qun, adns_answer *answer) {
+ return answer->owner ? answer->owner : qun->owner;
+}
+
+static void print_owner_ttl(struct query_node *qun, adns_answer *answer) {
+ if (qun->pqfr.show_owner) print_withspace(owner_show(qun,answer));
+ print_ttl(qun,answer);
+}
+
+static void check_status(adns_status st) {
+ static const adns_status statuspoints[]= {
+ adns_s_ok,
+ adns_s_max_localfail, adns_s_max_remotefail, adns_s_max_tempfail,
+ adns_s_max_misconfig, adns_s_max_misquery
+ };
+
+ const adns_status *spp;
+ int minrcode;
+
+ for (minrcode=0, spp=statuspoints;
+ spp < statuspoints + (sizeof(statuspoints)/sizeof(statuspoints[0]));
+ spp++)
+ if (st > *spp) minrcode++;
+ if (rcode < minrcode) rcode= minrcode;
+}
+
+static void print_status(adns_status st, struct query_node *qun, adns_answer *answer) {
+ const char *statustypeabbrev, *statusabbrev, *statusstring;
+
+ statustypeabbrev= adns_errtypeabbrev(st);
+ statusabbrev= adns_errabbrev(st);
+ statusstring= adns_strerror(st);
+ assert(!strchr(statusstring,'"'));
+
+ if (printf("%s %d %s ", statustypeabbrev, st, statusabbrev)
+ == EOF) outerr();
+ print_owner_ttl(qun,answer);
+ if (qun->pqfr.show_cname)
+ print_withspace(answer->cname ? answer->cname : "$");
+ if (printf("\"%s\"\n", statusstring) == EOF) outerr();
+}
+
+static void print_dnsfail(adns_status st, struct query_node *qun, adns_answer *answer) {
+ int r;
+ const char *typename, *statusstring;
+
+ if (ov_format == fmt_inline) {
+ if (fputs("; failed ",stdout) == EOF) outerr();
+ print_status(st,qun,answer);
+ return;
+ }
+ assert(ov_format == fmt_simple);
+ if (st == adns_s_nxdomain) {
+ r= fprintf(stderr,"%s does not exist\n", owner_show(qun,answer));
+ } else {
+ type_info(answer->type, &typename, 0,0);
+ if (st == adns_s_nodata) {
+ r= fprintf(stderr,"%s has no %s record\n", owner_show(qun,answer), typename);
+ } else {
+ statusstring= adns_strerror(st);
+ r= fprintf(stderr,"Error during DNS %s lookup for %s: %s\n",
+ typename, owner_show(qun,answer), statusstring);
+ }
+ }
+ if (r == EOF) sysfail("write error message to stderr",errno);
+}
+
+void query_done(struct query_node *qun, adns_answer *answer) {
+ adns_status st;
+ int rrn, nrrs;
+ const char *rrp, *realowner, *typename;
+ char *datastr;
+
+ st= answer->status;
+ nrrs= answer->nrrs;
+ if (ov_format == fmt_asynch) {
+ check_status(st);
+ if (printf("%s %d ", qun->id, nrrs) == EOF) outerr();
+ print_status(st,qun,answer);
+ } else {
+ if (qun->pqfr.show_cname && answer->cname) {
+ print_owner_ttl(qun,answer);
+ if (qun->pqfr.show_type) print_withspace("CNAME");
+ if (printf("%s\n", answer->cname) == EOF) outerr();
+ }
+ if (st) {
+ check_status(st);
+ print_dnsfail(st,qun,answer);
+ }
+ }
+ if (qun->pqfr.show_owner) {
+ realowner= answer->cname ? answer->cname : owner_show(qun,answer);
+ assert(realowner);
+ } else {
+ realowner= 0;
+ }
+ if (nrrs) {
+ for (rrn=0, rrp = answer->rrs.untyped;
+ rrn < nrrs;
+ rrn++, rrp += answer->rrsz) {
+ if (realowner) print_withspace(realowner);
+ print_ttl(qun,answer);
+ type_info(answer->type,&typename, rrp,&datastr);
+ if (qun->pqfr.show_type) print_withspace(typename);
+ if (printf("%s\n",datastr) == EOF) outerr();
+ free(datastr);
+ }
+ }
+ if (fflush(stdout)) outerr();
+ free(answer);
+ dequeue_query(qun);
+}
+
+void of_asynch_id(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ free(ov_id);
+ ov_id= xstrsave(arg);
+}
+
+void of_cancel_id(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ struct query_node *qun;
+
+ for (qun= outstanding.head;
+ qun && strcmp(qun->id,arg);
+ qun= qun->next);
+ if (!qun) return;
+ adns_cancel(qun->qu);
+ dequeue_query(qun);
+}
diff --git a/client/adnsheloex.c b/client/adnsheloex.c
new file mode 100644
index 0000000..848de21
--- /dev/null
+++ b/client/adnsheloex.c
@@ -0,0 +1,300 @@
+/*
+ * adnsheloex.c
+ * - look up the A record of hosts in an Exim log that failed HELO verification
+ */
+/*
+ * This file is
+ * Copyright (C) 2004 Tony Finch <dot@dotat.at>
+ *
+ * It is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ *
+ * This file is by Tony Finch, based on adnslogres.c.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stdarg.h>
+
+#include "config.h"
+#include "adns.h"
+#include "client.h"
+
+#ifdef ADNS_REGRESS_TEST
+# include "hredirect.h"
+#endif
+
+/* maximum number of concurrent DNS queries */
+#define MAXMAXPENDING 64000
+#define DEFMAXPENDING 2000
+
+/* maximum length of a line */
+#define MAXLINE 1024
+
+/* option flags */
+#define OPT_DEBUG 1
+#define OPT_POLL 2
+
+static const char *const progname= "adnsheloex";
+static const char *config_text;
+
+#define guard_null(str) ((str) ? (str) : "")
+
+#define sensible_ctype(type,ch) (type((unsigned char)(ch)))
+ /* isfoo() functions from ctype.h can't safely be fed char - blech ! */
+
+static void msg(const char *fmt, ...) {
+ va_list al;
+
+ fprintf(stderr, "%s: ", progname);
+ va_start(al,fmt);
+ vfprintf(stderr, fmt, al);
+ va_end(al);
+ fputc('\n',stderr);
+}
+
+static void aargh(const char *cause) {
+ const char *why = strerror(errno);
+ if (!why) why = "Unknown error";
+ msg("%s: %s (%d)", cause, why, errno);
+ exit(1);
+}
+
+typedef struct logline {
+ struct logline *next;
+ char *start, *name, *rest, *addr;
+ adns_query query;
+} logline;
+
+static logline *readline(FILE *inf, adns_state adns, int opts) {
+ static char buf[MAXLINE];
+ char *str, *p, *q, *r;
+ logline *line;
+
+ if (fgets(buf, MAXLINE, inf)) {
+ str= malloc(sizeof(*line) + strlen(buf) + 1);
+ if (!str) aargh("malloc");
+ line= (logline*)str;
+ line->next= NULL;
+ line->start= str+sizeof(logline);
+ strcpy(line->start, buf);
+ line->name= line->rest= line->addr= NULL;
+ /* look for unverifiable HELO information matching the regex
+ H=[a-z0-9.- ]*[(][a-z0-9.-]*[)] [[][0-9.]*[]] */
+ for (p= strchr(line->start, ' '); p; p= strchr(p+1, ' ')) {
+ if (!strncmp(p, " H=", 3)) {
+ r= strchr(p, '[');
+ if (!r) break;
+ q= strchr(p, ')');
+ if (!q || q>r) break;
+ p= strchr(p, '(');
+ if (!p || p>q) break;
+ line->name= p+1;
+ line->rest= q;
+ line->addr= r+1;
+ break;
+ }
+ }
+ if (line->name) {
+ *line->rest= '\0';
+ if (opts & OPT_DEBUG)
+ msg("submitting %s", line->name);
+ if (adns_submit(adns, line->name, adns_r_a,
+ adns_qf_quoteok_query|adns_qf_quoteok_cname|adns_qf_cname_loose,
+ NULL, &line->query))
+ aargh("adns_submit");
+ *line->rest= ')';
+ } else {
+ if (opts & OPT_DEBUG)
+ msg("no query");
+ line->query= NULL;
+ }
+ return line;
+ }
+ if (!feof(inf))
+ aargh("fgets");
+ return NULL;
+}
+
+static void proclog(FILE *inf, FILE *outf, int maxpending, int opts) {
+ int eof, err, len;
+ adns_state adns;
+ adns_answer *answer;
+ logline *head, *tail, *line;
+ adns_initflags initflags;
+
+ initflags= (opts & OPT_DEBUG) ? adns_if_debug : 0;
+ if (config_text) {
+ errno= adns_init_strcfg(&adns, initflags, stderr, config_text);
+ } else {
+ errno= adns_init(&adns, initflags, 0);
+ }
+ if (errno) aargh("adns_init");
+ head= tail= readline(inf, adns, opts);
+ len= 1; eof= 0;
+ while (head) {
+ while (head) {
+ if (head->query) {
+ if (opts & OPT_DEBUG)
+ msg("%d in queue; checking %.*s", len,
+ (int)(head->rest-head->name), guard_null(head->name));
+ if (eof || len >= maxpending) {
+ if (opts & OPT_POLL)
+ err= adns_wait_poll(adns, &head->query, &answer, NULL);
+ else
+ err= adns_wait(adns, &head->query, &answer, NULL);
+ } else {
+ err= adns_check(adns, &head->query, &answer, NULL);
+ }
+ if (err == EAGAIN) break;
+ if (err) {
+ fprintf(stderr, "%s: adns_wait/check: %s", progname, strerror(err));
+ exit(1);
+ }
+ if (answer->status == adns_s_ok) {
+ const char *addr;
+ int ok = 0;
+ fprintf(outf, "%.*s", (int)(head->rest-head->start), head->start);
+ while(answer->nrrs--) {
+ addr= inet_ntoa(answer->rrs.inaddr[answer->nrrs]);
+ ok |= !strncmp(addr, head->addr, strlen(addr));
+ fprintf(outf, " [%s]", addr);
+ }
+ fprintf(outf, "%s%s", ok ? " OK" : "", head->rest);
+ } else {
+ if (opts & OPT_DEBUG)
+ msg("query failed");
+ fputs(head->start, outf);
+ }
+ free(answer);
+ len--;
+ } else {
+ if (opts & OPT_DEBUG)
+ msg("%d in queue; no query on this line", len);
+ fputs(head->start, outf);
+ }
+ line= head; head= head->next;
+ free(line);
+ }
+ if (!eof) {
+ line= readline(inf, adns, opts);
+ if (line) {
+ if (!head) head= line;
+ else tail->next= line;
+ tail= line;
+ if (line->query) len++;
+ } else {
+ eof= 1;
+ }
+ }
+ }
+ adns_finish(adns);
+}
+
+static void printhelp(FILE *file) {
+ fputs("usage: adnsheloex [<options>] [<logfile>]\n"
+ " adnsheloex --version|--help\n"
+ "options: -c <concurrency> set max number of outstanding queries\n"
+ " -p use poll(2) instead of select(2)\n"
+ " -d turn on debugging\n"
+ " -C <config> use instead of contents of resolv.conf\n",
+ stdout);
+}
+
+static void usage(void) {
+ printhelp(stderr);
+ exit(1);
+}
+
+int main(int argc, char *argv[]) {
+ int c, opts, maxpending;
+ extern char *optarg;
+ FILE *inf;
+
+ if (argv[1] && !strncmp(argv[1],"--",2)) {
+ if (!strcmp(argv[1],"--help")) {
+ printhelp(stdout);
+ } else if (!strcmp(argv[1],"--version")) {
+ fputs(VERSION_MESSAGE("adnsheloex"),stdout);
+ } else {
+ usage();
+ }
+ if (ferror(stdout) || fclose(stdout)) { perror("stdout"); exit(1); }
+ exit(0);
+ }
+
+ maxpending= DEFMAXPENDING;
+ opts= 0;
+ while ((c= getopt(argc, argv, "c:C:dp")) != -1)
+ switch (c) {
+ case 'c':
+ maxpending= atoi(optarg);
+ if (maxpending < 1 || maxpending > MAXMAXPENDING) {
+ fprintf(stderr, "%s: unfeasible concurrency %d\n", progname, maxpending);
+ exit(1);
+ }
+ break;
+ case 'C':
+ config_text= optarg;
+ break;
+ case 'd':
+ opts|= OPT_DEBUG;
+ break;
+ case 'p':
+ opts|= OPT_POLL;
+ break;
+ default:
+ usage();
+ }
+
+ argc-= optind;
+ argv+= optind;
+
+ inf= NULL;
+ if (argc == 0)
+ inf= stdin;
+ else if (argc == 1)
+ inf= fopen(*argv, "r");
+ else
+ usage();
+
+ if (!inf)
+ aargh("couldn't open input");
+
+ proclog(inf, stdout, maxpending, opts);
+
+ if (fclose(inf))
+ aargh("fclose input");
+ if (fclose(stdout))
+ aargh("fclose output");
+
+ return 0;
+}
diff --git a/client/adnshost.h b/client/adnshost.h
new file mode 100644
index 0000000..0a7a758
--- /dev/null
+++ b/client/adnshost.h
@@ -0,0 +1,129 @@
+/*
+ * adnshost.h
+ * - useful general-purpose resolver client program, header file
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#ifndef ADNSHOST_H_INCLUDED
+#define ADNSHOST_H_INCLUDED
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <time.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#define ADNS_FEATURE_MANYAF
+#include "config.h"
+#include "adns.h"
+#include "dlist.h"
+#include "client.h"
+
+#ifdef ADNS_REGRESS_TEST
+# include "hredirect.h"
+#endif
+
+/* declarations related to option processing */
+
+struct optioninfo;
+typedef void optfunc(const struct optioninfo *oi, const char *arg, const char *arg2);
+
+struct optioninfo {
+ enum oi_type {
+ ot_end, ot_desconly,
+ ot_flag, ot_value, ot_func, ot_funcarg, ot_funcarg2
+ } type;
+ const char *desc;
+ const char *sopt, *lopt;
+ int *storep, value;
+ optfunc *func;
+ const char *argdesc, *argdesc2;
+};
+
+enum ttlmode { tm_none, tm_rel, tm_abs };
+enum outputformat { fmt_default, fmt_simple, fmt_inline, fmt_asynch };
+
+struct perqueryflags_remember {
+ int show_owner, show_type, show_cname;
+ int ttl;
+};
+
+extern int ov_env, ov_pipe, ov_asynch;
+extern int ov_verbose;
+extern adns_rrtype ov_type;
+extern int ov_search, ov_qc_query, ov_qc_anshost, ov_qc_cname;
+extern int ov_tcp, ov_cname, ov_afflags, ov_v6map, ov_format;
+extern char *ov_id;
+extern struct perqueryflags_remember ov_pqfr;
+
+extern optfunc of_config, of_version, of_help, of_type, of_ptr, of_reverse;
+extern optfunc of_asynch_id, of_cancel_id;
+
+const struct optioninfo *opt_findl(const char *opt);
+const struct optioninfo *opt_finds(const char **optp);
+void opt_do(const struct optioninfo *oip, int invert, const char *arg, const char *arg2);
+
+/* declarations related to query processing */
+
+struct query_node {
+ struct query_node *next, *back;
+ struct perqueryflags_remember pqfr;
+ char *id, *owner;
+ adns_query qu;
+};
+
+extern adns_state ads;
+extern struct outstanding_list { struct query_node *head, *tail; } outstanding;
+
+void ensure_adns_init(void);
+void query_do(const char *domain);
+void query_done(struct query_node *qun, adns_answer *answer);
+
+void type_info(adns_rrtype type, const char **typename_r,
+ const void *datap, char **data_r);
+ /* wrapper for adns_rr_info which uses a static buffer to provide
+ * *typename_r for adns_r_unknown */
+
+
+/* declarations related to main program and useful utility functions */
+
+void sysfail(const char *what, int errnoval) NONRETURNING;
+void usageerr(const char *what, ...) NONRETURNPRINTFFORMAT(1,2);
+void outerr(void) NONRETURNING;
+
+void *xmalloc(size_t sz);
+char *xstrsave(const char *str);
+
+extern int rcode;
+extern const char *config_text; /* 0 => use defaults */
+
+#endif
diff --git a/client/adnslogres.c b/client/adnslogres.c
new file mode 100644
index 0000000..1a99694
--- /dev/null
+++ b/client/adnslogres.c
@@ -0,0 +1,299 @@
+/*
+ * adnslogres.c
+ * - a replacement for the Apache logresolve program using adns
+ */
+/*
+ * This file is
+ * Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ * Copyright (C) 1999-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ * It is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ *
+ * This version was originally supplied by Tony Finch, but has been
+ * modified by Ian Jackson as it was incorporated into adns and
+ * subsequently.
+ */
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stdarg.h>
+
+#include "config.h"
+#include "adns.h"
+#include "client.h"
+
+#ifdef ADNS_REGRESS_TEST
+# include "hredirect.h"
+#endif
+
+/* maximum number of concurrent DNS queries */
+#define MAXMAXPENDING 64000
+#define DEFMAXPENDING 2000
+
+/* maximum length of a line */
+#define MAXLINE 1024
+
+/* option flags */
+#define OPT_DEBUG 1
+#define OPT_POLL 2
+
+static const char *const progname= "adnslogres";
+static const char *config_text;
+
+#define guard_null(str) ((str) ? (str) : "")
+
+#define sensible_ctype(type,ch) (type((unsigned char)(ch)))
+ /* isfoo() functions from ctype.h can't safely be fed char - blech ! */
+
+static void msg(const char *fmt, ...) {
+ va_list al;
+
+ fprintf(stderr, "%s: ", progname);
+ va_start(al,fmt);
+ vfprintf(stderr, fmt, al);
+ va_end(al);
+ fputc('\n',stderr);
+}
+
+static void aargh(const char *cause) {
+ const char *why = strerror(errno);
+ if (!why) why = "Unknown error";
+ msg("%s: %s (%d)", cause, why, errno);
+ exit(1);
+}
+
+/*
+ * Parse the IP address and convert to a reverse domain name.
+ */
+static char *ipaddr2domain(char *start, char **addr, char **rest) {
+ static char buf[30]; /* "123.123.123.123.in-addr.arpa.\0" */
+ char *ptrs[5];
+ int i;
+
+ ptrs[0]= start;
+retry:
+ while (!sensible_ctype(isdigit,*ptrs[0]))
+ if (!*ptrs[0]++) {
+ strcpy(buf, "invalid.");
+ *addr= *rest= NULL;
+ return buf;
+ }
+ for (i= 1; i < 5; i++) {
+ ptrs[i]= ptrs[i-1];
+ while (sensible_ctype(isdigit,*ptrs[i]++));
+ if ((i == 4 && !sensible_ctype(isspace,ptrs[i][-1])) ||
+ (i != 4 && ptrs[i][-1] != '.') ||
+ (ptrs[i]-ptrs[i-1] > 4)) {
+ ptrs[0]= ptrs[i]-1;
+ goto retry;
+ }
+ }
+ sprintf(buf, "%.*s.%.*s.%.*s.%.*s.in-addr.arpa.",
+ (int)(ptrs[4]-ptrs[3]-1), ptrs[3],
+ (int)(ptrs[3]-ptrs[2]-1), ptrs[2],
+ (int)(ptrs[2]-ptrs[1]-1), ptrs[1],
+ (int)(ptrs[1]-ptrs[0]-1), ptrs[0]);
+ *addr= ptrs[0];
+ *rest= ptrs[4]-1;
+ return buf;
+}
+
+static void printline(FILE *outf, char *start, char *addr, char *rest, char *domain) {
+ if (domain)
+ fprintf(outf, "%.*s%s%s", (int)(addr - start), start, domain, rest);
+ else
+ fputs(start, outf);
+ if (ferror(outf)) aargh("write output");
+}
+
+typedef struct logline {
+ struct logline *next;
+ char *start, *addr, *rest;
+ adns_query query;
+} logline;
+
+static logline *readline(FILE *inf, adns_state adns, int opts) {
+ static char buf[MAXLINE];
+ char *str;
+ logline *line;
+
+ if (fgets(buf, MAXLINE, inf)) {
+ str= malloc(sizeof(*line) + strlen(buf) + 1);
+ if (!str) aargh("malloc");
+ line= (logline*)str;
+ line->next= NULL;
+ line->start= str+sizeof(logline);
+ strcpy(line->start, buf);
+ str= ipaddr2domain(line->start, &line->addr, &line->rest);
+ if (opts & OPT_DEBUG)
+ msg("submitting %.*s -> %s", (int)(line->rest-line->addr), guard_null(line->addr), str);
+ if (adns_submit(adns, str, adns_r_ptr,
+ adns_qf_quoteok_cname|adns_qf_cname_loose,
+ NULL, &line->query))
+ aargh("adns_submit");
+ return line;
+ }
+ if (!feof(inf))
+ aargh("fgets");
+ return NULL;
+}
+
+static void proclog(FILE *inf, FILE *outf, int maxpending, int opts) {
+ int eof, err, len;
+ adns_state adns;
+ adns_answer *answer;
+ logline *head, *tail, *line;
+ adns_initflags initflags;
+
+ initflags= (opts & OPT_DEBUG) ? adns_if_debug : 0;
+ if (config_text) {
+ errno= adns_init_strcfg(&adns, initflags, stderr, config_text);
+ } else {
+ errno= adns_init(&adns, initflags, 0);
+ }
+ if (errno) aargh("adns_init");
+ head= tail= readline(inf, adns, opts);
+ len= 1; eof= 0;
+ while (head) {
+ while (head) {
+ if (opts & OPT_DEBUG)
+ msg("%d in queue; checking %.*s", len,
+ (int)(head->rest-head->addr), guard_null(head->addr));
+ if (eof || len >= maxpending) {
+ if (opts & OPT_POLL)
+ err= adns_wait_poll(adns, &head->query, &answer, NULL);
+ else
+ err= adns_wait(adns, &head->query, &answer, NULL);
+ } else {
+ err= adns_check(adns, &head->query, &answer, NULL);
+ }
+ if (err == EAGAIN) break;
+ if (err) {
+ fprintf(stderr, "%s: adns_wait/check: %s", progname, strerror(err));
+ exit(1);
+ }
+ printline(outf, head->start, head->addr, head->rest,
+ answer->status == adns_s_ok ? *answer->rrs.str : NULL);
+ line= head; head= head->next;
+ free(line);
+ free(answer);
+ len--;
+ }
+ if (!eof) {
+ line= readline(inf, adns, opts);
+ if (line) {
+ if (!head) head= line;
+ else tail->next= line;
+ tail= line; len++;
+ } else {
+ eof= 1;
+ }
+ }
+ }
+ adns_finish(adns);
+}
+
+static void printhelp(FILE *file) {
+ fputs("usage: adnslogres [<options>] [<logfile>]\n"
+ " adnslogres --version|--help\n"
+ "options: -c <concurrency> set max number of outstanding queries\n"
+ " -p use poll(2) instead of select(2)\n"
+ " -d turn on debugging\n"
+ " -C <config> use instead of contents of resolv.conf\n",
+ stdout);
+}
+
+static void usage(void) {
+ printhelp(stderr);
+ exit(1);
+}
+
+int main(int argc, char *argv[]) {
+ int c, opts, maxpending;
+ extern char *optarg;
+ FILE *inf;
+
+ if (argv[1] && !strncmp(argv[1],"--",2)) {
+ if (!strcmp(argv[1],"--help")) {
+ printhelp(stdout);
+ } else if (!strcmp(argv[1],"--version")) {
+ fputs(VERSION_MESSAGE("adnslogres"),stdout);
+ } else {
+ usage();
+ }
+ if (ferror(stdout) || fclose(stdout)) { perror("stdout"); exit(1); }
+ exit(0);
+ }
+
+ maxpending= DEFMAXPENDING;
+ opts= 0;
+ while ((c= getopt(argc, argv, "c:C:dp")) != -1)
+ switch (c) {
+ case 'c':
+ maxpending= atoi(optarg);
+ if (maxpending < 1 || maxpending > MAXMAXPENDING) {
+ fprintf(stderr, "%s: unfeasible concurrency %d\n", progname, maxpending);
+ exit(1);
+ }
+ break;
+ case 'C':
+ config_text= optarg;
+ break;
+ case 'd':
+ opts|= OPT_DEBUG;
+ break;
+ case 'p':
+ opts|= OPT_POLL;
+ break;
+ default:
+ usage();
+ }
+
+ argc-= optind;
+ argv+= optind;
+
+ inf= NULL;
+ if (argc == 0)
+ inf= stdin;
+ else if (argc == 1)
+ inf= fopen(*argv, "r");
+ else
+ usage();
+
+ if (!inf)
+ aargh("couldn't open input");
+
+ proclog(inf, stdout, maxpending, opts);
+
+ if (fclose(inf))
+ aargh("fclose input");
+ if (fclose(stdout))
+ aargh("fclose output");
+
+ return 0;
+}
diff --git a/client/adnsresfilter.c b/client/adnsresfilter.c
new file mode 100644
index 0000000..770af17
--- /dev/null
+++ b/client/adnsresfilter.c
@@ -0,0 +1,474 @@
+/*
+ * adnsresfilter.c
+ * - filter which does resolving, not part of the library
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <search.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "config.h"
+#include "adns.h"
+#include "dlist.h"
+#include "tvarith.h"
+#include "client.h"
+
+#ifdef ADNS_REGRESS_TEST
+# include "hredirect.h"
+#endif
+
+struct outqueuenode {
+ struct outqueuenode *next, *back;
+ char *buffer, *textp;
+ int textlen;
+ struct timeval printbefore;
+ struct treething *addr;
+};
+
+static int bracket, forever, address;
+static unsigned long timeout= 1000;
+static adns_rrtype rrt= adns_r_ptr;
+static adns_initflags initflags= 0;
+static const char *config_text;
+
+static int outblocked, inputeof;
+static struct { struct outqueuenode *head, *tail; } outqueue;
+static int peroutqueuenode, outqueuelen;
+
+static struct sockaddr_in sa;
+static adns_state ads;
+
+static char addrtextbuf[14];
+static int cbyte, inbyte, inbuf;
+static unsigned char bytes[4];
+static struct timeval printbefore;
+
+struct treething {
+ unsigned char bytes[4];
+ adns_query qu;
+ adns_answer *ans;
+};
+
+static struct treething *newthing;
+static void *treeroot;
+
+static int nonblock(int fd, int isnonblock) {
+ int r;
+
+ r= fcntl(fd,F_GETFL);
+ if (r==-1) return -1;
+ r= fcntl(fd,F_SETFL, isnonblock ? r|O_NONBLOCK : r&~O_NONBLOCK);
+ if (r==-1) return -1;
+ return 0;
+}
+
+void quitnow(int exitstatus) {
+ nonblock(0,0);
+ nonblock(1,0);
+ exit(exitstatus);
+}
+
+static void sysfail(const char *what) NONRETURNING;
+static void sysfail(const char *what) {
+ fprintf(stderr,"adnsresfilter: system call failed: %s: %s\n",what,strerror(errno));
+ quitnow(2);
+}
+
+static void *xmalloc(size_t sz) {
+ void *r;
+ r= malloc(sz); if (r) return r;
+ sysfail("malloc");
+}
+
+static void outputerr(void) NONRETURNING;
+static void outputerr(void) { sysfail("write to stdout"); }
+
+static void usage(void) {
+ if (printf("usage: adnsresfilter [<options ...>]\n"
+ " adnsresfilter -h|--help | --version\n"
+ "options: -t<milliseconds>|--timeout <milliseconds>\n"
+ " -w|--wait (always wait for queries to time out or fail)\n"
+ " -b|--brackets (require [...] around IP addresses)\n"
+ " -a|--address (always include [address] in output)\n"
+ " -u|--unchecked (do not forward map for checking)\n"
+ " --config <text> (use this instead of resolv.conf)\n"
+ " --debug (turn on adns resolver debugging)\n"
+ "Timeout is the maximum amount to delay any particular bit of output for.\n"
+ "Lookups will go on in the background. Default timeout = 1000 (ms).\n")
+ == EOF) outputerr();
+ if (fflush(stdout)) sysfail("flush stdout");
+}
+
+static void usageerr(const char *why) NONRETURNING;
+static void usageerr(const char *why) {
+ fprintf(stderr,"adnsresfilter: bad usage: %s\n",why);
+ usage();
+ quitnow(1);
+}
+
+static void adnsfail(const char *what, int e) NONRETURNING;
+static void adnsfail(const char *what, int e) {
+ fprintf(stderr,"adnsresfilter: adns call failed: %s: %s\n",what,strerror(e));
+ quitnow(2);
+}
+
+static void settimeout(const char *arg) {
+ char *ep;
+ timeout= strtoul(arg,&ep,0);
+ if (*ep) usageerr("invalid timeout");
+}
+
+static void parseargs(const char *const *argv) {
+ const char *arg;
+ int c;
+
+ while ((arg= *++argv)) {
+ if (arg[0] != '-') usageerr("no non-option arguments are allowed");
+ if (arg[1] == '-') {
+ if (!strcmp(arg,"--timeout")) {
+ if (!(arg= *++argv)) usageerr("--timeout needs a value");
+ settimeout(arg);
+ forever= 0;
+ } else if (!strcmp(arg,"--wait")) {
+ forever= 1;
+ } else if (!strcmp(arg,"--brackets")) {
+ bracket= 1;
+ } else if (!strcmp(arg,"--address")) {
+ address= 1;
+ } else if (!strcmp(arg,"--unchecked")) {
+ rrt= adns_r_ptr_raw;
+ } else if (!strcmp(arg,"--config")) {
+ if (!(arg= *++argv)) usageerr("--config needs a value");
+ config_text= arg;
+ } else if (!strcmp(arg,"--debug")) {
+ initflags |= adns_if_debug;
+ } else if (!strcmp(arg,"--help")) {
+ usage(); quitnow(0);
+ } else if (!strcmp(arg,"--version")) {
+ VERSION_PRINT_QUIT("adnsresfilter"); quitnow(0);
+ } else {
+ usageerr("unknown long option");
+ }
+ } else {
+ while ((c= *++arg)) {
+ switch (c) {
+ case 't':
+ if (*++arg) settimeout(arg);
+ else if ((arg= *++argv)) settimeout(arg);
+ else usageerr("-t needs a value");
+ forever= 0;
+ arg= "\0";
+ break;
+ case 'w':
+ forever= 1;
+ break;
+ case 'b':
+ bracket= 1;
+ break;
+ case 'a':
+ address= 1;
+ break;
+ case 'u':
+ rrt= adns_r_ptr_raw;
+ break;
+ case 'h':
+ usage();
+ quitnow(0);
+ default:
+ usageerr("unknown short option");
+ }
+ }
+ }
+ }
+}
+
+static void queueoutchar(int c) {
+ struct outqueuenode *entry;
+
+ entry= outqueue.tail;
+ if (!entry || entry->addr ||
+ entry->textlen >= peroutqueuenode - (entry->textp - entry->buffer)) {
+ peroutqueuenode= !peroutqueuenode || !entry || entry->addr ? 128 :
+ peroutqueuenode >= 1024 ? 4096 : peroutqueuenode<<2;
+ entry= xmalloc(sizeof(*entry));
+ entry->buffer= xmalloc(peroutqueuenode);
+ entry->textp= entry->buffer;
+ entry->textlen= 0;
+ entry->addr= 0;
+ LIST_LINK_TAIL(outqueue,entry);
+ outqueuelen++;
+ }
+ entry->textp[entry->textlen++]= c;
+}
+
+static void queueoutstr(const char *str, int len) {
+ while (len-- > 0) queueoutchar(*str++);
+}
+
+static void writestdout(struct outqueuenode *entry) {
+ int r;
+
+ while (entry->textlen) {
+ r= write(1, entry->textp, entry->textlen);
+ if (r < 0) {
+ if (errno == EINTR) continue;
+ if (errno == EAGAIN) { outblocked= 1; break; }
+ sysfail("write stdout");
+ }
+ assert(r <= entry->textlen);
+ entry->textp += r;
+ entry->textlen -= r;
+ }
+ if (!entry->textlen) {
+ LIST_UNLINK(outqueue,entry);
+ free(entry->buffer);
+ free(entry);
+ outqueuelen--;
+ }
+}
+
+static void replacetextwithname(struct outqueuenode *entry) {
+ char *name, *newbuf;
+ int namelen, newlen;
+
+ name= entry->addr->ans->rrs.str[0];
+ namelen= strlen(name);
+ if (!address) {
+ free(entry->buffer);
+ entry->buffer= 0;
+ entry->textp= name;
+ entry->textlen= namelen;
+ } else {
+ newlen= entry->textlen + namelen + (bracket ? 0 : 2);
+ newbuf= xmalloc(newlen + 1);
+ sprintf(newbuf, bracket ? "%s%.*s" : "%s[%.*s]", name, entry->textlen, entry->textp);
+ free(entry->buffer);
+ entry->buffer= entry->textp= newbuf;
+ entry->textlen= newlen;
+ }
+}
+
+static void checkadnsqueries(void) {
+ adns_query qu;
+ adns_answer *ans;
+ void *context;
+ struct treething *foundthing;
+ int r;
+
+ for (;;) {
+ qu= 0; context= 0; ans= 0;
+ r= adns_check(ads,&qu,&ans,&context);
+ if (r == ESRCH || r == EAGAIN) break;
+ assert(!r);
+ foundthing= context;
+ foundthing->ans= ans;
+ foundthing->qu= 0;
+ }
+}
+
+static void restartbuf(void) {
+ if (inbuf>0) queueoutstr(addrtextbuf,inbuf);
+ inbuf= 0;
+}
+
+static int comparer(const void *a, const void *b) {
+ return memcmp(a,b,4);
+}
+
+static void procaddr(void) {
+ struct treething *foundthing;
+ void **searchfound;
+ struct outqueuenode *entry;
+ int r;
+
+ if (!newthing) {
+ newthing= xmalloc(sizeof(struct treething));
+ newthing->qu= 0;
+ newthing->ans= 0;
+ }
+
+ memcpy(newthing->bytes,bytes,4);
+ searchfound= tsearch(newthing,&treeroot,comparer);
+ if (!searchfound) sysfail("tsearch");
+ foundthing= *searchfound;
+
+ if (foundthing == newthing) {
+ newthing= 0;
+ memcpy(&sa.sin_addr,bytes,4);
+ r= adns_submit_reverse(ads, (const struct sockaddr*)&sa,
+ rrt,0,foundthing,&foundthing->qu);
+ if (r) adnsfail("submit",r);
+ }
+ entry= xmalloc(sizeof(*entry));
+ entry->buffer= xmalloc(inbuf);
+ entry->textp= entry->buffer;
+ memcpy(entry->textp,addrtextbuf,inbuf);
+ entry->textlen= inbuf;
+ entry->addr= foundthing;
+ entry->printbefore= printbefore;
+ LIST_LINK_TAIL(outqueue,entry);
+ outqueuelen++;
+ inbuf= 0;
+ cbyte= -1;
+}
+
+static void startaddr(void) {
+ bytes[cbyte=0]= 0;
+ inbyte= 0;
+}
+
+static void readstdin(void) {
+ char readbuf[512], *p;
+ int r, c, nbyte;
+
+ while ((r= read(0,readbuf,sizeof(readbuf))) <= 0) {
+ if (r == 0) { inputeof= 1; return; }
+ if (r == EAGAIN) return;
+ if (r != EINTR) sysfail("read stdin");
+ }
+ for (p=readbuf; r>0; r--,p++) {
+ c= *p;
+ if (cbyte==-1 && bracket && c=='[') {
+ addrtextbuf[inbuf++]= c;
+ startaddr();
+ } else if (cbyte==-1 && !bracket && !isalnum(c)) {
+ queueoutchar(c);
+ startaddr();
+ } else if (cbyte>=0 && inbyte<3 && c>='0' && c<='9' &&
+ (nbyte= bytes[cbyte]*10 + (c-'0')) <= 255) {
+ bytes[cbyte]= nbyte;
+ addrtextbuf[inbuf++]= c;
+ inbyte++;
+ } else if (cbyte>=0 && cbyte<3 && inbyte>0 && c=='.') {
+ bytes[++cbyte]= 0;
+ addrtextbuf[inbuf++]= c;
+ inbyte= 0;
+ } else if (cbyte==3 && inbyte>0 && bracket && c==']') {
+ addrtextbuf[inbuf++]= c;
+ procaddr();
+ } else if (cbyte==3 && inbyte>0 && !bracket && !isalnum(c)) {
+ procaddr();
+ queueoutchar(c);
+ startaddr();
+ } else {
+ restartbuf();
+ queueoutchar(c);
+ cbyte= -1;
+ if (!bracket && !isalnum(c)) startaddr();
+ }
+ }
+}
+
+static void startup(void) {
+ int r;
+
+ if (nonblock(0,1)) sysfail("set stdin to nonblocking mode");
+ if (nonblock(1,1)) sysfail("set stdout to nonblocking mode");
+ memset(&sa,0,sizeof(sa));
+ sa.sin_family= AF_INET;
+ if (config_text) {
+ r= adns_init_strcfg(&ads,initflags,stderr,config_text);
+ } else {
+ r= adns_init(&ads,initflags,0);
+ }
+ if (r) adnsfail("init",r);
+ cbyte= -1;
+ inbyte= -1;
+ inbuf= 0;
+ if (!bracket) startaddr();
+}
+
+int main(int argc, const char *const *argv) {
+ int r, maxfd;
+ fd_set readfds, writefds, exceptfds;
+ struct outqueuenode *entry;
+ struct timeval *tv, tvbuf, now;
+
+ parseargs(argv);
+ startup();
+
+ while (!inputeof || outqueue.head) {
+ maxfd= 2;
+ tv= 0;
+ FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds);
+ if ((entry= outqueue.head) && !outblocked) {
+ if (!entry->addr) {
+ writestdout(entry);
+ continue;
+ }
+ if (entry->addr->ans) {
+ if (entry->addr->ans->nrrs)
+ replacetextwithname(entry);
+ entry->addr= 0;
+ continue;
+ }
+ r= gettimeofday(&now,0); if (r) sysfail("gettimeofday");
+ if (forever) {
+ tv= 0;
+ } else if (!timercmp(&now,&entry->printbefore,<)) {
+ entry->addr= 0;
+ continue;
+ } else {
+ tvbuf.tv_sec= entry->printbefore.tv_sec - now.tv_sec - 1;
+ tvbuf.tv_usec= entry->printbefore.tv_usec - now.tv_usec + 1000000;
+ tvbuf.tv_sec += tvbuf.tv_usec / 1000000;
+ tvbuf.tv_usec %= 1000000;
+ tv= &tvbuf;
+ }
+ adns_beforeselect(ads,&maxfd,&readfds,&writefds,&exceptfds,
+ &tv,&tvbuf,&now);
+ }
+ if (outblocked) FD_SET(1,&writefds);
+ if (!inputeof && outqueuelen<1024) FD_SET(0,&readfds);
+
+ r= select(maxfd,&readfds,&writefds,&exceptfds,tv);
+ if (r < 0) { if (r == EINTR) continue; else sysfail("select"); }
+
+ r= gettimeofday(&now,0); if (r) sysfail("gettimeofday");
+ adns_afterselect(ads,maxfd,&readfds,&writefds,&exceptfds,&now);
+ checkadnsqueries();
+
+ if (FD_ISSET(0,&readfds)) {
+ if (!forever) {
+ printbefore= now;
+ timevaladd(&printbefore,timeout);
+ }
+ readstdin();
+ } else if (FD_ISSET(1,&writefds)) {
+ outblocked= 0;
+ }
+ }
+ if (nonblock(0,0)) sysfail("un-nonblock stdin");
+ if (nonblock(1,0)) sysfail("un-nonblock stdout");
+ adns_finish(ads);
+ exit(0);
+}
diff --git a/client/adnstest.c b/client/adnstest.c
new file mode 100644
index 0000000..59a3bbc
--- /dev/null
+++ b/client/adnstest.c
@@ -0,0 +1,358 @@
+/*
+ * adnstest.c
+ * - simple test program, not part of the library
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <stdio.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#define ADNS_FEATURE_MANYAF
+#include "config.h"
+#include "adns.h"
+
+#ifdef ADNS_REGRESS_TEST
+# include "hredirect.h"
+#endif
+
+struct myctx {
+ adns_query qu;
+ int doneyet, found;
+ const char *fdom;
+};
+
+static struct myctx *mcs;
+static adns_state ads;
+static adns_rrtype *types_a;
+
+static void quitnow(int rc) NONRETURNING;
+static void quitnow(int rc) {
+ free(mcs);
+ free(types_a);
+ if (ads) adns_finish(ads);
+
+ exit(rc);
+}
+
+#ifndef HAVE_POLL
+#undef poll
+int poll(struct pollfd *ufds, int nfds, int timeout) {
+ fputs("poll(2) not supported on this system\n",stderr);
+ quitnow(5);
+}
+#define adns_beforepoll(a,b,c,d,e) 0
+#define adns_afterpoll(a,b,c,d) 0
+#endif
+
+static void failure_status(const char *what, adns_status st) NONRETURNING;
+static void failure_status(const char *what, adns_status st) {
+ fprintf(stderr,"adns failure: %s: %s\n",what,adns_strerror(st));
+ quitnow(2);
+}
+
+static void failure_errno(const char *what, int errnoval) NONRETURNING;
+static void failure_errno(const char *what, int errnoval) {
+ switch (errnoval) {
+#define CE(e) \
+ case e: fprintf(stderr,"adns failure: %s: errno=" #e "\n",what); break
+ CE(EINVAL);
+ CE(EINTR);
+ CE(ESRCH);
+ CE(EAGAIN);
+ CE(ENOSYS);
+ CE(ERANGE);
+#undef CE
+ default: fprintf(stderr,"adns failure: %s: errno=%d\n",what,errnoval); break;
+ }
+ quitnow(2);
+}
+
+static void usageerr(const char *why) NONRETURNING;
+static void usageerr(const char *why) {
+ fprintf(stderr,
+ "bad usage: %s\n"
+ "usage: adnstest [-<initflagsnum>[,<owninitflags>]] [/<initstring>]\n"
+ " [ :<typenum>,... ]\n"
+ " [ [<queryflagsnum>[,<ownqueryflags>]/]<domain> ... ]\n"
+ "initflags: p use poll(2) instead of select(2)\n"
+ " s use adns_wait with specified query, instead of 0\n"
+ "queryflags: a print status abbrevs instead of strings\n"
+ "typenum: may be 0x<hex>|<dec>, or 0x<hex> or <dec>\n"
+ "exit status: 0 ok (though some queries may have failed)\n"
+ " 1 used by test harness to indicate test failed\n"
+ " 2 unable to submit or init or some such\n"
+ " 3 unexpected failure\n"
+ " 4 usage error\n"
+ " 5 operation not supported on this system\n",
+ why);
+ quitnow(4);
+}
+
+static const adns_rrtype defaulttypes[]= {
+ adns_r_a,
+ adns_r_ns_raw,
+ adns_r_cname,
+ adns_r_soa_raw,
+ adns_r_ptr_raw,
+ adns_r_hinfo,
+ adns_r_mx_raw,
+ adns_r_txt,
+ adns_r_rp_raw,
+
+ adns_r_addr,
+ adns_r_ns,
+ adns_r_ptr,
+ adns_r_mx,
+
+ adns_r_soa,
+ adns_r_rp,
+
+ adns_r_none
+};
+
+static void dumptype(adns_status ri, const char *rrtn, const char *fmtn) {
+ fprintf(stdout, "%s(%s)%s%s",
+ (!ri && rrtn) ? rrtn : "?", ri ? "?" : fmtn ? fmtn : "-",
+ ri ? " " : "", ri ? adns_strerror(ri) : "");
+}
+
+static void fdom_split(const char *fdom, const char **dom_r, int *qf_r,
+ char *ownflags, int ownflags_l) {
+ int qf;
+ char *ep;
+
+ qf= strtoul(fdom,&ep,0);
+ if (*ep == ',' && strchr(ep,'/')) {
+ ep++;
+ while (*ep != '/') {
+ if (--ownflags_l <= 0) { fputs("too many flags\n",stderr); quitnow(3); }
+ *ownflags++= *ep++;
+ }
+ }
+ if (*ep != '/') { *dom_r= fdom; *qf_r= 0; }
+ else { *dom_r= ep+1; *qf_r= qf; }
+ *ownflags= 0;
+}
+
+static int consistsof(const char *string, const char *accept) {
+ return strspn(string,accept) == strlen(string);
+}
+
+int main(int argc, char *const *argv) {
+ adns_query qu;
+ struct myctx *mc, *mcw;
+ void *mcr;
+ adns_answer *ans;
+ const char *initstring, *rrtn, *fmtn;
+ const char *const *fdomlist, *domain;
+ char *show, *cp;
+ int len, i, qc, qi, tc, ti, ch, qflags, initflagsnum;
+ adns_status ri;
+ int r;
+ const adns_rrtype *types;
+ struct timeval now;
+ char ownflags[10];
+ char *ep;
+ const char *initflags, *owninitflags;
+
+ if (argv[0] && argv[1] && argv[1][0] == '-') {
+ initflags= argv[1]+1;
+ argv++;
+ } else {
+ initflags= "";
+ }
+ if (argv[0] && argv[1] && argv[1][0] == '/') {
+ initstring= argv[1]+1;
+ argv++;
+ } else {
+ initstring= 0;
+ }
+
+ initflagsnum= strtoul(initflags,&ep,0);
+ if (*ep == ',') {
+ owninitflags= ep+1;
+ if (!consistsof(owninitflags,"ps")) usageerr("unknown owninitflag");
+ } else if (!*ep) {
+ owninitflags= "";
+ } else {
+ usageerr("bad <initflagsnum>[,<owninitflags>]");
+ }
+
+ if (argv[0] && argv[1] && argv[1][0] == ':') {
+ for (cp= argv[1]+1, tc=1; (ch= *cp); cp++)
+ if (ch==',') tc++;
+ types_a= malloc(sizeof(*types_a)*(tc+1));
+ if (!types_a) { perror("malloc types"); quitnow(3); }
+ for (cp= argv[1]+1, ti=0; ti<tc; ) {
+ types_a[ti]= 0;
+ for (;;) {
+ types_a[ti] |= strtoul(cp,&cp,0);
+ ch= *cp;
+ if (!ch) break;
+ cp++;
+ if (ch=='|') continue;
+ if (ch==',') break;
+ usageerr("unexpected char (not comma) in or between types");
+ }
+ ti++;
+ if (!ch) break;
+ }
+ types_a[ti]= adns_r_none;
+ types= types_a;
+ argv++;
+ } else {
+ types_a= 0;
+ types= defaulttypes;
+ }
+
+ if (!(argv[0] && argv[1])) usageerr("no query domains supplied");
+ fdomlist= (const char *const*)argv+1;
+
+ for (qc=0; fdomlist[qc]; qc++);
+ for (tc=0; types[tc] != adns_r_none; tc++);
+ mcs= malloc(tc ? sizeof(*mcs)*qc*tc : 1);
+ if (!mcs) { perror("malloc mcs"); quitnow(3); }
+
+ setvbuf(stdout,0,_IOLBF,0);
+
+ if (initstring) {
+ r= adns_init_strcfg(&ads,
+ (adns_if_debug|adns_if_noautosys|adns_if_checkc_freq)
+ ^initflagsnum,
+ stdout,initstring);
+ } else {
+ r= adns_init(&ads,
+ (adns_if_debug|adns_if_noautosys)^initflagsnum,
+ 0);
+ }
+ if (r) failure_errno("init",r);
+
+ for (qi=0; qi<qc; qi++) {
+ fdom_split(fdomlist[qi],&domain,&qflags,ownflags,sizeof(ownflags));
+ if (!consistsof(ownflags,"a")) usageerr("unknown ownqueryflag");
+ for (ti=0; ti<tc; ti++) {
+ mc= &mcs[qi*tc+ti];
+ mc->doneyet= 0;
+ mc->fdom= fdomlist[qi];
+
+ fprintf(stdout,"%s flags %d type %d",
+ domain,qflags,types[ti]&adns_rrt_reprmask);
+ r= adns_submit(ads,domain,types[ti],qflags,mc,&mc->qu);
+ if (r == ENOSYS) {
+ fprintf(stdout," not implemented\n");
+ mc->qu= 0;
+ mc->doneyet= 1;
+ } else if (r) {
+ failure_errno("submit",r);
+ } else {
+ ri= adns_rr_info(types[ti], &rrtn,&fmtn,0, 0,0);
+ putc(' ',stdout);
+ dumptype(ri,rrtn,fmtn);
+ fprintf(stdout," submitted\n");
+ }
+ }
+ }
+
+ for (;;) {
+ for (qi=0; qi<qc; qi++) {
+ for (ti=0; ti<tc; ti++) {
+ mc= &mcs[qi*tc+ti];
+ mc->found= 0;
+ }
+ }
+ for (adns_forallqueries_begin(ads);
+ (qu= adns_forallqueries_next(ads,&mcr));
+ ) {
+ mc= mcr;
+ assert(qu == mc->qu);
+ assert(!mc->doneyet);
+ mc->found= 1;
+ }
+ mcw= 0;
+ for (qi=0; qi<qc; qi++) {
+ for (ti=0; ti<tc; ti++) {
+ mc= &mcs[qi*tc+ti];
+ if (mc->doneyet) continue;
+ assert(mc->found);
+ if (!mcw) mcw= mc;
+ }
+ }
+ if (!mcw) break;
+
+ if (strchr(owninitflags,'s')) {
+ qu= mcw->qu;
+ mc= mcw;
+ } else {
+ qu= 0;
+ mc= 0;
+ }
+
+ if (strchr(owninitflags,'p')) {
+ r= adns_wait_poll(ads,&qu,&ans,&mcr);
+ } else {
+ r= adns_wait(ads,&qu,&ans,&mcr);
+ }
+ if (r) failure_errno("wait/check",r);
+
+ if (mc) assert(mcr==mc);
+ else mc= mcr;
+ assert(qu==mc->qu);
+ assert(!mc->doneyet);
+
+ fdom_split(mc->fdom,&domain,&qflags,ownflags,sizeof(ownflags));
+
+ if (gettimeofday(&now,0)) { perror("gettimeofday"); quitnow(3); }
+
+ ri= adns_rr_info(ans->type, &rrtn,&fmtn,&len, 0,0);
+ fprintf(stdout, "%s flags %d type ",domain,qflags);
+ dumptype(ri,rrtn,fmtn);
+ fprintf(stdout, "%s%s: %s; nrrs=%d; cname=%s; owner=%s; ttl=%ld\n",
+ ownflags[0] ? " ownflags=" : "", ownflags,
+ strchr(ownflags,'a')
+ ? adns_errabbrev(ans->status)
+ : adns_strerror(ans->status),
+ ans->nrrs,
+ ans->cname ? ans->cname : "$",
+ ans->owner ? ans->owner : "$",
+ (long)ans->expires - (long)now.tv_sec);
+ if (ans->nrrs) {
+ assert(!ri);
+ for (i=0; i<ans->nrrs; i++) {
+ ri= adns_rr_info(ans->type, 0,0,0, ans->rrs.bytes + i*len, &show);
+ if (ri) failure_status("info",ri);
+ fprintf(stdout," %s\n",show);
+ free(show);
+ }
+ }
+ free(ans);
+
+ mc->doneyet= 1;
+ }
+
+ quitnow(0);
+}
diff --git a/client/client.h b/client/client.h
new file mode 100644
index 0000000..5d2f475
--- /dev/null
+++ b/client/client.h
@@ -0,0 +1,53 @@
+/*
+ * clients.h
+ * - useful declarations and definitions for adns client programs
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#ifndef CLIENT_H_INCLUDED
+#define CLIENT_H_INCLUDED
+
+#define ADNS_VERSION_STRING "1.5.0~rc1"
+
+#define COPYRIGHT_MESSAGE \
+ "Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson\n" \
+ "Copyright (C) 2014 Mark Wooding\n" \
+ "Copyright (C) 1999-2000,2003,2006 Tony Finch\n" \
+ "Copyright (C) 1991 Massachusetts Institute of Technology\n" \
+ "This is free software; see the source for copying conditions. There is NO\n" \
+ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+
+#define VERSION_MESSAGE(program) \
+ program " (GNU adns) " ADNS_VERSION_STRING "\n\n" COPYRIGHT_MESSAGE
+
+#define VERSION_PRINT_QUIT(program) \
+ if (fputs(VERSION_MESSAGE(program),stdout) == EOF || \
+ fclose(stdout)) { \
+ perror(program ": write version message"); \
+ quitnow(-1); \
+ } \
+ quitnow(0);
+
+void quitnow(int rc) NONRETURNING;
+
+#endif
diff --git a/client/fanftest.c b/client/fanftest.c
new file mode 100644
index 0000000..3caa882
--- /dev/null
+++ b/client/fanftest.c
@@ -0,0 +1,85 @@
+/*
+ * fanftest.c
+ * - a small test program from Tony Finch
+ */
+/*
+ * This file is
+ * Copyright (C) 1999 Tony Finch <dot@dotat.at>
+ * Copyright (C) 1999-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ * It is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ *
+ * This version was originally supplied by Tony Finch, but has been
+ * modified by Ian Jackson as it was incorporated into adns.
+ */
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+
+#include "config.h"
+#include "adns.h"
+
+static const char *progname;
+
+static void aargh(const char *msg) {
+ fprintf(stderr, "%s: %s: %s (%d)\n", progname, msg,
+ strerror(errno) ? strerror(errno) : "Unknown error", errno);
+ exit(1);
+}
+
+int main(int argc, char *argv[]) {
+ adns_state adns;
+ adns_query query;
+ adns_answer *answer;
+
+ progname= strrchr(*argv, '/');
+ if (progname)
+ progname++;
+ else
+ progname= *argv;
+
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s <domain>\n", progname);
+ exit(1);
+ }
+
+ errno= adns_init(&adns, adns_if_debug, 0);
+ if (errno) aargh("adns_init");
+
+ errno= adns_submit(adns, argv[1], adns_r_ptr,
+ adns_qf_quoteok_cname|adns_qf_cname_loose,
+ NULL, &query);
+ if (errno) aargh("adns_submit");
+
+ errno= adns_wait(adns, &query, &answer, NULL);
+ if (errno) aargh("adns_init");
+
+ printf("%s\n", answer->status == adns_s_ok ? *answer->rrs.str : "dunno");
+
+ adns_finish(adns);
+
+ return 0;
+}
diff --git a/common.make.in b/common.make.in
new file mode 100644
index 0000000..0f6df15
--- /dev/null
+++ b/common.make.in
@@ -0,0 +1,63 @@
+# common.make[.in] - common configuration settings for Makefiles,
+# used by autoconf/configure to generate settings.make
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+MAJOR= 1
+MINOR= 5
+SHLIBFILE= @SHLIBFILE@
+SHLIBSONAME= @SHLIBSONAME@
+SHLIBFORLINK= @SHLIBFORLINK@
+
+CC= @CC@
+CFLAGS= $(AUTOCFLAGS) $(WARNS) $(WERROR) $(DIRCFLAGS) $(XCFLAGS)
+LDFLAGS= $(AUTOLDFLAGS) $(DIRLDFLAGS) $(XLDFLAGS)
+LDLIBS= @LIBS@ $(XLIBS)
+AUTOCFLAGS= @CFLAGS@
+AUTOLDFLAGS= @LDFLAGS@
+WARNS= @WARNS@
+#WERROR= -Werror
+
+M4= m4
+RANLIB= @RANLIB@
+
+SHLIBCC= @SHLIBCC@
+
+MKSHLIB_1= @MKSHLIB_1@
+MKSHLIB_2= @MKSHLIB_2@
+MKSHLIB_3= @MKSHLIB_3@
+
+prefix= @prefix@
+exec_prefix= @exec_prefix@
+bindir= @bindir@
+libdir= @libdir@
+includedir= @includedir@
+
+AC_INSTALL= @INSTALL@
+ifeq ($(AC_INSTALL),./install-sh -c)
+INSTALL= $(srcdir)/../$(AC_INSTALL)
+else
+INSTALL= $(AC_INSTALL)
+endif
+
+INSTALL_PROGRAM= $(INSTALL) -m 755 $(INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA= $(INSTALL) -m 644
+
diff --git a/configure b/configure
new file mode 100755
index 0000000..825233c
--- /dev/null
+++ b/configure
@@ -0,0 +1,5342 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+PACKAGE_URL=
+
+ac_unique_file="src/adns.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+SHLIBSONAME
+SHLIBFILE
+SHLIBFORLINK
+MKSHLIB_3
+MKSHLIB_2
+MKSHLIB_1
+SHLIBCC
+WARNS
+EGREP
+GREP
+PROGS_HAVE_TSEARCH
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+RANLIB
+CPP
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+ENABLE_DYNAMIC
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dynamic
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+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 this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-dynamic use static linking
+ --enable-dynamic=elf create and use ELF dynamic library (default)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+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 $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_config_headers="$ac_config_headers src/config.h"
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether you requested dynamic linking" >&5
+$as_echo_n "checking whether you requested dynamic linking... " >&6; }
+
+# Check whether --enable-dynamic was given.
+if test "${enable_dynamic+set}" = set; then :
+ enableval=$enable_dynamic; case "$enableval" in
+ elf|yes)
+ ENABLE_DYNAMIC=elf
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (ELF)" >&5
+$as_echo "yes (ELF)" >&6; }
+ ;;
+ no) ENABLE_DYNAMIC=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+ *) as_fn_error $? "\"invalid value $enableval for --enable-dynamic, try yes or elf\"" "$LINENO" 5
+ ;;
+ esac
+
+else
+
+ ENABLE_DYNAMIC=elf
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, by default" >&5
+$as_echo "yes, by default" >&6; }
+
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+
+for ac_func in poll
+do :
+ ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll"
+if test "x$ac_cv_func_poll" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_POLL 1
+_ACEOF
+
+fi
+done
+
+
+ ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket"
+if test "x$ac_cv_func_socket" = xyes; then :
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5
+$as_echo_n "checking for socket in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_socket+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char socket ();
+int
+main ()
+{
+return socket ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_socket_socket=yes
+else
+ ac_cv_lib_socket_socket=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5
+$as_echo "$ac_cv_lib_socket_socket" >&6; }
+if test "x$ac_cv_lib_socket_socket" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBSOCKET 1
+_ACEOF
+
+ LIBS="-lsocket $LIBS"
+
+else
+
+ as_fn_error $? "cannot find library function socket" "$LINENO" 5
+
+fi
+
+
+fi
+
+
+
+ ac_fn_c_check_func "$LINENO" "inet_ntoa" "ac_cv_func_inet_ntoa"
+if test "x$ac_cv_func_inet_ntoa" = xyes; then :
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnsl" >&5
+$as_echo_n "checking for inet_ntoa in -lnsl... " >&6; }
+if ${ac_cv_lib_nsl_inet_ntoa+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inet_ntoa ();
+int
+main ()
+{
+return inet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nsl_inet_ntoa=yes
+else
+ ac_cv_lib_nsl_inet_ntoa=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_inet_ntoa" >&5
+$as_echo "$ac_cv_lib_nsl_inet_ntoa" >&6; }
+if test "x$ac_cv_lib_nsl_inet_ntoa" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBNSL 1
+_ACEOF
+
+ LIBS="-lnsl $LIBS"
+
+else
+
+ as_fn_error $? "cannot find library function inet_ntoa" "$LINENO" 5
+
+fi
+
+
+fi
+
+
+
+PROGS_IF_TSEARCH=adnsresfilter
+
+ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch"
+if test "x$ac_cv_func_tsearch" = xyes; then :
+
+ PROGS_HAVE_TSEARCH=$PROGS_IF_TSEARCH
+
+else
+
+ PROGS_HAVE_TSEARCH='';
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: tsearch missing - not building client program(s) $PROGS_IF_TSEARCH" >&5
+$as_echo "$as_me: WARNING: tsearch missing - not building client program(s) $PROGS_IF_TSEARCH" >&2;}
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for INADDR_LOOPBACK" >&5
+$as_echo_n "checking for INADDR_LOOPBACK... " >&6; }
+if ${adns_cv_decl_inaddrloopback+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+int
+main ()
+{
+
+ INADDR_LOOPBACK;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ adns_cv_decl_inaddrloopback=yes
+else
+ adns_cv_decl_inaddrloopback=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+if test "$adns_cv_decl_inaddrloopback" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not in standard headers, urgh..." >&5
+$as_echo "not in standard headers, urgh..." >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+ac_fn_c_check_header_mongrel "$LINENO" "rpc/types.h" "ac_cv_header_rpc_types_h" "$ac_includes_default"
+if test "x$ac_cv_header_rpc_types_h" = xyes; then :
+
+ $as_echo "#define HAVEUSE_RPCTYPES_H 1" >>confdefs.h
+
+
+else
+
+ as_fn_error $? "cannot find INADDR_LOOPBACK or rpc/types.h" "$LINENO" 5
+
+fi
+
+
+fi
+
+
+ ac_fn_c_check_func "$LINENO" "inet_aton" "ac_cv_func_inet_aton"
+if test "x$ac_cv_func_inet_aton" = xyes; then :
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv" >&5
+$as_echo_n "checking for inet_aton in -lresolv... " >&6; }
+if ${ac_cv_lib_resolv_inet_aton+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lresolv $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inet_aton ();
+int
+main ()
+{
+return inet_aton ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_resolv_inet_aton=yes
+else
+ ac_cv_lib_resolv_inet_aton=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_inet_aton" >&5
+$as_echo "$ac_cv_lib_resolv_inet_aton" >&6; }
+if test "x$ac_cv_lib_resolv_inet_aton" = xyes; then :
+
+ LIBS="-lresolv $LIBS";
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: inet_aton is in libresolv, urgh. Must use -lresolv." >&5
+$as_echo "$as_me: WARNING: inet_aton is in libresolv, urgh. Must use -lresolv." >&2;}
+
+else
+
+ as_fn_error $? "cannot find library function inet_aton" "$LINENO" 5
+
+fi
+
+
+fi
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking inlines" >&5
+$as_echo_n "checking inlines... " >&6; }
+ if ${dpkg_cv_c_inline+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+} inline int foo (int x) {
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ dpkg_cv_c_inline=yes
+else
+ dpkg_cv_c_inline=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+
+ if test "x$dpkg_cv_c_inline" = xyes; then
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ $as_echo "#define HAVE_INLINE 1" >>confdefs.h
+
+ else
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+
+
+
+
+if test "${GCC-no}" = yes; then
+ WARNS="-Wall -Wmissing-prototypes -Wwrite-strings -Wstrict-prototypes -Wcast-qual -Wpointer-arith"
+ saved_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS -Wno-pointer-sign"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking -Wno-pointer-sign" >&5
+$as_echo_n "checking -Wno-pointer-sign... " >&6; }
+ if ${adns_cv_c_wnoptrsign+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ adns_cv_c_wnoptrsign=yes
+else
+ adns_cv_c_wnoptrsign=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+
+ if test "x$adns_cv_c_wnoptrsign" = xyes; then
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ WARNS="$WARNS -Wno-pointer-sign"
+ else
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+
+ CFLAGS="$saved_cflags"
+else
+ WARNS=
+fi
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking __attribute__((,,))" >&5
+$as_echo_n "checking __attribute__((,,))... " >&6; }
+ if ${adns_cv_c_attribute_supported+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+extern int testfunction(int x) __attribute__((,,))
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ adns_cv_c_attribute_supported=yes
+else
+ adns_cv_c_attribute_supported=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+
+ if test "x$adns_cv_c_attribute_supported" = xyes; then
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ $as_echo "#define HAVE_GNUC25_ATTRIB 1" >>confdefs.h
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking __attribute__((noreturn))" >&5
+$as_echo_n "checking __attribute__((noreturn))... " >&6; }
+ if ${adns_cv_c_attribute_noreturn+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+extern int testfunction(int x) __attribute__((noreturn))
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ adns_cv_c_attribute_noreturn=yes
+else
+ adns_cv_c_attribute_noreturn=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+
+ if test "x$adns_cv_c_attribute_noreturn" = xyes; then
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ $as_echo "#define HAVE_GNUC25_NORETURN 1" >>confdefs.h
+
+ else
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking __attribute__((const))" >&5
+$as_echo_n "checking __attribute__((const))... " >&6; }
+ if ${adns_cv_c_attribute_const+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+extern int testfunction(int x) __attribute__((const))
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ adns_cv_c_attribute_const=yes
+else
+ adns_cv_c_attribute_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+
+ if test "x$adns_cv_c_attribute_const" = xyes; then
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ $as_echo "#define HAVE_GNUC25_CONST 1" >>confdefs.h
+
+ else
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking __attribute__((format...))" >&5
+$as_echo_n "checking __attribute__((format...))... " >&6; }
+ if ${adns_cv_attribute_format+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+extern int testfunction(char *y, ...) __attribute__((format(printf,1,2)))
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ adns_cv_attribute_format=yes
+else
+ adns_cv_attribute_format=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+
+ if test "x$adns_cv_attribute_format" = xyes; then
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ $as_echo "#define HAVE_GNUC25_PRINTFFORMAT 1" >>confdefs.h
+
+ else
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+
+ else
+ true
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+SHLIBFORLINK='libadns.so'
+SHLIBSONAME='$(SHLIBFORLINK).$(MAJOR)'
+SHLIBFILE='$(SHLIBSONAME).$(MINOR)'
+
+SHLIBCC='$(CC) $(CFLAGS) -fpic'
+MKSHLIB_1='$(CC) $(LDFLAGS) -shared -Wl,-soname=$(SHLIBSONAME) -o'
+MKSHLIB_2=''
+MKSHLIB_3='-lc'
+
+ac_config_files="$ac_config_files common.make settings.make Makefile src/Makefile client/Makefile dynamic/Makefile regress/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;;
+ "common.make") CONFIG_FILES="$CONFIG_FILES common.make" ;;
+ "settings.make") CONFIG_FILES="$CONFIG_FILES settings.make" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+ "client/Makefile") CONFIG_FILES="$CONFIG_FILES client/Makefile" ;;
+ "dynamic/Makefile") CONFIG_FILES="$CONFIG_FILES dynamic/Makefile" ;;
+ "regress/Makefile") CONFIG_FILES="$CONFIG_FILES regress/Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS "
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+
+ esac
+
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..2221d08
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,153 @@
+# configure.in - input to autoconf
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+AC_INIT(src/adns.h)
+AC_CONFIG_HEADER(src/config.h)
+
+dnl DPKG_CACHED_TRY_COMPILE(<description>,<cachevar>,<include>,<program>,<ifyes>,<ifno>)
+define([DPKG_CACHED_TRY_COMPILE],[
+ AC_MSG_CHECKING($1)
+ AC_CACHE_VAL($2,[
+ AC_TRY_COMPILE([$3],[$4],[$2=yes],[$2=no])
+ ])
+ if test "x$$2" = xyes; then
+ true
+ $5
+ else
+ true
+ $6
+ fi
+])
+
+AC_MSG_CHECKING(whether you requested dynamic linking)
+AC_SUBST(ENABLE_DYNAMIC)
+AC_ARG_ENABLE(dynamic,
+[ --disable-dynamic use static linking
+ --enable-dynamic[=elf] create and use ELF dynamic library (default)],
+[ case "$enableval" in
+ elf|yes)
+ ENABLE_DYNAMIC=elf
+ AC_MSG_RESULT([yes (ELF)])
+ ;;
+ no) ENABLE_DYNAMIC=no
+ AC_MSG_RESULT(no)
+ ;;
+ *) AC_MSG_ERROR(
+["invalid value $enableval for --enable-dynamic, try yes or elf"])
+ ;;
+ esac
+],[
+ ENABLE_DYNAMIC=elf
+ AC_MSG_RESULT([yes, by default])
+])
+
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_RANLIB
+AC_PROG_INSTALL
+
+AC_CHECK_FUNCS(poll)
+ADNS_C_GETFUNC(socket,socket)
+ADNS_C_GETFUNC(inet_ntoa,nsl)
+
+PROGS_IF_TSEARCH=adnsresfilter
+AC_SUBST(PROGS_HAVE_TSEARCH)
+AC_CHECK_FUNC(tsearch,[
+ PROGS_HAVE_TSEARCH=$PROGS_IF_TSEARCH
+],[
+ PROGS_HAVE_TSEARCH='';
+ AC_MSG_WARN([tsearch missing - not building client program(s) $PROGS_IF_TSEARCH])
+])
+
+AC_MSG_CHECKING(for INADDR_LOOPBACK)
+AC_CACHE_VAL(adns_cv_decl_inaddrloopback,[
+ AC_TRY_COMPILE([
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+ ],[
+ INADDR_LOOPBACK;
+ ],
+ adns_cv_decl_inaddrloopback=yes,
+ adns_cv_decl_inaddrloopback=no)])
+if test "$adns_cv_decl_inaddrloopback" = yes; then
+ AC_MSG_RESULT(found)
+else
+ AC_MSG_RESULT([not in standard headers, urgh...])
+ AC_CHECK_HEADER(rpc/types.h,[
+ AC_DEFINE(HAVEUSE_RPCTYPES_H)
+ ],[
+ AC_MSG_ERROR([cannot find INADDR_LOOPBACK or rpc/types.h])
+ ])
+fi
+
+ADNS_C_GETFUNC(inet_aton,resolv,[
+ LIBS="-lresolv $LIBS";
+ AC_MSG_WARN([inet_aton is in libresolv, urgh. Must use -lresolv.])
+])
+
+DPKG_CACHED_TRY_COMPILE(inlines,dpkg_cv_c_inline,,
+ [} inline int foo (int x) {],
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_INLINE),
+ AC_MSG_RESULT(no))
+
+AC_SUBST(WARNS)
+
+if test "${GCC-no}" = yes; then
+ WARNS="-Wall -Wmissing-prototypes -Wwrite-strings -Wstrict-prototypes -Wcast-qual -Wpointer-arith"
+ saved_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS -Wno-pointer-sign"
+ DPKG_CACHED_TRY_COMPILE(-Wno-pointer-sign,adns_cv_c_wnoptrsign,,
+ [],
+ AC_MSG_RESULT(yes)
+ WARNS="$WARNS -Wno-pointer-sign",
+ AC_MSG_RESULT(no))
+ CFLAGS="$saved_cflags"
+else
+ WARNS=
+fi
+
+ADNS_C_GCCATTRIB
+
+AC_SUBST(SHLIBCC)
+AC_SUBST(MKSHLIB_1)
+AC_SUBST(MKSHLIB_2)
+AC_SUBST(MKSHLIB_3)
+
+AC_SUBST(SHLIBFORLINK)
+AC_SUBST(SHLIBFILE)
+AC_SUBST(SHLIBSONAME)
+
+SHLIBFORLINK='libadns.so'
+SHLIBSONAME='$(SHLIBFORLINK).$(MAJOR)'
+SHLIBFILE='$(SHLIBSONAME).$(MINOR)'
+
+SHLIBCC='$(CC) $(CFLAGS) -fpic'
+MKSHLIB_1='$(CC) $(LDFLAGS) -shared -Wl,-soname=$(SHLIBSONAME) -o'
+MKSHLIB_2=''
+MKSHLIB_3='-lc'
+
+AC_OUTPUT(
+ common.make settings.make Makefile
+ src/Makefile client/Makefile dynamic/Makefile regress/Makefile
+)
diff --git a/dynamic/Makefile.in b/dynamic/Makefile.in
new file mode 100644
index 0000000..61c8289
--- /dev/null
+++ b/dynamic/Makefile.in
@@ -0,0 +1,55 @@
+# dynamic/Makefile - dynamic library Makefile
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+srcdir= @srcdir@
+VPATH= @srcdir@
+
+TARGETS= $(SHLIBFILE) $(SHLIBSONAME) $(SHLIBFORLINK)
+include ../settings.make
+include $(srcdir)/../src/adns.make
+
+ALLOBJS= $(addsuffix _p.o, $(basename $(LIBOBJS)))
+
+install:
+ mkdir -p $(libdir)
+ $(INSTALL_PROGRAM) $(SHLIBFILE) $(libdir)/$(SHLIBFILE)
+ ln -sf $(SHLIBFILE) $(libdir)/$(SHLIBSONAME)
+ ln -sf $(SHLIBSONAME) $(libdir)/$(SHLIBFORLINK)
+
+uninstall:
+ rm -f $(libdir)/$(SHLIBFILE) $(libdir)/$(SHLIBSONAME)
+
+$(SHLIBFORLINK):
+ ln -s $(SHLIBSONAME) $(SHLIBFORLINK)
+
+$(SHLIBSONAME):
+ ln -s $(SHLIBFILE) $(SHLIBSONAME)
+
+$(SHLIBFILE): $(ALLOBJS)
+ rm -f $@
+ $(MKSHLIB_1) $@ $(MKSHLIB_2) $(ALLOBJS) $(LDLIBS) $(MKSHLIB_3)
+
+%_p.o: $(srcdir)/../src/%.c $(srcdir)/../src/adns.h \
+ $(srcdir)/../src/internal.h ../src/config.h
+ $(SHLIBCC) -I. -I../src -I$(srcdir)/../src -c -o $@ $<
+
+$(LIBOBJS):
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..ebc6691
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,250 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/regress/Makefile.in b/regress/Makefile.in
new file mode 100644
index 0000000..b0035e7
--- /dev/null
+++ b/regress/Makefile.in
@@ -0,0 +1,91 @@
+# regress/Makefile[.in] - regression test Makefile
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+srcdir= @srcdir@
+VPATH= @srcdir@
+
+PROGS_SYSDEP= @PROGS_HAVE_TSEARCH@
+
+CLIENTS= adnstest adnshost adnslogres $(PROGS_SYSDEP)
+AUTOCHDRS= harness.h hsyscalls.h hredirect.h
+AUTOCSRCS= hrecord.c hplayback.c hcommon.c
+include ../settings.make
+include $(srcdir)/../src/adns.make
+
+DIRCFLAGS= -I../src -I$(srcdir) -I$(srcdir)/../src
+
+HCPPFLAGS= -DADNS_REGRESS_TEST -I.
+
+REDIRLIBOBJS= $(addsuffix _d.o, $(basename $(LIBOBJS)))
+HARNLOBJS= hcommon.o $(REDIRLIBOBJS)
+TARGETS= $(addsuffix _record, $(CLIENTS)) $(addsuffix _playback, $(CLIENTS))
+ADH_OBJS= adh-main_c.o adh-opts_c.o adh-query_c.o
+ALL_OBJS= $(HARNLOBJS) dtest.o hrecord.o hplayback.o
+
+.PRECIOUS: $(AUTOCSRCS) $(AUTOCHDRS)
+
+all install uninstall: $(TARGETS)
+
+ALL_TESTS:=$(patsubst $(srcdir)/case-%.sys,%,$(wildcard $(srcdir)/case-*.sys))
+
+check: $(TARGETS) $(addprefix check-,$(ALL_TESTS))
+ @echo
+ @echo 'all tests passed or maybe skipped.'
+
+check-%: case-%.sys
+ @srcdir=$(srcdir) $(srcdir)/r1test $* || test $? = 5
+
+LINK_CMD= $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
+
+%_record: %_c.o hrecord.o $(HARNLOBJS)
+ $(LINK_CMD)
+
+%_playback: %_c.o hplayback.o $(HARNLOBJS)
+ $(LINK_CMD)
+
+.SECONDARY: $(addsuffix _c.o, $(filter-out adnshost, $(CLIENTS)))
+# Without this, make will remove <client>_c.o after building <client>.
+# This wastes effort. (Debian bug #4073.)
+#
+# Also, it exposes us to a bug (in make 3.81, at least) which can
+# cause make to run the rule for building <client> without building
+# <client>_c.o! (Debian #756123.)
+#
+# See also Savannah #29620, http://savannah.gnu.org/bugs/index.php?29620
+
+adnshost_%: $(ADH_OBJS) h%.o $(HARNLOBJS)
+ $(LINK_CMD)
+
+%_d.o: $(srcdir)/../src/%.c hredirect.h
+ $(CC) $(CFLAGS) $(HCPPFLAGS) -c -g -o $@ $<
+
+%_c.o: $(srcdir)/../client/%.c hredirect.h
+ $(CC) $(CFLAGS) $(HCPPFLAGS) -I $(srcdir)/../src -c -g -o $@ $<
+
+$(ALL_OBJS): $(srcdir)/../src/adns.h $(srcdir)/../src/internal.h
+$(ALL_OBJS): harness.h hsyscalls.h
+$(ADH_OBJS): $(srcdir)/../client/adnshost.h
+
+%:: %.m4 hmacros.i4 hsyscalls.i4
+ $(M4) -P -I$(srcdir) $< >$@-a.new
+ sed -e 's/hm_comma/,/g; s/hm_squote/'\''/g; /^[ ]*$$/d' <$@-a.new >$@-b.new
+ @mv -f $@-b.new $(srcdir)/$@; rm -f $@-a.new
diff --git a/regress/addcases b/regress/addcases
new file mode 100755
index 0000000..064a2a7
--- /dev/null
+++ b/regress/addcases
@@ -0,0 +1,29 @@
+#!/bin/sh
+# usage: ./addcases <casename> ...
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+set -e
+
+for f in "$@"
+do
+ cvs add "case-$f".{sys,out,err}
+done
diff --git a/regress/adnshost-xinitflags.text b/regress/adnshost-xinitflags.text
new file mode 100644
index 0000000..809195c
--- /dev/null
+++ b/regress/adnshost-xinitflags.text
@@ -0,0 +1 @@
+--debug --config
diff --git a/regress/adnslogres-xinitflags.text b/regress/adnslogres-xinitflags.text
new file mode 100644
index 0000000..89d4c11
--- /dev/null
+++ b/regress/adnslogres-xinitflags.text
@@ -0,0 +1 @@
+-d -C
diff --git a/regress/adnsresfilter-xinitflags.text b/regress/adnsresfilter-xinitflags.text
new file mode 100644
index 0000000..809195c
--- /dev/null
+++ b/regress/adnsresfilter-xinitflags.text
@@ -0,0 +1 @@
+--debug --config
diff --git a/regress/case-1stservbroken.err b/regress/case-1stservbroken.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-1stservbroken.err
diff --git a/regress/case-1stservbroken.out b/regress/case-1stservbroken.out
new file mode 100644
index 0000000..8a1790c
--- /dev/null
+++ b/regress/case-1stservbroken.out
@@ -0,0 +1,39 @@
+adns debug: using nameserver 172.18.45.2
+adns debug: using nameserver 172.18.45.6
+trunc.test.iwj.relativity.greenend.org.uk flags 0 type 12 PTR(raw) submitted
+adns warning: datagram receive error: Connection refused
+adns debug: TCP connected (NS=172.18.45.2)
+adns warning: TCP connection failed: read: Broken pipe (NS=172.18.45.2)
+adns debug: TCP connected (NS=172.18.45.6)
+trunc.test.iwj.relativity.greenend.org.uk flags 0 type PTR(raw): OK; nrrs=30; cname=$; owner=$; ttl=60
+ long.domain.to.force.truncation.0.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.1.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.2.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.3.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.4.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.5.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.6.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.7.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.8.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.9.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.10.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.11.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.12.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.13.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.14.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.15.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.16.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.17.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.18.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.19.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.20.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.21.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.22.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.23.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.24.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.25.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.26.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.27.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.28.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.29.test.iwj.relativity.greenend.org.uk
+rc=0
diff --git a/regress/case-1stservbroken.sys b/regress/case-1stservbroken.sys
new file mode 100644
index 0000000..fe4363c
--- /dev/null
+++ b/regress/case-1stservbroken.sys
@@ -0,0 +1,183 @@
+adnstest 1stservbroken
+:0x0|12 trunc.test.iwj.relativity.greenend.org.uk
+ start 940102940.701451
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000612
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000605
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000573
+ sendto fd=4 addr=172.18.45.2:53
+ 311f0100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ sendto=59
+ +0.006374
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.993626
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001402
+ recvfrom fd=4 buflen=512
+ recvfrom=ECONNREFUSED
+ +0.000666
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.991558
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-02914
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ sendto=59
+ +0.002262
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997738
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000973
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8380 00010008 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001c0 0c000c00
+ 01000000 3c004704 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275
+ 6e636174 696f6e01 30047465 73740369 776a0a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b00c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0131 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0132 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0133 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0134 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0135 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0136 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0137 c069.
+ +0.004340
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.005126
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000742
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000604
+ connect fd=5 addr=172.18.45.2:53
+ connect=EINPROGRESS
+ +0.000797
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000829
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.987562
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.001172
+ read fd=5 buflen=1
+ read=OK
+ .
+ +0.001161
+ write fd=5
+ 003b311f 01000001 00000000 00000574 72756e63 04746573 74036977 6a0a7265
+ 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000c00 01.
+ write=61
+ +0.003598
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.981631
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.001370
+ read fd=5 buflen=2
+ read=EPIPE
+ +0.001699
+ close fd=5
+ close=OK
+ +0.000687
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.004865
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000611
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000574
+ connect fd=5 addr=172.18.45.6:53
+ connect=EINPROGRESS
+ +0.001082
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.992868
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.001011
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000595
+ write fd=5
+ 003b311f 01000001 00000000 00000574 72756e63 04746573 74036977 6a0a7265
+ 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000c00 01.
+ write=61
+ +0.005087
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.964049
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.001295
+ read fd=5 buflen=2
+ read=OK
+ 0638.
+ +0.000649
+ read fd=5 buflen=1592
+ read=OK
+ 311f8580 0001001e 00010001 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001c0 0c000c00
+ 01000000 3c004704 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275
+ 6e636174 696f6e01 30047465 73740369 776a0a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b00c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0131 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0132 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0133 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0134 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0135 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0136 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0137 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0138 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0139 c069c00c
+ 000c0001 0000003c 0025046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0231 30c069c0 0c000c00 01000000 3c002504 6c6f6e67
+ 06646f6d 61696e02 746f0566 6f726365 0a747275 6e636174 696f6e02 3131c069
+ c00c000c 00010000 003c0025 046c6f6e 6706646f 6d61696e 02746f05 666f7263
+ 650a7472 756e6361 74696f6e 023132c0 69c00c00 0c000100 00003c00 25046c6f
+ 6e670664 6f6d6169 6e02746f 05666f72 63650a74 72756e63 6174696f 6e023133
+ c069c00c 000c0001 0000003c 0025046c 6f6e6706 646f6d61 696e0274 6f05666f
+ 7263650a 7472756e 63617469 6f6e0231 34c069c0 0c000c00 01000000 3c002504
+ 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275 6e636174 696f6e02
+ 3135c069 c00c000c 00010000 003c0025 046c6f6e 6706646f 6d61696e 02746f05
+ 666f7263 650a7472 756e6361 74696f6e 023136c0 69c00c00 0c000100 00003c00
+ 25046c6f 6e670664 6f6d6169 6e02746f 05666f72 63650a74 72756e63 6174696f
+ 6e023137 c069c00c 000c0001 0000003c 0025046c 6f6e6706 646f6d61 696e0274
+ 6f05666f 7263650a 7472756e 63617469 6f6e0231 38c069c0 0c000c00 01000000
+ 3c002504 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275 6e636174
+ 696f6e02 3139c069 c00c000c 00010000 003c0025 046c6f6e 6706646f 6d61696e
+ 02746f05 666f7263 650a7472 756e6361 74696f6e 023230c0 69c00c00 0c000100
+ 00003c00 25046c6f 6e670664 6f6d6169 6e02746f 05666f72 63650a74 72756e63
+ 6174696f 6e023231 c069c00c 000c0001 0000003c 0025046c 6f6e6706 646f6d61
+ 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0232 32c069c0 0c000c00
+ 01000000 3c002504 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275
+ 6e636174 696f6e02 3233c069 c00c000c 00010000 003c0025 046c6f6e 6706646f
+ 6d61696e 02746f05 666f7263 650a7472 756e6361 74696f6e 023234c0 69c00c00
+ 0c000100 00003c00 25046c6f 6e670664 6f6d6169 6e02746f 05666f72 63650a74
+ 72756e63 6174696f 6e023235 c069c00c 000c0001 0000003c 0025046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0232 36c069c0
+ 0c000c00 01000000 3c002504 6c6f6e67 06646f6d 61696e02 746f0566 6f726365
+ 0a747275 6e636174 696f6e02 3237c069 c00c000c 00010000 003c0025 046c6f6e
+ 6706646f 6d61696e 02746f05 666f7263 650a7472 756e6361 74696f6e 023238c0
+ 69c00c00 0c000100 00003c00 25046c6f 6e670664 6f6d6169 6e02746f 05666f72
+ 63650a74 72756e63 6174696f 6e023239 c069c069 00020001 0000003c 0006036e
+ 7330c072 036e7330 c0720001 00010001 51800004 ac122d06.
+ +0.009426
+ read fd=5 buflen=1594
+ read=EAGAIN
+ +0.033394
+ close fd=4
+ close=OK
+ +0.054384
+ close fd=5
+ close=OK
+ +0.000977
diff --git a/regress/case-1stservtotcp.err b/regress/case-1stservtotcp.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-1stservtotcp.err
diff --git a/regress/case-1stservtotcp.out b/regress/case-1stservtotcp.out
new file mode 100644
index 0000000..fe2f632
--- /dev/null
+++ b/regress/case-1stservtotcp.out
@@ -0,0 +1,37 @@
+adns debug: using nameserver 10.0.0.1
+adns debug: using nameserver 172.18.45.6
+trunc.test.iwj.relativity.greenend.org.uk flags 0 type 12 PTR(raw) submitted
+adns warning: TCP connection failed: unable to make connection: timed out (NS=10.0.0.1)
+adns debug: TCP connected (NS=172.18.45.6)
+trunc.test.iwj.relativity.greenend.org.uk flags 0 type PTR(raw): OK; nrrs=30; cname=$; owner=$; ttl=59
+ long.domain.to.force.truncation.0.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.1.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.2.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.3.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.4.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.5.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.6.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.7.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.8.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.9.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.10.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.11.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.12.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.13.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.14.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.15.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.16.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.17.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.18.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.19.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.20.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.21.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.22.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.23.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.24.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.25.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.26.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.27.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.28.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.29.test.iwj.relativity.greenend.org.uk
+rc=0
diff --git a/regress/case-1stservtotcp.sys b/regress/case-1stservtotcp.sys
new file mode 100644
index 0000000..e6ef382
--- /dev/null
+++ b/regress/case-1stservtotcp.sys
@@ -0,0 +1,159 @@
+adnstest 1stservto
+:0x0|12 trunc.test.iwj.relativity.greenend.org.uk
+ start 940100259.965940
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000698
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000611
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000582
+ sendto fd=4 addr=10.0.0.1:53
+ 311f0100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ sendto=59
+ +0.006634
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.993366
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-05507
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ sendto=59
+ +0.002310
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997690
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000996
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8380 00010008 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001c0 0c000c00
+ 01000000 3c004704 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275
+ 6e636174 696f6e01 30047465 73740369 776a0a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b00c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0131 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0132 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0133 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0134 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0135 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0136 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0137 c069.
+ +0.004379
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.009970
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000612
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000602
+ connect fd=5 addr=10.0.0.1:53
+ connect=EINPROGRESS
+ +0.000850
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000646
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.982941
+ select=0 rfds=[] wfds=[] efds=[]
+ +14.-10600
+ close fd=5
+ close=OK
+ +0.000750
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.004957
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000593
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000582
+ connect fd=5 addr=172.18.45.6:53
+ connect=EINPROGRESS
+ +0.001140
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.991978
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.001038
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.001203
+ write fd=5
+ 003b311f 01000001 00000000 00000574 72756e63 04746573 74036977 6a0a7265
+ 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000c00 01.
+ write=61
+ +0.007301
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=15.975977
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.001431
+ read fd=5 buflen=2
+ read=OK
+ 0638.
+ +0.001841
+ read fd=5 buflen=1592
+ read=OK
+ 311f8580 0001001e 00010001 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001c0 0c000c00
+ 01000000 3c004704 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275
+ 6e636174 696f6e01 30047465 73740369 776a0a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b00c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0131 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0132 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0133 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0134 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0135 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0136 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0137 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0138 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0139 c069c00c
+ 000c0001 0000003c 0025046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0231 30c069c0 0c000c00 01000000 3c002504 6c6f6e67
+ 06646f6d 61696e02 746f0566 6f726365 0a747275 6e636174 696f6e02 3131c069
+ c00c000c 00010000 003c0025 046c6f6e 6706646f 6d61696e 02746f05 666f7263
+ 650a7472 756e6361 74696f6e 023132c0 69c00c00 0c000100 00003c00 25046c6f
+ 6e670664 6f6d6169 6e02746f 05666f72 63650a74 72756e63 6174696f 6e023133
+ c069c00c 000c0001 0000003c 0025046c 6f6e6706 646f6d61 696e0274 6f05666f
+ 7263650a 7472756e 63617469 6f6e0231 34c069c0 0c000c00 01000000 3c002504
+ 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275 6e636174 696f6e02
+ 3135c069 c00c000c 00010000 003c0025 046c6f6e 6706646f 6d61696e 02746f05
+ 666f7263 650a7472 756e6361 74696f6e 023136c0 69c00c00 0c000100 00003c00
+ 25046c6f 6e670664 6f6d6169 6e02746f 05666f72 63650a74 72756e63 6174696f
+ 6e023137 c069c00c 000c0001 0000003c 0025046c 6f6e6706 646f6d61 696e0274
+ 6f05666f 7263650a 7472756e 63617469 6f6e0231 38c069c0 0c000c00 01000000
+ 3c002504 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275 6e636174
+ 696f6e02 3139c069 c00c000c 00010000 003c0025 046c6f6e 6706646f 6d61696e
+ 02746f05 666f7263 650a7472 756e6361 74696f6e 023230c0 69c00c00 0c000100
+ 00003c00 25046c6f 6e670664 6f6d6169 6e02746f 05666f72 63650a74 72756e63
+ 6174696f 6e023231 c069c00c 000c0001 0000003c 0025046c 6f6e6706 646f6d61
+ 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0232 32c069c0 0c000c00
+ 01000000 3c002504 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275
+ 6e636174 696f6e02 3233c069 c00c000c 00010000 003c0025 046c6f6e 6706646f
+ 6d61696e 02746f05 666f7263 650a7472 756e6361 74696f6e 023234c0 69c00c00
+ 0c000100 00003c00 25046c6f 6e670664 6f6d6169 6e02746f 05666f72 63650a74
+ 72756e63 6174696f 6e023235 c069c00c 000c0001 0000003c 0025046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0232 36c069c0
+ 0c000c00 01000000 3c002504 6c6f6e67 06646f6d 61696e02 746f0566 6f726365
+ 0a747275 6e636174 696f6e02 3237c069 c00c000c 00010000 003c0025 046c6f6e
+ 6706646f 6d61696e 02746f05 666f7263 650a7472 756e6361 74696f6e 023238c0
+ 69c00c00 0c000100 00003c00 25046c6f 6e670664 6f6d6169 6e02746f 05666f72
+ 63650a74 72756e63 6174696f 6e023239 c069c069 00020001 0000003c 0006036e
+ 7330c072 036e7330 c0720001 00010001 51800004 ac122d06.
+ +1.-990207
+ read fd=5 buflen=1594
+ read=EAGAIN
+ +0.040526
+ close fd=4
+ close=OK
+ +0.065240
+ close fd=5
+ close=OK
+ +0.000982
diff --git a/regress/case-2ndservok.err b/regress/case-2ndservok.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-2ndservok.err
diff --git a/regress/case-2ndservok.out b/regress/case-2ndservok.out
new file mode 100644
index 0000000..2c72438
--- /dev/null
+++ b/regress/case-2ndservok.out
@@ -0,0 +1,6 @@
+adns debug: using nameserver 172.18.45.36
+adns debug: using nameserver 172.18.45.6
+davenant.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+davenant.relativity.greenend.org.uk flags 0 type A(-): OK; nrrs=1; cname=$; owner=$; ttl=86400
+ 172.18.45.6
+rc=0
diff --git a/regress/case-2ndservok.sys b/regress/case-2ndservok.sys
new file mode 100644
index 0000000..6765361
--- /dev/null
+++ b/regress/case-2ndservok.sys
@@ -0,0 +1,47 @@
+adnstest 2ndserver
+:0x0|1 davenant.relativity.greenend.org.uk
+ start 940100095.012145
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000173
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000053
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000042
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=53
+ +0.001041
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998959
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04931
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.003890
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009910
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=53
+ +0.000863
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999137
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000126
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00030003 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 01000100 01518000
+ 04ac122d 060a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000200 01000151 80000603 6e7330c0 45c04500 02000100 01518000 06036e73
+ 31c045c0 45000200 01000151 80000603 6e7332c0 45c06b00 01000100 01518000
+ 04ac122d 06c07d00 01000100 01518000 04ac122d 41c08f00 01000100 01518000
+ 04ac122d 01.
+ +0.001026
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000423
+ close fd=4
+ close=OK
+ +0.000435
diff --git a/regress/case-2ndservtcp.err b/regress/case-2ndservtcp.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-2ndservtcp.err
diff --git a/regress/case-2ndservtcp.out b/regress/case-2ndservtcp.out
new file mode 100644
index 0000000..857176d
--- /dev/null
+++ b/regress/case-2ndservtcp.out
@@ -0,0 +1,37 @@
+adns debug: using nameserver 172.18.45.36
+adns debug: using nameserver 172.18.45.6
+trunc.test.iwj.relativity.greenend.org.uk flags 0 type 12 PTR(raw) submitted
+adns warning: TCP connection failed: connect/read: No route to host (NS=172.18.45.36)
+adns debug: TCP connected (NS=172.18.45.6)
+trunc.test.iwj.relativity.greenend.org.uk flags 0 type PTR(raw): OK; nrrs=30; cname=$; owner=$; ttl=60
+ long.domain.to.force.truncation.0.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.1.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.2.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.3.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.4.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.5.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.6.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.7.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.8.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.9.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.10.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.11.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.12.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.13.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.14.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.15.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.16.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.17.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.18.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.19.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.20.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.21.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.22.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.23.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.24.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.25.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.26.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.27.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.28.test.iwj.relativity.greenend.org.uk
+ long.domain.to.force.truncation.29.test.iwj.relativity.greenend.org.uk
+rc=0
diff --git a/regress/case-2ndservtcp.sys b/regress/case-2ndservtcp.sys
new file mode 100644
index 0000000..fa9e994
--- /dev/null
+++ b/regress/case-2ndservtcp.sys
@@ -0,0 +1,168 @@
+adnstest 2ndserver
+:0x0|12 trunc.test.iwj.relativity.greenend.org.uk
+ start 940100083.268555
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000169
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000053
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000040
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ sendto=59
+ +0.001167
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998833
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01463
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000296
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009912
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ sendto=59
+ +0.001357
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998643
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000126
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8380 00010008 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001c0 0c000c00
+ 01000000 3c004704 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275
+ 6e636174 696f6e01 30047465 73740369 776a0a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b00c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0131 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0132 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0133 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0134 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0135 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0136 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0137 c069.
+ +0.002022
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.000905
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000041
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000038
+ connect fd=5 addr=172.18.45.36:53
+ connect=EINPROGRESS
+ +0.000162
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000062
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.996770
+ select=1 rfds=[] wfds=[5] efds=[]
+ +1.-14443
+ read fd=5 buflen=1
+ read=EHOSTUNREACH
+ +0.000193
+ close fd=5
+ close=OK
+ +0.000146
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.000678
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000041
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000039
+ connect fd=5 addr=172.18.45.6:53
+ connect=EINPROGRESS
+ +0.000455
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.998787
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.000135
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000062
+ write fd=5
+ 003b311f 01000001 00000000 00000574 72756e63 04746573 74036977 6a0a7265
+ 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000c00 01.
+ write=61
+ +0.004082
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.005381
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.000149
+ read fd=5 buflen=2
+ read=OK
+ 0638.
+ +0.000210
+ read fd=5 buflen=1592
+ read=OK
+ 311f8580 0001001e 00010001 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0c0001c0 0c000c00
+ 01000000 3c004704 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275
+ 6e636174 696f6e01 30047465 73740369 776a0a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b00c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0131 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0132 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0133 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0134 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0135 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0136 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0137 c069c00c
+ 000c0001 0000003c 0024046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0138 c069c00c 000c0001 0000003c 0024046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0139 c069c00c
+ 000c0001 0000003c 0025046c 6f6e6706 646f6d61 696e0274 6f05666f 7263650a
+ 7472756e 63617469 6f6e0231 30c069c0 0c000c00 01000000 3c002504 6c6f6e67
+ 06646f6d 61696e02 746f0566 6f726365 0a747275 6e636174 696f6e02 3131c069
+ c00c000c 00010000 003c0025 046c6f6e 6706646f 6d61696e 02746f05 666f7263
+ 650a7472 756e6361 74696f6e 023132c0 69c00c00 0c000100 00003c00 25046c6f
+ 6e670664 6f6d6169 6e02746f 05666f72 63650a74 72756e63 6174696f 6e023133
+ c069c00c 000c0001 0000003c 0025046c 6f6e6706 646f6d61 696e0274 6f05666f
+ 7263650a 7472756e 63617469 6f6e0231 34c069c0 0c000c00 01000000 3c002504
+ 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275 6e636174 696f6e02
+ 3135c069 c00c000c 00010000 003c0025 046c6f6e 6706646f 6d61696e 02746f05
+ 666f7263 650a7472 756e6361 74696f6e 023136c0 69c00c00 0c000100 00003c00
+ 25046c6f 6e670664 6f6d6169 6e02746f 05666f72 63650a74 72756e63 6174696f
+ 6e023137 c069c00c 000c0001 0000003c 0025046c 6f6e6706 646f6d61 696e0274
+ 6f05666f 7263650a 7472756e 63617469 6f6e0231 38c069c0 0c000c00 01000000
+ 3c002504 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275 6e636174
+ 696f6e02 3139c069 c00c000c 00010000 003c0025 046c6f6e 6706646f 6d61696e
+ 02746f05 666f7263 650a7472 756e6361 74696f6e 023230c0 69c00c00 0c000100
+ 00003c00 25046c6f 6e670664 6f6d6169 6e02746f 05666f72 63650a74 72756e63
+ 6174696f 6e023231 c069c00c 000c0001 0000003c 0025046c 6f6e6706 646f6d61
+ 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0232 32c069c0 0c000c00
+ 01000000 3c002504 6c6f6e67 06646f6d 61696e02 746f0566 6f726365 0a747275
+ 6e636174 696f6e02 3233c069 c00c000c 00010000 003c0025 046c6f6e 6706646f
+ 6d61696e 02746f05 666f7263 650a7472 756e6361 74696f6e 023234c0 69c00c00
+ 0c000100 00003c00 25046c6f 6e670664 6f6d6169 6e02746f 05666f72 63650a74
+ 72756e63 6174696f 6e023235 c069c00c 000c0001 0000003c 0025046c 6f6e6706
+ 646f6d61 696e0274 6f05666f 7263650a 7472756e 63617469 6f6e0232 36c069c0
+ 0c000c00 01000000 3c002504 6c6f6e67 06646f6d 61696e02 746f0566 6f726365
+ 0a747275 6e636174 696f6e02 3237c069 c00c000c 00010000 003c0025 046c6f6e
+ 6706646f 6d61696e 02746f05 666f7263 650a7472 756e6361 74696f6e 023238c0
+ 69c00c00 0c000100 00003c00 25046c6f 6e670664 6f6d6169 6e02746f 05666f72
+ 63650a74 72756e63 6174696f 6e023239 c069c069 00020001 0000003c 0006036e
+ 7330c072 036e7330 c0720001 00010001 51800004 ac122d06.
+ +0.006071
+ read fd=5 buflen=1594
+ read=EAGAIN
+ +0.005347
+ close fd=4
+ close=OK
+ +0.004675
+ close fd=5
+ close=OK
+ +0.000433
diff --git a/regress/case-aaaa-simple.err b/regress/case-aaaa-simple.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-aaaa-simple.err
diff --git a/regress/case-aaaa-simple.out b/regress/case-aaaa-simple.out
new file mode 100644
index 0000000..86ee6c0
--- /dev/null
+++ b/regress/case-aaaa-simple.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.29.199.224
+stratocaster.distorted.org.uk flags 0 type 28 AAAA(-) submitted
+stratocaster.distorted.org.uk flags 0 type AAAA(-): OK; nrrs=1; cname=$; owner=$; ttl=14400
+ 2001:ba8:1d9:2::4
+rc=0
diff --git a/regress/case-aaaa-simple.sys b/regress/case-aaaa-simple.sys
new file mode 100644
index 0000000..25873ed
--- /dev/null
+++ b/regress/case-aaaa-simple.sys
@@ -0,0 +1,40 @@
+./adnstest distorted
+:0x0|28 stratocaster.distorted.org.uk
+ start 1401870460.843715
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000022
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000010
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000009
+ sendto fd=6 addr=172.29.199.224:53
+ 311f0100 00010000 00000000 0c737472 61746f63 61737465 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000072
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999928
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.001805
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 311f8580 00010001 00040008 0c737472 61746f63 61737465 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010ba801
+ d9000200 00000000 000004c0 19000200 01000038 40000d07 76616d70 69726502
+ 6e73c019 c0190002 00010000 3840000d 0a74656c 65636173 746572c0 5fc01900
+ 02000100 00384000 0c097072 65636973 696f6ec0 5fc01900 02000100 00384000
+ 09067261 64697573 c05fc0a1 00010001 00003840 0004ac1d c701c0a1 001c0001
+ 00003840 00102001 04709740 00010000 00000000 0001c057 00010001 00003840
+ 0004ac1d c705c057 001c0001 00003840 00102001 04709740 00010000 00000000
+ 0005c089 00010001 00003840 0004ac1d c7b2c089 001c0001 00003840 00102001
+ 0ba801d9 00020000 00000000 0002c070 00010001 00003840 0004ac1d c7b3c070
+ 001c0001 00003840 00102001 0ba801d9 00020000 00000000 0003.
+ +0.000125
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000021
+ close fd=6
+ close=OK
+ +0.000029
diff --git a/regress/case-aaaa-sort.err b/regress/case-aaaa-sort.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-aaaa-sort.err
diff --git a/regress/case-aaaa-sort.out b/regress/case-aaaa-sort.out
new file mode 100644
index 0000000..9b36750
--- /dev/null
+++ b/regress/case-aaaa-sort.out
@@ -0,0 +1,10 @@
+adns debug: using nameserver 172.29.199.224
+maddr.dnserr.distorted.org.uk flags 0 type 28 AAAA(-) submitted
+maddr.dnserr.distorted.org.uk flags 0 type AAAA(-): OK; nrrs=6; cname=$; owner=$; ttl=14400
+ 2001:db8:2::1
+ 2001:db8:2::2
+ 2001:db8:3::2
+ 2001:db8:1::1
+ 2001:db8:1::2
+ 2001:db8:3::1
+rc=0
diff --git a/regress/case-aaaa-sort.sys b/regress/case-aaaa-sort.sys
new file mode 100644
index 0000000..4860661
--- /dev/null
+++ b/regress/case-aaaa-sort.sys
@@ -0,0 +1,45 @@
+./adnstest distorted
+:0x0|28 maddr.dnserr.distorted.org.uk
+ start 1401871954.600653
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000061
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000032
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000026
+ sendto fd=6 addr=172.29.199.224:53
+ 311f0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000195
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999805
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.004328
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 311f8580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 03000000 00000000 000002c0 0c001c00 01000038 40001020 010db800 01000000
+ 00000000 000001c0 0c001c00 01000038 40001020 010db800 01000000 00000000
+ 000002c0 0c001c00 01000038 40001020 010db800 02000000 00000000 000001c0
+ 0c001c00 01000038 40001020 010db800 02000000 00000000 000002c0 0c001c00
+ 01000038 40001020 010db800 03000000 00000000 000001c0 12000200 01000038
+ 40000d07 76616d70 69726502 6e73c012 c0120002 00010000 38400009 06726164
+ 697573c0 ebc01200 02000100 00384000 0d0a7465 6c656361 73746572 c0ebc012
+ 00020001 00003840 000c0970 72656369 73696f6e c0ebc0fc 00010001 00003840
+ 00043e31 cc92c0fc 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c0e3 00010001 00003840 00043e31 cc96c0e3 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c12a 00010001 00003840 0004d40d c646c12a
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c111 00010001
+ 00003840 0004d40d c647c111 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000428
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000092
+ close fd=6
+ close=OK
+ +0.000520
diff --git a/regress/case-abbrev.err b/regress/case-abbrev.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-abbrev.err
diff --git a/regress/case-abbrev.out b/regress/case-abbrev.out
new file mode 100644
index 0000000..991b128
--- /dev/null
+++ b/regress/case-abbrev.out
@@ -0,0 +1,40 @@
+adns debug: using nameserver 172.18.45.6
+greenend.org.uk flags 0 type 1 A(-) submitted
+greenend.org.uk flags 0 type 2 NS(raw) submitted
+greenend.org.uk flags 0 type 5 CNAME(-) submitted
+greenend.org.uk flags 0 type 6 SOA(raw) submitted
+greenend.org.uk flags 0 type 12 PTR(raw) submitted
+greenend.org.uk flags 0 type 13 HINFO(-) submitted
+greenend.org.uk flags 0 type 15 MX(raw) submitted
+greenend.org.uk flags 0 type 16 TXT(-) submitted
+greenend.org.uk flags 0 type 17 RP(raw) submitted
+greenend.org.uk flags 0 type 65537 A(addr) submitted
+greenend.org.uk flags 0 type 65538 NS(+addr) submitted
+greenend.org.uk flags 0 type 65548 PTR(checked) submitted
+greenend.org.uk flags 0 type 65551 MX(+addr) submitted
+greenend.org.uk flags 0 type 131078 SOA(822) submitted
+greenend.org.uk flags 0 type 131089 RP(822) submitted
+greenend.org.uk flags 0 type PTR(checked) ownflags=a: querydomainwrong; nrrs=0; cname=$; owner=$; ttl=604800
+greenend.org.uk flags 0 type A(-) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
+greenend.org.uk flags 0 type NS(raw) ownflags=a: ok; nrrs=2; cname=$; owner=$; ttl=86400
+ ns1.relativity.greenend.org.uk
+ ns0.relativity.greenend.org.uk
+greenend.org.uk flags 0 type CNAME(-) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
+greenend.org.uk flags 0 type SOA(raw) ownflags=a: ok; nrrs=1; cname=$; owner=$; ttl=86400
+ ns.chiark.greenend.org.uk hostmaster.greenend.org.uk 1999061300 28800 7200 604800 86400
+greenend.org.uk flags 0 type PTR(raw) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
+greenend.org.uk flags 0 type HINFO(-) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
+greenend.org.uk flags 0 type MX(raw) ownflags=a: ok; nrrs=1; cname=$; owner=$; ttl=86400
+ 10 chiark.greenend.org.uk
+greenend.org.uk flags 0 type TXT(-) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
+greenend.org.uk flags 0 type RP(raw) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
+greenend.org.uk flags 0 type A(addr) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
+greenend.org.uk flags 0 type NS(+addr) ownflags=a: ok; nrrs=2; cname=$; owner=$; ttl=86400
+ ns0.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.6 )
+ ns1.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.65 )
+greenend.org.uk flags 0 type MX(+addr) ownflags=a: ok; nrrs=1; cname=$; owner=$; ttl=86400
+ 10 chiark.greenend.org.uk ok 0 ok "OK" ( INET 195.224.76.132 )
+greenend.org.uk flags 0 type SOA(822) ownflags=a: ok; nrrs=1; cname=$; owner=$; ttl=86400
+ ns.chiark.greenend.org.uk hostmaster@greenend.org.uk 1999061300 28800 7200 604800 86400
+greenend.org.uk flags 0 type RP(822) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
+rc=0
diff --git a/regress/case-abbrev.sys b/regress/case-abbrev.sys
new file mode 100644
index 0000000..1d49978
--- /dev/null
+++ b/regress/case-abbrev.sys
@@ -0,0 +1,265 @@
+adnstest default -0x400
+,a/greenend.org.uk
+ start 929580078.542974
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000202
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000086
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000061
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000623
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000425
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000371
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000369
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000369
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000414
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000371
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000368
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000368
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000367
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000733
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000378
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000391
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000467
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.993986
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005183
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010000 00010000 08677265 656e656e 64036f72 6702756b 00000100
+ 01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+ 73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180.
+ +0.000588
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000147
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.988691
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004348
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010002 00000002 08677265 656e656e 64036f72 6702756b 00000200
+ 01c00c00 02000100 01518000 11036e73 310a7265 6c617469 76697479 c00cc00c
+ 00020001 00015180 0006036e 7330c031 c02d0001 00010001 51800004 ac122d41
+ c04a0001 00010001 51800004 ac122d06.
+ +0.000642
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000247
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.983879
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002737
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010000 00010000 08677265 656e656e 64036f72 6702756b 00000500
+ 01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+ 73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180.
+ +0.000541
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000099
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.980873
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005000
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010001 00020002 08677265 656e656e 64036f72 6702756b 00000600
+ 01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+ 73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180c00c 00020001
+ 00015180 0011036e 73310a72 656c6174 69766974 79c00cc0 0c000200 01000151
+ 80000603 6e7330c0 6ac06600 01000100 01518000 04ac122d 41c08300 01000100
+ 01518000 04ac122d 06.
+ +0.000913
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000195
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.975134
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002529
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010000 00010000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+ 73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180.
+ +0.000541
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000100
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.972333
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003175
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010000 00010000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+ 73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180.
+ +0.000538
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000122
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.968912
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005109
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258580 00010001 00020003 08677265 656e656e 64036f72 6702756b 00000f00
+ 01c00c00 0f000100 01518000 0b000a06 63686961 726bc00c c00c0002 00010001
+ 51800011 036e7331 0a72656c 61746976 697479c0 0cc00c00 02000100 01518000
+ 06036e73 30c048c0 2f000100 01000151 800004c3 e04c84c0 44000100 01000151
+ 800004ac 122d41c0 61000100 01000151 800004ac 122d06.
+ +0.000826
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000173
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.963175
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002746
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268580 00010000 00010000 08677265 656e656e 64036f72 6702756b 00001000
+ 01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+ 73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180.
+ +0.000539
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000127
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.960131
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003161
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278580 00010000 00010000 08677265 656e656e 64036f72 6702756b 00001100
+ 01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+ 73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180.
+ +0.000537
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000098
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.956703
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003055
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298580 00010000 00010000 08677265 656e656e 64036f72 6702756b 00000100
+ 01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+ 73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180.
+ +0.000537
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000126
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.953352
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004322
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8580 00010002 00000002 08677265 656e656e 64036f72 6702756b 00000200
+ 01c00c00 02000100 01518000 11036e73 300a7265 6c617469 76697479 c00cc00c
+ 00020001 00015180 0006036e 7331c031 c02d0001 00010001 51800004 ac122d06
+ c04a0001 00010001 51800004 ac122d41.
+ +0.000638
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.003678
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.945447
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005215
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8580 00010001 00020003 08677265 656e656e 64036f72 6702756b 00000f00
+ 01c00c00 0f000100 01518000 0b000a06 63686961 726bc00c c00c0002 00010001
+ 51800011 036e7330 0a72656c 61746976 697479c0 0cc00c00 02000100 01518000
+ 06036e73 31c048c0 2f000100 01000151 800004c3 e04c84c0 44000100 01000151
+ 800004ac 122d06c0 61000100 01000151 800004ac 122d41.
+ +0.000822
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000197
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.939591
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004484
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8580 00010001 00020002 08677265 656e656e 64036f72 6702756b 00000600
+ 01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+ 73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180c00c 00020001
+ 00015180 0011036e 73300a72 656c6174 69766974 79c00cc0 0c000200 01000151
+ 80000603 6e7331c0 6ac06600 01000100 01518000 04ac122d 06c08300 01000100
+ 01518000 04ac122d 41.
+ +0.000910
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000223
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.934365
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002704
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8580 00010000 00010000 08677265 656e656e 64036f72 6702756b 00001100
+ 01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+ 73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180.
+ +0.000537
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000099
+ close fd=4
+ close=OK
+ +0.000153
diff --git a/regress/case-abbrevto.err b/regress/case-abbrevto.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-abbrevto.err
diff --git a/regress/case-abbrevto.out b/regress/case-abbrevto.out
new file mode 100644
index 0000000..cdccc4b
--- /dev/null
+++ b/regress/case-abbrevto.out
@@ -0,0 +1,32 @@
+adns debug: using nameserver 172.18.45.36
+greenend.org.uk flags 0 type 1 A(-) submitted
+greenend.org.uk flags 0 type 2 NS(raw) submitted
+greenend.org.uk flags 0 type 5 CNAME(-) submitted
+greenend.org.uk flags 0 type 6 SOA(raw) submitted
+greenend.org.uk flags 0 type 12 PTR(raw) submitted
+greenend.org.uk flags 0 type 13 HINFO(-) submitted
+greenend.org.uk flags 0 type 15 MX(raw) submitted
+greenend.org.uk flags 0 type 16 TXT(-) submitted
+greenend.org.uk flags 0 type 17 RP(raw) submitted
+greenend.org.uk flags 0 type 65537 A(addr) submitted
+greenend.org.uk flags 0 type 65538 NS(+addr) submitted
+greenend.org.uk flags 0 type 65548 PTR(checked) submitted
+greenend.org.uk flags 0 type 65551 MX(+addr) submitted
+greenend.org.uk flags 0 type 131078 SOA(822) submitted
+greenend.org.uk flags 0 type 131089 RP(822) submitted
+greenend.org.uk flags 0 type PTR(checked) ownflags=a: querydomainwrong; nrrs=0; cname=$; owner=$; ttl=604800
+greenend.org.uk flags 0 type A(-) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type NS(raw) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type CNAME(-) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type SOA(raw) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type PTR(raw) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type HINFO(-) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type MX(raw) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type TXT(-) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type RP(raw) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type NS(+addr) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type MX(+addr) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type SOA(822) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type RP(822) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+greenend.org.uk flags 0 type A(addr) ownflags=a: timeout; nrrs=0; cname=$; owner=$; ttl=604770
+rc=0
diff --git a/regress/case-abbrevto.sys b/regress/case-abbrevto.sys
new file mode 100644
index 0000000..b26be7b
--- /dev/null
+++ b/regress/case-abbrevto.sys
@@ -0,0 +1,1164 @@
+adnstest noserver -0x400
+,a/greenend.org.uk
+ start 929580082.699581
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000192
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000084
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000062
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.014155
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000420
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000322
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000322
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000320
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000366
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000324
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000318
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000319
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000319
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000638
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000319
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000343
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000399
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.981116
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-18933
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000049
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010028
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000363
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.003813
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009575
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000291
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000302
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000271
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000270
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000271
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000270
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000565
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000271
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000271
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.986185
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-14326
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000511
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009965
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000386
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000098
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009616
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000285
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000279
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000271
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000298
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000546
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000271
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000275
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.986134
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-14145
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000279
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009905
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000427
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000317
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000283
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000280
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000278
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000315
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000551
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000318
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000274
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995581
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04960
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000541
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009952
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000430
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000310
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000309
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000278
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000567
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000275
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995632
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04751
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000383
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009901
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000339
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000280
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000323
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000317
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000548
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000274
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995734
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04720
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000454
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009970
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000393
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000303
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000297
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000546
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000297
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995695
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04679
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000374
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009892
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000323
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000280
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000307
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000547
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000301
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000273
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995776
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04674
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000450
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009968
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000368
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000305
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000307
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000314
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000600
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000274
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995636
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04747
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000383
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009901
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000324
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000306
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000297
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000547
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000273
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995790
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04665
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000455
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009985
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000387
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000305
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000300
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000278
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000550
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000301
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995681
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04719
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000400
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009906
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000320
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000279
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000319
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000278
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000548
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000300
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000275
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995757
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04698
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000455
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009982
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000385
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000304
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000306
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000281
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000568
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000274
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995688
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04700
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000388
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009990
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000328
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000309
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000302
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000549
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000273
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995768
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04700
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000468
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009893
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000368
+ sendto fd=4 addr=172.18.45.36:53
+ 31200100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000302
+ sendto fd=4 addr=172.18.45.36:53
+ 31210100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000500
+ 01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+ 31220100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+ 31230100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31240100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000d00
+ 01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+ 31250100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000321
+ sendto fd=4 addr=172.18.45.36:53
+ 31260100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001000
+ 01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+ 31270100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+ 312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+ 01.
+ sendto=33
+ +0.000545
+ sendto fd=4 addr=172.18.45.36:53
+ 312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+ 312d0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+ 01.
+ sendto=33
+ +0.000296
+ sendto fd=4 addr=172.18.45.36:53
+ 312e0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=33
+ +0.000277
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995699
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04687
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000386
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009894
+ close fd=4
+ close=OK
+ +0.000779
diff --git a/regress/case-addr-multi-af.err b/regress/case-addr-multi-af.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-addr-multi-af.err
diff --git a/regress/case-addr-multi-af.out b/regress/case-addr-multi-af.out
new file mode 100644
index 0000000..d34d03b
--- /dev/null
+++ b/regress/case-addr-multi-af.out
@@ -0,0 +1,164 @@
+adns debug: using nameserver 172.29.199.224
+maddr.dnserr.distorted.org.uk flags 0 type 65537 A(addr) submitted
+maddr.dnserr.distorted.org.uk flags 0 type 65551 MX(+addr) submitted
+maddr.dnserr.distorted.org.uk flags 0 type 65537 A(addr) submitted
+maddr.dnserr.distorted.org.uk flags 0 type 65551 MX(+addr) submitted
+mx.dnserr.distorted.org.uk flags 0 type 65537 A(addr) submitted
+mx.dnserr.distorted.org.uk flags 0 type 65551 MX(+addr) submitted
+mx.dnserr.distorted.org.uk flags 0 type 65537 A(addr) submitted
+mx.dnserr.distorted.org.uk flags 0 type 65551 MX(+addr) submitted
+maddr.dnserr.distorted.org.uk flags 1024 type 65537 A(addr) submitted
+maddr.dnserr.distorted.org.uk flags 1024 type 65551 MX(+addr) submitted
+maddr.dnserr.distorted.org.uk flags 1024 type 65537 A(addr) submitted
+maddr.dnserr.distorted.org.uk flags 1024 type 65551 MX(+addr) submitted
+mx.dnserr.distorted.org.uk flags 1024 type 65537 A(addr) submitted
+mx.dnserr.distorted.org.uk flags 1024 type 65551 MX(+addr) submitted
+mx.dnserr.distorted.org.uk flags 1024 type 65537 A(addr) submitted
+mx.dnserr.distorted.org.uk flags 1024 type 65551 MX(+addr) submitted
+maddr.dnserr.distorted.org.uk flags 2048 type 65537 A(addr) submitted
+maddr.dnserr.distorted.org.uk flags 2048 type 65551 MX(+addr) submitted
+maddr.dnserr.distorted.org.uk flags 2048 type 65537 A(addr) submitted
+maddr.dnserr.distorted.org.uk flags 2048 type 65551 MX(+addr) submitted
+mx.dnserr.distorted.org.uk flags 2048 type 65537 A(addr) submitted
+mx.dnserr.distorted.org.uk flags 2048 type 65551 MX(+addr) submitted
+mx.dnserr.distorted.org.uk flags 2048 type 65537 A(addr) submitted
+mx.dnserr.distorted.org.uk flags 2048 type 65551 MX(+addr) submitted
+maddr.dnserr.distorted.org.uk flags 3072 type 65537 A(addr) submitted
+maddr.dnserr.distorted.org.uk flags 3072 type 65551 MX(+addr) submitted
+maddr.dnserr.distorted.org.uk flags 3072 type 65537 A(addr) submitted
+maddr.dnserr.distorted.org.uk flags 3072 type 65551 MX(+addr) submitted
+mx.dnserr.distorted.org.uk flags 3072 type 65537 A(addr) submitted
+mx.dnserr.distorted.org.uk flags 3072 type 65551 MX(+addr) submitted
+mx.dnserr.distorted.org.uk flags 3072 type 65537 A(addr) submitted
+mx.dnserr.distorted.org.uk flags 3072 type 65551 MX(+addr) submitted
+maddr.dnserr.distorted.org.uk flags 0 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+maddr.dnserr.distorted.org.uk flags 0 type A(addr): OK; nrrs=6; cname=$; owner=$; ttl=14400
+ INET 198.51.100.1
+ INET 198.51.100.2
+ INET 192.0.2.2
+ INET 203.0.113.1
+ INET 203.0.113.2
+ INET 192.0.2.1
+maddr.dnserr.distorted.org.uk flags 0 type A(addr): OK; nrrs=12; cname=$; owner=$; ttl=14400
+ INET 198.51.100.1
+ INET 198.51.100.2
+ INET6 2001:db8:2::1
+ INET6 2001:db8:2::2
+ INET 203.0.113.1
+ INET 203.0.113.2
+ INET 192.0.2.1
+ INET 192.0.2.2
+ INET6 2001:db8:3::1
+ INET6 2001:db8:3::2
+ INET6 2001:db8:1::1
+ INET6 2001:db8:1::2
+maddr.dnserr.distorted.org.uk flags 0 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+mx.dnserr.distorted.org.uk flags 0 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+mx.dnserr.distorted.org.uk flags 0 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+maddr.dnserr.distorted.org.uk flags 1024 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+maddr.dnserr.distorted.org.uk flags 1024 type A(addr): OK; nrrs=6; cname=$; owner=$; ttl=14400
+ INET 198.51.100.1
+ INET 198.51.100.2
+ INET 203.0.113.2
+ INET 192.0.2.1
+ INET 192.0.2.2
+ INET 203.0.113.1
+maddr.dnserr.distorted.org.uk flags 1024 type A(addr): OK; nrrs=6; cname=$; owner=$; ttl=14400
+ INET 198.51.100.1
+ INET 198.51.100.2
+ INET 192.0.2.1
+ INET 192.0.2.2
+ INET 203.0.113.1
+ INET 203.0.113.2
+maddr.dnserr.distorted.org.uk flags 1024 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+mx.dnserr.distorted.org.uk flags 1024 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+mx.dnserr.distorted.org.uk flags 1024 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+maddr.dnserr.distorted.org.uk flags 2048 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+maddr.dnserr.distorted.org.uk flags 2048 type A(addr): OK; nrrs=6; cname=$; owner=$; ttl=14400
+ INET6 2001:db8:2::2
+ INET6 2001:db8:2::1
+ INET6 2001:db8:3::1
+ INET6 2001:db8:3::2
+ INET6 2001:db8:1::1
+ INET6 2001:db8:1::2
+maddr.dnserr.distorted.org.uk flags 2048 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+maddr.dnserr.distorted.org.uk flags 2048 type A(addr): OK; nrrs=6; cname=$; owner=$; ttl=14400
+ INET6 2001:db8:2::1
+ INET6 2001:db8:2::2
+ INET6 2001:db8:3::1
+ INET6 2001:db8:3::2
+ INET6 2001:db8:1::1
+ INET6 2001:db8:1::2
+mx.dnserr.distorted.org.uk flags 2048 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+mx.dnserr.distorted.org.uk flags 2048 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+maddr.dnserr.distorted.org.uk flags 3072 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+maddr.dnserr.distorted.org.uk flags 3072 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+maddr.dnserr.distorted.org.uk flags 3072 type A(addr): OK; nrrs=12; cname=$; owner=$; ttl=14400
+ INET 198.51.100.1
+ INET 198.51.100.2
+ INET6 2001:db8:2::1
+ INET6 2001:db8:2::2
+ INET 203.0.113.2
+ INET 192.0.2.1
+ INET 192.0.2.2
+ INET 203.0.113.1
+ INET6 2001:db8:1::2
+ INET6 2001:db8:3::1
+ INET6 2001:db8:3::2
+ INET6 2001:db8:1::1
+maddr.dnserr.distorted.org.uk flags 3072 type A(addr): OK; nrrs=12; cname=$; owner=$; ttl=14400
+ INET 198.51.100.1
+ INET 198.51.100.2
+ INET6 2001:db8:2::1
+ INET6 2001:db8:2::2
+ INET 192.0.2.1
+ INET 192.0.2.2
+ INET 203.0.113.1
+ INET 203.0.113.2
+ INET6 2001:db8:3::1
+ INET6 2001:db8:3::2
+ INET6 2001:db8:1::1
+ INET6 2001:db8:1::2
+mx.dnserr.distorted.org.uk flags 3072 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+mx.dnserr.distorted.org.uk flags 3072 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+mx.dnserr.distorted.org.uk flags 0 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=14400
+ 69 maddr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.2 INET 198.51.100.1 INET 203.0.113.1 INET 203.0.113.2 INET 192.0.2.1 INET 192.0.2.2 )
+ 69 a.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.16 )
+ 69 aaaa.dnserr.distorted.org.uk permfail 301 nodata "No such data" ( )
+ 70 addr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.17 )
+mx.dnserr.distorted.org.uk flags 0 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=14400
+ 69 maddr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.1 INET 198.51.100.2 INET6 2001:db8:2::1 INET6 2001:db8:2::2 INET 203.0.113.1 INET 203.0.113.2 INET 192.0.2.1 INET 192.0.2.2 INET6 2001:db8:3::2 INET6 2001:db8:1::1 INET6 2001:db8:1::2 INET6 2001:db8:3::1 )
+ 69 a.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.16 )
+ 69 aaaa.dnserr.distorted.org.uk ok 0 ok "OK" ( INET6 2001:db8::1 )
+ 70 addr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.17 INET6 2001:db8::2 )
+mx.dnserr.distorted.org.uk flags 1024 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=14400
+ 69 a.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.16 )
+ 69 maddr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.1 INET 198.51.100.2 INET 192.0.2.2 INET 203.0.113.1 INET 203.0.113.2 INET 192.0.2.1 )
+ 69 aaaa.dnserr.distorted.org.uk permfail 301 nodata "No such data" ( )
+ 70 addr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.17 )
+mx.dnserr.distorted.org.uk flags 1024 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=14400
+ 69 a.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.16 )
+ 69 maddr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.1 INET 198.51.100.2 INET 203.0.113.1 INET 203.0.113.2 INET 192.0.2.1 INET 192.0.2.2 )
+ 69 aaaa.dnserr.distorted.org.uk permfail 301 nodata "No such data" ( )
+ 70 addr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.17 )
+mx.dnserr.distorted.org.uk flags 2048 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=14400
+ 69 maddr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET6 2001:db8:2::1 INET6 2001:db8:2::2 INET6 2001:db8:1::1 INET6 2001:db8:1::2 INET6 2001:db8:3::1 INET6 2001:db8:3::2 )
+ 69 aaaa.dnserr.distorted.org.uk ok 0 ok "OK" ( INET6 2001:db8::1 )
+ 69 a.dnserr.distorted.org.uk permfail 301 nodata "No such data" ( )
+ 70 addr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET6 2001:db8::2 )
+mx.dnserr.distorted.org.uk flags 2048 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=14400
+ 69 maddr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET6 2001:db8:2::1 INET6 2001:db8:2::2 INET6 2001:db8:1::2 INET6 2001:db8:3::1 INET6 2001:db8:3::2 INET6 2001:db8:1::1 )
+ 69 aaaa.dnserr.distorted.org.uk ok 0 ok "OK" ( INET6 2001:db8::1 )
+ 69 a.dnserr.distorted.org.uk permfail 301 nodata "No such data" ( )
+ 70 addr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET6 2001:db8::2 )
+mx.dnserr.distorted.org.uk flags 3072 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=14400
+ 69 a.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.16 )
+ 69 maddr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.1 INET 198.51.100.2 INET6 2001:db8:2::1 INET6 2001:db8:2::2 INET 192.0.2.2 INET 203.0.113.1 INET 203.0.113.2 INET 192.0.2.1 INET6 2001:db8:3::1 INET6 2001:db8:3::2 INET6 2001:db8:1::1 INET6 2001:db8:1::2 )
+ 69 aaaa.dnserr.distorted.org.uk ok 0 ok "OK" ( INET6 2001:db8::1 )
+ 70 addr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.17 INET6 2001:db8::2 )
+mx.dnserr.distorted.org.uk flags 3072 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=14400
+ 69 a.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.16 )
+ 69 maddr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.1 INET 198.51.100.2 INET6 2001:db8:2::2 INET6 2001:db8:2::1 INET 203.0.113.1 INET 203.0.113.2 INET 192.0.2.1 INET 192.0.2.2 INET6 2001:db8:3::1 INET6 2001:db8:3::2 INET6 2001:db8:1::1 INET6 2001:db8:1::2 )
+ 69 aaaa.dnserr.distorted.org.uk ok 0 ok "OK" ( INET6 2001:db8::1 )
+ 70 addr.dnserr.distorted.org.uk ok 0 ok "OK" ( INET 198.51.100.17 INET6 2001:db8::2 )
+rc=0
diff --git a/regress/case-addr-multi-af.sys b/regress/case-addr-multi-af.sys
new file mode 100644
index 0000000..1edce47
--- /dev/null
+++ b/regress/case-addr-multi-af.sys
@@ -0,0 +1,1236 @@
+./adnstest distorted
+:0x1010000|1,0x1010000|15,0x3010000|1,0x3010000|15 maddr.dnserr.distorted.org.uk mx.dnserr.distorted.org.uk 0x400/maddr.dnserr.distorted.org.uk 0x400/mx.dnserr.distorted.org.uk 0x800/maddr.dnserr.distorted.org.uk 0x800/mx.dnserr.distorted.org.uk 0xc00/maddr.dnserr.distorted.org.uk 0xc00/mx.dnserr.distorted.org.uk
+ start 1402445458.222480
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000026
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000012
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000010
+ sendto fd=6 addr=172.29.199.224:53
+ 31200100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000089
+ sendto fd=6 addr=172.29.199.224:53
+ 31210100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001.
+ sendto=47
+ +0.000043
+ sendto fd=6 addr=172.29.199.224:53
+ 31230100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000040
+ sendto fd=6 addr=172.29.199.224:53
+ 31240100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000031
+ sendto fd=6 addr=172.29.199.224:53
+ 31250100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001.
+ sendto=47
+ +0.000040
+ sendto fd=6 addr=172.29.199.224:53
+ 31270100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001.
+ sendto=44
+ +0.000038
+ sendto fd=6 addr=172.29.199.224:53
+ 31280100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001.
+ sendto=44
+ +0.000035
+ sendto fd=6 addr=172.29.199.224:53
+ 312a0100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001.
+ sendto=44
+ +0.000041
+ sendto fd=6 addr=172.29.199.224:53
+ 312b0100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 001c0001.
+ sendto=44
+ +0.000030
+ sendto fd=6 addr=172.29.199.224:53
+ 312c0100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001.
+ sendto=44
+ +0.000036
+ sendto fd=6 addr=172.29.199.224:53
+ 312e0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000041
+ sendto fd=6 addr=172.29.199.224:53
+ 312f0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001.
+ sendto=47
+ +0.000038
+ sendto fd=6 addr=172.29.199.224:53
+ 31310100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000043
+ sendto fd=6 addr=172.29.199.224:53
+ 31320100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001.
+ sendto=47
+ +0.000039
+ sendto fd=6 addr=172.29.199.224:53
+ 31340100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001.
+ sendto=44
+ +0.000039
+ sendto fd=6 addr=172.29.199.224:53
+ 31350100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001.
+ sendto=44
+ +0.000037
+ sendto fd=6 addr=172.29.199.224:53
+ 31370100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001.
+ sendto=44
+ +0.000039
+ sendto fd=6 addr=172.29.199.224:53
+ 31380100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001.
+ sendto=44
+ +0.000037
+ sendto fd=6 addr=172.29.199.224:53
+ 313a0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000045
+ sendto fd=6 addr=172.29.199.224:53
+ 313b0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001.
+ sendto=47
+ +0.000038
+ sendto fd=6 addr=172.29.199.224:53
+ 313d0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000054
+ sendto fd=6 addr=172.29.199.224:53
+ 313e0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001.
+ sendto=47
+ +0.000039
+ sendto fd=6 addr=172.29.199.224:53
+ 31400100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 001c0001.
+ sendto=44
+ +0.000040
+ sendto fd=6 addr=172.29.199.224:53
+ 31410100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001.
+ sendto=44
+ +0.000038
+ sendto fd=6 addr=172.29.199.224:53
+ 31430100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 001c0001.
+ sendto=44
+ +0.000039
+ sendto fd=6 addr=172.29.199.224:53
+ 31440100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001.
+ sendto=44
+ +0.000038
+ sendto fd=6 addr=172.29.199.224:53
+ 31460100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000046
+ sendto fd=6 addr=172.29.199.224:53
+ 31470100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000031
+ sendto fd=6 addr=172.29.199.224:53
+ 31480100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001.
+ sendto=47
+ +0.000039
+ sendto fd=6 addr=172.29.199.224:53
+ 314a0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000041
+ sendto fd=6 addr=172.29.199.224:53
+ 314b0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000031
+ sendto fd=6 addr=172.29.199.224:53
+ 314c0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001.
+ sendto=47
+ +0.000038
+ sendto fd=6 addr=172.29.199.224:53
+ 314e0100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001.
+ sendto=44
+ +0.000039
+ sendto fd=6 addr=172.29.199.224:53
+ 314f0100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 001c0001.
+ sendto=44
+ +0.000033
+ sendto fd=6 addr=172.29.199.224:53
+ 31500100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001.
+ sendto=44
+ +0.000040
+ sendto fd=6 addr=172.29.199.224:53
+ 31520100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001.
+ sendto=44
+ +0.000039
+ sendto fd=6 addr=172.29.199.224:53
+ 31530100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 001c0001.
+ sendto=44
+ +0.000029
+ sendto fd=6 addr=172.29.199.224:53
+ 31540100 00010000 00000000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001.
+ sendto=44
+ +0.000038
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.998489
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.002108
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31208580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001c0 0c000100 01000038 400004c0 000202c0
+ 0c000100 01000038 400004c6 336401c0 0c000100 01000038 400004c6 336402c0
+ 0c000100 01000038 400004cb 007101c0 0c000100 01000038 400004cb 007102c0
+ 0c000100 01000038 400004c0 000201c0 12000200 01000038 40000d07 76616d70
+ 69726502 6e73c012 c0120002 00010000 3840000d 0a74656c 65636173 746572c0
+ a3c01200 02000100 00384000 09067261 64697573 c0a3c012 00020001 00003840
+ 000c0970 72656369 73696f6e c0a3c0cd 00010001 00003840 00043e31 cc92c0cd
+ 001c0001 00003840 00102001 04701f09 1b980000 00000000 0002c09b 00010001
+ 00003840 00043e31 cc96c09b 001c0001 00003840 00102001 04701f09 1b980000
+ 00000000 0006c0e2 00010001 00003840 0004d40d c646c0e2 001c0001 00003840
+ 00102001 0ba80000 01d90000 00000000 0006c0b4 00010001 00003840 0004d40d
+ c647c0b4 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0007.
+ +0.000161
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31218580 00010000 00010000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001c0 12000600 01000038 40002a06 72616469
+ 7573c019 0a686f73 746d6173 746572c0 19780bf8 6a000151 8000000e 10001275
+ 00000038 40.
+ +0.000082
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000013
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.996257
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000270
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31238580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001c0 0c000100 01000038 400004c6 336401c0
+ 0c000100 01000038 400004c6 336402c0 0c000100 01000038 400004cb 007101c0
+ 0c000100 01000038 400004cb 007102c0 0c000100 01000038 400004c0 000201c0
+ 0c000100 01000038 400004c0 000202c0 12000200 01000038 40000f09 70726563
+ 6973696f 6e026e73 c012c012 00020001 00003840 000a0776 616d7069 7265c0a5
+ c0120002 00010000 3840000d 0a74656c 65636173 746572c0 a5c01200 02000100
+ 00384000 09067261 64697573 c0a5c0e5 00010001 00003840 00043e31 cc92c0e5
+ 001c0001 00003840 00102001 04701f09 1b980000 00000000 0002c0b6 00010001
+ 00003840 00043e31 cc96c0b6 001c0001 00003840 00102001 04701f09 1b980000
+ 00000000 0006c09b 00010001 00003840 0004d40d c646c09b 001c0001 00003840
+ 00102001 0ba80000 01d90000 00000000 0006c0cc 00010001 00003840 0004d40d
+ c647c0cc 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0007.
+ +0.000125
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000028
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.995834
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.005597
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31248580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 03000000 00000000 000001c0 0c001c00 01000038 40001020 010db800 03000000
+ 00000000 000002c0 0c001c00 01000038 40001020 010db800 01000000 00000000
+ 000001c0 0c001c00 01000038 40001020 010db800 01000000 00000000 000002c0
+ 0c001c00 01000038 40001020 010db800 02000000 00000000 000001c0 0c001c00
+ 01000038 40001020 010db800 02000000 00000000 000002c0 12000200 01000038
+ 40000d07 76616d70 69726502 6e73c012 c0120002 00010000 3840000c 09707265
+ 63697369 6f6ec0eb c0120002 00010000 38400009 06726164 697573c0 ebc01200
+ 02000100 00384000 0d0a7465 6c656361 73746572 c0ebc114 00010001 00003840
+ 00043e31 cc92c114 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c0e3 00010001 00003840 00043e31 cc96c0e3 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c0fc 00010001 00003840 0004d40d c646c0fc
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c129 00010001
+ 00003840 0004d40d c647c129 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000159
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000046
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.990103
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000396
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31258580 00010000 00010000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001c0 12000600 01000038 40002a06 72616469
+ 7573c019 0a686f73 746d6173 746572c0 19780bf8 6a000151 8000000e 10001275
+ 00000038 40.
+ +0.000049
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000035
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.989663
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000161
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31278580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000069
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000019
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.989452
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000179
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31288580 00010004 00040008 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001 c00c000f 00010000 38400009 00450461 616161c0
+ 0fc00c00 0f000100 00384000 0a004505 6d616464 72c00fc0 0c000f00 01000038
+ 40000900 46046164 6472c00f c00c000f 00010000 38400006 00450161 c00fc00f
+ 00020001 00003840 000f0970 72656369 73696f6e 026e73c0 0fc00f00 02000100
+ 00384000 0a077661 6d706972 65c094c0 0f000200 01000038 40000d0a 74656c65
+ 63617374 6572c094 c00f0002 00010000 38400009 06726164 697573c0 94c07a00
+ 01000100 00384000 04c63364 10c03a00 1c000100 00384000 1020010d b8000000
+ 00000000 00000000 01c04f00 01000100 00384000 04c63364 02c04f00 01000100
+ 00384000 04cb0071 01c04f00 01000100 00384000 04cb0071 02c04f00 01000100
+ 00384000 04c00002 01c04f00 01000100 00384000 04c00002 02c04f00 01000100
+ 00384000 04c63364 01.
+ +0.000167
+ sendto fd=6 addr=172.29.199.224:53
+ 31560100 00010000 00000000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000104
+ sendto fd=6 addr=172.29.199.224:53
+ 31580100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000083
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000029
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.988925
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000192
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 312a8580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000070
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000020
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.988643
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000123
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 312b8580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 001c0001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000069
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000019
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.988503
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000159
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 312c8580 00010004 00040008 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001 c00c000f 00010000 3840000a 0045056d 61646472
+ c00fc00c 000f0001 00003840 00090046 04616464 72c00fc0 0c000f00 01000038
+ 40000600 450161c0 0fc00c00 0f000100 00384000 09004504 61616161 c00fc00f
+ 00020001 00003840 00100a74 656c6563 61737465 72026e73 c00fc00f 00020001
+ 00003840 000c0970 72656369 73696f6e c095c00f 00020001 00003840 00090672
+ 61646975 73c095c0 0f000200 01000038 40000a07 76616d70 697265c0 95c06500
+ 01000100 00384000 04c63364 10c07700 1c000100 00384000 1020010d b8000000
+ 00000000 00000000 01c03a00 01000100 00384000 04cb0071 01c03a00 01000100
+ 00384000 04cb0071 02c03a00 01000100 00384000 04c00002 01c03a00 01000100
+ 00384000 04c00002 02c03a00 01000100 00384000 04c63364 01c03a00 01000100
+ 00384000 04c63364 02.
+ +0.000169
+ sendto fd=6 addr=172.29.199.224:53
+ 315a0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000079
+ sendto fd=6 addr=172.29.199.224:53
+ 315c0100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000058
+ sendto fd=6 addr=172.29.199.224:53
+ 315d0100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b00001c 0001.
+ sendto=46
+ +0.000045
+ sendto fd=6 addr=172.29.199.224:53
+ 315f0100 00010000 00000000 01610664 6e736572 72096469 73746f72 74656403
+ 6f726702 756b0000 1c0001.
+ sendto=43
+ +0.000058
+ sendto fd=6 addr=172.29.199.224:53
+ 31610100 00010000 00000000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000077
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 312e8580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001c0 0c000100 01000038 400004cb 007102c0
+ 0c000100 01000038 400004c0 000201c0 0c000100 01000038 400004c0 000202c0
+ 0c000100 01000038 400004c6 336401c0 0c000100 01000038 400004c6 336402c0
+ 0c000100 01000038 400004cb 007101c0 12000200 01000038 40000c06 72616469
+ 7573026e 73c012c0 12000200 01000038 40000d0a 74656c65 63617374 6572c0a2
+ c0120002 00010000 3840000a 0776616d 70697265 c0a2c012 00020001 00003840
+ 000c0970 72656369 73696f6e c0a2c09b 00010001 00003840 00043e31 cc92c09b
+ 001c0001 00003840 00102001 04701f09 1b980000 00000000 0002c0cc 00010001
+ 00003840 00043e31 cc96c0cc 001c0001 00003840 00102001 04701f09 1b980000
+ 00000000 0006c0e2 00010001 00003840 0004d40d c646c0e2 001c0001 00003840
+ 00102001 0ba80000 01d90000 00000000 0006c0b3 00010001 00003840 0004d40d
+ c647c0b3 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0007.
+ +0.000176
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 312f8580 00010000 00010000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001c0 12000600 01000038 40002a06 72616469
+ 7573c019 0a686f73 746d6173 746572c0 19780bf8 6a000151 8000000e 10001275
+ 00000038 40.
+ +0.000085
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31318580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001c0 0c000100 01000038 400004c0 000201c0
+ 0c000100 01000038 400004c0 000202c0 0c000100 01000038 400004c6 336401c0
+ 0c000100 01000038 400004c6 336402c0 0c000100 01000038 400004cb 007101c0
+ 0c000100 01000038 400004cb 007102c0 12000200 01000038 40000c06 72616469
+ 7573026e 73c012c0 12000200 01000038 40000a07 76616d70 697265c0 a2c01200
+ 02000100 00384000 0c097072 65636973 696f6ec0 a2c01200 02000100 00384000
+ 0d0a7465 6c656361 73746572 c0a2c09b 00010001 00003840 00043e31 cc92c09b
+ 001c0001 00003840 00102001 04701f09 1b980000 00000000 0002c0b3 00010001
+ 00003840 00043e31 cc96c0b3 001c0001 00003840 00102001 04701f09 1b980000
+ 00000000 0006c0c9 00010001 00003840 0004d40d c646c0c9 001c0001 00003840
+ 00102001 0ba80000 01d90000 00000000 0006c0e1 00010001 00003840 0004d40d
+ c647c0e1 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0007.
+ +0.000175
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000044
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.987536
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000757
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31328580 00010000 00010000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001c0 12000600 01000038 40002a06 72616469
+ 7573c019 0a686f73 746d6173 746572c0 19780bf8 6a000151 8000000e 10001275
+ 00000038 40.
+ +0.000072
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31348580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000058
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000020
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.986707
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000275
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31358580 00010004 00040008 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001 c00c000f 00010000 38400009 00460461 646472c0
+ 0fc00c00 0f000100 00384000 06004501 61c00fc0 0c000f00 01000038 40000900
+ 45046161 6161c00f c00c000f 00010000 3840000a 0045056d 61646472 c00fc00f
+ 00020001 00003840 000f0970 72656369 73696f6e 026e73c0 0fc00f00 02000100
+ 00384000 0d0a7465 6c656361 73746572 c094c00f 00020001 00003840 000a0776
+ 616d7069 7265c094 c00f0002 00010000 38400009 06726164 697573c0 94c04f00
+ 01000100 00384000 04c63364 10c06100 1c000100 00384000 1020010d b8000000
+ 00000000 00000000 01c07600 01000100 00384000 04c00002 02c07600 01000100
+ 00384000 04c63364 01c07600 01000100 00384000 04c63364 02c07600 01000100
+ 00384000 04cb0071 01c07600 01000100 00384000 04cb0071 02c07600 01000100
+ 00384000 04c00002 01.
+ +0.000186
+ sendto fd=6 addr=172.29.199.224:53
+ 31630100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000086
+ sendto fd=6 addr=172.29.199.224:53
+ 31650100 00010000 00000000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000072
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31378580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000094
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000019
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.986051
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000294
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31388580 00010004 00040008 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001 c00c000f 00010000 38400006 00450161 c00fc00c
+ 000f0001 00003840 00090045 04616161 61c00fc0 0c000f00 01000038 40000a00
+ 45056d61 646472c0 0fc00c00 0f000100 00384000 09004604 61646472 c00fc00f
+ 00020001 00003840 000f0970 72656369 73696f6e 026e73c0 0fc00f00 02000100
+ 00384000 09067261 64697573 c094c00f 00020001 00003840 000a0776 616d7069
+ 7265c094 c00f0002 00010000 3840000d 0a74656c 65636173 746572c0 94c03a00
+ 01000100 00384000 04c63364 10c04c00 1c000100 00384000 1020010d b8000000
+ 00000000 00000000 01c06100 01000100 00384000 04c63364 01c06100 01000100
+ 00384000 04c63364 02c06100 01000100 00384000 04cb0071 01c06100 01000100
+ 00384000 04cb0071 02c06100 01000100 00384000 04c00002 01c06100 01000100
+ 00384000 04c00002 02.
+ +0.000183
+ sendto fd=6 addr=172.29.199.224:53
+ 31670100 00010000 00000000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000083
+ sendto fd=6 addr=172.29.199.224:53
+ 31690100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000093
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 313a8580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 02000000 00000000 000002c0 0c001c00 01000038 40001020 010db800 03000000
+ 00000000 000001c0 0c001c00 01000038 40001020 010db800 03000000 00000000
+ 000002c0 0c001c00 01000038 40001020 010db800 01000000 00000000 000001c0
+ 0c001c00 01000038 40001020 010db800 01000000 00000000 000002c0 0c001c00
+ 01000038 40001020 010db800 02000000 00000000 000001c0 12000200 01000038
+ 40000c06 72616469 7573026e 73c012c0 12000200 01000038 40000d0a 74656c65
+ 63617374 6572c0ea c0120002 00010000 3840000a 0776616d 70697265 c0eac012
+ 00020001 00003840 000c0970 72656369 73696f6e c0eac0e3 00010001 00003840
+ 00043e31 cc92c0e3 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c114 00010001 00003840 00043e31 cc96c114 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c12a 00010001 00003840 0004d40d c646c12a
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c0fb 00010001
+ 00003840 0004d40d c647c0fb 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000202
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 313b8580 00010000 00010000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001c0 12000600 01000038 40002a06 72616469
+ 7573c019 0a686f73 746d6173 746572c0 19780bf8 6a000151 8000000e 10001275
+ 00000038 40.
+ +0.000095
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000018
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.985203
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.001040
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 313d8580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 03000000 00000000 000001c0 0c001c00 01000038 40001020 010db800 03000000
+ 00000000 000002c0 0c001c00 01000038 40001020 010db800 01000000 00000000
+ 000001c0 0c001c00 01000038 40001020 010db800 01000000 00000000 000002c0
+ 0c001c00 01000038 40001020 010db800 02000000 00000000 000001c0 0c001c00
+ 01000038 40001020 010db800 02000000 00000000 000002c0 12000200 01000038
+ 40000d07 76616d70 69726502 6e73c012 c0120002 00010000 38400009 06726164
+ 697573c0 ebc01200 02000100 00384000 0d0a7465 6c656361 73746572 c0ebc012
+ 00020001 00003840 000c0970 72656369 73696f6e c0ebc0fc 00010001 00003840
+ 00043e31 cc92c0fc 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c0e3 00010001 00003840 00043e31 cc96c0e3 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c12a 00010001 00003840 0004d40d c646c12a
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c111 00010001
+ 00003840 0004d40d c647c111 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000235
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 313e8580 00010000 00010000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001c0 12000600 01000038 40002a06 72616469
+ 7573c019 0a686f73 746d6173 746572c0 19780bf8 6a000151 8000000e 10001275
+ 00000038 40.
+ +0.000091
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31408580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 001c0001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000058
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31418580 00010004 00040008 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001 c00c000f 00010000 38400009 00450461 616161c0
+ 0fc00c00 0f000100 00384000 0a004505 6d616464 72c00fc0 0c000f00 01000038
+ 40000900 46046164 6472c00f c00c000f 00010000 38400006 00450161 c00fc00f
+ 00020001 00003840 000d0776 616d7069 7265026e 73c00fc0 0f000200 01000038
+ 40000d0a 74656c65 63617374 6572c092 c00f0002 00010000 38400009 06726164
+ 697573c0 92c00f00 02000100 00384000 0c097072 65636973 696f6ec0 92c07a00
+ 01000100 00384000 04c63364 10c03a00 1c000100 00384000 1020010d b8000000
+ 00000000 00000000 01c04f00 01000100 00384000 04c63364 02c04f00 01000100
+ 00384000 04cb0071 01c04f00 01000100 00384000 04cb0071 02c04f00 01000100
+ 00384000 04c00002 01c04f00 01000100 00384000 04c00002 02c04f00 01000100
+ 00384000 04c63364 01.
+ +0.000157
+ sendto fd=6 addr=172.29.199.224:53
+ 316b0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000087
+ sendto fd=6 addr=172.29.199.224:53
+ 316d0100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b00001c 0001.
+ sendto=46
+ +0.000060
+ sendto fd=6 addr=172.29.199.224:53
+ 316f0100 00010000 00000000 01610664 6e736572 72096469 73746f72 74656403
+ 6f726702 756b0000 1c0001.
+ sendto=43
+ +0.000057
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31438580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 001c0001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000057
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000019
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.983552
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000477
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31448580 00010004 00040008 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001 c00c000f 00010000 3840000a 0045056d 61646472
+ c00fc00c 000f0001 00003840 00090046 04616464 72c00fc0 0c000f00 01000038
+ 40000600 450161c0 0fc00c00 0f000100 00384000 09004504 61616161 c00fc00f
+ 00020001 00003840 00100a74 656c6563 61737465 72026e73 c00fc00f 00020001
+ 00003840 00090672 61646975 73c095c0 0f000200 01000038 40000a07 76616d70
+ 697265c0 95c00f00 02000100 00384000 0c097072 65636973 696f6ec0 95c06500
+ 01000100 00384000 04c63364 10c07700 1c000100 00384000 1020010d b8000000
+ 00000000 00000000 01c03a00 01000100 00384000 04cb0071 01c03a00 01000100
+ 00384000 04cb0071 02c03a00 01000100 00384000 04c00002 01c03a00 01000100
+ 00384000 04c00002 02c03a00 01000100 00384000 04c63364 01c03a00 01000100
+ 00384000 04c63364 02.
+ +0.000172
+ sendto fd=6 addr=172.29.199.224:53
+ 31710100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000093
+ sendto fd=6 addr=172.29.199.224:53
+ 31730100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b00001c 0001.
+ sendto=46
+ +0.000059
+ sendto fd=6 addr=172.29.199.224:53
+ 31750100 00010000 00000000 01610664 6e736572 72096469 73746f72 74656403
+ 6f726702 756b0000 1c0001.
+ sendto=43
+ +0.000058
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31468580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001c0 0c000100 01000038 400004cb 007102c0
+ 0c000100 01000038 400004c0 000201c0 0c000100 01000038 400004c0 000202c0
+ 0c000100 01000038 400004c6 336401c0 0c000100 01000038 400004c6 336402c0
+ 0c000100 01000038 400004cb 007101c0 12000200 01000038 40000c06 72616469
+ 7573026e 73c012c0 12000200 01000038 40000c09 70726563 6973696f 6ec0a2c0
+ 12000200 01000038 40000a07 76616d70 697265c0 a2c01200 02000100 00384000
+ 0d0a7465 6c656361 73746572 c0a2c09b 00010001 00003840 00043e31 cc92c09b
+ 001c0001 00003840 00102001 04701f09 1b980000 00000000 0002c0cb 00010001
+ 00003840 00043e31 cc96c0cb 001c0001 00003840 00102001 04701f09 1b980000
+ 00000000 0006c0b3 00010001 00003840 0004d40d c646c0b3 001c0001 00003840
+ 00102001 0ba80000 01d90000 00000000 0006c0e1 00010001 00003840 0004d40d
+ c647c0e1 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0007.
+ +0.000188
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31478580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 01000000 00000000 000002c0 0c001c00 01000038 40001020 010db800 02000000
+ 00000000 000001c0 0c001c00 01000038 40001020 010db800 02000000 00000000
+ 000002c0 0c001c00 01000038 40001020 010db800 03000000 00000000 000001c0
+ 0c001c00 01000038 40001020 010db800 03000000 00000000 000002c0 0c001c00
+ 01000038 40001020 010db800 01000000 00000000 000001c0 12000200 01000038
+ 40000d07 76616d70 69726502 6e73c012 c0120002 00010000 3840000c 09707265
+ 63697369 6f6ec0eb c0120002 00010000 38400009 06726164 697573c0 ebc01200
+ 02000100 00384000 0d0a7465 6c656361 73746572 c0ebc114 00010001 00003840
+ 00043e31 cc92c114 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c0e3 00010001 00003840 00043e31 cc96c0e3 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c0fc 00010001 00003840 0004d40d c646c0fc
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c129 00010001
+ 00003840 0004d40d c647c129 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000242
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31488580 00010000 00010000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001c0 12000600 01000038 40002a06 72616469
+ 7573c019 0a686f73 746d6173 746572c0 19780bf8 6a000151 8000000e 10001275
+ 00000038 40.
+ +0.000093
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 314a8580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001c0 0c000100 01000038 400004c0 000201c0
+ 0c000100 01000038 400004c0 000202c0 0c000100 01000038 400004c6 336401c0
+ 0c000100 01000038 400004c6 336402c0 0c000100 01000038 400004cb 007101c0
+ 0c000100 01000038 400004cb 007102c0 12000200 01000038 40000d07 76616d70
+ 69726502 6e73c012 c0120002 00010000 38400009 06726164 697573c0 a3c01200
+ 02000100 00384000 0c097072 65636973 696f6ec0 a3c01200 02000100 00384000
+ 0d0a7465 6c656361 73746572 c0a3c0b4 00010001 00003840 00043e31 cc92c0b4
+ 001c0001 00003840 00102001 04701f09 1b980000 00000000 0002c09b 00010001
+ 00003840 00043e31 cc96c09b 001c0001 00003840 00102001 04701f09 1b980000
+ 00000000 0006c0c9 00010001 00003840 0004d40d c646c0c9 001c0001 00003840
+ 00102001 0ba80000 01d90000 00000000 0006c0e1 00010001 00003840 0004d40d
+ c647c0e1 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0007.
+ +0.000176
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 314b8580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 02000000 00000000 000001c0 0c001c00 01000038 40001020 010db800 02000000
+ 00000000 000002c0 0c001c00 01000038 40001020 010db800 03000000 00000000
+ 000001c0 0c001c00 01000038 40001020 010db800 03000000 00000000 000002c0
+ 0c001c00 01000038 40001020 010db800 01000000 00000000 000001c0 0c001c00
+ 01000038 40001020 010db800 01000000 00000000 000002c0 12000200 01000038
+ 4000100a 74656c65 63617374 6572026e 73c012c0 12000200 01000038 40000a07
+ 76616d70 697265c0 eec01200 02000100 00384000 09067261 64697573 c0eec012
+ 00020001 00003840 000c0970 72656369 73696f6e c0eec115 00010001 00003840
+ 00043e31 cc92c115 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c0ff 00010001 00003840 00043e31 cc96c0ff 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c12a 00010001 00003840 0004d40d c646c12a
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c0e3 00010001
+ 00003840 0004d40d c647c0e3 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000241
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 314c8580 00010000 00010000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 0f0001c0 12000600 01000038 40002a06 72616469
+ 7573c019 0a686f73 746d6173 746572c0 19780bf8 6a000151 8000000e 10001275
+ 00000038 40.
+ +0.000089
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 314e8580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000056
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000019
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.981853
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000959
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 314f8580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 001c0001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000072
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31508580 00010004 00040008 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001 c00c000f 00010000 38400009 00460461 646472c0
+ 0fc00c00 0f000100 00384000 06004501 61c00fc0 0c000f00 01000038 40000900
+ 45046161 6161c00f c00c000f 00010000 3840000a 0045056d 61646472 c00fc00f
+ 00020001 00003840 000f0970 72656369 73696f6e 026e73c0 0fc00f00 02000100
+ 00384000 0a077661 6d706972 65c094c0 0f000200 01000038 40000906 72616469
+ 7573c094 c00f0002 00010000 3840000d 0a74656c 65636173 746572c0 94c04f00
+ 01000100 00384000 04c63364 10c06100 1c000100 00384000 1020010d b8000000
+ 00000000 00000000 01c07600 01000100 00384000 04c00002 02c07600 01000100
+ 00384000 04c63364 01c07600 01000100 00384000 04c63364 02c07600 01000100
+ 00384000 04cb0071 01c07600 01000100 00384000 04cb0071 02c07600 01000100
+ 00384000 04c00002 01.
+ +0.000160
+ sendto fd=6 addr=172.29.199.224:53
+ 31770100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000087
+ sendto fd=6 addr=172.29.199.224:53
+ 31780100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b00001c 0001.
+ sendto=46
+ +0.000045
+ sendto fd=6 addr=172.29.199.224:53
+ 317a0100 00010000 00000000 01610664 6e736572 72096469 73746f72 74656403
+ 6f726702 756b0000 1c0001.
+ sendto=43
+ +0.000059
+ sendto fd=6 addr=172.29.199.224:53
+ 317c0100 00010000 00000000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000060
+ sendto fd=6 addr=172.29.199.224:53
+ 317e0100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000069
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31528580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 00010001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000057
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31538580 00010000 00010000 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 001c0001 c00f0006 00010000 3840002a 06726164 697573c0
+ 160a686f 73746d61 73746572 c016780b f86a0001 51800000 0e100012 75000000
+ 3840.
+ +0.000058
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000019
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.980388
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000215
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31548580 00010004 00040008 026d7806 646e7365 72720964 6973746f 72746564
+ 036f7267 02756b00 000f0001 c00c000f 00010000 38400006 00450161 c00fc00c
+ 000f0001 00003840 00090045 04616161 61c00fc0 0c000f00 01000038 40000a00
+ 45056d61 646472c0 0fc00c00 0f000100 00384000 09004604 61646472 c00fc00f
+ 00020001 00003840 000f0970 72656369 73696f6e 026e73c0 0fc00f00 02000100
+ 00384000 09067261 64697573 c094c00f 00020001 00003840 000d0a74 656c6563
+ 61737465 72c094c0 0f000200 01000038 40000a07 76616d70 697265c0 94c03a00
+ 01000100 00384000 04c63364 10c04c00 1c000100 00384000 1020010d b8000000
+ 00000000 00000000 01c06100 01000100 00384000 04c63364 01c06100 01000100
+ 00384000 04c63364 02c06100 01000100 00384000 04cb0071 01c06100 01000100
+ 00384000 04cb0071 02c06100 01000100 00384000 04c00002 01c06100 01000100
+ 00384000 04c00002 02.
+ +0.000173
+ sendto fd=6 addr=172.29.199.224:53
+ 31800100 00010000 00000000 01610664 6e736572 72096469 73746f72 74656403
+ 6f726702 756b0000 1c0001.
+ sendto=43
+ +0.000068
+ sendto fd=6 addr=172.29.199.224:53
+ 31820100 00010000 00000000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000059
+ sendto fd=6 addr=172.29.199.224:53
+ 31840100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000067
+ sendto fd=6 addr=172.29.199.224:53
+ 31860100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001.
+ sendto=46
+ +0.000062
+ sendto fd=6 addr=172.29.199.224:53
+ 31870100 00010000 00000000 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b00001c 0001.
+ sendto=46
+ +0.000044
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000015
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.989220
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000156
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31568580 00010000 00010000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c011 00060001 00003840 002a0672 61646975
+ 73c0180a 686f7374 6d617374 6572c018 780bf86a 00015180 00000e10 00127500
+ 00003840.
+ +0.000082
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000022
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.988960
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000271
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31588580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c00c 00010001 00003840 0004c633 6411c011
+ 00020001 00003840 000f0970 72656369 73696f6e 026e73c0 11c01100 02000100
+ 00384000 09067261 64697573 c054c011 00020001 00003840 000d0a74 656c6563
+ 61737465 72c054c0 11000200 01000038 40000a07 76616d70 697265c0 54c06500
+ 01000100 00384000 043e31cc 92c06500 1c000100 00384000 10200104 701f091b
+ 98000000 00000000 02c09300 01000100 00384000 043e31cc 96c09300 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 06c04a00 01000100 00384000
+ 04d40dc6 46c04a00 1c000100 00384000 1020010b a8000001 d9000000 00000000
+ 06c07a00 01000100 00384000 04d40dc6 47c07a00 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 07.
+ +0.000285
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 315a8580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 03000000 00000000 000002c0 0c001c00 01000038 40001020 010db800 01000000
+ 00000000 000001c0 0c001c00 01000038 40001020 010db800 01000000 00000000
+ 000002c0 0c001c00 01000038 40001020 010db800 02000000 00000000 000001c0
+ 0c001c00 01000038 40001020 010db800 02000000 00000000 000002c0 0c001c00
+ 01000038 40001020 010db800 03000000 00000000 000001c0 12000200 01000038
+ 40000c06 72616469 7573026e 73c012c0 12000200 01000038 40000d0a 74656c65
+ 63617374 6572c0ea c0120002 00010000 3840000c 09707265 63697369 6f6ec0ea
+ c0120002 00010000 3840000a 0776616d 70697265 c0eac0e3 00010001 00003840
+ 00043e31 cc92c0e3 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c12c 00010001 00003840 00043e31 cc96c12c 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c114 00010001 00003840 0004d40d c646c114
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c0fb 00010001
+ 00003840 0004d40d c647c0fb 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000369
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 315c8580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c00c 00010001 00003840 0004c633 6411c011
+ 00020001 00003840 000c0672 61646975 73026e73 c011c011 00020001 00003840
+ 000c0970 72656369 73696f6e c051c011 00020001 00003840 000d0a74 656c6563
+ 61737465 72c051c0 11000200 01000038 40000a07 76616d70 697265c0 51c04a00
+ 01000100 00384000 043e31cc 92c04a00 1c000100 00384000 10200104 701f091b
+ 98000000 00000000 02c09300 01000100 00384000 043e31cc 96c09300 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 06c06200 01000100 00384000
+ 04d40dc6 46c06200 1c000100 00384000 1020010b a8000001 d9000000 00000000
+ 06c07a00 01000100 00384000 04d40dc6 47c07a00 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 07.
+ +0.000309
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000020
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.988741
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000441
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 315d8580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b00001c 0001c00c 001c0001 00003840 00102001 0db80000
+ 00000000 00000000 0002c011 00020001 00003840 000f0970 72656369 73696f6e
+ 026e73c0 11c01100 02000100 00384000 0a077661 6d706972 65c060c0 11000200
+ 01000038 40000d0a 74656c65 63617374 6572c060 c0110002 00010000 38400009
+ 06726164 697573c0 60c0a000 01000100 00384000 043e31cc 92c0a000 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 02c07100 01000100 00384000
+ 043e31cc 96c07100 1c000100 00384000 10200104 701f091b 98000000 00000000
+ 06c05600 01000100 00384000 04d40dc6 46c05600 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 06c08700 01000100 00384000 04d40dc6 47c08700
+ 1c000100 00384000 1020010b a8000001 d9000000 00000000 07.
+ +0.000200
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 315f8580 00010000 00010000 01610664 6e736572 72096469 73746f72 74656403
+ 6f726702 756b0000 1c0001c0 0e000600 01000038 40002a06 72616469 7573c015
+ 0a686f73 746d6173 746572c0 15780bf8 6a000151 8000000e 10001275 00000038
+ 40.
+ +0.000135
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31618580 00010000 00010000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c011 00060001 00003840 002a0672 61646975
+ 73c0180a 686f7374 6d617374 6572c018 780bf86a 00015180 00000e10 00127500
+ 00003840.
+ +0.000151
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31638580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c00c 00010001 00003840 0004c633 6411c011
+ 00020001 00003840 000d0776 616d7069 7265026e 73c011c0 11000200 01000038
+ 40000c09 70726563 6973696f 6ec052c0 11000200 01000038 40000906 72616469
+ 7573c052 c0110002 00010000 3840000d 0a74656c 65636173 746572c0 52c07b00
+ 01000100 00384000 043e31cc 92c07b00 1c000100 00384000 10200104 701f091b
+ 98000000 00000000 02c04a00 01000100 00384000 043e31cc 96c04a00 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 06c06300 01000100 00384000
+ 04d40dc6 46c06300 1c000100 00384000 1020010b a8000001 d9000000 00000000
+ 06c09000 01000100 00384000 04d40dc6 47c09000 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 07.
+ +0.000277
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31658580 00010000 00010000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c011 00060001 00003840 002a0672 61646975
+ 73c0180a 686f7374 6d617374 6572c018 780bf86a 00015180 00000e10 00127500
+ 00003840.
+ +0.000135
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31678580 00010000 00010000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c011 00060001 00003840 002a0672 61646975
+ 73c0180a 686f7374 6d617374 6572c018 780bf86a 00015180 00000e10 00127500
+ 00003840.
+ +0.000049
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000099
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.990153
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000667
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31698580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c00c 00010001 00003840 0004c633 6411c011
+ 00020001 00003840 000c0672 61646975 73026e73 c011c011 00020001 00003840
+ 000a0776 616d7069 7265c051 c0110002 00010000 3840000d 0a74656c 65636173
+ 746572c0 51c01100 02000100 00384000 0c097072 65636973 696f6ec0 51c04a00
+ 01000100 00384000 043e31cc 92c04a00 1c000100 00384000 10200104 701f091b
+ 98000000 00000000 02c06200 01000100 00384000 043e31cc 96c06200 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 06c09100 01000100 00384000
+ 04d40dc6 46c09100 1c000100 00384000 1020010b a8000001 d9000000 00000000
+ 06c07800 01000100 00384000 04d40dc6 47c07800 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 07.
+ +0.000262
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 316b8580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 01000000 00000000 000001c0 0c001c00 01000038 40001020 010db800 01000000
+ 00000000 000002c0 0c001c00 01000038 40001020 010db800 02000000 00000000
+ 000001c0 0c001c00 01000038 40001020 010db800 02000000 00000000 000002c0
+ 0c001c00 01000038 40001020 010db800 03000000 00000000 000001c0 0c001c00
+ 01000038 40001020 010db800 03000000 00000000 000002c0 12000200 01000038
+ 40000f09 70726563 6973696f 6e026e73 c012c012 00020001 00003840 00090672
+ 61646975 73c0edc0 12000200 01000038 40000d0a 74656c65 63617374 6572c0ed
+ c0120002 00010000 3840000a 0776616d 70697265 c0edc0fe 00010001 00003840
+ 00043e31 cc92c0fe 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c12c 00010001 00003840 00043e31 cc96c12c 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c0e3 00010001 00003840 0004d40d c646c0e3
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c113 00010001
+ 00003840 0004d40d c647c113 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000306
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 316d8580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b00001c 0001c00c 001c0001 00003840 00102001 0db80000
+ 00000000 00000000 0002c011 00020001 00003840 000f0970 72656369 73696f6e
+ 026e73c0 11c01100 02000100 00384000 09067261 64697573 c060c011 00020001
+ 00003840 000d0a74 656c6563 61737465 72c060c0 11000200 01000038 40000a07
+ 76616d70 697265c0 60c07100 01000100 00384000 043e31cc 92c07100 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 02c09f00 01000100 00384000
+ 043e31cc 96c09f00 1c000100 00384000 10200104 701f091b 98000000 00000000
+ 06c05600 01000100 00384000 04d40dc6 46c05600 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 06c08600 01000100 00384000 04d40dc6 47c08600
+ 1c000100 00384000 1020010b a8000001 d9000000 00000000 07.
+ +0.000302
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 316f8580 00010000 00010000 01610664 6e736572 72096469 73746f72 74656403
+ 6f726702 756b0000 1c0001c0 0e000600 01000038 40002a06 72616469 7573c015
+ 0a686f73 746d6173 746572c0 15780bf8 6a000151 8000000e 10001275 00000038
+ 40.
+ +0.000145
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31718580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 01000000 00000000 000002c0 0c001c00 01000038 40001020 010db800 02000000
+ 00000000 000001c0 0c001c00 01000038 40001020 010db800 02000000 00000000
+ 000002c0 0c001c00 01000038 40001020 010db800 03000000 00000000 000001c0
+ 0c001c00 01000038 40001020 010db800 03000000 00000000 000002c0 0c001c00
+ 01000038 40001020 010db800 01000000 00000000 000001c0 12000200 01000038
+ 40000d07 76616d70 69726502 6e73c012 c0120002 00010000 38400009 06726164
+ 697573c0 ebc01200 02000100 00384000 0d0a7465 6c656361 73746572 c0ebc012
+ 00020001 00003840 000c0970 72656369 73696f6e c0ebc0fc 00010001 00003840
+ 00043e31 cc92c0fc 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c0e3 00010001 00003840 00043e31 cc96c0e3 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c12a 00010001 00003840 0004d40d c646c12a
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c111 00010001
+ 00003840 0004d40d c647c111 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000327
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31738580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b00001c 0001c00c 001c0001 00003840 00102001 0db80000
+ 00000000 00000000 0002c011 00020001 00003840 000c0672 61646975 73026e73
+ c011c011 00020001 00003840 000c0970 72656369 73696f6e c05dc011 00020001
+ 00003840 000a0776 616d7069 7265c05d c0110002 00010000 3840000d 0a74656c
+ 65636173 746572c0 5dc05600 01000100 00384000 043e31cc 92c05600 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 02c08600 01000100 00384000
+ 043e31cc 96c08600 1c000100 00384000 10200104 701f091b 98000000 00000000
+ 06c06e00 01000100 00384000 04d40dc6 46c06e00 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 06c09c00 01000100 00384000 04d40dc6 47c09c00
+ 1c000100 00384000 1020010b a8000001 d9000000 00000000 07.
+ +0.000280
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31758580 00010000 00010000 01610664 6e736572 72096469 73746f72 74656403
+ 6f726702 756b0000 1c0001c0 0e000600 01000038 40002a06 72616469 7573c015
+ 0a686f73 746d6173 746572c0 15780bf8 6a000151 8000000e 10001275 00000038
+ 40.
+ +0.000135
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31778580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c00c 00010001 00003840 0004c633 6411c011
+ 00020001 00003840 00100a74 656c6563 61737465 72026e73 c011c011 00020001
+ 00003840 000c0970 72656369 73696f6e c055c011 00020001 00003840 000a0776
+ 616d7069 7265c055 c0110002 00010000 38400009 06726164 697573c0 55c09400
+ 01000100 00384000 043e31cc 92c09400 1c000100 00384000 10200104 701f091b
+ 98000000 00000000 02c07e00 01000100 00384000 043e31cc 96c07e00 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 06c06600 01000100 00384000
+ 04d40dc6 46c06600 1c000100 00384000 1020010b a8000001 d9000000 00000000
+ 06c04a00 01000100 00384000 04d40dc6 47c04a00 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 07.
+ +0.000261
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31788580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b00001c 0001c00c 001c0001 00003840 00102001 0db80000
+ 00000000 00000000 0002c011 00020001 00003840 00100a74 656c6563 61737465
+ 72026e73 c011c011 00020001 00003840 000a0776 616d7069 7265c061 c0110002
+ 00010000 3840000c 09707265 63697369 6f6ec061 c0110002 00010000 38400009
+ 06726164 697573c0 61c0a000 01000100 00384000 043e31cc 92c0a000 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 02c07200 01000100 00384000
+ 043e31cc 96c07200 1c000100 00384000 10200104 701f091b 98000000 00000000
+ 06c08800 01000100 00384000 04d40dc6 46c08800 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 06c05600 01000100 00384000 04d40dc6 47c05600
+ 1c000100 00384000 1020010b a8000001 d9000000 00000000 07.
+ +0.000272
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 317a8580 00010000 00010000 01610664 6e736572 72096469 73746f72 74656403
+ 6f726702 756b0000 1c0001c0 0e000600 01000038 40002a06 72616469 7573c015
+ 0a686f73 746d6173 746572c0 15780bf8 6a000151 8000000e 10001275 00000038
+ 40.
+ +0.000049
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 317c8580 00010000 00010000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c011 00060001 00003840 002a0672 61646975
+ 73c0180a 686f7374 6d617374 6572c018 780bf86a 00015180 00000e10 00127500
+ 00003840.
+ +0.000123
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 317e8580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 02000000 00000000 000001c0 0c001c00 01000038 40001020 010db800 02000000
+ 00000000 000002c0 0c001c00 01000038 40001020 010db800 03000000 00000000
+ 000001c0 0c001c00 01000038 40001020 010db800 03000000 00000000 000002c0
+ 0c001c00 01000038 40001020 010db800 01000000 00000000 000001c0 0c001c00
+ 01000038 40001020 010db800 01000000 00000000 000002c0 12000200 01000038
+ 40000f09 70726563 6973696f 6e026e73 c012c012 00020001 00003840 000a0776
+ 616d7069 7265c0ed c0120002 00010000 3840000d 0a74656c 65636173 746572c0
+ edc01200 02000100 00384000 09067261 64697573 c0edc12d 00010001 00003840
+ 00043e31 cc92c12d 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c0fe 00010001 00003840 00043e31 cc96c0fe 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c0e3 00010001 00003840 0004d40d c646c0e3
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c114 00010001
+ 00003840 0004d40d c647c114 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000294
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31808580 00010000 00010000 01610664 6e736572 72096469 73746f72 74656403
+ 6f726702 756b0000 1c0001c0 0e000600 01000038 40002a06 72616469 7573c015
+ 0a686f73 746d6173 746572c0 15780bf8 6a000151 8000000e 10001275 00000038
+ 40.
+ +0.000075
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31828580 00010000 00010000 04616161 6106646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c011 00060001 00003840 002a0672 61646975
+ 73c0180a 686f7374 6d617374 6572c018 780bf86a 00015180 00000e10 00127500
+ 00003840.
+ +0.000041
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000026
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.992946
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000486
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31848580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010db800
+ 02000000 00000000 000002c0 0c001c00 01000038 40001020 010db800 03000000
+ 00000000 000001c0 0c001c00 01000038 40001020 010db800 03000000 00000000
+ 000002c0 0c001c00 01000038 40001020 010db800 01000000 00000000 000001c0
+ 0c001c00 01000038 40001020 010db800 01000000 00000000 000002c0 0c001c00
+ 01000038 40001020 010db800 02000000 00000000 000001c0 12000200 01000038
+ 40000d07 76616d70 69726502 6e73c012 c0120002 00010000 3840000c 09707265
+ 63697369 6f6ec0eb c0120002 00010000 38400009 06726164 697573c0 ebc01200
+ 02000100 00384000 0d0a7465 6c656361 73746572 c0ebc114 00010001 00003840
+ 00043e31 cc92c114 001c0001 00003840 00102001 04701f09 1b980000 00000000
+ 0002c0e3 00010001 00003840 00043e31 cc96c0e3 001c0001 00003840 00102001
+ 04701f09 1b980000 00000000 0006c0fc 00010001 00003840 0004d40d c646c0fc
+ 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0006c129 00010001
+ 00003840 0004d40d c647c129 001c0001 00003840 00102001 0ba80000 01d90000
+ 00000000 0007.
+ +0.000144
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31868580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b000001 0001c00c 00010001 00003840 0004c633 6411c011
+ 00020001 00003840 000c0672 61646975 73026e73 c011c011 00020001 00003840
+ 000d0a74 656c6563 61737465 72c051c0 11000200 01000038 40000c09 70726563
+ 6973696f 6ec051c0 11000200 01000038 40000a07 76616d70 697265c0 51c04a00
+ 01000100 00384000 043e31cc 92c04a00 1c000100 00384000 10200104 701f091b
+ 98000000 00000000 02c09300 01000100 00384000 043e31cc 96c09300 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 06c07b00 01000100 00384000
+ 04d40dc6 46c07b00 1c000100 00384000 1020010b a8000001 d9000000 00000000
+ 06c06200 01000100 00384000 04d40dc6 47c06200 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 07.
+ +0.000128
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31878580 00010001 00040008 04616464 7206646e 73657272 09646973 746f7274
+ 6564036f 72670275 6b00001c 0001c00c 001c0001 00003840 00102001 0db80000
+ 00000000 00000000 0002c011 00020001 00003840 00100a74 656c6563 61737465
+ 72026e73 c011c011 00020001 00003840 00090672 61646975 73c061c0 11000200
+ 01000038 40000a07 76616d70 697265c0 61c01100 02000100 00384000 0c097072
+ 65636973 696f6ec0 61c07200 01000100 00384000 043e31cc 92c07200 1c000100
+ 00384000 10200104 701f091b 98000000 00000000 02c08700 01000100 00384000
+ 043e31cc 96c08700 1c000100 00384000 10200104 701f091b 98000000 00000000
+ 06c09d00 01000100 00384000 04d40dc6 46c09d00 1c000100 00384000 1020010b
+ a8000001 d9000000 00000000 06c05600 01000100 00384000 04d40dc6 47c05600
+ 1c000100 00384000 1020010b a8000001 d9000000 00000000 07.
+ +0.000110
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000024
+ close fd=6
+ close=OK
+ +0.000143
diff --git a/regress/case-adh-cancel.err b/regress/case-adh-cancel.err
new file mode 100644
index 0000000..93afa6c
--- /dev/null
+++ b/regress/case-adh-cancel.err
@@ -0,0 +1,2 @@
+adns debug: using nameserver 172.18.45.6
+adns debug: reply not found, id 3120, query owner chiark.greenend.org.uk (NS=172.18.45.6)
diff --git a/regress/case-adh-cancel.out b/regress/case-adh-cancel.out
new file mode 100644
index 0000000..043c851
--- /dev/null
+++ b/regress/case-adh-cancel.out
@@ -0,0 +1,2 @@
+davenant.relativity.greenend.org.uk A INET 172.18.45.6
+rc=0
diff --git a/regress/case-adh-cancel.sys b/regress/case-adh-cancel.sys
new file mode 100644
index 0000000..a7889c9
--- /dev/null
+++ b/regress/case-adh-cancel.sys
@@ -0,0 +1,73 @@
+./adnshost default -f -A4
+
+ start 969124425.922896
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000162
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000058
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000035
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +0.000135
+ read fd=0 buflen=40
+ read=OK
+ 2d2d6173 796e6368 2d696420 34320a63 68696172 6b2e6772 65656e65 6e642e6f
+ 72672e75 6b0a2d2d.
+ +0.000254
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000825
+ read fd=0 buflen=38
+ read=OK
+ 6173796e 63682d69 64203433 0a646176 656e616e 742e7265 6c617469 76697479
+ 2e677265 656e.
+ +0.000184
+ read fd=0 buflen=15
+ read=OK
+ 656e642e 6f72672e 756b0a2d 2d6361.
+ +0.000106
+ sendto fd=6 addr=172.18.45.6:53
+ 31220100 00010000 00000000 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=53
+ +0.000624
+ read fd=0 buflen=36
+ read=OK
+ 6e63656c 2d696420 34320a.
+ +0.000145
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=1.999231
+ select=2 rfds=[0,6] wfds=[] efds=[]
+ +0.000157
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d01.
+ +0.000551
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010001 00020002 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 01000100 01518000
+ 04ac122d 060a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000200 01000151 80000603 6e7330c0 45c04500 02000100 01518000 06036e73
+ 31c045c0 6b000100 01000151 800004ac 122d06c0 7d000100 01000151 800004ac
+ 122d01.
+ +0.000579
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000151
+ read fd=0 buflen=40
+ read=OK
+ .
+ +0.000043
+ close fd=6
+ close=OK
+ +0.000961
diff --git a/regress/case-adh-cancel2.err b/regress/case-adh-cancel2.err
new file mode 100644
index 0000000..2886e3c
--- /dev/null
+++ b/regress/case-adh-cancel2.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.18.45.6
diff --git a/regress/case-adh-cancel2.out b/regress/case-adh-cancel2.out
new file mode 100644
index 0000000..ab3f8d1
--- /dev/null
+++ b/regress/case-adh-cancel2.out
@@ -0,0 +1 @@
+rc=0
diff --git a/regress/case-adh-cancel2.sys b/regress/case-adh-cancel2.sys
new file mode 100644
index 0000000..90f114f
--- /dev/null
+++ b/regress/case-adh-cancel2.sys
@@ -0,0 +1,59 @@
+./adnshost default -f -A4
+
+ start 969124594.885114
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000160
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000057
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000035
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +6.-286734
+ read fd=0 buflen=40
+ read=OK
+ 2d2d6173 796e6368 2d696420 34320a.
+ +0.000727
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +0.000147
+ read fd=0 buflen=40
+ read=OK
+ 63686961 726b2e67 7265656e 656e642e 6f72672e 756b0a.
+ +0.000129
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000802
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=1.999198
+ select=1 rfds=[0,6] wfds=[] efds=[]
+ +0.000135
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d01.
+ +0.000553
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000195
+ read fd=0 buflen=40
+ read=OK
+ 2d2d6361 6e63656c 2d696420 34320a.
+ +0.000688
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +2.-11588
+ read fd=0 buflen=40
+ read=OK
+ .
+ +0.000089
+ close fd=6
+ close=OK
+ +0.000149
diff --git a/regress/case-adh-cancel3.err b/regress/case-adh-cancel3.err
new file mode 100644
index 0000000..d183cd5
--- /dev/null
+++ b/regress/case-adh-cancel3.err
@@ -0,0 +1,2 @@
+adns debug: using nameserver 172.18.45.6
+adns debug: server failure on unidentifiable query (NS=172.18.45.6)
diff --git a/regress/case-adh-cancel3.out b/regress/case-adh-cancel3.out
new file mode 100644
index 0000000..ab3f8d1
--- /dev/null
+++ b/regress/case-adh-cancel3.out
@@ -0,0 +1 @@
+rc=0
diff --git a/regress/case-adh-cancel3.sys b/regress/case-adh-cancel3.sys
new file mode 100644
index 0000000..3e99426
--- /dev/null
+++ b/regress/case-adh-cancel3.sys
@@ -0,0 +1,90 @@
+./adnshost default -f
+
+ start 969129578.690081
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000809
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000531
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000512
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +17.-461569
+ read fd=0 buflen=40
+ read=OK
+ 2d2d6173 796e6368 2d696420 34320a.
+ +0.000686
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +0.000915
+ read fd=0 buflen=40
+ read=OK
+ 2d692031 37322e33 302e3230 362e3134 0a.
+ +0.000583
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 02313403 32303602 33300331 37320769 6e2d6164
+ 64720461 72706100 000c0001.
+ sendto=44
+ +0.001629
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=1.998371
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000910
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00010001 02313403 32303602 33300331 37320769 6e2d6164
+ 64720461 72706100 000c0001 c00c000c 00010000 003c002a 06323036 2d31340b
+ 62726f6b 656e2d7a 6f6e6504 74657374 0763756c 74757265 05646f74 61740261
+ 74000332 30360233 30033137 3207696e 2d616464 72046172 70610000 02000100
+ 00003c00 20036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00c08500 01000100 01518000 04ac122d 06.
+ +0.001417
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.001988
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000537
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=1.996058
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-05146
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=0.001204
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009951
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.001141
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=1.998859
+ select=1 rfds=[0] wfds=[] efds=[]
+ +0.551215
+ read fd=0 buflen=40
+ read=OK
+ 2d2d6361 6e63656c 2d696420 34320a.
+ +0.000599
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=null
+ select=1 rfds=[6] wfds=[] efds=[]
+ +42.-794672
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208182 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ +0.000986
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.003836
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +6.662470
+ read fd=0 buflen=40
+ read=OK
+ .
+ +0.000545
+ close fd=6
+ close=OK
+ +0.000686
diff --git a/regress/case-adh-norm.err b/regress/case-adh-norm.err
new file mode 100644
index 0000000..2886e3c
--- /dev/null
+++ b/regress/case-adh-norm.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.18.45.6
diff --git a/regress/case-adh-norm.out b/regress/case-adh-norm.out
new file mode 100644
index 0000000..662ff60
--- /dev/null
+++ b/regress/case-adh-norm.out
@@ -0,0 +1,2 @@
+chiark.greenend.org.uk A INET 195.224.76.132
+rc=0
diff --git a/regress/case-adh-norm.sys b/regress/case-adh-norm.sys
new file mode 100644
index 0000000..fa6cd4b
--- /dev/null
+++ b/regress/case-adh-norm.sys
@@ -0,0 +1,34 @@
+./adnshost default -A4
+chiark.greenend.org.uk
+ start 969122933.609498
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000155
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000057
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000037
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000827
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999173
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000158
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d01.
+ +0.000895
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000149
+ close fd=4
+ close=OK
+ +0.000290
diff --git a/regress/case-adh-pipe.err b/regress/case-adh-pipe.err
new file mode 100644
index 0000000..2886e3c
--- /dev/null
+++ b/regress/case-adh-pipe.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.18.45.6
diff --git a/regress/case-adh-pipe.out b/regress/case-adh-pipe.out
new file mode 100644
index 0000000..662ff60
--- /dev/null
+++ b/regress/case-adh-pipe.out
@@ -0,0 +1,2 @@
+chiark.greenend.org.uk A INET 195.224.76.132
+rc=0
diff --git a/regress/case-adh-pipe.sys b/regress/case-adh-pipe.sys
new file mode 100644
index 0000000..6e9ec3c
--- /dev/null
+++ b/regress/case-adh-pipe.sys
@@ -0,0 +1,48 @@
+./adnshost default -f -A4
+
+ start 969123801.904882
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000156
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000057
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000035
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +4.-792858
+ read fd=0 buflen=40
+ read=OK
+ 63686961 726b2e67 7265656e 656e642e 6f72672e 756b0a.
+ +0.000235
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000847
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=1.999153
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000140
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d01.
+ +0.000548
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000184
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +0.715699
+ read fd=0 buflen=40
+ read=OK
+ .
+ +0.000090
+ close fd=6
+ close=OK
+ +0.000134
diff --git a/regress/case-alr-norm.err b/regress/case-alr-norm.err
new file mode 100644
index 0000000..eef3299
--- /dev/null
+++ b/regress/case-alr-norm.err
@@ -0,0 +1,29 @@
+adns debug: using nameserver 172.18.45.6
+adnslogres: submitting 172.18.45.1 -> 1.45.18.172.in-addr.arpa.
+adnslogres: 1 in queue; checking 172.18.45.1
+adnslogres: submitting 127.0.0.1 -> 1.0.0.127.in-addr.arpa.
+adnslogres: 1 in queue; checking 127.0.0.1
+adnslogres: submitting 172.30.206.14 -> 14.206.30.172.in-addr.arpa.
+adnslogres: 1 in queue; checking 172.30.206.14
+adnslogres: submitting 127.0.0.1 -> 1.0.0.127.in-addr.arpa.
+adnslogres: 2 in queue; checking 172.30.206.14
+adnslogres: submitting 172.18.45.3 -> 3.45.18.172.in-addr.arpa.
+adnslogres: 3 in queue; checking 172.30.206.14
+adnslogres: submitting 172.18.45.1 -> 1.45.18.172.in-addr.arpa.
+adnslogres: 4 in queue; checking 172.30.206.14
+adnslogres: submitting 172.18.45.8 -> 8.45.18.172.in-addr.arpa.
+adnslogres: 5 in queue; checking 172.30.206.14
+adnslogres: submitting 172.18.45.1 -> 1.45.18.172.in-addr.arpa.
+adnslogres: 6 in queue; checking 172.30.206.14
+adnslogres: submitting 172.18.45.1 -> 1.45.18.172.in-addr.arpa.
+adnslogres: 7 in queue; checking 172.30.206.14
+adnslogres: submitting 172.18.45.6 -> 6.45.18.172.in-addr.arpa.
+adnslogres: 8 in queue; checking 172.30.206.14
+adnslogres: 8 in queue; checking 172.30.206.14
+adnslogres: 7 in queue; checking 127.0.0.1
+adnslogres: 6 in queue; checking 172.18.45.3
+adnslogres: 5 in queue; checking 172.18.45.1
+adnslogres: 4 in queue; checking 172.18.45.8
+adnslogres: 3 in queue; checking 172.18.45.1
+adnslogres: 2 in queue; checking 172.18.45.1
+adnslogres: 1 in queue; checking 172.18.45.6
diff --git a/regress/case-alr-norm.in b/regress/case-alr-norm.in
new file mode 100644
index 0000000..721f071
--- /dev/null
+++ b/regress/case-alr-norm.in
@@ -0,0 +1,10 @@
+172.18.45.1 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/main/source/Release HTTP/1.0" 304 -
+127.0.0.1 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/contrib/source/Sources.gz HTTP/1.0" 304 -
+172.30.206.14 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/contrib/source/Release HTTP/1.0" 304 -
+127.0.0.1 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/non-free/source/Sources.gz HTTP/1.0" 304 -
+172.18.45.3 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/non-free/source/Release HTTP/1.0" 304 -
+172.18.45.1 - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79-3potato1.dsc HTTP/1.0" 200 604
+172.18.45.8 - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79.orig.tar.gz HTTP/1.0" 200 34886
+172.18.45.1 - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79.orig.tar.gz HTTP/1.0" 200 34886
+172.18.45.1 - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79-3potato1.diff.gz HTTP/1.0" 200 7962
+172.18.45.6 - - [16/Sep/2000:18:35:15 +0100] "GET / HTTP/1.0" 304 -
diff --git a/regress/case-alr-norm.out b/regress/case-alr-norm.out
new file mode 100644
index 0000000..0c5a1d8
--- /dev/null
+++ b/regress/case-alr-norm.out
@@ -0,0 +1,11 @@
+sfere.relativity.greenend.org.uk - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/main/source/Release HTTP/1.0" 304 -
+localhost - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/contrib/source/Sources.gz HTTP/1.0" 304 -
+172.30.206.14 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/contrib/source/Release HTTP/1.0" 304 -
+localhost - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/non-free/source/Sources.gz HTTP/1.0" 304 -
+172.18.45.3 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/non-free/source/Release HTTP/1.0" 304 -
+sfere.relativity.greenend.org.uk - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79-3potato1.dsc HTTP/1.0" 200 604
+kadath.relativity.greenend.org.uk - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79.orig.tar.gz HTTP/1.0" 200 34886
+sfere.relativity.greenend.org.uk - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79.orig.tar.gz HTTP/1.0" 200 34886
+sfere.relativity.greenend.org.uk - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79-3potato1.diff.gz HTTP/1.0" 200 7962
+davenant.relativity.greenend.org.uk - - [16/Sep/2000:18:35:15 +0100] "GET / HTTP/1.0" 304 -
+rc=0
diff --git a/regress/case-alr-norm.sys b/regress/case-alr-norm.sys
new file mode 100644
index 0000000..ca076c1
--- /dev/null
+++ b/regress/case-alr-norm.sys
@@ -0,0 +1,475 @@
+./adnslogres default
+
+ start 969140608.116717
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000127
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000061
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000037
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.001715
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00020002 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00220573 66657265 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 02343502 31380331
+ 37320769 6e2d6164 64720461 72706100 00020001 00015180 0006036e 7330c03c
+ c0580002 00010001 51800006 036e7331 c03cc07a 00010001 00015180 0004ac12
+ 2d06c08c 00010001 00015180 0004ac12 2d01.
+ +0.000718
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=50
+ +0.000790
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010001 00020002 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001c00c 00010001 00015180 0004ac12
+ 2d010a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000002
+ 00010001 51800006 036e7330 c042c042 00020001 00015180 0006036e 7331c042
+ c0680001 00010001 51800004 ac122d06 c07a0001 00010001 51800004 ac122d01.
+ +0.000564
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000109
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000093
+ sendto fd=6 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01310130 01300331 32370769 6e2d6164 64720461
+ 72706100 000c0001.
+ sendto=40
+ +0.000753
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010001 00010001 01310130 01300331 32370769 6e2d6164 64720461
+ 72706100 000c0001 c00c000c 00010009 3a80000b 096c6f63 616c686f 73740003
+ 31323707 696e2d61 64647204 61727061 00000200 0100093a 800002c0 34c03400
+ 01000100 093a8000 047f0000 01.
+ +0.000417
+ sendto fd=6 addr=172.18.45.6:53
+ 31220100 00010000 00000000 096c6f63 616c686f 73740000 010001.
+ sendto=27
+ +0.000530
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010001 00010001 096c6f63 616c686f 73740000 010001c0 0c000100
+ 0100093a 8000047f 000001c0 0c000200 0100093a 800002c0 0cc00c00 01000100
+ 093a8000 047f0000 01.
+ +0.000306
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000089
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000088
+ sendto fd=6 addr=172.18.45.6:53
+ 31230100 00010000 00000000 02313403 32303602 33300331 37320769 6e2d6164
+ 64720461 72706100 000c0001.
+ sendto=44
+ +0.000689
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010001 00010001 02313403 32303602 33300331 37320769 6e2d6164
+ 64720461 72706100 000c0001 c00c000c 00010000 003c002a 06323036 2d31340b
+ 62726f6b 656e2d7a 6f6e6504 74657374 0763756c 74757265 05646f74 61740261
+ 74000332 30360233 30033137 3207696e 2d616464 72046172 70610000 02000100
+ 00003c00 20036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00c08500 01000100 01518000 04ac122d 06.
+ +0.000622
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.001722
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000087
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000205
+ sendto fd=6 addr=172.18.45.6:53
+ 31250100 00010000 00000000 01310130 01300331 32370769 6e2d6164 64720461
+ 72706100 000c0001.
+ sendto=40
+ +0.000699
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258580 00010001 00010001 01310130 01300331 32370769 6e2d6164 64720461
+ 72706100 000c0001 c00c000c 00010009 3a80000b 096c6f63 616c686f 73740003
+ 31323707 696e2d61 64647204 61727061 00000200 0100093a 800002c0 34c03400
+ 01000100 093a8000 047f0000 01.
+ +0.000420
+ sendto fd=6 addr=172.18.45.6:53
+ 31260100 00010000 00000000 096c6f63 616c686f 73740000 010001.
+ sendto=27
+ +0.000532
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268580 00010001 00010001 096c6f63 616c686f 73740000 010001c0 0c000100
+ 0100093a 8000047f 000001c0 0c000200 0100093a 800002c0 0cc00c00 01000100
+ 093a8000 047f0000 01.
+ +0.000307
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000094
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000187
+ sendto fd=6 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01330234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000634
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278583 00010000 00010000 01330234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 00010234 35023138 03313732 07696e2d 61646472 04617270
+ 61000006 00010001 51800041 036e7330 0a72656c 61746976 69747908 67726565
+ 6e656e64 036f7267 02756b00 0a686f73 746d6173 746572c0 50000000 2800001c
+ 2000000e 1000093a 80000151 80.
+ +0.000506
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000099
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000184
+ sendto fd=6 addr=172.18.45.6:53
+ 31280100 00010000 00000000 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000711
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31288580 00010001 00020002 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00220573 66657265 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 02343502 31380331
+ 37320769 6e2d6164 64720461 72706100 00020001 00015180 0006036e 7330c03c
+ c0580002 00010001 51800006 036e7331 c03cc07a 00010001 00015180 0004ac12
+ 2d06c08c 00010001 00015180 0004ac12 2d01.
+ +0.000624
+ sendto fd=6 addr=172.18.45.6:53
+ 31290100 00010000 00000000 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=50
+ +0.000748
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298580 00010001 00020002 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001c00c 00010001 00015180 0004ac12
+ 2d010a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000002
+ 00010001 51800006 036e7330 c042c042 00020001 00015180 0006036e 7331c042
+ c0680001 00010001 51800004 ac122d06 c07a0001 00010001 51800004 ac122d01.
+ +0.000564
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000106
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000192
+ sendto fd=6 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 01380234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.001229
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8580 00010001 00020002 01380234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 0023066b 61646174 680a7265
+ 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00023435 02313803
+ 31373207 696e2d61 64647204 61727061 00000200 01000151 80000603 6e7330c0
+ 3dc05900 02000100 01518000 06036e73 31c03dc0 7b000100 01000151 800004ac
+ 122d06c0 8d000100 01000151 800004ac 122d01.
+ +0.000628
+ sendto fd=6 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 066b6164 6174680a 72656c61 74697669 74790867
+ 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=51
+ +0.000678
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8580 00010001 00020002 066b6164 6174680a 72656c61 74697669 74790867
+ 7265656e 656e6403 6f726702 756b0000 010001c0 0c000100 01000151 800004ac
+ 122d080a 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000
+ 02000100 01518000 06036e73 30c043c0 43000200 01000151 80000603 6e7331c0
+ 43c06900 01000100 01518000 04ac122d 06c07b00 01000100 01518000 04ac122d
+ 01.
+ +0.000565
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000127
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000202
+ sendto fd=6 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.001807
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8580 00010001 00020002 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00220573 66657265 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 02343502 31380331
+ 37320769 6e2d6164 64720461 72706100 00020001 00015180 0006036e 7330c03c
+ c0580002 00010001 51800006 036e7331 c03cc07a 00010001 00015180 0004ac12
+ 2d06c08c 00010001 00015180 0004ac12 2d01.
+ +0.000626
+ sendto fd=6 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=50
+ +0.000658
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8580 00010001 00020002 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001c00c 00010001 00015180 0004ac12
+ 2d010a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000002
+ 00010001 51800006 036e7330 c042c042 00020001 00015180 0006036e 7331c042
+ c0680001 00010001 51800004 ac122d06 c07a0001 00010001 51800004 ac122d01.
+ +0.000577
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000107
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000197
+ sendto fd=6 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000710
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8580 00010001 00020002 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00220573 66657265 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 02343502 31380331
+ 37320769 6e2d6164 64720461 72706100 00020001 00015180 0006036e 7330c03c
+ c0580002 00010001 51800006 036e7331 c03cc07a 00010001 00015180 0004ac12
+ 2d06c08c 00010001 00015180 0004ac12 2d01.
+ +0.000620
+ sendto fd=6 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=50
+ +0.000670
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8580 00010001 00020002 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001c00c 00010001 00015180 0004ac12
+ 2d010a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000002
+ 00010001 51800006 036e7330 c042c042 00020001 00015180 0006036e 7331c042
+ c0680001 00010001 51800004 ac122d06 c07a0001 00010001 51800004 ac122d01.
+ +0.000559
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000103
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000233
+ sendto fd=6 addr=172.18.45.6:53
+ 31300100 00010000 00000000 01360234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000750
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31308580 00010001 00020002 01360234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00250864 6176656e 616e740a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0002 34350231
+ 38033137 3207696e 2d616464 72046172 70610000 02000100 01518000 06036e73
+ 30c03fc0 5b000200 01000151 80000603 6e7331c0 3fc07d00 01000100 01518000
+ 04ac122d 06c08f00 01000100 01518000 04ac122d 01.
+ +0.000629
+ sendto fd=6 addr=172.18.45.6:53
+ 31310100 00010000 00000000 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=53
+ +0.000663
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31318580 00010001 00020002 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 01000100 01518000
+ 04ac122d 060a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000200 01000151 80000603 6e7330c0 45c04500 02000100 01518000 06036e73
+ 31c045c0 6b000100 01000151 800004ac 122d06c0 7d000100 01000151 800004ac
+ 122d01.
+ +0.000568
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000135
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000191
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.977525
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-23059
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000584
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010000
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000486
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999514
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00572
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000086
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009958
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000479
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999521
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00545
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000066
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009996
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000496
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999504
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00576
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000080
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009954
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000461
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999539
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00527
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000066
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009999
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000493
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999507
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00574
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000081
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009952
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000509
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999491
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00575
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000066
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009998
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000559
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999441
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00607
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000048
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009927
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000496
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999504
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00576
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000080
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010004
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000483
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999517
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00587
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000104
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010011
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000494
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999506
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00549
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000055
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009922
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000477
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999523
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00552
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000075
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010061
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000476
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999524
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00617
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000141
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009958
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000464
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999536
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00542
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000078
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010010
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000440
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999560
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00527
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000087
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009959
+ close fd=6
+ close=OK
+ +0.002651
diff --git a/regress/case-alr-slow.err b/regress/case-alr-slow.err
new file mode 100644
index 0000000..03cdbbb
--- /dev/null
+++ b/regress/case-alr-slow.err
@@ -0,0 +1,27 @@
+adns debug: using nameserver 172.18.45.6
+adnslogres: submitting 172.18.45.1 -> 1.45.18.172.in-addr.arpa.
+adnslogres: 1 in queue; checking 172.18.45.1
+adnslogres: submitting 127.0.0.1 -> 1.0.0.127.in-addr.arpa.
+adnslogres: 1 in queue; checking 127.0.0.1
+adnslogres: submitting 172.30.206.14 -> 14.206.30.172.in-addr.arpa.
+adnslogres: 1 in queue; checking 172.30.206.14
+adnslogres: submitting 127.0.0.1 -> 1.0.0.127.in-addr.arpa.
+adnslogres: 2 in queue; checking 172.30.206.14
+adnslogres: submitting 172.18.45.3 -> 3.45.18.172.in-addr.arpa.
+adnslogres: 3 in queue; checking 172.30.206.14
+adnslogres: submitting 172.18.45.1 -> 1.45.18.172.in-addr.arpa.
+adnslogres: 4 in queue; checking 172.30.206.14
+adnslogres: 3 in queue; checking 127.0.0.1
+adnslogres: 2 in queue; checking 172.18.45.3
+adnslogres: 1 in queue; checking 172.18.45.1
+adnslogres: submitting 172.18.45.8 -> 8.45.18.172.in-addr.arpa.
+adnslogres: 1 in queue; checking 172.18.45.8
+adnslogres: submitting 172.18.45.1 -> 1.45.18.172.in-addr.arpa.
+adnslogres: 2 in queue; checking 172.18.45.8
+adnslogres: submitting 172.18.45.1 -> 1.45.18.172.in-addr.arpa.
+adnslogres: 3 in queue; checking 172.18.45.8
+adnslogres: submitting 172.18.45.6 -> 6.45.18.172.in-addr.arpa.
+adnslogres: 4 in queue; checking 172.18.45.8
+adnslogres: 3 in queue; checking 172.18.45.1
+adnslogres: 2 in queue; checking 172.18.45.1
+adnslogres: 1 in queue; checking 172.18.45.6
diff --git a/regress/case-alr-slow.in b/regress/case-alr-slow.in
new file mode 100644
index 0000000..721f071
--- /dev/null
+++ b/regress/case-alr-slow.in
@@ -0,0 +1,10 @@
+172.18.45.1 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/main/source/Release HTTP/1.0" 304 -
+127.0.0.1 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/contrib/source/Sources.gz HTTP/1.0" 304 -
+172.30.206.14 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/contrib/source/Release HTTP/1.0" 304 -
+127.0.0.1 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/non-free/source/Sources.gz HTTP/1.0" 304 -
+172.18.45.3 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/non-free/source/Release HTTP/1.0" 304 -
+172.18.45.1 - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79-3potato1.dsc HTTP/1.0" 200 604
+172.18.45.8 - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79.orig.tar.gz HTTP/1.0" 200 34886
+172.18.45.1 - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79.orig.tar.gz HTTP/1.0" 200 34886
+172.18.45.1 - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79-3potato1.diff.gz HTTP/1.0" 200 7962
+172.18.45.6 - - [16/Sep/2000:18:35:15 +0100] "GET / HTTP/1.0" 304 -
diff --git a/regress/case-alr-slow.out b/regress/case-alr-slow.out
new file mode 100644
index 0000000..0c5a1d8
--- /dev/null
+++ b/regress/case-alr-slow.out
@@ -0,0 +1,11 @@
+sfere.relativity.greenend.org.uk - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/main/source/Release HTTP/1.0" 304 -
+localhost - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/contrib/source/Sources.gz HTTP/1.0" 304 -
+172.30.206.14 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/contrib/source/Release HTTP/1.0" 304 -
+localhost - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/non-free/source/Sources.gz HTTP/1.0" 304 -
+172.18.45.3 - - [13/Sep/2000:23:00:26 +0100] "GET /mirror/debian-non-us/dists/stable/non-US/non-free/source/Release HTTP/1.0" 304 -
+sfere.relativity.greenend.org.uk - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79-3potato1.dsc HTTP/1.0" 200 604
+kadath.relativity.greenend.org.uk - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79.orig.tar.gz HTTP/1.0" 200 34886
+sfere.relativity.greenend.org.uk - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79.orig.tar.gz HTTP/1.0" 200 34886
+sfere.relativity.greenend.org.uk - - [13/Sep/2000:23:01:01 +0100] "GET /mirror/debian-ftp/dists/potato/main/source/devel/cvsweb_1.79-3potato1.diff.gz HTTP/1.0" 200 7962
+davenant.relativity.greenend.org.uk - - [16/Sep/2000:18:35:15 +0100] "GET / HTTP/1.0" 304 -
+rc=0
diff --git a/regress/case-alr-slow.sys b/regress/case-alr-slow.sys
new file mode 100644
index 0000000..ba5d4c3
--- /dev/null
+++ b/regress/case-alr-slow.sys
@@ -0,0 +1,490 @@
+./adnslogres default
+-c4
+ start 969140728.042464
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000132
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000055
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000036
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.001699
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00020002 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00220573 66657265 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 02343502 31380331
+ 37320769 6e2d6164 64720461 72706100 00020001 00015180 0006036e 7330c03c
+ c0580002 00010001 51800006 036e7331 c03cc07a 00010001 00015180 0004ac12
+ 2d06c08c 00010001 00015180 0004ac12 2d01.
+ +0.000712
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=50
+ +0.000793
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010001 00020002 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001c00c 00010001 00015180 0004ac12
+ 2d010a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000002
+ 00010001 51800006 036e7330 c042c042 00020001 00015180 0006036e 7331c042
+ c0680001 00010001 51800004 ac122d06 c07a0001 00010001 51800004 ac122d01.
+ +0.000563
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000114
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000088
+ sendto fd=6 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01310130 01300331 32370769 6e2d6164 64720461
+ 72706100 000c0001.
+ sendto=40
+ +0.000861
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010001 00010001 01310130 01300331 32370769 6e2d6164 64720461
+ 72706100 000c0001 c00c000c 00010009 3a80000b 096c6f63 616c686f 73740003
+ 31323707 696e2d61 64647204 61727061 00000200 0100093a 800002c0 34c03400
+ 01000100 093a8000 047f0000 01.
+ +0.000418
+ sendto fd=6 addr=172.18.45.6:53
+ 31220100 00010000 00000000 096c6f63 616c686f 73740000 010001.
+ sendto=27
+ +0.000544
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010001 00010001 096c6f63 616c686f 73740000 010001c0 0c000100
+ 0100093a 8000047f 000001c0 0c000200 0100093a 800002c0 0cc00c00 01000100
+ 093a8000 047f0000 01.
+ +0.000304
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000093
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000085
+ sendto fd=6 addr=172.18.45.6:53
+ 31230100 00010000 00000000 02313403 32303602 33300331 37320769 6e2d6164
+ 64720461 72706100 000c0001.
+ sendto=44
+ +0.000662
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010001 00010001 02313403 32303602 33300331 37320769 6e2d6164
+ 64720461 72706100 000c0001 c00c000c 00010000 003c002a 06323036 2d31340b
+ 62726f6b 656e2d7a 6f6e6504 74657374 0763756c 74757265 05646f74 61740261
+ 74000332 30360233 30033137 3207696e 2d616464 72046172 70610000 02000100
+ 00003c00 20036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00c08500 01000100 01518000 04ac122d 06.
+ +0.000619
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000988
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000073
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000105
+ sendto fd=6 addr=172.18.45.6:53
+ 31250100 00010000 00000000 01310130 01300331 32370769 6e2d6164 64720461
+ 72706100 000c0001.
+ sendto=40
+ +0.001370
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258580 00010001 00010001 01310130 01300331 32370769 6e2d6164 64720461
+ 72706100 000c0001 c00c000c 00010009 3a80000b 096c6f63 616c686f 73740003
+ 31323707 696e2d61 64647204 61727061 00000200 0100093a 800002c0 34c03400
+ 01000100 093a8000 047f0000 01.
+ +0.000427
+ sendto fd=6 addr=172.18.45.6:53
+ 31260100 00010000 00000000 096c6f63 616c686f 73740000 010001.
+ sendto=27
+ +0.000576
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268580 00010001 00010001 096c6f63 616c686f 73740000 010001c0 0c000100
+ 0100093a 8000047f 000001c0 0c000200 0100093a 800002c0 0cc00c00 01000100
+ 093a8000 047f0000 01.
+ +0.000307
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000094
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000085
+ sendto fd=6 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01330234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000604
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278583 00010000 00010000 01330234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 00010234 35023138 03313732 07696e2d 61646472 04617270
+ 61000006 00010001 51800041 036e7330 0a72656c 61746976 69747908 67726565
+ 6e656e64 036f7267 02756b00 0a686f73 746d6173 746572c0 50000000 2800001c
+ 2000000e 1000093a 80000151 80.
+ +0.000502
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000088
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000077
+ sendto fd=6 addr=172.18.45.6:53
+ 31280100 00010000 00000000 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000682
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31288580 00010001 00020002 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00220573 66657265 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 02343502 31380331
+ 37320769 6e2d6164 64720461 72706100 00020001 00015180 0006036e 7330c03c
+ c0580002 00010001 51800006 036e7331 c03cc07a 00010001 00015180 0004ac12
+ 2d06c08c 00010001 00015180 0004ac12 2d01.
+ +0.000618
+ sendto fd=6 addr=172.18.45.6:53
+ 31290100 00010000 00000000 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=50
+ +0.000791
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298580 00010001 00020002 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001c00c 00010001 00015180 0004ac12
+ 2d010a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000002
+ 00010001 51800006 036e7330 c042c042 00020001 00015180 0006036e 7331c042
+ c0680001 00010001 51800004 ac122d06 c07a0001 00010001 51800004 ac122d01.
+ +0.000561
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000108
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.991325
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00943
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000465
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999535
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00565
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000100
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010007
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000452
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999548
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00527
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000075
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009951
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000482
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999518
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00551
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000069
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009997
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000470
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999530
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00493
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000023
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009900
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000440
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999560
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00521
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000081
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010009
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000453
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999547
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00538
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000085
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009962
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000465
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999535
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00544
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000079
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010006
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000434
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999566
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00522
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000088
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009963
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000449
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999551
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00525
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000076
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010006
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000443
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999557
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00530
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000087
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009961
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000461
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999539
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00539
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000078
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010006
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000485
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999515
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00404
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000584
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999416
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.019228
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06323036 2d31340b 62726f6b 656e2d7a 6f6e6504
+ 74657374 0763756c 74757265 05646f74 61740261 74000001 0001.
+ sendto=58
+ +0.000586
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999414
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00751
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000165
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009979
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000185
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000085
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000118
+ sendto fd=6 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 01380234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000517
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000061
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000075
+ sendto fd=6 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000277
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000056
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000071
+ sendto fd=6 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000277
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000057
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000244
+ sendto fd=6 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 01360234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000290
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000058
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.998017
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.001322
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8580 00010001 00020002 01380234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 0023066b 61646174 680a7265
+ 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00023435 02313803
+ 31373207 696e2d61 64647204 61727061 00000200 01000151 80000603 6e7330c0
+ 3dc05900 02000100 01518000 06036e73 31c03dc0 7b000100 01000151 800004ac
+ 122d06c0 8d000100 01000151 800004ac 122d01.
+ +0.000775
+ sendto fd=6 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 066b6164 6174680a 72656c61 74697669 74790867
+ 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=51
+ +0.000366
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8580 00010001 00020002 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00220573 66657265 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 02343502 31380331
+ 37320769 6e2d6164 64720461 72706100 00020001 00015180 0006036e 7330c03c
+ c0580002 00010001 51800006 036e7331 c03cc07a 00010001 00015180 0004ac12
+ 2d06c08c 00010001 00015180 0004ac12 2d01.
+ +0.000770
+ sendto fd=6 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=50
+ +0.000328
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8580 00010001 00020002 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00220573 66657265 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 02343502 31380331
+ 37320769 6e2d6164 64720461 72706100 00020001 00015180 0006036e 7330c03c
+ c0580002 00010001 51800006 036e7331 c03cc07a 00010001 00015180 0004ac12
+ 2d06c08c 00010001 00015180 0004ac12 2d01.
+ +0.000766
+ sendto fd=6 addr=172.18.45.6:53
+ 31300100 00010000 00000000 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=50
+ +0.000326
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8580 00010001 00020002 01360234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00250864 6176656e 616e740a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0002 34350231
+ 38033137 3207696e 2d616464 72046172 70610000 02000100 01518000 06036e73
+ 30c03fc0 5b000200 01000151 80000603 6e7331c0 3fc07d00 01000100 01518000
+ 04ac122d 06c08f00 01000100 01518000 04ac122d 01.
+ +0.000605
+ sendto fd=6 addr=172.18.45.6:53
+ 31310100 00010000 00000000 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=53
+ +0.000473
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000073
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.995518
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.001210
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8580 00010001 00020002 066b6164 6174680a 72656c61 74697669 74790867
+ 7265656e 656e6403 6f726702 756b0000 010001c0 0c000100 01000151 800004ac
+ 122d080a 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000
+ 02000100 01518000 06036e73 30c043c0 43000200 01000151 80000603 6e7331c0
+ 43c06900 01000100 01518000 04ac122d 06c07b00 01000100 01518000 04ac122d
+ 01.
+ +0.000754
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8580 00010001 00020002 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001c00c 00010001 00015180 0004ac12
+ 2d010a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000002
+ 00010001 51800006 036e7330 c042c042 00020001 00015180 0006036e 7331c042
+ c0680001 00010001 51800004 ac122d06 c07a0001 00010001 51800004 ac122d01.
+ +0.000613
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31308580 00010001 00020002 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001c00c 00010001 00015180 0004ac12
+ 2d010a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000002
+ 00010001 51800006 036e7330 c042c042 00020001 00015180 0006036e 7331c042
+ c0680001 00010001 51800004 ac122d06 c07a0001 00010001 51800004 ac122d01.
+ +0.000633
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31318580 00010001 00020002 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 01000100 01518000
+ 04ac122d 060a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000200 01000151 80000603 6e7330c0 45c04500 02000100 01518000 06036e73
+ 31c045c0 6b000100 01000151 800004ac 122d06c0 7d000100 01000151 800004ac
+ 122d01.
+ +0.000596
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000128
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000108
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000082
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000080
+ close fd=6
+ close=OK
+ +0.000176
diff --git a/regress/case-arf-norm.err b/regress/case-arf-norm.err
new file mode 100644
index 0000000..4a69d6c
--- /dev/null
+++ b/regress/case-arf-norm.err
@@ -0,0 +1,2 @@
+adns debug: using nameserver 172.18.45.6
+adns test harness: memory leaked: 11 24 31 43 48 60 65 77
diff --git a/regress/case-arf-norm.out b/regress/case-arf-norm.out
new file mode 100644
index 0000000..ab3f8d1
--- /dev/null
+++ b/regress/case-arf-norm.out
@@ -0,0 +1 @@
+rc=0
diff --git a/regress/case-arf-norm.sys b/regress/case-arf-norm.sys
new file mode 100644
index 0000000..a9beaf3
--- /dev/null
+++ b/regress/case-arf-norm.sys
@@ -0,0 +1,324 @@
+./adnsresfilter default
+
+ start 969138236.380176
+ fcntl fd=0 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000136
+ fcntl fd=0 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000047
+ fcntl fd=1 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000034
+ fcntl fd=1 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000034
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.004723
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000048
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000041
+ select max=2 rfds=[0] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +3.476363
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000178
+ read fd=0 buflen=512
+ read=OK
+ 736f6d65 206f7264 696e6172 79207465 78740a.
+ +0.000149
+ write fd=1
+ 736f6d65 206f7264 696e6172 79207465 78740a.
+ write=19
+ +0.000594
+ select max=2 rfds=[0] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +1.-12312
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000119
+ read fd=0 buflen=512
+ read=OK
+ 616e2069 70206164 64726573 73206174 20656f6c 20313732 2e31382e 34352e36
+ 0a.
+ +0.000185
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01360234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000902
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00020002 01360234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00250864 6176656e 616e740a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0002 34350231
+ 38033137 3207696e 2d616464 72046172 70610000 02000100 01518000 06036e73
+ 30c03fc0 5b000200 01000151 80000603 6e7331c0 3fc07d00 01000100 01518000
+ 04ac122d 06c08f00 01000100 01518000 04ac122d 01.
+ +0.000707
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=53
+ +0.000758
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010001 00020002 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 01000100 01518000
+ 04ac122d 060a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000200 01000151 80000603 6e7330c0 45c04500 02000100 01518000 06036e73
+ 31c045c0 6b000100 01000151 800004ac 122d06c0 7d000100 01000151 800004ac
+ 122d01.
+ +0.000572
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000146
+ write fd=1
+ 616e2069 70206164 64726573 73206174 20656f6c 20.
+ write=21
+ +0.000426
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=0.996185
+ select=0 rfds=[] wfds=[] efds=[]
+ +1.-05562
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000093
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000061
+ write fd=1
+ 64617665 6e616e74 2e72656c 61746976 6974792e 67726565 6e656e64 2e6f7267
+ 2e756b.
+ write=35
+ +0.000473
+ write fd=1
+ 0a.
+ write=1
+ +0.000500
+ select max=2 rfds=[0] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +1.-31596
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000127
+ read fd=0 buflen=512
+ read=OK
+ 616e2069 70206164 64726573 73203132 372e302e 302e3120 696e206d 6964646c
+ 650a.
+ +0.000190
+ sendto fd=6 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01310130 01300331 32370769 6e2d6164 64720461
+ 72706100 000c0001.
+ sendto=40
+ +0.000787
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010001 00010001 01310130 01300331 32370769 6e2d6164 64720461
+ 72706100 000c0001 c00c000c 00010009 3a80000b 096c6f63 616c686f 73740003
+ 31323707 696e2d61 64647204 61727061 00000200 0100093a 800002c0 34c03400
+ 01000100 093a8000 047f0000 01.
+ +0.000417
+ sendto fd=6 addr=172.18.45.6:53
+ 31220100 00010000 00000000 096c6f63 616c686f 73740000 010001.
+ sendto=27
+ +0.000523
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010001 00010001 096c6f63 616c686f 73740000 010001c0 0c000100
+ 0100093a 8000047f 000001c0 0c000200 0100093a 800002c0 0cc00c00 01000100
+ 093a8000 047f0000 01.
+ +0.000310
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000120
+ write fd=1
+ 616e2069 70206164 64726573 7320.
+ write=14
+ +0.000394
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=0.997132
+ select=0 rfds=[] wfds=[] efds=[]
+ +1.-02556
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000082
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000054
+ write fd=1
+ 6c6f6361 6c686f73 74.
+ write=9
+ +0.000354
+ write fd=1
+ 20696e20 6d696464 6c650a.
+ write=11
+ +0.000538
+ select max=2 rfds=[0] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +5.-307533
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000115
+ read fd=0 buflen=512
+ read=OK
+ 3137322e 31382e34 352e3120 616e2061 64647265 73732061 74206265 67696e0a.
+ +0.000165
+ sendto fd=6 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001.
+ sendto=42
+ +0.000691
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010001 00020002 01310234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00220573 66657265 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 02343502 31380331
+ 37320769 6e2d6164 64720461 72706100 00020001 00015180 0006036e 7330c03c
+ c0580002 00010001 51800006 036e7331 c03cc07a 00010001 00015180 0004ac12
+ 2d06c08c 00010001 00015180 0004ac12 2d01.
+ +0.000621
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=50
+ +0.000716
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010001 00020002 05736665 72650a72 656c6174 69766974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001c00c 00010001 00015180 0004ac12
+ 2d010a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000002
+ 00010001 51800006 036e7330 c042c042 00020001 00015180 0006036e 7331c042
+ c0680001 00010001 51800004 ac122d06 c07a0001 00010001 51800004 ac122d01.
+ +0.000562
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000137
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=0.996993
+ select=0 rfds=[] wfds=[] efds=[]
+ +1.-06724
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000083
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000055
+ write fd=1
+ 73666572 652e7265 6c617469 76697479 2e677265 656e656e 642e6f72 672e756b.
+ write=32
+ +0.000440
+ write fd=1
+ 20616e20 61646472 65737320 61742062 6567696e 0a.
+ write=21
+ +0.000570
+ select max=2 rfds=[0] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +4.-137179
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000103
+ read fd=0 buflen=512
+ read=OK
+ 3137322e 31382e34 352e34.
+ +0.000101
+ select max=2 rfds=[0] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +4.-28658
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000121
+ read fd=0 buflen=512
+ read=OK
+ 3020736f 6d652073 74756666 0a.
+ +0.000112
+ sendto fd=6 addr=172.18.45.6:53
+ 31250100 00010000 00000000 02343002 34350231 38033137 3207696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000747
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258580 00010001 00020002 02343002 34350231 38033137 3207696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000151 80002306 6e6f7277 61790a72
+ 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000234 35023138
+ 03313732 07696e2d 61646472 04617270 61000002 00010001 51800006 036e7330
+ c03ec05a 00020001 00015180 0006036e 7331c03e c07c0001 00010001 51800004
+ ac122d06 c08e0001 00010001 51800004 ac122d01.
+ +0.000628
+ sendto fd=6 addr=172.18.45.6:53
+ 31260100 00010000 00000000 066e6f72 7761790a 72656c61 74697669 74790867
+ 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=51
+ +0.000678
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268580 00010001 00020002 066e6f72 7761790a 72656c61 74697669 74790867
+ 7265656e 656e6403 6f726702 756b0000 010001c0 0c000100 01000151 800004ac
+ 122d280a 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000
+ 02000100 01518000 06036e73 30c043c0 43000200 01000151 80000603 6e7331c0
+ 43c06900 01000100 01518000 04ac122d 06c07b00 01000100 01518000 04ac122d
+ 01.
+ +0.000566
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000135
+ select max=7 rfds=[0,6] wfds=[] efds=[] to=0.997013
+ select=0 rfds=[] wfds=[] efds=[]
+ +1.-08851
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000087
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000057
+ write fd=1
+ 6e6f7277 61792e72 656c6174 69766974 792e6772 65656e65 6e642e6f 72672e75
+ 6b.
+ write=33
+ +0.000466
+ write fd=1
+ 20736f6d 65207374 7566660a.
+ write=12
+ +0.000545
+ select max=2 rfds=[0] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +2.-184099
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000114
+ read fd=0 buflen=512
+ read=OK
+ 28627261 636b6574 73290a.
+ +0.000107
+ write fd=1
+ 28627261 636b6574 73290a.
+ write=11
+ +0.000495
+ select max=2 rfds=[0] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +0.323183
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000084
+ read fd=0 buflen=512
+ read=OK
+ .
+ +0.000063
+ fcntl fd=0 cmd=F_GETFL
+ fcntl=O_NONBLOCK|...
+ +0.000041
+ fcntl fd=0 cmd=F_SETFL ~O_NONBLOCK&...
+ fcntl=OK
+ +0.000033
+ fcntl fd=1 cmd=F_GETFL
+ fcntl=O_NONBLOCK|...
+ +0.000034
+ fcntl fd=1 cmd=F_SETFL ~O_NONBLOCK&...
+ fcntl=OK
+ +0.000033
+ close fd=6
+ close=OK
+ +0.000090
diff --git a/regress/case-arf-text.err b/regress/case-arf-text.err
new file mode 100644
index 0000000..2886e3c
--- /dev/null
+++ b/regress/case-arf-text.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.18.45.6
diff --git a/regress/case-arf-text.out b/regress/case-arf-text.out
new file mode 100644
index 0000000..ab3f8d1
--- /dev/null
+++ b/regress/case-arf-text.out
@@ -0,0 +1 @@
+rc=0
diff --git a/regress/case-arf-text.sys b/regress/case-arf-text.sys
new file mode 100644
index 0000000..4a2ca57
--- /dev/null
+++ b/regress/case-arf-text.sys
@@ -0,0 +1,63 @@
+./adnsresfilter default
+
+ start 969137967.465922
+ fcntl fd=0 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000132
+ fcntl fd=0 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000049
+ fcntl fd=1 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000034
+ fcntl fd=1 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000033
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.004099
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000057
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000034
+ select max=2 rfds=[0] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +2.095986
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000177
+ read fd=0 buflen=512
+ read=OK
+ 74657874 206f6e6c 790a.
+ +0.000121
+ write fd=1
+ 74657874 206f6e6c 790a.
+ write=10
+ +0.000636
+ select max=2 rfds=[0] wfds=[] efds=[] to=null
+ select=1 rfds=[0] wfds=[] efds=[]
+ +0.349329
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000085
+ read fd=0 buflen=512
+ read=OK
+ .
+ +0.000064
+ fcntl fd=0 cmd=F_GETFL
+ fcntl=O_NONBLOCK|...
+ +0.000043
+ fcntl fd=0 cmd=F_SETFL ~O_NONBLOCK&...
+ fcntl=OK
+ +0.000065
+ fcntl fd=1 cmd=F_GETFL
+ fcntl=O_NONBLOCK|...
+ +0.000036
+ fcntl fd=1 cmd=F_SETFL ~O_NONBLOCK&...
+ fcntl=OK
+ +0.000032
+ close fd=6
+ close=OK
+ +0.000117
diff --git a/regress/case-bogus-sortlist.err b/regress/case-bogus-sortlist.err
new file mode 100644
index 0000000..31d3eab
--- /dev/null
+++ b/regress/case-bogus-sortlist.err
@@ -0,0 +1 @@
+adns failure: init: errno=EINVAL
diff --git a/regress/case-bogus-sortlist.out b/regress/case-bogus-sortlist.out
new file mode 100644
index 0000000..1e01772
--- /dev/null
+++ b/regress/case-bogus-sortlist.out
@@ -0,0 +1,7 @@
+adns debug: using nameserver 172.18.45.6
+adns: <supplied configuration text>:2: prefix length 24 in sortlist overlaps address `198.51.100.1'
+adns: <supplied configuration text>:2: prefix length 10 in sortlist overlaps address `2001:db8:2::'
+adns: <supplied configuration text>:2: network address `255.0.0.0' in sortlist is not in classed ranges, must specify mask explicitly
+adns: <supplied configuration text>:2: mask length `33' invalid
+adns: <supplied configuration text>:2: mask length `129' invalid
+rc=2
diff --git a/regress/case-bogus-sortlist.sys b/regress/case-bogus-sortlist.sys
new file mode 100644
index 0000000..4cb4b26
--- /dev/null
+++ b/regress/case-bogus-sortlist.sys
@@ -0,0 +1,2 @@
+./adnstest bogus-sortlist
+:0x0|1 chiark.greenend.org.uk
diff --git a/regress/case-brokenmail.err b/regress/case-brokenmail.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-brokenmail.err
diff --git a/regress/case-brokenmail.out b/regress/case-brokenmail.out
new file mode 100644
index 0000000..14757ba
--- /dev/null
+++ b/regress/case-brokenmail.out
@@ -0,0 +1,38 @@
+adns debug: using nameserver 172.18.45.6
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 0 type 15 MX(raw) submitted
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 0 type 65551 MX(+addr) submitted
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 256 type 15 MX(raw) submitted
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 256 type 65551 MX(+addr) submitted
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 260 type 15 MX(raw) submitted
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 260 type 65551 MX(+addr) submitted
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 0 type MX(raw): OK; nrrs=4; cname=$; owner=$; ttl=60
+ 10 manyaddrs.test.iwj.relativity.greenend.org.uk
+ 20 host.broken-delg.test.iwj.relativity.greenend.org.uk
+ 30 172.18.45.36
+ 40 cname-ptr.test.iwj.relativity.greenend.org.uk
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 256 type MX(raw): OK; nrrs=4; cname=$; owner=$; ttl=60
+ 10 manyaddrs.test.iwj.relativity.greenend.org.uk
+ 20 host.broken-delg.test.iwj.relativity.greenend.org.uk
+ 30 172.18.45.36
+ 40 cname-ptr.test.iwj.relativity.greenend.org.uk
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 260 type MX(raw): OK; nrrs=4; cname=$; owner=broken-mail.test.iwj.relativity.greenend.org.uk; ttl=60
+ 10 manyaddrs.test.iwj.relativity.greenend.org.uk
+ 20 host.broken-delg.test.iwj.relativity.greenend.org.uk
+ 30 172.18.45.36
+ 40 cname-ptr.test.iwj.relativity.greenend.org.uk
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 0 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=30
+ 10 manyaddrs.test.iwj.relativity.greenend.org.uk ok 0 ok "OK" ( INET 127.0.0.1 INET 172.18.45.6 INET 172.18.45.1 INET 172.18.45.35 )
+ 20 host.broken-delg.test.iwj.relativity.greenend.org.uk remotefail 30 timeout "DNS query timed out" ?
+ 30 172.18.45.36 permfail 300 nxdomain "No such domain" ( )
+ 40 cname-ptr.test.iwj.relativity.greenend.org.uk misconfig 101 prohibitedcname "DNS alias found where canonical name wanted" ( )
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 256 type MX(+addr): OK; nrrs=4; cname=$; owner=$; ttl=30
+ 10 manyaddrs.test.iwj.relativity.greenend.org.uk ok 0 ok "OK" ( INET 127.0.0.1 INET 172.18.45.6 INET 172.18.45.1 INET 172.18.45.35 )
+ 20 host.broken-delg.test.iwj.relativity.greenend.org.uk remotefail 30 timeout "DNS query timed out" ?
+ 30 172.18.45.36 permfail 300 nxdomain "No such domain" ( )
+ 40 cname-ptr.test.iwj.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.37 )
+broken-mail.test.iwj.relativity.greenend.org.uk. flags 260 type MX(+addr): OK; nrrs=4; cname=$; owner=broken-mail.test.iwj.relativity.greenend.org.uk; ttl=30
+ 10 manyaddrs.test.iwj.relativity.greenend.org.uk ok 0 ok "OK" ( INET 127.0.0.1 INET 172.18.45.6 INET 172.18.45.1 INET 172.18.45.35 )
+ 20 host.broken-delg.test.iwj.relativity.greenend.org.uk remotefail 30 timeout "DNS query timed out" ?
+ 30 172.18.45.36 permfail 300 nxdomain "No such domain" ( )
+ 40 cname-ptr.test.iwj.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.37 )
+rc=0
diff --git a/regress/case-brokenmail.sys b/regress/case-brokenmail.sys
new file mode 100644
index 0000000..c9ead48
--- /dev/null
+++ b/regress/case-brokenmail.sys
@@ -0,0 +1,516 @@
+adnstest default -0x400
+:0x0|15,0x1010000|15 broken-mail.test.iwj.relativity.greenend.org.uk. 256/broken-mail.test.iwj.relativity.greenend.org.uk. 0x104/broken-mail.test.iwj.relativity.greenend.org.uk.
+ start 934726868.117908
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000425
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000059
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000043
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=65
+ +0.001836
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=65
+ +0.002502
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=65
+ +0.001986
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=65
+ +0.002269
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=65
+ +0.001950
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01.
+ sendto=65
+ +0.001914
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.987543
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000654
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010004 00010005 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01c00c00 0f000100 00003c00 38001404 686f7374 0b62726f 6b656e2d 64656c67
+ 04746573 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00c00c00 0f000100 00003c00 10001e03 31373202 31380234 35023336
+ 00c00c00 0f000100 00003c00 0e002809 636e616d 652d7074 72c060c0 0c000f00
+ 01000000 3c000e00 0a096d61 6e796164 647273c0 60c06000 02000100 00003c00
+ 06036e73 30c069c0 c9000100 01000000 3c0004ac 122d23c0 c9000100 01000000
+ 3c0004ac 122d06c0 c9000100 01000000 3c0004ac 122d01c0 c9000100 01000000
+ 3c00047f 000001c0 e1000100 01000151 800004ac 122d06.
+ +0.001320
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010004 00010005 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01c00c00 0f000100 00003c00 10001e03 31373202 31380234 35023336 00c00c00
+ 0f000100 00003c00 31002809 636e616d 652d7074 72047465 73740369 776a0a72
+ 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b00c00c 000f0001
+ 0000003c 000e000a 096d616e 79616464 7273c075 c00c000f 00010000 003c0015
+ 00140468 6f73740b 62726f6b 656e2d64 656c67c0 75c07500 02000100 00003c00
+ 06036e73 30c07ec0 a8000100 01000000 3c0004ac 122d23c0 a8000100 01000000
+ 3c0004ac 122d06c0 a8000100 01000000 3c0004ac 122d01c0 a8000100 01000000
+ 3c00047f 000001c0 e1000100 01000151 800004ac 122d06.
+ +0.001688
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03313732 02313802 34350233 36000001 0001.
+ sendto=30
+ +0.000653
+ sendto fd=4 addr=172.18.45.6:53
+ 31280100 00010000 00000000 09636e61 6d652d70 74720474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=63
+ +0.000825
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.001147
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010004 00010005 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01c00c00 0f000100 00003c00 31002809 636e616d 652d7074 72047465 73740369
+ 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b00c00c
+ 000f0001 0000003c 000e000a 096d616e 79616464 7273c059 c00c000f 00010000
+ 003c0015 00140468 6f73740b 62726f6b 656e2d64 656c67c0 59c00c00 0f000100
+ 00003c00 10001e03 31373202 31380234 35023336 00c05900 02000100 00003c00
+ 06036e73 30c062c0 8c000100 01000000 3c0004ac 122d23c0 8c000100 01000000
+ 3c0004ac 122d06c0 8c000100 01000000 3c0004ac 122d01c0 8c000100 01000000
+ 3c00047f 000001c0 e1000100 01000151 800004ac 122d06.
+ +0.001330
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010004 00010005 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01c00c00 0f000100 00003c00 31000a09 6d616e79 61646472 73047465 73740369
+ 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b00c00c
+ 000f0001 0000003c 00150014 04686f73 740b6272 6f6b656e 2d64656c 67c059c0
+ 0c000f00 01000000 3c001000 1e033137 32023138 02343502 333600c0 0c000f00
+ 01000000 3c000e00 2809636e 616d652d 707472c0 59c05900 02000100 00003c00
+ 06036e73 30c062c0 4f000100 01000000 3c0004ac 122d23c0 4f000100 01000000
+ 3c0004ac 122d06c0 4f000100 01000000 3c0004ac 122d01c0 4f000100 01000000
+ 3c00047f 000001c0 e1000100 01000151 800004ac 122d06.
+ +0.001524
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.001003
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03313732 02313802 34350233 36000001 0001.
+ sendto=30
+ +0.000569
+ sendto fd=4 addr=172.18.45.6:53
+ 31300100 00010000 00000000 09636e61 6d652d70 74720474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=63
+ +0.000842
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010004 00010005 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01c00c00 0f000100 00003c00 38001404 686f7374 0b62726f 6b656e2d 64656c67
+ 04746573 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00c00c00 0f000100 00003c00 10001e03 31373202 31380234 35023336
+ 00c00c00 0f000100 00003c00 0e002809 636e616d 652d7074 72c060c0 0c000f00
+ 01000000 3c000e00 0a096d61 6e796164 647273c0 60c06000 02000100 00003c00
+ 06036e73 30c069c0 c9000100 01000000 3c0004ac 122d23c0 c9000100 01000000
+ 3c0004ac 122d06c0 c9000100 01000000 3c0004ac 122d01c0 c9000100 01000000
+ 3c00047f 000001c0 e1000100 01000151 800004ac 122d06.
+ +0.001306
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010004 00010005 0b62726f 6b656e2d 6d61696c 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000f00
+ 01c00c00 0f000100 00003c00 10001e03 31373202 31380234 35023336 00c00c00
+ 0f000100 00003c00 31002809 636e616d 652d7074 72047465 73740369 776a0a72
+ 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b00c00c 000f0001
+ 0000003c 000e000a 096d616e 79616464 7273c075 c00c000f 00010000 003c0015
+ 00140468 6f73740b 62726f6b 656e2d64 656c67c0 75c07500 02000100 00003c00
+ 06036e73 30c07ec0 a8000100 01000000 3c0004ac 122d23c0 a8000100 01000000
+ 3c0004ac 122d06c0 a8000100 01000000 3c0004ac 122d01c0 a8000100 01000000
+ 3c00047f 000001c0 e1000100 01000151 800004ac 122d06.
+ +0.001507
+ sendto fd=4 addr=172.18.45.6:53
+ 31320100 00010000 00000000 03313732 02313802 34350233 36000001 0001.
+ sendto=30
+ +0.000637
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 09636e61 6d652d70 74720474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=63
+ +0.000932
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000931
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268583 00010000 00000000 03313732 02313802 34350233 36000001 0001.
+ +0.000242
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31288580 00010002 00010001 09636e61 6d652d70 74720474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001c0
+ 0c000500 01000000 3c002903 70747204 74657374 0369776a 0a72656c 61746976
+ 69747908 67726565 6e656e64 036f7267 02756b00 c04b0001 00010000 003c0004
+ ac122d25 c04f0002 00010000 003c0006 036e7330 c058c090 00010001 00015180
+ 0004ac12 2d06.
+ +0.000737
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8583 00010000 00000000 03313732 02313802 34350233 36000001 0001.
+ +0.000223
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31308580 00010002 00010001 09636e61 6d652d70 74720474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001c0
+ 0c000500 01000000 3c002903 70747204 74657374 0369776a 0a72656c 61746976
+ 69747908 67726565 6e656e64 036f7267 02756b00 c04b0001 00010000 003c0004
+ ac122d25 c04f0002 00010000 003c0006 036e7330 c058c090 00010001 00015180
+ 0004ac12 2d06.
+ +0.000756
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31328583 00010000 00000000 03313732 02313802 34350233 36000001 0001.
+ +0.000291
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31348580 00010002 00010001 09636e61 6d652d70 74720474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001c0
+ 0c000500 01000000 3c002903 70747204 74657374 0369776a 0a72656c 61746976
+ 69747908 67726565 6e656e64 036f7267 02756b00 c04b0001 00010000 003c0004
+ ac122d25 c04f0002 00010000 003c0006 036e7330 c058c090 00010001 00015180
+ 0004ac12 2d06.
+ +0.000726
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000162
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.980649
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-04341
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000794
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000608
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000695
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997903
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.007910
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000823
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000611
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000571
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997995
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.007991
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000694
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000579
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000571
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998156
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.008157
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000655
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000749
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000606
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997990
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.007995
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000836
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000612
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000631
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997921
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.007925
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000699
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000725
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000606
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997970
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.007965
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000739
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000582
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000570
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998109
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.008104
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000641
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000598
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000716
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998045
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.008043
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000646
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000576
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000594
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998184
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.008190
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000673
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000578
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000572
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998177
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.008168
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000659
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000577
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000571
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998193
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.008199
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000653
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000604
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000573
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998170
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.008181
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000699
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000589
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000758
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997954
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.008126
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000684
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000582
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 04686f73 740b6272 6f6b656e 2d64656c 67047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000578
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998156
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.007969
+ close fd=4
+ close=OK
+ +0.000812
diff --git a/regress/case-child.err b/regress/case-child.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-child.err
diff --git a/regress/case-child.out b/regress/case-child.out
new file mode 100644
index 0000000..6c0b673
--- /dev/null
+++ b/regress/case-child.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.18.45.6
+134.76.224.195.in-addr.arpa flags 0 type 65548 PTR(checked) submitted
+134.76.224.195.in-addr.arpa flags 0 type PTR(checked): OK; nrrs=1; cname=$; owner=$; ttl=78694
+ permutation-city.greenend.org.uk
+rc=0
diff --git a/regress/case-child.sys b/regress/case-child.sys
new file mode 100644
index 0000000..49829c0
--- /dev/null
+++ b/regress/case-child.sys
@@ -0,0 +1,58 @@
+adnstest default
+:0x10000|12 134.76.224.195.in-addr.arpa
+ start 929574747.401802
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000189
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000080
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000058
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03313334 02373603 32323403 31393507 696e2d61
+ 64647204 61727061 00000c00 01.
+ sendto=45
+ +0.000595
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999405
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.008975
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010001 00050005 03313334 02373603 32323403 31393507 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 01336600 22107065 726d7574
+ 6174696f 6e2d6369 74790867 7265656e 656e6403 6f726702 756b0002 37360332
+ 32340331 39350769 6e2d6164 64720461 72706100 00020001 00013366 00110464
+ 6e733006 656c6d61 696c0263 6fc057c0 5b000200 01000133 66000704 646e7331
+ c083c05b 00020001 00013366 00070464 6e7332c0 83c05b00 02000100 01336600
+ 0e036e73 32047861 7261036e 657400c0 5b000200 01000133 66000603 6e7333c0
+ c5c07e00 01000100 00149d00 04c17ae9 11c09b00 01000100 00149d00 04c17ae9
+ 01c0ae00 01000100 00149d00 04c3e04c c1c0c100 01000100 0284e500 04c28fa1
+ 6bc0db00 01000100 0284e500 04c28fa3 19.
+ +0.001671
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 10706572 6d757461 74696f6e 2d636974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=50
+ +0.000683
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000108
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997538
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005811
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010001 00020002 10706572 6d757461 74696f6e 2d636974 79086772
+ 65656e65 6e64036f 72670275 6b000001 0001c00c 00010001 00015180 0004c3e0
+ 4c860867 7265656e 656e6403 6f726702 756b0000 02000100 01518000 11036e73
+ 300a7265 6c617469 76697479 c042c042 00020001 00015180 0006036e 7331c061
+ c05d0001 00010001 51800004 ac122d06 c07a0001 00010001 51800004 ac122d41.
+ +0.000862
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000193
+ close fd=4
+ close=OK
+ +0.000207
diff --git a/regress/case-cnametocname.err b/regress/case-cnametocname.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-cnametocname.err
diff --git a/regress/case-cnametocname.out b/regress/case-cnametocname.out
new file mode 100644
index 0000000..6d60fb2
--- /dev/null
+++ b/regress/case-cnametocname.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.18.45.6
+intel.ugcs.caltech.edu. flags 0 type 1 A(-) submitted
+adns debug: allegedly canonical name ugintel.best.ugcs.caltech.edu is actually alias for drachma.ugcs.caltech.edu (QNAME=intel.ugcs.caltech.edu, QTYPE=A, NS=172.18.45.6)
+intel.ugcs.caltech.edu. flags 0 type A(-): DNS alias found where canonical name wanted; nrrs=0; cname=ugintel.best.ugcs.caltech.edu; owner=$; ttl=497758
+rc=0
diff --git a/regress/case-cnametocname.sys b/regress/case-cnametocname.sys
new file mode 100644
index 0000000..33cbd7d
--- /dev/null
+++ b/regress/case-cnametocname.sys
@@ -0,0 +1,39 @@
+adnstest default
+:0x0|1 intel.ugcs.caltech.edu.
+ start 938369896.279735
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000179
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000054
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000041
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 05696e74 656c0475 67637307 63616c74 65636803
+ 65647500 00010001.
+ sendto=40
+ +0.001628
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998372
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.586476
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010003 00050005 05696e74 656c0475 67637307 63616c74 65636803
+ 65647500 00010001 05696e74 656c0475 67637307 63616c74 65636803 65647500
+ 00050001 0007985e 000f0775 67696e74 656c0462 657374c0 2ec04a00 05000100
+ 00000a00 0a076472 6163686d 61c02ec0 65000100 01000798 83000483 d72bacc0
+ 2e000200 01000935 be000b08 70757263 68617365 c02ec02e 00020001 000935be
+ 00070465 6e7679c0 2ec02e00 02000100 0935be00 09036f66 62036e65 7400c02e
+ 00020001 000935be 00090674 7962616c 74c033c0 2e000200 01000935 be000e08
+ 6d657263 7574696f 026e69c0 33c08b00 01000100 0935be00 0483d72b a7c0a200
+ 01000100 0935be00 0483d72b 87c0b500 01000100 001ef800 04c6b4b6 07c0ca00
+ 01000100 0100d700 0483d78b 64c0df00 01000100 0100d700 0483d7fe 63.
+ +0.001423
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000646
+ close fd=4
+ close=OK
+ +0.000242
diff --git a/regress/case-comprinf.err b/regress/case-comprinf.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-comprinf.err
diff --git a/regress/case-comprinf.out b/regress/case-comprinf.out
new file mode 100644
index 0000000..b7ea5e8
--- /dev/null
+++ b/regress/case-comprinf.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+37.45.18.172.in-addr.arpa. flags 0 type 12 PTR(raw) submitted
+37.45.18.172.in-addr.arpa. flags 0 type PTR(raw): Found overly-long domain name; nrrs=0; cname=37.45.18.172.in-addr.arpa.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+rc=0
diff --git a/regress/case-comprinf.sys b/regress/case-comprinf.sys
new file mode 100644
index 0000000..01411ba
--- /dev/null
+++ b/regress/case-comprinf.sys
@@ -0,0 +1,35 @@
+adnstest default
+:0x0|12 37.45.18.172.in-addr.arpa.
+ start 951961094.184850
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000134
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000053
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000035
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 02333702 34350231 38033137 3207696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000960
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999040
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000200
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010002 00010001 02333702 34350231 38033137 3207696e 2d616464
+ 72046172 70610000 0c0001c0 0c000500 01000151 80003f02 33370234 35023138
+ 03313732 07696e2d 61646472 04617270 61047465 73740369 776a0a72 656c6174
+ 69766974 79086772 65656e65 6e64036f 72670275 6b00c037 000c0001 0000003c
+ 00060370 7472c082 c0510002 00010000 003c0006 036e7330 c05ac094 00010001
+ 00015180 0004ac12 2d06.
+ +0.000624
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000222
+ close fd=4
+ close=OK
+ +0.000197
diff --git a/regress/case-connfail.err b/regress/case-connfail.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-connfail.err
diff --git a/regress/case-connfail.out b/regress/case-connfail.out
new file mode 100644
index 0000000..bc01126
--- /dev/null
+++ b/regress/case-connfail.out
@@ -0,0 +1,9 @@
+adns debug: using nameserver 172.18.45.36
+adns debug: using nameserver 172.18.45.6
+davenant.greenend.org.uk flags 2 type 1adns warning: TCP connection failed: connect: Socket operation on non-socket (NS=172.18.45.36)
+adns warning: TCP connection failed: connect: Socket operation on non-socket (NS=172.18.45.6)
+ A(-) submitted
+adns warning: TCP connection failed: connect: Socket operation on non-socket (NS=172.18.45.36)
+adns warning: TCP connection failed: connect: Socket operation on non-socket (NS=172.18.45.6)
+davenant.greenend.org.uk flags 2 type A(-): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+rc=0
diff --git a/regress/case-connfail.sys b/regress/case-connfail.sys
new file mode 100644
index 0000000..f84f99d
--- /dev/null
+++ b/regress/case-connfail.sys
@@ -0,0 +1,78 @@
+./adnstest 2ndserver
+:0x0|1 2/davenant.greenend.org.uk
+ start 1056289303.784817
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000031
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000010
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000007
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=7
+ +0.000059
+ fcntl fd=7 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000007
+ fcntl fd=7 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000006
+ connect fd=7 addr=172.18.45.36:53
+ connect=ENOTSOCK
+ +0.000013
+ close fd=7
+ close=OK
+ +0.000031
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=7
+ +0.000035
+ fcntl fd=7 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000006
+ fcntl fd=7 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000007
+ connect fd=7 addr=172.18.45.6:53
+ connect=ENOTSOCK
+ +0.000008
+ close fd=7
+ close=OK
+ +0.000013
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000036
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=7
+ +0.000036
+ fcntl fd=7 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000007
+ fcntl fd=7 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000006
+ connect fd=7 addr=172.18.45.36:53
+ connect=ENOTSOCK
+ +0.000008
+ close fd=7
+ close=OK
+ +0.000013
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=7
+ +0.000036
+ fcntl fd=7 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000007
+ fcntl fd=7 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000006
+ connect fd=7 addr=172.18.45.6:53
+ connect=ENOTSOCK
+ +0.000008
+ close fd=7
+ close=OK
+ +0.000012
+ close fd=6
+ close=OK
+ +0.000023
diff --git a/regress/case-datapluscname.err b/regress/case-datapluscname.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-datapluscname.err
diff --git a/regress/case-datapluscname.out b/regress/case-datapluscname.out
new file mode 100644
index 0000000..fa83e09
--- /dev/null
+++ b/regress/case-datapluscname.out
@@ -0,0 +1,39 @@
+adns debug: using nameserver 172.18.45.6
+170.99.219.194.in-addr.arpa flags 292 type 1 A(-) submitted
+170.99.219.194.in-addr.arpa flags 292 type 2 NS(raw) submitted
+170.99.219.194.in-addr.arpa flags 292 type 5 CNAME(-) submitted
+170.99.219.194.in-addr.arpa flags 292 type 6 SOA(raw) submitted
+170.99.219.194.in-addr.arpa flags 292 type 12 PTR(raw) submitted
+170.99.219.194.in-addr.arpa flags 292 type 13 HINFO(-) submitted
+170.99.219.194.in-addr.arpa flags 292 type 15 MX(raw) submitted
+170.99.219.194.in-addr.arpa flags 292 type 16 TXT(-) submitted
+170.99.219.194.in-addr.arpa flags 292 type 17 RP(raw) submitted
+170.99.219.194.in-addr.arpa flags 292 type 65537 A(addr) submitted
+170.99.219.194.in-addr.arpa flags 292 type 65538 NS(+addr) submitted
+170.99.219.194.in-addr.arpa flags 292 type 65548 PTR(checked) submitted
+170.99.219.194.in-addr.arpa flags 292 type 65551 MX(+addr) submitted
+170.99.219.194.in-addr.arpa flags 292 type 131078 SOA(822) submitted
+170.99.219.194.in-addr.arpa flags 292 type 131089 RP(822) submitted
+adns debug: ignoring CNAME (to 170.168.99.219.194.in-addr.arpa) coexisting with RR (QNAME=170.99.219.194.in-addr.arpa, QTYPE=PTR(raw), NS=172.18.45.6)
+adns debug: ignoring RR with an unexpected owner 170.168.99.219.194.in-addr.arpa (QNAME=170.99.219.194.in-addr.arpa, QTYPE=PTR(raw), NS=172.18.45.6)
+adns debug: ignoring CNAME (to 170.168.99.219.194.in-addr.arpa) coexisting with RR (QNAME=170.99.219.194.in-addr.arpa, QTYPE=PTR(checked), NS=172.18.45.6)
+adns debug: ignoring RR with an unexpected owner 170.168.99.219.194.in-addr.arpa (QNAME=170.99.219.194.in-addr.arpa, QTYPE=PTR(checked), NS=172.18.45.6)
+170.99.219.194.in-addr.arpa flags 292 type A(-): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type NS(raw): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type SOA(raw): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type PTR(raw): OK; nrrs=1; cname=$; owner=170.99.219.194.in-addr.arpa; ttl=171727
+ proxy.scoplife.gr
+170.99.219.194.in-addr.arpa flags 292 type HINFO(-): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type MX(raw): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type TXT(-): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type RP(raw): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type NS(+addr): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type MX(+addr): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type SOA(822): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type RP(822): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type A(addr): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type PTR(checked): OK; nrrs=1; cname=$; owner=170.99.219.194.in-addr.arpa; ttl=171727
+ proxy.scoplife.gr
+170.99.219.194.in-addr.arpa flags 292 type CNAME(-): OK; nrrs=1; cname=$; owner=170.99.219.194.in-addr.arpa; ttl=171726
+ 170.168.99.219.194.in-addr.arpa
+rc=0
diff --git a/regress/case-datapluscname.sys b/regress/case-datapluscname.sys
new file mode 100644
index 0000000..fd5d83f
--- /dev/null
+++ b/regress/case-datapluscname.sys
@@ -0,0 +1,233 @@
+adnstest default -0x400
+292/170.99.219.194.in-addr.arpa
+ start 933809668.543946
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000199
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000081
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000063
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.003027
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.002832
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.004403
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.004763
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000c00 01.
+ sendto=45
+ +0.002558
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01.
+ sendto=45
+ +0.004339
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.002664
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01.
+ sendto=45
+ +0.004889
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.002642
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.002552
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.007571
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000c00 01.
+ sendto=45
+ +0.004820
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.004771
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.004879
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.004728
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.938562
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000329
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000688
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.003135
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000762
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238180 00010003 00040004 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 029ecf00 13057072 6f787908
+ 73636f70 6c696665 02677200 c00c0005 00010002 a2ec0021 03313730 03313638
+ 02393903 32313903 31393407 696e2d61 64647204 61727061 00c05800 0c000100
+ 029ecf00 02c039c0 5c000200 0100029e cf001004 696e666f 08666f72 74686e65
+ 74c048c0 5c000200 0100029e cf000805 6e736865 72c098c0 5c000200 0100029e
+ cf000805 6e737468 65c098c0 5c000200 0100029e cf000c09 74656972 65736961
+ 73c098c0 93000100 010004be 3900048b 5b0111c0 af000100 01000542 ba0004c1
+ 5c1e13c0 c3000100 01000542 800004c1 5c6e01c0 d7000100 01000542 800004c2
+ dbe302.
+ +0.001873
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000969
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000699
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000717
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.003514
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000783
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.003279
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8180 00010003 00040004 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 029ecf00 13057072 6f787908
+ 73636f70 6c696665 02677200 c00c0005 00010002 a2ec0021 03313730 03313638
+ 02393903 32313903 31393407 696e2d61 64647204 61727061 00c05800 0c000100
+ 029ecf00 02c039c0 5c000200 0100029e cf001004 696e666f 08666f72 74686e65
+ 74c048c0 5c000200 0100029e cf000805 6e736865 72c098c0 5c000200 0100029e
+ cf000805 6e737468 65c098c0 5c000200 0100029e cf000c09 74656972 65736961
+ 73c098c0 93000100 010004be 3900048b 5b0111c0 af000100 01000542 ba0004c1
+ 5c1e13c0 c3000100 01000542 800004c1 5c6e01c0 d7000100 01000542 800004c2
+ dbe302.
+ +0.001960
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 0570726f 78790873 636f706c 69666502 67720000
+ 010001.
+ sendto=35
+ +0.005061
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.003253
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000782
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01c00c00 05000100 02a2ec00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000698
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000173
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.915746
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.014046
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8180 00010001 00040004 0570726f 78790873 636f706c 69666502 67720000
+ 010001c0 0c000100 01000288 220004c2 db63aa08 73636f70 6c696665 02677200
+ 00020001 000542ba 0011056e 73617468 08666f72 74686e65 74c03cc0 33000200
+ 01000542 ba000805 6e736865 72c050c0 33000200 01000542 ba000805 6e737468
+ 65c050c0 33000200 01000542 ba000c09 74656972 65736961 73c050c0 4a000100
+ 01000542 800004c1 5c9603c0 67000100 01000542 ba0004c1 5c1e13c0 7b000100
+ 01000542 800004c1 5c6e01c0 8f000100 01000542 800004c2 dbe302.
+ +0.001422
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000197
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.900081
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.203705
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218180 00010001 00050005 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01c00c00 05000100 029ece00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100c041 00020001
+ 00029ece 00120469 6e666f08 666f7274 686e6574 02677200 c0410002 00010002
+ 9ece0008 056e7368 6572c06b c0410002 00010002 9ece0008 056e7374 6865c06b
+ c0410002 00010002 9ece0008 056e7361 7468c06b c0410002 00010002 9ece000c
+ 09746569 72657369 6173c06b c0660001 00010005 41ce0004 8b5b0111 c0840001
+ 00010005 42b90004 c15c1e13 c0980001 00010005 427f0004 c15c6e01 c0ac0001
+ 00010005 427f0004 c15c9603 c0c00001 00010005 427f0004 c2dbe302.
+ +0.001798
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000249
+ close fd=4
+ close=OK
+ +0.000219
diff --git a/regress/case-datapluscnamewait.err b/regress/case-datapluscnamewait.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-datapluscnamewait.err
diff --git a/regress/case-datapluscnamewait.out b/regress/case-datapluscnamewait.out
new file mode 100644
index 0000000..ea38cbe
--- /dev/null
+++ b/regress/case-datapluscnamewait.out
@@ -0,0 +1,78 @@
+adns debug: using nameserver 172.18.45.6
+170.99.219.194.in-addr.arpa flags 292 type 1 A(-) submitted
+170.99.219.194.in-addr.arpa flags 292 type 2 NS(raw) submitted
+170.99.219.194.in-addr.arpa flags 292 type 5 CNAME(-) submitted
+170.99.219.194.in-addr.arpa flags 292 type 6 SOA(raw) submitted
+170.99.219.194.in-addr.arpa flags 292 type 12 PTR(raw) submitted
+170.99.219.194.in-addr.arpa flags 292 type 13 HINFO(-) submitted
+170.99.219.194.in-addr.arpa flags 292 type 15 MX(raw) submitted
+170.99.219.194.in-addr.arpa flags 292 type 16 TXT(-) submitted
+170.99.219.194.in-addr.arpa flags 292 type 17 RP(raw) submitted
+170.99.219.194.in-addr.arpa flags 292 type 65537 A(addr) submitted
+170.99.219.194.in-addr.arpa flags 292 type 65538 NS(+addr) submitted
+170.99.219.194.in-addr.arpa flags 292 type 65548 PTR(checked) submitted
+170.99.219.194.in-addr.arpa flags 292 type 65551 MX(+addr) submitted
+170.99.219.194.in-addr.arpa flags 292 type 131078 SOA(822) submitted
+170.99.219.194.in-addr.arpa flags 292 type 131089 RP(822) submitted
+adns debug: ignoring CNAME (to 170.168.99.219.194.in-addr.arpa) coexisting with RR (QNAME=170.99.219.194.in-addr.arpa, QTYPE=PTR(raw), NS=172.18.45.6)
+adns debug: ignoring RR with an unexpected owner 170.168.99.219.194.in-addr.arpa (QNAME=170.99.219.194.in-addr.arpa, QTYPE=PTR(raw), NS=172.18.45.6)
+adns debug: ignoring CNAME (to 170.168.99.219.194.in-addr.arpa) coexisting with RR (QNAME=170.99.219.194.in-addr.arpa, QTYPE=PTR(checked), NS=172.18.45.6)
+adns debug: ignoring RR with an unexpected owner 170.168.99.219.194.in-addr.arpa (QNAME=170.99.219.194.in-addr.arpa, QTYPE=PTR(checked), NS=172.18.45.6)
+170.99.219.194.in-addr.arpa flags 292 type PTR(raw): OK; nrrs=1; cname=$; owner=170.99.219.194.in-addr.arpa; ttl=171763
+ proxy.scoplife.gr
+170.99.219.194.in-addr.arpa flags 292 type PTR(checked): OK; nrrs=1; cname=$; owner=170.99.219.194.in-addr.arpa; ttl=171763
+ proxy.scoplife.gr
+170.99.219.194.in-addr.arpa flags 292 type A(-): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=600
+170.99.219.194.in-addr.arpa flags 292 type MX(raw): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type RP(raw): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type A(addr): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=600
+170.99.219.194.in-addr.arpa flags 292 type NS(+addr): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type MX(+addr): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+170.99.219.194.in-addr.arpa flags 292 type RP(822): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=0
+adns debug: reply not found, id 3120, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3122, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3124, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3126, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+170.99.219.194.in-addr.arpa flags 292 type NS(raw): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=600
+170.99.219.194.in-addr.arpa flags 292 type SOA(raw): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=600
+170.99.219.194.in-addr.arpa flags 292 type HINFO(-): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=600
+170.99.219.194.in-addr.arpa flags 292 type TXT(-): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=600
+170.99.219.194.in-addr.arpa flags 292 type SOA(822): No such data; nrrs=0; cname=170.168.99.219.194.in-addr.arpa; owner=170.99.219.194.in-addr.arpa; ttl=599
+adns debug: reply not found, id 312e, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312d, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312c, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312a, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3129, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3127, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3126, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3125, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3124, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3122, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3120, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 311f, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312e, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312d, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312c, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312a, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3129, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3127, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3126, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3125, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3124, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3122, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3120, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 311f, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312c, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312a, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3129, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3127, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3126, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3125, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3124, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3122, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3120, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 311f, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312d, query owner 170.168.99.219.194.in-addr.arpa (NS=172.18.45.6)
+170.99.219.194.in-addr.arpa flags 292 type CNAME(-): OK; nrrs=1; cname=$; owner=170.99.219.194.in-addr.arpa; ttl=110056
+ 170.168.99.219.194.in-addr.arpa
+rc=0
diff --git a/regress/case-datapluscnamewait.sys b/regress/case-datapluscnamewait.sys
new file mode 100644
index 0000000..07e55e8
--- /dev/null
+++ b/regress/case-datapluscnamewait.sys
@@ -0,0 +1,1492 @@
+adnstest default -0x400
+292/170.99.219.194.in-addr.arpa
+ start 933809632.795174
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000201
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000083
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000062
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.005997
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.016139
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.006108
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.015626
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000c00 01.
+ sendto=45
+ +0.006041
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01.
+ sendto=45
+ +0.016937
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.005443
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01.
+ sendto=45
+ +0.015782
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.006303
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.015591
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.006039
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000c00 01.
+ sendto=45
+ +0.017765
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.006116
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.015294
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.006158
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.838661
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000324
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238180 00010003 00040004 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 029ef300 13057072 6f787908
+ 73636f70 6c696665 02677200 c00c0005 00010002 9ef50021 03313730 03313638
+ 02393903 32313903 31393407 696e2d61 64647204 61727061 00c05800 0c000100
+ 029ef300 02c039c0 5c000200 0100029e f3001004 696e666f 08666f72 74686e65
+ 74c048c0 5c000200 0100029e f3000805 6e736865 72c098c0 5c000200 0100029e
+ f3000805 6e737468 65c098c0 5c000200 0100029e f3000c09 74656972 65736961
+ 73c098c0 93000100 010004be 5d00048b 5b0111c0 af000100 01000542 de0004c1
+ 5c1e13c0 c3000100 01000542 a40004c1 5c6e01c0 d7000100 01000542 a40004c2
+ dbe302.
+ +0.007330
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8180 00010003 00040004 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 029ef300 13057072 6f787908
+ 73636f70 6c696665 02677200 c00c0005 00010002 9ef50021 03313730 03313638
+ 02393903 32313903 31393407 696e2d61 64647204 61727061 00c05800 0c000100
+ 029ef300 02c039c0 5c000200 0100029e f3001004 696e666f 08666f72 74686e65
+ 74c048c0 5c000200 0100029e f3000805 6e736865 72c098c0 5c000200 0100029e
+ f3000805 6e737468 65c098c0 5c000200 0100029e f3000c09 74656972 65736961
+ 73c098c0 93000100 010004be 5d00048b 5b0111c0 af000100 01000542 de0004c1
+ 5c1e13c0 c3000100 01000542 a40004c1 5c6e01c0 d7000100 01000542 a40004c2
+ dbe302.
+ +0.002315
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 0570726f 78790873 636f706c 69666502 67720000
+ 010001.
+ sendto=35
+ +0.005642
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000159
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.822891
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.007207
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8180 00010001 00040004 0570726f 78790873 636f706c 69666502 67720000
+ 010001c0 0c000100 01000288 460004c2 db63aa08 73636f70 6c696665 02677200
+ 00020001 000542de 0011056e 73617468 08666f72 74686e65 74c03cc0 33000200
+ 01000542 de000805 6e736865 72c050c0 33000200 01000542 de000805 6e737468
+ 65c050c0 33000200 01000542 de000c09 74656972 65736961 73c050c0 4a000100
+ 01000542 a40004c1 5c9603c0 67000100 01000542 de0004c1 5c1e13c0 7b000100
+ 01000542 a40004c1 5c6e01c0 8f000100 01000542 a40004c2 dbe302.
+ +0.001427
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000219
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.814038
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-185431
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.001281
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.004185
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008703
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.001091
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.010530
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.018894
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.001185
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.001033
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.017193
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.017773
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01.
+ sendto=45
+ +0.001148
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.015209
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.018840
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.001149
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000663
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008852
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01.
+ sendto=45
+ +0.001085
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.006508
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009065
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.001094
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.002652
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009275
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.001088
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.007880
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008377
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.001077
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.022230
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.028895
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.001155
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.001072
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.012518
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.017777
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.001095
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.838996
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-161506
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000502
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009962
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.001211
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.001066
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.018231
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.017752
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000479
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009982
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.001151
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.001038
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008299
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008021
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000278
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009792
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01.
+ sendto=45
+ +0.001143
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009331
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008852
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000479
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009985
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.001184
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01.
+ sendto=45
+ +0.001060
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008400
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.007976
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000424
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009931
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.001097
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.000764
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008465
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008502
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.000787
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.029148
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.028673
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000475
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009961
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.001131
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.001027
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008360
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.007873
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000487
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009998
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.001092
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.838948
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-161498
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000446
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009968
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.001172
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.001037
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.018281
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.017811
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000470
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009988
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.001156
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.001034
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008294
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.007805
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000489
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010003
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01.
+ sendto=45
+ +0.001162
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009304
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008831
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000473
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009990
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.001153
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01.
+ sendto=45
+ +0.001036
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008446
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.007809
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000637
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010143
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.001092
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.000740
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.000706
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.037740
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.037284
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000456
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009974
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.001135
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.001077
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008299
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.007902
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000397
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010170
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.000771
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.839018
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-161432
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000450
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009951
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.000533
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.000467
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.019507
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.019027
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000480
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009995
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.000505
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.000453
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009525
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009036
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000489
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009993
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01.
+ sendto=45
+ +0.000504
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009975
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009493
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000482
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009994
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.000528
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01.
+ sendto=45
+ +0.000454
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009647
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009014
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000633
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010175
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.000499
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.000450
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.000447
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.038859
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.038404
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000455
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009958
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.000474
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.000453
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009854
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009107
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000747
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010102
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.000502
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.839433
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-161012
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000445
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010011
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.000502
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.000455
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.019499
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.019014
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000485
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009983
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.000498
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.000458
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009533
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009049
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000484
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009996
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01.
+ sendto=45
+ +0.000500
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009979
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009494
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000485
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009996
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.000564
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01.
+ sendto=45
+ +0.000452
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009644
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008982
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000662
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010145
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.000527
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.000453
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.000449
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.038846
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.038396
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000450
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009997
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.000504
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.000454
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009631
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009036
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000595
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010011
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.000494
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.839591
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-160907
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000498
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009988
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.000516
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.000455
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.019493
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005671
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010001 00010000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01c00c00 05000100 029ee900 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100c03d 00060001
+ 00000258 00380974 65697265 73696173 08666f72 74686e65 74026772 000a686f
+ 73746d61 73746572 c0707709 a5220000 54600000 0e100036 ee800002 a300.
+ +0.001103
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000252
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.012467
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.011997
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000470
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009991
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.000503
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.000454
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009523
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009039
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000484
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009993
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01.
+ sendto=45
+ +0.000596
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009885
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009400
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000485
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009995
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.000496
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01.
+ sendto=45
+ +0.000452
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009685
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005326
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01c00c00 05000100 029ee900 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000679
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000223
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.003457
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.002820
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000637
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010141
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.000502
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01.
+ sendto=45
+ +0.000452
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.000445
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.038919
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004982
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01c00c00 05000100 029ee900 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000678
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000193
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.033066
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003845
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298180 00010001 00010000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000100 01c00c00 05000100 029ee900 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100c03d 00060001
+ 00000258 00380974 65697265 73696173 08666f72 74686e65 74026772 000a686f
+ 73746d61 73746572 c0707709 a5220000 54600000 0e100036 ee800002 a300.
+ +0.001064
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000234
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.027923
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002680
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01c00c00 05000100 029ee900 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000678
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000187
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.024378
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.023895
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000483
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009993
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01.
+ sendto=45
+ +0.000504
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.000448
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009543
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.008307
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000f00 01c00c00 05000100 029ee900 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000709
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000195
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000332
+ select=0 rfds=[] wfds=[] efds=[]
+ +1.-990116
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01.
+ sendto=45
+ +0.000501
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.839522
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.055562
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8180 00010001 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001100 01c00c00 05000100 029ee800 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100.
+ +0.000679
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000223
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.783058
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.111990
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000200 01.
+ +0.000458
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000171
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.670439
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.084620
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000600 01.
+ +0.000444
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000167
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.585208
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.105188
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000d00 01.
+ +0.000511
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000168
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.479341
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004276
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00001000 01.
+ +0.000441
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000162
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.474462
+ select=0 rfds=[] wfds=[] efds=[]
+ +1.473985
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000477
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009985
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01.
+ sendto=45
+ +0.000545
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.019932
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.019448
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000484
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004980
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.000489
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.000454
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010001 00010000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000200 01c00c00 05000100 02a30000 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100c03d 00060001
+ 00000258 00380974 65697265 73696173 08666f72 74686e65 74026772 000a686f
+ 73746d61 73746572 c0707709 a5220000 54600000 0e100036 ee800002 a300.
+ +0.001060
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000249
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.013241
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.007284
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228180 00010001 00010000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01c00c00 05000100 02a30000 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100c03d 00060001
+ 00000258 00380974 65697265 73696173 08666f72 74686e65 74026772 000a686f
+ 73746d61 73746572 c0707709 a5220000 54600000 0e100036 ee800002 a300.
+ +0.001134
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000207
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.004616
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.004131
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000485
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009996
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01.
+ sendto=45
+ +0.000510
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.009970
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005957
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248180 00010001 00010000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000d00 01c00c00 05000100 02a30000 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100c03d 00060001
+ 00000258 00380974 65697265 73696173 08666f72 74686e65 74026772 000a686f
+ 73746d61 73746572 c0707709 a5220000 54600000 0e100036 ee800002 a300.
+ +0.001093
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000200
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.002720
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.002235
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000485
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009985
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01.
+ sendto=45
+ +0.000495
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.059970
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.007581
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268180 00010001 00010000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00001000 01c00c00 05000100 02a30000 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100c03d 00060001
+ 00000258 00380974 65697265 73696173 08666f72 74686e65 74026772 000a686f
+ 73746d61 73746572 c0707709 a5220000 54600000 0e100036 ee800002 a300.
+ +0.001095
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000204
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.051090
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.050594
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000496
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010020
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01.
+ sendto=45
+ +0.000510
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.884517
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-971134
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010001 00010000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000600 01c00c00 05000100 02a2ff00 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100c03d 00060001
+ 00000257 00380974 65697265 73696173 08666f72 74686e65 74026772 000a686f
+ 73746d61 73746572 c0707709 a5220000 54600000 0e100036 ee800002 a300.
+ +0.001129
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000209
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.854313
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.294993
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00001100 01.
+ +0.000451
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000174
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.558695
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.012449
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000600 01.
+ +0.000443
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000195
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.545608
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.033254
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000f00 01.
+ +0.000442
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000165
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.511747
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.033698
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000200 01.
+ +0.000445
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000165
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.477439
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.087089
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000100 01.
+ +0.000475
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000165
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.389710
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.013746
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00001100 01.
+ +0.000440
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000165
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.375359
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.019341
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00001000 01.
+ +0.000440
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000165
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.355413
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.027349
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000f00 01.
+ +0.000442
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000167
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.327455
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-481849
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000d00 01.
+ +0.000476
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000178
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.808650
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004046
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000600 01.
+ +0.000443
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000223
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.803938
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003854
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000200 01.
+ +0.000442
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000169
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.799473
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004099
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000100 01.
+ +0.000431
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000159
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.794784
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.799306
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.000587
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999413
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.089275
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00001100 01.
+ +0.000477
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000179
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.909482
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-954601
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000600 01.
+ +0.000444
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000166
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.863473
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.176995
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000f00 01.
+ +0.000520
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000236
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.685722
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.009094
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000200 01.
+ +0.000441
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000165
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.676022
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004004
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000100 01.
+ +0.000437
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000160
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.671421
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003792
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00001100 01.
+ +0.000441
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000189
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.666999
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.108860
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00001000 01.
+ +0.000450
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000164
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.557525
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.378539
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000f00 01.
+ +0.000446
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000165
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.178375
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.021040
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000d00 01.
+ +0.000485
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000162
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.156688
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004025
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000600 01.
+ +0.000434
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000160
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.152069
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003840
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000200 01.
+ +0.000436
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000160
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.147633
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.135825
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000100 01.
+ +0.000442
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000164
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.011202
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010716
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000486
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009980
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.000496
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999504
+ select=1 rfds=[4] wfds=[] efds=[]
+ +2.-383424
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000f00 01.
+ +0.000484
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000222
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.382222
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004359
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000200 01.
+ +0.000454
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000163
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.377246
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003697
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000100 01.
+ +0.000440
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000161
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.372948
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003846
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00001100 01.
+ +0.000439
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000191
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.368472
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.101004
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00001000 01.
+ +0.000442
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000163
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.266863
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004860
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000f00 01.
+ +0.000458
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000162
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.261383
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003486
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000d00 01.
+ +0.000436
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000207
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.257254
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005999
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000600 01.
+ +0.000444
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000163
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.250648
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003548
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000200 01.
+ +0.000437
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000159
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.246504
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003713
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000100 01.
+ +0.000464
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000161
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.242166
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.241706
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000460
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009972
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.000493
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999507
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00956
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000463
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009960
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01.
+ sendto=45
+ +0.000477
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999523
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-273409
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010000 00000000 03313730 03313638 02393903 32313903 31393407
+ 696e2d61 64647204 61727061 00000600 01.
+ +0.000463
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000177
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.272292
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.110798
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218180 00010001 00050005 03313730 02393903 32313903 31393407 696e2d61
+ 64647204 61727061 00000500 01c00c00 05000100 01ade800 21033137 30033136
+ 38023939 03323139 03313934 07696e2d 61646472 04617270 6100c044 00020001
+ 0000bc71 00170974 65697265 73696173 08666f72 74686e65 74026772 00c04400
+ 02000100 00bc7100 0d026e73 04726970 65036e65 7400c044 00020001 0000bc71
+ 0008056e 73617468 c070c044 00020001 0000bc71 0008056e 73746865 c070c044
+ 00020001 0000bc71 0008056e 73686572 c070c066 00010001 00054576 0004c2db
+ e302c089 00010001 00029904 0004c100 00c1c0a2 00010001 0004c1d7 0004c15c
+ 9603c0b6 00010001 000484f0 0004c15c 6e01c0ca 00010001 00054600 0004c15c
+ 1e13.
+ +0.001965
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000301
+ close fd=4
+ close=OK
+ +0.000256
diff --git a/regress/case-dh-ptr-aaaa.err b/regress/case-dh-ptr-aaaa.err
new file mode 100644
index 0000000..67419fb
--- /dev/null
+++ b/regress/case-dh-ptr-aaaa.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.29.199.224
diff --git a/regress/case-dh-ptr-aaaa.out b/regress/case-dh-ptr-aaaa.out
new file mode 100644
index 0000000..64060d2
--- /dev/null
+++ b/regress/case-dh-ptr-aaaa.out
@@ -0,0 +1,2 @@
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa PTR stratocaster.distorted.org.uk
+rc=0
diff --git a/regress/case-dh-ptr-aaaa.sys b/regress/case-dh-ptr-aaaa.sys
new file mode 100644
index 0000000..dcd7136
--- /dev/null
+++ b/regress/case-dh-ptr-aaaa.sys
@@ -0,0 +1,68 @@
+./adnshost distorted
+-i2001:ba8:1d9:2::4
+ start 1401919808.588362
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000058
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000031
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000026
+ sendto fd=6 addr=172.29.199.224:53
+ 311f0100 00010000 00000000 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390164 01310130 01380161
+ 01620130 01310130 01300132 03697036 04617270 6100000c 0001.
+ sendto=90
+ +0.000233
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999767
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.004488
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 311f8580 00010001 00040008 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390164 01310130 01380161
+ 01620130 01310130 01300132 03697036 04617270 6100000c 0001c00c 000c0001
+ 00003840 001f0c73 74726174 6f636173 74657209 64697374 6f727465 64036f72
+ 6702756b 00c03400 02000100 00384000 0d0a7465 6c656361 73746572 c073c034
+ 00020001 00003840 00090672 61646975 73c073c0 34000200 01000038 40000c09
+ 70726563 6973696f 6ec073c0 34000200 01000038 40000a07 76616d70 697265c0
+ 73c0aa00 01000100 00384000 04ac1dc7 01c0aa00 1c000100 00384000 10200104
+ 70974000 01000000 00000000 01c0d700 01000100 00384000 04ac1dc7 05c0d700
+ 1c000100 00384000 10200104 70974000 01000000 00000000 05c0bf00 01000100
+ 00384000 04ac1dc7 b2c0bf00 1c000100 00384000 1020010b a801d900 02000000
+ 00000000 02c09100 01000100 00384000 04ac1dc7 b3c09100 1c000100 00384000
+ 1020010b a801d900 02000000 00000000 03.
+ +0.000405
+ sendto fd=6 addr=172.29.199.224:53
+ 31200100 00010000 00000000 0c737472 61746f63 61737465 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000175
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000040
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999380
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.002002
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31208580 00010001 00040008 0c737472 61746f63 61737465 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010ba801
+ d9000200 00000000 000004c0 19000200 01000038 4000100a 74656c65 63617374
+ 6572026e 73c019c0 19000200 01000038 40000c09 70726563 6973696f 6ec062c0
+ 19000200 01000038 40000906 72616469 7573c062 c0190002 00010000 3840000a
+ 0776616d 70697265 c062c08b 00010001 00003840 0004ac1d c701c08b 001c0001
+ 00003840 00102001 04709740 00010000 00000000 0001c0a0 00010001 00003840
+ 0004ac1d c705c0a0 001c0001 00003840 00102001 04709740 00010000 00000000
+ 0005c073 00010001 00003840 0004ac1d c7b2c073 001c0001 00003840 00102001
+ 0ba801d9 00020000 00000000 0002c057 00010001 00003840 0004ac1d c7b3c057
+ 001c0001 00003840 00102001 0ba801d9 00020000 00000000 0003.
+ +0.000280
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000051
+ close fd=6
+ close=OK
+ +0.000134
diff --git a/regress/case-flags10.err b/regress/case-flags10.err
new file mode 100644
index 0000000..e6c1c99
--- /dev/null
+++ b/regress/case-flags10.err
@@ -0,0 +1 @@
+too many flags
diff --git a/regress/case-flags10.out b/regress/case-flags10.out
new file mode 100644
index 0000000..2f93975
--- /dev/null
+++ b/regress/case-flags10.out
@@ -0,0 +1,2 @@
+adns debug: using nameserver 172.18.45.6
+rc=3
diff --git a/regress/case-flags10.sys b/regress/case-flags10.sys
new file mode 100644
index 0000000..24431ed
--- /dev/null
+++ b/regress/case-flags10.sys
@@ -0,0 +1,15 @@
+adnstest default
+:0x0|1 ,aaaaaaaaaa/chiark.greenend.org.uk
+ start 929580072.670441
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000191
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000084
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000061
+ close fd=4
+ close=OK
+ +0.000001
diff --git a/regress/case-flags9.err b/regress/case-flags9.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-flags9.err
diff --git a/regress/case-flags9.out b/regress/case-flags9.out
new file mode 100644
index 0000000..679ba0d
--- /dev/null
+++ b/regress/case-flags9.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.18.45.6
+chiark.greenend.org.uk flags 0 type 1 A(-) submitted
+chiark.greenend.org.uk flags 0 type A(-) ownflags=aaaaaaaaa: ok; nrrs=1; cname=$; owner=$; ttl=86400
+ 195.224.76.132
+rc=0
diff --git a/regress/case-flags9.sys b/regress/case-flags9.sys
new file mode 100644
index 0000000..4b01b37
--- /dev/null
+++ b/regress/case-flags9.sys
@@ -0,0 +1,34 @@
+adnstest default
+:0x0|1 ,aaaaaaaaa/chiark.greenend.org.uk
+ start 929580075.263215
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000212
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000083
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000060
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000625
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999375
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.007374
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d41.
+ +0.001238
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000228
+ close fd=4
+ close=OK
+ +0.000205
diff --git a/regress/case-formerr.err b/regress/case-formerr.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-formerr.err
diff --git a/regress/case-formerr.out b/regress/case-formerr.out
new file mode 100644
index 0000000..8f70764
--- /dev/null
+++ b/regress/case-formerr.out
@@ -0,0 +1,19 @@
+adns debug: using nameserver 172.18.45.6
+h.rndrobwlxxxxxxxxxxlllantysiliogogllanfairpwllgwyngyllgogerychw.relativity.greenend.org.uk. flags 1 type 1 A(-) submitted
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+adns warning: server cannot understand our query (Format Error) (NS=172.18.45.6)
+h.rndrobwlxxxxxxxxxxlllantysiliogogllanfairpwllgwyngyllgogerychw.relativity.greenend.org.uk. flags 1 type A(-): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+rc=0
diff --git a/regress/case-formerr.sys b/regress/case-formerr.sys
new file mode 100644
index 0000000..79c4c4e
--- /dev/null
+++ b/regress/case-formerr.sys
@@ -0,0 +1,330 @@
+adnstest default
+:0x0|1 1/h.rndrobwlxxxxxxxxxxlllantysiliogogllanfairpwllgwyngyllgogerychw.relativity.greenend.org.uk.
+ start 951956380.814815
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000130
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000056
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000033
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000977
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999023
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000192
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000130
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000088
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998613
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01236
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000766
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999234
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000115
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000116
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000065
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998938
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01066
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000004
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009983
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000688
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999312
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000113
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000114
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000065
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999020
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00961
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000702
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999298
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000113
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000114
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000066
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999005
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00753
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000714
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999286
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000117
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000117
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000069
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998983
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01199
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000182
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009922
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000689
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999311
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000114
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000113
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000064
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999020
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00958
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000716
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999284
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000114
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000136
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000066
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998968
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01033
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000001
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009977
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000669
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999331
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000113
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000115
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000065
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999038
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00943
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000720
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999280
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000113
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000114
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000065
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998988
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01009
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000703
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999297
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000134
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000115
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000066
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998982
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01006
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000760
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999240
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000120
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000116
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000070
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998934
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01050
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000816
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999184
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000124
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000120
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000074
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998866
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01045
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000888
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999112
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000127
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000119
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000072
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998794
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01003
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000840
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999160
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000297
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000124
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000077
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998662
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01614
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000276
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010069
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01683e72 6e64726f 62776c78 78787878 78787878
+ 786c6c6c 616e7479 73696c69 6f676f67 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 770a7265 6c617469 76697479 08677265 656e656e
+ 64036f72 6702756b 00000100 01.
+ sendto=109
+ +0.000791
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999209
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000117
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8181 00010000 00000000.
+ +0.000271
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000080
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998741
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-01357
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000098
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009963
+ close fd=4
+ close=OK
+ +0.000234
diff --git a/regress/case-lockup.err b/regress/case-lockup.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-lockup.err
diff --git a/regress/case-lockup.out b/regress/case-lockup.out
new file mode 100644
index 0000000..a3f7495
--- /dev/null
+++ b/regress/case-lockup.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.36
+chiark.greenend.org.uk flags 0 type 1 A(-) submitted
+chiark.greenend.org.uk flags 0 type A(-): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+rc=0
diff --git a/regress/case-lockup.sys b/regress/case-lockup.sys
new file mode 100644
index 0000000..486632a
--- /dev/null
+++ b/regress/case-lockup.sys
@@ -0,0 +1,135 @@
+adnstest noserver
+:0x0|1 chiark.greenend.org.uk
+ start 912889153.349504
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000193
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000088
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000072
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000617
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999383
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.008683
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000406
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999594
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009544
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000428
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999572
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009567
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000449
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999551
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009551
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000381
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999619
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009614
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000383
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999617
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009622
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000387
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999613
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009603
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000404
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999596
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009607
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000468
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999532
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009526
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000431
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999569
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009564
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000429
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999571
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009586
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000479
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999521
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009511
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000430
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999570
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009571
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000440
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999560
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009564
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +2.000439
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ close fd=4
+ close=OK
+ +0.000267
diff --git a/regress/case-longdom0.err b/regress/case-longdom0.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-longdom0.err
diff --git a/regress/case-longdom0.out b/regress/case-longdom0.out
new file mode 100644
index 0000000..bba739e
--- /dev/null
+++ b/regress/case-longdom0.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+0rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk. flags 1 type 1 A(-) submitted
+0rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk. flags 1 type A(-): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+rc=0
diff --git a/regress/case-longdom0.sys b/regress/case-longdom0.sys
new file mode 100644
index 0000000..f6d3a56
--- /dev/null
+++ b/regress/case-longdom0.sys
@@ -0,0 +1,47 @@
+adnstest default
+:0x0|1 1/0rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk.
+ start 951955651.857473
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000126
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000056
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000036
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 2230726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f670a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=271
+ +0.003710
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.996290
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000332
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8583 00010000 00010000 2230726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f670a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 0100010a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 06000100 01518000 27036e73 30c10f0a 686f7374
+ 6d617374 6572c10f 0000002d 00001c20 00000e10 00093a80 00015180.
+ +0.001276
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000148
+ close fd=4
+ close=OK
+ +0.000154
diff --git a/regress/case-longdom1.err b/regress/case-longdom1.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-longdom1.err
diff --git a/regress/case-longdom1.out b/regress/case-longdom1.out
new file mode 100644
index 0000000..191a82f
--- /dev/null
+++ b/regress/case-longdom1.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+10rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk. flags 1 type 1 A(-) submitted
+10rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk. flags 1 type A(-): Domain name or component is too long; nrrs=0; cname=$; owner=$; ttl=604800
+rc=0
diff --git a/regress/case-longdom1.sys b/regress/case-longdom1.sys
new file mode 100644
index 0000000..718aaed
--- /dev/null
+++ b/regress/case-longdom1.sys
@@ -0,0 +1,15 @@
+adnstest default
+:0x0|1 1/10rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk.
+ start 951955690.505811
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000126
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000058
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000035
+ close fd=4
+ close=OK
+ +0.000269
diff --git a/regress/case-longdomsrch0.err b/regress/case-longdomsrch0.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-longdomsrch0.err
diff --git a/regress/case-longdomsrch0.out b/regress/case-longdomsrch0.out
new file mode 100644
index 0000000..14a33a3
--- /dev/null
+++ b/regress/case-longdomsrch0.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+10rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk flags 1 type 1 A(-) submitted
+10rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk flags 1 type A(-): No such domain; nrrs=0; cname=$; owner=$; ttl=604800
+rc=0
diff --git a/regress/case-longdomsrch0.sys b/regress/case-longdomsrch0.sys
new file mode 100644
index 0000000..ff0a22d
--- /dev/null
+++ b/regress/case-longdomsrch0.sys
@@ -0,0 +1,15 @@
+adnstest ndots100
+:0x0|1 1/10rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk
+ start 951956073.321566
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000131
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000056
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000034
+ close fd=4
+ close=OK
+ +0.000340
diff --git a/regress/case-longdomsrch1.err b/regress/case-longdomsrch1.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-longdomsrch1.err
diff --git a/regress/case-longdomsrch1.out b/regress/case-longdomsrch1.out
new file mode 100644
index 0000000..a1fa6b4
--- /dev/null
+++ b/regress/case-longdomsrch1.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+0rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk flags 1 type 1 A(-) submitted
+0rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk flags 1 type A(-): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+rc=0
diff --git a/regress/case-longdomsrch1.sys b/regress/case-longdomsrch1.sys
new file mode 100644
index 0000000..c3deb1b
--- /dev/null
+++ b/regress/case-longdomsrch1.sys
@@ -0,0 +1,47 @@
+adnstest ndots100
+:0x0|1 1/0rndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk
+ start 951956087.269350
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000132
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000060
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000038
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 2230726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f670a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=271
+ +0.001749
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998251
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000215
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218583 00010000 00010000 2230726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f673f 6c6c616e 66616972 70776c6c 6777796e
+ 67796c6c 676f6765 72796368 7779726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f670a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 0100010a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 06000100 01518000 27036e73 30c10f0a 686f7374
+ 6d617374 6572c10f 0000002d 00001c20 00000e10 00093a80 00015180.
+ +0.001176
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000173
+ close fd=4
+ close=OK
+ +0.000152
diff --git a/regress/case-longdomsrch1b.err b/regress/case-longdomsrch1b.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-longdomsrch1b.err
diff --git a/regress/case-longdomsrch1b.out b/regress/case-longdomsrch1b.out
new file mode 100644
index 0000000..af09658
--- /dev/null
+++ b/regress/case-longdomsrch1b.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+1xxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk flags 1 type 1 A(-) submitted
+1xxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk flags 1 type A(-): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+rc=0
diff --git a/regress/case-longdomsrch1b.sys b/regress/case-longdomsrch1b.sys
new file mode 100644
index 0000000..3ef9468
--- /dev/null
+++ b/regress/case-longdomsrch1b.sys
@@ -0,0 +1,46 @@
+adnstest ndots100
+:0x0|1 1/1xxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk
+ start 951956136.566877
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000137
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000060
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000038
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 13317878 786c6c6c 616e7479 73696c69 6f676f67
+ 3f6c6c61 6e666169 7270776c 6c677779 6e67796c 6c676f67 65727963 68777972
+ 6e64726f 62776c78 78787878 78787878 786c6c6c 616e7479 73696c69 6f676f67
+ 3f6c6c61 6e666169 7270776c 6c677779 6e67796c 6c676f67 65727963 68777972
+ 6e64726f 62776c78 78787878 78787878 786c6c6c 616e7479 73696c69 6f676f67
+ 3f6c6c61 6e666169 7270776c 6c677779 6e67796c 6c676f67 65727963 68777972
+ 6e64726f 62776c78 78787878 78787878 786c6c6c 616e7479 73696c69 6f676f67
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 00010001.
+ sendto=256
+ +0.004128
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995872
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000232
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218583 00010000 00010000 13317878 786c6c6c 616e7479 73696c69 6f676f67
+ 3f6c6c61 6e666169 7270776c 6c677779 6e67796c 6c676f67 65727963 68777972
+ 6e64726f 62776c78 78787878 78787878 786c6c6c 616e7479 73696c69 6f676f67
+ 3f6c6c61 6e666169 7270776c 6c677779 6e67796c 6c676f67 65727963 68777972
+ 6e64726f 62776c78 78787878 78787878 786c6c6c 616e7479 73696c69 6f676f67
+ 3f6c6c61 6e666169 7270776c 6c677779 6e67796c 6c676f67 65727963 68777972
+ 6e64726f 62776c78 78787878 78787878 786c6c6c 616e7479 73696c69 6f676f67
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 00010001
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 00060001
+ 00015180 0027036e 7330c100 0a686f73 746d6173 746572c1 00000000 2d00001c
+ 2000000e 1000093a 80000151 80.
+ +0.001145
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000155
+ close fd=4
+ close=OK
+ +0.000161
diff --git a/regress/case-longdomsrch2.err b/regress/case-longdomsrch2.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-longdomsrch2.err
diff --git a/regress/case-longdomsrch2.out b/regress/case-longdomsrch2.out
new file mode 100644
index 0000000..c4a3a23
--- /dev/null
+++ b/regress/case-longdomsrch2.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+xxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk flags 1 type 1 A(-) submitted
+xxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk flags 1 type A(-): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+rc=0
diff --git a/regress/case-longdomsrch2.sys b/regress/case-longdomsrch2.sys
new file mode 100644
index 0000000..683c44b
--- /dev/null
+++ b/regress/case-longdomsrch2.sys
@@ -0,0 +1,72 @@
+adnstest ndots100
+:0x0|1 1/xxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.llanfairpwllgwyngyllgogerychwyrndrobwlxxxxxxxxxxlllantysiliogog.relativity.greenend.org.uk
+ start 951956143.624786
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000137
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000058
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000035
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 12787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f670a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=271
+ +0.004067
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.995933
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000223
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208583 00010000 00010000 12787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f670a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0867 7265656e
+ 656e6403 6f726702 756b0000 01000108 67726565 6e656e64 036f7267 02756b00
+ 00060001 00015180 002d026e 73066368 6961726b c10f0a68 6f73746d 61737465
+ 72c10f77 35e86000 00708000 001c2000 093a8000 015180.
+ +0.001177
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 12787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f670a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=255
+ +0.002348
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218583 00010000 00010000 12787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f673f
+ 6c6c616e 66616972 70776c6c 6777796e 67796c6c 676f6765 72796368 7779726e
+ 64726f62 776c7878 78787878 78787878 6c6c6c61 6e747973 696c696f 676f670a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 0100010a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 06000100
+ 01518000 27036e73 30c0ff0a 686f7374 6d617374 6572c0ff 0000002d 00001c20
+ 00000e10 00093a80 00015180.
+ +0.001060
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000105
+ close fd=4
+ close=OK
+ +0.000176
diff --git a/regress/case-longlab0.err b/regress/case-longlab0.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-longlab0.err
diff --git a/regress/case-longlab0.out b/regress/case-longlab0.out
new file mode 100644
index 0000000..19f05e0
--- /dev/null
+++ b/regress/case-longlab0.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+yrndrobwlxxxxxxxxxxlllantysiliogogllanfairpwllgwyngyllgogerychw.relativity.greenend.org.uk. flags 1 type 1 A(-) submitted
+yrndrobwlxxxxxxxxxxlllantysiliogogllanfairpwllgwyngyllgogerychw.relativity.greenend.org.uk. flags 1 type A(-): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+rc=0
diff --git a/regress/case-longlab0.sys b/regress/case-longlab0.sys
new file mode 100644
index 0000000..bea6488
--- /dev/null
+++ b/regress/case-longlab0.sys
@@ -0,0 +1,37 @@
+adnstest default
+:0x0|1 1/yrndrobwlxxxxxxxxxxlllantysiliogogllanfairpwllgwyngyllgogerychw.relativity.greenend.org.uk.
+ start 951955250.786132
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000123
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000055
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000034
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 3f79726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f676c 6c616e66 61697270 776c6c67 77796e67
+ 796c6c67 6f676572 79636877 0a72656c 61746976 69747908 67726565 6e656e64
+ 036f7267 02756b00 00010001.
+ sendto=108
+ +0.003243
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.996757
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000534
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8583 00010000 00010000 3f79726e 64726f62 776c7878 78787878 78787878
+ 6c6c6c61 6e747973 696c696f 676f676c 6c616e66 61697270 776c6c67 77796e67
+ 796c6c67 6f676572 79636877 0a72656c 61746976 69747908 67726565 6e656e64
+ 036f7267 02756b00 00010001 0a72656c 61746976 69747908 67726565 6e656e64
+ 036f7267 02756b00 00060001 00015180 0027036e 7330c06c 0a686f73 746d6173
+ 746572c0 6c000000 2d00001c 2000000e 1000093a 80000151 80.
+ +0.000686
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000147
+ close fd=4
+ close=OK
+ +0.000151
diff --git a/regress/case-longlab1.err b/regress/case-longlab1.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-longlab1.err
diff --git a/regress/case-longlab1.out b/regress/case-longlab1.out
new file mode 100644
index 0000000..6f8b445
--- /dev/null
+++ b/regress/case-longlab1.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+hyrndrobwlxxxxxxxxxxlllantysiliogogllanfairpwllgwyngyllgogerychw.relativity.greenend.org.uk. flags 1 type 1 A(-) submitted
+hyrndrobwlxxxxxxxxxxlllantysiliogogllanfairpwllgwyngyllgogerychw.relativity.greenend.org.uk. flags 1 type A(-): Domain name or component is too long; nrrs=0; cname=$; owner=$; ttl=604800
+rc=0
diff --git a/regress/case-longlab1.sys b/regress/case-longlab1.sys
new file mode 100644
index 0000000..bc8d0f0
--- /dev/null
+++ b/regress/case-longlab1.sys
@@ -0,0 +1,15 @@
+adnstest default
+:0x0|1 1/hyrndrobwlxxxxxxxxxxlllantysiliogogllanfairpwllgwyngyllgogerychw.relativity.greenend.org.uk.
+ start 951955261.286712
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000128
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000053
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000033
+ close fd=4
+ close=OK
+ +0.000238
diff --git a/regress/case-mailboxes.err b/regress/case-mailboxes.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-mailboxes.err
diff --git a/regress/case-mailboxes.out b/regress/case-mailboxes.out
new file mode 100644
index 0000000..61d1757
--- /dev/null
+++ b/regress/case-mailboxes.out
@@ -0,0 +1,10 @@
+adns debug: using nameserver 172.18.45.6
+silly-rp.test.iwj.relativity.greenend.org.uk flags 0 type 131089 RP(822) submitted
+silly-rp.test.iwj.relativity.greenend.org.uk flags 0 type RP(822): OK; nrrs=6; cname=$; owner=$; ttl=60
+ . .
+ i@ucam.org .
+ i.j@ucam.org .
+ "i..j"@ucam.org .
+ ".i"@ucam.org .
+ "i."@ucam.org .
+rc=0
diff --git a/regress/case-mailboxes.sys b/regress/case-mailboxes.sys
new file mode 100644
index 0000000..5889227
--- /dev/null
+++ b/regress/case-mailboxes.sys
@@ -0,0 +1,35 @@
+adnstest default
+:0x20000|17 silly-rp.test.iwj.relativity.greenend.org.uk
+ start 923859567.899146
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000411
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000094
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000073
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 0873696c 6c792d72 70047465 73740369 776a0a72
+ 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000011 0001.
+ sendto=62
+ +0.000670
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999330
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.008169
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010006 00000000 0873696c 6c792d72 70047465 73740369 776a0a72
+ 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000011 0001c00c
+ 00110001 0000003c 00020000 c00c0011 00010000 003c000d 01690475 63616d03
+ 6f726700 00c00c00 11000100 00003c00 0703692e 6ac05a00 c00c0011 00010000
+ 003c0008 04692e2e 6ac05a00 c00c0011 00010000 003c0006 022e69c0 5a00c00c
+ 00110001 0000003c 00060269 2ec05a00.
+ +0.000992
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000604
+ close fd=4
+ close=OK
+ +0.000359
diff --git a/regress/case-manya.err b/regress/case-manya.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-manya.err
diff --git a/regress/case-manya.out b/regress/case-manya.out
new file mode 100644
index 0000000..08cee50
--- /dev/null
+++ b/regress/case-manya.out
@@ -0,0 +1,8 @@
+adns debug: using nameserver 172.18.45.6
+manyaddrs.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+manyaddrs.test.iwj.relativity.greenend.org.uk flags 0 type A(-): OK; nrrs=4; cname=$; owner=$; ttl=60
+ 127.0.0.1
+ 172.18.45.6
+ 172.18.45.1
+ 172.18.45.35
+rc=0
diff --git a/regress/case-manya.sys b/regress/case-manya.sys
new file mode 100644
index 0000000..4eb0386
--- /dev/null
+++ b/regress/case-manya.sys
@@ -0,0 +1,36 @@
+adnstest default
+:0x0|1 manyaddrs.test.iwj.relativity.greenend.org.uk
+ start 912888920.123769
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000245
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000705
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000073
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 096d616e 79616464 72730474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=63
+ +0.000698
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999302
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.006236
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010004 00010001 096d616e 79616464 72730474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001c0
+ 0c000100 01000000 3c0004ac 122d23c0 0c000100 01000000 3c0004ac 122d06c0
+ 0c000100 01000000 3c0004ac 122d01c0 0c000100 01000000 3c00047f 00000104
+ 74657374 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267
+ 02756b00 00020001 0000003c 0006036e 7330c088 c0ae0001 00010001 51800004
+ ac122d06.
+ +0.001078
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000329
+ close fd=4
+ close=OK
+ +0.000240
diff --git a/regress/case-manyptrwrong.err b/regress/case-manyptrwrong.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-manyptrwrong.err
diff --git a/regress/case-manyptrwrong.out b/regress/case-manyptrwrong.out
new file mode 100644
index 0000000..983422f
--- /dev/null
+++ b/regress/case-manyptrwrong.out
@@ -0,0 +1,127 @@
+adns debug: using nameserver 195.224.55.129
+254.0.99.203.in-addr.arpa flags 0 type 1 A(-) submitted
+254.0.99.203.in-addr.arpa flags 0 type 2 NS(raw) submitted
+254.0.99.203.in-addr.arpa flags 0 type 5 CNAME(-) submitted
+254.0.99.203.in-addr.arpa flags 0 type 6 SOA(raw) submitted
+254.0.99.203.in-addr.arpa flags 0 type 12 PTR(raw) submitted
+254.0.99.203.in-addr.arpa flags 0 type 13 HINFO(-) submitted
+254.0.99.203.in-addr.arpa flags 0 type 15 MX(raw) submitted
+254.0.99.203.in-addr.arpa flags 0 type 16 TXT(-) submitted
+254.0.99.203.in-addr.arpa flags 0 type 17 RP(raw) submitted
+254.0.99.203.in-addr.arpa flags 0 type 65537 A(addr) submitted
+254.0.99.203.in-addr.arpa flags 0 type 65538 NS(+addr) submitted
+254.0.99.203.in-addr.arpa flags 0 type 65548 PTR(checked) submitted
+254.0.99.203.in-addr.arpa flags 0 type 65551 MX(+addr) submitted
+254.0.99.203.in-addr.arpa flags 0 type 131078 SOA(822) submitted
+254.0.99.203.in-addr.arpa flags 0 type 131089 RP(822) submitted
+adns debug: TCP connected (NS=195.224.55.129)
+254.0.99.203.in-addr.arpa flags 0 type PTR(raw): OK; nrrs=94; cname=$; owner=$; ttl=80790
+ ns.security.co.nz
+ tetra.co.nz
+ mail.agate.co.nz
+ ns.agate.co.nz
+ securitytraining.co.nz
+ ns.giftbasket.co.nz
+ ns.security.gen.nz
+ bouquet.co.nz
+ investigation.co.nz
+ ns.nzipi.org.nz
+ mail.neru.co.nz
+ security.co.nz
+ ns.storewatch.co.nz
+ security.gen.nz
+ ns.tetra.co.nz
+ mail.tetra.co.nz
+ ns.securicard.co.nz
+ ns.underhour.co.nz
+ bcc.co.nz
+ security.org.nz
+ burglaralarms.co.nz
+ ns.safes.co.nz
+ ns.security.org.nz
+ couperconsulting.co.nz
+ securityguards.co.nz
+ ns.guards.co.nz
+ asis.org.nz
+ neru.co.nz
+ giftbasket.co.nz
+ magic.co.nz
+ mail.bcc.co.nz
+ ns.investigation.co.nz
+ nzipi.org.nz
+ ns.bouquet.co.nz
+ mail.safes.co.nz
+ ns.bcc.co.nz
+ ns.burglaralarms.co.nz
+ ns.securityguards.co.nz
+ covertcameras.co.nz
+ ns.neru.co.nz
+ ns.covertcameras.co.nz
+ bouquets.co.nz
+ concentric.co.nz
+ ns.securitytraining.co.nz
+ mail.couperconsulting.co.nz
+ retailsecurity.co.nz
+ ns.concentric.co.nz
+ mail.magic.co.nz
+ nzangling.co.nz
+ ns.couperconsulting.co.nz
+ ns.nzangling.co.nz
+ mail.storewatch.co.nz
+ swift.co.nz
+ mail.selective.co.nz
+ ns.forefront.co.nz
+ mail.nzangling.co.nz
+ guards.co.nz
+ mail.nzdesigns.co.nz
+ storewatch.co.nz
+ ns.securitymanagement.co.nz
+ mail.woolworths.co.nz
+ mail.concentric.co.nz
+ selective.co.nz
+ specialinvestigations.co.nz
+ ns.swift.co.nz
+ mail.swift.co.nz
+ ns.securenet.net.nz
+ privateinvestigation.co.nz
+ ns.privateinvestigation.co.nz
+ etrade.co.nz
+ ns.specialinvestigations.co.nz
+ mail.ansett.co.nz
+ ftp.warrent.co.nz
+ ns.retailsecurity.co.nz
+ mail.securitymanagement.co.nz
+ ns.magic.co.nz
+ mail.forefront.co.nz
+ mail.securicard.co.nz
+ securicard.co.nz
+ ns.nzdesigns.co.nz
+ safes.co.nz
+ ns.selective.co.nz
+ forefront.co.nz
+ securitymanagement.co.nz
+ underhour.co.nz
+ securenet.net.nz
+ mail.specialinvestigations.co.nz
+ nzdesigns.co.nz
+ ns.etrade.co.nz
+ mail.nzipi.org.nz
+ mail.underhour.co.nz
+ ns.asis.org.nz
+ ns.bouquets.co.nz
+ agate.co.nz
+254.0.99.203.in-addr.arpa flags 0 type PTR(checked): Inconsistent resource records in DNS; nrrs=0; cname=$; owner=$; ttl=80790
+254.0.99.203.in-addr.arpa flags 0 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type NS(raw): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type SOA(raw): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type NS(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type SOA(822): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+254.0.99.203.in-addr.arpa flags 0 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+rc=0
diff --git a/regress/case-manyptrwrong.sys b/regress/case-manyptrwrong.sys
new file mode 100644
index 0000000..27c8cac
--- /dev/null
+++ b/regress/case-manyptrwrong.sys
@@ -0,0 +1,1287 @@
+adnstest ncipher -0x400
+254.0.99.203.in-addr.arpa
+ start 933269010.293417
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000166
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000063
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000049
+ sendto fd=4 addr=195.224.55.129:53
+ 311f0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.000861
+ sendto fd=4 addr=195.224.55.129:53
+ 31200100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.000518
+ sendto fd=4 addr=195.224.55.129:53
+ 31210100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.000511
+ sendto fd=4 addr=195.224.55.129:53
+ 31220100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.000533
+ sendto fd=4 addr=195.224.55.129:53
+ 31230100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000573
+ sendto fd=4 addr=195.224.55.129:53
+ 31240100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0d0001.
+ sendto=43
+ +0.000523
+ sendto fd=4 addr=195.224.55.129:53
+ 31250100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.000518
+ sendto fd=4 addr=195.224.55.129:53
+ 31260100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 100001.
+ sendto=43
+ +0.000544
+ sendto fd=4 addr=195.224.55.129:53
+ 31270100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.000509
+ sendto fd=4 addr=195.224.55.129:53
+ 31290100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.000543
+ sendto fd=4 addr=195.224.55.129:53
+ 312a0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.000528
+ sendto fd=4 addr=195.224.55.129:53
+ 312b0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000576
+ sendto fd=4 addr=195.224.55.129:53
+ 312c0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.000515
+ sendto fd=4 addr=195.224.55.129:53
+ 312d0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.000635
+ sendto fd=4 addr=195.224.55.129:53
+ 312e0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.000525
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.991588
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001474
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31238380 00010013 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 0100013b 96001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 00013b96 00080574 65747261 c043c00c
+ 000c0001 00013b96 000d046d 61696c05 61676174 65c043c0 0c000c00 0100013b
+ 96000502 6e73c06f c00c000c 00010001 3b960013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 0100013b 96001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 0100013b 96001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 013b9600 0a07626f 75717565 74c043c0 0c000c00 0100013b
+ 9600100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 0100013b 96000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 00013b96 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 00013b96 0002c03a c00c000c 00010001 3b960010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010001 3b960002 c0d2c00c
+ 000c0001 00013b96 0005026e 73c056c0 0c000c00 0100013b 96000704 6d61696c
+ c056c00c 000c0001 00013b96 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 00013b96 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 013b9600 06036263 63c043.
+ +0.001498
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.000954
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000053
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000047
+ connect fd=5 addr=195.224.55.129:53
+ connect=EINPROGRESS
+ +0.000195
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000071
+ select max=6 rfds=[4] wfds=[5] efds=[] to=1.987296
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.000949
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000147
+ write fd=5
+ 002b3123 01000001 00000000 00000332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.000532
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.985668
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.011715
+ read fd=5 buflen=2
+ read=OK
+ 097f.
+ +0.000186
+ read fd=5 buflen=2431
+ read=OK
+ 31238180 0001005e 00020002 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 0100013b 96001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 00013b96 00080574 65747261 c043c00c
+ 000c0001 00013b96 000d046d 61696c05 61676174 65c043c0 0c000c00 0100013b
+ 96000502 6e73c06f c00c000c 00010001 3b960013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 0100013b 96001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 0100013b 96001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 013b9600 0a07626f 75717565 74c043c0 0c000c00 0100013b
+ 9600100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 0100013b 96000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 00013b96 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 00013b96 0002c03a c00c000c 00010001 3b960010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010001 3b960002 c0d2c00c
+ 000c0001 00013b96 0005026e 73c056c0 0c000c00 0100013b 96000704 6d61696c
+ c056c00c 000c0001 00013b96 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 00013b96 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 013b9600 06036263 63c043c0 0c000c00 0100013b 96000b08 73656375 72697479
+ c128c00c 000c0001 00013b96 00100d62 7572676c 6172616c 61726d73 c043c00c
+ 000c0001 00013b96 000b026e 73057361 666573c0 43c00c00 0c000100 013b9600
+ 05026e73 c1f7c00c 000c0001 00013b96 00131063 6f757065 72636f6e 73756c74
+ 696e67c0 43c00c00 0c000100 013b9600 110e7365 63757269 74796775 61726473
+ c043c00c 000c0001 00013b96 000c026e 73066775 61726473 c043c00c 000c0001
+ 00013b96 00070461 736973c1 28c00c00 0c000100 013b9600 02c13fc0 0c000c00
+ 0100013b 960002c0 b6c00c00 0c000100 013b9600 08056d61 676963c0 43c00c00
+ 0c000100 013b9600 07046d61 696cc1e5 c00c000c 00010001 3b960005 026e73c1
+ 03c00c00 0c000100 013b9600 02c122c0 0c000c00 0100013b 96000502 6e73c0ed
+ c00c000c 00010001 3b960007 046d6169 6cc22dc0 0c000c00 0100013b 96000502
+ 6e73c1e5 c00c000c 00010001 3b960005 026e73c2 0ec00c00 0c000100 013b9600
+ 05026e73 c271c00c 000c0001 00013b96 00100d63 6f766572 7463616d 65726173
+ c043c00c 000c0001 00013b96 0005026e 73c13fc0 0c000c00 0100013b 96001302
+ 6e730d63 6f766572 7463616d 65726173 c043c00c 000c0001 00013b96 000b0862
+ 6f757175 657473c0 43c00c00 0c000100 013b9600 0d0a636f 6e63656e 74726963
+ c043c00c 000c0001 00013b96 0005026e 73c094c0 0c000c00 0100013b 96000704
+ 6d61696c c252c00c 000c0001 00013b96 00110e72 65746169 6c736563 75726974
+ 79c043c0 0c000c00 0100013b 96001002 6e730a63 6f6e6365 6e747269 63c043c0
+ 0c000c00 0100013b 96000d04 6d61696c 056d6167 6963c043 c00c000c 00010001
+ 3b96000c 096e7a61 6e676c69 6e67c043 c00c000c 00010001 3b960005 026e73c2
+ 52c00c00 0c000100 013b9600 0f026e73 096e7a61 6e676c69 6e67c043 c00c000c
+ 00010001 3b960007 046d6169 6cc163c0 0c000c00 0100013b 96000805 73776966
+ 74c043c0 0c000c00 0100013b 96001104 6d61696c 0973656c 65637469 7665c043
+ c00c000c 00010001 3b96000f 026e7309 666f7265 66726f6e 74c043c0 0c000c00
+ 0100013b 96001104 6d61696c 096e7a61 6e676c69 6e67c043 c00c000c 00010001
+ 3b960009 06677561 726473c0 43c00c00 0c000100 013b9600 11046d61 696c096e
+ 7a646573 69676e73 c043c00c 000c0001 00013b96 0002c163 c00c000c 00010001
+ 3b960018 026e7312 73656375 72697479 6d616e61 67656d65 6e74c043 c00c000c
+ 00010001 3b960012 046d6169 6c0a776f 6f6c776f 72746873 c043c00c 000c0001
+ 00013b96 0012046d 61696c0a 636f6e63 656e.
+ +0.003706
+ read fd=5 buflen=973
+ read=EAGAIN
+ +0.000190
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.969871
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000115
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 312b8380 00010013 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 0100013b 96001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 00013b96 00080574 65747261 c043c00c
+ 000c0001 00013b96 000d046d 61696c05 61676174 65c043c0 0c000c00 0100013b
+ 96000502 6e73c06f c00c000c 00010001 3b960013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 0100013b 96001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 0100013b 96001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 013b9600 0a07626f 75717565 74c043c0 0c000c00 0100013b
+ 9600100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 0100013b 96000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 00013b96 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 00013b96 0002c03a c00c000c 00010001 3b960010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010001 3b960002 c0d2c00c
+ 000c0001 00013b96 0005026e 73c056c0 0c000c00 0100013b 96000704 6d61696c
+ c056c00c 000c0001 00013b96 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 00013b96 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 013b9600 06036263 63c043.
+ +0.001180
+ write fd=5
+ 002b312b 01000001 00000000 00000332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.000444
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000085
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.968047
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.000311
+ read fd=5 buflen=973
+ read=OK
+ 74726963 c043c00c 000c0001 00013b96 000c0973 656c6563 74697665 c043c00c
+ 000c0001 00013b96 00181573 70656369 616c696e 76657374 69676174 696f6e73
+ c043c00c 000c0001 00013b96 000b026e 73057377 696674c0 43c00c00 0c000100
+ 013b9600 0d046d61 696c0573 77696674 c043c00c 000c0001 00013b96 0013026e
+ 73097365 63757265 6e657403 6e6574c0 46c00c00 0c000100 013b9600 17147072
+ 69766174 65696e76 65737469 67617469 6f6ec043 c00c000c 00010001 3b96001a
+ 026e7314 70726976 61746569 6e766573 74696761 74696f6e c043c00c 000c0001
+ 00013b96 00090665 74726164 65c043c0 0c000c00 0100013b 96001b02 6e731573
+ 70656369 616c696e 76657374 69676174 696f6e73 c043c00c 000c0001 00013b96
+ 000e046d 61696c06 616e7365 7474c043 c00c000c 00010001 3b96000e 03667470
+ 07776172 72656e74 c043c00c 000c0001 00013b96 0014026e 730e7265 7461696c
+ 73656375 72697479 c043c00c 000c0001 00013b96 001a046d 61696c12 73656375
+ 72697479 6d616e61 67656d65 6e74c043 c00c000c 00010001 3b96000b 026e7305
+ 6d616769 63c043c0 0c000c00 0100013b 96001104 6d61696c 09666f72 6566726f
+ 6e74c043 c00c000c 00010001 3b960007 046d6169 6cc1b1c0 0c000c00 0100013b
+ 960002c1 b1c00c00 0c000100 013b9600 0f026e73 096e7a64 65736967 6e73c043
+ c00c000c 00010001 3b960002 c22dc00c 000c0001 00013b96 000f026e 73097365
+ 6c656374 697665c0 43c00c00 0c000100 013b9600 0c09666f 72656672 6f6e74c0
+ 43c00c00 0c000100 013b9600 15127365 63757269 74796d61 6e616765 6d656e74
+ c043c00c 000c0001 00013b96 0002c1cd c00c000c 00010001 3b960010 09736563
+ 7572656e 6574036e 6574c046 c00c000c 00010001 3b96001d 046d6169 6c157370
+ 65636961 6c696e76 65737469 67617469 6f6e73c0 43c00c00 0c000100 013b9600
+ 0c096e7a 64657369 676e73c0 43c00c00 0c000100 013b9600 0c026e73 06657472
+ 616465c0 43c00c00 0c000100 013b9600 07046d61 696cc122 c00c000c 00010001
+ 3b960007 046d6169 6cc1cdc0 0c000c00 0100013b 96000a02 6e730461 736973c1
+ 28c00c00 0c000100 013b9600 0e026e73 08626f75 71756574 73c043c0 0c000c00
+ 0100013b 960002c0 6f013002 39390332 30330749 4e2d4144 44520441 52504100
+ 00020001 00053014 0002c037 01300239 39033230 3307494e 2d414444 52044152
+ 50410000 02000100 05301400 11036e73 31077761 696b6174 6f026163 c046c037
+ 00010001 00013c19 0004cb63 00fe036e 73310777 61696b61 746f0261 63c04600
+ 01000100 013d0200 048cc880 0d.
+ +0.002240
+ read fd=5 buflen=2433
+ read=EAGAIN
+ +0.012290
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.953206
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.014898
+ read fd=5 buflen=2433
+ read=OK
+ 097f312b 81800001 005e0002 00020332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 013b9600 13026e73 08736563
+ 75726974 7902636f 026e7a00 c00c000c 00010001 3b960008 05746574 7261c043
+ c00c000c 00010001 3b96000d 046d6169 6c056167 617465c0 43c00c00 0c000100
+ 013b9600 05026e73 c06fc00c 000c0001 00013b96 00131073 65637572 69747974
+ 7261696e 696e67c0 43c00c00 0c000100 013b9600 10026e73 0a676966 74626173
+ 6b6574c0 43c00c00 0c000100 013b9600 12026e73 08736563 75726974 79036765
+ 6ec046c0 0c000c00 0100013b 96000a07 626f7571 756574c0 43c00c00 0c000100
+ 013b9600 100d696e 76657374 69676174 696f6ec0 43c00c00 0c000100 013b9600
+ 0f026e73 056e7a69 7069036f 7267c046 c00c000c 00010001 3b96000c 046d6169
+ 6c046e65 7275c043 c00c000c 00010001 3b960002 c03ac00c 000c0001 00013b96
+ 0010026e 730a7374 6f726577 61746368 c043c00c 000c0001 00013b96 0002c0d2
+ c00c000c 00010001 3b960005 026e73c0 56c00c00 0c000100 013b9600 07046d61
+ 696cc056 c00c000c 00010001 3b960010 026e730a 73656375 72696361 7264c043
+ c00c000c 00010001 3b96000f 026e7309 756e6465 72686f75 72c043c0 0c000c00
+ 0100013b 96000603 626363c0 43c00c00 0c000100 013b9600 0b087365 63757269
+ 7479c128 c00c000c 00010001 3b960010 0d627572 676c6172 616c6172 6d73c043
+ c00c000c 00010001 3b96000b 026e7305 73616665 73c043c0 0c000c00 0100013b
+ 96000502 6e73c1f7 c00c000c 00010001 3b960013 10636f75 70657263 6f6e7375
+ 6c74696e 67c043c0 0c000c00 0100013b 9600110e 73656375 72697479 67756172
+ 6473c043 c00c000c 00010001 3b96000c 026e7306 67756172 6473c043 c00c000c
+ 00010001 3b960007 04617369 73c128c0 0c000c00 0100013b 960002c1 3fc00c00
+ 0c000100 013b9600 02c0b6c0 0c000c00 0100013b 96000805 6d616769 63c043c0
+ 0c000c00 0100013b 96000704 6d61696c c1e5c00c 000c0001 00013b96 0005026e
+ 73c103c0 0c000c00 0100013b 960002c1 22c00c00 0c000100 013b9600 05026e73
+ c0edc00c 000c0001 00013b96 0007046d 61696cc2 2dc00c00 0c000100 013b9600
+ 05026e73 c1e5c00c 000c0001 00013b96 0005026e 73c20ec0 0c000c00 0100013b
+ 96000502 6e73c271 c00c000c 00010001 3b960010 0d636f76 65727463 616d6572
+ 6173c043 c00c000c 00010001 3b960005 026e73c1 3fc00c00 0c000100 013b9600
+ 13026e73 0d636f76 65727463 616d6572 6173c043 c00c000c 00010001 3b96000b
+ 08626f75 71756574 73c043c0 0c000c00 0100013b 96000d0a 636f6e63 656e7472
+ 6963c043 c00c000c 00010001 3b960005 026e73c0 94c00c00 0c000100 013b9600
+ 07046d61 696cc252 c00c000c 00010001 3b960011 0e726574 61696c73 65637572
+ 697479c0 43c00c00 0c000100 013b9600 10026e73 0a636f6e 63656e74 726963c0
+ 43c00c00 0c000100 013b9600 0d046d61 696c056d 61676963 c043c00c 000c0001
+ 00013b96 000c096e 7a616e67 6c696e67 c043c00c 000c0001 00013b96 0005026e
+ 73c252c0 0c000c00 0100013b 96000f02 6e73096e 7a616e67 6c696e67 c043c00c
+ 000c0001 00013b96 0007046d 61696cc1 63c00c00 0c000100 013b9600 08057377
+ 696674c0 43c00c00 0c000100 013b9600 11046d61 696c0973 656c6563 74697665
+ c043c00c 000c0001 00013b96 000f026e 7309666f 72656672 6f6e74c0 43c00c00
+ 0c000100 013b9600 11046d61 696c096e 7a616e67 6c696e67 c043c00c 000c0001
+ 00013b96 00090667 75617264 73c043c0 0c000c00 0100013b 96001104 6d61696c
+ 096e7a64 65736967 6e73c043 c00c000c 00010001 3b960002 c163c00c 000c0001
+ 00013b96 0018026e 73127365 63757269 74796d61 6e616765 6d656e74 c043c00c
+ 000c0001 00013b96 0012046d 61696c0a 776f6f6c 776f7274 6873c043 c00c000c
+ 00010001 3b960012 046d6169 6c0a636f 6e63656e.
+ +0.003337
+ read fd=5 buflen=973
+ read=EAGAIN
+ +0.000189
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.934782
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.102926
+ read fd=5 buflen=973
+ read=OK
+ 74726963 c043c00c 000c0001 00013b96 000c0973 656c6563 74697665 c043c00c
+ 000c0001 00013b96 00181573 70656369 616c696e 76657374 69676174 696f6e73
+ c043c00c 000c0001 00013b96 000b026e 73057377 696674c0 43c00c00 0c000100
+ 013b9600 0d046d61 696c0573 77696674 c043c00c 000c0001 00013b96 0013026e
+ 73097365 63757265 6e657403 6e6574c0 46c00c00 0c000100 013b9600 17147072
+ 69766174 65696e76 65737469 67617469 6f6ec043 c00c000c 00010001 3b96001a
+ 026e7314 70726976 61746569 6e766573 74696761 74696f6e c043c00c 000c0001
+ 00013b96 00090665 74726164 65c043c0 0c000c00 0100013b 96001b02 6e731573
+ 70656369 616c696e 76657374 69676174 696f6e73 c043c00c 000c0001 00013b96
+ 000e046d 61696c06 616e7365 7474c043 c00c000c 00010001 3b96000e 03667470
+ 07776172 72656e74 c043c00c 000c0001 00013b96 0014026e 730e7265 7461696c
+ 73656375 72697479 c043c00c 000c0001 00013b96 001a046d 61696c12 73656375
+ 72697479 6d616e61 67656d65 6e74c043 c00c000c 00010001 3b96000b 026e7305
+ 6d616769 63c043c0 0c000c00 0100013b 96001104 6d61696c 09666f72 6566726f
+ 6e74c043 c00c000c 00010001 3b960007 046d6169 6cc1b1c0 0c000c00 0100013b
+ 960002c1 b1c00c00 0c000100 013b9600 0f026e73 096e7a64 65736967 6e73c043
+ c00c000c 00010001 3b960002 c22dc00c 000c0001 00013b96 000f026e 73097365
+ 6c656374 697665c0 43c00c00 0c000100 013b9600 0c09666f 72656672 6f6e74c0
+ 43c00c00 0c000100 013b9600 15127365 63757269 74796d61 6e616765 6d656e74
+ c043c00c 000c0001 00013b96 0002c1cd c00c000c 00010001 3b960010 09736563
+ 7572656e 6574036e 6574c046 c00c000c 00010001 3b96001d 046d6169 6c157370
+ 65636961 6c696e76 65737469 67617469 6f6e73c0 43c00c00 0c000100 013b9600
+ 0c096e7a 64657369 676e73c0 43c00c00 0c000100 013b9600 0c026e73 06657472
+ 616465c0 43c00c00 0c000100 013b9600 07046d61 696cc122 c00c000c 00010001
+ 3b960007 046d6169 6cc1cdc0 0c000c00 0100013b 96000a02 6e730461 736973c1
+ 28c00c00 0c000100 013b9600 0e026e73 08626f75 71756574 73c043c0 0c000c00
+ 0100013b 960002c0 6f013002 39390332 30330749 4e2d4144 44520441 52504100
+ 00020001 00053014 0002c037 01300239 39033230 3307494e 2d414444 52044152
+ 50410000 02000100 05301400 11036e73 31077761 696b6174 6f026163 c046c037
+ 00010001 00013c19 0004cb63 00fe036e 73310777 61696b61 746f0261 63c04600
+ 01000100 013d0200 048cc880 0d.
+ +0.002246
+ sendto fd=4 addr=195.224.55.129:53
+ 312f0100 00010000 00000000 026e7308 73656375 72697479 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001645
+ sendto fd=4 addr=195.224.55.129:53
+ 31300100 00010000 00000000 05746574 72610263 6f026e7a 00000100 01.
+ sendto=29
+ +0.000578
+ sendto fd=4 addr=195.224.55.129:53
+ 31310100 00010000 00000000 046d6169 6c056167 61746502 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000605
+ sendto fd=4 addr=195.224.55.129:53
+ 31320100 00010000 00000000 026e7305 61676174 6502636f 026e7a00 00010001.
+ sendto=32
+ +0.000624
+ sendto fd=4 addr=195.224.55.129:53
+ 31330100 00010000 00000000 10736563 75726974 79747261 696e696e 6702636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.000624
+ sendto fd=4 addr=195.224.55.129:53
+ 31340100 00010000 00000000 026e730a 67696674 6261736b 65740263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.000647
+ sendto fd=4 addr=195.224.55.129:53
+ 31350100 00010000 00000000 026e7308 73656375 72697479 0367656e 026e7a00
+ 00010001.
+ sendto=36
+ +0.000624
+ sendto fd=4 addr=195.224.55.129:53
+ 31360100 00010000 00000000 07626f75 71756574 02636f02 6e7a0000 010001.
+ sendto=31
+ +0.000606
+ sendto fd=4 addr=195.224.55.129:53
+ 31370100 00010000 00000000 0d696e76 65737469 67617469 6f6e0263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.000591
+ sendto fd=4 addr=195.224.55.129:53
+ 31380100 00010000 00000000 026e7305 6e7a6970 69036f72 67026e7a 00000100
+ 01.
+ sendto=33
+ +0.000617
+ sendto fd=4 addr=195.224.55.129:53
+ 31390100 00010000 00000000 046d6169 6c046e65 72750263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.000622
+ sendto fd=4 addr=195.224.55.129:53
+ 313a0100 00010000 00000000 08736563 75726974 7902636f 026e7a00 00010001.
+ sendto=32
+ +0.000608
+ sendto fd=4 addr=195.224.55.129:53
+ 313b0100 00010000 00000000 026e730a 73746f72 65776174 63680263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.000655
+ sendto fd=4 addr=195.224.55.129:53
+ 313c0100 00010000 00000000 08736563 75726974 79036765 6e026e7a 00000100
+ 01.
+ sendto=33
+ +0.000617
+ sendto fd=4 addr=195.224.55.129:53
+ 313d0100 00010000 00000000 026e7305 74657472 6102636f 026e7a00 00010001.
+ sendto=32
+ +0.000622
+ sendto fd=4 addr=195.224.55.129:53
+ 313e0100 00010000 00000000 046d6169 6c057465 74726102 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000638
+ sendto fd=4 addr=195.224.55.129:53
+ 313f0100 00010000 00000000 026e730a 73656375 72696361 72640263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.000645
+ sendto fd=4 addr=195.224.55.129:53
+ 31400100 00010000 00000000 026e7309 756e6465 72686f75 7202636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.000621
+ sendto fd=4 addr=195.224.55.129:53
+ 31410100 00010000 00000000 03626363 02636f02 6e7a0000 010001.
+ sendto=27
+ +0.000634
+ sendto fd=4 addr=195.224.55.129:53
+ 31420100 00010000 00000000 08736563 75726974 79036f72 67026e7a 00000100
+ 01.
+ sendto=33
+ +0.000669
+ sendto fd=4 addr=195.224.55.129:53
+ 31430100 00010000 00000000 0d627572 676c6172 616c6172 6d730263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.000788
+ sendto fd=4 addr=195.224.55.129:53
+ 31440100 00010000 00000000 026e7305 73616665 7302636f 026e7a00 00010001.
+ sendto=32
+ +0.000784
+ sendto fd=4 addr=195.224.55.129:53
+ 31450100 00010000 00000000 026e7308 73656375 72697479 036f7267 026e7a00
+ 00010001.
+ sendto=36
+ +0.000824
+ sendto fd=4 addr=195.224.55.129:53
+ 31460100 00010000 00000000 10636f75 70657263 6f6e7375 6c74696e 6702636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.000796
+ sendto fd=4 addr=195.224.55.129:53
+ 31470100 00010000 00000000 0e736563 75726974 79677561 72647302 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.000849
+ sendto fd=4 addr=195.224.55.129:53
+ 31480100 00010000 00000000 026e7306 67756172 64730263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.000819
+ sendto fd=4 addr=195.224.55.129:53
+ 31490100 00010000 00000000 04617369 73036f72 67026e7a 00000100 01.
+ sendto=29
+ +0.000730
+ sendto fd=4 addr=195.224.55.129:53
+ 314a0100 00010000 00000000 046e6572 7502636f 026e7a00 00010001.
+ sendto=28
+ +0.000761
+ sendto fd=4 addr=195.224.55.129:53
+ 314b0100 00010000 00000000 0a676966 74626173 6b657402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000781
+ sendto fd=4 addr=195.224.55.129:53
+ 314c0100 00010000 00000000 056d6167 69630263 6f026e7a 00000100 01.
+ sendto=29
+ +0.000760
+ sendto fd=4 addr=195.224.55.129:53
+ 314d0100 00010000 00000000 046d6169 6c036263 6302636f 026e7a00 00010001.
+ sendto=32
+ +0.000770
+ sendto fd=4 addr=195.224.55.129:53
+ 314e0100 00010000 00000000 026e730d 696e7665 73746967 6174696f 6e02636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.000825
+ sendto fd=4 addr=195.224.55.129:53
+ 314f0100 00010000 00000000 056e7a69 7069036f 7267026e 7a000001 0001.
+ sendto=30
+ +0.000781
+ sendto fd=4 addr=195.224.55.129:53
+ 31500100 00010000 00000000 026e7307 626f7571 75657402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000816
+ sendto fd=4 addr=195.224.55.129:53
+ 31510100 00010000 00000000 046d6169 6c057361 66657302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000796
+ sendto fd=4 addr=195.224.55.129:53
+ 31520100 00010000 00000000 026e7303 62636302 636f026e 7a000001 0001.
+ sendto=30
+ +0.000785
+ sendto fd=4 addr=195.224.55.129:53
+ 31530100 00010000 00000000 026e730d 62757267 6c617261 6c61726d 7302636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.000780
+ sendto fd=4 addr=195.224.55.129:53
+ 31540100 00010000 00000000 026e730e 73656375 72697479 67756172 64730263
+ 6f026e7a 00000100 01.
+ sendto=41
+ +0.000840
+ sendto fd=4 addr=195.224.55.129:53
+ 31550100 00010000 00000000 0d636f76 65727463 616d6572 61730263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.000816
+ sendto fd=4 addr=195.224.55.129:53
+ 31560100 00010000 00000000 026e7304 6e657275 02636f02 6e7a0000 010001.
+ sendto=31
+ +0.000778
+ sendto fd=4 addr=195.224.55.129:53
+ 31570100 00010000 00000000 026e730d 636f7665 72746361 6d657261 7302636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.000840
+ sendto fd=4 addr=195.224.55.129:53
+ 31580100 00010000 00000000 08626f75 71756574 7302636f 026e7a00 00010001.
+ sendto=32
+ +0.000765
+ sendto fd=4 addr=195.224.55.129:53
+ 31590100 00010000 00000000 0a636f6e 63656e74 72696302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000829
+ sendto fd=4 addr=195.224.55.129:53
+ 315a0100 00010000 00000000 026e7310 73656375 72697479 74726169 6e696e67
+ 02636f02 6e7a0000 010001.
+ sendto=43
+ +0.000815
+ sendto fd=4 addr=195.224.55.129:53
+ 315b0100 00010000 00000000 046d6169 6c10636f 75706572 636f6e73 756c7469
+ 6e670263 6f026e7a 00000100 01.
+ sendto=45
+ +0.000857
+ sendto fd=4 addr=195.224.55.129:53
+ 315c0100 00010000 00000000 0e726574 61696c73 65637572 69747902 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.000827
+ sendto fd=4 addr=195.224.55.129:53
+ 315d0100 00010000 00000000 026e730a 636f6e63 656e7472 69630263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.000807
+ sendto fd=4 addr=195.224.55.129:53
+ 315e0100 00010000 00000000 046d6169 6c056d61 67696302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000830
+ sendto fd=4 addr=195.224.55.129:53
+ 315f0100 00010000 00000000 096e7a61 6e676c69 6e670263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.000809
+ sendto fd=4 addr=195.224.55.129:53
+ 31600100 00010000 00000000 026e7310 636f7570 6572636f 6e73756c 74696e67
+ 02636f02 6e7a0000 010001.
+ sendto=43
+ +0.000864
+ sendto fd=4 addr=195.224.55.129:53
+ 31610100 00010000 00000000 026e7309 6e7a616e 676c696e 6702636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.000806
+ sendto fd=4 addr=195.224.55.129:53
+ 31620100 00010000 00000000 046d6169 6c0a7374 6f726577 61746368 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001021
+ sendto fd=4 addr=195.224.55.129:53
+ 31630100 00010000 00000000 05737769 66740263 6f026e7a 00000100 01.
+ sendto=29
+ +0.000910
+ sendto fd=4 addr=195.224.55.129:53
+ 31640100 00010000 00000000 046d6169 6c097365 6c656374 69766502 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.000882
+ sendto fd=4 addr=195.224.55.129:53
+ 31650100 00010000 00000000 026e7309 666f7265 66726f6e 7402636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.000888
+ sendto fd=4 addr=195.224.55.129:53
+ 31660100 00010000 00000000 046d6169 6c096e7a 616e676c 696e6702 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.000941
+ sendto fd=4 addr=195.224.55.129:53
+ 31670100 00010000 00000000 06677561 72647302 636f026e 7a000001 0001.
+ sendto=30
+ +0.000901
+ sendto fd=4 addr=195.224.55.129:53
+ 31680100 00010000 00000000 046d6169 6c096e7a 64657369 676e7302 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.000952
+ sendto fd=4 addr=195.224.55.129:53
+ 31690100 00010000 00000000 0a73746f 72657761 74636802 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000922
+ sendto fd=4 addr=195.224.55.129:53
+ 316a0100 00010000 00000000 026e7312 73656375 72697479 6d616e61 67656d65
+ 6e740263 6f026e7a 00000100 01.
+ sendto=45
+ +0.000921
+ sendto fd=4 addr=195.224.55.129:53
+ 316b0100 00010000 00000000 046d6169 6c0a776f 6f6c776f 72746873 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.000970
+ sendto fd=4 addr=195.224.55.129:53
+ 316c0100 00010000 00000000 046d6169 6c0a636f 6e63656e 74726963 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.000911
+ sendto fd=4 addr=195.224.55.129:53
+ 316d0100 00010000 00000000 0973656c 65637469 76650263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.000909
+ sendto fd=4 addr=195.224.55.129:53
+ 316e0100 00010000 00000000 15737065 6369616c 696e7665 73746967 6174696f
+ 6e730263 6f026e7a 00000100 01.
+ sendto=45
+ +0.000952
+ sendto fd=4 addr=195.224.55.129:53
+ 316f0100 00010000 00000000 026e7305 73776966 7402636f 026e7a00 00010001.
+ sendto=32
+ +0.000912
+ sendto fd=4 addr=195.224.55.129:53
+ 31700100 00010000 00000000 046d6169 6c057377 69667402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000910
+ sendto fd=4 addr=195.224.55.129:53
+ 31710100 00010000 00000000 026e7309 73656375 72656e65 74036e65 74026e7a
+ 00000100 01.
+ sendto=37
+ +0.000937
+ sendto fd=4 addr=195.224.55.129:53
+ 31720100 00010000 00000000 14707269 76617465 696e7665 73746967 6174696f
+ 6e02636f 026e7a00 00010001.
+ sendto=44
+ +0.000955
+ sendto fd=4 addr=195.224.55.129:53
+ 31730100 00010000 00000000 026e7314 70726976 61746569 6e766573 74696761
+ 74696f6e 02636f02 6e7a0000 010001.
+ sendto=47
+ +0.000949
+ sendto fd=4 addr=195.224.55.129:53
+ 31740100 00010000 00000000 06657472 61646502 636f026e 7a000001 0001.
+ sendto=30
+ +0.000929
+ sendto fd=4 addr=195.224.55.129:53
+ 31750100 00010000 00000000 026e7315 73706563 69616c69 6e766573 74696761
+ 74696f6e 7302636f 026e7a00 00010001.
+ sendto=48
+ +0.000948
+ sendto fd=4 addr=195.224.55.129:53
+ 31760100 00010000 00000000 046d6169 6c06616e 73657474 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.000956
+ sendto fd=4 addr=195.224.55.129:53
+ 31770100 00010000 00000000 03667470 07776172 72656e74 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.000882
+ sendto fd=4 addr=195.224.55.129:53
+ 31780100 00010000 00000000 026e730e 72657461 696c7365 63757269 74790263
+ 6f026e7a 00000100 01.
+ sendto=41
+ +0.001013
+ sendto fd=4 addr=195.224.55.129:53
+ 31790100 00010000 00000000 046d6169 6c127365 63757269 74796d61 6e616765
+ 6d656e74 02636f02 6e7a0000 010001.
+ sendto=47
+ +0.000970
+ sendto fd=4 addr=195.224.55.129:53
+ 317a0100 00010000 00000000 026e7305 6d616769 6302636f 026e7a00 00010001.
+ sendto=32
+ +0.000945
+ sendto fd=4 addr=195.224.55.129:53
+ 317b0100 00010000 00000000 046d6169 6c09666f 72656672 6f6e7402 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.000971
+ sendto fd=4 addr=195.224.55.129:53
+ 317c0100 00010000 00000000 046d6169 6c0a7365 63757269 63617264 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.000947
+ sendto fd=4 addr=195.224.55.129:53
+ 317d0100 00010000 00000000 0a736563 75726963 61726402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000933
+ sendto fd=4 addr=195.224.55.129:53
+ 317e0100 00010000 00000000 026e7309 6e7a6465 7369676e 7302636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.000952
+ sendto fd=4 addr=195.224.55.129:53
+ 317f0100 00010000 00000000 05736166 65730263 6f026e7a 00000100 01.
+ sendto=29
+ +0.000954
+ sendto fd=4 addr=195.224.55.129:53
+ 31800100 00010000 00000000 026e7309 73656c65 63746976 6502636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.000964
+ sendto fd=4 addr=195.224.55.129:53
+ 31810100 00010000 00000000 09666f72 6566726f 6e740263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.000967
+ sendto fd=4 addr=195.224.55.129:53
+ 31820100 00010000 00000000 12736563 75726974 796d616e 6167656d 656e7402
+ 636f026e 7a000001 0001.
+ sendto=42
+ +0.000966
+ sendto fd=4 addr=195.224.55.129:53
+ 31830100 00010000 00000000 09756e64 6572686f 75720263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.000942
+ sendto fd=4 addr=195.224.55.129:53
+ 31840100 00010000 00000000 09736563 7572656e 6574036e 6574026e 7a000001
+ 0001.
+ sendto=34
+ +0.000972
+ sendto fd=4 addr=195.224.55.129:53
+ 31850100 00010000 00000000 046d6169 6c157370 65636961 6c696e76 65737469
+ 67617469 6f6e7302 636f026e 7a000001 0001.
+ sendto=50
+ +0.000939
+ sendto fd=4 addr=195.224.55.129:53
+ 31860100 00010000 00000000 096e7a64 65736967 6e730263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.000978
+ sendto fd=4 addr=195.224.55.129:53
+ 31870100 00010000 00000000 026e7306 65747261 64650263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.000980
+ sendto fd=4 addr=195.224.55.129:53
+ 31880100 00010000 00000000 046d6169 6c056e7a 69706903 6f726702 6e7a0000
+ 010001.
+ sendto=35
+ +0.001012
+ sendto fd=4 addr=195.224.55.129:53
+ 31890100 00010000 00000000 046d6169 6c09756e 64657268 6f757202 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.000973
+ sendto fd=4 addr=195.224.55.129:53
+ 318a0100 00010000 00000000 026e7304 61736973 036f7267 026e7a00 00010001.
+ sendto=32
+ +0.000972
+ sendto fd=4 addr=195.224.55.129:53
+ 318b0100 00010000 00000000 026e7308 626f7571 75657473 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001216
+ sendto fd=4 addr=195.224.55.129:53
+ 318c0100 00010000 00000000 05616761 74650263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001028
+ read fd=5 buflen=2433
+ read=EAGAIN
+ +0.000212
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.749926
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000262
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 312f8180 00010001 00020002 026e7308 73656375 72697479 02636f02 6e7a0000
+ 010001c0 0c000100 0100013c 190004cb 6300fe08 73656375 72697479 02636f02
+ 6e7a0000 02000100 013c1900 02c00cc0 33000200 0100013c 19001103 6e733107
+ 7761696b 61746f02 6163c03f c00c0001 00010001 3c190004 cb6300fe c05b0001
+ 00010001 3d020004 8cc8800d.
+ +0.000482
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31308180 00010001 00020002 05746574 72610263 6f026e7a 00000100 01c00c00
+ 01000100 013c1400 04cb6300 fec00c00 02000100 013c1400 05026e73 c00cc00c
+ 00020001 00013c14 0013036e 73310777 61696b61 746f0261 63026e7a 00c03900
+ 01000100 013c1400 04cb6300 fec04a00 01000100 013d0200 048cc880 0d.
+ +0.001031
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31318180 00010001 00020002 046d6169 6c056167 61746502 636f026e 7a000001
+ 0001c00c 00010001 00013c11 0004cb63 00fe0561 67617465 02636f02 6e7a0000
+ 02000100 013d0100 11036e73 31077761 696b6174 6f026163 c03bc032 00020001
+ 00013d01 0005026e 73c032c0 49000100 0100013d 0200048c c8800dc0 66000100
+ 0100013d 010004cb 6300fe.
+ +0.000920
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31328180 00010001 00020002 026e7305 61676174 6502636f 026e7a00 00010001
+ c00c0001 00010001 3d010004 cb6300fe 05616761 74650263 6f026e7a 00000200
+ 0100013d 01001103 6e733107 7761696b 61746f02 6163c039 c0300002 00010001
+ 3d010002 c00cc047 00010001 00013d02 00048cc8 800dc00c 00010001 00013d01
+ 0004cb63 00fe.
+ +0.000909
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31338180 00010001 00020002 10736563 75726974 79747261 696e696e 6702636f
+ 026e7a00 00010001 c00c0001 00010001 3c150004 cb6300fe c00c0002 00010001
+ 3c150005 026e73c0 0cc00c00 02000100 013c1500 13036e73 31077761 696b6174
+ 6f026163 026e7a00 c0440001 00010000 6ada0004 cb6300fe c0550001 00010001
+ 3d020004 8cc8800d.
+ +0.000890
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31348180 00010001 00020002 026e730a 67696674 6261736b 65740263 6f026e7a
+ 00000100 01c00c00 01000100 013c1800 04cb6300 fe0a6769 66746261 736b6574
+ 02636f02 6e7a0000 02000100 013c1800 02c00cc0 35000200 0100013c 18001103
+ 6e733107 7761696b 61746f02 6163c043 c00c0001 00010001 3c180004 cb6300fe
+ c05f0001 00010001 3d020004 8cc8800d.
+ +0.000922
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31358180 00010001 00020002 026e7308 73656375 72697479 0367656e 026e7a00
+ 00010001 c00c0001 00010000 5a4d0004 cb6300fe 08736563 75726974 79036765
+ 6e026e7a 00000200 0100013c 11001103 6e733107 7761696b 61746f02 6163c041
+ c0340002 00010001 3c110002 c00cc04f 00010001 00013d02 00048cc8 800dc00c
+ 00010001 00005a4d 0004cb63 00fe.
+ +0.000900
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31368180 00010001 00020002 07626f75 71756574 02636f02 6e7a0000 010001c0
+ 0c000100 0100013c 150004cb 6300fec0 0c000200 0100013c 15000502 6e73c00c
+ c00c0002 00010001 3c150013 036e7331 07776169 6b61746f 02616302 6e7a00c0
+ 3b000100 01000064 ce0004cb 6300fec0 4c000100 0100013d 0200048c c8800d.
+ +0.000863
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31378180 00010001 00020002 0d696e76 65737469 67617469 6f6e0263 6f026e7a
+ 00000100 01c00c00 01000100 013c1100 04cb6300 fec00c00 02000100 013c1100
+ 05026e73 c00cc00c 00020001 00013c11 0013036e 73310777 61696b61 746f0261
+ 63024e5a 00c04100 01000100 012b3100 04cb6300 fec05200 01000100 013d0200
+ 048cc880 0d.
+ +0.000907
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31388180 00010001 00020002 026e7305 6e7a6970 69036f72 67026e7a 00000100
+ 01c00c00 01000100 013d0100 04cb6300 fe056e7a 69706903 6f726702 6e7a0000
+ 02000100 013d0100 02c00cc0 31000200 0100013d 01001103 6e733107 7761696b
+ 61746f02 6163c03b c00c0001 00010001 3d010004 cb6300fe c0570001 00010001
+ 3d020004 8cc8800d.
+ +0.000880
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31398180 00010001 00020002 046d6169 6c046e65 72750263 6f026e7a 00000100
+ 01c00c00 01000100 013c1100 04cb6300 fe046e65 72750263 6f026e7a 00000200
+ 0100013c 12001103 6e733107 7761696b 61746f02 6163c039 c0310002 00010001
+ 3c120005 026e73c0 31c04700 01000100 013d0200 048cc880 0dc06400 01000100
+ 0064cc00 04cb6300 fe.
+ +0.000898
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 313a8180 00010001 00020002 08736563 75726974 7902636f 026e7a00 00010001
+ c00c0001 00010001 3c190004 cb6300fe c00c0002 00010001 3c190005 026e73c0
+ 0cc00c00 02000100 013c1900 13036e73 31077761 696b6174 6f026163 024e5a00
+ c03c0001 00010001 3c190004 cb6300fe c04d0001 00010001 3d020004 8cc8800d.
+ +0.000858
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 313b8583 00010000 00010000 026e730a 73746f72 65776174 63680263 6f026e7a
+ 00000100 0102636f 026e7a00 00060001 0000014b 002c046e 73393907 7761696b
+ 61746f02 6163c028 03736f61 c03b7727 6ec50000 0e100000 07080027 8d000001
+ 5180.
+ +0.000799
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 313c8180 00010001 00020002 08736563 75726974 79036765 6e026e7a 00000100
+ 01c00c00 01000100 013c1100 04cb6300 fec00c00 02000100 013c1100 13036e73
+ 31077761 696b6174 6f026163 026e7a00 c00c0002 00010001 3c110005 026e73c0
+ 0cc03d00 01000100 013d0200 048cc880 0dc05c00 01000100 005a4d00 04cb6300
+ fe.
+ +0.015730
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 313d8180 00010001 00020002 026e7305 74657472 6102636f 026e7a00 00010001
+ c00c0001 00010001 3c140004 cb6300fe 05746574 72610263 6f026e7a 00000200
+ 0100013c 140002c0 0cc03000 02000100 013c1400 11036e73 31077761 696b6174
+ 6f026163 c039c00c 00010001 00013c14 0004cb63 00fec055 00010001 00013d02
+ 00048cc8 800d.
+ +0.000552
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 313e8180 00010001 00020002 046d6169 6c057465 74726102 636f026e 7a000001
+ 0001c00c 00010001 00013c12 0004cb63 00fe0574 65747261 02636f02 6e7a0000
+ 02000100 013c1400 05026e73 c032c032 00020001 00013c14 0011036e 73310777
+ 61696b61 746f0261 63c03bc0 49000100 0100013c 140004cb 6300fec0 5a000100
+ 0100013d 0200048c c8800d.
+ +0.000560
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 313f8180 00010001 00020002 026e730a 73656375 72696361 72640263 6f026e7a
+ 00000100 01c00c00 01000100 013d0100 04cb6300 fe0a7365 63757269 63617264
+ 02636f02 6e7a0000 02000100 013d0100 02c00cc0 35000200 0100013d 01001103
+ 6e733107 7761696b 61746f02 6163c043 c00c0001 00010001 3d010004 cb6300fe
+ c05f0001 00010001 3d020004 8cc8800d.
+ +0.000545
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31408180 00010001 00020002 026e7309 756e6465 72686f75 7202636f 026e7a00
+ 00010001 c00c0001 00010001 3d010004 cb6300fe 09756e64 6572686f 75720263
+ 6f026e7a 00000200 0100013d 010002c0 0cc03400 02000100 013d0100 11036e73
+ 31077761 696b6174 6f026163 c041c00c 00010001 00013d01 0004cb63 00fec05d
+ 00010001 00013d02 00048cc8 800d.
+ +0.000542
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31418180 00010001 00020002 03626363 02636f02 6e7a0000 010001c0 0c000100
+ 0100013c 120004cb 6300fec0 0c000200 0100013c 18000502 6e73c00c c00c0002
+ 00010001 3c180013 036e7331 07776169 6b61746f 02616302 6e7a00c0 37000100
+ 0100006a dc0004cb 6300fec0 48000100 0100013d 0200048c c8800d.
+ +0.000518
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31428180 00010001 00020002 08736563 75726974 79036f72 67026e7a 00000100
+ 01c00c00 01000100 013c1200 04cb6300 fec00c00 02000100 013c1200 05026e73
+ c00cc00c 00020001 00013c12 0013036e 73310777 61696b61 746f0261 63026e7a
+ 00c03d00 01000100 013c1200 04cb6300 fec04e00 01000100 013d0200 048cc880
+ 0d.
+ +0.000512
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31438180 00010001 00020002 0d627572 676c6172 616c6172 6d730263 6f026e7a
+ 00000100 01c00c00 01000100 013c1200 04cb6300 fec00c00 02000100 013c1200
+ 05026e73 c00cc00c 00020001 00013c12 0013036e 73310777 61696b61 746f0261
+ 63026e7a 00c04100 01000100 0064cc00 04cb6300 fec05200 01000100 013d0200
+ 048cc880 0d.
+ +0.000548
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31448583 00010000 00010000 026e7305 73616665 7302636f 026e7a00 00010001
+ 05736166 65730263 6f026e7a 00000600 01000001 4c002e03 6e733104 69687567
+ 036e6574 c0290373 6f610469 687567c0 26772768 a9000151 8000002a 30001275
+ 000002a3 00.
+ +0.000452
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31458180 00010001 00020002 026e7308 73656375 72697479 036f7267 026e7a00
+ 00010001 c00c0001 00010001 3c120004 cb6300fe 08736563 75726974 79036f72
+ 67026e7a 00000200 0100013c 120002c0 0cc03400 02000100 013c1200 11036e73
+ 31077761 696b6174 6f026163 c041c00c 00010001 00013c12 0004cb63 00fec05d
+ 00010001 00013d02 00048cc8 800d.
+ +0.000539
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31468180 00010001 00020002 10636f75 70657263 6f6e7375 6c74696e 6702636f
+ 026e7a00 00010001 c00c0001 00010001 3c120004 cb6300fe c00c0002 00010001
+ 3d010013 036e7331 07776169 6b61746f 02616302 6e7a00c0 0c000200 0100013d
+ 01000502 6e73c00c c0440001 00010001 3d020004 8cc8800d c0630001 00010000
+ 718c0004 cb6300fe.
+ +0.000547
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31478180 00010001 00020002 0e736563 75726974 79677561 72647302 636f026e
+ 7a000001 0001c00c 00010001 00013c12 0004cb63 00fec00c 00020001 00013c12
+ 0005026e 73c00cc0 0c000200 0100013c 12001303 6e733107 7761696b 61746f02
+ 6163026e 7a00c042 00010001 000064cc 0004cb63 00fec053 00010001 00013d02
+ 00048cc8 800d.
+ +0.000649
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31488180 00010001 00020002 026e7306 67756172 64730263 6f026e7a 00000100
+ 01c00c00 01000100 013cfa00 04cb6300 fe066775 61726473 02636f02 6e7a0000
+ 02000100 013cfa00 02c00cc0 31000200 0100013c fa001103 6e733107 7761696b
+ 61746f02 6163c03b c00c0001 00010001 3cfa0004 cb6300fe c0570001 00010001
+ 3d020004 8cc8800d.
+ +0.000551
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31498180 00010001 00020002 04617369 73036f72 67026e7a 00000100 01c00c00
+ 01000100 013c1200 04cb6300 fec00c00 02000100 013c1200 05026e73 c00cc00c
+ 00020001 00013c12 0013036e 73310777 61696b61 746f0261 63026e7a 00c03900
+ 01000100 006ad900 04cb6300 fec04a00 01000100 013d0200 048cc880 0d.
+ +0.000503
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 314a8180 00010001 00020002 046e6572 7502636f 026e7a00 00010001 c00c0001
+ 00010001 3c120004 cb6300fe c00c0002 00010001 3c120013 036e7331 07776169
+ 6b61746f 02616302 6e7a00c0 0c000200 0100013c 12000502 6e73c00c c0380001
+ 00010001 3d020004 8cc8800d c0570001 00010000 64cc0004 cb6300fe.
+ +0.000499
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 314b8180 00010001 00020002 0a676966 74626173 6b657402 636f026e 7a000001
+ 0001c00c 00010001 00013c18 0004cb63 00fec00c 00020001 00013c18 0005026e
+ 73c00cc0 0c000200 0100013c 18001303 6e733107 7761696b 61746f02 6163024e
+ 5a00c03e 00010001 00013c18 0004cb63 00fec04f 00010001 00013d02 00048cc8
+ 800d.
+ +0.000529
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 314c8180 00010001 00020002 056d6167 69630263 6f026e7a 00000100 01c00c00
+ 01000100 013c1c00 04cb6300 fec00c00 02000100 013d0100 05026e73 c00cc00c
+ 00020001 00013d01 0013036e 73310777 61696b61 746f0261 63026e7a 00c03900
+ 01000100 00718c00 04cb6300 fec04a00 01000100 013d0200 048cc880 0d.
+ +0.000503
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 314d8180 00010001 00020002 046d6169 6c036263 6302636f 026e7a00 00010001
+ c00c0001 00010001 3c180004 cb6300fe 03626363 02636f02 6e7a0000 02000100
+ 013c1800 05026e73 c030c030 00020001 00013c18 0011036e 73310777 61696b61
+ 746f0261 63c037c0 45000100 0100006a dc0004cb 6300fec0 56000100 0100013d
+ 0200048c c8800d.
+ +0.000544
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 314e8180 00010001 00020002 026e730d 696e7665 73746967 6174696f 6e02636f
+ 026e7a00 00010001 c00c0001 00010001 2b310004 cb6300fe 0d696e76 65737469
+ 67617469 6f6e0263 6f026e7a 00000200 0100013c 110002c0 0cc03800 02000100
+ 013c1100 11036e73 31077761 696b6174 6f026163 c049c00c 00010001 00012b31
+ 0004cb63 00fec065 00010001 00013d02 00048cc8 800d.
+ +0.000562
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 314f8180 00010001 00020002 056e7a69 7069036f 7267026e 7a000001 0001c00c
+ 00010001 00013c18 0004cb63 00fec00c 00020001 00013d01 0005026e 73c00cc0
+ 0c000200 0100013d 01001303 6e733107 7761696b 61746f02 6163024e 5a00c03a
+ 00010001 00013d01 0004cb63 00fec04b 00010001 00013d02 00048cc8 800d.
+ +0.000505
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31508180 00010001 00020002 026e7307 626f7571 75657402 636f026e 7a000001
+ 0001c00c 00010001 00005fc3 0004cb63 00fe0762 6f757175 65740263 6f026e7a
+ 00000200 0100013c 150002c0 0cc03200 02000100 013c1500 11036e73 31077761
+ 696b6174 6f026163 c03dc00c 00010001 00005fc3 0004cb63 00fec059 00010001
+ 00013d02 00048cc8 800d.
+ +0.000561
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31518583 00010000 00010000 046d6169 6c057361 66657302 636f026e 7a000001
+ 00010573 61666573 02636f02 6e7a0000 06000100 00014c00 2e036e73 31046968
+ 7567036e 6574c02b 03736f61 04696875 67c02877 2768a900 01518000 002a3000
+ 12750000 02a300.
+ +0.000456
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31528180 00010001 00020002 026e7303 62636302 636f026e 7a000001 0001c00c
+ 00010001 00006584 0004cb63 00fe0362 63630263 6f026e7a 00000200 0100013c
+ 180002c0 0cc02e00 02000100 013c1800 11036e73 31077761 696b6174 6f026163
+ c035c00c 00010001 00006584 0004cb63 00fec051 00010001 00013d02 00048cc8
+ 800d.
+ +0.000510
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31538180 00010001 00020002 026e730d 62757267 6c617261 6c61726d 7302636f
+ 026e7a00 00010001 c00c0001 00010000 5fc10004 cb6300fe 0d627572 676c6172
+ 616c6172 6d730263 6f026e7a 00000200 0100013c 120002c0 0cc03800 02000100
+ 013c1200 11036e73 31077761 696b6174 6f026163 c049c00c 00010001 00005fc1
+ 0004cb63 00fec065 00010001 00013d02 00048cc8 800d.
+ +0.000695
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31548180 00010001 00020002 026e730e 73656375 72697479 67756172 64730263
+ 6f026e7a 00000100 01c00c00 01000100 005fc100 04cb6300 fe0e7365 63757269
+ 74796775 61726473 02636f02 6e7a0000 02000100 013c1200 02c00cc0 39000200
+ 0100013c 12001103 6e733107 7761696b 61746f02 6163c04b c00c0001 00010000
+ 5fc10004 cb6300fe c0670001 00010001 3d020004 8cc8800d.
+ +0.000563
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 318c8180 00010001 00020002 05616761 74650263 6f026e7a 00000100 01c00c00
+ 01000100 013d0100 04cb6300 fec00c00 02000100 013d0100 13036e73 31077761
+ 696b6174 6f026163 024e5a00 c00c0002 00010001 3d010005 026e73c0 0cc03900
+ 01000100 013d0200 048cc880 0dc05800 01000100 013d0100 04cb6300 fe.
+ +0.000525
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000199
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.709006
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.182313
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 311f8580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 01000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000371
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000183
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.527000
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.008955
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31208580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 02000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000371
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000153
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.518039
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.009375
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31218580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 05000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000369
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000166
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.508640
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.019379
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31228580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 06000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000372
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000151
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.489844
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.031580
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31248580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0d000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000386
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000181
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.458220
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.031691
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31258580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000369
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000150
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.426528
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.028650
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31268580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 10000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000370
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000159
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.397893
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.029986
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31278580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 11000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000369
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000145
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.367902
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.029845
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 31298580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 01000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000384
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000148
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.338068
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.033093
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 312a8580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 02000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000368
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000145
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.305566
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-780664
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 312c8580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000375
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000147
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.086223
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000393
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 312d8580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 06000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000367
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000152
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.085946
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000401
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=195.224.55.129:53
+ 312e8580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 11000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000367
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000142
+ close fd=4
+ close=OK
+ +0.000250
+ close fd=5
+ close=OK
+ +0.000095
diff --git a/regress/case-manyptrwrongrem.err b/regress/case-manyptrwrongrem.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-manyptrwrongrem.err
diff --git a/regress/case-manyptrwrongrem.out b/regress/case-manyptrwrongrem.out
new file mode 100644
index 0000000..6d0370c
--- /dev/null
+++ b/regress/case-manyptrwrongrem.out
@@ -0,0 +1,127 @@
+adns debug: using nameserver 140.200.128.13
+254.0.99.203.in-addr.arpa flags 292 type 1 A(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 2 NS(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 5 CNAME(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 6 SOA(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 12 PTR(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 13 HINFO(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 15 MX(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 16 TXT(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 17 RP(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65537 A(addr) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65538 NS(+addr) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65548 PTR(checked) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65551 MX(+addr) submitted
+254.0.99.203.in-addr.arpa flags 292 type 131078 SOA(822) submitted
+254.0.99.203.in-addr.arpa flags 292 type 131089 RP(822) submitted
+254.0.99.203.in-addr.arpa flags 292 type A(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type CNAME(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type SOA(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type NS(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type HINFO(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type TXT(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type MX(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type RP(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type A(addr): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type MX(+addr): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type NS(+addr): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type SOA(822): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type RP(822): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+adns debug: TCP connected (NS=140.200.128.13)
+254.0.99.203.in-addr.arpa flags 292 type PTR(raw): OK; nrrs=94; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+ ns.security.co.nz
+ tetra.co.nz
+ mail.agate.co.nz
+ ns.agate.co.nz
+ securitytraining.co.nz
+ ns.giftbasket.co.nz
+ ns.security.gen.nz
+ bouquet.co.nz
+ investigation.co.nz
+ ns.nzipi.org.nz
+ mail.neru.co.nz
+ security.co.nz
+ ns.storewatch.co.nz
+ security.gen.nz
+ ns.tetra.co.nz
+ mail.tetra.co.nz
+ ns.securicard.co.nz
+ ns.underhour.co.nz
+ bcc.co.nz
+ security.org.nz
+ burglaralarms.co.nz
+ ns.safes.co.nz
+ ns.security.org.nz
+ couperconsulting.co.nz
+ securityguards.co.nz
+ ns.guards.co.nz
+ asis.org.nz
+ neru.co.nz
+ giftbasket.co.nz
+ magic.co.nz
+ mail.bcc.co.nz
+ ns.investigation.co.nz
+ nzipi.org.nz
+ ns.bouquet.co.nz
+ mail.safes.co.nz
+ ns.bcc.co.nz
+ ns.burglaralarms.co.nz
+ ns.securityguards.co.nz
+ covertcameras.co.nz
+ ns.neru.co.nz
+ ns.covertcameras.co.nz
+ bouquets.co.nz
+ concentric.co.nz
+ ns.securitytraining.co.nz
+ mail.couperconsulting.co.nz
+ retailsecurity.co.nz
+ ns.concentric.co.nz
+ mail.magic.co.nz
+ nzangling.co.nz
+ ns.couperconsulting.co.nz
+ ns.nzangling.co.nz
+ mail.storewatch.co.nz
+ swift.co.nz
+ mail.selective.co.nz
+ ns.forefront.co.nz
+ mail.nzangling.co.nz
+ guards.co.nz
+ mail.nzdesigns.co.nz
+ storewatch.co.nz
+ ns.securitymanagement.co.nz
+ mail.woolworths.co.nz
+ mail.concentric.co.nz
+ selective.co.nz
+ specialinvestigations.co.nz
+ ns.swift.co.nz
+ mail.swift.co.nz
+ ns.securenet.net.nz
+ privateinvestigation.co.nz
+ ns.privateinvestigation.co.nz
+ etrade.co.nz
+ ns.specialinvestigations.co.nz
+ mail.ansett.co.nz
+ ftp.warrent.co.nz
+ ns.retailsecurity.co.nz
+ mail.securitymanagement.co.nz
+ ns.magic.co.nz
+ mail.forefront.co.nz
+ mail.securicard.co.nz
+ securicard.co.nz
+ ns.nzdesigns.co.nz
+ safes.co.nz
+ ns.selective.co.nz
+ forefront.co.nz
+ securitymanagement.co.nz
+ underhour.co.nz
+ securenet.net.nz
+ mail.specialinvestigations.co.nz
+ nzdesigns.co.nz
+ ns.etrade.co.nz
+ mail.nzipi.org.nz
+ mail.underhour.co.nz
+ ns.asis.org.nz
+ ns.bouquets.co.nz
+ agate.co.nz
+254.0.99.203.in-addr.arpa flags 292 type PTR(checked): Inconsistent resource records in DNS; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86399
+rc=0
diff --git a/regress/case-manyptrwrongrem.sys b/regress/case-manyptrwrongrem.sys
new file mode 100644
index 0000000..ccb3530
--- /dev/null
+++ b/regress/case-manyptrwrongrem.sys
@@ -0,0 +1,1145 @@
+adnstest manyptrwrong -0x400
+292/254.0.99.203.in-addr.arpa
+ start 933286859.476326
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000271
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000083
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000062
+ sendto fd=4 addr=140.200.128.13:53
+ 311f0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.001694
+ sendto fd=4 addr=140.200.128.13:53
+ 31200100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.001119
+ sendto fd=4 addr=140.200.128.13:53
+ 31210100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.001130
+ sendto fd=4 addr=140.200.128.13:53
+ 31220100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.001150
+ sendto fd=4 addr=140.200.128.13:53
+ 31230100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001229
+ sendto fd=4 addr=140.200.128.13:53
+ 31240100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0d0001.
+ sendto=43
+ +0.001161
+ sendto fd=4 addr=140.200.128.13:53
+ 31250100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.001179
+ sendto fd=4 addr=140.200.128.13:53
+ 31260100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 100001.
+ sendto=43
+ +0.001152
+ sendto fd=4 addr=140.200.128.13:53
+ 31270100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.001143
+ sendto fd=4 addr=140.200.128.13:53
+ 31290100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.001191
+ sendto fd=4 addr=140.200.128.13:53
+ 312a0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.001150
+ sendto fd=4 addr=140.200.128.13:53
+ 312b0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001220
+ sendto fd=4 addr=140.200.128.13:53
+ 312c0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.001148
+ sendto fd=4 addr=140.200.128.13:53
+ 312d0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.001183
+ sendto fd=4 addr=140.200.128.13:53
+ 312e0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.001193
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.981958
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.502250
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 311f8500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 01000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.001383
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000487
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.479532
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-892259
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31218500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 05000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000890
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000419
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.370482
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038604
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31228500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 06000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000852
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000399
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.330627
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038734
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31208500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 02000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000835
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000354
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.294103
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038824
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31248500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0d000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000863
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000406
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.254010
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.129111
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31238300 00010013 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000151 80001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 00015180 00080574 65747261 c043c00c
+ 000c0001 00015180 000d046d 61696c05 61676174 65c043c0 0c000c00 01000151
+ 80000502 6e73c06f c00c000c 00010001 51800013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 01000151 80001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 01000151 80001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 01518000 0a07626f 75717565 74c043c0 0c000c00 01000151
+ 8000100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 01000151 80000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 00015180 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 00015180 0002c03a c00c000c 00010001 51800010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010001 51800002 c0d2c00c
+ 000c0001 00015180 0005026e 73c056c0 0c000c00 01000151 80000704 6d61696c
+ c056c00c 000c0001 00015180 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 00015180 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 01518000 06036263 63c043.
+ +0.003324
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.001351
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000068
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000060
+ connect fd=5 addr=140.200.128.13:53
+ connect=EINPROGRESS
+ +0.000280
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000124
+ select max=6 rfds=[4] wfds=[5] efds=[] to=1.122082
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.034396
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31268500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 10000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000862
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000377
+ select max=6 rfds=[4] wfds=[5] efds=[] to=1.086447
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038752
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31258500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000842
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000365
+ select max=6 rfds=[4] wfds=[5] efds=[] to=1.048819
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038761
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31278500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 11000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000834
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000362
+ select max=6 rfds=[4] wfds=[5] efds=[] to=1.010005
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038783
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31298500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 01000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000832
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000411
+ select max=6 rfds=[4] wfds=[5] efds=[] to=0.971170
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.139078
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 312b8300 00010013 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000151 80001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 00015180 00080574 65747261 c043c00c
+ 000c0001 00015180 000d046d 61696c05 61676174 65c043c0 0c000c00 01000151
+ 80000502 6e73c06f c00c000c 00010001 51800013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 01000151 80001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 01000151 80001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 01518000 0a07626f 75717565 74c043c0 0c000c00 01000151
+ 8000100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 01000151 80000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 00015180 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 00015180 0002c03a c00c000c 00010001 51800010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010001 51800002 c0d2c00c
+ 000c0001 00015180 0005026e 73c056c0 0c000c00 01000151 80000704 6d61696c
+ c056c00c 000c0001 00015180 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 00015180 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 01518000 06036263 63c043.
+ +0.002995
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000416
+ select max=6 rfds=[4] wfds=[5] efds=[] to=0.828681
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.036200
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 312c8500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000832
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000371
+ select max=6 rfds=[4] wfds=[5] efds=[] to=0.791278
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038747
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 312a8500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 02000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000836
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000364
+ select max=6 rfds=[4] wfds=[5] efds=[] to=0.754849
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038774
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 312d8500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 06000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000832
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000430
+ select max=6 rfds=[4] wfds=[5] efds=[] to=0.715996
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038729
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 312e8500 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 11000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000837
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000373
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.539402
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.008807
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000213
+ write fd=5
+ 002b3123 01000001 00000000 00000332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.000894
+ write fd=5
+ 002b312b 01000001 00000000 00000332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.000449
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.529039
+ select=1 rfds=[5] wfds=[] efds=[]
+ +1.-90216
+ read fd=5 buflen=2
+ read=OK
+ 097f.
+ +0.000334
+ read fd=5 buflen=2431
+ read=OK
+ 31238500 0001005e 00020002 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000151 80001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 00015180 00080574 65747261 c043c00c
+ 000c0001 00015180 000d046d 61696c05 61676174 65c043c0 0c000c00 01000151
+ 80000502 6e73c06f c00c000c 00010001 51800013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 01000151 80001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 01000151 80001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 01518000 0a07626f 75717565 74c043c0 0c000c00 01000151
+ 8000100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 01000151 80000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 00015180 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 00015180 0002c03a c00c000c 00010001 51800010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010001 51800002 c0d2c00c
+ 000c0001 00015180 0005026e 73c056c0 0c000c00 01000151 80000704 6d61696c
+ c056c00c 000c0001 00015180 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 00015180 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 01518000 06036263 63c043c0 0c000c00 01000151 80000b08 73656375 72697479
+ c128c00c 000c0001 00015180 00100d62 7572676c 6172616c 61726d73 c043c00c
+ 000c0001 00015180 000b026e 73057361 666573c0 43c00c00 0c000100 01518000
+ 05026e73 c1f7c00c 000c0001 00015180 00131063 6f757065 72636f6e 73756c74
+ 696e67c0 43c00c00 0c000100 01518000 110e7365 63757269 74796775 61726473
+ c043c00c 000c0001 00015180 000c026e 73066775 61726473 c043c00c 000c0001
+ 00015180 00070461 736973c1 28c00c00 0c000100 01518000 02c13fc0 0c000c00
+ 01000151 800002c0 b6c00c00 0c000100 01518000 08056d61 676963c0 43c00c00
+ 0c000100 01518000 07046d61 696cc1e5 c00c000c 00010001 51800005 026e73c1
+ 03c00c00 0c000100 01518000 02c122c0 0c000c00 01000151 80000502 6e73c0ed
+ c00c000c 00010001 51800007 046d6169 6cc22dc0 0c000c00 01000151 80000502
+ 6e73c1e5 c00c000c 00010001 51800005 026e73c2 0ec00c00 0c000100 01518000
+ 05026e73 c271c00c 000c0001 00015180 00100d63 6f766572 7463616d 65726173
+ c043c00c 000c0001 00015180 0005026e 73c13fc0 0c000c00 01000151 80001302
+ 6e730d63 6f766572 7463616d 65726173 c043c00c 000c0001 00015180 000b0862
+ 6f757175 657473c0 43c00c00 0c000100 01518000 0d0a636f 6e63656e 74726963
+ c043c00c 000c0001 00015180 0005026e 73c094c0 0c000c00 01000151 80000704
+ 6d61696c c252c00c 000c0001 00015180 00110e72 65746169 6c736563 75726974
+ 79c043c0 0c000c00 01000151 80001002 6e730a63 6f6e6365 6e747269 63c043c0
+ 0c000c00 01000151 80000d04 6d61696c 056d6167 6963c043 c00c000c 00010001
+ 5180000c 096e7a61 6e676c69 6e67c043 c00c000c 00010001 51800005 026e73c2
+ 52c00c00 0c000100 01518000 0f026e73 096e7a61 6e676c69 6e67c043 c00c000c
+ 00010001 51800007 046d6169 6cc163c0 0c000c00 01000151 80000805 73776966
+ 74c043c0 0c000c00 01000151 80001104 6d61696c 0973656c 65637469 7665c043
+ c00c000c 00010001 5180000f 026e7309 666f7265 66726f6e 74c043c0 0c000c00
+ 01000151 80001104 6d61696c 096e7a61 6e676c69 6e67c043 c00c000c 00010001
+ 51800009 06677561 726473c0 43c00c00 0c000100 01518000 11046d61 696c096e
+ 7a646573 69676e73 c043c00c 000c0001 00015180 0002c163 c00c000c 00010001
+ 51800018 026e7312 73656375 72697479 6d616e61 67656d65 6e74c043 c00c000c
+ 00010001 51800012 046d6169 6c0a776f 6f6c776f 72746873 c043c00c 000c0001
+ 00015180 0012046d 61696c0a 636f6e63 656e.
+ +0.009121
+ read fd=5 buflen=973
+ read=EAGAIN
+ +0.000255
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=28.609545
+ select=1 rfds=[5] wfds=[] efds=[]
+ +1.-260444
+ read fd=5 buflen=973
+ read=OK
+ 74726963 c043c00c 000c0001 00015180 000c0973 656c6563 74697665 c043c00c
+ 000c0001 00015180 00181573 70656369 616c696e 76657374 69676174 696f6e73
+ c043c00c 000c0001 00015180 000b026e 73057377 696674c0 43c00c00 0c000100
+ 01518000 0d046d61 696c0573 77696674 c043c00c 000c0001 00015180 0013026e
+ 73097365 63757265 6e657403 6e6574c0 46c00c00 0c000100 01518000 17147072
+ 69766174 65696e76 65737469 67617469 6f6ec043 c00c000c 00010001 5180001a
+ 026e7314 70726976 61746569 6e766573 74696761 74696f6e c043c00c 000c0001
+ 00015180 00090665 74726164 65c043c0 0c000c00 01000151 80001b02 6e731573
+ 70656369 616c696e 76657374 69676174 696f6e73 c043c00c 000c0001 00015180
+ 000e046d 61696c06 616e7365 7474c043 c00c000c 00010001 5180000e 03667470
+ 07776172 72656e74 c043c00c 000c0001 00015180 0014026e 730e7265 7461696c
+ 73656375 72697479 c043c00c 000c0001 00015180 001a046d 61696c12 73656375
+ 72697479 6d616e61 67656d65 6e74c043 c00c000c 00010001 5180000b 026e7305
+ 6d616769 63c043c0 0c000c00 01000151 80001104 6d61696c 09666f72 6566726f
+ 6e74c043 c00c000c 00010001 51800007 046d6169 6cc1b1c0 0c000c00 01000151
+ 800002c1 b1c00c00 0c000100 01518000 0f026e73 096e7a64 65736967 6e73c043
+ c00c000c 00010001 51800002 c22dc00c 000c0001 00015180 000f026e 73097365
+ 6c656374 697665c0 43c00c00 0c000100 01518000 0c09666f 72656672 6f6e74c0
+ 43c00c00 0c000100 01518000 15127365 63757269 74796d61 6e616765 6d656e74
+ c043c00c 000c0001 00015180 0002c1cd c00c000c 00010001 51800010 09736563
+ 7572656e 6574036e 6574c046 c00c000c 00010001 5180001d 046d6169 6c157370
+ 65636961 6c696e76 65737469 67617469 6f6e73c0 43c00c00 0c000100 01518000
+ 0c096e7a 64657369 676e73c0 43c00c00 0c000100 01518000 0c026e73 06657472
+ 616465c0 43c00c00 0c000100 01518000 07046d61 696cc122 c00c000c 00010001
+ 51800007 046d6169 6cc1cdc0 0c000c00 01000151 80000a02 6e730461 736973c1
+ 28c00c00 0c000100 01518000 0e026e73 08626f75 71756574 73c043c0 0c000c00
+ 01000151 800002c0 6f013002 39390332 30330769 6e2d6164 64720461 72706100
+ 00020001 00015180 0002c037 01300239 39033230 3307696e 2d616464 72046172
+ 70610000 02000100 01518000 11036e73 31077761 696b6174 6f026163 c046c037
+ 00010001 00015180 0004cb63 00fe036e 73310777 61696b61 746f0261 63c04600
+ 01000100 01518000 048cc880 0d.
+ +0.005825
+ read fd=5 buflen=2433
+ read=EAGAIN
+ +0.018754
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=28.145272
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.355726
+ read fd=5 buflen=2433
+ read=OK
+ 097f312b 85000001 005e0002 00020332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 01518000 13026e73 08736563
+ 75726974 7902636f 026e7a00 c00c000c 00010001 51800008 05746574 7261c043
+ c00c000c 00010001 5180000d 046d6169 6c056167 617465c0 43c00c00 0c000100
+ 01518000 05026e73 c06fc00c 000c0001 00015180 00131073 65637572 69747974
+ 7261696e 696e67c0 43c00c00 0c000100 01518000 10026e73 0a676966 74626173
+ 6b6574c0 43c00c00 0c000100 01518000 12026e73 08736563 75726974 79036765
+ 6ec046c0 0c000c00 01000151 80000a07 626f7571 756574c0 43c00c00 0c000100
+ 01518000 100d696e 76657374 69676174 696f6ec0 43c00c00 0c000100 01518000
+ 0f026e73 056e7a69 7069036f 7267c046 c00c000c 00010001 5180000c 046d6169
+ 6c046e65 7275c043 c00c000c 00010001 51800002 c03ac00c 000c0001 00015180
+ 0010026e 730a7374 6f726577 61746368 c043c00c 000c0001 00015180 0002c0d2
+ c00c000c 00010001 51800005 026e73c0 56c00c00 0c000100 01518000 07046d61
+ 696cc056 c00c000c 00010001 51800010 026e730a 73656375 72696361 7264c043
+ c00c000c 00010001 5180000f 026e7309 756e6465 72686f75 72c043c0 0c000c00
+ 01000151 80000603 626363c0 43c00c00 0c000100 01518000 0b087365 63757269
+ 7479c128 c00c000c 00010001 51800010 0d627572 676c6172 616c6172 6d73c043
+ c00c000c 00010001 5180000b 026e7305 73616665 73c043c0 0c000c00 01000151
+ 80000502 6e73c1f7 c00c000c 00010001 51800013 10636f75 70657263 6f6e7375
+ 6c74696e 67c043c0 0c000c00 01000151 8000110e 73656375 72697479 67756172
+ 6473c043 c00c000c 00010001 5180000c 026e7306 67756172 6473c043 c00c000c
+ 00010001 51800007 04617369 73c128c0 0c000c00 01000151 800002c1 3fc00c00
+ 0c000100 01518000 02c0b6c0 0c000c00 01000151 80000805 6d616769 63c043c0
+ 0c000c00 01000151 80000704 6d61696c c1e5c00c 000c0001 00015180 0005026e
+ 73c103c0 0c000c00 01000151 800002c1 22c00c00 0c000100 01518000 05026e73
+ c0edc00c 000c0001 00015180 0007046d 61696cc2 2dc00c00 0c000100 01518000
+ 05026e73 c1e5c00c 000c0001 00015180 0005026e 73c20ec0 0c000c00 01000151
+ 80000502 6e73c271 c00c000c 00010001 51800010 0d636f76 65727463 616d6572
+ 6173c043 c00c000c 00010001 51800005 026e73c1 3fc00c00 0c000100 01518000
+ 13026e73 0d636f76 65727463 616d6572 6173c043 c00c000c 00010001 5180000b
+ 08626f75 71756574 73c043c0 0c000c00 01000151 80000d0a 636f6e63 656e7472
+ 6963c043 c00c000c 00010001 51800005 026e73c0 94c00c00 0c000100 01518000
+ 07046d61 696cc252 c00c000c 00010001 51800011 0e726574 61696c73 65637572
+ 697479c0 43c00c00 0c000100 01518000 10026e73 0a636f6e 63656e74 726963c0
+ 43c00c00 0c000100 01518000 0d046d61 696c056d 61676963 c043c00c 000c0001
+ 00015180 000c096e 7a616e67 6c696e67 c043c00c 000c0001 00015180 0005026e
+ 73c252c0 0c000c00 01000151 80000f02 6e73096e 7a616e67 6c696e67 c043c00c
+ 000c0001 00015180 0007046d 61696cc1 63c00c00 0c000100 01518000 08057377
+ 696674c0 43c00c00 0c000100 01518000 11046d61 696c0973 656c6563 74697665
+ c043c00c 000c0001 00015180 000f026e 7309666f 72656672 6f6e74c0 43c00c00
+ 0c000100 01518000 11046d61 696c096e 7a616e67 6c696e67 c043c00c 000c0001
+ 00015180 00090667 75617264 73c043c0 0c000c00 01000151 80001104 6d61696c
+ 096e7a64 65736967 6e73c043 c00c000c 00010001 51800002 c163c00c 000c0001
+ 00015180 0018026e 73127365 63757269 74796d61 6e616765 6d656e74 c043c00c
+ 000c0001 00015180 0012046d 61696c0a 776f6f6c 776f7274 6873c043 c00c000c
+ 00010001 51800012 046d6169 6c0a636f 6e63656e.
+ +0.008610
+ read fd=5 buflen=973
+ read=EAGAIN
+ +0.000242
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=27.780694
+ select=1 rfds=[5] wfds=[] efds=[]
+ +1.-129629
+ read fd=5 buflen=973
+ read=OK
+ 74726963 c043c00c 000c0001 00015180 000c0973 656c6563 74697665 c043c00c
+ 000c0001 00015180 00181573 70656369 616c696e 76657374 69676174 696f6e73
+ c043c00c 000c0001 00015180 000b026e 73057377 696674c0 43c00c00 0c000100
+ 01518000 0d046d61 696c0573 77696674 c043c00c 000c0001 00015180 0013026e
+ 73097365 63757265 6e657403 6e6574c0 46c00c00 0c000100 01518000 17147072
+ 69766174 65696e76 65737469 67617469 6f6ec043 c00c000c 00010001 5180001a
+ 026e7314 70726976 61746569 6e766573 74696761 74696f6e c043c00c 000c0001
+ 00015180 00090665 74726164 65c043c0 0c000c00 01000151 80001b02 6e731573
+ 70656369 616c696e 76657374 69676174 696f6e73 c043c00c 000c0001 00015180
+ 000e046d 61696c06 616e7365 7474c043 c00c000c 00010001 5180000e 03667470
+ 07776172 72656e74 c043c00c 000c0001 00015180 0014026e 730e7265 7461696c
+ 73656375 72697479 c043c00c 000c0001 00015180 001a046d 61696c12 73656375
+ 72697479 6d616e61 67656d65 6e74c043 c00c000c 00010001 5180000b 026e7305
+ 6d616769 63c043c0 0c000c00 01000151 80001104 6d61696c 09666f72 6566726f
+ 6e74c043 c00c000c 00010001 51800007 046d6169 6cc1b1c0 0c000c00 01000151
+ 800002c1 b1c00c00 0c000100 01518000 0f026e73 096e7a64 65736967 6e73c043
+ c00c000c 00010001 51800002 c22dc00c 000c0001 00015180 000f026e 73097365
+ 6c656374 697665c0 43c00c00 0c000100 01518000 0c09666f 72656672 6f6e74c0
+ 43c00c00 0c000100 01518000 15127365 63757269 74796d61 6e616765 6d656e74
+ c043c00c 000c0001 00015180 0002c1cd c00c000c 00010001 51800010 09736563
+ 7572656e 6574036e 6574c046 c00c000c 00010001 5180001d 046d6169 6c157370
+ 65636961 6c696e76 65737469 67617469 6f6e73c0 43c00c00 0c000100 01518000
+ 0c096e7a 64657369 676e73c0 43c00c00 0c000100 01518000 0c026e73 06657472
+ 616465c0 43c00c00 0c000100 01518000 07046d61 696cc122 c00c000c 00010001
+ 51800007 046d6169 6cc1cdc0 0c000c00 01000151 80000a02 6e730461 736973c1
+ 28c00c00 0c000100 01518000 0e026e73 08626f75 71756574 73c043c0 0c000c00
+ 01000151 800002c0 6f013002 39390332 30330769 6e2d6164 64720461 72706100
+ 00020001 00015180 0002c037 01300239 39033230 3307696e 2d616464 72046172
+ 70610000 02000100 01518000 11036e73 31077761 696b6174 6f026163 c046c037
+ 00010001 00015180 0004cb63 00fe036e 73310777 61696b61 746f0261 63c04600
+ 01000100 01518000 048cc880 0d.
+ +0.005848
+ sendto fd=4 addr=140.200.128.13:53
+ 312f0100 00010000 00000000 026e7308 73656375 72697479 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.002592
+ sendto fd=4 addr=140.200.128.13:53
+ 31300100 00010000 00000000 05746574 72610263 6f026e7a 00000100 01.
+ sendto=29
+ +0.000963
+ sendto fd=4 addr=140.200.128.13:53
+ 31310100 00010000 00000000 046d6169 6c056167 61746502 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000973
+ sendto fd=4 addr=140.200.128.13:53
+ 31320100 00010000 00000000 026e7305 61676174 6502636f 026e7a00 00010001.
+ sendto=32
+ +0.000977
+ sendto fd=4 addr=140.200.128.13:53
+ 31330100 00010000 00000000 10736563 75726974 79747261 696e696e 6702636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001007
+ sendto fd=4 addr=140.200.128.13:53
+ 31340100 00010000 00000000 026e730a 67696674 6261736b 65740263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001027
+ sendto fd=4 addr=140.200.128.13:53
+ 31350100 00010000 00000000 026e7308 73656375 72697479 0367656e 026e7a00
+ 00010001.
+ sendto=36
+ +0.000989
+ sendto fd=4 addr=140.200.128.13:53
+ 31360100 00010000 00000000 07626f75 71756574 02636f02 6e7a0000 010001.
+ sendto=31
+ +0.000946
+ sendto fd=4 addr=140.200.128.13:53
+ 31370100 00010000 00000000 0d696e76 65737469 67617469 6f6e0263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.000996
+ sendto fd=4 addr=140.200.128.13:53
+ 31380100 00010000 00000000 026e7305 6e7a6970 69036f72 67026e7a 00000100
+ 01.
+ sendto=33
+ +0.000972
+ sendto fd=4 addr=140.200.128.13:53
+ 31390100 00010000 00000000 046d6169 6c046e65 72750263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.000980
+ sendto fd=4 addr=140.200.128.13:53
+ 313a0100 00010000 00000000 08736563 75726974 7902636f 026e7a00 00010001.
+ sendto=32
+ +0.000958
+ sendto fd=4 addr=140.200.128.13:53
+ 313b0100 00010000 00000000 026e730a 73746f72 65776174 63680263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001038
+ sendto fd=4 addr=140.200.128.13:53
+ 313c0100 00010000 00000000 08736563 75726974 79036765 6e026e7a 00000100
+ 01.
+ sendto=33
+ +0.001003
+ sendto fd=4 addr=140.200.128.13:53
+ 313d0100 00010000 00000000 026e7305 74657472 6102636f 026e7a00 00010001.
+ sendto=32
+ +0.000972
+ sendto fd=4 addr=140.200.128.13:53
+ 313e0100 00010000 00000000 046d6169 6c057465 74726102 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.000983
+ sendto fd=4 addr=140.200.128.13:53
+ 313f0100 00010000 00000000 026e730a 73656375 72696361 72640263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.000996
+ sendto fd=4 addr=140.200.128.13:53
+ 31400100 00010000 00000000 026e7309 756e6465 72686f75 7202636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.000989
+ sendto fd=4 addr=140.200.128.13:53
+ 31410100 00010000 00000000 03626363 02636f02 6e7a0000 010001.
+ sendto=27
+ +0.000944
+ sendto fd=4 addr=140.200.128.13:53
+ 31420100 00010000 00000000 08736563 75726974 79036f72 67026e7a 00000100
+ 01.
+ sendto=33
+ +0.001001
+ sendto fd=4 addr=140.200.128.13:53
+ 31430100 00010000 00000000 0d627572 676c6172 616c6172 6d730263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001213
+ sendto fd=4 addr=140.200.128.13:53
+ 31440100 00010000 00000000 026e7305 73616665 7302636f 026e7a00 00010001.
+ sendto=32
+ +0.001241
+ sendto fd=4 addr=140.200.128.13:53
+ 31450100 00010000 00000000 026e7308 73656375 72697479 036f7267 026e7a00
+ 00010001.
+ sendto=36
+ +0.001489
+ sendto fd=4 addr=140.200.128.13:53
+ 31460100 00010000 00000000 10636f75 70657263 6f6e7375 6c74696e 6702636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001355
+ sendto fd=4 addr=140.200.128.13:53
+ 31470100 00010000 00000000 0e736563 75726974 79677561 72647302 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001389
+ sendto fd=4 addr=140.200.128.13:53
+ 31480100 00010000 00000000 026e7306 67756172 64730263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001299
+ sendto fd=4 addr=140.200.128.13:53
+ 31490100 00010000 00000000 04617369 73036f72 67026e7a 00000100 01.
+ sendto=29
+ +0.001325
+ sendto fd=4 addr=140.200.128.13:53
+ 314a0100 00010000 00000000 046e6572 7502636f 026e7a00 00010001.
+ sendto=28
+ +0.001328
+ sendto fd=4 addr=140.200.128.13:53
+ 314b0100 00010000 00000000 0a676966 74626173 6b657402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001356
+ sendto fd=4 addr=140.200.128.13:53
+ 314c0100 00010000 00000000 056d6167 69630263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001307
+ sendto fd=4 addr=140.200.128.13:53
+ 314d0100 00010000 00000000 046d6169 6c036263 6302636f 026e7a00 00010001.
+ sendto=32
+ +0.001375
+ sendto fd=4 addr=140.200.128.13:53
+ 314e0100 00010000 00000000 026e730d 696e7665 73746967 6174696f 6e02636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001386
+ sendto fd=4 addr=140.200.128.13:53
+ 314f0100 00010000 00000000 056e7a69 7069036f 7267026e 7a000001 0001.
+ sendto=30
+ +0.001327
+ sendto fd=4 addr=140.200.128.13:53
+ 31500100 00010000 00000000 026e7307 626f7571 75657402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001327
+ sendto fd=4 addr=140.200.128.13:53
+ 31510100 00010000 00000000 046d6169 6c057361 66657302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001405
+ sendto fd=4 addr=140.200.128.13:53
+ 31520100 00010000 00000000 026e7303 62636302 636f026e 7a000001 0001.
+ sendto=30
+ +0.001360
+ sendto fd=4 addr=140.200.128.13:53
+ 31530100 00010000 00000000 026e730d 62757267 6c617261 6c61726d 7302636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001401
+ sendto fd=4 addr=140.200.128.13:53
+ 31540100 00010000 00000000 026e730e 73656375 72697479 67756172 64730263
+ 6f026e7a 00000100 01.
+ sendto=41
+ +0.001460
+ sendto fd=4 addr=140.200.128.13:53
+ 31550100 00010000 00000000 0d636f76 65727463 616d6572 61730263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001355
+ sendto fd=4 addr=140.200.128.13:53
+ 31560100 00010000 00000000 026e7304 6e657275 02636f02 6e7a0000 010001.
+ sendto=31
+ +0.001384
+ sendto fd=4 addr=140.200.128.13:53
+ 31570100 00010000 00000000 026e730d 636f7665 72746361 6d657261 7302636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001389
+ sendto fd=4 addr=140.200.128.13:53
+ 31580100 00010000 00000000 08626f75 71756574 7302636f 026e7a00 00010001.
+ sendto=32
+ +0.001386
+ sendto fd=4 addr=140.200.128.13:53
+ 31590100 00010000 00000000 0a636f6e 63656e74 72696302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001352
+ sendto fd=4 addr=140.200.128.13:53
+ 315a0100 00010000 00000000 026e7310 73656375 72697479 74726169 6e696e67
+ 02636f02 6e7a0000 010001.
+ sendto=43
+ +0.001418
+ sendto fd=4 addr=140.200.128.13:53
+ 315b0100 00010000 00000000 046d6169 6c10636f 75706572 636f6e73 756c7469
+ 6e670263 6f026e7a 00000100 01.
+ sendto=45
+ +0.001422
+ sendto fd=4 addr=140.200.128.13:53
+ 315c0100 00010000 00000000 0e726574 61696c73 65637572 69747902 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001320
+ sendto fd=4 addr=140.200.128.13:53
+ 315d0100 00010000 00000000 026e730a 636f6e63 656e7472 69630263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001391
+ sendto fd=4 addr=140.200.128.13:53
+ 315e0100 00010000 00000000 046d6169 6c056d61 67696302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001430
+ sendto fd=4 addr=140.200.128.13:53
+ 315f0100 00010000 00000000 096e7a61 6e676c69 6e670263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001373
+ sendto fd=4 addr=140.200.128.13:53
+ 31600100 00010000 00000000 026e7310 636f7570 6572636f 6e73756c 74696e67
+ 02636f02 6e7a0000 010001.
+ sendto=43
+ +0.001399
+ sendto fd=4 addr=140.200.128.13:53
+ 31610100 00010000 00000000 026e7309 6e7a616e 676c696e 6702636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001403
+ sendto fd=4 addr=140.200.128.13:53
+ 31620100 00010000 00000000 046d6169 6c0a7374 6f726577 61746368 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001431
+ sendto fd=4 addr=140.200.128.13:53
+ 31630100 00010000 00000000 05737769 66740263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001341
+ sendto fd=4 addr=140.200.128.13:53
+ 31640100 00010000 00000000 046d6169 6c097365 6c656374 69766502 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001383
+ sendto fd=4 addr=140.200.128.13:53
+ 31650100 00010000 00000000 026e7309 666f7265 66726f6e 7402636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001398
+ sendto fd=4 addr=140.200.128.13:53
+ 31660100 00010000 00000000 046d6169 6c096e7a 616e676c 696e6702 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001396
+ sendto fd=4 addr=140.200.128.13:53
+ 31670100 00010000 00000000 06677561 72647302 636f026e 7a000001 0001.
+ sendto=30
+ +0.001338
+ sendto fd=4 addr=140.200.128.13:53
+ 31680100 00010000 00000000 046d6169 6c096e7a 64657369 676e7302 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001383
+ sendto fd=4 addr=140.200.128.13:53
+ 31690100 00010000 00000000 0a73746f 72657761 74636802 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001411
+ sendto fd=4 addr=140.200.128.13:53
+ 316a0100 00010000 00000000 026e7312 73656375 72697479 6d616e61 67656d65
+ 6e740263 6f026e7a 00000100 01.
+ sendto=45
+ +0.001441
+ sendto fd=4 addr=140.200.128.13:53
+ 316b0100 00010000 00000000 046d6169 6c0a776f 6f6c776f 72746873 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001416
+ sendto fd=4 addr=140.200.128.13:53
+ 316c0100 00010000 00000000 046d6169 6c0a636f 6e63656e 74726963 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001440
+ sendto fd=4 addr=140.200.128.13:53
+ 316d0100 00010000 00000000 0973656c 65637469 76650263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001390
+ sendto fd=4 addr=140.200.128.13:53
+ 316e0100 00010000 00000000 15737065 6369616c 696e7665 73746967 6174696f
+ 6e730263 6f026e7a 00000100 01.
+ sendto=45
+ +0.001803
+ sendto fd=4 addr=140.200.128.13:53
+ 316f0100 00010000 00000000 026e7305 73776966 7402636f 026e7a00 00010001.
+ sendto=32
+ +0.001450
+ sendto fd=4 addr=140.200.128.13:53
+ 31700100 00010000 00000000 046d6169 6c057377 69667402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001516
+ sendto fd=4 addr=140.200.128.13:53
+ 31710100 00010000 00000000 026e7309 73656375 72656e65 74036e65 74026e7a
+ 00000100 01.
+ sendto=37
+ +0.001511
+ sendto fd=4 addr=140.200.128.13:53
+ 31720100 00010000 00000000 14707269 76617465 696e7665 73746967 6174696f
+ 6e02636f 026e7a00 00010001.
+ sendto=44
+ +0.001585
+ sendto fd=4 addr=140.200.128.13:53
+ 31730100 00010000 00000000 026e7314 70726976 61746569 6e766573 74696761
+ 74696f6e 02636f02 6e7a0000 010001.
+ sendto=47
+ +0.001571
+ sendto fd=4 addr=140.200.128.13:53
+ 31740100 00010000 00000000 06657472 61646502 636f026e 7a000001 0001.
+ sendto=30
+ +0.001459
+ sendto fd=4 addr=140.200.128.13:53
+ 31750100 00010000 00000000 026e7315 73706563 69616c69 6e766573 74696761
+ 74696f6e 7302636f 026e7a00 00010001.
+ sendto=48
+ +0.001537
+ sendto fd=4 addr=140.200.128.13:53
+ 31760100 00010000 00000000 046d6169 6c06616e 73657474 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001466
+ sendto fd=4 addr=140.200.128.13:53
+ 31770100 00010000 00000000 03667470 07776172 72656e74 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001485
+ sendto fd=4 addr=140.200.128.13:53
+ 31780100 00010000 00000000 026e730e 72657461 696c7365 63757269 74790263
+ 6f026e7a 00000100 01.
+ sendto=41
+ +0.001528
+ sendto fd=4 addr=140.200.128.13:53
+ 31790100 00010000 00000000 046d6169 6c127365 63757269 74796d61 6e616765
+ 6d656e74 02636f02 6e7a0000 010001.
+ sendto=47
+ +0.001593
+ sendto fd=4 addr=140.200.128.13:53
+ 317a0100 00010000 00000000 026e7305 6d616769 6302636f 026e7a00 00010001.
+ sendto=32
+ +0.001465
+ sendto fd=4 addr=140.200.128.13:53
+ 317b0100 00010000 00000000 046d6169 6c09666f 72656672 6f6e7402 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001473
+ sendto fd=4 addr=140.200.128.13:53
+ 317c0100 00010000 00000000 046d6169 6c0a7365 63757269 63617264 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001525
+ sendto fd=4 addr=140.200.128.13:53
+ 317d0100 00010000 00000000 0a736563 75726963 61726402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001499
+ sendto fd=4 addr=140.200.128.13:53
+ 317e0100 00010000 00000000 026e7309 6e7a6465 7369676e 7302636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001489
+ sendto fd=4 addr=140.200.128.13:53
+ 317f0100 00010000 00000000 05736166 65730263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001441
+ sendto fd=4 addr=140.200.128.13:53
+ 31800100 00010000 00000000 026e7309 73656c65 63746976 6502636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001542
+ sendto fd=4 addr=140.200.128.13:53
+ 31810100 00010000 00000000 09666f72 6566726f 6e740263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001473
+ sendto fd=4 addr=140.200.128.13:53
+ 31820100 00010000 00000000 12736563 75726974 796d616e 6167656d 656e7402
+ 636f026e 7a000001 0001.
+ sendto=42
+ +0.001525
+ sendto fd=4 addr=140.200.128.13:53
+ 31830100 00010000 00000000 09756e64 6572686f 75720263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001469
+ sendto fd=4 addr=140.200.128.13:53
+ 31840100 00010000 00000000 09736563 7572656e 6574036e 6574026e 7a000001
+ 0001.
+ sendto=34
+ +0.001535
+ sendto fd=4 addr=140.200.128.13:53
+ 31850100 00010000 00000000 046d6169 6c157370 65636961 6c696e76 65737469
+ 67617469 6f6e7302 636f026e 7a000001 0001.
+ sendto=50
+ +0.001597
+ sendto fd=4 addr=140.200.128.13:53
+ 31860100 00010000 00000000 096e7a64 65736967 6e730263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001526
+ sendto fd=4 addr=140.200.128.13:53
+ 31870100 00010000 00000000 026e7306 65747261 64650263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001451
+ sendto fd=4 addr=140.200.128.13:53
+ 31880100 00010000 00000000 046d6169 6c056e7a 69706903 6f726702 6e7a0000
+ 010001.
+ sendto=35
+ +0.001513
+ sendto fd=4 addr=140.200.128.13:53
+ 31890100 00010000 00000000 046d6169 6c09756e 64657268 6f757202 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001508
+ sendto fd=4 addr=140.200.128.13:53
+ 318a0100 00010000 00000000 026e7304 61736973 036f7267 026e7a00 00010001.
+ sendto=32
+ +0.001491
+ sendto fd=4 addr=140.200.128.13:53
+ 318b0100 00010000 00000000 026e7308 626f7571 75657473 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001507
+ sendto fd=4 addr=140.200.128.13:53
+ 318c0100 00010000 00000000 05616761 74650263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001445
+ read fd=5 buflen=2433
+ read=EAGAIN
+ +0.000151
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.866584
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-544428
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31308500 00010001 00020002 05746574 72610263 6f026e7a 00000100 01c00c00
+ 01000100 01518000 04cb6300 fec00c00 02000100 01518000 05026e73 c00cc00c
+ 00020001 00015180 0013036e 73310777 61696b61 746f0261 63026e7a 00c03900
+ 01000100 01518000 04cb6300 fec04a00 01000100 01518000 048cc880 0d.
+ +0.000996
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000668
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.409348
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038307
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31318500 00010001 00020002 046d6169 6c056167 61746502 636f026e 7a000001
+ 0001c00c 00010001 00015180 0004cb63 00fe0561 67617465 02636f02 6e7a0000
+ 02000100 01518000 11036e73 31077761 696b6174 6f026163 c03bc032 00020001
+ 00015180 0005026e 73c032c0 49000100 01000151 8000048c c8800dc0 66000100
+ 01000151 800004cb 6300fe.
+ +0.000984
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000506
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.369551
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.048503
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 312f8500 00010001 00020002 026e7308 73656375 72697479 02636f02 6e7a0000
+ 010001c0 0c000100 01000151 800004cb 6300fe08 73656375 72697479 02636f02
+ 6e7a0000 02000100 01518000 11036e73 31077761 696b6174 6f026163 c03fc033
+ 00020001 00015180 0002c00c c04d0001 00010001 51800004 8cc8800d c00c0001
+ 00010001 51800004 cb6300fe.
+ +0.000997
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000452
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.319599
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038521
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31348500 00010001 00020002 026e730a 67696674 6261736b 65740263 6f026e7a
+ 00000100 01c00c00 01000100 01518000 04cb6300 fe0a6769 66746261 736b6574
+ 02636f02 6e7a0000 02000100 01518000 11036e73 31077761 696b6174 6f026163
+ c043c035 00020001 00015180 0002c00c c0510001 00010001 51800004 8cc8800d
+ c00c0001 00010001 51800004 cb6300fe.
+ +0.001008
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000490
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.279580
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.048476
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31358500 00010001 00020002 026e7308 73656375 72697479 0367656e 026e7a00
+ 00010001 c00c0001 00010001 51800004 cb6300fe 08736563 75726974 79036765
+ 6e026e7a 00000200 01000151 80001103 6e733107 7761696b 61746f02 6163c041
+ c0340002 00010001 51800002 c00cc04f 00010001 00015180 00048cc8 800dc00c
+ 00010001 00015180 0004cb63 00fe.
+ +0.000998
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000439
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.229667
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038524
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31368500 00010001 00020002 07626f75 71756574 02636f02 6e7a0000 010001c0
+ 0c000100 01000151 800004cb 6300fec0 0c000200 01000151 80000502 6e73c00c
+ c00c0002 00010001 51800013 036e7331 07776169 6b61746f 02616302 6e7a00c0
+ 3b000100 01000151 800004cb 6300fec0 4c000100 01000151 8000048c c8800d.
+ +0.000911
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000464
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.189768
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038708
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31328500 00010001 00020002 026e7305 61676174 6502636f 026e7a00 00010001
+ c00c0001 00010001 51800004 cb6300fe 05616761 74650263 6f026e7a 00000200
+ 01000151 80001103 6e733107 7761696b 61746f02 6163c039 c0300002 00010001
+ 51800002 c00cc047 00010001 00015180 00048cc8 800dc00c 00010001 00015180
+ 0004cb63 00fe.
+ +0.000951
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000436
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.149673
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.048494
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31338500 00010001 00020002 10736563 75726974 79747261 696e696e 6702636f
+ 026e7a00 00010001 c00c0001 00010001 51800004 cb6300fe c00c0002 00010001
+ 51800005 026e73c0 0cc00c00 02000100 01518000 13036e73 31077761 696b6174
+ 6f026163 026e7a00 c0440001 00010001 51800004 cb6300fe c0550001 00010001
+ 51800004 8cc8800d.
+ +0.000991
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000442
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.099746
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038540
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31378500 00010001 00020002 0d696e76 65737469 67617469 6f6e0263 6f026e7a
+ 00000100 01c00c00 01000100 01518000 04cb6300 fec00c00 02000100 01518000
+ 05026e73 c00cc00c 00020001 00015180 0013036e 73310777 61696b61 746f0261
+ 63026e7a 00c04100 01000100 01518000 04cb6300 fec05200 01000100 01518000
+ 048cc880 0d.
+ +0.000944
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000437
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.059825
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038599
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 31388500 00010001 00020002 026e7305 6e7a6970 69036f72 67026e7a 00000100
+ 01c00c00 01000100 01518000 04cb6300 fe056e7a 69706903 6f726702 6e7a0000
+ 02000100 01518000 11036e73 31077761 696b6174 6f026163 c03bc031 00020001
+ 00015180 0002c00c c0490001 00010001 51800004 8cc8800d c00c0001 00010001
+ 51800004 cb6300fe.
+ +0.000960
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000445
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.019821
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.048560
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 313a8500 00010001 00020002 08736563 75726974 7902636f 026e7a00 00010001
+ c00c0001 00010001 51800004 cb6300fe c00c0002 00010001 51800013 036e7331
+ 07776169 6b61746f 02616302 6e7a00c0 0c000200 01000151 80000502 6e73c00c
+ c03c0001 00010001 51800004 8cc8800d c05b0001 00010001 51800004 cb6300fe.
+ +0.000913
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000471
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.969877
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.028575
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=140.200.128.13:53
+ 313b8503 00010000 00010000 026e730a 73746f72 65776174 63680263 6f026e7a
+ 00000100 0102636f 026e7a00 00060001 00015180 002c046e 73393907 7761696b
+ 61746f02 6163c028 03736f61 c03b7727 6ec50000 0e100000 07080027 8d000001
+ 5180.
+ +0.000739
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.023574
+ close fd=4
+ close=OK
+ +0.000464
+ close fd=5
+ close=OK
+ +0.000179
diff --git a/regress/case-manyptrwrongrst.err b/regress/case-manyptrwrongrst.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-manyptrwrongrst.err
diff --git a/regress/case-manyptrwrongrst.out b/regress/case-manyptrwrongrst.out
new file mode 100644
index 0000000..450b07d
--- /dev/null
+++ b/regress/case-manyptrwrongrst.out
@@ -0,0 +1,132 @@
+adns debug: using nameserver 172.18.45.6
+254.0.99.203.in-addr.arpa flags 292 type 1 A(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 2 NS(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 5 CNAME(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 6 SOA(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 12 PTR(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 13 HINFO(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 15 MX(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 16 TXT(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 17 RP(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65537 A(addr) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65538 NS(+addr) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65548 PTR(checked) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65551 MX(+addr) submitted
+254.0.99.203.in-addr.arpa flags 292 type 131078 SOA(822) submitted
+254.0.99.203.in-addr.arpa flags 292 type 131089 RP(822) submitted
+254.0.99.203.in-addr.arpa flags 292 type A(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=162
+254.0.99.203.in-addr.arpa flags 292 type NS(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type CNAME(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type HINFO(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type A(addr): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=162
+254.0.99.203.in-addr.arpa flags 292 type TXT(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=162
+254.0.99.203.in-addr.arpa flags 292 type SOA(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+254.0.99.203.in-addr.arpa flags 292 type MX(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+adns debug: reply not found, id 312a, query owner 254.0.99.203.in-addr.arpa (NS=172.18.45.6)
+254.0.99.203.in-addr.arpa flags 292 type NS(+addr): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=600
+254.0.99.203.in-addr.arpa flags 292 type MX(+addr): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=600
+254.0.99.203.in-addr.arpa flags 292 type SOA(822): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=600
+adns debug: reply not found, id 312c, query owner 254.0.99.203.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312d, query owner 254.0.99.203.in-addr.arpa (NS=172.18.45.6)
+254.0.99.203.in-addr.arpa flags 292 type RP(822): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+adns debug: reply not found, id 312e, query owner 254.0.99.203.in-addr.arpa (NS=172.18.45.6)
+254.0.99.203.in-addr.arpa flags 292 type RP(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=598
+adns debug: TCP connected (NS=172.18.45.6)
+adns debug: reply not found, id 312b, query owner 254.0.99.203.in-addr.arpa (NS=172.18.45.6)
+254.0.99.203.in-addr.arpa flags 292 type PTR(raw): OK; nrrs=94; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=20169
+ ns.security.co.nz
+ tetra.co.nz
+ mail.agate.co.nz
+ ns.agate.co.nz
+ securitytraining.co.nz
+ ns.giftbasket.co.nz
+ ns.security.gen.nz
+ bouquet.co.nz
+ investigation.co.nz
+ ns.nzipi.org.nz
+ mail.neru.co.nz
+ security.co.nz
+ ns.storewatch.co.nz
+ security.gen.nz
+ ns.tetra.co.nz
+ mail.tetra.co.nz
+ ns.securicard.co.nz
+ ns.underhour.co.nz
+ bcc.co.nz
+ security.org.nz
+ burglaralarms.co.nz
+ ns.safes.co.nz
+ ns.security.org.nz
+ couperconsulting.co.nz
+ securityguards.co.nz
+ ns.guards.co.nz
+ asis.org.nz
+ neru.co.nz
+ giftbasket.co.nz
+ magic.co.nz
+ mail.bcc.co.nz
+ ns.investigation.co.nz
+ nzipi.org.nz
+ ns.bouquet.co.nz
+ mail.safes.co.nz
+ ns.bcc.co.nz
+ ns.burglaralarms.co.nz
+ ns.securityguards.co.nz
+ covertcameras.co.nz
+ ns.neru.co.nz
+ ns.covertcameras.co.nz
+ bouquets.co.nz
+ concentric.co.nz
+ ns.securitytraining.co.nz
+ mail.couperconsulting.co.nz
+ retailsecurity.co.nz
+ ns.concentric.co.nz
+ mail.magic.co.nz
+ nzangling.co.nz
+ ns.couperconsulting.co.nz
+ ns.nzangling.co.nz
+ mail.storewatch.co.nz
+ swift.co.nz
+ mail.selective.co.nz
+ ns.forefront.co.nz
+ mail.nzangling.co.nz
+ guards.co.nz
+ mail.nzdesigns.co.nz
+ storewatch.co.nz
+ ns.securitymanagement.co.nz
+ mail.woolworths.co.nz
+ mail.concentric.co.nz
+ selective.co.nz
+ specialinvestigations.co.nz
+ ns.swift.co.nz
+ mail.swift.co.nz
+ ns.securenet.net.nz
+ privateinvestigation.co.nz
+ ns.privateinvestigation.co.nz
+ etrade.co.nz
+ ns.specialinvestigations.co.nz
+ mail.ansett.co.nz
+ ftp.warrent.co.nz
+ ns.retailsecurity.co.nz
+ mail.securitymanagement.co.nz
+ ns.magic.co.nz
+ mail.forefront.co.nz
+ mail.securicard.co.nz
+ securicard.co.nz
+ ns.nzdesigns.co.nz
+ safes.co.nz
+ ns.selective.co.nz
+ forefront.co.nz
+ securitymanagement.co.nz
+ underhour.co.nz
+ securenet.net.nz
+ mail.specialinvestigations.co.nz
+ nzdesigns.co.nz
+ ns.etrade.co.nz
+ mail.nzipi.org.nz
+ mail.underhour.co.nz
+ ns.asis.org.nz
+ ns.bouquets.co.nz
+ agate.co.nz
+254.0.99.203.in-addr.arpa flags 292 type PTR(checked): Inconsistent resource records in DNS; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=20167
+rc=0
diff --git a/regress/case-manyptrwrongrst.sys b/regress/case-manyptrwrongrst.sys
new file mode 100644
index 0000000..80e8381
--- /dev/null
+++ b/regress/case-manyptrwrongrst.sys
@@ -0,0 +1,1215 @@
+adnstest default -0x400
+292/254.0.99.203.in-addr.arpa
+ start 933289772.727140
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000265
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000089
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000067
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.004394
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.003204
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.003203
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.003315
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.003207
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0d0001.
+ sendto=43
+ +0.003263
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.003208
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 100001.
+ sendto=43
+ +0.003221
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.003221
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.003315
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.003215
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.003247
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.003252
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.003368
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.003230
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.950137
+ select=1 rfds=[4] wfds=[] efds=[]
+ +2.-643984
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 01000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 00a2002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.001188
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000472
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.596855
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.176497
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 02000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000885
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000392
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.422285
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.049249
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 05000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.001133
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000450
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.374656
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.026086
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0d000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000914
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000411
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.347245
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.041288
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 01000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 00a2002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000882
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000437
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.304638
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.035548
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 10000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 00a2002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.001120
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000442
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.267528
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038130
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 06000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.001107
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000697
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.230909
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.088915
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000881
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000428
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.140685
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.149669
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.002605
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.001310
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.007369
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.002868
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.002427
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.004373
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.002425
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.002419
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005328
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.002641
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.000001
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 02000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 0258002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000001
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 02000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 0258002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000001
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.002664
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.964877
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003669
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 0258002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000882
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 06000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 0258002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.003257
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000436
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.956633
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.015305
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 0258002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.001159
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000349
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.939820
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038251
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 06000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 0258002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000880
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000323
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.900366
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039069
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 11000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000881
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000448
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.859968
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-420413
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 11000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 0257002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000922
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000399
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.279060
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.176624
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 11000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 0256002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000917
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000466
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.101053
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.100567
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000486
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009988
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001186
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008955
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008816
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000139
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009991
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001137
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.978870
+ select=1 rfds=[4] wfds=[] efds=[]
+ +2.-569657
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238380 00010013 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 0100004e cb001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 00004ecb 00080574 65747261 c043c00c
+ 000c0001 00004ecb 000d046d 61696c05 61676174 65c043c0 0c000c00 0100004e
+ cb000502 6e73c06f c00c000c 00010000 4ecb0013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 0100004e cb001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 0100004e cb001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 004ecb00 0a07626f 75717565 74c043c0 0c000c00 0100004e
+ cb00100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 0100004e cb000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 00004ecb 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 00004ecb 0002c03a c00c000c 00010000 4ecb0010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010000 4ecb0002 c0d2c00c
+ 000c0001 00004ecb 0005026e 73c056c0 0c000c00 0100004e cb000704 6d61696c
+ c056c00c 000c0001 00004ecb 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 00004ecb 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 004ecb00 06036263 63c043.
+ +0.003463
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.001488
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000076
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000067
+ connect fd=5 addr=172.18.45.6:53
+ connect=EINPROGRESS
+ +0.000978
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000143
+ select max=6 rfds=[4] wfds=[5] efds=[] to=0.562305
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.001347
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000274
+ write fd=5
+ 002b3123 01000001 00000000 00000332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.001176
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.559508
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.559030
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.000478
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010029
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001273
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.998727
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.140762
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8380 00010013 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 0100004e ca001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 00004eca 00080574 65747261 c043c00c
+ 000c0001 00004eca 000d046d 61696c05 61676174 65c043c0 0c000c00 0100004e
+ ca000502 6e73c06f c00c000c 00010000 4eca0013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 0100004e ca001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 0100004e ca001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 004eca00 0a07626f 75717565 74c043c0 0c000c00 0100004e
+ ca00100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 0100004e ca000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 00004eca 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 00004eca 0002c03a c00c000c 00010000 4eca0010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010000 4eca0002 c0d2c00c
+ 000c0001 00004eca 0005026e 73c056c0 0c000c00 0100004e ca000704 6d61696c
+ c056c00c 000c0001 00004eca 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 00004eca 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 004eca00 06036263 63c043.
+ +0.003063
+ write fd=5
+ 002b312b 01000001 00000000 00000332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.001448
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000169
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.275214
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-921124
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8380 00010013 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 0100004e ca001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 00004eca 00080574 65747261 c043c00c
+ 000c0001 00004eca 000d046d 61696c05 61676174 65c043c0 0c000c00 0100004e
+ ca000502 6e73c06f c00c000c 00010000 4eca0013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 0100004e ca001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 0100004e ca001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 004eca00 0a07626f 75717565 74c043c0 0c000c00 0100004e
+ ca00100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 0100004e ca000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 00004eca 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 00004eca 0002c03a c00c000c 00010000 4eca0010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010000 4eca0002 c0d2c00c
+ 000c0001 00004eca 0005026e 73c056c0 0c000c00 0100004e ca000704 6d61696c
+ c056c00c 000c0001 00004eca 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 00004eca 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 004eca00 06036263 63c043.
+ +0.003054
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000483
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.192801
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.817055
+ read fd=5 buflen=2
+ read=OK
+ 096f.
+ +0.000391
+ read fd=5 buflen=2415
+ read=OK
+ 31238180 0001005e 00020001 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 0100004e c9001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 00004ec9 00080574 65747261 c043c00c
+ 000c0001 00004ec9 000d046d 61696c05 61676174 65c043c0 0c000c00 0100004e
+ c9000502 6e73c06f c00c000c 00010000 4ec90013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 0100004e c9001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 0100004e c9001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 004ec900 0a07626f 75717565 74c043c0 0c000c00 0100004e
+ c900100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 0100004e c9000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 00004ec9 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 00004ec9 0002c03a c00c000c 00010000 4ec90010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010000 4ec90002 c0d2c00c
+ 000c0001 00004ec9 0005026e 73c056c0 0c000c00 0100004e c9000704 6d61696c
+ c056c00c 000c0001 00004ec9 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 00004ec9 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 004ec900 06036263 63c043c0 0c000c00 0100004e c9000b08 73656375 72697479
+ c128c00c 000c0001 00004ec9 00100d62 7572676c 6172616c 61726d73 c043c00c
+ 000c0001 00004ec9 000b026e 73057361 666573c0 43c00c00 0c000100 004ec900
+ 05026e73 c1f7c00c 000c0001 00004ec9 00131063 6f757065 72636f6e 73756c74
+ 696e67c0 43c00c00 0c000100 004ec900 110e7365 63757269 74796775 61726473
+ c043c00c 000c0001 00004ec9 000c026e 73066775 61726473 c043c00c 000c0001
+ 00004ec9 00070461 736973c1 28c00c00 0c000100 004ec900 02c13fc0 0c000c00
+ 0100004e c90002c0 b6c00c00 0c000100 004ec900 08056d61 676963c0 43c00c00
+ 0c000100 004ec900 07046d61 696cc1e5 c00c000c 00010000 4ec90005 026e73c1
+ 03c00c00 0c000100 004ec900 02c122c0 0c000c00 0100004e c9000502 6e73c0ed
+ c00c000c 00010000 4ec90007 046d6169 6cc22dc0 0c000c00 0100004e c9000502
+ 6e73c1e5 c00c000c 00010000 4ec90005 026e73c2 0ec00c00 0c000100 004ec900
+ 05026e73 c271c00c 000c0001 00004ec9 00100d63 6f766572 7463616d 65726173
+ c043c00c 000c0001 00004ec9 0005026e 73c13fc0 0c000c00 0100004e c9001302
+ 6e730d63 6f766572 7463616d 65726173 c043c00c 000c0001 00004ec9 000b0862
+ 6f757175 657473c0 43c00c00 0c000100 004ec900 0d0a636f 6e63656e 74726963
+ c043c00c 000c0001 00004ec9 0005026e 73c094c0 0c000c00 0100004e c9000704
+ 6d61696c c252c00c 000c0001 00004ec9 00110e72 65746169 6c736563 75726974
+ 79c043c0 0c000c00 0100004e c9001002 6e730a63 6f6e6365 6e747269 63c043c0
+ 0c000c00 0100004e c9000d04 6d61696c 056d6167 6963c043 c00c000c 00010000
+ 4ec9000c 096e7a61 6e676c69 6e67c043 c00c000c 00010000 4ec90005 026e73c2
+ 52c00c00 0c000100 004ec900 0f026e73 096e7a61 6e676c69 6e67c043 c00c000c
+ 00010000 4ec90007 046d6169 6cc163c0 0c000c00 0100004e c9000805 73776966
+ 74c043c0 0c000c00 0100004e c9001104 6d61696c 0973656c 65637469 7665c043
+ c00c000c 00010000 4ec9000f 026e7309 666f7265 66726f6e 74c043c0 0c000c00
+ 0100004e c9001104 6d61696c 096e7a61 6e676c69 6e67c043 c00c000c 00010000
+ 4ec90009 06677561 726473c0 43c00c00 0c000100 004ec900 11046d61 696c096e
+ 7a646573 69676e73 c043c00c 000c0001 00004ec9 0002c163 c00c000c 00010000
+ 4ec90018 026e7312 73656375 72697479 6d616e61 67656d65 6e74c043 c00c000c
+ 00010000 4ec90012 046d6169 6c0a776f 6f6c776f 72746873 c043c00c 000c0001
+ 00004ec9 0012046d 61696c0a 636f6e63 656e.
+ +0.010287
+ read fd=5 buflen=957
+ read=OK
+ 74726963 c043c00c 000c0001 00004ec9 000c0973 656c6563 74697665 c043c00c
+ 000c0001 00004ec9 00181573 70656369 616c696e 76657374 69676174 696f6e73
+ c043c00c 000c0001 00004ec9 000b026e 73057377 696674c0 43c00c00 0c000100
+ 004ec900 0d046d61 696c0573 77696674 c043c00c 000c0001 00004ec9 0013026e
+ 73097365 63757265 6e657403 6e6574c0 46c00c00 0c000100 004ec900 17147072
+ 69766174 65696e76 65737469 67617469 6f6ec043 c00c000c 00010000 4ec9001a
+ 026e7314 70726976 61746569 6e766573 74696761 74696f6e c043c00c 000c0001
+ 00004ec9 00090665 74726164 65c043c0 0c000c00 0100004e c9001b02 6e731573
+ 70656369 616c696e 76657374 69676174 696f6e73 c043c00c 000c0001 00004ec9
+ 000e046d 61696c06 616e7365 7474c043 c00c000c 00010000 4ec9000e 03667470
+ 07776172 72656e74 c043c00c 000c0001 00004ec9 0014026e 730e7265 7461696c
+ 73656375 72697479 c043c00c 000c0001 00004ec9 001a046d 61696c12 73656375
+ 72697479 6d616e61 67656d65 6e74c043 c00c000c 00010000 4ec9000b 026e7305
+ 6d616769 63c043c0 0c000c00 0100004e c9001104 6d61696c 09666f72 6566726f
+ 6e74c043 c00c000c 00010000 4ec90007 046d6169 6cc1b1c0 0c000c00 0100004e
+ c90002c1 b1c00c00 0c000100 004ec900 0f026e73 096e7a64 65736967 6e73c043
+ c00c000c 00010000 4ec90002 c22dc00c 000c0001 00004ec9 000f026e 73097365
+ 6c656374 697665c0 43c00c00 0c000100 004ec900 0c09666f 72656672 6f6e74c0
+ 43c00c00 0c000100 004ec900 15127365 63757269 74796d61 6e616765 6d656e74
+ c043c00c 000c0001 00004ec9 0002c1cd c00c000c 00010000 4ec90010 09736563
+ 7572656e 6574036e 6574c046 c00c000c 00010000 4ec9001d 046d6169 6c157370
+ 65636961 6c696e76 65737469 67617469 6f6e73c0 43c00c00 0c000100 004ec900
+ 0c096e7a 64657369 676e73c0 43c00c00 0c000100 004ec900 0c026e73 06657472
+ 616465c0 43c00c00 0c000100 004ec900 07046d61 696cc122 c00c000c 00010000
+ 4ec90007 046d6169 6cc1cdc0 0c000c00 0100004e c9000a02 6e730461 736973c1
+ 28c00c00 0c000100 004ec900 0e026e73 08626f75 71756574 73c043c0 0c000c00
+ 0100004e c90002c0 6f013002 39390332 30330769 6e2d6164 64720461 72706100
+ 00020001 000545fc 0002c037 01300239 39033230 3307696e 2d616464 72046172
+ 70610000 02000100 0545fc00 11036e73 31077761 696b6174 6f026163 c046036e
+ 73310777 61696b61 746f0261 63c04600 01000100 02a30000 048cc880 0d.
+ +0.005913
+ read fd=5 buflen=2417
+ read=EAGAIN
+ +0.019409
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.059852
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.028945
+ read fd=5 buflen=2417
+ read=OK
+ 096f312b 81800001 005e0002 00010332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 004ec900 13026e73 08736563
+ 75726974 7902636f 026e7a00 c00c000c 00010000 4ec90008 05746574 7261c043
+ c00c000c 00010000 4ec9000d 046d6169 6c056167 617465c0 43c00c00 0c000100
+ 004ec900 05026e73 c06fc00c 000c0001 00004ec9 00131073 65637572 69747974
+ 7261696e 696e67c0 43c00c00 0c000100 004ec900 10026e73 0a676966 74626173
+ 6b6574c0 43c00c00 0c000100 004ec900 12026e73 08736563 75726974 79036765
+ 6ec046c0 0c000c00 0100004e c9000a07 626f7571 756574c0 43c00c00 0c000100
+ 004ec900 100d696e 76657374 69676174 696f6ec0 43c00c00 0c000100 004ec900
+ 0f026e73 056e7a69 7069036f 7267c046 c00c000c 00010000 4ec9000c 046d6169
+ 6c046e65 7275c043 c00c000c 00010000 4ec90002 c03ac00c 000c0001 00004ec9
+ 0010026e 730a7374 6f726577 61746368 c043c00c 000c0001 00004ec9 0002c0d2
+ c00c000c 00010000 4ec90005 026e73c0 56c00c00 0c000100 004ec900 07046d61
+ 696cc056 c00c000c 00010000 4ec90010 026e730a 73656375 72696361 7264c043
+ c00c000c 00010000 4ec9000f 026e7309 756e6465 72686f75 72c043c0 0c000c00
+ 0100004e c9000603 626363c0 43c00c00 0c000100 004ec900 0b087365 63757269
+ 7479c128 c00c000c 00010000 4ec90010 0d627572 676c6172 616c6172 6d73c043
+ c00c000c 00010000 4ec9000b 026e7305 73616665 73c043c0 0c000c00 0100004e
+ c9000502 6e73c1f7 c00c000c 00010000 4ec90013 10636f75 70657263 6f6e7375
+ 6c74696e 67c043c0 0c000c00 0100004e c900110e 73656375 72697479 67756172
+ 6473c043 c00c000c 00010000 4ec9000c 026e7306 67756172 6473c043 c00c000c
+ 00010000 4ec90007 04617369 73c128c0 0c000c00 0100004e c90002c1 3fc00c00
+ 0c000100 004ec900 02c0b6c0 0c000c00 0100004e c9000805 6d616769 63c043c0
+ 0c000c00 0100004e c9000704 6d61696c c1e5c00c 000c0001 00004ec9 0005026e
+ 73c103c0 0c000c00 0100004e c90002c1 22c00c00 0c000100 004ec900 05026e73
+ c0edc00c 000c0001 00004ec9 0007046d 61696cc2 2dc00c00 0c000100 004ec900
+ 05026e73 c1e5c00c 000c0001 00004ec9 0005026e 73c20ec0 0c000c00 0100004e
+ c9000502 6e73c271 c00c000c 00010000 4ec90010 0d636f76 65727463 616d6572
+ 6173c043 c00c000c 00010000 4ec90005 026e73c1 3fc00c00 0c000100 004ec900
+ 13026e73 0d636f76 65727463 616d6572 6173c043 c00c000c 00010000 4ec9000b
+ 08626f75 71756574 73c043c0 0c000c00 0100004e c9000d0a 636f6e63 656e7472
+ 6963c043 c00c000c 00010000 4ec90005 026e73c0 94c00c00 0c000100 004ec900
+ 07046d61 696cc252 c00c000c 00010000 4ec90011 0e726574 61696c73 65637572
+ 697479c0 43c00c00 0c000100 004ec900 10026e73 0a636f6e 63656e74 726963c0
+ 43c00c00 0c000100 004ec900 0d046d61 696c056d 61676963 c043c00c 000c0001
+ 00004ec9 000c096e 7a616e67 6c696e67 c043c00c 000c0001 00004ec9 0005026e
+ 73c252c0 0c000c00 0100004e c9000f02 6e73096e 7a616e67 6c696e67 c043c00c
+ 000c0001 00004ec9 0007046d 61696cc1 63c00c00 0c000100 004ec900 08057377
+ 696674c0 43c00c00 0c000100 004ec900 11046d61 696c0973 656c6563 74697665
+ c043c00c 000c0001 00004ec9 000f026e 7309666f 72656672 6f6e74c0 43c00c00
+ 0c000100 004ec900 11046d61 696c096e 7a616e67 6c696e67 c043c00c 000c0001
+ 00004ec9 00090667 75617264 73c043c0 0c000c00 0100004e c9001104 6d61696c
+ 096e7a64 65736967 6e73c043 c00c000c 00010000 4ec90002 c163c00c 000c0001
+ 00004ec9 0018026e 73127365 63757269 74796d61 6e616765 6d656e74 c043c00c
+ 000c0001 00004ec9 0012046d 61696c0a 776f6f6c 776f7274 6873c043 c00c000c
+ 00010000 4ec90012 046d6169 6c0a636f 6e63656e.
+ +0.008722
+ read fd=5 buflen=957
+ read=EAGAIN
+ +0.000264
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.021921
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.063001
+ read fd=5 buflen=957
+ read=OK
+ 74726963 c043c00c 000c0001 00004ec9 000c0973 656c6563 74697665 c043c00c
+ 000c0001 00004ec9 00181573 70656369 616c696e 76657374 69676174 696f6e73
+ c043c00c 000c0001 00004ec9 000b026e 73057377 696674c0 43c00c00 0c000100
+ 004ec900 0d046d61 696c0573 77696674 c043c00c 000c0001 00004ec9 0013026e
+ 73097365 63757265 6e657403 6e6574c0 46c00c00 0c000100 004ec900 17147072
+ 69766174 65696e76 65737469 67617469 6f6ec043 c00c000c 00010000 4ec9001a
+ 026e7314 70726976 61746569 6e766573 74696761 74696f6e c043c00c 000c0001
+ 00004ec9 00090665 74726164 65c043c0 0c000c00 0100004e c9001b02 6e731573
+ 70656369 616c696e 76657374 69676174 696f6e73 c043c00c 000c0001 00004ec9
+ 000e046d 61696c06 616e7365 7474c043 c00c000c 00010000 4ec9000e 03667470
+ 07776172 72656e74 c043c00c 000c0001 00004ec9 0014026e 730e7265 7461696c
+ 73656375 72697479 c043c00c 000c0001 00004ec9 001a046d 61696c12 73656375
+ 72697479 6d616e61 67656d65 6e74c043 c00c000c 00010000 4ec9000b 026e7305
+ 6d616769 63c043c0 0c000c00 0100004e c9001104 6d61696c 09666f72 6566726f
+ 6e74c043 c00c000c 00010000 4ec90007 046d6169 6cc1b1c0 0c000c00 0100004e
+ c90002c1 b1c00c00 0c000100 004ec900 0f026e73 096e7a64 65736967 6e73c043
+ c00c000c 00010000 4ec90002 c22dc00c 000c0001 00004ec9 000f026e 73097365
+ 6c656374 697665c0 43c00c00 0c000100 004ec900 0c09666f 72656672 6f6e74c0
+ 43c00c00 0c000100 004ec900 15127365 63757269 74796d61 6e616765 6d656e74
+ c043c00c 000c0001 00004ec9 0002c1cd c00c000c 00010000 4ec90010 09736563
+ 7572656e 6574036e 6574c046 c00c000c 00010000 4ec9001d 046d6169 6c157370
+ 65636961 6c696e76 65737469 67617469 6f6e73c0 43c00c00 0c000100 004ec900
+ 0c096e7a 64657369 676e73c0 43c00c00 0c000100 004ec900 0c026e73 06657472
+ 616465c0 43c00c00 0c000100 004ec900 07046d61 696cc122 c00c000c 00010000
+ 4ec90007 046d6169 6cc1cdc0 0c000c00 0100004e c9000a02 6e730461 736973c1
+ 28c00c00 0c000100 004ec900 0e026e73 08626f75 71756574 73c043c0 0c000c00
+ 0100004e c90002c0 6f013002 39390332 30330769 6e2d6164 64720461 72706100
+ 00020001 000545fc 0002c037 01300239 39033230 3307696e 2d616464 72046172
+ 70610000 02000100 0545fc00 11036e73 31077761 696b6174 6f026163 c046036e
+ 73310777 61696b61 746f0261 63c04600 01000100 02a30000 048cc880 0d.
+ +0.005816
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 026e7308 73656375 72697479 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.002957
+ sendto fd=4 addr=172.18.45.6:53
+ 31300100 00010000 00000000 05746574 72610263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001178
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 046d6169 6c056167 61746502 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001193
+ sendto fd=4 addr=172.18.45.6:53
+ 31320100 00010000 00000000 026e7305 61676174 6502636f 026e7a00 00010001.
+ sendto=32
+ +0.001166
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 10736563 75726974 79747261 696e696e 6702636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001265
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 026e730a 67696674 6261736b 65740263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001219
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 026e7308 73656375 72697479 0367656e 026e7a00
+ 00010001.
+ sendto=36
+ +0.001212
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 07626f75 71756574 02636f02 6e7a0000 010001.
+ sendto=31
+ +0.001210
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 0d696e76 65737469 67617469 6f6e0263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001220
+ sendto fd=4 addr=172.18.45.6:53
+ 31380100 00010000 00000000 026e7305 6e7a6970 69036f72 67026e7a 00000100
+ 01.
+ sendto=33
+ +0.001203
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 046d6169 6c046e65 72750263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001223
+ sendto fd=4 addr=172.18.45.6:53
+ 313a0100 00010000 00000000 08736563 75726974 7902636f 026e7a00 00010001.
+ sendto=32
+ +0.001251
+ sendto fd=4 addr=172.18.45.6:53
+ 313b0100 00010000 00000000 026e730a 73746f72 65776174 63680263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001242
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 08736563 75726974 79036765 6e026e7a 00000100
+ 01.
+ sendto=33
+ +0.001165
+ sendto fd=4 addr=172.18.45.6:53
+ 313d0100 00010000 00000000 026e7305 74657472 6102636f 026e7a00 00010001.
+ sendto=32
+ +0.001208
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 046d6169 6c057465 74726102 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001212
+ sendto fd=4 addr=172.18.45.6:53
+ 313f0100 00010000 00000000 026e730a 73656375 72696361 72640263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +1.-998781
+ sendto fd=4 addr=172.18.45.6:53
+ 31400100 00010000 00000000 026e7309 756e6465 72686f75 7202636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001202
+ sendto fd=4 addr=172.18.45.6:53
+ 31410100 00010000 00000000 03626363 02636f02 6e7a0000 010001.
+ sendto=27
+ +0.001186
+ sendto fd=4 addr=172.18.45.6:53
+ 31420100 00010000 00000000 08736563 75726974 79036f72 67026e7a 00000100
+ 01.
+ sendto=33
+ +0.001192
+ sendto fd=4 addr=172.18.45.6:53
+ 31430100 00010000 00000000 0d627572 676c6172 616c6172 6d730263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001520
+ sendto fd=4 addr=172.18.45.6:53
+ 31440100 00010000 00000000 026e7305 73616665 7302636f 026e7a00 00010001.
+ sendto=32
+ +0.001501
+ sendto fd=4 addr=172.18.45.6:53
+ 31450100 00010000 00000000 026e7308 73656375 72697479 036f7267 026e7a00
+ 00010001.
+ sendto=36
+ +0.002041
+ sendto fd=4 addr=172.18.45.6:53
+ 31460100 00010000 00000000 10636f75 70657263 6f6e7375 6c74696e 6702636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001682
+ sendto fd=4 addr=172.18.45.6:53
+ 31470100 00010000 00000000 0e736563 75726974 79677561 72647302 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001629
+ sendto fd=4 addr=172.18.45.6:53
+ 31480100 00010000 00000000 026e7306 67756172 64730263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001671
+ sendto fd=4 addr=172.18.45.6:53
+ 31490100 00010000 00000000 04617369 73036f72 67026e7a 00000100 01.
+ sendto=29
+ +0.001592
+ sendto fd=4 addr=172.18.45.6:53
+ 314a0100 00010000 00000000 046e6572 7502636f 026e7a00 00010001.
+ sendto=28
+ +0.001561
+ sendto fd=4 addr=172.18.45.6:53
+ 314b0100 00010000 00000000 0a676966 74626173 6b657402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001907
+ sendto fd=4 addr=172.18.45.6:53
+ 314c0100 00010000 00000000 056d6167 69630263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001654
+ sendto fd=4 addr=172.18.45.6:53
+ 314d0100 00010000 00000000 046d6169 6c036263 6302636f 026e7a00 00010001.
+ sendto=32
+ +0.001634
+ sendto fd=4 addr=172.18.45.6:53
+ 314e0100 00010000 00000000 026e730d 696e7665 73746967 6174696f 6e02636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001656
+ sendto fd=4 addr=172.18.45.6:53
+ 314f0100 00010000 00000000 056e7a69 7069036f 7267026e 7a000001 0001.
+ sendto=30
+ +0.001595
+ sendto fd=4 addr=172.18.45.6:53
+ 31500100 00010000 00000000 026e7307 626f7571 75657402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001672
+ sendto fd=4 addr=172.18.45.6:53
+ 31510100 00010000 00000000 046d6169 6c057361 66657302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001801
+ sendto fd=4 addr=172.18.45.6:53
+ 31520100 00010000 00000000 026e7303 62636302 636f026e 7a000001 0001.
+ sendto=30
+ +0.001626
+ sendto fd=4 addr=172.18.45.6:53
+ 31530100 00010000 00000000 026e730d 62757267 6c617261 6c61726d 7302636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001697
+ sendto fd=4 addr=172.18.45.6:53
+ 31540100 00010000 00000000 026e730e 73656375 72697479 67756172 64730263
+ 6f026e7a 00000100 01.
+ sendto=41
+ +0.001694
+ sendto fd=4 addr=172.18.45.6:53
+ 31550100 00010000 00000000 0d636f76 65727463 616d6572 61730263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001665
+ sendto fd=4 addr=172.18.45.6:53
+ 31560100 00010000 00000000 026e7304 6e657275 02636f02 6e7a0000 010001.
+ sendto=31
+ +0.001613
+ sendto fd=4 addr=172.18.45.6:53
+ 31570100 00010000 00000000 026e730d 636f7665 72746361 6d657261 7302636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001761
+ sendto fd=4 addr=172.18.45.6:53
+ 31580100 00010000 00000000 08626f75 71756574 7302636f 026e7a00 00010001.
+ sendto=32
+ +0.001635
+ sendto fd=4 addr=172.18.45.6:53
+ 31590100 00010000 00000000 0a636f6e 63656e74 72696302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001693
+ sendto fd=4 addr=172.18.45.6:53
+ 315a0100 00010000 00000000 026e7310 73656375 72697479 74726169 6e696e67
+ 02636f02 6e7a0000 010001.
+ sendto=43
+ +0.001762
+ sendto fd=4 addr=172.18.45.6:53
+ 315b0100 00010000 00000000 046d6169 6c10636f 75706572 636f6e73 756c7469
+ 6e670263 6f026e7a 00000100 01.
+ sendto=45
+ +0.001727
+ sendto fd=4 addr=172.18.45.6:53
+ 315c0100 00010000 00000000 0e726574 61696c73 65637572 69747902 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001636
+ sendto fd=4 addr=172.18.45.6:53
+ 315d0100 00010000 00000000 026e730a 636f6e63 656e7472 69630263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001667
+ sendto fd=4 addr=172.18.45.6:53
+ 315e0100 00010000 00000000 046d6169 6c056d61 67696302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001674
+ sendto fd=4 addr=172.18.45.6:53
+ 315f0100 00010000 00000000 096e7a61 6e676c69 6e670263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001676
+ sendto fd=4 addr=172.18.45.6:53
+ 31600100 00010000 00000000 026e7310 636f7570 6572636f 6e73756c 74696e67
+ 02636f02 6e7a0000 010001.
+ sendto=43
+ +0.001709
+ sendto fd=4 addr=172.18.45.6:53
+ 31610100 00010000 00000000 026e7309 6e7a616e 676c696e 6702636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001623
+ sendto fd=4 addr=172.18.45.6:53
+ 31620100 00010000 00000000 046d6169 6c0a7374 6f726577 61746368 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001647
+ sendto fd=4 addr=172.18.45.6:53
+ 31630100 00010000 00000000 05737769 66740263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001638
+ sendto fd=4 addr=172.18.45.6:53
+ 31640100 00010000 00000000 046d6169 6c097365 6c656374 69766502 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001714
+ sendto fd=4 addr=172.18.45.6:53
+ 31650100 00010000 00000000 026e7309 666f7265 66726f6e 7402636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001705
+ sendto fd=4 addr=172.18.45.6:53
+ 31660100 00010000 00000000 046d6169 6c096e7a 616e676c 696e6702 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001701
+ sendto fd=4 addr=172.18.45.6:53
+ 31670100 00010000 00000000 06677561 72647302 636f026e 7a000001 0001.
+ sendto=30
+ +0.001623
+ sendto fd=4 addr=172.18.45.6:53
+ 31680100 00010000 00000000 046d6169 6c096e7a 64657369 676e7302 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001653
+ sendto fd=4 addr=172.18.45.6:53
+ 31690100 00010000 00000000 0a73746f 72657761 74636802 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.058123
+ sendto fd=4 addr=172.18.45.6:53
+ 316a0100 00010000 00000000 026e7312 73656375 72697479 6d616e61 67656d65
+ 6e740263 6f026e7a 00000100 01.
+ sendto=45
+ +0.001825
+ sendto fd=4 addr=172.18.45.6:53
+ 316b0100 00010000 00000000 046d6169 6c0a776f 6f6c776f 72746873 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001755
+ sendto fd=4 addr=172.18.45.6:53
+ 316c0100 00010000 00000000 046d6169 6c0a636f 6e63656e 74726963 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001576
+ sendto fd=4 addr=172.18.45.6:53
+ 316d0100 00010000 00000000 0973656c 65637469 76650263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001723
+ sendto fd=4 addr=172.18.45.6:53
+ 316e0100 00010000 00000000 15737065 6369616c 696e7665 73746967 6174696f
+ 6e730263 6f026e7a 00000100 01.
+ sendto=45
+ +0.001520
+ sendto fd=4 addr=172.18.45.6:53
+ 316f0100 00010000 00000000 026e7305 73776966 7402636f 026e7a00 00010001.
+ sendto=32
+ +0.001453
+ sendto fd=4 addr=172.18.45.6:53
+ 31700100 00010000 00000000 046d6169 6c057377 69667402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001422
+ sendto fd=4 addr=172.18.45.6:53
+ 31710100 00010000 00000000 026e7309 73656375 72656e65 74036e65 74026e7a
+ 00000100 01.
+ sendto=37
+ +0.001461
+ sendto fd=4 addr=172.18.45.6:53
+ 31720100 00010000 00000000 14707269 76617465 696e7665 73746967 6174696f
+ 6e02636f 026e7a00 00010001.
+ sendto=44
+ +0.001602
+ sendto fd=4 addr=172.18.45.6:53
+ 31730100 00010000 00000000 026e7314 70726976 61746569 6e766573 74696761
+ 74696f6e 02636f02 6e7a0000 010001.
+ sendto=47
+ +0.001625
+ sendto fd=4 addr=172.18.45.6:53
+ 31740100 00010000 00000000 06657472 61646502 636f026e 7a000001 0001.
+ sendto=30
+ +0.001427
+ sendto fd=4 addr=172.18.45.6:53
+ 31750100 00010000 00000000 026e7315 73706563 69616c69 6e766573 74696761
+ 74696f6e 7302636f 026e7a00 00010001.
+ sendto=48
+ +0.001592
+ sendto fd=4 addr=172.18.45.6:53
+ 31760100 00010000 00000000 046d6169 6c06616e 73657474 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001410
+ sendto fd=4 addr=172.18.45.6:53
+ 31770100 00010000 00000000 03667470 07776172 72656e74 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001429
+ sendto fd=4 addr=172.18.45.6:53
+ 31780100 00010000 00000000 026e730e 72657461 696c7365 63757269 74790263
+ 6f026e7a 00000100 01.
+ sendto=41
+ +0.001586
+ sendto fd=4 addr=172.18.45.6:53
+ 31790100 00010000 00000000 046d6169 6c127365 63757269 74796d61 6e616765
+ 6d656e74 02636f02 6e7a0000 010001.
+ sendto=47
+ +0.001654
+ sendto fd=4 addr=172.18.45.6:53
+ 317a0100 00010000 00000000 026e7305 6d616769 6302636f 026e7a00 00010001.
+ sendto=32
+ +0.001470
+ sendto fd=4 addr=172.18.45.6:53
+ 317b0100 00010000 00000000 046d6169 6c09666f 72656672 6f6e7402 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001529
+ sendto fd=4 addr=172.18.45.6:53
+ 317c0100 00010000 00000000 046d6169 6c0a7365 63757269 63617264 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001536
+ sendto fd=4 addr=172.18.45.6:53
+ 317d0100 00010000 00000000 0a736563 75726963 61726402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001493
+ sendto fd=4 addr=172.18.45.6:53
+ 317e0100 00010000 00000000 026e7309 6e7a6465 7369676e 7302636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001518
+ sendto fd=4 addr=172.18.45.6:53
+ 317f0100 00010000 00000000 05736166 65730263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001536
+ sendto fd=4 addr=172.18.45.6:53
+ 31800100 00010000 00000000 026e7309 73656c65 63746976 6502636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001634
+ sendto fd=4 addr=172.18.45.6:53
+ 31810100 00010000 00000000 09666f72 6566726f 6e740263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001549
+ sendto fd=4 addr=172.18.45.6:53
+ 31820100 00010000 00000000 12736563 75726974 796d616e 6167656d 656e7402
+ 636f026e 7a000001 0001.
+ sendto=42
+ +0.001511
+ sendto fd=4 addr=172.18.45.6:53
+ 31830100 00010000 00000000 09756e64 6572686f 75720263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001450
+ sendto fd=4 addr=172.18.45.6:53
+ 31840100 00010000 00000000 09736563 7572656e 6574036e 6574026e 7a000001
+ 0001.
+ sendto=34
+ +0.027143
+ sendto fd=4 addr=172.18.45.6:53
+ 31850100 00010000 00000000 046d6169 6c157370 65636961 6c696e76 65737469
+ 67617469 6f6e7302 636f026e 7a000001 0001.
+ sendto=50
+ +0.001627
+ sendto fd=4 addr=172.18.45.6:53
+ 31860100 00010000 00000000 096e7a64 65736967 6e730263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001455
+ sendto fd=4 addr=172.18.45.6:53
+ 31870100 00010000 00000000 026e7306 65747261 64650263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001572
+ sendto fd=4 addr=172.18.45.6:53
+ 31880100 00010000 00000000 046d6169 6c056e7a 69706903 6f726702 6e7a0000
+ 010001.
+ sendto=35
+ +0.001559
+ sendto fd=4 addr=172.18.45.6:53
+ 31890100 00010000 00000000 046d6169 6c09756e 64657268 6f757202 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001507
+ sendto fd=4 addr=172.18.45.6:53
+ 318a0100 00010000 00000000 026e7304 61736973 036f7267 026e7a00 00010001.
+ sendto=32
+ +0.001428
+ sendto fd=4 addr=172.18.45.6:53
+ 318b0100 00010000 00000000 026e7308 626f7571 75657473 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001471
+ sendto fd=4 addr=172.18.45.6:53
+ 318c0100 00010000 00000000 05616761 74650263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001457
+ read fd=5 buflen=2417
+ read=EAGAIN
+ +0.000160
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.766818
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.661618
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8180 00010001 00020002 026e7308 73656375 72697479 02636f02 6e7a0000
+ 010001c0 0c000100 01000151 800004cb 6300fe08 73656375 72697479 02636f02
+ 6e7a0000 02000100 01518000 02c00cc0 33000200 01000151 80001103 6e733107
+ 7761696b 61746f02 6163c03f c00c0001 00010001 51800004 cb6300fe c05b0001
+ 00010001 51800004 8cc8800d.
+ +0.001142
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000798
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.103260
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.077615
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31328180 00010001 00020002 026e7305 61676174 6502636f 026e7a00 00010001
+ c00c0001 00010001 51800004 cb6300fe 05616761 74650263 6f026e7a 00000200
+ 01000151 800002c0 0cc03000 02000100 01518000 11036e73 31077761 696b6174
+ 6f026163 c039c00c 00010001 00015180 0004cb63 00fec055 00010001 00015180
+ 00048cc8 800d.
+ +0.001006
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000520
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.024119
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-919664
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31338180 00010001 00020002 10736563 75726974 79747261 696e696e 6702636f
+ 026e7a00 00010001 c00c0001 00010001 4fd40004 cb6300fe c00c0002 00010001
+ 51800005 026e73c0 0cc00c00 02000100 01518000 13036e73 31077761 696b6174
+ 6f026163 026e7a00 c0440001 00010001 51800004 cb6300fe c0550001 00010001
+ 51800004 8cc8800d.
+ +0.001035
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000535
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.942213
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.047739
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31348180 00010001 00020002 026e730a 67696674 6261736b 65740263 6f026e7a
+ 00000100 01c00c00 01000100 01518000 04cb6300 fe0a6769 66746261 736b6574
+ 02636f02 6e7a0000 02000100 01518000 02c00cc0 35000200 01000151 80001103
+ 6e733107 7761696b 61746f02 6163c043 c00c0001 00010001 51800004 cb6300fe
+ c05f0001 00010001 51800004 8cc8800d.
+ +0.001079
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000550
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.892845
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038213
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31358180 00010001 00020002 026e7308 73656375 72697479 0367656e 026e7a00
+ 00010001 c00c0001 00010001 51800004 cb6300fe 08736563 75726974 79036765
+ 6e026e7a 00000200 01000151 800002c0 0cc03400 02000100 01518000 11036e73
+ 31077761 696b6174 6f026163 c041c00c 00010001 00015180 0004cb63 00fec05d
+ 00010001 00015180 00048cc8 800d.
+ +0.001063
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000523
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.853046
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.048278
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31388180 00010001 00020002 026e7305 6e7a6970 69036f72 67026e7a 00000100
+ 01c00c00 01000100 01518000 04cb6300 fe056e7a 69706903 6f726702 6e7a0000
+ 02000100 01518000 02c00cc0 31000200 01000151 80001103 6e733107 7761696b
+ 61746f02 6163c03b c00c0001 00010001 51800004 cb6300fe c0570001 00010001
+ 51800004 8cc8800d.
+ +0.001030
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000557
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.803181
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.146677
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313b8583 00010000 00010000 026e730a 73746f72 65776174 63680263 6f026e7a
+ 00000100 0102636f 026e7a00 00060001 00015180 002c046e 73393907 7761696b
+ 61746f02 6163c028 03736f61 c03b7727 6ec50000 0e100000 07080027 8d000001
+ 5180.
+ +0.000793
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.026541
+ close fd=4
+ close=OK
+ +0.000436
+ close fd=5
+ close=OK
+ +0.004673
diff --git a/regress/case-manyptrwrongrty.err b/regress/case-manyptrwrongrty.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-manyptrwrongrty.err
diff --git a/regress/case-manyptrwrongrty.out b/regress/case-manyptrwrongrty.out
new file mode 100644
index 0000000..0a0d607
--- /dev/null
+++ b/regress/case-manyptrwrongrty.out
@@ -0,0 +1,143 @@
+adns debug: using nameserver 172.18.45.6
+254.0.99.203.in-addr.arpa flags 292 type 1 A(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 2 NS(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 5 CNAME(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 6 SOA(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 12 PTR(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 13 HINFO(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 15 MX(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 16 TXT(-) submitted
+254.0.99.203.in-addr.arpa flags 292 type 17 RP(raw) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65537 A(addr) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65538 NS(+addr) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65548 PTR(checked) submitted
+254.0.99.203.in-addr.arpa flags 292 type 65551 MX(+addr) submitted
+254.0.99.203.in-addr.arpa flags 292 type 131078 SOA(822) submitted
+254.0.99.203.in-addr.arpa flags 292 type 131089 RP(822) submitted
+254.0.99.203.in-addr.arpa flags 292 type A(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=539
+254.0.99.203.in-addr.arpa flags 292 type NS(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=539
+254.0.99.203.in-addr.arpa flags 292 type SOA(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=540
+adns debug: TCP connected (NS=172.18.45.6)
+254.0.99.203.in-addr.arpa flags 292 type HINFO(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=540
+254.0.99.203.in-addr.arpa flags 292 type MX(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=540
+254.0.99.203.in-addr.arpa flags 292 type TXT(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=539
+254.0.99.203.in-addr.arpa flags 292 type RP(raw): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=539
+254.0.99.203.in-addr.arpa flags 292 type PTR(raw): OK; nrrs=94; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86351
+ ns.security.co.nz
+ tetra.co.nz
+ mail.agate.co.nz
+ ns.agate.co.nz
+ securitytraining.co.nz
+ ns.giftbasket.co.nz
+ ns.security.gen.nz
+ bouquet.co.nz
+ investigation.co.nz
+ ns.nzipi.org.nz
+ mail.neru.co.nz
+ security.co.nz
+ ns.storewatch.co.nz
+ security.gen.nz
+ ns.tetra.co.nz
+ mail.tetra.co.nz
+ ns.securicard.co.nz
+ ns.underhour.co.nz
+ bcc.co.nz
+ security.org.nz
+ burglaralarms.co.nz
+ ns.safes.co.nz
+ ns.security.org.nz
+ couperconsulting.co.nz
+ securityguards.co.nz
+ ns.guards.co.nz
+ asis.org.nz
+ neru.co.nz
+ giftbasket.co.nz
+ magic.co.nz
+ mail.bcc.co.nz
+ ns.investigation.co.nz
+ nzipi.org.nz
+ ns.bouquet.co.nz
+ mail.safes.co.nz
+ ns.bcc.co.nz
+ ns.burglaralarms.co.nz
+ ns.securityguards.co.nz
+ covertcameras.co.nz
+ ns.neru.co.nz
+ ns.covertcameras.co.nz
+ bouquets.co.nz
+ concentric.co.nz
+ ns.securitytraining.co.nz
+ mail.couperconsulting.co.nz
+ retailsecurity.co.nz
+ ns.concentric.co.nz
+ mail.magic.co.nz
+ nzangling.co.nz
+ ns.couperconsulting.co.nz
+ ns.nzangling.co.nz
+ mail.storewatch.co.nz
+ swift.co.nz
+ mail.selective.co.nz
+ ns.forefront.co.nz
+ mail.nzangling.co.nz
+ guards.co.nz
+ mail.nzdesigns.co.nz
+ storewatch.co.nz
+ ns.securitymanagement.co.nz
+ mail.woolworths.co.nz
+ mail.concentric.co.nz
+ selective.co.nz
+ specialinvestigations.co.nz
+ ns.swift.co.nz
+ mail.swift.co.nz
+ ns.securenet.net.nz
+ privateinvestigation.co.nz
+ ns.privateinvestigation.co.nz
+ etrade.co.nz
+ ns.specialinvestigations.co.nz
+ mail.ansett.co.nz
+ ftp.warrent.co.nz
+ ns.retailsecurity.co.nz
+ mail.securitymanagement.co.nz
+ ns.magic.co.nz
+ mail.forefront.co.nz
+ mail.securicard.co.nz
+ securicard.co.nz
+ ns.nzdesigns.co.nz
+ safes.co.nz
+ ns.selective.co.nz
+ forefront.co.nz
+ securitymanagement.co.nz
+ underhour.co.nz
+ securenet.net.nz
+ mail.specialinvestigations.co.nz
+ nzdesigns.co.nz
+ ns.etrade.co.nz
+ mail.nzipi.org.nz
+ mail.underhour.co.nz
+ ns.asis.org.nz
+ ns.bouquets.co.nz
+ agate.co.nz
+254.0.99.203.in-addr.arpa flags 292 type NS(+addr): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=539
+254.0.99.203.in-addr.arpa flags 292 type MX(+addr): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=540
+254.0.99.203.in-addr.arpa flags 292 type SOA(822): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=540
+254.0.99.203.in-addr.arpa flags 292 type RP(822): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=539
+254.0.99.203.in-addr.arpa flags 292 type A(addr): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=539
+254.0.99.203.in-addr.arpa flags 292 type PTR(checked): Inconsistent resource records in DNS; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86351
+adns debug: reply not found, id 3151, query owner mail.safes.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 3152, query owner ns.bcc.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 3153, query owner ns.burglaralarms.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 3154, query owner ns.securityguards.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 3155, query owner covertcameras.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 3156, query owner ns.neru.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 3157, query owner ns.covertcameras.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 3158, query owner bouquets.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 3159, query owner concentric.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 315a, query owner ns.securitytraining.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 315b, query owner mail.couperconsulting.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 315c, query owner retailsecurity.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 315d, query owner ns.concentric.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 315e, query owner mail.magic.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 315f, query owner nzangling.co.nz (NS=172.18.45.6)
+adns debug: reply not found, id 3160, query owner ns.couperconsulting.co.nz (NS=172.18.45.6)
+254.0.99.203.in-addr.arpa flags 292 type CNAME(-): No such data; nrrs=0; cname=$; owner=254.0.99.203.in-addr.arpa; ttl=86400
+rc=0
diff --git a/regress/case-manyptrwrongrty.sys b/regress/case-manyptrwrongrty.sys
new file mode 100644
index 0000000..92be042
--- /dev/null
+++ b/regress/case-manyptrwrongrty.sys
@@ -0,0 +1,1436 @@
+adnstest default -0x400
+292/254.0.99.203.in-addr.arpa
+ start 933286845.072950
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000253
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000085
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000063
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.001688
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.001142
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.001140
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.001165
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001176
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0d0001.
+ sendto=43
+ +0.001238
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.001191
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 100001.
+ sendto=43
+ +0.001128
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.001143
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.001146
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.001165
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001178
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.001183
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.001231
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.001357
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.981729
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000351
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 01000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021b002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.001109
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000482
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.981475
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.009100
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 02000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021b002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000873
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000382
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.972262
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.016240
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 06000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021c002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000837
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000395
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.954790
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.009780
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238380 00010013 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000151 4f001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 0001514f 00080574 65747261 c043c00c
+ 000c0001 0001514f 000d046d 61696c05 61676174 65c043c0 0c000c00 01000151
+ 4f000502 6e73c06f c00c000c 00010001 514f0013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 01000151 4f001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 01000151 4f001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 01514f00 0a07626f 75717565 74c043c0 0c000c00 01000151
+ 4f00100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 01000151 4f000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 0001514f 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 0001514f 0002c03a c00c000c 00010001 514f0010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010001 514f0002 c0d2c00c
+ 000c0001 0001514f 0005026e 73c056c0 0c000c00 01000151 4f000704 6d61696c
+ c056c00c 000c0001 0001514f 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 0001514f 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 01514f00 06036263 63c043.
+ +0.003330
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.001365
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000066
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000058
+ connect fd=5 addr=172.18.45.6:53
+ connect=EINPROGRESS
+ +0.000257
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000121
+ select max=6 rfds=[4] wfds=[5] efds=[] to=1.939813
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.001860
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000211
+ write fd=5
+ 002b3123 01000001 00000000 00000332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.000910
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.936832
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005498
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0d000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021c002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000840
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000372
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.930122
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.011817
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021c002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000838
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000389
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.917078
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.010900
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 10000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021b002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000836
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000359
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.904983
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.057379
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 11000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021b002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000856
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000409
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.846339
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.003255
+ read fd=5 buflen=2
+ read=OK
+ 097f.
+ +0.000294
+ read fd=5 buflen=2431
+ read=OK
+ 31238180 0001005e 00020002 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000151 4f001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 0001514f 00080574 65747261 c043c00c
+ 000c0001 0001514f 000d046d 61696c05 61676174 65c043c0 0c000c00 01000151
+ 4f000502 6e73c06f c00c000c 00010001 514f0013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 01000151 4f001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 01000151 4f001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 01514f00 0a07626f 75717565 74c043c0 0c000c00 01000151
+ 4f00100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 01000151 4f000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 0001514f 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 0001514f 0002c03a c00c000c 00010001 514f0010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010001 514f0002 c0d2c00c
+ 000c0001 0001514f 0005026e 73c056c0 0c000c00 01000151 4f000704 6d61696c
+ c056c00c 000c0001 0001514f 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 0001514f 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 01514f00 06036263 63c043c0 0c000c00 01000151 4f000b08 73656375 72697479
+ c128c00c 000c0001 0001514f 00100d62 7572676c 6172616c 61726d73 c043c00c
+ 000c0001 0001514f 000b026e 73057361 666573c0 43c00c00 0c000100 01514f00
+ 05026e73 c1f7c00c 000c0001 0001514f 00131063 6f757065 72636f6e 73756c74
+ 696e67c0 43c00c00 0c000100 01514f00 110e7365 63757269 74796775 61726473
+ c043c00c 000c0001 0001514f 000c026e 73066775 61726473 c043c00c 000c0001
+ 0001514f 00070461 736973c1 28c00c00 0c000100 01514f00 02c13fc0 0c000c00
+ 01000151 4f0002c0 b6c00c00 0c000100 01514f00 08056d61 676963c0 43c00c00
+ 0c000100 01514f00 07046d61 696cc1e5 c00c000c 00010001 514f0005 026e73c1
+ 03c00c00 0c000100 01514f00 02c122c0 0c000c00 01000151 4f000502 6e73c0ed
+ c00c000c 00010001 514f0007 046d6169 6cc22dc0 0c000c00 01000151 4f000502
+ 6e73c1e5 c00c000c 00010001 514f0005 026e73c2 0ec00c00 0c000100 01514f00
+ 05026e73 c271c00c 000c0001 0001514f 00100d63 6f766572 7463616d 65726173
+ c043c00c 000c0001 0001514f 0005026e 73c13fc0 0c000c00 01000151 4f001302
+ 6e730d63 6f766572 7463616d 65726173 c043c00c 000c0001 0001514f 000b0862
+ 6f757175 657473c0 43c00c00 0c000100 01514f00 0d0a636f 6e63656e 74726963
+ c043c00c 000c0001 0001514f 0005026e 73c094c0 0c000c00 01000151 4f000704
+ 6d61696c c252c00c 000c0001 0001514f 00110e72 65746169 6c736563 75726974
+ 79c043c0 0c000c00 01000151 4f001002 6e730a63 6f6e6365 6e747269 63c043c0
+ 0c000c00 01000151 4f000d04 6d61696c 056d6167 6963c043 c00c000c 00010001
+ 514f000c 096e7a61 6e676c69 6e67c043 c00c000c 00010001 514f0005 026e73c2
+ 52c00c00 0c000100 01514f00 0f026e73 096e7a61 6e676c69 6e67c043 c00c000c
+ 00010001 514f0007 046d6169 6cc163c0 0c000c00 01000151 4f000805 73776966
+ 74c043c0 0c000c00 01000151 4f001104 6d61696c 0973656c 65637469 7665c043
+ c00c000c 00010001 514f000f 026e7309 666f7265 66726f6e 74c043c0 0c000c00
+ 01000151 4f001104 6d61696c 096e7a61 6e676c69 6e67c043 c00c000c 00010001
+ 514f0009 06677561 726473c0 43c00c00 0c000100 01514f00 11046d61 696c096e
+ 7a646573 69676e73 c043c00c 000c0001 0001514f 0002c163 c00c000c 00010001
+ 514f0018 026e7312 73656375 72697479 6d616e61 67656d65 6e74c043 c00c000c
+ 00010001 514f0012 046d6169 6c0a776f 6f6c776f 72746873 c043c00c 000c0001
+ 0001514f 0012046d 61696c0a 636f6e63 656e.
+ +0.009407
+ read fd=5 buflen=973
+ read=OK
+ 74726963 c043c00c 000c0001 0001514f 000c0973 656c6563 74697665 c043c00c
+ 000c0001 0001514f 00181573 70656369 616c696e 76657374 69676174 696f6e73
+ c043c00c 000c0001 0001514f 000b026e 73057377 696674c0 43c00c00 0c000100
+ 01514f00 0d046d61 696c0573 77696674 c043c00c 000c0001 0001514f 0013026e
+ 73097365 63757265 6e657403 6e6574c0 46c00c00 0c000100 01514f00 17147072
+ 69766174 65696e76 65737469 67617469 6f6ec043 c00c000c 00010001 514f001a
+ 026e7314 70726976 61746569 6e766573 74696761 74696f6e c043c00c 000c0001
+ 0001514f 00090665 74726164 65c043c0 0c000c00 01000151 4f001b02 6e731573
+ 70656369 616c696e 76657374 69676174 696f6e73 c043c00c 000c0001 0001514f
+ 000e046d 61696c06 616e7365 7474c043 c00c000c 00010001 514f000e 03667470
+ 07776172 72656e74 c043c00c 000c0001 0001514f 0014026e 730e7265 7461696c
+ 73656375 72697479 c043c00c 000c0001 0001514f 001a046d 61696c12 73656375
+ 72697479 6d616e61 67656d65 6e74c043 c00c000c 00010001 514f000b 026e7305
+ 6d616769 63c043c0 0c000c00 01000151 4f001104 6d61696c 09666f72 6566726f
+ 6e74c043 c00c000c 00010001 514f0007 046d6169 6cc1b1c0 0c000c00 01000151
+ 4f0002c1 b1c00c00 0c000100 01514f00 0f026e73 096e7a64 65736967 6e73c043
+ c00c000c 00010001 514f0002 c22dc00c 000c0001 0001514f 000f026e 73097365
+ 6c656374 697665c0 43c00c00 0c000100 01514f00 0c09666f 72656672 6f6e74c0
+ 43c00c00 0c000100 01514f00 15127365 63757269 74796d61 6e616765 6d656e74
+ c043c00c 000c0001 0001514f 0002c1cd c00c000c 00010001 514f0010 09736563
+ 7572656e 6574036e 6574c046 c00c000c 00010001 514f001d 046d6169 6c157370
+ 65636961 6c696e76 65737469 67617469 6f6e73c0 43c00c00 0c000100 01514f00
+ 0c096e7a 64657369 676e73c0 43c00c00 0c000100 01514f00 0c026e73 06657472
+ 616465c0 43c00c00 0c000100 01514f00 07046d61 696cc122 c00c000c 00010001
+ 514f0007 046d6169 6cc1cdc0 0c000c00 01000151 4f000a02 6e730461 736973c1
+ 28c00c00 0c000100 01514f00 0e026e73 08626f75 71756574 73c043c0 0c000c00
+ 01000151 4f0002c0 6f013002 39390332 30330769 6e2d6164 64720461 72706100
+ 00020001 000545c2 0002c037 01300239 39033230 3307696e 2d616464 72046172
+ 70610000 02000100 0545c200 11036e73 31077761 696b6174 6f026163 c046c037
+ 00010001 0001514a 0004cb63 00fe036e 73310777 61696b61 746f0261 63c04600
+ 01000100 02a2c200 048cc880 0d.
+ +0.006032
+ read fd=5 buflen=2433
+ read=EAGAIN
+ +0.020859
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.806492
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.022402
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 01000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021b002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000868
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 02000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021b002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.001114
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8380 00010013 00000000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000151 4f001302 6e730873 65637572
+ 69747902 636f026e 7a00c00c 000c0001 0001514f 00080574 65747261 c043c00c
+ 000c0001 0001514f 000d046d 61696c05 61676174 65c043c0 0c000c00 01000151
+ 4f000502 6e73c06f c00c000c 00010001 514f0013 10736563 75726974 79747261
+ 696e696e 67c043c0 0c000c00 01000151 4f001002 6e730a67 69667462 61736b65
+ 74c043c0 0c000c00 01000151 4f001202 6e730873 65637572 69747903 67656ec0
+ 46c00c00 0c000100 01514f00 0a07626f 75717565 74c043c0 0c000c00 01000151
+ 4f00100d 696e7665 73746967 6174696f 6ec043c0 0c000c00 01000151 4f000f02
+ 6e73056e 7a697069 036f7267 c046c00c 000c0001 0001514f 000c046d 61696c04
+ 6e657275 c043c00c 000c0001 0001514f 0002c03a c00c000c 00010001 514f0010
+ 026e730a 73746f72 65776174 6368c043 c00c000c 00010001 514f0002 c0d2c00c
+ 000c0001 0001514f 0005026e 73c056c0 0c000c00 01000151 4f000704 6d61696c
+ c056c00c 000c0001 0001514f 0010026e 730a7365 63757269 63617264 c043c00c
+ 000c0001 0001514f 000f026e 7309756e 64657268 6f7572c0 43c00c00 0c000100
+ 01514f00 06036263 63c043.
+ +0.003373
+ write fd=5
+ 002b312b 01000001 00000000 00000332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.000877
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 0f000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021c002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000880
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 06000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021c002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.001170
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8180 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 11000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010000 021b002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.001182
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000384
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.774242
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.050425
+ read fd=5 buflen=2433
+ read=OK
+ 097f312b 81800001 005e0002 00020332 35340130 02393903 32303307 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 01514f00 13026e73 08736563
+ 75726974 7902636f 026e7a00 c00c000c 00010001 514f0008 05746574 7261c043
+ c00c000c 00010001 514f000d 046d6169 6c056167 617465c0 43c00c00 0c000100
+ 01514f00 05026e73 c06fc00c 000c0001 0001514f 00131073 65637572 69747974
+ 7261696e 696e67c0 43c00c00 0c000100 01514f00 10026e73 0a676966 74626173
+ 6b6574c0 43c00c00 0c000100 01514f00 12026e73 08736563 75726974 79036765
+ 6ec046c0 0c000c00 01000151 4f000a07 626f7571 756574c0 43c00c00 0c000100
+ 01514f00 100d696e 76657374 69676174 696f6ec0 43c00c00 0c000100 01514f00
+ 0f026e73 056e7a69 7069036f 7267c046 c00c000c 00010001 514f000c 046d6169
+ 6c046e65 7275c043 c00c000c 00010001 514f0002 c03ac00c 000c0001 0001514f
+ 0010026e 730a7374 6f726577 61746368 c043c00c 000c0001 0001514f 0002c0d2
+ c00c000c 00010001 514f0005 026e73c0 56c00c00 0c000100 01514f00 07046d61
+ 696cc056 c00c000c 00010001 514f0010 026e730a 73656375 72696361 7264c043
+ c00c000c 00010001 514f000f 026e7309 756e6465 72686f75 72c043c0 0c000c00
+ 01000151 4f000603 626363c0 43c00c00 0c000100 01514f00 0b087365 63757269
+ 7479c128 c00c000c 00010001 514f0010 0d627572 676c6172 616c6172 6d73c043
+ c00c000c 00010001 514f000b 026e7305 73616665 73c043c0 0c000c00 01000151
+ 4f000502 6e73c1f7 c00c000c 00010001 514f0013 10636f75 70657263 6f6e7375
+ 6c74696e 67c043c0 0c000c00 01000151 4f00110e 73656375 72697479 67756172
+ 6473c043 c00c000c 00010001 514f000c 026e7306 67756172 6473c043 c00c000c
+ 00010001 514f0007 04617369 73c128c0 0c000c00 01000151 4f0002c1 3fc00c00
+ 0c000100 01514f00 02c0b6c0 0c000c00 01000151 4f000805 6d616769 63c043c0
+ 0c000c00 01000151 4f000704 6d61696c c1e5c00c 000c0001 0001514f 0005026e
+ 73c103c0 0c000c00 01000151 4f0002c1 22c00c00 0c000100 01514f00 05026e73
+ c0edc00c 000c0001 0001514f 0007046d 61696cc2 2dc00c00 0c000100 01514f00
+ 05026e73 c1e5c00c 000c0001 0001514f 0005026e 73c20ec0 0c000c00 01000151
+ 4f000502 6e73c271 c00c000c 00010001 514f0010 0d636f76 65727463 616d6572
+ 6173c043 c00c000c 00010001 514f0005 026e73c1 3fc00c00 0c000100 01514f00
+ 13026e73 0d636f76 65727463 616d6572 6173c043 c00c000c 00010001 514f000b
+ 08626f75 71756574 73c043c0 0c000c00 01000151 4f000d0a 636f6e63 656e7472
+ 6963c043 c00c000c 00010001 514f0005 026e73c0 94c00c00 0c000100 01514f00
+ 07046d61 696cc252 c00c000c 00010001 514f0011 0e726574 61696c73 65637572
+ 697479c0 43c00c00 0c000100 01514f00 10026e73 0a636f6e 63656e74 726963c0
+ 43c00c00 0c000100 01514f00 0d046d61 696c056d 61676963 c043c00c 000c0001
+ 0001514f 000c096e 7a616e67 6c696e67 c043c00c 000c0001 0001514f 0005026e
+ 73c252c0 0c000c00 01000151 4f000f02 6e73096e 7a616e67 6c696e67 c043c00c
+ 000c0001 0001514f 0007046d 61696cc1 63c00c00 0c000100 01514f00 08057377
+ 696674c0 43c00c00 0c000100 01514f00 11046d61 696c0973 656c6563 74697665
+ c043c00c 000c0001 0001514f 000f026e 7309666f 72656672 6f6e74c0 43c00c00
+ 0c000100 01514f00 11046d61 696c096e 7a616e67 6c696e67 c043c00c 000c0001
+ 0001514f 00090667 75617264 73c043c0 0c000c00 01000151 4f001104 6d61696c
+ 096e7a64 65736967 6e73c043 c00c000c 00010001 514f0002 c163c00c 000c0001
+ 0001514f 0018026e 73127365 63757269 74796d61 6e616765 6d656e74 c043c00c
+ 000c0001 0001514f 0012046d 61696c0a 776f6f6c 776f7274 6873c043 c00c000c
+ 00010001 514f0012 046d6169 6c0a636f 6e63656e.
+ +0.008599
+ read fd=5 buflen=973
+ read=EAGAIN
+ +0.000251
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.714967
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.113339
+ read fd=5 buflen=973
+ read=OK
+ 74726963 c043c00c 000c0001 0001514f 000c0973 656c6563 74697665 c043c00c
+ 000c0001 0001514f 00181573 70656369 616c696e 76657374 69676174 696f6e73
+ c043c00c 000c0001 0001514f 000b026e 73057377 696674c0 43c00c00 0c000100
+ 01514f00 0d046d61 696c0573 77696674 c043c00c 000c0001 0001514f 0013026e
+ 73097365 63757265 6e657403 6e6574c0 46c00c00 0c000100 01514f00 17147072
+ 69766174 65696e76 65737469 67617469 6f6ec043 c00c000c 00010001 514f001a
+ 026e7314 70726976 61746569 6e766573 74696761 74696f6e c043c00c 000c0001
+ 0001514f 00090665 74726164 65c043c0 0c000c00 01000151 4f001b02 6e731573
+ 70656369 616c696e 76657374 69676174 696f6e73 c043c00c 000c0001 0001514f
+ 000e046d 61696c06 616e7365 7474c043 c00c000c 00010001 514f000e 03667470
+ 07776172 72656e74 c043c00c 000c0001 0001514f 0014026e 730e7265 7461696c
+ 73656375 72697479 c043c00c 000c0001 0001514f 001a046d 61696c12 73656375
+ 72697479 6d616e61 67656d65 6e74c043 c00c000c 00010001 514f000b 026e7305
+ 6d616769 63c043c0 0c000c00 01000151 4f001104 6d61696c 09666f72 6566726f
+ 6e74c043 c00c000c 00010001 514f0007 046d6169 6cc1b1c0 0c000c00 01000151
+ 4f0002c1 b1c00c00 0c000100 01514f00 0f026e73 096e7a64 65736967 6e73c043
+ c00c000c 00010001 514f0002 c22dc00c 000c0001 0001514f 000f026e 73097365
+ 6c656374 697665c0 43c00c00 0c000100 01514f00 0c09666f 72656672 6f6e74c0
+ 43c00c00 0c000100 01514f00 15127365 63757269 74796d61 6e616765 6d656e74
+ c043c00c 000c0001 0001514f 0002c1cd c00c000c 00010001 514f0010 09736563
+ 7572656e 6574036e 6574c046 c00c000c 00010001 514f001d 046d6169 6c157370
+ 65636961 6c696e76 65737469 67617469 6f6e73c0 43c00c00 0c000100 01514f00
+ 0c096e7a 64657369 676e73c0 43c00c00 0c000100 01514f00 0c026e73 06657472
+ 616465c0 43c00c00 0c000100 01514f00 07046d61 696cc122 c00c000c 00010001
+ 514f0007 046d6169 6cc1cdc0 0c000c00 01000151 4f000a02 6e730461 736973c1
+ 28c00c00 0c000100 01514f00 0e026e73 08626f75 71756574 73c043c0 0c000c00
+ 01000151 4f0002c0 6f013002 39390332 30330769 6e2d6164 64720461 72706100
+ 00020001 000545c2 0002c037 01300239 39033230 3307696e 2d616464 72046172
+ 70610000 02000100 0545c200 11036e73 31077761 696b6174 6f026163 c046c037
+ 00010001 0001514a 0004cb63 00fe036e 73310777 61696b61 746f0261 63c04600
+ 01000100 02a2c200 048cc880 0d.
+ +0.005794
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 026e7308 73656375 72697479 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.002525
+ sendto fd=4 addr=172.18.45.6:53
+ 31300100 00010000 00000000 05746574 72610263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001084
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 046d6169 6c056167 61746502 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001089
+ sendto fd=4 addr=172.18.45.6:53
+ 31320100 00010000 00000000 026e7305 61676174 6502636f 026e7a00 00010001.
+ sendto=32
+ +0.001018
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 10736563 75726974 79747261 696e696e 6702636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001076
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 026e730a 67696674 6261736b 65740263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001062
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 026e7308 73656375 72697479 0367656e 026e7a00
+ 00010001.
+ sendto=36
+ +0.001055
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 07626f75 71756574 02636f02 6e7a0000 010001.
+ sendto=31
+ +0.001003
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 0d696e76 65737469 67617469 6f6e0263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001169
+ sendto fd=4 addr=172.18.45.6:53
+ 31380100 00010000 00000000 026e7305 6e7a6970 69036f72 67026e7a 00000100
+ 01.
+ sendto=33
+ +0.001084
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 046d6169 6c046e65 72750263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001052
+ sendto fd=4 addr=172.18.45.6:53
+ 313a0100 00010000 00000000 08736563 75726974 7902636f 026e7a00 00010001.
+ sendto=32
+ +0.001060
+ sendto fd=4 addr=172.18.45.6:53
+ 313b0100 00010000 00000000 026e730a 73746f72 65776174 63680263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001385
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 08736563 75726974 79036765 6e026e7a 00000100
+ 01.
+ sendto=33
+ +0.001319
+ sendto fd=4 addr=172.18.45.6:53
+ 313d0100 00010000 00000000 026e7305 74657472 6102636f 026e7a00 00010001.
+ sendto=32
+ +0.001428
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 046d6169 6c057465 74726102 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001373
+ sendto fd=4 addr=172.18.45.6:53
+ 313f0100 00010000 00000000 026e730a 73656375 72696361 72640263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001407
+ sendto fd=4 addr=172.18.45.6:53
+ 31400100 00010000 00000000 026e7309 756e6465 72686f75 7202636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001454
+ sendto fd=4 addr=172.18.45.6:53
+ 31410100 00010000 00000000 03626363 02636f02 6e7a0000 010001.
+ sendto=27
+ +0.001405
+ sendto fd=4 addr=172.18.45.6:53
+ 31420100 00010000 00000000 08736563 75726974 79036f72 67026e7a 00000100
+ 01.
+ sendto=33
+ +0.001386
+ sendto fd=4 addr=172.18.45.6:53
+ 31430100 00010000 00000000 0d627572 676c6172 616c6172 6d730263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001405
+ sendto fd=4 addr=172.18.45.6:53
+ 31440100 00010000 00000000 026e7305 73616665 7302636f 026e7a00 00010001.
+ sendto=32
+ +0.001163
+ sendto fd=4 addr=172.18.45.6:53
+ 31450100 00010000 00000000 026e7308 73656375 72697479 036f7267 026e7a00
+ 00010001.
+ sendto=36
+ +0.001110
+ sendto fd=4 addr=172.18.45.6:53
+ 31460100 00010000 00000000 10636f75 70657263 6f6e7375 6c74696e 6702636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001091
+ sendto fd=4 addr=172.18.45.6:53
+ 31470100 00010000 00000000 0e736563 75726974 79677561 72647302 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001272
+ sendto fd=4 addr=172.18.45.6:53
+ 31480100 00010000 00000000 026e7306 67756172 64730263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001067
+ sendto fd=4 addr=172.18.45.6:53
+ 31490100 00010000 00000000 04617369 73036f72 67026e7a 00000100 01.
+ sendto=29
+ +0.001036
+ sendto fd=4 addr=172.18.45.6:53
+ 314a0100 00010000 00000000 046e6572 7502636f 026e7a00 00010001.
+ sendto=28
+ +0.001025
+ sendto fd=4 addr=172.18.45.6:53
+ 314b0100 00010000 00000000 0a676966 74626173 6b657402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001078
+ sendto fd=4 addr=172.18.45.6:53
+ 314c0100 00010000 00000000 056d6167 69630263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001042
+ sendto fd=4 addr=172.18.45.6:53
+ 314d0100 00010000 00000000 046d6169 6c036263 6302636f 026e7a00 00010001.
+ sendto=32
+ +0.001065
+ sendto fd=4 addr=172.18.45.6:53
+ 314e0100 00010000 00000000 026e730d 696e7665 73746967 6174696f 6e02636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001280
+ sendto fd=4 addr=172.18.45.6:53
+ 314f0100 00010000 00000000 056e7a69 7069036f 7267026e 7a000001 0001.
+ sendto=30
+ +0.001047
+ sendto fd=4 addr=172.18.45.6:53
+ 31500100 00010000 00000000 026e7307 626f7571 75657402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001278
+ sendto fd=4 addr=172.18.45.6:53
+ 31510100 00010000 00000000 046d6169 6c057361 66657302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001384
+ sendto fd=4 addr=172.18.45.6:53
+ 31520100 00010000 00000000 026e7303 62636302 636f026e 7a000001 0001.
+ sendto=30
+ +0.001308
+ sendto fd=4 addr=172.18.45.6:53
+ 31530100 00010000 00000000 026e730d 62757267 6c617261 6c61726d 7302636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001515
+ sendto fd=4 addr=172.18.45.6:53
+ 31540100 00010000 00000000 026e730e 73656375 72697479 67756172 64730263
+ 6f026e7a 00000100 01.
+ sendto=41
+ +0.001383
+ sendto fd=4 addr=172.18.45.6:53
+ 31550100 00010000 00000000 0d636f76 65727463 616d6572 61730263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001401
+ sendto fd=4 addr=172.18.45.6:53
+ 31560100 00010000 00000000 026e7304 6e657275 02636f02 6e7a0000 010001.
+ sendto=31
+ +0.001323
+ sendto fd=4 addr=172.18.45.6:53
+ 31570100 00010000 00000000 026e730d 636f7665 72746361 6d657261 7302636f
+ 026e7a00 00010001.
+ sendto=40
+ +0.001388
+ sendto fd=4 addr=172.18.45.6:53
+ 31580100 00010000 00000000 08626f75 71756574 7302636f 026e7a00 00010001.
+ sendto=32
+ +0.001467
+ sendto fd=4 addr=172.18.45.6:53
+ 31590100 00010000 00000000 0a636f6e 63656e74 72696302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001366
+ sendto fd=4 addr=172.18.45.6:53
+ 315a0100 00010000 00000000 026e7310 73656375 72697479 74726169 6e696e67
+ 02636f02 6e7a0000 010001.
+ sendto=43
+ +0.001416
+ sendto fd=4 addr=172.18.45.6:53
+ 315b0100 00010000 00000000 046d6169 6c10636f 75706572 636f6e73 756c7469
+ 6e670263 6f026e7a 00000100 01.
+ sendto=45
+ +0.001440
+ sendto fd=4 addr=172.18.45.6:53
+ 315c0100 00010000 00000000 0e726574 61696c73 65637572 69747902 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001438
+ sendto fd=4 addr=172.18.45.6:53
+ 315d0100 00010000 00000000 026e730a 636f6e63 656e7472 69630263 6f026e7a
+ 00000100 01.
+ sendto=37
+ +0.001523
+ sendto fd=4 addr=172.18.45.6:53
+ 315e0100 00010000 00000000 046d6169 6c056d61 67696302 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001394
+ sendto fd=4 addr=172.18.45.6:53
+ 315f0100 00010000 00000000 096e7a61 6e676c69 6e670263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001388
+ sendto fd=4 addr=172.18.45.6:53
+ 31600100 00010000 00000000 026e7310 636f7570 6572636f 6e73756c 74696e67
+ 02636f02 6e7a0000 010001.
+ sendto=43
+ +0.001439
+ sendto fd=4 addr=172.18.45.6:53
+ 31610100 00010000 00000000 026e7309 6e7a616e 676c696e 6702636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001369
+ sendto fd=4 addr=172.18.45.6:53
+ 31620100 00010000 00000000 046d6169 6c0a7374 6f726577 61746368 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001556
+ sendto fd=4 addr=172.18.45.6:53
+ 31630100 00010000 00000000 05737769 66740263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001365
+ sendto fd=4 addr=172.18.45.6:53
+ 31640100 00010000 00000000 046d6169 6c097365 6c656374 69766502 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001401
+ sendto fd=4 addr=172.18.45.6:53
+ 31650100 00010000 00000000 026e7309 666f7265 66726f6e 7402636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001427
+ sendto fd=4 addr=172.18.45.6:53
+ 31660100 00010000 00000000 046d6169 6c096e7a 616e676c 696e6702 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001542
+ sendto fd=4 addr=172.18.45.6:53
+ 31670100 00010000 00000000 06677561 72647302 636f026e 7a000001 0001.
+ sendto=30
+ +0.001362
+ sendto fd=4 addr=172.18.45.6:53
+ 31680100 00010000 00000000 046d6169 6c096e7a 64657369 676e7302 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001390
+ sendto fd=4 addr=172.18.45.6:53
+ 31690100 00010000 00000000 0a73746f 72657761 74636802 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001440
+ sendto fd=4 addr=172.18.45.6:53
+ 316a0100 00010000 00000000 026e7312 73656375 72697479 6d616e61 67656d65
+ 6e740263 6f026e7a 00000100 01.
+ sendto=45
+ +0.001484
+ sendto fd=4 addr=172.18.45.6:53
+ 316b0100 00010000 00000000 046d6169 6c0a776f 6f6c776f 72746873 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001522
+ sendto fd=4 addr=172.18.45.6:53
+ 316c0100 00010000 00000000 046d6169 6c0a636f 6e63656e 74726963 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001418
+ sendto fd=4 addr=172.18.45.6:53
+ 316d0100 00010000 00000000 0973656c 65637469 76650263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001842
+ sendto fd=4 addr=172.18.45.6:53
+ 316e0100 00010000 00000000 15737065 6369616c 696e7665 73746967 6174696f
+ 6e730263 6f026e7a 00000100 01.
+ sendto=45
+ +0.001742
+ sendto fd=4 addr=172.18.45.6:53
+ 316f0100 00010000 00000000 026e7305 73776966 7402636f 026e7a00 00010001.
+ sendto=32
+ +0.001516
+ sendto fd=4 addr=172.18.45.6:53
+ 31700100 00010000 00000000 046d6169 6c057377 69667402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001513
+ sendto fd=4 addr=172.18.45.6:53
+ 31710100 00010000 00000000 026e7309 73656375 72656e65 74036e65 74026e7a
+ 00000100 01.
+ sendto=37
+ +0.001670
+ sendto fd=4 addr=172.18.45.6:53
+ 31720100 00010000 00000000 14707269 76617465 696e7665 73746967 6174696f
+ 6e02636f 026e7a00 00010001.
+ sendto=44
+ +0.001599
+ sendto fd=4 addr=172.18.45.6:53
+ 31730100 00010000 00000000 026e7314 70726976 61746569 6e766573 74696761
+ 74696f6e 02636f02 6e7a0000 010001.
+ sendto=47
+ +0.001618
+ sendto fd=4 addr=172.18.45.6:53
+ 31740100 00010000 00000000 06657472 61646502 636f026e 7a000001 0001.
+ sendto=30
+ +0.001483
+ sendto fd=4 addr=172.18.45.6:53
+ 31750100 00010000 00000000 026e7315 73706563 69616c69 6e766573 74696761
+ 74696f6e 7302636f 026e7a00 00010001.
+ sendto=48
+ +0.001612
+ sendto fd=4 addr=172.18.45.6:53
+ 31760100 00010000 00000000 046d6169 6c06616e 73657474 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001604
+ sendto fd=4 addr=172.18.45.6:53
+ 31770100 00010000 00000000 03667470 07776172 72656e74 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001537
+ sendto fd=4 addr=172.18.45.6:53
+ 31780100 00010000 00000000 026e730e 72657461 696c7365 63757269 74790263
+ 6f026e7a 00000100 01.
+ sendto=41
+ +0.001577
+ sendto fd=4 addr=172.18.45.6:53
+ 31790100 00010000 00000000 046d6169 6c127365 63757269 74796d61 6e616765
+ 6d656e74 02636f02 6e7a0000 010001.
+ sendto=47
+ +0.001807
+ sendto fd=4 addr=172.18.45.6:53
+ 317a0100 00010000 00000000 026e7305 6d616769 6302636f 026e7a00 00010001.
+ sendto=32
+ +0.001481
+ sendto fd=4 addr=172.18.45.6:53
+ 317b0100 00010000 00000000 046d6169 6c09666f 72656672 6f6e7402 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001548
+ sendto fd=4 addr=172.18.45.6:53
+ 317c0100 00010000 00000000 046d6169 6c0a7365 63757269 63617264 02636f02
+ 6e7a0000 010001.
+ sendto=39
+ +0.001498
+ sendto fd=4 addr=172.18.45.6:53
+ 317d0100 00010000 00000000 0a736563 75726963 61726402 636f026e 7a000001
+ 0001.
+ sendto=34
+ +0.001636
+ sendto fd=4 addr=172.18.45.6:53
+ 317e0100 00010000 00000000 026e7309 6e7a6465 7369676e 7302636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001520
+ sendto fd=4 addr=172.18.45.6:53
+ 317f0100 00010000 00000000 05736166 65730263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001506
+ sendto fd=4 addr=172.18.45.6:53
+ 31800100 00010000 00000000 026e7309 73656c65 63746976 6502636f 026e7a00
+ 00010001.
+ sendto=36
+ +0.001523
+ sendto fd=4 addr=172.18.45.6:53
+ 31810100 00010000 00000000 09666f72 6566726f 6e740263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001493
+ sendto fd=4 addr=172.18.45.6:53
+ 31820100 00010000 00000000 12736563 75726974 796d616e 6167656d 656e7402
+ 636f026e 7a000001 0001.
+ sendto=42
+ +0.001667
+ sendto fd=4 addr=172.18.45.6:53
+ 31830100 00010000 00000000 09756e64 6572686f 75720263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001533
+ sendto fd=4 addr=172.18.45.6:53
+ 31840100 00010000 00000000 09736563 7572656e 6574036e 6574026e 7a000001
+ 0001.
+ sendto=34
+ +0.001495
+ sendto fd=4 addr=172.18.45.6:53
+ 31850100 00010000 00000000 046d6169 6c157370 65636961 6c696e76 65737469
+ 67617469 6f6e7302 636f026e 7a000001 0001.
+ sendto=50
+ +0.001627
+ sendto fd=4 addr=172.18.45.6:53
+ 31860100 00010000 00000000 096e7a64 65736967 6e730263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001653
+ sendto fd=4 addr=172.18.45.6:53
+ 31870100 00010000 00000000 026e7306 65747261 64650263 6f026e7a 00000100
+ 01.
+ sendto=33
+ +0.001512
+ sendto fd=4 addr=172.18.45.6:53
+ 31880100 00010000 00000000 046d6169 6c056e7a 69706903 6f726702 6e7a0000
+ 010001.
+ sendto=35
+ +0.001512
+ sendto fd=4 addr=172.18.45.6:53
+ 31890100 00010000 00000000 046d6169 6c09756e 64657268 6f757202 636f026e
+ 7a000001 0001.
+ sendto=38
+ +0.001541
+ sendto fd=4 addr=172.18.45.6:53
+ 318a0100 00010000 00000000 026e7304 61736973 036f7267 026e7a00 00010001.
+ sendto=32
+ +0.001581
+ sendto fd=4 addr=172.18.45.6:53
+ 318b0100 00010000 00000000 026e7308 626f7571 75657473 02636f02 6e7a0000
+ 010001.
+ sendto=35
+ +0.001520
+ sendto fd=4 addr=172.18.45.6:53
+ 318c0100 00010000 00000000 05616761 74650263 6f026e7a 00000100 01.
+ sendto=29
+ +0.001525
+ read fd=5 buflen=2433
+ read=EAGAIN
+ +0.000154
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.463947
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000380
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8180 00010001 00020002 026e7308 73656375 72697479 02636f02 6e7a0000
+ 010001c0 0c000100 01000151 4a0004cb 6300fe08 73656375 72697479 02636f02
+ 6e7a0000 02000100 01514a00 02c00cc0 33000200 01000151 4a001103 6e733107
+ 7761696b 61746f02 6163c03f c00c0001 00010001 514a0004 cb6300fe c05b0001
+ 00010002 a2c20004 8cc8800d.
+ +0.001006
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31308180 00010001 00020002 05746574 72610263 6f026e7a 00000100 01c00c00
+ 01000100 01515100 04cb6300 fec00c00 02000100 01515100 05026e73 c00cc00c
+ 00020001 00015151 0013036e 73310777 61696b61 746f0261 63026e7a 00c03900
+ 01000100 01407100 04cb6300 fec04a00 01000100 02a2c200 048cc880 0d.
+ +0.001541
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31318180 00010001 00020002 046d6169 6c056167 61746502 636f026e 7a000001
+ 0001c00c 00010001 0001514c 0004cb63 00fe0561 67617465 02636f02 6e7a0000
+ 02000100 01514c00 05026e73 c032c032 00020001 0001514c 0011036e 73310777
+ 61696b61 746f0261 63c03bc0 49000100 01000140 6c0004cb 6300fec0 5a000100
+ 010002a2 c200048c c8800d.
+ +0.001291
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31328180 00010001 00020002 026e7305 61676174 6502636f 026e7a00 00010001
+ c00c0001 00010001 30660004 cb6300fe 05616761 74650263 6f026e7a 00000200
+ 01000151 4c0002c0 0cc03000 02000100 01514c00 11036e73 31077761 696b6174
+ 6f026163 c039c00c 00010001 00013066 0004cb63 00fec055 00010001 0002a2c2
+ 00048cc8 800d.
+ +0.001292
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31338180 00010001 00020002 10736563 75726974 79747261 696e696e 6702636f
+ 026e7a00 00010001 c00c0001 00010001 514c0004 cb6300fe c00c0002 00010001
+ 514c0005 026e73c0 0cc00c00 02000100 01514c00 13036e73 31077761 696b6174
+ 6f026163 026e7a00 c0440001 00010001 406c0004 cb6300fe c0550001 00010002
+ a2c20004 8cc8800d.
+ +0.001315
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31348180 00010001 00020002 026e730a 67696674 6261736b 65740263 6f026e7a
+ 00000100 01c00c00 01000100 01514f00 04cb6300 fe0a6769 66746261 736b6574
+ 02636f02 6e7a0000 02000100 01514f00 02c00cc0 35000200 01000151 4f001103
+ 6e733107 7761696b 61746f02 6163c043 c00c0001 00010001 514f0004 cb6300fe
+ c05f0001 00010002 a2c20004 8cc8800d.
+ +0.001316
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31358180 00010001 00020002 026e7308 73656375 72697479 0367656e 026e7a00
+ 00010001 c00c0001 00010001 514c0004 cb6300fe 08736563 75726974 79036765
+ 6e026e7a 00000200 01000151 4c0002c0 0cc03400 02000100 01514c00 11036e73
+ 31077761 696b6174 6f026163 c041c00c 00010001 0001514c 0004cb63 00fec05d
+ 00010001 0002a2c2 00048cc8 800d.
+ +0.001354
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31368180 00010001 00020002 07626f75 71756574 02636f02 6e7a0000 010001c0
+ 0c000100 01000151 4c0004cb 6300fec0 0c000200 01000151 4c000502 6e73c00c
+ c00c0002 00010001 514c0013 036e7331 07776169 6b61746f 02616302 6e7a00c0
+ 3b000100 01000140 6c0004cb 6300fec0 4c000100 010002a2 c200048c c8800d.
+ +0.001244
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31378180 00010001 00020002 0d696e76 65737469 67617469 6f6e0263 6f026e7a
+ 00000100 01c00c00 01000100 01515100 04cb6300 fec00c00 02000100 01515100
+ 05026e73 c00cc00c 00020001 00015151 0013036e 73310777 61696b61 746f0261
+ 63026e7a 00c04100 01000100 01407100 04cb6300 fec05200 01000100 02a2c200
+ 048cc880 0d.
+ +0.001200
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31388180 00010001 00020002 026e7305 6e7a6970 69036f72 67026e7a 00000100
+ 01c00c00 01000100 01515100 04cb6300 fe056e7a 69706903 6f726702 6e7a0000
+ 02000100 01515100 02c00cc0 31000200 01000151 51001103 6e733107 7761696b
+ 61746f02 6163c03b c00c0001 00010001 51510004 cb6300fe c0570001 00010002
+ a2c20004 8cc8800d.
+ +0.001223
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31398180 00010001 00020002 046d6169 6c046e65 72750263 6f026e7a 00000100
+ 01c00c00 01000100 01514c00 04cb6300 fe046e65 72750263 6f026e7a 00000200
+ 01000151 51000502 6e73c031 c0310002 00010001 51510011 036e7331 07776169
+ 6b61746f 026163c0 39c04700 01000100 01407100 04cb6300 fec05800 01000100
+ 02a2c200 048cc880 0d.
+ +0.001353
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313a8180 00010001 00020002 08736563 75726974 7902636f 026e7a00 00010001
+ c00c0001 00010001 514a0004 cb6300fe c00c0002 00010001 514a0005 026e73c0
+ 0cc00c00 02000100 01514a00 13036e73 31077761 696b6174 6f026163 026e7a00
+ c03c0001 00010001 514a0004 cb6300fe c04d0001 00010002 a2c20004 8cc8800d.
+ +0.001193
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313b8583 00010000 00010000 026e730a 73746f72 65776174 63680263 6f026e7a
+ 00000100 0102636f 026e7a00 00060001 00000222 002c046e 73393907 7761696b
+ 61746f02 6163c028 03736f61 c03b7727 6ec50000 0e100000 07080027 8d000001
+ 5180.
+ +0.001027
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313c8180 00010001 00020002 08736563 75726974 79036765 6e026e7a 00000100
+ 01c00c00 01000100 01514c00 04cb6300 fec00c00 02000100 01514c00 05026e73
+ c00cc00c 00020001 0001514c 0013036e 73310777 61696b61 746f0261 63026e7a
+ 00c03d00 01000100 01514c00 04cb6300 fec04e00 01000100 02a2c200 048cc880
+ 0d.
+ +0.026055
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313d8180 00010001 00020002 026e7305 74657472 6102636f 026e7a00 00010001
+ c00c0001 00010001 306b0004 cb6300fe 05746574 72610263 6f026e7a 00000200
+ 01000151 510002c0 0cc03000 02000100 01515100 11036e73 31077761 696b6174
+ 6f026163 c039c00c 00010001 0001306b 0004cb63 00fec055 00010001 0002a2c2
+ 00048cc8 800d.
+ +0.001134
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313e8180 00010001 00020002 046d6169 6c057465 74726102 636f026e 7a000001
+ 0001c00c 00010001 00015151 0004cb63 00fe0574 65747261 02636f02 6e7a0000
+ 02000100 01515100 05026e73 c032c032 00020001 00015151 0011036e 73310777
+ 61696b61 746f0261 63c03bc0 49000100 01000130 6b0004cb 6300fec0 5a000100
+ 010002a2 c200048c c8800d.
+ +0.001247
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313f8180 00010001 00020002 026e730a 73656375 72696361 72640263 6f026e7a
+ 00000100 01c00c00 01000100 01515200 04cb6300 fe0a7365 63757269 63617264
+ 02636f02 6e7a0000 02000100 01515200 02c00cc0 35000200 01000151 52001103
+ 6e733107 7761696b 61746f02 6163c043 c00c0001 00010001 51520004 cb6300fe
+ c05f0001 00010002 a2c20004 8cc8800d.
+ +0.001158
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31408180 00010001 00020002 026e7309 756e6465 72686f75 7202636f 026e7a00
+ 00010001 c00c0001 00010001 51510004 cb6300fe 09756e64 6572686f 75720263
+ 6f026e7a 00000200 01000151 510002c0 0cc03400 02000100 01515100 11036e73
+ 31077761 696b6174 6f026163 c041c00c 00010001 00015151 0004cb63 00fec05d
+ 00010001 0002a2c2 00048cc8 800d.
+ +0.001137
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31418180 00010001 00020002 03626363 02636f02 6e7a0000 010001c0 0c000100
+ 01000151 4c0004cb 6300fec0 0c000200 01000151 4f000502 6e73c00c c00c0002
+ 00010001 514f0013 036e7331 07776169 6b61746f 02616302 6e7a00c0 37000100
+ 01000140 6f0004cb 6300fec0 48000100 010002a2 c200048c c8800d.
+ +0.001061
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31428180 00010001 00020002 08736563 75726974 79036f72 67026e7a 00000100
+ 01c00c00 01000100 01514c00 04cb6300 fec00c00 02000100 01514c00 05026e73
+ c00cc00c 00020001 0001514c 0013036e 73310777 61696b61 746f0261 63026e7a
+ 00c03d00 01000100 01406c00 04cb6300 fec04e00 01000100 02a2c200 048cc880
+ 0d.
+ +0.001163
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31438180 00010001 00020002 0d627572 676c6172 616c6172 6d730263 6f026e7a
+ 00000100 01c00c00 01000100 01514c00 04cb6300 fec00c00 02000100 01514c00
+ 05026e73 c00cc00c 00020001 0001514c 0013036e 73310777 61696b61 746f0261
+ 63026e7a 00c04100 01000100 01406c00 04cb6300 fec05200 01000100 02a2c200
+ 048cc880 0d.
+ +0.001131
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31448583 00010000 00010000 026e7305 73616665 7302636f 026e7a00 00010001
+ 05736166 65730263 6f026e7a 00000600 01000002 27002e03 6e733104 69687567
+ 036e6574 c0290373 6f610469 687567c0 26772768 a9000151 8000002a 30001275
+ 000002a3 00.
+ +0.000894
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31458180 00010001 00020002 026e7308 73656375 72697479 036f7267 026e7a00
+ 00010001 c00c0001 00010001 30660004 cb6300fe 08736563 75726974 79036f72
+ 67026e7a 00000200 01000151 4c0002c0 0cc03400 02000100 01514c00 11036e73
+ 31077761 696b6174 6f026163 c041c00c 00010001 00013066 0004cb63 00fec05d
+ 00010001 0002a2c2 00048cc8 800d.
+ +0.001127
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31468180 00010001 00020002 10636f75 70657263 6f6e7375 6c74696e 6702636f
+ 026e7a00 00010001 c00c0001 00010001 514f0004 cb6300fe c00c0002 00010001
+ 51520005 026e73c0 0cc00c00 02000100 01515200 13036e73 31077761 696b6174
+ 6f026163 026e7a00 c0440001 00010001 40720004 cb6300fe c0550001 00010002
+ a2c20004 8cc8800d.
+ +0.001215
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31478180 00010001 00020002 0e736563 75726974 79677561 72647302 636f026e
+ 7a000001 0001c00c 00010001 0001514f 0004cb63 00fec00c 00020001 0001514f
+ 0005026e 73c00cc0 0c000200 01000151 4f001303 6e733107 7761696b 61746f02
+ 6163026e 7a00c042 00010001 0001406f 0004cb63 00fec053 00010001 0002a2c2
+ 00048cc8 800d.
+ +0.001099
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31488180 00010001 00020002 026e7306 67756172 64730263 6f026e7a 00000100
+ 01c00c00 01000100 01514f00 04cb6300 fe066775 61726473 02636f02 6e7a0000
+ 02000100 01514f00 02c00cc0 31000200 01000151 4f001103 6e733107 7761696b
+ 61746f02 6163c03b c00c0001 00010001 514f0004 cb6300fe c0570001 00010002
+ a2c20004 8cc8800d.
+ +0.001123
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31498180 00010001 00020002 04617369 73036f72 67026e7a 00000100 01c00c00
+ 01000100 01514f00 04cb6300 fec00c00 02000100 01514f00 05026e73 c00cc00c
+ 00020001 0001514f 0013036e 73310777 61696b61 746f0261 63026e7a 00c03900
+ 01000100 01406f00 04cb6300 fec04a00 01000100 02a2c200 048cc880 0d.
+ +0.001033
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 314a8180 00010001 00020002 046e6572 7502636f 026e7a00 00010001 c00c0001
+ 00010001 514f0004 cb6300fe c00c0002 00010001 51510005 026e73c0 0cc00c00
+ 02000100 01515100 13036e73 31077761 696b6174 6f026163 026e7a00 c0380001
+ 00010001 40710004 cb6300fe c0490001 00010002 a2c20004 8cc8800d.
+ +0.001109
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 314b8180 00010001 00020002 0a676966 74626173 6b657402 636f026e 7a000001
+ 0001c00c 00010001 0001514f 0004cb63 00fec00c 00020001 0001514f 0005026e
+ 73c00cc0 0c000200 01000151 4f001303 6e733107 7761696b 61746f02 6163026e
+ 7a00c03e 00010001 0001514f 0004cb63 00fec04f 00010001 0002a2c2 00048cc8
+ 800d.
+ +0.001126
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 314c8180 00010001 00020002 056d6167 69630263 6f026e7a 00000100 01c00c00
+ 01000100 01514f00 04cb6300 fec00c00 02000100 01515100 05026e73 c00cc00c
+ 00020001 00015151 0013036e 73310777 61696b61 746f0261 63026e7a 00c03900
+ 01000100 01407100 04cb6300 fec04a00 01000100 02a2c200 048cc880 0d.
+ +0.001034
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 314d8180 00010001 00020002 046d6169 6c036263 6302636f 026e7a00 00010001
+ c00c0001 00010001 514f0004 cb6300fe 03626363 02636f02 6e7a0000 02000100
+ 01514f00 05026e73 c030c030 00020001 0001514f 0011036e 73310777 61696b61
+ 746f0261 63c037c0 45000100 01000140 6f0004cb 6300fec0 56000100 010002a2
+ c200048c c8800d.
+ +0.001118
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 314e8180 00010001 00020002 026e730d 696e7665 73746967 6174696f 6e02636f
+ 026e7a00 00010001 c00c0001 00010001 306b0004 cb6300fe 0d696e76 65737469
+ 67617469 6f6e0263 6f026e7a 00000200 01000151 510002c0 0cc03800 02000100
+ 01515100 11036e73 31077761 696b6174 6f026163 c049c00c 00010001 0001306b
+ 0004cb63 00fec065 00010001 0002a2c2 00048cc8 800d.
+ +0.001270
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 314f8180 00010001 00020002 056e7a69 7069036f 7267026e 7a000001 0001c00c
+ 00010001 0001514f 0004cb63 00fec00c 00020001 00015151 0005026e 73c00cc0
+ 0c000200 01000151 51001303 6e733107 7761696b 61746f02 6163026e 7a00c03a
+ 00010001 00015151 0004cb63 00fec04b 00010001 0002a2c2 00048cc8 800d.
+ +0.001059
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31508180 00010001 00020002 026e7307 626f7571 75657402 636f026e 7a000001
+ 0001c00c 00010001 00013066 0004cb63 00fe0762 6f757175 65740263 6f026e7a
+ 00000200 01000151 4c0002c0 0cc03200 02000100 01514c00 11036e73 31077761
+ 696b6174 6f026163 c03dc00c 00010001 00013066 0004cb63 00fec059 00010001
+ 0002a2c2 00048cc8 800d.
+ +0.001142
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000280
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.398497
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000524
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31518583 00010000 00010000 046d6169 6c057361 66657302 636f026e 7a000001
+ 00010573 61666573 02636f02 6e7a0000 06000100 00022700 2e036e73 31046968
+ 7567036e 6574c02b 03736f61 04696875 67c02877 2768a900 01518000 002a3000
+ 12750000 02a300.
+ +0.000719
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000326
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.396928
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002842
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31528180 00010001 00020002 026e7303 62636302 636f026e 7a000001 0001c00c
+ 00010001 00013069 0004cb63 00fe0362 63630263 6f026e7a 00000200 01000151
+ 4f0002c0 0cc02e00 02000100 01514f00 11036e73 31077761 696b6174 6f026163
+ c035c00c 00010001 00013069 0004cb63 00fec051 00010001 0002a2c2 00048cc8
+ 800d.
+ +0.000884
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000295
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.392907
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003411
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31538180 00010001 00020002 026e730d 62757267 6c617261 6c61726d 7302636f
+ 026e7a00 00010001 c00c0001 00010001 30660004 cb6300fe 0d627572 676c6172
+ 616c6172 6d730263 6f026e7a 00000200 01000151 4c0002c0 0cc03800 02000100
+ 01514c00 11036e73 31077761 696b6174 6f026163 c049c00c 00010001 00013066
+ 0004cb63 00fec065 00010001 0002a2c2 00048cc8 800d.
+ +0.000997
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000330
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.388169
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003160
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31548180 00010001 00020002 026e730e 73656375 72697479 67756172 64730263
+ 6f026e7a 00000100 01c00c00 01000100 01306900 04cb6300 fe0e7365 63757269
+ 74796775 61726473 02636f02 6e7a0000 02000100 01514f00 02c00cc0 39000200
+ 01000151 4f001103 6e733107 7761696b 61746f02 6163c04b c00c0001 00010001
+ 30690004 cb6300fe c0670001 00010002 a2c20004 8cc8800d.
+ +0.001023
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000298
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.383688
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003221
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31558180 00010001 00020002 0d636f76 65727463 616d6572 61730263 6f026e7a
+ 00000100 01c00c00 01000100 01515200 04cb6300 fec00c00 02000100 01515200
+ 05026e73 c00cc00c 00020001 00015152 0013036e 73310777 61696b61 746f0261
+ 63026e7a 00c04100 01000100 01515200 04cb6300 fec05200 01000100 02a2c200
+ 048cc880 0d.
+ +0.000929
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000291
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.379247
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002946
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31568180 00010001 00020002 026e7304 6e657275 02636f02 6e7a0000 010001c0
+ 0c000100 01000130 6b0004cb 6300fe04 6e657275 02636f02 6e7a0000 02000100
+ 01515100 02c00cc0 2f000200 01000151 51001103 6e733107 7761696b 61746f02
+ 6163c037 c00c0001 00010001 306b0004 cb6300fe c0530001 00010002 a2c20004
+ 8cc8800d.
+ +0.000895
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000294
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.375112
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003284
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31578180 00010001 00020002 026e730d 636f7665 72746361 6d657261 7302636f
+ 026e7a00 00010001 c00c0001 00010001 51520004 cb6300fe 0d636f76 65727463
+ 616d6572 61730263 6f026e7a 00000200 01000151 520002c0 0cc03800 02000100
+ 01515200 11036e73 31077761 696b6174 6f026163 c049c00c 00010001 00015152
+ 0004cb63 00fec065 00010001 0002a2c2 00048cc8 800d.
+ +0.001002
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000295
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.370531
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003077
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31588180 00010001 00020002 08626f75 71756574 7302636f 026e7a00 00010001
+ c00c0001 00010001 51530004 cb6300fe c00c0002 00010001 51530013 036e7331
+ 07776169 6b61746f 02616302 6e7a00c0 0c000200 01000151 53000502 6e73c00c
+ c03c0001 00010002 a2c20004 8cc8800d c05b0001 00010001 51530004 cb6300fe.
+ +0.000868
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000322
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.366264
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003188
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31598180 00010001 00020002 0a636f6e 63656e74 72696302 636f026e 7a000001
+ 0001c00c 00010001 0001514f 0004cb63 00fec00c 00020001 00015152 0005026e
+ 73c00cc0 0c000200 01000151 52001303 6e733107 7761696b 61746f02 6163026e
+ 7a00c03e 00010001 00014072 0004cb63 00fec04f 00010001 0002a2c2 00048cc8
+ 800d.
+ +0.000883
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000292
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.361901
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003497
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 315a8180 00010001 00020002 026e7310 73656375 72697479 74726169 6e696e67
+ 02636f02 6e7a0000 010001c0 0c000100 01000130 660004cb 6300fe10 73656375
+ 72697479 74726169 6e696e67 02636f02 6e7a0000 02000100 01514c00 02c00cc0
+ 3b000200 01000151 4c001103 6e733107 7761696b 61746f02 6163c04f c00c0001
+ 00010001 30660004 cb6300fe c06b0001 00010002 a2c20004 8cc8800d.
+ +0.001031
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000343
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.357030
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003250
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 315b8180 00010001 00020002 046d6169 6c10636f 75706572 636f6e73 756c7469
+ 6e670263 6f026e7a 00000100 01c00c00 01000100 01515200 04cb6300 fe10636f
+ 75706572 636f6e73 756c7469 6e670263 6f026e7a 00000200 01000151 52000502
+ 6e73c03d c03d0002 00010001 51520011 036e7331 07776169 6b61746f 026163c0
+ 51c05f00 01000100 01407200 04cb6300 fec07000 01000100 02a2c200 048cc880
+ 0d.
+ +0.001063
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000296
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.352421
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003258
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 315c8180 00010001 00020002 0e726574 61696c73 65637572 69747902 636f026e
+ 7a000001 0001c00c 00010001 0001514f 0004cb63 00fec00c 00020001 00015151
+ 0005026e 73c00cc0 0c000200 01000151 51001303 6e733107 7761696b 61746f02
+ 6163026e 7a00c042 00010001 00014071 0004cb63 00fec053 00010001 0002a2c2
+ 00048cc8 800d.
+ +0.000908
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000289
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.347966
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003170
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 315d8180 00010001 00020002 026e730a 636f6e63 656e7472 69630263 6f026e7a
+ 00000100 01c00c00 01000100 01306c00 04cb6300 fe0a636f 6e63656e 74726963
+ 02636f02 6e7a0000 02000100 01515200 02c00cc0 35000200 01000151 52001103
+ 6e733107 7761696b 61746f02 6163c043 c00c0001 00010001 306c0004 cb6300fe
+ c05f0001 00010002 a2c20004 8cc8800d.
+ +0.000963
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000324
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.343509
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003025
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 315e8180 00010001 00020002 046d6169 6c056d61 67696302 636f026e 7a000001
+ 0001c00c 00010001 0001514f 0004cb63 00fe056d 61676963 02636f02 6e7a0000
+ 02000100 01515100 05026e73 c032c032 00020001 00015151 0011036e 73310777
+ 61696b61 746f0261 63c03bc0 49000100 01000140 710004cb 6300fec0 5a000100
+ 010002a2 c200048c c8800d.
+ +0.000934
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000292
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.339258
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003113
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 315f8180 00010001 00020002 096e7a61 6e676c69 6e670263 6f026e7a 00000100
+ 01c00c00 01000100 01514f00 04cb6300 fec00c00 02000100 01514f00 05026e73
+ c00cc00c 00020001 0001514f 0013036e 73310777 61696b61 746f0261 63026e7a
+ 00c03d00 01000100 01514f00 04cb6300 fec04e00 01000100 02a2c200 048cc880
+ 0d.
+ +0.000877
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000320
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.334948
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004222
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31608180 00010001 00020002 026e7310 636f7570 6572636f 6e73756c 74696e67
+ 02636f02 6e7a0000 010001c0 0c000100 01000130 6c0004cb 6300fe10 636f7570
+ 6572636f 6e73756c 74696e67 02636f02 6e7a0000 02000100 01515200 02c00cc0
+ 3b000200 01000151 52001103 6e733107 7761696b 61746f02 6163c04f c00c0001
+ 00010001 306c0004 cb6300fe c06b0001 00010002 a2c20004 8cc8800d.
+ +0.001034
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000296
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.329396
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.008279
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010000 00010000 03323534 01300239 39033230 3307696e 2d616464
+ 72046172 70610000 05000101 30023939 03323033 07696e2d 61646472 04617270
+ 61000006 00010001 5180002e 026e7308 73656375 72697479 02636f02 6e7a0004
+ 726f6f74 c04c7727 714c0000 2a300000 0e100009 3a800001 5180.
+ +0.000837
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000405
+ close fd=4
+ close=OK
+ +0.000415
+ close fd=5
+ close=OK
+ +0.000167
diff --git a/regress/case-ndots-as.err b/regress/case-ndots-as.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-ndots-as.err
diff --git a/regress/case-ndots-as.out b/regress/case-ndots-as.out
new file mode 100644
index 0000000..714731a
--- /dev/null
+++ b/regress/case-ndots-as.out
@@ -0,0 +1,16 @@
+adns debug: using nameserver 172.18.45.6
+newsx.davenant flags 5 type 1 A(-) submitted
+news.davenant flags 5 type 1 A(-) submitted
+news.davenant.greenend.org.uk flags 5 type 1 A(-) submitted
+trunc.test.iwj.relativity flags 5 type 1 A(-) submitted
+trunx.test.iwj.relativity flags 5 type 1 A(-) submitted
+test.iwj.relativity flags 5 type 1 A(-) submitted
+news.davenant.greenend.org.uk flags 5 type A(-): OK; nrrs=1; cname=davenant.relativity.greenend.org.uk; owner=news.davenant.greenend.org.uk; ttl=86400
+ 172.18.45.6
+newsx.davenant flags 5 type A(-): No such domain; nrrs=0; cname=$; owner=newsx.davenant; ttl=86400
+news.davenant flags 5 type A(-): OK; nrrs=1; cname=davenant.relativity.greenend.org.uk; owner=news.davenant.greenend.org.uk; ttl=86400
+ 172.18.45.6
+trunc.test.iwj.relativity flags 5 type A(-): No such data; nrrs=0; cname=$; owner=trunc.test.iwj.relativity.greenend.org.uk; ttl=60
+trunx.test.iwj.relativity flags 5 type A(-): No such domain; nrrs=0; cname=$; owner=trunx.test.iwj.relativity; ttl=60
+test.iwj.relativity flags 5 type A(-): No such data; nrrs=0; cname=$; owner=test.iwj.relativity.greenend.org.uk; ttl=60
+rc=0
diff --git a/regress/case-ndots-as.sys b/regress/case-ndots-as.sys
new file mode 100644
index 0000000..0f0db44
--- /dev/null
+++ b/regress/case-ndots-as.sys
@@ -0,0 +1,316 @@
+adnstest default
+:0x0|1 5/newsx.davenant 5/news.davenant 5/news.davenant.greenend.org.uk 5/trunc.test.iwj.relativity 5/trunx.test.iwj.relativity 5/test.iwj.relativity
+ start 931992163.221752
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000186
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000086
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000066
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 056e6577 73780864 6176656e 616e7400 00010001.
+ sendto=32
+ +0.000567
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 046e6577 73086461 76656e61 6e740000 010001.
+ sendto=31
+ +0.000453
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000507
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790000 010001.
+ sendto=43
+ +0.000479
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790000 010001.
+ sendto=43
+ +0.000624
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 04746573 74036977 6a0a7265 6c617469 76697479
+ 00000100 01.
+ sendto=37
+ +0.000457
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.996913
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.022284
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010002 00030003 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001c0 0c000500 01000151 80002508 64617665
+ 6e616e74 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c03b0001 00010001 51800004 ac122d06 c0440002 00010001 51800006 036e7330
+ c044c044 00020001 00015180 0006036e 7331c044 c0440002 00010001 51800006
+ 036e7332 c044c07c 00010001 00015180 0004ac12 2d06c08e 00010001 00015180
+ 0004ac12 2d41c0a0 00010001 00015180 0004ac12 2d01.
+ +0.001420
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000291
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.972918
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.387236
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8583 00010000 00010000 056e6577 73780864 6176656e 616e7400 00010001
+ 00000600 01000151 80003e01 410c524f 4f542d53 45525645 5253034e 4554000a
+ 686f7374 6d617374 65720849 4e544552 4e4943c0 3a772768 44000007 08000003
+ 8400093a 80000151 80.
+ +0.000745
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 056e6577 73780864 6176656e 616e7408 64617665
+ 6e616e74 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=57
+ +0.000559
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000102
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.584843
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005460
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258583 00010000 00010000 056e6577 73780864 6176656e 616e7408 64617665
+ 6e616e74 08677265 656e656e 64036f72 6702756b 00000100 01086772 65656e65
+ 6e64036f 72670275 6b000006 00010001 5180002d 026e7306 63686961 726bc039
+ 0a686f73 746d6173 746572c0 39772741 34000070 8000001c 2000093a 80000151
+ 80.
+ +0.000861
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 056e6577 73780864 6176656e 616e7408 67726565
+ 6e656e64 036f7267 02756b00 00010001.
+ sendto=48
+ +0.000511
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000100
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.577911
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003716
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268583 00010000 00010000 056e6577 73780864 6176656e 616e7408 67726565
+ 6e656e64 036f7267 02756b00 00010001 08677265 656e656e 64036f72 6702756b
+ 00000600 01000151 80002d02 6e730663 68696172 6bc0300a 686f7374 6d617374
+ 6572c030 77274134 00007080 00001c20 00093a80 00015180.
+ +0.000808
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000127
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.573260
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.075508
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208583 00010000 00010000 046e6577 73086461 76656e61 6e740000 01000100
+ 00060001 00015180 003e0141 0c524f4f 542d5345 52564552 53034e45 54000a68
+ 6f73746d 61737465 7208494e 5445524e 4943c039 77276844 00000708 00000384
+ 00093a80 00015180.
+ +0.000755
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 046e6577 73086461 76656e61 6e740864 6176656e
+ 616e7408 67726565 6e656e64 036f7267 02756b00 00010001.
+ sendto=56
+ +0.000532
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000101
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.497324
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005326
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278583 00010000 00010000 046e6577 73086461 76656e61 6e740864 6176656e
+ 616e7408 67726565 6e656e64 036f7267 02756b00 00010001 08677265 656e656e
+ 64036f72 6702756b 00000600 01000151 80002d02 6e730663 68696172 6bc0380a
+ 686f7374 6d617374 6572c038 77274134 00007080 00001c20 00093a80 00015180.
+ +0.000855
+ sendto fd=4 addr=172.18.45.6:53
+ 31280100 00010000 00000000 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000503
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000100
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.490540
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.007220
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31288580 00010002 00030003 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001c0 0c000500 01000151 80002508 64617665
+ 6e616e74 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c03b0001 00010001 51800004 ac122d06 c0440002 00010001 51800006 036e7330
+ c044c044 00020001 00015180 0006036e 7331c044 c0440002 00010001 51800006
+ 036e7332 c044c07c 00010001 00015180 0004ac12 2d06c08e 00010001 00015180
+ 0004ac12 2d41c0a0 00010001 00015180 0004ac12 2d01.
+ +0.001356
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000223
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.481741
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.023419
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228583 00010000 00010000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790000 01000100 00060001 00015180 003e0141 0c524f4f 542d5345
+ 52564552 53034e45 54000a68 6f73746d 61737465 7208494e 5445524e 4943c045
+ 77276844 00000708 00000384 00093a80 00015180.
+ +0.000802
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790864 6176656e 616e7408 67726565 6e656e64 036f7267 02756b00
+ 00010001.
+ sendto=68
+ +0.000607
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000101
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.457291
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005416
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298583 00010000 00010000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790864 6176656e 616e7408 67726565 6e656e64 036f7267 02756b00
+ 00010001 08677265 656e656e 64036f72 6702756b 00000600 01000151 80002d02
+ 6e730663 68696172 6bc0440a 686f7374 6d617374 6572c044 77274134 00007080
+ 00001c20 00093a80 00015180.
+ +0.000925
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=59
+ +0.000575
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000101
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.450274
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.006009
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8580 00010000 00010000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 01000104 74657374
+ 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ 00060001 0000003c 0027036e 7330c044 0a686f73 746d6173 746572c0 44000000
+ 1800000e 10000000 780064c8 00000000 3c.
+ +0.000954
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000145
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.443166
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.014229
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238583 00010000 00010000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790000 01000100 00060001 00015180 003e0141 0c524f4f 542d5345
+ 52564552 53034e45 54000a68 6f73746d 61737465 7208494e 5445524e 4943c045
+ 77276844 00000708 00000384 00093a80 00015180.
+ +0.000805
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790864 6176656e 616e7408 67726565 6e656e64 036f7267 02756b00
+ 00010001.
+ sendto=68
+ +0.000606
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000101
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.428049
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005331
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8583 00010000 00010000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790864 6176656e 616e7408 67726565 6e656e64 036f7267 02756b00
+ 00010001 08677265 656e656e 64036f72 6702756b 00000600 01000151 80002d02
+ 6e730663 68696172 6bc0440a 686f7374 6d617374 6572c044 77274134 00007080
+ 00001c20 00093a80 00015180.
+ +0.000923
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=59
+ +0.000584
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000101
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.421110
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004042
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8583 00010000 00010000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 01000104 74657374
+ 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ 00060001 0000003c 0027036e 7330c044 0a686f73 746d6173 746572c0 44000000
+ 1800000e 10000000 780064c8 00000000 3c.
+ +0.000951
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000153
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.415964
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.026227
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248583 00010000 00010000 04746573 74036977 6a0a7265 6c617469 76697479
+ 00000100 01000006 00010001 5180003e 01410c52 4f4f542d 53455256 45525303
+ 4e455400 0a686f73 746d6173 74657208 494e5445 524e4943 c03f7727 68440000
+ 07080000 03840009 3a800001 5180.
+ +0.000817
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 04746573 74036977 6a0a7265 6c617469 76697479
+ 08646176 656e616e 74086772 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=62
+ +0.000579
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000102
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998502
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005185
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8583 00010000 00010000 04746573 74036977 6a0a7265 6c617469 76697479
+ 08646176 656e616e 74086772 65656e65 6e64036f 72670275 6b000001 00010867
+ 7265656e 656e6403 6f726702 756b0000 06000100 01518000 2d026e73 06636869
+ 61726bc0 3e0a686f 73746d61 73746572 c03e7727 41340000 70800000 1c200009
+ 3a800001 5180.
+ +0.000918
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 04746573 74036977 6a0a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=53
+ +0.000524
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000102
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998456
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004007
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8580 00010000 00010000 04746573 74036977 6a0a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 06000100 00003c00
+ 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 000a686f 73746d61 73746572 c0450000 00180000 0e100000 00780064 c8000000
+ 003c.
+ +0.000867
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000175
+ close fd=4
+ close=OK
+ +0.000183
diff --git a/regress/case-ndots.err b/regress/case-ndots.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-ndots.err
diff --git a/regress/case-ndots.out b/regress/case-ndots.out
new file mode 100644
index 0000000..d445ea3
--- /dev/null
+++ b/regress/case-ndots.out
@@ -0,0 +1,16 @@
+adns debug: using nameserver 172.18.45.6
+newsx.davenant flags 5 type 1 A(-) submitted
+news.davenant flags 5 type 1 A(-) submitted
+news.davenant.greenend.org.uk flags 5 type 1 A(-) submitted
+trunc.test.iwj.relativity flags 5 type 1 A(-) submitted
+trunx.test.iwj.relativity flags 5 type 1 A(-) submitted
+test.iwj.relativity flags 5 type 1 A(-) submitted
+newsx.davenant flags 5 type A(-): No such domain; nrrs=0; cname=$; owner=newsx.davenant; ttl=175
+news.davenant flags 5 type A(-): OK; nrrs=1; cname=davenant.relativity.greenend.org.uk; owner=news.davenant.greenend.org.uk; ttl=86400
+ 172.18.45.6
+news.davenant.greenend.org.uk flags 5 type A(-): OK; nrrs=1; cname=davenant.relativity.greenend.org.uk; owner=news.davenant.greenend.org.uk; ttl=86400
+ 172.18.45.6
+trunc.test.iwj.relativity flags 5 type A(-): No such data; nrrs=0; cname=$; owner=trunc.test.iwj.relativity.greenend.org.uk; ttl=60
+trunx.test.iwj.relativity flags 5 type A(-): No such domain; nrrs=0; cname=$; owner=trunx.test.iwj.relativity; ttl=60
+test.iwj.relativity flags 5 type A(-): No such data; nrrs=0; cname=$; owner=test.iwj.relativity.greenend.org.uk; ttl=60
+rc=0
diff --git a/regress/case-ndots.sys b/regress/case-ndots.sys
new file mode 100644
index 0000000..8fd6be9
--- /dev/null
+++ b/regress/case-ndots.sys
@@ -0,0 +1,277 @@
+adnstest ndots -,s
+:0x0|1 5/newsx.davenant 5/news.davenant 5/news.davenant.greenend.org.uk 5/trunc.test.iwj.relativity 5/trunx.test.iwj.relativity 5/test.iwj.relativity
+ start 924365863.351594
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000212
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000087
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000069
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 056e6577 73780864 6176656e 616e7408 64617665
+ 6e616e74 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=57
+ +0.003433
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 046e6577 73086461 76656e61 6e740864 6176656e
+ 616e7408 67726565 6e656e64 036f7267 02756b00 00010001.
+ sendto=56
+ +0.001694
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=47
+ +0.001921
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790000 010001.
+ sendto=43
+ +0.001042
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790000 010001.
+ sendto=43
+ +0.002220
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 04746573 74036977 6a0a7265 6c617469 76697479
+ 08646176 656e616e 74086772 65656e65 6e64036f 72670275 6b000001 0001.
+ sendto=62
+ +0.001132
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.988558
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000225
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8583 00010000 00010000 056e6577 73780864 6176656e 616e7408 64617665
+ 6e616e74 08677265 656e656e 64036f72 6702756b 00000100 01086772 65656e65
+ 6e64036f 72670275 6b000006 00010001 51800037 04646e73 3006656c 6d61696c
+ 02636fc0 46087269 63686172 646b0663 68696172 6bc03977 26f0bf00 00708000
+ 001c2000 093a8000 015180.
+ +0.000801
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 056e6577 73780864 6176656e 616e7408 67726565
+ 6e656e64 036f7267 02756b00 00010001.
+ sendto=48
+ +0.001048
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208583 00010000 00010000 046e6577 73086461 76656e61 6e740864 6176656e
+ 616e7408 67726565 6e656e64 036f7267 02756b00 00010001 08677265 656e656e
+ 64036f72 6702756b 00000600 01000151 80003704 646e7330 06656c6d 61696c02
+ 636fc045 08726963 68617264 6b066368 6961726b c0387726 f0bf0000 70800000
+ 1c200009 3a800001 5180.
+ +0.000773
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000440
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000105
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.990293
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004269
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010002 00030003 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001c0 0c000500 01000151 80002508 64617665
+ 6e616e74 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c03b0001 00010001 51800004 ac122d06 c0440002 00010001 51800006 036e7330
+ c044c044 00020001 00015180 0006036e 7331c044 c0440002 00010001 51800006
+ 036e7332 c044c07c 00010001 00015180 0004ac12 2d06c08e 00010001 00015180
+ 0004ac12 2d41c0a0 00010001 00015180 0004ac12 2d01.
+ +0.001122
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000283
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.986540
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000988
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228583 00010000 00010000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790000 01000100 00060001 000000e3 003e0141 0c524f4f 542d5345
+ 52564552 53034e45 54000a68 6f73746d 61737465 7208494e 5445524e 4943c045
+ 7726f440 00000708 00000384 00093a80 00015180.
+ +0.000665
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790864 6176656e 616e7408 67726565 6e656e64 036f7267 02756b00
+ 00010001.
+ sendto=68
+ +0.000576
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000106
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.985247
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001800
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238583 00010000 00010000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790000 01000100 00060001 0000016b 003e0141 0c524f4f 542d5345
+ 52564552 53034e45 54000a68 6f73746d 61737465 7208494e 5445524e 4943c045
+ 7726f440 00000708 00000384 00093a80 00015180.
+ +0.000671
+ sendto fd=4 addr=172.18.45.6:53
+ 31280100 00010000 00000000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790864 6176656e 616e7408 67726565 6e656e64 036f7267 02756b00
+ 00010001.
+ sendto=68
+ +0.000550
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000105
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.984341
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002209
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248583 00010000 00010000 04746573 74036977 6a0a7265 6c617469 76697479
+ 08646176 656e616e 74086772 65656e65 6e64036f 72670275 6b000001 00010867
+ 7265656e 656e6403 6f726702 756b0000 06000100 01518000 3704646e 73300665
+ 6c6d6169 6c02636f c04b0872 69636861 72646b06 63686961 726bc03e 7726f0bf
+ 00007080 00001c20 00093a80 00015180.
+ +0.000817
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 04746573 74036977 6a0a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=53
+ +0.000476
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000105
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.982091
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001955
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258583 00010000 00010000 056e6577 73780864 6176656e 616e7408 67726565
+ 6e656e64 036f7267 02756b00 00010001 08677265 656e656e 64036f72 6702756b
+ 00000600 01000151 80003704 646e7330 06656c6d 61696c02 636fc03d 08726963
+ 68617264 6b066368 6961726b c0307726 f0bf0000 70800000 1c200009 3a800001
+ 5180.
+ +0.000729
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 056e6577 73780864 6176656e 616e7400 00010001.
+ sendto=32
+ +0.000394
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000109
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.978904
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005814
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268580 00010002 00030003 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001c0 0c000500 01000151 80002508 64617665
+ 6e616e74 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c03b0001 00010001 51800004 ac122d06 c0440002 00010001 51800006 036e7330
+ c044c044 00020001 00015180 0006036e 7331c044 c0440002 00010001 51800006
+ 036e7332 c044c07c 00010001 00015180 0004ac12 2d06c08e 00010001 00015180
+ 0004ac12 2d41c0a0 00010001 00015180 0004ac12 2d01.
+ +0.001125
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000258
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.981536
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001427
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278583 00010000 00010000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790864 6176656e 616e7408 67726565 6e656e64 036f7267 02756b00
+ 00010001 08677265 656e656e 64036f72 6702756b 00000600 01000151 80003704
+ 646e7330 06656c6d 61696c02 636fc051 08726963 68617264 6b066368 6961726b
+ c0447726 f0bf0000 70800000 1c200009 3a800001 5180.
+ +0.000823
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=59
+ +0.000507
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000106
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.981820
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002135
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31288583 00010000 00010000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790864 6176656e 616e7408 67726565 6e656e64 036f7267 02756b00
+ 00010001 08677265 656e656e 64036f72 6702756b 00000600 01000151 80003704
+ 646e7330 06656c6d 61696c02 636fc051 08726963 68617264 6b066368 6961726b
+ c0447726 f0bf0000 70800000 1c200009 3a800001 5180.
+ +0.000844
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=59
+ +0.000505
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000103
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.981768
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001673
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298580 00010000 00010000 04746573 74036977 6a0a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 06000100 00003c00
+ 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 000a686f 73746d61 73746572 c0450000 00120000 0e100000 00780064 c8000000
+ 003c.
+ +0.000726
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000167
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.982555
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001681
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8583 00010000 00010000 056e6577 73780864 6176656e 616e7400 00010001
+ 00000600 01000000 af003e01 410c524f 4f542d53 45525645 5253034e 4554000a
+ 686f7374 6d617374 65720849 4e544552 4e4943c0 3a7726f4 40000007 08000003
+ 8400093a 80000151 80.
+ +0.000598
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000116
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.990016
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004585
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8580 00010000 00010000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 01000104 74657374
+ 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ 00060001 0000003c 0027036e 7330c044 0a686f73 746d6173 746572c0 44000000
+ 1200000e 10000000 780064c8 00000000 3c.
+ +0.000786
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000146
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.988070
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002234
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8583 00010000 00010000 05747275 6e780474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 01000104 74657374
+ 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ 00060001 0000003c 0027036e 7330c044 0a686f73 746d6173 746572c0 44000000
+ 1200000e 10000000 780064c8 00000000 3c.
+ +0.000780
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000120
+ close fd=4
+ close=OK
+ +0.000181
diff --git a/regress/case-ndotsbad.err b/regress/case-ndotsbad.err
new file mode 100644
index 0000000..31d3eab
--- /dev/null
+++ b/regress/case-ndotsbad.err
@@ -0,0 +1 @@
+adns failure: init: errno=EINVAL
diff --git a/regress/case-ndotsbad.out b/regress/case-ndotsbad.out
new file mode 100644
index 0000000..b980b59
--- /dev/null
+++ b/regress/case-ndotsbad.out
@@ -0,0 +1,3 @@
+adns debug: using nameserver 172.18.45.6
+adns: <supplied configuration text>:4: option `ndots:X' malformed or has bad value
+rc=2
diff --git a/regress/case-ndotsbad.sys b/regress/case-ndotsbad.sys
new file mode 100644
index 0000000..b5ebfb4
--- /dev/null
+++ b/regress/case-ndotsbad.sys
@@ -0,0 +1,2 @@
+adnstest ndotsbad
+:0x0|1 5/news.davenant.greenend.org.uk
diff --git a/regress/case-noinfto.err b/regress/case-noinfto.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-noinfto.err
diff --git a/regress/case-noinfto.out b/regress/case-noinfto.out
new file mode 100644
index 0000000..8f0d3df
--- /dev/null
+++ b/regress/case-noinfto.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.36
+a.b.c.d flags 0 type 1 A(-) submitted
+a.b.c.d flags 0 type A(-): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604744
+rc=0
diff --git a/regress/case-noinfto.sys b/regress/case-noinfto.sys
new file mode 100644
index 0000000..63d2fd0
--- /dev/null
+++ b/regress/case-noinfto.sys
@@ -0,0 +1,123 @@
+adnstest noserver -,p
+:0x0|1 a.b.c.d
+ start 940011574.766962
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000158
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000053
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000039
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.001065
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=1999
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.010188
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000218
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009786
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000282
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009708
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000217
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009800
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000272
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009786
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000216
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009723
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000273
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=EINTR
+ +18.-37194
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=0
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +10.-89436
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000256
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.006138
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000218
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009731
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000261
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009735
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000212
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009790
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000254
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009747
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000228
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009771
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000256
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009755
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 01610162 01630164 00000100 01.
+ sendto=25
+ +0.000226
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009768
+ close fd=4
+ close=OK
+ +0.000363
diff --git a/regress/case-norecurse.err b/regress/case-norecurse.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-norecurse.err
diff --git a/regress/case-norecurse.out b/regress/case-norecurse.out
new file mode 100644
index 0000000..14d8a6b
--- /dev/null
+++ b/regress/case-norecurse.out
@@ -0,0 +1,56 @@
+adns debug: using nameserver 172.18.45.6
+4.204.50.158.in-addr.arpa flags 0 type 1 A(-) submitted
+4.204.50.158.in-addr.arpa flags 0 type 2 NS(raw) submitted
+4.204.50.158.in-addr.arpa flags 0 type 5 CNAME(-) submitted
+4.204.50.158.in-addr.arpa flags 0 type 6 SOA(raw) submitted
+4.204.50.158.in-addr.arpa flags 0 type 12 PTR(raw) submitted
+4.204.50.158.in-addr.arpa flags 0 type 13adns debug: TCP connected (NS=172.18.45.6)
+ HINFO(-) submitted
+4.204.50.158.in-addr.arpa flags 0 type 15 MX(raw) submitted
+4.204.50.158.in-addr.arpa flags 0 type 16 TXT(-) submitted
+4.204.50.158.in-addr.arpa flags 0 type 17 RP(raw) submitted
+4.204.50.158.in-addr.arpa flags 0 type 65537 A(addr) submitted
+4.204.50.158.in-addr.arpa flags 0 type 65538 NS(+addr) submitted
+4.204.50.158.in-addr.arpa flags 0 type 65548 PTR(checked) submitted
+4.204.50.158.in-addr.arpa flags 0 type 65551 MX(+addr) submitted
+4.204.50.158.in-addr.arpa flags 0 type 131078 SOA(822) submitted
+4.204.50.158.in-addr.arpa flags 0 type 131089 RP(822) submitted
+4.204.50.158.in-addr.arpa flags 0 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type NS(raw): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type SOA(raw): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type PTR(raw): OK; nrrs=23; cname=$; owner=$; ttl=77948
+ ns2.afp.com
+ ns.afp.com
+ news.afp.com
+ ns2.afp.fr
+ ns.afp.fr
+ news.afp.fr
+ ns2.agencefrancepresse.com
+ news.agencefrancepresse.com
+ ns2.agencefrancepresse.fr
+ news.agencefrancepresse.fr
+ ns2.agencefrance-presse.com
+ news.agencefrance-presse.com
+ ns2.agencefrance-presse.fr
+ news.agencefrance-presse.fr
+ ns2.imageforum.com
+ news.imageforum.com
+ ns2.imageforum.tm.fr
+ news.imageforum.tm.fr
+ ns2.ooh-lah-lah.com
+ ns2.afpsciences.com
+ ns2.afpdoc.com
+ ns2.afp-notes.com
+ ns2.afp-domino.com
+4.204.50.158.in-addr.arpa flags 0 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type NS(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type SOA(822): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type PTR(checked): Inconsistent resource records in DNS; nrrs=0; cname=$; owner=$; ttl=77948
+4.204.50.158.in-addr.arpa flags 0 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=0
+rc=0
diff --git a/regress/case-norecurse.sys b/regress/case-norecurse.sys
new file mode 100644
index 0000000..f9509d7
--- /dev/null
+++ b/regress/case-norecurse.sys
@@ -0,0 +1,636 @@
+adnstest default -0x416
+4.204.50.158.in-addr.arpa
+ start 939764098.821612
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000163
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000053
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000041
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.001437
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 010001.
+ +0.000286
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000152
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.000904
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 020001.
+ +0.000247
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000144
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.001157
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000093
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.000957
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 060001.
+ +0.000249
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000113
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001196
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238380 00010012 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000130 7c000d03 6e733203 61667003
+ 636f6d00 c00c000c 00010001 307c0005 026e73c0 3bc00c00 0c000100 01307c00
+ 07046e65 7773c03b c00c000c 00010001 307c000c 036e7332 03616670 02667200
+ c00c000c 00010001 307c0005 026e73c0 78c00c00 0c000100 01307c00 07046e65
+ 7773c078 c00c000c 00010001 307c0019 036e7332 12616765 6e636566 72616e63
+ 65707265 737365c0 3fc00c00 0c000100 01307c00 07046e65 7773c0b4 c00c000c
+ 00010001 307c0019 036e7332 12616765 6e636566 72616e63 65707265 737365c0
+ 7cc00c00 0c000100 01307c00 07046e65 7773c0ec c00c000c 00010001 307c001a
+ 036e7332 13616765 6e636566 72616e63 652d7072 65737365 c03fc00c 000c0001
+ 0001307c 0007046e 657773c1 24c00c00 0c000100 01307c00 1a036e73 32136167
+ 656e6365 6672616e 63652d70 72657373 65c07cc0 0c000c00 01000130 7c000704
+ 6e657773 c15dc00c 000c0001 0001307c 0011036e 73320a69 6d616765 666f7275
+ 6dc03fc0 0c000c00 01000130 7c000704 6e657773 c196c00c 000c0001 0001307c
+ 0014036e 73320a69 6d616765 666f7275 6d02746d c07cc00c 000c0001 0001307c
+ 0007046e 657773c1 c6.
+ +0.002263
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.000942
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000045
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000041
+ connect fd=5 addr=172.18.45.6:53
+ connect=EINPROGRESS
+ +0.000500
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000083
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0d0001.
+ sendto=43
+ +0.000925
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0d0001.
+ +0.000256
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000116
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000123
+ write fd=5
+ 002b3123 01000001 00000000 00000134 03323034 02353003 31353807 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.001681
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.001010
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0f0001.
+ +0.000266
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000117
+ read fd=5 buflen=2
+ read=OK
+ 02ac.
+ +0.000175
+ read fd=5 buflen=684
+ read=OK
+ 31238180 00010017 00010001 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000130 7c000d03 6e733203 61667003
+ 636f6d00 c00c000c 00010001 307c0005 026e73c0 3bc00c00 0c000100 01307c00
+ 07046e65 7773c03b c00c000c 00010001 307c000c 036e7332 03616670 02667200
+ c00c000c 00010001 307c0005 026e73c0 78c00c00 0c000100 01307c00 07046e65
+ 7773c078 c00c000c 00010001 307c0019 036e7332 12616765 6e636566 72616e63
+ 65707265 737365c0 3fc00c00 0c000100 01307c00 07046e65 7773c0b4 c00c000c
+ 00010001 307c0019 036e7332 12616765 6e636566 72616e63 65707265 737365c0
+ 7cc00c00 0c000100 01307c00 07046e65 7773c0ec c00c000c 00010001 307c001a
+ 036e7332 13616765 6e636566 72616e63 652d7072 65737365 c03fc00c 000c0001
+ 0001307c 0007046e 657773c1 24c00c00 0c000100 01307c00 1a036e73 32136167
+ 656e6365 6672616e 63652d70 72657373 65c07cc0 0c000c00 01000130 7c000704
+ 6e657773 c15dc00c 000c0001 0001307c 0011036e 73320a69 6d616765 666f7275
+ 6dc03fc0 0c000c00 01000130 7c000704 6e657773 c196c00c 000c0001 0001307c
+ 0014036e 73320a69 6d616765 666f7275 6d02746d c07cc00c 000c0001 0001307c
+ 0007046e 657773c1 c6c00c00 0c000100 01307c00 12036e73 320b6f6f 682d6c61
+ 682d6c61 68c03fc0 0c000c00 01000130 7c001203 6e73320b 61667073 6369656e
+ 636573c0 3fc00c00 0c000100 01307c00 0d036e73 32066166 70646f63 c03fc00c
+ 000c0001 0001307c 0010036e 73320961 66702d6e 6f746573 c03fc00c 000c0001
+ 0001307c 0011036e 73320a61 66702d64 6f6d696e 6fc03f03 32303402 35300331
+ 35380769 6e2d6164 64720461 72706100 00020001 0001307c 0002c037 c0370001
+ 00010002 80980004 9e32cc04.
+ +0.002445
+ read fd=5 buflen=686
+ read=EAGAIN
+ +0.003811
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 100001.
+ sendto=43
+ +0.000940
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 100001.
+ +0.000256
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000115
+ read fd=5 buflen=686
+ read=EAGAIN
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.000928
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ +0.000259
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000112
+ read fd=5 buflen=686
+ read=EAGAIN
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.000917
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 010001.
+ +0.000259
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000124
+ read fd=5 buflen=686
+ read=EAGAIN
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.000899
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 020001.
+ +0.000262
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000123
+ read fd=5 buflen=686
+ read=EAGAIN
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001190
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8380 00010012 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000130 7c000d03 6e733203 61667003
+ 636f6d00 c00c000c 00010001 307c0005 026e73c0 3bc00c00 0c000100 01307c00
+ 07046e65 7773c03b c00c000c 00010001 307c000c 036e7332 03616670 02667200
+ c00c000c 00010001 307c0005 026e73c0 78c00c00 0c000100 01307c00 07046e65
+ 7773c078 c00c000c 00010001 307c0019 036e7332 12616765 6e636566 72616e63
+ 65707265 737365c0 3fc00c00 0c000100 01307c00 07046e65 7773c0b4 c00c000c
+ 00010001 307c0019 036e7332 12616765 6e636566 72616e63 65707265 737365c0
+ 7cc00c00 0c000100 01307c00 07046e65 7773c0ec c00c000c 00010001 307c001a
+ 036e7332 13616765 6e636566 72616e63 652d7072 65737365 c03fc00c 000c0001
+ 0001307c 0007046e 657773c1 24c00c00 0c000100 01307c00 1a036e73 32136167
+ 656e6365 6672616e 63652d70 72657373 65c07cc0 0c000c00 01000130 7c000704
+ 6e657773 c15dc00c 000c0001 0001307c 0011036e 73320a69 6d616765 666f7275
+ 6dc03fc0 0c000c00 01000130 7c000704 6e657773 c196c00c 000c0001 0001307c
+ 0014036e 73320a69 6d616765 666f7275 6d02746d c07cc00c 000c0001 0001307c
+ 0007046e 657773c1 c6.
+ +0.001724
+ write fd=5
+ 002b312b 01000001 00000000 00000134 03323034 02353003 31353807 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.001513
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000078
+ read fd=5 buflen=686
+ read=EAGAIN
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.000907
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0f0001.
+ +0.000264
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000118
+ read fd=5 buflen=686
+ read=EAGAIN
+ +0.001429
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.000875
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 060001.
+ +0.000265
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000115
+ read fd=5 buflen=686
+ read=OK
+ 02ac312b 81800001 00170001 00010134 03323034 02353003 31353807 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 01307c00 0d036e73 32036166
+ 7003636f 6d00c00c 000c0001 0001307c 0005026e 73c03bc0 0c000c00 01000130
+ 7c000704 6e657773 c03bc00c 000c0001 0001307c 000c036e 73320361 66700266
+ 7200c00c 000c0001 0001307c 0005026e 73c078c0 0c000c00 01000130 7c000704
+ 6e657773 c078c00c 000c0001 0001307c 0019036e 73321261 67656e63 65667261
+ 6e636570 72657373 65c03fc0 0c000c00 01000130 7c000704 6e657773 c0b4c00c
+ 000c0001 0001307c 0019036e 73321261 67656e63 65667261 6e636570 72657373
+ 65c07cc0 0c000c00 01000130 7c000704 6e657773 c0ecc00c 000c0001 0001307c
+ 001a036e 73321361 67656e63 65667261 6e63652d 70726573 7365c03f c00c000c
+ 00010001 307c0007 046e6577 73c124c0 0c000c00 01000130 7c001a03 6e733213
+ 6167656e 63656672 616e6365 2d707265 737365c0 7cc00c00 0c000100 01307c00
+ 07046e65 7773c15d c00c000c 00010001 307c0011 036e7332 0a696d61 6765666f
+ 72756dc0 3fc00c00 0c000100 01307c00 07046e65 7773c196 c00c000c 00010001
+ 307c0014 036e7332 0a696d61 6765666f 72756d02 746dc07c c00c000c 00010001
+ 307c0007 046e6577 73c1c6c0 0c000c00 01000130 7c001203 6e73320b 6f6f682d
+ 6c61682d 6c6168c0 3fc00c00 0c000100 01307c00 12036e73 320b6166 70736369
+ 656e6365 73c03fc0 0c000c00 01000130 7c000d03 6e733206 61667064 6f63c03f
+ c00c000c 00010001 307c0010 036e7332 09616670 2d6e6f74 6573c03f c00c000c
+ 00010001 307c0011 036e7332 0a616670 2d646f6d 696e6fc0 3f033230 34023530
+ 03313538 07696e2d 61646472 04617270 61000002 00010001 307c0002 c037c037
+ 00010001 00028098 00049e32 cc04.
+ +0.002314
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 036e7332 03616670 03636f6d 00000100 01.
+ sendto=29
+ +0.001132
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 026e7303 61667003 636f6d00 00010001.
+ sendto=28
+ +0.000872
+ sendto fd=4 addr=172.18.45.6:53
+ 31300100 00010000 00000000 046e6577 73036166 7003636f 6d000001 0001.
+ sendto=30
+ +0.000864
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 036e7332 03616670 02667200 00010001.
+ sendto=28
+ +0.000857
+ sendto fd=4 addr=172.18.45.6:53
+ 31320100 00010000 00000000 026e7303 61667002 66720000 010001.
+ sendto=27
+ +0.001077
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 046e6577 73036166 70026672 00000100 01.
+ sendto=29
+ +0.001081
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 036e7332 12616765 6e636566 72616e63 65707265
+ 73736503 636f6d00 00010001.
+ sendto=44
+ +0.001138
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 03636f6d 00000100 01.
+ sendto=45
+ +0.001216
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 036e7332 12616765 6e636566 72616e63 65707265
+ 73736502 66720000 010001.
+ sendto=43
+ +0.001134
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 02667200 00010001.
+ sendto=44
+ +0.001163
+ sendto fd=4 addr=172.18.45.6:53
+ 31380100 00010000 00000000 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 03636f6d 00000100 01.
+ sendto=45
+ +0.001153
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 6503636f 6d000001 0001.
+ sendto=46
+ +0.001167
+ sendto fd=4 addr=172.18.45.6:53
+ 313a0100 00010000 00000000 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 02667200 00010001.
+ sendto=44
+ +0.001170
+ sendto fd=4 addr=172.18.45.6:53
+ 313b0100 00010000 00000000 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 65026672 00000100 01.
+ sendto=45
+ +0.001174
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 036e7332 0a696d61 6765666f 72756d03 636f6d00
+ 00010001.
+ sendto=36
+ +0.001119
+ sendto fd=4 addr=172.18.45.6:53
+ 313d0100 00010000 00000000 046e6577 730a696d 61676566 6f72756d 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.001141
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 036e7332 0a696d61 6765666f 72756d02 746d0266
+ 72000001 0001.
+ sendto=38
+ +0.001115
+ sendto fd=4 addr=172.18.45.6:53
+ 313f0100 00010000 00000000 046e6577 730a696d 61676566 6f72756d 02746d02
+ 66720000 010001.
+ sendto=39
+ +0.001383
+ sendto fd=4 addr=172.18.45.6:53
+ 31400100 00010000 00000000 036e7332 0b6f6f68 2d6c6168 2d6c6168 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.001190
+ sendto fd=4 addr=172.18.45.6:53
+ 31410100 00010000 00000000 036e7332 0b616670 73636965 6e636573 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.001178
+ sendto fd=4 addr=172.18.45.6:53
+ 31420100 00010000 00000000 036e7332 06616670 646f6303 636f6d00 00010001.
+ sendto=32
+ +0.001112
+ sendto fd=4 addr=172.18.45.6:53
+ 31430100 00010000 00000000 036e7332 09616670 2d6e6f74 65730363 6f6d0000
+ 010001.
+ sendto=35
+ +0.001167
+ sendto fd=4 addr=172.18.45.6:53
+ 31440100 00010000 00000000 036e7332 0a616670 2d646f6d 696e6f03 636f6d00
+ 00010001.
+ sendto=36
+ +0.001187
+ read fd=5 buflen=686
+ read=EAGAIN
+ +0.000694
+ sendto fd=4 addr=172.18.45.6:53
+ 31450100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.001333
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8180 00010001 00020002 036e7332 03616670 03636f6d 00000100 01c00c00
+ 01000100 02809800 049e32cc 04034146 5003636f 6d000002 00010001 4d720002
+ c00cc02d 00020001 00014d72 0006036e 7331c02d c00c0001 00010002 80980004
+ 9e32cc04 c04e0001 00010002 80980004 d0dfa603.
+ +0.000734
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8180 00010001 00020002 026e7303 61667003 636f6d00 00010001 c00c0001
+ 00010001 4d720004 9e32cc04 03414650 03636f6d 00000200 0100014d 72000603
+ 6e7332c0 2cc02c00 02000100 014d7200 06036e73 31c02cc0 3f000100 01000280
+ 9800049e 32cc04c0 51000100 01000280 980004d0 dfa603.
+ +0.000768
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31308180 00010001 00020002 046e6577 73036166 7003636f 6d000001 0001c00c
+ 00010001 00013089 00049e32 cc040341 46500363 6f6d0000 02000100 014d7200
+ 06036e73 32c02ec0 2e000200 0100014d 72000603 6e7331c0 2ec04100 01000100
+ 02809800 049e32cc 04c05300 01000100 02809800 04d0dfa6 03.
+ +0.000623
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31318180 00010001 00020002 036e7332 03616670 02667200 00010001 c00c0001
+ 00010001 30850004 9e32cc04 03616670 02667200 00020001 00013085 0002c00c
+ c02c0002 00010001 30850006 036e7331 c02cc00c 00010001 00013085 00049e32
+ cc04c04c 00010001 00013085 0004d0df a603.
+ +0.000602
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31328180 00010001 00020002 026e7303 61667002 66720000 010001c0 0c000100
+ 01000130 8500049e 32cc0403 61667002 66720000 02000100 01308500 06036e73
+ 32c02bc0 2b000200 01000130 85000603 6e7331c0 2bc03d00 01000100 01308500
+ 049e32cc 04c04f00 01000100 01308500 04d0dfa6 03.
+ +0.000624
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31338180 00010001 00020002 046e6577 73036166 70026672 00000100 01c00c00
+ 01000100 012f4700 049e32cc 04036166 70026672 00000200 01000130 85000603
+ 6e7332c0 2dc02d00 02000100 01308500 06036e73 31c02dc0 3f000100 01000130
+ 8500049e 32cc04c0 51000100 01000130 850004d0 dfa603.
+ +0.000643
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31348180 00010001 00020002 036e7332 12616765 6e636566 72616e63 65707265
+ 73736503 636f6d00 00010001 c00c0001 00010001 30850004 9e32cc04 12616765
+ 6e636566 72616e63 65707265 73736503 636f6d00 00020001 00013085 0002c00c
+ c03c0002 00010001 30850006 036e7331 c03cc00c 00010001 00013085 00049e32
+ cc04c06c 00010001 00013085 0004d0df a603.
+ +0.000703
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31358180 00010001 00020002 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 03636f6d 00000100 01c00c00 01000100 01308500 049e32cc 04126167
+ 656e6365 6672616e 63657072 65737365 03636f6d 00000200 01000130 85000603
+ 6e7332c0 3dc03d00 02000100 01308500 06036e73 31c03dc0 5f000100 01000130
+ 8500049e 32cc04c0 71000100 01000130 850004d0 dfa603.
+ +0.000750
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31368180 00010001 00020002 036e7332 12616765 6e636566 72616e63 65707265
+ 73736502 66720000 010001c0 0c000100 01000130 8900049e 32cc0412 6167656e
+ 63656672 616e6365 70726573 73650266 72000002 00010001 30890002 c00cc03b
+ 00020001 00013089 0006036e 7331c03b c00c0001 00010001 30890004 9e32cc04
+ c06a0001 00010001 30890004 d0dfa603.
+ +0.000708
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31378180 00010001 00020002 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 02667200 00010001 c00c0001 00010001 30890004 9e32cc04 12616765
+ 6e636566 72616e63 65707265 73736502 66720000 02000100 01308900 06036e73
+ 32c03cc0 3c000200 01000130 89000603 6e7331c0 3cc05d00 01000100 01308900
+ 049e32cc 04c06f00 01000100 01308900 04d0dfa6 03.
+ +0.000739
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31388180 00010001 00020002 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 03636f6d 00000100 01c00c00 01000100 014dd900 049e32cc 04136167
+ 656e6365 6672616e 63652d70 72657373 6503636f 6d000002 00010001 4dd90002
+ c00cc03d 00020001 00014dd9 0006036e 7331c03d c00c0001 00010001 4dd90004
+ 9e32cc04 c06e0001 00010001 4dd90004 d0dfa603.
+ +0.000723
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31398180 00010001 00020002 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 6503636f 6d000001 0001c00c 00010001 00014dd9 00049e32 cc041361
+ 67656e63 65667261 6e63652d 70726573 73650363 6f6d0000 02000100 014dd900
+ 06036e73 32c03ec0 3e000200 0100014d d9000603 6e7331c0 3ec06100 01000100
+ 014dd900 049e32cc 04c07300 01000100 014dd900 04d0dfa6 03.
+ +0.000757
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313a8180 00010001 00020002 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 02667200 00010001 c00c0001 00010001 30890004 9e32cc04 13616765
+ 6e636566 72616e63 652d7072 65737365 02667200 00020001 00013089 0002c00c
+ c03c0002 00010001 30890006 036e7331 c03cc00c 00010001 00013089 00049e32
+ cc04c06c 00010001 00013089 0004d0df a603.
+ +0.000721
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313b8180 00010001 00020002 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 65026672 00000100 01c00c00 01000100 01308900 049e32cc 04136167
+ 656e6365 6672616e 63652d70 72657373 65026672 00000200 01000130 89000603
+ 6e7332c0 3dc03d00 02000100 01308900 06036e73 31c03dc0 5f000100 01000130
+ 8900049e 32cc04c0 71000100 01000130 890004d0 dfa603.
+ +0.000732
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313c8180 00010001 00020002 036e7332 0a696d61 6765666f 72756d03 636f6d00
+ 00010001 c00c0001 00010001 30890004 9e32cc04 0a696d61 6765666f 72756d03
+ 636f6d00 00020001 00013089 0002c00c c0340002 00010001 30890006 036e7331
+ c034c00c 00010001 00013089 00049e32 cc04c05c 00010001 00013089 0004d0df
+ a603.
+ +0.000677
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313d8180 00010001 00020002 046e6577 730a696d 61676566 6f72756d 03636f6d
+ 00000100 01c00c00 01000100 01308900 049e32cc 040a696d 61676566 6f72756d
+ 03636f6d 00000200 01000130 89000603 6e7332c0 35c03500 02000100 01308900
+ 06036e73 31c035c0 4f000100 01000130 8900049e 32cc04c0 61000100 01000130
+ 890004d0 dfa603.
+ +0.000673
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313e8180 00010001 00020002 036e7332 0a696d61 6765666f 72756d02 746d0266
+ 72000001 0001c00c 00010001 000280c4 00049e32 cc040a69 6d616765 666f7275
+ 6d02746d 02667200 00020001 000280c4 0002c00c c0360002 00010002 80c40006
+ 036e7331 c036c00c 00010001 000280c4 00049e32 cc04c060 00010001 000280c4
+ 0004d0df a603.
+ +0.000687
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313f8180 00010001 00020002 046e6577 730a696d 61676566 6f72756d 02746d02
+ 66720000 010001c0 0c000100 0100012f 4500049e 32cc040a 696d6167 65666f72
+ 756d0274 6d026672 00000200 01000280 c4000603 6e7332c0 37c03700 02000100
+ 0280c400 06036e73 31c037c0 53000100 01000280 c400049e 32cc04c0 65000100
+ 01000280 c40004d0 dfa603.
+ +0.000685
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31408180 00010001 00020002 036e7332 0b6f6f68 2d6c6168 2d6c6168 03636f6d
+ 00000100 01c00c00 01000100 014dd900 049e32cc 040b6f6f 682d6c61 682d6c61
+ 6803636f 6d000002 00010001 4dd90002 c00cc035 00020001 00014dd9 0006036e
+ 7331c035 c00c0001 00010001 4dd90004 9e32cc04 c05e0001 00010001 4dd90004
+ d0dfa603.
+ +0.000664
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31418180 00010000 00010000 036e7332 0b616670 73636965 6e636573 03636f6d
+ 00000100 010b6166 70736369 656e6365 7303636f 6d000006 00010000 0148002c
+ 03646e73 08766963 746f6972 65026672 0004726f 6f74c044 77276589 00007080
+ 00001c20 004f1a00 00015180.
+ +0.000607
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31428180 00010000 00010000 036e7332 06616670 646f6303 636f6d00 00010001
+ 06616670 646f6303 636f6d00 00060001 00000148 002c0364 6e730876 6963746f
+ 69726502 66720004 726f6f74 c03a7727 65890000 70800000 1c20004f 1a000001
+ 5180.
+ +0.001536
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31438180 00010001 00020002 036e7332 09616670 2d6e6f74 65730363 6f6d0000
+ 010001c0 0c000100 01000130 8900049e 32cc0409 6166702d 6e6f7465 7303636f
+ 6d000002 00010001 30890002 c00cc033 00020001 00013089 0006036e 7331c033
+ c00c0001 00010001 30890004 9e32cc04 c05a0001 00010001 30890004 d0dfa603.
+ +0.000601
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31448180 00010001 00020002 036e7332 0a616670 2d646f6d 696e6f03 636f6d00
+ 00010001 c00c0001 00010001 30890004 9e32cc04 0a616670 2d646f6d 696e6f03
+ 636f6d00 00020001 00013089 0002c00c c0340002 00010001 30890006 036e7331
+ c034c00c 00010001 00013089 00049e32 cc04c05c 00010001 00013089 0004d0df
+ a603.
+ +0.000629
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31458180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ +0.000317
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000001
+ read fd=5 buflen=686
+ read=EAGAIN
+ +0.000115
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.920609
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-754319
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 050001.
+ +0.000252
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000127
+ close fd=4
+ close=OK
+ +0.000208
+ close fd=5
+ close=OK
+ +0.000001
diff --git a/regress/case-norecurse2.err b/regress/case-norecurse2.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-norecurse2.err
diff --git a/regress/case-norecurse2.out b/regress/case-norecurse2.out
new file mode 100644
index 0000000..4c3ae51
--- /dev/null
+++ b/regress/case-norecurse2.out
@@ -0,0 +1,60 @@
+adns debug: using nameserver 172.18.45.6
+4.204.50.158.in-addr.arpa flags 0 type 1 A(-) submitted
+4.204.50.158.in-addr.arpa flags 0 type 2 NS(raw) submitted
+4.204.50.158.in-addr.arpa flags 0 type 5 CNAME(-) submitted
+4.204.50.158.in-addr.arpa flags 0 type 6 SOA(raw) submitted
+4.204.50.158.in-addr.arpa flags 0 type 12 PTR(raw) submitted
+4.204.50.158.in-addr.arpa flags 0 type 13 HINFO(-) submitted
+4.204.50.158.in-addr.arpa flags 0 type 15 MX(raw) submitted
+4.204.50.158.in-addr.arpa flags 0 type 16 TXT(-) submitted
+4.204.50.158.in-addr.arpa flags 0 type 17 RP(raw) submitted
+4.204.50.158.in-addr.arpa flags 0 type 65537 A(addr) submitted
+4.204.50.158.in-addr.arpa flags 0 type 65538 NS(+addr) submitted
+4.204.50.158.in-addr.arpa flags 0 type 65548 PTR(checked) submitted
+4.204.50.158.in-addr.arpa flags 0 type 65551 MX(+addr) submitted
+4.204.50.158.in-addr.arpa flags 0 type 131078 SOA(822) submitted
+4.204.50.158.in-addr.arpa flags 0 type 131089 RP(822) submitted
+4.204.50.158.in-addr.arpa flags 0 type SOA(raw): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type NS(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type NS(raw): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type SOA(822): No such data; nrrs=0; cname=$; owner=$; ttl=0
+adns debug: reply not found, id 312d, query owner 4.204.50.158.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 311f, query owner 4.204.50.158.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 3120, query owner 4.204.50.158.in-addr.arpa (NS=172.18.45.6)
+adns debug: reply not found, id 312b, query owner 4.204.50.158.in-addr.arpa (NS=172.18.45.6)
+4.204.50.158.in-addr.arpa flags 0 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=0
+4.204.50.158.in-addr.arpa flags 0 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=0
+adns debug: TCP connected (NS=172.18.45.6)
+4.204.50.158.in-addr.arpa flags 0 type PTR(raw): OK; nrrs=23; cname=$; owner=$; ttl=0
+ ns2.afp.com
+ ns.afp.com
+ news.afp.com
+ ns2.afp.fr
+ ns.afp.fr
+ news.afp.fr
+ ns2.agencefrancepresse.com
+ news.agencefrancepresse.com
+ ns2.agencefrancepresse.fr
+ news.agencefrancepresse.fr
+ ns2.agencefrance-presse.com
+ news.agencefrance-presse.com
+ ns2.agencefrance-presse.fr
+ news.agencefrance-presse.fr
+ ns2.imageforum.com
+ news.imageforum.com
+ ns2.imageforum.tm.fr
+ news.imageforum.tm.fr
+ ns2.ooh-lah-lah.com
+ ns2.afpsciences.com
+ ns2.afpdoc.com
+ ns2.afp-notes.com
+ ns2.afp-domino.com
+4.204.50.158.in-addr.arpa flags 0 type PTR(checked): Inconsistent resource records in DNS; nrrs=0; cname=$; owner=$; ttl=-6
+rc=0
diff --git a/regress/case-norecurse2.sys b/regress/case-norecurse2.sys
new file mode 100644
index 0000000..2e2b8e5
--- /dev/null
+++ b/regress/case-norecurse2.sys
@@ -0,0 +1,1224 @@
+adnstest default -0x416
+4.204.50.158.in-addr.arpa
+ start 939764277.018636
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000162
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000052
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000042
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.001984
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000131
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.001195
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000092
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.001175
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000096
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.001216
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000098
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001153
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000095
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0d0001.
+ sendto=43
+ +0.001170
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000103
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.001162
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000099
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 100001.
+ sendto=43
+ +0.001193
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000104
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.001203
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000105
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.001379
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000105
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.001199
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000107
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.001196
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000111
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0f0001.
+ sendto=43
+ +0.001229
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000114
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.001187
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000115
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.001165
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000116
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.979603
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.005569
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 060001.
+ +0.000287
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000173
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.973574
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.149373
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0d0001.
+ +0.000294
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000119
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.823788
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.019622
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258580 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0f0001.
+ +0.000268
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000116
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.803782
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.019566
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268580 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 100001.
+ +0.000266
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000116
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.783834
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.019476
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0f0001.
+ +0.000261
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000120
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.763977
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.189710
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298580 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 010001.
+ +0.000268
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000119
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.573880
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.019648
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8580 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 020001.
+ +0.000260
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000119
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.553853
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.019563
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ +0.000257
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000119
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.533914
+ select=0 rfds=[] wfds=[] efds=[]
+ +1.-463554
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 010001.
+ sendto=43
+ +0.000546
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 020001.
+ sendto=43
+ +0.000484
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.000484
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.001940
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000119
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 010001.
+ +0.000255
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 020001.
+ +0.000284
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000100
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.001182
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.007693
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000479
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.000465
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.001722
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009054
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000480
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 060001.
+ sendto=43
+ +0.000489
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.980098
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000131
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 060001.
+ +0.000231
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000119
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.979617
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-21402
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.001019
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009951
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.000505
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000529
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.000468
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008498
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008500
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000459
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.989538
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-10446
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.000537
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000484
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.000487
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008478
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008478
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000106
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000456
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.989451
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-10542
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.000612
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000551
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.000564
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008358
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008252
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000106
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009994
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000467
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.979559
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.372703
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 060001.
+ +0.000261
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000225
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.606370
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039270
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 010001.
+ +0.000255
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000224
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.566621
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.149484
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 020001.
+ +0.000261
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000200
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.416676
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-583334
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000010
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.010045
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 050001.
+ sendto=43
+ +0.000504
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000456
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ sendto=43
+ +0.000499
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.008480
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008495
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001.
+ sendto=43
+ +0.000644
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.989402
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.490712
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278580 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 110001.
+ +0.001892
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238380 00010012 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000000 00000d03 6e733203 61667003
+ 636f6d00 c00c000c 00010000 00000005 026e73c0 3bc00c00 0c000100 00000000
+ 07046e65 7773c03b c00c000c 00010000 0000000c 036e7332 03616670 02667200
+ c00c000c 00010000 00000005 026e73c0 78c00c00 0c000100 00000000 07046e65
+ 7773c078 c00c000c 00010000 00000019 036e7332 12616765 6e636566 72616e63
+ 65707265 737365c0 3fc00c00 0c000100 00000000 07046e65 7773c0b4 c00c000c
+ 00010000 00000019 036e7332 12616765 6e636566 72616e63 65707265 737365c0
+ 7cc00c00 0c000100 00000000 07046e65 7773c0ec c00c000c 00010000 0000001a
+ 036e7332 13616765 6e636566 72616e63 652d7072 65737365 c03fc00c 000c0001
+ 00000000 0007046e 657773c1 24c00c00 0c000100 00000000 1a036e73 32136167
+ 656e6365 6672616e 63652d70 72657373 65c07cc0 0c000c00 01000000 00000704
+ 6e657773 c15dc00c 000c0001 00000000 0011036e 73320a69 6d616765 666f7275
+ 6dc03fc0 0c000c00 01000000 00000704 6e657773 c196c00c 000c0001 00000000
+ 0014036e 73320a69 6d616765 666f7275 6d02746d c07cc00c 000c0001 00000000
+ 0007046e 657773c1 c6.
+ +0.003281
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.002885
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000045
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000039
+ connect fd=5 addr=172.18.45.6:53
+ connect=EINPROGRESS
+ +0.000565
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010000 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 050001.
+ +0.000249
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8380 00010012 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000000 00000d03 6e733203 61667003
+ 636f6d00 c00c000c 00010000 00000005 026e73c0 3bc00c00 0c000100 00000000
+ 07046e65 7773c03b c00c000c 00010000 0000000c 036e7332 03616670 02667200
+ c00c000c 00010000 00000005 026e73c0 78c00c00 0c000100 00000000 07046e65
+ 7773c078 c00c000c 00010000 00000019 036e7332 12616765 6e636566 72616e63
+ 65707265 737365c0 3fc00c00 0c000100 00000000 07046e65 7773c0b4 c00c000c
+ 00010000 00000019 036e7332 12616765 6e636566 72616e63 65707265 737365c0
+ 7cc00c00 0c000100 00000000 07046e65 7773c0ec c00c000c 00010000 0000001a
+ 036e7332 13616765 6e636566 72616e63 652d7072 65737365 c03fc00c 000c0001
+ 00000000 0007046e 657773c1 24c00c00 0c000100 00000000 1a036e73 32136167
+ 656e6365 6672616e 63652d70 72657373 65c07cc0 0c000c00 01000000 00000704
+ 6e657773 c15dc00c 000c0001 00000000 0011036e 73320a69 6d616765 666f7275
+ 6dc03fc0 0c000c00 01000000 00000704 6e657773 c196c00c 000c0001 00000000
+ 0014036e 73320a69 6d616765 666f7275 6d02746d c07cc00c 000c0001 00000000
+ 0007046e 657773c1 c6.
+ +0.001704
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8380 00010012 00000000 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000000 00000d03 6e733203 61667003
+ 636f6d00 c00c000c 00010000 00000005 026e73c0 3bc00c00 0c000100 00000000
+ 07046e65 7773c03b c00c000c 00010000 0000000c 036e7332 03616670 02667200
+ c00c000c 00010000 00000005 026e73c0 78c00c00 0c000100 00000000 07046e65
+ 7773c078 c00c000c 00010000 00000019 036e7332 12616765 6e636566 72616e63
+ 65707265 737365c0 3fc00c00 0c000100 00000000 07046e65 7773c0b4 c00c000c
+ 00010000 00000019 036e7332 12616765 6e636566 72616e63 65707265 737365c0
+ 7cc00c00 0c000100 00000000 07046e65 7773c0ec c00c000c 00010000 0000001a
+ 036e7332 13616765 6e636566 72616e63 652d7072 65737365 c03fc00c 000c0001
+ 00000000 0007046e 657773c1 24c00c00 0c000100 00000000 1a036e73 32136167
+ 656e6365 6672616e 63652d70 72657373 65c07cc0 0c000c00 01000000 00000704
+ 6e657773 c15dc00c 000c0001 00000000 0011036e 73320a69 6d616765 666f7275
+ 6dc03fc0 0c000c00 01000000 00000704 6e657773 c196c00c 000c0001 00000000
+ 0014036e 73320a69 6d616765 666f7275 6d02746d c07cc00c 000c0001 00000000
+ 0007046e 657773c1 c6.
+ +0.001827
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000201
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.987312
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.000364
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000127
+ write fd=5
+ 002b3123 01000001 00000000 00000134 03323034 02353003 31353807 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.001692
+ write fd=5
+ 002b312b 01000001 00000000 00000134 03323034 02353003 31353807 696e2d61
+ 64647204 61727061 00000c00 01.
+ write=45
+ +0.001275
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.983854
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.000150
+ read fd=5 buflen=2
+ read=OK
+ 02e1.
+ +0.000196
+ read fd=5 buflen=737
+ read=OK
+ 31238180 00010017 00020002 01340332 30340235 30033135 3807696e 2d616464
+ 72046172 70610000 0c0001c0 0c000c00 01000000 00000d03 6e733203 61667003
+ 636f6d00 c00c000c 00010000 00000005 026e73c0 3bc00c00 0c000100 00000000
+ 07046e65 7773c03b c00c000c 00010000 0000000c 036e7332 03616670 02667200
+ c00c000c 00010000 00000005 026e73c0 78c00c00 0c000100 00000000 07046e65
+ 7773c078 c00c000c 00010000 00000019 036e7332 12616765 6e636566 72616e63
+ 65707265 737365c0 3fc00c00 0c000100 00000000 07046e65 7773c0b4 c00c000c
+ 00010000 00000019 036e7332 12616765 6e636566 72616e63 65707265 737365c0
+ 7cc00c00 0c000100 00000000 07046e65 7773c0ec c00c000c 00010000 0000001a
+ 036e7332 13616765 6e636566 72616e63 652d7072 65737365 c03fc00c 000c0001
+ 00000000 0007046e 657773c1 24c00c00 0c000100 00000000 1a036e73 32136167
+ 656e6365 6672616e 63652d70 72657373 65c07cc0 0c000c00 01000000 00000704
+ 6e657773 c15dc00c 000c0001 00000000 0011036e 73320a69 6d616765 666f7275
+ 6dc03fc0 0c000c00 01000000 00000704 6e657773 c196c00c 000c0001 00000000
+ 0014036e 73320a69 6d616765 666f7275 6d02746d c07cc00c 000c0001 00000000
+ 0007046e 657773c1 c6c00c00 0c000100 00000000 12036e73 320b6f6f 682d6c61
+ 682d6c61 68c03fc0 0c000c00 01000000 00001203 6e73320b 61667073 6369656e
+ 636573c0 3fc00c00 0c000100 00000000 0d036e73 32066166 70646f63 c03fc00c
+ 000c0001 00000000 0010036e 73320961 66702d6e 6f746573 c03fc00c 000c0001
+ 00000000 0011036e 73320a61 66702d64 6f6d696e 6fc03f02 35300331 35380769
+ 6e2d6164 64720461 72706100 00020001 0007e8fe 0002c037 02353003 31353807
+ 696e2d61 64647204 61727061 00000200 010007e8 fe000603 4e5331c0 3bc03700
+ 01000100 02a2fe00 049e32cc 04034e53 31c03b00 01000100 02a2fe00 04d0dfa6
+ 03.
+ +0.002595
+ read fd=5 buflen=739
+ read=OK
+ 02e1312b 81800001 00170002 00020134 03323034 02353003 31353807 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 00000000 0d036e73 32036166
+ 7003636f 6d00c00c 000c0001 00000000 0005026e 73c03bc0 0c000c00 01000000
+ 00000704 6e657773 c03bc00c 000c0001 00000000 000c036e 73320361 66700266
+ 7200c00c 000c0001 00000000 0005026e 73c078c0 0c000c00 01000000 00000704
+ 6e657773 c078c00c 000c0001 00000000 0019036e 73321261 67656e63 65667261
+ 6e636570 72657373 65c03fc0 0c000c00 01000000 00000704 6e657773 c0b4c00c
+ 000c0001 00000000 0019036e 73321261 67656e63 65667261 6e636570 72657373
+ 65c07cc0 0c000c00 01000000 00000704 6e657773 c0ecc00c 000c0001 00000000
+ 001a036e 73321361 67656e63 65667261 6e63652d 70726573 7365c03f c00c000c
+ 00010000 00000007 046e6577 73c124c0 0c000c00 01000000 00001a03 6e733213
+ 6167656e 63656672 616e6365 2d707265 737365c0 7cc00c00 0c000100 00000000
+ 07046e65 7773c15d c00c000c 00010000 00000011 036e7332 0a696d61 6765666f
+ 72756dc0 3fc00c00 0c000100 00000000 07046e65 7773c196 c00c000c 00010000
+ 00000014 036e7332 0a696d61 6765666f 72756d02 746dc07c c00c000c 00010000
+ 00000007 046e6577 73c1c6c0 0c000c00 01000000 00001203 6e73320b 6f6f682d
+ 6c61682d 6c6168c0 3fc00c00 0c000100 00000000 12036e73 320b6166 70736369
+ 656e6365 73c03fc0 0c000c00 01000000 00000d03 6e733206 61667064 6f63c03f
+ c00c000c 00010000 00000010 036e7332 09616670 2d6e6f74 6573c03f c00c000c
+ 00010000 00000011 036e7332 0a616670 2d646f6d 696e6fc0 3f023530 03313538
+ 07696e2d 61646472 04617270 61000002 00010007 e8fe0002 c0370235 30033135
+ 3807696e 2d616464 72046172 70610000 02000100 07e8fe00 06034e53 31c03bc0
+ 37000100 010002a2 fe00049e 32cc0403 4e5331c0 3b000100 010002a2 fe0004d0
+ dfa603.
+ +0.004644
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 036e7332 03616670 03636f6d 00000100 01.
+ sendto=29
+ +0.001410
+ sendto fd=4 addr=172.18.45.6:53
+ 31300100 00010000 00000000 026e7303 61667003 636f6d00 00010001.
+ sendto=28
+ +0.001075
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 046e6577 73036166 7003636f 6d000001 0001.
+ sendto=30
+ +0.001072
+ sendto fd=4 addr=172.18.45.6:53
+ 31320100 00010000 00000000 036e7332 03616670 02667200 00010001.
+ sendto=28
+ +0.001053
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 026e7303 61667002 66720000 010001.
+ sendto=27
+ +0.001065
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 046e6577 73036166 70026672 00000100 01.
+ sendto=29
+ +0.001063
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 036e7332 12616765 6e636566 72616e63 65707265
+ 73736503 636f6d00 00010001.
+ sendto=44
+ +0.001117
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 03636f6d 00000100 01.
+ sendto=45
+ +0.001230
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 036e7332 12616765 6e636566 72616e63 65707265
+ 73736502 66720000 010001.
+ sendto=43
+ +0.001352
+ sendto fd=4 addr=172.18.45.6:53
+ 31380100 00010000 00000000 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 02667200 00010001.
+ sendto=44
+ +0.001324
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 03636f6d 00000100 01.
+ sendto=45
+ +0.001336
+ sendto fd=4 addr=172.18.45.6:53
+ 313a0100 00010000 00000000 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 6503636f 6d000001 0001.
+ sendto=46
+ +0.001340
+ sendto fd=4 addr=172.18.45.6:53
+ 313b0100 00010000 00000000 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 02667200 00010001.
+ sendto=44
+ +0.001322
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 65026672 00000100 01.
+ sendto=45
+ +0.001312
+ sendto fd=4 addr=172.18.45.6:53
+ 313d0100 00010000 00000000 036e7332 0a696d61 6765666f 72756d03 636f6d00
+ 00010001.
+ sendto=36
+ +0.001330
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 046e6577 730a696d 61676566 6f72756d 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.001298
+ sendto fd=4 addr=172.18.45.6:53
+ 313f0100 00010000 00000000 036e7332 0a696d61 6765666f 72756d02 746d0266
+ 72000001 0001.
+ sendto=38
+ +0.001326
+ sendto fd=4 addr=172.18.45.6:53
+ 31400100 00010000 00000000 046e6577 730a696d 61676566 6f72756d 02746d02
+ 66720000 010001.
+ sendto=39
+ +0.001310
+ sendto fd=4 addr=172.18.45.6:53
+ 31410100 00010000 00000000 036e7332 0b6f6f68 2d6c6168 2d6c6168 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.001326
+ sendto fd=4 addr=172.18.45.6:53
+ 31420100 00010000 00000000 036e7332 0b616670 73636965 6e636573 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.001329
+ sendto fd=4 addr=172.18.45.6:53
+ 31430100 00010000 00000000 036e7332 06616670 646f6303 636f6d00 00010001.
+ sendto=32
+ +0.001283
+ sendto fd=4 addr=172.18.45.6:53
+ 31440100 00010000 00000000 036e7332 09616670 2d6e6f74 65730363 6f6d0000
+ 010001.
+ sendto=35
+ +0.001386
+ sendto fd=4 addr=172.18.45.6:53
+ 31450100 00010000 00000000 036e7332 0a616670 2d646f6d 696e6f03 636f6d00
+ 00010001.
+ sendto=36
+ +0.001512
+ read fd=5 buflen=739
+ read=EAGAIN
+ +0.000090
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.963304
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004077
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8180 00010001 000d000d 036e7332 03616670 03636f6d 00000100 01c00c00
+ 01000100 02813e00 049e32cc 04000002 00010007 e8df0014 014c0c52 4f4f542d
+ 53455256 45525303 4e455400 00000200 010007e8 df000401 4dc03a00 00020001
+ 0007e8df 00040149 c03a0000 02000100 07e8df00 040145c0 3a000002 00010007
+ e8df0004 0144c03a 00000200 010007e8 df000401 41c03a00 00020001 0007e8df
+ 00040148 c03a0000 02000100 07e8df00 040143c0 3a000002 00010007 e8df0004
+ 0147c03a 00000200 010007e8 df000401 46c03a00 00020001 0007e8df 00040142
+ c03a0000 02000100 07e8df00 04014ac0 3a000002 00010007 e8df0004 014bc03a
+ c0380001 00010009 3a5f0004 c620400c c0570001 00010009 3a5f0004 ca0c1b21
+ c0660001 00010009 3a5f0004 c0249411 c0750001 00010009 3a5f0004 c0cbe60a
+ c0840001 00010009 3a5f0004 80080a5a c0930001 00010009 3a5f0004 c6290004
+ c0a20001 00010009 3a5f0004 803f0235 c0b10001 00010009 3a5f0004 c021040c
+ c0c00001 00010009 3a5f0004 c0702404 c0cf0001 00010009 3a5f0004 c00505f1
+ c0de0001 00010009 3a5f0004 8009006b c0ed0001 00010009 3a5f0004 c629000a
+ c0fc0001 00010009 3a5f0004 c1000e81.
+ +0.001847
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000277
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.957103
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-40545
+ sendto fd=4 addr=172.18.45.6:53
+ 31300100 00010000 00000000 026e7303 61667003 636f6d00 00010001.
+ sendto=28
+ +0.000601
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 046e6577 73036166 7003636f 6d000001 0001.
+ sendto=30
+ +0.000404
+ sendto fd=4 addr=172.18.45.6:53
+ 31320100 00010000 00000000 036e7332 03616670 02667200 00010001.
+ sendto=28
+ +0.000424
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 026e7303 61667002 66720000 010001.
+ sendto=27
+ +0.000383
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 046e6577 73036166 70026672 00000100 01.
+ sendto=29
+ +0.000389
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 036e7332 12616765 6e636566 72616e63 65707265
+ 73736503 636f6d00 00010001.
+ sendto=44
+ +0.000446
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 03636f6d 00000100 01.
+ sendto=45
+ +0.000449
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 036e7332 12616765 6e636566 72616e63 65707265
+ 73736502 66720000 010001.
+ sendto=43
+ +0.000440
+ sendto fd=4 addr=172.18.45.6:53
+ 31380100 00010000 00000000 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 02667200 00010001.
+ sendto=44
+ +0.000441
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 03636f6d 00000100 01.
+ sendto=45
+ +0.000474
+ sendto fd=4 addr=172.18.45.6:53
+ 313a0100 00010000 00000000 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 6503636f 6d000001 0001.
+ sendto=46
+ +0.000451
+ sendto fd=4 addr=172.18.45.6:53
+ 313b0100 00010000 00000000 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 02667200 00010001.
+ sendto=44
+ +0.000440
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 65026672 00000100 01.
+ sendto=45
+ +0.000439
+ sendto fd=4 addr=172.18.45.6:53
+ 313d0100 00010000 00000000 036e7332 0a696d61 6765666f 72756d03 636f6d00
+ 00010001.
+ sendto=36
+ +0.000413
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 046e6577 730a696d 61676566 6f72756d 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.000416
+ sendto fd=4 addr=172.18.45.6:53
+ 313f0100 00010000 00000000 036e7332 0a696d61 6765666f 72756d02 746d0266
+ 72000001 0001.
+ sendto=38
+ +0.000442
+ sendto fd=4 addr=172.18.45.6:53
+ 31400100 00010000 00000000 046e6577 730a696d 61676566 6f72756d 02746d02
+ 66720000 010001.
+ sendto=39
+ +0.000418
+ sendto fd=4 addr=172.18.45.6:53
+ 31410100 00010000 00000000 036e7332 0b6f6f68 2d6c6168 2d6c6168 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.000412
+ sendto fd=4 addr=172.18.45.6:53
+ 31420100 00010000 00000000 036e7332 0b616670 73636965 6e636573 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.000413
+ sendto fd=4 addr=172.18.45.6:53
+ 31430100 00010000 00000000 036e7332 06616670 646f6303 636f6d00 00010001.
+ sendto=32
+ +0.000394
+ sendto fd=4 addr=172.18.45.6:53
+ 31440100 00010000 00000000 036e7332 09616670 2d6e6f74 65730363 6f6d0000
+ 010001.
+ sendto=35
+ +0.000403
+ sendto fd=4 addr=172.18.45.6:53
+ 31450100 00010000 00000000 036e7332 0a616670 2d646f6d 696e6f03 636f6d00
+ 00010001.
+ sendto=36
+ +0.000407
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.990501
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-09491
+ sendto fd=4 addr=172.18.45.6:53
+ 31300100 00010000 00000000 026e7303 61667003 636f6d00 00010001.
+ sendto=28
+ +0.000642
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 046e6577 73036166 7003636f 6d000001 0001.
+ sendto=30
+ +0.000399
+ sendto fd=4 addr=172.18.45.6:53
+ 31320100 00010000 00000000 036e7332 03616670 02667200 00010001.
+ sendto=28
+ +0.000385
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 026e7303 61667002 66720000 010001.
+ sendto=27
+ +0.000380
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 046e6577 73036166 70026672 00000100 01.
+ sendto=29
+ +0.000388
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 036e7332 12616765 6e636566 72616e63 65707265
+ 73736503 636f6d00 00010001.
+ sendto=44
+ +0.000443
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 03636f6d 00000100 01.
+ sendto=45
+ +0.000447
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 036e7332 12616765 6e636566 72616e63 65707265
+ 73736502 66720000 010001.
+ sendto=43
+ +0.000456
+ sendto fd=4 addr=172.18.45.6:53
+ 31380100 00010000 00000000 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 02667200 00010001.
+ sendto=44
+ +0.000438
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 03636f6d 00000100 01.
+ sendto=45
+ +0.000445
+ sendto fd=4 addr=172.18.45.6:53
+ 313a0100 00010000 00000000 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 6503636f 6d000001 0001.
+ sendto=46
+ +0.000447
+ sendto fd=4 addr=172.18.45.6:53
+ 313b0100 00010000 00000000 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 02667200 00010001.
+ sendto=44
+ +0.000437
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 65026672 00000100 01.
+ sendto=45
+ +0.000438
+ sendto fd=4 addr=172.18.45.6:53
+ 313d0100 00010000 00000000 036e7332 0a696d61 6765666f 72756d03 636f6d00
+ 00010001.
+ sendto=36
+ +0.000434
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 046e6577 730a696d 61676566 6f72756d 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.000416
+ sendto fd=4 addr=172.18.45.6:53
+ 313f0100 00010000 00000000 036e7332 0a696d61 6765666f 72756d02 746d0266
+ 72000001 0001.
+ sendto=38
+ +0.000415
+ sendto fd=4 addr=172.18.45.6:53
+ 31400100 00010000 00000000 046e6577 730a696d 61676566 6f72756d 02746d02
+ 66720000 010001.
+ sendto=39
+ +0.000416
+ sendto fd=4 addr=172.18.45.6:53
+ 31410100 00010000 00000000 036e7332 0b6f6f68 2d6c6168 2d6c6168 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.000412
+ sendto fd=4 addr=172.18.45.6:53
+ 31420100 00010000 00000000 036e7332 0b616670 73636965 6e636573 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.000414
+ sendto fd=4 addr=172.18.45.6:53
+ 31430100 00010000 00000000 036e7332 06616670 646f6303 636f6d00 00010001.
+ sendto=32
+ +0.000392
+ sendto fd=4 addr=172.18.45.6:53
+ 31440100 00010000 00000000 036e7332 09616670 2d6e6f74 65730363 6f6d0000
+ 010001.
+ sendto=35
+ +0.000425
+ sendto fd=4 addr=172.18.45.6:53
+ 31450100 00010000 00000000 036e7332 0a616670 2d646f6d 696e6f03 636f6d00
+ 00010001.
+ sendto=36
+ +0.000409
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.990522
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-235306
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31308580 00010001 00020002 026e7303 61667003 636f6d00 00010001 c00c0001
+ 00010001 51800004 9e32cc04 03616670 03636f6d 00000200 01000151 80000603
+ 6e7332c0 2cc02c00 02000100 01518000 06036e73 31c02cc0 3f000100 01000151
+ 8000049e 32cc04c0 51000100 01000151 800004d0 dfa603.
+ +0.000734
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000269
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.224825
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.179062
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31458580 00010001 00020002 036e7332 0a616670 2d646f6d 696e6f03 636f6d00
+ 00010001 c00c0001 00010001 51800004 9e32cc04 0a616670 2d646f6d 696e6f03
+ 636f6d00 00020001 00015180 0002c00c c0340002 00010001 51800006 036e7331
+ c034c00c 00010001 00015180 00049e32 cc04c05c 00010001 00015180 0004d0df
+ a603.
+ +0.000758
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000284
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.044721
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038932
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31448580 00010001 00020002 036e7332 09616670 2d6e6f74 65730363 6f6d0000
+ 010001c0 0c000100 01000151 8000049e 32cc0409 6166702d 6e6f7465 7303636f
+ 6d000002 00010001 51800002 c00cc033 00020001 00015180 0006036e 7331c033
+ c00c0001 00010001 51800004 9e32cc04 c05a0001 00010001 51800004 d0dfa603.
+ +0.000729
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000258
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.004802
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.399140
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313b8180 00010001 00020002 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 02667200 00010001 c00c0001 00010005 46000004 9e32cc04 13616765
+ 6e636566 72616e63 652d7072 65737365 02667200 00020001 00054600 0002c00c
+ c03c0002 00010005 46000006 036e7331 c03cc00c 00010001 00054600 00049e32
+ cc04c06c 00010001 00054600 0004d0df a603.
+ +0.000770
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000288
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.604604
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038862
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313e8580 00010001 00020002 046e6577 730a696d 61676566 6f72756d 03636f6d
+ 00000100 01c00c00 01000100 01518000 049e32cc 040a696d 61676566 6f72756d
+ 03636f6d 00000200 01000151 80000603 6e7332c0 35c03500 02000100 01518000
+ 06036e73 31c035c0 4f000100 01000151 8000049e 32cc04c0 61000100 01000151
+ 800004d0 dfa603.
+ +0.000714
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000248
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.564780
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-870685
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31368580 00010001 00020002 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 03636f6d 00000100 01c00c00 01000100 01518000 049e32cc 04126167
+ 656e6365 6672616e 63657072 65737365 03636f6d 00000200 01000151 80000603
+ 6e7332c0 3dc03d00 02000100 01518000 06036e73 31c03dc0 5f000100 01000151
+ 8000049e 32cc04c0 71000100 01000151 800004d0 dfa603.
+ +0.000749
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000248
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.434468
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038661
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31358580 00010001 00020002 036e7332 12616765 6e636566 72616e63 65707265
+ 73736503 636f6d00 00010001 c00c0001 00010001 51800004 9e32cc04 12616765
+ 6e636566 72616e63 65707265 73736503 636f6d00 00020001 00015180 0002c00c
+ c03c0002 00010001 51800006 036e7331 c03cc00c 00010001 00015180 00049e32
+ cc04c06c 00010001 00015180 0004d0df a603.
+ +0.000722
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000266
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.394819
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.049154
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31378180 00010001 00020002 036e7332 12616765 6e636566 72616e63 65707265
+ 73736502 66720000 010001c0 0c000100 01000546 0000049e 32cc0412 6167656e
+ 63656672 616e6365 70726573 73650266 72000002 00010005 46000002 c00cc03b
+ 00020001 00054600 0006036e 7331c03b c00c0001 00010005 46000004 9e32cc04
+ c06a0001 00010005 46000004 d0dfa603.
+ +0.000707
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000243
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.344715
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039336
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31398580 00010001 00020002 036e7332 13616765 6e636566 72616e63 652d7072
+ 65737365 03636f6d 00000100 01c00c00 01000100 01518000 049e32cc 04136167
+ 656e6365 6672616e 63652d70 72657373 6503636f 6d000002 00010001 51800002
+ c00cc03d 00020001 00015180 0006036e 7331c03d c00c0001 00010001 51800004
+ 9e32cc04 c06e0001 00010001 51800004 d0dfa603.
+ +0.000695
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000267
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.304417
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.078532
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31318580 00010001 00020002 046e6577 73036166 7003636f 6d000001 0001c00c
+ 00010001 00015180 00049e32 cc040361 66700363 6f6d0000 02000100 01518000
+ 06036e73 32c02ec0 2e000200 01000151 80000603 6e7331c0 2ec04100 01000100
+ 01518000 049e32cc 04c05300 01000100 01518000 04d0dfa6 03.
+ +0.000600
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000235
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.225050
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039210
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31328180 00010001 00020002 036e7332 03616670 02667200 00010001 c00c0001
+ 00010005 46000004 9e32cc04 03616670 02667200 00020001 00054600 0002c00c
+ c02c0002 00010005 46000006 036e7331 c02cc00c 00010001 00054600 00049e32
+ cc04c04c 00010001 00054600 0004d0df a603.
+ +0.000589
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000236
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.185015
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.159098
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31388180 00010001 00010001 046e6577 73126167 656e6365 6672616e 63657072
+ 65737365 02667200 00010001 c00c0001 00010000 00000004 9e32cc04 12616765
+ 6e636566 72616e63 65707265 73736502 66720000 02000100 00000000 06036e73
+ 31c03cc0 5d000100 01000000 000004d0 dfa603.
+ +0.000578
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000253
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.025086
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.025066
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=0.000020
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009997
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 026e7303 61667002 66720000 010001.
+ sendto=27
+ +0.000458
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 046e6577 73036166 70026672 00000100 01.
+ sendto=29
+ +0.000387
+ sendto fd=4 addr=172.18.45.6:53
+ 313a0100 00010000 00000000 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 6503636f 6d000001 0001.
+ sendto=46
+ +0.000441
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 046e6577 73136167 656e6365 6672616e 63652d70
+ 72657373 65026672 00000100 01.
+ sendto=45
+ +0.000438
+ sendto fd=4 addr=172.18.45.6:53
+ 313d0100 00010000 00000000 036e7332 0a696d61 6765666f 72756d03 636f6d00
+ 00010001.
+ sendto=36
+ +0.000561
+ sendto fd=4 addr=172.18.45.6:53
+ 313f0100 00010000 00000000 036e7332 0a696d61 6765666f 72756d02 746d0266
+ 72000001 0001.
+ sendto=38
+ +0.000423
+ sendto fd=4 addr=172.18.45.6:53
+ 31400100 00010000 00000000 046e6577 730a696d 61676566 6f72756d 02746d02
+ 66720000 010001.
+ sendto=39
+ +0.000446
+ sendto fd=4 addr=172.18.45.6:53
+ 31410100 00010000 00000000 036e7332 0b6f6f68 2d6c6168 2d6c6168 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.000418
+ sendto fd=4 addr=172.18.45.6:53
+ 31420100 00010000 00000000 036e7332 0b616670 73636965 6e636573 03636f6d
+ 00000100 01.
+ sendto=37
+ +0.000584
+ sendto fd=4 addr=172.18.45.6:53
+ 31430100 00010000 00000000 036e7332 06616670 646f6303 636f6d00 00010001.
+ sendto=32
+ +0.000560
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.995284
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000226
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313d8180 00010001 00020002 036e7332 0a696d61 6765666f 72756d03 636f6d00
+ 00010001 c00c0001 00010001 409f0004 9e32cc04 0a696d61 6765666f 72756d03
+ 434f4d00 00020001 0001517f 0002c00c c0340002 00010001 517f0006 036e7331
+ c034c00c 00010001 0001409f 00049e32 cc04c05c 00010001 0001517f 0004d0df
+ a603.
+ +0.000582
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000266
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.994210
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.168328
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31338180 00010001 00010001 026e7303 61667002 66720000 010001c0 0c000100
+ 01000000 0000049e 32cc0403 61667002 66720000 02000100 00000000 06036e73
+ 31c02bc0 3d000100 01000000 000004d0 dfa603.
+ +0.000470
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000252
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=1.825160
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.229075
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31438580 00010000 00010000 036e7332 06616670 646f6303 636f6d00 00010001
+ 06616670 646f6303 636f6d00 00060001 00015180 002c0364 6e730876 6963746f
+ 69726502 66720004 726f6f74 c03a7727 65890000 70800000 1c20004f 1a000001
+ 5180.
+ +0.000492
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.001505
+ close fd=4
+ close=OK
+ +0.000260
+ close fd=5
+ close=OK
+ +0.000401
diff --git a/regress/case-norecurse3.err b/regress/case-norecurse3.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-norecurse3.err
diff --git a/regress/case-norecurse3.out b/regress/case-norecurse3.out
new file mode 100644
index 0000000..dfe31a2
--- /dev/null
+++ b/regress/case-norecurse3.out
@@ -0,0 +1,32 @@
+adns debug: using nameserver 172.18.45.6
+2.203.156.195.in-addr.arpa1 flags 0 type 1 A(-) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 2 NS(raw) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 5 CNAME(-) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 6 SOA(raw) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 12 PTR(raw) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 13 HINFO(-) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 15 MX(raw) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 16 TXT(-) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 17 RP(raw) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 65537 A(addr) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 65538 NS(+addr) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 65548 PTR(checked) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 65551 MX(+addr) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 131078 SOA(822) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type 131089 RP(822) submitted
+2.203.156.195.in-addr.arpa1 flags 0 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+2.203.156.195.in-addr.arpa1 flags 0 type A(-): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type RP(822): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type SOA(822): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type MX(+addr): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type NS(+addr): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type A(addr): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type RP(raw): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type TXT(-): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type MX(raw): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type HINFO(-): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type PTR(raw): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type SOA(raw): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type CNAME(-): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+2.203.156.195.in-addr.arpa1 flags 0 type NS(raw): No such domain; nrrs=0; cname=$; owner=$; ttl=86400
+rc=0
diff --git a/regress/case-norecurse3.sys b/regress/case-norecurse3.sys
new file mode 100644
index 0000000..3c666ac
--- /dev/null
+++ b/regress/case-norecurse3.sys
@@ -0,0 +1,488 @@
+adnstest default -0x416
+2.203.156.195.in-addr.arpa1
+ start 939764258.086555
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000189
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000054
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000041
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000100 01.
+ sendto=45
+ +0.002044
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000133
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000200 01.
+ sendto=45
+ +0.001173
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000092
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000500 01.
+ sendto=45
+ +0.001197
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000095
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000600 01.
+ sendto=45
+ +0.001228
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000095
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000c00 01.
+ sendto=45
+ +0.001194
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000095
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000d00 01.
+ sendto=45
+ +0.001205
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000099
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000f00 01.
+ sendto=45
+ +0.001196
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000104
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001000 01.
+ sendto=45
+ +0.001186
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000122
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001100 01.
+ sendto=45
+ +0.001225
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000104
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000100 01.
+ sendto=45
+ +0.001179
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000112
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000200 01.
+ sendto=45
+ +0.001344
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.001314
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000113
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000f00 01.
+ sendto=45
+ +0.001214
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000118
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000600 01.
+ sendto=45
+ +0.001221
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000120
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001100 01.
+ sendto=45
+ +0.001203
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000129
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.979346
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-26085
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.005431
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.009976
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000100 01.
+ sendto=45
+ +0.000545
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000200 01.
+ sendto=45
+ +0.000472
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000500 01.
+ sendto=45
+ +0.000438
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000600 01.
+ sendto=45
+ +0.000482
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000c00 01.
+ sendto=45
+ +0.000001
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000861
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008517
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000d00 01.
+ sendto=45
+ +0.000438
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000f00 01.
+ sendto=45
+ +0.000454
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001000 01.
+ sendto=45
+ +0.000434
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001100 01.
+ sendto=45
+ +0.000433
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000100 01.
+ sendto=45
+ +0.000435
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000200 01.
+ sendto=45
+ +0.000829
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000488
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000f00 01.
+ sendto=45
+ +0.000457
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000600 01.
+ sendto=45
+ +0.000430
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001100 01.
+ sendto=45
+ +0.000001
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.985143
+ select=0 rfds=[] wfds=[] efds=[]
+ +1.985166
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000100 01.
+ sendto=45
+ +0.000564
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000200 01.
+ sendto=45
+ +0.000441
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000500 01.
+ sendto=45
+ +0.000455
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000600 01.
+ sendto=45
+ +0.000482
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000145
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000c00 01.
+ sendto=45
+ +0.000448
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.007898
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.008039
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000d00 01.
+ sendto=45
+ +0.000434
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000f00 01.
+ sendto=45
+ +0.000431
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001000 01.
+ sendto=45
+ +0.000454
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001100 01.
+ sendto=45
+ +0.000434
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000100 01.
+ sendto=45
+ +0.000434
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000200 01.
+ sendto=45
+ +0.000915
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000268
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.006750
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000f00 01.
+ sendto=45
+ +0.000431
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000600 01.
+ sendto=45
+ +0.000461
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001100 01.
+ sendto=45
+ +0.000432
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.978249
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.291904
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000100 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000689
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000167
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.685489
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.038802
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001100 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000514
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000165
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.646008
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.099281
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000600 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000520
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000145
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.546062
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039368
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000f00 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000535
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000134
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.506025
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.079316
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000200 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000538
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000132
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.426039
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039291
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000100 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000502
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000132
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.386114
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039825
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001100 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000500
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000131
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.345658
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039138
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00001000 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000498
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000132
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.305890
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039192
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000f00 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000495
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000130
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.266073
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039369
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000d00 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000494
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000149
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.226061
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039356
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000c00 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000493
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000130
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.186082
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039358
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000600 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000490
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000157
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.146077
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039772
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000500 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000496
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000131
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.105678
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-960894
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208583 00010000 00010000 01320332 30330331 35360331 39350769 6e2d6164
+ 64720561 72706131 00000200 01000006 00010001 5180003e 01410c52 4f4f542d
+ 53455256 45525303 4e455400 0a686f73 746d6173 74657208 696e7465 726e6963
+ c0477727 dd100000 07080000 03840009 3a800001 5180.
+ +0.000487
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000143
+ close fd=4
+ close=OK
+ +0.000235
diff --git a/regress/case-norm.err b/regress/case-norm.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-norm.err
diff --git a/regress/case-norm.out b/regress/case-norm.out
new file mode 100644
index 0000000..6953cea
--- /dev/null
+++ b/regress/case-norm.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.18.45.6
+chiark.greenend.org.uk flags 0 type 1 A(-) submitted
+chiark.greenend.org.uk flags 0 type A(-): OK; nrrs=1; cname=$; owner=$; ttl=86400
+ 195.224.76.132
+rc=0
diff --git a/regress/case-norm.sys b/regress/case-norm.sys
new file mode 100644
index 0000000..8c87430
--- /dev/null
+++ b/regress/case-norm.sys
@@ -0,0 +1,34 @@
+adnstest default
+:0x0|1 chiark.greenend.org.uk
+ start 912888966.802483
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000204
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000670
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000072
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000579
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999421
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.006414
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d41.
+ +0.000874
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000179
+ close fd=4
+ close=OK
+ +0.000184
diff --git a/regress/case-owner.err b/regress/case-owner.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-owner.err
diff --git a/regress/case-owner.out b/regress/case-owner.out
new file mode 100644
index 0000000..2631740
--- /dev/null
+++ b/regress/case-owner.out
@@ -0,0 +1,36 @@
+adns debug: using nameserver 172.18.45.6
+chiark.greenend.org.uk flags 4 type 1 A(-) submitted
+chiark.greenend.org.uk flags 4 type 2 NS(raw) submitted
+chiark.greenend.org.uk flags 4 type 5 CNAME(-) submitted
+chiark.greenend.org.uk flags 4 type 6 SOA(raw) submitted
+chiark.greenend.org.uk flags 4 type 12 PTR(raw) submitted
+chiark.greenend.org.uk flags 4 type 13 HINFO(-) submitted
+chiark.greenend.org.uk flags 4 type 15 MX(raw) submitted
+chiark.greenend.org.uk flags 4 type 16 TXT(-) submitted
+chiark.greenend.org.uk flags 4 type 17 RP(raw) submitted
+chiark.greenend.org.uk flags 4 type 65537 A(addr) submitted
+chiark.greenend.org.uk flags 4 type 65538 NS(+addr) submitted
+chiark.greenend.org.uk flags 4 type 65548 PTR(checked) submitted
+chiark.greenend.org.uk flags 4 type 65551 MX(+addr) submitted
+chiark.greenend.org.uk flags 4 type 131078 SOA(822) submitted
+chiark.greenend.org.uk flags 4 type 131089 RP(822) submitted
+chiark.greenend.org.uk flags 4 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=604800
+chiark.greenend.org.uk flags 4 type A(-): OK; nrrs=1; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+ 195.224.76.132
+chiark.greenend.org.uk flags 4 type NS(raw): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+chiark.greenend.org.uk flags 4 type CNAME(-): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+chiark.greenend.org.uk flags 4 type SOA(raw): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+chiark.greenend.org.uk flags 4 type PTR(raw): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+chiark.greenend.org.uk flags 4 type HINFO(-): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+chiark.greenend.org.uk flags 4 type MX(raw): OK; nrrs=1; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+ 5 permutation-city.greenend.org.uk
+chiark.greenend.org.uk flags 4 type TXT(-): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+chiark.greenend.org.uk flags 4 type RP(raw): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+chiark.greenend.org.uk flags 4 type A(addr): OK; nrrs=1; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+ INET 195.224.76.132
+chiark.greenend.org.uk flags 4 type NS(+addr): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+chiark.greenend.org.uk flags 4 type MX(+addr): OK; nrrs=1; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+ 5 permutation-city.greenend.org.uk ok 0 ok "OK" ( INET 195.224.76.134 )
+chiark.greenend.org.uk flags 4 type SOA(822): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+chiark.greenend.org.uk flags 4 type RP(822): No such data; nrrs=0; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+rc=0
diff --git a/regress/case-owner.sys b/regress/case-owner.sys
new file mode 100644
index 0000000..f0432b7
--- /dev/null
+++ b/regress/case-owner.sys
@@ -0,0 +1,267 @@
+adnstest default -0x400
+4/chiark.greenend.org.uk
+ start 933206012.504679
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000275
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000094
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000073
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.001715
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00020001.
+ sendto=40
+ +0.001142
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00050001.
+ sendto=40
+ +0.001143
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00060001.
+ sendto=40
+ +0.001213
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 000c0001.
+ sendto=40
+ +0.001183
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 000d0001.
+ sendto=40
+ +0.001273
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 000f0001.
+ sendto=40
+ +0.001188
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00100001.
+ sendto=40
+ +0.001185
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00110001.
+ sendto=40
+ +0.001192
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.001315
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00020001.
+ sendto=40
+ +0.002405
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 000f0001.
+ sendto=40
+ +0.001162
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00060001.
+ sendto=40
+ +0.001234
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00110001.
+ sendto=40
+ +0.001320
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.981330
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000364
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d41.
+ +0.001489
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010000 00010000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00020001 08677265 656e656e 64036f72 6702756b 00000600 01000151
+ 80002602 6e73c00c 0a686f73 746d6173 746572c0 2877276a 9c000070 8000001c
+ 2000093a 80000151 80.
+ +0.001437
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000394
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.980503
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001013
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010000 00010000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00050001 08677265 656e656e 64036f72 6702756b 00000600 01000151
+ 80002602 6e73c00c 0a686f73 746d6173 746572c0 2877276a 9c000070 8000001c
+ 2000093a 80000151 80.
+ +0.000770
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000496
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.979367
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001726
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010000 00010000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00060001 08677265 656e656e 64036f72 6702756b 00000600 01000151
+ 80002602 6e73c00c 0a686f73 746d6173 746572c0 2877276a 9c000070 8000001c
+ 2000093a 80000151 80.
+ +0.000812
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000408
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.977634
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002560
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010000 00010000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 000c0001 08677265 656e656e 64036f72 6702756b 00000600 01000151
+ 80002602 6e73c00c 0a686f73 746d6173 746572c0 2877276a 9c000070 8000001c
+ 2000093a 80000151 80.
+ +0.000777
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000403
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.975077
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002559
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010000 00010000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 000d0001 08677265 656e656e 64036f72 6702756b 00000600 01000151
+ 80002602 6e73c00c 0a686f73 746d6173 746572c0 2877276a 9c000070 8000001c
+ 2000093a 80000151 80.
+ +0.000960
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000412
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.972419
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004697
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258580 00010001 00020003 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 000f0001 c00c000f 00010001 51800024 00051070 65726d75 74617469
+ 6f6e2d63 69747908 67726565 6e656e64 036f7267 02756b00 c0470002 00010001
+ 51800011 036e7330 0a72656c 61746976 697479c0 47c04700 02000100 01518000
+ 06036e73 31c068c0 36000100 01000151 800004c3 e04c86c0 64000100 01000151
+ 800004ac 122d06c0 81000100 01000151 800004ac 122d41.
+ +0.001256
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000769
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.966885
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001768
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268580 00010000 00010000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00100001 08677265 656e656e 64036f72 6702756b 00000600 01000151
+ 80002602 6e73c00c 0a686f73 746d6173 746572c0 2877276a 9c000070 8000001c
+ 2000093a 80000151 80.
+ +0.001528
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000443
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.964331
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001739
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278580 00010000 00010000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00110001 08677265 656e656e 64036f72 6702756b 00000600 01000151
+ 80002602 6e73c00c 0a686f73 746d6173 746572c0 2877276a 9c000070 8000001c
+ 2000093a 80000151 80.
+ +0.000776
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000429
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.962579
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004212
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d41.
+ +0.001050
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000589
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.958043
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002059
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8580 00010000 00010000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00020001 08677265 656e656e 64036f72 6702756b 00000600 01000151
+ 80002602 6e73c00c 0a686f73 746d6173 746572c0 2877276a 9c000070 8000001c
+ 2000093a 80000151 80.
+ +0.000776
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.004206
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.953407
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004872
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8580 00010001 00020003 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 000f0001 c00c000f 00010001 51800024 00051070 65726d75 74617469
+ 6f6e2d63 69747908 67726565 6e656e64 036f7267 02756b00 c0470002 00010001
+ 51800011 036e7330 0a72656c 61746976 697479c0 47c04700 02000100 01518000
+ 06036e73 31c068c0 36000100 01000151 800004c3 e04c86c0 64000100 01000151
+ 800004ac 122d06c0 81000100 01000151 800004ac 122d41.
+ +0.001252
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000950
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.947495
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001580
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8580 00010000 00010000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00060001 08677265 656e656e 64036f72 6702756b 00000600 01000151
+ 80002602 6e73c00c 0a686f73 746d6173 746572c0 2877276a 9c000070 8000001c
+ 2000093a 80000151 80.
+ +0.000780
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000401
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.945968
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002592
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8580 00010000 00010000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00110001 08677265 656e656e 64036f72 6702756b 00000600 01000151
+ 80002602 6e73c00c 0a686f73 746d6173 746572c0 2877276a 9c000070 8000001c
+ 2000093a 80000151 80.
+ +0.000794
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000441
+ close fd=4
+ close=OK
+ +0.000387
diff --git a/regress/case-poll.err b/regress/case-poll.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-poll.err
diff --git a/regress/case-poll.out b/regress/case-poll.out
new file mode 100644
index 0000000..6953cea
--- /dev/null
+++ b/regress/case-poll.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.18.45.6
+chiark.greenend.org.uk flags 0 type 1 A(-) submitted
+chiark.greenend.org.uk flags 0 type A(-): OK; nrrs=1; cname=$; owner=$; ttl=86400
+ 195.224.76.132
+rc=0
diff --git a/regress/case-poll.sys b/regress/case-poll.sys
new file mode 100644
index 0000000..1c0e8af
--- /dev/null
+++ b/regress/case-poll.sys
@@ -0,0 +1,34 @@
+adnstest default -,p
+:0x0|1 chiark.greenend.org.uk
+ start 931719947.391142
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000208
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000087
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000066
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000592
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=1 fds=[{fd=4, events=POLLIN, revents=POLLIN}]
+ +0.006530
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d41.
+ +0.001044
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000211
+ close fd=4
+ close=OK
+ +0.000248
diff --git a/regress/case-polltimeout.err b/regress/case-polltimeout.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-polltimeout.err
diff --git a/regress/case-polltimeout.out b/regress/case-polltimeout.out
new file mode 100644
index 0000000..a3f7495
--- /dev/null
+++ b/regress/case-polltimeout.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.36
+chiark.greenend.org.uk flags 0 type 1 A(-) submitted
+chiark.greenend.org.uk flags 0 type A(-): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+rc=0
diff --git a/regress/case-polltimeout.sys b/regress/case-polltimeout.sys
new file mode 100644
index 0000000..ca5ce03
--- /dev/null
+++ b/regress/case-polltimeout.sys
@@ -0,0 +1,135 @@
+adnstest noserver -,p
+:0x0|1 chiark.greenend.org.uk
+ start 931719968.733439
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000199
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000087
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000067
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000790
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009031
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000436
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009093
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000519
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.008993
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000500
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009010
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000486
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009050
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000485
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009014
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000485
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009045
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000451
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009050
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000483
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009042
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000433
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009083
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000521
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009017
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000442
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009058
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000510
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009012
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000436
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.009085
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000514
+ poll fds=[{fd=4, events=POLLIN, revents=0}] timeout=2000
+ poll=0 fds=[{fd=4, events=POLLIN, revents=0}]
+ +2.008998
+ close fd=4
+ close=OK
+ +0.000302
diff --git a/regress/case-ptr-aaaa-caps.err b/regress/case-ptr-aaaa-caps.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-ptr-aaaa-caps.err
diff --git a/regress/case-ptr-aaaa-caps.out b/regress/case-ptr-aaaa-caps.out
new file mode 100644
index 0000000..1cacfc2
--- /dev/null
+++ b/regress/case-ptr-aaaa-caps.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.18.45.6
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.D.1.0.8.A.B.0.1.0.0.2.IP6.ARPA flags 0 type 65548 PTR(checked) submitted
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.D.1.0.8.A.B.0.1.0.0.2.IP6.ARPA flags 0 type PTR(checked): OK; nrrs=1; cname=$; owner=$; ttl=13516
+ stratocaster.colo.distorted.org.uk
+rc=0
diff --git a/regress/case-ptr-aaaa-caps.sys b/regress/case-ptr-aaaa-caps.sys
new file mode 100644
index 0000000..8ff0db9
--- /dev/null
+++ b/regress/case-ptr-aaaa-caps.sys
@@ -0,0 +1,73 @@
+./adnstest default
+:0x10000|12 4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.D.1.0.8.A.B.0.1.0.0.2.IP6.ARPA
+ start 1406162686.218685
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000153
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000069
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000058
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390144 01310130 01380141
+ 01420130 01310130 01300132 03495036 04415250 4100000c 0001.
+ sendto=90
+ +0.000569
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999431
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.227524
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010001 00040008 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390144 01310130 01380141
+ 01420130 01310130 01300132 03495036 04415250 4100000c 0001c00c 000c0001
+ 000034cc 00240c73 74726174 6f636173 74657204 636f6c6f 09646973 746f7274
+ 6564036f 72670275 6b00c034 00020001 000034cc 000c0970 72656369 73696f6e
+ c078c034 00020001 000034cc 00090672 61646975 73c078c0 34000200 01000034
+ cc000a07 76616d70 697265c0 78c03400 02000100 0034cc00 0d0a7465 6c656361
+ 73746572 c078c0ae 00010001 000034cc 00043e31 cc92c0ae 001c0001 000034cc
+ 00102001 04701f09 1b980000 00000000 0002c0c3 00010001 000034cc 00043e31
+ cc96c0c3 001c0001 000034cc 00102001 04701f09 1b980000 00000000 0006c096
+ 00010001 000034cc 0004d40d c646c096 001c0001 000034cc 00102001 0ba80000
+ 01d90000 00000000 0006c0d9 00010001 000034cc 0004d40d c647c0d9 001c0001
+ 000034cc 00102001 0ba80000 01d90000 00000000 0007.
+ +0.000594
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 0c737472 61746f63 61737465 7204636f 6c6f0964
+ 6973746f 72746564 036f7267 02756b00 001c0001.
+ sendto=52
+ +0.000187
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000064
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999155
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.002970
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010001 0006000c 0c737472 61746f63 61737465 7204636f 6c6f0964
+ 6973746f 72746564 036f7267 02756b00 001c0001 c00c001c 00010000 34cc0010
+ 20010ba8 01d90002 00000000 00000004 c01e0002 00010000 34cc000f 09707265
+ 63697369 6f6e026e 73c01ec0 1e000200 01000034 cc000906 72616469 7573c066
+ c01e0002 00010000 34cc0012 0f6d7974 6869632d 62656173 74732d32 c066c01e
+ 00020001 000034cc 000d0a74 656c6563 61737465 72c066c0 1e000200 01000034
+ cc00120f 6d797468 69632d62 65617374 732d31c0 66c01e00 02000100 0034cc00
+ 09066368 6961726b c066c0e1 00010001 000034cc 0004d40d c5e5c0e1 001c0001
+ 000034cc 00102001 0ba801e3 00000000 00000000 0000c077 00010001 000034cc
+ 00043e31 cc92c077 001c0001 000034cc 00102001 04701f09 1b980000 00000000
+ 0002c05c 00010001 000034cc 0004d40d c646c05c 001c0001 000034cc 00102001
+ 0ba80000 01d90000 00000000 0006c0aa 00010001 000034cc 0004d40d c647c0aa
+ 001c0001 000034cc 00102001 0ba80000 01d90000 00000000 0007c0c3 00010001
+ 000034cc 00044538 adbec0c3 001c0001 000034cc 00102600 3c000000 0000f03c
+ 91fffe96 beacc08c 00010001 000034cc 00045d5d 8043c08c 001c0001 000034cc
+ 00102a00 10980000 00801000 00000000 0010.
+ +0.000940
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000110
+ close fd=6
+ close=OK
+ +0.000199
diff --git a/regress/case-ptr-aaaa-check.err b/regress/case-ptr-aaaa-check.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-ptr-aaaa-check.err
diff --git a/regress/case-ptr-aaaa-check.out b/regress/case-ptr-aaaa-check.out
new file mode 100644
index 0000000..b2c9af8
--- /dev/null
+++ b/regress/case-ptr-aaaa-check.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.29.199.224
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa flags 0 type 65548 PTR(checked) submitted
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa flags 0 type PTR(checked): OK; nrrs=1; cname=$; owner=$; ttl=14400
+ stratocaster.distorted.org.uk
+rc=0
diff --git a/regress/case-ptr-aaaa-check.sys b/regress/case-ptr-aaaa-check.sys
new file mode 100644
index 0000000..68e453d
--- /dev/null
+++ b/regress/case-ptr-aaaa-check.sys
@@ -0,0 +1,68 @@
+./adnstest distorted
+:0x10000|12 4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa
+ start 1401919115.064959
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000064
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000031
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000027
+ sendto fd=6 addr=172.29.199.224:53
+ 311f0100 00010000 00000000 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390164 01310130 01380161
+ 01620130 01310130 01300132 03697036 04617270 6100000c 0001.
+ sendto=90
+ +0.000266
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999734
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.003844
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 311f8580 00010001 00040008 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390164 01310130 01380161
+ 01620130 01310130 01300132 03697036 04617270 6100000c 0001c00c 000c0001
+ 00003840 001f0c73 74726174 6f636173 74657209 64697374 6f727465 64036f72
+ 6702756b 00c03400 02000100 00384000 0c097072 65636973 696f6ec0 73c03400
+ 02000100 00384000 09067261 64697573 c073c034 00020001 00003840 000d0a74
+ 656c6563 61737465 72c073c0 34000200 01000038 40000a07 76616d70 697265c0
+ 73c0a900 01000100 00384000 04ac1dc7 01c0a900 1c000100 00384000 10200104
+ 70974000 01000000 00000000 01c0d700 01000100 00384000 04ac1dc7 05c0d700
+ 1c000100 00384000 10200104 70974000 01000000 00000000 05c09100 01000100
+ 00384000 04ac1dc7 b2c09100 1c000100 00384000 1020010b a801d900 02000000
+ 00000000 02c0be00 01000100 00384000 04ac1dc7 b3c0be00 1c000100 00384000
+ 1020010b a801d900 02000000 00000000 03.
+ +0.000334
+ sendto fd=6 addr=172.29.199.224:53
+ 31200100 00010000 00000000 0c737472 61746f63 61737465 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000139
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000032
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999495
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.001799
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31208580 00010001 00040008 0c737472 61746f63 61737465 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010ba801
+ d9000200 00000000 000004c0 19000200 01000038 40000d07 76616d70 69726502
+ 6e73c019 c0190002 00010000 3840000d 0a74656c 65636173 746572c0 5fc01900
+ 02000100 00384000 0c097072 65636973 696f6ec0 5fc01900 02000100 00384000
+ 09067261 64697573 c05fc0a1 00010001 00003840 0004ac1d c701c0a1 001c0001
+ 00003840 00102001 04709740 00010000 00000000 0001c057 00010001 00003840
+ 0004ac1d c705c057 001c0001 00003840 00102001 04709740 00010000 00000000
+ 0005c089 00010001 00003840 0004ac1d c7b2c089 001c0001 00003840 00102001
+ 0ba801d9 00020000 00000000 0002c070 00010001 00003840 0004ac1d c7b3c070
+ 001c0001 00003840 00102001 0ba801d9 00020000 00000000 0003.
+ +0.000284
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000046
+ close fd=6
+ close=OK
+ +0.000075
diff --git a/regress/case-ptr-aaaa-mismatch.err b/regress/case-ptr-aaaa-mismatch.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-ptr-aaaa-mismatch.err
diff --git a/regress/case-ptr-aaaa-mismatch.out b/regress/case-ptr-aaaa-mismatch.out
new file mode 100644
index 0000000..04f1f2b
--- /dev/null
+++ b/regress/case-ptr-aaaa-mismatch.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.29.199.224
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.b.d.0.1.0.0.2.ip6.arpa flags 0 type 65548 PTR(checked) submitted
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.b.d.0.1.0.0.2.ip6.arpa flags 0 type PTR(checked): Inconsistent resource records in DNS; nrrs=0; cname=$; owner=$; ttl=14400
+rc=0
diff --git a/regress/case-ptr-aaaa-mismatch.sys b/regress/case-ptr-aaaa-mismatch.sys
new file mode 100644
index 0000000..360509f
--- /dev/null
+++ b/regress/case-ptr-aaaa-mismatch.sys
@@ -0,0 +1,68 @@
+./adnstest distorted
+:0x10000|12 4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.b.d.0.1.0.0.2.ip6.arpa
+ start 1401919322.902230
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000061
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000031
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000026
+ sendto fd=6 addr=172.29.199.224:53
+ 311f0100 00010000 00000000 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390164 01310130 01380162
+ 01640130 01310130 01300132 03697036 04617270 6100000c 0001.
+ sendto=90
+ +0.000410
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999590
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.003725
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 311f8580 00010001 00040008 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390164 01310130 01380162
+ 01640130 01310130 01300132 03697036 04617270 6100000c 0001c00c 000c0001
+ 00003840 001f0c73 74726174 6f636173 74657209 64697374 6f727465 64036f72
+ 6702756b 00c03400 02000100 00384000 0c097072 65636973 696f6ec0 73c03400
+ 02000100 00384000 0d0a7465 6c656361 73746572 c073c034 00020001 00003840
+ 00090672 61646975 73c073c0 34000200 01000038 40000a07 76616d70 697265c0
+ 73c0c200 01000100 00384000 04ac1dc7 01c0c200 1c000100 00384000 10200104
+ 70974000 01000000 00000000 01c0d700 01000100 00384000 04ac1dc7 05c0d700
+ 1c000100 00384000 10200104 70974000 01000000 00000000 05c09100 01000100
+ 00384000 04ac1dc7 b2c09100 1c000100 00384000 1020010b a801d900 02000000
+ 00000000 02c0a900 01000100 00384000 04ac1dc7 b3c0a900 1c000100 00384000
+ 1020010b a801d900 02000000 00000000 03.
+ +0.000340
+ sendto fd=6 addr=172.29.199.224:53
+ 31200100 00010000 00000000 0c737472 61746f63 61737465 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000244
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000035
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999381
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.001587
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31208580 00010001 00040008 0c737472 61746f63 61737465 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010ba801
+ d9000200 00000000 000004c0 19000200 01000038 40000c06 72616469 7573026e
+ 73c019c0 19000200 01000038 40000a07 76616d70 697265c0 5ec01900 02000100
+ 00384000 0c097072 65636973 696f6ec0 5ec01900 02000100 00384000 0d0a7465
+ 6c656361 73746572 c05ec057 00010001 00003840 0004ac1d c701c057 001c0001
+ 00003840 00102001 04709740 00010000 00000000 0001c06f 00010001 00003840
+ 0004ac1d c705c06f 001c0001 00003840 00102001 04709740 00010000 00000000
+ 0005c085 00010001 00003840 0004ac1d c7b2c085 001c0001 00003840 00102001
+ 0ba801d9 00020000 00000000 0002c09d 00010001 00003840 0004ac1d c7b3c09d
+ 001c0001 00003840 00102001 0ba801d9 00020000 00000000 0003.
+ +0.000289
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000048
+ close fd=6
+ close=OK
+ +0.000546
diff --git a/regress/case-ptr-aaaa-plain.err b/regress/case-ptr-aaaa-plain.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-ptr-aaaa-plain.err
diff --git a/regress/case-ptr-aaaa-plain.out b/regress/case-ptr-aaaa-plain.out
new file mode 100644
index 0000000..63e72ad
--- /dev/null
+++ b/regress/case-ptr-aaaa-plain.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.29.199.224
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa flags 0 type 12 PTR(raw) submitted
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa flags 0 type PTR(raw): OK; nrrs=1; cname=$; owner=$; ttl=14400
+ stratocaster.distorted.org.uk
+rc=0
diff --git a/regress/case-ptr-aaaa-plain.sys b/regress/case-ptr-aaaa-plain.sys
new file mode 100644
index 0000000..343cffc
--- /dev/null
+++ b/regress/case-ptr-aaaa-plain.sys
@@ -0,0 +1,43 @@
+./adnstest distorted
+:0x0|12 4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa
+ start 1401918956.635299
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000060
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000032
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000026
+ sendto fd=6 addr=172.29.199.224:53
+ 311f0100 00010000 00000000 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390164 01310130 01380161
+ 01620130 01310130 01300132 03697036 04617270 6100000c 0001.
+ sendto=90
+ +0.000219
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999781
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.002107
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 311f8580 00010001 00040008 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390164 01310130 01380161
+ 01620130 01310130 01300132 03697036 04617270 6100000c 0001c00c 000c0001
+ 00003840 001f0c73 74726174 6f636173 74657209 64697374 6f727465 64036f72
+ 6702756b 00c03400 02000100 00384000 0a077661 6d706972 65c073c0 34000200
+ 01000038 40000d0a 74656c65 63617374 6572c073 c0340002 00010000 3840000c
+ 09707265 63697369 6f6ec073 c0340002 00010000 38400009 06726164 697573c0
+ 73c0d800 01000100 00384000 04ac1dc7 01c0d800 1c000100 00384000 10200104
+ 70974000 01000000 00000000 01c09100 01000100 00384000 04ac1dc7 05c09100
+ 1c000100 00384000 10200104 70974000 01000000 00000000 05c0c000 01000100
+ 00384000 04ac1dc7 b2c0c000 1c000100 00384000 1020010b a801d900 02000000
+ 00000000 02c0a700 01000100 00384000 04ac1dc7 b3c0a700 1c000100 00384000
+ 1020010b a801d900 02000000 00000000 03.
+ +0.000349
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000072
+ close fd=6
+ close=OK
+ +0.000081
diff --git a/regress/case-ptr-aaaa.err b/regress/case-ptr-aaaa.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-ptr-aaaa.err
diff --git a/regress/case-ptr-aaaa.out b/regress/case-ptr-aaaa.out
new file mode 100644
index 0000000..b2c9af8
--- /dev/null
+++ b/regress/case-ptr-aaaa.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.29.199.224
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa flags 0 type 65548 PTR(checked) submitted
+4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa flags 0 type PTR(checked): OK; nrrs=1; cname=$; owner=$; ttl=14400
+ stratocaster.distorted.org.uk
+rc=0
diff --git a/regress/case-ptr-aaaa.sys b/regress/case-ptr-aaaa.sys
new file mode 100644
index 0000000..d2e21df
--- /dev/null
+++ b/regress/case-ptr-aaaa.sys
@@ -0,0 +1,68 @@
+./adnstest distorted
+:0x10000|12 4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa
+ start 1401919090.054985
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000061
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000030
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000026
+ sendto fd=6 addr=172.29.199.224:53
+ 311f0100 00010000 00000000 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390164 01310130 01380161
+ 01620130 01310130 01300132 03697036 04617270 6100000c 0001.
+ sendto=90
+ +0.000227
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999773
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.003800
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 311f8580 00010001 00040008 01340130 01300130 01300130 01300130 01300130
+ 01300130 01300130 01300130 01320130 01300130 01390164 01310130 01380161
+ 01620130 01310130 01300132 03697036 04617270 6100000c 0001c00c 000c0001
+ 00003840 001f0c73 74726174 6f636173 74657209 64697374 6f727465 64036f72
+ 6702756b 00c03400 02000100 00384000 0c097072 65636973 696f6ec0 73c03400
+ 02000100 00384000 0a077661 6d706972 65c073c0 34000200 01000038 40000906
+ 72616469 7573c073 c0340002 00010000 3840000d 0a74656c 65636173 746572c0
+ 73c0bf00 01000100 00384000 04ac1dc7 01c0bf00 1c000100 00384000 10200104
+ 70974000 01000000 00000000 01c0a900 01000100 00384000 04ac1dc7 05c0a900
+ 1c000100 00384000 10200104 70974000 01000000 00000000 05c09100 01000100
+ 00384000 04ac1dc7 b2c09100 1c000100 00384000 1020010b a801d900 02000000
+ 00000000 02c0d400 01000100 00384000 04ac1dc7 b3c0d400 1c000100 00384000
+ 1020010b a801d900 02000000 00000000 03.
+ +0.000338
+ sendto fd=6 addr=172.29.199.224:53
+ 31200100 00010000 00000000 0c737472 61746f63 61737465 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001.
+ sendto=47
+ +0.000129
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000031
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999502
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.001827
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31208580 00010001 00040008 0c737472 61746f63 61737465 72096469 73746f72
+ 74656403 6f726702 756b0000 1c0001c0 0c001c00 01000038 40001020 010ba801
+ d9000200 00000000 000004c0 19000200 01000038 4000100a 74656c65 63617374
+ 6572026e 73c019c0 19000200 01000038 40000906 72616469 7573c062 c0190002
+ 00010000 3840000a 0776616d 70697265 c062c019 00020001 00003840 000c0970
+ 72656369 73696f6e c062c073 00010001 00003840 0004ac1d c701c073 001c0001
+ 00003840 00102001 04709740 00010000 00000000 0001c088 00010001 00003840
+ 0004ac1d c705c088 001c0001 00003840 00102001 04709740 00010000 00000000
+ 0005c09e 00010001 00003840 0004ac1d c7b2c09e 001c0001 00003840 00102001
+ 0ba801d9 00020000 00000000 0002c057 00010001 00003840 0004ac1d c7b3c057
+ 001c0001 00003840 00102001 0ba801d9 00020000 00000000 0003.
+ +0.000308
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000056
+ close fd=6
+ close=OK
+ +0.000088
diff --git a/regress/case-ptrbaddom.err b/regress/case-ptrbaddom.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-ptrbaddom.err
diff --git a/regress/case-ptrbaddom.out b/regress/case-ptrbaddom.out
new file mode 100644
index 0000000..93a353a
--- /dev/null
+++ b/regress/case-ptrbaddom.out
@@ -0,0 +1,7 @@
+adns debug: using nameserver 172.18.45.6
+37.45.18.172.in-addr.arpa.test.iwj.relativity.greenend.org.uk. flags 0 type 12 PTR(raw) submitted
+37.45.18.172.in-addr.arpa.test.iwj.relativity.greenend.org.uk. flags 0 type 65548 PTR(checked) submitted
+37.45.18.172.in-addr.arpa.test.iwj.relativity.greenend.org.uk. flags 0 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+37.45.18.172.in-addr.arpa.test.iwj.relativity.greenend.org.uk. flags 0 type PTR(raw): OK; nrrs=1; cname=$; owner=$; ttl=60
+ ptr.test.iwj.relativity.greenend.org.uk
+rc=0
diff --git a/regress/case-ptrbaddom.sys b/regress/case-ptrbaddom.sys
new file mode 100644
index 0000000..f53995a
--- /dev/null
+++ b/regress/case-ptrbaddom.sys
@@ -0,0 +1,36 @@
+adnstest default
+:0x0|12,0x10000|12 37.45.18.172.in-addr.arpa.test.iwj.relativity.greenend.org.uk.
+ start 951960654.608219
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000194
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000055
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000035
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 02333702 34350231 38033137 3207696e 2d616464
+ 72046172 70610474 65737403 69776a0a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 0c0001.
+ sendto=79
+ +0.002131
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997869
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000258
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00010001 02333702 34350231 38033137 3207696e 2d616464
+ 72046172 70610474 65737403 69776a0a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 0c0001c0 0c000c00 01000000 3c002903 70747204
+ 74657374 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267
+ 02756b00 c05f0002 00010000 003c0006 036e7330 c068c090 00010001 00015180
+ 0004ac12 2d06.
+ +0.001324
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000133
+ close fd=4
+ close=OK
+ +0.000187
diff --git a/regress/case-ptrbaddom2.err b/regress/case-ptrbaddom2.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-ptrbaddom2.err
diff --git a/regress/case-ptrbaddom2.out b/regress/case-ptrbaddom2.out
new file mode 100644
index 0000000..323c633
--- /dev/null
+++ b/regress/case-ptrbaddom2.out
@@ -0,0 +1,8 @@
+adns debug: using nameserver 172.18.45.6
+00.45.18.172.in-addr.arpa flags 0 type 65548 PTR(checked) submitted
+6.945.18.172.in-addr.arpa flags 0 type 65548 PTR(checked) submitted
+4.0.0.0.g.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa flags 0 type 65548 PTR(checked) submitted
+00.45.18.172.in-addr.arpa flags 0 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+6.945.18.172.in-addr.arpa flags 0 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+4.0.0.0.g.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa flags 0 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+rc=0
diff --git a/regress/case-ptrbaddom2.sys b/regress/case-ptrbaddom2.sys
new file mode 100644
index 0000000..cdd266a
--- /dev/null
+++ b/regress/case-ptrbaddom2.sys
@@ -0,0 +1,15 @@
+./adnstest default
+:0x10000|12 00.45.18.172.in-addr.arpa 6.945.18.172.in-addr.arpa 4.0.0.0.g.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.9.d.1.0.8.a.b.0.1.0.0.2.ip6.arpa
+ start 1406163217.059538
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000157
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000069
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000059
+ close fd=6
+ close=OK
+ +0.000414
diff --git a/regress/case-quote.err b/regress/case-quote.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-quote.err
diff --git a/regress/case-quote.out b/regress/case-quote.out
new file mode 100644
index 0000000..a72dcd9
--- /dev/null
+++ b/regress/case-quote.out
@@ -0,0 +1,28 @@
+adns debug: using nameserver 172.18.45.6
+hyphen.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+dot.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+plus.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+slash.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+underscore.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+quote.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+backslash.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+null.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+space.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+hash.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+del.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+meta-null.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+meta-del.cname.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+hyphen.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a-b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+dot.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a\.b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+plus.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a+b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+slash.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a/b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+underscore.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a_b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+quote.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a\"b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+backslash.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a\\b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+null.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a\000b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+space.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a\040b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+hash.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a\#b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+del.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a\177b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+meta-null.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a\310b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+meta-del.cname.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such domain; nrrs=0; cname=a\377b.cname.test.iwj.relativity.greenend.org.uk; owner=$; ttl=60
+rc=0
diff --git a/regress/case-quote.sys b/regress/case-quote.sys
new file mode 100644
index 0000000..475aeb7
--- /dev/null
+++ b/regress/case-quote.sys
@@ -0,0 +1,211 @@
+adnstest default
+:0x0|1 hyphen.cname.test.iwj.relativity.greenend.org.uk dot.cname.test.iwj.relativity.greenend.org.uk plus.cname.test.iwj.relativity.greenend.org.uk slash.cname.test.iwj.relativity.greenend.org.uk underscore.cname.test.iwj.relativity.greenend.org.uk quote.cname.test.iwj.relativity.greenend.org.uk backslash.cname.test.iwj.relativity.greenend.org.uk null.cname.test.iwj.relativity.greenend.org.uk space.cname.test.iwj.relativity.greenend.org.uk hash.cname.test.iwj.relativity.greenend.org.uk del.cname.test.iwj.relativity.greenend.org.uk meta-null.cname.test.iwj.relativity.greenend.org.uk meta-del.cname.test.iwj.relativity.greenend.org.uk
+ start 951958420.936685
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000229
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000057
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000034
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 06687970 68656e05 636e616d 65047465 73740369
+ 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000001
+ 0001.
+ sendto=66
+ +0.001345
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 03646f74 05636e61 6d650474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=63
+ +0.000708
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 04706c75 7305636e 616d6504 74657374 0369776a
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 00010001.
+ sendto=64
+ +0.000669
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 05736c61 73680563 6e616d65 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=65
+ +0.000670
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 0a756e64 65727363 6f726505 636e616d 65047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001.
+ sendto=70
+ +0.000690
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 0571756f 74650563 6e616d65 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=65
+ +0.000699
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 09626163 6b736c61 73680563 6e616d65 04746573
+ 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000100 01.
+ sendto=69
+ +0.000911
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 046e756c 6c05636e 616d6504 74657374 0369776a
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 00010001.
+ sendto=64
+ +0.000831
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 05737061 63650563 6e616d65 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000100
+ 01.
+ sendto=65
+ +0.000684
+ sendto fd=4 addr=172.18.45.6:53
+ 31280100 00010000 00000000 04686173 6805636e 616d6504 74657374 0369776a
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 00010001.
+ sendto=64
+ +0.000672
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 0364656c 05636e61 6d650474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=63
+ +0.000715
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 096d6574 612d6e75 6c6c0563 6e616d65 04746573
+ 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000100 01.
+ sendto=69
+ +0.000695
+ sendto fd=4 addr=172.18.45.6:53
+ 312b0100 00010000 00000000 086d6574 612d6465 6c05636e 616d6504 74657374
+ 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ 00010001.
+ sendto=68
+ +0.000695
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.990016
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000248
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8583 00010001 00010000 06687970 68656e05 636e616d 65047465 73740369
+ 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b000001
+ 0001c00c 00050001 0000003c 002f0361 2d620563 6e616d65 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00c05800
+ 06000100 00003c00 27036e73 30c0610a 686f7374 6d617374 6572c061 00000023
+ 00000e10 00000078 0064c800 0000003c.
+ +0.000645
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208583 00010001 00010000 03646f74 05636e61 6d650474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001c0
+ 0c000500 01000000 3c002f03 612e6205 636e616d 65047465 73740369 776a0a72
+ 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b00c055 00060001
+ 0000003c 0027036e 7330c05e 0a686f73 746d6173 746572c0 5e000000 2300000e
+ 10000000 780064c8 00000000 3c.
+ +0.001014
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218583 00010001 00010000 04706c75 7305636e 616d6504 74657374 0369776a
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 00010001
+ c00c0005 00010000 003c002f 03612b62 05636e61 6d650474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b00c0 56000600
+ 01000000 3c002703 6e7330c0 5f0a686f 73746d61 73746572 c05f0000 00230000
+ 0e100000 00780064 c8000000 003c.
+ +0.000717
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228583 00010001 00010000 05736c61 73680563 6e616d65 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000100
+ 01c00c00 05000100 00003c00 2f03612f 6205636e 616d6504 74657374 0369776a
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0570006
+ 00010000 003c0027 036e7330 c0600a68 6f73746d 61737465 72c06000 00002300
+ 000e1000 00007800 64c80000 00003c.
+ +0.000666
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238583 00010001 00010000 0a756e64 65727363 6f726505 636e616d 65047465
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000001 0001c00c 00050001 0000003c 002f0361 5f620563 6e616d65 04746573
+ 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00c05c00 06000100 00003c00 27036e73 30c0650a 686f7374 6d617374 6572c065
+ 00000023 00000e10 00000078 0064c800 0000003c.
+ +0.000663
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248583 00010001 00010000 0571756f 74650563 6e616d65 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000100
+ 01c00c00 05000100 00003c00 2f036122 6205636e 616d6504 74657374 0369776a
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0570006
+ 00010000 003c0027 036e7330 c0600a68 6f73746d 61737465 72c06000 00002300
+ 000e1000 00007800 64c80000 00003c.
+ +0.000667
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258583 00010001 00010000 09626163 6b736c61 73680563 6e616d65 04746573
+ 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000100 01c00c00 05000100 00003c00 2f03615c 6205636e 616d6504 74657374
+ 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c05b0006 00010000 003c0027 036e7330 c0640a68 6f73746d 61737465 72c06400
+ 00002300 000e1000 00007800 64c80000 00003c.
+ +0.000663
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268583 00010001 00010000 046e756c 6c05636e 616d6504 74657374 0369776a
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 00010001
+ c00c0005 00010000 003c002f 03610062 05636e61 6d650474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b00c0 56000600
+ 01000000 3c002703 6e7330c0 5f0a686f 73746d61 73746572 c05f0000 00230000
+ 0e100000 00780064 c8000000 003c.
+ +0.000670
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278583 00010001 00010000 05737061 63650563 6e616d65 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00000100
+ 01c00c00 05000100 00003c00 2f036120 6205636e 616d6504 74657374 0369776a
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0570006
+ 00010000 003c0027 036e7330 c0600a68 6f73746d 61737465 72c06000 00002300
+ 000e1000 00007800 64c80000 00003c.
+ +0.000651
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31288583 00010001 00010000 04686173 6805636e 616d6504 74657374 0369776a
+ 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00 00010001
+ c00c0005 00010000 003c002f 03612362 05636e61 6d650474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b00c0 56000600
+ 01000000 3c002703 6e7330c0 5f0a686f 73746d61 73746572 c05f0000 00230000
+ 0e100000 00780064 c8000000 003c.
+ +0.000664
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298583 00010001 00010000 0364656c 05636e61 6d650474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001c0
+ 0c000500 01000000 3c002f03 617f6205 636e616d 65047465 73740369 776a0a72
+ 656c6174 69766974 79086772 65656e65 6e64036f 72670275 6b00c055 00060001
+ 0000003c 0027036e 7330c05e 0a686f73 746d6173 746572c0 5e000000 2300000e
+ 10000000 780064c8 00000000 3c.
+ +0.000646
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8583 00010001 00010000 096d6574 612d6e75 6c6c0563 6e616d65 04746573
+ 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000100 01c00c00 05000100 00003c00 2f0361c8 6205636e 616d6504 74657374
+ 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c05b0006 00010000 003c0027 036e7330 c0640a68 6f73746d 61737465 72c06400
+ 00002300 000e1000 00007800 64c80000 00003c.
+ +0.000708
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8583 00010001 00010000 086d6574 612d6465 6c05636e 616d6504 74657374
+ 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ 00010001 c00c0005 00010000 003c002f 0361ff62 05636e61 6d650474 65737403
+ 69776a0a 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b00c0
+ 5a000600 01000000 3c002703 6e7330c0 630a686f 73746d61 73746572 c0630000
+ 00230000 0e100000 00780064 c8000000 003c.
+ +0.000665
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000123
+ close fd=4
+ close=OK
+ +0.000708
diff --git a/regress/case-rootquery.err b/regress/case-rootquery.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-rootquery.err
diff --git a/regress/case-rootquery.out b/regress/case-rootquery.out
new file mode 100644
index 0000000..d78d469
--- /dev/null
+++ b/regress/case-rootquery.out
@@ -0,0 +1,8 @@
+adns debug: using nameserver 172.18.45.6
+. flags 0 type 131078 SOA(822) submitted
+. flags 1 type 131078 SOA(822) submitted
+. flags 0 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=60222
+ A.ROOT-SERVERS.NET hostmaster@INTERNIC.NET 1999041600 1800 900 604800 86400
+. flags 1 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=57210
+ A.ROOT-SERVERS.NET hostmaster@INTERNIC.NET 1999041600 1800 900 604800 86400
+rc=0
diff --git a/regress/case-rootquery.sys b/regress/case-rootquery.sys
new file mode 100644
index 0000000..b290763
--- /dev/null
+++ b/regress/case-rootquery.sys
@@ -0,0 +1,73 @@
+adnstest default
+:0x20000|6 . 1/.
+ start 924364442.672925
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000222
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000085
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000069
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 00000600 01.
+ sendto=17
+ +0.001781
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 00000600 01.
+ sendto=17
+ +0.001194
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997025
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.012535
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010001 000d000d 00000600 01000006 00010000 eb3e003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 51800000 02000100
+ 04a9e700 040144c0 1e000002 00010004 a9e70004 0145c01e 00000200 010004a9
+ e7000401 49c01e00 00020001 0004a9e7 00040146 c01e0000 02000100 04a9e700
+ 040147c0 1e000002 00010004 a9e70004 014ac01e 00000200 010004a9 e7000401
+ 4bc01e00 00020001 0004a9e7 0004014c c01e0000 02000100 04a9e700 04014dc0
+ 1e000002 00010004 a9e70002 c01c0000 02000100 04a9e700 040148c0 1e000002
+ 00010004 a9e70004 0142c01e 00000200 010004a9 e7000401 43c01ec0 65000100
+ 01000929 a8000480 080a5ac0 74000100 01000929 a80004c0 cbe60ac0 83000100
+ 0100092c 170004c0 249411c0 92000100 01000929 a80004c0 0505f1c0 a1000100
+ 01000929 a80004c0 702404c0 b0000100 010005fb 670004c6 29000ac0 bf000100
+ 010005fb 670004c1 000e81c0 ce000100 010005fb 670004c6 20400cc0 dd000100
+ 010005fb 670004ca 0c1b21c0 1c000100 01000929 a80004c6 290004c0 f9000100
+ 01000929 a8000480 3f0235c1 08000100 01000929 a8000480 09006bc1 17000100
+ 01000929 a80004c0 21040c.
+ +0.002867
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000463
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.982941
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.008221
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010001 000d000d 00000600 01000006 00010000 df7a003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 51800000 02000100
+ 04a9e700 040144c0 1e000002 00010004 a9e70004 0145c01e 00000200 010004a9
+ e7000401 49c01e00 00020001 0004a9e7 00040146 c01e0000 02000100 04a9e700
+ 040147c0 1e000002 00010004 a9e70004 014ac01e 00000200 010004a9 e7000401
+ 4bc01e00 00020001 0004a9e7 0004014c c01e0000 02000100 04a9e700 04014dc0
+ 1e000002 00010004 a9e70002 c01c0000 02000100 04a9e700 040148c0 1e000002
+ 00010004 a9e70004 0142c01e 00000200 010004a9 e7000401 43c01ec0 65000100
+ 01000929 a8000480 080a5ac0 74000100 01000929 a80004c0 cbe60ac0 83000100
+ 0100092c 170004c0 249411c0 92000100 01000929 a80004c0 0505f1c0 a1000100
+ 01000929 a80004c0 702404c0 b0000100 010005fb 670004c6 29000ac0 bf000100
+ 010005fb 670004c1 000e81c0 ce000100 010005fb 670004c6 20400cc0 dd000100
+ 010005fb 670004ca 0c1b21c0 1c000100 01000929 a80004c6 290004c0 f9000100
+ 01000929 a8000480 3f0235c1 08000100 01000929 a8000480 09006bc1 17000100
+ 01000929 a80004c0 21040c.
+ +0.002425
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000260
+ close fd=4
+ close=OK
+ +0.000232
diff --git a/regress/case-rootqueryall-as.err b/regress/case-rootqueryall-as.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-rootqueryall-as.err
diff --git a/regress/case-rootqueryall-as.out b/regress/case-rootqueryall-as.out
new file mode 100644
index 0000000..2af207a
--- /dev/null
+++ b/regress/case-rootqueryall-as.out
@@ -0,0 +1,118 @@
+adns debug: using nameserver 172.18.45.6
+. flags 0 type 1 A(-) submitted
+. flags 0 type 2 NS(raw) submitted
+. flags 0 type 5 CNAME(-) submitted
+. flags 0 type 6 SOA(raw) submitted
+. flags 0 type 12 PTR(raw) submitted
+. flags 0 type 13 HINFO(-) submitted
+. flags 0 type 15 MX(raw) submitted
+. flags 0 type 16 TXT(-) submitted
+. flags 0 type 17 RP(raw) submitted
+. flags 0 type 65537 A(addr) submitted
+. flags 0 type 65538 NS(+addr) submitted
+. flags 0 type 65548 PTR(checked) submitted
+. flags 0 type 65551 MX(+addr) submitted
+. flags 0 type 131078 SOA(822) submitted
+. flags 0 type 131089 RP(822) submitted
+. flags 1 type 1 A(-) submitted
+. flags 1 type 2 NS(raw) submitted
+. flags 1 type 5 CNAME(-) submitted
+. flags 1 type 6 SOA(raw) submitted
+. flags 1 type 12 PTR(raw) submitted
+. flags 1 type 13 HINFO(-) submitted
+. flags 1 type 15 MX(raw) submitted
+. flags 1 type 16 TXT(-) submitted
+. flags 1 type 17 RP(raw) submitted
+. flags 1 type 65537 A(addr) submitted
+. flags 1 type 65538 NS(+addr) submitted
+. flags 1 type 65548 PTR(checked) submitted
+. flags 1 type 65551 MX(+addr) submitted
+. flags 1 type 131078 SOA(822) submitted
+. flags 1 type 131089 RP(822) submitted
+. flags 0 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+. flags 1 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+. flags 0 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 0 type NS(raw): OK; nrrs=13; cname=$; owner=$; ttl=518399
+ E.ROOT-SERVERS.NET
+ I.ROOT-SERVERS.NET
+ F.ROOT-SERVERS.NET
+ G.ROOT-SERVERS.NET
+ J.ROOT-SERVERS.NET
+ K.ROOT-SERVERS.NET
+ L.ROOT-SERVERS.NET
+ M.ROOT-SERVERS.NET
+ A.ROOT-SERVERS.NET
+ H.ROOT-SERVERS.NET
+ B.ROOT-SERVERS.NET
+ C.ROOT-SERVERS.NET
+ D.ROOT-SERVERS.NET
+. flags 0 type SOA(raw): OK; nrrs=1; cname=$; owner=$; ttl=82079
+ A.ROOT-SERVERS.NET hostmaster.INTERNIC.NET 1999071300 1800 900 604800 86400
+. flags 0 type PTR(raw): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 0 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 0 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 0 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 0 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 0 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 0 type NS(+addr): OK; nrrs=13; cname=$; owner=$; ttl=518399
+ I.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.36.148.17 )
+ F.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.5.5.241 )
+ G.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.112.36.4 )
+ J.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.10 )
+ K.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 193.0.14.129 )
+ L.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.32.64.12 )
+ M.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 202.12.27.33 )
+ A.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.4 )
+ H.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.63.2.53 )
+ B.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.9.0.107 )
+ C.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.33.4.12 )
+ D.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.8.10.90 )
+ E.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.203.230.10 )
+. flags 0 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 0 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=77975
+ A.ROOT-SERVERS.NET hostmaster@INTERNIC.NET 1999071300 1800 900 604800 86400
+. flags 0 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type NS(raw): OK; nrrs=13; cname=$; owner=$; ttl=518399
+ F.ROOT-SERVERS.NET
+ G.ROOT-SERVERS.NET
+ J.ROOT-SERVERS.NET
+ K.ROOT-SERVERS.NET
+ L.ROOT-SERVERS.NET
+ M.ROOT-SERVERS.NET
+ A.ROOT-SERVERS.NET
+ H.ROOT-SERVERS.NET
+ B.ROOT-SERVERS.NET
+ C.ROOT-SERVERS.NET
+ D.ROOT-SERVERS.NET
+ E.ROOT-SERVERS.NET
+ I.ROOT-SERVERS.NET
+. flags 1 type SOA(raw): OK; nrrs=1; cname=$; owner=$; ttl=74076
+ A.ROOT-SERVERS.NET hostmaster.INTERNIC.NET 1999071300 1800 900 604800 86400
+. flags 1 type PTR(raw): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type NS(+addr): OK; nrrs=13; cname=$; owner=$; ttl=518399
+ G.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.112.36.4 )
+ J.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.10 )
+ K.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 193.0.14.129 )
+ L.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.32.64.12 )
+ M.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 202.12.27.33 )
+ A.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.4 )
+ H.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.63.2.53 )
+ B.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.9.0.107 )
+ C.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.33.4.12 )
+ D.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.8.10.90 )
+ E.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.203.230.10 )
+ I.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.36.148.17 )
+ F.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.5.5.241 )
+. flags 1 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=70372
+ A.ROOT-SERVERS.NET hostmaster@INTERNIC.NET 1999071300 1800 900 604800 86400
+. flags 1 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 0 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 1 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+rc=0
diff --git a/regress/case-rootqueryall-as.sys b/regress/case-rootqueryall-as.sys
new file mode 100644
index 0000000..6d1da7a
--- /dev/null
+++ b/regress/case-rootqueryall-as.sys
@@ -0,0 +1,559 @@
+adnstest default -0x400
+. 1/.
+ start 931992019.753022
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000216
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000082
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000065
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.000454
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 00000200 01.
+ sendto=17
+ +0.000348
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 00000500 01.
+ sendto=17
+ +0.000303
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 00000600 01.
+ sendto=17
+ +0.000298
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 00000c00 01.
+ sendto=17
+ +0.000298
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 00000d00 01.
+ sendto=17
+ +0.000375
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000301
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 00001000 01.
+ sendto=17
+ +0.000299
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000351
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.000868
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 00000200 01.
+ sendto=17
+ +0.000617
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000299
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 00000600 01.
+ sendto=17
+ +0.000297
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000297
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.000307
+ sendto fd=4 addr=172.18.45.6:53
+ 31300100 00010000 00000000 00000200 01.
+ sendto=17
+ +0.000299
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 00000500 01.
+ sendto=17
+ +0.000298
+ sendto fd=4 addr=172.18.45.6:53
+ 31320100 00010000 00000000 00000600 01.
+ sendto=17
+ +0.000330
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 00000c00 01.
+ sendto=17
+ +0.000323
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 00000d00 01.
+ sendto=17
+ +0.000384
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000302
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 00001000 01.
+ sendto=17
+ +0.000300
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000296
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.000298
+ sendto fd=4 addr=172.18.45.6:53
+ 313a0100 00010000 00000000 00000200 01.
+ sendto=17
+ +0.000595
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000296
+ sendto fd=4 addr=172.18.45.6:53
+ 313d0100 00010000 00000000 00000600 01.
+ sendto=17
+ +0.000326
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000303
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.989938
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.007735
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010000 00010000 00000100 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000703
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000151
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.981803
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.011771
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 0001000d 0000000d 00000200 01000002 00010007 e8ff0014 01450c52
+ 4f4f542d 53455256 45525303 4e455400 00000200 010007e8 ff000401 49c01e00
+ 00020001 0007e8ff 00040146 c01e0000 02000100 07e8ff00 040147c0 1e000002
+ 00010007 e8ff0004 014ac01e 00000200 010007e8 ff000401 4bc01e00 00020001
+ 0007e8ff 0004014c c01e0000 02000100 07e8ff00 04014dc0 1e000002 00010007
+ e8ff0004 0141c01e 00000200 010007e8 ff000401 48c01e00 00020001 0007e8ff
+ 00040142 c01e0000 02000100 07e8ff00 040143c0 1e000002 00010007 e8ff0004
+ 0144c01e c01c0001 00010009 3a7f0004 c0cbe60a c03b0001 00010009 3a7f0004
+ c0249411 c04a0001 00010009 3a7f0004 c00505f1 c0590001 00010009 3a7f0004
+ c0702404 c0680001 00010009 3a7f0004 c629000a c0770001 00010009 3a7f0004
+ c1000e81 c0860001 00010009 3a7f0004 c620400c c0950001 00010009 3a7f0004
+ ca0c1b21 c0a40001 00010009 3a7f0004 c6290004 c0b30001 00010009 3a7f0004
+ 803f0235 c0c20001 00010009 3a7f0004 8009006b c0d10001 00010009 3a7f0004
+ c021040c c0e00001 00010009 3a7f0004 80080a5a.
+ +0.002660
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000492
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.967228
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.016740
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228180 00010001 000d000d 00000600 01000006 00010001 409f003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 51800000 02000100
+ 07e8ff00 040145c0 1e000002 00010007 e8ff0004 0149c01e 00000200 010007e8
+ ff000401 46c01e00 00020001 0007e8ff 00040147 c01e0000 02000100 07e8ff00
+ 04014ac0 1e000002 00010007 e8ff0004 014bc01e 00000200 010007e8 ff000401
+ 4cc01e00 00020001 0007e8ff 0004014d c01e0000 02000100 07e8ff00 02c01c00
+ 00020001 0007e8ff 00040148 c01e0000 02000100 07e8ff00 040142c0 1e000002
+ 00010007 e8ff0004 0143c01e 00000200 010007e8 ff000401 44c01ec0 65000100
+ 0100093a 7f0004c0 cbe60ac0 74000100 0100093a 7f0004c0 249411c0 83000100
+ 0100093a 7f0004c0 0505f1c0 92000100 0100093a 7f0004c0 702404c0 a1000100
+ 0100093a 7f0004c6 29000ac0 b0000100 0100093a 7f0004c1 000e81c0 bf000100
+ 0100093a 7f0004c6 20400cc0 ce000100 0100093a 7f0004ca 0c1b21c0 1c000100
+ 0100093a 7f0004c6 290004c0 ea000100 0100093a 7f000480 3f0235c0 f9000100
+ 0100093a 7f000480 09006bc1 08000100 0100093a 7f0004c0 21040cc1 17000100
+ 0100093a 7f000480 080a5a.
+ +0.002984
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000231
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.947273
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000462
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238180 00010000 00010000 00000c00 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000634
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000101
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.946076
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003306
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248180 00010000 00010000 00000d00 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000640
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000124
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.942006
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003471
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258180 00010000 00010000 00000f00 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000640
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000101
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.937794
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003503
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268180 00010000 00010000 00001000 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000657
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000120
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.933514
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003470
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278180 00010000 00010000 00001100 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000640
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000100
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.929304
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003089
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298180 00010000 00010000 00000100 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000639
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000100
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.925476
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.011378
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 0001000d 0000000d 00000200 01000002 00010007 e8ff0014 01490c52
+ 4f4f542d 53455256 45525303 4e455400 00000200 010007e8 ff000401 46c01e00
+ 00020001 0007e8ff 00040147 c01e0000 02000100 07e8ff00 04014ac0 1e000002
+ 00010007 e8ff0004 014bc01e 00000200 010007e8 ff000401 4cc01e00 00020001
+ 0007e8ff 0004014d c01e0000 02000100 07e8ff00 040141c0 1e000002 00010007
+ e8ff0004 0148c01e 00000200 010007e8 ff000401 42c01e00 00020001 0007e8ff
+ 00040143 c01e0000 02000100 07e8ff00 040144c0 1e000002 00010007 e8ff0004
+ 0145c01e c01c0001 00010009 3a7f0004 c0249411 c03b0001 00010009 3a7f0004
+ c00505f1 c04a0001 00010009 3a7f0004 c0702404 c0590001 00010009 3a7f0004
+ c629000a c0680001 00010009 3a7f0004 c1000e81 c0770001 00010009 3a7f0004
+ c620400c c0860001 00010009 3a7f0004 ca0c1b21 c0950001 00010009 3a7f0004
+ c6290004 c0a40001 00010009 3a7f0004 803f0235 c0b30001 00010009 3a7f0004
+ 8009006b c0c20001 00010009 3a7f0004 c021040c c0d10001 00010009 3a7f0004
+ 80080a5a c0e00001 00010009 3a7f0004 c0cbe60a.
+ +0.004350
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000096
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.909652
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003338
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8180 00010000 00010000 00000f00 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000643
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000106
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.905565
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.012071
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010001 000d000d 00000600 01000006 00010001 3097003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 51800000 02000100
+ 07e8ff00 040149c0 1e000002 00010007 e8ff0004 0146c01e 00000200 010007e8
+ ff000401 47c01e00 00020001 0007e8ff 0004014a c01e0000 02000100 07e8ff00
+ 04014bc0 1e000002 00010007 e8ff0004 014cc01e 00000200 010007e8 ff000401
+ 4dc01e00 00020001 0007e8ff 0002c01c 00000200 010007e8 ff000401 48c01e00
+ 00020001 0007e8ff 00040142 c01e0000 02000100 07e8ff00 040143c0 1e000002
+ 00010007 e8ff0004 0144c01e 00000200 010007e8 ff000401 45c01ec0 65000100
+ 0100093a 7f0004c0 249411c0 74000100 0100093a 7f0004c0 0505f1c0 83000100
+ 0100093a 7f0004c0 702404c0 92000100 0100093a 7f0004c6 29000ac0 a1000100
+ 0100093a 7f0004c1 000e81c0 b0000100 0100093a 7f0004c6 20400cc0 bf000100
+ 0100093a 7f0004ca 0c1b21c0 1c000100 0100093a 7f0004c6 290004c0 db000100
+ 0100093a 7f000480 3f0235c0 ea000100 0100093a 7f000480 09006bc0 f9000100
+ 0100093a 7f0004c0 21040cc1 08000100 0100093a 7f000480 080a5ac1 17000100
+ 0100093a 7f0004c0 cbe60a.
+ +0.002963
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000237
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.890294
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000878
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8180 00010000 00010000 00001100 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000645
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000107
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.888664
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003147
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8180 00010000 00010000 00000100 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000643
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000141
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.884733
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.011290
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31308180 0001000d 0000000d 00000200 01000002 00010007 e8ff0014 01460c52
+ 4f4f542d 53455256 45525303 4e455400 00000200 010007e8 ff000401 47c01e00
+ 00020001 0007e8ff 0004014a c01e0000 02000100 07e8ff00 04014bc0 1e000002
+ 00010007 e8ff0004 014cc01e 00000200 010007e8 ff000401 4dc01e00 00020001
+ 0007e8ff 00040141 c01e0000 02000100 07e8ff00 040148c0 1e000002 00010007
+ e8ff0004 0142c01e 00000200 010007e8 ff000401 43c01e00 00020001 0007e8ff
+ 00040144 c01e0000 02000100 07e8ff00 040145c0 1e000002 00010007 e8ff0004
+ 0149c01e c01c0001 00010009 3a7f0004 c00505f1 c03b0001 00010009 3a7f0004
+ c0702404 c04a0001 00010009 3a7f0004 c629000a c0590001 00010009 3a7f0004
+ c1000e81 c0680001 00010009 3a7f0004 c620400c c0770001 00010009 3a7f0004
+ ca0c1b21 c0860001 00010009 3a7f0004 c6290004 c0950001 00010009 3a7f0004
+ 803f0235 c0a40001 00010009 3a7f0004 8009006b c0b30001 00010009 3a7f0004
+ c021040c c0c20001 00010009 3a7f0004 80080a5a c0d10001 00010009 3a7f0004
+ c0cbe60a c0e00001 00010009 3a7f0004 c0249411.
+ +0.002658
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000400
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.870385
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.019033
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31328180 00010001 000d000d 00000600 01000006 00010001 215c003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 51800000 02000100
+ 07e8ff00 040146c0 1e000002 00010007 e8ff0004 0147c01e 00000200 010007e8
+ ff000401 4ac01e00 00020001 0007e8ff 0004014b c01e0000 02000100 07e8ff00
+ 04014cc0 1e000002 00010007 e8ff0004 014dc01e 00000200 010007e8 ff0002c0
+ 1c000002 00010007 e8ff0004 0148c01e 00000200 010007e8 ff000401 42c01e00
+ 00020001 0007e8ff 00040143 c01e0000 02000100 07e8ff00 040144c0 1e000002
+ 00010007 e8ff0004 0145c01e 00000200 010007e8 ff000401 49c01ec0 65000100
+ 0100093a 7f0004c0 0505f1c0 74000100 0100093a 7f0004c0 702404c0 83000100
+ 0100093a 7f0004c6 29000ac0 92000100 0100093a 7f0004c1 000e81c0 a1000100
+ 0100093a 7f0004c6 20400cc0 b0000100 0100093a 7f0004ca 0c1b21c0 1c000100
+ 0100093a 7f0004c6 290004c0 cc000100 0100093a 7f000480 3f0235c0 db000100
+ 0100093a 7f000480 09006bc0 ea000100 0100093a 7f0004c0 21040cc0 f9000100
+ 0100093a 7f000480 080a5ac1 08000100 0100093a 7f0004c0 cbe60ac1 17000100
+ 0100093a 7f0004c0 249411.
+ +0.002965
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000228
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.848159
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000402
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31338180 00010000 00010000 00000c00 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000658
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000104
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.846995
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003222
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31348180 00010000 00010000 00000d00 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000645
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000107
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.843021
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003535
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31358180 00010000 00010000 00000f00 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000640
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000128
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.838718
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003396
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31368180 00010000 00010000 00001000 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000643
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000108
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.834571
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003560
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31378180 00010000 00010000 00001100 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000642
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000133
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.830236
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003060
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31398180 00010000 00010000 00000100 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000645
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000106
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.826425
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.011323
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313a8180 0001000d 0000000d 00000200 01000002 00010007 e8ff0014 01470c52
+ 4f4f542d 53455256 45525303 4e455400 00000200 010007e8 ff000401 4ac01e00
+ 00020001 0007e8ff 0004014b c01e0000 02000100 07e8ff00 04014cc0 1e000002
+ 00010007 e8ff0004 014dc01e 00000200 010007e8 ff000401 41c01e00 00020001
+ 0007e8ff 00040148 c01e0000 02000100 07e8ff00 040142c0 1e000002 00010007
+ e8ff0004 0143c01e 00000200 010007e8 ff000401 44c01e00 00020001 0007e8ff
+ 00040145 c01e0000 02000100 07e8ff00 040149c0 1e000002 00010007 e8ff0004
+ 0146c01e c01c0001 00010009 3a7f0004 c0702404 c03b0001 00010009 3a7f0004
+ c629000a c04a0001 00010009 3a7f0004 c1000e81 c0590001 00010009 3a7f0004
+ c620400c c0680001 00010009 3a7f0004 ca0c1b21 c0770001 00010009 3a7f0004
+ c6290004 c0860001 00010009 3a7f0004 803f0235 c0950001 00010009 3a7f0004
+ 8009006b c0a40001 00010009 3a7f0004 c021040c c0b30001 00010009 3a7f0004
+ 80080a5a c0c20001 00010009 3a7f0004 c0cbe60a c0d10001 00010009 3a7f0004
+ c0249411 c0e00001 00010009 3a7f0004 c00505f1.
+ +0.004326
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000127
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.810649
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003326
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313c8180 00010000 00010000 00000f00 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000643
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000105
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.806575
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.025669
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313d8180 00010001 000d000d 00000600 01000006 00010001 12e4003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 51800000 02000100
+ 07e8ff00 040147c0 1e000002 00010007 e8ff0004 014ac01e 00000200 010007e8
+ ff000401 4bc01e00 00020001 0007e8ff 0004014c c01e0000 02000100 07e8ff00
+ 04014dc0 1e000002 00010007 e8ff0002 c01c0000 02000100 07e8ff00 040148c0
+ 1e000002 00010007 e8ff0004 0142c01e 00000200 010007e8 ff000401 43c01e00
+ 00020001 0007e8ff 00040144 c01e0000 02000100 07e8ff00 040145c0 1e000002
+ 00010007 e8ff0004 0149c01e 00000200 010007e8 ff000401 46c01ec0 65000100
+ 0100093a 7f0004c0 702404c0 74000100 0100093a 7f0004c6 29000ac0 83000100
+ 0100093a 7f0004c1 000e81c0 92000100 0100093a 7f0004c6 20400cc0 a1000100
+ 0100093a 7f0004ca 0c1b21c0 1c000100 0100093a 7f0004c6 290004c0 bd000100
+ 0100093a 7f000480 3f0235c0 cc000100 0100093a 7f000480 09006bc0 db000100
+ 0100093a 7f0004c0 21040cc0 ea000100 0100093a 7f000480 080a5ac0 f9000100
+ 0100093a 7f0004c0 cbe60ac1 08000100 0100093a 7f0004c0 249411c1 17000100
+ 0100093a 7f0004c0 0505f1.
+ +0.002963
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000233
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.777710
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004017
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313e8180 00010000 00010000 00001100 01000006 00010000 0257003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000640
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000106
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.772947
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-752512
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010000 00010000 00000500 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000649
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000106
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.529913
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.181054
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31318580 00010000 00010000 00000500 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7727 68440000 07080000 03840009 3a800001 5180.
+ +0.000687
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000112
+ close fd=4
+ close=OK
+ +0.000197
diff --git a/regress/case-rootqueryall.err b/regress/case-rootqueryall.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-rootqueryall.err
diff --git a/regress/case-rootqueryall.out b/regress/case-rootqueryall.out
new file mode 100644
index 0000000..fa03c2f
--- /dev/null
+++ b/regress/case-rootqueryall.out
@@ -0,0 +1,127 @@
+adns debug: using nameserver 172.18.45.6
+. flags 0 type 1 A(-) submitted
+. flags 0 type 2 NS(raw) submitted
+. flags 0 type 5 CNAME(-) submitted
+. flags 0 type 6 SOA(raw) submitted
+. flags 0 type 12 PTR(raw) submitted
+. flags 0 type 13 HINFO(-) submitted
+. flags 0 type 15 MX(raw) submitted
+. flags 0 type 16 TXT(-) submitted
+. flags 0 type 17 RP(raw) submitted
+. flags 0 type 65537 A(addr) submitted
+. flags 0 type 65538 NS(+addr) submitted
+. flags 0 type 65548 PTR(checked) submitted
+. flags 0 type 65551 MX(+addr) submitted
+. flags 0 type 131078 SOA(822) submitted
+. flags 0 type 131089 RP(822) submitted
+. flags 1 type 1 A(-) submitted
+. flags 1 type 2 NS(raw) submitted
+. flags 1 type 5 CNAME(-) submitted
+. flags 1 type 6 SOA(raw) submitted
+. flags 1 type 12 PTR(raw) submitted
+. flags 1 type 13 HINFO(-) submitted
+. flags 1 type 15 MX(raw) submitted
+. flags 1 type 16 TXT(-) submitted
+. flags 1 type 17 RP(raw) submitted
+. flags 1 type 65537 A(addr) submitted
+. flags 1 type 65538 NS(+addr) submitted
+. flags 1 type 65548 PTR(checked) submitted
+. flags 1 type 65551 MX(+addr) submitted
+. flags 1 type 131078 SOA(822) submitted
+. flags 1 type 131089 RP(822) submitted
+. flags 0 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 0 type NS(raw): OK; nrrs=13; cname=$; owner=$; ttl=305624
+ E.ROOT-SERVERS.NET
+ I.ROOT-SERVERS.NET
+ F.ROOT-SERVERS.NET
+ G.ROOT-SERVERS.NET
+ J.ROOT-SERVERS.NET
+ K.ROOT-SERVERS.NET
+ L.ROOT-SERVERS.NET
+ M.ROOT-SERVERS.NET
+ A.ROOT-SERVERS.NET
+ H.ROOT-SERVERS.NET
+ B.ROOT-SERVERS.NET
+ C.ROOT-SERVERS.NET
+ D.ROOT-SERVERS.NET
+. flags 0 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 0 type SOA(raw): OK; nrrs=1; cname=$; owner=$; ttl=54334
+ A.ROOT-SERVERS.NET hostmaster.INTERNIC.NET 1999041600 1800 900 604800 86400
+. flags 0 type PTR(raw): No such data; nrrs=0; cname=$; owner=$; ttl=599
+adns debug: reply not found, id 3123, query owner (NS=172.18.45.6)
+. flags 0 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+adns debug: reply not found, id 3129, query owner (NS=172.18.45.6)
+adns debug: reply not found, id 312b, query owner (NS=172.18.45.6)
+adns debug: reply not found, id 312f, query owner (NS=172.18.45.6)
+. flags 0 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 0 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 0 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 0 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 0 type NS(+addr): OK; nrrs=13; cname=$; owner=$; ttl=305624
+ I.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.36.148.17 )
+ F.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.5.5.241 )
+ G.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.112.36.4 )
+ J.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.10 )
+ K.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 193.0.14.129 )
+ L.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.32.64.12 )
+ M.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 202.12.27.33 )
+ A.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.4 )
+ H.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.63.2.53 )
+ B.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.9.0.107 )
+ C.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.33.4.12 )
+ D.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.8.10.90 )
+ E.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.203.230.10 )
+. flags 0 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604793
+. flags 0 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 0 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=51616
+ A.ROOT-SERVERS.NET hostmaster@INTERNIC.NET 1999041600 1800 900 604800 86400
+. flags 0 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 1 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type NS(raw): OK; nrrs=13; cname=$; owner=$; ttl=305624
+ F.ROOT-SERVERS.NET
+ G.ROOT-SERVERS.NET
+ J.ROOT-SERVERS.NET
+ K.ROOT-SERVERS.NET
+ L.ROOT-SERVERS.NET
+ M.ROOT-SERVERS.NET
+ A.ROOT-SERVERS.NET
+ H.ROOT-SERVERS.NET
+ B.ROOT-SERVERS.NET
+ C.ROOT-SERVERS.NET
+ D.ROOT-SERVERS.NET
+ E.ROOT-SERVERS.NET
+ I.ROOT-SERVERS.NET
+. flags 1 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 1 type SOA(raw): OK; nrrs=1; cname=$; owner=$; ttl=49034
+ A.ROOT-SERVERS.NET hostmaster.INTERNIC.NET 1999041600 1800 900 604800 86400
+. flags 1 type PTR(raw): No such data; nrrs=0; cname=$; owner=$; ttl=599
+. flags 1 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=599
+adns debug: reply not found, id 3133, query owner (NS=172.18.45.6)
+adns debug: reply not found, id 3123, query owner (NS=172.18.45.6)
+adns debug: reply not found, id 3134, query owner (NS=172.18.45.6)
+adns debug: reply not found, id 3139, query owner (NS=172.18.45.6)
+adns debug: reply not found, id 313b, query owner (NS=172.18.45.6)
+. flags 1 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 1 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=86400
+. flags 1 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=86399
+. flags 1 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=598
+. flags 1 type NS(+addr): OK; nrrs=13; cname=$; owner=$; ttl=305623
+ G.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.112.36.4 )
+ J.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.10 )
+ K.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 193.0.14.129 )
+ L.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.32.64.12 )
+ M.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 202.12.27.33 )
+ A.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 198.41.0.4 )
+ H.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.63.2.53 )
+ B.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.9.0.107 )
+ C.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.33.4.12 )
+ D.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 128.8.10.90 )
+ E.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.203.230.10 )
+ I.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.36.148.17 )
+ F.ROOT-SERVERS.NET ok 0 ok "OK" ( INET 192.5.5.241 )
+. flags 1 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604792
+. flags 1 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=598
+. flags 1 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=46580
+ A.ROOT-SERVERS.NET hostmaster@INTERNIC.NET 1999041600 1800 900 604800 86400
+. flags 1 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=598
+rc=0
diff --git a/regress/case-rootqueryall.sys b/regress/case-rootqueryall.sys
new file mode 100644
index 0000000..cf2efe3
--- /dev/null
+++ b/regress/case-rootqueryall.sys
@@ -0,0 +1,925 @@
+adnstest default -0x400,s
+. 1/.
+ start 924364450.165424
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000220
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000087
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000070
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.001746
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 00000200 01.
+ sendto=17
+ +0.001194
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 00000500 01.
+ sendto=17
+ +0.000783
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 00000600 01.
+ sendto=17
+ +0.000728
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 00000c00 01.
+ sendto=17
+ +0.000726
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 00000d00 01.
+ sendto=17
+ +0.001290
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000771
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 00001000 01.
+ sendto=17
+ +0.000843
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000778
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.000728
+ sendto fd=4 addr=172.18.45.6:53
+ 312a0100 00010000 00000000 00000200 01.
+ sendto=17
+ +0.001454
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000725
+ sendto fd=4 addr=172.18.45.6:53
+ 312d0100 00010000 00000000 00000600 01.
+ sendto=17
+ +0.000731
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000871
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.000737
+ sendto fd=4 addr=172.18.45.6:53
+ 31300100 00010000 00000000 00000200 01.
+ sendto=17
+ +0.000727
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 00000500 01.
+ sendto=17
+ +0.000732
+ sendto fd=4 addr=172.18.45.6:53
+ 31320100 00010000 00000000 00000600 01.
+ sendto=17
+ +0.000781
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 00000c00 01.
+ sendto=17
+ +0.000733
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 00000d00 01.
+ sendto=17
+ +0.000739
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000736
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 00001000 01.
+ sendto=17
+ +0.000837
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000734
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.000730
+ sendto fd=4 addr=172.18.45.6:53
+ 313a0100 00010000 00000000 00000200 01.
+ sendto=17
+ +0.001465
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000732
+ sendto fd=4 addr=172.18.45.6:53
+ 313d0100 00010000 00000000 00000600 01.
+ sendto=17
+ +0.000734
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000764
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.975451
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.006067
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 0001000d 0000000d 00000200 01000002 00010004 a9df0014 01450c52
+ 4f4f542d 53455256 45525303 4e455400 00000200 010004a9 df000401 49c01e00
+ 00020001 0004a9df 00040146 c01e0000 02000100 04a9df00 040147c0 1e000002
+ 00010004 a9df0004 014ac01e 00000200 010004a9 df000401 4bc01e00 00020001
+ 0004a9df 0004014c c01e0000 02000100 04a9df00 04014dc0 1e000002 00010004
+ a9df0004 0141c01e 00000200 010004a9 df000401 48c01e00 00020001 0004a9df
+ 00040142 c01e0000 02000100 04a9df00 040143c0 1e000002 00010004 a9df0004
+ 0144c01e c01c0001 00010009 29a00004 c0cbe60a c03b0001 00010009 2c0f0004
+ c0249411 c04a0001 00010009 29a00004 c00505f1 c0590001 00010009 29a00004
+ c0702404 c0680001 00010005 fb5f0004 c629000a c0770001 00010005 fb5f0004
+ c1000e81 c0860001 00010005 fb5f0004 c620400c c0950001 00010005 fb5f0004
+ ca0c1b21 c0a40001 00010009 29a00004 c6290004 c0b30001 00010009 29a00004
+ 803f0235 c0c20001 00010009 29a00004 8009006b c0d10001 00010009 29a00004
+ c021040c c0e00001 00010009 29a00004 80080a5a.
+ +0.002235
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000583
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.966566
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.014201
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228180 00010001 000d000d 00000600 01000006 00010000 d445003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 51800000 02000100
+ 04a9df00 040145c0 1e000002 00010004 a9df0004 0149c01e 00000200 010004a9
+ df000401 46c01e00 00020001 0004a9df 00040147 c01e0000 02000100 04a9df00
+ 04014ac0 1e000002 00010004 a9df0004 014bc01e 00000200 010004a9 df000401
+ 4cc01e00 00020001 0004a9df 0004014d c01e0000 02000100 04a9df00 02c01c00
+ 00020001 0004a9df 00040148 c01e0000 02000100 04a9df00 040142c0 1e000002
+ 00010004 a9df0004 0143c01e 00000200 010004a9 df000401 44c01ec0 65000100
+ 01000929 a00004c0 cbe60ac0 74000100 0100092c 0f0004c0 249411c0 83000100
+ 01000929 a00004c0 0505f1c0 92000100 01000929 a00004c0 702404c0 a1000100
+ 010005fb 5f0004c6 29000ac0 b0000100 010005fb 5f0004c1 000e81c0 bf000100
+ 010005fb 5f0004c6 20400cc0 ce000100 010005fb 5f0004ca 0c1b21c0 1c000100
+ 01000929 a00004c6 290004c0 ea000100 01000929 a0000480 3f0235c0 f9000100
+ 01000929 a0000480 09006bc1 08000100 01000929 a00004c0 21040cc1 17000100
+ 01000929 a0000480 080a5a.
+ +0.002439
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000260
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.949666
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.048060
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312a8180 0001000d 0000000d 00000200 01000002 00010004 a9df0014 01490c52
+ 4f4f542d 53455256 45525303 4e455400 00000200 010004a9 df000401 46c01e00
+ 00020001 0004a9df 00040147 c01e0000 02000100 04a9df00 04014ac0 1e000002
+ 00010004 a9df0004 014bc01e 00000200 010004a9 df000401 4cc01e00 00020001
+ 0004a9df 0004014d c01e0000 02000100 04a9df00 040141c0 1e000002 00010004
+ a9df0004 0148c01e 00000200 010004a9 df000401 42c01e00 00020001 0004a9df
+ 00040143 c01e0000 02000100 04a9df00 040144c0 1e000002 00010004 a9df0004
+ 0145c01e c01c0001 00010009 2c0f0004 c0249411 c03b0001 00010009 29a00004
+ c00505f1 c04a0001 00010009 29a00004 c0702404 c0590001 00010005 fb5f0004
+ c629000a c0680001 00010005 fb5f0004 c1000e81 c0770001 00010005 fb5f0004
+ c620400c c0860001 00010005 fb5f0004 ca0c1b21 c0950001 00010009 29a00004
+ c6290004 c0a40001 00010009 29a00004 803f0235 c0b30001 00010009 29a00004
+ 8009006b c0c20001 00010009 29a00004 c021040c c0d10001 00010009 29a00004
+ 80080a5a c0e00001 00010009 29a00004 c0cbe60a.
+ +0.008066
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.001199
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.892341
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.051265
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312d8180 00010001 000d000d 00000600 01000006 00010000 c9a7003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 51800000 02000100
+ 04a9df00 040149c0 1e000002 00010004 a9df0004 0146c01e 00000200 010004a9
+ df000401 47c01e00 00020001 0004a9df 0004014a c01e0000 02000100 04a9df00
+ 04014bc0 1e000002 00010004 a9df0004 014cc01e 00000200 010004a9 df000401
+ 4dc01e00 00020001 0004a9df 0002c01c 00000200 010004a9 df000401 48c01e00
+ 00020001 0004a9df 00040142 c01e0000 02000100 04a9df00 040143c0 1e000002
+ 00010004 a9df0004 0144c01e 00000200 010004a9 df000401 45c01ec0 65000100
+ 0100092c 0f0004c0 249411c0 74000100 01000929 a00004c0 0505f1c0 83000100
+ 01000929 a00004c0 702404c0 92000100 010005fb 5f0004c6 29000ac0 a1000100
+ 010005fb 5f0004c1 000e81c0 b0000100 010005fb 5f0004c6 20400cc0 bf000100
+ 010005fb 5f0004ca 0c1b21c0 1c000100 01000929 a00004c6 290004c0 db000100
+ 01000929 a0000480 3f0235c0 ea000100 01000929 a0000480 09006bc0 f9000100
+ 01000929 a00004c0 21040cc1 08000100 01000929 a0000480 080a5ac1 17000100
+ 01000929 a00004c0 cbe60a.
+ +0.002462
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000257
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.838357
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.022221
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31308180 0001000d 0000000d 00000200 01000002 00010004 a9df0014 01460c52
+ 4f4f542d 53455256 45525303 4e455400 00000200 010004a9 df000401 47c01e00
+ 00020001 0004a9df 0004014a c01e0000 02000100 04a9df00 04014bc0 1e000002
+ 00010004 a9df0004 014cc01e 00000200 010004a9 df000401 4dc01e00 00020001
+ 0004a9df 00040141 c01e0000 02000100 04a9df00 040148c0 1e000002 00010004
+ a9df0004 0142c01e 00000200 010004a9 df000401 43c01e00 00020001 0004a9df
+ 00040144 c01e0000 02000100 04a9df00 040145c0 1e000002 00010004 a9df0004
+ 0149c01e c01c0001 00010009 29a00004 c00505f1 c03b0001 00010009 29a00004
+ c0702404 c04a0001 00010005 fb5f0004 c629000a c0590001 00010005 fb5f0004
+ c1000e81 c0680001 00010005 fb5f0004 c620400c c0770001 00010005 fb5f0004
+ ca0c1b21 c0860001 00010009 29a00004 c6290004 c0950001 00010009 29a00004
+ 803f0235 c0a40001 00010009 29a00004 8009006b c0b30001 00010009 29a00004
+ c021040c c0c20001 00010009 29a00004 80080a5a c0d10001 00010009 29a00004
+ c0cbe60a c0e00001 00010009 2c0f0004 c0249411.
+ +0.002373
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000502
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.813261
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.014045
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31328180 00010001 000d000d 00000600 01000006 00010000 bf91003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 51800000 02000100
+ 04a9df00 040146c0 1e000002 00010004 a9df0004 0147c01e 00000200 010004a9
+ df000401 4ac01e00 00020001 0004a9df 0004014b c01e0000 02000100 04a9df00
+ 04014cc0 1e000002 00010004 a9df0004 014dc01e 00000200 010004a9 df0002c0
+ 1c000002 00010004 a9df0004 0148c01e 00000200 010004a9 df000401 42c01e00
+ 00020001 0004a9df 00040143 c01e0000 02000100 04a9df00 040144c0 1e000002
+ 00010004 a9df0004 0145c01e 00000200 010004a9 df000401 49c01ec0 65000100
+ 01000929 a00004c0 0505f1c0 74000100 01000929 a00004c0 702404c0 83000100
+ 010005fb 5f0004c6 29000ac0 92000100 010005fb 5f0004c1 000e81c0 a1000100
+ 010005fb 5f0004c6 20400cc0 b0000100 010005fb 5f0004ca 0c1b21c0 1c000100
+ 01000929 a00004c6 290004c0 cc000100 01000929 a0000480 3f0235c0 db000100
+ 01000929 a0000480 09006bc0 ea000100 01000929 a00004c0 21040cc0 f9000100
+ 01000929 a0000480 080a5ac1 08000100 01000929 a00004c0 cbe60ac1 17000100
+ 0100092c 0f0004c0 249411.
+ +0.002429
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000266
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.796521
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.054212
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313a8180 0001000d 0000000d 00000200 01000002 00010004 a9df0014 01470c52
+ 4f4f542d 53455256 45525303 4e455400 00000200 010004a9 df000401 4ac01e00
+ 00020001 0004a9df 0004014b c01e0000 02000100 04a9df00 04014cc0 1e000002
+ 00010004 a9df0004 014dc01e 00000200 010004a9 df000401 41c01e00 00020001
+ 0004a9df 00040148 c01e0000 02000100 04a9df00 040142c0 1e000002 00010004
+ a9df0004 0143c01e 00000200 010004a9 df000401 44c01e00 00020001 0004a9df
+ 00040145 c01e0000 02000100 04a9df00 040149c0 1e000002 00010004 a9df0004
+ 0146c01e c01c0001 00010009 29a00004 c0702404 c03b0001 00010005 fb5f0004
+ c629000a c04a0001 00010005 fb5f0004 c1000e81 c0590001 00010005 fb5f0004
+ c620400c c0680001 00010005 fb5f0004 ca0c1b21 c0770001 00010009 29a00004
+ c6290004 c0860001 00010009 29a00004 803f0235 c0950001 00010009 29a00004
+ 8009006b c0a40001 00010009 29a00004 c021040c c0b30001 00010009 29a00004
+ 80080a5a c0c20001 00010009 29a00004 c0cbe60a c0d10001 00010009 2c0f0004
+ c0249411 c0e00001 00010009 29a00004 c00505f1.
+ +0.002233
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.001175
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.738901
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.025228
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313d8180 00010001 000d000d 00000600 01000006 00010000 b5fc003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 51800000 02000100
+ 04a9df00 040147c0 1e000002 00010004 a9df0004 014ac01e 00000200 010004a9
+ df000401 4bc01e00 00020001 0004a9df 0004014c c01e0000 02000100 04a9df00
+ 04014dc0 1e000002 00010004 a9df0002 c01c0000 02000100 04a9df00 040148c0
+ 1e000002 00010004 a9df0004 0142c01e 00000200 010004a9 df000401 43c01e00
+ 00020001 0004a9df 00040144 c01e0000 02000100 04a9df00 040145c0 1e000002
+ 00010004 a9df0004 0149c01e 00000200 010004a9 df000401 46c01ec0 65000100
+ 01000929 a00004c0 702404c0 74000100 010005fb 5f0004c6 29000ac0 83000100
+ 010005fb 5f0004c1 000e81c0 92000100 010005fb 5f0004c6 20400cc0 a1000100
+ 010005fb 5f0004ca 0c1b21c0 1c000100 01000929 a00004c6 290004c0 bd000100
+ 01000929 a0000480 3f0235c0 cc000100 01000929 a0000480 09006bc0 db000100
+ 01000929 a00004c0 21040cc0 ea000100 01000929 a0000480 080a5ac0 f9000100
+ 01000929 a00004c0 cbe60ac1 08000100 0100092c 0f0004c0 249411c1 17000100
+ 01000929 a00004c0 0505f1.
+ +0.002484
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000259
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.710930
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-273743
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.001383
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 00000500 01.
+ sendto=17
+ +0.001121
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 00000c00 01.
+ sendto=17
+ +0.000743
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 00000d00 01.
+ sendto=17
+ +0.000688
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000684
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 00001000 01.
+ sendto=17
+ +0.000683
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000683
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.001364
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000681
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000684
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.000733
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 00000500 01.
+ sendto=17
+ +0.000710
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 00000c00 01.
+ sendto=17
+ +0.000723
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 00000d00 01.
+ sendto=17
+ +0.000688
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000685
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 00001000 01.
+ sendto=17
+ +0.000685
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000687
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.001366
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000825
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000681
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.983502
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-06971
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.001460
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 00000500 01.
+ sendto=17
+ +0.001113
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 00000c00 01.
+ sendto=17
+ +0.000732
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 00000d00 01.
+ sendto=17
+ +0.000691
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000684
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 00001000 01.
+ sendto=17
+ +0.000688
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000688
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.001370
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000716
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000687
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.000682
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 00000500 01.
+ sendto=17
+ +0.000709
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 00000c00 01.
+ sendto=17
+ +0.000720
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 00000d00 01.
+ sendto=17
+ +0.000689
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000686
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 00001000 01.
+ sendto=17
+ +0.000683
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000687
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.001387
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000683
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000682
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.983562
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-06911
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.001256
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 00000500 01.
+ sendto=17
+ +0.000762
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 00000c00 01.
+ sendto=17
+ +0.000685
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 00000d00 01.
+ sendto=17
+ +0.000686
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000680
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 00001000 01.
+ sendto=17
+ +0.000680
+ sendto fd=4 addr=172.18.45.6:53
+ 31270100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000680
+ sendto fd=4 addr=172.18.45.6:53
+ 31290100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.001397
+ sendto fd=4 addr=172.18.45.6:53
+ 312c0100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000683
+ sendto fd=4 addr=172.18.45.6:53
+ 312e0100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000800
+ sendto fd=4 addr=172.18.45.6:53
+ 312f0100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.000684
+ sendto fd=4 addr=172.18.45.6:53
+ 31310100 00010000 00000000 00000500 01.
+ sendto=17
+ +0.000689
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000001
+ sendto fd=4 addr=172.18.45.6:53
+ 31330100 00010000 00000000 00000c00 01.
+ sendto=17
+ +0.000742
+ sendto fd=4 addr=172.18.45.6:53
+ 31340100 00010000 00000000 00000d00 01.
+ sendto=17
+ +0.000690
+ sendto fd=4 addr=172.18.45.6:53
+ 31350100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.002905
+ sendto fd=4 addr=172.18.45.6:53
+ 31360100 00010000 00000000 00001000 01.
+ sendto=17
+ +0.000746
+ sendto fd=4 addr=172.18.45.6:53
+ 31370100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000721
+ sendto fd=4 addr=172.18.45.6:53
+ 31390100 00010000 00000000 00000100 01.
+ sendto=17
+ +0.001361
+ sendto fd=4 addr=172.18.45.6:53
+ 313c0100 00010000 00000000 00000f00 01.
+ sendto=17
+ +0.000679
+ sendto fd=4 addr=172.18.45.6:53
+ 313e0100 00010000 00000000 00001100 01.
+ sendto=17
+ +0.000678
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.981795
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.010527
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238180 00010000 00010000 00000c00 01000006 00010000 0258003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000578
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000147
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.970543
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.014036
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298180 00010000 00010000 00000100 01000006 00010000 0258003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000625
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000126
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.955756
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.023928
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8180 00010000 00010000 00000100 01000006 00010000 0258003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000572
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000147
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.931109
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004638
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31338180 00010000 00010000 00000c00 01000006 00010000 0258003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000569
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000120
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.925782
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003203
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31348180 00010000 00010000 00000d00 01000006 00010000 0258003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000598
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000341
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.921640
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.024117
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31398180 00010000 00010000 00000100 01000006 00010000 0258003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000570
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.004905
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.892048
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002074
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313c8180 00010000 00010000 00000f00 01000006 00010000 0258003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000566
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000121
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.889287
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.160358
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313e8180 00010000 00010000 00001100 01000006 00010000 0258003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000591
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000127
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.728211
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-133482
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010000 00010000 00000100 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000623
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000132
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.860938
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.028946
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010000 00010000 00000500 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000593
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000124
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.831275
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039651
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010000 00010000 00000c00 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000624
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000160
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.790840
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.029121
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010000 00010000 00000d00 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000596
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000124
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.760999
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.162355
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268580 00010000 00010000 00001000 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000596
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000155
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.597893
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.027725
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31278580 00010000 00010000 00001100 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000589
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000124
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.569455
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.027796
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31298580 00010000 00010000 00000100 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000716
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000199
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.540744
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.028676
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312c8580 00010000 00010000 00000f00 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000588
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000122
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.511358
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.029928
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312b8580 00010000 00010000 00000c00 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000588
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000211
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.480631
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039073
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312e8580 00010000 00010000 00001100 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000777
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000144
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.440637
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.028603
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31318580 00010000 00010000 00000500 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000583
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000123
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.411328
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.028684
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 312f8580 00010000 00010000 00000100 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000603
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000152
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.381889
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.029562
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258580 00010000 00010000 00000f00 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000584
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000124
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.361302
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.029558
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31338580 00010000 00010000 00000c00 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000618
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000151
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.330975
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039234
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31378580 00010000 00010000 00001100 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000585
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000124
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.291032
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.029095
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010000 00010000 00000c00 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000602
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000180
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.261155
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.029292
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31348580 00010000 00010000 00000d00 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000601
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000149
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.231113
+ select=1 rfds=[4] wfds=[] efds=[]
+ +1.-967500
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31368580 00010000 00010000 00001000 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000602
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000153
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.197858
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.026021
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31398580 00010000 00010000 00000100 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000599
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000150
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.171088
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.039664
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 313b8580 00010000 00010000 00000c00 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000600
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000172
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.130652
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.029223
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31358580 00010000 00010000 00000f00 01000006 00010001 5180003e 01410c52
+ 4f4f542d 53455256 45525303 4e455400 0a686f73 746d6173 74657208 494e5445
+ 524e4943 c02b7726 f4400000 07080000 03840009 3a800001 5180.
+ +0.000583
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000127
+ close fd=4
+ close=OK
+ +0.000982
diff --git a/regress/case-rr_addr-binary-compat.err b/regress/case-rr_addr-binary-compat.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-rr_addr-binary-compat.err
diff --git a/regress/case-rr_addr-binary-compat.out b/regress/case-rr_addr-binary-compat.out
new file mode 100644
index 0000000..89cccbb
--- /dev/null
+++ b/regress/case-rr_addr-binary-compat.out
@@ -0,0 +1,18 @@
+adns debug: using nameserver 172.29.199.224
+maddr.dnserr.distorted.org.uk flags 0 type 65537 A(addr) submitted
+maddr.dnserr.distorted.org.uk flags 0 type 65537 A(addr) submitted
+maddr.dnserr.distorted.org.uk flags 0 type A(addr): OK; nrrs=6; cname=$; owner=$; ttl=14400
+ INET 198.51.100.2
+ INET 198.51.100.1
+ INET 203.0.113.1
+ INET 203.0.113.2
+ INET 192.0.2.1
+ INET 192.0.2.2
+maddr.dnserr.distorted.org.uk flags 0 type A(addr): OK; nrrs=6; cname=$; owner=$; ttl=14400
+ INET 198.51.100.1
+ INET 198.51.100.2
+ INET 203.0.113.1
+ INET 203.0.113.2
+ INET 192.0.2.1
+ INET 192.0.2.2
+rc=0
diff --git a/regress/case-rr_addr-binary-compat.sys b/regress/case-rr_addr-binary-compat.sys
new file mode 100644
index 0000000..c1ae7bb
--- /dev/null
+++ b/regress/case-rr_addr-binary-compat.sys
@@ -0,0 +1,63 @@
+./adnstest distorted
+:0x1010000|1,0x10000|1 maddr.dnserr.distorted.org.uk
+ start 1402443258.469312
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000064
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000035
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000027
+ sendto fd=6 addr=172.29.199.224:53
+ 31200100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000405
+ sendto fd=6 addr=172.29.199.224:53
+ 31220100 00010000 00000000 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000308
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999287
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.001781
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31208580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001c0 0c000100 01000038 400004c6 336402c0
+ 0c000100 01000038 400004cb 007101c0 0c000100 01000038 400004cb 007102c0
+ 0c000100 01000038 400004c0 000201c0 0c000100 01000038 400004c0 000202c0
+ 0c000100 01000038 400004c6 336401c0 12000200 01000038 40000c06 72616469
+ 7573026e 73c012c0 12000200 01000038 40000a07 76616d70 697265c0 a2c01200
+ 02000100 00384000 0d0a7465 6c656361 73746572 c0a2c012 00020001 00003840
+ 000c0970 72656369 73696f6e c0a2c09b 00010001 00003840 00043e31 cc92c09b
+ 001c0001 00003840 00102001 04701f09 1b980000 00000000 0002c0b3 00010001
+ 00003840 00043e31 cc96c0b3 001c0001 00003840 00102001 04701f09 1b980000
+ 00000000 0006c0e2 00010001 00003840 0004d40d c646c0e2 001c0001 00003840
+ 00102001 0ba80000 01d90000 00000000 0006c0c9 00010001 00003840 0004d40d
+ c647c0c9 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0007.
+ +0.000411
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31228580 00010006 00040008 056d6164 64720664 6e736572 72096469 73746f72
+ 74656403 6f726702 756b0000 010001c0 0c000100 01000038 400004cb 007101c0
+ 0c000100 01000038 400004cb 007102c0 0c000100 01000038 400004c0 000201c0
+ 0c000100 01000038 400004c0 000202c0 0c000100 01000038 400004c6 336401c0
+ 0c000100 01000038 400004c6 336402c0 12000200 01000038 40000c06 72616469
+ 7573026e 73c012c0 12000200 01000038 40000c09 70726563 6973696f 6ec0a2c0
+ 12000200 01000038 40000a07 76616d70 697265c0 a2c01200 02000100 00384000
+ 0d0a7465 6c656361 73746572 c0a2c09b 00010001 00003840 00043e31 cc92c09b
+ 001c0001 00003840 00102001 04701f09 1b980000 00000000 0002c0cb 00010001
+ 00003840 00043e31 cc96c0cb 001c0001 00003840 00102001 04701f09 1b980000
+ 00000000 0006c0b3 00010001 00003840 0004d40d c646c0b3 001c0001 00003840
+ 00102001 0ba80000 01d90000 00000000 0006c0e1 00010001 00003840 0004d40d
+ c647c0e1 001c0001 00003840 00102001 0ba80000 01d90000 00000000 0007.
+ +0.000482
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000103
+ close fd=6
+ close=OK
+ +0.001487
diff --git a/regress/case-search-as.err b/regress/case-search-as.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-search-as.err
diff --git a/regress/case-search-as.out b/regress/case-search-as.out
new file mode 100644
index 0000000..95e15a5
--- /dev/null
+++ b/regress/case-search-as.out
@@ -0,0 +1,14 @@
+adns debug: using nameserver 172.18.45.6
+news flags 5 type 1 A(-) submitted
+chiark flags 5 type 1 A(-) submitted
+news flags 1 type 1 A(-) submitted
+chiark flags 1 type 1 A(-) submitted
+news flags 5 type A(-): OK; nrrs=1; cname=davenant.relativity.greenend.org.uk; owner=news.davenant.greenend.org.uk; ttl=86400
+ 172.18.45.6
+news flags 1 type A(-): OK; nrrs=1; cname=davenant.relativity.greenend.org.uk; owner=$; ttl=86400
+ 172.18.45.6
+chiark flags 5 type A(-): OK; nrrs=1; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+ 195.224.76.132
+chiark flags 1 type A(-): OK; nrrs=1; cname=$; owner=$; ttl=86400
+ 195.224.76.132
+rc=0
diff --git a/regress/case-search-as.sys b/regress/case-search-as.sys
new file mode 100644
index 0000000..442a0a5
--- /dev/null
+++ b/regress/case-search-as.sys
@@ -0,0 +1,131 @@
+adnstest default
+:0x0|1 0x5/news 0x5/chiark 1/news 1/chiark
+ start 931992052.232208
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000202
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000109
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000065
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000696
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 06636869 61726b08 64617665 6e616e74 08677265
+ 656e656e 64036f72 6702756b 00000100 01.
+ sendto=49
+ +0.000559
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000991
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 06636869 61726b08 64617665 6e616e74 08677265
+ 656e656e 64036f72 6702756b 00000100 01.
+ sendto=49
+ +0.000516
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997238
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.019885
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010002 00030003 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001c0 0c000500 01000151 80002508 64617665
+ 6e616e74 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c03b0001 00010001 51800004 ac122d06 c0440002 00010001 51800006 036e7330
+ c044c044 00020001 00015180 0006036e 7331c044 c0440002 00010001 51800006
+ 036e7332 c044c07c 00010001 00015180 0004ac12 2d06c08e 00010001 00015180
+ 0004ac12 2d41c0a0 00010001 00015180 0004ac12 2d01.
+ +0.001537
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000296
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.976216
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001966
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208583 00010000 00010000 06636869 61726b08 64617665 6e616e74 08677265
+ 656e656e 64036f72 6702756b 00000100 01086772 65656e65 6e64036f 72670275
+ 6b000006 00010001 5180002d 026e7306 63686961 726bc031 0a686f73 746d6173
+ 746572c0 31772741 34000070 8000001c 2000093a 80000151 80.
+ +0.000819
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000471
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000102
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.973417
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.006224
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010002 00030003 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001c0 0c000500 01000151 80002508 64617665
+ 6e616e74 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c03b0001 00010001 51800004 ac122d06 c0440002 00010001 51800006 036e7330
+ c044c044 00020001 00015180 0006036e 7331c044 c0440002 00010001 51800006
+ 036e7332 c044c07c 00010001 00015180 0004ac12 2d06c08e 00010001 00015180
+ 0004ac12 2d41c0a0 00010001 00015180 0004ac12 2d01.
+ +0.001353
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000239
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.966592
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001978
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228583 00010000 00010000 06636869 61726b08 64617665 6e616e74 08677265
+ 656e656e 64036f72 6702756b 00000100 01086772 65656e65 6e64036f 72670275
+ 6b000006 00010001 5180002d 026e7306 63686961 726bc031 0a686f73 746d6173
+ 746572c0 31772741 34000070 8000001c 2000093a 80000151 80.
+ +0.000817
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000436
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000101
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.987460
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004418
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d41.
+ +0.000982
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000180
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.993066
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003953
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d41.
+ +0.000986
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000143
+ close fd=4
+ close=OK
+ +0.000193
diff --git a/regress/case-search.err b/regress/case-search.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-search.err
diff --git a/regress/case-search.out b/regress/case-search.out
new file mode 100644
index 0000000..35e0367
--- /dev/null
+++ b/regress/case-search.out
@@ -0,0 +1,14 @@
+adns debug: using nameserver 172.18.45.6
+news flags 5 type 1 A(-) submitted
+chiark flags 5 type 1 A(-) submitted
+news flags 1 type 1 A(-) submitted
+chiark flags 1 type 1 A(-) submitted
+news flags 5 type A(-): OK; nrrs=1; cname=davenant.relativity.greenend.org.uk; owner=news.davenant.greenend.org.uk; ttl=86400
+ 172.18.45.6
+chiark flags 5 type A(-): OK; nrrs=1; cname=$; owner=chiark.greenend.org.uk; ttl=86400
+ 195.224.76.132
+news flags 1 type A(-): OK; nrrs=1; cname=davenant.relativity.greenend.org.uk; owner=$; ttl=86400
+ 172.18.45.6
+chiark flags 1 type A(-): OK; nrrs=1; cname=$; owner=$; ttl=86400
+ 195.224.76.132
+rc=0
diff --git a/regress/case-search.sys b/regress/case-search.sys
new file mode 100644
index 0000000..4c6675c
--- /dev/null
+++ b/regress/case-search.sys
@@ -0,0 +1,133 @@
+adnstest default -,s
+:0x0|1 0x5/news 0x5/chiark 1/news 1/chiark
+ start 924360470.478357
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000200
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000084
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000067
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=47
+ +0.001994
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 06636869 61726b08 64617665 6e616e74 08677265
+ 656e656e 64036f72 6702756b 00000100 01.
+ sendto=49
+ +0.001461
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=47
+ +0.001029
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 06636869 61726b08 64617665 6e616e74 08677265
+ 656e656e 64036f72 6702756b 00000100 01.
+ sendto=49
+ +0.000984
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.994532
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004691
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010002 00030003 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001c0 0c000500 01000151 80002508 64617665
+ 6e616e74 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c03b0001 00010001 51800004 ac122d06 c0440002 00010001 51800006 036e7330
+ c044c044 00020001 00015180 0006036e 7331c044 c0440002 00010001 51800006
+ 036e7332 c044c07c 00010001 00015180 0004ac12 2d06c08e 00010001 00015180
+ 0004ac12 2d41c0a0 00010001 00015180 0004ac12 2d01.
+ +0.001460
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000295
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.990080
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.001032
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208583 00010000 00010000 06636869 61726b08 64617665 6e616e74 08677265
+ 656e656e 64036f72 6702756b 00000100 01086772 65656e65 6e64036f 72670275
+ 6b000006 00010001 51800037 04646e73 3006656c 6d61696c 02636fc0 3e087269
+ 63686172 646b0663 68696172 6bc03177 26f0bf00 00708000 001c2000 093a8000
+ 015180.
+ +0.000739
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000925
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000101
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.988744
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005215
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010002 00030003 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001c0 0c000500 01000151 80002508 64617665
+ 6e616e74 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c03b0001 00010001 51800004 ac122d06 c0440002 00010001 51800006 036e7330
+ c044c044 00020001 00015180 0006036e 7331c044 c0440002 00010001 51800006
+ 036e7332 c044c07c 00010001 00015180 0004ac12 2d06c08e 00010001 00015180
+ 0004ac12 2d41c0a0 00010001 00015180 0004ac12 2d01.
+ +0.001514
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000264
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.982780
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.000850
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228583 00010000 00010000 06636869 61726b08 64617665 6e616e74 08677265
+ 656e656e 64036f72 6702756b 00000100 01086772 65656e65 6e64036f 72670275
+ 6b000006 00010001 51800037 04646e73 3006656c 6d61696c 02636fc0 3e087269
+ 63686172 646b0663 68696172 6bc03177 26f0bf00 00708000 001c2000 093a8000
+ 015180.
+ +0.000739
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000884
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000101
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.988668
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003228
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d41.
+ +0.000828
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000194
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.994026
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003357
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010001 51800004 c3e04c84 08677265 656e656e
+ 64036f72 6702756b 00000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c038 c0380002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d41.
+ +0.000828
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000155
+ close fd=4
+ close=OK
+ +0.000171
diff --git a/regress/case-searchabs.err b/regress/case-searchabs.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-searchabs.err
diff --git a/regress/case-searchabs.out b/regress/case-searchabs.out
new file mode 100644
index 0000000..5fb6b51
--- /dev/null
+++ b/regress/case-searchabs.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.18.45.6
+news.davenant flags 1 type 1 A(-) submitted
+news.davenant flags 1 type A(-): OK; nrrs=1; cname=davenant.relativity.greenend.org.uk; owner=$; ttl=584
+ 172.18.45.6
+rc=0
diff --git a/regress/case-searchabs.sys b/regress/case-searchabs.sys
new file mode 100644
index 0000000..ee547ba
--- /dev/null
+++ b/regress/case-searchabs.sys
@@ -0,0 +1,72 @@
+adnstest default
+:0x0|1 1/news.davenant
+ start 924363451.882765
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000207
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000088
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000071
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 046e6577 73086461 76656e61 6e740000 010001.
+ sendto=31
+ +0.001846
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998154
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004592
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8583 00010000 00010000 046e6577 73086461 76656e61 6e740000 01000100
+ 00060001 00000248 003e0141 0c524f4f 542d5345 52564552 53034e45 54000a68
+ 6f73746d 61737465 7208494e 5445524e 4943c039 7726f440 00000708 00000384
+ 00093a80 00015180.
+ +0.000697
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 046e6577 73086461 76656e61 6e740864 6176656e
+ 616e7408 67726565 6e656e64 036f7267 02756b00 00010001.
+ sendto=56
+ +0.001073
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000105
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.998125
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003727
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208583 00010000 00010000 046e6577 73086461 76656e61 6e740864 6176656e
+ 616e7408 67726565 6e656e64 036f7267 02756b00 00010001 08677265 656e656e
+ 64036f72 6702756b 00000600 01000151 80003704 646e7330 06656c6d 61696c02
+ 636fc045 08726963 68617264 6b066368 6961726b c0387726 f0bf0000 70800000
+ 1c200009 3a800001 5180.
+ +0.000972
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001.
+ sendto=47
+ +0.000965
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000105
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.997958
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.007222
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010002 00030003 046e6577 73086461 76656e61 6e740867 7265656e
+ 656e6403 6f726702 756b0000 010001c0 0c000500 01000151 80002508 64617665
+ 6e616e74 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ c03b0001 00010001 51800004 ac122d06 c0440002 00010001 51800006 036e7330
+ c044c044 00020001 00015180 0006036e 7331c044 c0440002 00010001 51800006
+ 036e7332 c044c07c 00010001 00015180 0004ac12 2d06c08e 00010001 00015180
+ 0004ac12 2d41c0a0 00010001 00015180 0004ac12 2d01.
+ +0.001124
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000295
+ close fd=4
+ close=OK
+ +0.000221
diff --git a/regress/case-sillyrp.err b/regress/case-sillyrp.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-sillyrp.err
diff --git a/regress/case-sillyrp.out b/regress/case-sillyrp.out
new file mode 100644
index 0000000..f947914
--- /dev/null
+++ b/regress/case-sillyrp.out
@@ -0,0 +1,22 @@
+adns debug: using nameserver 172.18.45.6
+silly-rp-dm.test.iwj.relativity.greenend.org.uk flags 112 type 17 RP(raw) submitted
+silly-rp-dm.test.iwj.relativity.greenend.org.uk flags 112 type 131089 RP(822) submitted
+silly-rp-lp.test.iwj.relativity.greenend.org.uk flags 112 type 17 RP(raw) submitted
+silly-rp-lp.test.iwj.relativity.greenend.org.uk flags 112 type 131089 RP(822) submitted
+silly-rp-lp.test.iwj.relativity.greenend.org.uk flags 0 type 17 RP(raw) submitted
+silly-rp-lp.test.iwj.relativity.greenend.org.uk flags 0 type 131089 RP(822) submitted
+silly-rp-dm.test.iwj.relativity.greenend.org.uk flags 0 type 17 RP(raw) submitted
+silly-rp-dm.test.iwj.relativity.greenend.org.uk flags 0 type 131089 RP(822) submitted
+silly-rp-dm.test.iwj.relativity.greenend.org.uk flags 112 type RP(raw): OK; nrrs=1; cname=$; owner=$; ttl=60
+ i\..root\000null.org .
+silly-rp-dm.test.iwj.relativity.greenend.org.uk flags 112 type RP(822): Found syntactically invalid domain name; nrrs=0; cname=$; owner=$; ttl=60
+silly-rp-lp.test.iwj.relativity.greenend.org.uk flags 112 type RP(raw): OK; nrrs=1; cname=$; owner=$; ttl=60
+ spong\000flibble.ucam.org .
+silly-rp-lp.test.iwj.relativity.greenend.org.uk flags 112 type RP(822): Found invalid DNS data; nrrs=0; cname=$; owner=$; ttl=60
+silly-rp-lp.test.iwj.relativity.greenend.org.uk flags 0 type RP(raw): OK; nrrs=1; cname=$; owner=$; ttl=60
+ spong\000flibble.ucam.org .
+silly-rp-lp.test.iwj.relativity.greenend.org.uk flags 0 type RP(822): Found invalid DNS data; nrrs=0; cname=$; owner=$; ttl=60
+silly-rp-dm.test.iwj.relativity.greenend.org.uk flags 0 type RP(raw): OK; nrrs=1; cname=$; owner=$; ttl=60
+ i\..root\000null.org .
+silly-rp-dm.test.iwj.relativity.greenend.org.uk flags 0 type RP(822): Found syntactically invalid domain name; nrrs=0; cname=$; owner=$; ttl=60
+rc=0
diff --git a/regress/case-sillyrp.sys b/regress/case-sillyrp.sys
new file mode 100644
index 0000000..f5d8e51
--- /dev/null
+++ b/regress/case-sillyrp.sys
@@ -0,0 +1,183 @@
+adnstest default
+:0x0|17,0x20000|17 0x70/silly-rp-dm.test.iwj.relativity.greenend.org.uk 0x70/silly-rp-lp.test.iwj.relativity.greenend.org.uk silly-rp-lp.test.iwj.relativity.greenend.org.uk silly-rp-dm.test.iwj.relativity.greenend.org.uk
+ start 929580348.131048
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000207
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000086
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000061
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 0b73696c 6c792d72 702d646d 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=65
+ +0.000768
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 0b73696c 6c792d72 702d646d 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=65
+ +0.001010
+ sendto fd=4 addr=172.18.45.6:53
+ 31210100 00010000 00000000 0b73696c 6c792d72 702d6c70 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=65
+ +0.000607
+ sendto fd=4 addr=172.18.45.6:53
+ 31220100 00010000 00000000 0b73696c 6c792d72 702d6c70 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=65
+ +0.000543
+ sendto fd=4 addr=172.18.45.6:53
+ 31230100 00010000 00000000 0b73696c 6c792d72 702d6c70 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=65
+ +0.000544
+ sendto fd=4 addr=172.18.45.6:53
+ 31240100 00010000 00000000 0b73696c 6c792d72 702d6c70 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=65
+ +0.000535
+ sendto fd=4 addr=172.18.45.6:53
+ 31250100 00010000 00000000 0b73696c 6c792d72 702d646d 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=65
+ +0.000538
+ sendto fd=4 addr=172.18.45.6:53
+ 31260100 00010000 00000000 0b73696c 6c792d72 702d646d 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01.
+ sendto=65
+ +0.000569
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.994886
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005696
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00010001 0b73696c 6c792d72 702d646d 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01c00c00 11000100 00003c00 1302692e 09726f6f 74006e75 6c6c036f 72670000
+ 04746573 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00000200 01000000 3c000603 6e7330c0 69c08f00 01000100 01518000
+ 04ac122d 06.
+ +0.000936
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000308
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.988714
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003951
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010001 00010001 0b73696c 6c792d72 702d646d 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01c00c00 11000100 00003c00 1302692e 09726f6f 74006e75 6c6c036f 72670000
+ 04746573 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00000200 01000000 3c000603 6e7330c0 69c08f00 01000100 01518000
+ 04ac122d 06.
+ +0.000891
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000192
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.984690
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003968
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010001 00010001 0b73696c 6c792d72 702d6c70 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01c00c00 11000100 00003c00 190d7370 6f6e6700 666c6962 626c6504 7563616d
+ 036f7267 00000474 65737403 69776a0a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 02000100 00003c00 06036e73 30c06fc0 95000100
+ 01000151 800004ac 122d06.
+ +0.000915
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000193
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.980221
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004041
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010001 00010001 0b73696c 6c792d72 702d6c70 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01c00c00 11000100 00003c00 190d7370 6f6e6700 666c6962 626c6504 7563616d
+ 036f7267 00000474 65737403 69776a0a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 02000100 00003c00 06036e73 30c06fc0 95000100
+ 01000151 800004ac 122d06.
+ +0.000915
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000154
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.975654
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.003970
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010001 00010001 0b73696c 6c792d72 702d6c70 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01c00c00 11000100 00003c00 190d7370 6f6e6700 666c6962 626c6504 7563616d
+ 036f7267 00000474 65737403 69776a0a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 02000100 00003c00 06036e73 30c06fc0 95000100
+ 01000151 800004ac 122d06.
+ +0.000911
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000173
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.971144
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005737
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010001 00010001 0b73696c 6c792d72 702d6c70 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01c00c00 11000100 00003c00 190d7370 6f6e6700 666c6962 626c6504 7563616d
+ 036f7267 00000474 65737403 69776a0a 72656c61 74697669 74790867 7265656e
+ 656e6403 6f726702 756b0000 02000100 00003c00 06036e73 30c06fc0 95000100
+ 01000151 800004ac 122d06.
+ +0.000914
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000151
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.964877
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004001
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258580 00010001 00010001 0b73696c 6c792d72 702d646d 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01c00c00 11000100 00003c00 1302692e 09726f6f 74006e75 6c6c036f 72670000
+ 04746573 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00000200 01000000 3c000603 6e7330c0 69c08f00 01000100 01518000
+ 04ac122d 06.
+ +0.000911
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000155
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.960348
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.004043
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31268580 00010001 00010001 0b73696c 6c792d72 702d646d 04746573 74036977
+ 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00001100
+ 01c00c00 11000100 00003c00 1302692e 09726f6f 74006e75 6c6c036f 72670000
+ 04746573 74036977 6a0a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00000200 01000000 3c000603 6e7330c0 69c08f00 01000100 01518000
+ 04ac122d 06.
+ +0.000886
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000191
+ close fd=4
+ close=OK
+ +0.000160
diff --git a/regress/case-srvbaddom.err b/regress/case-srvbaddom.err
new file mode 100644
index 0000000..8e96c9e
--- /dev/null
+++ b/regress/case-srvbaddom.err
@@ -0,0 +1,6 @@
+adns debug: using nameserver 172.18.45.6
+Error during DNS SRV lookup for srv.tcp.test.iwj.relativity.greenend.org.uk: Domain name is syntactically invalid
+Error during DNS SRV lookup for spong: Domain name is syntactically invalid
+_foo._bar does not exist
+_s*a._tcp.ucam.org does not exist
+Error during DNS SRV lookup for _s*a._tcp.pi&ckle.ucam.org: Domain name is syntactically invalid
diff --git a/regress/case-srvbaddom.out b/regress/case-srvbaddom.out
new file mode 100644
index 0000000..ef5105e
--- /dev/null
+++ b/regress/case-srvbaddom.out
@@ -0,0 +1 @@
+rc=6
diff --git a/regress/case-srvbaddom.sys b/regress/case-srvbaddom.sys
new file mode 100644
index 0000000..5e03602
--- /dev/null
+++ b/regress/case-srvbaddom.sys
@@ -0,0 +1,50 @@
+./adnshost default
+-t srv- srv.tcp.test.iwj.relativity.greenend.org.uk. spong. _foo._bar. _s*a._tcp.ucam.org. _s*a._tcp.pi&ckle.ucam.org
+ start 1144349027.926430
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000082
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000049
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000041
+ sendto fd=6 addr=172.18.45.6:53
+ 31210100 00010000 00000000 045f666f 6f045f62 61720000 210001.
+ sendto=27
+ +0.000326
+ sendto fd=6 addr=172.18.45.6:53
+ 31220100 00010000 00000000 045f732a 61045f74 63700475 63616d03 6f726700
+ 00210001.
+ sendto=36
+ +0.000227
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999447
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.004565
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218183 00010000 00010000 045f666f 6f045f62 61720000 21000100 00060001
+ 000029fb 00400141 0c524f4f 542d5345 52564552 53034e45 5400054e 53544c44
+ 0c564552 49534947 4e2d4752 5303434f 4d007791 bfb50000 07080000 03840009
+ 3a800001 5180.
+ +0.000212
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000070
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.994926
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.002158
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228183 00010000 00010000 045f732a 61045f74 63700475 63616d03 6f726700
+ 00210001 c0160006 00010000 0df5004c 0a736f61 2d6f7269 67696e02 6e730663
+ 68696172 6b086772 65656e65 6e64036f 72670275 6b000f73 74756465 6e742d72
+ 756e2d64 6e73c03e 00000121 00002a30 00000e10 00093a80 00000e10.
+ +0.000198
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000062
+ close fd=6
+ close=OK
+ +0.000091
diff --git a/regress/case-srvha.err b/regress/case-srvha.err
new file mode 100644
index 0000000..2886e3c
--- /dev/null
+++ b/regress/case-srvha.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.18.45.6
diff --git a/regress/case-srvha.out b/regress/case-srvha.out
new file mode 100644
index 0000000..5faa1ec
--- /dev/null
+++ b/regress/case-srvha.out
@@ -0,0 +1,7 @@
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 10 66 10066 davenant.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.6 )
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 200 20200 norway.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.40 )
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 400 20400 anarres.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.2 )
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 100 20100 nxdomain.relativity.greenend.org.uk permfail 300 nxdomain "No such domain" ( )
+_jabber._tcp.jabber.org SRV 30 30 5269 jabber.org ok 0 ok "OK" ( INET 208.245.212.98 )
+_sip._udp.voip.net.cam.ac.uk SRV 10 1 5060 sip.voip.net.cam.ac.uk ok 0 ok "OK" ( INET 131.111.8.174 )
+rc=0
diff --git a/regress/case-srvha.sys b/regress/case-srvha.sys
new file mode 100644
index 0000000..231c29b
--- /dev/null
+++ b/regress/case-srvha.sys
@@ -0,0 +1,103 @@
+./adnshost default -A4
+-t srv _srv._tcp.test.iwj.relativity.greenend.org.uk. _jabber._tcp.jabber.org _sip._udp.voip.net.cam.ac.uk.
+ start 1144348939.753711
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000080
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000050
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000042
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001.
+ sendto=63
+ +0.000363
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 075f6a61 62626572 045f7463 70066a61 62626572
+ 036f7267 00002100 01.
+ sendto=41
+ +0.000218
+ sendto fd=6 addr=172.18.45.6:53
+ 31210100 00010000 00000000 045f7369 70045f75 64700476 6f697003 6e657403
+ 63616d02 61630275 6b000021 0001.
+ sendto=46
+ +0.000211
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999208
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.005339
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010004 00020004 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001c0
+ 0c002100 01000000 0a002a00 1401904f b007616e 61727265 730a7265 6c617469
+ 76697479 08677265 656e656e 64036f72 6702756b 00c00c00 21000100 00000a00
+ 29001400 c84ee806 6e6f7277 61790a72 656c6174 69766974 79086772 65656e65
+ 6e64036f 72670275 6b00c00c 00210001 0000000a 002b0014 00644e84 086e7864
+ 6f6d6169 6e0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00c00c00 21000100 00000a00 2b000a00 42275208 64617665 6e616e74 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0160002 00010000
+ 000a0006 036e7330 c01fc016 00020001 0000000a 0021086e 732d7370 6f6e6702
+ 34350331 37320231 3807696e 2d616464 72046172 70610007 616e6172 726573c0
+ 1f000100 01000151 800004ac 122d0206 6e6f7277 6179c01f 00010001 00015180
+ 0004ac12 2d280864 6176656e 616e74c0 1f000100 01000151 800004ac 122d06c1
+ 24000100 01000151 800004ac 122d06.
+ +0.000561
+ sendto fd=6 addr=172.18.45.6:53
+ 31230100 00010000 00000000 086e7864 6f6d6169 6e0a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=53
+ +0.000465
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010001 00040005 075f6a61 62626572 045f7463 70066a61 62626572
+ 036f7267 00002100 01c00c00 21000100 0006a100 12001e00 1e149506 6a616262
+ 6572036f 726700c0 19000200 0100001b b9001103 6e733107 6a657265 6d696503
+ 636f6d00 c0190002 00010000 1bb90006 036e7332 c057c019 00020001 00001bb9
+ 000c036e 73310562 6c616872 c05fc019 00020001 00001bb9 0010026e 73076f62
+ 656c6973 6b036e65 7400c019 00010001 000000c5 0004d0f5 d462c053 00010001
+ 00004107 0004d0f5 d41dc070 00010001 00004107 0004d0f5 d41ec082 00010001
+ 00004109 00044051 6774c09a 00010001 00004109 00044761 e072.
+ +0.000378
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000074
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.992972
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000229
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218180 00010001 00070008 045f7369 70045f75 64700476 6f697003 6e657403
+ 63616d02 61630275 6b000021 0001c00c 00210001 00015129 001e000a 000113c4
+ 03736970 04766f69 70036e65 74036361 6d026163 02756b00 c01f0002 00010001
+ 5129000a 03633031 03637369 c01fc01f 00020001 00015129 0009036e 73320269
+ 63c023c0 1f000200 01000151 29000a04 646e7330 02636cc0 1fc01f00 02000100
+ 01512900 0b04646e 73300365 6e67c01f c01f0002 00010001 51290007 04646e73
+ 31c094c0 1f000200 01000151 29000f05 62697473 79036d69 74036564 7500c01f
+ 00020001 00015129 000f0863 68696d61 65726103 637378c0 1f037369 70c01600
+ 01000100 01512900 04836f08 aec06400 01000100 01512900 04836f0c 14c07a00
+ 01000100 00fd0f00 049bc605 03c08f00 01000100 00540900 0480e800 13c0a500
+ 01000100 01512900 0481a908 08c0bc00 01000100 00540900 0480e800 12c0cf00
+ 01000100 00024b00 04124800 03c0ea00 01000100 01512900 04836f08 2a.
+ +0.000486
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000135
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.997672
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.003660
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238583 00010000 00010000 086e7864 6f6d6169 6e0a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c01500 06000100 01518000
+ 27036e73 30c0150a 686f7374 6d617374 6572c015 00000075 00001c20 00000e10
+ 00093a80 00015180.
+ +0.000177
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000073
+ close fd=6
+ close=OK
+ +0.006908
diff --git a/regress/case-srvok.err b/regress/case-srvok.err
new file mode 100644
index 0000000..2886e3c
--- /dev/null
+++ b/regress/case-srvok.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.18.45.6
diff --git a/regress/case-srvok.out b/regress/case-srvok.out
new file mode 100644
index 0000000..a8d22d8
--- /dev/null
+++ b/regress/case-srvok.out
@@ -0,0 +1,7 @@
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 10 66 10066 davenant.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 200 20200 norway.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 400 20400 anarres.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 100 20100 nxdomain.relativity.greenend.org.uk
+_jabber._tcp.jabber.org SRV 30 30 5269 jabber.org
+_sip._udp.voip.net.cam.ac.uk SRV 10 1 5060 sip.voip.net.cam.ac.uk
+rc=0
diff --git a/regress/case-srvok.sys b/regress/case-srvok.sys
new file mode 100644
index 0000000..b7b4120
--- /dev/null
+++ b/regress/case-srvok.sys
@@ -0,0 +1,85 @@
+./adnshost default
+-t srv- _srv._tcp.test.iwj.relativity.greenend.org.uk. _jabber._tcp.jabber.org _sip._udp.voip.net.cam.ac.uk.
+ start 1144348873.125491
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000077
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000045
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000039
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001.
+ sendto=63
+ +0.000350
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 075f6a61 62626572 045f7463 70066a61 62626572
+ 036f7267 00002100 01.
+ sendto=41
+ +0.000228
+ sendto fd=6 addr=172.18.45.6:53
+ 31210100 00010000 00000000 045f7369 70045f75 64700476 6f697003 6e657403
+ 63616d02 61630275 6b000021 0001.
+ sendto=46
+ +0.000207
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999215
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.006492
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010004 00020004 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001c0
+ 0c002100 01000000 0a002b00 0a004227 52086461 76656e61 6e740a72 656c6174
+ 69766974 79086772 65656e65 6e64036f 72670275 6b00c00c 00210001 0000000a
+ 002a0014 01904fb0 07616e61 72726573 0a72656c 61746976 69747908 67726565
+ 6e656e64 036f7267 02756b00 c00c0021 00010000 000a0029 001400c8 4ee8066e
+ 6f727761 790a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00c00c00 21000100 00000a00 2b001400 644e8408 6e78646f 6d61696e 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0160002 00010000
+ 000a0006 036e7330 c01fc016 00020001 0000000a 0021086e 732d7370 6f6e6702
+ 34350331 37320231 3807696e 2d616464 72046172 70610008 64617665 6e616e74
+ c01f0001 00010001 51800004 ac122d06 07616e61 72726573 c01f0001 00010001
+ 51800004 ac122d02 066e6f72 776179c0 1f000100 01000151 800004ac 122d28c1
+ 24000100 01000151 800004ac 122d06.
+ +0.000557
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000119
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.992397
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.003318
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208180 00010001 00040005 075f6a61 62626572 045f7463 70066a61 62626572
+ 036f7267 00002100 01c00c00 21000100 0006e300 12001e00 1e149506 6a616262
+ 6572036f 726700c0 19000200 0100001b fb001103 6e733107 6a657265 6d696503
+ 636f6d00 c0190002 00010000 1bfb0006 036e7332 c057c019 00020001 00001bfb
+ 000c036e 73310562 6c616872 c05fc019 00020001 00001bfb 0010026e 73076f62
+ 656c6973 6b036e65 7400c019 00010001 00000107 0004d0f5 d462c053 00010001
+ 00004149 0004d0f5 d41dc070 00010001 00004149 0004d0f5 d41ec082 00010001
+ 0000414b 00044051 6774c09a 00010001 0000414b 00044761 e072.
+ +0.000331
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218180 00010001 00070008 045f7369 70045f75 64700476 6f697003 6e657403
+ 63616d02 61630275 6b000021 0001c00c 00210001 0001516b 001e000a 000113c4
+ 03736970 04766f69 70036e65 74036361 6d026163 02756b00 c01f0002 00010001
+ 516b000a 03633031 03637369 c01fc01f 00020001 0001516b 0009036e 73320269
+ 63c023c0 1f000200 01000151 6b000a04 646e7330 02636cc0 1fc01f00 02000100
+ 01516b00 0b04646e 73300365 6e67c01f c01f0002 00010001 516b0007 04646e73
+ 31c094c0 1f000200 01000151 6b000f05 62697473 79036d69 74036564 7500c01f
+ 00020001 0001516b 000f0863 68696d61 65726103 637378c0 1f037369 70c01600
+ 01000100 01516b00 04836f08 aec06400 01000100 01516b00 04836f0c 14c07a00
+ 01000100 00fd5100 049bc605 03c08f00 01000100 00544b00 0480e800 13c0a500
+ 01000100 01516b00 0481a908 08c0bc00 01000100 00544b00 0480e800 12c0cf00
+ 01000100 00028d00 04124800 03c0ea00 01000100 01516b00 04836f08 2a.
+ +0.000484
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000061
+ close fd=6
+ close=OK
+ +0.004680
diff --git a/regress/case-srvqudom.err b/regress/case-srvqudom.err
new file mode 100644
index 0000000..f11e49c
--- /dev/null
+++ b/regress/case-srvqudom.err
@@ -0,0 +1,6 @@
+adns debug: using nameserver 172.18.45.6
+srv.tcp.test.iwj.relativity.greenend.org.uk does not exist
+spong does not exist
+_foo._bar does not exist
+_s*a._tcp.ucam.org does not exist
+_s*a._tcp.pi&ckle.ucam.org does not exist
diff --git a/regress/case-srvqudom.out b/regress/case-srvqudom.out
new file mode 100644
index 0000000..ef5105e
--- /dev/null
+++ b/regress/case-srvqudom.out
@@ -0,0 +1 @@
+rc=6
diff --git a/regress/case-srvqudom.sys b/regress/case-srvqudom.sys
new file mode 100644
index 0000000..a54c484
--- /dev/null
+++ b/regress/case-srvqudom.sys
@@ -0,0 +1,104 @@
+./adnshost default
+-Qq -t srv- srv.tcp.test.iwj.relativity.greenend.org.uk. spong. _foo._bar. _s*a._tcp.ucam.org. _s*a._tcp.pi&ckle.ucam.org
+ start 1144349124.698466
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000082
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000049
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000042
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03737276 03746370 04746573 74036977 6a0a7265
+ 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00002100 01.
+ sendto=61
+ +0.000339
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 0573706f 6e670000 210001.
+ sendto=23
+ +0.000194
+ sendto fd=6 addr=172.18.45.6:53
+ 31210100 00010000 00000000 045f666f 6f045f62 61720000 210001.
+ sendto=27
+ +0.000183
+ sendto fd=6 addr=172.18.45.6:53
+ 31220100 00010000 00000000 045f732a 61045f74 63700475 63616d03 6f726700
+ 00210001.
+ sendto=36
+ +0.000224
+ sendto fd=6 addr=172.18.45.6:53
+ 31230100 00010000 00000000 045f732a 61045f74 63700770 6926636b 6c650475
+ 63616d03 6f726700 00210001.
+ sendto=44
+ +0.000210
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.998850
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.005770
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8583 00010000 00010000 03737276 03746370 04746573 74036977 6a0a7265
+ 6c617469 76697479 08677265 656e656e 64036f72 6702756b 00002100 01c01400
+ 06000100 00000a00 27036e73 30c01d0a 686f7374 6d617374 6572c01d 0000003b
+ 00000e10 00000078 0064c800 0000000a.
+ +0.000206
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000068
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.993145
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.002367
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218183 00010000 00010000 045f666f 6f045f62 61720000 21000100 00060001
+ 0000299a 00400141 0c524f4f 542d5345 52564552 53034e45 5400054e 53544c44
+ 0c564552 49534947 4e2d4752 5303434f 4d007791 bfb50000 07080000 03840009
+ 3a800001 5180.
+ +0.000176
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000055
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.990547
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000085
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228183 00010000 00010000 045f732a 61045f74 63700475 63616d03 6f726700
+ 00210001 c0160006 00010000 0d94004c 0a736f61 2d6f7269 67696e02 6e730663
+ 68696172 6b086772 65656e65 6e64036f 72670275 6b000f73 74756465 6e742d72
+ 756e2d64 6e73c03e 00000121 00002a30 00000e10 00093a80 00000e10.
+ +0.000186
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000058
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.990218
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.028718
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208183 00010000 00010000 0573706f 6e670000 21000100 00060001 00002a30
+ 00400141 0c524f4f 542d5345 52564552 53034e45 5400054e 53544c44 0c564552
+ 49534947 4e2d4752 5303434f 4d007791 bfb50000 07080000 03840009 3a800001
+ 5180.
+ +0.000172
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000052
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.961877
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.004777
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238183 00010000 00010000 045f732a 61045f74 63700770 6926636b 6c650475
+ 63616d03 6f726700 00210001 04756361 6d036f72 67000006 00010000 0e10004c
+ 0a736f61 2d6f7269 67696e02 6e730663 68696172 6b086772 65656e65 6e64036f
+ 72670275 6b000f73 74756465 6e742d72 756e2d64 6e73c04e 00000121 00002a30
+ 00000e10 00093a80 00000e10.
+ +0.000218
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000055
+ close fd=6
+ close=OK
+ +0.000078
diff --git a/regress/case-srvsort.err b/regress/case-srvsort.err
new file mode 100644
index 0000000..2886e3c
--- /dev/null
+++ b/regress/case-srvsort.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.18.45.6
diff --git a/regress/case-srvsort.out b/regress/case-srvsort.out
new file mode 100644
index 0000000..2f318ad
--- /dev/null
+++ b/regress/case-srvsort.out
@@ -0,0 +1,29 @@
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 10 66 10066 davenant.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 400 20400 anarres.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 200 20200 norway.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 100 20100 nxdomain.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 10 66 10066 davenant.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 400 20400 anarres.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 100 20100 nxdomain.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 200 20200 norway.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 10 66 10066 davenant.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 400 20400 anarres.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 200 20200 norway.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 100 20100 nxdomain.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 10 66 10066 davenant.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 200 20200 norway.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 400 20400 anarres.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 100 20100 nxdomain.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 10 66 10066 davenant.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 200 20200 norway.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 400 20400 anarres.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 100 20100 nxdomain.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 10 66 10066 davenant.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 400 20400 anarres.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 100 20100 nxdomain.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 200 20200 norway.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 10 66 10066 davenant.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 100 20100 nxdomain.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 200 20200 norway.relativity.greenend.org.uk
+_srv._tcp.test.iwj.relativity.greenend.org.uk SRV 20 400 20400 anarres.relativity.greenend.org.uk
+rc=0
diff --git a/regress/case-srvsort.sys b/regress/case-srvsort.sys
new file mode 100644
index 0000000..d44fba5
--- /dev/null
+++ b/regress/case-srvsort.sys
@@ -0,0 +1,187 @@
+./adnshost default
+-t srv- _srv._tcp.test.iwj.relativity.greenend.org.uk. _srv._tcp.test.iwj.relativity.greenend.org.uk. _srv._tcp.test.iwj.relativity.greenend.org.uk. _srv._tcp.test.iwj.relativity.greenend.org.uk. _srv._tcp.test.iwj.relativity.greenend.org.uk. _srv._tcp.test.iwj.relativity.greenend.org.uk. _srv._tcp.test.iwj.relativity.greenend.org.uk.
+ start 1144348887.924234
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000083
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000050
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000042
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001.
+ sendto=63
+ +0.000352
+ sendto fd=6 addr=172.18.45.6:53
+ 31200100 00010000 00000000 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001.
+ sendto=63
+ +0.000261
+ sendto fd=6 addr=172.18.45.6:53
+ 31210100 00010000 00000000 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001.
+ sendto=63
+ +0.000232
+ sendto fd=6 addr=172.18.45.6:53
+ 31220100 00010000 00000000 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001.
+ sendto=63
+ +0.000236
+ sendto fd=6 addr=172.18.45.6:53
+ 31230100 00010000 00000000 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001.
+ sendto=63
+ +0.000242
+ sendto fd=6 addr=172.18.45.6:53
+ 31240100 00010000 00000000 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001.
+ sendto=63
+ +0.000243
+ sendto fd=6 addr=172.18.45.6:53
+ 31250100 00010000 00000000 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001.
+ sendto=63
+ +0.000231
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.998203
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.005521
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010004 00020004 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001c0
+ 0c002100 01000000 0a002b00 1400644e 84086e78 646f6d61 696e0a72 656c6174
+ 69766974 79086772 65656e65 6e64036f 72670275 6b00c00c 00210001 0000000a
+ 002b000a 00422752 08646176 656e616e 740a7265 6c617469 76697479 08677265
+ 656e656e 64036f72 6702756b 00c00c00 21000100 00000a00 2a001401 904fb007
+ 616e6172 7265730a 72656c61 74697669 74790867 7265656e 656e6403 6f726702
+ 756b00c0 0c002100 01000000 0a002900 1400c84e e8066e6f 72776179 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0160002 00010000
+ 000a0006 036e7330 c01fc016 00020001 0000000a 0021086e 732d7370 6f6e6702
+ 34350331 37320231 3807696e 2d616464 72046172 70610008 64617665 6e616e74
+ c01f0001 00010001 51800004 ac122d06 07616e61 72726573 c01f0001 00010001
+ 51800004 ac122d02 066e6f72 776179c0 1f000100 01000151 800004ac 122d28c1
+ 24000100 01000151 800004ac 122d06.
+ +0.000555
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000127
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.992352
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.002857
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31208580 00010004 00020004 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001c0
+ 0c002100 01000000 0a002b00 0a004227 52086461 76656e61 6e740a72 656c6174
+ 69766974 79086772 65656e65 6e64036f 72670275 6b00c00c 00210001 0000000a
+ 002a0014 01904fb0 07616e61 72726573 0a72656c 61746976 69747908 67726565
+ 6e656e64 036f7267 02756b00 c00c0021 00010000 000a0029 001400c8 4ee8066e
+ 6f727761 790a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00c00c00 21000100 00000a00 2b001400 644e8408 6e78646f 6d61696e 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0160002 00010000
+ 000a0006 036e7330 c01fc016 00020001 0000000a 0021086e 732d7370 6f6e6702
+ 34350331 37320231 3807696e 2d616464 72046172 70610008 64617665 6e616e74
+ c01f0001 00010001 51800004 ac122d06 07616e61 72726573 c01f0001 00010001
+ 51800004 ac122d02 066e6f72 776179c0 1f000100 01000151 800004ac 122d28c1
+ 24000100 01000151 800004ac 122d06.
+ +0.000697
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000163
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.988896
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.002742
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31218580 00010004 00020004 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001c0
+ 0c002100 01000000 0a002b00 0a004227 52086461 76656e61 6e740a72 656c6174
+ 69766974 79086772 65656e65 6e64036f 72670275 6b00c00c 00210001 0000000a
+ 002a0014 01904fb0 07616e61 72726573 0a72656c 61746976 69747908 67726565
+ 6e656e64 036f7267 02756b00 c00c0021 00010000 000a0029 001400c8 4ee8066e
+ 6f727761 790a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00c00c00 21000100 00000a00 2b001400 644e8408 6e78646f 6d61696e 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0160002 00010000
+ 000a0006 036e7330 c01fc016 00020001 0000000a 0021086e 732d7370 6f6e6702
+ 34350331 37320231 3807696e 2d616464 72046172 70610008 64617665 6e616e74
+ c01f0001 00010001 51800004 ac122d06 07616e61 72726573 c01f0001 00010001
+ 51800004 ac122d02 066e6f72 776179c0 1f000100 01000151 800004ac 122d28c1
+ 24000100 01000151 800004ac 122d06.
+ +0.000673
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31228580 00010004 00020004 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001c0
+ 0c002100 01000000 0a002a00 1401904f b007616e 61727265 730a7265 6c617469
+ 76697479 08677265 656e656e 64036f72 6702756b 00c00c00 21000100 00000a00
+ 29001400 c84ee806 6e6f7277 61790a72 656c6174 69766974 79086772 65656e65
+ 6e64036f 72670275 6b00c00c 00210001 0000000a 002b0014 00644e84 086e7864
+ 6f6d6169 6e0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00c00c00 21000100 00000a00 2b000a00 42275208 64617665 6e616e74 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0160002 00010000
+ 000a0006 036e7330 c01fc016 00020001 0000000a 0021086e 732d7370 6f6e6702
+ 34350331 37320231 3807696e 2d616464 72046172 70610007 616e6172 726573c0
+ 1f000100 01000151 800004ac 122d0206 6e6f7277 6179c01f 00010001 00015180
+ 0004ac12 2d280864 6176656e 616e74c0 1f000100 01000151 800004ac 122d06c1
+ 24000100 01000151 800004ac 122d06.
+ +0.000742
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31238580 00010004 00020004 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001c0
+ 0c002100 01000000 0a002b00 0a004227 52086461 76656e61 6e740a72 656c6174
+ 69766974 79086772 65656e65 6e64036f 72670275 6b00c00c 00210001 0000000a
+ 002a0014 01904fb0 07616e61 72726573 0a72656c 61746976 69747908 67726565
+ 6e656e64 036f7267 02756b00 c00c0021 00010000 000a0029 001400c8 4ee8066e
+ 6f727761 790a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00c00c00 21000100 00000a00 2b001400 644e8408 6e78646f 6d61696e 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0160002 00010000
+ 000a0006 036e7330 c01fc016 00020001 0000000a 0021086e 732d7370 6f6e6702
+ 34350331 37320231 3807696e 2d616464 72046172 70610008 64617665 6e616e74
+ c01f0001 00010001 51800004 ac122d06 07616e61 72726573 c01f0001 00010001
+ 51800004 ac122d02 066e6f72 776179c0 1f000100 01000151 800004ac 122d28c1
+ 24000100 01000151 800004ac 122d06.
+ +0.000593
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31248580 00010004 00020004 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001c0
+ 0c002100 01000000 0a002a00 1401904f b007616e 61727265 730a7265 6c617469
+ 76697479 08677265 656e656e 64036f72 6702756b 00c00c00 21000100 00000a00
+ 29001400 c84ee806 6e6f7277 61790a72 656c6174 69766974 79086772 65656e65
+ 6e64036f 72670275 6b00c00c 00210001 0000000a 002b0014 00644e84 086e7864
+ 6f6d6169 6e0a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00c00c00 21000100 00000a00 2b000a00 42275208 64617665 6e616e74 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0160002 00010000
+ 000a0006 036e7330 c01fc016 00020001 0000000a 0021086e 732d7370 6f6e6702
+ 34350331 37320231 3807696e 2d616464 72046172 70610007 616e6172 726573c0
+ 1f000100 01000151 800004ac 122d0206 6e6f7277 6179c01f 00010001 00015180
+ 0004ac12 2d280864 6176656e 616e74c0 1f000100 01000151 800004ac 122d06c1
+ 24000100 01000151 800004ac 122d06.
+ +0.000727
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 31258580 00010004 00020004 045f7372 76045f74 63700474 65737403 69776a0a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0000 210001c0
+ 0c002100 01000000 0a002b00 1400644e 84086e78 646f6d61 696e0a72 656c6174
+ 69766974 79086772 65656e65 6e64036f 72670275 6b00c00c 00210001 0000000a
+ 002b000a 00422752 08646176 656e616e 740a7265 6c617469 76697479 08677265
+ 656e656e 64036f72 6702756b 00c00c00 21000100 00000a00 2a001401 904fb007
+ 616e6172 7265730a 72656c61 74697669 74790867 7265656e 656e6403 6f726702
+ 756b00c0 0c002100 01000000 0a002900 1400c84e e8066e6f 72776179 0a72656c
+ 61746976 69747908 67726565 6e656e64 036f7267 02756b00 c0160002 00010000
+ 000a0006 036e7330 c01fc016 00020001 0000000a 0021086e 732d7370 6f6e6702
+ 34350331 37320231 3807696e 2d616464 72046172 70610008 64617665 6e616e74
+ c01f0001 00010001 51800004 ac122d06 07616e61 72726573 c01f0001 00010001
+ 51800004 ac122d02 066e6f72 776179c0 1f000100 01000151 800004ac 122d28c1
+ 24000100 01000151 800004ac 122d06.
+ +0.000721
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000098
+ close fd=6
+ close=OK
+ +0.014060
diff --git a/regress/case-tcpallfail.err b/regress/case-tcpallfail.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-tcpallfail.err
diff --git a/regress/case-tcpallfail.out b/regress/case-tcpallfail.out
new file mode 100644
index 0000000..4f11177
--- /dev/null
+++ b/regress/case-tcpallfail.out
@@ -0,0 +1,34 @@
+adns debug: using nameserver 172.18.45.2
+test.iwj.relativity.greenend.org.uk. flags 2 type 1 A(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 2 NS(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 5 CNAME(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 6 SOA(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 12 PTR(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 13 HINFO(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 15 MX(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 16 TXT(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 17 RP(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65537 A(addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65538 NS(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65548 PTR(checked) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65551 MX(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131078 SOA(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131089 RP(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+adns warning: TCP connection failed: connect/read: Connection refused (NS=172.18.45.2)
+adns warning: TCP connection failed: connect/read: Connection refused (NS=172.18.45.2)
+test.iwj.relativity.greenend.org.uk. flags 2 type A(-): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(raw): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type CNAME(-): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(raw): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(raw): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type HINFO(-): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(raw): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type TXT(-): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(raw): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(+addr): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(+addr): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(822): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(822): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type A(addr): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604800
+rc=0
diff --git a/regress/case-tcpallfail.sys b/regress/case-tcpallfail.sys
new file mode 100644
index 0000000..a49b1b9
--- /dev/null
+++ b/regress/case-tcpallfail.sys
@@ -0,0 +1,63 @@
+adnstest anarres -0x400
+2/test.iwj.relativity.greenend.org.uk.
+ start 962142174.403028
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000120
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000053
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000034
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.000479
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000036
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000031
+ connect fd=5 addr=172.18.45.2:53
+ connect=EINPROGRESS
+ +0.000182
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.999272
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.000862
+ read fd=5 buflen=1
+ read=ECONNREFUSED
+ +0.000087
+ close fd=5
+ close=OK
+ +0.000109
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000103
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.000392
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000037
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000030
+ connect fd=5 addr=172.18.45.2:53
+ connect=EINPROGRESS
+ +0.000127
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.999414
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.000339
+ read fd=5 buflen=1
+ read=ECONNREFUSED
+ +0.000075
+ close fd=5
+ close=OK
+ +0.000084
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000098
+ close fd=4
+ close=OK
+ +0.000879
diff --git a/regress/case-tcpblock.err b/regress/case-tcpblock.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-tcpblock.err
diff --git a/regress/case-tcpblock.out b/regress/case-tcpblock.out
new file mode 100644
index 0000000..34c8b65
--- /dev/null
+++ b/regress/case-tcpblock.out
@@ -0,0 +1,33 @@
+adns debug: using nameserver 172.18.45.2
+test.iwj.relativity.greenend.org.uk. flags 2 type 1 A(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 2 NS(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 5 CNAME(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 6 SOA(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 12 PTR(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 13 HINFO(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 15 MX(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 16 TXT(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 17 RP(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65537 A(addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65538 NS(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65548 PTR(checked) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65551 MX(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131078 SOA(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131089 RP(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+adns debug: TCP connected (NS=172.18.45.2)
+test.iwj.relativity.greenend.org.uk. flags 2 type A(-): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(raw): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type CNAME(-): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(raw): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(raw): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type HINFO(-): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(raw): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type TXT(-): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(raw): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(+addr): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(+addr): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(822): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(822): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+test.iwj.relativity.greenend.org.uk. flags 2 type A(addr): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+rc=0
diff --git a/regress/case-tcpblock.sys b/regress/case-tcpblock.sys
new file mode 100644
index 0000000..027df17
--- /dev/null
+++ b/regress/case-tcpblock.sys
@@ -0,0 +1,109 @@
+adnstest anarres -0x400
+2/test.iwj.relativity.greenend.org.uk.
+ start 962142246.340485
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000126
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000052
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000035
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.000459
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000036
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000031
+ connect fd=5 addr=172.18.45.2:53
+ connect=EINPROGRESS
+ +0.000184
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.999290
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.000937
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000090
+ write fd=5
+ 0035311f 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=55
+ +0.000427
+ write fd=5
+ 00353120 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001.
+ write=55
+ +0.000271
+ write fd=5
+ 00353121 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 050001.
+ write=55
+ +0.000429
+ write fd=5
+ 00353122 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001.
+ write=55
+ +0.000218
+ write fd=5
+ 00353123 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ write=55
+ +0.000212
+ write fd=5
+ 00353124 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0d0001.
+ write=55
+ +0.000213
+ write fd=5
+ 00353125 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0f0001.
+ write=55
+ +0.000212
+ write fd=5
+ 00353126 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 100001.
+ write=55
+ +0.000214
+ write fd=5
+ 00353127 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001.
+ write=55
+ +0.000494
+ write fd=5
+ 00353129 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=55
+ +0.000239
+ write fd=5
+ 0035312a 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001.
+ write=55
+ +0.000425
+ write fd=5
+ 0035312c 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0f0001.
+ write=55
+ +0.000213
+ write fd=5
+ 0035312d 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001.
+ write=55
+ +0.000215
+ write fd=5
+ 0035312e 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001.
+ write=55
+ +0.000236
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.994245
+ select=0 rfds=[] wfds=[] efds=[]
+ +30.-04653
+ close fd=4
+ close=OK
+ +0.000943
+ close fd=5
+ close=OK
+ +0.000113
diff --git a/regress/case-tcpblockbrk.err b/regress/case-tcpblockbrk.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-tcpblockbrk.err
diff --git a/regress/case-tcpblockbrk.out b/regress/case-tcpblockbrk.out
new file mode 100644
index 0000000..2b867e3
--- /dev/null
+++ b/regress/case-tcpblockbrk.out
@@ -0,0 +1,35 @@
+adns debug: using nameserver 172.18.45.2
+test.iwj.relativity.greenend.org.uk. flags 2 type 1 A(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 2 NS(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 5 CNAME(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 6 SOA(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 12 PTR(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 13 HINFO(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 15 MX(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 16 TXT(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 17 RP(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65537 A(addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65538 NS(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65548 PTR(checked) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65551 MX(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131078 SOA(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131089 RP(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+adns debug: TCP connected (NS=172.18.45.2)
+adns warning: TCP connection failed: read: Connection reset by peer (NS=172.18.45.2)
+adns warning: TCP connection failed: connect/read: Connection refused (NS=172.18.45.2)
+test.iwj.relativity.greenend.org.uk. flags 2 type A(-): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(raw): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type CNAME(-): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(raw): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(raw): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type HINFO(-): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(raw): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type TXT(-): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(raw): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(+addr): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(+addr): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(822): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(822): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+test.iwj.relativity.greenend.org.uk. flags 2 type A(addr): All nameservers failed; nrrs=0; cname=$; owner=$; ttl=604798
+rc=0
diff --git a/regress/case-tcpblockbrk.sys b/regress/case-tcpblockbrk.sys
new file mode 100644
index 0000000..679d0d4
--- /dev/null
+++ b/regress/case-tcpblockbrk.sys
@@ -0,0 +1,139 @@
+adnstest anarres -0x700
+2/test.iwj.relativity.greenend.org.uk.
+ start 962143388.709150
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=5
+ +0.000434
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000462
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000439
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=6
+ +0.001725
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000438
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000414
+ connect fd=6 addr=172.18.45.2:53
+ connect=EINPROGRESS
+ +0.000724
+ select max=7 rfds=[5] wfds=[6] efds=[] to=13.996699
+ select=1 rfds=[] wfds=[6] efds=[]
+ +0.003661
+ read fd=6 buflen=1
+ read=EAGAIN
+ +0.000477
+ write fd=6
+ 0035311f 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=55
+ +0.001553
+ write fd=6
+ 00353120 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001.
+ write=55
+ +0.001612
+ write fd=6
+ 00353121 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 050001.
+ write=55
+ +0.001289
+ write fd=6
+ 00353122 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001.
+ write=55
+ +0.001204
+ write fd=6
+ 00353123 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ write=55
+ +0.001200
+ write fd=6
+ 00353124 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0d0001.
+ write=55
+ +0.001417
+ write fd=6
+ 00353125 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0f0001.
+ write=55
+ +0.001199
+ write fd=6
+ 00353126 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 100001.
+ write=55
+ +0.001217
+ write fd=6
+ 00353127 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001.
+ write=55
+ +0.001214
+ write fd=6
+ 00353129 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=55
+ +0.001259
+ write fd=6
+ 0035312a 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001.
+ write=55
+ +0.002445
+ write fd=6
+ 0035312c 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0f0001.
+ write=55
+ +0.001254
+ write fd=6
+ 0035312d 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001.
+ write=55
+ +0.001443
+ write fd=6
+ 0035312e 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001.
+ write=55
+ +0.001271
+ select max=7 rfds=[5,6] wfds=[] efds=[6] to=29.972984
+ select=1 rfds=[6] wfds=[] efds=[]
+ +2.-661933
+ read fd=6 buflen=2
+ read=ECONNRESET
+ +0.000519
+ close fd=6
+ close=OK
+ +0.000636
+ select max=6 rfds=[5] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000702
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=6
+ +0.001734
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000435
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000537
+ connect fd=6 addr=172.18.45.2:53
+ connect=EINPROGRESS
+ +0.000608
+ select max=7 rfds=[5] wfds=[6] efds=[] to=13.996686
+ select=1 rfds=[] wfds=[6] efds=[]
+ +0.000977
+ read fd=6 buflen=1
+ read=ECONNREFUSED
+ +0.000450
+ close fd=6
+ close=OK
+ +0.000617
+ select max=6 rfds=[5] wfds=[] efds=[] to=0.000000
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000689
+ close fd=5
+ close=OK
+ +0.002951
diff --git a/regress/case-tcpblockwr.err b/regress/case-tcpblockwr.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-tcpblockwr.err
diff --git a/regress/case-tcpblockwr.out b/regress/case-tcpblockwr.out
new file mode 100644
index 0000000..f050875
--- /dev/null
+++ b/regress/case-tcpblockwr.out
@@ -0,0 +1,105 @@
+adns debug: using nameserver 172.18.45.2
+test.iwj.relativity.greenend.org.uk. flags 2 type 1 A(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 2 NS(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 5 CNAME(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 6 SOA(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 12 PTR(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 13 HINFO(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 15 MX(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 16 TXT(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 17 RP(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65537 A(addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65538 NS(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65548 PTR(checked) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65551 MX(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131078 SOA(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131089 RP(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 1 A(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 2 NS(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 5 CNAME(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 6 SOA(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 12 PTR(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 13 HINFO(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 15 MX(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 16 TXT(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 17 RP(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65537 A(addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65538 NS(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65548 PTR(checked) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65551 MX(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131078 SOA(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131089 RP(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 1 A(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 2 NS(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 5 CNAME(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 6 SOA(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 12 PTR(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 13 HINFO(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 15 MX(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 16 TXT(-) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 17 RP(raw) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65537 A(addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65538 NS(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65548 PTR(checked) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 65551 MX(+addr) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131078 SOA(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type 131089 RP(822) submitted
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+adns debug: TCP connected (NS=172.18.45.2)
+test.iwj.relativity.greenend.org.uk. flags 2 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(raw): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk
+test.iwj.relativity.greenend.org.uk. flags 2 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(raw): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk hostmaster.relativity.greenend.org.uk 42 3600 120 6604800 60
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(raw): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(+addr): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.6 )
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk hostmaster@relativity.greenend.org.uk 42 3600 120 6604800 60
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(raw): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk
+test.iwj.relativity.greenend.org.uk. flags 2 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(raw): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk hostmaster.relativity.greenend.org.uk 42 3600 120 6604800 60
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(raw): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(+addr): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.6 )
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk hostmaster@relativity.greenend.org.uk 42 3600 120 6604800 60
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(raw): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk
+test.iwj.relativity.greenend.org.uk. flags 2 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(raw): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk hostmaster.relativity.greenend.org.uk 42 3600 120 6604800 60
+test.iwj.relativity.greenend.org.uk. flags 2 type PTR(raw): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type NS(+addr): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk ok 0 ok "OK" ( INET 172.18.45.6 )
+test.iwj.relativity.greenend.org.uk. flags 2 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type SOA(822): OK; nrrs=1; cname=$; owner=$; ttl=59
+ ns0.relativity.greenend.org.uk hostmaster@relativity.greenend.org.uk 42 3600 120 6604800 60
+test.iwj.relativity.greenend.org.uk. flags 2 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type A(addr): No such data; nrrs=0; cname=$; owner=$; ttl=59
+test.iwj.relativity.greenend.org.uk. flags 2 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=60
+rc=0
diff --git a/regress/case-tcpblockwr.sys b/regress/case-tcpblockwr.sys
new file mode 100644
index 0000000..e232d28
--- /dev/null
+++ b/regress/case-tcpblockwr.sys
@@ -0,0 +1,605 @@
+adnstest anarres -0x700
+2/test.iwj.relativity.greenend.org.uk. 2/test.iwj.relativity.greenend.org.uk. 2/test.iwj.relativity.greenend.org.uk.
+ start 962143438.172669
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=5
+ +0.000433
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000443
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000409
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=6
+ +0.001762
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000420
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000408
+ connect fd=6 addr=172.18.45.2:53
+ connect=EINPROGRESS
+ +0.000689
+ select max=7 rfds=[5] wfds=[6] efds=[] to=13.996721
+ select=1 rfds=[] wfds=[6] efds=[]
+ +0.278976
+ read fd=6 buflen=1
+ read=EAGAIN
+ +0.001048
+ write fd=6
+ 0035311f 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=55
+ +0.001447
+ write fd=6
+ 00353120 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001.
+ write=55
+ +0.001424
+ write fd=6
+ 00353121 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 050001.
+ write=55
+ +0.001287
+ write fd=6
+ 00353122 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001.
+ write=55
+ +0.001199
+ write fd=6
+ 00353123 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ write=55
+ +0.001220
+ write fd=6
+ 00353124 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0d0001.
+ write=55
+ +0.001189
+ write fd=6
+ 00353125 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0f0001.
+ write=55
+ +0.001368
+ write fd=6
+ 00353126 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 100001.
+ write=55
+ +0.001220
+ write fd=6
+ 00353127 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001.
+ write=55
+ +0.001313
+ write fd=6
+ 00353129 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=55
+ +0.001209
+ write fd=6
+ 0035312a 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001.
+ write=55
+ +0.002384
+ write fd=6
+ 0035312c 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0f0001.
+ write=55
+ +0.001214
+ write fd=6
+ 0035312d 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001.
+ write=55
+ +0.001195
+ write fd=6
+ 0035312e 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001.
+ write=55
+ +0.001424
+ write fd=6
+ 0035312f 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=55
+ +0.001226
+ write fd=6
+ 00353130 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001.
+ write=55
+ +0.001214
+ write fd=6
+ 00353131 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 050001.
+ write=55
+ +0.001202
+ write fd=6
+ 00353132 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001.
+ write=55
+ +0.001187
+ write fd=6
+ 00353133 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ write=55
+ +0.001207
+ write fd=6
+ 00353134 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0d0001.
+ write=55
+ +0.001192
+ write fd=6
+ 00353135 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0f0001.
+ write=55
+ +0.001214
+ write fd=6
+ 00353136 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 100001.
+ write=55
+ +0.001386
+ write fd=6
+ 00353137 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001.
+ write=55
+ +0.001215
+ write fd=6
+ 00353139 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=55
+ +0.001448
+ write fd=6
+ 0035313a 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001.
+ write=55
+ +0.002403
+ write fd=6
+ 0035313c 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0f0001.
+ write=55
+ +0.001231
+ write fd=6
+ 0035313d 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001.
+ write=55
+ +0.001197
+ write fd=6
+ 0035313e 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001.
+ write=55
+ +0.001212
+ write fd=6
+ 0035313f 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=55
+ +0.001369
+ write fd=6
+ 00353140 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001.
+ write=55
+ +0.001212
+ write fd=6
+ 00353141 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 050001.
+ write=55
+ +0.001334
+ write fd=6
+ 00353142 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001.
+ write=55
+ +0.001212
+ write fd=6
+ 00353143 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0c0001.
+ write=55
+ +0.001207
+ write fd=6
+ 00353144 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0d0001.
+ write=55
+ +0.001187
+ write fd=6
+ 00353145 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0f0001.
+ write=55
+ +0.001186
+ write fd=6
+ 00353146 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 100001.
+ write=55
+ +0.001204
+ write fd=6
+ 00353147 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001.
+ write=55
+ +0.001365
+ write fd=6
+ 00353149 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=55
+ +0.001254
+ write fd=6
+ 0035314a 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001.
+ write=55
+ +0.002485
+ write fd=6
+ 0035314c 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0f0001.
+ write=55
+ +0.001201
+ write fd=6
+ 0035314d 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001.
+ write=55
+ +0.001188
+ write fd=6
+ 0035314e 01000001 00000000 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001.
+ write=30
+ +1.814491
+ select max=7 rfds=[5,6] wfds=[6] efds=[6] to=27.847175
+ select=2 rfds=[6] wfds=[6] efds=[]
+ +5.-217468
+ read fd=6 buflen=2
+ read=OK
+ 0082.
+ +0.012764
+ read fd=6 buflen=130
+ read=OK
+ 311f8580 00010000 00010000 04746573 74036977 6a0a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 06000100 00003c00
+ 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064 c8000000
+ 003c.
+ +0.003700
+ read fd=6 buflen=132
+ read=OK
+ 00713120 85800001 00010000 00010474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 020001c0 0c000200 01000000
+ 3c002003 6e73300a 72656c61 74697669 74790867 7265656e 656e6403 6f726702
+ 756b00c0 41000100 01000151 800004ac 122d0600 82312185 80000100 00000100
+ 00047465.
+ +0.003001
+ read fd=6 buflen=115
+ read=OK
+ 73740369 776a0a72 656c6174 69766974 79086772 65656e65 6e64036f 72670275
+ 6b000005 0001c00c 00060001 0000003c 0041036e 73300a72 656c6174 69766974
+ 79086772 65656e65 6e64036f 72670275 6b000a68 6f73746d 61737465 72c04500
+ 00002a00 000e1000 00007800 64c80000 00003c.
+ +0.001128
+ read fd=6 buflen=132
+ read=OK
+ 00a03122 85800001 00010001 00010474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 060001c0 0c000600 01000000
+ 3c004103 6e73300a 72656c61 74697669 74790867 7265656e 656e6403 6f726702
+ 756b000a 686f7374 6d617374 6572c045 0000002a 00000e10 00000078 0064c800
+ 0000003c.
+ +0.299749
+ read fd=6 buflen=30
+ read=OK
+ c00c0002 00010000 003c0002 c041c041 00010001 00015180 0004ac12 2d06.
+ +0.000767
+ read fd=6 buflen=162
+ read=OK
+ 00823123 85800001 00000001 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0c0001c0 0c000600 01000000
+ 3c004103 6e73300a 72656c61 74697669 74790867 7265656e 656e6403 6f726702
+ 756b000a 686f7374 6d617374 6572c045 0000002a 00000e10 00000078 0064c800
+ 0000003c 00823124 85800001 00000001 00000474 65737403 69776a0a 72656c61
+ 7469.
+ +0.001110
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000d00 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31258580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000934
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000f00 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31268580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.001041
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00001000 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31278580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000940
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00001100 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31298580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.001164
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0071 312a8580 00010001 00000001 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000955
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000200 01c00c00 02000100
+ 00003c00 20036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00c04100 01000100 01518000 04ac122d 06008231 2c858000 01000000
+ 01000004 74657374 0369776a 0a72656c 617469.
+ +0.002013
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000f00 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c00a0 312d8580 00010001 00010001 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000953
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000600 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003cc00c 00020001 0000003c 0002c041 c0410001 00010001 51800004
+ ac122d06.
+ +0.002102
+ read fd=6 buflen=162
+ read=OK
+ 0082312e 85800001 00000001 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001c0 0c000600 01000000
+ 3c004103 6e73300a 72656c61 74697669 74790867 7265656e 656e6403 6f726702
+ 756b000a 686f7374 6d617374 6572c045 0000002a 00000e10 00000078 0064c800
+ 0000003c 0082312f 85800001 00000001 00000474 65737403 69776a0a 72656c61
+ 7469.
+ +0.001126
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0071 31308580 00010001 00000001 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000976
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000200 01c00c00 02000100
+ 00003c00 20036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00c04100 01000100 01518000 04ac122d 06008231 31858000 01000000
+ 01000004 74657374 0369776a 0a72656c 61746976 69747908 67726565 6e656e64
+ 036f7267.
+ +0.000930
+ read fd=6 buflen=115
+ read=OK
+ 02756b00 00050001 c00c0006 00010000 003c0041 036e7330 0a72656c 61746976
+ 69747908 67726565 6e656e64 036f7267 02756b00 0a686f73 746d6173 746572c0
+ 45000000 2a00000e 10000000 780064c8 00000000 3c00a031 32858000 01000100
+ 01000104 74657374 0369776a 0a72656c 617469.
+ +0.001062
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000600 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003cc00c 00020001 0000003c 0002c041 c0410001 00010001 51800004
+ ac122d06.
+ +0.000937
+ read fd=6 buflen=162
+ read=OK
+ 00823133 85800001 00000001 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0c0001c0 0c000600 01000000
+ 3c004103 6e73300a 72656c61 74697669 74790867 7265656e 656e6403 6f726702
+ 756b000a 686f7374 6d617374 6572c045 0000002a 00000e10 00000078 0064c800
+ 0000003c 00823134 85800001 00000001 00000474 65737403 69776a0a 72656c61
+ 7469.
+ +0.001660
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000d00 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31358580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.001133
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000f00 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31368580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000963
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00001000 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31378580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.001248
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00001100 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31398580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.001740
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0071 313a8580 00010001 00000001 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000981
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000200 01c00c00 02000100
+ 00003c00 20036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00c04100 01000100 01518000 04ac122d 06008231 3c858000 01000000
+ 01000004 74657374 0369776a 0a72656c 617469.
+ +0.001909
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000f00 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c00a0 313d8580 00010001 00010001 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000926
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000600 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003cc00c 00020001 0000003c 0002c041 c0410001 00010001 51800004
+ ac122d06.
+ +0.012223
+ read fd=6 buflen=162
+ read=OK
+ 0082313e 85800001 00000001 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001c0 0c000600 01000000
+ 3c004103 6e73300a 72656c61 74697669 74790867 7265656e 656e6403 6f726702
+ 756b000a 686f7374 6d617374 6572c045 0000002a 00000e10 00000078 0064c800
+ 0000003c 0082313f 85800001 00000001 00000474 65737403 69776a0a 72656c61
+ 7469.
+ +0.001327
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0071 31408580 00010001 00000001 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000945
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000200 01c00c00 02000100
+ 00003c00 20036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00c04100 01000100 01518000 04ac122d 06008231 41858000 01000000
+ 01000004 74657374 0369776a 0a72656c 61746976 69747908 67726565 6e656e64
+ 036f7267.
+ +0.000969
+ read fd=6 buflen=115
+ read=OK
+ 02756b00 00050001 c00c0006 00010000 003c0041 036e7330 0a72656c 61746976
+ 69747908 67726565 6e656e64 036f7267 02756b00 0a686f73 746d6173 746572c0
+ 45000000 2a00000e 10000000 780064c8 00000000 3c00a031 42858000 01000100
+ 01000104 74657374 0369776a 0a72656c 617469.
+ +0.000930
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000600 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003cc00c 00020001 0000003c 0002c041 c0410001 00010001 51800004
+ ac122d06.
+ +0.000929
+ read fd=6 buflen=162
+ read=OK
+ 00823143 85800001 00000001 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 0c0001c0 0c000600 01000000
+ 3c004103 6e73300a 72656c61 74697669 74790867 7265656e 656e6403 6f726702
+ 756b000a 686f7374 6d617374 6572c045 0000002a 00000e10 00000078 0064c800
+ 0000003c 00823144 85800001 00000001 00000474 65737403 69776a0a 72656c61
+ 7469.
+ +0.001098
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000d00 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31458580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.001053
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000f00 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31468580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.001035
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00001000 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31478580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000974
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00001100 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0082 31498580 00010000 00010000 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000933
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c0071 314a8580 00010001 00000001 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.001037
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000200 01c00c00 02000100
+ 00003c00 20036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 00c04100 01000100 01518000 04ac122d 06008231 4c858000 01000000
+ 01000004 74657374 0369776a 0a72656c 617469.
+ +0.002107
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000f00 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003c00a0 314d8580 00010001 00010001 04746573 74036977 6a0a7265
+ 6c617469.
+ +0.000955
+ read fd=6 buflen=132
+ read=OK
+ 76697479 08677265 656e656e 64036f72 6702756b 00000600 01c00c00 06000100
+ 00003c00 41036e73 300a7265 6c617469 76697479 08677265 656e656e 64036f72
+ 6702756b 000a686f 73746d61 73746572 c0450000 002a0000 0e100000 00780064
+ c8000000 003cc00c 00020001 0000003c 0002c041 c0410001 00010001 51800004
+ ac122d06.
+ +0.000578
+ read fd=6 buflen=162
+ read=EAGAIN
+ +1.000435
+ write fd=6
+ 76697479 08677265 656e656e 64036f72 6702756b 00001100 01.
+ write=25
+ +0.000932
+ select max=7 rfds=[5,6] wfds=[] efds=[6] to=21.691550
+ select=1 rfds=[6] wfds=[] efds=[]
+ +5.-217468
+ read fd=6 buflen=162
+ read=OK
+ 0082314e 85800001 00000001 00000474 65737403 69776a0a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 110001c0 0c000600 01000000
+ 3c004103 6e73300a 72656c61 74697669 74790867 7265656e 656e6403 6f726702
+ 756b000a 686f7374 6d617374 6572c045 0000002a 00000e10 00000078 0064c800
+ 0000003c.
+ +0.217468
+ read fd=6 buflen=162
+ read=EAGAIN
+ +0.017051
+ close fd=5
+ close=OK
+ +0.595595
+ close fd=6
+ close=OK
+ +0.000531
diff --git a/regress/case-tcpbreakin.err b/regress/case-tcpbreakin.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-tcpbreakin.err
diff --git a/regress/case-tcpbreakin.out b/regress/case-tcpbreakin.out
new file mode 100644
index 0000000..46cafba
--- /dev/null
+++ b/regress/case-tcpbreakin.out
@@ -0,0 +1,8 @@
+adns debug: using nameserver 172.18.45.6
+6.45.18.172.in-addr.arpa flags 2 type 65548 PTR(checked) submitted
+adns debug: TCP connected (NS=172.18.45.6)
+adns warning: TCP connection failed: write: Broken pipe (NS=172.18.45.6)
+adns debug: TCP connected (NS=172.18.45.6)
+6.45.18.172.in-addr.arpa flags 2 type PTR(checked): OK; nrrs=1; cname=$; owner=$; ttl=86400
+ davenant.relativity.greenend.org.uk
+rc=0
diff --git a/regress/case-tcpbreakin.sys b/regress/case-tcpbreakin.sys
new file mode 100644
index 0000000..d20b0d9
--- /dev/null
+++ b/regress/case-tcpbreakin.sys
@@ -0,0 +1,114 @@
+adnstest default
+:0x10000|12 2/6.45.18.172.in-addr.arpa
+ start 957718868.938329
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000161
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000059
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000038
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.001056
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000238
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000055
+ connect fd=5 addr=172.18.45.6:53
+ connect=EINPROGRESS
+ +0.000723
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.997928
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.000536
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000118
+ write fd=5
+ 002a311f 01000001 00000000 00000136 02343502 31380331 37320769 6e2d6164
+ 64720461 72706100 000c0001.
+ write=44
+ +0.001433
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.995841
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.000260
+ read fd=5 buflen=2
+ read=OK
+ 00d7.
+ +0.000302
+ read fd=5 buflen=215
+ read=OK
+ 311f8580 00010001 00030003 01360234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00250864 6176656e 616e740a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0002 34350231
+ 38033137 3207696e 2d616464 72046172 70610000 02000100 01518000 06036e73
+ 30c03fc0 5b000200 01000151 80000603 6e7331c0 3fc05b00 02000100 01518000
+ 06036e73 32c03fc0 7d000100 01000151 800004ac 122d06c0 8f000100 01000151
+ 800004ac 122d41c0 a1000100 01000151 800004ac 122d01.
+ +0.001364
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=EMSGSIZE
+ +0.000001
+ write fd=5
+ 00353120 01000001 00000000 00000864 6176656e 616e740a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=EPIPE
+ +0.001233
+ close fd=5
+ close=OK
+ +0.000001
+ select max=5 rfds=[4] wfds=[] efds=[] to=0.000000
+ select=1 rfds=[] wfds=[] efds=[]
+ +0.000118
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.001056
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000238
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000055
+ connect fd=5 addr=172.18.45.6:53
+ connect=EINPROGRESS
+ +0.000723
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.997928
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.000536
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000723
+ write fd=5
+ 00353120 01000001 00000000 00000864 6176656e 616e740a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=44
+ +0.000001
+ select max=6 rfds=[4,5] wfds=[5] efds=[5] to=29.993649
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.000260
+ read fd=5 buflen=217
+ read=OK
+ 00c5
+ 31208580 00010001 00030003 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 01000100 01518000
+ 04ac122d 060a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000200 01000151 80000603 6e7330c0 45c04500 02000100 01518000 06036e73
+ 31c045c0 45000200 01000151 80000603 6e7332c0 45c06b00 01000100 01518000
+ 04ac122d 06c07d00 01000100 01518000 04ac122d 41c08f00 01000100 01518000
+ 04ac122d 01.
+ +0.001171
+ read fd=5 buflen=217
+ read=EAGAIN
+ +0.000189
+ close fd=4
+ close=OK
+ +0.000352
+ close fd=5
+ close=OK
+ +0.000507
diff --git a/regress/case-tcpmultipart.err b/regress/case-tcpmultipart.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-tcpmultipart.err
diff --git a/regress/case-tcpmultipart.out b/regress/case-tcpmultipart.out
new file mode 100644
index 0000000..3a7a124
--- /dev/null
+++ b/regress/case-tcpmultipart.out
@@ -0,0 +1,71 @@
+adns debug: using nameserver 172.31.80.9
+132.76.224.195.in-addr.arpa flags 2 type 12 PTR(raw) submitted
+manymorerrs.test.culture.dotat.at. flags 2 type 12 PTR(raw) submitted
+132.76.224.195.in-addr.arpa flags 2 type 12 PTR(raw) submitted
+adns debug: TCP connected (NS=172.31.80.9)
+132.76.224.195.in-addr.arpa flags 2 type PTR(raw): OK; nrrs=1; cname=$; owner=$; ttl=86400
+ chiark.greenend.org.uk
+manymorerrs.test.culture.dotat.at. flags 2 type PTR(raw): OK; nrrs=60; cname=$; owner=$; ttl=86400
+ very-long-domain.to-ensure-truncation.00.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.01.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.02.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.03.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.04.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.05.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.06.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.07.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.08.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.09.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.10.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.11.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.12.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.13.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.14.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.15.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.16.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.17.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.18.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.19.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.20.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.21.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.22.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.23.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.24.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.25.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.26.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.27.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.28.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.29.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.30.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.31.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.32.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.33.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.34.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.35.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.36.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.37.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.38.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.39.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.40.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.41.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.42.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.43.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.44.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.45.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.46.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.47.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.48.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.49.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.50.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.51.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.52.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.53.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.54.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.55.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.56.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.57.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.58.test.culture.dotat.at
+ very-long-domain.to-ensure-truncation.59.test.culture.dotat.at
+132.76.224.195.in-addr.arpa flags 2 type PTR(raw): OK; nrrs=1; cname=$; owner=$; ttl=86400
+ chiark.greenend.org.uk
+rc=0
diff --git a/regress/case-tcpmultipart.sys b/regress/case-tcpmultipart.sys
new file mode 100644
index 0000000..8f59ea9
--- /dev/null
+++ b/regress/case-tcpmultipart.sys
@@ -0,0 +1,248 @@
+adnstest tunnel
+:0x0|12 2/132.76.224.195.in-addr.arpa 2/manymorerrs.test.culture.dotat.at. 2/132.76.224.195.in-addr.arpa
+ start 938365454.994875
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000164
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000055
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000043
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.001177
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000044
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000041
+ connect fd=5 addr=172.31.80.9:53
+ connect=EINPROGRESS
+ +0.000414
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.998324
+ select=1 rfds=[] wfds=[5] efds=[]
+ +1.-647444
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000176
+ write fd=5
+ 002d311f 01000001 00000000 00000331 33320237 36033232 34033139 3507696e
+ 2d616464 72046172 70610000 0c0001.
+ write=47
+ +0.000727
+ write fd=5
+ 00333120 01000001 00000000 00000b6d 616e796d 6f726572 72730474 65737407
+ 63756c74 75726505 646f7461 74026174 00000c00 01.
+ write=53
+ +0.000359
+ write fd=5
+ 002d3121 01000001 00000000 00000331 33320237 36033232 34033139 3507696e
+ 2d616464 72046172 70610000 0c0001.
+ write=47
+ +0.000273
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.644233
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.538651
+ read fd=5 buflen=2
+ read=OK
+ 0127.
+ +0.000289
+ read fd=5 buflen=295
+ read=OK
+ 311f8580 00010001 00050005 03313332 02373603 32323403 31393507 696e2d61
+ 64647204 61727061 00000c00 01c00c00 0c000100 01518000 18066368 6961726b
+ 08677265 656e656e 64036f72 6702756b 00023736 03323234 03313935 07696e2d
+ 61646472 04617270 61000002 00010001 51800011 04646e73 3006656c 6d61696c
+ 02636fc0 4dc05100 02000100 01518000 0704646e 7331c079 c0510002 00010001
+ 51800007 04646e73 32c079c0 51000200 01000151 80000e03 6e733204 78617261
+ 036e6574 00c05100 02000100 01518000 06036e73 33c0bbc0 74000100 01000055
+ c80004c1 7ae911c0 91000100 0100004f 650004c1 7ae901c0 a4000100 0100004f
+ 650004c3 e04cc1c0 b7000100 0100014c 4b0004c2 8fa16bc0 d1000100 0100014c
+ 4b0004c2 8fa319.
+ +0.001247
+ read fd=5 buflen=297
+ read=EAGAIN
+ +0.000476
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.105246
+ select=1 rfds=[5] wfds=[] efds=[]
+ +1.-401146
+ read fd=5 buflen=297
+ read=OK
+ 0dbe3120 85800001 003c0002 00020b6d 616e796d 6f726572 72730474 65737407
+ 63756c74 75726505 646f7461 74026174 00000c00 01c00c00 0c000100 01518000
+ 40107665 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e 73757265 2d747275
+ 6e636174 696f6e02 30300474 65737407 63756c74 75726505 646f7461 74026174
+ 00c00c00 0c000100 01518000 2b107665 72792d6c 6f6e672d 646f6d61 696e1474
+ 6f2d656e 73757265 2d747275 6e636174 696f6e02 3031c068 c00c000c 00010001
+ 5180002b 10766572 792d6c6f 6e672d64 6f6d6169 6e14746f 2d656e73 7572652d
+ 7472756e 63617469 6f6e0230 32c068c0 0c000c00 01000151 80002b10 76657279
+ 2d6c6f6e 672d646f 6d61696e 14746f2d 656e7375 72652d74 72756e63 6174696f
+ 6e023033 c068c00c 00.
+ +0.001076
+ read fd=5 buflen=3223
+ read=OK
+ 0c000100 01518000 2b107665 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e
+ 73757265 2d747275 6e636174 696f6e02 3034c068 c00c000c 00010001 5180002b
+ 10766572 792d6c6f 6e672d64 6f6d6169 6e14746f 2d656e73 7572652d 7472756e
+ 63617469 6f6e0230 35c068c0 0c000c00 01000151 80002b10 76657279 2d6c6f6e
+ 672d646f 6d61696e 14746f2d 656e7375 72652d74 72756e63 6174696f 6e023036
+ c068c00c 000c0001 00015180 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14
+ 746f2d65 6e737572 652d7472 756e6361 74696f6e 023037c0 68c00c00 0c000100
+ 01518000 2b107665 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e 73757265
+ 2d747275 6e636174 696f6e02 3038c068 c00c000c 00010001 5180002b 10766572
+ 792d6c6f 6e672d64 6f6d6169 6e14746f 2d656e73 7572652d 7472756e 63617469
+ 6f6e0230 39c068c0 0c000c00 01000151 80002b10 76657279 2d6c6f6e 672d646f
+ 6d61696e 14746f2d 656e7375 72652d74 72756e63 6174696f 6e023130 c068c00c
+ 000c0001 00015180 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65
+ 6e737572 652d7472 756e6361 74696f6e 023131c0 68c00c00 0c000100 01518000
+ 2b107665 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e 73757265 2d747275
+ 6e636174 696f6e02 3132c068 c00c000c 00010001 5180002b 10766572 792d6c6f
+ 6e672d64 6f6d6169 6e14746f 2d656e73 7572652d 7472756e 63617469 6f6e0231
+ 33c068c0 0c000c00 01000151 80002b10 76657279 2d6c6f6e 672d646f 6d61696e
+ 14746f2d 656e7375 72652d74 72756e63 6174696f 6e023134 c068c00c 000c0001
+ 00015180 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65 6e737572
+ 652d7472 756e6361 74696f.
+ +0.002411
+ read fd=5 buflen=2572
+ read=EAGAIN
+ +0.000101
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=28.502804
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.336462
+ read fd=5 buflen=2572
+ read=OK
+ 6e023135 c068c00c 000c0001 00015180 002b1076 6572792d 6c6f6e67 2d646f6d
+ 61696e14 746f2d65 6e737572 652d7472 756e6361 74696f6e 023136c0 68c00c00
+ 0c000100 01518000 2b107665 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e
+ 73757265 2d747275 6e636174 696f6e02 3137c068 c00c000c 00010001 5180002b
+ 10766572 792d6c6f 6e672d64 6f6d6169 6e14746f 2d656e73 7572652d 7472756e
+ 63617469 6f6e0231 38c068c0 0c000c00 01000151 80002b10 76657279 2d6c6f6e
+ 672d646f 6d61696e 14746f2d 656e7375 72652d74 72756e63 6174696f 6e023139
+ c068c00c 000c0001 00015180 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14
+ 746f2d65 6e737572 652d7472 756e6361 74696f6e 023230c0 68c00c00 0c000100
+ 01518000 2b107665 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e 73757265
+ 2d747275 6e636174 696f6e02 3231c068 c00c000c 00010001 5180002b 10766572
+ 792d6c6f 6e672d64 6f6d6169 6e14746f 2d656e73 7572652d 7472756e 63617469
+ 6f6e0232 32c068c0 0c000c00 01000151 80002b10 76657279 2d6c6f6e 672d646f
+ 6d61696e 14746f2d 656e7375 72652d74 72756e63 6174696f 6e023233 c068c00c
+ 000c0001 00015180 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65
+ 6e737572 652d7472 756e6361 74696f6e 023234c0 68c00c00 0c000100 01518000
+ 2b107665 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e 73757265 2d747275
+ 6e636174 696f6e02 3235c068 c00c000c 00010001 5180002b 10766572 792d6c6f
+ 6e672d64 6f6d6169 6e14746f 2d656e73 7572652d 7472756e 63617469 6f6e0232
+ 36c068c0 0c000c00 01000151 80002b10 76657279 2d6c6f6e 672d646f 6d61696e
+ 14746f2d 656e7375 72652d74 72756e63 6174696f 6e023237 c068c00c 000c0001
+ 00015180 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65 6e737572
+ 652d7472 756e6361 74696f6e 023238c0 68c00c00 0c000100 01518000 2b107665
+ 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e 73757265 2d747275 6e636174
+ 696f6e02 3239c068 c00c000c 00010001 5180002b 10766572 792d6c6f 6e672d64
+ 6f6d6169 6e14746f 2d656e73 7572652d 7472756e 63617469 6f6e0233 30c068c0
+ 0c000c00 01000151 80002b10 76657279 2d6c6f6e 672d646f 6d61696e 14746f2d
+ 656e7375 72652d74 72756e63 6174696f 6e023331 c068c00c 000c0001 00015180
+ 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65 6e737572 652d7472
+ 756e6361 74696f6e 023332c0 68c00c00 0c000100.
+ +0.003315
+ read fd=5 buflen=1624
+ read=EAGAIN
+ +0.000124
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=28.162903
+ select=1 rfds=[5] wfds=[] efds=[]
+ +1.-683589
+ read fd=5 buflen=1624
+ read=OK
+ 01518000 2b107665 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e 73757265
+ 2d747275 6e636174 696f6e02 3333c068 c00c000c 00010001 5180002b 10766572
+ 792d6c6f 6e672d64 6f6d6169 6e14746f 2d656e73 7572652d 7472756e 63617469
+ 6f6e0233 34c068c0 0c000c00 01000151 80002b10 76657279 2d6c6f6e 672d646f
+ 6d61696e 14746f2d 656e7375 72652d74 72756e63 6174696f 6e023335 c068c00c
+ 000c0001 00015180 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65
+ 6e737572 652d7472 756e6361 74696f6e 023336c0 68c00c00 0c000100 01518000
+ 2b107665 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e 73757265 2d747275
+ 6e636174 696f6e02 3337c068 c00c000c 00010001 5180002b 10766572 792d6c6f
+ 6e672d64 6f6d6169 6e14746f 2d656e73 7572652d 7472756e 63617469 6f6e0233
+ 38c068c0 0c000c00 01000151 80002b10 76657279 2d6c6f6e 672d646f 6d61696e
+ 14746f2d 656e7375 72652d74 72756e63 6174696f 6e023339 c068c00c 000c0001
+ 00015180 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65 6e737572
+ 652d7472 756e6361 74696f6e 023430c0 68c00c00 0c000100 01518000 2b107665
+ 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e 73757265 2d747275 6e636174
+ 696f6e02 3431c068 c00c000c 00010001 5180002b 10766572 792d6c6f 6e672d64
+ 6f6d6169 6e14746f 2d656e73 7572652d 7472756e 63617469 6f6e0234 32c068c0
+ 0c000c00 01000151 80002b10 76657279 2d6c6f6e 672d646f 6d61696e 14746f2d
+ 656e7375 72652d74 72756e63 6174696f 6e023433 c068c00c 000c0001 00015180
+ 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65 6e737572 652d7472
+ 756e6361 74696f6e 023434c0 68c00c00 0c000100 01518000 2b107665 72792d6c
+ 6f6e672d 646f6d61 696e1474 6f2d656e 73757265 2d747275 6e636174 696f6e02
+ 3435c068 c00c000c 00010001 5180002b 10766572 792d6c6f 6e672d64 6f6d6169
+ 6e14746f 2d656e73 7572652d 7472756e 63617469 6f6e0234 36c068c0 0c000c00
+ 01000151 80002b10 76657279 2d6c6f6e 672d646f 6d61696e 14746f2d 656e7375
+ 72652d74 72756e63 6174696f 6e023437 c068c00c 000c0001 00015180 002b1076
+ 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65 6e737572 652d7472 756e6361
+ 74696f6e 023438c0 68c00c00 0c000100 01518000 2b107665 72792d6c 6f6e672d
+ 646f6d61 696e1474 6f2d656e 73757265 2d747275 6e636174 696f6e02 3439c068
+ c00c000c 00010001 5180002b 10766572 792d6c6f.
+ +0.003201
+ read fd=5 buflen=676
+ read=EAGAIN
+ +0.000114
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=27.843177
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.376863
+ read fd=5 buflen=676
+ read=OK
+ 6e672d64 6f6d6169 6e14746f 2d656e73 7572652d 7472756e 63617469 6f6e0235
+ 30c068c0 0c000c00 01000151 80002b10 76657279 2d6c6f6e 672d646f 6d61696e
+ 14746f2d 656e7375 72652d74 72756e63 6174696f 6e023531 c068c00c 000c0001
+ 00015180 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65 6e737572
+ 652d7472 756e6361 74696f6e 023532c0 68c00c00 0c000100 01518000 2b107665
+ 72792d6c 6f6e672d 646f6d61 696e1474 6f2d656e 73757265 2d747275 6e636174
+ 696f6e02 3533c068 c00c000c 00010001 5180002b 10766572 792d6c6f 6e672d64
+ 6f6d6169 6e14746f 2d656e73 7572652d 7472756e 63617469 6f6e0235 34c068c0
+ 0c000c00 01000151 80002b10 76657279 2d6c6f6e 672d646f 6d61696e 14746f2d
+ 656e7375 72652d74 72756e63 6174696f 6e023535 c068c00c 000c0001 00015180
+ 002b1076 6572792d 6c6f6e67 2d646f6d 61696e14 746f2d65 6e737572 652d7472
+ 756e6361 74696f6e 023536c0 68c00c00 0c000100 01518000 2b107665 72792d6c
+ 6f6e672d 646f6d61 696e1474 6f2d656e 73757265 2d747275 6e636174 696f6e02
+ 3537c068 c00c000c 00010001 5180002b 10766572 792d6c6f 6e672d64 6f6d6169
+ 6e14746f 2d656e73 7572652d 7472756e 63617469 6f6e0235 38c068c0 0c000c00
+ 01000151 80002b10 76657279 2d6c6f6e 672d646f 6d61696e 14746f2d 656e7375
+ 72652d74 72756e63 6174696f 6e023539 c068c06d 00020001 00054600 0014076c
+ 69627261 7279066c 73706163 65036f72 6700c06d 00020001 00054600 001b026e
+ 73066368 6961726b 08677265 656e656e 64036f72 6702756b 00076c69 62726172
+ 79066c73 70616365 036f7267 00000100 01000161 890004c3 c8013a02 6e730663
+ 68696172 6b086772 65656e65 6e64036f 72670275 6b000001 00010001 51800004
+ c3e04c84.
+ +0.002355
+ read fd=5 buflen=3520
+ read=OK
+ 01273121 85800001 00010005 00050331 33320237 36033232 34033139 3507696e
+ 2d616464 72046172 70610000 0c0001c0 0c000c00 01000151 80001806 63686961
+ 726b0867 7265656e 656e6403 6f726702 756b0002 37360332 32340331 39350769
+ 6e2d6164 64720461 72706100 00020001 00015180 00110464 6e733006 656c6d61
+ 696c0263 6fc04dc0 51000200 01000151 80000704 646e7331 c079c051 00020001
+ 00015180 00070464 6e7332c0 79c05100 02000100 01518000 0e036e73 32047861
+ 7261036e 657400c0 51000200 01000151 80000603 6e7333c0 bbc07400 01000100
+ 0055c800 04c17ae9 11c09100 01000100 004f6500 04c17ae9 01c0a400 01000100
+ 004f6500 04c3e04c c1c0b700 01000100.
+ +0.009447
+ read fd=5 buflen=3248
+ read=EAGAIN
+ +0.000066
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=27.454446
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.316770
+ read fd=5 buflen=3248
+ read=OK
+ 014c4b00 04c28fa1 6bc0d100 01000100 014c4b00 04c28fa3 19.
+ +0.000195
+ read fd=5 buflen=3520
+ read=EAGAIN
+ +0.000429
+ close fd=4
+ close=OK
+ +0.000375
+ close fd=5
+ close=OK
+ +0.000226
diff --git a/regress/case-tcpptr.err b/regress/case-tcpptr.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-tcpptr.err
diff --git a/regress/case-tcpptr.out b/regress/case-tcpptr.out
new file mode 100644
index 0000000..a22ae89
--- /dev/null
+++ b/regress/case-tcpptr.out
@@ -0,0 +1,6 @@
+adns debug: using nameserver 172.18.45.6
+6.45.18.172.in-addr.arpa flags 2 type 65548 PTR(checked) submitted
+adns debug: TCP connected (NS=172.18.45.6)
+6.45.18.172.in-addr.arpa flags 2 type PTR(checked): OK; nrrs=1; cname=$; owner=$; ttl=86400
+ davenant.relativity.greenend.org.uk
+rc=0
diff --git a/regress/case-tcpptr.sys b/regress/case-tcpptr.sys
new file mode 100644
index 0000000..662689c
--- /dev/null
+++ b/regress/case-tcpptr.sys
@@ -0,0 +1,88 @@
+adnstest default
+:0x10000|12 2/6.45.18.172.in-addr.arpa
+ start 957718868.938329
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000161
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000059
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000038
+ socket domain=AF_INET type=SOCK_STREAM
+ socket=5
+ +0.001056
+ fcntl fd=5 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000238
+ fcntl fd=5 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000055
+ connect fd=5 addr=172.18.45.6:53
+ connect=EINPROGRESS
+ +0.000723
+ select max=6 rfds=[4] wfds=[5] efds=[] to=13.997928
+ select=1 rfds=[] wfds=[5] efds=[]
+ +0.000536
+ read fd=5 buflen=1
+ read=EAGAIN
+ +0.000118
+ write fd=5
+ 002a311f 01000001 00000000 00000136 02343502 31380331 37320769 6e2d6164
+ 64720461 72706100 000c0001.
+ write=44
+ +0.001433
+ select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.995841
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.000260
+ read fd=5 buflen=2
+ read=OK
+ 00d7.
+ +0.000302
+ read fd=5 buflen=215
+ read=OK
+ 311f8580 00010001 00030003 01360234 35023138 03313732 07696e2d 61646472
+ 04617270 6100000c 0001c00c 000c0001 00015180 00250864 6176656e 616e740a
+ 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0002 34350231
+ 38033137 3207696e 2d616464 72046172 70610000 02000100 01518000 06036e73
+ 30c03fc0 5b000200 01000151 80000603 6e7331c0 3fc05b00 02000100 01518000
+ 06036e73 32c03fc0 7d000100 01000151 800004ac 122d06c0 8f000100 01000151
+ 800004ac 122d41c0 a1000100 01000151 800004ac 122d01.
+ +0.001364
+ sendto fd=4 addr=172.18.45.6:53
+ 31200100 00010000 00000000 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01.
+ sendto=EMSGSIZE
+ +0.000001
+ write fd=5
+ 00353120 01000001 00000000 00000864 6176656e 616e740a 72656c61 74697669
+ 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ write=53
+ +0.001233
+ read fd=5 buflen=217
+ read=EAGAIN
+ +0.000100
+ select max=6 rfds=[4,5] wfds=[5] efds=[5] to=29.997000
+ select=1 rfds=[5] wfds=[] efds=[]
+ +0.000118
+ read fd=5 buflen=217
+ read=OK
+ 00c5
+ 31208580 00010001 00030003 08646176 656e616e 740a7265 6c617469 76697479
+ 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 01000100 01518000
+ 04ac122d 060a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b
+ 00000200 01000151 80000603 6e7330c0 45c04500 02000100 01518000 06036e73
+ 31c045c0 45000200 01000151 80000603 6e7332c0 45c06b00 01000100 01518000
+ 04ac122d 06c07d00 01000100 01518000 04ac122d 41c08f00 01000100 01518000
+ 04ac122d 01.
+ +0.001171
+ read fd=5 buflen=217
+ read=EAGAIN
+ +0.000189
+ close fd=4
+ close=OK
+ +0.000352
+ close fd=5
+ close=OK
+ +0.000507
diff --git a/regress/case-timeout.err b/regress/case-timeout.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-timeout.err
diff --git a/regress/case-timeout.out b/regress/case-timeout.out
new file mode 100644
index 0000000..a3f7495
--- /dev/null
+++ b/regress/case-timeout.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.36
+chiark.greenend.org.uk flags 0 type 1 A(-) submitted
+chiark.greenend.org.uk flags 0 type A(-): DNS query timed out; nrrs=0; cname=$; owner=$; ttl=604770
+rc=0
diff --git a/regress/case-timeout.sys b/regress/case-timeout.sys
new file mode 100644
index 0000000..3fb78d3
--- /dev/null
+++ b/regress/case-timeout.sys
@@ -0,0 +1,135 @@
+adnstest noserver
+:0x0|1 chiark.greenend.org.uk
+ start 912889153.349504
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000193
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000088
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000072
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000617
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999383
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.008683
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000406
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999594
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009544
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000428
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999572
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009567
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000449
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999551
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009551
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000381
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999619
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009614
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000383
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999617
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009622
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000387
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999613
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009603
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000404
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999596
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009607
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000468
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999532
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009526
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000431
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999569
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009564
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000429
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999571
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009586
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000479
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999521
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009511
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000430
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999570
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009571
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000440
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999560
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009564
+ sendto fd=4 addr=172.18.45.36:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000439
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999561
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.009554
+ close fd=4
+ close=OK
+ +0.000267
diff --git a/regress/case-trunc.err b/regress/case-trunc.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-trunc.err
diff --git a/regress/case-trunc.out b/regress/case-trunc.out
new file mode 100644
index 0000000..bd70e05
--- /dev/null
+++ b/regress/case-trunc.out
@@ -0,0 +1,4 @@
+adns debug: using nameserver 172.18.45.6
+trunc.test.iwj.relativity.greenend.org.uk flags 0 type 1 A(-) submitted
+trunc.test.iwj.relativity.greenend.org.uk flags 0 type A(-): No such data; nrrs=0; cname=$; owner=$; ttl=60
+rc=0
diff --git a/regress/case-trunc.sys b/regress/case-trunc.sys
new file mode 100644
index 0000000..d57547d
--- /dev/null
+++ b/regress/case-trunc.sys
@@ -0,0 +1,34 @@
+adnstest default
+:0x0|1 trunc.test.iwj.relativity.greenend.org.uk
+ start 912888921.274801
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000207
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000321
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000443
+ sendto fd=4 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 010001.
+ sendto=59
+ +0.000682
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.999318
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.006406
+ recvfrom fd=4 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010000 00010000 05747275 6e630474 65737403 69776a0a 72656c61
+ 74697669 74790867 7265656e 656e6403 6f726702 756b0000 01000104 74657374
+ 0369776a 0a72656c 61746976 69747908 67726565 6e656e64 036f7267 02756b00
+ 00060001 0000003c 0027036e 7330c044 0a686f73 746d6173 746572c0 44000000
+ 0e00000e 10000000 780064c8 00000000 3c.
+ +0.000839
+ recvfrom fd=4 buflen=512
+ recvfrom=EAGAIN
+ +0.000141
+ close fd=4
+ close=OK
+ +0.000157
diff --git a/regress/case-unknown-flags-harmless.err b/regress/case-unknown-flags-harmless.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-unknown-flags-harmless.err
diff --git a/regress/case-unknown-flags-harmless.out b/regress/case-unknown-flags-harmless.out
new file mode 100644
index 0000000..08a05a8
--- /dev/null
+++ b/regress/case-unknown-flags-harmless.out
@@ -0,0 +1,5 @@
+adns debug: using nameserver 172.18.45.6
+chiark.greenend.org.uk flags 1074266112 type 1 A(-) submitted
+chiark.greenend.org.uk flags 1074266112 type A(-): OK; nrrs=1; cname=$; owner=$; ttl=3600
+ 212.13.197.229
+rc=0
diff --git a/regress/case-unknown-flags-harmless.sys b/regress/case-unknown-flags-harmless.sys
new file mode 100644
index 0000000..e06fc00
--- /dev/null
+++ b/regress/case-unknown-flags-harmless.sys
@@ -0,0 +1,34 @@
+./adnstest default -0x4000
+:0x60000000|1 0x40080000/chiark.greenend.org.uk
+ start 1414182720.022422
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000183
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000097
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000076
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000272
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999728
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.102141
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010000 0e100004 d40dc5e5 c0130002 00010001
+ 51800011 036e7331 0a72656c 61746976 697479c0 13c01300 02000100 01518000
+ 06036e73 30c048c0 61000100 01000151 800004ac 122d06c0 44000100 01000151
+ 800004ac 122d0b.
+ +0.000252
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000070
+ close fd=6
+ close=OK
+ +0.000138
diff --git a/regress/case-unknown-flags-init.err b/regress/case-unknown-flags-init.err
new file mode 100644
index 0000000..8d1d1d8
--- /dev/null
+++ b/regress/case-unknown-flags-init.err
@@ -0,0 +1 @@
+adns failure: init: errno=ENOSYS
diff --git a/regress/case-unknown-flags-init.out b/regress/case-unknown-flags-init.out
new file mode 100644
index 0000000..daa767e
--- /dev/null
+++ b/regress/case-unknown-flags-init.out
@@ -0,0 +1 @@
+rc=2
diff --git a/regress/case-unknown-flags-init.sys b/regress/case-unknown-flags-init.sys
new file mode 100644
index 0000000..e177c78
--- /dev/null
+++ b/regress/case-unknown-flags-init.sys
@@ -0,0 +1,2 @@
+./adnstest default -0x6000
+:0x60000000|1 0x40080000/chiark.greenend.org.uk
diff --git a/regress/case-unknown-flags-query.err b/regress/case-unknown-flags-query.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-unknown-flags-query.err
diff --git a/regress/case-unknown-flags-query.out b/regress/case-unknown-flags-query.out
new file mode 100644
index 0000000..ac8e541
--- /dev/null
+++ b/regress/case-unknown-flags-query.out
@@ -0,0 +1,3 @@
+adns debug: using nameserver 172.18.45.6
+chiark.greenend.org.uk flags 1075314688 type 1 not implemented
+rc=0
diff --git a/regress/case-unknown-flags-query.sys b/regress/case-unknown-flags-query.sys
new file mode 100644
index 0000000..ce849e8
--- /dev/null
+++ b/regress/case-unknown-flags-query.sys
@@ -0,0 +1,15 @@
+./adnstest default -0x4000
+:0x60000000|1 0x40180000/chiark.greenend.org.uk
+ start 1414182790.489799
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000123
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000047
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000039
+ close fd=6
+ close=OK
+ +0.000149
diff --git a/regress/case-unknown-flags-type.err b/regress/case-unknown-flags-type.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-unknown-flags-type.err
diff --git a/regress/case-unknown-flags-type.out b/regress/case-unknown-flags-type.out
new file mode 100644
index 0000000..a12353a
--- /dev/null
+++ b/regress/case-unknown-flags-type.out
@@ -0,0 +1,3 @@
+adns debug: using nameserver 172.18.45.6
+chiark.greenend.org.uk flags 1074266112 type 1 not implemented
+rc=0
diff --git a/regress/case-unknown-flags-type.sys b/regress/case-unknown-flags-type.sys
new file mode 100644
index 0000000..41705b8
--- /dev/null
+++ b/regress/case-unknown-flags-type.sys
@@ -0,0 +1,15 @@
+./adnstest default -0x4000
+:0x70000000|1 0x40080000/chiark.greenend.org.uk
+ start 1414182770.758670
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000142
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000080
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000060
+ close fd=6
+ close=OK
+ +0.000170
diff --git a/regress/case-unknown2.err b/regress/case-unknown2.err
new file mode 100644
index 0000000..2886e3c
--- /dev/null
+++ b/regress/case-unknown2.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.18.45.6
diff --git a/regress/case-unknown2.out b/regress/case-unknown2.out
new file mode 100644
index 0000000..94a2ab1
--- /dev/null
+++ b/regress/case-unknown2.out
@@ -0,0 +1,5 @@
+ucam.org TYPE2 \# 12 06636869 61726b02 6e73c01a
+ucam.org TYPE2 \# 11 08636869 6d616572 61 c0 35
+ucam.org TYPE2 \# 8 05726170 756ec035
+ucam.org TYPE2 \# 9 06626563 6b6574c0 35
+rc=0
diff --git a/regress/case-unknown2.sys b/regress/case-unknown2.sys
new file mode 100644
index 0000000..0a1f593
--- /dev/null
+++ b/regress/case-unknown2.sys
@@ -0,0 +1,66 @@
+./adnshost default
+-t type2 -Qq ucam.org.
+ start 1144369677.011111
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000083
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000049
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000043
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 04756361 6d036f72 67000002 0001.
+ sendto=26
+ +0.000308
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999692
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00406
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000098
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000987
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 04756361 6d036f72 67000002 0001.
+ sendto=26
+ +0.000244
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999756
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00531
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000287
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000988
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 04756361 6d036f72 67000002 0001.
+ sendto=26
+ +0.000252
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999748
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00540
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000288
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000989
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 04756361 6d036f72 67000002 0001.
+ sendto=26
+ +0.000237
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999763
+ select=1 rfds=[6] wfds=[] efds=[]
+ +1.961402
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010004 00040004 04756361 6d036f72 67000002 00010475 63616d03
+ 6f726700 00020001 00054600 000c0663 68696172 6b026e73 c01ac01a 00020001
+ 00054600 000b0863 68696d61 657261c0 35c01a00 02000100 05460000 08057261
+ 70756ec0 35c01a00 02000100 05460000 09066265 636b6574 c035c01a 00020001
+ 00054600 0002c02e c01a0002 00010005 46000002 c046c01a 00020001 00054600
+ 0002c05d c01a0002 00010005 46000002 c071c02e 00010001 0001517c 0004c1c9
+ c8aac046 00010001 0001517c 0004836f 082ac05d 00010001 0001517c 0004836f
+ e86cc071 00010001 0001517c 0004cd86 e6ba.
+ +0.000366
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000089
+ close fd=6
+ close=OK
+ +0.000187
diff --git a/regress/case-unknown33.err b/regress/case-unknown33.err
new file mode 100644
index 0000000..2886e3c
--- /dev/null
+++ b/regress/case-unknown33.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.18.45.6
diff --git a/regress/case-unknown33.out b/regress/case-unknown33.out
new file mode 100644
index 0000000..10be288
--- /dev/null
+++ b/regress/case-unknown33.out
@@ -0,0 +1,2 @@
+_jabber._tcp.jabber.org TYPE33 \# 18 001e001e 1495066a 61626265 72036f72 67 00
+rc=0
diff --git a/regress/case-unknown33.sys b/regress/case-unknown33.sys
new file mode 100644
index 0000000..7a6c122
--- /dev/null
+++ b/regress/case-unknown33.sys
@@ -0,0 +1,37 @@
+./adnshost default
+-t type33 -Qq _jabber._tcp.jabber.org
+ start 1144369693.043661
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000080
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000045
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000040
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 075f6a61 62626572 045f7463 70066a61 62626572
+ 036f7267 00002100 01.
+ sendto=41
+ +0.000316
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999684
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.004580
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8180 00010001 00040005 075f6a61 62626572 045f7463 70066a61 62626572
+ 036f7267 00002100 01c00c00 21000100 00031b00 12001e00 1e149506 6a616262
+ 6572036f 726700c0 19000200 01000018 33001103 6e733107 6a657265 6d696503
+ 636f6d00 c0190002 00010000 18330006 036e7332 c057c019 00020001 00001833
+ 000c036e 73310562 6c616872 c05fc019 00020001 00001833 0010026e 73076f62
+ 656c6973 6b036e65 7400c019 00010001 00000102 0004d0f5 d462c053 00010001
+ 00029f11 0004d0f5 d41dc070 00010001 00029f11 0004d0f5 d41ec082 00010001
+ 00029f13 00044051 6774c09a 00010001 00029f1d 00044761 e072.
+ +0.000369
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000082
+ close fd=6
+ close=OK
+ +0.002395
diff --git a/regress/case-unknown5.err b/regress/case-unknown5.err
new file mode 100644
index 0000000..2886e3c
--- /dev/null
+++ b/regress/case-unknown5.err
@@ -0,0 +1 @@
+adns debug: using nameserver 172.18.45.6
diff --git a/regress/case-unknown5.out b/regress/case-unknown5.out
new file mode 100644
index 0000000..197296a
--- /dev/null
+++ b/regress/case-unknown5.out
@@ -0,0 +1,2 @@
+pop.chiark.greenend.org.uk TYPE5 \# 15 0c736572 76696365 2d6e616d 65 c0 10
+rc=0
diff --git a/regress/case-unknown5.sys b/regress/case-unknown5.sys
new file mode 100644
index 0000000..4a436c4
--- /dev/null
+++ b/regress/case-unknown5.sys
@@ -0,0 +1,45 @@
+./adnshost default
+-t type5 pop.chiark.greenend.org.uk
+ start 1144369700.944069
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000074
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000048
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000040
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03706f70 06636869 61726b08 67726565 6e656e64
+ 036f7267 02756b00 00050001.
+ sendto=44
+ +0.000311
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999689
+ select=0 rfds=[] wfds=[] efds=[]
+ +2.-00919
+ select max=7 rfds=[6] wfds=[] efds=[] to=0.000608
+ select=0 rfds=[] wfds=[] efds=[]
+ +0.000988
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 03706f70 06636869 61726b08 67726565 6e656e64
+ 036f7267 02756b00 00050001.
+ sendto=44
+ +0.000264
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999736
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.004660
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00020002 03706f70 06636869 61726b08 67726565 6e656e64
+ 036f7267 02756b00 00050001 c00c0005 00010001 5180000f 0c736572 76696365
+ 2d6e616d 65c010c0 17000200 01000151 80001103 6e73300a 72656c61 74697669
+ 7479c017 c0170002 00010001 51800006 036e7331 c057c053 00010001 00015180
+ 0004ac12 2d06c070 00010001 00015180 0004ac12 2d0b.
+ +0.000242
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000074
+ close fd=6
+ close=OK
+ +0.000144
diff --git a/regress/case-unknownq.err b/regress/case-unknownq.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-unknownq.err
diff --git a/regress/case-unknownq.out b/regress/case-unknownq.out
new file mode 100644
index 0000000..c9e53e4
--- /dev/null
+++ b/regress/case-unknownq.out
@@ -0,0 +1,3 @@
+adns debug: using nameserver 172.18.45.6
+davenant.relativity.greenend.org.uk. flags 0 type 32767 not implemented
+rc=0
diff --git a/regress/case-unknownq.sys b/regress/case-unknownq.sys
new file mode 100644
index 0000000..60e6d2d
--- /dev/null
+++ b/regress/case-unknownq.sys
@@ -0,0 +1,15 @@
+adnstest default
+:0x0|32767 davenant.relativity.greenend.org.uk.
+ start 933811310.565828
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=4
+ +0.000264
+ fcntl fd=4 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000087
+ fcntl fd=4 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000067
+ close fd=4
+ close=OK
+ +0.000307
diff --git a/regress/case-unkopts.err b/regress/case-unkopts.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-unkopts.err
diff --git a/regress/case-unkopts.out b/regress/case-unkopts.out
new file mode 100644
index 0000000..42ee65b
--- /dev/null
+++ b/regress/case-unkopts.out
@@ -0,0 +1,10 @@
+adns debug: using nameserver 172.18.45.6
+adns: <supplied configuration text>:5: unknown option `wombat'
+adns: <supplied configuration text>:6: unknown configuration directive `stoat'
+adns: <supplied configuration text>:7: unknown option `zorkmid'
+adns: <supplied configuration text>:8: option adns_af has bad value or entry `dampstring' (option must be `any', or list of `ipv4',`ipv6')
+adns: <supplied configuration text>:8: unknown option `spong'
+chiark.greenend.org.uk flags 0 type 1 A(-) submitted
+chiark.greenend.org.uk flags 0 type A(-): OK; nrrs=1; cname=$; owner=$; ttl=3600
+ 212.13.197.229
+rc=0
diff --git a/regress/case-unkopts.sys b/regress/case-unkopts.sys
new file mode 100644
index 0000000..dadf4c3
--- /dev/null
+++ b/regress/case-unkopts.sys
@@ -0,0 +1,34 @@
+./adnstest unkopts
+:0x0|1 chiark.greenend.org.uk
+ start 1414184606.322883
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000116
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000047
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000040
+ sendto fd=6 addr=172.18.45.6:53
+ 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001.
+ sendto=40
+ +0.000202
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999798
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.002958
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.18.45.6:53
+ 311f8580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267
+ 02756b00 00010001 c00c0001 00010000 0e100004 d40dc5e5 c0130002 00010001
+ 51800011 036e7331 0a72656c 61746976 697479c0 13c01300 02000100 01518000
+ 06036e73 30c048c0 61000100 01000151 800004ac 122d06c0 44000100 01000151
+ 800004ac 122d0b.
+ +0.000383
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000138
+ close fd=6
+ close=OK
+ +0.000180
diff --git a/regress/case-v6-map.err b/regress/case-v6-map.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-v6-map.err
diff --git a/regress/case-v6-map.out b/regress/case-v6-map.out
new file mode 100644
index 0000000..28d4081
--- /dev/null
+++ b/regress/case-v6-map.out
@@ -0,0 +1,11 @@
+adns debug: using nameserver 172.29.199.224
+distorted.org.uk flags 4096 type 65537 A(addr) submitted
+distorted.org.uk flags 4096 type 65551 MX(+addr) submitted
+distorted.org.uk flags 4096 type 65537 A(addr) submitted
+distorted.org.uk flags 4096 type MX(+addr): OK; nrrs=1; cname=$; owner=$; ttl=14400
+ 50 mail.distorted.org.uk ok 0 ok "OK" ( INET6 ::ffff:172.29.199.180 )
+distorted.org.uk flags 4096 type A(addr): OK; nrrs=1; cname=$; owner=$; ttl=14400
+ INET6 ::ffff:172.29.199.180
+distorted.org.uk flags 4096 type A(addr): OK; nrrs=1; cname=$; owner=$; ttl=14400
+ INET 172.29.199.180
+rc=0
diff --git a/regress/case-v6-map.sys b/regress/case-v6-map.sys
new file mode 100644
index 0000000..3e92dce
--- /dev/null
+++ b/regress/case-v6-map.sys
@@ -0,0 +1,79 @@
+./adnstest distorted
+:0x1010000|1,0x1010000|15,0x10000|1 0x1000/distorted.org.uk
+ start 1402443121.225484
+ socket domain=AF_INET type=SOCK_DGRAM
+ socket=6
+ +0.000067
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000031
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000027
+ sendto fd=6 addr=172.29.199.224:53
+ 31200100 00010000 00000000 09646973 746f7274 6564036f 72670275 6b000001
+ 0001.
+ sendto=34
+ +0.000188
+ sendto fd=6 addr=172.29.199.224:53
+ 31210100 00010000 00000000 09646973 746f7274 6564036f 72670275 6b00000f
+ 0001.
+ sendto=34
+ +0.000110
+ sendto fd=6 addr=172.29.199.224:53
+ 31230100 00010000 00000000 09646973 746f7274 6564036f 72670275 6b000001
+ 0001.
+ sendto=34
+ +0.000101
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.999601
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.001672
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31208580 00010001 00040008 09646973 746f7274 6564036f 72670275 6b000001
+ 0001c00c 00010001 00003840 0004ac1d c7b4c00c 00020001 00003840 000d0776
+ 616d7069 7265026e 73c00cc0 0c000200 01000038 40000c09 70726563 6973696f
+ 6ec046c0 0c000200 01000038 40000906 72616469 7573c046 c00c0002 00010000
+ 3840000d 0a74656c 65636173 746572c0 46c06f00 01000100 00384000 04ac1dc7
+ 01c06f00 1c000100 00384000 10200104 70974000 01000000 00000000 01c03e00
+ 01000100 00384000 04ac1dc7 05c03e00 1c000100 00384000 10200104 70974000
+ 01000000 00000000 05c05700 01000100 00384000 04ac1dc7 b2c05700 1c000100
+ 00384000 1020010b a801d900 02000000 00000000 02c08400 01000100 00384000
+ 04ac1dc7 b3c08400 1c000100 00384000 1020010b a801d900 02000000 00000000
+ 03.
+ +0.000436
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31218580 00010001 0004000a 09646973 746f7274 6564036f 72670275 6b00000f
+ 0001c00c 000f0001 00003840 00090032 046d6169 6cc00cc0 0c000200 01000038
+ 40000c06 72616469 7573026e 73c00cc0 0c000200 01000038 40000c09 70726563
+ 6973696f 6ec04ac0 0c000200 01000038 40000a07 76616d70 697265c0 4ac00c00
+ 02000100 00384000 0d0a7465 6c656361 73746572 c04ac030 00010001 00003840
+ 0004ac1d c7b4c030 001c0001 00003840 00102001 0ba801d9 00020000 00000000
+ 0004c043 00010001 00003840 0004ac1d c701c043 001c0001 00003840 00102001
+ 04709740 00010000 00000000 0001c073 00010001 00003840 0004ac1d c705c073
+ 001c0001 00003840 00102001 04709740 00010000 00000000 0005c05b 00010001
+ 00003840 0004ac1d c7b2c05b 001c0001 00003840 00102001 0ba801d9 00020000
+ 00000000 0002c089 00010001 00003840 0004ac1d c7b3c089 001c0001 00003840
+ 00102001 0ba801d9 00020000 00000000 0003.
+ +0.000356
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=172.29.199.224:53
+ 31238580 00010001 00040008 09646973 746f7274 6564036f 72670275 6b000001
+ 0001c00c 00010001 00003840 0004ac1d c7b4c00c 00020001 00003840 00100a74
+ 656c6563 61737465 72026e73 c00cc00c 00020001 00003840 000a0776 616d7069
+ 7265c049 c00c0002 00010000 3840000c 09707265 63697369 6f6ec049 c00c0002
+ 00010000 38400009 06726164 697573c0 49c08800 01000100 00384000 04ac1dc7
+ 01c08800 1c000100 00384000 10200104 70974000 01000000 00000000 01c05a00
+ 01000100 00384000 04ac1dc7 05c05a00 1c000100 00384000 10200104 70974000
+ 01000000 00000000 05c07000 01000100 00384000 04ac1dc7 b2c07000 1c000100
+ 00384000 1020010b a801d900 02000000 00000000 02c03e00 01000100 00384000
+ 04ac1dc7 b3c03e00 1c000100 00384000 1020010b a801d900 02000000 00000000
+ 03.
+ +0.000329
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000049
+ close fd=6
+ close=OK
+ +0.000145
diff --git a/regress/case-v6-transport-simple.err b/regress/case-v6-transport-simple.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regress/case-v6-transport-simple.err
diff --git a/regress/case-v6-transport-simple.out b/regress/case-v6-transport-simple.out
new file mode 100644
index 0000000..182190a
--- /dev/null
+++ b/regress/case-v6-transport-simple.out
@@ -0,0 +1,34 @@
+adns debug: using nameserver 2001:ba8:1d9::1
+www.distorted.org.uk flags 0 type 1 A(-) submitted
+www.distorted.org.uk flags 0 type 2 NS(raw) submitted
+www.distorted.org.uk flags 0 type 5 CNAME(-) submitted
+www.distorted.org.uk flags 0 type 6 SOA(raw) submitted
+www.distorted.org.uk flags 0 type 12 PTR(raw) submitted
+www.distorted.org.uk flags 0 type 13 HINFO(-) submitted
+www.distorted.org.uk flags 0 type 15 MX(raw) submitted
+www.distorted.org.uk flags 0 type 16 TXT(-) submitted
+www.distorted.org.uk flags 0 type 17 RP(raw) submitted
+www.distorted.org.uk flags 0 type 65537 A(addr) submitted
+www.distorted.org.uk flags 0 type 65538 NS(+addr) submitted
+www.distorted.org.uk flags 0 type 65548 PTR(checked) submitted
+www.distorted.org.uk flags 0 type 65551 MX(+addr) submitted
+www.distorted.org.uk flags 0 type 131078 SOA(822) submitted
+www.distorted.org.uk flags 0 type 131089 RP(822) submitted
+www.distorted.org.uk flags 0 type PTR(checked): Domain invalid for particular DNS query type; nrrs=0; cname=$; owner=$; ttl=604800
+www.distorted.org.uk flags 0 type A(-): OK; nrrs=1; cname=$; owner=$; ttl=14400
+ 172.29.199.180
+www.distorted.org.uk flags 0 type NS(raw): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type CNAME(-): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type SOA(raw): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type PTR(raw): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type HINFO(-): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type MX(raw): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type TXT(-): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type RP(raw): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type A(addr): OK; nrrs=1; cname=$; owner=$; ttl=14400
+ INET 172.29.199.180
+www.distorted.org.uk flags 0 type NS(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type MX(+addr): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type SOA(822): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+www.distorted.org.uk flags 0 type RP(822): No such data; nrrs=0; cname=$; owner=$; ttl=14400
+rc=0
diff --git a/regress/case-v6-transport-simple.sys b/regress/case-v6-transport-simple.sys
new file mode 100644
index 0000000..e6ad68e
--- /dev/null
+++ b/regress/case-v6-transport-simple.sys
@@ -0,0 +1,221 @@
+./adnstest distorted-v6 -0x400
+www.distorted.org.uk
+ start 1402047441.083542
+ socket domain=AF_INET6 type=SOCK_DGRAM
+ socket=6
+ +0.000065
+ fcntl fd=6 cmd=F_GETFL
+ fcntl=~O_NONBLOCK&...
+ +0.000031
+ fcntl fd=6 cmd=F_SETFL O_NONBLOCK|...
+ fcntl=OK
+ +0.000026
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 311f0100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000001 0001.
+ sendto=38
+ +0.000733
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 31200100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000002 0001.
+ sendto=38
+ +0.000302
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 31210100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000005 0001.
+ sendto=38
+ +0.000357
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 31220100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000006 0001.
+ sendto=38
+ +0.000275
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 31230100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b00000c 0001.
+ sendto=38
+ +0.000260
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 31240100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b00000d 0001.
+ sendto=38
+ +0.000257
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 31250100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b00000f 0001.
+ sendto=38
+ +0.000254
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 31260100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000010 0001.
+ sendto=38
+ +0.000272
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 31270100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000011 0001.
+ sendto=38
+ +0.000253
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 31290100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000001 0001.
+ sendto=38
+ +0.000255
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 312a0100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000002 0001.
+ sendto=38
+ +0.000253
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 312c0100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b00000f 0001.
+ sendto=38
+ +0.000343
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 312d0100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000006 0001.
+ sendto=38
+ +0.000269
+ sendto fd=6 addr=[2001:ba8:1d9::1]:53
+ 312e0100 00010000 00000000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000011 0001.
+ sendto=38
+ +0.000267
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.995650
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.118752
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 311f8580 00010001 00040008 03777777 09646973 746f7274 6564036f 72670275
+ 6b000001 0001c00c 00010001 00003840 0004ac1d c7b4c010 00020001 00003840
+ 00100a74 656c6563 61737465 72026e73 c010c010 00020001 00003840 000a0776
+ 616d7069 7265c04d c0100002 00010000 38400009 06726164 697573c0 4dc01000
+ 02000100 00384000 0c097072 65636973 696f6ec0 4dc07400 01000100 00384000
+ 04ac1dc7 01c07400 1c000100 00384000 10200104 70974000 01000000 00000000
+ 01c05e00 01000100 00384000 04ac1dc7 05c05e00 1c000100 00384000 10200104
+ 70974000 01000000 00000000 05c08900 01000100 00384000 04ac1dc7 b2c08900
+ 1c000100 00384000 1020010b a801d900 02000000 00000000 02c04200 01000100
+ 00384000 04ac1dc7 b3c04200 1c000100 00384000 1020010b a801d900 02000000
+ 00000000 03.
+ +0.000346
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 31208580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000002 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000138
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 31218580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000005 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000108
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 31228580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000006 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000131
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 31238580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b00000c 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000154
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000033
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.877915
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000368
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 31248580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b00000d 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000117
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000034
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.877653
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000616
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 31258580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b00000f 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000114
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 31268580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000010 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000106
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 31278580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000011 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000107
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000031
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.877458
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000101
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 31298580 00010001 00040008 03777777 09646973 746f7274 6564036f 72670275
+ 6b000001 0001c00c 00010001 00003840 0004ac1d c7b4c010 00020001 00003840
+ 00100a74 656c6563 61737465 72026e73 c010c010 00020001 00003840 000a0776
+ 616d7069 7265c04d c0100002 00010000 38400009 06726164 697573c0 4dc01000
+ 02000100 00384000 0c097072 65636973 696f6ec0 4dc07400 01000100 00384000
+ 04ac1dc7 01c07400 1c000100 00384000 10200104 70974000 01000000 00000000
+ 01c05e00 01000100 00384000 04ac1dc7 05c05e00 1c000100 00384000 10200104
+ 70974000 01000000 00000000 05c08900 01000100 00384000 04ac1dc7 b2c08900
+ 1c000100 00384000 1020010b a801d900 02000000 00000000 02c04200 01000100
+ 00384000 04ac1dc7 b3c04200 1c000100 00384000 1020010b a801d900 02000000
+ 00000000 03.
+ +0.000273
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000043
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.877296
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000239
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 312a8580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000002 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000113
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 312c8580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b00000f 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000108
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 312d8580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000006 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000104
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000069
+ select max=7 rfds=[6] wfds=[] efds=[] to=1.877528
+ select=1 rfds=[6] wfds=[] efds=[]
+ +0.000094
+ recvfrom fd=6 buflen=512
+ recvfrom=OK addr=[2001:ba8:1d9::1]:53
+ 312e8580 00010000 00010000 03777777 09646973 746f7274 6564036f 72670275
+ 6b000011 0001c010 00060001 00003840 002a0672 61646975 73c0100a 686f7374
+ 6d617374 6572c010 780bfb99 00015180 00000e10 00127500 00003840.
+ +0.000106
+ recvfrom fd=6 buflen=512
+ recvfrom=EAGAIN
+ +0.000032
+ close fd=6
+ close=OK
+ +0.000110
diff --git a/regress/checkall b/regress/checkall
new file mode 100755
index 0000000..5b405c4
--- /dev/null
+++ b/regress/checkall
@@ -0,0 +1,70 @@
+#!/bin/sh
+# usage: checkall
+# runs all test cases
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+set -e
+
+: ${srcdir=.}
+failed=''
+passed=''
+skipped=''
+
+for f in $srcdir/case-*.sys
+do
+ case="`echo \"$f\" | sed -e 's:^.*/::; s/^case-//; s/\.sys$//'`"
+ set +e
+ $srcdir/r1test $case
+ rc=$?
+ set -e
+ case $rc in
+ 0) passed="$passed $case" ;;
+ 5) skipped="$skipped $case" ;;
+ *) echo
+ failed="$failed $case"
+ echo
+ ;;
+ esac
+done
+
+if [ "x$failed" = x ]
+then
+ echo "
+"
+ if [ "x$skipped" = x ]
+ then
+ echo "all tests passed."
+ else
+ echo "all applicable tests passed (skipped:$skipped)"
+ fi
+ echo
+ exit 0
+fi
+
+echo >&2 "
+AT LEAST ONE TEST FAILED
+passed tests:${passed:- NONE}
+skipped tests:${skipped:- NONE}
+failed tests:$failed
+"
+
+exit 1
diff --git a/regress/gdbwrap b/regress/gdbwrap
new file mode 100755
index 0000000..a01178b
--- /dev/null
+++ b/regress/gdbwrap
@@ -0,0 +1,37 @@
+#!/bin/sh
+set -e
+
+# For example, put this in x.gdb
+# break adns__revparse_label
+# break adns__revparse_done
+# run
+# and then
+# ADNS_TEST_DEBUG='./gdbwrap -n x.gdb' ./r1test tcpptr
+#
+# gdbwrap can be passed arguments like
+# *.gdb passed to gdb with -x
+# -n exit with exit status 5 which makes r1test think "skipped"
+#
+# other arguments are taken to be the program name provided by
+# whatever has been told to use gdbwrap (eg r1test)
+
+while true; do
+ case "$1" in
+ *.gdb) xgdb="-x $1"; shift;;
+ -n) x5='exit 5'; shift;;
+ *) break;;
+ esac
+done
+
+exe=$1; shift
+
+exec 5<&0 6>&1 7>&2
+exec 0<>/dev/tty 1>&0 2>&0
+
+set +e
+ex="set args <&5 >&6 2>&7"
+for a in "$@"; do
+ ex="$ex '$a'"
+done
+gdb --return-child-result -ex "$ex" $xgdb $exe
+$x5
diff --git a/regress/hack-query-ids b/regress/hack-query-ids
new file mode 100755
index 0000000..0c9b8d7
--- /dev/null
+++ b/regress/hack-query-ids
@@ -0,0 +1,17 @@
+#! /usr/bin/perl
+
+@seq = sort { $a <=> $b } map { hex } @ARGV;
+
+while (<STDIN>) {
+ print;
+ if (/^ (sendto fd=\d+|recvfrom=OK) addr=([0-9.]+|\[0-9a-f:]+\]).*:53/) {
+ my $line = <STDIN>;
+ if ($line !~ /^ ([0-9a-f]{4})(.*)$/s) {
+ print $line;
+ next;
+ }
+ my $qq = hex $1;
+ for my $q (@seq) { $qq++ if $qq >= $q; }
+ printf " %04x%s", ($qq & 0xffff), $2;
+ }
+}
diff --git a/regress/harness.h b/regress/harness.h
new file mode 100644
index 0000000..eae4206
--- /dev/null
+++ b/regress/harness.h
@@ -0,0 +1,44 @@
+#ifndef HARNESS_H_INCLUDED
+#define HARNESS_H_INCLUDED
+#include "internal.h"
+#include "hsyscalls.h"
+/* There is a Q function (Q for Question) for each such syscall;
+ * it constructs a string representing the call, and calls Q_str
+ * on it, or constructs it in vb and calls Q_vb;
+ */
+void Qselect( int max , const fd_set *rfds , const fd_set *wfds , const fd_set *efds , struct timeval *to );
+#ifdef HAVE_POLL
+void Qpoll( const struct pollfd *fds , int nfds , int timeout );
+#endif
+void Qsocket( int domain , int type );
+void Qfcntl( int fd , int cmd , long arg );
+void Qconnect( int fd , const struct sockaddr *addr , int addrlen );
+void Qbind( int fd , const struct sockaddr *addr , int addrlen );
+void Qlisten( int fd , int backlog );
+void Qclose( int fd );
+void Qsendto( int fd , const void *msg , int msglen , const struct sockaddr *addr , int addrlen );
+void Qrecvfrom( int fd , int buflen , int addrlen );
+void Qread( int fd , size_t buflen );
+void Qwrite( int fd , const void *buf , size_t len );
+void Q_vb(void);
+extern void Tshutdown(void);
+/* General help functions */
+void Tfailed(const char *why);
+void Toutputerr(void);
+void Tnomem(void);
+void Tfsyscallr(const char *fmt, ...) PRINTFFORMAT(1,2);
+void Tensurerecordfile(void);
+void Tmust(const char *call, const char *arg, int cond);
+void Tvbf(const char *fmt, ...) PRINTFFORMAT(1,2);
+void Tvbvf(const char *fmt, va_list al);
+void Tvbfdset(int max, const fd_set *set);
+void Tvbpollfds(const struct pollfd *fds, int nfds);
+void Tvbaddr(const struct sockaddr *addr, int addrlen);
+void Tvbbytes(const void *buf, int len);
+void Tvberrno(int e);
+void Tvba(const char *str);
+/* Shared globals */
+extern vbuf vb;
+extern struct timeval currenttime;
+extern const struct Terrno { const char *n; int v; } Terrnos[];
+#endif
diff --git a/regress/harness.h.m4 b/regress/harness.h.m4
new file mode 100644
index 0000000..bf4f308
--- /dev/null
+++ b/regress/harness.h.m4
@@ -0,0 +1,71 @@
+m4_dnl harness.h.m4
+m4_dnl (part of complex test harness, not of the library)
+m4_dnl - function and other declarations
+
+m4_dnl This file is part of adns, which is
+m4_dnl Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+m4_dnl Copyright (C) 2014 Mark Wooding
+m4_dnl Copyright (C) 1999-2000,2003,2006 Tony Finch
+m4_dnl Copyright (C) 1991 Massachusetts Institute of Technology
+m4_dnl (See the file INSTALL for full details.)
+m4_dnl
+m4_dnl This program is free software; you can redistribute it and/or modify
+m4_dnl it under the terms of the GNU General Public License as published by
+m4_dnl the Free Software Foundation; either version 3, or (at your option)
+m4_dnl any later version.
+m4_dnl
+m4_dnl This program is distributed in the hope that it will be useful,
+m4_dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+m4_dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+m4_dnl GNU General Public License for more details.
+m4_dnl
+m4_dnl You should have received a copy of the GNU General Public License
+m4_dnl along with this program; if not, write to the Free Software Foundation.
+
+m4_include(hmacros.i4)
+
+#ifndef HARNESS_H_INCLUDED
+#define HARNESS_H_INCLUDED
+
+#include "internal.h"
+#include "hsyscalls.h"
+
+/* There is a Q function (Q for Question) for each such syscall;
+ * it constructs a string representing the call, and calls Q_str
+ * on it, or constructs it in vb and calls Q_vb;
+ */
+
+hm_create_proto_q
+m4_define(`hm_syscall', `void Q$1(hm_args_massage($3,void));')
+m4_define(`hm_specsyscall', `')
+m4_include(`hsyscalls.i4')
+
+void Q_vb(void);
+
+extern void Tshutdown(void);
+
+/* General help functions */
+
+void Tfailed(const char *why);
+void Toutputerr(void);
+void Tnomem(void);
+void Tfsyscallr(const char *fmt, ...) PRINTFFORMAT(1,2);
+void Tensurerecordfile(void);
+void Tmust(const char *call, const char *arg, int cond);
+
+void Tvbf(const char *fmt, ...) PRINTFFORMAT(1,2);
+void Tvbvf(const char *fmt, va_list al);
+void Tvbfdset(int max, const fd_set *set);
+void Tvbpollfds(const struct pollfd *fds, int nfds);
+void Tvbaddr(const struct sockaddr *addr, int addrlen);
+void Tvbbytes(const void *buf, int len);
+void Tvberrno(int e);
+void Tvba(const char *str);
+
+/* Shared globals */
+
+extern vbuf vb;
+extern struct timeval currenttime;
+extern const struct Terrno { const char *n; int v; } Terrnos[];
+
+#endif
diff --git a/regress/hcommon.c b/regress/hcommon.c
new file mode 100644
index 0000000..ebbef94
--- /dev/null
+++ b/regress/hcommon.c
@@ -0,0 +1,304 @@
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "harness.h"
+#include "internal.h"
+vbuf vb;
+FILE *Toutputfile= 0;
+struct timeval currenttime;
+const struct Terrno Terrnos[]= {
+ { "EBADF", EBADF },
+ { "EAGAIN", EAGAIN },
+ { "EINPROGRESS", EINPROGRESS },
+ { "EINTR", EINTR },
+ { "EINVAL", EINVAL },
+ { "EMSGSIZE", EMSGSIZE },
+ { "ENOBUFS", ENOBUFS },
+ { "ENOENT", ENOENT },
+ { "ENOPROTOOPT", ENOPROTOOPT },
+ { "ENOSPC", ENOSPC },
+ { "EWOULDBLOCK", EWOULDBLOCK },
+ { "EHOSTUNREACH", EHOSTUNREACH },
+ { "ECONNRESET", ECONNRESET },
+ { "ECONNREFUSED", ECONNREFUSED },
+ { "EPIPE", EPIPE },
+ { "ENOTSOCK", ENOTSOCK },
+ { 0, 0 }
+};
+static vbuf vbw;
+int Hgettimeofday(struct timeval *tv, struct timezone *tz) {
+ Tensurerecordfile();
+ Tmust("gettimeofday","tz",!tz);
+ *tv= currenttime;
+ return 0;
+}
+int Hwritev(int fd, const struct iovec *vector, size_t count) {
+ size_t i;
+ vbw.used= 0;
+ for (i=0; i<count; i++, vector++) {
+ if (!adns__vbuf_append(&vbw,vector->iov_base,vector->iov_len)) Tnomem();
+ }
+ return Hwrite(fd,vbw.buf,vbw.used);
+}
+void Qselect( int max , const fd_set *rfds , const fd_set *wfds , const fd_set *efds , struct timeval *to ) {
+ vb.used= 0;
+ Tvba("select");
+ Tvbf(" max=%d",max);
+ Tvbf(" rfds="); Tvbfdset(max,rfds);
+ Tvbf(" wfds="); Tvbfdset(max,wfds);
+ Tvbf(" efds="); Tvbfdset(max,efds);
+ if (to) Tvbf(" to=%ld.%06ld",(long)to->tv_sec,(long)to->tv_usec);
+ else Tvba(" to=null");
+ Q_vb();
+}
+#ifdef HAVE_POLL
+void Qpoll( const struct pollfd *fds , int nfds , int timeout ) {
+ vb.used= 0;
+ Tvba("poll");
+ Tvbf(" fds="); Tvbpollfds(fds,nfds);
+ Tvbf(" timeout=%d",timeout);
+ Q_vb();
+}
+#endif
+void Qsocket( int domain , int type ) {
+ vb.used= 0;
+ Tvba("socket");
+ Tvbf(domain==AF_INET ? " domain=AF_INET" :
+ domain==AF_INET6 ? " domain=AF_INET6" :
+ " domain=AF_???");
+ Tvbf(type==SOCK_STREAM ? " type=SOCK_STREAM" : " type=SOCK_DGRAM");
+ Q_vb();
+}
+void Qfcntl( int fd , int cmd , long arg ) {
+ vb.used= 0;
+ Tvba("fcntl");
+ Tvbf(" fd=%d",fd);
+ if (cmd == F_SETFL) {
+ Tvbf(" cmd=F_SETFL %s",arg & O_NONBLOCK ? "O_NONBLOCK|..." : "~O_NONBLOCK&...");
+ } else if (cmd == F_GETFL) {
+ Tvba(" cmd=F_GETFL");
+ } else {
+ Tmust("cmd","F_GETFL/F_SETFL",0);
+ }
+ Q_vb();
+}
+void Qconnect( int fd , const struct sockaddr *addr , int addrlen ) {
+ vb.used= 0;
+ Tvba("connect");
+ Tvbf(" fd=%d",fd);
+ Tvba(" addr="); Tvbaddr(addr,addrlen);
+ Q_vb();
+}
+void Qbind( int fd , const struct sockaddr *addr , int addrlen ) {
+ vb.used= 0;
+ Tvba("bind");
+ Tvbf(" fd=%d",fd);
+ Tvba(" addr="); Tvbaddr(addr,addrlen);
+ Q_vb();
+}
+void Qlisten( int fd , int backlog ) {
+ vb.used= 0;
+ Tvba("listen");
+ Tvbf(" fd=%d",fd);
+ Tvbf(" backlog=%d",backlog);
+ Q_vb();
+}
+void Qclose( int fd ) {
+ vb.used= 0;
+ Tvba("close");
+ Tvbf(" fd=%d",fd);
+ Q_vb();
+}
+void Qsendto( int fd , const void *msg , int msglen , const struct sockaddr *addr , int addrlen ) {
+ vb.used= 0;
+ Tvba("sendto");
+ Tvbf(" fd=%d",fd);
+ Tvba(" addr="); Tvbaddr(addr,addrlen);
+ Tvbbytes(msg,msglen);
+ Q_vb();
+}
+void Qrecvfrom( int fd , int buflen , int addrlen ) {
+ vb.used= 0;
+ Tvba("recvfrom");
+ Tvbf(" fd=%d",fd);
+ Tvbf(" buflen=%lu",(unsigned long)buflen);
+ Q_vb();
+}
+void Qread( int fd , size_t buflen ) {
+ vb.used= 0;
+ Tvba("read");
+ Tvbf(" fd=%d",fd);
+ Tvbf(" buflen=%lu",(unsigned long)buflen);
+ Q_vb();
+}
+void Qwrite( int fd , const void *buf , size_t len ) {
+ vb.used= 0;
+ Tvba("write");
+ Tvbf(" fd=%d",fd);
+ Tvbbytes(buf,len);
+ Q_vb();
+}
+void Tvbaddr(const struct sockaddr *addr, int len) {
+ char buf[ADNS_ADDR2TEXT_BUFLEN];
+ int err, port;
+ int sz= sizeof(buf);
+ err= adns_addr2text(addr, 0, buf,&sz, &port);
+ assert(!err);
+ Tvbf(strchr(buf, ':') ? "[%s]:%d" : "%s:%d", buf,port);
+}
+void Tvbbytes(const void *buf, int len) {
+ const byte *bp;
+ int i;
+ if (!len) { Tvba("\n ."); return; }
+ for (i=0, bp=buf; i<len; i++, bp++) {
+ if (!(i&31)) Tvba("\n ");
+ else if (!(i&3)) Tvba(" ");
+ Tvbf("%02x",*bp);
+ }
+ Tvba(".");
+}
+void Tvbfdset(int max, const fd_set *fds) {
+ int i;
+ const char *comma= "";
+ Tvba("[");
+ for (i=0; i<max; i++) {
+ if (!FD_ISSET(i,fds)) continue;
+ Tvba(comma);
+ Tvbf("%d",i);
+ comma= ",";
+ }
+ Tvba("]");
+}
+static void Tvbpollevents(int events) {
+ const char *delim= "";
+ events &= (POLLIN|POLLOUT|POLLPRI);
+ if (!events) { Tvba("0"); return; }
+ if (events & POLLIN) { Tvba("POLLIN"); delim= "|"; }
+ if (events & POLLOUT) { Tvba(delim); Tvba("POLLOUT"); delim= "|"; }
+ if (events & POLLPRI) { Tvba(delim); Tvba("POLLPRI"); }
+}
+void Tvbpollfds(const struct pollfd *fds, int nfds) {
+ const char *comma= "";
+ Tvba("[");
+ while (nfds>0) {
+ Tvba(comma);
+ Tvbf("{fd=%d, events=",fds->fd);
+ Tvbpollevents(fds->events);
+ Tvba(", revents=");
+ Tvbpollevents(fds->revents);
+ Tvba("}");
+ comma= ", ";
+ nfds--; fds++;
+ }
+ Tvba("]");
+}
+void Tvberrno(int e) {
+ const struct Terrno *te;
+ for (te= Terrnos; te->n && te->v != e; te++);
+ assert(te->n);
+ Tvba(te->n);
+}
+void Tvba(const char *str) {
+ if (!adns__vbuf_appendstr(&vb,str)) Tnomem();
+}
+void Tvbvf(const char *fmt, va_list al) {
+ char buf[1000];
+ buf[sizeof(buf)-2]= '\t';
+ vsnprintf(buf,sizeof(buf),fmt,al);
+ assert(buf[sizeof(buf)-2] == '\t');
+ Tvba(buf);
+}
+void Tvbf(const char *fmt, ...) {
+ va_list al;
+ va_start(al,fmt);
+ Tvbvf(fmt,al);
+ va_end(al);
+}
+void Tmust(const char *call, const char *arg, int cond) {
+ if (cond) return;
+ fprintf(stderr,"adns test harness: case not handled: system call %s, arg %s",call,arg);
+ exit(-1);
+}
+void Tfailed(const char *why) {
+ fprintf(stderr,"adns test harness: failure: %s: %s\n",why,strerror(errno));
+ exit(-1);
+}
+void Tnomem(void) {
+ Tfailed("unable to malloc/realloc");
+}
+void Toutputerr(void) {
+ Tfailed("write error on test harness output");
+}
+struct malloced {
+ struct malloced *next, *back;
+ size_t sz;
+ unsigned long count;
+ struct { double d; long ul; void *p; void (*fp)(void); } data;
+};
+static unsigned long malloccount, mallocfailat;
+static struct { struct malloced *head, *tail; } mallocedlist;
+#define MALLOCHSZ ((char*)&mallocedlist.head->data - (char*)mallocedlist.head)
+void *Hmalloc(size_t sz) {
+ struct malloced *newnode;
+ const char *mfavar;
+ char *ep;
+ assert(sz);
+ newnode= malloc(MALLOCHSZ + sz); if (!newnode) Tnomem();
+ LIST_LINK_TAIL(mallocedlist,newnode);
+ newnode->sz= sz;
+ newnode->count= ++malloccount;
+ if (!mallocfailat) {
+ mfavar= getenv("ADNS_REGRESS_MALLOCFAILAT");
+ if (mfavar) {
+ mallocfailat= strtoul(mfavar,&ep,10);
+ if (!mallocfailat || *ep) Tfailed("ADNS_REGRESS_MALLOCFAILAT bad value");
+ } else {
+ mallocfailat= ~0UL;
+ }
+ }
+ assert(newnode->count != mallocfailat);
+ memset(&newnode->data,0xc7,sz);
+ return &newnode->data;
+}
+void Hfree(void *ptr) {
+ struct malloced *oldnode;
+ if (!ptr) return;
+ oldnode= (void*)((char*)ptr - MALLOCHSZ);
+ LIST_UNLINK(mallocedlist,oldnode);
+ memset(&oldnode->data,0x38,oldnode->sz);
+ free(oldnode);
+}
+void *Hrealloc(void *op, size_t nsz) {
+ struct malloced *oldnode;
+ void *np;
+ size_t osz;
+ if (op) { oldnode= (void*)((char*)op - MALLOCHSZ); osz= oldnode->sz; } else { osz= 0; }
+ np= Hmalloc(nsz);
+ memcpy(np,op, osz>nsz ? nsz : osz);
+ Hfree(op);
+ return np;
+}
+void Hexit(int rv) {
+ struct malloced *loopnode;
+ Tshutdown();
+ adns__vbuf_free(&vb);
+ adns__vbuf_free(&vbw);
+ if (mallocedlist.head) {
+ fprintf(stderr,"adns test harness: memory leaked:");
+ for (loopnode=mallocedlist.head; loopnode; loopnode=loopnode->next)
+ fprintf(stderr," %lu",loopnode->count);
+ putc('\n',stderr);
+ if (ferror(stderr)) exit(-1);
+ }
+ exit(rv);
+}
+pid_t Hgetpid(void) {
+ return 2264; /* just some number */
+}
diff --git a/regress/hcommon.c.m4 b/regress/hcommon.c.m4
new file mode 100644
index 0000000..c5069ee
--- /dev/null
+++ b/regress/hcommon.c.m4
@@ -0,0 +1,328 @@
+m4_dnl hcommon.c
+m4_dnl (part of complex test harness, not of the library)
+m4_dnl - routines used for both record and playback
+
+m4_dnl This file is part of adns, which is
+m4_dnl Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+m4_dnl Copyright (C) 2014 Mark Wooding
+m4_dnl Copyright (C) 1999-2000,2003,2006 Tony Finch
+m4_dnl Copyright (C) 1991 Massachusetts Institute of Technology
+m4_dnl (See the file INSTALL for full details.)
+m4_dnl
+m4_dnl This program is free software; you can redistribute it and/or modify
+m4_dnl it under the terms of the GNU General Public License as published by
+m4_dnl the Free Software Foundation; either version 3, or (at your option)
+m4_dnl any later version.
+m4_dnl
+m4_dnl This program is distributed in the hope that it will be useful,
+m4_dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+m4_dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+m4_dnl GNU General Public License for more details.
+m4_dnl
+m4_dnl You should have received a copy of the GNU General Public License
+m4_dnl along with this program; if not, write to the Free Software Foundation.
+
+m4_include(hmacros.i4)
+
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "harness.h"
+#include "internal.h"
+
+vbuf vb;
+FILE *Toutputfile= 0;
+struct timeval currenttime;
+
+const struct Terrno Terrnos[]= {
+ { "EBADF", EBADF },
+ { "EAGAIN", EAGAIN },
+ { "EINPROGRESS", EINPROGRESS },
+ { "EINTR", EINTR },
+ { "EINVAL", EINVAL },
+ { "EMSGSIZE", EMSGSIZE },
+ { "ENOBUFS", ENOBUFS },
+ { "ENOENT", ENOENT },
+ { "ENOPROTOOPT", ENOPROTOOPT },
+ { "ENOSPC", ENOSPC },
+ { "EWOULDBLOCK", EWOULDBLOCK },
+ { "EHOSTUNREACH", EHOSTUNREACH },
+ { "ECONNRESET", ECONNRESET },
+ { "ECONNREFUSED", ECONNREFUSED },
+ { "EPIPE", EPIPE },
+ { "ENOTSOCK", ENOTSOCK },
+ { 0, 0 }
+};
+
+static vbuf vbw;
+
+int Hgettimeofday(struct timeval *tv, struct timezone *tz) {
+ Tensurerecordfile();
+ Tmust("gettimeofday","tz",!tz);
+ *tv= currenttime;
+ return 0;
+}
+
+int Hwritev(int fd, const struct iovec *vector, size_t count) {
+ size_t i;
+
+ vbw.used= 0;
+ for (i=0; i<count; i++, vector++) {
+ if (!adns__vbuf_append(&vbw,vector->iov_base,vector->iov_len)) Tnomem();
+ }
+ return Hwrite(fd,vbw.buf,vbw.used);
+}
+
+m4_define(`hm_syscall', `
+ hm_create_proto_q
+void Q$1(hm_args_massage($3,void)) {
+
+ vb.used= 0;
+ Tvba("$1");
+ m4_define(`hm_na',`')
+ m4_define(`hm_arg_nullptr',`')
+ m4_define(`hm_arg_int', `Tvbf(" $'`1=%d",$'`1);')
+ m4_define(`hm_arg_fdset_io', `Tvbf(" $'`1="); Tvbfdset($'`2,$'`1);')
+ m4_define(`hm_arg_pollfds_io', `Tvbf(" $'`1="); Tvbpollfds($'`1,$'`2);')
+ m4_define(`hm_arg_timeval_in_rel_null', `
+ if ($'`1) Tvbf(" $'`1=%ld.%06ld",(long)$'`1->tv_sec,(long)$'`1->tv_usec);
+ else Tvba(" $'`1=null");')
+ m4_define(`hm_arg_must', `')
+ m4_define(`hm_arg_socktype', `
+ Tvbf($'`1==SOCK_STREAM ? " $'`1=SOCK_STREAM" : " $'`1=SOCK_DGRAM");')
+ m4_define(`hm_arg_addrfam', `
+ Tvbf($'`1==AF_INET ? " $'`1=AF_INET" :
+ $'`1==AF_INET6 ? " $'`1=AF_INET6" :
+ " $'`1=AF_???");')
+ m4_define(`hm_arg_ign', `')
+ m4_define(`hm_arg_fd', `Tvbf(" $'`1=%d",$'`1);')
+ m4_define(`hm_arg_fcntl_cmd_arg', `
+ if ($'`1 == F_SETFL) {
+ Tvbf(" $'`1=F_SETFL %s",arg & O_NONBLOCK ? "O_NONBLOCK|..." : "~O_NONBLOCK&...");
+ } else if ($'`1 == F_GETFL) {
+ Tvba(" $'`1=F_GETFL");
+ } else {
+ Tmust("$'`1","F_GETFL/F_SETFL",0);
+ }')
+ m4_define(`hm_arg_addr_in', `Tvba(" $'`1="); Tvbaddr($'`1,$'`2);')
+ m4_define(`hm_arg_bytes_in', `')
+ m4_define(`hm_arg_bytes_out', `Tvbf(" $'`4=%lu",(unsigned long)$'`4);')
+ m4_define(`hm_arg_addr_out', `')
+ $3
+
+ hm_create_nothing
+ m4_define(`hm_arg_bytes_in', `Tvbbytes($'`2,$'`4);')
+ $3
+
+ Q_vb();
+}
+')
+
+m4_define(`hm_specsyscall', `')
+
+m4_include(`hsyscalls.i4')
+
+void Tvbaddr(const struct sockaddr *addr, int len) {
+ char buf[ADNS_ADDR2TEXT_BUFLEN];
+ int err, port;
+ int sz= sizeof(buf);
+
+ err= adns_addr2text(addr, 0, buf,&sz, &port);
+ assert(!err);
+
+ Tvbf(strchr(buf, ':') ? "[%s]:%d" : "%s:%d", buf,port);
+}
+
+void Tvbbytes(const void *buf, int len) {
+ const byte *bp;
+ int i;
+
+ if (!len) { Tvba("\n ."); return; }
+ for (i=0, bp=buf; i<len; i++, bp++) {
+ if (!(i&31)) Tvba("\n ");
+ else if (!(i&3)) Tvba(" ");
+ Tvbf("%02x",*bp);
+ }
+ Tvba(".");
+}
+
+void Tvbfdset(int max, const fd_set *fds) {
+ int i;
+ const char *comma= "";
+
+ Tvba("[");
+ for (i=0; i<max; i++) {
+ if (!FD_ISSET(i,fds)) continue;
+ Tvba(comma);
+ Tvbf("%d",i);
+ comma= ",";
+ }
+ Tvba("]");
+}
+
+static void Tvbpollevents(int events) {
+ const char *delim= "";
+
+ events &= (POLLIN|POLLOUT|POLLPRI);
+ if (!events) { Tvba("0"); return; }
+ if (events & POLLIN) { Tvba("POLLIN"); delim= "|"; }
+ if (events & POLLOUT) { Tvba(delim); Tvba("POLLOUT"); delim= "|"; }
+ if (events & POLLPRI) { Tvba(delim); Tvba("POLLPRI"); }
+}
+
+void Tvbpollfds(const struct pollfd *fds, int nfds) {
+ const char *comma= "";
+
+ Tvba("[");
+ while (nfds>0) {
+ Tvba(comma);
+ Tvbf("{fd=%d, events=",fds->fd);
+ Tvbpollevents(fds->events);
+ Tvba(", revents=");
+ Tvbpollevents(fds->revents);
+ Tvba("}");
+ comma= ", ";
+ nfds--; fds++;
+ }
+ Tvba("]");
+}
+
+void Tvberrno(int e) {
+ const struct Terrno *te;
+
+ for (te= Terrnos; te->n && te->v != e; te++);
+ assert(te->n);
+ Tvba(te->n);
+}
+
+void Tvba(const char *str) {
+ if (!adns__vbuf_appendstr(&vb,str)) Tnomem();
+}
+
+void Tvbvf(const char *fmt, va_list al) {
+ char buf[1000];
+ buf[sizeof(buf)-2]= '\t';
+ vsnprintf(buf,sizeof(buf),fmt,al);
+ assert(buf[sizeof(buf)-2] == '\t');
+
+ Tvba(buf);
+}
+
+void Tvbf(const char *fmt, ...) {
+ va_list al;
+ va_start(al,fmt);
+ Tvbvf(fmt,al);
+ va_end(al);
+}
+
+
+void Tmust(const char *call, const char *arg, int cond) {
+ if (cond) return;
+ fprintf(stderr,"adns test harness: case not handled: system call %s, arg %s",call,arg);
+ exit(-1);
+}
+
+void Tfailed(const char *why) {
+ fprintf(stderr,"adns test harness: failure: %s: %s\n",why,strerror(errno));
+ exit(-1);
+}
+
+void Tnomem(void) {
+ Tfailed("unable to malloc/realloc");
+}
+
+void Toutputerr(void) {
+ Tfailed("write error on test harness output");
+}
+
+struct malloced {
+ struct malloced *next, *back;
+ size_t sz;
+ unsigned long count;
+ struct { double d; long ul; void *p; void (*fp)(void); } data;
+};
+
+static unsigned long malloccount, mallocfailat;
+static struct { struct malloced *head, *tail; } mallocedlist;
+
+#define MALLOCHSZ ((char*)&mallocedlist.head->data - (char*)mallocedlist.head)
+
+void *Hmalloc(size_t sz) {
+ struct malloced *newnode;
+ const char *mfavar;
+ char *ep;
+
+ assert(sz);
+
+ newnode= malloc(MALLOCHSZ + sz); if (!newnode) Tnomem();
+
+ LIST_LINK_TAIL(mallocedlist,newnode);
+ newnode->sz= sz;
+ newnode->count= ++malloccount;
+ if (!mallocfailat) {
+ mfavar= getenv("ADNS_REGRESS_MALLOCFAILAT");
+ if (mfavar) {
+ mallocfailat= strtoul(mfavar,&ep,10);
+ if (!mallocfailat || *ep) Tfailed("ADNS_REGRESS_MALLOCFAILAT bad value");
+ } else {
+ mallocfailat= ~0UL;
+ }
+ }
+ assert(newnode->count != mallocfailat);
+ memset(&newnode->data,0xc7,sz);
+ return &newnode->data;
+}
+
+void Hfree(void *ptr) {
+ struct malloced *oldnode;
+
+ if (!ptr) return;
+
+ oldnode= (void*)((char*)ptr - MALLOCHSZ);
+ LIST_UNLINK(mallocedlist,oldnode);
+ memset(&oldnode->data,0x38,oldnode->sz);
+ free(oldnode);
+}
+
+void *Hrealloc(void *op, size_t nsz) {
+ struct malloced *oldnode;
+ void *np;
+ size_t osz;
+
+ if (op) { oldnode= (void*)((char*)op - MALLOCHSZ); osz= oldnode->sz; } else { osz= 0; }
+ np= Hmalloc(nsz);
+ memcpy(np,op, osz>nsz ? nsz : osz);
+ Hfree(op);
+ return np;
+}
+
+void Hexit(int rv) {
+ struct malloced *loopnode;
+
+ Tshutdown();
+ adns__vbuf_free(&vb);
+ adns__vbuf_free(&vbw);
+ if (mallocedlist.head) {
+ fprintf(stderr,"adns test harness: memory leaked:");
+ for (loopnode=mallocedlist.head; loopnode; loopnode=loopnode->next)
+ fprintf(stderr," %lu",loopnode->count);
+ putc('\n',stderr);
+ if (ferror(stderr)) exit(-1);
+ }
+ exit(rv);
+}
+
+pid_t Hgetpid(void) {
+ return 2264; /* just some number */
+}
+
diff --git a/regress/hmacros.i4 b/regress/hmacros.i4
new file mode 100644
index 0000000..7212394
--- /dev/null
+++ b/regress/hmacros.i4
@@ -0,0 +1,140 @@
+m4_dnl hmacros.h.m4
+m4_dnl (part of complex test harness, not of the library)
+m4_dnl - common macros
+
+m4_dnl This file is part of adns, which is
+m4_dnl Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+m4_dnl Copyright (C) 2014 Mark Wooding
+m4_dnl Copyright (C) 1999-2000,2003,2006 Tony Finch
+m4_dnl Copyright (C) 1991 Massachusetts Institute of Technology
+m4_dnl (See the file INSTALL for full details.)
+m4_dnl
+m4_dnl This program is free software; you can redistribute it and/or modify
+m4_dnl it under the terms of the GNU General Public License as published by
+m4_dnl the Free Software Foundation; either version 3, or (at your option)
+m4_dnl any later version.
+m4_dnl
+m4_dnl This program is distributed in the hope that it will be useful,
+m4_dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+m4_dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+m4_dnl GNU General Public License for more details.
+m4_dnl
+m4_dnl You should have received a copy of the GNU General Public License
+m4_dnl along with this program; if not, write to the Free Software Foundation.
+
+m4_define(`hm_args_massage',
+ `m4_ifelse(
+ m4_patsubst(
+ $1,
+ `hm_comma\|[
+ ]+',
+ `'),
+ `',
+ `$2',
+ `m4_dnl
+ m4_patsubst(m4_patsubst(m4_patsubst(m4_translit($1, `
+ ',` '), `\(hm_comma *\)*$', `'), `^\( *hm_comma\)*', `'),
+ `\( *hm_comma *\)+',` hm_comma ')m4_dnl
+ ')')
+
+m4_define(`hm_create_nothing', `
+ m4_define(`hm_na',`')
+ m4_define(`hm_arg_nullptr', `')
+ m4_define(`hm_arg_int', `')
+ m4_define(`hm_arg_fdset_io', `')
+ m4_define(`hm_arg_pollfds_io', `')
+ m4_define(`hm_arg_timeval_in_rel_null',`')
+ m4_define(`hm_arg_must', `')
+ m4_define(`hm_arg_socktype',`')
+ m4_define(`hm_arg_addrfam',`')
+ m4_define(`hm_arg_ign', `')
+ m4_define(`hm_arg_fd', `')
+ m4_define(`hm_arg_fcntl_cmd_arg',`')
+ m4_define(`hm_arg_addr_in', `')
+ m4_define(`hm_arg_bytes_in', `')
+ m4_define(`hm_arg_bytes_out', `')
+ m4_define(`hm_arg_addr_out', `')
+')
+
+m4_define(`hm_create_proto_h',`
+ m4_define(`hm_na', `hm_comma')
+ m4_define(`hm_arg_nullptr', `$'`1 $'`2')
+ m4_define(`hm_arg_int', `int $'`1')
+ m4_define(`hm_arg_fdset_io', `fd_set *$'`1')
+ m4_define(`hm_arg_pollfds_io', `struct pollfd *$'`1 hm_comma int $'`2')
+ m4_define(`hm_arg_timeval_in_rel_null', `struct timeval *$'`1')
+ m4_define(`hm_arg_must', `$'`1 $'`2')
+ m4_define(`hm_arg_socktype', `int $'`1')
+ m4_define(`hm_arg_addrfam', `int $'`1')
+ m4_define(`hm_arg_ign', `$'`1 $'`2')
+ m4_define(`hm_arg_fd', `int $'`1')
+ m4_define(`hm_arg_fcntl_cmd_arg', `int $'`1 hm_comma ...')
+ m4_define(`hm_arg_addr_in', `const struct sockaddr *$'`1 hm_comma int $'`2')
+ m4_define(`hm_arg_bytes_in', `const $'`1 *$'`2 hm_comma $'`3 $'`4')
+ m4_define(`hm_arg_bytes_out', `$'`1 *$'`2 hm_comma $'`3 $'`4')
+ m4_define(`hm_arg_addr_out', `struct sockaddr *$'`1 hm_comma int *$'`2')
+')
+
+m4_define(`hm_create_proto_q',`
+ hm_create_proto_h
+ m4_define(`hm_arg_nullptr', `')
+ m4_define(`hm_arg_fdset_io', `const fd_set *$'`1')
+ m4_define(`hm_arg_pollfds_io', `const struct pollfd *$'`1 hm_comma int $'`2')
+ m4_define(`hm_arg_must', `')
+ m4_define(`hm_arg_ign', `')
+ m4_define(`hm_arg_fcntl_cmd_arg', `int $'`1 hm_comma long $'`2')
+ m4_define(`hm_arg_bytes_out', `$'`3 $'`4')
+ m4_define(`hm_arg_addr_out', `int $'`2')
+')
+
+m4_define(`hm_create_hqcall_vars',`
+ hm_create_nothing
+ m4_define(`hm_arg_fcntl_cmd_arg',`va_list al; long $'`2;')
+')
+
+m4_define(`hm_create_hqcall_init',`
+ hm_create_nothing
+ m4_define(`hm_arg_nullptr', `Tmust("$1","$'`2",!$'`2);')
+ m4_define(`hm_arg_must', `Tmust("$1","$'`2",$'`2==$'`3);')
+ m4_define(`hm_arg_socktype',`
+ Tmust("$1","$'`1",$'`1==SOCK_STREAM || $'`1==SOCK_DGRAM);')
+ m4_define(`hm_arg_addrfam',`
+ Tmust("$1","$'`1",$'`1==AF_INET || $'`1==AF_INET6);')
+ m4_define(`hm_arg_fcntl_cmd_arg',`
+ Tmust("$1","$'`1",$'`1==F_SETFL || $'`1==F_GETFL);
+ if ($'`1 == F_SETFL) {
+ va_start(al,$'`1); $'`2= va_arg(al,long); va_end(al);
+ } else {
+ $'`2= 0;
+ }')
+ m4_define(`hm_arg_addr_out',`Tmust("$1","*$'`2",*$'`2>=sizeof(struct sockaddr_in));')
+')
+
+m4_define(`hm_create_realcall_args',`
+ m4_define(`hm_na',`hm_comma')
+ m4_define(`hm_arg_nullptr', `0')
+ m4_define(`hm_arg_int', `$'`1')
+ m4_define(`hm_arg_fdset_io', `$'`1')
+ m4_define(`hm_arg_pollfds_io', `$'`1 hm_comma $'`2')
+ m4_define(`hm_arg_timeval_in_rel_null', `$'`1')
+ m4_define(`hm_arg_must', `$'`2')
+ m4_define(`hm_arg_socktype', `$'`1')
+ m4_define(`hm_arg_addrfam', `$'`1')
+ m4_define(`hm_arg_ign', `$'`2')
+ m4_define(`hm_arg_fd', `$'`1')
+ m4_define(`hm_arg_fcntl_cmd_arg', `$'`1 hm_comma $'`2')
+ m4_define(`hm_arg_addr_in', `$'`1 hm_comma $'`2')
+ m4_define(`hm_arg_bytes_in', `$'`2 hm_comma $'`4')
+ m4_define(`hm_arg_bytes_out', `$'`2 hm_comma $'`4')
+ m4_define(`hm_arg_addr_out', `$'`1 hm_comma $'`2')
+')
+
+m4_define(`hm_create_hqcall_args',`
+ hm_create_realcall_args
+ m4_define(`hm_arg_nullptr', `')
+ m4_define(`hm_arg_must', `')
+ m4_define(`hm_arg_ign', `')
+ m4_define(`hm_arg_bytes_in', `$'`2 hm_comma $'`4')
+ m4_define(`hm_arg_bytes_out', `$'`4')
+ m4_define(`hm_arg_addr_out', `*$'`2')
+')
diff --git a/regress/hplayback.c b/regress/hplayback.c
new file mode 100644
index 0000000..279934c
--- /dev/null
+++ b/regress/hplayback.c
@@ -0,0 +1,594 @@
+#include <assert.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "harness.h"
+static FILE *Tinputfile, *Treportfile;
+static vbuf vb2;
+extern void Tshutdown(void) {
+ adns__vbuf_free(&vb2);
+}
+static void Tensurereportfile(void) {
+ const char *fdstr;
+ int fd;
+ if (Treportfile) return;
+ Treportfile= stderr;
+ fdstr= getenv("ADNS_TEST_REPORT_FD"); if (!fdstr) return;
+ fd= atoi(fdstr);
+ Treportfile= fdopen(fd,"a"); if (!Treportfile) Tfailed("fdopen ADNS_TEST_REPORT_FD");
+}
+static void Psyntax(const char *where) {
+ fprintf(stderr,"adns test harness: syntax error in test log input file: %s\n",where);
+ exit(-1);
+}
+static void Pcheckinput(void) {
+ if (ferror(Tinputfile)) Tfailed("read test log input file");
+ if (feof(Tinputfile)) Psyntax("eof at syscall reply");
+}
+void Tensurerecordfile(void) {
+ const char *fdstr;
+ int fd;
+ int chars;
+ unsigned long sec, usec;
+ if (Tinputfile) return;
+ Tinputfile= stdin;
+ fdstr= getenv("ADNS_TEST_IN_FD");
+ if (fdstr) {
+ fd= atoi(fdstr);
+ Tinputfile= fdopen(fd,"r"); if (!Tinputfile) Tfailed("fdopen ADNS_TEST_IN_FD");
+ }
+ setvbuf(Tinputfile,0,_IONBF,0);
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ chars= -1;
+ sscanf(vb2.buf," start %lu.%lu%n",&sec,&usec,&chars);
+ if (chars==-1) Psyntax("start time invalid");
+ currenttime.tv_sec= sec;
+ currenttime.tv_usec= usec;
+ if (vb2.buf[chars] != '\n') Psyntax("not newline after start time");
+}
+static void Parg(const char *argname) {
+ int l;
+ if (vb2.buf[vb2.used++] != ' ') Psyntax("not a space before argument");
+ l= strlen(argname);
+ if (memcmp(vb2.buf+vb2.used,argname,l)) Psyntax("argument name wrong");
+ vb2.used+= l;
+ if (vb2.buf[vb2.used++] != '=') Psyntax("not = after argument name");
+}
+static int Pstring_maybe(const char *string) {
+ int l;
+ l= strlen(string);
+ if (memcmp(vb2.buf+vb2.used,string,l)) return 0;
+ vb2.used+= l;
+ return 1;
+}
+static void Pstring(const char *string, const char *emsg) {
+ if (Pstring_maybe(string)) return;
+ Psyntax(emsg);
+}
+static int Perrno(const char *stuff) {
+ const struct Terrno *te;
+ int r;
+ char *ep;
+ for (te= Terrnos; te->n && strcmp(te->n,stuff); te++);
+ if (te->n) return te->v;
+ r= strtoul(stuff+2,&ep,10);
+ if (*ep) Psyntax("errno value not recognised, not numeric");
+ return r;
+}
+static void P_updatetime(void) {
+ int chars;
+ unsigned long sec, usec;
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ chars= -1;
+ sscanf(vb2.buf," +%lu.%lu%n",&sec,&usec,&chars);
+ if (chars==-1) Psyntax("update time invalid");
+ currenttime.tv_sec+= sec;
+ currenttime.tv_usec+= usec;
+ if (currenttime.tv_usec > 1000000) {
+ currenttime.tv_sec++;
+ currenttime.tv_usec -= 1000000;
+ }
+ if (vb2.buf[chars] != '\n') Psyntax("not newline after update time");
+}
+static void Pfdset(fd_set *set, int max) {
+ int r, c;
+ char *ep;
+ if (vb2.buf[vb2.used++] != '[') Psyntax("fd set start not [");
+ FD_ZERO(set);
+ if (vb2.buf[vb2.used] == ']') { vb2.used++; return; }
+ for (;;) {
+ r= strtoul(vb2.buf+vb2.used,&ep,10);
+ if (r>=max) Psyntax("fd set member > max");
+ if (ep == (char*)vb2.buf+vb2.used) Psyntax("empty entry in fd set");
+ FD_SET(r,set);
+ vb2.used= ep - (char*)vb2.buf;
+ c= vb2.buf[vb2.used++];
+ if (c == ']') break;
+ if (c != ',') Psyntax("fd set separator not ,");
+ }
+}
+#ifdef HAVE_POLL
+static int Ppollfdevents(void) {
+ int events;
+ if (Pstring_maybe("0")) return 0;
+ events= 0;
+ if (Pstring_maybe("POLLIN")) {
+ events |= POLLIN;
+ if (!Pstring_maybe("|")) return events;
+ }
+ if (Pstring_maybe("POLLOUT")) {
+ events |= POLLOUT;
+ if (!Pstring_maybe("|")) return events;
+ }
+ Pstring("POLLPRI","pollfdevents PRI?");
+ return events;
+}
+static void Ppollfds(struct pollfd *fds, int nfds) {
+ int i;
+ char *ep;
+ const char *comma= "";
+ if (vb2.buf[vb2.used++] != '[') Psyntax("pollfds start not [");
+ for (i=0; i<nfds; i++) {
+ Pstring("{fd=","{fd= in pollfds");
+ fds->fd= strtoul(vb2.buf+vb2.used,&ep,10);
+ vb2.used= ep - (char*)vb2.buf;
+ Pstring(", events=",", events= in pollfds");
+ fds->events= Ppollfdevents();
+ Pstring(", revents=",", revents= in pollfds");
+ fds->revents= Ppollfdevents();
+ Pstring("}","} in pollfds");
+ Pstring(comma,"separator in pollfds");
+ comma= ", ";
+ }
+ if (vb2.buf[vb2.used++] != ']') Psyntax("pollfds end not ]");
+}
+#endif
+static void Paddr(struct sockaddr *addr, int *lenr) {
+ adns_rr_addr a;
+ char *p, *q, *ep;
+ int err;
+ unsigned long ul;
+ p= vb2.buf+vb2.used;
+ if (*p!='[') {
+ q= strchr(p,':');
+ if (!q) Psyntax("missing :");
+ *q++= 0;
+ } else {
+ p++;
+ q= strchr(p,']');
+ if (!q) Psyntax("missing ]");
+ *q++= 0;
+ if (*q!=':') Psyntax("expected : after ]");
+ q++;
+ }
+ ul= strtoul(q,&ep,10);
+ if (*ep && *ep != ' ') Psyntax("invalid port (bad syntax)");
+ if (ul >= 65536) Psyntax("port too large");
+ a.len= sizeof(a.addr);
+ err= adns_text2addr(p, (int)ul, 0, &a.addr.sa,&a.len);
+ if (err) Psyntax("invalid address");
+ assert(*lenr >= a.len);
+ memcpy(addr, &a.addr, a.len);
+ *lenr= a.len;
+ vb2.used= ep - (char*)vb2.buf;
+}
+static int Pbytes(byte *buf, int maxlen) {
+ static const char hexdigits[]= "0123456789abcdef";
+ int c, v, done;
+ const char *pf;
+ done= 0;
+ for (;;) {
+ c= getc(Tinputfile); Pcheckinput();
+ if (c=='\n' || c==' ' || c=='\t') continue;
+ if (c=='.') break;
+ pf= strchr(hexdigits,c); if (!pf) Psyntax("invalid first hex digit");
+ v= (pf-hexdigits)<<4;
+ c= getc(Tinputfile); Pcheckinput();
+ pf= strchr(hexdigits,c); if (!pf) Psyntax("invalid second hex digit");
+ v |= (pf-hexdigits);
+ if (maxlen<=0) Psyntax("buffer overflow in bytes");
+ *buf++= v;
+ maxlen--; done++;
+ }
+ for (;;) {
+ c= getc(Tinputfile); Pcheckinput();
+ if (c=='\n') return done;
+ }
+}
+void Q_vb(void) {
+ const char *nl;
+ Tensurerecordfile();
+ if (!adns__vbuf_ensure(&vb2,vb.used+2)) Tnomem();
+ fread(vb2.buf,1,vb.used+2,Tinputfile);
+ if (feof(Tinputfile)) {
+ fprintf(stderr,"adns test harness: input ends prematurely; program did:\n %.*s\n",
+ vb.used,vb.buf);
+ exit(-1);
+ }
+ Pcheckinput();
+ if (vb2.buf[0] != ' ') Psyntax("not space before call");
+ if (memcmp(vb.buf,vb2.buf+1,vb.used) ||
+ vb2.buf[vb.used+1] != '\n') {
+ fprintf(stderr,
+ "adns test harness: program did unexpected:\n %.*s\n"
+ "was expecting:\n %.*s\n",
+ vb.used,vb.buf, vb.used,vb2.buf+1);
+ exit(1);
+ }
+ Tensurereportfile();
+ nl= memchr(vb.buf,'\n',vb.used);
+ fprintf(Treportfile," %.*s\n", (int)(nl ? nl - (const char*)vb.buf : vb.used), vb.buf);
+}
+int Hselect( int max , fd_set *rfds , fd_set *wfds , fd_set *efds , struct timeval *to ) {
+ int r, amtread;
+ char *ep;
+ Qselect( max , rfds , wfds , efds , to );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," select=",8)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[8] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+8);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ r= strtoul(vb2.buf+8,&ep,10);
+ if (*ep && *ep!=' ') Psyntax("return value not E* or positive number");
+ vb2.used= ep - (char*)vb2.buf;
+ Parg("rfds"); Pfdset(rfds,max);
+ Parg("wfds"); Pfdset(wfds,max);
+ Parg("efds"); Pfdset(efds,max);
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
+#ifdef HAVE_POLL
+int Hpoll( struct pollfd *fds , int nfds , int timeout ) {
+ int r, amtread;
+ char *ep;
+ Qpoll( fds , nfds , timeout );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," poll=",6)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[6] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+6);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ r= strtoul(vb2.buf+6,&ep,10);
+ if (*ep && *ep!=' ') Psyntax("return value not E* or positive number");
+ vb2.used= ep - (char*)vb2.buf;
+ Parg("fds"); Ppollfds(fds,nfds);
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
+#endif
+int Hsocket( int domain , int type , int protocol ) {
+ int r, amtread;
+ char *ep;
+ Tmust("socket","domain",domain==AF_INET || domain==AF_INET6);
+ Tmust("socket","type",type==SOCK_STREAM || type==SOCK_DGRAM);
+ Qsocket( domain , type );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," socket=",8)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[8] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+8);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ r= strtoul(vb2.buf+8,&ep,10);
+ if (*ep && *ep!=' ') Psyntax("return value not E* or positive number");
+ vb2.used= ep - (char*)vb2.buf;
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
+int Hfcntl( int fd , int cmd , ... ) {
+ int r, amtread;
+ va_list al; long arg;
+ Tmust("fcntl","cmd",cmd==F_SETFL || cmd==F_GETFL);
+ if (cmd == F_SETFL) {
+ va_start(al,cmd); arg= va_arg(al,long); va_end(al);
+ } else {
+ arg= 0;
+ }
+ Qfcntl( fd , cmd , arg );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," fcntl=",7)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[7] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+7);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ r= 0;
+ if (cmd == F_GETFL) {
+ if (!memcmp(vb2.buf+7,"O_NONBLOCK|...",14)) {
+ r= O_NONBLOCK;
+ vb2.used= 7+14;
+ } else if (!memcmp(vb2.buf+7,"~O_NONBLOCK&...",15)) {
+ vb2.used= 7+15;
+ } else {
+ Psyntax("fcntl flags not O_NONBLOCK|... or ~O_NONBLOCK&...");
+ }
+ } else if (cmd == F_SETFL) {
+ if (memcmp(vb2.buf+7,"OK",2)) Psyntax("success/fail not E* or OK");
+ vb2.used= 7+2;
+ r= 0;
+ } else {
+ Psyntax("fcntl not F_GETFL or F_SETFL");
+ }
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
+int Hconnect( int fd , const struct sockaddr *addr , int addrlen ) {
+ int r, amtread;
+ Qconnect( fd , addr , addrlen );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," connect=",9)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[9] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+9);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ if (memcmp(vb2.buf+9,"OK",2)) Psyntax("success/fail not E* or OK");
+ vb2.used= 9+2;
+ r= 0;
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
+int Hbind( int fd , const struct sockaddr *addr , int addrlen ) {
+ int r, amtread;
+ Qbind( fd , addr , addrlen );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," bind=",6)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[6] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+6);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ if (memcmp(vb2.buf+6,"OK",2)) Psyntax("success/fail not E* or OK");
+ vb2.used= 6+2;
+ r= 0;
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
+int Hlisten( int fd , int backlog ) {
+ int r, amtread;
+ Qlisten( fd , backlog );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," listen=",8)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[8] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+8);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ if (memcmp(vb2.buf+8,"OK",2)) Psyntax("success/fail not E* or OK");
+ vb2.used= 8+2;
+ r= 0;
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
+int Hclose( int fd ) {
+ int r, amtread;
+ Qclose( fd );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," close=",7)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[7] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+7);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ if (memcmp(vb2.buf+7,"OK",2)) Psyntax("success/fail not E* or OK");
+ vb2.used= 7+2;
+ r= 0;
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
+int Hsendto( int fd , const void *msg , int msglen , unsigned int flags , const struct sockaddr *addr , int addrlen ) {
+ int r, amtread;
+ char *ep;
+ Tmust("sendto","flags",flags==0);
+ Qsendto( fd , msg , msglen , addr , addrlen );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," sendto=",8)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[8] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+8);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ r= strtoul(vb2.buf+8,&ep,10);
+ if (*ep && *ep!=' ') Psyntax("return value not E* or positive number");
+ vb2.used= ep - (char*)vb2.buf;
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
+int Hrecvfrom( int fd , void *buf , int buflen , unsigned int flags , struct sockaddr *addr , int *addrlen ) {
+ int r, amtread;
+ Tmust("recvfrom","flags",flags==0);
+ Tmust("recvfrom","*addrlen",*addrlen>=sizeof(struct sockaddr_in));
+ Qrecvfrom( fd , buflen , *addrlen );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," recvfrom=",10)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[10] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+10);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ if (memcmp(vb2.buf+10,"OK",2)) Psyntax("success/fail not E* or OK");
+ vb2.used= 10+2;
+ r= 0;
+ Parg("addr"); Paddr(addr,addrlen);
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ r= Pbytes(buf,buflen);
+ P_updatetime();
+ return r;
+}
+int Hread( int fd , void *buf , size_t buflen ) {
+ int r, amtread;
+ Qread( fd , buflen );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," read=",6)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[6] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+6);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ if (memcmp(vb2.buf+6,"OK",2)) Psyntax("success/fail not E* or OK");
+ vb2.used= 6+2;
+ r= 0;
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ r= Pbytes(buf,buflen);
+ P_updatetime();
+ return r;
+}
+int Hwrite( int fd , const void *buf , size_t len ) {
+ int r, amtread;
+ char *ep;
+ Qwrite( fd , buf , len );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," write=",7)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[7] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+7);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ r= strtoul(vb2.buf+7,&ep,10);
+ if (*ep && *ep!=' ') Psyntax("return value not E* or positive number");
+ vb2.used= ep - (char*)vb2.buf;
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
diff --git a/regress/hplayback.c.m4 b/regress/hplayback.c.m4
new file mode 100644
index 0000000..475144a
--- /dev/null
+++ b/regress/hplayback.c.m4
@@ -0,0 +1,389 @@
+m4_dnl hplayback.c.m4
+m4_dnl (part of complex test harness, not of the library)
+m4_dnl - playback routines
+
+m4_dnl This file is part of adns, which is
+m4_dnl Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+m4_dnl Copyright (C) 2014 Mark Wooding
+m4_dnl Copyright (C) 1999-2000,2003,2006 Tony Finch
+m4_dnl Copyright (C) 1991 Massachusetts Institute of Technology
+m4_dnl (See the file INSTALL for full details.)
+m4_dnl
+m4_dnl This program is free software; you can redistribute it and/or modify
+m4_dnl it under the terms of the GNU General Public License as published by
+m4_dnl the Free Software Foundation; either version 3, or (at your option)
+m4_dnl any later version.
+m4_dnl
+m4_dnl This program is distributed in the hope that it will be useful,
+m4_dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+m4_dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+m4_dnl GNU General Public License for more details.
+m4_dnl
+m4_dnl You should have received a copy of the GNU General Public License
+m4_dnl along with this program; if not, write to the Free Software Foundation.
+
+m4_include(hmacros.i4)
+
+#include <assert.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/time.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "harness.h"
+
+static FILE *Tinputfile, *Treportfile;
+static vbuf vb2;
+
+extern void Tshutdown(void) {
+ adns__vbuf_free(&vb2);
+}
+
+static void Tensurereportfile(void) {
+ const char *fdstr;
+ int fd;
+
+ if (Treportfile) return;
+ Treportfile= stderr;
+ fdstr= getenv("ADNS_TEST_REPORT_FD"); if (!fdstr) return;
+ fd= atoi(fdstr);
+ Treportfile= fdopen(fd,"a"); if (!Treportfile) Tfailed("fdopen ADNS_TEST_REPORT_FD");
+}
+
+static void Psyntax(const char *where) {
+ fprintf(stderr,"adns test harness: syntax error in test log input file: %s\n",where);
+ exit(-1);
+}
+
+static void Pcheckinput(void) {
+ if (ferror(Tinputfile)) Tfailed("read test log input file");
+ if (feof(Tinputfile)) Psyntax("eof at syscall reply");
+}
+
+void Tensurerecordfile(void) {
+ const char *fdstr;
+ int fd;
+ int chars;
+ unsigned long sec, usec;
+
+ if (Tinputfile) return;
+ Tinputfile= stdin;
+ fdstr= getenv("ADNS_TEST_IN_FD");
+ if (fdstr) {
+ fd= atoi(fdstr);
+ Tinputfile= fdopen(fd,"r"); if (!Tinputfile) Tfailed("fdopen ADNS_TEST_IN_FD");
+ }
+ setvbuf(Tinputfile,0,_IONBF,0);
+
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ chars= -1;
+ sscanf(vb2.buf," start %lu.%lu%n",&sec,&usec,&chars);
+ if (chars==-1) Psyntax("start time invalid");
+ currenttime.tv_sec= sec;
+ currenttime.tv_usec= usec;
+ if (vb2.buf[chars] != hm_squote\nhm_squote) Psyntax("not newline after start time");
+}
+
+static void Parg(const char *argname) {
+ int l;
+
+ if (vb2.buf[vb2.used++] != hm_squote hm_squote) Psyntax("not a space before argument");
+ l= strlen(argname);
+ if (memcmp(vb2.buf+vb2.used,argname,l)) Psyntax("argument name wrong");
+ vb2.used+= l;
+ if (vb2.buf[vb2.used++] != hm_squote=hm_squote) Psyntax("not = after argument name");
+}
+
+static int Pstring_maybe(const char *string) {
+ int l;
+
+ l= strlen(string);
+ if (memcmp(vb2.buf+vb2.used,string,l)) return 0;
+ vb2.used+= l;
+ return 1;
+}
+
+static void Pstring(const char *string, const char *emsg) {
+ if (Pstring_maybe(string)) return;
+ Psyntax(emsg);
+}
+
+static int Perrno(const char *stuff) {
+ const struct Terrno *te;
+ int r;
+ char *ep;
+
+ for (te= Terrnos; te->n && strcmp(te->n,stuff); te++);
+ if (te->n) return te->v;
+ r= strtoul(stuff+2,&ep,10);
+ if (*ep) Psyntax("errno value not recognised, not numeric");
+ return r;
+}
+
+static void P_updatetime(void) {
+ int chars;
+ unsigned long sec, usec;
+
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ chars= -1;
+ sscanf(vb2.buf," +%lu.%lu%n",&sec,&usec,&chars);
+ if (chars==-1) Psyntax("update time invalid");
+ currenttime.tv_sec+= sec;
+ currenttime.tv_usec+= usec;
+ if (currenttime.tv_usec > 1000000) {
+ currenttime.tv_sec++;
+ currenttime.tv_usec -= 1000000;
+ }
+ if (vb2.buf[chars] != hm_squote\nhm_squote) Psyntax("not newline after update time");
+}
+
+static void Pfdset(fd_set *set, int max) {
+ int r, c;
+ char *ep;
+
+ if (vb2.buf[vb2.used++] != hm_squote[hm_squote) Psyntax("fd set start not [");
+ FD_ZERO(set);
+ if (vb2.buf[vb2.used] == hm_squote]hm_squote) { vb2.used++; return; }
+ for (;;) {
+ r= strtoul(vb2.buf+vb2.used,&ep,10);
+ if (r>=max) Psyntax("fd set member > max");
+ if (ep == (char*)vb2.buf+vb2.used) Psyntax("empty entry in fd set");
+ FD_SET(r,set);
+ vb2.used= ep - (char*)vb2.buf;
+ c= vb2.buf[vb2.used++];
+ if (c == hm_squote]hm_squote) break;
+ if (c != hm_squote,hm_squote) Psyntax("fd set separator not ,");
+ }
+}
+
+#ifdef HAVE_POLL
+static int Ppollfdevents(void) {
+ int events;
+
+ if (Pstring_maybe("0")) return 0;
+ events= 0;
+
+ if (Pstring_maybe("POLLIN")) {
+ events |= POLLIN;
+ if (!Pstring_maybe("|")) return events;
+ }
+
+ if (Pstring_maybe("POLLOUT")) {
+ events |= POLLOUT;
+ if (!Pstring_maybe("|")) return events;
+ }
+
+ Pstring("POLLPRI","pollfdevents PRI?");
+ return events;
+}
+
+static void Ppollfds(struct pollfd *fds, int nfds) {
+ int i;
+ char *ep;
+ const char *comma= "";
+
+ if (vb2.buf[vb2.used++] != hm_squote[hm_squote) Psyntax("pollfds start not [");
+ for (i=0; i<nfds; i++) {
+ Pstring("{fd=","{fd= in pollfds");
+ fds->fd= strtoul(vb2.buf+vb2.used,&ep,10);
+ vb2.used= ep - (char*)vb2.buf;
+ Pstring(", events=",", events= in pollfds");
+ fds->events= Ppollfdevents();
+ Pstring(", revents=",", revents= in pollfds");
+ fds->revents= Ppollfdevents();
+ Pstring("}","} in pollfds");
+ Pstring(comma,"separator in pollfds");
+ comma= ", ";
+ }
+ if (vb2.buf[vb2.used++] != hm_squote]hm_squote) Psyntax("pollfds end not ]");
+}
+#endif
+
+static void Paddr(struct sockaddr *addr, int *lenr) {
+ adns_rr_addr a;
+ char *p, *q, *ep;
+ int err;
+ unsigned long ul;
+
+ p= vb2.buf+vb2.used;
+ if (*p!='[') {
+ q= strchr(p,':');
+ if (!q) Psyntax("missing :");
+ *q++= 0;
+ } else {
+ p++;
+ q= strchr(p,']');
+ if (!q) Psyntax("missing ]");
+ *q++= 0;
+ if (*q!=':') Psyntax("expected : after ]");
+ q++;
+ }
+ ul= strtoul(q,&ep,10);
+ if (*ep && *ep != ' ') Psyntax("invalid port (bad syntax)");
+ if (ul >= 65536) Psyntax("port too large");
+
+ a.len= sizeof(a.addr);
+ err= adns_text2addr(p, (int)ul, 0, &a.addr.sa,&a.len);
+ if (err) Psyntax("invalid address");
+
+ assert(*lenr >= a.len);
+ memcpy(addr, &a.addr, a.len);
+ *lenr= a.len;
+ vb2.used= ep - (char*)vb2.buf;
+}
+
+static int Pbytes(byte *buf, int maxlen) {
+ static const char hexdigits[]= "0123456789abcdef";
+
+ int c, v, done;
+ const char *pf;
+
+ done= 0;
+ for (;;) {
+ c= getc(Tinputfile); Pcheckinput();
+ if (c=='\n' || c==' ' || c=='\t') continue;
+ if (c=='.') break;
+ pf= strchr(hexdigits,c); if (!pf) Psyntax("invalid first hex digit");
+ v= (pf-hexdigits)<<4;
+ c= getc(Tinputfile); Pcheckinput();
+ pf= strchr(hexdigits,c); if (!pf) Psyntax("invalid second hex digit");
+ v |= (pf-hexdigits);
+ if (maxlen<=0) Psyntax("buffer overflow in bytes");
+ *buf++= v;
+ maxlen--; done++;
+ }
+ for (;;) {
+ c= getc(Tinputfile); Pcheckinput();
+ if (c=='\n') return done;
+ }
+}
+
+void Q_vb(void) {
+ const char *nl;
+
+ Tensurerecordfile();
+ if (!adns__vbuf_ensure(&vb2,vb.used+2)) Tnomem();
+ fread(vb2.buf,1,vb.used+2,Tinputfile);
+ if (feof(Tinputfile)) {
+ fprintf(stderr,"adns test harness: input ends prematurely; program did:\n %.*s\n",
+ vb.used,vb.buf);
+ exit(-1);
+ }
+ Pcheckinput();
+ if (vb2.buf[0] != hm_squote hm_squote) Psyntax("not space before call");
+ if (memcmp(vb.buf,vb2.buf+1,vb.used) ||
+ vb2.buf[vb.used+1] != hm_squote\nhm_squote) {
+ fprintf(stderr,
+ "adns test harness: program did unexpected:\n %.*s\n"
+ "was expecting:\n %.*s\n",
+ vb.used,vb.buf, vb.used,vb2.buf+1);
+ exit(1);
+ }
+ Tensurereportfile();
+ nl= memchr(vb.buf,'\n',vb.used);
+ fprintf(Treportfile," %.*s\n", (int)(nl ? nl - (const char*)vb.buf : vb.used), vb.buf);
+}
+
+m4_define(`hm_syscall', `
+ hm_create_proto_h
+int H$1(hm_args_massage($3,void)) {
+ int r, amtread;
+ m4_define(`hm_rv_fd',`char *ep;')
+ m4_define(`hm_rv_any',`char *ep;')
+ m4_define(`hm_rv_len',`')
+ m4_define(`hm_rv_must',`')
+ m4_define(`hm_rv_succfail',`')
+ m4_define(`hm_rv_fcntl',`')
+ $2
+
+ hm_create_hqcall_vars
+ $3
+
+ hm_create_hqcall_init($1)
+ $3
+
+ hm_create_hqcall_args
+ Q$1(hm_args_massage($3));
+
+ m4_define(`hm_r_offset',`m4_len(` $1=')')
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!=hm_squote\nhm_squote)
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," $1=",hm_r_offset)) Psyntax("syscall reply mismatch");
+
+ if (vb2.buf[hm_r_offset] == hm_squoteEhm_squote) {
+ int e;
+ e= Perrno(vb2.buf+hm_r_offset);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+
+ m4_define(`hm_rv_succfail',`
+ if (memcmp(vb2.buf+hm_r_offset,"OK",2)) Psyntax("success/fail not E* or OK");
+ vb2.used= hm_r_offset+2;
+ r= 0;
+ ')
+ m4_define(`hm_rv_len',`hm_rv_succfail')
+ m4_define(`hm_rv_must',`hm_rv_succfail')
+ m4_define(`hm_rv_any',`
+ r= strtoul(vb2.buf+hm_r_offset,&ep,10);
+ if (*ep && *ep!=hm_squote hm_squote) Psyntax("return value not E* or positive number");
+ vb2.used= ep - (char*)vb2.buf;
+ ')
+ m4_define(`hm_rv_fd',`hm_rv_any')
+ m4_define(`hm_rv_fcntl',`
+ r= 0;
+ if (cmd == F_GETFL) {
+ if (!memcmp(vb2.buf+hm_r_offset,"O_NONBLOCK|...",14)) {
+ r= O_NONBLOCK;
+ vb2.used= hm_r_offset+14;
+ } else if (!memcmp(vb2.buf+hm_r_offset,"~O_NONBLOCK&...",15)) {
+ vb2.used= hm_r_offset+15;
+ } else {
+ Psyntax("fcntl flags not O_NONBLOCK|... or ~O_NONBLOCK&...");
+ }
+ } else if (cmd == F_SETFL) {
+ hm_rv_succfail
+ } else {
+ Psyntax("fcntl not F_GETFL or F_SETFL");
+ }
+ ')
+ $2
+
+ hm_create_nothing
+ m4_define(`hm_arg_fdset_io',`Parg("$'`1"); Pfdset($'`1,$'`2);')
+ m4_define(`hm_arg_pollfds_io',`Parg("$'`1"); Ppollfds($'`1,$'`2);')
+ m4_define(`hm_arg_addr_out',`Parg("$'`1"); Paddr($'`1,$'`2);')
+ $3
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+
+ hm_create_nothing
+ m4_define(`hm_arg_bytes_out',`r= Pbytes($'`2,$'`4);')
+ $3
+
+ P_updatetime();
+ return r;
+}
+')
+
+m4_define(`hm_specsyscall', `')
+
+m4_include(`hsyscalls.i4')
diff --git a/regress/hrecord.c b/regress/hrecord.c
new file mode 100644
index 0000000..dec099b
--- /dev/null
+++ b/regress/hrecord.c
@@ -0,0 +1,257 @@
+#include <assert.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "harness.h"
+static FILE *Toutputfile;
+void Tshutdown(void) {
+}
+static void R_recordtime(void) {
+ int r;
+ struct timeval tv, tvrel;
+ Tensurerecordfile();
+ r= gettimeofday(&tv,0); if (r) Tfailed("gettimeofday syscallbegin");
+ tvrel.tv_sec= tv.tv_sec - currenttime.tv_sec;
+ tvrel.tv_usec= tv.tv_usec - currenttime.tv_usec;
+ if (tv.tv_usec < 0) { tvrel.tv_usec += 1000000; tvrel.tv_sec--; }
+ Tvbf("\n +%ld.%06ld",(long)tvrel.tv_sec,(long)tvrel.tv_usec);
+ currenttime= tv;
+}
+void Tensurerecordfile(void) {
+ const char *fdstr;
+ int fd, r;
+ if (Toutputfile) return;
+ Toutputfile= stdout;
+ fdstr= getenv("ADNS_TEST_OUT_FD");
+ if (fdstr) {
+ fd= atoi(fdstr);
+ Toutputfile= fdopen(fd,"a"); if (!Toutputfile) Tfailed("fdopen ADNS_TEST_OUT_FD");
+ }
+ r= gettimeofday(&currenttime,0); if (r) Tfailed("gettimeofday syscallbegin");
+ if (fprintf(Toutputfile," start %ld.%06ld\n",
+ (long)currenttime.tv_sec,(long)currenttime.tv_usec) == EOF) Toutputerr();
+}
+void Q_vb(void) {
+ if (!adns__vbuf_append(&vb,"",1)) Tnomem();
+ Tensurerecordfile();
+ if (fprintf(Toutputfile," %s\n",vb.buf) == EOF) Toutputerr();
+ if (fflush(Toutputfile)) Toutputerr();
+}
+static void R_vb(void) {
+ Q_vb();
+}
+int Hselect( int max , fd_set *rfds , fd_set *wfds , fd_set *efds , struct timeval *to ) {
+ int r, e;
+ Qselect( max , rfds , wfds , efds , to );
+ r= select( max , rfds , wfds , efds , to );
+ e= errno;
+ vb.used= 0;
+ Tvba("select=");
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ Tvbf("%d",r);
+ Tvba(" rfds="); Tvbfdset(max,rfds);
+ Tvba(" wfds="); Tvbfdset(max,wfds);
+ Tvba(" efds="); Tvbfdset(max,efds);
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+#ifdef HAVE_POLL
+int Hpoll( struct pollfd *fds , int nfds , int timeout ) {
+ int r, e;
+ Qpoll( fds , nfds , timeout );
+ r= poll( fds , nfds , timeout );
+ e= errno;
+ vb.used= 0;
+ Tvba("poll=");
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ Tvbf("%d",r);
+ Tvba(" fds="); Tvbpollfds(fds,nfds);
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+#endif
+int Hsocket( int domain , int type , int protocol ) {
+ int r, e;
+ Tmust("socket","domain",domain==AF_INET || domain==AF_INET6);
+ Tmust("socket","type",type==SOCK_STREAM || type==SOCK_DGRAM);
+ Qsocket( domain , type );
+ r= socket( domain , type , protocol );
+ e= errno;
+ vb.used= 0;
+ Tvba("socket=");
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ Tvbf("%d",r);
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+int Hfcntl( int fd , int cmd , ... ) {
+ int r, e;
+ va_list al; long arg;
+ Tmust("fcntl","cmd",cmd==F_SETFL || cmd==F_GETFL);
+ if (cmd == F_SETFL) {
+ va_start(al,cmd); arg= va_arg(al,long); va_end(al);
+ } else {
+ arg= 0;
+ }
+ Qfcntl( fd , cmd , arg );
+ r= fcntl( fd , cmd , arg );
+ e= errno;
+ vb.used= 0;
+ Tvba("fcntl=");
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ if (cmd == F_GETFL) {
+ Tvbf(r & O_NONBLOCK ? "O_NONBLOCK|..." : "~O_NONBLOCK&...");
+ } else {
+ if (cmd == F_SETFL) {
+ Tmust("fcntl","return",!r);
+ } else {
+ Tmust("cmd","F_GETFL/F_SETFL",0);
+ }
+ Tvba("OK");
+ }
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+int Hconnect( int fd , const struct sockaddr *addr , int addrlen ) {
+ int r, e;
+ Qconnect( fd , addr , addrlen );
+ r= connect( fd , addr , addrlen );
+ e= errno;
+ vb.used= 0;
+ Tvba("connect=");
+ if (r) { Tvberrno(e); goto x_error; }
+ Tvba("OK");
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+int Hbind( int fd , const struct sockaddr *addr , int addrlen ) {
+ int r, e;
+ Qbind( fd , addr , addrlen );
+ r= bind( fd , addr , addrlen );
+ e= errno;
+ vb.used= 0;
+ Tvba("bind=");
+ if (r) { Tvberrno(e); goto x_error; }
+ Tvba("OK");
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+int Hlisten( int fd , int backlog ) {
+ int r, e;
+ Qlisten( fd , backlog );
+ r= listen( fd , backlog );
+ e= errno;
+ vb.used= 0;
+ Tvba("listen=");
+ if (r) { Tvberrno(e); goto x_error; }
+ Tvba("OK");
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+int Hclose( int fd ) {
+ int r, e;
+ Qclose( fd );
+ r= close( fd );
+ e= errno;
+ vb.used= 0;
+ Tvba("close=");
+ if (r) { Tvberrno(e); goto x_error; }
+ Tvba("OK");
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+int Hsendto( int fd , const void *msg , int msglen , unsigned int flags , const struct sockaddr *addr , int addrlen ) {
+ int r, e;
+ Tmust("sendto","flags",flags==0);
+ Qsendto( fd , msg , msglen , addr , addrlen );
+ r= sendto( fd , msg , msglen , flags , addr , addrlen );
+ e= errno;
+ vb.used= 0;
+ Tvba("sendto=");
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ Tvbf("%d",r);
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+int Hrecvfrom( int fd , void *buf , int buflen , unsigned int flags , struct sockaddr *addr , int *addrlen ) {
+ int r, e;
+ Tmust("recvfrom","flags",flags==0);
+ Tmust("recvfrom","*addrlen",*addrlen>=sizeof(struct sockaddr_in));
+ Qrecvfrom( fd , buflen , *addrlen );
+ r= recvfrom( fd , buf , buflen , flags , addr , addrlen );
+ e= errno;
+ vb.used= 0;
+ Tvba("recvfrom=");
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ Tmust("recvfrom","return",r<=buflen);
+ Tvba("OK");
+ Tvba(" addr="); Tvbaddr(addr,*addrlen);
+ Tvbbytes(buf,r);
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+int Hread( int fd , void *buf , size_t buflen ) {
+ int r, e;
+ Qread( fd , buflen );
+ r= read( fd , buf , buflen );
+ e= errno;
+ vb.used= 0;
+ Tvba("read=");
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ Tmust("read","return",r<=buflen);
+ Tvba("OK");
+ Tvbbytes(buf,r);
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+int Hwrite( int fd , const void *buf , size_t len ) {
+ int r, e;
+ Qwrite( fd , buf , len );
+ r= write( fd , buf , len );
+ e= errno;
+ vb.used= 0;
+ Tvba("write=");
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ Tvbf("%d",r);
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
diff --git a/regress/hrecord.c.m4 b/regress/hrecord.c.m4
new file mode 100644
index 0000000..6e50efb
--- /dev/null
+++ b/regress/hrecord.c.m4
@@ -0,0 +1,158 @@
+m4_dnl hrecord.c.m4
+m4_dnl (part of complex test harness, not of the library)
+m4_dnl - recording routines
+
+m4_dnl This file is part of adns, which is
+m4_dnl Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+m4_dnl Copyright (C) 2014 Mark Wooding
+m4_dnl Copyright (C) 1999-2000,2003,2006 Tony Finch
+m4_dnl Copyright (C) 1991 Massachusetts Institute of Technology
+m4_dnl (See the file INSTALL for full details.)
+m4_dnl
+m4_dnl This program is free software; you can redistribute it and/or modify
+m4_dnl it under the terms of the GNU General Public License as published by
+m4_dnl the Free Software Foundation; either version 3, or (at your option)
+m4_dnl any later version.
+m4_dnl
+m4_dnl This program is distributed in the hope that it will be useful,
+m4_dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+m4_dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+m4_dnl GNU General Public License for more details.
+m4_dnl
+m4_dnl You should have received a copy of the GNU General Public License
+m4_dnl along with this program; if not, write to the Free Software Foundation.
+
+m4_include(hmacros.i4)
+
+#include <assert.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "harness.h"
+
+static FILE *Toutputfile;
+
+void Tshutdown(void) {
+}
+
+static void R_recordtime(void) {
+ int r;
+ struct timeval tv, tvrel;
+
+ Tensurerecordfile();
+ r= gettimeofday(&tv,0); if (r) Tfailed("gettimeofday syscallbegin");
+ tvrel.tv_sec= tv.tv_sec - currenttime.tv_sec;
+ tvrel.tv_usec= tv.tv_usec - currenttime.tv_usec;
+ if (tv.tv_usec < 0) { tvrel.tv_usec += 1000000; tvrel.tv_sec--; }
+ Tvbf("\n +%ld.%06ld",(long)tvrel.tv_sec,(long)tvrel.tv_usec);
+ currenttime= tv;
+}
+
+void Tensurerecordfile(void) {
+ const char *fdstr;
+ int fd, r;
+
+ if (Toutputfile) return;
+
+ Toutputfile= stdout;
+ fdstr= getenv("ADNS_TEST_OUT_FD");
+ if (fdstr) {
+ fd= atoi(fdstr);
+ Toutputfile= fdopen(fd,"a"); if (!Toutputfile) Tfailed("fdopen ADNS_TEST_OUT_FD");
+ }
+
+ r= gettimeofday(&currenttime,0); if (r) Tfailed("gettimeofday syscallbegin");
+ if (fprintf(Toutputfile," start %ld.%06ld\n",
+ (long)currenttime.tv_sec,(long)currenttime.tv_usec) == EOF) Toutputerr();
+}
+
+void Q_vb(void) {
+ if (!adns__vbuf_append(&vb,"",1)) Tnomem();
+ Tensurerecordfile();
+ if (fprintf(Toutputfile," %s\n",vb.buf) == EOF) Toutputerr();
+ if (fflush(Toutputfile)) Toutputerr();
+}
+
+static void R_vb(void) {
+ Q_vb();
+}
+
+m4_define(`hm_syscall', `
+ hm_create_proto_h
+int H$1(hm_args_massage($3,void)) {
+ int r, e;
+
+ hm_create_hqcall_vars
+ $3
+
+ hm_create_hqcall_init($1)
+ $3
+
+ hm_create_hqcall_args
+ Q$1(hm_args_massage($3));
+
+ hm_create_realcall_args
+ r= $1(hm_args_massage($3));
+ e= errno;
+
+ vb.used= 0;
+ Tvba("$1=");
+ m4_define(`hm_rv_any',`
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ Tvbf("%d",r);')
+ m4_define(`hm_rv_fd',`hm_rv_any($'`1)')
+ m4_define(`hm_rv_succfail',`
+ if (r) { Tvberrno(e); goto x_error; }
+ Tvba("OK");')
+ m4_define(`hm_rv_must',`Tmust("$1","return",!r); Tvba("OK");')
+ m4_define(`hm_rv_len',`
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ Tmust("$1","return",r<=$'`1);
+ Tvba("OK");')
+ m4_define(`hm_rv_fcntl',`
+ if (r==-1) { Tvberrno(e); goto x_error; }
+ if (cmd == F_GETFL) {
+ Tvbf(r & O_NONBLOCK ? "O_NONBLOCK|..." : "~O_NONBLOCK&...");
+ } else {
+ if (cmd == F_SETFL) {
+ Tmust("$1","return",!r);
+ } else {
+ Tmust("cmd","F_GETFL/F_SETFL",0);
+ }
+ Tvba("OK");
+ }')
+ $2
+
+ hm_create_nothing
+ m4_define(`hm_arg_fdset_io',`Tvba(" $'`1="); Tvbfdset($'`2,$'`1);')
+ m4_define(`hm_arg_pollfds_io',`Tvba(" $'`1="); Tvbpollfds($'`1,$'`2);')
+ m4_define(`hm_arg_addr_out',`Tvba(" $'`1="); Tvbaddr($'`1,*$'`2);')
+ $3
+
+ hm_create_nothing
+ m4_define(`hm_arg_bytes_out',`Tvbbytes($'`2,r);')
+ $3
+
+ m4_define(`hm_rv_any',`x_error:')
+ m4_define(`hm_rv_fd',`x_error:')
+ m4_define(`hm_rv_succfail',`x_error:')
+ m4_define(`hm_rv_len',`x_error:')
+ m4_define(`hm_rv_fcntl',`x_error:')
+ m4_define(`hm_rv_must',`')
+ $2
+
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+')
+
+m4_define(`hm_specsyscall', `')
+
+m4_include(`hsyscalls.i4')
diff --git a/regress/hredirect.h b/regress/hredirect.h
new file mode 100644
index 0000000..7bff129
--- /dev/null
+++ b/regress/hredirect.h
@@ -0,0 +1,44 @@
+#ifndef HREDIRECT_H_INCLUDED
+#define HREDIRECT_H_INCLUDED
+#include "hsyscalls.h"
+#undef select
+#define select Hselect
+#ifdef HAVE_POLL
+#undef poll
+#define poll Hpoll
+#endif
+#undef socket
+#define socket Hsocket
+#undef fcntl
+#define fcntl Hfcntl
+#undef connect
+#define connect Hconnect
+#undef bind
+#define bind Hbind
+#undef listen
+#define listen Hlisten
+#undef close
+#define close Hclose
+#undef sendto
+#define sendto Hsendto
+#undef recvfrom
+#define recvfrom Hrecvfrom
+#undef read
+#define read Hread
+#undef write
+#define write Hwrite
+#undef writev
+#define writev Hwritev
+#undef gettimeofday
+#define gettimeofday Hgettimeofday
+#undef getpid
+#define getpid Hgetpid
+#undef malloc
+#define malloc Hmalloc
+#undef free
+#define free Hfree
+#undef realloc
+#define realloc Hrealloc
+#undef exit
+#define exit Hexit
+#endif
diff --git a/regress/hredirect.h.m4 b/regress/hredirect.h.m4
new file mode 100644
index 0000000..8111640
--- /dev/null
+++ b/regress/hredirect.h.m4
@@ -0,0 +1,39 @@
+m4_dnl hredirect.h.m4
+m4_dnl (part of complex test harness, not of the library)
+m4_dnl - redefinitions of system calls
+
+m4_dnl This file is part of adns, which is
+m4_dnl Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+m4_dnl Copyright (C) 2014 Mark Wooding
+m4_dnl Copyright (C) 1999-2000,2003,2006 Tony Finch
+m4_dnl Copyright (C) 1991 Massachusetts Institute of Technology
+m4_dnl (See the file INSTALL for full details.)
+m4_dnl
+m4_dnl This program is free software; you can redistribute it and/or modify
+m4_dnl it under the terms of the GNU General Public License as published by
+m4_dnl the Free Software Foundation; either version 3, or (at your option)
+m4_dnl any later version.
+m4_dnl
+m4_dnl This program is distributed in the hope that it will be useful,
+m4_dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+m4_dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+m4_dnl GNU General Public License for more details.
+m4_dnl
+m4_dnl You should have received a copy of the GNU General Public License
+m4_dnl along with this program; if not, write to the Free Software Foundation.
+
+m4_include(hmacros.i4)
+
+#ifndef HREDIRECT_H_INCLUDED
+#define HREDIRECT_H_INCLUDED
+
+#include "hsyscalls.h"
+
+hm_create_nothing
+m4_define(`hm_syscall', `#undef $1
+#define $1 H$1')
+m4_define(`hm_specsyscall',`#undef $2
+#define $2 H$2')
+m4_include(`hsyscalls.i4')
+
+#endif
diff --git a/regress/hsyscalls.h b/regress/hsyscalls.h
new file mode 100644
index 0000000..6dc9edc
--- /dev/null
+++ b/regress/hsyscalls.h
@@ -0,0 +1,32 @@
+#ifndef HSYSCALLS_H_INCLUDED
+#define HSYSCALLS_H_INCLUDED
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+#include <unistd.h>
+#ifdef HAVE_POLL
+#include <sys/poll.h>
+#endif
+int Hselect( int max , fd_set *rfds , fd_set *wfds , fd_set *efds , struct timeval *to );
+#ifdef HAVE_POLL
+int Hpoll( struct pollfd *fds , int nfds , int timeout );
+#endif
+int Hsocket( int domain , int type , int protocol );
+int Hfcntl( int fd , int cmd , ... );
+int Hconnect( int fd , const struct sockaddr *addr , int addrlen );
+int Hbind( int fd , const struct sockaddr *addr , int addrlen );
+int Hlisten( int fd , int backlog );
+int Hclose( int fd );
+int Hsendto( int fd , const void *msg , int msglen , unsigned int flags , const struct sockaddr *addr , int addrlen );
+int Hrecvfrom( int fd , void *buf , int buflen , unsigned int flags , struct sockaddr *addr , int *addrlen );
+int Hread( int fd , void *buf , size_t buflen );
+int Hwrite( int fd , const void *buf , size_t len );
+int Hwritev(int fd, const struct iovec *vector, size_t count);
+int Hgettimeofday(struct timeval *tv, struct timezone *tz);
+pid_t Hgetpid(void);
+void* Hmalloc(size_t sz);
+void Hfree(void *ptr);
+void* Hrealloc(void *op, size_t nsz);
+void Hexit(int rv)NONRETURNING;
+#endif
diff --git a/regress/hsyscalls.h.m4 b/regress/hsyscalls.h.m4
new file mode 100644
index 0000000..3abb5e7
--- /dev/null
+++ b/regress/hsyscalls.h.m4
@@ -0,0 +1,45 @@
+m4_dnl hsyscalls.h.m4
+m4_dnl (part of complex test harness, not of the library)
+m4_dnl - prototypes of redefinitions of system calls
+
+m4_dnl This file is part of adns, which is
+m4_dnl Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+m4_dnl Copyright (C) 2014 Mark Wooding
+m4_dnl Copyright (C) 1999-2000,2003,2006 Tony Finch
+m4_dnl Copyright (C) 1991 Massachusetts Institute of Technology
+m4_dnl (See the file INSTALL for full details.)
+m4_dnl
+m4_dnl This program is free software; you can redistribute it and/or modify
+m4_dnl it under the terms of the GNU General Public License as published by
+m4_dnl the Free Software Foundation; either version 3, or (at your option)
+m4_dnl any later version.
+m4_dnl
+m4_dnl This program is distributed in the hope that it will be useful,
+m4_dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+m4_dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+m4_dnl GNU General Public License for more details.
+m4_dnl
+m4_dnl You should have received a copy of the GNU General Public License
+m4_dnl along with this program; if not, write to the Free Software Foundation.
+
+m4_include(hmacros.i4)
+
+#ifndef HSYSCALLS_H_INCLUDED
+#define HSYSCALLS_H_INCLUDED
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+#include <unistd.h>
+
+#ifdef HAVE_POLL
+#include <sys/poll.h>
+#endif
+
+hm_create_proto_h
+m4_define(`hm_syscall', `int H$1(hm_args_massage($3,void));')
+m4_define(`hm_specsyscall', `$1 H$2($3)$4;')
+m4_include(`hsyscalls.i4')
+
+#endif
diff --git a/regress/hsyscalls.i4 b/regress/hsyscalls.i4
new file mode 100644
index 0000000..2efa879
--- /dev/null
+++ b/regress/hsyscalls.i4
@@ -0,0 +1,143 @@
+m4_dnl hsyscalls.i4
+m4_dnl (part of complex test harness, not of the library)
+m4_dnl - list of syscalls to override/log and their args
+
+m4_dnl This file is part of adns, which is
+m4_dnl Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+m4_dnl Copyright (C) 2014 Mark Wooding
+m4_dnl Copyright (C) 1999-2000,2003,2006 Tony Finch
+m4_dnl Copyright (C) 1991 Massachusetts Institute of Technology
+m4_dnl (See the file INSTALL for full details.)
+m4_dnl
+m4_dnl This program is free software; you can redistribute it and/or modify
+m4_dnl it under the terms of the GNU General Public License as published by
+m4_dnl the Free Software Foundation; either version 3, or (at your option)
+m4_dnl any later version.
+m4_dnl
+m4_dnl This program is distributed in the hope that it will be useful,
+m4_dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+m4_dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+m4_dnl GNU General Public License for more details.
+m4_dnl
+m4_dnl You should have received a copy of the GNU General Public License
+m4_dnl along with this program; if not, write to the Free Software Foundation.
+
+m4_dnl each system call has
+m4_dnl hm_syscall(<name>,<returnvalue>,<args>)
+m4_dnl <returnvalue> is one of
+m4_dnl hm_rv_must must succeed and return 0
+m4_dnl hm_rv_any any nonnegative return allowed, -1 means see errno
+m4_dnl hm_rv_fd file descriptor is returned, -1 means see errno
+m4_dnl hm_rv_succfail returns 0 (ok) or -1 (see errno)
+m4_dnl hm_rv_len(<max>) returns length read/written, must be <=max, -1 => errno
+m4_dnl hm_rv_fcntl syscall is fcntl, do special processing
+m4_dnl <args> is list of macros for arguments, each followed by hm_na
+m4_dnl hm_arg_nullptr(<type>,<arg>) pointer of type type, must be null
+m4_dnl hm_arg_int(<arg>) signed integer
+m4_dnl hm_arg_fdset_io(<arg>,<max>) fd_set, max bit set is in max
+m4_dnl hm_arg_timeval_in_rel_null(<t>) struct timeval*, pass in, relative, may be null
+m4_dnl hm_arg_must(<type>,<arg>,<val>) must have correct value, or abort test
+m4_dnl hm_arg_socktype(<arg>) SOCK_STREAM or SOCK_DGRAM (an int)
+m4_dnl hm_arg_addrfam(<arg>) a supported address family
+m4_dnl hm_arg_ign(<type>,<arg>) input parameter ignored
+m4_dnl hm_arg_fd(<arg>) fd
+m4_dnl hm_arg_fcntl_cmd_arg(<ca>,<aa>) syscall is fcntl, do special processing
+m4_dnl hm_arg_addr_in(<arg>,<len>) struct sockaddr*, length given by <len> (an int)
+m4_dnl hm_arg_bytes_in(<objtype>,<objarg>,<lentype>,<lenarg>)
+m4_dnl some data from caller; <objarg> is of type pointer to const <objtype>
+m4_dnl and points to <lenarg> bytes (<lenarg> is of type <lentype>)
+m4_dnl hm_arg_bytes_out(<objtype>,<objarg>,<lentype>,<buflenarg>)
+m4_dnl buffer for data from syscall; <objarg> is of type pointer to const <objtype>
+m4_dnl and points to at least <lenarg> bytes (<lenarg> is of type <lentype>)
+m4_dnl return value from syscall is supposed to be returned length
+m4_dnl hm_arg_addr_out(<arg>,<lenptr>) struct sockaddr*, length io at <lenptr> (an int*)
+
+hm_syscall(
+ select, `hm_rv_any', `
+ hm_arg_int(max) hm_na
+ hm_arg_fdset_io(rfds,max) hm_na
+ hm_arg_fdset_io(wfds,max) hm_na
+ hm_arg_fdset_io(efds,max) hm_na
+ hm_arg_timeval_in_rel_null(to) hm_na
+')
+
+#ifdef HAVE_POLL
+hm_syscall(
+ poll, `hm_rv_any', `
+ hm_arg_pollfds_io(fds,nfds) hm_na
+ hm_arg_int(timeout) hm_na
+')
+#endif
+
+hm_syscall(
+ socket, `hm_rv_fd', `
+ hm_arg_addrfam(domain) hm_na
+ hm_arg_socktype(type) hm_na
+ hm_arg_ign(int,protocol) hm_na
+')
+
+hm_syscall(
+ fcntl, `hm_rv_fcntl', `
+ hm_arg_fd(fd) hm_na
+ hm_arg_fcntl_cmd_arg(cmd,arg) hm_na
+')
+
+hm_syscall(
+ connect, `hm_rv_succfail', `
+ hm_arg_fd(fd) hm_na
+ hm_arg_addr_in(addr,addrlen) hm_na
+')
+
+hm_syscall(
+ bind, `hm_rv_succfail', `
+ hm_arg_fd(fd) hm_na
+ hm_arg_addr_in(addr,addrlen) hm_na
+')
+
+hm_syscall(
+ listen, `hm_rv_succfail', `
+ hm_arg_fd(fd) hm_na
+ hm_arg_int(backlog) hm_na
+')
+
+hm_syscall(
+ close, `hm_rv_succfail', `
+ hm_arg_fd(fd) hm_na
+')
+
+hm_syscall(
+ sendto, `hm_rv_any', `
+ hm_arg_fd(fd) hm_na
+ hm_arg_bytes_in(void,msg,int,msglen) hm_na
+ hm_arg_must(unsigned int,flags,0) hm_na
+ hm_arg_addr_in(addr,addrlen) hm_na
+')
+
+hm_syscall(
+ recvfrom, `hm_rv_len(buflen)', `
+ hm_arg_fd(fd) hm_na
+ hm_arg_bytes_out(void,buf,int,buflen) hm_na
+ hm_arg_must(unsigned int,flags,0) hm_na
+ hm_arg_addr_out(addr,addrlen) hm_na
+')
+
+hm_syscall(
+ read, `hm_rv_len(buflen)', `
+ hm_arg_fd(fd) hm_na
+ hm_arg_bytes_out(void,buf,size_t,buflen) hm_na
+')
+
+hm_syscall(
+ write, `hm_rv_any', `
+ hm_arg_fd(fd) hm_na
+ hm_arg_bytes_in(void,buf,size_t,len) hm_na
+')
+
+hm_specsyscall(int, writev, `int fd, const struct iovec *vector, size_t count')
+hm_specsyscall(int, gettimeofday, `struct timeval *tv, struct timezone *tz')
+hm_specsyscall(pid_t, getpid, `void')
+
+hm_specsyscall(void*, malloc, `size_t sz')
+hm_specsyscall(void, free, `void *ptr')
+hm_specsyscall(void*, realloc, `void *op, size_t nsz')
+hm_specsyscall(void, exit, `int rv', NONRETURNING)
diff --git a/regress/init-1stservbroken.text b/regress/init-1stservbroken.text
new file mode 100644
index 0000000..56cd423
--- /dev/null
+++ b/regress/init-1stservbroken.text
@@ -0,0 +1,3 @@
+nameserver 172.18.45.2
+nameserver 172.18.45.6
+sortlist 127.0.0.1/32 172.18.45.0/28 172.18.45.0/24
diff --git a/regress/init-1stservto.text b/regress/init-1stservto.text
new file mode 100644
index 0000000..b70e678
--- /dev/null
+++ b/regress/init-1stservto.text
@@ -0,0 +1,3 @@
+nameserver 10.0.0.1
+nameserver 172.18.45.6
+sortlist 127.0.0.1/32 172.18.45.0/28 172.18.45.0/24
diff --git a/regress/init-2ndserver.text b/regress/init-2ndserver.text
new file mode 100644
index 0000000..88cb0d2
--- /dev/null
+++ b/regress/init-2ndserver.text
@@ -0,0 +1,3 @@
+nameserver 172.18.45.36
+nameserver 172.18.45.6
+sortlist 127.0.0.1/32 172.18.45.0/28 172.18.45.0/24
diff --git a/regress/init-anarres.text b/regress/init-anarres.text
new file mode 100644
index 0000000..1918381
--- /dev/null
+++ b/regress/init-anarres.text
@@ -0,0 +1,2 @@
+nameserver 172.18.45.2
+search davenant.greenend.org.uk
diff --git a/regress/init-bogus-sortlist.text b/regress/init-bogus-sortlist.text
new file mode 100644
index 0000000..eea7114
--- /dev/null
+++ b/regress/init-bogus-sortlist.text
@@ -0,0 +1,3 @@
+nameserver 172.18.45.6
+sortlist 198.51.100.1/24 2001:db8:2::/10 0/32 ::/128 255.0.0.0 2/33 ::/129
+search dnserr.distorted.org.uk distorted.org.uk
diff --git a/regress/init-default.text b/regress/init-default.text
new file mode 100644
index 0000000..e224ea7
--- /dev/null
+++ b/regress/init-default.text
@@ -0,0 +1,3 @@
+nameserver 172.18.45.6
+sortlist 127.0.0.1/32 172.18.45.0/28 172.18.45.0/24
+search davenant.greenend.org.uk greenend.org.uk
diff --git a/regress/init-distorted-v6.text b/regress/init-distorted-v6.text
new file mode 100644
index 0000000..d0c712a
--- /dev/null
+++ b/regress/init-distorted-v6.text
@@ -0,0 +1,3 @@
+nameserver 2001:ba8:1d9::1
+sortlist 198.51.100.0/24 2001:db8:2::/48 0/0 ::/0
+search dnserr.distorted.org.uk distorted.org.uk
diff --git a/regress/init-distorted.text b/regress/init-distorted.text
new file mode 100644
index 0000000..a35a854
--- /dev/null
+++ b/regress/init-distorted.text
@@ -0,0 +1,3 @@
+nameserver 172.29.199.224
+sortlist 198.51.100.0/24 2001:db8:2::/48 0/0 ::/0
+search dnserr.distorted.org.uk distorted.org.uk
diff --git a/regress/init-manyptrwrong.text b/regress/init-manyptrwrong.text
new file mode 100644
index 0000000..34b6084
--- /dev/null
+++ b/regress/init-manyptrwrong.text
@@ -0,0 +1 @@
+nameserver 140.200.128.13
diff --git a/regress/init-ncipher.text b/regress/init-ncipher.text
new file mode 100644
index 0000000..11ef2db
--- /dev/null
+++ b/regress/init-ncipher.text
@@ -0,0 +1,3 @@
+nameserver 195.224.55.129
+sortlist 127.0.0.1/32 195.224.55.128/25 195.224.55.0/24
+search ncipher.com
diff --git a/regress/init-ndots.text b/regress/init-ndots.text
new file mode 100644
index 0000000..099c2ee
--- /dev/null
+++ b/regress/init-ndots.text
@@ -0,0 +1,4 @@
+nameserver 172.18.45.6
+sortlist 127.0.0.1/32 172.18.45.0/28 172.18.45.0/24
+search davenant.greenend.org.uk greenend.org.uk
+options ndots:3
diff --git a/regress/init-ndots100.text b/regress/init-ndots100.text
new file mode 100644
index 0000000..e241120
--- /dev/null
+++ b/regress/init-ndots100.text
@@ -0,0 +1,4 @@
+nameserver 172.18.45.6
+sortlist 127.0.0.1/32 172.18.45.0/28 172.18.45.0/24
+search davenant.greenend.org.uk greenend.org.uk
+options ndots:100
diff --git a/regress/init-ndotsbad.text b/regress/init-ndotsbad.text
new file mode 100644
index 0000000..2045821
--- /dev/null
+++ b/regress/init-ndotsbad.text
@@ -0,0 +1,4 @@
+nameserver 172.18.45.6
+sortlist 127.0.0.1/32 172.18.45.0/28 172.18.45.0/24
+search davenant.greenend.org.uk greenend.org.uk
+options ndots:X
diff --git a/regress/init-noserver.text b/regress/init-noserver.text
new file mode 100644
index 0000000..0c8450c
--- /dev/null
+++ b/regress/init-noserver.text
@@ -0,0 +1,2 @@
+nameserver 172.18.45.36
+sortlist 127.0.0.1/32 172.18.45.0/28 172.18.45.0/24
diff --git a/regress/init-tunnel.text b/regress/init-tunnel.text
new file mode 100644
index 0000000..29c789e
--- /dev/null
+++ b/regress/init-tunnel.text
@@ -0,0 +1,3 @@
+nameserver 172.31.80.9
+sortlist 127.0.0.1/32 172.18.45.0/24 172.31.80.0/28
+search davenant.greenend.org.uk greenend.org.uk
diff --git a/regress/init-unkopts.text b/regress/init-unkopts.text
new file mode 100644
index 0000000..a148864
--- /dev/null
+++ b/regress/init-unkopts.text
@@ -0,0 +1,11 @@
+nameserver 172.18.45.6
+sortlist 127.0.0.1/32 172.18.45.0/28 172.18.45.0/24
+search davenant.greenend.org.uk greenend.org.uk
+lwserver 127.0.0.1
+options timeout:1 attempts:30 rotate no-check-names inet6 edns0 wombat
+stoat
+options adns_checkc:freq zorkmid
+options adns_af:any adns_af:ipv6,ipv4,dampstring spong
+options adns_ignoreunkcfg wombat2
+stoat2
+options adns_af:any adns_af:ipv6,ipv4,dampstring2 spong2
diff --git a/regress/m1test b/regress/m1test
new file mode 100755
index 0000000..a662ed2
--- /dev/null
+++ b/regress/m1test
@@ -0,0 +1,107 @@
+#!/bin/bash
+# usage: m1test <name> <initfile> [<initflags>] <queryargs>'
+# test recording script
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+set -e
+
+: ${srcdir=.}
+if [ $# -lt 3 ]
+then
+ echo >&2 \
+'usage: m1test <name> <initfile> [-<initflags>] ["<"]
+ [=<hrecord-command-args>] <queryargs>
+("<" means read input from case-<name>.in)'
+ exit 1
+fi
+
+case="$srcdir/case-$1"; shift
+initfile="$1"; shift
+
+hrecord="./adnstest_record"
+
+case "$1" in
+-*) initflags="$1"; shift
+esac
+
+if test "x$1" = "x<"
+then
+ shift; exec <"$case.in"
+fi
+
+case "$1" in
+=*) hrecord="`echo \"$1\" | sed -e 's/^=//'`"; shift
+esac
+
+if test ! -f "$hrecord" -a -f "${hrecord}_record"
+then
+ case "$hrecord" in
+ /*) program="$hrecord" ;;
+ *) program="./$hrecord" ;;
+ esac
+ hrecord="${program}_record"
+else
+ program="$(echo "$hrecord" | sed -e 's/ .*//; s/_record$//')"
+fi
+
+queryargs="$*"
+
+initstring="`cat $srcdir/init-$initfile.text`"
+xinitflagsf=$srcdir/$program-xinitflags.text
+if test -f $xinitflagsf
+then
+ useinitflags="$initflags $(cat $xinitflagsf)";
+else
+ useinitflags="$initflags /"
+fi
+
+echo $program $initfile $initflags >"$case.sys"
+echo "$queryargs" >>"$case.sys"
+
+EF_DISABLE_BANNER=1
+export EF_DISABLE_BANNER
+
+rm -f pipe.out pipe.err
+mknod pipe.out p
+mknod pipe.err p
+tee <pipe.out "$case.out" &
+tee_out=$!
+tee <pipe.err "$case.err" &
+tee_err=$!
+exec 4>pipe.out
+exec 5>pipe.err
+
+echo running hrecord $initflags "... $queryargs"
+set +e
+ADNS_TEST_OUT_FD=3 3>>"$case.sys" >&4 2>&5 \
+ $hrecord $useinitflags"$initstring" $queryargs
+rc=$?
+set -e
+
+echo "rc=$rc" >&4
+exec 4>&-
+exec 5>&-
+
+wait $tee_out
+wait $tee_err
+
+echo "exit status: $rc"
diff --git a/regress/r1test b/regress/r1test
new file mode 100755
index 0000000..d160782
--- /dev/null
+++ b/regress/r1test
@@ -0,0 +1,109 @@
+#!/bin/sh
+# usage: r1test <testcasename>
+# test execution script, for running one test
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+set -e
+: ${srcdir=.}
+mrc=1
+trap 'exit $mrc' 0
+
+casename="$1"
+case="$srcdir/case-$casename"
+ocase="output-$casename"
+
+exec 4<"$case.sys"
+read <&4 program initfile initflags
+read <&4 queryargs
+
+initstring="`cat $srcdir/init-$initfile.text`"
+xinitflagsf=$srcdir/$program-xinitflags.text
+if test -f $xinitflagsf
+then
+ initflags="$initflags `cat $xinitflagsf`";
+else
+ initflags="$initflags /"
+fi
+
+rm -f $ocase.*
+
+EF_DISABLE_BANNER=1
+export EF_DISABLE_BANNER
+
+if test -f "$case.in"
+then
+ exec <"$case.in"
+else
+ exec </dev/null
+fi
+
+playback=./${program}_playback
+if test ! -f $playback
+then
+ printf "SKIPPED-$casename "
+ mrc=5
+ exit
+fi
+
+set +e
+ADNS_TEST_REPORT_FD=3 ADNS_TEST_IN_FD=4 \
+ 3>>"$ocase.report" 4<&4 >"$ocase.out" 2>"$ocase.err" \
+ $ADNS_TEST_DEBUG $playback $initflags"$initstring" $queryargs
+rc=$?
+set -e
+
+if [ "$rc" = 5 ]
+then
+ printf "SKIPPED-$casename "
+ mrc=5
+ exit
+fi
+
+echo "rc=$rc" >>$ocase.out
+
+failed=false
+for part in err out
+do
+ if diff -u -- "$case.$part" "$ocase.$part"
+ then
+ :
+ else
+ failwhy="$failwhy WRONG OUTPUT"
+ fi
+done
+
+cat <&4 >"$ocase.leftover"
+if egrep . /dev/null "$ocase.leftover"
+then
+ failwhy="$failwhy EXITED EARLY"
+fi
+
+if [ "x$failwhy" != x ]
+then
+ scremain="`wc -l <\"$ocase.leftover\"`"
+ echo >&2 "FAILED $case -$failwhy - lines of syscall remaining $scremain"
+ mrc=2
+ exit
+fi
+
+printf "$casename "
+mrc=0
diff --git a/settings.make.in b/settings.make.in
new file mode 100644
index 0000000..3e14589
--- /dev/null
+++ b/settings.make.in
@@ -0,0 +1,39 @@
+# settings.make[.in] - main configuration settings for Makefiles,
+# used by autoconf/configure to generate settings.make
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+include ../common.make
+
+all: $(TARGETS)
+
+clean mostlyclean:
+ rm -f *.o *.tmp* *.so *.so.* pipe.*
+ rm -f output-*.err output-*.leftover
+ rm -f output-*.out output-*.report
+
+distclean: clean
+ rm -f $(TARGETS) *~ ./#*# core *.orig *.rej Makefile config.h
+
+distprep: $(AUTOCSRCS) $(AUTOCHDRS)
+
+maintainer-clean: distclean
+ -rm -f $(AUTOCSRCS) $(AUTOCHDRS)
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..6557f59
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,50 @@
+# src/Makefile[.in] - library main Makefile
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+srcdir= @srcdir@
+VPATH= @srcdir@
+
+TARGETS= libadns.a
+include ../settings.make
+include $(srcdir)/adns.make
+
+DIRCFLAGS= -I. -I$(srcdir)
+
+install:
+ mkdir -p $(libdir) $(includedir)
+ set -xe; for f in $(TARGETS); \
+ do $(INSTALL_DATA) $$f $(libdir)/$$f; done
+ $(INSTALL_DATA) $(srcdir)/../src/adns.h $(includedir)/adns.h
+
+uninstall:
+ for f in $(TARGETS); do rm -f $(libdir)/$$f; done
+ rm -f $(includedir)/adns.h
+
+ALLOBJS= $(LIBOBJS)
+
+libadns.a: $(LIBOBJS)
+ rm -f $@
+ $(AR) cqv $@.new $(LIBOBJS)
+ $(RANLIB) $@.new
+ mv -f $@.new $@
+
+$(LIBOBJS): adns.h internal.h config.h
diff --git a/src/addrfam.c b/src/addrfam.c
new file mode 100644
index 0000000..5067048
--- /dev/null
+++ b/src/addrfam.c
@@ -0,0 +1,646 @@
+/*
+ * addrfam.c
+ * - address-family specific code
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <stdlib.h>
+#include <errno.h>
+#include <limits.h>
+#include <unistd.h>
+#include <inttypes.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+
+#include "internal.h"
+
+/*
+ * General address-family operations.
+ */
+
+#define SIN(cnst, sa) ((void)(sa)->sa_family, (cnst struct sockaddr_in *)(sa))
+#define SIN6(cnst, sa) ((void)(sa)->sa_family, (cnst struct sockaddr_in6 *)(sa))
+
+static void unknown_af(int af) NONRETURNING;
+static void unknown_af(int af) {
+ fprintf(stderr, "ADNS INTERNAL: unknown address family %d\n", af);
+ abort();
+}
+
+/*
+ * SOCKADDR_IN_IN6(CNST, struct sockaddr *sa, SIN, {
+ * // struct sockaddr_in *const SIN; // implicitly
+ * code for inet;
+ * }, {
+ * // struct sockaddr_in6 *const SIN6; // implicitly
+ * code for inet6;
+ * })
+ *
+ * SOCKADDR_IN_IN6_PAIR(CNST, struct sockaddr *sa, SINA,
+ * struct sockaddr *sb, SINB, {
+ * // struct sockaddr_in *const SINA; // implicitly
+ * // struct sockaddr_in *const SINB; // implicitly
+ * code for inet;
+ * },{
+ * // struct sockaddr_in6 *const SINA6; // implicitly
+ * // struct sockaddr_in6 *const SINB6; // implicitly
+ * code for inet6;
+ * });
+ *
+ * SOCKADDR_IN_IN6_OTHER(CNST, struct sockaddr *sa, SIN, { in }, { in6 }, {
+ * code for other address family
+ * })
+ *
+ * AF_IN_IN6_OTHER(af, { in }, { in6 }, { other })
+ *
+ * Executes the first or second block according to the AF in sa. CNST
+ * may be `const' or empty. For _PAIR, sa and sb must be same AF.
+ *
+ * All except _OTHER handle unknown AFs with unknown_af.
+ *
+ * Code blocks may not contain , outside parens.
+ */
+#define AF_IN_IN6_OTHER(af, for_inet, for_inet6, other) \
+ if ((af) == AF_INET) { \
+ for_inet \
+ } else if ((af) == AF_INET6) { \
+ for_inet6 \
+ } else { \
+ other \
+ }
+#define SOCKADDR_IN_IN6_OTHER(cnst, sa, sin, for_inet, for_inet6, other) \
+ AF_IN_IN6_OTHER((sa)->sa_family, { \
+ cnst struct sockaddr_in *const sin = SIN(cnst,(sa)); \
+ for_inet \
+ }, { \
+ cnst struct sockaddr_in6 *const sin##6 = SIN6(cnst,(sa)); \
+ for_inet6 \
+ }, \
+ other \
+ )
+#define SOCKADDR_IN_IN6(cnst, sa, sin, for_inet, for_inet6) \
+ SOCKADDR_IN_IN6_OTHER(cnst, sa, sin, for_inet, for_inet6, { \
+ unknown_af((sa)->sa_family); \
+ })
+#define SOCKADDR_IN_IN6_PAIR(cnst, sa, sina, sb, sinb, for_inet, for_inet6) \
+ do{ \
+ assert((sa)->sa_family == (sb)->sa_family); \
+ SOCKADDR_IN_IN6(cnst, sa, sina, { \
+ cnst struct sockaddr_in *const sinb = SIN(cnst,(sb)); \
+ for_inet \
+ }, { \
+ cnst struct sockaddr_in6 *const sinb##6 = SIN6(cnst,(sb)); \
+ for_inet6 \
+ }); \
+ }while(0)
+
+int adns__addrs_equal_raw(const struct sockaddr *a,
+ int bf, const void *b) {
+ if (a->sa_family != bf) return 0;
+
+ SOCKADDR_IN_IN6(const, a, sin, {
+ return sin->sin_addr.s_addr == ((const struct in_addr*)b)->s_addr;
+ }, {
+ return !memcmp(&sin6->sin6_addr, b, sizeof(struct in6_addr));
+ });
+}
+
+int adns__addrs_equal(const adns_sockaddr *a, const adns_sockaddr *b) {
+ return adns__addrs_equal_raw(&a->sa, b->sa.sa_family,
+ adns__sockaddr_addr(&b->sa));
+}
+
+int adns__sockaddrs_equal(const struct sockaddr *sa,
+ const struct sockaddr *sb) {
+ if (!adns__addrs_equal_raw(sa, sb->sa_family, adns__sockaddr_addr(sb)))
+ return 0;
+ SOCKADDR_IN_IN6_PAIR(const, sa, sina, sb, sinb, {
+ return sina->sin_port == sinb->sin_port;
+ }, {
+ return sina6->sin6_port == sinb6->sin6_port &&
+ sina6->sin6_scope_id == sinb6->sin6_scope_id;
+ });
+}
+
+int adns__addr_width(int af) {
+ AF_IN_IN6_OTHER(af, {
+ return 32;
+ }, {
+ return 128;
+ }, {
+ unknown_af(af);
+ });
+}
+
+void adns__prefix_mask(adns_sockaddr *sa, int len) {
+ SOCKADDR_IN_IN6(, &sa->sa, sin, {
+ assert(len <= 32);
+ sin->sin_addr.s_addr= htonl(!len ? 0 : 0xffffffff << (32-len));
+ }, {
+ int i= len/8;
+ int j= len%8;
+ unsigned char *m= sin6->sin6_addr.s6_addr;
+ assert(len <= 128);
+ memset(m, 0xff, i);
+ if (j) m[i++]= (0xff << (8-j)) & 0xff;
+ memset(m+i, 0, 16-i);
+ });
+}
+
+int adns__guess_prefix_length(const adns_sockaddr *sa) {
+ SOCKADDR_IN_IN6(const, &sa->sa, sin, {
+ unsigned a= (ntohl(sin->sin_addr.s_addr) >> 24) & 0xff;
+ if (a < 128) return 8;
+ else if (a < 192) return 16;
+ else if (a < 224) return 24;
+ else return -1;
+ }, {
+ (void)sin6;
+ return 64;
+ });
+}
+
+int adns__addr_matches(int af, const void *addr,
+ const adns_sockaddr *base, const adns_sockaddr *mask)
+{
+ if (af != base->sa.sa_family) return 0;
+ SOCKADDR_IN_IN6_PAIR(const, &base->sa, sbase, &mask->sa, smask, {
+ const struct in_addr *v4 = addr;
+ return (v4->s_addr & smask->sin_addr.s_addr)
+ == sbase->sin_addr.s_addr;
+ }, {
+ int i;
+ const char *a= addr;
+ const char *b= sbase6->sin6_addr.s6_addr;
+ const char *m= smask6->sin6_addr.s6_addr;
+ for (i = 0; i < 16; i++)
+ if ((a[i] & m[i]) != b[i]) return 0;
+ return 1;
+ });
+}
+
+const void *adns__sockaddr_addr(const struct sockaddr *sa) {
+ SOCKADDR_IN_IN6(const, sa, sin, {
+ return &sin->sin_addr;
+ }, {
+ return &sin6->sin6_addr;
+ });
+}
+
+void adns__addr_inject(const void *a, adns_sockaddr *sa) {
+ SOCKADDR_IN_IN6( , &sa->sa, sin, {
+ memcpy(&sin->sin_addr, a, sizeof(sin->sin_addr));
+ }, {
+ memcpy(&sin6->sin6_addr, a, sizeof(sin6->sin6_addr));
+ });
+}
+
+/*
+ * addr2text and text2addr
+ */
+
+#define ADDRFAM_DEBUG
+#ifdef ADDRFAM_DEBUG
+static void af_debug_func(const char *fmt, ...) {
+ int esave= errno;
+ va_list al;
+ va_start(al,fmt);
+ vfprintf(stderr,fmt,al);
+ va_end(al);
+ errno= esave;
+}
+# define af_debug(fmt,...) \
+ (af_debug_func("%s: " fmt "\n", __func__, __VA_ARGS__))
+#else
+# define af_debug(fmt,...) ((void)("" fmt "", __VA_ARGS__))
+#endif
+
+static bool addrtext_our_errno(int e) {
+ return
+ e==EAFNOSUPPORT ||
+ e==EINVAL ||
+ e==ENOSPC ||
+ e==ENOSYS;
+}
+
+static bool addrtext_scope_use_ifname(const struct sockaddr *sa) {
+ const struct in6_addr *in6= &SIN6(const,sa)->sin6_addr;
+ return
+ IN6_IS_ADDR_LINKLOCAL(in6) ||
+ IN6_IS_ADDR_MC_LINKLOCAL(in6);
+}
+
+static int textaddr_check_qf(adns_queryflags flags) {
+ if (flags & ~(adns_queryflags)(adns_qf_addrlit_scope_forbid|
+ adns_qf_addrlit_scope_numeric|
+ adns_qf_addrlit_ipv4_quadonly|
+ 0x40000000))
+ return ENOSYS;
+ return 0;
+}
+
+int adns_text2addr(const char *text, uint16_t port, adns_queryflags flags,
+ struct sockaddr *sa, socklen_t *salen_io) {
+ int r, af;
+ char copybuf[INET6_ADDRSTRLEN];
+ const char *parse=text;
+ const char *scopestr=0;
+ socklen_t needlen;
+ void *dst;
+ uint16_t *portp;
+
+ r= textaddr_check_qf(flags); if (r) return r;
+
+#define INVAL(how) do{ \
+ af_debug("invalid: %s: `%s'", how, text); \
+ return EINVAL; \
+}while(0)
+
+#define AFCORE(INETx,SINx,sinx) \
+ af= AF_##INETx; \
+ dst = &SINx(,sa)->sinx##_addr; \
+ portp = &SINx(,sa)->sinx##_port; \
+ needlen= sizeof(*SINx(,sa));
+
+ if (!strchr(text, ':')) { /* INET */
+
+ AFCORE(INET,SIN,sin);
+
+ } else { /* INET6 */
+
+ AFCORE(INET6,SIN6,sin6);
+
+ const char *percent= strchr(text, '%');
+ if (percent) {
+ ptrdiff_t lhslen = percent - text;
+ if (lhslen >= INET6_ADDRSTRLEN) INVAL("scoped addr lhs too long");
+ memcpy(copybuf, text, lhslen);
+ copybuf[lhslen]= 0;
+
+ parse= copybuf;
+ scopestr= percent+1;
+
+ af_debug("will parse scoped addr `%s' %% `%s'", parse, scopestr);
+ }
+
+ }
+
+#undef AFCORE
+
+ if (scopestr && (flags & adns_qf_addrlit_scope_forbid))
+ INVAL("scoped addr but _scope_forbid");
+
+ if (*salen_io < needlen) {
+ *salen_io = needlen;
+ return ENOSPC;
+ }
+
+ memset(sa, 0, needlen);
+
+ sa->sa_family= af;
+ *portp = htons(port);
+
+ if (af == AF_INET && !(flags & adns_qf_addrlit_ipv4_quadonly)) {
+ /* we have to use inet_aton to deal with non-dotted-quad literals */
+ int r= inet_aton(parse,&SIN(,sa)->sin_addr);
+ if (!r) INVAL("inet_aton rejected");
+ } else {
+ int r= inet_pton(af,parse,dst);
+ if (!r) INVAL("inet_pton rejected");
+ assert(r>0);
+ }
+
+ if (scopestr) {
+ errno=0;
+ char *ep;
+ unsigned long scope= strtoul(scopestr,&ep,10);
+ if (errno==ERANGE) INVAL("numeric scope id too large for unsigned long");
+ assert(!errno);
+ if (!*ep) {
+ if (scope > ~(uint32_t)0)
+ INVAL("numeric scope id too large for uint32_t");
+ } else { /* !!*ep */
+ if (flags & adns_qf_addrlit_scope_numeric)
+ INVAL("non-numeric scope but _scope_numeric");
+ if (!addrtext_scope_use_ifname(sa)) {
+ af_debug("cannot convert non-numeric scope"
+ " in non-link-local addr `%s'", text);
+ return ENOSYS;
+ }
+ errno= 0;
+ scope= if_nametoindex(scopestr);
+ if (!scope) {
+ /* RFC3493 says "No errors are defined". It's not clear
+ * whether that is supposed to mean if_nametoindex "can't
+ * fail" (other than by the supplied name not being that of an
+ * interface) which seems unrealistic, or that it conflates
+ * all its errors together by failing to set errno, or simply
+ * that they didn't bother to document the errors.
+ *
+ * glibc, FreeBSD and OpenBSD all set errno (to ENXIO when
+ * appropriate). See Debian bug #749349.
+ *
+ * We attempt to deal with this by clearing errno to start
+ * with, and then perhaps mapping the results. */
+ af_debug("if_nametoindex rejected scope name (errno=%s)",
+ strerror(errno));
+ if (errno==0) {
+ return ENXIO;
+ } else if (addrtext_our_errno(errno)) {
+ /* we use these for other purposes, urgh. */
+ perror("adns: adns_text2addr: if_nametoindex"
+ " failed with unexpected error");
+ return EIO;
+ } else {
+ return errno;
+ }
+ } else { /* ix>0 */
+ if (scope > ~(uint32_t)0) {
+ fprintf(stderr,"adns: adns_text2addr: if_nametoindex"
+ " returned an interface index >=2^32 which will not fit"
+ " in sockaddr_in6.sin6_scope_id");
+ return EIO;
+ }
+ }
+ } /* else; !!*ep */
+
+ SIN6(,sa)->sin6_scope_id= scope;
+ } /* if (scopestr) */
+
+ *salen_io = needlen;
+ return 0;
+}
+
+int adns_addr2text(const struct sockaddr *sa, adns_queryflags flags,
+ char *buffer, int *buflen_io, int *port_r) {
+ const void *src;
+ int r, port;
+
+ r= textaddr_check_qf(flags); if (r) return r;
+
+ if (*buflen_io < ADNS_ADDR2TEXT_BUFLEN) {
+ *buflen_io = ADNS_ADDR2TEXT_BUFLEN;
+ return ENOSPC;
+ }
+
+ SOCKADDR_IN_IN6_OTHER(const, sa, sin, {
+ src= &sin->sin_addr; port= sin->sin_port;
+ }, {
+ src= &sin6->sin6_addr; port= sin6->sin6_port;
+ }, {
+ return EAFNOSUPPORT;
+ });
+
+ const char *ok= inet_ntop(sa->sa_family, src, buffer, *buflen_io);
+ assert(ok);
+
+ if (sa->sa_family == AF_INET6) {
+ uint32_t scope = SIN6(const,sa)->sin6_scope_id;
+ if (scope) {
+ if (flags & adns_qf_addrlit_scope_forbid)
+ return EINVAL;
+ int scopeoffset = strlen(buffer);
+ int remain = *buflen_io - scopeoffset;
+ char *scopeptr = buffer + scopeoffset;
+ assert(remain >= IF_NAMESIZE+1/*%*/);
+ *scopeptr++= '%'; remain--;
+ bool parsedname = 0;
+ af_debug("will print scoped addr `%.*s' %% %"PRIu32"",
+ scopeoffset,buffer, scope);
+ if (scope <= UINT_MAX /* so we can pass it to if_indextoname */
+ && !(flags & adns_qf_addrlit_scope_numeric)
+ && addrtext_scope_use_ifname(sa)) {
+ parsedname = if_indextoname(scope, scopeptr);
+ if (!parsedname) {
+ af_debug("if_indextoname rejected scope (errno=%s)",
+ strerror(errno));
+ if (errno==ENXIO) {
+ /* fair enough, show it as a number then */
+ } else if (addrtext_our_errno(errno)) {
+ /* we use these for other purposes, urgh. */
+ perror("adns: adns_addr2text: if_indextoname"
+ " failed with unexpected error");
+ return EIO;
+ } else {
+ return errno;
+ }
+ }
+ }
+ if (!parsedname) {
+ int r = snprintf(scopeptr, remain,
+ "%"PRIu32"", scope);
+ assert(r < *buflen_io - scopeoffset);
+ }
+ af_debug("printed scoped addr `%s'", buffer);
+ }
+ }
+
+ if (port_r) *port_r= ntohs(port);
+ return 0;
+}
+
+char *adns__sockaddr_ntoa(const struct sockaddr *sa, char *buf) {
+ int err;
+ int len= ADNS_ADDR2TEXT_BUFLEN;
+
+ err= adns_addr2text(sa, 0, buf, &len, 0);
+ if (err == EIO)
+ err= adns_addr2text(sa, adns_qf_addrlit_scope_numeric, buf, &len, 0);
+ assert(!err);
+ return buf;
+}
+
+/*
+ * Reverse-domain parsing and construction.
+ */
+
+int adns__make_reverse_domain(const struct sockaddr *sa, const char *zone,
+ char **buf_io, size_t bufsz,
+ char **buf_free_r) {
+ size_t req;
+ char *p;
+ unsigned c, y;
+ unsigned long aa;
+ const unsigned char *ap;
+ int i, j;
+
+ AF_IN_IN6_OTHER(sa->sa_family, {
+ req= 4 * 4;
+ if (!zone) zone= "in-addr.arpa";
+ }, {
+ req = 2 * 32;
+ if (!zone) zone= "ip6.arpa";
+ }, {
+ return ENOSYS;
+ });
+
+ req += strlen(zone) + 1;
+ if (req <= bufsz)
+ p= *buf_io;
+ else {
+ p= malloc(req); if (!p) return errno;
+ *buf_free_r = p;
+ }
+
+ *buf_io= p;
+ SOCKADDR_IN_IN6(const, sa, sin, {
+ aa= ntohl(sin->sin_addr.s_addr);
+ for (i=0; i<4; i++) {
+ p += sprintf(p, "%d", (int)(aa & 0xff));
+ *p++= '.';
+ aa >>= 8;
+ }
+ }, {
+ ap= sin6->sin6_addr.s6_addr + 16;
+ for (i=0; i<16; i++) {
+ c= *--ap;
+ for (j=0; j<2; j++) {
+ y= c & 0xf;
+ *p++= (y < 10) ? y + '0' : y - 10 + 'a';
+ c >>= 4;
+ *p++= '.';
+ }
+ }
+ });
+
+ strcpy(p, zone);
+ return 0;
+}
+
+
+#define REVPARSE_P_L(labnum) \
+ const char *p= dgram + rps->labstart[labnum]; \
+ int l= rps->lablen[labnum]
+ /*
+ * REVPARSE_P_L(int labnum);
+ * expects:
+ * const char *dgram;
+ * const struct revparse_state *rps;
+ * produces:
+ * const char *p; // start of label labnum in dgram
+ * int l; // length of label in dgram
+ */
+
+static bool revparse_check_tail(struct revparse_state *rps,
+ const char *dgram, int nlabels,
+ int bodylen, const char *inarpa) {
+ int i;
+
+ if (nlabels != bodylen+2) return 0;
+ for (i=0; i<2; i++) {
+ REVPARSE_P_L(bodylen+i);
+ const char *want= !i ? inarpa : "arpa";
+ if (!adns__labels_equal(p,l, want,strlen(want))) return 0;
+ }
+ return 1;
+}
+
+static bool revparse_atoi(const char *p, int l, int base,
+ unsigned max, unsigned *v_r) {
+ if (l>3) return 0;
+ if (l>1 && p[0]=='0') return 0;
+ unsigned v=0;
+ while (l-- > 0) {
+ int tv;
+ int c= ctype_toupper(*p++);
+ if ('0'<=c && c<='9') tv = c-'0';
+ else if ('A'<=c && c<='Z') tv = c-'A'+10;
+ else return 0;
+ if (tv >= base) return 0;
+ v *= base;
+ v += tv;
+ }
+ if (v>max) return 0;
+ *v_r= v;
+ return 1;
+}
+
+static bool revparse_inet(struct revparse_state *rps,
+ const char *dgram, int nlabels,
+ adns_rrtype *rrtype_r, adns_sockaddr *addr_r) {
+ if (!revparse_check_tail(rps,dgram,nlabels,4,"in-addr")) return 0;
+
+ uint32_t a=0;
+ int i;
+ for (i=3; i>=0; i--) {
+ REVPARSE_P_L(i);
+ unsigned v;
+ if (!revparse_atoi(p,l,10,255,&v)) return 0;
+ a <<= 8;
+ a |= v;
+ }
+ *rrtype_r= adns_r_a;
+ addr_r->inet.sin_family= AF_INET;
+ addr_r->inet.sin_addr.s_addr= htonl(a);
+ return 1;
+}
+
+static bool revparse_inet6(struct revparse_state *rps,
+ const char *dgram, int nlabels,
+ adns_rrtype *rrtype_r, adns_sockaddr *addr_r) {
+ if (!revparse_check_tail(rps,dgram,nlabels,32,"ip6")) return 0;
+
+ int i, j;
+ memset(addr_r,0,sizeof(*addr_r));
+ unsigned char *a= addr_r->inet6.sin6_addr.s6_addr+16;
+ for (i=0; i<32; ) { /* i incremented in inner loop */
+ unsigned b=0;
+ for (j=0; j<2; j++, i++) {
+ REVPARSE_P_L(i);
+ unsigned v;
+ if (!revparse_atoi(p,l,16,15,&v)) return 0;
+ b >>= 4;
+ b |= v << 4;
+ }
+ *--a= b;
+ }
+ *rrtype_r= adns_r_aaaa;
+ addr_r->inet.sin_family= AF_INET6;
+ return 1;
+}
+
+bool adns__revparse_label(struct revparse_state *rps, int labnum,
+ const char *dgram, int labstart, int lablen) {
+ if (labnum >= MAXREVLABELS)
+ return 0;
+
+ assert(labstart <= 65535);
+ assert(lablen <= 255);
+ rps->labstart[labnum] = labstart;
+ rps->lablen[labnum] = lablen;
+ return 1;
+}
+
+bool adns__revparse_done(struct revparse_state *rps,
+ const char *dgram, int nlabels,
+ adns_rrtype *rrtype_r, adns_sockaddr *addr_r) {
+ return
+ revparse_inet(rps,dgram,nlabels,rrtype_r,addr_r) ||
+ revparse_inet6(rps,dgram,nlabels,rrtype_r,addr_r);
+}
diff --git a/src/adns.h b/src/adns.h
new file mode 100644
index 0000000..a6599f6
--- /dev/null
+++ b/src/adns.h
@@ -0,0 +1,1067 @@
+/*
+ * adns.h
+ * - adns user-visible API
+ */
+/*
+ *
+ * This file is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ *
+ * It is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ *
+ * For the benefit of certain LGPL'd `omnibus' software which
+ * provides a uniform interface to various things including adns, I
+ * make the following additional licence. I do this because the GPL
+ * would otherwise force either the omnibus software to be GPL'd or
+ * the adns-using part to be distributed separately.
+ *
+ * So: you may also redistribute and/or modify adns.h (but only the
+ * public header file adns.h and not any other part of adns) under the
+ * terms of the GNU Library General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * Note that adns itself is GPL'd. Authors of adns-using applications
+ * with GPL-incompatible licences, and people who distribute adns with
+ * applications where the whole distribution is not GPL'd, are still
+ * likely to be in violation of the GPL. Anyone who wants to do this
+ * should contact Ian Jackson. Please note that to avoid encouraging
+ * people to infringe the GPL as it applies to the body of adns, Ian
+ * thinks that if you take advantage of the special exception to
+ * redistribute just adns.h under the LGPL, you should retain this
+ * paragraph in its place in the appropriate copyright statements.
+ *
+ *
+ * You should have received a copy of the GNU General Public License,
+ * or the GNU Library General Public License, as appropriate, along
+ * with this program; if not, write to the Free Software Foundation.
+ *
+ */
+
+#ifndef ADNS_H_INCLUDED
+#define ADNS_H_INCLUDED
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <net/if.h>
+
+#ifdef __cplusplus
+extern "C" { /* I really dislike this - iwj. */
+#endif
+
+/* Whether to support address families other than IPv4 in responses which use
+ * the `adns_rr_addr' structure. This is a source-compatibility issue: old
+ * clients may not expect to find address families other than AF_INET in
+ * their query results. There's a separate binary compatibility issue to do
+ * with the size of the `adns_rr_addr' structure, but we'll assume you can
+ * cope with that because you have this header file. Define
+ * `ADNS_FEATURE_IPV4ONLY' if you only want to see AF_INET addresses by
+ * default, or `ADNS_FEATURE_MANYAF' to allow multiple address families; the
+ * default is currently to stick with AF_INET only, but this is likely to
+ * change in a later release of ADNS. Note that any adns_qf_want_... flags
+ * in your query are observed: this setting affects only the default address
+ * families.
+ */
+#if !defined(ADNS_FEATURE_IPV4ONLY) && !defined(ADNS_FEATURE_MANYAF)
+# define ADNS_FEATURE_IPV4ONLY
+#elif defined(ADNS_FEATURE_IPV4ONLY) && defined(ADNS_FEATURE_MANYAF)
+# error "Feature flags ADNS_FEATURE_IPV4ONLY and ..._MANYAF are incompatible"
+#endif
+
+/* All struct in_addr anywhere in adns are in NETWORK byte order. */
+
+typedef struct adns__state *adns_state;
+typedef struct adns__query *adns_query;
+
+typedef enum { /* In general, or together the desired flags: */
+ adns_if_none= 0x0000,/* no flags. nicer than 0 for some compilers */
+ adns_if_noenv= 0x0001,/* do not look at environment */
+ adns_if_noerrprint= 0x0002,/* never print to stderr (_debug overrides) */
+ adns_if_noserverwarn=0x0004,/* do not warn to stderr about duff servers etc */
+ adns_if_debug= 0x0008,/* enable all output to stderr plus debug msgs */
+ adns_if_logpid= 0x0080,/* include pid in diagnostic output */
+ adns_if_noautosys= 0x0010,/* do not make syscalls at every opportunity */
+ adns_if_eintr= 0x0020,/* allow _wait and _synchronous to return EINTR */
+ adns_if_nosigpipe= 0x0040,/* applic has SIGPIPE ignored, do not protect */
+ adns_if_checkc_entex=0x0100,/* consistency checks on entry/exit to adns fns */
+ adns_if_checkc_freq= 0x0300,/* consistency checks very frequently (slow!) */
+
+ adns_if_permit_ipv4= 0x0400,/* allow _addr queries to return IPv4 addresses */
+ adns_if_permit_ipv6= 0x0800,/* allow _addr queries to return IPv6 addresses */
+ adns_if_afmask= 0x0c00,
+ /* These are policy flags, and overridden by the adns_af:... option in
+ * resolv.conf. If the adns_qf_want_... query flags are incompatible with
+ * these settings (in the sense that no address families are permitted at
+ * all) then the query flags take precedence; otherwise only records which
+ * satisfy all of the stated requirements are allowed.
+ */
+ adns__if_sizeforce= 0x7fff,
+} adns_initflags;
+
+typedef enum { /* In general, or together the desired flags: */
+ adns_qf_none= 0x00000000,/* no flags */
+ adns_qf_search= 0x00000001,/* use the searchlist */
+ adns_qf_usevc= 0x00000002,/* use a virtual circuit (TCP conn) */
+ adns_qf_owner= 0x00000004,/* fill in the owner field in the answer */
+ adns_qf_quoteok_query= 0x00000010,/* allow special chars in query domain */
+ adns_qf_quoteok_cname= 0x00000000,/* ... in CNAME we go via (now default) */
+ adns_qf_quoteok_anshost=0x00000040,/* ... in things supposedly hostnames */
+ adns_qf_quotefail_cname=0x00000080,/* refuse if quote-req chars in CNAME we go via */
+ adns_qf_cname_loose= 0x00000100,/* allow refs to CNAMEs - without, get _s_cname */
+ adns_qf_cname_strict= 0x00010000,/* forbid CNAME refs (default, currently) */
+ adns_qf_cname_forbid= 0x00000200,/* don't follow CNAMEs, instead give _s_cname */
+
+ adns_qf_want_ipv4= 0x00000400,/* try to return IPv4 addresses */
+ adns_qf_want_ipv6= 0x00000800,/* try to return IPv6 addresses */
+ adns_qf_want_allaf= 0x00000c00,/* all the above flag bits */
+ /* Without any of the _qf_want_... flags, _qtf_deref queries try to return
+ * all address families permitted by _if_permit_... (as overridden by the
+ * `adns_af:...' configuration option). Set flags to restrict the
+ * returned address families to the ones selected.
+ */
+ adns_qf_ipv6_mapv4= 0x00001000,/* ... return IPv4 addresses as v6-mapped */
+
+ adns_qf_addrlit_scope_forbid=0x00002000,/* forbid %<scope> in IPv6 literals */
+ adns_qf_addrlit_scope_numeric=0x00004000,/* %<scope> may only be numeric */
+ adns_qf_addrlit_ipv4_quadonly=0x00008000,/* reject non-dotted-quad ipv4 */
+
+ adns__qf_internalmask= 0x0ff00000,
+ adns__qf_sizeforce= 0x7fffffff
+} adns_queryflags;
+
+typedef enum {
+ adns_rrt_typemask= 0x0ffff,
+ adns_rrt_reprmask= 0xffffff,
+ adns__qtf_deref_bit=0x10000,/* internal version of ..._deref below */
+ adns__qtf_mail822= 0x20000,/* return mailboxes in RFC822 rcpt field fmt */
+
+ adns__qtf_bigaddr=0x1000000,/* use the new larger sockaddr union */
+ adns__qtf_manyaf= 0x2000000,/* permitted to return multiple address families */
+
+ adns__qtf_deref= adns__qtf_deref_bit|adns__qtf_bigaddr
+#ifdef ADNS_FEATURE_MANYAF
+ |adns__qtf_manyaf
+#endif
+ ,/* dereference domains; perhaps get extra data */
+
+ adns_r_unknown= 0x40000,
+ /* To use this, ask for records of type <rr-type-code>|adns_r_unknown.
+ * adns will not process the RDATA - you'll get adns_rr_byteblocks,
+ * where the int is the length and the unsigned char* points to the
+ * data. String representation of the RR data (by adns_rrinfo) is as in
+ * RFC3597. adns_rr_info will not return the type name in *rrtname_r
+ * (due to memory management problems); *fmtname_r will be set to
+ * "unknown".
+ *
+ * Do not specify adns_r_unknown along with a known RR type which
+ * requires domain name uncompression (see RFC3597 s4); domain names
+ * will not be uncompressed and the resulting data would be useless.
+ * Asking for meta-RR types via adns_r_unknown will not work properly
+ * either and may make adns complain about server misbehaviour, so don't
+ * do that.
+ *
+ * Don't forget adns_qf_quoteok if that's what you want. */
+
+ adns_r_none= 0,
+
+ adns_r_a= 1,
+
+ adns_r_ns_raw= 2,
+ adns_r_ns= adns_r_ns_raw|adns__qtf_deref,
+
+ adns_r_cname= 5,
+
+ adns_r_soa_raw= 6,
+ adns_r_soa= adns_r_soa_raw|adns__qtf_mail822,
+
+ adns_r_ptr_raw= 12, /* do not mind PTR with wrong or missing addr */
+ adns_r_ptr= adns_r_ptr_raw|adns__qtf_deref,
+
+ adns_r_hinfo= 13,
+
+ adns_r_mx_raw= 15,
+ adns_r_mx= adns_r_mx_raw|adns__qtf_deref,
+
+ adns_r_txt= 16,
+
+ adns_r_rp_raw= 17,
+ adns_r_rp= adns_r_rp_raw|adns__qtf_mail822,
+
+ adns_r_aaaa= 28,
+
+ /* For SRV records, query domain without _qf_quoteok_query must look
+ * as expected from SRV RFC with hostname-like Name. _With_
+ * _quoteok_query, any query domain is allowed. */
+ adns_r_srv_raw= 33,
+ adns_r_srv= adns_r_srv_raw|adns__qtf_deref,
+
+ adns_r_addr= adns_r_a|adns__qtf_deref,
+
+ adns__rrt_sizeforce= 0x7fffffff,
+
+} adns_rrtype;
+
+/*
+ * In queries without qf_quoteok_*, all domains must have standard
+ * legal syntax, or you get adns_s_querydomainvalid (if the query
+ * domain contains bad characters) or adns_s_answerdomaininvalid (if
+ * the answer contains bad characters).
+ *
+ * In queries _with_ qf_quoteok_*, domains in the query or response
+ * may contain any characters, quoted according to RFC1035 5.1. On
+ * input to adns, the char* is a pointer to the interior of a "
+ * delimited string, except that " may appear in it unquoted. On
+ * output, the char* is a pointer to a string which would be legal
+ * either inside or outside " delimiters; any character which isn't
+ * legal in a hostname (ie alphanumeric or hyphen) or one of _ / +
+ * (the three other punctuation characters commonly abused in domain
+ * names) will be quoted, as \X if it is a printing ASCII character or
+ * \DDD otherwise.
+ *
+ * If the query goes via a CNAME then the canonical name (ie, the
+ * thing that the CNAME record refers to) is usually allowed to
+ * contain any characters, which will be quoted as above. With
+ * adns_qf_quotefail_cname you get adns_s_answerdomaininvalid when
+ * this happens. (This is a change from version 0.4 and earlier, in
+ * which failing the query was the default, and you had to say
+ * adns_qf_quoteok_cname to avoid this; that flag is now deprecated.)
+ *
+ * In version 0.4 and earlier, asking for _raw records containing
+ * mailboxes without specifying _qf_quoteok_anshost was silly. This
+ * is no longer the case. In this version only parts of responses
+ * that are actually supposed to be hostnames will be refused by
+ * default if quote-requiring characters are found.
+ */
+
+/*
+ * If you ask for an RR which contains domains which are actually
+ * encoded mailboxes, and don't ask for the _raw version, then adns
+ * returns the mailbox formatted suitably for an RFC822 recipient
+ * header field. The particular format used is that if the mailbox
+ * requires quoting according to the rules in RFC822 then the
+ * local-part is quoted in double quotes, which end at the next
+ * unescaped double quote (\ is the escape char, and is doubled, and
+ * is used to escape only \ and "). If the local-part is legal
+ * without quoting according to RFC822, it is presented as-is. In any
+ * case the local-part is followed by an @ and the domain. The domain
+ * will not contain any characters not legal in hostnames.
+ *
+ * Unquoted local-parts may contain any printing 7-bit ASCII
+ * except the punctuation characters ( ) < > @ , ; : \ " [ ]
+ * I.e. they may contain alphanumerics, and the following
+ * punctuation characters: ! # % ^ & * - _ = + { } .
+ *
+ * adns will reject local parts containing control characters (byte
+ * values 0-31, 127-159, and 255) - these appear to be legal according
+ * to RFC822 (at least 0-127) but are clearly a bad idea. RFC1035
+ * syntax does not make any distinction between a single RFC822
+ * quoted-string containing full stops, and a series of quoted-strings
+ * separated by full stops; adns will return anything that isn't all
+ * valid atoms as a single quoted-string. RFC822 does not allow
+ * high-bit-set characters at all, but adns does allow them in
+ * local-parts, treating them as needing quoting.
+ *
+ * If you ask for the domain with _raw then _no_ checking is done
+ * (even on the host part, regardless of adns_qf_quoteok_anshost), and
+ * you just get the domain name in master file format.
+ *
+ * If no mailbox is supplied the returned string will be `.' in either
+ * case.
+ */
+
+typedef enum {
+ adns_s_ok,
+
+ /* locally induced errors */
+ adns_s_nomemory,
+ adns_s_unknownrrtype,
+ adns_s_systemfail,
+
+ adns_s_max_localfail= 29,
+
+ /* remotely induced errors, detected locally */
+ adns_s_timeout,
+ adns_s_allservfail,
+ adns_s_norecurse,
+ adns_s_invalidresponse,
+ adns_s_unknownformat,
+
+ adns_s_max_remotefail= 59,
+
+ /* remotely induced errors, reported by remote server to us */
+ adns_s_rcodeservfail,
+ adns_s_rcodeformaterror,
+ adns_s_rcodenotimplemented,
+ adns_s_rcoderefused,
+ adns_s_rcodeunknown,
+
+ adns_s_max_tempfail= 99,
+
+ /* remote configuration errors */
+ adns_s_inconsistent, /* PTR gives domain whose addr is missing or mismatch */
+ adns_s_prohibitedcname, /* CNAME, but eg A expected (not if _qf_cname_loose) */
+ adns_s_answerdomaininvalid,
+ adns_s_answerdomaintoolong,
+ adns_s_invaliddata,
+
+ adns_s_max_misconfig= 199,
+
+ /* permanent problems with the query */
+ adns_s_querydomainwrong,
+ adns_s_querydomaininvalid,
+ adns_s_querydomaintoolong,
+
+ adns_s_max_misquery= 299,
+
+ /* permanent errors */
+ adns_s_nxdomain,
+ adns_s_nodata,
+
+ adns_s_max_permfail= 499
+
+} adns_status;
+
+typedef union {
+ struct sockaddr sa;
+ struct sockaddr_in inet;
+} adns_sockaddr_v4only;
+
+typedef union {
+ struct sockaddr sa;
+ struct sockaddr_in inet;
+ struct sockaddr_in6 inet6;
+} adns_sockaddr;
+
+typedef struct {
+ int len;
+ adns_sockaddr addr;
+} adns_rr_addr;
+
+typedef struct {
+ /* the old v4-only structure; handy if you have complicated binary
+ * compatibility problems. */
+ int len;
+ adns_sockaddr_v4only addr;
+} adns_rr_addr_v4only;
+
+typedef struct {
+ char *host;
+ adns_status astatus;
+ int naddrs; /* temp fail => -1, perm fail => 0, s_ok => >0 */
+ adns_rr_addr *addrs;
+} adns_rr_hostaddr;
+
+typedef struct {
+ char *(array[2]);
+} adns_rr_strpair;
+
+typedef struct {
+ int i;
+ adns_rr_hostaddr ha;
+} adns_rr_inthostaddr;
+
+typedef struct {
+ /* Used both for mx_raw, in which case i is the preference and str
+ * the domain, and for txt, in which case each entry has i for the
+ * `text' length, and str for the data (which will have had an extra
+ * nul appended so that if it was plain text it is now a
+ * null-terminated string).
+ */
+ int i;
+ char *str;
+} adns_rr_intstr;
+
+typedef struct {
+ adns_rr_intstr array[2];
+} adns_rr_intstrpair;
+
+typedef struct {
+ char *mname, *rname;
+ unsigned long serial, refresh, retry, expire, minimum;
+} adns_rr_soa;
+
+typedef struct {
+ int priority, weight, port;
+ char *host;
+} adns_rr_srvraw;
+
+typedef struct {
+ int priority, weight, port;
+ adns_rr_hostaddr ha;
+} adns_rr_srvha;
+
+typedef struct {
+ int len;
+ unsigned char *data;
+} adns_rr_byteblock;
+
+typedef struct {
+ adns_status status;
+ char *cname; /* always NULL if query was for CNAME records */
+ char *owner; /* only set if req'd in query flags; maybe 0 on error anyway */
+ adns_rrtype type; /* guaranteed to be same as in query */
+ time_t expires;/*abs time. def only if _s_ok, nxdomain or nodata. NOT TTL!*/
+ int nrrs, rrsz; /* nrrs is 0 if an error occurs */
+ union {
+ void *untyped;
+ unsigned char *bytes;
+ char *(*str); /* ns_raw, cname, ptr, ptr_raw */
+ adns_rr_intstr *(*manyistr); /* txt (list strs ends with i=-1, str=0)*/
+ adns_rr_addr *addr; /* addr */
+ struct in_addr *inaddr; /* a */
+ struct in6_addr *in6addr; /* aaaa */
+ adns_rr_hostaddr *hostaddr; /* ns */
+ adns_rr_intstrpair *intstrpair; /* hinfo */
+ adns_rr_strpair *strpair; /* rp, rp_raw */
+ adns_rr_inthostaddr *inthostaddr;/* mx */
+ adns_rr_intstr *intstr; /* mx_raw */
+ adns_rr_soa *soa; /* soa, soa_raw */
+ adns_rr_srvraw *srvraw; /* srv_raw */
+ adns_rr_srvha *srvha;/* srv */
+ adns_rr_byteblock *byteblock; /* ...|unknown */
+ } rrs;
+} adns_answer;
+
+/* Memory management:
+ * adns_state and adns_query are actually pointers to malloc'd state;
+ * On submission questions are copied, including the owner domain;
+ * Answers are malloc'd as a single piece of memory; pointers in the
+ * answer struct point into further memory in the answer.
+ * query_io:
+ * Must always be non-null pointer;
+ * If *query_io is 0 to start with then any query may be returned;
+ * If *query_io is !0 adns_query then only that query may be returned.
+ * If the call is successful, *query_io, *answer_r, and *context_r
+ * will all be set.
+ * Errors:
+ * Return values are 0 or an errno value.
+ *
+ * For _init, _init_strcfg, _submit and _synchronous, system errors
+ * (eg, failure to create sockets, malloc failure, etc.) return errno
+ * values. EINVAL from _init et al means the configuration file
+ * is erroneous and cannot be parsed.
+ *
+ * For _wait and _check failures are reported in the answer
+ * structure, and only 0, ESRCH or (for _check) EAGAIN is
+ * returned: if no (appropriate) requests are done adns_check returns
+ * EAGAIN; if no (appropriate) requests are outstanding both
+ * adns_query and adns_wait return ESRCH.
+ *
+ * Additionally, _wait can return EINTR if you set adns_if_eintr.
+ *
+ * All other errors (nameserver failure, timed out connections, &c)
+ * are returned in the status field of the answer. After a
+ * successful _wait or _check, if status is nonzero then nrrs will be
+ * 0, otherwise it will be >0. type will always be the type
+ * requested.
+ */
+
+/* Threads:
+ * adns does not use any static modifiable state, so it
+ * is safe to call adns_init several times and then use the
+ * resulting adns_states concurrently.
+ * However, it is NOT safe to make simultaneous calls into
+ * adns using the same adns_state; a single adns_state must be used
+ * only by one thread at a time. You can solve this problem by
+ * having one adns_state per thread, or if that isn't feasible, you
+ * could maintain a pool of adns_states. Unfortunately neither of
+ * these approaches has optimal performance.
+ */
+
+int adns_init(adns_state *newstate_r, adns_initflags flags,
+ FILE *diagfile /*0=>stderr*/);
+
+int adns_init_strcfg(adns_state *newstate_r, adns_initflags flags,
+ FILE *diagfile /*0=>discard*/, const char *configtext);
+
+typedef void adns_logcallbackfn(adns_state ads, void *logfndata,
+ const char *fmt, va_list al);
+ /* Will be called perhaps several times for each message; when the
+ * message is complete, the string implied by fmt and al will end in
+ * a newline. Log messages start with `adns debug:' or `adns
+ * warning:' or `adns:' (for errors), or `adns debug [PID]:'
+ * etc. if adns_if_logpid is set. */
+
+int adns_init_logfn(adns_state *newstate_r, adns_initflags flags,
+ const char *configtext /*0=>use default config files*/,
+ adns_logcallbackfn *logfn /*0=>logfndata is a FILE* */,
+ void *logfndata /*0 with logfn==0 => discard*/);
+
+/* Configuration:
+ * adns_init reads /etc/resolv.conf, which is expected to be (broadly
+ * speaking) in the format expected by libresolv, and then
+ * /etc/resolv-adns.conf if it exists. adns_init_strcfg is instead
+ * passed a string which is interpreted as if it were the contents of
+ * resolv.conf or resolv-adns.conf. In general, configuration which
+ * is set later overrides any that is set earlier.
+ *
+ * Standard directives understood in resolv[-adns].conf:
+ *
+ * nameserver <address>
+ * Must be followed by the IP address of a nameserver. Several
+ * nameservers may be specified, and they will be tried in the order
+ * found. There is a compiled in limit, currently 5, on the number
+ * of nameservers. (libresolv supports only 3 nameservers.)
+ *
+ * search <domain> ...
+ * Specifies the search list for queries which specify
+ * adns_qf_search. This is a list of domains to append to the query
+ * domain. The query domain will be tried as-is either before all
+ * of these or after them, depending on the ndots option setting
+ * (see below).
+ *
+ * domain <domain>
+ * This is present only for backward compatibility with obsolete
+ * versions of libresolv. It should not be used, and is interpreted
+ * by adns as if it were `search' - note that this is subtly
+ * different to libresolv's interpretation of this directive.
+ *
+ * sortlist <addr>/<mask> ...
+ * Should be followed by a sequence of IP-address and netmask pairs,
+ * separated by spaces. They may be specified as
+ * eg. 172.30.206.0/24 or 172.30.206.0/255.255.255.0. Currently up
+ * to 15 pairs may be specified (but note that libresolv only
+ * supports up to 10).
+ *
+ * options
+ * Should followed by one or more options, separated by spaces.
+ * Each option consists of an option name, followed by optionally
+ * a colon and a value. Options are listed below.
+ *
+ * Non-standard directives understood in resolv[-adns].conf:
+ *
+ * clearnameservers
+ * Clears the list of nameservers, so that further nameserver lines
+ * start again from the beginning.
+ *
+ * include <filename>
+ * The specified file will be read.
+ *
+ * Additionally, adns will ignore lines in resolv[-adns].conf which
+ * start with a #.
+ *
+ * Standard options understood:
+ *
+ * debug
+ * Enables debugging output from the resolver, which will be written
+ * to stderr.
+ *
+ * ndots:<count>
+ * Affects whether queries with adns_qf_search will be tried first
+ * without adding domains from the searchlist, or whether the bare
+ * query domain will be tried last. Queries which contain at least
+ * <count> dots will be tried bare first. The default is 1.
+ *
+ * Non-standard options understood:
+ *
+ * adns_checkc:none
+ * adns_checkc:entex
+ * adns_checkc:freq
+ * Changes the consistency checking frequency; this overrides the
+ * setting of adns_if_check_entex, adns_if_check_freq, or neither,
+ * in the flags passed to adns_init.
+ *
+ * adns_af:{ipv4,ipv6},... adns_af:any
+ * Determines which address families ADNS looks up (either as an
+ * adns_r_addr query, or when dereferencing an answer yielding hostnames
+ * (e.g., adns_r_mx). The argument is a comma-separated list: only the
+ * address families listed will be looked up. The default is `any'.
+ * Lookups occur (logically) concurrently; use the `sortlist' directive to
+ * control the relative order of addresses in answers. This option
+ * overrides the corresponding init flags (covered by adns_if_afmask).
+ *
+ * adns_ignoreunkcfg
+ * Ignore unknown options and configuration directives, rather than
+ * logging them. To be effective, appear in the configuration
+ * before the unknown options. ADNS_RES_OPTIONS is generally early
+ * enough.
+ *
+ * There are a number of environment variables which can modify the
+ * behaviour of adns. They take effect only if adns_init is used, and
+ * the caller of adns_init can disable them using adns_if_noenv. In
+ * each case there is both a FOO and an ADNS_FOO; the latter is
+ * interpreted later so that it can override the former. Unless
+ * otherwise stated, environment variables are interpreted after
+ * resolv[-adns].conf are read, in the order they are listed here.
+ *
+ * RES_CONF, ADNS_RES_CONF
+ * A filename, whose contets are in the format of resolv.conf.
+ *
+ * RES_CONF_TEXT, ADNS_RES_CONF_TEXT
+ * A string in the format of resolv.conf.
+ *
+ * RES_OPTIONS, ADNS_RES_OPTIONS
+ * These are parsed as if they appeared in the `options' line of a
+ * resolv.conf. In addition to being parsed at this point in the
+ * sequence, they are also parsed at the very beginning before
+ * resolv.conf or any other environment variables are read, so that
+ * any debug option can affect the processing of the configuration.
+ *
+ * LOCALDOMAIN, ADNS_LOCALDOMAIN
+ * These are interpreted as if their contents appeared in a `search'
+ * line in resolv.conf.
+ */
+
+int adns_synchronous(adns_state ads,
+ const char *owner,
+ adns_rrtype type,
+ adns_queryflags flags,
+ adns_answer **answer_r);
+
+/* NB: if you set adns_if_noautosys then _submit and _check do not
+ * make any system calls; you must use some of the asynch-io event
+ * processing functions to actually get things to happen.
+ */
+
+int adns_submit(adns_state ads,
+ const char *owner,
+ adns_rrtype type,
+ adns_queryflags flags,
+ void *context,
+ adns_query *query_r);
+
+/* The owner should be quoted in master file format. */
+
+int adns_check(adns_state ads,
+ adns_query *query_io,
+ adns_answer **answer_r,
+ void **context_r);
+
+int adns_wait(adns_state ads,
+ adns_query *query_io,
+ adns_answer **answer_r,
+ void **context_r);
+
+/* same as adns_wait but uses poll(2) internally */
+int adns_wait_poll(adns_state ads,
+ adns_query *query_io,
+ adns_answer **answer_r,
+ void **context_r);
+
+void adns_cancel(adns_query query);
+
+/* The adns_query you get back from _submit is valid (ie, can be
+ * legitimately passed into adns functions) until it is returned by
+ * adns_check or adns_wait, or passed to adns_cancel. After that it
+ * must not be used. You can rely on it not being reused until the
+ * first adns_submit or _transact call using the same adns_state after
+ * it became invalid, so you may compare it for equality with other
+ * query handles until you next call _query or _transact.
+ *
+ * _submit and _synchronous return ENOSYS if they don't understand the
+ * query type.
+ */
+
+int adns_submit_reverse(adns_state ads,
+ const struct sockaddr *addr,
+ adns_rrtype type,
+ adns_queryflags flags,
+ void *context,
+ adns_query *query_r);
+/* type must be _r_ptr or _r_ptr_raw. _qf_search is ignored.
+ * addr->sa_family must be AF_INET or you get ENOSYS.
+ */
+
+int adns_submit_reverse_any(adns_state ads,
+ const struct sockaddr *addr,
+ const char *rzone,
+ adns_rrtype type,
+ adns_queryflags flags,
+ void *context,
+ adns_query *query_r);
+/* For RBL-style reverse `zone's; look up
+ * <reversed-address>.<zone>
+ * Any type is allowed. _qf_search is ignored.
+ * addr->sa_family must be AF_INET or you get ENOSYS.
+ */
+
+void adns_finish(adns_state ads);
+/* You may call this even if you have queries outstanding;
+ * they will be cancelled.
+ */
+
+#define ADNS_ADDR2TEXT_BUFLEN \
+ (INET6_ADDRSTRLEN + 1/*%*/ \
+ + ((IF_NAMESIZE-1) > 9 ? (IF_NAMESIZE-1) : 9/*uint32*/) \
+ + 1/* nul; included in IF_NAMESIZE */)
+
+int adns_text2addr(const char *text, uint16_t port, adns_queryflags flags,
+ struct sockaddr *sa_r,
+ socklen_t *salen_io /* updated iff OK or ENOSPC */);
+int adns_addr2text(const struct sockaddr *sa, adns_queryflags flags,
+ char *buffer, int *buflen_io /* updated ONLY on ENOSPC */,
+ int *port_r /* may be 0 */);
+ /*
+ * port is always in host byte order and is simply copied to and
+ * from the appropriate sockaddr field (byteswapped as necessary).
+ *
+ * The only flags supported are adns_qf_addrlit_...
+ *
+ * Error return values are:
+ *
+ * ENOSPC Output buffer is too small. Can only happen if
+ * *buflen_io < ADNS_ADDR2TEXT_BUFLEN or
+ * *salen_io < sizeof(adns_sockaddr). On return,
+ * *buflen_io or *salen_io has been updated by adns.
+ *
+ * EINVAL text has invalid syntax.
+ *
+ * text represents an address family not supported by
+ * this version of adns.
+ *
+ * Scoped address supplied (text contained "%" or
+ * sin6_scope_id nonzero) but caller specified
+ * adns_qf_addrlit_scope_forbid.
+ *
+ * Scope name (rather than number) supplied in text but
+ * caller specified adns_qf_addrlit_scope_numeric.
+ *
+ * EAFNOSUPPORT sa->sa_family is not supported (addr2text only).
+ *
+ * ENOSYS Unsupported flags set.
+ *
+ * Only if neither adns_qf_addrlit_scope_forbid nor
+ * adns_qf_addrlit_scope_numeric are set:
+ *
+ * ENOSYS Scope name supplied in text but IPv6 address part of
+ * sockaddr is not a link local address.
+ *
+ * ENXIO Scope name supplied in text but if_nametoindex
+ * said it wasn't a valid local interface name.
+ *
+ * EIO Scoped address supplied but if_nametoindex failed
+ * in an unexpected way; adns has printed a message to
+ * stderr.
+ *
+ * any other if_nametoindex failed in a more-or-less expected way.
+ */
+
+void adns_forallqueries_begin(adns_state ads);
+adns_query adns_forallqueries_next(adns_state ads, void **context_r);
+/* Iterator functions, which you can use to loop over the outstanding
+ * (submitted but not yet successfuly checked/waited) queries.
+ *
+ * You can only have one iteration going at once. You may call _begin
+ * at any time; after that, an iteration will be in progress. You may
+ * only call _next when an iteration is in progress - anything else
+ * may coredump. The iteration remains in progress until _next
+ * returns 0, indicating that all the queries have been walked over,
+ * or ANY other adns function is called with the same adns_state (or a
+ * query in the same adns_state). There is no need to explicitly
+ * finish an iteration.
+ *
+ * context_r may be 0. *context_r may not be set when _next returns 0.
+ */
+
+void adns_checkconsistency(adns_state ads, adns_query qu);
+/* Checks the consistency of adns's internal data structures.
+ * If any error is found, the program will abort().
+ * You may pass 0 for qu; if you pass non-null then additional checks
+ * are done to make sure that qu is a valid query.
+ */
+
+/*
+ * Example expected/legal calling sequence for submit/check/wait:
+ * adns_init
+ * adns_submit 1
+ * adns_submit 2
+ * adns_submit 3
+ * adns_wait 1
+ * adns_check 3 -> EAGAIN
+ * adns_wait 2
+ * adns_wait 3
+ * ....
+ * adns_finish
+ */
+
+/*
+ * Entrypoints for generic asynch io:
+ * (these entrypoints are not very useful except in combination with *
+ * some of the other I/O model calls which can tell you which fds to
+ * be interested in):
+ *
+ * Note that any adns call may cause adns to open and close fds, so
+ * you must call beforeselect or beforepoll again just before
+ * blocking, or you may not have an up-to-date list of it's fds.
+ */
+
+int adns_processany(adns_state ads);
+/* Gives adns flow-of-control for a bit. This will never block, and
+ * can be used with any threading/asynch-io model. If some error
+ * occurred which might cause an event loop to spin then the errno
+ * value is returned.
+ */
+
+int adns_processreadable(adns_state ads, int fd, const struct timeval *now);
+int adns_processwriteable(adns_state ads, int fd, const struct timeval *now);
+int adns_processexceptional(adns_state ads, int fd, const struct timeval *now);
+/* Gives adns flow-of-control so that it can process incoming data
+ * from, or send outgoing data via, fd. Very like _processany. If it
+ * returns zero then fd will no longer be readable or writeable
+ * (unless of course more data has arrived since). adns will _only_
+ * use that fd and only in the manner specified, regardless of whether
+ * adns_if_noautosys was specified.
+ *
+ * adns_processexceptional should be called when select(2) reports an
+ * exceptional condition, or poll(2) reports POLLPRI.
+ *
+ * It is fine to call _processreabable or _processwriteable when the
+ * fd is not ready, or with an fd that doesn't belong to adns; it will
+ * then just return 0.
+ *
+ * If some error occurred which might prevent an event loop to spin
+ * then the errno value is returned.
+ */
+
+void adns_processtimeouts(adns_state ads, const struct timeval *now);
+/* Gives adns flow-of-control so that it can process any timeouts
+ * which might have happened. Very like _processreadable/writeable.
+ *
+ * now may be 0; if it isn't, *now must be the current time, recently
+ * obtained from gettimeofday.
+ */
+
+void adns_firsttimeout(adns_state ads,
+ struct timeval **tv_mod, struct timeval *tv_buf,
+ struct timeval now);
+/* Asks adns when it would first like the opportunity to time
+ * something out. now must be the current time, from gettimeofday.
+ *
+ * If tv_mod points to 0 then tv_buf must be non-null, and
+ * _firsttimeout will fill in *tv_buf with the time until the first
+ * timeout, and make *tv_mod point to tv_buf. If adns doesn't have
+ * anything that might need timing out it will leave *tv_mod as 0.
+ *
+ * If *tv_mod is not 0 then tv_buf is not used. adns will update
+ * *tv_mod if it has any earlier timeout, and leave it alone if it
+ * doesn't.
+ *
+ * This call will not actually do any I/O, or change the fds that adns
+ * is using. It always succeeds and never blocks.
+ */
+
+void adns_globalsystemfailure(adns_state ads);
+/* If serious problem(s) happen which globally affect your ability to
+ * interact properly with adns, or adns's ability to function
+ * properly, you or adns can call this function.
+ *
+ * All currently outstanding queries will be made to fail with
+ * adns_s_systemfail, and adns will close any stream sockets it has
+ * open.
+ *
+ * This is used by adns, for example, if gettimeofday() fails.
+ * Without this the program's event loop might start to spin !
+ *
+ * This call will never block.
+ */
+
+/*
+ * Entrypoints for select-loop based asynch io:
+ */
+
+void adns_beforeselect(adns_state ads, int *maxfd, fd_set *readfds,
+ fd_set *writefds, fd_set *exceptfds,
+ struct timeval **tv_mod, struct timeval *tv_buf,
+ const struct timeval *now);
+/* Find out file descriptors adns is interested in, and when it would
+ * like the opportunity to time something out. If you do not plan to
+ * block then tv_mod may be 0. Otherwise, tv_mod and tv_buf are as
+ * for adns_firsttimeout. readfds, writefds, exceptfds and maxfd_io may
+ * not be 0.
+ *
+ * If tv_mod is 0 on entry then this will never actually do any I/O,
+ * or change the fds that adns is using or the timeouts it wants. In
+ * any case it won't block, and it will set the timeout to zero if a
+ * query finishes in _beforeselect.
+ */
+
+void adns_afterselect(adns_state ads, int maxfd, const fd_set *readfds,
+ const fd_set *writefds, const fd_set *exceptfds,
+ const struct timeval *now);
+/* Gives adns flow-of-control for a bit; intended for use after
+ * select. This is just a fancy way of calling adns_processreadable/
+ * writeable/timeouts as appropriate, as if select had returned the
+ * data being passed. Always succeeds.
+ */
+
+/*
+ * Example calling sequence:
+ *
+ * adns_init _noautosys
+ * loop {
+ * adns_beforeselect
+ * select
+ * adns_afterselect
+ * ...
+ * adns_submit / adns_check
+ * ...
+ * }
+ */
+
+/*
+ * Entrypoints for poll-loop based asynch io:
+ */
+
+struct pollfd;
+/* In case your system doesn't have it or you forgot to include
+ * <sys/poll.h>, to stop the following declarations from causing
+ * problems. If your system doesn't have poll then the following
+ * entrypoints will not be defined in libadns. Sorry !
+ */
+
+int adns_beforepoll(adns_state ads, struct pollfd *fds,
+ int *nfds_io, int *timeout_io,
+ const struct timeval *now);
+/* Finds out which fd's adns is interested in, and when it would like
+ * to be able to time things out. This is in a form suitable for use
+ * with poll(2).
+ *
+ * On entry, usually fds should point to at least *nfds_io structs.
+ * adns will fill up to that many structs will information for poll,
+ * and record in *nfds_io how many structs it filled. If it wants to
+ * listen for more structs then *nfds_io will be set to the number
+ * required and _beforepoll will return ERANGE.
+ *
+ * You may call _beforepoll with fds==0 and *nfds_io 0, in which case
+ * adns will fill in the number of fds that it might be interested in
+ * in *nfds_io, and always return either 0 (if it is not interested in
+ * any fds) or ERANGE (if it is).
+ *
+ * NOTE that (unless now is 0) adns may acquire additional fds
+ * from one call to the next, so you must put adns_beforepoll in a
+ * loop, rather than assuming that the second call (with the buffer
+ * size requested by the first) will not return ERANGE.
+ *
+ * adns only ever sets POLLIN, POLLOUT and POLLPRI in its pollfd
+ * structs, and only ever looks at those bits. POLLPRI is required to
+ * detect TCP Urgent Data (which should not be used by a DNS server)
+ * so that adns can know that the TCP stream is now useless.
+ *
+ * In any case, *timeout_io should be a timeout value as for poll(2),
+ * which adns will modify downwards as required. If the caller does
+ * not plan to block then *timeout_io should be 0 on entry, or
+ * alternatively, timeout_io may be 0. (Alternatively, the caller may
+ * use _beforeselect with timeout_io==0 to find out about file
+ * descriptors, and use _firsttimeout is used to find out when adns
+ * might want to time something out.)
+ *
+ * adns_beforepoll will return 0 on success, and will not fail for any
+ * reason other than the fds buffer being too small (ERANGE).
+ *
+ * This call will never actually do any I/O. If you supply the
+ * current time it will not change the fds that adns is using or the
+ * timeouts it wants.
+ *
+ * In any case this call won't block.
+ */
+
+#define ADNS_POLLFDS_RECOMMENDED 3
+/* If you allocate an fds buf with at least RECOMMENDED entries then
+ * you are unlikely to need to enlarge it. You are recommended to do
+ * so if it's convenient. However, you must be prepared for adns to
+ * require more space than this.
+ */
+
+void adns_afterpoll(adns_state ads, const struct pollfd *fds, int nfds,
+ const struct timeval *now);
+/* Gives adns flow-of-control for a bit; intended for use after
+ * poll(2). fds and nfds should be the results from poll(). pollfd
+ * structs mentioning fds not belonging to adns will be ignored.
+ */
+
+
+adns_status adns_rr_info(adns_rrtype type,
+ const char **rrtname_r, const char **fmtname_r,
+ int *len_r,
+ const void *datap, char **data_r);
+/*
+ * Get information about a query type, or convert reply data to a
+ * textual form. type must be specified, and the official name of the
+ * corresponding RR type will be returned in *rrtname_r, and
+ * information about the processing style in *fmtname_r. The length
+ * of the table entry in an answer for that type will be returned in
+ * in *len_r. Any or all of rrtname_r, fmtname_r and len_r may be 0.
+ * If fmtname_r is non-null then *fmtname_r may be null on return,
+ * indicating that no special processing is involved.
+ *
+ * data_r be must be non-null iff datap is. In this case *data_r will
+ * be set to point to a string pointing to a representation of the RR
+ * data in master file format. (The owner name, timeout, class and
+ * type will not be present - only the data part of the RR.) The
+ * memory will have been obtained from malloc() and must be freed by
+ * the caller.
+ *
+ * Usually this routine will succeed. Possible errors include:
+ * adns_s_nomemory
+ * adns_s_rrtypeunknown
+ * adns_s_invaliddata (*datap contained garbage)
+ * If an error occurs then no memory has been allocated,
+ * and *rrtname_r, *fmtname_r, *len_r and *data_r are undefined.
+ *
+ * There are some adns-invented data formats which are not official
+ * master file formats. These include:
+ *
+ * Mailboxes if __qtf_mail822: these are just included as-is.
+ *
+ * Addresses (adns_rr_addr): these may be of pretty much any type.
+ * The representation is in two parts: first, a word for the address
+ * family (ie, in AF_XXX, the XXX), and then one or more items for the
+ * address itself, depending on the format. For an IPv4 address the
+ * syntax is INET followed by the dotted quad (from inet_ntoa).
+ * Currently only IPv4 is supported.
+ *
+ * Text strings (as in adns_rr_txt) appear inside double quotes, and
+ * use \" and \\ to represent " and \, and \xHH to represent
+ * characters not in the range 32-126.
+ *
+ * Hostname with addresses (adns_rr_hostaddr): this consists of the
+ * hostname, as usual, followed by the adns_status value, as an
+ * abbreviation, and then a descriptive string (encoded as if it were
+ * a piece of text), for the address lookup, followed by zero or more
+ * addresses enclosed in ( and ). If the result was a temporary
+ * failure, then a single ? appears instead of the ( ). If the
+ * result was a permanent failure then an empty pair of parentheses
+ * appears (which a space in between). For example, one of the NS
+ * records for greenend.org.uk comes out like
+ * ns.chiark.greenend.org.uk ok "OK" ( INET 195.224.76.132 )
+ * an MX referring to a nonexistent host might come out like:
+ * 50 sun2.nsfnet-relay.ac.uk nxdomain "No such domain" ( )
+ * and if nameserver information is not available you might get:
+ * dns2.spong.dyn.ml.org timeout "DNS query timed out" ?
+ */
+
+const char *adns_strerror(adns_status st);
+const char *adns_errabbrev(adns_status st);
+const char *adns_errtypeabbrev(adns_status st);
+/* Like strerror but for adns_status values. adns_errabbrev returns
+ * the abbreviation of the error - eg, for adns_s_timeout it returns
+ * "timeout". adns_errtypeabbrev returns the abbreviation of the
+ * error class: ie, for values up to adns_s_max_XXX it will return the
+ * string XXX. You MUST NOT call these functions with status values
+ * not returned by the same adns library.
+ */
+
+#ifdef __cplusplus
+} /* end of extern "C" */
+#endif
+#endif
diff --git a/src/adns.make b/src/adns.make
new file mode 100644
index 0000000..8c2af75
--- /dev/null
+++ b/src/adns.make
@@ -0,0 +1,24 @@
+# src/adns.make - library definitions, including list of object files
+#
+# This file is part of adns, which is
+# Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
+# Copyright (C) 1999-2000,2003,2006 Tony Finch
+# Copyright (C) 1991 Massachusetts Institute of Technology
+# (See the file INSTALL for full details.)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation.
+
+LIBOBJS= types.o event.o query.o reply.o general.o setup.o transmit.o \
+ parse.o poll.o check.o addrfam.o
diff --git a/src/check.c b/src/check.c
new file mode 100644
index 0000000..08fe163
--- /dev/null
+++ b/src/check.c
@@ -0,0 +1,224 @@
+/*
+ * check.c
+ * - consistency checks
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include "internal.h"
+
+void adns_checkconsistency(adns_state ads, adns_query qu) {
+ adns__consistency(ads,qu,cc_user);
+}
+
+#define DLIST_CHECK(list, nodevar, part, body) \
+ if ((list).head) { \
+ assert(! (list).head->part back); \
+ for ((nodevar)= (list).head; \
+ (nodevar); \
+ (nodevar)= (nodevar)->part next) { \
+ assert((nodevar)->part next \
+ ? (nodevar) == (nodevar)->part next->part back \
+ : (nodevar) == (list).tail); \
+ body \
+ } \
+ }
+
+#define DLIST_ASSERTON(node, nodevar, list, part) \
+ do { \
+ for ((nodevar)= (list).head; \
+ (nodevar) != (node); \
+ (nodevar)= (nodevar)->part next) { \
+ assert((nodevar)); \
+ } \
+ } while(0)
+
+static void checkc_query_alloc(adns_state ads, adns_query qu) {
+ allocnode *an;
+
+ DLIST_CHECK(qu->allocations, an, , {
+ });
+}
+
+static void checkc_query(adns_state ads, adns_query qu) {
+ adns_query child;
+
+ assert(qu->udpnextserver < ads->nservers);
+ assert(!(qu->udpsent & (~0UL << ads->nservers)));
+ assert(qu->search_pos <= ads->nsearchlist);
+ if (qu->parent) DLIST_ASSERTON(qu, child, qu->parent->children, siblings.);
+}
+
+static void checkc_notcpbuf(adns_state ads) {
+ assert(!ads->tcpsend.used);
+ assert(!ads->tcprecv.used);
+ assert(!ads->tcprecv_skip);
+}
+
+static void checkc_global(adns_state ads) {
+ const struct sortlist *sl;
+ int i;
+
+ assert(ads->udpsockets >= 0);
+
+ for (i=0; i<ads->nsortlist; i++) {
+ sl= &ads->sortlist[i];
+ assert(adns__addr_matches(sl->base.sa.sa_family,
+ adns__sockaddr_addr(&sl->base.sa),
+ &sl->base,&sl->mask));
+ }
+
+ assert(ads->tcpserver >= 0 && ads->tcpserver < ads->nservers);
+
+ switch (ads->tcpstate) {
+ case server_connecting:
+ assert(ads->tcpsocket >= 0);
+ checkc_notcpbuf(ads);
+ break;
+ case server_disconnected:
+ case server_broken:
+ assert(ads->tcpsocket == -1);
+ checkc_notcpbuf(ads);
+ break;
+ case server_ok:
+ assert(ads->tcpsocket >= 0);
+ assert(ads->tcprecv_skip <= ads->tcprecv.used);
+ break;
+ default:
+ assert(!"ads->tcpstate value");
+ }
+
+ assert(ads->searchlist || !ads->nsearchlist);
+}
+
+static void checkc_queue_udpw(adns_state ads) {
+ adns_query qu;
+
+ DLIST_CHECK(ads->udpw, qu, , {
+ assert(qu->state==query_tosend);
+ assert(qu->retries <= UDPMAXRETRIES);
+ assert(qu->udpsent);
+ assert(!qu->children.head && !qu->children.tail);
+ checkc_query(ads,qu);
+ checkc_query_alloc(ads,qu);
+ });
+}
+
+static void checkc_queue_tcpw(adns_state ads) {
+ adns_query qu;
+
+ DLIST_CHECK(ads->tcpw, qu, , {
+ assert(qu->state==query_tcpw);
+ assert(!qu->children.head && !qu->children.tail);
+ assert(qu->retries <= ads->nservers+1);
+ checkc_query(ads,qu);
+ checkc_query_alloc(ads,qu);
+ });
+}
+
+static void checkc_queue_childw(adns_state ads) {
+ adns_query parent, child;
+
+ DLIST_CHECK(ads->childw, parent, , {
+ assert(parent->state == query_childw);
+ assert(parent->children.head);
+ DLIST_CHECK(parent->children, child, siblings., {
+ assert(child->parent == parent);
+ assert(child->state != query_done);
+ });
+ checkc_query(ads,parent);
+ checkc_query_alloc(ads,parent);
+ });
+}
+
+static void checkc_query_done(adns_state ads, adns_query qu) {
+ assert(qu->state == query_done);
+ assert(!qu->children.head && !qu->children.tail);
+ checkc_query(ads,qu);
+}
+
+static void checkc_queue_output(adns_state ads) {
+ adns_query qu;
+
+ DLIST_CHECK(ads->output, qu, , {
+ assert(!qu->parent);
+ assert(!qu->allocations.head && !qu->allocations.tail);
+ checkc_query_done(ads,qu);
+ });
+}
+
+static void checkc_queue_intdone(adns_state ads) {
+ adns_query qu;
+
+ DLIST_CHECK(ads->intdone, qu, , {
+ assert(qu->parent);
+ assert(qu->ctx.callback);
+ checkc_query_done(ads,qu);
+ });
+}
+
+void adns__consistency(adns_state ads, adns_query qu, consistency_checks cc) {
+ adns_query search;
+
+ switch (cc) {
+ case cc_user:
+ break;
+ case cc_entex:
+ if (!(ads->iflags & adns_if_checkc_entex)) return;
+ assert(!ads->intdone.head);
+ break;
+ case cc_freq:
+ if ((ads->iflags & adns_if_checkc_freq) != adns_if_checkc_freq) return;
+ break;
+ default:
+ abort();
+ }
+
+ checkc_global(ads);
+ checkc_queue_udpw(ads);
+ checkc_queue_tcpw(ads);
+ checkc_queue_childw(ads);
+ checkc_queue_output(ads);
+ checkc_queue_intdone(ads);
+
+ if (qu) {
+ switch (qu->state) {
+ case query_tosend:
+ DLIST_ASSERTON(qu, search, ads->udpw, );
+ break;
+ case query_tcpw:
+ DLIST_ASSERTON(qu, search, ads->tcpw, );
+ break;
+ case query_childw:
+ DLIST_ASSERTON(qu, search, ads->childw, );
+ break;
+ case query_done:
+ if (qu->parent)
+ DLIST_ASSERTON(qu, search, ads->intdone, );
+ else
+ DLIST_ASSERTON(qu, search, ads->output, );
+ break;
+ default:
+ assert(!"specific query state");
+ }
+ }
+}
diff --git a/src/config.h.in b/src/config.h.in
new file mode 100644
index 0000000..bd36686
--- /dev/null
+++ b/src/config.h.in
@@ -0,0 +1,98 @@
+/* src/config.h.in. Generated automatically from configure.in by autoheader 2.13. */
+
+/* Define if inline functions a la GCC are available. */
+#undef HAVE_INLINE
+
+/* Define if function attributes a la GCC 2.5 and higher are available. */
+#undef HAVE_GNUC25_ATTRIB
+
+/* Define if constant functions a la GCC 2.5 and higher are available. */
+#undef HAVE_GNUC25_CONST
+
+/* Define if nonreturning functions a la GCC 2.5 and higher are available. */
+#undef HAVE_GNUC25_NORETURN
+
+/* Define if printf-format argument lists a la GCC are available. */
+#undef HAVE_GNUC25_PRINTFFORMAT
+
+/* Define if we want to include rpc/types.h. Crap BSDs put INADDR_LOOPBACK there. */
+#undef HAVEUSE_RPCTYPES_H
+
+/* Define if you have the poll function. */
+#undef HAVE_POLL
+
+/* Define if you have the nsl library (-lnsl). */
+#undef HAVE_LIBNSL
+
+/* Define if you have the socket library (-lsocket). */
+#undef HAVE_LIBSOCKET
+
+/* Use the definitions: */
+
+#ifndef HAVE_INLINE
+#define inline
+#endif
+
+#ifdef HAVE_POLL
+#include <sys/poll.h>
+#else
+/* kludge it up */
+struct pollfd { int fd; short events; short revents; };
+#define POLLIN 1
+#define POLLPRI 2
+#define POLLOUT 4
+#endif
+
+/* GNU C attributes. */
+#ifndef FUNCATTR
+#ifdef HAVE_GNUC25_ATTRIB
+#define FUNCATTR(x) __attribute__(x)
+#else
+#define FUNCATTR(x)
+#endif
+#endif
+
+/* GNU C printf formats, or null. */
+#ifndef ATTRPRINTF
+#ifdef HAVE_GNUC25_PRINTFFORMAT
+#define ATTRPRINTF(si,tc) format(printf,si,tc)
+#else
+#define ATTRPRINTF(si,tc)
+#endif
+#endif
+#ifndef PRINTFFORMAT
+#define PRINTFFORMAT(si,tc) FUNCATTR((ATTRPRINTF(si,tc)))
+#endif
+
+/* GNU C nonreturning functions, or null. */
+#ifndef ATTRNORETURN
+#ifdef HAVE_GNUC25_NORETURN
+#define ATTRNORETURN noreturn
+#else
+#define ATTRNORETURN
+#endif
+#endif
+#ifndef NONRETURNING
+#define NONRETURNING FUNCATTR((ATTRNORETURN))
+#endif
+
+/* Combination of both the above. */
+#ifndef NONRETURNPRINTFFORMAT
+#define NONRETURNPRINTFFORMAT(si,tc) FUNCATTR((ATTRPRINTF(si,tc),ATTRNORETURN))
+#endif
+
+/* GNU C constant functions, or null. */
+#ifndef ATTRCONST
+#ifdef HAVE_GNUC25_CONST
+#define ATTRCONST const
+#else
+#define ATTRCONST
+#endif
+#endif
+#ifndef CONSTANT
+#define CONSTANT FUNCATTR((ATTRCONST))
+#endif
+
+#ifdef HAVEUSE_RPCTYPES_H
+#include <rpc/types.h>
+#endif
diff --git a/src/dlist.h b/src/dlist.h
new file mode 100644
index 0000000..db95c60
--- /dev/null
+++ b/src/dlist.h
@@ -0,0 +1,53 @@
+/*
+ * dlist.h
+ * - macros for handling doubly linked lists
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#ifndef ADNS_DLIST_H_INCLUDED
+#define ADNS_DLIST_H_INCLUDED
+
+#define LIST_INIT(list) ((list).head= (list).tail= 0)
+#define LINK_INIT(link) ((link).next= (link).back= 0)
+
+#define LIST_UNLINK_PART(list,node,part) \
+ do { \
+ if ((node)->part back) (node)->part back->part next= (node)->part next; \
+ else (list).head= (node)->part next; \
+ if ((node)->part next) (node)->part next->part back= (node)->part back; \
+ else (list).tail= (node)->part back; \
+ } while(0)
+
+#define LIST_LINK_TAIL_PART(list,node,part) \
+ do { \
+ (node)->part next= 0; \
+ (node)->part back= (list).tail; \
+ if ((list).tail) (list).tail->part next= (node); \
+ else (list).head= (node); \
+ (list).tail= (node); \
+ } while(0)
+
+#define LIST_UNLINK(list,node) LIST_UNLINK_PART(list,node,)
+#define LIST_LINK_TAIL(list,node) LIST_LINK_TAIL_PART(list,node,)
+
+#endif
diff --git a/src/event.c b/src/event.c
new file mode 100644
index 0000000..3dd927b
--- /dev/null
+++ b/src/event.c
@@ -0,0 +1,732 @@
+/*
+ * event.c
+ * - event loop core
+ * - TCP connection management
+ * - user-visible check/wait and event-loop-related functions
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "internal.h"
+#include "tvarith.h"
+
+/* TCP connection management. */
+
+static void tcp_close(adns_state ads) {
+ close(ads->tcpsocket);
+ ads->tcpsocket= -1;
+ ads->tcprecv.used= ads->tcprecv_skip= ads->tcpsend.used= 0;
+}
+
+void adns__tcp_broken(adns_state ads, const char *what, const char *why) {
+ int serv;
+ adns_query qu;
+
+ assert(ads->tcpstate == server_connecting || ads->tcpstate == server_ok);
+ serv= ads->tcpserver;
+ if (what) adns__warn(ads,serv,0,"TCP connection failed: %s: %s",what,why);
+
+ if (ads->tcpstate == server_connecting) {
+ /* Counts as a retry for all the queries waiting for TCP. */
+ for (qu= ads->tcpw.head; qu; qu= qu->next)
+ qu->retries++;
+ }
+
+ tcp_close(ads);
+ ads->tcpstate= server_broken;
+ ads->tcpserver= (serv+1)%ads->nservers;
+}
+
+static void tcp_connected(adns_state ads, struct timeval now) {
+ adns_query qu, nqu;
+
+ adns__debug(ads,ads->tcpserver,0,"TCP connected");
+ ads->tcpstate= server_ok;
+ for (qu= ads->tcpw.head; qu && ads->tcpstate == server_ok; qu= nqu) {
+ nqu= qu->next;
+ assert(qu->state == query_tcpw);
+ adns__querysend_tcp(qu,now);
+ }
+}
+
+static void tcp_broken_events(adns_state ads) {
+ adns_query qu, nqu;
+
+ assert(ads->tcpstate == server_broken);
+ for (qu= ads->tcpw.head; qu; qu= nqu) {
+ nqu= qu->next;
+ assert(qu->state == query_tcpw);
+ if (qu->retries > ads->nservers) {
+ LIST_UNLINK(ads->tcpw,qu);
+ adns__query_fail(qu,adns_s_allservfail);
+ }
+ }
+ ads->tcpstate= server_disconnected;
+}
+
+void adns__tcp_tryconnect(adns_state ads, struct timeval now) {
+ int r, fd, tries;
+ adns_rr_addr *addr;
+ struct protoent *proto;
+
+ for (tries=0; tries<ads->nservers; tries++) {
+ switch (ads->tcpstate) {
+ case server_connecting:
+ case server_ok:
+ case server_broken:
+ return;
+ case server_disconnected:
+ break;
+ default:
+ abort();
+ }
+
+ assert(!ads->tcpsend.used);
+ assert(!ads->tcprecv.used);
+ assert(!ads->tcprecv_skip);
+
+ proto= getprotobyname("tcp");
+ if (!proto) {
+ adns__diag(ads,-1,0,"unable to find protocol no. for TCP !");
+ return;
+ }
+ addr = &ads->servers[ads->tcpserver];
+ fd= socket(addr->addr.sa.sa_family, SOCK_STREAM, proto->p_proto);
+ if (fd<0) {
+ adns__diag(ads,-1,0,"cannot create TCP socket: %s",strerror(errno));
+ return;
+ }
+ r= adns__setnonblock(ads,fd);
+ if (r) {
+ adns__diag(ads,-1,0,"cannot make TCP socket nonblocking:"
+ " %s",strerror(r));
+ close(fd);
+ return;
+ }
+ r= connect(fd,&addr->addr.sa,addr->len);
+ ads->tcpsocket= fd;
+ ads->tcpstate= server_connecting;
+ if (r==0) { tcp_connected(ads,now); return; }
+ if (errno == EWOULDBLOCK || errno == EINPROGRESS) {
+ ads->tcptimeout= now;
+ timevaladd(&ads->tcptimeout,TCPCONNMS);
+ return;
+ }
+ adns__tcp_broken(ads,"connect",strerror(errno));
+ tcp_broken_events(ads);
+ }
+}
+
+/* Timeout handling functions. */
+
+void adns__must_gettimeofday(adns_state ads, const struct timeval **now_io,
+ struct timeval *tv_buf) {
+ const struct timeval *now;
+ int r;
+
+ now= *now_io;
+ if (now) return;
+ r= gettimeofday(tv_buf,0); if (!r) { *now_io= tv_buf; return; }
+ adns__diag(ads,-1,0,"gettimeofday failed: %s",strerror(errno));
+ adns_globalsystemfailure(ads);
+ return;
+}
+
+static void inter_immed(struct timeval **tv_io, struct timeval *tvbuf) {
+ struct timeval *rbuf;
+
+ if (!tv_io) return;
+
+ rbuf= *tv_io;
+ if (!rbuf) { *tv_io= rbuf= tvbuf; }
+
+ timerclear(rbuf);
+}
+
+static void inter_maxto(struct timeval **tv_io, struct timeval *tvbuf,
+ struct timeval maxto) {
+ struct timeval *rbuf;
+
+ if (!tv_io) return;
+ rbuf= *tv_io;
+ if (!rbuf) {
+ *tvbuf= maxto; *tv_io= tvbuf;
+ } else {
+ if (timercmp(rbuf,&maxto,>)) *rbuf= maxto;
+ }
+/*fprintf(stderr,"inter_maxto maxto=%ld.%06ld result=%ld.%06ld\n",
+ maxto.tv_sec,maxto.tv_usec,(**tv_io).tv_sec,(**tv_io).tv_usec);*/
+}
+
+static void inter_maxtoabs(struct timeval **tv_io, struct timeval *tvbuf,
+ struct timeval now, struct timeval maxtime) {
+ /* tv_io may be 0 */
+ ldiv_t dr;
+
+/*fprintf(stderr,"inter_maxtoabs now=%ld.%06ld maxtime=%ld.%06ld\n",
+ now.tv_sec,now.tv_usec,maxtime.tv_sec,maxtime.tv_usec);*/
+ if (!tv_io) return;
+ maxtime.tv_sec -= (now.tv_sec+2);
+ maxtime.tv_usec -= (now.tv_usec-2000000);
+ dr= ldiv(maxtime.tv_usec,1000000);
+ maxtime.tv_sec += dr.quot;
+ maxtime.tv_usec -= dr.quot*1000000;
+ if (maxtime.tv_sec<0) timerclear(&maxtime);
+ inter_maxto(tv_io,tvbuf,maxtime);
+}
+
+static void timeouts_queue(adns_state ads, int act,
+ struct timeval **tv_io, struct timeval *tvbuf,
+ struct timeval now, struct query_queue *queue) {
+ adns_query qu, nqu;
+
+ for (qu= queue->head; qu; qu= nqu) {
+ nqu= qu->next;
+ if (!timercmp(&now,&qu->timeout,>)) {
+ inter_maxtoabs(tv_io,tvbuf,now,qu->timeout);
+ } else {
+ if (!act) { inter_immed(tv_io,tvbuf); return; }
+ LIST_UNLINK(*queue,qu);
+ if (qu->state != query_tosend) {
+ adns__query_fail(qu,adns_s_timeout);
+ } else {
+ adns__query_send(qu,now);
+ }
+ nqu= queue->head;
+ }
+ }
+}
+
+static void tcp_events(adns_state ads, int act,
+ struct timeval **tv_io, struct timeval *tvbuf,
+ struct timeval now) {
+ for (;;) {
+ switch (ads->tcpstate) {
+ case server_broken:
+ if (!act) { inter_immed(tv_io,tvbuf); return; }
+ tcp_broken_events(ads);
+ case server_disconnected: /* fall through */
+ if (!ads->tcpw.head) return;
+ if (!act) { inter_immed(tv_io,tvbuf); return; }
+ adns__tcp_tryconnect(ads,now);
+ break;
+ case server_ok:
+ if (ads->tcpw.head) return;
+ if (!ads->tcptimeout.tv_sec) {
+ assert(!ads->tcptimeout.tv_usec);
+ ads->tcptimeout= now;
+ timevaladd(&ads->tcptimeout,TCPIDLEMS);
+ }
+ case server_connecting: /* fall through */
+ if (!act || !timercmp(&now,&ads->tcptimeout,>)) {
+ inter_maxtoabs(tv_io,tvbuf,now,ads->tcptimeout);
+ return;
+ } {
+ /* TCP timeout has happened */
+ switch (ads->tcpstate) {
+ case server_connecting: /* failed to connect */
+ adns__tcp_broken(ads,"unable to make connection","timed out");
+ break;
+ case server_ok: /* idle timeout */
+ tcp_close(ads);
+ ads->tcpstate= server_disconnected;
+ return;
+ default:
+ abort();
+ }
+ }
+ break;
+ default:
+ abort();
+ }
+ }
+ return;
+}
+
+void adns__timeouts(adns_state ads, int act,
+ struct timeval **tv_io, struct timeval *tvbuf,
+ struct timeval now) {
+ timeouts_queue(ads,act,tv_io,tvbuf,now, &ads->udpw);
+ timeouts_queue(ads,act,tv_io,tvbuf,now, &ads->tcpw);
+ tcp_events(ads,act,tv_io,tvbuf,now);
+}
+
+void adns_firsttimeout(adns_state ads,
+ struct timeval **tv_io, struct timeval *tvbuf,
+ struct timeval now) {
+ adns__consistency(ads,0,cc_entex);
+ adns__timeouts(ads, 0, tv_io,tvbuf, now);
+ adns__returning(ads,0);
+}
+
+void adns_processtimeouts(adns_state ads, const struct timeval *now) {
+ struct timeval tv_buf;
+
+ adns__consistency(ads,0,cc_entex);
+ adns__must_gettimeofday(ads,&now,&tv_buf);
+ if (now) adns__timeouts(ads, 1, 0,0, *now);
+ adns__returning(ads,0);
+}
+
+/* fd handling functions. These are the top-level of the real work of
+ * reception and often transmission.
+ */
+
+int adns__pollfds(adns_state ads, struct pollfd pollfds_buf[MAX_POLLFDS]) {
+ /* Returns the number of entries filled in. Always zeroes revents. */
+ int nwanted=0;
+#define ADD_POLLFD(wantfd, wantevents) do{ \
+ pollfds_buf[nwanted].fd= (wantfd); \
+ pollfds_buf[nwanted].events= (wantevents); \
+ pollfds_buf[nwanted].revents= 0; \
+ nwanted++; \
+ }while(0)
+
+ int i;
+
+ assert(MAX_POLLFDS == MAXUDP + 1);
+
+ for (i=0; i<ads->nudpsockets; i++)
+ ADD_POLLFD(ads->udpsockets[i].fd, POLLIN);
+
+ switch (ads->tcpstate) {
+ case server_disconnected:
+ case server_broken:
+ break;
+ case server_connecting:
+ ADD_POLLFD(ads->tcpsocket, POLLOUT);
+ break;
+ case server_ok:
+ ADD_POLLFD(ads->tcpsocket,
+ ads->tcpsend.used ? POLLIN|POLLOUT|POLLPRI : POLLIN|POLLPRI);
+ break;
+ default:
+ abort();
+ }
+ assert(nwanted<=MAX_POLLFDS);
+#undef ADD_POLLFD
+ return nwanted;
+}
+
+int adns_processreadable(adns_state ads, int fd, const struct timeval *now) {
+ int want, dgramlen, r, i, udpaddrlen, serv, old_skip;
+ byte udpbuf[DNS_MAXUDP];
+ char addrbuf[ADNS_ADDR2TEXT_BUFLEN];
+ struct udpsocket *udp;
+ adns_sockaddr udpaddr;
+
+ adns__consistency(ads,0,cc_entex);
+
+ switch (ads->tcpstate) {
+ case server_disconnected:
+ case server_broken:
+ case server_connecting:
+ break;
+ case server_ok:
+ if (fd != ads->tcpsocket) break;
+ assert(!ads->tcprecv_skip);
+ do {
+ if (ads->tcprecv.used >= ads->tcprecv_skip+2) {
+ dgramlen= ((ads->tcprecv.buf[ads->tcprecv_skip]<<8) |
+ ads->tcprecv.buf[ads->tcprecv_skip+1]);
+ if (ads->tcprecv.used >= ads->tcprecv_skip+2+dgramlen) {
+ old_skip= ads->tcprecv_skip;
+ ads->tcprecv_skip += 2+dgramlen;
+ adns__procdgram(ads, ads->tcprecv.buf+old_skip+2,
+ dgramlen, ads->tcpserver, 1,*now);
+ continue;
+ } else {
+ want= 2+dgramlen;
+ }
+ } else {
+ want= 2;
+ }
+ ads->tcprecv.used -= ads->tcprecv_skip;
+ memmove(ads->tcprecv.buf, ads->tcprecv.buf+ads->tcprecv_skip,
+ ads->tcprecv.used);
+ ads->tcprecv_skip= 0;
+ if (!adns__vbuf_ensure(&ads->tcprecv,want)) { r= ENOMEM; goto xit; }
+ assert(ads->tcprecv.used <= ads->tcprecv.avail);
+ if (ads->tcprecv.used == ads->tcprecv.avail) continue;
+ r= read(ads->tcpsocket,
+ ads->tcprecv.buf+ads->tcprecv.used,
+ ads->tcprecv.avail-ads->tcprecv.used);
+ if (r>0) {
+ ads->tcprecv.used+= r;
+ } else {
+ if (r) {
+ if (errno==EAGAIN || errno==EWOULDBLOCK) { r= 0; goto xit; }
+ if (errno==EINTR) continue;
+ if (errno_resources(errno)) { r= errno; goto xit; }
+ }
+ adns__tcp_broken(ads,"read",r?strerror(errno):"closed");
+ }
+ } while (ads->tcpstate == server_ok);
+ r= 0; goto xit;
+ default:
+ abort();
+ }
+ for (i=0; i<ads->nudpsockets; i++) {
+ udp= &ads->udpsockets[i];
+ if (fd != udp->fd) continue;
+ for (;;) {
+ udpaddrlen= sizeof(udpaddr);
+ r= recvfrom(fd,udpbuf,sizeof(udpbuf),0, &udpaddr.sa,&udpaddrlen);
+ if (r<0) {
+ if (errno == EAGAIN || errno == EWOULDBLOCK) { r= 0; goto xit; }
+ if (errno == EINTR) continue;
+ if (errno_resources(errno)) { r= errno; goto xit; }
+ adns__warn(ads,-1,0,"datagram receive error: %s",strerror(errno));
+ r= 0; goto xit;
+ }
+ for (serv= 0;
+ serv < ads->nservers &&
+ !adns__sockaddrs_equal(&udpaddr.sa,
+ &ads->servers[serv].addr.sa);
+ serv++);
+ if (serv >= ads->nservers) {
+ adns__warn(ads,-1,0,"datagram received from unknown nameserver %s",
+ adns__sockaddr_ntoa(&udpaddr.sa, addrbuf));
+ continue;
+ }
+ adns__procdgram(ads,udpbuf,r,serv,0,*now);
+ }
+ break;
+ }
+ r= 0;
+xit:
+ adns__returning(ads,0);
+ return r;
+}
+
+int adns_processwriteable(adns_state ads, int fd, const struct timeval *now) {
+ int r;
+
+ adns__consistency(ads,0,cc_entex);
+
+ switch (ads->tcpstate) {
+ case server_disconnected:
+ case server_broken:
+ break;
+ case server_connecting:
+ if (fd != ads->tcpsocket) break;
+ assert(ads->tcprecv.used==0);
+ assert(ads->tcprecv_skip==0);
+ for (;;) {
+ if (!adns__vbuf_ensure(&ads->tcprecv,1)) { r= ENOMEM; goto xit; }
+ r= read(ads->tcpsocket,&ads->tcprecv.buf,1);
+ if (r==0 || (r<0 && (errno==EAGAIN || errno==EWOULDBLOCK))) {
+ tcp_connected(ads,*now);
+ r= 0; goto xit;
+ }
+ if (r>0) {
+ adns__tcp_broken(ads,"connect/read","sent data before first request");
+ r= 0; goto xit;
+ }
+ if (errno==EINTR) continue;
+ if (errno_resources(errno)) { r= errno; goto xit; }
+ adns__tcp_broken(ads,"connect/read",strerror(errno));
+ r= 0; goto xit;
+ } /* not reached */
+ case server_ok:
+ if (fd != ads->tcpsocket) break;
+ while (ads->tcpsend.used) {
+ adns__sigpipe_protect(ads);
+ r= write(ads->tcpsocket,ads->tcpsend.buf,ads->tcpsend.used);
+ adns__sigpipe_unprotect(ads);
+ if (r<0) {
+ if (errno==EINTR) continue;
+ if (errno==EAGAIN || errno==EWOULDBLOCK) { r= 0; goto xit; }
+ if (errno_resources(errno)) { r= errno; goto xit; }
+ adns__tcp_broken(ads,"write",strerror(errno));
+ r= 0; goto xit;
+ } else if (r>0) {
+ ads->tcpsend.used -= r;
+ memmove(ads->tcpsend.buf,ads->tcpsend.buf+r,ads->tcpsend.used);
+ }
+ }
+ r= 0;
+ goto xit;
+ default:
+ abort();
+ }
+ r= 0;
+xit:
+ adns__returning(ads,0);
+ return r;
+}
+
+int adns_processexceptional(adns_state ads, int fd,
+ const struct timeval *now) {
+ adns__consistency(ads,0,cc_entex);
+ switch (ads->tcpstate) {
+ case server_disconnected:
+ case server_broken:
+ break;
+ case server_connecting:
+ case server_ok:
+ if (fd != ads->tcpsocket) break;
+ adns__tcp_broken(ads,"poll/select","exceptional condition detected");
+ break;
+ default:
+ abort();
+ }
+ adns__returning(ads,0);
+ return 0;
+}
+
+static void fd_event(adns_state ads, int fd,
+ int revent, int pollflag,
+ int maxfd, const fd_set *fds,
+ int (*func)(adns_state, int fd,
+ const struct timeval *now),
+ struct timeval now, int *r_r) {
+ int r;
+
+ if (!(revent & pollflag)) return;
+ if (fds && !(fd<maxfd && FD_ISSET(fd,fds))) return;
+ r= func(ads,fd,&now);
+ if (r) {
+ if (r_r) {
+ *r_r= r;
+ } else {
+ adns__diag(ads,-1,0,"process fd failed after select:"
+ " %s",strerror(errno));
+ adns_globalsystemfailure(ads);
+ }
+ }
+}
+
+void adns__fdevents(adns_state ads,
+ const struct pollfd *pollfds, int npollfds,
+ int maxfd, const fd_set *readfds,
+ const fd_set *writefds, const fd_set *exceptfds,
+ struct timeval now, int *r_r) {
+ int i, fd, revents;
+
+ for (i=0; i<npollfds; i++) {
+ fd= pollfds[i].fd;
+ if (fd >= maxfd) maxfd= fd+1;
+ revents= pollfds[i].revents;
+#define EV(pollfl,fds,how) \
+ fd_event(ads,fd, revents,pollfl, maxfd,fds, adns_process##how,now,r_r)
+ EV( POLLIN, readfds, readable );
+ EV( POLLOUT, writefds, writeable );
+ EV( POLLPRI, exceptfds, exceptional );
+#undef EV
+ }
+}
+
+/* Wrappers for select(2). */
+
+void adns_beforeselect(adns_state ads, int *maxfd_io, fd_set *readfds_io,
+ fd_set *writefds_io, fd_set *exceptfds_io,
+ struct timeval **tv_mod, struct timeval *tv_tobuf,
+ const struct timeval *now) {
+ struct timeval tv_nowbuf;
+ struct pollfd pollfds[MAX_POLLFDS];
+ int i, fd, maxfd, npollfds;
+
+ adns__consistency(ads,0,cc_entex);
+
+ if (tv_mod && (!*tv_mod || (*tv_mod)->tv_sec || (*tv_mod)->tv_usec)) {
+ /* The caller is planning to sleep. */
+ adns__must_gettimeofday(ads,&now,&tv_nowbuf);
+ if (!now) { inter_immed(tv_mod,tv_tobuf); goto xit; }
+ adns__timeouts(ads, 0, tv_mod,tv_tobuf, *now);
+ }
+
+ npollfds= adns__pollfds(ads,pollfds);
+ maxfd= *maxfd_io;
+ for (i=0; i<npollfds; i++) {
+ fd= pollfds[i].fd;
+ if (fd >= maxfd) maxfd= fd+1;
+ if (pollfds[i].events & POLLIN) FD_SET(fd,readfds_io);
+ if (pollfds[i].events & POLLOUT) FD_SET(fd,writefds_io);
+ if (pollfds[i].events & POLLPRI) FD_SET(fd,exceptfds_io);
+ }
+ *maxfd_io= maxfd;
+
+xit:
+ adns__returning(ads,0);
+}
+
+void adns_afterselect(adns_state ads, int maxfd, const fd_set *readfds,
+ const fd_set *writefds, const fd_set *exceptfds,
+ const struct timeval *now) {
+ struct timeval tv_buf;
+ struct pollfd pollfds[MAX_POLLFDS];
+ int npollfds, i;
+
+ adns__consistency(ads,0,cc_entex);
+ adns__must_gettimeofday(ads,&now,&tv_buf);
+ if (!now) goto xit;
+ adns_processtimeouts(ads,now);
+
+ npollfds= adns__pollfds(ads,pollfds);
+ for (i=0; i<npollfds; i++) pollfds[i].revents= POLLIN|POLLOUT|POLLPRI;
+ adns__fdevents(ads,
+ pollfds,npollfds,
+ maxfd,readfds,writefds,exceptfds,
+ *now, 0);
+xit:
+ adns__returning(ads,0);
+}
+
+/* General helpful functions. */
+
+void adns_globalsystemfailure(adns_state ads) {
+ adns__consistency(ads,0,cc_entex);
+
+ while (ads->udpw.head) adns__query_fail(ads->udpw.head, adns_s_systemfail);
+ while (ads->tcpw.head) adns__query_fail(ads->tcpw.head, adns_s_systemfail);
+
+ switch (ads->tcpstate) {
+ case server_connecting:
+ case server_ok:
+ adns__tcp_broken(ads,0,0);
+ break;
+ case server_disconnected:
+ case server_broken:
+ break;
+ default:
+ abort();
+ }
+ adns__returning(ads,0);
+}
+
+int adns_processany(adns_state ads) {
+ int r, i;
+ struct timeval now;
+ struct pollfd pollfds[MAX_POLLFDS];
+ int npollfds;
+
+ adns__consistency(ads,0,cc_entex);
+
+ r= gettimeofday(&now,0);
+ if (!r) adns_processtimeouts(ads,&now);
+
+ /* We just use adns__fdevents to loop over the fd's trying them.
+ * This seems more sensible than calling select, since we're most
+ * likely just to want to do a read on one or two fds anyway.
+ */
+ npollfds= adns__pollfds(ads,pollfds);
+ for (i=0; i<npollfds; i++) pollfds[i].revents= pollfds[i].events & ~POLLPRI;
+ adns__fdevents(ads,
+ pollfds,npollfds,
+ 0,0,0,0,
+ now,&r);
+
+ adns__returning(ads,0);
+ return 0;
+}
+
+void adns__autosys(adns_state ads, struct timeval now) {
+ if (ads->iflags & adns_if_noautosys) return;
+ adns_processany(ads);
+}
+
+int adns__internal_check(adns_state ads,
+ adns_query *query_io,
+ adns_answer **answer,
+ void **context_r) {
+ adns_query qu;
+
+ qu= *query_io;
+ if (!qu) {
+ if (ads->output.head) {
+ qu= ads->output.head;
+ } else if (ads->udpw.head || ads->tcpw.head) {
+ return EAGAIN;
+ } else {
+ return ESRCH;
+ }
+ } else {
+ if (qu->id>=0) return EAGAIN;
+ }
+ LIST_UNLINK(ads->output,qu);
+ *answer= qu->answer;
+ if (context_r) *context_r= qu->ctx.ext;
+ *query_io= qu;
+ free(qu);
+ return 0;
+}
+
+int adns_wait(adns_state ads,
+ adns_query *query_io,
+ adns_answer **answer_r,
+ void **context_r) {
+ int r, maxfd, rsel;
+ fd_set readfds, writefds, exceptfds;
+ struct timeval tvbuf, *tvp;
+
+ adns__consistency(ads,*query_io,cc_entex);
+ for (;;) {
+ r= adns__internal_check(ads,query_io,answer_r,context_r);
+ if (r != EAGAIN) break;
+ maxfd= 0; tvp= 0;
+ FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds);
+ adns_beforeselect(ads,&maxfd,&readfds,&writefds,&exceptfds,&tvp,&tvbuf,0);
+ assert(tvp);
+ rsel= select(maxfd,&readfds,&writefds,&exceptfds,tvp);
+ if (rsel==-1) {
+ if (errno == EINTR) {
+ if (ads->iflags & adns_if_eintr) { r= EINTR; break; }
+ } else {
+ adns__diag(ads,-1,0,"select failed in wait: %s",strerror(errno));
+ adns_globalsystemfailure(ads);
+ }
+ } else {
+ assert(rsel >= 0);
+ adns_afterselect(ads,maxfd,&readfds,&writefds,&exceptfds,0);
+ }
+ }
+ adns__returning(ads,0);
+ return r;
+}
+
+int adns_check(adns_state ads,
+ adns_query *query_io,
+ adns_answer **answer_r,
+ void **context_r) {
+ struct timeval now;
+ int r;
+
+ adns__consistency(ads,*query_io,cc_entex);
+ r= gettimeofday(&now,0);
+ if (!r) adns__autosys(ads,now);
+
+ r= adns__internal_check(ads,query_io,answer_r,context_r);
+ adns__returning(ads,0);
+ return r;
+}
diff --git a/src/general.c b/src/general.c
new file mode 100644
index 0000000..b1ae2be
--- /dev/null
+++ b/src/general.c
@@ -0,0 +1,384 @@
+/*
+ * general.c
+ * - diagnostic functions
+ * - vbuf handling
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "internal.h"
+
+/* Core diagnostic functions */
+
+void adns__vlprintf(adns_state ads, const char *fmt, va_list al) {
+ ads->logfn(ads,ads->logfndata,fmt,al);
+}
+
+void adns__lprintf(adns_state ads, const char *fmt, ...) {
+ va_list al;
+ va_start(al,fmt);
+ adns__vlprintf(ads,fmt,al);
+ va_end(al);
+}
+
+void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent,
+ int serv, adns_query qu, const char *fmt, va_list al) {
+ char buf[ADNS_ADDR2TEXT_BUFLEN];
+ const char *bef, *aft;
+ vbuf vb;
+
+ if (!ads->logfn ||
+ (!(ads->iflags & adns_if_debug)
+ && (!prevent || (ads->iflags & prevent))))
+ return;
+
+ if (ads->iflags & adns_if_logpid) {
+ adns__lprintf(ads,"adns%s [%ld]: ",pfx,(long)getpid());
+ } else {
+ adns__lprintf(ads,"adns%s: ",pfx);
+ }
+
+ adns__vlprintf(ads,fmt,al);
+
+ bef= " (";
+ aft= "\n";
+
+ if (qu && qu->query_dgram) {
+ adns__vbuf_init(&vb);
+ adns__lprintf(ads,"%sQNAME=%s, QTYPE=%s",
+ bef,
+ adns__diag_domain(qu->ads,-1,0, &vb,
+ qu->query_dgram,qu->query_dglen,DNS_HDRSIZE),
+ qu->typei ? qu->typei->rrtname : "<unknown>");
+ if (qu->typei && qu->typei->fmtname)
+ adns__lprintf(ads,"(%s)",qu->typei->fmtname);
+ bef=", "; aft=")\n";
+ adns__vbuf_free(&vb);
+ }
+
+ if (serv>=0) {
+ adns__lprintf(ads,"%sNS=%s",bef,
+ adns__sockaddr_ntoa(&ads->servers[serv].addr.sa, buf));
+ bef=", "; aft=")\n";
+ }
+
+ adns__lprintf(ads,"%s",aft);
+}
+
+void adns__debug(adns_state ads, int serv, adns_query qu,
+ const char *fmt, ...) {
+ va_list al;
+
+ va_start(al,fmt);
+ adns__vdiag(ads," debug",0,serv,qu,fmt,al);
+ va_end(al);
+}
+
+void adns__warn(adns_state ads, int serv, adns_query qu,
+ const char *fmt, ...) {
+ va_list al;
+
+ va_start(al,fmt);
+ adns__vdiag(ads," warning",
+ adns_if_noerrprint|adns_if_noserverwarn, serv,qu,fmt,al);
+ va_end(al);
+}
+
+void adns__diag(adns_state ads, int serv, adns_query qu,
+ const char *fmt, ...) {
+ va_list al;
+
+ va_start(al,fmt);
+ adns__vdiag(ads,"",adns_if_noerrprint,serv,qu,fmt,al);
+ va_end(al);
+}
+
+/* vbuf functions */
+
+void adns__vbuf_init(vbuf *vb) {
+ vb->used= vb->avail= 0; vb->buf= 0;
+}
+
+int adns__vbuf_ensure(vbuf *vb, int want) {
+ void *nb;
+
+ if (vb->avail >= want) return 1;
+ nb= realloc(vb->buf,want); if (!nb) return 0;
+ vb->buf= nb;
+ vb->avail= want;
+ return 1;
+}
+
+void adns__vbuf_appendq(vbuf *vb, const byte *data, int len) {
+ memcpy(vb->buf+vb->used,data,len);
+ vb->used+= len;
+}
+
+int adns__vbuf_append(vbuf *vb, const byte *data, int len) {
+ int newlen;
+ void *nb;
+
+ newlen= vb->used+len;
+ if (vb->avail < newlen) {
+ if (newlen<20) newlen= 20;
+ newlen <<= 1;
+ nb= realloc(vb->buf,newlen);
+ if (!nb) { newlen= vb->used+len; nb= realloc(vb->buf,newlen); }
+ if (!nb) return 0;
+ vb->buf= nb;
+ vb->avail= newlen;
+ }
+ adns__vbuf_appendq(vb,data,len);
+ return 1;
+}
+
+int adns__vbuf_appendstr(vbuf *vb, const char *data) {
+ int l;
+ l= strlen(data);
+ return adns__vbuf_append(vb,data,l);
+}
+
+void adns__vbuf_free(vbuf *vb) {
+ free(vb->buf);
+ adns__vbuf_init(vb);
+}
+
+/* Additional diagnostic functions */
+
+const char *adns__diag_domain(adns_state ads, int serv, adns_query qu,
+ vbuf *vb, const byte *dgram,
+ int dglen, int cbyte) {
+ adns_status st;
+
+ st= adns__parse_domain(ads,serv,qu,vb, pdf_quoteok,
+ dgram,dglen,&cbyte,dglen);
+ if (st == adns_s_nomemory) {
+ return "<cannot report domain... out of memory>";
+ }
+ if (st) {
+ vb->used= 0;
+ if (!(adns__vbuf_appendstr(vb,"<bad format... ") &&
+ adns__vbuf_appendstr(vb,adns_strerror(st)) &&
+ adns__vbuf_appendstr(vb,">") &&
+ adns__vbuf_append(vb,"",1))) {
+ return "<cannot report bad format... out of memory>";
+ }
+ }
+ if (!vb->used) {
+ adns__vbuf_appendstr(vb,"<truncated ...>");
+ adns__vbuf_append(vb,"",1);
+ }
+ return vb->buf;
+}
+
+int adns__getrrsz_default(const typeinfo *typei, adns_rrtype type)
+ { return typei->fixed_rrsz; }
+
+adns_status adns_rr_info(adns_rrtype type,
+ const char **rrtname_r, const char **fmtname_r,
+ int *len_r,
+ const void *datap, char **data_r) {
+ const typeinfo *typei;
+ vbuf vb;
+ adns_status st;
+
+ typei= adns__findtype(type);
+ if (!typei) return adns_s_unknownrrtype;
+
+ if (rrtname_r) *rrtname_r= typei->rrtname;
+ if (fmtname_r) *fmtname_r= typei->fmtname;
+ if (len_r) *len_r= typei->getrrsz(typei, type);
+
+ if (!datap) return adns_s_ok;
+
+ adns__vbuf_init(&vb);
+ st= typei->convstring(&vb,datap);
+ if (st) goto x_freevb;
+ if (!adns__vbuf_append(&vb,"",1)) { st= adns_s_nomemory; goto x_freevb; }
+ assert(strlen(vb.buf) == vb.used-1);
+ *data_r= realloc(vb.buf,vb.used);
+ if (!*data_r) *data_r= vb.buf;
+ return adns_s_ok;
+
+ x_freevb:
+ adns__vbuf_free(&vb);
+ return st;
+}
+
+
+#define SINFO(n,s) { adns_s_##n, #n, s }
+
+static const struct sinfo {
+ adns_status st;
+ const char *abbrev;
+ const char *string;
+} sinfos[]= {
+ SINFO( ok, "OK" ),
+
+ SINFO( nomemory, "Out of memory" ),
+ SINFO( unknownrrtype, "Query not implemented in DNS library" ),
+ SINFO( systemfail, "General resolver or system failure" ),
+
+ SINFO( timeout, "DNS query timed out" ),
+ SINFO( allservfail, "All nameservers failed" ),
+ SINFO( norecurse, "Recursion denied by nameserver" ),
+ SINFO( invalidresponse, "Nameserver sent bad response" ),
+ SINFO( unknownformat, "Nameserver used unknown format" ),
+
+ SINFO( rcodeservfail, "Nameserver reports failure" ),
+ SINFO( rcodeformaterror, "Query not understood by nameserver" ),
+ SINFO( rcodenotimplemented, "Query not implemented by nameserver" ),
+ SINFO( rcoderefused, "Query refused by nameserver" ),
+ SINFO( rcodeunknown, "Nameserver sent unknown response code" ),
+
+ SINFO( inconsistent, "Inconsistent resource records in DNS" ),
+ SINFO( prohibitedcname, "DNS alias found where canonical name wanted" ),
+ SINFO( answerdomaininvalid, "Found syntactically invalid domain name" ),
+ SINFO( answerdomaintoolong, "Found overly-long domain name" ),
+ SINFO( invaliddata, "Found invalid DNS data" ),
+
+ SINFO( querydomainwrong, "Domain invalid for particular DNS query type" ),
+ SINFO( querydomaininvalid, "Domain name is syntactically invalid" ),
+ SINFO( querydomaintoolong, "Domain name or component is too long" ),
+
+ SINFO( nxdomain, "No such domain" ),
+ SINFO( nodata, "No such data" )
+};
+
+static int si_compar(const void *key, const void *elem) {
+ const adns_status *st= key;
+ const struct sinfo *si= elem;
+
+ return *st < si->st ? -1 : *st > si->st ? 1 : 0;
+}
+
+static const struct sinfo *findsinfo(adns_status st) {
+ return bsearch(&st,sinfos, sizeof(sinfos)/sizeof(*sinfos),
+ sizeof(*sinfos), si_compar);
+}
+
+const char *adns_strerror(adns_status st) {
+ const struct sinfo *si;
+
+ si= findsinfo(st);
+ return si->string;
+}
+
+const char *adns_errabbrev(adns_status st) {
+ const struct sinfo *si;
+
+ si= findsinfo(st);
+ return si->abbrev;
+}
+
+
+#define STINFO(max) { adns_s_max_##max, #max }
+
+static const struct stinfo {
+ adns_status stmax;
+ const char *abbrev;
+} stinfos[]= {
+ { adns_s_ok, "ok" },
+ STINFO( localfail ),
+ STINFO( remotefail ),
+ STINFO( tempfail ),
+ STINFO( misconfig ),
+ STINFO( misquery ),
+ STINFO( permfail )
+};
+
+static int sti_compar(const void *key, const void *elem) {
+ const adns_status *st= key;
+ const struct stinfo *sti= elem;
+
+ adns_status here, min, max;
+
+ here= *st;
+ min= (sti==stinfos) ? 0 : sti[-1].stmax+1;
+ max= sti->stmax;
+
+ return here < min ? -1 : here > max ? 1 : 0;
+}
+
+const char *adns_errtypeabbrev(adns_status st) {
+ const struct stinfo *sti;
+
+ sti= bsearch(&st,stinfos, sizeof(stinfos)/sizeof(*stinfos),
+ sizeof(*stinfos), sti_compar);
+ return sti->abbrev;
+}
+
+
+void adns__isort(void *array, int nobjs, int sz, void *tempbuf,
+ int (*needswap)(void *context, const void *a, const void *b),
+ void *context) {
+ byte *data= array;
+ int i, place;
+
+ for (i=0; i<nobjs; i++) {
+ for (place= i;
+ place>0 && needswap(context, data + (place-1)*sz, data + i*sz);
+ place--);
+ if (place != i) {
+ memcpy(tempbuf, data + i*sz, sz);
+ memmove(data + (place+1)*sz, data + place*sz, (i-place)*sz);
+ memcpy(data + place*sz, tempbuf, sz);
+ }
+ }
+}
+
+/* SIGPIPE protection. */
+
+void adns__sigpipe_protect(adns_state ads) {
+ sigset_t toblock;
+ struct sigaction sa;
+ int r;
+
+ if (ads->iflags & adns_if_nosigpipe) return;
+
+ sigfillset(&toblock);
+ sigdelset(&toblock,SIGPIPE);
+
+ sa.sa_handler= SIG_IGN;
+ sigfillset(&sa.sa_mask);
+ sa.sa_flags= 0;
+
+ r= sigprocmask(SIG_SETMASK,&toblock,&ads->stdsigmask); assert(!r);
+ r= sigaction(SIGPIPE,&sa,&ads->stdsigpipe); assert(!r);
+}
+
+void adns__sigpipe_unprotect(adns_state ads) {
+ int r;
+
+ if (ads->iflags & adns_if_nosigpipe) return;
+
+ r= sigaction(SIGPIPE,&ads->stdsigpipe,0); assert(!r);
+ r= sigprocmask(SIG_SETMASK,&ads->stdsigmask,0); assert(!r);
+}
diff --git a/src/internal.h b/src/internal.h
new file mode 100644
index 0000000..9334a6f
--- /dev/null
+++ b/src/internal.h
@@ -0,0 +1,947 @@
+/*
+ * internal.h
+ * - declarations of private objects with external linkage (adns__*)
+ * - definitons of internal macros
+ * - comments regarding library data structures
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#ifndef ADNS_INTERNAL_H_INCLUDED
+#define ADNS_INTERNAL_H_INCLUDED
+
+#include "config.h"
+typedef unsigned char byte;
+
+#include <stdarg.h>
+#include <assert.h>
+#include <unistd.h>
+#include <signal.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+#include <sys/time.h>
+
+#define ADNS_FEATURE_MANYAF
+#include "adns.h"
+#include "dlist.h"
+
+#ifdef ADNS_REGRESS_TEST
+# include "hredirect.h"
+#endif
+
+/* Configuration and constants */
+
+#define MAXSERVERS 5
+#define MAXSORTLIST 15
+#define UDPMAXRETRIES 15
+#define UDPRETRYMS 2000
+#define TCPWAITMS 30000
+#define TCPCONNMS 14000
+#define TCPIDLEMS 30000
+#define MAXTTLBELIEVE (7*86400) /* any TTL > 7 days is capped */
+
+#define DNS_PORT 53
+#define DNS_MAXUDP 512
+#define DNS_MAXLABEL 63
+#define DNS_MAXDOMAIN 255
+#define DNS_HDRSIZE 12
+#define DNS_IDOFFSET 0
+#define DNS_CLASS_IN 1
+
+#define MAX_POLLFDS ADNS_POLLFDS_RECOMMENDED
+
+/* Some preprocessor hackery */
+
+#define GLUE(x, y) GLUE_(x, y)
+#define GLUE_(x, y) x##y
+
+/* C99 macro `...' must match at least one argument, so the naive definition
+ * `#define CAR(car, ...) car' won't work. But it's easy to arrange for the
+ * tail to be nonempty if we're just going to discard it anyway. */
+#define CAR(...) CAR_(__VA_ARGS__, _)
+#define CAR_(car, ...) car
+
+/* Extracting the tail of an argument list is rather more difficult. The
+ * following trick is based on one by Laurent Deniau to count the number of
+ * arguments to a macro, simplified in two ways: (a) it only handles up to
+ * eight arguments, and (b) it only needs to distinguish the one-argument
+ * case from many arguments. */
+#define CDR(...) CDR_(__VA_ARGS__, m, m, m, m, m, m, m, 1, _)(__VA_ARGS__)
+#define CDR_(_1, _2, _3, _4, _5, _6, _7, _8, n, ...) CDR_##n
+#define CDR_1(_)
+#define CDR_m(_, ...) __VA_ARGS__
+
+typedef enum {
+ cc_user,
+ cc_entex,
+ cc_freq
+} consistency_checks;
+
+typedef enum {
+ rcode_noerror,
+ rcode_formaterror,
+ rcode_servfail,
+ rcode_nxdomain,
+ rcode_notimp,
+ rcode_refused
+} dns_rcode;
+
+enum {
+ adns__qf_addr_answer= 0x01000000,/* addr query received an answer */
+ adns__qf_addr_cname = 0x02000000 /* addr subquery performed on cname */
+};
+
+/* Shared data structures */
+
+typedef struct {
+ int used, avail;
+ byte *buf;
+} vbuf;
+
+typedef struct {
+ adns_state ads;
+ adns_query qu;
+ int serv;
+ const byte *dgram;
+ int dglen, nsstart, nscount, arcount;
+ struct timeval now;
+} parseinfo;
+
+#define MAXREVLABELS 34 /* keep in sync with addrfam! */
+struct revparse_state {
+ uint16_t labstart[MAXREVLABELS];
+ uint8_t lablen[MAXREVLABELS];
+};
+
+union checklabel_state {
+ struct revparse_state ptr;
+};
+
+typedef struct {
+ void *ext;
+ void (*callback)(adns_query parent, adns_query child);
+
+ union {
+ struct {
+ adns_rrtype rev_rrtype;
+ adns_sockaddr addr;
+ } ptr;
+ struct {
+ unsigned want, have;
+ } addr;
+ } tinfo; /* type-specific state for the query itself: zero-init if you
+ * don't know better. */
+
+ union {
+ adns_rr_hostaddr *hostaddr;
+ } pinfo; /* state for use by parent's callback function */
+} qcontext;
+
+typedef struct typeinfo {
+ adns_rrtype typekey;
+ const char *rrtname;
+ const char *fmtname;
+ int fixed_rrsz;
+
+ void (*makefinal)(adns_query qu, void *data);
+ /* Change memory management of *data.
+ * Previously, used alloc_interim, now use alloc_final.
+ */
+
+ adns_status (*convstring)(vbuf *vb, const void *data);
+ /* Converts the RR data to a string representation in vbuf.
+ * vbuf will be appended to (it must have been initialised),
+ * and will not be null-terminated by convstring.
+ */
+
+ adns_status (*parse)(const parseinfo *pai, int cbyte,
+ int max, void *store_r);
+ /* Parse one RR, in dgram of length dglen, starting at cbyte and
+ * extending until at most max.
+ *
+ * The RR should be stored at *store_r, of length qu->typei->getrrsz().
+ *
+ * If there is an overrun which might indicate truncation, it should set
+ * *rdstart to -1; otherwise it may set it to anything else positive.
+ *
+ * nsstart is the offset of the authority section.
+ */
+
+ int (*diff_needswap)(adns_state ads,const void *datap_a,const void *datap_b);
+ /* Returns !0 if RR a should be strictly after RR b in the sort order,
+ * 0 otherwise. Must not fail.
+ */
+
+ adns_status (*checklabel)(adns_state ads, adns_queryflags flags,
+ union checklabel_state *cls, qcontext *ctx,
+ int labnum, const char *dgram,
+ int labstart, int lablen);
+ /* Check a label from the query domain string. The label is not
+ * necessarily null-terminated. The hook can refuse the query's submission
+ * by returning a nonzero status. State can be stored in *cls between
+ * calls, and useful information can be stashed in ctx->tinfo, to be stored
+ * with the query (e.g., it will be available to the parse hook). This
+ * hook can detect a first call because labnum is zero, and a final call
+ * because lablen is zero.
+ */
+
+ void (*postsort)(adns_state ads, void *array, int nrrs, int rrsz,
+ const struct typeinfo *typei);
+ /* Called immediately after the RRs have been sorted, and may rearrange
+ * them. (This is really for the benefit of SRV's bizarre weighting
+ * stuff.) May be 0 to mean nothing needs to be done.
+ */
+
+ int (*getrrsz)(const struct typeinfo *typei, adns_rrtype type);
+ /* Return the output resource-record element size; if this is null, then
+ * the rrsz member can be used.
+ */
+
+ void (*query_send)(adns_query qu, struct timeval now);
+ /* Send the query to nameservers, and hook it into the appropriate queue.
+ * Normal behaviour is to call adns__query_send, but this can be overridden
+ * for special effects.
+ */
+} typeinfo;
+
+adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags,
+ union checklabel_state *cls,
+ qcontext *ctx, int labnum,
+ const char *dgram, int labstart, int lablen);
+ /* implemented in query.c, used by types.c as default
+ * and as part of implementation for some fancier types
+ * doesn't require any state */
+
+typedef struct allocnode {
+ struct allocnode *next, *back;
+ size_t sz;
+} allocnode;
+
+union maxalign {
+ byte d[1];
+ struct in_addr ia;
+ long l;
+ void *p;
+ void (*fp)(void);
+ union maxalign *up;
+} data;
+
+struct adns__query {
+ adns_state ads;
+ enum { query_tosend, query_tcpw, query_childw, query_done } state;
+ adns_query back, next, parent;
+ struct { adns_query head, tail; } children;
+ struct { adns_query back, next; } siblings;
+ struct { allocnode *head, *tail; } allocations;
+ int interim_allocd, preserved_allocd;
+ void *final_allocspace;
+
+ const typeinfo *typei;
+ byte *query_dgram;
+ int query_dglen;
+
+ vbuf vb;
+ /* General-purpose messing-about buffer.
+ * Wherever a `big' interface is crossed, this may be corrupted/changed
+ * unless otherwise specified.
+ */
+
+ adns_answer *answer;
+ /* This is allocated when a query is submitted, to avoid being unable
+ * to relate errors to queries if we run out of memory. During
+ * query processing status, rrs is 0. cname is set if
+ * we found a cname (this corresponds to cname_dgram in the query
+ * structure). type is set from the word go. nrrs and rrs
+ * are set together, when we find how many rrs there are.
+ * owner is set during querying unless we're doing searchlist,
+ * in which case it is set only when we find an answer.
+ */
+
+ byte *cname_dgram;
+ int cname_dglen, cname_begin;
+ /* If non-0, has been allocated using . */
+
+ vbuf search_vb;
+ int search_origlen, search_pos, search_doneabs;
+ /* Used by the searching algorithm. The query domain in textual form
+ * is copied into the vbuf, and _origlen set to its length. Then
+ * we walk the searchlist, if we want to. _pos says where we are
+ * (next entry to try), and _doneabs says whether we've done the
+ * absolute query yet (0=not yet, 1=done, -1=must do straight away,
+ * but not done yet). If flags doesn't have adns_qf_search then
+ * the vbuf is initialised but empty and everything else is zero.
+ */
+
+ int id, flags, retries;
+ int udpnextserver;
+ unsigned long udpsent; /* bitmap indexed by server */
+ struct timeval timeout;
+ time_t expires; /* Earliest expiry time of any record we used. */
+
+ qcontext ctx;
+
+ /* Possible states:
+ *
+ * state Queue child id nextudpserver udpsent tcpfailed
+ *
+ * tosend NONE null >=0 0 zero zero
+ * tosend udpw null >=0 any nonzero zero
+ * tosend NONE null >=0 any nonzero zero
+ *
+ * tcpw tcpw null >=0 irrelevant any any
+ *
+ * child childw set >=0 irrelevant irrelevant irrelevant
+ * child NONE null >=0 irrelevant irrelevant irrelevant
+ * done output null -1 irrelevant irrelevant irrelevant
+ *
+ * Queries are only not on a queue when they are actually being processed.
+ * Queries in state tcpw/tcpw have been sent (or are in the to-send buffer)
+ * iff the tcp connection is in state server_ok.
+ *
+ * Internal queries (from adns__submit_internal) end up on intdone
+ * instead of output, and the callbacks are made on the way out of
+ * adns, to avoid reentrancy hazards.
+ *
+ * +------------------------+
+ * START -----> | tosend/NONE |
+ * +------------------------+
+ * / |\ \
+ * too big for UDP / UDP timeout \ \ send via UDP
+ * send via TCP / more retries \ \
+ * when conn'd / desired \ \
+ * | | |
+ * v | v
+ * +-----------+ +-------------+
+ * | tcpw/tcpw | ________ | tosend/udpw |
+ * +-----------+ \ +-------------+
+ * | | | UDP timeout | |
+ * | | | no more | |
+ * | | | retries | |
+ * \ | TCP died | desired | |
+ * \ \ no more | | |
+ * \ \ servers | TCP / |
+ * \ \ to try | timeout / |
+ * got \ \ v |_ | got
+ * reply \ _| +------------------+ / reply
+ * \ | done/output FAIL | /
+ * \ +------------------+ /
+ * \ /
+ * _| |_
+ * (..... got reply ....)
+ * / \
+ * need child query/ies / \ no child query
+ * / \
+ * |_ _|
+ * +---------------+ +----------------+
+ * | childw/childw | ----------------> | done/output OK |
+ * +---------------+ children done +----------------+
+ */
+};
+
+struct query_queue { adns_query head, tail; };
+
+#define MAXUDP 2
+
+struct adns__state {
+ adns_initflags iflags;
+ adns_logcallbackfn *logfn;
+ void *logfndata;
+ int configerrno;
+ struct query_queue udpw, tcpw, childw, output, intdone;
+ adns_query forallnext;
+ int nextid, tcpsocket;
+ struct udpsocket { int af; int fd; } udpsockets[MAXUDP];
+ int nudpsockets;
+ vbuf tcpsend, tcprecv;
+ int nservers, nsortlist, nsearchlist, searchndots, tcpserver, tcprecv_skip;
+ enum adns__tcpstate {
+ server_disconnected, server_connecting,
+ server_ok, server_broken
+ } tcpstate;
+ struct timeval tcptimeout;
+ /* This will have tv_sec==0 if it is not valid. It will always be
+ * valid if tcpstate _connecting. When _ok, it will be nonzero if
+ * we are idle (ie, tcpw queue is empty), in which case it is the
+ * absolute time when we will close the connection.
+ */
+ struct sigaction stdsigpipe;
+ sigset_t stdsigmask;
+ struct pollfd pollfds_buf[MAX_POLLFDS];
+ adns_rr_addr servers[MAXSERVERS];
+ struct sortlist {
+ adns_sockaddr base, mask;
+ } sortlist[MAXSORTLIST];
+ char **searchlist;
+ unsigned config_report_unknown:1;
+ unsigned short rand48xsubi[3];
+};
+
+/* From addrfam.c: */
+
+extern int adns__addrs_equal_raw(const struct sockaddr *a,
+ int bf, const void *b);
+/* Returns nonzero a's family is bf and a's protocol address field
+ * refers to the same protocol address as that stored at ba.
+ */
+
+extern int adns__addrs_equal(const adns_sockaddr *a,
+ const adns_sockaddr *b);
+/* Returns nonzero if the two refer to the same protocol address
+ * (disregarding port, IPv6 scope, etc).
+ */
+
+extern int adns__sockaddrs_equal(const struct sockaddr *sa,
+ const struct sockaddr *sb);
+/* Return nonzero if the two socket addresses are equal (in all significant
+ * respects).
+ */
+
+extern int adns__addr_width(int af);
+/* Return the width of addresses of family af, in bits. */
+
+extern void adns__prefix_mask(adns_sockaddr *sa, int len);
+/* Stores in sa's protocol address field an address mask for address
+ * family af, whose first len bits are set and the remainder are
+ * clear. On entry, sa's af field must be set. This is what you want
+ * for converting a prefix length into a netmask.
+ */
+
+extern int adns__guess_prefix_length(const adns_sockaddr *addr);
+/* Given a network base address, guess the appropriate prefix length based on
+ * the appropriate rules for the address family (e.g., for IPv4, this uses
+ * the old address classes).
+ */
+
+extern int adns__addr_matches(int af, const void *addr,
+ const adns_sockaddr *base,
+ const adns_sockaddr *mask);
+/* Return nonzero if the protocol address specified by af and addr
+ * lies within the network specified by base and mask.
+ */
+
+extern void adns__addr_inject(const void *a, adns_sockaddr *sa);
+/* Injects the protocol address *a into the socket adress sa. Assumes
+ * that sa->sa_family is already set correctly.
+ */
+
+extern const void *adns__sockaddr_addr(const struct sockaddr *sa);
+/* Returns the address of the protocol address field in sa.
+ */
+
+char *adns__sockaddr_ntoa(const struct sockaddr *sa, char *buf);
+/* Converts sa to a string, and writes it to buf, which must be at
+ * least ADNS_ADDR2TEXT_BUFLEN bytes long (unchecked). Returns buf;
+ * can't fail.
+ */
+
+extern int adns__make_reverse_domain(const struct sockaddr *sa,
+ const char *zone,
+ char **buf_io, size_t bufsz,
+ char **buf_free_r);
+/* Construct a reverse domain string, given a socket address and a parent
+ * zone. If zone is null, then use the standard reverse-lookup zone for the
+ * address family. If the length of the resulting string is no larger than
+ * bufsz, then the result is stored starting at *buf_io; otherwise a new
+ * buffer is allocated is used, and a pointer to it is stored in both *buf_io
+ * and *buf_free_r (the latter of which should be null on entry). If
+ * something goes wrong, then an errno value is returned: ENOSYS if the
+ * address family of sa isn't recognized, or ENOMEM if the attempt to
+ * allocate an output buffer failed.
+ */
+
+extern bool adns__revparse_label(struct revparse_state *rps, int labnum,
+ const char *dgram,
+ int labstart, int lablen);
+/* Parse a label in a reverse-domain name, given its index labnum (starting
+ * from zero), a pointer to its contents (which need not be null-terminated),
+ * and its length. The state in *rps is initialized implicitly when labnum
+ * is zero.
+ *
+ * Returns 1 if the parse is proceeding successfully, 0 if the domain
+ * name is definitely invalid and the parse must be abandoned.
+ */
+
+extern bool adns__revparse_done(struct revparse_state *rps,
+ const char *dgram, int nlabels,
+ adns_rrtype *rrtype_r, adns_sockaddr *addr_r);
+/* Finishes parsing a reverse-domain name, given the total number of
+ * labels in the name. On success, fills in the af and protocol
+ * address in *addr_r, and the forward query type in *rrtype_r
+ * (because that turns out to be useful). Returns 1 if the parse
+ * was successful.
+ */
+
+/* From setup.c: */
+
+int adns__setnonblock(adns_state ads, int fd); /* => errno value */
+
+/* From general.c: */
+
+void adns__vlprintf(adns_state ads, const char *fmt, va_list al);
+void adns__lprintf(adns_state ads, const char *fmt,
+ ...) PRINTFFORMAT(2,3);
+
+void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent,
+ int serv, adns_query qu, const char *fmt, va_list al);
+
+void adns__debug(adns_state ads, int serv, adns_query qu,
+ const char *fmt, ...) PRINTFFORMAT(4,5);
+void adns__warn(adns_state ads, int serv, adns_query qu,
+ const char *fmt, ...) PRINTFFORMAT(4,5);
+void adns__diag(adns_state ads, int serv, adns_query qu,
+ const char *fmt, ...) PRINTFFORMAT(4,5);
+
+int adns__vbuf_ensure(vbuf *vb, int want);
+int adns__vbuf_appendstr(vbuf *vb, const char *data); /* doesn't include nul */
+int adns__vbuf_append(vbuf *vb, const byte *data, int len);
+/* 1=>success, 0=>realloc failed */
+void adns__vbuf_appendq(vbuf *vb, const byte *data, int len);
+void adns__vbuf_init(vbuf *vb);
+void adns__vbuf_free(vbuf *vb);
+
+const char *adns__diag_domain(adns_state ads, int serv, adns_query qu,
+ vbuf *vb,
+ const byte *dgram, int dglen, int cbyte);
+/* Unpicks a domain in a datagram and returns a string suitable for
+ * printing it as. Never fails - if an error occurs, it will
+ * return some kind of string describing the error.
+ *
+ * serv may be -1 and qu may be 0. vb must have been initialised,
+ * and will be left in an arbitrary consistent state.
+ *
+ * Returns either vb->buf, or a pointer to a string literal. Do not modify
+ * vb before using the return value.
+ */
+
+int adns__getrrsz_default(const typeinfo *typei, adns_rrtype type);
+/* Default function for the `getrrsz' type hook; returns the `fixed_rrsz'
+ * value from the typeinfo entry.
+ */
+
+void adns__isort(void *array, int nobjs, int sz, void *tempbuf,
+ int (*needswap)(void *context, const void *a, const void *b),
+ void *context);
+/* Does an insertion sort of array which must contain nobjs objects
+ * each sz bytes long. tempbuf must point to a buffer at least
+ * sz bytes long. needswap should return !0 if a>b (strictly, ie
+ * wrong order) 0 if a<=b (ie, order is fine).
+ */
+
+void adns__sigpipe_protect(adns_state);
+void adns__sigpipe_unprotect(adns_state);
+/* If SIGPIPE protection is not disabled, will block all signals except
+ * SIGPIPE, and set SIGPIPE's disposition to SIG_IGN. (And then restore.)
+ * Each call to _protect must be followed by a call to _unprotect before
+ * any significant amount of code gets to run, since the old signal mask
+ * is stored in the adns structure.
+ */
+
+/* From transmit.c: */
+
+adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r,
+ const char *owner, int ol,
+ const typeinfo *typei, adns_rrtype type,
+ adns_queryflags flags);
+/* Assembles a query packet in vb. A new id is allocated and returned.
+ */
+
+adns_status adns__mkquery_frdgram(adns_state ads, vbuf *vb, int *id_r,
+ const byte *qd_dgram, int qd_dglen,
+ int qd_begin,
+ adns_rrtype type, adns_queryflags flags);
+/* Same as adns__mkquery, but takes the owner domain from an existing datagram.
+ * That domain must be correct and untruncated.
+ */
+
+void adns__querysend_tcp(adns_query qu, struct timeval now);
+/* Query must be in state tcpw/tcpw; it will be sent if possible and
+ * no further processing can be done on it for now. The connection
+ * might be broken, but no reconnect will be attempted.
+ */
+
+struct udpsocket *adns__udpsocket_by_af(adns_state ads, int af);
+/* Find the UDP socket structure in ads which has the given address family.
+ * Return null if there isn't one.
+ *
+ * This is used during initialization, so ads is only partially filled in.
+ * The requirements are that nudp is set, and that udpsocket[i].af are
+ * defined for 0<=i<nudp.
+ */
+
+void adns__query_send(adns_query qu, struct timeval now);
+/* Query must be in state tosend/NONE; it will be moved to a new state,
+ * and no further processing can be done on it for now.
+ * (Resulting state is one of udp/timew, tcpwait/timew (if server not
+ * connected), tcpsent/timew, child/childw or done/output.)
+ * __query_send may decide to use either UDP or TCP depending whether
+ * _qf_usevc is set (or has become set) and whether the query is too
+ * large.
+ */
+
+/* From query.c: */
+
+adns_status adns__internal_submit(adns_state ads, adns_query *query_r,
+ adns_query parent,
+ const typeinfo *typei, adns_rrtype type,
+ vbuf *qumsg_vb, int id,
+ adns_queryflags flags, struct timeval now,
+ qcontext *ctx);
+/* Submits a query (for internal use, called during external submits).
+ *
+ * The new query is returned in *query_r, or we return adns_s_nomemory.
+ *
+ * The query datagram should already have been assembled in qumsg_vb;
+ * the memory for it is _taken over_ by this routine whether it
+ * succeeds or fails (if it succeeds, the vbuf is reused for qu->vb).
+ *
+ * *ctx is copied byte-for-byte into the query. Before doing this, its tinfo
+ * field may be modified by type hooks.
+ *
+ * When the child query is done, ctx->callback will be called. The
+ * child will already have been taken off both the global list of
+ * queries in ads and the list of children in the parent. The child
+ * will be freed when the callback returns. The parent will have been
+ * taken off the global childw queue.
+ *
+ * The callback should either call adns__query_done, if it is
+ * complete, or adns__query_fail, if an error has occurred, in which
+ * case the other children (if any) will be cancelled. If the parent
+ * has more unfinished children (or has just submitted more) then the
+ * callback may choose to wait for them - it must then put the parent
+ * back on the childw queue.
+ */
+
+void adns__search_next(adns_state ads, adns_query qu, struct timeval now);
+/* Walks down the searchlist for a query with adns_qf_search.
+ * The query should have just had a negative response, or not had
+ * any queries sent yet, and should not be on any queue.
+ * The query_dgram if any will be freed and forgotten and a new
+ * one constructed from the search_* members of the query.
+ *
+ * Cannot fail (in case of error, calls adns__query_fail).
+ */
+
+void *adns__alloc_interim(adns_query qu, size_t sz);
+void *adns__alloc_preserved(adns_query qu, size_t sz);
+/* Allocates some memory, and records which query it came from
+ * and how much there was.
+ *
+ * If an error occurs in the query, all the memory from _interim is
+ * simply freed. If the query succeeds, one large buffer will be made
+ * which is big enough for all these allocations, and then
+ * adns__alloc_final will get memory from this buffer.
+ *
+ * _alloc_interim can fail (and return 0).
+ * The caller must ensure that the query is failed.
+ *
+ * The memory from _preserved is is kept and transferred into the
+ * larger buffer - unless we run out of memory, in which case it too
+ * is freed. When you use _preserved you have to add code to the
+ * x_nomem error exit case in adns__makefinal_query to clear out the
+ * pointers you made to those allocations, because that's when they're
+ * thrown away; you should also make a note in the declaration of
+ * those pointer variables, to note that they are _preserved rather
+ * than _interim. If they're in the answer, note it here:
+ * answer->cname and answer->owner are _preserved.
+ */
+
+void adns__transfer_interim(adns_query from, adns_query to, void *block);
+/* Transfers an interim allocation from one query to another, so that
+ * the `to' query will have room for the data when we get to makefinal
+ * and so that the free will happen when the `to' query is freed
+ * rather than the `from' query.
+ *
+ * It is legal to call adns__transfer_interim with a null pointer; this
+ * has no effect.
+ *
+ * _transfer_interim also ensures that the expiry time of the `to' query
+ * is no later than that of the `from' query, so that child queries'
+ * TTLs get inherited by their parents.
+ */
+
+void adns__free_interim(adns_query qu, void *p);
+/* Forget about a block allocated by adns__alloc_interim.
+ */
+
+void *adns__alloc_mine(adns_query qu, size_t sz);
+/* Like _interim, but does not record the length for later
+ * copying into the answer. This just ensures that the memory
+ * will be freed when we're done with the query.
+ */
+
+void *adns__alloc_final(adns_query qu, size_t sz);
+/* Cannot fail, and cannot return 0.
+ */
+
+void adns__makefinal_block(adns_query qu, void **blpp, size_t sz);
+void adns__makefinal_str(adns_query qu, char **strp);
+
+void adns__reset_preserved(adns_query qu);
+/* Resets all of the memory management stuff etc. to take account of
+ * only the _preserved stuff from _alloc_preserved. Used when we find
+ * an error somewhere and want to just report the error (with perhaps
+ * CNAME, owner, etc. info), and also when we're halfway through RRs
+ * in a datagram and discover that we need to retry the query.
+ */
+
+void adns__cancel(adns_query qu);
+void adns__query_done(adns_query qu);
+void adns__query_fail(adns_query qu, adns_status st);
+void adns__cancel_children(adns_query qu);
+
+void adns__returning(adns_state ads, adns_query qu);
+/* Must be called before returning from adns any time that we have
+ * progressed (including made, finished or destroyed) queries.
+ *
+ * Might reenter adns via internal query callbacks, so
+ * external-faciing functions which call adns__returning should
+ * normally be avoided in internal code. */
+
+/* From reply.c: */
+
+void adns__procdgram(adns_state ads, const byte *dgram, int len,
+ int serv, int viatcp, struct timeval now);
+/* This function is allowed to cause new datagrams to be constructed
+ * and sent, or even new queries to be started. However,
+ * query-sending functions are not allowed to call any general event
+ * loop functions in case they accidentally call this.
+ *
+ * Ie, receiving functions may call sending functions.
+ * Sending functions may NOT call receiving functions.
+ */
+
+/* From types.c: */
+
+const typeinfo *adns__findtype(adns_rrtype type);
+
+/* From parse.c: */
+
+typedef struct {
+ adns_state ads;
+ adns_query qu;
+ int serv;
+ const byte *dgram;
+ int dglen, max, cbyte, namelen;
+ int *dmend_r;
+} findlabel_state;
+
+void adns__findlabel_start(findlabel_state *fls, adns_state ads,
+ int serv, adns_query qu,
+ const byte *dgram, int dglen, int max,
+ int dmbegin, int *dmend_rlater);
+/* Finds labels in a domain in a datagram.
+ *
+ * Call this routine first.
+ * dmend_rlater may be null. ads (and of course fls) may not be.
+ * serv may be -1, qu may be null - they are for error reporting.
+ */
+
+adns_status adns__findlabel_next(findlabel_state *fls,
+ int *lablen_r, int *labstart_r);
+/* Then, call this one repeatedly.
+ *
+ * It will return adns_s_ok if all is well, and tell you the length
+ * and start of successive labels. labstart_r may be null, but
+ * lablen_r must not be.
+ *
+ * After the last label, it will return with *lablen_r zero.
+ * Do not then call it again; instead, just throw away the findlabel_state.
+ *
+ * *dmend_rlater will have been set to point to the next part of
+ * the datagram after the label (or after the uncompressed part,
+ * if compression was used). *namelen_rlater will have been set
+ * to the length of the domain name (total length of labels plus
+ * 1 for each intervening dot).
+ *
+ * If the datagram appears to be truncated, *lablen_r will be -1.
+ * *dmend_rlater, *labstart_r and *namelen_r may contain garbage.
+ * Do not call _next again.
+ *
+ * There may also be errors, in which case *dmend_rlater,
+ * *namelen_rlater, *lablen_r and *labstart_r may contain garbage.
+ * Do not then call findlabel_next again.
+ */
+
+typedef enum {
+ pdf_quoteok= 0x001
+} parsedomain_flags;
+
+adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
+ vbuf *vb, parsedomain_flags flags,
+ const byte *dgram, int dglen, int *cbyte_io,
+ int max);
+/* vb must already have been initialised; it will be reset if necessary.
+ * If there is truncation, vb->used will be set to 0; otherwise
+ * (if there is no error) vb will be null-terminated.
+ * If there is an error vb and *cbyte_io may be left indeterminate.
+ *
+ * serv may be -1 and qu may be 0 - they are used for error reporting only.
+ */
+
+adns_status adns__parse_domain_more(findlabel_state *fls, adns_state ads,
+ adns_query qu, vbuf *vb,
+ parsedomain_flags flags,
+ const byte *dgram);
+/* Like adns__parse_domain, but you pass it a pre-initialised findlabel_state,
+ * for continuing an existing domain or some such of some kind. Also, unlike
+ * _parse_domain, the domain data will be appended to vb, rather than replacing
+ * the existing contents.
+ */
+
+adns_status adns__findrr(adns_query qu, int serv,
+ const byte *dgram, int dglen, int *cbyte_io,
+ int *type_r, int *class_r, unsigned long *ttl_r,
+ int *rdlen_r, int *rdstart_r,
+ int *ownermatchedquery_r);
+/* Finds the extent and some of the contents of an RR in a datagram
+ * and does some checks. The datagram is *dgram, length dglen, and
+ * the RR starts at *cbyte_io (which is updated afterwards to point
+ * to the end of the RR).
+ *
+ * The type, class, TTL and RRdata length and start are returned iff
+ * the corresponding pointer variables are not null. type_r, class_r
+ * and ttl_r may not be null. The TTL will be capped.
+ *
+ * If ownermatchedquery_r != 0 then the owner domain of this
+ * RR will be compared with that in the query (or, if the query
+ * has gone to a CNAME lookup, with the canonical name).
+ * In this case, *ownermatchedquery_r will be set to 0 or 1.
+ * The query datagram (or CNAME datagram) MUST be valid and not truncated.
+ *
+ * If there is truncation then *type_r will be set to -1 and
+ * *cbyte_io, *class_r, *rdlen_r, *rdstart_r and *eo_matched_r will be
+ * undefined.
+ *
+ * qu must obviously be non-null.
+ *
+ * If an error is returned then *type_r will be undefined too.
+ */
+
+adns_status adns__findrr_anychk(adns_query qu, int serv,
+ const byte *dgram, int dglen, int *cbyte_io,
+ int *type_r, int *class_r,
+ unsigned long *ttl_r,
+ int *rdlen_r, int *rdstart_r,
+ const byte *eo_dgram, int eo_dglen,
+ int eo_cbyte, int *eo_matched_r);
+/* Like adns__findrr_checked, except that the datagram and
+ * owner to compare with can be specified explicitly.
+ *
+ * If the caller thinks they know what the owner of the RR ought to
+ * be they can pass in details in eo_*: this is another (or perhaps
+ * the same datagram), and a pointer to where the putative owner
+ * starts in that datagram. In this case *eo_matched_r will be set
+ * to 1 if the datagram matched or 0 if it did not. Either
+ * both eo_dgram and eo_matched_r must both be non-null, or they
+ * must both be null (in which case eo_dglen and eo_cbyte will be ignored).
+ * The eo datagram and contained owner domain MUST be valid and
+ * untruncated.
+ */
+
+void adns__update_expires(adns_query qu, unsigned long ttl,
+ struct timeval now);
+/* Updates the `expires' field in the query, so that it doesn't exceed
+ * now + ttl.
+ */
+
+bool adns__labels_equal(const byte *a, int al, const byte *b, int bl);
+
+/* From event.c: */
+
+void adns__tcp_broken(adns_state ads, const char *what, const char *why);
+/* what and why may be both 0, or both non-0. */
+
+void adns__tcp_tryconnect(adns_state ads, struct timeval now);
+
+void adns__autosys(adns_state ads, struct timeval now);
+/* Make all the system calls we want to if the application wants us to.
+ * Must not be called from within adns internal processing functions,
+ * lest we end up in recursive descent !
+ */
+
+void adns__must_gettimeofday(adns_state ads, const struct timeval **now_io,
+ struct timeval *tv_buf);
+/* Call with care - might reentrantly cause queries to be completed! */
+
+int adns__pollfds(adns_state ads, struct pollfd pollfds_buf[MAX_POLLFDS]);
+void adns__fdevents(adns_state ads,
+ const struct pollfd *pollfds, int npollfds,
+ int maxfd, const fd_set *readfds,
+ const fd_set *writefds, const fd_set *exceptfds,
+ struct timeval now, int *r_r);
+int adns__internal_check(adns_state ads,
+ adns_query *query_io,
+ adns_answer **answer,
+ void **context_r);
+
+void adns__timeouts(adns_state ads, int act,
+ struct timeval **tv_io, struct timeval *tvbuf,
+ struct timeval now);
+/* If act is !0, then this will also deal with the TCP connection
+ * if previous events broke it or require it to be connected.
+ */
+
+/* From check.c: */
+
+void adns__consistency(adns_state ads, adns_query qu, consistency_checks cc);
+
+/* Useful static inline functions: */
+
+static inline int ctype_whitespace(int c) {
+ return c==' ' || c=='\n' || c=='\t';
+}
+static inline int ctype_digit(int c) { return c>='0' && c<='9'; }
+static inline int ctype_alpha(int c) {
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+}
+static inline int ctype_toupper(int c) {
+ return ctype_alpha(c) ? (c & ~32) : c;
+}
+static inline int ctype_822special(int c) {
+ return strchr("()<>@,;:\\\".[]",c) != 0;
+}
+static inline int ctype_domainunquoted(int c) {
+ return ctype_alpha(c) || ctype_digit(c) || (strchr("-_/+",c) != 0);
+}
+
+static inline int errno_resources(int e) { return e==ENOMEM || e==ENOBUFS; }
+
+/* Useful macros */
+
+#define MEM_ROUND(sz) \
+ (( ((sz)+sizeof(union maxalign)-1) / sizeof(union maxalign) ) \
+ * sizeof(union maxalign) )
+
+#define GETIL_B(cb) (((dgram)[(cb)++]) & 0x0ff)
+#define GET_B(cb,tv) ((tv)= GETIL_B((cb)))
+#define GET_W(cb,tv) ((tv)=0,(tv)|=(GETIL_B((cb))<<8), (tv)|=GETIL_B(cb), (tv))
+#define GET_L(cb,tv) ( (tv)=0, \
+ (tv)|=(GETIL_B((cb))<<24), \
+ (tv)|=(GETIL_B((cb))<<16), \
+ (tv)|=(GETIL_B((cb))<<8), \
+ (tv)|=GETIL_B(cb), \
+ (tv) )
+
+#endif
diff --git a/src/parse.c b/src/parse.c
new file mode 100644
index 0000000..caedf15
--- /dev/null
+++ b/src/parse.c
@@ -0,0 +1,261 @@
+/*
+ * parse.c
+ * - parsing assistance functions (mainly for domains inside datagrams)
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include "internal.h"
+
+static int vbuf_append_quoted1035(vbuf *vb, const byte *buf, int len) {
+ char qbuf[10];
+ int i, ch;
+
+ while (len) {
+ qbuf[0]= 0;
+ for (i=0; i<len; i++) {
+ ch= buf[i];
+ if (ch <= ' ' || ch >= 127) {
+ sprintf(qbuf,"\\%03o",ch);
+ break;
+ } else if (!ctype_domainunquoted(ch)) {
+ sprintf(qbuf,"\\%c",ch);
+ break;
+ }
+ }
+ if (!adns__vbuf_append(vb,buf,i) ||
+ !adns__vbuf_append(vb,qbuf,strlen(qbuf)))
+ return 0;
+ if (i<len) i++;
+ buf+= i;
+ len-= i;
+ }
+ return 1;
+}
+
+void adns__findlabel_start(findlabel_state *fls, adns_state ads,
+ int serv, adns_query qu,
+ const byte *dgram, int dglen, int max,
+ int dmbegin, int *dmend_rlater) {
+ fls->ads= ads;
+ fls->qu= qu;
+ fls->serv= serv;
+ fls->dgram= dgram;
+ fls->dglen= dglen;
+ fls->max= max;
+ fls->cbyte= dmbegin;
+ fls->namelen= 0;
+ fls->dmend_r= dmend_rlater;
+}
+
+adns_status adns__findlabel_next(findlabel_state *fls,
+ int *lablen_r, int *labstart_r) {
+ int lablen, jumpto;
+ const char *dgram;
+
+ dgram= fls->dgram;
+ for (;;) {
+ if (fls->cbyte >= fls->dglen) goto x_truncated;
+ if (fls->cbyte >= fls->max) goto x_badresponse;
+ GET_B(fls->cbyte,lablen);
+ if (!(lablen & 0x0c0)) break;
+ if ((lablen & 0x0c0) != 0x0c0) return adns_s_unknownformat;
+ if (fls->cbyte >= fls->dglen) goto x_truncated;
+ if (fls->cbyte >= fls->max) goto x_badresponse;
+ GET_B(fls->cbyte,jumpto);
+ jumpto |= (lablen&0x3f)<<8;
+ if (fls->dmend_r) *(fls->dmend_r)= fls->cbyte;
+ fls->cbyte= jumpto;
+ fls->dmend_r= 0; fls->max= fls->dglen+1;
+ }
+ if (labstart_r) *labstart_r= fls->cbyte;
+ if (lablen) {
+ if (fls->namelen) fls->namelen++;
+ fls->namelen+= lablen;
+ if (fls->namelen > DNS_MAXDOMAIN) return adns_s_answerdomaintoolong;
+ fls->cbyte+= lablen;
+ if (fls->cbyte > fls->dglen) goto x_truncated;
+ if (fls->cbyte > fls->max) goto x_badresponse;
+ } else {
+ if (fls->dmend_r) *(fls->dmend_r)= fls->cbyte;
+ }
+ *lablen_r= lablen;
+ return adns_s_ok;
+
+ x_truncated:
+ *lablen_r= -1;
+ return adns_s_ok;
+
+ x_badresponse:
+ adns__diag(fls->ads,fls->serv,fls->qu,
+ "label in domain runs beyond end of domain");
+ return adns_s_invalidresponse;
+}
+
+adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
+ vbuf *vb, parsedomain_flags flags,
+ const byte *dgram, int dglen, int *cbyte_io,
+ int max) {
+ findlabel_state fls;
+
+ adns__findlabel_start(&fls,ads, serv,qu, dgram,dglen,max,
+ *cbyte_io,cbyte_io);
+ vb->used= 0;
+ return adns__parse_domain_more(&fls,ads,qu, vb,flags,dgram);
+}
+
+adns_status adns__parse_domain_more(findlabel_state *fls, adns_state ads,
+ adns_query qu, vbuf *vb,
+ parsedomain_flags flags,
+ const byte *dgram) {
+ int lablen, labstart, i, ch, first;
+ adns_status st;
+
+ first= 1;
+ for (;;) {
+ st= adns__findlabel_next(fls,&lablen,&labstart);
+ if (st) return st;
+ if (lablen<0) { vb->used=0; return adns_s_ok; }
+ if (!lablen) break;
+ if (first) {
+ first= 0;
+ } else {
+ if (!adns__vbuf_append(vb,".",1)) return adns_s_nomemory;
+ }
+ if (flags & pdf_quoteok) {
+ if (!vbuf_append_quoted1035(vb,dgram+labstart,lablen))
+ return adns_s_nomemory;
+ } else {
+ ch= dgram[labstart];
+ if (!ctype_alpha(ch) && !ctype_digit(ch))
+ return adns_s_answerdomaininvalid;
+ for (i= labstart+1; i<labstart+lablen; i++) {
+ ch= dgram[i];
+ if (ch != '-' && !ctype_alpha(ch) && !ctype_digit(ch))
+ return adns_s_answerdomaininvalid;
+ }
+ if (!adns__vbuf_append(vb,dgram+labstart,lablen))
+ return adns_s_nomemory;
+ }
+ }
+ if (!adns__vbuf_append(vb,"",1)) return adns_s_nomemory;
+ return adns_s_ok;
+}
+
+bool adns__labels_equal(const byte *a, int al, const byte *b, int bl) {
+ if (al != bl) return 0;
+ while (al-- > 0) {
+ int ac= ctype_toupper(*a++);
+ int bc= ctype_toupper(*b++);
+ if (ac != bc) return 0;
+ }
+ return 1;
+}
+
+adns_status adns__findrr_anychk(adns_query qu, int serv,
+ const byte *dgram, int dglen, int *cbyte_io,
+ int *type_r, int *class_r,
+ unsigned long *ttl_r,
+ int *rdlen_r, int *rdstart_r,
+ const byte *eo_dgram, int eo_dglen,
+ int eo_cbyte, int *eo_matched_r) {
+ findlabel_state fls, eo_fls_buf;
+ findlabel_state *eo_fls; /* 0 iff we know it's not matching eo_... */
+ int cbyte;
+
+ int tmp, rdlen;
+ unsigned long ttl;
+ int lablen, labstart;
+ int eo_lablen, eo_labstart;
+ adns_status st;
+
+ cbyte= *cbyte_io;
+
+ adns__findlabel_start(&fls,qu->ads, serv,qu, dgram,dglen,dglen,cbyte,&cbyte);
+ if (eo_dgram) {
+ eo_fls= &eo_fls_buf;
+ adns__findlabel_start(eo_fls,qu->ads, -1,0,
+ eo_dgram,eo_dglen,eo_dglen,eo_cbyte,0);
+ } else {
+ eo_fls= 0;
+ }
+
+ for (;;) {
+ st= adns__findlabel_next(&fls,&lablen,&labstart);
+ if (st) return st;
+ if (lablen<0) goto x_truncated;
+
+ if (eo_fls) {
+ st= adns__findlabel_next(eo_fls,&eo_lablen,&eo_labstart);
+ assert(!st); assert(eo_lablen>=0);
+ if (!adns__labels_equal(dgram+labstart, lablen,
+ eo_dgram+eo_labstart, eo_lablen))
+ eo_fls= 0;
+ }
+ if (!lablen) break;
+ }
+ if (eo_matched_r) *eo_matched_r= !!eo_fls;
+
+ if (cbyte+10>dglen) goto x_truncated;
+ GET_W(cbyte,tmp); *type_r= tmp;
+ GET_W(cbyte,tmp); *class_r= tmp;
+
+ GET_L(cbyte,ttl);
+ if (ttl > MAXTTLBELIEVE) ttl= MAXTTLBELIEVE;
+ *ttl_r= ttl;
+
+ GET_W(cbyte,rdlen); if (rdlen_r) *rdlen_r= rdlen;
+ if (rdstart_r) *rdstart_r= cbyte;
+ cbyte+= rdlen;
+ if (cbyte>dglen) goto x_truncated;
+ *cbyte_io= cbyte;
+ return adns_s_ok;
+
+ x_truncated:
+ *type_r= -1;
+ return 0;
+}
+
+adns_status adns__findrr(adns_query qu, int serv,
+ const byte *dgram, int dglen, int *cbyte_io,
+ int *type_r, int *class_r, unsigned long *ttl_r,
+ int *rdlen_r, int *rdstart_r,
+ int *ownermatchedquery_r) {
+ if (!ownermatchedquery_r) {
+ return adns__findrr_anychk(qu,serv,
+ dgram,dglen,cbyte_io,
+ type_r,class_r,ttl_r,rdlen_r,rdstart_r,
+ 0,0,0, 0);
+ } else if (!qu->cname_dgram) {
+ return adns__findrr_anychk(qu,serv,
+ dgram,dglen,cbyte_io,
+ type_r,class_r,ttl_r,rdlen_r,rdstart_r,
+ qu->query_dgram,qu->query_dglen,DNS_HDRSIZE,
+ ownermatchedquery_r);
+ } else {
+ return adns__findrr_anychk(qu,serv,
+ dgram,dglen,cbyte_io,
+ type_r,class_r,ttl_r,rdlen_r,rdstart_r,
+ qu->cname_dgram,qu->cname_dglen,qu->cname_begin,
+ ownermatchedquery_r);
+ }
+}
diff --git a/src/poll.c b/src/poll.c
new file mode 100644
index 0000000..305b275
--- /dev/null
+++ b/src/poll.c
@@ -0,0 +1,130 @@
+/*
+ * poll.c
+ * - wrappers for poll(2)
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <limits.h>
+#include <string.h>
+
+#include "internal.h"
+
+#ifdef HAVE_POLL
+
+int adns_beforepoll(adns_state ads, struct pollfd *fds, int *nfds_io,
+ int *timeout_io, const struct timeval *now) {
+ struct timeval tv_nowbuf, tv_tobuf, *tv_to;
+ int space, found, timeout_ms, r;
+ struct pollfd fds_tmp[MAX_POLLFDS];
+
+ adns__consistency(ads,0,cc_entex);
+
+ if (timeout_io) {
+ adns__must_gettimeofday(ads,&now,&tv_nowbuf);
+ if (!now) { *nfds_io= 0; r= 0; goto xit; }
+
+ timeout_ms= *timeout_io;
+ if (timeout_ms == -1) {
+ tv_to= 0;
+ } else {
+ tv_tobuf.tv_sec= timeout_ms / 1000;
+ tv_tobuf.tv_usec= (timeout_ms % 1000)*1000;
+ tv_to= &tv_tobuf;
+ }
+
+ adns__timeouts(ads, 0, &tv_to,&tv_tobuf, *now);
+
+ if (tv_to) {
+ assert(tv_to == &tv_tobuf);
+ timeout_ms= (tv_tobuf.tv_usec+999)/1000;
+ assert(tv_tobuf.tv_sec < (INT_MAX-timeout_ms)/1000);
+ timeout_ms += tv_tobuf.tv_sec*1000;
+ } else {
+ timeout_ms= -1;
+ }
+ *timeout_io= timeout_ms;
+ }
+
+ space= *nfds_io;
+ if (space >= MAX_POLLFDS) {
+ found= adns__pollfds(ads,fds);
+ *nfds_io= found;
+ } else {
+ found= adns__pollfds(ads,fds_tmp);
+ *nfds_io= found;
+ if (space < found) { r= ERANGE; goto xit; }
+ memcpy(fds,fds_tmp,sizeof(struct pollfd)*found);
+ }
+ r= 0;
+xit:
+ adns__returning(ads,0);
+ return r;
+}
+
+void adns_afterpoll(adns_state ads, const struct pollfd *fds, int nfds,
+ const struct timeval *now) {
+ struct timeval tv_buf;
+
+ adns__consistency(ads,0,cc_entex);
+ adns__must_gettimeofday(ads,&now,&tv_buf);
+ if (now) {
+ adns__timeouts(ads, 1, 0,0, *now);
+ adns__fdevents(ads, fds,nfds, 0,0,0,0, *now,0);
+ }
+ adns__returning(ads,0);
+}
+
+int adns_wait_poll(adns_state ads,
+ adns_query *query_io,
+ adns_answer **answer_r,
+ void **context_r) {
+ int r, nfds, to;
+ struct pollfd fds[MAX_POLLFDS];
+
+ adns__consistency(ads,0,cc_entex);
+
+ for (;;) {
+ r= adns__internal_check(ads,query_io,answer_r,context_r);
+ if (r != EAGAIN) goto xit;
+ nfds= MAX_POLLFDS; to= -1;
+ adns_beforepoll(ads,fds,&nfds,&to,0);
+ r= poll(fds,nfds,to);
+ if (r == -1) {
+ if (errno == EINTR) {
+ if (ads->iflags & adns_if_eintr) { r= EINTR; goto xit; }
+ } else {
+ adns__diag(ads,-1,0,"poll failed in wait: %s",strerror(errno));
+ adns_globalsystemfailure(ads);
+ }
+ } else {
+ assert(r >= 0);
+ adns_afterpoll(ads,fds,nfds,0);
+ }
+ }
+
+ xit:
+ adns__returning(ads,0);
+ return r;
+}
+
+#endif
diff --git a/src/query.c b/src/query.c
new file mode 100644
index 0000000..ff56fc3
--- /dev/null
+++ b/src/query.c
@@ -0,0 +1,677 @@
+/*
+ * query.c
+ * - overall query management (allocation, completion)
+ * - per-query memory management
+ * - query submission and cancellation (user-visible and internal)
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include "internal.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <sys/time.h>
+
+#include "internal.h"
+
+static adns_query query_alloc(adns_state ads,
+ const typeinfo *typei, adns_rrtype type,
+ adns_queryflags flags, struct timeval now) {
+ /* Allocate a virgin query and return it. */
+ adns_query qu;
+
+ qu= malloc(sizeof(*qu)); if (!qu) return 0;
+ qu->answer= malloc(sizeof(*qu->answer));
+ if (!qu->answer) { free(qu); return 0; }
+
+ qu->ads= ads;
+ qu->state= query_tosend;
+ qu->back= qu->next= qu->parent= 0;
+ LIST_INIT(qu->children);
+ LINK_INIT(qu->siblings);
+ LIST_INIT(qu->allocations);
+ qu->interim_allocd= 0;
+ qu->preserved_allocd= 0;
+ qu->final_allocspace= 0;
+
+ qu->typei= typei;
+ qu->query_dgram= 0;
+ qu->query_dglen= 0;
+ adns__vbuf_init(&qu->vb);
+
+ qu->cname_dgram= 0;
+ qu->cname_dglen= qu->cname_begin= 0;
+
+ adns__vbuf_init(&qu->search_vb);
+ qu->search_origlen= qu->search_pos= qu->search_doneabs= 0;
+
+ qu->id= -2; /* will be overwritten with real id before we leave adns */
+ qu->flags= flags;
+ qu->retries= 0;
+ qu->udpnextserver= 0;
+ qu->udpsent= 0;
+ timerclear(&qu->timeout);
+ qu->expires= now.tv_sec + MAXTTLBELIEVE;
+
+ memset(&qu->ctx,0,sizeof(qu->ctx));
+
+ qu->answer->status= adns_s_ok;
+ qu->answer->cname= qu->answer->owner= 0;
+ qu->answer->type= type;
+ qu->answer->expires= -1;
+ qu->answer->nrrs= 0;
+ qu->answer->rrs.untyped= 0;
+ qu->answer->rrsz= typei->getrrsz(typei,type);
+
+ return qu;
+}
+
+static void query_submit(adns_state ads, adns_query qu,
+ const typeinfo *typei, vbuf *qumsg_vb, int id,
+ adns_queryflags flags, struct timeval now) {
+ /* Fills in the query message in for a previously-allocated query,
+ * and submits it. Cannot fail. Takes over the memory for qumsg_vb.
+ */
+
+ qu->vb= *qumsg_vb;
+ adns__vbuf_init(qumsg_vb);
+
+ qu->query_dgram= malloc(qu->vb.used);
+ if (!qu->query_dgram) { adns__query_fail(qu,adns_s_nomemory); return; }
+
+ qu->id= id;
+ qu->query_dglen= qu->vb.used;
+ memcpy(qu->query_dgram,qu->vb.buf,qu->vb.used);
+
+ typei->query_send(qu,now);
+}
+
+adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags,
+ union checklabel_state *cls,
+ qcontext *ctx, int labnum,
+ const char *dgram, int labstart, int lablen)
+{
+ int i, c;
+ const char *label = dgram+labstart;
+
+ if (flags & adns_qf_quoteok_query) return adns_s_ok;
+ for (i=0; i<lablen; i++) {
+ c= label[i];
+ if (c == '-') {
+ if (!i) return adns_s_querydomaininvalid;
+ } else if (!ctype_alpha(c) && !ctype_digit(c)) {
+ return adns_s_querydomaininvalid;
+ }
+ }
+ return adns_s_ok;
+}
+
+static adns_status check_domain_name(adns_state ads, adns_queryflags flags,
+ qcontext *ctx, const typeinfo *typei,
+ const byte *dgram, int dglen)
+{
+ findlabel_state fls;
+ adns_status st;
+ int labnum= 0, labstart, lablen;
+ union checklabel_state cls;
+
+ adns__findlabel_start(&fls,ads, -1,0, dgram,dglen,dglen, DNS_HDRSIZE,0);
+ do {
+ st= adns__findlabel_next(&fls, &lablen,&labstart);
+ assert(!st); assert(lablen >= 0);
+ st= typei->checklabel(ads,flags, &cls,ctx,
+ labnum++, dgram,labstart,lablen);
+ if (st) return st;
+ } while (lablen);
+ return adns_s_ok;
+}
+
+adns_status adns__internal_submit(adns_state ads, adns_query *query_r,
+ adns_query parent,
+ const typeinfo *typei, adns_rrtype type,
+ vbuf *qumsg_vb, int id,
+ adns_queryflags flags, struct timeval now,
+ qcontext *ctx) {
+ adns_query qu;
+ adns_status st;
+
+ st= check_domain_name(ads, flags,ctx,typei, qumsg_vb->buf,qumsg_vb->used);
+ if (st) goto x_err;
+ qu= query_alloc(ads,typei,type,flags,now);
+ if (!qu) { st = adns_s_nomemory; goto x_err; }
+ *query_r= qu;
+
+ qu->parent= parent;
+ LIST_LINK_TAIL_PART(parent->children,qu,siblings.);
+ memcpy(&qu->ctx,ctx,sizeof(qu->ctx));
+ query_submit(ads,qu, typei,qumsg_vb,id,flags,now);
+
+ return adns_s_ok;
+
+x_err:
+ adns__vbuf_free(qumsg_vb);
+ return st;
+}
+
+static void query_simple(adns_state ads, adns_query qu,
+ const char *owner, int ol,
+ const typeinfo *typei, adns_queryflags flags,
+ struct timeval now) {
+ vbuf vb_new;
+ int id;
+ adns_status st;
+
+ st= adns__mkquery(ads,&qu->vb,&id, owner,ol,
+ typei,qu->answer->type, flags);
+ if (st) {
+ if (st == adns_s_querydomaintoolong && (flags & adns_qf_search)) {
+ adns__search_next(ads,qu,now);
+ return;
+ } else {
+ adns__query_fail(qu,st);
+ return;
+ }
+ }
+
+ st= check_domain_name(ads, flags,&qu->ctx,typei, qu->vb.buf,qu->vb.used);
+ if (st) { adns__query_fail(qu,st); return; }
+
+ vb_new= qu->vb;
+ adns__vbuf_init(&qu->vb);
+ query_submit(ads,qu, typei,&vb_new,id, flags,now);
+}
+
+void adns__search_next(adns_state ads, adns_query qu, struct timeval now) {
+ const char *nextentry;
+ adns_status st;
+
+ if (qu->search_doneabs<0) {
+ nextentry= 0;
+ qu->search_doneabs= 1;
+ } else {
+ if (qu->search_pos >= ads->nsearchlist) {
+ if (qu->search_doneabs) {
+ qu->search_vb.used= qu->search_origlen;
+ st= adns_s_nxdomain; goto x_fail;
+ } else {
+ nextentry= 0;
+ qu->search_doneabs= 1;
+ }
+ } else {
+ nextentry= ads->searchlist[qu->search_pos++];
+ }
+ }
+
+ qu->search_vb.used= qu->search_origlen;
+ if (nextentry) {
+ if (!adns__vbuf_append(&qu->search_vb,".",1) ||
+ !adns__vbuf_appendstr(&qu->search_vb,nextentry))
+ goto x_nomemory;
+ }
+
+ free(qu->query_dgram);
+ qu->query_dgram= 0; qu->query_dglen= 0;
+
+ query_simple(ads,qu, qu->search_vb.buf, qu->search_vb.used,
+ qu->typei, qu->flags, now);
+ return;
+
+x_nomemory:
+ st= adns_s_nomemory;
+x_fail:
+ adns__query_fail(qu,st);
+}
+
+static int save_owner(adns_query qu, const char *owner, int ol) {
+ /* Returns 1 if OK, otherwise there was no memory. */
+ adns_answer *ans;
+
+ if (!(qu->flags & adns_qf_owner)) return 1;
+
+ ans= qu->answer;
+ assert(!ans->owner);
+
+ ans->owner= adns__alloc_preserved(qu,ol+1); if (!ans->owner) return 0;
+
+ memcpy(ans->owner,owner,ol);
+ ans->owner[ol]= 0;
+ return 1;
+}
+
+int adns_submit(adns_state ads,
+ const char *owner,
+ adns_rrtype type,
+ adns_queryflags flags,
+ void *context,
+ adns_query *query_r) {
+ int r, ol, ndots;
+ adns_status st;
+ const typeinfo *typei;
+ struct timeval now;
+ adns_query qu;
+ const char *p;
+
+ adns__consistency(ads,0,cc_entex);
+
+ if (flags & ~(adns_queryflags)0x4009ffff)
+ /* 0x40080000 are reserved for `harmless' future expansion
+ * 0x00000020 used to be adns_qf_quoteok_cname, now the default;
+ * see also addrfam.c:textaddr_check_qf */
+ return ENOSYS;
+
+ typei= adns__findtype(type);
+ if (!typei) return ENOSYS;
+
+ r= gettimeofday(&now,0); if (r) goto x_errno;
+ qu= query_alloc(ads,typei,type,flags,now); if (!qu) goto x_errno;
+
+ qu->ctx.ext= context;
+ qu->ctx.callback= 0;
+ memset(&qu->ctx.pinfo,0,sizeof(qu->ctx.pinfo));
+ memset(&qu->ctx.tinfo,0,sizeof(qu->ctx.tinfo));
+
+ *query_r= qu;
+
+ ol= strlen(owner);
+ if (!ol) { st= adns_s_querydomaininvalid; goto x_adnsfail; }
+ if (ol>DNS_MAXDOMAIN+1) { st= adns_s_querydomaintoolong; goto x_adnsfail; }
+
+ if (ol>=1 && owner[ol-1]=='.' && (ol<2 || owner[ol-2]!='\\')) {
+ flags &= ~adns_qf_search;
+ qu->flags= flags;
+ ol--;
+ }
+
+ if (flags & adns_qf_search) {
+ r= adns__vbuf_append(&qu->search_vb,owner,ol);
+ if (!r) { st= adns_s_nomemory; goto x_adnsfail; }
+
+ for (ndots=0, p=owner; (p= strchr(p,'.')); p++, ndots++);
+ qu->search_doneabs= (ndots >= ads->searchndots) ? -1 : 0;
+ qu->search_origlen= ol;
+ adns__search_next(ads,qu,now);
+ } else {
+ if (flags & adns_qf_owner) {
+ if (!save_owner(qu,owner,ol)) { st= adns_s_nomemory; goto x_adnsfail; }
+ }
+ query_simple(ads,qu, owner,ol, typei,flags, now);
+ }
+ adns__autosys(ads,now);
+ adns__returning(ads,qu);
+ return 0;
+
+ x_adnsfail:
+ adns__query_fail(qu,st);
+ adns__returning(ads,qu);
+ return 0;
+
+ x_errno:
+ r= errno;
+ assert(r);
+ adns__returning(ads,0);
+ return r;
+}
+
+int adns_submit_reverse_any(adns_state ads,
+ const struct sockaddr *addr,
+ const char *zone,
+ adns_rrtype type,
+ adns_queryflags flags,
+ void *context,
+ adns_query *query_r) {
+ char *buf, *buf_free = 0;
+ char shortbuf[100];
+ int r;
+
+ flags &= ~adns_qf_search;
+
+ buf = shortbuf;
+ r= adns__make_reverse_domain(addr,zone, &buf,sizeof(shortbuf),&buf_free);
+ if (r) return r;
+ r= adns_submit(ads,buf,type,flags,context,query_r);
+ free(buf_free);
+ return r;
+}
+
+int adns_submit_reverse(adns_state ads,
+ const struct sockaddr *addr,
+ adns_rrtype type,
+ adns_queryflags flags,
+ void *context,
+ adns_query *query_r) {
+ if (((type^adns_r_ptr) & adns_rrt_reprmask) &&
+ ((type^adns_r_ptr_raw) & adns_rrt_reprmask))
+ return EINVAL;
+ return adns_submit_reverse_any(ads,addr,0,type,flags,context,query_r);
+}
+
+int adns_synchronous(adns_state ads,
+ const char *owner,
+ adns_rrtype type,
+ adns_queryflags flags,
+ adns_answer **answer_r) {
+ adns_query qu;
+ int r;
+
+ r= adns_submit(ads,owner,type,flags,0,&qu);
+ if (r) return r;
+
+ r= adns_wait(ads,&qu,answer_r,0);
+ if (r) adns_cancel(qu);
+
+ return r;
+}
+
+static void *alloc_common(adns_query qu, size_t sz) {
+ allocnode *an;
+
+ if (!sz) return qu; /* Any old pointer will do */
+ assert(!qu->final_allocspace);
+ an= malloc(MEM_ROUND(MEM_ROUND(sizeof(*an)) + sz));
+ if (!an) return 0;
+ LIST_LINK_TAIL(qu->allocations,an);
+ an->sz= sz;
+ return (byte*)an + MEM_ROUND(sizeof(*an));
+}
+
+void *adns__alloc_interim(adns_query qu, size_t sz) {
+ void *rv;
+
+ sz= MEM_ROUND(sz);
+ rv= alloc_common(qu,sz);
+ if (!rv) return 0;
+ qu->interim_allocd += sz;
+ return rv;
+}
+
+void *adns__alloc_preserved(adns_query qu, size_t sz) {
+ void *rv;
+
+ sz= MEM_ROUND(sz);
+ rv= adns__alloc_interim(qu,sz);
+ if (!rv) return 0;
+ qu->preserved_allocd += sz;
+ return rv;
+}
+
+static allocnode *alloc__info(adns_query qu, void *p, size_t *sz_r) {
+ allocnode *an;
+
+ if (!p || p == qu) { *sz_r= 0; return 0; }
+ an= (allocnode *)((byte *)p - MEM_ROUND(sizeof(allocnode)));
+ *sz_r= MEM_ROUND(an->sz);
+ return an;
+}
+
+void adns__free_interim(adns_query qu, void *p) {
+ size_t sz;
+ allocnode *an= alloc__info(qu, p, &sz);
+
+ if (!an) return;
+ assert(!qu->final_allocspace);
+ LIST_UNLINK(qu->allocations, an);
+ free(an);
+ qu->interim_allocd -= sz;
+ assert(!qu->interim_allocd >= 0);
+}
+
+void *adns__alloc_mine(adns_query qu, size_t sz) {
+ return alloc_common(qu,MEM_ROUND(sz));
+}
+
+void adns__transfer_interim(adns_query from, adns_query to, void *block) {
+ size_t sz;
+ allocnode *an= alloc__info(from, block, &sz);
+
+ if (!an) return;
+
+ assert(!to->final_allocspace);
+ assert(!from->final_allocspace);
+
+ LIST_UNLINK(from->allocations,an);
+ LIST_LINK_TAIL(to->allocations,an);
+
+ from->interim_allocd -= sz;
+ to->interim_allocd += sz;
+
+ if (to->expires > from->expires) to->expires= from->expires;
+}
+
+void *adns__alloc_final(adns_query qu, size_t sz) {
+ /* When we're in the _final stage, we _subtract_ from interim_alloc'd
+ * each allocation, and use final_allocspace to point to the next free
+ * bit.
+ */
+ void *rp;
+
+ sz= MEM_ROUND(sz);
+ rp= qu->final_allocspace;
+ assert(rp);
+ qu->interim_allocd -= sz;
+ assert(qu->interim_allocd>=0);
+ qu->final_allocspace= (byte*)rp + sz;
+ return rp;
+}
+
+void adns__cancel_children(adns_query qu) {
+ adns_query cqu, ncqu;
+
+ for (cqu= qu->children.head; cqu; cqu= ncqu) {
+ ncqu= cqu->siblings.next;
+ adns__cancel(cqu);
+ }
+}
+
+void adns__reset_preserved(adns_query qu) {
+ assert(!qu->final_allocspace);
+ adns__cancel_children(qu);
+ qu->answer->nrrs= 0;
+ qu->answer->rrs.untyped= 0;
+ qu->interim_allocd= qu->preserved_allocd;
+}
+
+static void free_query_allocs(adns_query qu) {
+ allocnode *an, *ann;
+
+ adns__cancel_children(qu);
+ for (an= qu->allocations.head; an; an= ann) { ann= an->next; free(an); }
+ LIST_INIT(qu->allocations);
+ adns__vbuf_free(&qu->vb);
+ adns__vbuf_free(&qu->search_vb);
+ free(qu->query_dgram);
+ qu->query_dgram= 0;
+}
+
+void adns__returning(adns_state ads, adns_query qu_for_caller) {
+ while (ads->intdone.head) {
+ adns_query iq= ads->intdone.head;
+ adns_query parent= iq->parent;
+ LIST_UNLINK_PART(parent->children,iq,siblings.);
+ LIST_UNLINK(iq->ads->childw,parent);
+ LIST_UNLINK(ads->intdone,iq);
+ iq->ctx.callback(parent,iq);
+ free_query_allocs(iq);
+ free(iq->answer);
+ free(iq);
+ }
+ adns__consistency(ads,qu_for_caller,cc_entex);
+}
+
+void adns__cancel(adns_query qu) {
+ adns_state ads;
+
+ ads= qu->ads;
+ adns__consistency(ads,qu,cc_freq);
+ if (qu->parent) LIST_UNLINK_PART(qu->parent->children,qu,siblings.);
+ switch (qu->state) {
+ case query_tosend:
+ LIST_UNLINK(ads->udpw,qu);
+ break;
+ case query_tcpw:
+ LIST_UNLINK(ads->tcpw,qu);
+ break;
+ case query_childw:
+ LIST_UNLINK(ads->childw,qu);
+ break;
+ case query_done:
+ if (qu->parent)
+ LIST_UNLINK(ads->intdone,qu);
+ else
+ LIST_UNLINK(ads->output,qu);
+ break;
+ default:
+ abort();
+ }
+ free_query_allocs(qu);
+ free(qu->answer);
+ free(qu);
+}
+
+void adns_cancel(adns_query qu) {
+ adns_state ads;
+
+ assert(!qu->parent);
+ ads= qu->ads;
+ adns__consistency(ads,qu,cc_entex);
+ adns__cancel(qu);
+ adns__returning(ads,0);
+}
+
+void adns__update_expires(adns_query qu, unsigned long ttl,
+ struct timeval now) {
+ time_t max;
+
+ assert(ttl <= MAXTTLBELIEVE);
+ max= now.tv_sec + ttl;
+ if (qu->expires < max) return;
+ qu->expires= max;
+}
+
+static void makefinal_query(adns_query qu) {
+ adns_answer *ans;
+ int rrn;
+
+ ans= qu->answer;
+
+ if (qu->interim_allocd) {
+ ans= realloc(qu->answer,
+ MEM_ROUND(MEM_ROUND(sizeof(*ans)) + qu->interim_allocd));
+ if (!ans) goto x_nomem;
+ qu->answer= ans;
+ }
+
+ qu->final_allocspace= (byte*)ans + MEM_ROUND(sizeof(*ans));
+ adns__makefinal_str(qu,&ans->cname);
+ adns__makefinal_str(qu,&ans->owner);
+
+ if (ans->nrrs) {
+ adns__makefinal_block(qu, &ans->rrs.untyped, ans->nrrs*ans->rrsz);
+
+ for (rrn=0; rrn<ans->nrrs; rrn++)
+ qu->typei->makefinal(qu, ans->rrs.bytes + rrn*ans->rrsz);
+ }
+
+ free_query_allocs(qu);
+ return;
+
+ x_nomem:
+ qu->preserved_allocd= 0;
+ qu->answer->cname= 0;
+ qu->answer->owner= 0;
+ adns__reset_preserved(qu); /* (but we just threw away the preserved stuff) */
+
+ qu->answer->status= adns_s_nomemory;
+ free_query_allocs(qu);
+}
+
+void adns__query_done(adns_query qu) {
+ adns_state ads=qu->ads;
+ adns_answer *ans;
+
+ adns__cancel_children(qu);
+
+ qu->id= -1;
+ ans= qu->answer;
+
+ if (qu->flags & adns_qf_search && ans->status != adns_s_nomemory) {
+ if (!save_owner(qu, qu->search_vb.buf, qu->search_vb.used)) {
+ adns__query_fail(qu,adns_s_nomemory);
+ return;
+ }
+ }
+
+ if (ans->nrrs && qu->typei->diff_needswap) {
+ if (!adns__vbuf_ensure(&qu->vb,qu->answer->rrsz)) {
+ adns__query_fail(qu,adns_s_nomemory);
+ return;
+ }
+ adns__isort(ans->rrs.bytes, ans->nrrs, ans->rrsz,
+ qu->vb.buf,
+ (int(*)(void*, const void*, const void*))
+ qu->typei->diff_needswap,
+ qu->ads);
+ }
+ if (ans->nrrs && qu->typei->postsort) {
+ qu->typei->postsort(qu->ads, ans->rrs.bytes,
+ ans->nrrs,ans->rrsz, qu->typei);
+ }
+
+ ans->expires= qu->expires;
+ qu->state= query_done;
+ if (qu->parent) {
+ LIST_LINK_TAIL(ads->intdone,qu);
+ } else {
+ makefinal_query(qu);
+ LIST_LINK_TAIL(qu->ads->output,qu);
+ }
+}
+
+void adns__query_fail(adns_query qu, adns_status st) {
+ adns__reset_preserved(qu);
+ qu->answer->status= st;
+ adns__query_done(qu);
+}
+
+void adns__makefinal_str(adns_query qu, char **strp) {
+ int l;
+ char *before, *after;
+
+ before= *strp;
+ if (!before) return;
+ l= strlen(before)+1;
+ after= adns__alloc_final(qu,l);
+ memcpy(after,before,l);
+ *strp= after;
+}
+
+void adns__makefinal_block(adns_query qu, void **blpp, size_t sz) {
+ void *before, *after;
+
+ before= *blpp;
+ if (!before) return;
+ after= adns__alloc_final(qu,sz);
+ memcpy(after,before,sz);
+ *blpp= after;
+}
diff --git a/src/reply.c b/src/reply.c
new file mode 100644
index 0000000..7d11327
--- /dev/null
+++ b/src/reply.c
@@ -0,0 +1,390 @@
+/*
+ * reply.c
+ * - main handling and parsing routine for received datagrams
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <stdlib.h>
+
+#include "internal.h"
+
+void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
+ int serv, int viatcp, struct timeval now) {
+ int cbyte, rrstart, wantedrrs, rri, foundsoa, foundns, cname_here;
+ int id, f1, f2, qdcount, ancount, nscount, arcount;
+ int flg_ra, flg_rd, flg_tc, flg_qr, opcode;
+ int rrtype, rrclass, rdlength, rdstart;
+ int anstart, nsstart;
+ int ownermatched, l, nrrs;
+ unsigned long ttl, soattl;
+ const typeinfo *typei;
+ adns_query qu, nqu;
+ dns_rcode rcode;
+ adns_status st;
+ vbuf tempvb;
+ byte *newquery, *rrsdata;
+ parseinfo pai;
+
+ if (dglen<DNS_HDRSIZE) {
+ adns__diag(ads,serv,0,"received datagram"
+ " too short for message header (%d)",dglen);
+ return;
+ }
+ cbyte= 0;
+ GET_W(cbyte,id);
+ GET_B(cbyte,f1);
+ GET_B(cbyte,f2);
+ GET_W(cbyte,qdcount);
+ GET_W(cbyte,ancount);
+ GET_W(cbyte,nscount);
+ GET_W(cbyte,arcount);
+ assert(cbyte == DNS_HDRSIZE);
+
+ flg_qr= f1&0x80;
+ opcode= (f1&0x78)>>3;
+ flg_tc= f1&0x02;
+ flg_rd= f1&0x01;
+ flg_ra= f2&0x80;
+ rcode= (f2&0x0f);
+
+ cname_here= 0;
+
+ if (!flg_qr) {
+ adns__diag(ads,serv,0,"server sent us a query, not a response");
+ return;
+ }
+ if (opcode) {
+ adns__diag(ads,serv,0,"server sent us unknown opcode"
+ " %d (wanted 0=QUERY)",opcode);
+ return;
+ }
+
+ qu= 0;
+ /* See if we can find the relevant query, or leave qu=0 otherwise ... */
+
+ if (qdcount == 1) {
+ for (qu= viatcp ? ads->tcpw.head : ads->udpw.head; qu; qu= nqu) {
+ nqu= qu->next;
+ if (qu->id != id) continue;
+ if (dglen < qu->query_dglen) continue;
+ if (memcmp(qu->query_dgram+DNS_HDRSIZE,
+ dgram+DNS_HDRSIZE,
+ qu->query_dglen-DNS_HDRSIZE))
+ continue;
+ if (viatcp) {
+ assert(qu->state == query_tcpw);
+ } else {
+ assert(qu->state == query_tosend);
+ if (!(qu->udpsent & (1<<serv))) continue;
+ }
+ break;
+ }
+ if (qu) {
+ /* We're definitely going to do something with this query now */
+ if (viatcp) LIST_UNLINK(ads->tcpw,qu);
+ else LIST_UNLINK(ads->udpw,qu);
+ }
+ }
+
+ /* If we're going to ignore the packet, we return as soon as we have
+ * failed the query (if any) and printed the warning message (if
+ * any).
+ */
+ switch (rcode) {
+ case rcode_noerror:
+ case rcode_nxdomain:
+ break;
+ case rcode_formaterror:
+ adns__warn(ads,serv,qu,"server cannot understand our query"
+ " (Format Error)");
+ if (qu) adns__query_fail(qu,adns_s_rcodeformaterror);
+ return;
+ case rcode_servfail:
+ if (qu) adns__query_fail(qu,adns_s_rcodeservfail);
+ else adns__debug(ads,serv,qu,"server failure on unidentifiable query");
+ return;
+ case rcode_notimp:
+ adns__warn(ads,serv,qu,"server claims not to implement our query");
+ if (qu) adns__query_fail(qu,adns_s_rcodenotimplemented);
+ return;
+ case rcode_refused:
+ adns__debug(ads,serv,qu,"server refused our query");
+ if (qu) adns__query_fail(qu,adns_s_rcoderefused);
+ return;
+ default:
+ adns__warn(ads,serv,qu,"server gave unknown response code %d",rcode);
+ if (qu) adns__query_fail(qu,adns_s_rcodeunknown);
+ return;
+ }
+
+ if (!qu) {
+ if (!qdcount) {
+ adns__diag(ads,serv,0,"server sent reply without quoting our question");
+ } else if (qdcount>1) {
+ adns__diag(ads,serv,0,"server claimed to answer %d"
+ " questions with one message", qdcount);
+ } else if (ads->iflags & adns_if_debug) {
+ adns__vbuf_init(&tempvb);
+ adns__debug(ads,serv,0,"reply not found, id %02x, query owner %s",
+ id, adns__diag_domain(ads,serv,0,&tempvb,
+ dgram,dglen,DNS_HDRSIZE));
+ adns__vbuf_free(&tempvb);
+ }
+ return;
+ }
+
+ /* We're definitely going to do something with this packet and this
+ * query now. */
+
+ anstart= qu->query_dglen;
+
+ /* Now, take a look at the answer section, and see if it is complete.
+ * If it has any CNAMEs we stuff them in the answer.
+ */
+ wantedrrs= 0;
+ cbyte= anstart;
+ for (rri= 0; rri<ancount; rri++) {
+ rrstart= cbyte;
+ st= adns__findrr(qu,serv, dgram,dglen,&cbyte,
+ &rrtype,&rrclass,&ttl, &rdlength,&rdstart,
+ &ownermatched);
+ if (st) { adns__query_fail(qu,st); return; }
+ if (rrtype == -1) goto x_truncated;
+
+ if (rrclass != DNS_CLASS_IN) {
+ adns__diag(ads,serv,qu,"ignoring answer RR with wrong class %d"
+ " (expected IN=%d)", rrclass,DNS_CLASS_IN);
+ continue;
+ }
+ if (!ownermatched) {
+ if (ads->iflags & adns_if_debug) {
+ adns__debug(ads,serv,qu,"ignoring RR with an unexpected owner %s",
+ adns__diag_domain(ads,serv,qu, &qu->vb,
+ dgram,dglen,rrstart));
+ }
+ continue;
+ }
+ if (rrtype == adns_r_cname &&
+ (qu->answer->type & adns_rrt_typemask) != adns_r_cname) {
+ if (qu->flags & adns_qf_cname_forbid) {
+ adns__query_fail(qu,adns_s_prohibitedcname);
+ return;
+ } else if (qu->cname_dgram) { /* Ignore second and subsequent CNAME(s) */
+ adns__debug(ads,serv,qu,"allegedly canonical name %s"
+ " is actually alias for %s", qu->answer->cname,
+ adns__diag_domain(ads,serv,qu, &qu->vb,
+ dgram,dglen,rdstart));
+ adns__query_fail(qu,adns_s_prohibitedcname);
+ return;
+ } else if (wantedrrs) { /* Ignore CNAME(s) after RR(s). */
+ adns__debug(ads,serv,qu,"ignoring CNAME (to %s) coexisting with RR",
+ adns__diag_domain(ads,serv,qu, &qu->vb,
+ dgram,dglen,rdstart));
+ } else {
+ qu->cname_begin= rdstart;
+ qu->cname_dglen= dglen;
+ st= adns__parse_domain(ads,serv,qu, &qu->vb,
+ qu->flags & adns_qf_quotefail_cname
+ ? 0 : pdf_quoteok,
+ dgram,dglen, &rdstart,rdstart+rdlength);
+ if (!qu->vb.used) goto x_truncated;
+ if (st) { adns__query_fail(qu,st); return; }
+ l= strlen(qu->vb.buf)+1;
+ qu->answer->cname= adns__alloc_preserved(qu,l);
+ if (!qu->answer->cname) {
+ adns__query_fail(qu,adns_s_nomemory);
+ return;
+ }
+
+ qu->cname_dgram= adns__alloc_mine(qu,dglen);
+ memcpy(qu->cname_dgram,dgram,dglen);
+
+ memcpy(qu->answer->cname,qu->vb.buf,l);
+ cname_here= 1;
+ adns__update_expires(qu,ttl,now);
+ /* If we find the answer section truncated after this point we restart
+ * the query at the CNAME; if beforehand then we obviously have to use
+ * TCP. If there is no truncation we can use the whole answer if
+ * it contains the relevant info.
+ */
+ }
+ } else if (rrtype == (qu->answer->type & adns_rrt_typemask)) {
+ wantedrrs++;
+ } else {
+ adns__debug(ads,serv,qu,"ignoring answer RR"
+ " with irrelevant type %d",rrtype);
+ }
+ }
+
+ /* We defer handling truncated responses here, in case there was a CNAME
+ * which we could use.
+ */
+ if (flg_tc) goto x_truncated;
+
+ nsstart= cbyte;
+
+ if (!wantedrrs) {
+ /* Oops, NODATA or NXDOMAIN or perhaps a referral
+ * (which would be a problem) */
+
+ /* RFC2308: NODATA has _either_ a SOA _or_ _no_ NS records
+ * in authority section */
+ foundsoa= 0; soattl= 0; foundns= 0;
+ for (rri= 0; rri<nscount; rri++) {
+ rrstart= cbyte;
+ st= adns__findrr(qu,serv, dgram,dglen,&cbyte,
+ &rrtype,&rrclass,&ttl, &rdlength,&rdstart, 0);
+ if (st) { adns__query_fail(qu,st); return; }
+ if (rrtype==-1) goto x_truncated;
+ if (rrclass != DNS_CLASS_IN) {
+ adns__diag(ads,serv,qu,
+ "ignoring authority RR with wrong class %d"
+ " (expected IN=%d)", rrclass,DNS_CLASS_IN);
+ continue;
+ }
+ if (rrtype == adns_r_soa_raw) { foundsoa= 1; soattl= ttl; break; }
+ else if (rrtype == adns_r_ns_raw) { foundns= 1; }
+ }
+
+ if (rcode == rcode_nxdomain) {
+ /* We still wanted to look for the SOA so we could find the TTL. */
+ adns__update_expires(qu,soattl,now);
+
+ if (qu->flags & adns_qf_search && !qu->cname_dgram) {
+ adns__search_next(ads,qu,now);
+ } else {
+ adns__query_fail(qu,adns_s_nxdomain);
+ }
+ return;
+ }
+
+ if (foundsoa || !foundns) {
+ /* Aha ! A NODATA response, good. */
+ adns__update_expires(qu,soattl,now);
+ adns__query_fail(qu,adns_s_nodata);
+ return;
+ }
+
+ /* Now what ? No relevant answers, no SOA, and at least some NS's.
+ * Looks like a referral. Just one last chance ... if we came across
+ * a CNAME in this datagram then we should probably do our own CNAME
+ * lookup now in the hope that we won't get a referral again.
+ */
+ if (cname_here) goto x_restartquery;
+
+ /* Bloody hell, I thought we asked for recursion ? */
+ if (!flg_ra) {
+ adns__diag(ads,serv,qu,"server is not willing"
+ " to do recursive lookups for us");
+ adns__query_fail(qu,adns_s_norecurse);
+ } else {
+ if (!flg_rd)
+ adns__diag(ads,serv,qu,"server thinks"
+ " we didn't ask for recursive lookup");
+ else
+ adns__debug(ads,serv,qu,"server claims to do recursion,"
+ " but gave us a referral");
+ adns__query_fail(qu,adns_s_invalidresponse);
+ }
+ return;
+ }
+
+ /* Now, we have some RRs which we wanted. */
+
+ qu->answer->rrs.untyped= adns__alloc_interim(qu,qu->answer->rrsz*wantedrrs);
+ if (!qu->answer->rrs.untyped) {
+ adns__query_fail(qu,adns_s_nomemory);
+ return;
+ }
+
+ typei= qu->typei;
+ cbyte= anstart;
+ rrsdata= qu->answer->rrs.bytes;
+
+ pai.ads= qu->ads;
+ pai.qu= qu;
+ pai.serv= serv;
+ pai.dgram= dgram;
+ pai.dglen= dglen;
+ pai.nsstart= nsstart;
+ pai.nscount= nscount;
+ pai.arcount= arcount;
+ pai.now= now;
+
+ for (rri=0, nrrs=0; rri<ancount; rri++) {
+ st= adns__findrr(qu,serv, dgram,dglen,&cbyte,
+ &rrtype,&rrclass,&ttl, &rdlength,&rdstart,
+ &ownermatched);
+ assert(!st); assert(rrtype != -1);
+ if (rrclass != DNS_CLASS_IN ||
+ rrtype != (qu->answer->type & adns_rrt_typemask) ||
+ !ownermatched)
+ continue;
+ adns__update_expires(qu,ttl,now);
+ st= typei->parse(&pai, rdstart,rdstart+rdlength,
+ rrsdata+nrrs*qu->answer->rrsz);
+ if (st) { adns__query_fail(qu,st); return; }
+ if (rdstart==-1) goto x_truncated;
+ nrrs++;
+ }
+ assert(nrrs==wantedrrs);
+ qu->answer->nrrs= nrrs;
+
+ /* This may have generated some child queries ... */
+ if (qu->children.head) {
+ qu->state= query_childw;
+ LIST_LINK_TAIL(ads->childw,qu);
+ return;
+ }
+ adns__query_done(qu);
+ return;
+
+ x_truncated:
+
+ if (!flg_tc) {
+ adns__diag(ads,serv,qu,"server sent datagram which points outside itself");
+ adns__query_fail(qu,adns_s_invalidresponse);
+ return;
+ }
+ qu->flags |= adns_qf_usevc;
+
+ x_restartquery:
+ if (qu->cname_dgram) {
+ st= adns__mkquery_frdgram(qu->ads,&qu->vb,&qu->id,
+ qu->cname_dgram,qu->cname_dglen,qu->cname_begin,
+ qu->answer->type, qu->flags);
+ if (st) { adns__query_fail(qu,st); return; }
+
+ newquery= realloc(qu->query_dgram,qu->vb.used);
+ if (!newquery) { adns__query_fail(qu,adns_s_nomemory); return; }
+
+ qu->query_dgram= newquery;
+ qu->query_dglen= qu->vb.used;
+ memcpy(newquery,qu->vb.buf,qu->vb.used);
+ }
+
+ if (qu->state == query_tcpw) qu->state= query_tosend;
+ qu->retries= 0;
+ adns__reset_preserved(qu);
+ adns__query_send(qu,now);
+}
diff --git a/src/setup.c b/src/setup.c
new file mode 100644
index 0000000..7171f5b
--- /dev/null
+++ b/src/setup.c
@@ -0,0 +1,843 @@
+/*
+ * setup.c
+ * - configuration file parsing
+ * - management of global state
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <stdlib.h>
+#include <errno.h>
+#include <limits.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "internal.h"
+
+static void readconfig(adns_state ads, const char *filename, int warnmissing);
+
+static void addserver(adns_state ads, const struct sockaddr *sa, int salen) {
+ int i;
+ adns_rr_addr *ss;
+ char buf[ADNS_ADDR2TEXT_BUFLEN];
+
+ for (i=0; i<ads->nservers; i++) {
+ if (adns__sockaddrs_equal(sa, &ads->servers[i].addr.sa)) {
+ adns__debug(ads,-1,0,"duplicate nameserver %s ignored",
+ adns__sockaddr_ntoa(sa, buf));
+ return;
+ }
+ }
+
+ if (ads->nservers>=MAXSERVERS) {
+ adns__diag(ads,-1,0,"too many nameservers, ignoring %s",
+ adns__sockaddr_ntoa(sa, buf));
+ return;
+ }
+
+ ss= ads->servers+ads->nservers;
+ assert(salen <= sizeof(ss->addr));
+ ss->len = salen;
+ memcpy(&ss->addr, sa, salen);
+ ads->nservers++;
+}
+
+static void freesearchlist(adns_state ads) {
+ if (ads->nsearchlist) free(*ads->searchlist);
+ free(ads->searchlist);
+}
+
+static void saveerr(adns_state ads, int en) {
+ if (!ads->configerrno) ads->configerrno= en;
+}
+
+static void configparseerr(adns_state ads, const char *fn, int lno,
+ const char *fmt, ...) {
+ va_list al;
+
+ saveerr(ads,EINVAL);
+ if (!ads->logfn || (ads->iflags & adns_if_noerrprint)) return;
+
+ if (lno==-1) adns__lprintf(ads,"adns: %s: ",fn);
+ else adns__lprintf(ads,"adns: %s:%d: ",fn,lno);
+ va_start(al,fmt);
+ adns__vlprintf(ads,fmt,al);
+ va_end(al);
+ adns__lprintf(ads,"\n");
+}
+
+static int nextword(const char **bufp_io, const char **word_r, int *l_r) {
+ const char *p, *q;
+
+ p= *bufp_io;
+ while (ctype_whitespace(*p)) p++;
+ if (!*p) return 0;
+
+ q= p;
+ while (*q && !ctype_whitespace(*q)) q++;
+
+ *l_r= q-p;
+ *word_r= p;
+ *bufp_io= q;
+
+ return 1;
+}
+
+static void ccf_nameserver(adns_state ads, const char *fn,
+ int lno, const char *buf) {
+ adns_rr_addr a;
+ char addrbuf[ADNS_ADDR2TEXT_BUFLEN];
+ int err;
+
+ a.len= sizeof(a.addr);
+ err= adns_text2addr(buf,DNS_PORT, 0, &a.addr.sa,&a.len);
+ switch (err) {
+ case 0:
+ break;
+ case EINVAL:
+ configparseerr(ads,fn,lno,"invalid nameserver address `%s'",buf);
+ return;
+ default:
+ configparseerr(ads,fn,lno,"failed to parse nameserver address `%s': %s",
+ buf,strerror(err));
+ return;
+ }
+ adns__debug(ads,-1,0,"using nameserver %s",
+ adns__sockaddr_ntoa(&a.addr.sa, addrbuf));
+ addserver(ads,&a.addr.sa,a.len);
+}
+
+static void ccf_search(adns_state ads, const char *fn,
+ int lno, const char *buf) {
+ const char *bufp, *word;
+ char *newchars, **newptrs, **pp;
+ int count, tl, l;
+
+ if (!buf) return;
+
+ bufp= buf;
+ count= 0;
+ tl= 0;
+ while (nextword(&bufp,&word,&l)) { count++; tl += l+1; }
+
+ newptrs= malloc(sizeof(char*)*count);
+ if (!newptrs) { saveerr(ads,errno); return; }
+
+ newchars= malloc(tl);
+ if (!newchars) { saveerr(ads,errno); free(newptrs); return; }
+
+ bufp= buf;
+ pp= newptrs;
+ while (nextword(&bufp,&word,&l)) {
+ *pp++= newchars;
+ memcpy(newchars,word,l);
+ newchars += l;
+ *newchars++ = 0;
+ }
+
+ freesearchlist(ads);
+ ads->nsearchlist= count;
+ ads->searchlist= newptrs;
+}
+
+static int gen_pton(const char *text, int want_af, adns_sockaddr *a) {
+ int err;
+ int len;
+
+ len= sizeof(*a);
+ err= adns_text2addr(text,0, adns_qf_addrlit_scope_forbid,
+ &a->sa, &len);
+ if (err) { assert(err == EINVAL); return 0; }
+ if (want_af != AF_UNSPEC && a->sa.sa_family != want_af) return 0;
+ return 1;
+}
+
+static void ccf_sortlist(adns_state ads, const char *fn,
+ int lno, const char *buf) {
+ const char *word;
+ char tbuf[200], *slash, *ep;
+ const char *maskwhat;
+ struct sortlist *sl;
+ int l;
+ int initial= -1;
+
+ if (!buf) return;
+
+ ads->nsortlist= 0;
+ while (nextword(&buf,&word,&l)) {
+ if (ads->nsortlist >= MAXSORTLIST) {
+ adns__diag(ads,-1,0,"too many sortlist entries,"
+ " ignoring %.*s onwards",l,word);
+ return;
+ }
+
+ if (l >= sizeof(tbuf)) {
+ configparseerr(ads,fn,lno,"sortlist entry `%.*s' too long",l,word);
+ continue;
+ }
+
+ memcpy(tbuf,word,l); tbuf[l]= 0;
+ slash= strchr(tbuf,'/');
+ if (slash) *slash++= 0;
+
+ sl= &ads->sortlist[ads->nsortlist];
+ if (!gen_pton(tbuf, AF_UNSPEC, &sl->base)) {
+ configparseerr(ads,fn,lno,"invalid address `%s' in sortlist",tbuf);
+ continue;
+ }
+
+ if (slash) {
+ if (slash[strspn(slash, "0123456789")]) {
+ maskwhat = "mask";
+ if (!gen_pton(slash, sl->base.sa.sa_family, &sl->mask)) {
+ configparseerr(ads,fn,lno,"invalid mask `%s' in sortlist",slash);
+ continue;
+ }
+ } else {
+ maskwhat = "prefix length";
+ initial= strtoul(slash,&ep,10);
+ if (*ep || initial>adns__addr_width(sl->base.sa.sa_family)) {
+ configparseerr(ads,fn,lno,"mask length `%s' invalid",slash);
+ continue;
+ }
+ sl->mask.sa.sa_family= sl->base.sa.sa_family;
+ adns__prefix_mask(&sl->mask, initial);
+ }
+ } else {
+ maskwhat = "implied prefix length";
+ initial= adns__guess_prefix_length(&sl->base);
+ if (initial < 0) {
+ configparseerr(ads,fn,lno, "network address `%s'"
+ " in sortlist is not in classed ranges,"
+ " must specify mask explicitly", tbuf);
+ continue;
+ }
+ sl->mask.sa.sa_family= sl->base.sa.sa_family;
+ adns__prefix_mask(&sl->mask, initial);
+ }
+
+ if (!adns__addr_matches(sl->base.sa.sa_family,
+ adns__sockaddr_addr(&sl->base.sa),
+ &sl->base,&sl->mask)) {
+ if (initial >= 0) {
+ configparseerr(ads,fn,lno, "%s %d in sortlist"
+ " overlaps address `%s'",maskwhat,initial,tbuf);
+ } else {
+ configparseerr(ads,fn,lno, "%s `%s' in sortlist"
+ " overlaps address `%s'",maskwhat,slash,tbuf);
+ }
+ continue;
+ }
+
+ ads->nsortlist++;
+ }
+}
+
+static void ccf_options(adns_state ads, const char *fn,
+ int lno, const char *buf) {
+ const char *opt, *word, *endword, *endopt;
+ char *ep;
+ unsigned long v;
+ int l;
+
+ if (!buf) return;
+
+#define WORD__IS(s,op) ((endword-word) op (sizeof(s)-1) && \
+ !memcmp(word,s,(sizeof(s)-1)))
+#define WORD_IS(s) (WORD__IS(s,==))
+#define WORD_STARTS(s) (WORD__IS(s,>=) ? ((word+=sizeof(s)-1)) : 0)
+
+ while (nextword(&buf,&word,&l)) {
+ opt=word;
+ endopt=endword=word+l;
+ if (WORD_IS("debug")) {
+ ads->iflags |= adns_if_debug;
+ continue;
+ }
+ if (WORD_STARTS("ndots:")) {
+ v= strtoul(word,&ep,10);
+ if (ep==word || ep != endword || v > INT_MAX) {
+ configparseerr(ads,fn,lno,"option `%.*s' malformed"
+ " or has bad value",l,opt);
+ continue;
+ }
+ ads->searchndots= v;
+ continue;
+ }
+ if (WORD_STARTS("adns_checkc:")) {
+ if (WORD_IS("none")) {
+ ads->iflags &= ~adns_if_checkc_freq;
+ ads->iflags |= adns_if_checkc_entex;
+ } else if (WORD_IS("entex")) {
+ ads->iflags &= ~adns_if_checkc_freq;
+ ads->iflags |= adns_if_checkc_entex;
+ } else if (WORD_IS("freq")) {
+ ads->iflags |= adns_if_checkc_freq;
+ } else {
+ configparseerr(ads,fn,lno, "option adns_checkc has bad value `%s' "
+ "(must be none, entex or freq", word);
+ }
+ continue;
+ }
+ if (WORD_STARTS("adns_af:")) {
+ ads->iflags &= ~adns_if_afmask;
+ if (!WORD_IS("any")) for (;;) {
+ const char *comma= memchr(word,',',endopt-word);
+ endword=comma?comma:endopt;
+ if (WORD_IS("ipv4"))
+ ads->iflags |= adns_if_permit_ipv4;
+ else if (WORD_IS("ipv6"))
+ ads->iflags |= adns_if_permit_ipv6;
+ else {
+ if (ads->config_report_unknown)
+ adns__diag(ads,-1,0,"%s:%d: "
+ "option adns_af has bad value or entry `%.*s' "
+ "(option must be `any', or list of `ipv4',`ipv6')",
+ fn,lno, (int)(endword-word),word);
+ break;
+ }
+ if (!comma) break;
+ word= comma+1;
+ }
+ continue;
+ }
+ if (WORD_IS("adns_ignoreunkcfg")) {
+ ads->config_report_unknown=0;
+ continue;
+ }
+ if (/* adns's query strategy is not configurable */
+ WORD_STARTS("timeout:") ||
+ WORD_STARTS("attempts:") ||
+ WORD_IS("rotate") ||
+ /* adns provides the application with knob for this */
+ WORD_IS("no-check-names") ||
+ /* adns normally does IPv6 if the application wants it; control
+ * this with the adns_af: option if you like */
+ WORD_IS("inet6") ||
+ /* adns does not do edns0 and this is not a problem */
+ WORD_IS("edns0"))
+ continue;
+ if (ads->config_report_unknown)
+ adns__diag(ads,-1,0,"%s:%d: unknown option `%.*s'", fn,lno, l,opt);
+ }
+
+#undef WORD__IS
+#undef WORD_IS
+#undef WORD_STARTS
+}
+
+static void ccf_clearnss(adns_state ads, const char *fn,
+ int lno, const char *buf) {
+ ads->nservers= 0;
+}
+
+static void ccf_include(adns_state ads, const char *fn,
+ int lno, const char *buf) {
+ if (!*buf) {
+ configparseerr(ads,fn,lno,"`include' directive with no filename");
+ return;
+ }
+ readconfig(ads,buf,1);
+}
+
+static void ccf_lookup(adns_state ads, const char *fn, int lno,
+ const char *buf) {
+ int found_bind=0;
+ const char *word;
+ int l;
+
+ if (!*buf) {
+ configparseerr(ads,fn,lno,"`lookup' directive with no databases");
+ return;
+ }
+
+ while (nextword(&buf,&word,&l)) {
+ if (l==4 && !memcmp(word,"bind",4)) {
+ found_bind=1;
+ } else if (l==4 && !memcmp(word,"file",4)) {
+ /* ignore this and hope /etc/hosts is not essential */
+ } else if (l==2 && !memcmp(word,"yp",2)) {
+ adns__diag(ads,-1,0,"%s:%d: yp lookups not supported by adns", fn,lno);
+ found_bind=-1;
+ } else {
+ if (ads->config_report_unknown)
+ adns__diag(ads,-1,0,"%s:%d: unknown `lookup' database `%.*s'",
+ fn,lno, l,word);
+ found_bind=-1;
+ }
+ }
+ if (!found_bind)
+ adns__diag(ads,-1,0,"%s:%d: `lookup' specified, but not `bind'", fn,lno);
+}
+
+static void ccf_ignore(adns_state ads, const char *fn, int lno,
+ const char *buf) {
+}
+
+static const struct configcommandinfo {
+ const char *name;
+ void (*fn)(adns_state ads, const char *fn, int lno, const char *buf);
+} configcommandinfos[]= {
+ { "nameserver", ccf_nameserver },
+ { "domain", ccf_search },
+ { "search", ccf_search },
+ { "sortlist", ccf_sortlist },
+ { "options", ccf_options },
+ { "clearnameservers", ccf_clearnss },
+ { "include", ccf_include },
+ { "lookup", ccf_lookup }, /* OpenBSD */
+ { "lwserver", ccf_ignore }, /* BIND9 lwresd */
+ { 0 }
+};
+
+typedef union {
+ FILE *file;
+ const char *text;
+} getline_ctx;
+
+static int gl_file(adns_state ads, getline_ctx *src_io, const char *filename,
+ int lno, char *buf, int buflen) {
+ FILE *file= src_io->file;
+ int c, i;
+ char *p;
+
+ p= buf;
+ buflen--;
+ i= 0;
+
+ for (;;) { /* loop over chars */
+ if (i == buflen) {
+ adns__diag(ads,-1,0,"%s:%d: line too long, ignored",filename,lno);
+ goto x_badline;
+ }
+ c= getc(file);
+ if (!c) {
+ adns__diag(ads,-1,0,"%s:%d: line contains nul, ignored",filename,lno);
+ goto x_badline;
+ } else if (c == '\n') {
+ break;
+ } else if (c == EOF) {
+ if (ferror(file)) {
+ saveerr(ads,errno);
+ adns__diag(ads,-1,0,"%s:%d: read error: %s",
+ filename,lno,strerror(errno));
+ return -1;
+ }
+ if (!i) return -1;
+ break;
+ } else {
+ *p++= c;
+ i++;
+ }
+ }
+
+ *p++= 0;
+ return i;
+
+ x_badline:
+ saveerr(ads,EINVAL);
+ while ((c= getc(file)) != EOF && c != '\n');
+ return -2;
+}
+
+static int gl_text(adns_state ads, getline_ctx *src_io, const char *filename,
+ int lno, char *buf, int buflen) {
+ const char *cp= src_io->text;
+ int l;
+
+ if (!cp || !*cp) return -1;
+
+ if (*cp == ';' || *cp == '\n') cp++;
+ l= strcspn(cp,";\n");
+ src_io->text = cp+l;
+
+ if (l >= buflen) {
+ adns__diag(ads,-1,0,"%s:%d: line too long, ignored",filename,lno);
+ saveerr(ads,EINVAL);
+ return -2;
+ }
+
+ memcpy(buf,cp,l);
+ buf[l]= 0;
+ return l;
+}
+
+static void readconfiggeneric(adns_state ads, const char *filename,
+ int (*getline)(adns_state ads, getline_ctx*,
+ const char *filename, int lno,
+ char *buf, int buflen),
+ /* Returns >=0 for success, -1 for EOF or error
+ * (error will have been reported), or -2 for
+ * bad line was encountered, try again.
+ */
+ getline_ctx gl_ctx) {
+ char linebuf[2000], *p, *q;
+ int lno, l, dirl;
+ const struct configcommandinfo *ccip;
+
+ for (lno=1;
+ (l= getline(ads,&gl_ctx, filename,lno, linebuf,sizeof(linebuf))) != -1;
+ lno++) {
+ if (l == -2) continue;
+ while (l>0 && ctype_whitespace(linebuf[l-1])) l--;
+ linebuf[l]= 0;
+ p= linebuf;
+ while (ctype_whitespace(*p)) p++;
+ if (*p == '#' || *p == ';' || !*p) continue;
+ q= p;
+ while (*q && !ctype_whitespace(*q)) q++;
+ dirl= q-p;
+ for (ccip=configcommandinfos;
+ ccip->name &&
+ !(strlen(ccip->name)==dirl && !memcmp(ccip->name,p,q-p));
+ ccip++);
+ if (!ccip->name) {
+ if (ads->config_report_unknown)
+ adns__diag(ads,-1,0,"%s:%d: unknown configuration directive `%.*s'",
+ filename,lno,(int)(q-p),p);
+ continue;
+ }
+ while (ctype_whitespace(*q)) q++;
+ ccip->fn(ads,filename,lno,q);
+ }
+}
+
+static const char *instrum_getenv(adns_state ads, const char *envvar) {
+ const char *value;
+
+ value= getenv(envvar);
+ if (!value) adns__debug(ads,-1,0,"environment variable %s not set",envvar);
+ else adns__debug(ads,-1,0,"environment variable %s"
+ " set to `%s'",envvar,value);
+ return value;
+}
+
+static void readconfig(adns_state ads, const char *filename, int warnmissing) {
+ getline_ctx gl_ctx;
+
+ gl_ctx.file= fopen(filename,"r");
+ if (!gl_ctx.file) {
+ if (errno == ENOENT) {
+ if (warnmissing)
+ adns__debug(ads,-1,0, "configuration file"
+ " `%s' does not exist",filename);
+ return;
+ }
+ saveerr(ads,errno);
+ adns__diag(ads,-1,0,"cannot open configuration file `%s': %s",
+ filename,strerror(errno));
+ return;
+ }
+
+ readconfiggeneric(ads,filename,gl_file,gl_ctx);
+
+ fclose(gl_ctx.file);
+}
+
+static void readconfigtext(adns_state ads, const char *text,
+ const char *showname) {
+ getline_ctx gl_ctx;
+
+ gl_ctx.text= text;
+ readconfiggeneric(ads,showname,gl_text,gl_ctx);
+}
+
+static void readconfigenv(adns_state ads, const char *envvar) {
+ const char *filename;
+
+ if (ads->iflags & adns_if_noenv) {
+ adns__debug(ads,-1,0,"not checking environment variable `%s'",envvar);
+ return;
+ }
+ filename= instrum_getenv(ads,envvar);
+ if (filename) readconfig(ads,filename,1);
+}
+
+static void readconfigenvtext(adns_state ads, const char *envvar) {
+ const char *textdata;
+
+ if (ads->iflags & adns_if_noenv) {
+ adns__debug(ads,-1,0,"not checking environment variable `%s'",envvar);
+ return;
+ }
+ textdata= instrum_getenv(ads,envvar);
+ if (textdata) readconfigtext(ads,textdata,envvar);
+}
+
+
+int adns__setnonblock(adns_state ads, int fd) {
+ int r;
+
+ r= fcntl(fd,F_GETFL,0); if (r<0) return errno;
+ r |= O_NONBLOCK;
+ r= fcntl(fd,F_SETFL,r); if (r<0) return errno;
+ return 0;
+}
+
+static int init_begin(adns_state *ads_r, adns_initflags flags,
+ adns_logcallbackfn *logfn, void *logfndata) {
+ adns_state ads;
+ pid_t pid;
+
+ if (flags & ~(adns_initflags)(0x4fff))
+ /* 0x4000 is reserved for `harmless' future expansion */
+ return ENOSYS;
+
+ ads= malloc(sizeof(*ads)); if (!ads) return errno;
+
+ ads->iflags= flags;
+ ads->logfn= logfn;
+ ads->logfndata= logfndata;
+ ads->configerrno= 0;
+ LIST_INIT(ads->udpw);
+ LIST_INIT(ads->tcpw);
+ LIST_INIT(ads->childw);
+ LIST_INIT(ads->output);
+ LIST_INIT(ads->intdone);
+ ads->forallnext= 0;
+ ads->nextid= 0x311f;
+ ads->nudpsockets= 0;
+ ads->tcpsocket= -1;
+ adns__vbuf_init(&ads->tcpsend);
+ adns__vbuf_init(&ads->tcprecv);
+ ads->tcprecv_skip= 0;
+ ads->nservers= ads->nsortlist= ads->nsearchlist= ads->tcpserver= 0;
+ ads->searchndots= 1;
+ ads->tcpstate= server_disconnected;
+ timerclear(&ads->tcptimeout);
+ ads->searchlist= 0;
+ ads->config_report_unknown=1;
+
+ pid= getpid();
+ ads->rand48xsubi[0]= pid;
+ ads->rand48xsubi[1]= (unsigned long)pid >> 16;
+ ads->rand48xsubi[2]= pid ^ ((unsigned long)pid >> 16);
+
+ *ads_r= ads;
+ return 0;
+}
+
+static int init_finish(adns_state ads) {
+ struct sockaddr_in sin;
+ struct protoent *proto;
+ struct udpsocket *udp;
+ int i;
+ int r;
+
+ if (!ads->nservers) {
+ if (ads->logfn && ads->iflags & adns_if_debug)
+ adns__lprintf(ads,"adns: no nameservers, using IPv4 localhost\n");
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_port = htons(DNS_PORT);
+ sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ addserver(ads,(struct sockaddr *)&sin, sizeof(sin));
+ }
+
+ proto= getprotobyname("udp"); if (!proto) { r= ENOPROTOOPT; goto x_free; }
+ ads->nudpsockets= 0;
+ for (i=0; i<ads->nservers; i++) {
+ if (adns__udpsocket_by_af(ads, ads->servers[i].addr.sa.sa_family))
+ continue;
+ assert(ads->nudpsockets < MAXUDP);
+ udp= &ads->udpsockets[ads->nudpsockets];
+ udp->af= ads->servers[i].addr.sa.sa_family;
+ udp->fd= socket(udp->af,SOCK_DGRAM,proto->p_proto);
+ if (udp->fd < 0) { r= errno; goto x_free; }
+ ads->nudpsockets++;
+ r= adns__setnonblock(ads,udp->fd);
+ if (r) { r= errno; goto x_closeudp; }
+ }
+
+ return 0;
+
+ x_closeudp:
+ for (i=0; i<ads->nudpsockets; i++) close(ads->udpsockets[i].fd);
+ x_free:
+ free(ads);
+ return r;
+}
+
+static void init_abort(adns_state ads) {
+ if (ads->nsearchlist) {
+ free(ads->searchlist[0]);
+ free(ads->searchlist);
+ }
+ free(ads);
+}
+
+static void logfn_file(adns_state ads, void *logfndata,
+ const char *fmt, va_list al) {
+ vfprintf(logfndata,fmt,al);
+}
+
+static int init_files(adns_state *ads_r, adns_initflags flags,
+ adns_logcallbackfn *logfn, void *logfndata) {
+ adns_state ads;
+ const char *res_options, *adns_res_options;
+ int r;
+
+ r= init_begin(&ads, flags, logfn, logfndata);
+ if (r) return r;
+
+ res_options= instrum_getenv(ads,"RES_OPTIONS");
+ adns_res_options= instrum_getenv(ads,"ADNS_RES_OPTIONS");
+ ccf_options(ads,"RES_OPTIONS",-1,res_options);
+ ccf_options(ads,"ADNS_RES_OPTIONS",-1,adns_res_options);
+
+ readconfig(ads,"/etc/resolv.conf",1);
+ readconfig(ads,"/etc/resolv-adns.conf",0);
+ readconfigenv(ads,"RES_CONF");
+ readconfigenv(ads,"ADNS_RES_CONF");
+
+ readconfigenvtext(ads,"RES_CONF_TEXT");
+ readconfigenvtext(ads,"ADNS_RES_CONF_TEXT");
+
+ ccf_options(ads,"RES_OPTIONS",-1,res_options);
+ ccf_options(ads,"ADNS_RES_OPTIONS",-1,adns_res_options);
+
+ ccf_search(ads,"LOCALDOMAIN",-1,instrum_getenv(ads,"LOCALDOMAIN"));
+ ccf_search(ads,"ADNS_LOCALDOMAIN",-1,instrum_getenv(ads,"ADNS_LOCALDOMAIN"));
+
+ if (ads->configerrno && ads->configerrno != EINVAL) {
+ r= ads->configerrno;
+ init_abort(ads);
+ return r;
+ }
+
+ r= init_finish(ads);
+ if (r) return r;
+
+ adns__consistency(ads,0,cc_entex);
+ *ads_r= ads;
+ return 0;
+}
+
+int adns_init(adns_state *ads_r, adns_initflags flags, FILE *diagfile) {
+ return init_files(ads_r, flags, logfn_file, diagfile ? diagfile : stderr);
+}
+
+static int init_strcfg(adns_state *ads_r, adns_initflags flags,
+ adns_logcallbackfn *logfn, void *logfndata,
+ const char *configtext) {
+ adns_state ads;
+ int r;
+
+ r= init_begin(&ads, flags, logfn, logfndata);
+ if (r) return r;
+
+ readconfigtext(ads,configtext,"<supplied configuration text>");
+ if (ads->configerrno) {
+ r= ads->configerrno;
+ init_abort(ads);
+ return r;
+ }
+
+ r= init_finish(ads); if (r) return r;
+ adns__consistency(ads,0,cc_entex);
+ *ads_r= ads;
+ return 0;
+}
+
+int adns_init_strcfg(adns_state *ads_r, adns_initflags flags,
+ FILE *diagfile, const char *configtext) {
+ return init_strcfg(ads_r, flags,
+ diagfile ? logfn_file : 0, diagfile,
+ configtext);
+}
+
+int adns_init_logfn(adns_state *newstate_r, adns_initflags flags,
+ const char *configtext /*0=>use default config files*/,
+ adns_logcallbackfn *logfn /*0=>logfndata is a FILE* */,
+ void *logfndata /*0 with logfn==0 => discard*/) {
+ if (!logfn && logfndata)
+ logfn= logfn_file;
+ if (configtext)
+ return init_strcfg(newstate_r, flags, logfn, logfndata, configtext);
+ else
+ return init_files(newstate_r, flags, logfn, logfndata);
+}
+
+void adns_finish(adns_state ads) {
+ int i;
+ adns__consistency(ads,0,cc_entex);
+ for (;;) {
+ if (ads->udpw.head) adns__cancel(ads->udpw.head);
+ else if (ads->tcpw.head) adns__cancel(ads->tcpw.head);
+ else if (ads->childw.head) adns__cancel(ads->childw.head);
+ else if (ads->output.head) adns__cancel(ads->output.head);
+ else if (ads->intdone.head) adns__cancel(ads->output.head);
+ else break;
+ }
+ for (i=0; i<ads->nudpsockets; i++) close(ads->udpsockets[i].fd);
+ if (ads->tcpsocket >= 0) close(ads->tcpsocket);
+ adns__vbuf_free(&ads->tcpsend);
+ adns__vbuf_free(&ads->tcprecv);
+ freesearchlist(ads);
+ free(ads);
+}
+
+void adns_forallqueries_begin(adns_state ads) {
+ adns__consistency(ads,0,cc_entex);
+ ads->forallnext=
+ ads->udpw.head ? ads->udpw.head :
+ ads->tcpw.head ? ads->tcpw.head :
+ ads->childw.head ? ads->childw.head :
+ ads->output.head;
+}
+
+adns_query adns_forallqueries_next(adns_state ads, void **context_r) {
+ adns_query qu, nqu;
+
+ adns__consistency(ads,0,cc_entex);
+ nqu= ads->forallnext;
+ for (;;) {
+ qu= nqu;
+ if (!qu) return 0;
+ if (qu->next) {
+ nqu= qu->next;
+ } else if (qu == ads->udpw.tail) {
+ nqu=
+ ads->tcpw.head ? ads->tcpw.head :
+ ads->childw.head ? ads->childw.head :
+ ads->output.head;
+ } else if (qu == ads->tcpw.tail) {
+ nqu=
+ ads->childw.head ? ads->childw.head :
+ ads->output.head;
+ } else if (qu == ads->childw.tail) {
+ nqu= ads->output.head;
+ } else {
+ nqu= 0;
+ }
+ if (!qu->parent) break;
+ }
+ ads->forallnext= nqu;
+ if (context_r) *context_r= qu->ctx.ext;
+ return qu;
+}
diff --git a/src/transmit.c b/src/transmit.c
new file mode 100644
index 0000000..9cef6db
--- /dev/null
+++ b/src/transmit.c
@@ -0,0 +1,289 @@
+/*
+ * transmit.c
+ * - construct queries
+ * - send queries
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#include "internal.h"
+#include "tvarith.h"
+
+#define MKQUERY_START(vb) (rqp= (vb)->buf+(vb)->used)
+#define MKQUERY_ADDB(b) *rqp++= (b)
+#define MKQUERY_ADDW(w) (MKQUERY_ADDB(((w)>>8)&0x0ff), MKQUERY_ADDB((w)&0x0ff))
+#define MKQUERY_STOP(vb) ((vb)->used= rqp-(vb)->buf)
+
+static adns_status mkquery_header(adns_state ads, vbuf *vb,
+ int *id_r, int qdlen) {
+ int id;
+ byte *rqp;
+
+ if (!adns__vbuf_ensure(vb,DNS_HDRSIZE+qdlen+4)) return adns_s_nomemory;
+
+ vb->used= 0;
+ MKQUERY_START(vb);
+
+ *id_r= id= (ads->nextid++) & 0x0ffff;
+ MKQUERY_ADDW(id);
+ MKQUERY_ADDB(0x01); /* QR=Q(0), OPCODE=QUERY(0000), !AA, !TC, RD */
+ MKQUERY_ADDB(0x00); /* !RA, Z=000, RCODE=NOERROR(0000) */
+ MKQUERY_ADDW(1); /* QDCOUNT=1 */
+ MKQUERY_ADDW(0); /* ANCOUNT=0 */
+ MKQUERY_ADDW(0); /* NSCOUNT=0 */
+ MKQUERY_ADDW(0); /* ARCOUNT=0 */
+
+ MKQUERY_STOP(vb);
+
+ return adns_s_ok;
+}
+
+static adns_status mkquery_footer(vbuf *vb, adns_rrtype type) {
+ byte *rqp;
+
+ MKQUERY_START(vb);
+ MKQUERY_ADDW(type & adns_rrt_typemask); /* QTYPE */
+ MKQUERY_ADDW(DNS_CLASS_IN); /* QCLASS=IN */
+ MKQUERY_STOP(vb);
+ assert(vb->used <= vb->avail);
+
+ return adns_s_ok;
+}
+
+static adns_status qdparselabel(adns_state ads,
+ const char **p_io, const char *pe,
+ char label_r[], int *ll_io,
+ adns_queryflags flags) {
+ int ll, c;
+ const char *p;
+
+ ll= 0;
+ p= *p_io;
+
+ while (p!=pe && (c= *p++)!='.') {
+ if (c=='\\') {
+ if (!(flags & adns_qf_quoteok_query)) return adns_s_querydomaininvalid;
+ if (ctype_digit(p[0])) {
+ if (p+1==pe || p+2==pe) return adns_s_querydomaininvalid;
+ if (ctype_digit(p[1]) && ctype_digit(p[2])) {
+ c= (*p++ - '0')*100;
+ c += (*p++ - '0')*10;
+ c += (*p++ - '0');
+ if (c >= 256) return adns_s_querydomaininvalid;
+ } else {
+ return adns_s_querydomaininvalid;
+ }
+ } else if (!(c= *p++)) {
+ return adns_s_querydomaininvalid;
+ }
+ }
+ if (ll == *ll_io) return adns_s_querydomaininvalid;
+ label_r[ll++]= c;
+ }
+
+ *p_io= p;
+ *ll_io= ll;
+ return adns_s_ok;
+}
+
+adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r,
+ const char *owner, int ol,
+ const typeinfo *typei, adns_rrtype type,
+ adns_queryflags flags) {
+ int ll, nbytes;
+ byte label[255];
+ byte *rqp;
+ const char *p, *pe;
+ adns_status st;
+
+ st= mkquery_header(ads,vb,id_r,ol+2); if (st) return st;
+
+ MKQUERY_START(vb);
+
+ p= owner; pe= owner+ol;
+ nbytes= 0;
+ while (p!=pe) {
+ ll= sizeof(label);
+ st= qdparselabel(ads, &p,pe, label, &ll, flags);
+ if (st) return st;
+ if (!ll) return adns_s_querydomaininvalid;
+ if (ll > DNS_MAXLABEL) return adns_s_querydomaintoolong;
+ nbytes+= ll+1;
+ if (nbytes >= DNS_MAXDOMAIN) return adns_s_querydomaintoolong;
+ MKQUERY_ADDB(ll);
+ memcpy(rqp,label,ll); rqp+= ll;
+ }
+ MKQUERY_ADDB(0);
+
+ MKQUERY_STOP(vb);
+
+ st= mkquery_footer(vb,type);
+
+ return adns_s_ok;
+}
+
+adns_status adns__mkquery_frdgram(adns_state ads, vbuf *vb, int *id_r,
+ const byte *qd_dgram, int qd_dglen,
+ int qd_begin,
+ adns_rrtype type, adns_queryflags flags) {
+ byte *rqp;
+ findlabel_state fls;
+ int lablen, labstart;
+ adns_status st;
+
+ st= mkquery_header(ads,vb,id_r,qd_dglen); if (st) return st;
+
+ MKQUERY_START(vb);
+
+ adns__findlabel_start(&fls,ads,-1,0,qd_dgram,qd_dglen,qd_dglen,qd_begin,0);
+ for (;;) {
+ st= adns__findlabel_next(&fls,&lablen,&labstart); assert(!st);
+ if (!lablen) break;
+ assert(lablen<255);
+ MKQUERY_ADDB(lablen);
+ memcpy(rqp,qd_dgram+labstart,lablen);
+ rqp+= lablen;
+ }
+ MKQUERY_ADDB(0);
+
+ MKQUERY_STOP(vb);
+
+ st= mkquery_footer(vb,type);
+
+ return adns_s_ok;
+}
+
+void adns__querysend_tcp(adns_query qu, struct timeval now) {
+ byte length[2];
+ struct iovec iov[2];
+ int wr, r;
+ adns_state ads;
+
+ if (qu->ads->tcpstate != server_ok) return;
+
+ assert(qu->state == query_tcpw);
+
+ length[0]= (qu->query_dglen&0x0ff00U) >>8;
+ length[1]= (qu->query_dglen&0x0ff);
+
+ ads= qu->ads;
+ if (!adns__vbuf_ensure(&ads->tcpsend,ads->tcpsend.used+qu->query_dglen+2))
+ return;
+
+ qu->retries++;
+
+ /* Reset idle timeout. */
+ ads->tcptimeout.tv_sec= ads->tcptimeout.tv_usec= 0;
+
+ if (ads->tcpsend.used) {
+ wr= 0;
+ } else {
+ iov[0].iov_base= length;
+ iov[0].iov_len= 2;
+ iov[1].iov_base= qu->query_dgram;
+ iov[1].iov_len= qu->query_dglen;
+ adns__sigpipe_protect(qu->ads);
+ wr= writev(qu->ads->tcpsocket,iov,2);
+ adns__sigpipe_unprotect(qu->ads);
+ if (wr < 0) {
+ if (!(errno == EAGAIN || errno == EINTR || errno == ENOSPC ||
+ errno == ENOBUFS || errno == ENOMEM)) {
+ adns__tcp_broken(ads,"write",strerror(errno));
+ return;
+ }
+ wr= 0;
+ }
+ }
+
+ if (wr<2) {
+ r= adns__vbuf_append(&ads->tcpsend,length,2-wr); assert(r);
+ wr= 0;
+ } else {
+ wr-= 2;
+ }
+ if (wr<qu->query_dglen) {
+ r= adns__vbuf_append(&ads->tcpsend,qu->query_dgram+wr,qu->query_dglen-wr);
+ assert(r);
+ }
+}
+
+static void query_usetcp(adns_query qu, struct timeval now) {
+ qu->state= query_tcpw;
+ qu->timeout= now;
+ timevaladd(&qu->timeout,TCPWAITMS);
+ LIST_LINK_TAIL(qu->ads->tcpw,qu);
+ adns__querysend_tcp(qu,now);
+ adns__tcp_tryconnect(qu->ads,now);
+}
+
+struct udpsocket *adns__udpsocket_by_af(adns_state ads, int af) {
+ int i;
+ for (i=0; i<ads->nudpsockets; i++)
+ if (ads->udpsockets[i].af == af) return &ads->udpsockets[i];
+ return 0;
+}
+
+void adns__query_send(adns_query qu, struct timeval now) {
+ int serv, r;
+ adns_state ads;
+ struct udpsocket *udp;
+ adns_rr_addr *addr;
+
+ assert(qu->state == query_tosend);
+ if ((qu->flags & adns_qf_usevc) || (qu->query_dglen > DNS_MAXUDP)) {
+ query_usetcp(qu,now);
+ return;
+ }
+
+ if (qu->retries >= UDPMAXRETRIES) {
+ adns__query_fail(qu,adns_s_timeout);
+ return;
+ }
+
+ ads= qu->ads;
+ serv= qu->udpnextserver;
+ addr= &ads->servers[serv];
+ udp= adns__udpsocket_by_af(ads, addr->addr.sa.sa_family);
+ assert(udp);
+
+ r= sendto(udp->fd,qu->query_dgram,qu->query_dglen,0,
+ &addr->addr.sa,addr->len);
+ if (r<0 && errno == EMSGSIZE) {
+ qu->retries= 0;
+ query_usetcp(qu,now);
+ return;
+ }
+ if (r<0 && errno != EAGAIN)
+ adns__warn(ads,serv,0,"sendto failed: %s",strerror(errno));
+
+ qu->timeout= now;
+ timevaladd(&qu->timeout,UDPRETRYMS);
+ qu->udpsent |= (1<<serv);
+ qu->udpnextserver= (serv+1)%ads->nservers;
+ qu->retries++;
+ LIST_LINK_TAIL(ads->udpw,qu);
+}
diff --git a/src/tvarith.h b/src/tvarith.h
new file mode 100644
index 0000000..1492dd6
--- /dev/null
+++ b/src/tvarith.h
@@ -0,0 +1,40 @@
+/*
+ * tvarith.h
+ * - static inline functions for doing arithmetic on timevals
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#ifndef ADNS_TVARITH_H_INCLUDED
+#define ADNS_TVARITH_H_INCLUDED
+
+static inline void timevaladd(struct timeval *tv_io, long ms) {
+ struct timeval tmp;
+ assert(ms>=0);
+ tmp= *tv_io;
+ tmp.tv_usec += (ms%1000)*1000;
+ tmp.tv_sec += ms/1000;
+ if (tmp.tv_usec >= 1000000) { tmp.tv_sec++; tmp.tv_usec -= 1000000; }
+ *tv_io= tmp;
+}
+
+#endif
diff --git a/src/types.c b/src/types.c
new file mode 100644
index 0000000..d65e155
--- /dev/null
+++ b/src/types.c
@@ -0,0 +1,1712 @@
+/*
+ * types.c
+ * - RR-type-specific code, and the machinery to call it
+ */
+/*
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * Copyright (C) 1999-2000,2003,2006 Tony Finch
+ * Copyright (C) 1991 Massachusetts Institute of Technology
+ * (See the file INSTALL for full details.)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation.
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "internal.h"
+
+#define R_NOMEM return adns_s_nomemory
+#define CSP_ADDSTR(s) do { \
+ if (!adns__vbuf_appendstr(vb,(s))) R_NOMEM; \
+ } while (0)
+
+/*
+ * order of sections:
+ *
+ * _string (pap)
+ * _textdata, _qstring (csp)
+ * _str (mf,cs)
+ * _intstr (mf,csp,cs)
+ * _manyistr (mf,cs)
+ * _txt (pa)
+ * _inaddr (pa,di,cs
+ * +search_sortlist, dip_genaddr, csp_genaddr)
+ * _in6addr (pa,di,cs)
+ * _addr (pap,pa,di,div,csp,cs,gsz,qs
+ * +search_sortlist_sa, dip_sockaddr,
+ * addr_rrtypes, addr_submit, icb_addr)
+ * _domain (pap,csp,cs)
+ * _dom_raw (pa)
+ * _host_raw (pa)
+ * _hostaddr (pap,pa,dip,di,mfp,mf,csp,cs
+ * +pap_findaddrs, icb_hostaddr)
+ * _mx_raw (pa,di)
+ * _mx (pa,di)
+ * _inthostaddr (mf,cs)
+ * _inthost (cs)
+ * _ptr (ckl,pa +icb_ptr)
+ * _strpair (mf)
+ * _intstrpair (mf)
+ * _hinfo (pa)
+ * _mailbox (pap,csp +pap_mailbox822)
+ * _rp (pa,cs)
+ * _soa (pa,mf,cs)
+ * _srv* (ckl,(pap),pa*2,mf*2,di,(csp),cs*2,postsort)
+ * _byteblock (mf)
+ * _opaque (pa,cs)
+ * _flat (mf)
+ *
+ * within each section:
+ * ckl_*
+ * pap_*
+ * pa_*
+ * dip_*
+ * di_*
+ * mfp_*
+ * mf_*
+ * csp_*
+ * cs_*
+ * gsz_*
+ * postsort_*
+ * qs_*
+ */
+
+/*
+ * _qstring (pap,csp)
+ */
+
+static adns_status pap_qstring(const parseinfo *pai, int *cbyte_io, int max,
+ int *len_r, char **str_r) {
+ /* Neither len_r nor str_r may be null.
+ * End of datagram (overrun) is indicated by returning adns_s_invaliddata;
+ */
+ const byte *dgram= pai->dgram;
+ int l, cbyte;
+ char *str;
+
+ cbyte= *cbyte_io;
+
+ if (cbyte >= max) return adns_s_invaliddata;
+ GET_B(cbyte,l);
+ if (cbyte+l > max) return adns_s_invaliddata;
+
+ str= adns__alloc_interim(pai->qu, l+1);
+ if (!str) R_NOMEM;
+
+ str[l]= 0;
+ memcpy(str,dgram+cbyte,l);
+
+ *len_r= l;
+ *str_r= str;
+ *cbyte_io= cbyte+l;
+
+ return adns_s_ok;
+}
+
+static adns_status csp_qstring(vbuf *vb, const char *dp, int len) {
+ unsigned char ch;
+ char buf[10];
+ int cn;
+
+ CSP_ADDSTR("\"");
+ for (cn=0; cn<len; cn++) {
+ ch= *dp++;
+ if (ch == '\\') {
+ CSP_ADDSTR("\\\\");
+ } else if (ch == '"') {
+ CSP_ADDSTR("\\\"");
+ } else if (ch >= 32 && ch <= 126) {
+ if (!adns__vbuf_append(vb,&ch,1)) R_NOMEM;
+ } else {
+ sprintf(buf,"\\x%02x",ch);
+ CSP_ADDSTR(buf);
+ }
+ }
+ CSP_ADDSTR("\"");
+
+ return adns_s_ok;
+}
+
+/*
+ * _str (mf)
+ */
+
+static void mf_str(adns_query qu, void *datap) {
+ char **rrp= datap;
+
+ adns__makefinal_str(qu,rrp);
+}
+
+/*
+ * _intstr (mf)
+ */
+
+static void mf_intstr(adns_query qu, void *datap) {
+ adns_rr_intstr *rrp= datap;
+
+ adns__makefinal_str(qu,&rrp->str);
+}
+
+/*
+ * _manyistr (mf)
+ */
+
+static void mf_manyistr(adns_query qu, void *datap) {
+ adns_rr_intstr **rrp= datap;
+ adns_rr_intstr *te, *table;
+ void *tablev;
+ int tc;
+
+ for (tc=0, te= *rrp; te->i >= 0; te++, tc++);
+ tablev= *rrp;
+ adns__makefinal_block(qu,&tablev,sizeof(*te)*(tc+1));
+ *rrp= table= tablev;
+ for (te= *rrp; te->i >= 0; te++)
+ adns__makefinal_str(qu,&te->str);
+}
+
+/*
+ * _txt (pa,cs)
+ */
+
+static adns_status pa_txt(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ adns_rr_intstr **rrp= datap, *table, *te;
+ const byte *dgram= pai->dgram;
+ int ti, tc, l, startbyte;
+ adns_status st;
+
+ startbyte= cbyte;
+ if (cbyte >= max) return adns_s_invaliddata;
+ tc= 0;
+ while (cbyte < max) {
+ GET_B(cbyte,l);
+ cbyte+= l;
+ tc++;
+ }
+ if (cbyte != max || !tc) return adns_s_invaliddata;
+
+ table= adns__alloc_interim(pai->qu,sizeof(*table)*(tc+1));
+ if (!table) R_NOMEM;
+
+ for (cbyte=startbyte, ti=0, te=table; ti<tc; ti++, te++) {
+ st= pap_qstring(pai, &cbyte, max, &te->i, &te->str);
+ if (st) return st;
+ }
+ assert(cbyte == max);
+
+ te->i= -1;
+ te->str= 0;
+
+ *rrp= table;
+ return adns_s_ok;
+}
+
+static adns_status cs_txt(vbuf *vb, const void *datap) {
+ const adns_rr_intstr *const *rrp= datap;
+ const adns_rr_intstr *current;
+ adns_status st;
+ int spc;
+
+ for (current= *rrp, spc=0; current->i >= 0; current++, spc=1) {
+ if (spc) CSP_ADDSTR(" ");
+ st= csp_qstring(vb,current->str,current->i); if (st) return st;
+ }
+ return adns_s_ok;
+}
+
+/*
+ * _hinfo (cs)
+ */
+
+static adns_status cs_hinfo(vbuf *vb, const void *datap) {
+ const adns_rr_intstrpair *rrp= datap;
+ adns_status st;
+
+ st= csp_qstring(vb,rrp->array[0].str,rrp->array[0].i); if (st) return st;
+ CSP_ADDSTR(" ");
+ st= csp_qstring(vb,rrp->array[1].str,rrp->array[1].i); if (st) return st;
+ return adns_s_ok;
+}
+
+/*
+ * _inaddr (pa,di,cs +search_sortlist, dip_genaddr, csp_genaddr)
+ */
+
+static adns_status pa_inaddr(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ struct in_addr *storeto= datap;
+
+ if (max-cbyte != 4) return adns_s_invaliddata;
+ memcpy(storeto, pai->dgram + cbyte, 4);
+ return adns_s_ok;
+}
+
+static int search_sortlist(adns_state ads, int af, const void *ad) {
+ const struct sortlist *slp;
+ struct in_addr a4;
+ int i;
+ int v6mappedp= 0;
+
+ if (af == AF_INET6) {
+ const struct in6_addr *a6= ad;
+ if (IN6_IS_ADDR_V4MAPPED(a6)) {
+ a4.s_addr= htonl(((unsigned long)a6->s6_addr[12] << 24) |
+ ((unsigned long)a6->s6_addr[13] << 16) |
+ ((unsigned long)a6->s6_addr[14] << 8) |
+ ((unsigned long)a6->s6_addr[15] << 0));
+ v6mappedp= 1;
+ }
+ }
+
+ for (i=0, slp=ads->sortlist;
+ i<ads->nsortlist &&
+ !adns__addr_matches(af,ad, &slp->base,&slp->mask) &&
+ !(v6mappedp &&
+ adns__addr_matches(AF_INET,&a4, &slp->base,&slp->mask));
+ i++, slp++);
+ return i;
+}
+
+static int dip_genaddr(adns_state ads, int af, const void *a, const void *b) {
+ int ai, bi;
+
+ if (!ads->nsortlist) return 0;
+
+ ai= search_sortlist(ads,af,a);
+ bi= search_sortlist(ads,af,b);
+ return bi<ai;
+}
+
+static int di_inaddr(adns_state ads,
+ const void *datap_a, const void *datap_b) {
+ return dip_genaddr(ads,AF_INET,datap_a,datap_b);
+}
+
+static adns_status csp_genaddr(vbuf *vb, int af, const void *p) {
+ char buf[ADNS_ADDR2TEXT_BUFLEN];
+ int len= sizeof(buf);
+ adns_rr_addr a;
+ int err;
+
+ memset(&a, 0, sizeof(a));
+ a.addr.sa.sa_family= af;
+ adns__addr_inject(p, &a.addr);
+ err= adns_addr2text(&a.addr.sa,0, buf,&len, 0); assert(!err);
+ CSP_ADDSTR(buf);
+ return adns_s_ok;
+}
+
+static adns_status cs_inaddr(vbuf *vb, const void *datap) {
+ return csp_genaddr(vb, AF_INET,datap);
+}
+
+/*
+ * _in6addr (pa,di,cs)
+ */
+
+static adns_status pa_in6addr(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ struct in6_addr *storeto= datap;
+
+ if (max-cbyte != 16) return adns_s_invaliddata;
+ memcpy(storeto->s6_addr, pai->dgram + cbyte, 16);
+ return adns_s_ok;
+}
+
+static int di_in6addr(adns_state ads,
+ const void *datap_a, const void *datap_b) {
+ return dip_genaddr(ads,AF_INET6,datap_a,datap_b);
+}
+
+static adns_status cs_in6addr(vbuf *vb, const void *datap) {
+ return csp_genaddr(vb,AF_INET6,datap);
+}
+
+/*
+ * _addr (pap,pa,di,div,csp,cs,gsz,qs
+ * +search_sortlist_sa, dip_sockaddr, addr_rrtypes,
+ * addr_submit, icb_addr)
+ */
+
+static const typeinfo tinfo_addrsub;
+
+#define ADDR_RRTYPES(_) _(a) _(aaaa)
+
+static const adns_rrtype addr_all_rrtypes[] = {
+#define RRTY_CODE(ty) adns_r_##ty,
+ ADDR_RRTYPES(RRTY_CODE)
+#undef RRTY_CODE
+};
+
+enum {
+#define RRTY_INDEX(ty) addr__ri_##ty,
+ ADDR_RRTYPES(RRTY_INDEX)
+#undef RRTY_INDEX
+ addr_nrrtypes,
+#define RRTY_FLAG(ty) addr_rf_##ty = 1 << addr__ri_##ty,
+ ADDR_RRTYPES(RRTY_FLAG)
+ addr__rrty_eat_final_comma
+#undef RRTY_FLAG
+};
+
+static unsigned addr_rrtypeflag(adns_rrtype type) {
+ int i;
+
+ type &= adns_rrt_typemask;
+ for (i=0; i<addr_nrrtypes; i++)
+ if (type==addr_all_rrtypes[i])
+ return 1 << i;
+ return 0;
+}
+
+/* About CNAME handling in addr queries.
+ *
+ * A user-level addr query is translated into a number of protocol-level
+ * queries, and its job is to reassemble the results. This gets tricky if
+ * the answers aren't consistent. In particular, if the answers report
+ * inconsistent indirection via CNAME records (e.g., different CNAMEs, or
+ * some indirect via a CNAME, and some don't) then we have trouble.
+ *
+ * Once we've received an answer, even if it was NODATA, we set
+ * adns__qf_addr_answer on the parent query. This will let us detect a
+ * conflict between a no-CNAME-with-NODATA reply and a subsequent CNAME.
+ *
+ * If we detect a conflict of any kind, then at least one answer came back
+ * with a CNAME record, so we pick the first such answer (somewhat
+ * arbitrarily) as being the `right' canonical name, and set this in the
+ * parent query's answer->cname slot. We discard address records from the
+ * wrong name. And finally we cancel the outstanding child queries, and
+ * resubmit address queries for the address families we don't yet have, with
+ * adns__qf_addr_cname set so that we know that we're in the fixup state.
+ */
+
+static adns_status pap_addr(const parseinfo *pai, int in_rrty, size_t out_rrsz,
+ int *cbyte_io, int cbyte_max, adns_rr_addr *out) {
+ int in_addrlen;
+ int out_af, out_salen;
+ struct in6_addr v6map;
+
+ const void *use_addr= pai->dgram + *cbyte_io;
+
+ switch (in_rrty) {
+ case adns_r_a: in_addrlen= 4; out_af= AF_INET; break;
+ case adns_r_aaaa: in_addrlen= 16; out_af= AF_INET6; break;
+ default: abort();
+ }
+
+ if ((*cbyte_io + in_addrlen) != cbyte_max) return adns_s_invaliddata;
+
+ if (out_af==AF_INET &&
+ (pai->qu->flags & adns_qf_ipv6_mapv4) &&
+ (pai->qu->answer->type & adns__qtf_bigaddr)) {
+ memset(v6map.s6_addr + 0, 0x00, 10);
+ memset(v6map.s6_addr + 10, 0xff, 2);
+ memcpy(v6map.s6_addr + 12, use_addr, 4);
+ use_addr= v6map.s6_addr;
+ out_af= AF_INET6;
+ }
+
+ switch (out_af) {
+ case AF_INET: out_salen= sizeof(out->addr.inet); break;
+ case AF_INET6: out_salen= sizeof(out->addr.inet6); break;
+ default: abort();
+ }
+
+ assert(offsetof(adns_rr_addr, addr) + out_salen <= out_rrsz);
+
+ memset(&out->addr, 0, out_salen);
+ out->len= out_salen;
+ out->addr.sa.sa_family= out_af;
+ adns__addr_inject(use_addr, &out->addr);
+
+ *cbyte_io += in_addrlen;
+ return adns_s_ok;
+}
+
+static adns_status pa_addr(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ int err= pap_addr(pai, pai->qu->answer->type & adns_rrt_typemask,
+ pai->qu->answer->rrsz, &cbyte, max, datap);
+ if (err) return err;
+ if (cbyte != max) return adns_s_invaliddata;
+ return adns_s_ok;
+}
+
+static int search_sortlist_sa(adns_state ads, const struct sockaddr *sa) {
+ const void *pa = adns__sockaddr_addr(sa);
+ return search_sortlist(ads, sa->sa_family, pa);
+}
+
+static int dip_sockaddr(adns_state ads,
+ const struct sockaddr *sa,
+ const struct sockaddr *sb) {
+ if (!ads->sortlist) return 0;
+ return search_sortlist_sa(ads, sa) > search_sortlist_sa(ads, sb);
+}
+
+static int di_addr(adns_state ads, const void *datap_a, const void *datap_b) {
+ const adns_rr_addr *ap= datap_a, *bp= datap_b;
+ return dip_sockaddr(ads, &ap->addr.sa, &bp->addr.sa);
+}
+
+static int div_addr(void *context, const void *datap_a, const void *datap_b) {
+ const adns_state ads= context;
+
+ return di_addr(ads, datap_a, datap_b);
+}
+
+static adns_status csp_addr(vbuf *vb, const adns_rr_addr *rrp) {
+ char buf[ADNS_ADDR2TEXT_BUFLEN];
+ int len= sizeof(buf);
+ int err;
+
+ switch (rrp->addr.inet.sin_family) {
+ case AF_INET:
+ CSP_ADDSTR("INET ");
+ goto a2t;
+ case AF_INET6:
+ CSP_ADDSTR("INET6 ");
+ goto a2t;
+ a2t:
+ err= adns_addr2text(&rrp->addr.sa,0, buf,&len, 0); assert(!err);
+ CSP_ADDSTR(buf);
+ break;
+ default:
+ sprintf(buf,"AF=%u",rrp->addr.sa.sa_family);
+ CSP_ADDSTR(buf);
+ break;
+ }
+ return adns_s_ok;
+}
+
+static adns_status cs_addr(vbuf *vb, const void *datap) {
+ const adns_rr_addr *rrp= datap;
+
+ return csp_addr(vb,rrp);
+}
+
+static int gsz_addr(const typeinfo *typei, adns_rrtype type) {
+ return type & adns__qtf_bigaddr ?
+ sizeof(adns_rr_addr) : sizeof(adns_rr_addr_v4only);
+}
+
+static unsigned addr_rrtypes(adns_state ads, adns_rrtype type,
+ adns_queryflags qf) {
+ /* Return a mask of addr_rf_... flags indicating which address families are
+ * wanted, given a query type and flags.
+ */
+
+ adns_queryflags permitaf= 0;
+ unsigned want= 0;
+
+ if (!(type & adns__qtf_bigaddr))
+ qf= (qf & ~adns_qf_want_allaf) | adns_qf_want_ipv4;
+ else {
+ if (!(qf & adns_qf_want_allaf)) {
+ qf |= (type & adns__qtf_manyaf) ?
+ adns_qf_want_allaf : adns_qf_want_ipv4;
+ }
+ if (ads->iflags & adns_if_permit_ipv4) permitaf |= adns_qf_want_ipv4;
+ if (ads->iflags & adns_if_permit_ipv6) permitaf |= adns_qf_want_ipv6;
+ if (qf & permitaf) qf &= permitaf | ~adns_qf_want_allaf;
+ }
+
+ if (qf & adns_qf_want_ipv4) want |= addr_rf_a;
+ if (qf & adns_qf_want_ipv6) want |= addr_rf_aaaa;
+
+ return want;
+}
+
+static void icb_addr(adns_query parent, adns_query child);
+
+static void addr_subqueries(adns_query qu, struct timeval now,
+ adns_queryflags qf_extra,
+ const byte *qd_dgram, int qd_dglen) {
+ int i, err, id;
+ adns_query cqu;
+ adns_queryflags qf= (qu->flags & ~adns_qf_search) | qf_extra;
+ adns_rrtype qtf= qu->answer->type & adns__qtf_deref;
+ unsigned which= qu->ctx.tinfo.addr.want & ~qu->ctx.tinfo.addr.have;
+ qcontext ctx;
+
+ memset(&ctx, 0, sizeof(ctx));
+ ctx.callback= icb_addr;
+ for (i=0; i<addr_nrrtypes; i++) {
+ if (!(which & (1 << i))) continue;
+ err= adns__mkquery_frdgram(qu->ads, &qu->vb, &id, qd_dgram,qd_dglen,
+ DNS_HDRSIZE, addr_all_rrtypes[i], qf);
+ if (err) goto x_error;
+ err= adns__internal_submit(qu->ads, &cqu, qu, &tinfo_addrsub,
+ addr_all_rrtypes[i] | qtf,
+ &qu->vb, id, qf, now, &ctx);
+ if (err) goto x_error;
+ cqu->answer->rrsz= qu->answer->rrsz;
+ }
+ qu->state= query_childw;
+ LIST_LINK_TAIL(qu->ads->childw, qu);
+ return;
+
+x_error:
+ adns__query_fail(qu, err);
+}
+
+static adns_status addr_submit(adns_query parent, adns_query *query_r,
+ vbuf *qumsg_vb, int id, unsigned want,
+ adns_queryflags flags, struct timeval now,
+ qcontext *ctx) {
+ /* This is effectively a substitute for adns__internal_submit, intended for
+ * the case where the caller (possibly) only wants a subset of the
+ * available record types. The memory management and callback rules are
+ * the same as for adns__internal_submit.
+ *
+ * Some differences: the query is linked onto the parent's children
+ * list before exit (though the parent's state is not changed, and
+ * it is not linked into the childw list queue); and we set the
+ * `tinfo' portion of the context structure (yes, modifying *ctx),
+ * since this is, in fact, the main purpose of this function.
+ */
+
+ adns_state ads= parent->ads;
+ adns_query qu;
+ adns_status err;
+ adns_rrtype type= ((adns_r_addr & adns_rrt_reprmask) |
+ (parent->answer->type & ~adns_rrt_reprmask));
+
+ ctx->tinfo.addr.want= want;
+ ctx->tinfo.addr.have= 0;
+ err= adns__internal_submit(ads, &qu, parent, adns__findtype(adns_r_addr),
+ type, qumsg_vb, id, flags, now, ctx);
+ if (err) return err;
+
+ *query_r= qu;
+ return adns_s_ok;
+}
+
+static adns_status append_addrs(adns_query qu, size_t rrsz,
+ adns_rr_addr **dp, int *dlen,
+ const adns_rr_addr *sp, int slen) {
+ /* Append a vector of slen addr records, each of size rrsz, starting at ap,
+ * to a vector starting at *dp, of length *dlen. On successful completion,
+ * *dp and *dlen are updated.
+ */
+
+ size_t drrsz= *dlen*rrsz, srrsz= slen*rrsz;
+ byte *p;
+
+ if (!slen) return adns_s_ok;
+ p= adns__alloc_interim(qu, drrsz + srrsz);
+ if (!p) R_NOMEM;
+ if (*dlen) {
+ memcpy(p, *dp, drrsz);
+ adns__free_interim(qu, *dp);
+ }
+ memcpy(p + drrsz, sp, srrsz);
+ *dlen += slen;
+ *dp= (adns_rr_addr *)p;
+ return adns_s_ok;
+}
+
+static void propagate_ttl(adns_query to, adns_query from)
+ { if (to->expires > from->expires) to->expires= from->expires; }
+
+static adns_status copy_cname_from_child(adns_query parent, adns_query child) {
+ adns_answer *pans= parent->answer, *cans= child->answer;
+ size_t n= strlen(cans->cname) + 1;
+
+ pans->cname= adns__alloc_preserved(parent, n);
+ if (!pans->cname) R_NOMEM;
+ memcpy(pans->cname, cans->cname, n);
+ return adns_s_ok;
+}
+
+static void done_addr_type(adns_query qu, adns_rrtype type) {
+ unsigned f= addr_rrtypeflag(type);
+ assert(f); qu->ctx.tinfo.addr.have |= f;
+}
+
+static void icb_addr(adns_query parent, adns_query child) {
+ adns_state ads= parent->ads;
+ adns_answer *pans= parent->answer, *cans= child->answer;
+ struct timeval now;
+ adns_status err;
+ adns_queryflags qf;
+ int id, r;
+
+ propagate_ttl(parent, child);
+
+ if (!(child->flags & adns__qf_addr_cname) &&
+ (parent->flags & adns__qf_addr_answer) &&
+ (!!pans->cname != !!cans->cname ||
+ (pans->cname && strcmp(pans->cname, cans->cname)))) {
+ /* We've detected an inconsistency in CNAME records, and must deploy
+ * countermeasures.
+ */
+
+ if (!pans->cname) {
+ /* The child has a CNAME record, but the parent doesn't. We must
+ * discard all of the parent's addresses, and substitute the child's.
+ */
+
+ assert(pans->rrsz == cans->rrsz);
+ adns__free_interim(parent, pans->rrs.bytes);
+ adns__transfer_interim(child, parent, cans->rrs.bytes);
+ pans->rrs.bytes= cans->rrs.bytes;
+ pans->nrrs= cans->nrrs;
+ parent->ctx.tinfo.addr.have= 0;
+ done_addr_type(parent, cans->type);
+ err= copy_cname_from_child(parent, child); if (err) goto x_err;
+ }
+
+ /* We've settled on the CNAME (now) associated with the parent, which
+ * already has appropriate address records. Build a query datagram for
+ * this name so that we can issue child queries for the missing address
+ * families. The child's vbuf looks handy for this.
+ */
+ err= adns__mkquery(ads, &child->vb, &id, pans->cname,
+ strlen(pans->cname), &tinfo_addrsub,
+ adns_r_addr, parent->flags);
+ if (err) goto x_err;
+
+ /* Now cancel the remaining children, and try again with the CNAME we've
+ * settled on.
+ */
+ adns__cancel_children(parent);
+ r= gettimeofday(&now, 0); if (r) goto x_gtod;
+ qf= adns__qf_addr_cname;
+ if (!(parent->flags & adns_qf_cname_loose)) qf |= adns_qf_cname_forbid;
+ addr_subqueries(parent, now, qf, child->vb.buf, child->vb.used);
+ return;
+ }
+
+ if (cans->cname && !pans->cname) {
+ err= copy_cname_from_child(parent, child);
+ if (err) goto x_err;
+ }
+
+ if ((parent->flags & adns_qf_search) &&
+ !pans->cname && cans->status == adns_s_nxdomain) {
+ /* We're searching a list of suffixes, and the name doesn't exist. Try
+ * the next one.
+ */
+
+ adns__cancel_children(parent);
+ adns__free_interim(parent, pans->rrs.bytes);
+ pans->rrs.bytes= 0; pans->nrrs= 0;
+ r= gettimeofday(&now, 0); if (r) goto x_gtod;
+ adns__search_next(ads, parent, now);
+ return;
+ }
+
+ if (cans->status && cans->status != adns_s_nodata)
+ { err= cans->status; goto x_err; }
+
+ assert(pans->rrsz == cans->rrsz);
+ err= append_addrs(parent, pans->rrsz,
+ &pans->rrs.addr, &pans->nrrs,
+ cans->rrs.addr, cans->nrrs);
+ if (err) goto x_err;
+ done_addr_type(parent, cans->type);
+
+ if (parent->children.head) LIST_LINK_TAIL(ads->childw, parent);
+ else if (!pans->nrrs) adns__query_fail(parent, adns_s_nodata);
+ else adns__query_done(parent);
+ parent->flags |= adns__qf_addr_answer;
+ return;
+
+x_gtod:
+ /* We have our own error handling, because adns__must_gettimeofday
+ * handles errors by calling adns_globalsystemfailure, which would
+ * reenter the query processing logic. */
+ adns__diag(ads, -1, parent, "gettimeofday failed: %s", strerror(errno));
+ err= adns_s_systemfail;
+ goto x_err;
+
+x_err:
+ adns__query_fail(parent, err);
+}
+
+static void qs_addr(adns_query qu, struct timeval now) {
+ if (!qu->ctx.tinfo.addr.want) {
+ qu->ctx.tinfo.addr.want= addr_rrtypes(qu->ads, qu->answer->type,
+ qu->flags);
+ qu->ctx.tinfo.addr.have= 0;
+ }
+ addr_subqueries(qu, now, 0, qu->query_dgram, qu->query_dglen);
+}
+
+/*
+ * _domain (pap,csp,cs)
+ * _dom_raw (pa)
+ */
+
+static adns_status pap_domain(const parseinfo *pai, int *cbyte_io, int max,
+ char **domain_r, parsedomain_flags flags) {
+ adns_status st;
+ char *dm;
+
+ st= adns__parse_domain(pai->qu->ads, pai->serv, pai->qu, &pai->qu->vb, flags,
+ pai->dgram,pai->dglen, cbyte_io, max);
+ if (st) return st;
+ if (!pai->qu->vb.used) return adns_s_invaliddata;
+
+ dm= adns__alloc_interim(pai->qu, pai->qu->vb.used+1);
+ if (!dm) R_NOMEM;
+
+ dm[pai->qu->vb.used]= 0;
+ memcpy(dm,pai->qu->vb.buf,pai->qu->vb.used);
+
+ *domain_r= dm;
+ return adns_s_ok;
+}
+
+static adns_status csp_domain(vbuf *vb, const char *domain) {
+ CSP_ADDSTR(domain);
+ if (!*domain) CSP_ADDSTR(".");
+ return adns_s_ok;
+}
+
+static adns_status cs_domain(vbuf *vb, const void *datap) {
+ const char *const *domainp= datap;
+ return csp_domain(vb,*domainp);
+}
+
+static adns_status pa_dom_raw(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ char **rrp= datap;
+ adns_status st;
+
+ st= pap_domain(pai, &cbyte, max, rrp, pdf_quoteok);
+ if (st) return st;
+
+ if (cbyte != max) return adns_s_invaliddata;
+ return adns_s_ok;
+}
+
+/*
+ * _host_raw (pa)
+ */
+
+static adns_status pa_host_raw(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ char **rrp= datap;
+ adns_status st;
+
+ st= pap_domain(pai, &cbyte, max, rrp,
+ pai->qu->flags & adns_qf_quoteok_anshost ? pdf_quoteok : 0);
+ if (st) return st;
+
+ if (cbyte != max) return adns_s_invaliddata;
+ return adns_s_ok;
+}
+
+/*
+ * _hostaddr (pap,pa,dip,di,mfp,mf,csp,cs +pap_findaddrs, icb_hostaddr)
+ */
+
+static adns_status pap_findaddrs(const parseinfo *pai, adns_rr_hostaddr *ha,
+ unsigned *want_io, size_t addrsz,
+ int *cbyte_io, int count, int dmstart) {
+ int rri, naddrs;
+ unsigned typef, want= *want_io, need= want;
+ int type, class, rdlen, rdend, rdstart, ownermatched;
+ unsigned long ttl;
+ adns_status st;
+
+ for (rri=0, naddrs=0; rri<count; rri++) {
+ st= adns__findrr_anychk(pai->qu, pai->serv, pai->dgram,
+ pai->dglen, cbyte_io,
+ &type, &class, &ttl, &rdlen, &rdstart,
+ pai->dgram, pai->dglen, dmstart, &ownermatched);
+ if (st) return st;
+ if (!ownermatched || class != DNS_CLASS_IN) continue;
+ typef= addr_rrtypeflag(type);
+ if (!(want & typef)) continue;
+ need &= ~typef;
+ if (!adns__vbuf_ensure(&pai->qu->vb, (naddrs+1)*addrsz)) R_NOMEM;
+ adns__update_expires(pai->qu,ttl,pai->now);
+ rdend= rdstart + rdlen;
+ st= pap_addr(pai, type, addrsz, &rdstart, rdend,
+ (adns_rr_addr *)(pai->qu->vb.buf + naddrs*addrsz));
+ if (st) return st;
+ if (rdstart != rdend) return adns_s_invaliddata;
+ naddrs++;
+ }
+ if (naddrs > 0) {
+ st= append_addrs(pai->qu, addrsz, &ha->addrs, &ha->naddrs,
+ (const adns_rr_addr *)pai->qu->vb.buf, naddrs);
+ if (st) return st;
+ ha->astatus= adns_s_ok;
+
+ if (!need) {
+ adns__isort(ha->addrs, naddrs, addrsz, pai->qu->vb.buf,
+ div_addr, pai->ads);
+ }
+ }
+ *want_io= need;
+ return adns_s_ok;
+}
+
+static void icb_hostaddr(adns_query parent, adns_query child) {
+ adns_answer *cans= child->answer;
+ adns_rr_hostaddr *rrp= child->ctx.pinfo.hostaddr;
+ adns_state ads= parent->ads;
+ adns_status st;
+ size_t addrsz= gsz_addr(0, parent->answer->type);
+
+ st= cans->status == adns_s_nodata ? adns_s_ok : cans->status;
+ if (st) goto done;
+ propagate_ttl(parent, child);
+
+ assert(addrsz == cans->rrsz);
+ st= append_addrs(parent, addrsz,
+ &rrp->addrs, &rrp->naddrs,
+ cans->rrs.addr, cans->nrrs);
+ if (st) goto done;
+ if (!rrp->naddrs) { st= adns_s_nodata; goto done; }
+
+ if (!adns__vbuf_ensure(&parent->vb, addrsz))
+ { st= adns_s_nomemory; goto done; }
+ adns__isort(rrp->addrs, rrp->naddrs, addrsz, parent->vb.buf,
+ div_addr, ads);
+
+done:
+ if (st) {
+ adns__free_interim(parent, rrp->addrs);
+ rrp->naddrs= (st>0 && st<=adns_s_max_tempfail) ? -1 : 0;
+ }
+
+ rrp->astatus= st;
+ if (parent->children.head) {
+ LIST_LINK_TAIL(ads->childw,parent);
+ } else {
+ adns__query_done(parent);
+ }
+}
+
+static adns_status pap_hostaddr(const parseinfo *pai, int *cbyte_io,
+ int max, adns_rr_hostaddr *rrp) {
+ adns_status st;
+ int dmstart, cbyte;
+ qcontext ctx;
+ int id;
+ adns_query nqu;
+ adns_queryflags nflags;
+ unsigned want;
+ size_t addrsz= gsz_addr(0, pai->qu->answer->type);
+
+ dmstart= cbyte= *cbyte_io;
+ st= pap_domain(pai, &cbyte, max, &rrp->host,
+ pai->qu->flags & adns_qf_quoteok_anshost ? pdf_quoteok : 0);
+ if (st) return st;
+ *cbyte_io= cbyte;
+
+ rrp->astatus= adns_s_ok;
+ rrp->naddrs= 0;
+ rrp->addrs= 0;
+
+ cbyte= pai->nsstart;
+
+ want= addr_rrtypes(pai->ads, pai->qu->answer->type, pai->qu->flags);
+
+ st= pap_findaddrs(pai, rrp, &want, addrsz, &cbyte, pai->nscount, dmstart);
+ if (st) return st;
+ if (!want) return adns_s_ok;
+
+ st= pap_findaddrs(pai, rrp, &want, addrsz, &cbyte, pai->arcount, dmstart);
+ if (st) return st;
+ if (!want) return adns_s_ok;
+
+ st= adns__mkquery_frdgram(pai->ads, &pai->qu->vb, &id,
+ pai->dgram, pai->dglen, dmstart,
+ adns_r_addr, adns_qf_quoteok_query);
+ if (st) return st;
+
+ ctx.ext= 0;
+ ctx.callback= icb_hostaddr;
+ ctx.pinfo.hostaddr= rrp;
+
+ nflags= adns_qf_quoteok_query | (pai->qu->flags & (adns_qf_want_allaf |
+ adns_qf_ipv6_mapv4));
+ if (!(pai->qu->flags & adns_qf_cname_loose)) nflags |= adns_qf_cname_forbid;
+
+ st= addr_submit(pai->qu, &nqu, &pai->qu->vb, id, want,
+ nflags, pai->now, &ctx);
+ if (st) return st;
+
+ return adns_s_ok;
+}
+
+static adns_status pa_hostaddr(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ adns_rr_hostaddr *rrp= datap;
+ adns_status st;
+
+ st= pap_hostaddr(pai, &cbyte, max, rrp);
+ if (st) return st;
+ if (cbyte != max) return adns_s_invaliddata;
+
+ return adns_s_ok;
+}
+
+static int dip_hostaddr(adns_state ads,
+ const adns_rr_hostaddr *ap, const adns_rr_hostaddr *bp) {
+ if (ap->astatus != bp->astatus) return ap->astatus;
+ if (ap->astatus) return 0;
+
+ return dip_sockaddr(ads, &ap->addrs[0].addr.sa, &bp->addrs[0].addr.sa);
+}
+
+static int di_hostaddr(adns_state ads,
+ const void *datap_a, const void *datap_b) {
+ const adns_rr_hostaddr *ap= datap_a, *bp= datap_b;
+
+ return dip_hostaddr(ads, ap,bp);
+}
+
+static void mfp_hostaddr(adns_query qu, adns_rr_hostaddr *rrp) {
+ void *tablev;
+ size_t addrsz= gsz_addr(0, qu->answer->type);
+
+ adns__makefinal_str(qu,&rrp->host);
+ tablev= rrp->addrs;
+ adns__makefinal_block(qu, &tablev, rrp->naddrs*addrsz);
+ rrp->addrs= tablev;
+}
+
+static void mf_hostaddr(adns_query qu, void *datap) {
+ adns_rr_hostaddr *rrp= datap;
+
+ mfp_hostaddr(qu,rrp);
+}
+
+static adns_status csp_hostaddr(vbuf *vb, const adns_rr_hostaddr *rrp) {
+ const char *errstr;
+ adns_status st;
+ char buf[20];
+ int i;
+
+ st= csp_domain(vb,rrp->host); if (st) return st;
+
+ CSP_ADDSTR(" ");
+ CSP_ADDSTR(adns_errtypeabbrev(rrp->astatus));
+
+ sprintf(buf," %d ",rrp->astatus);
+ CSP_ADDSTR(buf);
+
+ CSP_ADDSTR(adns_errabbrev(rrp->astatus));
+ CSP_ADDSTR(" ");
+
+ errstr= adns_strerror(rrp->astatus);
+ st= csp_qstring(vb,errstr,strlen(errstr)); if (st) return st;
+
+ if (rrp->naddrs >= 0) {
+ CSP_ADDSTR(" (");
+ for (i=0; i<rrp->naddrs; i++) {
+ CSP_ADDSTR(" ");
+ st= csp_addr(vb,&rrp->addrs[i]);
+ }
+ CSP_ADDSTR(" )");
+ } else {
+ CSP_ADDSTR(" ?");
+ }
+ return adns_s_ok;
+}
+
+static adns_status cs_hostaddr(vbuf *vb, const void *datap) {
+ const adns_rr_hostaddr *rrp= datap;
+
+ return csp_hostaddr(vb,rrp);
+}
+
+/*
+ * _mx_raw (pa,di)
+ */
+
+static adns_status pa_mx_raw(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ const byte *dgram= pai->dgram;
+ adns_rr_intstr *rrp= datap;
+ adns_status st;
+ int pref;
+
+ if (cbyte+2 > max) return adns_s_invaliddata;
+ GET_W(cbyte,pref);
+ rrp->i= pref;
+ st= pap_domain(pai, &cbyte, max, &rrp->str,
+ pai->qu->flags & adns_qf_quoteok_anshost ? pdf_quoteok : 0);
+ if (st) return st;
+
+ if (cbyte != max) return adns_s_invaliddata;
+ return adns_s_ok;
+}
+
+static int di_mx_raw(adns_state ads, const void *datap_a, const void *datap_b) {
+ const adns_rr_intstr *ap= datap_a, *bp= datap_b;
+
+ if (ap->i < bp->i) return 0;
+ if (ap->i > bp->i) return 1;
+ return 0;
+}
+
+/*
+ * _mx (pa,di)
+ */
+
+static adns_status pa_mx(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ const byte *dgram= pai->dgram;
+ adns_rr_inthostaddr *rrp= datap;
+ adns_status st;
+ int pref;
+
+ if (cbyte+2 > max) return adns_s_invaliddata;
+ GET_W(cbyte,pref);
+ rrp->i= pref;
+ st= pap_hostaddr(pai, &cbyte, max, &rrp->ha);
+ if (st) return st;
+
+ if (cbyte != max) return adns_s_invaliddata;
+ return adns_s_ok;
+}
+
+static int di_mx(adns_state ads, const void *datap_a, const void *datap_b) {
+ const adns_rr_inthostaddr *ap= datap_a, *bp= datap_b;
+
+ if (ap->i < bp->i) return 0;
+ if (ap->i > bp->i) return 1;
+ return dip_hostaddr(ads, &ap->ha, &bp->ha);
+}
+
+/*
+ * _inthostaddr (mf,cs)
+ */
+
+static void mf_inthostaddr(adns_query qu, void *datap) {
+ adns_rr_inthostaddr *rrp= datap;
+
+ mfp_hostaddr(qu,&rrp->ha);
+}
+
+static adns_status cs_inthostaddr(vbuf *vb, const void *datap) {
+ const adns_rr_inthostaddr *rrp= datap;
+ char buf[10];
+
+ sprintf(buf,"%u ",rrp->i);
+ CSP_ADDSTR(buf);
+
+ return csp_hostaddr(vb,&rrp->ha);
+}
+
+/*
+ * _inthost (cs)
+ */
+
+static adns_status cs_inthost(vbuf *vb, const void *datap) {
+ const adns_rr_intstr *rrp= datap;
+ char buf[10];
+
+ sprintf(buf,"%u ",rrp->i);
+ CSP_ADDSTR(buf);
+ return csp_domain(vb,rrp->str);
+}
+
+/*
+ * _ptr (ckl,pa +icb_ptr)
+ */
+
+static adns_status ckl_ptr(adns_state ads, adns_queryflags flags,
+ union checklabel_state *cls, qcontext *ctx,
+ int labnum, const char *dgram,
+ int labstart, int lablen) {
+ if (lablen) {
+ if (!adns__revparse_label(&cls->ptr, labnum, dgram,labstart,lablen))
+ return adns_s_querydomainwrong;
+ } else {
+ if (!adns__revparse_done(&cls->ptr, dgram, labnum,
+ &ctx->tinfo.ptr.rev_rrtype,
+ &ctx->tinfo.ptr.addr))
+ return adns_s_querydomainwrong;
+ }
+ return adns_s_ok;
+}
+
+static void icb_ptr(adns_query parent, adns_query child) {
+ adns_answer *cans= child->answer;
+ const adns_sockaddr *queried;
+ const unsigned char *found;
+ adns_state ads= parent->ads;
+ int i;
+
+ if (cans->status == adns_s_nxdomain || cans->status == adns_s_nodata) {
+ adns__query_fail(parent,adns_s_inconsistent);
+ return;
+ } else if (cans->status) {
+ adns__query_fail(parent,cans->status);
+ return;
+ }
+
+ queried= &parent->ctx.tinfo.ptr.addr;
+ for (i=0, found=cans->rrs.bytes; i<cans->nrrs; i++, found+=cans->rrsz) {
+ if (adns__addrs_equal_raw(&queried->sa,
+ parent->ctx.tinfo.ptr.addr.sa.sa_family,found)) {
+ if (!parent->children.head) {
+ adns__query_done(parent);
+ return;
+ } else {
+ LIST_LINK_TAIL(ads->childw,parent);
+ return;
+ }
+ }
+ }
+
+ adns__query_fail(parent,adns_s_inconsistent);
+}
+
+static adns_status pa_ptr(const parseinfo *pai, int dmstart,
+ int max, void *datap) {
+ char **rrp= datap;
+ adns_status st;
+ adns_rrtype rrtype= pai->qu->ctx.tinfo.ptr.rev_rrtype;
+ int cbyte, id;
+ adns_query nqu;
+ qcontext ctx;
+
+ cbyte= dmstart;
+ st= pap_domain(pai, &cbyte, max, rrp,
+ pai->qu->flags & adns_qf_quoteok_anshost ? pdf_quoteok : 0);
+ if (st) return st;
+ if (cbyte != max) return adns_s_invaliddata;
+
+ st= adns__mkquery_frdgram(pai->ads, &pai->qu->vb, &id,
+ pai->dgram, pai->dglen, dmstart,
+ rrtype, adns_qf_quoteok_query);
+ if (st) return st;
+
+ ctx.ext= 0;
+ ctx.callback= icb_ptr;
+ memset(&ctx.pinfo,0,sizeof(ctx.pinfo));
+ memset(&ctx.tinfo,0,sizeof(ctx.tinfo));
+ st= adns__internal_submit(pai->ads, &nqu, pai->qu,
+ adns__findtype(rrtype),
+ rrtype, &pai->qu->vb, id,
+ adns_qf_quoteok_query, pai->now, &ctx);
+ if (st) return st;
+
+ return adns_s_ok;
+}
+
+/*
+ * _strpair (mf)
+ */
+
+static void mf_strpair(adns_query qu, void *datap) {
+ adns_rr_strpair *rrp= datap;
+
+ adns__makefinal_str(qu,&rrp->array[0]);
+ adns__makefinal_str(qu,&rrp->array[1]);
+}
+
+/*
+ * _intstrpair (mf)
+ */
+
+static void mf_intstrpair(adns_query qu, void *datap) {
+ adns_rr_intstrpair *rrp= datap;
+
+ adns__makefinal_str(qu,&rrp->array[0].str);
+ adns__makefinal_str(qu,&rrp->array[1].str);
+}
+
+/*
+ * _hinfo (pa)
+ */
+
+static adns_status pa_hinfo(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ adns_rr_intstrpair *rrp= datap;
+ adns_status st;
+ int i;
+
+ for (i=0; i<2; i++) {
+ st= pap_qstring(pai, &cbyte, max, &rrp->array[i].i, &rrp->array[i].str);
+ if (st) return st;
+ }
+
+ if (cbyte != max) return adns_s_invaliddata;
+
+ return adns_s_ok;
+}
+
+/*
+ * _mailbox (pap,cs +pap_mailbox822)
+ */
+
+static adns_status pap_mailbox822(const parseinfo *pai,
+ int *cbyte_io, int max, char **mb_r) {
+ int lablen, labstart, i, needquote, c, r, neednorm;
+ const unsigned char *p;
+ char *str;
+ findlabel_state fls;
+ adns_status st;
+ vbuf *vb;
+
+ vb= &pai->qu->vb;
+ vb->used= 0;
+ adns__findlabel_start(&fls, pai->ads,
+ -1, pai->qu,
+ pai->dgram, pai->dglen, max,
+ *cbyte_io, cbyte_io);
+ st= adns__findlabel_next(&fls,&lablen,&labstart);
+ if (!lablen) {
+ adns__vbuf_appendstr(vb,".");
+ goto x_ok;
+ }
+
+ neednorm= 1;
+ for (i=0, needquote=0, p= pai->dgram+labstart; i<lablen; i++) {
+ c= *p++;
+ if ((c&~128) < 32 || (c&~128) == 127) return adns_s_invaliddata;
+ if (c == '.' && !neednorm) neednorm= 1;
+ else if (c==' ' || c>=127 || ctype_822special(c)) needquote++;
+ else neednorm= 0;
+ }
+
+ if (needquote || neednorm) {
+ r= adns__vbuf_ensure(vb, lablen+needquote+4); if (!r) R_NOMEM;
+ adns__vbuf_appendq(vb,"\"",1);
+ for (i=0, needquote=0, p= pai->dgram+labstart; i<lablen; i++, p++) {
+ c= *p;
+ if (c == '"' || c=='\\') adns__vbuf_appendq(vb,"\\",1);
+ adns__vbuf_appendq(vb,p,1);
+ }
+ adns__vbuf_appendq(vb,"\"",1);
+ } else {
+ r= adns__vbuf_append(vb, pai->dgram+labstart, lablen); if (!r) R_NOMEM;
+ }
+
+ r= adns__vbuf_appendstr(vb,"@"); if (!r) R_NOMEM;
+
+ st= adns__parse_domain_more(&fls,pai->ads, pai->qu,vb,0, pai->dgram);
+ if (st) return st;
+
+ x_ok:
+ str= adns__alloc_interim(pai->qu, vb->used+1); if (!str) R_NOMEM;
+ memcpy(str,vb->buf,vb->used);
+ str[vb->used]= 0;
+ *mb_r= str;
+ return adns_s_ok;
+}
+
+static adns_status pap_mailbox(const parseinfo *pai, int *cbyte_io, int max,
+ char **mb_r) {
+ if (pai->qu->typei->typekey & adns__qtf_mail822) {
+ return pap_mailbox822(pai, cbyte_io, max, mb_r);
+ } else {
+ return pap_domain(pai, cbyte_io, max, mb_r, pdf_quoteok);
+ }
+}
+
+static adns_status csp_mailbox(vbuf *vb, const char *mailbox) {
+ return csp_domain(vb,mailbox);
+}
+
+/*
+ * _rp (pa,cs)
+ */
+
+static adns_status pa_rp(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ adns_rr_strpair *rrp= datap;
+ adns_status st;
+
+ st= pap_mailbox(pai, &cbyte, max, &rrp->array[0]);
+ if (st) return st;
+
+ st= pap_domain(pai, &cbyte, max, &rrp->array[1], pdf_quoteok);
+ if (st) return st;
+
+ if (cbyte != max) return adns_s_invaliddata;
+ return adns_s_ok;
+}
+
+static adns_status cs_rp(vbuf *vb, const void *datap) {
+ const adns_rr_strpair *rrp= datap;
+ adns_status st;
+
+ st= csp_mailbox(vb,rrp->array[0]); if (st) return st;
+ CSP_ADDSTR(" ");
+ st= csp_domain(vb,rrp->array[1]); if (st) return st;
+
+ return adns_s_ok;
+}
+
+/*
+ * _soa (pa,mf,cs)
+ */
+
+static adns_status pa_soa(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ adns_rr_soa *rrp= datap;
+ const byte *dgram= pai->dgram;
+ adns_status st;
+ int msw, lsw, i;
+
+ st= pap_domain(pai, &cbyte, max, &rrp->mname,
+ pai->qu->flags & adns_qf_quoteok_anshost ? pdf_quoteok : 0);
+ if (st) return st;
+
+ st= pap_mailbox(pai, &cbyte, max, &rrp->rname);
+ if (st) return st;
+
+ if (cbyte+20 != max) return adns_s_invaliddata;
+
+ for (i=0; i<5; i++) {
+ GET_W(cbyte,msw);
+ GET_W(cbyte,lsw);
+ (&rrp->serial)[i]= (msw<<16) | lsw;
+ }
+
+ return adns_s_ok;
+}
+
+static void mf_soa(adns_query qu, void *datap) {
+ adns_rr_soa *rrp= datap;
+
+ adns__makefinal_str(qu,&rrp->mname);
+ adns__makefinal_str(qu,&rrp->rname);
+}
+
+static adns_status cs_soa(vbuf *vb, const void *datap) {
+ const adns_rr_soa *rrp= datap;
+ char buf[20];
+ int i;
+ adns_status st;
+
+ st= csp_domain(vb,rrp->mname); if (st) return st;
+ CSP_ADDSTR(" ");
+ st= csp_mailbox(vb,rrp->rname); if (st) return st;
+
+ for (i=0; i<5; i++) {
+ sprintf(buf," %lu",(&rrp->serial)[i]);
+ CSP_ADDSTR(buf);
+ }
+
+ return adns_s_ok;
+}
+
+/*
+ * _srv* (ckl,(pap),pa*2,mf*2,di,(csp),cs*2,postsort)
+ */
+
+static adns_status ckl_srv(adns_state ads, adns_queryflags flags,
+ union checklabel_state *cls, qcontext *ctx,
+ int labnum, const char *dgram,
+ int labstart, int lablen) {
+ const char *label = dgram+labstart;
+ if (labnum < 2) {
+ if (flags & adns_qf_quoteok_query) return adns_s_ok;
+ if (!lablen || label[0] != '_') return adns_s_querydomaininvalid;
+ return adns_s_ok;
+ }
+ return adns__ckl_hostname(ads,flags, cls,ctx, labnum, dgram,labstart,lablen);
+}
+
+static adns_status pap_srv_begin(const parseinfo *pai, int *cbyte_io, int max,
+ adns_rr_srvha *rrp
+ /* might be adns_rr_srvraw* */) {
+ const byte *dgram= pai->dgram;
+ int ti, cbyte;
+
+ cbyte= *cbyte_io;
+ if ((*cbyte_io += 6) > max) return adns_s_invaliddata;
+
+ rrp->priority= GET_W(cbyte, ti);
+ rrp->weight= GET_W(cbyte, ti);
+ rrp->port= GET_W(cbyte, ti);
+ return adns_s_ok;
+}
+
+static adns_status pa_srvraw(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ adns_rr_srvraw *rrp= datap;
+ adns_status st;
+
+ st= pap_srv_begin(pai,&cbyte,max,datap);
+ if (st) return st;
+
+ st= pap_domain(pai, &cbyte, max, &rrp->host,
+ pai->qu->flags & adns_qf_quoteok_anshost ? pdf_quoteok : 0);
+ if (st) return st;
+
+ if (cbyte != max) return adns_s_invaliddata;
+ return adns_s_ok;
+}
+
+static adns_status pa_srvha(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ adns_rr_srvha *rrp= datap;
+ adns_status st;
+
+ st= pap_srv_begin(pai,&cbyte,max,datap); if (st) return st;
+ st= pap_hostaddr(pai, &cbyte, max, &rrp->ha); if (st) return st;
+ if (cbyte != max) return adns_s_invaliddata;
+ return adns_s_ok;
+}
+
+static void mf_srvraw(adns_query qu, void *datap) {
+ adns_rr_srvraw *rrp= datap;
+ adns__makefinal_str(qu, &rrp->host);
+}
+
+static void mf_srvha(adns_query qu, void *datap) {
+ adns_rr_srvha *rrp= datap;
+ mfp_hostaddr(qu,&rrp->ha);
+}
+
+static int di_srv(adns_state ads, const void *datap_a, const void *datap_b) {
+ const adns_rr_srvraw *ap= datap_a, *bp= datap_b;
+ /* might be const adns_rr_svhostaddr* */
+
+ if (ap->priority < bp->priority) return 0;
+ if (ap->priority > bp->priority) return 1;
+ return 0;
+}
+
+static adns_status csp_srv_begin(vbuf *vb, const adns_rr_srvha *rrp
+ /* might be adns_rr_srvraw* */) {
+ char buf[30];
+ sprintf(buf,"%u %u %u ", rrp->priority, rrp->weight, rrp->port);
+ CSP_ADDSTR(buf);
+ return adns_s_ok;
+}
+
+static adns_status cs_srvraw(vbuf *vb, const void *datap) {
+ const adns_rr_srvraw *rrp= datap;
+ adns_status st;
+
+ st= csp_srv_begin(vb,(const void*)rrp); if (st) return st;
+ return csp_domain(vb,rrp->host);
+}
+
+static adns_status cs_srvha(vbuf *vb, const void *datap) {
+ const adns_rr_srvha *rrp= datap;
+ adns_status st;
+
+ st= csp_srv_begin(vb,(const void*)datap); if (st) return st;
+ return csp_hostaddr(vb,&rrp->ha);
+}
+
+static void postsort_srv(adns_state ads, void *array, int nrrs,int rrsz,
+ const struct typeinfo *typei) {
+ /* we treat everything in the array as if it were an adns_rr_srvha
+ * even though the array might be of adns_rr_srvraw. That's OK
+ * because they have the same prefix, which is all we access.
+ * We use rrsz, too, rather than naive array indexing, of course.
+ */
+ char *workbegin, *workend, *search, *arrayend;
+ const adns_rr_srvha *rr;
+ union { adns_rr_srvha ha; adns_rr_srvraw raw; } rrtmp;
+ int cpriority, totalweight, runtotal;
+ long randval;
+
+ assert(rrsz <= sizeof(rrtmp));
+ for (workbegin= array, arrayend= workbegin + rrsz * nrrs;
+ workbegin < arrayend;
+ workbegin= workend) {
+ cpriority= (rr=(void*)workbegin)->priority;
+
+ for (workend= workbegin, totalweight= 0;
+ workend < arrayend && (rr=(void*)workend)->priority == cpriority;
+ workend += rrsz) {
+ totalweight += rr->weight;
+ }
+
+ /* Now workbegin..(workend-1) incl. are exactly all of the RRs of
+ * cpriority. From now on, workbegin points to the `remaining'
+ * records: we select one record at a time (RFC2782 `Usage rules'
+ * and `Format of the SRV RR' subsection `Weight') to place at
+ * workbegin (swapping with the one that was there, and then
+ * advance workbegin. */
+ for (;
+ workbegin + rrsz < workend; /* don't bother if just one */
+ workbegin += rrsz) {
+
+ randval= nrand48(ads->rand48xsubi);
+ randval %= (totalweight + 1);
+ /* makes it into 0..totalweight inclusive; with 2^10 RRs,
+ * totalweight must be <= 2^26 so probability nonuniformity is
+ * no worse than 1 in 2^(31-26) ie 1 in 2^5, ie
+ * abs(log(P_intended(RR_i) / P_actual(RR_i)) <= log(2^-5).
+ */
+
+ for (search=workbegin, runtotal=0;
+ (runtotal += (rr=(void*)search)->weight) < randval;
+ search += rrsz);
+ assert(search < arrayend);
+ totalweight -= rr->weight;
+ if (search != workbegin) {
+ memcpy(&rrtmp, workbegin, rrsz);
+ memcpy(workbegin, search, rrsz);
+ memcpy(search, &rrtmp, rrsz);
+ }
+ }
+ }
+ /* tests:
+ * dig -t srv _srv._tcp.test.iwj.relativity.greenend.org.uk.
+ * ./adnshost_s -t srv- _sip._udp.voip.net.cam.ac.uk.
+ * ./adnshost_s -t srv- _jabber._tcp.jabber.org
+ */
+}
+
+/*
+ * _byteblock (mf)
+ */
+
+static void mf_byteblock(adns_query qu, void *datap) {
+ adns_rr_byteblock *rrp= datap;
+ void *bytes= rrp->data;
+ adns__makefinal_block(qu,&bytes,rrp->len);
+ rrp->data= bytes;
+}
+
+/*
+ * _opaque (pa,cs)
+ */
+
+static adns_status pa_opaque(const parseinfo *pai, int cbyte,
+ int max, void *datap) {
+ adns_rr_byteblock *rrp= datap;
+
+ rrp->len= max - cbyte;
+ rrp->data= adns__alloc_interim(pai->qu, rrp->len);
+ if (!rrp->data) R_NOMEM;
+ memcpy(rrp->data, pai->dgram + cbyte, rrp->len);
+ return adns_s_ok;
+}
+
+static adns_status cs_opaque(vbuf *vb, const void *datap) {
+ const adns_rr_byteblock *rrp= datap;
+ char buf[10];
+ int l;
+ unsigned char *p;
+
+ sprintf(buf,"\\# %d",rrp->len);
+ CSP_ADDSTR(buf);
+
+ for (l= rrp->len, p= rrp->data;
+ l>=4;
+ l -= 4, p += 4) {
+ sprintf(buf," %02x%02x%02x%02x",p[0],p[1],p[2],p[3]);
+ CSP_ADDSTR(buf);
+ }
+ for (;
+ l>0;
+ l--, p++) {
+ sprintf(buf," %02x",*p);
+ CSP_ADDSTR(buf);
+ }
+ return adns_s_ok;
+}
+
+/*
+ * _flat (mf)
+ */
+
+static void mf_flat(adns_query qu, void *data) { }
+
+/*
+ * Now the table.
+ */
+
+#define TYPESZ_M(member) (sizeof(*((adns_answer*)0)->rrs.member))
+
+#define DEEP_TYPE(code,rrt,fmt,memb,parser,comparer,/*printer*/...) \
+ { adns_r_##code&adns_rrt_reprmask, rrt,fmt,TYPESZ_M(memb), mf_##memb, \
+ GLUE(cs_, CAR(__VA_ARGS__)),pa_##parser,di_##comparer, \
+ adns__ckl_hostname, 0, adns__getrrsz_default, adns__query_send, \
+ CDR(__VA_ARGS__) }
+#define FLAT_TYPE(code,rrt,fmt,memb,parser,comparer,/*printer*/...) \
+ { adns_r_##code&adns_rrt_reprmask, rrt,fmt,TYPESZ_M(memb), mf_flat, \
+ GLUE(cs_, CAR(__VA_ARGS__)),pa_##parser,di_##comparer, \
+ adns__ckl_hostname, 0, adns__getrrsz_default, adns__query_send, \
+ CDR(__VA_ARGS__) }
+
+#define di_0 0
+
+static const typeinfo typeinfos[] = {
+/* Must be in ascending order of rrtype ! */
+/* mem-mgmt code rrt fmt member parser comparer printer */
+
+FLAT_TYPE(a, "A", 0, inaddr, inaddr, inaddr,inaddr ),
+DEEP_TYPE(ns_raw, "NS", "raw",str, host_raw,0, domain ),
+DEEP_TYPE(cname, "CNAME", 0, str, dom_raw, 0, domain ),
+DEEP_TYPE(soa_raw,"SOA", "raw",soa, soa, 0, soa ),
+DEEP_TYPE(ptr_raw,"PTR", "raw",str, host_raw,0, domain ),
+DEEP_TYPE(hinfo, "HINFO", 0, intstrpair,hinfo, 0, hinfo ),
+DEEP_TYPE(mx_raw, "MX", "raw",intstr, mx_raw, mx_raw,inthost ),
+DEEP_TYPE(txt, "TXT", 0, manyistr, txt, 0, txt ),
+DEEP_TYPE(rp_raw, "RP", "raw",strpair, rp, 0, rp ),
+FLAT_TYPE(aaaa, "AAAA", 0, in6addr, in6addr, in6addr,in6addr ),
+DEEP_TYPE(srv_raw,"SRV", "raw",srvraw , srvraw, srv, srvraw,
+ .checklabel= ckl_srv, .postsort= postsort_srv),
+
+FLAT_TYPE(addr, "A", "addr", addr, addr, addr, addr,
+ .getrrsz= gsz_addr, .query_send= qs_addr),
+DEEP_TYPE(ns, "NS", "+addr",hostaddr, hostaddr,hostaddr,hostaddr ),
+DEEP_TYPE(ptr, "PTR","checked",str, ptr, 0, domain,
+ .checklabel= ckl_ptr),
+DEEP_TYPE(mx, "MX", "+addr",inthostaddr,mx, mx, inthostaddr, ),
+DEEP_TYPE(srv, "SRV","+addr",srvha, srvha, srv, srvha,
+ .checklabel= ckl_srv, .postsort= postsort_srv),
+
+DEEP_TYPE(soa, "SOA","822", soa, soa, 0, soa ),
+DEEP_TYPE(rp, "RP", "822", strpair, rp, 0, rp ),
+};
+
+static const typeinfo tinfo_addrsub =
+FLAT_TYPE(none, "<addr>","sub",addr, addr, 0, addr,
+ .getrrsz= gsz_addr);
+
+static const typeinfo typeinfo_unknown=
+DEEP_TYPE(unknown,0, "unknown",byteblock,opaque, 0, opaque );
+
+const typeinfo *adns__findtype(adns_rrtype type) {
+ const typeinfo *begin, *end, *mid;
+
+ if (type & ~(adns_rrtype)0x63ffffff)
+ /* 0x60000000 is reserved for `harmless' future expansion */
+ return 0;
+
+ if (type & adns_r_unknown) return &typeinfo_unknown;
+ type &= adns_rrt_reprmask;
+
+ begin= typeinfos; end= typeinfos+(sizeof(typeinfos)/sizeof(typeinfo));
+
+ while (begin < end) {
+ mid= begin + ((end-begin)>>1);
+ if (mid->typekey == type) return mid;
+ if (type > mid->typekey) begin= mid+1;
+ else end= mid;
+ }
+ return 0;
+}