chiark / gitweb /
5 years agoregress/gdbwrap: Provide a convenience script
Ian Jackson [Wed, 23 Jul 2014 23:52:51 +0000 (00:52 +0100)]
regress/gdbwrap: Provide a convenience script

This lets you run gdb from within r1test with appropriate fd plumbing.
(It's a shame gdb doesn't have a way to simply tell it to take its
commands from /dev/tty.)

Add the suggested example gdb script file, x.gdb, to .gitignore.

Signed-off-by: Ian Jackson <>
5 years agoregress: New test bogus-sortlist
Ian Jackson [Sat, 19 Jul 2014 18:55:39 +0000 (19:55 +0100)]
regress: New test bogus-sortlist

Exercise the code which checks the sortlist for invalid address/mask

Signed-off-by: Ian Jackson <>
5 years agoaddrfam: Make SIN, SIN6 more regular
Ian Jackson [Sat, 19 Jul 2014 16:39:46 +0000 (17:39 +0100)]
addrfam: Make SIN, SIN6 more regular

Abolish CSIN and CSIN6.  Instead, provide a first argument which may
be `const' or empty.  (Empty macro arguments are permitted since C99.)

This makes them useable in SOCKADDR_IN_IN6*, so use them there.

Signed-off-by: Ian Jackson <>
5 years agoaddrfam: Introduce SOCKADDR_IN_IN6, etc.
Ian Jackson [Sat, 19 Jul 2014 16:37:37 +0000 (17:37 +0100)]
addrfam: Introduce SOCKADDR_IN_IN6, etc.

These macros make writing IPv4/IPv6 handling functions convenient.
Use them everywhere applicable.

This replaces AF_CASES, which was longwinded (and also error-prone,
since it is possible to pass a different af to switch() and

Signed-off-by: Ian Jackson <>
5 years agoaddrfam: New arrangements for protocol address types
Ian Jackson [Sat, 12 Jul 2014 11:56:46 +0000 (12:56 +0100)]
addrfam: New arrangements for protocol address types

Abolish union gen_addr and struct af_addr.  It is not legitimate to
up-cast to a union (since the alignment might be wrong), and the
profusion of additonal address types is confusing.

The new arrangements are:

* Use adns_sockaddr wherever we can.  That includes situations
  where the port (or v6 scope, etc.) is not relevant.

* Where that's not possible, use a struct sockaddr if we can.

* Where we need to deal with an IP address of unspecified family (we
  use the phrase `protocol address') we must use a void*.

Other changes we make here:

* Reorganise the set of functions provided by addrfam.c.  Previously
  there was a comprehensive set of manipulators.  Now, we have
  precisely the set of functions we need.

  The new functions are called adns__addr_* when they deal with
  adns_sockaddrs, and adns_sockaddr_* when dealing with struct

  The new functions normally no longer need to take an explicit af
  parameter, since they can use the af field in the sockaddr.

* adns__sockaddrs_equal (previously, adns__sockaddr_equal_p) now uses
  the generic protocol address comparison function; consequently
  remove the IN6_ADDR_EQUALP macro since it now has only one use site.

* Remove the Lispy "-p" suffix from predicate function names.

And of course the very formulaic changes to code which accesses
addresses of various kinds.

Signed-off-by: Ian Jackson <>
5 years agoaddrfam: mark unknown_af as not returning
Ian Jackson [Sat, 19 Jul 2014 15:10:46 +0000 (16:10 +0100)]
addrfam: mark unknown_af as not returning

Signed-off-by: Ian Jackson <>
5 years ago.gitignore: add addrtext_s, remove non-built dynamic local tests
Ian Jackson [Sat, 19 Jul 2014 14:55:30 +0000 (15:55 +0100)]
.gitignore: add addrtext_s, remove non-built dynamic local tests

Signed-off-by: Ian Jackson <>
5 years agoSupport IPv6 in addr queries.
Mark Wooding [Wed, 11 Jun 2014 00:02:49 +0000 (01:02 +0100)]
Support IPv6 in addr queries.

This is the end-game.  Add flags and options to allow clients and
administrators to choose which address families they want returned.  For
logical compatibility with old clients, don't return foreign address
families unless explicitly requested.

Lots of tests are modified to select only IPv4 addresses.  There's
nothing else up my sleeve.  A new test is added for the additional
functionality; more are expected later.

Signed-off-by: Mark Wooding <>
Signed-off-by: Ian Jackson <>
5 years agosrc/types.c: Handle inconsistent CNAME records between addr answers.
Mark Wooding [Tue, 10 Jun 2014 23:40:42 +0000 (00:40 +0100)]
src/types.c: Handle inconsistent CNAME records between addr answers.

It can happen, if we have multiple address queries outstanding, that
they disagree about whether the original name has a CNAME record, or
what the CNAME target is.  This needn't be a configuration error or a
server bug: the zone might have been caught during a changeover.  So we
should try to handle this situation gracefully.

We resolve this as follows.  At least one answer must have reported a
CNAME record, else there is no ambiguity.  We choose the first such
record to arrive, and commit to it, discarding other addresses already
received, if any.  We then resubmit address queries for the address
types still outstanding, but asking specifically for the CNAME target
rather than the original name.

Signed-off-by: Mark Wooding <>
5 years agoSupport v6-mapping IPv4 addresses found doing addr lookups.
Mark Wooding [Tue, 10 Jun 2014 23:33:00 +0000 (00:33 +0100)]
Support v6-mapping IPv4 addresses found doing addr lookups.

