chiark / gitweb /
+ * Documentation improved somewhat, including new GPL-vs-LGPL file.
authorian <ian>
Sun, 17 Sep 2000 00:45:54 +0000 (00:45 +0000)
committerian <ian>
Sun, 17 Sep 2000 00:45:54 +0000 (00:45 +0000)
@@ -10,7 +10,7 @@
   * adnsresfilter has --debug option.
   * Improvements to adnslogres (incl. new -c option) from Tony Finch.
   * adnslogres has --help option.
-  * Documentation improved somewhat.
+  * Documentation improved somewhat, including new GPL-vs-LGPL file.
   * Do not install adnstest test utility.

   Regression test improvements:

264 files changed:
GPL-vs-LGPL
INSTALL
Makefile.in
README
README.html [new file with mode: 0644]
TODO [new file with mode: 0644]
acconfig.h
aclocal.m4
changelog
client/.cvsignore
client/Makefile.in
client/adh-main.c [new file with mode: 0644]
client/adh-opts.c [new file with mode: 0644]
client/adh-query.c [new file with mode: 0644]
client/adnshost.h [new file with mode: 0644]
client/adnslogres.c [new file with mode: 0644]
client/adnsresfilter.c [new file with mode: 0644]
client/adnstest.c
client/fanftest.c [new file with mode: 0644]
client/x.gdb [new file with mode: 0644]
configure
configure.in
dynamic/Makefile.in
install-sh [new file with mode: 0755]
regress/.cvsignore
regress/Makefile.in
regress/addcases
regress/adnshost-xinitflags.text [new file with mode: 0644]
regress/adnslogres-xinitflags.text [new file with mode: 0644]
regress/adnsresfilter-xinitflags.text [new file with mode: 0644]
regress/case-1stservbroken.err [new file with mode: 0644]
regress/case-1stservbroken.out [new file with mode: 0644]
regress/case-1stservbroken.sys [new file with mode: 0644]
regress/case-1stservtotcp.err [new file with mode: 0644]
regress/case-1stservtotcp.out [new file with mode: 0644]
regress/case-1stservtotcp.sys [new file with mode: 0644]
regress/case-2ndservok.err [new file with mode: 0644]
regress/case-2ndservok.out [new file with mode: 0644]
regress/case-2ndservok.sys [new file with mode: 0644]
regress/case-2ndservtcp.err [new file with mode: 0644]
regress/case-2ndservtcp.out [new file with mode: 0644]
regress/case-2ndservtcp.sys [new file with mode: 0644]
regress/case-abbrev.err [new file with mode: 0644]
regress/case-abbrev.out [new file with mode: 0644]
regress/case-abbrev.sys [new file with mode: 0644]
regress/case-abbrevto.err [new file with mode: 0644]
regress/case-abbrevto.out [new file with mode: 0644]
regress/case-abbrevto.sys [new file with mode: 0644]
regress/case-adh-cancel.err [new file with mode: 0644]
regress/case-adh-cancel.out [new file with mode: 0644]
regress/case-adh-cancel.sys [new file with mode: 0644]
regress/case-adh-cancel2.err [new file with mode: 0644]
regress/case-adh-cancel2.out [new file with mode: 0644]
regress/case-adh-cancel2.sys [new file with mode: 0644]
regress/case-adh-cancel3.err [new file with mode: 0644]
regress/case-adh-cancel3.out [new file with mode: 0644]
regress/case-adh-cancel3.sys [new file with mode: 0644]
regress/case-adh-norm.err [new file with mode: 0644]
regress/case-adh-norm.out [new file with mode: 0644]
regress/case-adh-norm.sys [new file with mode: 0644]
regress/case-adh-pipe.err [new file with mode: 0644]
regress/case-adh-pipe.out [new file with mode: 0644]
regress/case-adh-pipe.sys [new file with mode: 0644]
regress/case-alr-norm.err [new file with mode: 0644]
regress/case-alr-norm.in [new file with mode: 0644]
regress/case-alr-norm.out [new file with mode: 0644]
regress/case-alr-norm.sys [new file with mode: 0644]
regress/case-alr-slow.err [new file with mode: 0644]
regress/case-alr-slow.in [new file with mode: 0644]
regress/case-alr-slow.out [new file with mode: 0644]
regress/case-alr-slow.sys [new file with mode: 0644]
regress/case-arf-norm.err [new file with mode: 0644]
regress/case-arf-norm.out [new file with mode: 0644]
regress/case-arf-norm.sys [new file with mode: 0644]
regress/case-arf-text.err [new file with mode: 0644]
regress/case-arf-text.out [new file with mode: 0644]
regress/case-arf-text.sys [new file with mode: 0644]
regress/case-brokenmail.err [new file with mode: 0644]
regress/case-brokenmail.out [new file with mode: 0644]
regress/case-brokenmail.sys [new file with mode: 0644]
regress/case-child.err [new file with mode: 0644]
regress/case-child.out [new file with mode: 0644]
regress/case-child.sys [new file with mode: 0644]
regress/case-cnametocname.err [new file with mode: 0644]
regress/case-cnametocname.out [new file with mode: 0644]
regress/case-cnametocname.sys [new file with mode: 0644]
regress/case-comprinf.err [new file with mode: 0644]
regress/case-comprinf.out [new file with mode: 0644]
regress/case-comprinf.sys [new file with mode: 0644]
regress/case-datapluscname.err [new file with mode: 0644]
regress/case-datapluscname.out [new file with mode: 0644]
regress/case-datapluscname.sys [new file with mode: 0644]
regress/case-datapluscnamewait.err [new file with mode: 0644]
regress/case-datapluscnamewait.out [new file with mode: 0644]
regress/case-datapluscnamewait.sys [new file with mode: 0644]
regress/case-flags10.err [new file with mode: 0644]
regress/case-flags10.out [new file with mode: 0644]
regress/case-flags10.sys [new file with mode: 0644]
regress/case-flags9.err [new file with mode: 0644]
regress/case-flags9.out [new file with mode: 0644]
regress/case-flags9.sys [new file with mode: 0644]
regress/case-formerr.err [new file with mode: 0644]
regress/case-formerr.out [new file with mode: 0644]
regress/case-formerr.sys [new file with mode: 0644]
regress/case-lockup.err [new file with mode: 0644]
regress/case-lockup.out [new file with mode: 0644]
regress/case-lockup.sys [new file with mode: 0644]
regress/case-longdom0.err [new file with mode: 0644]
regress/case-longdom0.out [new file with mode: 0644]
regress/case-longdom0.sys [new file with mode: 0644]
regress/case-longdom1.err [new file with mode: 0644]
regress/case-longdom1.out [new file with mode: 0644]
regress/case-longdom1.sys [new file with mode: 0644]
regress/case-longdomsrch0.err [new file with mode: 0644]
regress/case-longdomsrch0.out [new file with mode: 0644]
regress/case-longdomsrch0.sys [new file with mode: 0644]
regress/case-longdomsrch1.err [new file with mode: 0644]
regress/case-longdomsrch1.out [new file with mode: 0644]
regress/case-longdomsrch1.sys [new file with mode: 0644]
regress/case-longdomsrch1b.err [new file with mode: 0644]
regress/case-longdomsrch1b.out [new file with mode: 0644]
regress/case-longdomsrch1b.sys [new file with mode: 0644]
regress/case-longdomsrch2.err [new file with mode: 0644]
regress/case-longdomsrch2.out [new file with mode: 0644]
regress/case-longdomsrch2.sys [new file with mode: 0644]
regress/case-longlab0.err [new file with mode: 0644]
regress/case-longlab0.out [new file with mode: 0644]
regress/case-longlab0.sys [new file with mode: 0644]
regress/case-longlab1.err [new file with mode: 0644]
regress/case-longlab1.out [new file with mode: 0644]
regress/case-longlab1.sys [new file with mode: 0644]
regress/case-mailboxes.out
regress/case-mailboxes.sys
regress/case-manya.sys
regress/case-manyptrwrong.err [new file with mode: 0644]
regress/case-manyptrwrong.out [new file with mode: 0644]
regress/case-manyptrwrong.sys [new file with mode: 0644]
regress/case-manyptrwrongrem.err [new file with mode: 0644]
regress/case-manyptrwrongrem.out [new file with mode: 0644]
regress/case-manyptrwrongrem.sys [new file with mode: 0644]
regress/case-manyptrwrongrst.err [new file with mode: 0644]
regress/case-manyptrwrongrst.out [new file with mode: 0644]
regress/case-manyptrwrongrst.sys [new file with mode: 0644]
regress/case-manyptrwrongrty.err [new file with mode: 0644]
regress/case-manyptrwrongrty.out [new file with mode: 0644]
regress/case-manyptrwrongrty.sys [new file with mode: 0644]
regress/case-ndots-as.err [new file with mode: 0644]
regress/case-ndots-as.out [new file with mode: 0644]
regress/case-ndots-as.sys [new file with mode: 0644]
regress/case-ndots.sys
regress/case-ndotsbad.err
regress/case-ndotsbad.sys
regress/case-noinfto.err [new file with mode: 0644]
regress/case-noinfto.out [new file with mode: 0644]
regress/case-noinfto.sys [new file with mode: 0644]
regress/case-norecurse.err [new file with mode: 0644]
regress/case-norecurse.out [new file with mode: 0644]
regress/case-norecurse.sys [new file with mode: 0644]
regress/case-norecurse2.err [new file with mode: 0644]
regress/case-norecurse2.out [new file with mode: 0644]
regress/case-norecurse2.sys [new file with mode: 0644]
regress/case-norecurse3.err [new file with mode: 0644]
regress/case-norecurse3.out [new file with mode: 0644]
regress/case-norecurse3.sys [new file with mode: 0644]
regress/case-norm.sys
regress/case-owner.out
regress/case-owner.sys
regress/case-poll.err [new file with mode: 0644]
regress/case-poll.out [new file with mode: 0644]
regress/case-poll.sys [new file with mode: 0644]
regress/case-polltimeout.err [new file with mode: 0644]
regress/case-polltimeout.out [new file with mode: 0644]
regress/case-polltimeout.sys [new file with mode: 0644]
regress/case-ptrbaddom.err [new file with mode: 0644]
regress/case-ptrbaddom.out [new file with mode: 0644]
regress/case-ptrbaddom.sys [new file with mode: 0644]
regress/case-quote.err [new file with mode: 0644]
regress/case-quote.out [new file with mode: 0644]
regress/case-quote.sys [new file with mode: 0644]
regress/case-rootquery.out
regress/case-rootquery.sys
regress/case-rootqueryall-as.err [new file with mode: 0644]
regress/case-rootqueryall-as.out [new file with mode: 0644]
regress/case-rootqueryall-as.sys [new file with mode: 0644]
regress/case-rootqueryall.out
regress/case-rootqueryall.sys
regress/case-search-as.err [new file with mode: 0644]
regress/case-search-as.out [new file with mode: 0644]
regress/case-search-as.sys [new file with mode: 0644]
regress/case-search.sys
regress/case-searchabs.sys
regress/case-sillyrp.err [new file with mode: 0644]
regress/case-sillyrp.out [new file with mode: 0644]
regress/case-sillyrp.sys [new file with mode: 0644]
regress/case-tcpallfail.err [new file with mode: 0644]
regress/case-tcpallfail.out [new file with mode: 0644]
regress/case-tcpallfail.sys [new file with mode: 0644]
regress/case-tcpblock.err [new file with mode: 0644]
regress/case-tcpblock.out [new file with mode: 0644]
regress/case-tcpblock.sys [new file with mode: 0644]
regress/case-tcpblockbrk.err [new file with mode: 0644]
regress/case-tcpblockbrk.out [new file with mode: 0644]
regress/case-tcpblockbrk.sys [new file with mode: 0644]
regress/case-tcpblockwr.err [new file with mode: 0644]
regress/case-tcpblockwr.out [new file with mode: 0644]
regress/case-tcpblockwr.sys [new file with mode: 0644]
regress/case-tcpbreakin.err [new file with mode: 0644]
regress/case-tcpbreakin.out [new file with mode: 0644]
regress/case-tcpbreakin.sys [new file with mode: 0644]
regress/case-tcpmultipart.err [new file with mode: 0644]
regress/case-tcpmultipart.out [new file with mode: 0644]
regress/case-tcpmultipart.sys [new file with mode: 0644]
regress/case-tcpptr.err [new file with mode: 0644]
regress/case-tcpptr.out [new file with mode: 0644]
regress/case-tcpptr.sys [new file with mode: 0644]
regress/case-timeout.sys
regress/case-trunc.sys
regress/case-unknownq.err [new file with mode: 0644]
regress/case-unknownq.out [new file with mode: 0644]
regress/case-unknownq.sys [new file with mode: 0644]
regress/checkall
regress/harness.h [new file with mode: 0644]
regress/harness.h.m4
regress/hcommon.c [new file with mode: 0644]
regress/hcommon.c.m4
regress/hmacros.i4
regress/hplayback.c [new file with mode: 0644]
regress/hplayback.c.m4
regress/hrecord.c [new file with mode: 0644]
regress/hrecord.c.m4
regress/hredirect.h [new file with mode: 0644]
regress/hredirect.h.m4 [new file with mode: 0644]
regress/hsyscalls.h [new file with mode: 0644]
regress/hsyscalls.h.m4 [new file with mode: 0644]
regress/hsyscalls.i4
regress/init-1stservbroken.text [new file with mode: 0644]
regress/init-1stservto.text [new file with mode: 0644]
regress/init-2ndserver.text [new file with mode: 0644]
regress/init-anarres.text [new file with mode: 0644]
regress/init-manyptrwrong.text [new file with mode: 0644]
regress/init-ncipher.text [new file with mode: 0644]
regress/init-ndots100.text [new file with mode: 0644]
regress/init-tunnel.text [new file with mode: 0644]
regress/junk [deleted file]
regress/m1test
regress/r1test
settings.make.in
src/Makefile.in
src/adns.h
src/adns.make
src/check.c [new file with mode: 0644]
src/config.h.in
src/dlist.h [new file with mode: 0644]
src/event.c
src/general.c
src/internal.h
src/parse.c
src/poll.c [new file with mode: 0644]
src/query.c
src/reply.c
src/setup.c
src/transmit.c
src/tvarith.h [new file with mode: 0644]
src/types.c

index 62672f6..00c37b3 100644 (file)
@@ -1,17 +1,7 @@
-NB that NO VERSIONS of this file from this branch have been released,
-and I do not intend yet to publish this version.  If you get an old
-version of this file from my CVS repository definitely do not intend
-the licence exceptions in it to apply - these too were drafts, as you
-should know if you know what retreiving old CVS versions means !
-
-  - Ian Jackson, 9th March 2004.
-
-DRAFT - DRAFT - DRAFT - DRAFT - DRAFT - DRAFT - DRAFT - DRAFT - DRAFT
-
               GPL vs LGPL, in the context of adns
               -----------------------------------
 
-Several people have asked me to release adns under the GNU Lesser
+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
@@ -21,35 +11,34 @@ Typically there are two or three kinds of situation where people make
 this request: the first 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.  The second case is where a free software
-project is currently using an MIT-like licence and fear `GPL
-infection'.  The third case, which often overlaps with the second, is
-where another free software project currently using a GPL-incompatible
-licence, wishes to use adns.
+project is currently using an MIT-like licence or the LGPL and fear
+`GPL infection'.  The third case, which often overlaps with the
+second, is where another free software project currently using a
+GPL-incompatible licence, wishes to use adns.
 
 
 1. Proprietary applications of adns
 -----------------------------------
 
-This section applies if you are developing a proprietary program, by
-which I mean that you will not be distributing source code and not
-allowing users to modify and share your software; in most cases you
-will be doing this for (personal or corporate) financial gain.
+So, let me get this straight.  You're writing a proprietary
+program, by which I mean that you will not be distributing source code
+and not allowing users to modify and share your software; most likely
+you are doing this for your own (personal or corporate) financial
+gain.
 
-In these cases I may be prepared to issue you a special `LGPL' for
-adns (ie, allow you to use adns in your application according to the
-terms of the LGPL).  I will of course expect a significant licensing
-fee.
+However, you want to take advantage of adns, software which I have
+spent my time and effort on, and which I release as free software so
+that everyone can improve, share and use it.
 
-If you are interested I would be happy to negotiate with you.  Please
-contact me with your serious initial offer, or if alternatively we can
-first discuss your detailed requirements.
+Don't you think that is a little hypocritical ?  I'm sorry, but I
+don't want you to just take my nice convenient software, without
+giving something back to the free software community or giving the
+same rights to your users as I do to you.
 
-The fee for proprietary applications of adns without prior approval is
-US$1,000,000 per annum (or part thereof), per proprietary product, per
-100,000 installed systems (or part thereof), plus any administration,
-collection and legal fees required to recover the licence fee.  Of
-course, this does not apply to commercial Free software applications
-whose use of adns is compatible with the GNU GPL v2.
+If you really aren't the nasty kind of person I've described here, for
+example if you have a good reason other than your own selfishness for
+wanting to restrict distribution of your program, then perhaps you
+should contact me to discuss it.
 
 
 2. GPL-avoiding projects (MIT licence, et al)
@@ -58,39 +47,53 @@ whose use of adns is compatible with the GNU GPL v2.
 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.  I have to say that I don't understand why they do
-this, and think they are misguided, but that doesn't mean that they
-don't have a perfect right to.
+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 software to refer
-to adns in its source code or executables (eg, dynamic linking).
-However, if you distribute adns yourself then whether a program which
-uses it needs also to be GPL'd depends on the interpretation of the
-`work as a whole' and `mere aggregation' parts of the GPL.
-
-Whether you are distributing a `work as a whole' might depend on many
-things, but they key one to me is what the appearance is to a user.
-If the user knows that they are getting a collection of software
-rather than a single product, then it's probably an aggregation which
-works together.  So, you can distribute both your (i) non-GPLd program
-source and/or binaries and (ii) adns source code or even binaries
-(provided the adns source is available as per the GPL), eg from your
-website, provided the user can tell that these are separate works and
-can tell which parts are which.
-
-But, if you package your program and adns together so that the user is
-no longer aware of adns as a separate work, then I think you are
-distributing a `work as a whole', and the whole work including adns
-and your software which depends on it must be GPL'd.  This is of
-course not a problem if your non-GPL licence is GPL-compatible (see
-the next section): it just means that _when the whole lot is shipped
-together as one work_ it is covered by the GPL.  People who wish to
-make proprietary works based on just your code can do so, provided
-they (or you) arrange for something to fill the hole left by the lack
-of adns.
+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
 
 
 3. GPL-incompatible free software licences
@@ -99,330 +102,20 @@ of adns.
 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 such a