Not available if the client doesn't have the larger adns_rr_addr

Signed-off-by: Mark Wooding <>
Signed-off-by: Ian Jackson <>
5 years agosrc/types.c: Cope with multiple address families when dereferencing.
Mark Wooding [Tue, 10 Jun 2014 23:14:10 +0000 (00:14 +0100)]
src/types.c: Cope with multiple address families when dereferencing.

The pap_findaddrs/pap_hostaddr machinery is improved to cope with
multiple address families.  First of all, we must find out which
families are wanted, using addr_rrtypes.  Then we keep track of which
address types are satisfied from the additional section, during
pap_findaddrs, and submit addr subqueries to look them up.

We no longer issue the top-level addr query: we handle the individual
subqueries ourselves, because we have to merge the results onto the
existing vector of addresses.

Signed-off-by: Mark Wooding <>
Signed-off-by: Ian Jackson <>
5 years agosrc/types.c: Better record parsing for addr queries.
Mark Wooding [Tue, 10 Jun 2014 23:03:17 +0000 (00:03 +0100)]
src/types.c: Better record parsing for addr queries.

The parser now needs to know which kind of record it's meant to be
dealing with, so that it can convert it into the right kind of socket
address.  As a result, pap_findaddrs needs to pass in the right record
type when parsing addresses from the additional section, so we separate
out the main work into a separate function.

Signed-off-by: Mark Wooding <>
5 years agosrc/types.c: Start on IPv6 support in adns_r_addr queries.
Mark Wooding [Tue, 10 Jun 2014 22:44:13 +0000 (23:44 +0100)]
src/types.c: Start on IPv6 support in adns_r_addr queries.

The way addr queries work internally is now very different.  The
toplevel query is now `virtual', and exists to spawn subqueries for each
applicable address type (currently hardcoded to A only, but this will
change later).

The toplevel query has a callback function which assembles its answer
from the various child queries, and there's a collection of support
machinery too.  (Some of the bookkeeping done during this may seem
unnecessary, but it will come in handy later.)

Because more of the work is now done in internal query callbacks, some
of the answers in the tests are reported in different order.  See
`Reentrancy: Avoid reentrant callbacks' for more detailed explanation
of a similar change.

Signed-off-by: Mark Wooding <>
Signed-off-by: Ian Jackson <>
5 years agoReentrancy: Avoid reentrant callbacks
Ian Jackson [Sun, 12 Oct 2014 21:03:43 +0000 (22:03 +0100)]
Reentrancy: Avoid reentrant callbacks

Avoid making reentrant callbacks for internal queries during other

Currently there is a theoretical reentrancy bug in
adns__submit_internal, if the internal query can itself be persuaded
to fail immediately.  The result would be a reentrant call to
callback() for the child query inside functions like typei->parse.

The possibility of such reentrancy is a bug waiting to happen - and
indeed we are going to introduce more complicated query submissions
which are more likely to fail immediately, turning this from a
theoretical to a real bug.

Solve this as follows: when an internal query completes, just put it
on a list.  Whenever we are on our way out of adns, we look through
this list and make the callbacks (until the list is empty).

This means that a fair amount of code needs to be taught that it might
encounter queries in this callback pending state.

We have to update some of the tests' expected output:

Because adns now processes the callback later, a number of the
parallel subqueries made by some of the tests end up finishing before
being cancelled - and therefore the replies to those subqueries don't
show up in the debug output as unrecognised.