-program and a GPL'd program is not possible: either the work would
-have to be distributed under the GPL (violating the restrictions made
-by the original author), or under the GPL-incompatible licence
+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 prefer it if you
-could use a GPL-compatible licence for your project instead.
-
-There are a couple of common extra restrictions, and I make some
-specific extensions to my licence for adns below.
-
-
-3.1. BSD advertising clause, endorsement restriction, etc.
-
-The most notable and common extra restriction found in free software
-licences is the `obnoxious BSD advertising clause' (see Richard
-Stallman's article on the subject, available from www.gnu.org) and the
-endorsement restriction.
-
-The problem with the advertising clause isn't that the sentence
-required, referring the the Regents of the UC Berkeley, is awkward.
-The problem is that if everyone contributing to a large project gets
-such a mention the number of sentences required becomes very large;
-however, it is unfair for some people to get credit and others not to.
-
-I disapprove of these clause, but I recognise that it may be difficult
-for some people to get them removed from particular programs.  The
-other clauses are also arguable.
-
-
-3.2. `Hosting service' restriction (eg, Affero GPL)
-
-The additional restriction in the AGPL v1 (section 2d) seems
-reasonable to me, in the circumstances.
-
-
-3.3. Licence extension
-
-So, I hereby make an extension to my licence for adns (`the Original
-Work' in the text below).
-
-
- LICENCE DEROGATION
- ------------------
-
- (A) Introduction:
-
-  (i)    The GNU GPL version 2, section 2b, and the later parts of
-        section 2, require that certain works be licenced to all
-        third parties under the terms of the GPL.
-
-  (ii)  As special relaxations of this requirement, described in
-        detail below, the terms of this onward licence to third
-        parties need not be (though they may be) exactly the terms of
-        the GPLv2.
-
- (B) Preconditions:
-
-  (i)    There is a work (the `Original Work') which is licensed under
-         the GNU GPL v2.
-
-  (ii)   There is a work (the `GPL'd Work'), either the same work as
-         the Original Work, or derived work of the Original Work,
-         which is licensed uner the GNU GPL v2.
-
-  (iii)  All of the copyright holders of the GPL'd Work state that
-         this Licence Derogation is to apply, and what the Original
-        Work is.  (They may limit the Derogation to only some of the
-         Allowable Extra Provisions.)
-
-  (iv)   The GPL'd Work is combined with another work (the Other
-         Work) to make a `work as a whole', the Combined Work.
-
-  (x)    The Other Work is licenced free of charge to third parties;
-        under the terms of a licence henceforth known as the Other
-        Licence.
-
-  (xi)   The Other Licence is Free.
-
-  (v)    It would be an infringement of the copyright in the Other
-         Work for you to distribute the Combined Work under the terms
-        of the GNU GPL v2.
-
-  (vi)   There is a Resulting Licence which is the GNU GPL v2 amended
-        by the addition of Extra Provisions and the relevant
-        conditions from this Licence Derogation, where
-
-  (viii) the Extra Provisions are some or all of the Allowable Extra
-         Provisions (see below), and
-
-  (x)    the Extra Provisions are provisions of the Other Licence.
-
-
- (C) Permission:
-
-  (i)    Provided that the the conditions in this Licence Derogation
-         are met, you may distribute the Combined Work under the terms
-         of the Resulting Licence.
-
-  (ii)   When the Combined Work is distributed under the terms of the
-         Resulting Licence, references to `this licence' in the text
-         of the GPL v2 may be read as references to the Resulting
-         Licence, or as references to the GPL v2, at your option.
-
- (D) Further Conditions:
-
-  (i)    All parts of the Combined Work which are (identical to, parts
-        of, or derived from) the GPL'd Work can be easily separated
-        out from the Whole Work's source code to form once more a
-         Re-separated Work.
-
-  (ii)   The Re-separated Work is a version of the Original Work which
-        is similar or superior in all respects (including
-        completeness, functionality, quality etc.) to the Original
-        Work.
-
-  (iii)  The Re-separated Work is licensed to third parties under
-        terms identical to those under which the GPL'd Work is
-        licenced to those same third parties.
-
-  (iv)   Copyright licences and notices which would appear to the
-         reader to cover the Combined Work contain the following
-        statement or an equivalent:
-          Different parts of this software may be covered by
-          different copying conditions.  See individual source code
-          files or copyright statements for details.
-
-
- (E) The Allowable Extra Provision Kinds:
-
-   (i)   In each of the following Kinds (`(1)' onwards), the nature of
-         the Extra Provisions which are made Allowable, and the
-         further conditions which must be satisfied (and which
-         therefore form part of the Resulting Licence) are stated.
-
-   (ii)  All of the paragraphs (`(i)' onwards) stated in each Kind
-         must be satisfied, for Extra Provisions to be Allowable.
-
-  (1) `Obnoxious advertising clause':
-  
-   (i)   The Extra Provisions are those of the form:
-           All advertising materials mentioning features or use of
-           this software must display the following acknowledgement:
-             This product includes software developed by DEVELOPERS.
-        and re-wordings with similar effect, where DEVELOPERS is a
-        person or group associated with the development of the Other
-        Work.
-
-   (ii)  All advertising materials mentioning features or use of the
-        Combined Work must display a similar acknowledgement for
-        every Identifiable Author.
-
-   (iii) All distributions of the Combined Work must contain a list of
-        the Identifiable Authors.       
-
-  (2) `Endorsement restriction':
-
-   (i)   The Extra Provisions are ones which restrict the use of the 
-         authors', copyright holders' and/or contributors' names for
-         endorsement or promotion of products.
-
-   (ii)  The endorsement restriction(s) must benefit all of the
-         natural persons and organisations with an interest in the
-         Whole Work, unless those people wish otherwise.
-
-  (3) `Liability limitation':
-
-   (i)          The Extra Provisions are ones which claim to exclude or limit
-        in any way the liability, for malfunctions, failures etc. of
-        the Whole Work or parts thereof, of any contributors,
-        distributors, copyright holders, authors, etc. of the
-        software.  Provisions which seek to deny warranties, even
-        implied warranties, or which otherwise seek to limit similar 
-        exposure(s) to risk(s), count.
-
-   (ii)         The protections of the Extra Provisions must be extended to
-        all of the authors and distributors of the Whole Work, unless
-        those people wish otherwise.
-
-
-  (4) `Pointless restatements':
-
-   (i)  The Extra Provisions are ones which require distributions of
-        the Whole Work to contain notices in source and/or binary
-        distributions, and/or in the documentation and/or other
-        materials provided with the distributions.
-
-   (ii)         The required notices must be simple truths, or restatements
-        of licence provisions which actually apply to the Combined
-        Work.
-
-   (iii) (The author of this Licence Derogation believes that
-        `pointless restatement requirements' are compatible with the
-        GPLv2, since they seem to fall under the heading of an
-        `appropriate copyright notice and disclaimer of warranty',
-        which is already required by the GPLv2.  However, this
-        relaxation is provided in case of doubt.)
-
-
-  (5) `Service provision - source code to users' (eg AGPL):
-
-   (i)   The Extra Provisions apply only
-        (a) when the Other Work or Combined Work is intended to
-            interact with people (`Users') through a computer network,
-            or
-        (b) when the Other Work or Combined Work is executed on behalf
-            of a third party (the `User'),
-         (or when both (a) and (b) apply).
-
-   (ii)  There exists a Sensible Publication Mechanism such that the
-         Extra Provisions are satisfied when:
-        (a) the Combined Work is made available free of charge to the
-            public, by that Sensible Publication Mechanism, and
-        (b) the existence and details of the Sensible Publication
-            Mechanism are made known in appropriate ways to each
-            User.
-
-   (iii) A Sensible Publication Mechanism is a reasonable and
-         convenient means for allowing members of the public
-         (`Downloaders') to obtain the source code in machine-readable
-         form.
-
-   (iv)  A Sensible Publication Mechanism is not more onerous to
-         provide than a public-facing World Wide Web server.
-
-
- (F) Additional definitions:
-
-  (i)    A Free software licence is one which is approved both
-        (a) as a Free Software licence by the Free Software
-           Foundation, and
-        (b) as an Open Source Licence by the Open Source Initiative.
-
-  (ii)   A Combining Participant includes any person:
-        (a) who makes a modification to the Other Work, which is
-            now included in the Combined Work, with a view to the
-            creation of any work which might be a Combined Work
-            according to this Licence Derogation; or
-        (b) who obtains the Other Work and GPL'd work separately and
-            distributes the Combined Work.
-
-  (iii)  An Identifiable Author is
-        (a) a natural person
-        (b) who contributed to the Combined Work (including without
-            limitation as a work for hire)
-        (c) whose identity or proper form of acknowledgement it
-           reasonably practical to determine by inspection of the
-           Authorship Documentation,
-        (d) and who has not stated publicly that they do not wish such
-           acknowledgements to be displayed.
-
-  (iv)   The Authorship Documentation includes all copyright notices,
-         authorship notices, credits files, change logs,
-         acknowledgements, and similar documentation, in the source
-         code for the Original Work, the GPL'd Work, the Other Work
-        and the Combined Work.
-
-  (v)    The Authorship Documentation also includes any communications
-         received by a Combining Participant regarding authorship of
-         any part of the Combined Work.
-
-
-
-
-
-   (iv)  A Sensible Publication Mechanism does not require any
-         Downloader to provide any identification or authorisation
-         other than that inherently required by the underlying
-         technical mechanisms.
-
-   (v)   A Sensible Publication Mechanism is free of charge.
-
-   (vi)  A Sensible Publication Mechanism does not make any efforts to
-         trace, track, cross-reference, or otherwise gain information
-         about Downloaders, other than the minimum data required for
-         direct technical fault-finding; any data collected shall be
-         used only for direct technical fault-finding.
-
-   (vii) Where a Sensible Publication Mechanism involves
-         implementation of a technical communications protocol, the
-         Mechanism must permit the use by Downloaders of the widest
-         feasible range of standards-compliant software.
-
-   (vii) For example, for download via the public World Wide Web to
-         satisfy this paragraph, the HTTP server must permit downloads
-         from any IP address, and it may not have any access controls,
-         cookies, reverse DNS requirements, registration forms, adult
-         checks, authorisation codes, email confirmations, URL
-         session-ids, browser restrictions, JavaScript, Java, Flash,
-         and must use the most conservative possible HTML, and the
-         webserver logs must contain the least possible information
-         and be expired quickly.
-
-DRAFT
-
-, or to pay anyone any
-         money.
-
-   
-
-which there is a
-         Sensible Mechanism  can be 
-
-(to the Other Work publicly and freely available.
+of the GPL-incompatible licence.  However, I would usually prefer it
+if you could use a GPL-compatible licence for your project instead.
 
-          (a) (from `AGPL version 1')
-              If the Program as you received it is intended to
-              interact with users through a computer network and if,
-              in the version you received, any user interacting with
-              the Program was given the opportunity to request
-              transmission to that user of the Program's complete
-              source code, you must not remove that facility from
-              your modified version of the Program or work based on
-              the Program, and must offer an equivalent opportunity
-              for all users interacting with your Program through a
-              computer network to request immediate transmission by
-              HTTP of the complete source code of your modified
-              version or other derivative work.
 
+-- Ian Jackson 17.9.2000
 
-DRAFT --- Ian Jackson 10.5.1999
 
 Local variables:
 mode: text
diff --git a/INSTALL b/INSTALL
index 64075d0..4c0ae67 100644 (file)
--- a/INSTALL
+++ b/INSTALL
-INSTALLATION INSTRUCTIONS for ADNS
+INSTALLATION INSTRUCTIONS for GNU ADNS
 
-   $ ./configure
+1. Read the security note below.
+
+2. Standard GNU package build process:
+   $ ./configure [--disable-dynamic] [--prefix=... ...]
    $ make
    # make install
 
-Unfortunately, since this is a beta, there is no good documentation
-yet.  For now, use the comments in the public header file adns.h.
+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]       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
+Later versions of the same OS should work too.  [adns] is the latest
+version of adns that has been tested.  Usually entries in this table
+mean they pass adns's own regression test, when compiled with GCC,
+and appear to install and run correctly.
 
+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.0.1.
+
+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.
+system.  Non-GNU, non-UNIX systems 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).
 
-In particular, the build system assumes that you have ELF shared
-libraries.  If you don't then please don't send me patches to support
-your kind of shared libraries, and don't send me patches to use
-libtool.  I'm not interested in supporting non-ELF shared libraries.
-However, if you send me an appropriate patch I'd be willing to make it
-easy or automatic to disable the ELF shared library arrangements.
+The adnsresfilter utility uses `tsearch' from the C library (a la SVID
+and X/Open).  If you don't have tsearch configure will arranges 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.
 
-You may find that GNU Make is required.
+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.
+details for adns.  It is
+ Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
 
-adns is Copyright (C)1997-9 Ian Jackson <ian@davenant.greenend.org.uk>.
+adns is
+ Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ Copyright (C) 1999-2000 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
@@ -39,6 +109,15 @@ 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 userv as the file COPYING; if not, email me at the address
+along with adns as the file COPYING; if not, email me at the address
 above or write to the Free Software Foundation, 59 Temple Place -
 Suite 330, Boston, MA 02111-1307, USA.
+
+[1] Tony Finch holds the original copyright on client/adnslogres.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:
index 5b4ca52..9585831 100644 (file)
@@ -1,7 +1,12 @@
 # Makefile - top-level Makefile
-# 
-#  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
 #  
+#  This file is
+#    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+#
+#  It is part of adns, which is
+#    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+#    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+# 
 #  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 2, or (at your option)
 #  along with this program; if not, write to the Free Software Foundation,
 #  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
 
-DISTVERSION=   0.1
-
+DISTVERSION=   0.9
 srcdir=                @srcdir@
 VPATH=         @srcdir@
 
-SUBDIRS= src dynamic client regress
+ENABLE_DYNAMIC=        @ENABLE_DYNAMIC@
+ifeq ($(ENABLE_DYNAMIC),elf)
+SUBDIRS_DYNAMIC=dynamic
+else
+SUBDIRS_DYNAMIC=
+endif
+
+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
@@ -30,7 +41,7 @@ all install uninstall clean distclean mostlyclean maintainer-clean distprep:
 all-here install-here uninstall-here distprep-here:    README
 
 clean-here mostlyclean-here:
-               rm -f *~ ./#*# core *.orig *.rej Makefile adns-*.tar.gz
+               rm -f *~ ./#*# core *.orig *.rej adns-*.tar.gz
                rm -rf dist_tmp
 
 distclean-here maintainer-clean-here:  clean-here
@@ -47,6 +58,7 @@ dist:                 distprep
                sed -e 's#.*#mkdir -p $(dist_tmp)/&#' | sh
        find \( -name CVS -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 .
@@ -54,9 +66,8 @@ dist:                 distprep
 check:                 all
        $(MAKE) -C regress check
 
-README README-update:
-       lynx -dump -number_links -cfg=/dev/null \
-               http://www.chiark.greenend.org.uk/~ian/adns/ >README.tmp
+README:                        README.html
+       lynx -dump -number_links -cfg=/dev/null ./README.html >README.tmp
        mv -f README.tmp README
 
 TAGS info dvi:
diff --git a/README b/README
index a7a6805..e159a8c 100644 (file)
--- a/README
+++ b/README
@@ -1,11 +1,13 @@
 
-                                     adns
+                                   GNU adns
                                        
-   Advanced, easy to use, asynchronous-capable DNS client library.
+   Advanced, easy to use, asynchronous-capable DNS client library and
+   utilities.
    
-   adns is a resolver library for C (and C++) programs. In contrast with
-   the existing interfaces, gethostbyname et al and libresolv, it has the
-   following features:
+   adns is a resolver library for C (and C++) programs, and a collection
+   of useful DNS resolver utilities. In contrast with the existing
+   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
      * 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 sanity checks
-       eg to return arbitrary data, override or ignore resolv.conf in
-       favour of supplied configuration, etc.
+       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.
        
-Forthcoming:
+DNS utility programs
 
-   I hope that future versions may also have the following features:
-     * The library will be useable by threads in a multithreaded program
-       in a natural way. It will multiplex many threads' queries through
-       a single query socket.
-     * Limited caching behaviour.
-     * IPv6 support.
+   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]usage
+       message for a summary of its capabilities.
        
-   (Technical note: adns requires a real nameserver like BIND running on
+Technical note
+
+   adns requires a real nameserver like [2]BIND or [3]Dents running on
    the same system or a nearby one, which must be willing to provide
    `recursive service'. I.e., adns is a `stub resolver'. All properly
    configured UN*X and GNU systems will already have such nameserver(s);
-   they are usually listed in /etc/resolv.conf.)
+   they are usually listed in /etc/resolv.conf.
+   
+Documentation
+
+   I'm afraid there is no manual yet. However, competent C programmers
+   should be able to use the library based on the [4]commented adns.h
+   header file, and the usage messages for the programs should be
+   sufficient.
    
 Feedback
 
-   If you are subscribed to adns-discuss please send bug reports there;
-   otherwise mail them to adns-bugreports@chiark.greenend.org.uk.
+   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.
+   
+   If you are subscribed to adns-discuss please send feedback, including
+   bug reports, there; otherwise send mail to
+   adns-bugreports@chiark.greenend.org.uk. If you'd prefer that your
+   message wasn't forwarded to the adns-bugreports list, send it to
+   adns-maint@chiark.greenend.org.uk.
    
 Mailinglists
 
@@ -61,23 +85,30 @@ Mailinglists
    important bugs, new versions, &c. The bug reports address mentioned
    above is also a mailing list; feel free to subscribe to it.
    
-   There are [1]archives and subscription web pages, or you can subscribe
+   There are [5]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.
    
 Download
 
-   Available for download from [2]chiark.greenend.org.uk are:
-     * The [3]current pre-release version as a gzipped tarfile.
-     * All released versions are also available via [4]anonymous FTP.
+   Available for download from [6]chiark.greenend.org.uk are:
+     * The [7]current beta version as a gzipped tarfile.
+     * [8]adns.h API header file with comments (currently there is no
+       manual, sorry).
+     * All versions released so far are also available via [9]anonymous
+       FTP.
+     * A mirror of my CVS repository is available via rsync from
+       rsync.chiark.greenend.org.uk::ftp/users/ian/cvs-pub/adns (use FTP
+       first to find your way around), or via [10]cvsweb.
        
-   adns is also available from the GNU Project FTP servers and their
-   mirrors.
+   adns is also available from the [11]GNU Project FTP servers and their
+   [12]mirrors.
    
 Copyright and licensing
 
-   adns is Copyright 1997-1999 Ian Jackson.
+   adns is Copyright 1997-2000 Ian Jackson, Copyright 1999 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
@@ -86,37 +117,46 @@ Copyright and licensing
    
    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 [5]GNU
-   General Public License for more details.
+   of merchantability or fitness for a particular purpose. See the
+   [13]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 [6]Free Software Foundation, 59 Temple Place - Suite 330, Boston,
+   the [14]Free Software Foundation, 59 Temple Place - Suite 330, Boston,
    MA 02111-1307, USA, or email adns-maint@chiark.greenend.org.uk.
      _________________________________________________________________
    
-   [7]Ian Jackson / [8]adns-maint@chiark.greenend.org.uk; more [9]free
+   [15]Ian Jackson / [16]adns-maint@chiark.greenend.org.uk; more [17]free
    software by me.
    
-   [10]GNU home page; [11]site or mirror home page
+   [18]GNU home page; [19]chiark home page; [20]site or mirror home page
    
-   This web page is Copyright (C)1996-1999 Ian Jackson. See the
-   [12]Copyright/acknowledgements.
+   This web page is Copyright (C)1996-2000 Ian Jackson. See the
+   [21]Copyright/acknowledgements.
    
-   Use any browser - [13]Campaign for a non-browser-specific WWW
+   Use any browser - [22]Campaign for a non-browser-specific WWW
 
 References
 
-   1. http://www.chiark.greenend.org.uk/mailman/listinfo
-   2. http://www.chiark.greenend.org.uk/
-   3. http://www.chiark.greenend.org.uk/~ian/adns/adns.tar.gz
-   4. ftp://ftp.chiark.greenend.org.uk/users/ian/userv/
-   5. http://www.chiark.greenend.org.uk/~ian/COPYING.txt
-   6. http://www.fsf.org/
-   7. http://www.chiark.greenend.org.uk/
-   8. mailto:adns-maint@chiark.greenend.org.uk
-   9. http://www.chiark.greenend.org.uk/~ian/software/
-  10. http://www.gnu.org/
-  11. http://www.chiark.greenend.org.uk/
-  12. http://www.chiark.greenend.org.uk/~ian/sw-www-copy.html
-  13. http://www.anybrowser.org/campaign/
+   1. http://www.chiark.greenend.org.uk/~ian/adns/usage/adnsresfilter_usage.text
+   2. http://www.isc.org/view.cgi?/products/BIND/index.phtml
+   3. http://www.dents.org/
+   4. http://www.chiark.greenend.org.uk/~ian/adns/adns.h.txt
+   5. http://www.chiark.greenend.org.uk/mailman/listinfo
+   6. http://www.chiark.greenend.org.uk/~ian/adns/
+   7. http://www.chiark.greenend.org.uk/~ian/adns/adns.tar.gz
+   8. http://www.chiark.greenend.org.uk/~ian/adns/adns.h.txt
+   9. ftp://ftp.chiark.greenend.org.uk/users/ian/adns/
+  10. http://www.chiark.greenend.org.uk/ucgi/~ijackson/cvsweb/adns/
+  11. http://www.gnu.org/
+  12. http://www.gnu.org/order/ftp.html
+  13. http://www.chiark.greenend.org.uk/~ian/COPYING.txt
+  14. http://www.fsf.org/
+  15. http://www.chiark.greenend.org.uk/
+  16. mailto:adns-maint@chiark.greenend.org.uk
+  17. http://www.chiark.greenend.org.uk/~ian/software/
+  18. http://www.gnu.org/
+  19. http://www.chiark.greenend.org.uk/
+  20. file://localhost/
+  21. http://www.chiark.greenend.org.uk/~ian/sw-www-copy.html
+  22. http://www.anybrowser.org/campaign/
diff --git a/README.html b/README.html
new file mode 100644 (file)
index 0000000..d3af798
--- /dev/null
@@ -0,0 +1,214 @@
+<html><head><title>adns - advanced, alternative, asynchronous resolver</title>
+<!--
+  Note: this file is maintained in Ian Jackson's private CVS.
+
+  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.
+
+  $Id$
+  -->   
+<link rev="made" href="mailto:adns-maint@chiark.greenend.org.uk">
+</head>
+<body>
+<h1>GNU adns</h1>
+
+<strong>Advanced, easy to use, asynchronous-capable DNS client
+library and utilities.</strong>
+
+<p>
+
+adns is a resolver library for C (and C++) programs, and a collection
+of useful DNS resolver utilities.  In contrast with the existing
+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 formats.
+
+<li>Sanity checking (eg, name syntax checking, reverse/forward
+correspondence, CNAME pointing to CNAME) is performed automatically.
+
+<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>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/usage/adnsresfilter_usage.text">usage
+message</A> for a summary of its capabilities.
+
+</ul>
+
+<h2>Technical note</h2>
+
+adns requires a real nameserver like
+<A href="http://www.isc.org/view.cgi?/products/BIND/index.phtml">BIND</A>
+or
+<A href="http://www.dents.org/">Dents</A> running on
+the same system or a nearby one, which must be willing to provide
+`recursive service'.  I.e., adns is a `stub resolver'.  All properly
+configured UN*X and GNU systems will already have such nameserver(s);
+they are usually listed in /etc/resolv.conf.
+
+<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/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>
+
+If you are subscribed to <code>adns-discuss</code> please send
+feedback, including bug reports, there; otherwise send mail to
+<code>adns-bugreports@chiark.greenend.org.uk</code>.  If you'd prefer
+that your message wasn't forwarded to the <code>adns-bugreports</code>
+list, send it to <code>adns-maint@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, &c.
+The bug reports address mentioned above is also a mailing list; feel
+free to subscribe to it.
+
+<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>Download</h2>
+
+Available for download from
+<A href="http://www.chiark.greenend.org.uk/~ian/adns/">chiark.greenend.org.uk</A>
+are:
+<ul>
+<li>The <A href="http://www.chiark.greenend.org.uk/~ian/adns/adns.tar.gz">current beta version</A>
+    as a gzipped tarfile.
+<li><A href="http://www.chiark.greenend.org.uk/~ian/adns/adns.h.txt">adns.h</A>
+    API header file with comments (currently there is no manual, sorry).
+<li>All versions released so far are also available via
+    <A href="ftp://ftp.chiark.greenend.org.uk/users/ian/adns/">anonymous
+    FTP</A>.
+<li>A mirror of my CVS repository is available via rsync from
+    <code>rsync.chiark.greenend.org.uk::ftp/users/ian/cvs-pub/adns</code>
+    (use FTP first to find your way around), or via
+    <A href="http://www.chiark.greenend.org.uk/ucgi/~ijackson/cvsweb/adns/">cvsweb</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>Copyright and licensing</h2>
+
+<kbd>adns</kbd> is Copyright 1997-2000 Ian Jackson, Copyright 1999
+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 2 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/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>,
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA,
+or email <code>adns-maint@chiark.greenend.org.uk</code>.
+
+<p>
+
+<hr>
+<A href="http://www.chiark.greenend.org.uk/">Ian Jackson</A> / 
+<A href="mailto:adns-maint@chiark.greenend.org.uk"><tt>adns-maint@chiark.greenend.org.uk</tt></A>;
+more <A href="http://www.chiark.greenend.org.uk/~ian/software/">free
+software</A> by me.
+<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-2000 Ian Jackson.  See the
+<A href="http://www.chiark.greenend.org.uk/~ian/sw-www-copy.html">Copyright/acknowledgements</A>.
+<p>
+
+Use any browser -
+<A href="http://www.anybrowser.org/campaign/">Campaign for a non-browser-specific WWW</A>
+
+</body>
+</html>
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..60165a6
--- /dev/null
+++ b/TODO
@@ -0,0 +1,11 @@
+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.
+* SRV RRs.
index 73a7fe3..96f0889 100644 (file)
@@ -3,7 +3,12 @@
  * input file for autoheader/autoconf/configure: extra stuff for config.h
  */
 /*
- *  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
+ *  This file is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ *  It is part of adns, which is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
  *  
  *  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
@@ -20,6 +25,9 @@
  *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
  */
 
+/* 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 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
 #ifndef CONSTANT
 #define CONSTANT FUNCATTR((ATTRCONST))
 #endif
+
+#ifdef HAVEUSE_RPCTYPES_H
+#include <rpc/types.h>
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
index b2d9e9f..6c4099e 100644 (file)
@@ -1,5 +1,12 @@
 # aclocal.m4 - package-specific macros for autoconf
 #  
+#  This file is
+#    Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+#
+#  It is part of adns, which is
+#    Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+#    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+#  
 #  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
 #
 #  This program is free software; you can redistribute it and/or modify
index 1b7d991..c982726 100644 (file)
--- a/changelog
+++ b/changelog
@@ -1,6 +1,255 @@
-adns (0.2) experimental; urgency=low
+adns (0.10) unstable; urgency=low
+
+  Bugfixes:
+  * 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.
+  * Documentation improved somewhat, including new GPL-vs-LGPL file.
+  * 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.
+
+ --
+
+adns (0.9) unstable; 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.
@@ -8,11 +257,16 @@ adns (0.2) experimental; urgency=low
   * 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).
-  * New GPL-vs-LGPL copyright policy explanation file.
+  * 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
 
@@ -22,4 +276,5 @@ adns (0.1) experimental; urgency=low
 
 Local variables:
 mode: debian-changelog
+fill-column: 75
 End:
index e6b4fa8..45bcf1e 100644 (file)
@@ -1,3 +1,11 @@
 Makefile
 adnstest
 adnstest_s
+adnslogres
+adnslogres_s
+adnshost
+adnshost_s
+adnsresfilter
+adnsresfilter_s
+fanftest
+fanftest_s
index 67acef4..59a3582 100644 (file)
@@ -1,6 +1,11 @@
 # client/Makefile - client program(s) Makefile
 # 
-#  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
+#  This file is
+#    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+#
+#  It is part of adns, which is
+#    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+#    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
 #  
 #  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
 srcdir=                @srcdir@
 VPATH=         @srcdir@
 
-TARG_LOCAL=    adnstest_s
-TARG_INSTALL=  adnstest
+PROGS_SYSDEP=  @PROGS_HAVE_TSEARCH@
+ENABLE_DYNAMIC=        @ENABLE_DYNAMIC@
+
+PROGRAMS=      adnslogres adnshost $(PROGS_SYSDEP)
+PROGRAMS_LOCAL=        fanftest adnstest
+PROGRAMS_ALL=  $(PROGRAMS) $(PROGRAMS_LOCAL)
+
+STATIC_LIB=    $(ADNSDIR)/libadns.a
+
+ifeq ($(ENABLE_DYNAMIC),elf)
+DYNAMIC_DEP=   $(srcdir)/../dynamic/$(SHLIBFILE)
+DYNAMIC_LINK=  -L$(srcdir)/../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                $(srcdir)/../settings.make
 
 DIRCFLAGS=     -I$(srcdir)/../src
 
+TARG_OBJS=     $(addsuffix .o, $(PROGRAMS_ALL))
+ADH_OBJS=      adh-main.o adh-opts.o adh-query.o
+ALL_OBJS=      $(ADH_OBJS) $(TARG_OBJS)
+
+ADNSDIR=       $(srcdir)/../src/
+
 all:           $(TARGETS)
 
 install:       $(TARG_INSTALL)
-               set -xe; for f in $(TARGETS); \
+               set -xe; for f in $(TARG_INSTALL); \
                        do $(INSTALL_PROGRAM) $$f $(bin_dir)/$$f; done
 
 uninstall:
                for f in $(TARGETS); do rm -f $(bin_dir)/$$f; done
 
-adnstest:      adnstest.o $(srcdir)/../dynamic/$(SHLIBFILE)
+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 $(ADNSDIR)/config.h
+adnsresfilter.o:       $(ADNSDIR)/tvarith.h
+
+%:             %.o $(DYNAMIC_DEP)
+               $(CC) $(LDFLAGS) $< $(DYNAMIC_LINK) -o $@ $(LDLIBS)
 
-adnstest_s:    adnstest.o $(srcdir)/../src/libadns.a
-               $(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS)
+%_s:           %.o $(STATIC_LIB)
+               $(CC) $(LDFLAGS) $< $(STATIC_LIB) -o $@ $(LDLIBS)
diff --git a/client/adh-main.c b/client/adh-main.c
new file mode 100644 (file)
index 0000000..193092a
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * adh-main.c
+ * - useful general-purpose resolver client program
+ *   main program and useful subroutines
+ */
+/*
+ *  This file is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ *  It is part of adns, which is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ *  
+ *  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 2, 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,
+ *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+ */
+
+#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_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_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_none, 0 }
+  };
+
+  const struct typename *tnp;
+
+  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 (file)
index 0000000..fa5cceb
--- /dev/null
@@ -0,0 +1,351 @@
+/*
+ * adh-opts.c
+ * - useful general-purpose resolver client program
+ *   option handling tables etc.
+ */
+/*
+ *  This file is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ *  It is part of adns, which is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ *  
+ *  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 2, 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,
+ *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+ */
+
+#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_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 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 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  addr       - enhanced versions\n"
+       "  cname  hinfo  txt                - types with only one version\n"
+       "  a  ns-  soa-  ptr-  mx-  rp-     - _raw versions\n"
+       "Default is addr, or ptr for -i/--ptr queries\n",
+       stdout);
+  if (ferror(stdout)) sysfail("write usage message",errno);
+}
+
+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 (file)
index 0000000..d17beab
--- /dev/null
@@ -0,0 +1,309 @@
+/*
+ * adh-query.c
+ * - useful general-purpose resolver client program
+ *   make queries and print answers
+ */
+/*
+ *  This file is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ *  It is part of adns, which is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ *  
+ *  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 2, 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,
+ *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+ */
+
+#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;
+}
+
+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_cname,
+    
+  *qun_r= qun;
+}
+  
+void of_ptr(const struct optioninfo *oi, const char *arg, const char *arg2) {
+  struct query_node *qun;
+  int quflags, r;
+  struct sockaddr_in sa;
+
+  memset(&sa,0,sizeof(sa));
+  sa.sin_family= AF_INET;
+  if (!inet_aton(arg,&sa.sin_addr)) usageerr("invalid IP address %s",arg);
+
+  prep_query(&qun,&quflags);
+  qun->owner= xstrsave(arg);
+  r= adns_submit_reverse(ads,
+                        (struct sockaddr*)&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;
+  struct sockaddr_in sa;
+
+  memset(&sa,0,sizeof(sa));
+  sa.sin_family= AF_INET;
+  if (!inet_aton(arg,&sa.sin_addr)) usageerr("invalid IP address %s",arg);
+
+  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,
+                            (struct sockaddr*)&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;
+  adns_status ist;
+  
+  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 {
+    ist= adns_rr_info(answer->type, &typename, 0,0,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, ist;
+  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);
+      ist= adns_rr_info(answer->type, &typename, 0, 0, rrp, &datastr);
+      if (ist == adns_s_nomemory) sysfail("adns_rr_info failed",ENOMEM);
+      assert(!ist);
+      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/adnshost.h b/client/adnshost.h
new file mode 100644 (file)
index 0000000..d88c2a1
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * adnshost.h
+ * - useful general-purpose resolver client program, header file
+ */
+/*
+ *  This file is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ *  It is part of adns, which is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ *  
+ *  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 2, 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,
+ *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+ */
+
+#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>
+
+#include "config.h"
+#include "adns.h"
+#include "dlist.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_format;
+extern char *ov_id;
+extern struct perqueryflags_remember ov_pqfr;
+
+extern optfunc of_config, 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);
+
+/* 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);
+
+void quitnow(int rc) NONRETURNING;
+
+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 (file)
index 0000000..a91127b
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+ * 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 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ *  
+ *  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 2, 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,
+ *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *  This version was originally supplied by Tony Finch, but has been
+ *  modified by Ian Jackson as it was incorporated into adns and
+ *  subsequently.
+ */
+
+static const char * const cvsid =
+       "$Id$";
+
+#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"
+
+#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.",
+         ptrs[4]-ptrs[3]-1, ptrs[3],
+         ptrs[3]-ptrs[2]-1, ptrs[2],
+         ptrs[2]-ptrs[1]-1, ptrs[1],
+         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", 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", 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,
+           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) {
+  fprintf(file, "usage: %s [-d] [-p] [-c concurrency] [-C config] [logfile]\n",
+         progname);
+}
+
+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] && !strcmp(argv[1],"--help")) {
+    printhelp(stdout);
+    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 (file)
index 0000000..3a3cacf
--- /dev/null
@@ -0,0 +1,473 @@
+/*
+ * adnsresfilter.c
+ * - filter which does resolving, not part of the library
+ */
+/*
+ *  This file is
+ *    Copyright (C) 1999-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ *  It is part of adns, which is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ *  
+ *  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 2, 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,
+ *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+ */
+
+#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"
+
+#ifdef ADNS_REGRESS_TEST
+# include "hredirect.h"
+#endif
+
+struct outqueuenode {
+  struct outqueuenode *next, *back;
+  void *buffer;
+  char *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;
+}
+
+static void quit(int exitstatus) NONRETURNING;
+static void quit(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));
+  quit(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\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();
+  quit(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));
+  quit(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(); quit(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();
+         quit(0);
+       default:
+         usageerr("unknown short option");
+       }
+      }
+    }
+  }
+}
+
+static void queueoutchar(int c) {
+  struct outqueuenode *entry;
+  
+  entry= outqueue.tail;
+  if (!entry || entry->addr || entry->textlen >= peroutqueuenode) {
+    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);
+}
index 4f2b982..e99f5a1 100644 (file)
@@ -1,9 +1,14 @@
 /*
- * dtest.c
+ * adnstest.c
  * - simple test program, not part of the library
  */
 /*
- *  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
+ *  This file is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ *  It is part of adns, which is
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
  *  
  *  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
 #include <unistd.h>
 #include <assert.h>
 #include <stdlib.h>
+#include <string.h>
+#include <errno.h>
 
-#ifndef OUTPUTSTREAM
-# define OUTPUTSTREAM stdout
+#include "config.h"
+#include "adns.h"
+
+#ifdef ADNS_REGRESS_TEST
+# include "hredirect.h"
 #endif
 
-#include "adns.h"
+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(const char *what, adns_status st) {
+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));
-  exit(2);
+  quitnow(2);
 }
 
-static const char *defaultargv[]= { "ns.chiark.greenend.org.uk", 0 };
+static void failure_errno(const char *what, int errnoval) NONRETURNING;
+static void failure_errno(const char *what, int errnoval) {
+  fprintf(stderr,"adns failure: %s: errno=%d\n",what,errnoval);
+  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"
+         "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,
@@ -67,81 +129,126 @@ static void dumptype(adns_status ri, const char *rrtn, const char *fmtn) {
          ri ? " " : "", ri ? adns_strerror(ri) : "");
 }
 
-static void fdom_split(const char *fdom, const char **dom_r, int *qf_r) {
+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_state ads;
-  adns_query *qus, qu;
+  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;
-  adns_status r, ri;
+  int len, i, qc, qi, tc, ti, ch, qflags, initflagsnum;
+  adns_status ri;
+  int r;
   const adns_rrtype *types;
   struct timeval now;
-  adns_rrtype *types_a;
+  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);
-    if (!types_a) { perror("malloc types"); exit(3); }
+    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; ti++) {
       types_a[ti]= strtoul(cp,&cp,10);
       if ((ch= *cp)) {
-       if (ch != ',') {
-         fputs("usage: dtest [/<initstring>] [:<typenum>,...] [<domain> ...]\n",stderr);
-         exit(4);
-       }
+       if (ch != ',') usageerr("unexpected char (not comma) in or between types");
        cp++;
       }
     }
+    types_a[ti]= adns_r_none;
     types= types_a;
     argv++;
   } else {
+    types_a= 0;
     types= defaulttypes;
   }
   
-  if (argv[0] && argv[1]) fdomlist= (const char *const*)argv+1;
-  else fdomlist= defaultargv;
+  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++);
-  qus= malloc(sizeof(qus)*qc*tc);
-  if (!qus) { perror("malloc qus"); exit(3); }
+  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,stdout,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,0);
+    r= adns_init(&ads,
+                (adns_if_debug|adns_if_noautosys)^initflagsnum,
+                0);
   }
-  if (r) failure("init",r);
+  if (r) failure_errno("init",r);
 
   for (qi=0; qi<qc; qi++) {
-    fdom_split(fdomlist[qi],&domain,&qflags);
+    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]);
-      r= adns_submit(ads,domain,types[ti],qflags,0,&qus[qi*tc+ti]);
-      if (r == adns_s_unknownrrtype) {
+      r= adns_submit(ads,domain,types[ti],qflags,mc,&mc->qu);
+      if (r == ENOSYS) {
        fprintf(stdout," not implemented\n");
-       qus[qi*tc+ti]= 0;
+       mc->qu= 0;
+       mc->doneyet= 1;
       } else if (r) {
-       failure("submit",r);
+       failure_errno("submit",r);
       } else {
        ri= adns_rr_info(types[ti], &rrtn,&fmtn,0, 0,0);
        putc(' ',stdout);
@@ -151,42 +258,81 @@ int main(int argc, char *const *argv) {
     }
   }
 
-  for (qi=0; qi<qc; qi++) {
-    fdom_split(fdomlist[qi],&domain,&qflags);
-      
-    for (ti=0; ti<tc; ti++) {
-      qu= qus[qi*tc+ti];
-      if (!qu) continue;
-      
-      r= adns_wait(ads,&qu,&ans,0);
-      if (r) failure("wait",r);
+  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"); exit(3); }
+    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; nrrs=%d; cname=%s; owner=%s; ttl=%ld\n",
-             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++) {
-         r= adns_rr_info(ans->type, 0,0,0, ans->rrs.bytes+i*len,&show);
-         if (r) failure("info",r);
-         fprintf(stdout," %s\n",show);
-         free(show);
-       }
+    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);
     }
+    free(ans);
+
+    mc->doneyet= 1;
   }
 
-  free(qus);
-  adns_finish(ads);
-  
-  exit(0);
+  quitnow(0);
 }
diff --git a/client/fanftest.c b/client/fanftest.c
new file mode 100644 (file)
index 0000000..add4c23
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * 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 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ *  
+ *  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 2, 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,
+ *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * This version was originally supplied by Tony Finch, but has been
+ * modified by Ian Jackson as it was incorporated into adns.
+ */
+
+static const char * const cvsid =
+       "$Id$";
+
+#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/client/x.gdb b/client/x.gdb
new file mode 100644 (file)
index 0000000..2ee7597
--- /dev/null
@@ -0,0 +1,2 @@
+file adnsresfilter_s
+set args <testinput -t2000
index 4bf677b..da114e9 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
 #! /bin/sh
 
 # Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.12 
+# Generated automatically using autoconf version 2.13 
 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
 #
 # This configure script is free software; the Free Software Foundation
@@ -11,6 +11,9 @@
 ac_help=
 ac_default_prefix=/usr/local
 # Any additions from configure.in:
+ac_help="$ac_help
+  --disable-dynamic       use static linking
+  --enable-dynamic[=elf]  create and use ELF dynamic library (default)"
 
 # Initialize some variables set by options.
 # The variables have the same names as the options, with
@@ -49,6 +52,7 @@ mandir='${prefix}/man'
 # Initialize some other variables.
 subdirs=
 MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
 # Maximum number of lines to put in a shell here document.
 ac_max_here_lines=12
 
@@ -332,7 +336,7 @@ EOF
     verbose=yes ;;
 
   -version | --version | --versio | --versi | --vers)
-    echo "configure generated by autoconf version 2.12"
+    echo "configure generated by autoconf version 2.13"
     exit 0 ;;
 
   -with-* | --with-*)
@@ -502,9 +506,11 @@ ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
 cross_compiling=$ac_cv_prog_cc_cross
 
+ac_exeext=
+ac_objext=o
 if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
   # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
   if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
@@ -519,18 +525,48 @@ fi
 
 
 
+
+
+
+echo $ac_n "checking whether you requested dynamic linking""... $ac_c" 1>&6
+echo "configure:533: checking whether you requested dynamic linking" >&5
+
+# Check whether --enable-dynamic or --disable-dynamic was given.
+if test "${enable_dynamic+set}" = set; then
+  enableval="$enable_dynamic"
+       case "$enableval" in
+       elf|yes)
+               ENABLE_DYNAMIC=elf
+               echo "$ac_t""yes (ELF)" 1>&6
+               ;;
+       no)     ENABLE_DYNAMIC=no
+               echo "$ac_t""no" 1>&6
+               ;;
+       *)      { echo "configure: error: "invalid value $enableval for --enable-dynamic, try yes or elf"" 1>&2; exit 1; }
+               ;;
+       esac
+
+else
+  
+               ENABLE_DYNAMIC=elf
+               echo "$ac_t""yes, by default" 1>&6
+
+fi
+
+
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:526: checking for $ac_word" >&5
+echo "configure:561: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
       ac_cv_prog_CC="gcc"