Also, in case-norecurse, the deferral of the callback causes the order
of result reporting to be changed: the main query due to subqueries
finishing (`PTR(checked)') ends up later on the results queue than the
other queries dealt with in the same event loop iteration.  (The
actual answer packet to final query, `CNAME(-)', arrives later.)

Signed-off-by: Ian Jackson <>
5 years agoReentrancy: Introduce adns__cancel
Ian Jackson [Sun, 12 Oct 2014 21:10:14 +0000 (22:10 +0100)]
Reentrancy: Introduce adns__cancel

We need a version of adns_cancel which does not call adns_returning,
for internal call sites who want to avoid reentrancy hazards.

Signed-off-by: Ian Jackson <>
5 years agoReentrancy: Introduce adns__returning
Ian Jackson [Sun, 12 Oct 2014 20:35:25 +0000 (21:35 +0100)]
Reentrancy: Introduce adns__returning

Replace all the adns__consistency calls on the return paths from adns
with adns__returning (except in setup.c, whose functions never set up
any queries).

I have separately gone through the public entrypoints in adns.h and
checked that they have the expected adns__consistency calls.  So with
this patch, the new imprecation about adns__returning is satisfied.

Signed-off-by: Ian Jackson <>
5 years agoReentrancy: Add warning comment to adns__must_gettimeofday
Ian Jackson [Sun, 12 Oct 2014 20:18:29 +0000 (21:18 +0100)]
Reentrancy: Add warning comment to adns__must_gettimeofday

Signed-off-by: Ian Jackson <>
5 years agoReentrancy: adns__internal_submit does list handling
Ian Jackson [Sun, 12 Oct 2014 20:10:23 +0000 (21:10 +0100)]
Reentrancy: adns__internal_submit does list handling

Move the formulaic queue management from the call sites to
adns__internal_submit.  The requirement to do this wasn't mentioned in
adns__internal_submit's comment, and now that it's not there it
probably isn't worth remarking on.

No ultimate functional change.

Signed-off-by: Ian Jackson <>
5 years agosrc/types.c: When sorting, IPv4 prefixes match v6-mapped IPv4 addresses.
Mark Wooding [Tue, 10 Jun 2014 20:57:52 +0000 (21:57 +0100)]
src/types.c: When sorting, IPv4 prefixes match v6-mapped IPv4 addresses.

It's not very pretty, but the whole business of v6-mapped addresses is a
bodge, IMHO.

Signed-off-by: Mark Wooding <>
5 years agosrc/: New type hook `query_send'.
Mark Wooding [Sat, 7 Jun 2014 21:26:34 +0000 (22:26 +0100)]
src/: New type hook `query_send'.

Puts the type code in control of how to actually send the query off.  In
particular, this allows `virtual queries' which only actually spawn
child queries for interesting records, and then collate the results.

Signed-off-by: Mark Wooding <>
5 years agosrc/query.c: Export adns__cancel_children.
Mark Wooding [Sat, 7 Jun 2014 21:21:29 +0000 (22:21 +0100)]
src/query.c: Export adns__cancel_children.

We'll want this later.

Signed-off-by: Mark Wooding <>
5 years agosrc/query.c: New function `adns__free_interim' for releasing memory.
Mark Wooding [Sat, 7 Jun 2014 21:29:28 +0000 (22:29 +0100)]
src/query.c: New function `adns__free_interim' for releasing memory.

Useful, for example, if you're growing a dynamically allocated array.

Signed-off-by: Mark Wooding <>
5 years agosrc/: Track sizes of interim-allocated blocks.
Mark Wooding [Sat, 7 Jun 2014 18:47:28 +0000 (19:47 +0100)]
src/: Track sizes of interim-allocated blocks.

Now callers don't need to keep track of them by hand, which is annoying
and fiddly.

Signed-off-by: Mark Wooding <>
5 years agosrc/: Support for transport over IPv6 (and other protocol families).
Mark Wooding [Thu, 5 Jun 2014 09:24:23 +0000 (10:24 +0100)]
src/: Support for transport over IPv6 (and other protocol families).

We create a UDP socket for each distinct protocol family during
initialization, and then use the appropriate one for each server.  The
changes are somewhat invasive, but not really very complicated.

Signed-off-by: Mark Wooding <>
Signed-off-by: Ian Jackson <>
5 years agosrc/event.c: introduce ADD_POLLFD
Ian Jackson [Sun, 12 Oct 2014 18:50:25 +0000 (19:50 +0100)]
src/event.c: introduce ADD_POLLFD

Abstract away the fiddly fd array handling so that it is harder to
make mistakes.  We are going to want to add more fds.

No functional change in this patch.

Signed-off-by: Ian Jackson <>
5 years agoregress/: Include the protocol family in socket(2) lines.
Mark Wooding [Fri, 6 Jun 2014 09:40:28 +0000 (10:40 +0100)]
regress/: Include the protocol family in socket(2) lines.

I updated the test files with this rune:

grep -lZ "^ socket type=" *.sys | xargs -0r sed -i \
  's/^ socket type=/ socket domain=PF_INET type=/'

Signed-off-by: Mark Wooding <>
5 years agoregress/: Use adns_addr2text/text2addr instead of inet_aton/ntoa.
Mark Wooding [Wed, 28 May 2014 22:52:34 +0000 (23:52 +0100)]
regress/: Use adns_addr2text/text2addr instead of inet_aton/ntoa.

Makes the test harness agnostic regarding address families.

Signed-off-by: Mark Wooding <>
5 years agosrc/: Support IPv6 reverse queries.
Mark Wooding [Sat, 24 May 2014 13:00:03 +0000 (14:00 +0100)]
src/: Support IPv6 reverse queries.

This involves moving most of the label parser in ckl_ptr, and the
reverse-domain constructor, into addrfam and teaching them about IPv6.

The label parser is a little tricky because it involves keeping track of
a parse state for each possible address family until we run out of
possibilities or the parse is complete.

Moving the reverse-domain constructor introduces a slightly unpleasant
hack: because knowledge of the right reverse-lookup zone belongs in
addrfam, we get adns_submit_reverse to pass a sentinel through
_reverse_any to addrfam.

Signed-off-by: Mark Wooding <>
5 years agosrc/, client/: Support for AAAA lookups.
Mark Wooding [Sat, 24 May 2014 13:00:03 +0000 (14:00 +0100)]
src/, client/: Support for AAAA lookups.

I've added a couple of simple test cases.

Signed-off-by: Mark Wooding <>
5 years agosrc/, client/: Use the new adns_text2addr/addr2text functions.
Mark Wooding [Sat, 24 May 2014 13:00:03 +0000 (14:00 +0100)]
src/, client/: Use the new adns_text2addr/addr2text functions.

The sortlist is now IPv6 aware.  The nameserver configuration could cope
with IPv6 addresses, but the transport machinery can't, so we pick them
out by hand.  PTR reverse-query handling still doesn't do anything
special, because we don't have AAAA query support yet.

I've also hacked adnshost's `-i' and `--reverse' options to use the new
functions, and they'll accept IPv6 addresses, but the underlying
adns_submit_reverse machinery will reject them still.

Signed-off-by: Mark Wooding <>
5 years agosrc/addrfam.c (adns_addr2text): Don't print junk in debugging output.
Mark Wooding [Sat, 24 May 2014 13:00:03 +0000 (14:00 +0100)]
src/addrfam.c (adns_addr2text): Don't print junk in debugging output.

At the point we print `adns_addr2text: will print scoped addr ...' the
buffer isn't null-terminated.  Fortunately, we have the length of the
valid portion of the buffer, so use that to print only the good piece.

Signed-off-by: Mark Wooding <>
5 years agoNew public-facing functions for address/text conversions.
Ian Jackson [Tue, 3 Jun 2014 19:42:01 +0000 (20:42 +0100)]
New public-facing functions for address/text conversions.

The usual functions for doing these conversions are getaddrinfo(3) and
getnameinfo(3).  Unfortunately, these seem generally to be rather buggy
(with different bugs on different platforms).  For example, the Linux
glibc implementation tries to do complicated things with AF_NETLINK
sockets even though it's only going to do a simple syntactic

So we provide our own versions, which only handle conversions between
addresses and their text numerical representations (and don't try to do
anything complicated with DNS).

For compatibility, the functions handle various crazy things which are
generally undesirable:

  * traditional IPv4 text conversions allow degenerate forms A, A.B and
    A.B.C, where the host part is given as a simple number rather than
    being split into octets;

  * traditional IPv4 text conversions allow the individual components to
    be given in bases other than 10, using the usual C prefixes;

  * IPv6 socket addresses (but, annoyingly, not `struct in6_addr') have
    a `scope-id' field (which actually identifies what RFC4007 calls a
    `zone', i.e., the namespace in which the address should be
    interpreted), and these are described by a `%...' suffix; and

  * the `scope-id' may be a name, though the syntax and meaning of such
    names isn't defined anywhere except for the link-local scope, where
    the names and numbers are interface names and indices, which need to
    be looked up.