@@ -551,16 +587,17 @@ 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
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:555: checking for $ac_word" >&5
+echo "configure:591: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
   ac_prog_rejected=no
-  for ac_dir in $PATH; do
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
       if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
@@ -595,25 +632,61 @@ else
   echo "$ac_t""no" 1>&6
 fi
 
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:642: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
   test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:603: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:674: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
 cross_compiling=$ac_cv_prog_cc_cross
 
-cat > conftest.$ac_ext <<EOF
-#line 613 "configure"
+cat > conftest.$ac_ext << EOF
+
+#line 685 "configure"
 #include "confdefs.h"
+
 main(){return(0);}
 EOF
-if { (eval echo configure:617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -627,18 +700,24 @@ else
   ac_cv_prog_cc_works=no
 fi
 rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
 
 echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
 if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:637: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:716: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:642: checking whether we are using GNU C" >&5
+echo "configure:721: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -647,7 +726,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:651: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:730: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -658,11 +737,15 @@ echo "$ac_t""$ac_cv_prog_gcc" 1>&6
 
 if test $ac_cv_prog_gcc = yes; then
   GCC=yes
-  ac_test_CFLAGS="${CFLAGS+set}"
-  ac_save_CFLAGS="$CFLAGS"
-  CFLAGS=
-  echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:666: checking whether ${CC-cc} accepts -g" >&5
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:749: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -677,30 +760,115 @@ rm -f conftest*
 fi
 
 echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
-  if test "$ac_test_CFLAGS" = set; then
-    CFLAGS="$ac_save_CFLAGS"
-  elif test $ac_cv_prog_cc_g = yes; then
+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
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:781: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
 else
-  GCC=
-  test "${CFLAGS+set}" = set || CFLAGS="-g"
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 796 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:802: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 813 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:819: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 830 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:836: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
 fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
 
 # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:696: checking for $ac_word" >&5
+echo "configure:863: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   if test -n "$RANLIB"; then
   ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
       ac_cv_prog_RANLIB="ranlib"
@@ -718,15 +886,153 @@ else
   echo "$ac_t""no" 1>&6
 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
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# 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
+# 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"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:921: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/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
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+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.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&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_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+for ac_func in poll
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:977: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 982 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* 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_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
 
 
  echo $ac_n "checking for socket""... $ac_c" 1>&6
-echo "configure:725: checking for socket" >&5
+echo "configure:1031: checking for socket" >&5
 if eval "test \"`echo '$''{'ac_cv_func_socket'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 730 "configure"
+#line 1036 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char socket(); below.  */
@@ -749,7 +1055,7 @@ socket();
 
 ; return 0; }
 EOF
-if { (eval echo configure:753: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1059: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_socket=yes"
 else
@@ -768,7 +1074,7 @@ else
   echo "$ac_t""no" 1>&6
 
   echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6
-echo "configure:772: checking for socket in -lsocket" >&5
+echo "configure:1078: checking for socket in -lsocket" >&5
 ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -776,7 +1082,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 780 "configure"
+#line 1086 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -787,7 +1093,7 @@ int main() {
 socket()
 ; return 0; }
 EOF
-if { (eval echo configure:791: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1097: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -823,12 +1129,12 @@ fi
 
 
  echo $ac_n "checking for inet_ntoa""... $ac_c" 1>&6
-echo "configure:827: checking for inet_ntoa" >&5
+echo "configure:1133: checking for inet_ntoa" >&5
 if eval "test \"`echo '$''{'ac_cv_func_inet_ntoa'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 832 "configure"
+#line 1138 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char inet_ntoa(); below.  */
@@ -851,7 +1157,7 @@ inet_ntoa();
 
 ; return 0; }
 EOF
-if { (eval echo configure:855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1161: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_inet_ntoa=yes"
 else
@@ -870,7 +1176,7 @@ else
   echo "$ac_t""no" 1>&6
 
   echo $ac_n "checking for inet_ntoa in -lnsl""... $ac_c" 1>&6
-echo "configure:874: checking for inet_ntoa in -lnsl" >&5
+echo "configure:1180: checking for inet_ntoa in -lnsl" >&5
 ac_lib_var=`echo nsl'_'inet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -878,7 +1184,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 882 "configure"
+#line 1188 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -889,7 +1195,7 @@ int main() {
 inet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:893: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1199: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -924,14 +1230,150 @@ fi
 
 
 
+PROGS_IF_TSEARCH=adnsresfilter
+
+echo $ac_n "checking for tsearch""... $ac_c" 1>&6
+echo "configure:1237: checking for tsearch" >&5
+if eval "test \"`echo '$''{'ac_cv_func_tsearch'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1242 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char tsearch(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char tsearch();
+
+int main() {
+
+/* 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_tsearch) || defined (__stub___tsearch)
+choke me
+#else
+tsearch();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_tsearch=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_tsearch=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'tsearch`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  
+ PROGS_HAVE_TSEARCH=$PROGS_IF_TSEARCH
+
+else
+  echo "$ac_t""no" 1>&6
+
+ PROGS_HAVE_TSEARCH='';
+ echo "configure: warning: tsearch missing - not building client program(s) $PROGS_IF_TSEARCH" 1>&2
+
+fi
+
+
+echo $ac_n "checking for INADDR_LOOPBACK""... $ac_c" 1>&6
+echo "configure:1292: checking for INADDR_LOOPBACK" >&5
+if eval "test \"`echo '$''{'adns_cv_decl_inaddrloopback'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+ cat > conftest.$ac_ext <<EOF
+#line 1298 "configure"
+#include "confdefs.h"
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+int main() {
+
+  INADDR_LOOPBACK;
+; return 0; }
+EOF
+if { (eval echo configure:1311: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  adns_cv_decl_inaddrloopback=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  adns_cv_decl_inaddrloopback=no
+fi
+rm -f conftest*
+fi
+
+if test "$adns_cv_decl_inaddrloopback" = yes; then
+ echo "$ac_t""found" 1>&6
+else
+ echo "$ac_t""not in standard headers, urgh..." 1>&6
+ ac_safe=`echo "rpc/types.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for rpc/types.h""... $ac_c" 1>&6
+echo "configure:1329: checking for rpc/types.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1334 "configure"
+#include "confdefs.h"
+#include <rpc/types.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1339: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  
+  cat >> confdefs.h <<\EOF
+#define HAVEUSE_RPCTYPES_H 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+
+  { echo "configure: error: cannot find INADDR_LOOPBACK or rpc/types.h" 1>&2; exit 1; }
+fi
+
+fi
+
 
  echo $ac_n "checking for inet_aton""... $ac_c" 1>&6
-echo "configure:930: checking for inet_aton" >&5
+echo "configure:1372: checking for inet_aton" >&5
 if eval "test \"`echo '$''{'ac_cv_func_inet_aton'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 935 "configure"
+#line 1377 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char inet_aton(); below.  */
@@ -954,7 +1396,7 @@ inet_aton();
 
 ; return 0; }
 EOF
-if { (eval echo configure:958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_inet_aton=yes"
 else
@@ -973,7 +1415,7 @@ else
   echo "$ac_t""no" 1>&6
 
   echo $ac_n "checking for inet_aton in -lresolv""... $ac_c" 1>&6
-echo "configure:977: checking for inet_aton in -lresolv" >&5
+echo "configure:1419: checking for inet_aton in -lresolv" >&5
 ac_lib_var=`echo resolv'_'inet_aton | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -981,7 +1423,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lresolv  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 985 "configure"
+#line 1427 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -992,7 +1434,7 @@ int main() {
 inet_aton()
 ; return 0; }
 EOF
-if { (eval echo configure:996: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1438: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1024,22 +1466,63 @@ fi
 
 
 
+ echo $ac_n "checking inlines""... $ac_c" 1>&6
+echo "configure:1471: checking inlines" >&5
+ if eval "test \"`echo '$''{'dpkg_cv_c_inline'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  cat > conftest.$ac_ext <<EOF
+#line 1477 "configure"
+#include "confdefs.h"
+
+int main() {
+} inline int foo (int x) {
+; return 0; }
+EOF
+if { (eval echo configure:1484: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  dpkg_cv_c_inline=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  dpkg_cv_c_inline=no
+fi
+rm -f conftest*
+fi
+
+ if test "x$dpkg_cv_c_inline" = xyes; then
+  true
+  echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<\EOF
+#define HAVE_INLINE 1
+EOF
+
+ else
+  true
+  echo "$ac_t""no" 1>&6
+ fi
+
+
+
  
  echo $ac_n "checking __attribute__((,,))""... $ac_c" 1>&6
-echo "configure:1030: checking __attribute__((,,))" >&5
+echo "configure:1513: checking __attribute__((,,))" >&5
  if eval "test \"`echo '$''{'adns_cv_c_attribute_supported'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
   cat > conftest.$ac_ext <<EOF
-#line 1036 "configure"
+#line 1519 "configure"
 #include "confdefs.h"
 
 int main() {
 extern int testfunction(int x) __attribute__((,,))
 ; return 0; }
 EOF
-if { (eval echo configure:1043: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1526: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   adns_cv_c_attribute_supported=yes
 else
@@ -1061,20 +1544,20 @@ EOF
 
    
  echo $ac_n "checking __attribute__((noreturn))""... $ac_c" 1>&6
-echo "configure:1065: checking __attribute__((noreturn))" >&5
+echo "configure:1548: checking __attribute__((noreturn))" >&5
  if eval "test \"`echo '$''{'adns_cv_c_attribute_noreturn'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
   cat > conftest.$ac_ext <<EOF
-#line 1071 "configure"
+#line 1554 "configure"
 #include "confdefs.h"
 
 int main() {
 extern int testfunction(int x) __attribute__((noreturn))
 ; return 0; }
 EOF
-if { (eval echo configure:1078: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1561: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   adns_cv_c_attribute_noreturn=yes
 else
@@ -1101,20 +1584,20 @@ EOF
 
    
  echo $ac_n "checking __attribute__((const))""... $ac_c" 1>&6
-echo "configure:1105: checking __attribute__((const))" >&5
+echo "configure:1588: checking __attribute__((const))" >&5
  if eval "test \"`echo '$''{'adns_cv_c_attribute_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
   cat > conftest.$ac_ext <<EOF
-#line 1111 "configure"
+#line 1594 "configure"
 #include "confdefs.h"
 
 int main() {
 extern int testfunction(int x) __attribute__((const))
 ; return 0; }
 EOF
-if { (eval echo configure:1118: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1601: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   adns_cv_c_attribute_const=yes
 else
@@ -1141,20 +1624,20 @@ EOF
 
    
  echo $ac_n "checking __attribute__((format...))""... $ac_c" 1>&6
-echo "configure:1145: checking __attribute__((format...))" >&5
+echo "configure:1628: checking __attribute__((format...))" >&5
  if eval "test \"`echo '$''{'adns_cv_attribute_format'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
   cat > conftest.$ac_ext <<EOF
-#line 1151 "configure"
+#line 1634 "configure"
 #include "confdefs.h"
 
 int main() {
 extern int testfunction(char *y, ...) __attribute__((format(printf,1,2)))
 ; return 0; }
 EOF
-if { (eval echo configure:1158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1641: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   adns_cv_attribute_format=yes
 else
@@ -1185,6 +1668,46 @@ EOF
  fi
 
 
+for ac_hdr in sys/select.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1676: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1681 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1686: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
 
 
 
@@ -1201,12 +1724,16 @@ fi
 
 
 
+
+
+SHLIBFORLINK='libadns.so'
+SHLIBSONAME='$(SHLIBFORLINK).$(MAJOR)'
+SHLIBFILE='$(SHLIBSONAME).$(MINOR)'
+
 SHLIBCC='$(CC) $(CFLAGS) -fpic'
-MKSHLIB_1='$(CC) $(LDFLAGS) -shared -Wxl,soname=$(SONAME) -o'
+MKSHLIB_1='$(CC) $(LDFLAGS) -shared -Wl,-soname=$(SHLIBSONAME) -o'
 MKSHLIB_2=''
 MKSHLIB_3='-lc'
-SHLIBFILE='libadns.so.$(MAJOR).$(MINOR)'
-SHLIBSONAME='libadns.so.$(MAJOR)'
 
 trap '' 1 2 15
 cat > confcache <<\EOF
@@ -1231,7 +1758,7 @@ EOF
 # 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.
 (set) 2>&1 |
-  case `(ac_space=' '; set) 2>&1` in
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
   *ac_space=\ *)
     # `set' does not quote correctly, so add quotes (double-quote substitution
     # turns \\\\ into \\, and sed turns \\ into \).
@@ -1298,7 +1825,7 @@ do
     echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
     exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
   -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
-    echo "$CONFIG_STATUS generated by autoconf version 2.12"
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
     exit 0 ;;
   -help | --help | --hel | --he | --h)
     echo "\$ac_cs_usage"; exit 0 ;;
@@ -1307,6 +1834,7 @@ do
 done
 
 ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
 
 trap 'rm -fr `echo "settings.make Makefile
        src/Makefile client/Makefile dynamic/Makefile regress/Makefile
@@ -1319,9 +1847,11 @@ sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
  s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
 $ac_vpsub
 $extrasub
+s%@SHELL@%$SHELL%g
 s%@CFLAGS@%$CFLAGS%g
 s%@CPPFLAGS@%$CPPFLAGS%g
 s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
 s%@DEFS@%$DEFS%g
 s%@LDFLAGS@%$LDFLAGS%g
 s%@LIBS@%$LIBS%g
@@ -1340,13 +1870,20 @@ s%@includedir@%$includedir%g
 s%@oldincludedir@%$oldincludedir%g
 s%@infodir@%$infodir%g
 s%@mandir@%$mandir%g
+s%@ENABLE_DYNAMIC@%$ENABLE_DYNAMIC%g
 s%@CC@%$CC%g
+s%@CPP@%$CPP%g
 s%@RANLIB@%$RANLIB%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PROGS_HAVE_TSEARCH@%$PROGS_HAVE_TSEARCH%g
 s%@WARNS@%$WARNS%g
 s%@SHLIBCC@%$SHLIBCC%g
 s%@MKSHLIB_1@%$MKSHLIB_1%g
 s%@MKSHLIB_2@%$MKSHLIB_2%g
 s%@MKSHLIB_3@%$MKSHLIB_3%g
+s%@SHLIBFORLINK@%$SHLIBFORLINK%g
 s%@SHLIBFILE@%$SHLIBFILE%g
 s%@SHLIBSONAME@%$SHLIBSONAME%g
 
@@ -1427,6 +1964,10 @@ for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
     top_srcdir="$ac_dots$ac_given_srcdir" ;;
   esac
 
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
 
   echo creating "$ac_file"
   rm -f "$ac_file"
@@ -1442,6 +1983,7 @@ for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
 s%@configure_input@%$configure_input%g
 s%@srcdir@%$srcdir%g
 s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
 " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
 fi; done
 rm -f conftest.s*
index 0267a37..55b8128 100644 (file)
@@ -1,7 +1,12 @@
 # configure.in - input to autoconf
 #  
-#  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
+#  This file is
+#    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
 #
+#  It is part of adns, which is
+#    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+#    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+#  
 #  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 2, or (at your option)
 
 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))
+
 ADNS_C_GCCATTRIB
+AC_CHECK_HEADERS(sys/select.h)
 
 AC_SUBST(WARNS)
 
@@ -43,15 +127,19 @@ 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 -Wxl,soname=$(SONAME) -o'
+MKSHLIB_1='$(CC) $(LDFLAGS) -shared -Wl,-soname=$(SHLIBSONAME) -o'
 MKSHLIB_2=''
 MKSHLIB_3='-lc'
-SHLIBFILE='libadns.so.$(MAJOR).$(MINOR)'
-SHLIBSONAME='libadns.so.$(MAJOR)'
 
 AC_OUTPUT(
        settings.make Makefile
index 905f601..8c5f810 100644 (file)
@@ -1,6 +1,11 @@
 # dynamic/Makefile - dynamic library Makefile
 # 
-#  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
+#  This file is
+#    Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+#
+#  It is part of adns, which is
+#    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+#    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
 #  
 #  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
 srcdir=                @srcdir@
 VPATH=         @srcdir@
 
-TARGETS=       $(SHLIBFILE)
+TARGETS=       $(SHLIBFILE) $(SHLIBSONAME) $(SHLIBFORLINK)
 include                $(srcdir)/../settings.make
 include                $(srcdir)/../src/adns.make
 
-ALLOBJS=       $(addsuffix _p.o, $(basename $(LIBOBJS))) $(LDLIBS)
+ALLOBJS=       $(addsuffix _p.o, $(basename $(LIBOBJS)))
 
 install:
                $(INSTALL_PROGRAM) $(SHLIBFILE) $(lib_dir)/$(SHLIBFILE)
+               ln -sf $(SHLIBFILE) $(lib_dir)/$(SHLIBSONAME)
 
 uninstall:
-               rm -f $(lib_dir)/$(SHLIBFILE)
+               rm -f $(lib_dir)/$(SHLIBFILE) $(lib_dir)/$(SHLIBSONAME)
+
+$(SHLIBFORLINK):
+               ln -s $(SHLIBSONAME) $(SHLIBFORLINK)
+
+$(SHLIBSONAME):
+               ln -s $(SHLIBFILE) $(SHLIBSONAME)
 
 $(SHLIBFILE):  $(ALLOBJS)
                rm -f $@
-               $(MKSHLIB_1) $@ $(MKSHLIB_2) $(ALLOBJS) $(MKSHLIB_3)
+               $(MKSHLIB_1) $@ $(MKSHLIB_2) $(ALLOBJS) $(LDLIBS) $(MKSHLIB_3)
 
 %_p.o:         $(srcdir)/../src/%.c $(srcdir)/../src/adns.h \
                        $(srcdir)/../src/internal.h $(srcdir)/../src/config.h
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..ebc6691
--- /dev/null
@@ -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
index 154e5a9..21dc051 100644 (file)
@@ -1,8 +1,6 @@
 Makefile
-harness.h
-hcommon.c
-hrecord
-hrecord.c
-hplayback
-hplayback.c
+*_record
+*_playback
 output-*.*
+pipe.out
+pipe.err
index 9a249c2..47a01bb 100644 (file)
@@ -1,6 +1,11 @@
 # regress/Makefile - regression test Makefile
 # 
-#  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
+#  This file is
+#    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+#
+#  It is part of adns, which is
+#    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+#    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
 #  
 #  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
 srcdir=                @srcdir@
 VPATH=         @srcdir@
 
-TARGETS=       hplayback hrecord
-AUTOCSRCS=     harness.h hrecord.c hplayback.c hcommon.c
+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                $(srcdir)/../settings.make
 include                $(srcdir)/../src/adns.make
 
 DIRCFLAGS=     -I$(srcdir)/../src
 
-HCPPFLAGS:= $(foreach F,                       \
-       gettimeofday select                     \
-       socket fcntl connect close              \
-       sendto recvfrom read write writev       \
-, -D$F=H$F)
+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
 
-HARNLOBJS=     $(addsuffix _d.o, $(basename $(LIBOBJS))) $(LDLIBS)
-ALLOBJS=       $(HARNLOBJS) dtest.o hrecord.o hplayback.o hcommon.o
+.PRECIOUS:     $(AUTOCSRCS) $(AUTOCHDRS)
 
-.PRECIOUS:     $(AUTOCSRCS)
+all install uninstall: $(TARGETS)
 
 check:         $(TARGETS)
                ./checkall
 
-hrecord:       adnstest_c.o hrecord.o hcommon.o $(HARNLOBJS)
-hplayback:     adnstest_c.o hplayback.o hcommon.o $(HARNLOBJS)
+LINK_CMD=      $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
+
+%_record:      %_c.o hrecord.o $(HARNLOBJS)
+               $(LINK_CMD)
+
+%_playback:    %_c.o hplayback.o $(HARNLOBJS)
+               $(LINK_CMD)
+
+adnshost_%:    $(ADH_OBJS) h%.o $(HARNLOBJS)
+               $(LINK_CMD)
 
-%_d.o:         $(srcdir)/../src/%.c
+%_d.o:         $(srcdir)/../src/%.c hredirect.h
                $(CC) $(HCPPFLAGS) -c -g -o $@ $<
 
-%_c.o:         $(srcdir)/../client/%.c
+%_c.o:         $(srcdir)/../client/%.c hredirect.h
                $(CC) $(HCPPFLAGS) -I $(srcdir)/../src -c -g -o $@ $<
 
-$(ALLOBJS):    $(srcdir)/../src/adns.h $(srcdir)/../src/internal.h harness.h
+$(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 $< >$@-a.new
index 3c3138c..c5ecbe8 100755 (executable)
@@ -1,5 +1,26 @@
 #!/bin/sh
 # usage: ./addcases <casename> ...
+#
+#  This file is
+#    Copyright (C) 1998-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+#
+#  It is part of adns, which is
+#    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+#    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+#  
+#  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 2, 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,
+#  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 set -e
 
diff --git a/regress/adnshost-xinitflags.text b/regress/adnshost-xinitflags.text
new file mode 100644 (file)
index 0000000..809195c
--- /dev/null
@@ -0,0 +1 @@
+--debug --config 
diff --git a/regress/adnslogres-xinitflags.text b/regress/adnslogres-xinitflags.text
new file mode 100644 (file)
index 0000000..89d4c11
--- /dev/null
@@ -0,0 +1 @@
+-d -C
diff --git a/regress/adnsresfilter-xinitflags.text b/regress/adnsresfilter-xinitflags.text
new file mode 100644 (file)
index 0000000..809195c
--- /dev/null
@@ -0,0 +1 @@
+--debug --config 
diff --git a/regress/case-1stservbroken.err b/regress/case-1stservbroken.err
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/regress/case-1stservbroken.out b/regress/case-1stservbroken.out
new file mode 100644 (file)
index 0000000..8a1790c
--- /dev/null
@@ -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 (file)
index 0000000..3cb74e4
--- /dev/null
@@ -0,0 +1,183 @@
+adnstest 1stservbroken
+:12 trunc.test.iwj.relativity.greenend.org.uk
+ start 940102940.701451
+ socket 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 *addrlen=16
+ 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 *addrlen=16
+ 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 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 *addrlen=16
+ 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 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 (file)
index 0000000..e69de29
diff --git a/regress/case-1stservtotcp.out b/regress/case-1stservtotcp.out
new file mode 100644 (file)
index 0000000..fe2f632
--- /dev/null
@@ -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 (file)
index 0000000..77f5bd3
--- /dev/null
@@ -0,0 +1,159 @@
+adnstest 1stservto
+:12 trunc.test.iwj.relativity.greenend.org.uk
+ start 940100259.965940
+ socket 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 *addrlen=16
+ 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 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 *addrlen=16
+ 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 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 (file)
index 0000000..e69de29
diff --git a/regress/case-2ndservok.out b/regress/case-2ndservok.out
new file mode 100644 (file)
index 0000000..2c72438
--- /dev/null
@@ -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 (file)
index 0000000..fdb8e27
--- /dev/null
@@ -0,0 +1,47 @@
+adnstest 2ndserver
+:1 davenant.relativity.greenend.org.uk
+ start 940100095.012145
+ socket 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 *addrlen=16
+ 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 *addrlen=16
+ 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 (file)
index 0000000..e69de29
diff --git a/regress/case-2ndservtcp.out b/regress/case-2ndservtcp.out
new file mode 100644 (file)
index 0000000..857176d
--- /dev/null
@@ -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 (file)
index 0000000..b79bfd4
--- /dev/null
@@ -0,0 +1,168 @@
+adnstest 2ndserver
+:12 trunc.test.iwj.relativity.greenend.org.uk
+ start 940100083.268555
+ socket 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 *addrlen=16
+ 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 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 *addrlen=16
+ 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 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-abbrev.err b/regress/case-abbrev.err
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/regress/case-abbrev.out b/regress/case-abbrev.out
new file mode 100644 (file)
index 0000000..1f786ef
--- /dev/null
@@ -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 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 PTR(checked) ownflags=a: nodata; nrrs=0; cname=$; owner=$; ttl=86400
+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 (file)
index 0000000..0fd7a73
--- /dev/null
@@ -0,0 +1,282 @@
+adnstest default
+,a/greenend.org.uk
+ start 929580078.542974
+ socket 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000367
+ sendto fd=4 addr=172.18.45.6:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000367
+ sendto fd=4 addr=172.18.45.6:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000366
+ sendto fd=4 addr=172.18.45.6:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000378
+ sendto fd=4 addr=172.18.45.6:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000391
+ sendto fd=4 addr=172.18.45.6:53
+     312d0100 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ recvfrom=OK addr=172.18.45.6:53
+     31288580 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 *addrlen=16
+ 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 *addrlen=16
+ recvfrom=OK addr=172.18.45.6:53
+     31298580 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 *addrlen=16
+ recvfrom=EAGAIN
+ +0.000268
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.948491
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.002741
+ recvfrom fd=4 buflen=512 *addrlen=16
+ recvfrom=OK addr=172.18.45.6:53
+     312a8580 00010000 00010000 08677265 656e656e 64036f72 6702756b 00000c00
+     01c00c00 06000100 01518000 2d026e73 06636869 61726bc0 0c0a686f 73746d61
+     73746572 c00c7727 41340000 70800000 1c200009 3a800001 5180.
+ +0.000540
+ recvfrom fd=4 buflen=512 *addrlen=16
+ recvfrom=EAGAIN
+ +0.000129
+ select max=5 rfds=[4] wfds=[] efds=[] to=1.945447
+ select=1 rfds=[4] wfds=[] efds=[]
+ +0.005215
+ recvfrom fd=4 buflen=512 *addrlen=16
+ recvfrom=OK addr=172.18.45.6:53
+     312b8580 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 *addrlen=16
+ 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 *addrlen=16
+ recvfrom=OK addr=172.18.45.6:53
+     312c8580 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 *addrlen=16
+ 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 *addrlen=16
+ recvfrom=OK addr=172.18.45.6:53
+     312d8580 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 *addrlen=16
+ 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 (file)
index 0000000..e69de29
diff --git a/regress/case-abbrevto.out b/regress/case-abbrevto.out
new file mode 100644 (file)
index 0000000..bfda79c
--- /dev/null
@@ -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 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 A(addr) 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 PTR(checked) 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
+rc=0
diff --git a/regress/case-abbrevto.sys b/regress/case-abbrevto.sys
new file mode 100644 (file)
index 0000000..f61cd0a
--- /dev/null
@@ -0,0 +1,1239 @@
+adnstest noserver
+,a/greenend.org.uk
+ start 929580082.699581
+ socket 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000319
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000319
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000319
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000319
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000343
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000270
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000293
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000271
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000271
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000318
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000294
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000317
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000301
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000321
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000279
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000276
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000300
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000294
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000277
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000275
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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
+     31280100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000100
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     31290100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000200
+     01.
+ sendto=33
+ +0.000273
+ sendto fd=4 addr=172.18.45.36:53
+     312a0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000c00
+     01.
+ sendto=33
+ +0.000272
+ sendto fd=4 addr=172.18.45.36:53
+     312b0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000f00
+     01.
+ sendto=33
+ +0.000274
+ sendto fd=4 addr=172.18.45.36:53
+     312c0100 00010000 00000000 08677265 656e656e 64036f72 6702756b 00000600
+     01.
+ sendto=33
+ +0.000296
+ sendto fd=4 addr=172.18.45.36:53
+     312d0100 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-adh-cancel.err b/regress/case-adh-cancel.err
new file mode 100644 (file)
index 0000000..72d3373
--- /dev/null
@@ -0,0 +1,2 @@
+adns debug: using nameserver 172.18.45.6
+adns debug: reply not found, id 311f, 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 (file)
index 0000000..043c851
--- /dev/null
@@ -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 (file)
index 0000000..0c542a9
--- /dev/null
@@ -0,0 +1,73 @@
+./adnshost default -f
+
+ start 969124425.922896
+ socket 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
+     311f0100 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
+     31200100 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 *addrlen=16
+ 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 2d01.
+ +0.000551
+ recvfrom fd=6 buflen=512 *addrlen=16
+ 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.000579
+ recvfrom fd=6 buflen=512 *addrlen=16
+ 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 (file)
index 0000000..2886e3c
--- /dev/null
@@ -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 (file)
index 0000000..ab3f8d1
--- /dev/null
@@ -0,0 +1 @@
+rc=0
diff --git a/regress/case-adh-cancel2.sys b/regress/case-adh-cancel2.sys
new file mode 100644 (file)
index 0000000..f954087
--- /dev/null
@@ -0,0 +1,59 @@
+./adnshost default -f
+
+ start 969124594.885114
+ socket 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
+     311f0100 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 *addrlen=16
+ 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 2d01.
+ +0.000553
+ recvfrom fd=6 buflen=512 *addrlen=16
+ 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 (file)
index 0000000..d183cd5
--- /dev/null
@@ -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 (file)
index 0000000..ab3f8d1
--- /dev/null
@@ -0,0 +1 @@
+rc=0
diff --git a/regress/case-adh-cancel3.sys b/regress/case-adh-cancel3.sys
new file mode 100644 (file)
index 0000000..736a9a4
--- /dev/null
@@ -0,0 +1,90 @@
+./adnshost default -f
+
+ start 969129578.690081
+ socket 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 *addrlen=16
+ 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 (file)
index 0000000..2886e3c
--- /dev/null
@@ -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 (file)
index 0000000..662ff60
--- /dev/null
@@ -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 (file)
index 0000000..672908f
--- /dev/null
@@ -0,0 +1,34 @@
+./adnshost default
+chiark.greenend.org.uk
+ start 969122933.609498
+ socket 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
+     311f0100 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 *addrlen=16
+ 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 2d01.
+ +0.000895
+ recvfrom fd=4 buflen=512 *addrlen=16
+ 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 (file)
index 0000000..2886e3c
--- /dev/null
@@ -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 (file)
index 0000000..662ff60
--- /dev/null
@@ -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 (file)
index 0000000..320720a
--- /dev/null
+++ b/