All of this means that there are a number of options and unfortunate
error conditions, which make the interface more complicated than is
really ideal.

Signed-off-by: Ian Jackson <>
Signed-off-by: Mark Wooding <>
5 years agosrc/addrfam.c, src/...: Abstract out address-family-specific details.
Mark Wooding [Sat, 24 May 2014 13:00:03 +0000 (14:00 +0100)]
src/addrfam.c, src/...: Abstract out address-family-specific details.

Functions which know about the internals of particular address types and
socket-address structures live in a new file `addrfam.c'.

Some details aren't handled yet: notably, we don't have conversions
between internal address structures and external formats such as text
strings or reverse-lookup domain names.

Signed-off-by: Mark Wooding <>
5 years agosrc/: Fix internals to carry around address families.
Mark Wooding [Tue, 3 Jun 2014 09:27:38 +0000 (10:27 +0100)]
src/: Fix internals to carry around address families.

This is preparatory work for IPv6 support, but there isn't any yet.
The code still acts directly on address structures (having asserted that
the family is AF_INET); switching on the address family is for later.

[ No functional change intended in this commit. -iwj ]

Signed-off-by: Mark Wooding <>
5 years agosrc/adns.h, src/types.c: Now adns_rr_addr can hold a sockaddr_in6.
Mark Wooding [Sun, 1 Jun 2014 00:20:47 +0000 (01:20 +0100)]
src/adns.h, src/types.c: Now adns_rr_addr can hold a sockaddr_in6.

This uses the recently introduced variable-size record structure
machinery so that only clients compiled against the new header file see
the larger record structure.

Note that we don't even try to actually do lookups for IPv6 addresses.
That will come later on.  This is just about sorting out the binary

Arrange that regress/case-brokenmail.sys asks for the correct record
size, because otherwise the answers get printed out wrongly.

[ I have done git-grep sizeof on a version of the head of this series
and found no un-corrected uses of sizeof(adns_rr_addr) -iwj. ]

Signed-off-by: Mark Wooding <>
5 years agoBodge adns_r_addr query-id selection and fix regression tests to match.
Mark Wooding [Fri, 30 May 2014 20:04:19 +0000 (21:04 +0100)]
Bodge adns_r_addr query-id selection and fix regression tests to match.

A future change is going to change how query-ids are allocated for
adns_r_addr queries.  So here we apply a simple bodge which will produce
the same allocation pattern, but without the complexity of the rest of
the change, and fix the test suite to match.

I used the script regress/hack-query-ids to help me modify the
case-*.sys files, though this was primarily a rather tedious manual

Signed-off-by: Mark Wooding <>
Signed-off-by: Ian Jackson <>
5 years agosrc/: Lay the groundwork for variably-sized record structures.
Mark Wooding [Sat, 31 May 2014 23:13:20 +0000 (00:13 +0100)]
src/: Lay the groundwork for variably-sized record structures.

All records in a particular answer are going to be the same size: that's
not going to change.  The case we're dealing with here is that we're
going to want to include new information (e.g., new kinds of address
families) which will make the structures larger -- and would break old
binary clients.

The plan is for new clients to encode a flag saying that they understand
the extended structure in the type field (implicitly, through a header-
file change).  But all of this means that just dredging `typei->rrsz'
out of the typeinfo structure isn't going to cut it any more, so we add
a type hook to compute the right size, and make sure that we use it by
renaming the slot containing the fixed value.  Most places in the code
can avoid having to call the hook by grabbing the record size from the
answer structure.

This involves adding an extra parameter to the postsort hook, which
otherwise might not be able to determine the right size for itself.

Signed-off-by: Mark Wooding <>
5 years agosrc/: Pass the wanted query's type code to adns__internal_submit.
Mark Wooding [Sat, 7 Jun 2014 18:38:01 +0000 (19:38 +0100)]
src/: Pass the wanted query's type code to adns__internal_submit.

This has two effects.  Firstly, we can propagate non-representation bits
(e.g., compatibility flags) from parent to child query.  Secondly, we
can have a single typeinfo handle several different low-level record
types.  The former is going to pay off very soon; the latter will take a
bit longer, but it'll be worth it.

Signed-off-by: Mark Wooding <>
5 years agosrc/: Carve out a `representation' subfield of adns_rrtype.
Mark Wooding [Sat, 31 May 2014 23:48:59 +0000 (00:48 +0100)]
src/: Carve out a `representation' subfield of adns_rrtype.

Only the bits covered by adns_rrt_reprmask are used in translating a
query type into a typeinfo structure.

Arrange for adnstest to only print out the representation bits of the
type; otherwise lots of the regression test files need to change for no
especially good reason.

Signed-off-by: Mark Wooding <>
5 years agosrc/: PTR queries now submit A subqueries, not `addr'.
Mark Wooding [Sun, 1 Jun 2014 10:07:07 +0000 (11:07 +0100)]
src/: PTR queries now submit A subqueries, not `addr'.

Signed-off-by: Mark Wooding <>
5 years agosrc/types.c, regress/: Use checklabel hook to parse PTR query domains.
Mark Wooding [Sun, 1 Jun 2014 20:50:59 +0000 (21:50 +0100)]
src/types.c, regress/: Use checklabel hook to parse PTR query domains.

A PTR with forward-lookup checking needs to parse the original question
into an address, so as to have something to compare the results of the
forward queries against.  Previously this was done in pa_ptr, when the
first PTR answer came in.  But parsing can fail, and is a simple
syntactic computation on the input domain name, so it seems rather
unfortunate to delay checking the name until an answer has come in.  Now
that we have the checklabel hook, then, we might as well use it here.
(Indeed, this is in fact the reason for introducing it.)

Unfortunately, this check now rejects a number of queries early, which
previously would have resulted in a query and maybe a NODATA or NXDOMAIN
answer, but in exactly the way we just rigged all of the test cases.  So
we remove the temporary hack to adns_submit and everything stays good.

Signed-off-by: Mark Wooding <>
5 years agosrc/, regress/: Prepare for early failures in PTR queries.
Mark Wooding [Sat, 7 Jun 2014 11:26:46 +0000 (12:26 +0100)]
src/, regress/: Prepare for early failures in PTR queries.

Soon we're going to change the way adns_r_ptr queries work: in
particular, queries with names which can't be parsed back into addresses
will be rejected during submission rather than waiting for the answer to
the initial PTR question to come back.

So here we apply a really simple temporary hack to adns_submit which
approximately captures the behaviour we're after, and adjust the various
test cases to match.  We'll take this hack out when we make the proper
change to the PTR handling.

Hopefully this will persuade reviewers that there's nothing up my
sleeves while I mess with the regression tests.

Signed-off-by: Mark Wooding <>
5 years agoregress/r1test: Support an `ADNS_TEST_DEBUG' env var.
Mark Wooding [Sat, 31 May 2014 22:05:19 +0000 (23:05 +0100)]
regress/r1test: Support an `ADNS_TEST_DEBUG' env var.

Amazingly, sometimes the tests don't pass.  When that happens, it's
handy to be able to debug the library and find out why.

It's a little tricky to attach GDB to the running process directly.  I
used the following:

$ ADNS_TEST_DEBUG"noip gdbserver localhost:666" ./r1test CASE

and then, in another terminal, something like

$ noip gdb adnstest_s
(gdb) target remote localhost:666

to debug the program.

Signed-off-by: Mark Wooding <>
Signed-off-by: Ian Jackson <>
6 years agosrc/: Change how query domain names are checked.
Mark Wooding [Sat, 31 May 2014 16:26:34 +0000 (17:26 +0100)]
src/: Change how query domain names are checked.

The `qdparselabel' hook is no more.  Unescaping of the query domain is
now done in one place, and always in the same way.  Checking of the
domain name is done through a new `checklabel' hook, with a more
convenient interface.

The checklabel hook does not have the original possibly-escaped version
of the query domain available to it; it can only check the name being
submitted on the wire, not the form in which it was provided to the
library.  This eliminates the inconsistency in SRV record handling,


is acceptable, but


is not.  It also now prohibits SRV queries on `_wrong', which I think
was always intended but didn't actually work.

All queries are checked, including internally generated ones, so this
can be used to store information about the query domain for later use,
so we let the hook store information in the qcontext structure.

Signed-off-by: Mark Wooding <>
6 years agosrc/: adns__internal_submit can modify ctx->tinfo.
Mark Wooding [Sat, 31 May 2014 17:56:42 +0000 (18:56 +0100)]
src/: adns__internal_submit can modify ctx->tinfo.

It will be convenient for type hooks to store information in their part
of the query context before the query is properly established.  We could
have adns__internal_submit make a copy of the caller's context, but it
turns out that none of them actually care if we change it.

Signed-off-by: Mark Wooding <>
6 years agosrc/internal.h: Hoist the qcontext definition to before typeinfo.
Mark Wooding [Sat, 31 May 2014 15:37:48 +0000 (16:37 +0100)]
src/internal.h: Hoist the qcontext definition to before typeinfo.

So that typeinfo functions can have argument types which involve the
qcontext structure.

Signed-off-by: Mark Wooding <>
6 years agosrc/types.c: Rearrange the main typeinfo table.
Mark Wooding [Sat, 31 May 2014 14:24:41 +0000 (15:24 +0100)]
src/types.c: Rearrange the main typeinfo table.

Kill XTRA_TYPE, which won't scale at all well as new features are added
to the typeinfo structure.  Instead, allow additional arguments to
FLAT/DEEP_TYPE, which are used to carry designated initializers for the
more unusual fields.

I took the opportunity to factor out some common prefixes in the names
of the functions listed in the table, which gives us some additional
horizontal space.  This will come in useful later.

All of this involves a little nontrivial macrology, now in internal.h.

Signed-off-by: Mark Wooding <>
6 years agoregress/: Don't track the size of the socket-address buffer in recvfrom(3).
Mark Wooding [Wed, 28 May 2014 22:26:37 +0000 (23:26 +0100)]
regress/: Don't track the size of the socket-address buffer in recvfrom(3).

This is system specific, and (more annoyingly) will break the tests if
additional address families are supported in the future.

Signed-off-by: Mark Wooding <>
6 years agosrc/: Separate context state into parts for the type itself and its parent.
Mark Wooding [Sun, 25 May 2014 15:57:41 +0000 (16:57 +0100)]
src/: Separate context state into parts for the type itself and its parent.

The `' union has two distinct uses.  A PTR query uses it to
store the initial query address, against which it compares the answer to
its child A query.  On the other hand, `pap_hostaddr' uses this space in
each child query it makes, to keep track of where to put the socket
addresses when the answers come back.

These two kinds of uses are incompatible, so split `' into
two pieces: one for the internal use of a query type, and one for the
use of a child query's parent -- and specifically for its completion

Signed-off-by: Mark Wooding <>
6 years agosrc/types.c: Fix up the table-of-contents comments.
Mark Wooding [Mon, 9 Jun 2014 09:41:33 +0000 (10:41 +0100)]
src/types.c: Fix up the table-of-contents comments.

Cheesy but useful sed(1) rune:

sed -n '
  /order of sections/,/\*\//d
  /^ \* _/s///p
  /^static \+[a-z0-9_]\+ \+\**\([0-9a-z_]\+\).*$/s//  \1/p'

Signed-off-by: Mark Wooding <>
6 years agoclient/adh-query.c: Surprising comma rather than semicolon.
Mark Wooding [Sat, 7 Jun 2014 23:01:46 +0000 (00:01 +0100)]
client/adh-query.c: Surprising comma rather than semicolon.

This doesn't change the meaning of the code, but it's really surprising.

Signed-off-by: Mark Wooding <>
6 years agosrc/adns-internal.h: Kill decoy internal header file.
Mark Wooding [Sat, 31 May 2014 14:07:44 +0000 (15:07 +0100)]
src/adns-internal.h: Kill decoy internal header file.

Signed-off-by: Mark Wooding <>
6 years agosrc/internal.h: Delete decoy type `rr_align'.
Mark Wooding [Sat, 7 Jun 2014 17:02:53 +0000 (18:02 +0100)]
src/internal.h: Delete decoy type `rr_align'.

The droid you were looking for is called `union maxalign'.

Signed-off-by: Mark Wooding <>
6 years agosrc/types.c: Remove some unused macros.
Mark Wooding [Sat, 31 May 2014 14:05:17 +0000 (15:05 +0100)]
src/types.c: Remove some unused macros.

Signed-off-by: Mark Wooding <>
6 years agoRemove unused variables.
Mark Wooding [Sat, 24 May 2014 13:00:03 +0000 (14:00 +0100)]
Remove unused variables.

Signed-off-by: Mark Wooding <>
6 years agosrc/setup.c: Check netmask more carefully.
Mark Wooding [Sat, 3 May 2014 14:35:29 +0000 (15:35 +0100)]
src/setup.c: Check netmask more carefully.

[crybaby ~/src/adns/build]RES_CONF_TEXT="sortlist" RES_OPTIONS="adns_checkc:entex" adnshost -ta
adnshost: ../src/check.c:83: checkc_global: Assertion `!(ads->sortlist[i].base.s_addr & ~ads->sortlist[i].mask.s_addr)' failed.

Unfortunately, `ccf_sortlist' only checked that the free bits of the
network address are clear when given a general netmask, so if you give a
prefix length or leave it implicit then you hit a consistency check
failure later.

Check the mask later on, after all of the variants are handled.  There's
a little bit of variation in the message.

Signed-off-by: Mark Wooding <>
6 years agosrc/setup.c: Insert missing parentheses.
Mark Wooding [Sat, 24 May 2014 13:00:03 +0000 (14:00 +0100)]
src/setup.c: Insert missing parentheses.

Found from GCC warning.  This code never worked.

Signed-off-by: Mark Wooding <>
6 years agoHacking to make out-of-tree builds work properly.
Mark Wooding [Sat, 26 Apr 2014 13:22:11 +0000 (14:22 +0100)]
Hacking to make out-of-tree builds work properly.

This is mostly standard.  The regression-test scripts have had an
interface enhancement: they will look for source-like files using the
$srcdir environment variable, which defaults to `.' for compatibility.

Signed-off-by: Mark Wooding <>
6 years ago.gitignore: Add subdirectories' .cvsignores
Ian Jackson [Mon, 5 May 2014 16:15:29 +0000 (17:15 +0100)]
.gitignore: Add subdirectories' .cvsignores

 egrep . */.cvsignore | perl -pe 's#/\.cvsignore:#/#' >>.gitignore
 git-rm */.cvsignore

Signed-off-by: Ian Jackson <>
6 years ago.gitignore: Add *.o *.so *.a and *~
Ian Jackson [Mon, 5 May 2014 16:14:47 +0000 (17:14 +0100)]
.gitignore: Add *.o *.so *.a and *~

Signed-off-by: Ian Jackson <>
6 years ago.gitignore: Rename from .cvsignore
Ian Jackson [Mon, 5 May 2014 16:13:51 +0000 (17:13 +0100)]
.gitignore: Rename from .cvsignore

Signed-off-by: Ian Jackson <>
6 years agoCVS to git conversion cvs-to-git-conversion
Ian Jackson [Mon, 5 May 2014 16:07:54 +0000 (17:07 +0100)]
CVS to git conversion

Record the scripts etc. we used (and their history) for posterity,
by binding them into the history.

6 years agomake script's actual tag anyway
Ian Jackson [Mon, 5 May 2014 16:03:30 +0000 (17:03 +0100)]
make script's actual tag anyway

6 years agomerge the script's history into the generated history
Ian Jackson [Mon, 5 May 2014 16:02:07 +0000 (17:02 +0100)]
merge the script's history into the generated history

6 years agoMerge remote-tracking branch 'mdw/mdw/convert-script'
Ian Jackson [Wed, 30 Apr 2014 17:34:39 +0000 (18:34 +0100)]
Merge remote-tracking branch 'mdw/mdw/convert-script'

"iwj's original" 8298cc36e3a7eef91f722e7115ea8b5a9366fb55
is actually identical to 8e04e8e83b27a61d1471c81de5f8aabe29dda30a
apart from the .gitignore


6 years agofix
Ian Jackson [Wed, 30 Apr 2014 17:25:58 +0000 (18:25 +0100)]

6 years agoDiff the changelog by hand if the commit message is `empty'.
Mark Wooding [Tue, 29 Apr 2014 23:37:13 +0000 (00:37 +0100)]
Diff the changelog by hand if the commit message is `empty'.

6 years agoWrap long single-line comment messages.
Mark Wooding [Tue, 29 Apr 2014 23:20:26 +0000 (00:20 +0100)]
Wrap long single-line comment messages.

6 years agoAvoid printing removed lines unless necessary; avoid version headers.
Mark Wooding [Tue, 29 Apr 2014 23:13:28 +0000 (00:13 +0100)]
Avoid printing removed lines unless necessary; avoid version headers.

6 years agoUse `git mumble' consistently in place of `git-mumble'.
Mark Wooding [Tue, 29 Apr 2014 23:03:45 +0000 (00:03 +0100)]
Use `git mumble' consistently in place of `git-mumble'.

Newer versions of Git don't leave the implementations on the PATH.

6 years agoiwj's original.
Mark Wooding [Tue, 29 Apr 2014 23:02:14 +0000 (00:02 +0100)]
iwj's original.

6 years agoscript is in new location
Ian Jackson [Tue, 29 Apr 2014 19:42:42 +0000 (20:42 +0100)]
script is in new location

6 years agomerge rather than abandon pollfds
Ian Jackson [Tue, 29 Apr 2014 19:42:22 +0000 (20:42 +0100)]
merge rather than abandon pollfds

6 years agomove graftmergein (nfc)
Ian Jackson [Tue, 29 Apr 2014 19:40:12 +0000 (20:40 +0100)]
move graftmergein (nfc)

6 years agotidy up a bit
Ian Jackson [Tue, 29 Apr 2014 19:39:32 +0000 (20:39 +0100)]
tidy up a bit

6 years agofound
Ian Jackson [Tue, 29 Apr 2014 19:39:03 +0000 (20:39 +0100)]

6 years agoFOUND on davenant
ian [Wed, 16 Apr 2014 23:47:02 +0000 (23:47 +0000)]
FOUND on davenant
-rw-rw-r-- 1 ian ian 12465 Oct 18  2006 client/adnsresfilter.c

6 years agoFOUND on davenant
ian [Wed, 16 Apr 2014 23:46:09 +0000 (23:46 +0000)]
FOUND on davenant
-rw-r--r-- 1 ian ian 9594 Jan  2  2007 README.html

13 years agofinalise version 1.4 rel-adns-1-4
ian [Tue, 17 Oct 2006 16:15:19 +0000 (16:15 +0000)]
finalise version 1.4

14 years ago+ Improvements for multithreaded programs:
ian [Wed, 9 Aug 2006 11:16:59 +0000 (11:16 +0000)]
+  Improvements for multithreaded programs:

@@ -1,3 +1,14 @@
+adns (; urgency=low
+  Improvements for multithreaded programs:
+  * New documentation comment in adns.h explaining thread guarantees
+    (or lack of them), replaces `single-threaded' note at the top.
+  * Fix string conversion of adns_r_addr not to use a static buffer
+    (function csp_addr) so as to make thread promise true.
+  * Make an internal variable const-correct (expectdomain in pa_ptr).
+ --
 adns (1.3); urgency=low

   Portability fixes:

14 years agoMINOR=3 rel-adns-1-3
ian [Tue, 6 Jun 2006 19:38:16 +0000 (19:38 +0000)]

14 years agoget rid of junk file x.gdb
ian [Tue, 6 Jun 2006 19:37:17 +0000 (19:37 +0000)]
get rid of junk file x.gdb

14 years agoDISTVERSION 1.3
ian [Tue, 6 Jun 2006 19:27:17 +0000 (19:27 +0000)]

14 years agofinalise adns 1.3
ian [Tue, 6 Jun 2006 19:23:34 +0000 (19:23 +0000)]
finalise adns 1.3

14 years ago+ * Do away with `mismatch' variable in parse.c:adns__findrr_anychk so that
ian [Tue, 6 Jun 2006 19:20:30 +0000 (19:20 +0000)]
+  * Do away with `mismatch' variable in parse.c:adns__findrr_anychk so that

@@ -10,6 +10,9 @@
     (Report from Mihai Ibanescu.)
+  * Do away with `mismatch' variable in parse.c:adns__findrr_anychk so that
+    overzealous GCC cannot complain about members of eo_fls being
+    uninitialised.  (Report from Jim Meyering.)

14 years ago+ Portability fixes:
ian [Wed, 10 May 2006 10:58:02 +0000 (10:58 +0000)]
+  Portability fixes:

@@ -1,13 +1,15 @@
 adns (1.3); urgency=low

-  Bugfixes:
-  * In, quote macro name argument to define() to
-    suppress spurious autoconf error.  (Report from Mihai Ibanescu.)
+  Portability fixes:
   * Cast ptrdiff_t to int for %.*s length in adnsheloex and adnslogres,
     as is required.  (Report from Jim Meyering.)
-  * Use autoconf's values for {bin,lib,include}_dir rather than inventing
+  * In, quote macro name argument to define() to
+    suppress spurious autoconf error.  (Report from Mihai Ibanescu.)
+  * Use autoconf's values for {bin,lib,include}dir rather than inventing
     our own from @exec_prefix@, making configure --libdir work.
     (Patch from Mihai Ibanescu.)
+  * Remove spurious `_' from {bin,lib,include}dir Makefile variables.
+    (Report from Mihai Ibanescu.)


14 years ago+ * Use autoconf's values for {bin,lib,include}_dir rather than inventing
ian [Tue, 9 May 2006 19:43:07 +0000 (19:43 +0000)]
+  * Use autoconf's values for {bin,lib,include}_dir rather than inventing

@@ -5,6 +5,9 @@
     as is required.  (Report from Jim Meyering.)
+  * Use autoconf's values for {bin,lib,include}_dir rather than inventing
+    our own from @exec_prefix@, making configure --libdir work.
+    (Patch from Mihai Ibanescu.)

14 years ago+ * Cast ptrdiff_t to int for %.*s length in adnsheloex and adnslogres,
ian [Tue, 9 May 2006 19:37:58 +0000 (19:37 +0000)]
+  * Cast ptrdiff_t to int for %.*s length in adnsheloex and adnslogres,

@@ -3,6 +3,8 @@
     suppress spurious autoconf error.  (Report from Mihai Ibanescu.)
+  * Cast ptrdiff_t to int for %.*s length in adnsheloex and adnslogres,
+    as is required.  (Report from Jim Meyering.)

14 years ago+ Bugfixes:
ian [Tue, 9 May 2006 19:31:03 +0000 (19:31 +0000)]
+  Bugfixes:

@@ -1,3 +1,11 @@
+adns (1.3); urgency=low
+  Bugfixes:
+  * In, quote macro name argument to define() to
+    suppress spurious autoconf error.  (Report from Mihai Ibanescu.)
+ --
 adns (1.2); urgency=medium

   New features:

14 years agochangelog version finalised, 1.2 rel-adns-1-2
ian [Sat, 8 Apr 2006 14:41:39 +0000 (14:41 +0000)]
changelog version finalised, 1.2

14 years agoupdate DISTVERSION
ian [Sat, 8 Apr 2006 14:37:21 +0000 (14:37 +0000)]

14 years agoupdate copyright dates
ian [Sat, 8 Apr 2006 14:36:57 +0000 (14:36 +0000)]
update copyright dates

14 years agoupdate copyright dates and ADNS_VERSION_STRING
ian [Sat, 8 Apr 2006 14:36:23 +0000 (14:36 +0000)]
update copyright dates and ADNS_VERSION_STRING

14 years agorestructured and improved changelog
ian [Sat, 8 Apr 2006 14:09:41 +0000 (14:09 +0000)]
restructured and improved changelog

14 years agoA few more links for the README.
ian [Sat, 8 Apr 2006 14:01:14 +0000 (14:01 +0000)]
A few more links for the README.

14 years agolicence waiver section improved
ian [Sat, 8 Apr 2006 13:16:34 +0000 (13:16 +0000)]
licence waiver section improved

14 years agofix up adnstest for r_unknown; tests for r_unknown
ian [Fri, 7 Apr 2006 00:51:47 +0000 (00:51 +0000)]
fix up adnstest for r_unknown; tests for r_unknown

14 years agounknown rr types seem to work
ian [Fri, 7 Apr 2006 00:25:14 +0000 (00:25 +0000)]
unknown rr types seem to work

14 years agospec for adns_r_unknown
ian [Thu, 6 Apr 2006 18:59:53 +0000 (18:59 +0000)]
spec for adns_r_unknown

14 years agoSRV supported
ian [Thu, 6 Apr 2006 18:49:25 +0000 (18:49 +0000)]
SRV supported