The resolver in the GNU C Library
*********************************

Starting with version 2.2, the resolver in the GNU C Library comes
from BIND 8.  Only a subset of the src/lib/resolv part of libbind is
included here; basically the parts that are needed to provide the
functionality present in the resolver from BIND 4.9.7 that was
included in the previous release of the GNU C Library, augmented by
the parts needed to provide thread-safety.  This means that support
for things as dynamic DNS updates and TSIG keys isn't included.  If
you need those facilities, please take a look at the full BIND
distribution.


Differences
===========

The resolver in the GNU C Library still differs from what's in BIND
8.2.3-T5B:

* The resolver in glibc strictly adheres to the recommendations in RFC
  1535.  BIND 8.2.3-T5B seems to relax those rules a bit (see the code
  that's wrapped in `#ifndef RFC1535').

* The RES_DEBUG option (`options debug' in /etc/resolv.conf) has been
  disabled.

* The resolver in glibc allows underscores in domain names.

* The <resolv.h> header in glibc includes <netinet/in.h> and
  <arpa/nameser.h> to make it self-contained.

* The `res_close' function in glibc only tries to close open files
  referenced through `_res' if the RES_INIT bit is set in
  `_res.options'.  This fixes a potential security bug with programs
  that bogusly call `res_close' without initialising the resolver
  state first.  Note that the thread-safe `res_nclose' still doesn't
  check the RES_INIT bit.  By the way, you're not really supposed to
  call `res_close/res_nclose' directly.

* The resolver in glibc can connect to a nameserver over IPv6.  Just
  specify the IPv6 address in /etc/resolv.conf.  You cannot change the
  address of an IPv6 nameserver dynamically in your program though.


Using the resolver in multi-threaded code
=========================================

The traditional resolver interfaces `res_query', `res_search',
`res_mkquery', `res_send' and `res_init', used a static (global)
resolver state stored in the `_res' structure.  Therefore, these
interfaces are not thread-safe.  Therefore, BIND 8.2 introduced a set
of "new" interfaces `res_nquery', `res_nsearch', `res_nmkquery',
`res_nsend' and `res_ninit' that take a `res_state' as their first
argument, so you can use a per-thread resolver state.  In glibc, when
you link with -lpthread, such a per-thread resolver state is already
present.  It can be accessed using `_res', which has been redefined as
a macro, in a similar way to what has been done for the `errno' and
`h_errno' variables.  This per-thread resolver state is also used for
the `gethostby*' family of functions, which means that for example
`gethostbyname_r' is now fully thread-safe and re-entrant.  The
traditional resolver interfaces however, continue to use a single
resolver state and are therefore still thread-unsafe.  The resolver
state is the same resolver state that is used for the initial ("main")
thread.

This has the following consequences for existing binaries and source
code:

* Single-threaded programs will continue to work.  There should be no
  user-visible changes when you recompile them.

* Multi-threaded programs that use the traditional resolver interfaces
  in the "main" thread should continue to work, except that they no
  longer see any changes in the global resolver state caused by calls
  to, for example, `gethostbyname' in other threads.  Again there
  should be no user-visible changes when you recompile these programs.

* Multi-threaded programs that use the traditional resolver interfaces
  in more than one thread should be just as buggy as before (there are
  no problems if you use proper locking of course).  If you recompile
  these programs, manipulating the _res structure in threads other
  than the "main" thread will seem to have no effect though.

* In Multi-threaded that manipulate the _res structure, calls to
  functions like `gethostbyname' in threads other than the "main"
  thread won't be influenced by the those changes anymore.  So if you
  set RES_USE_INET6, a call to `gethostbyname' won't return any IPv6
  hosts anymore.  If you recompile such programs, manipulating the
  _res structure will affect the thread in which you do so instead of
  the "main" thread.

We recommend to use the new thread-safe interfaces in new code, since
the traditional interfaces have been deprecated by the BIND folks.
For compatibility with other (older) systems you might want to
continue to use those interfaces though.


Using the resolver in C++ code
==============================

There resolver contains some hooks which will allow the user to
install some callback functions that make it possible to filter DNS
requests and responses.  Although we do not encourage you to make use
of this facility at all, C++ developers should realise that it isn't
safe to throw exceptions from such callback functions.


Source code
===========

The following files come from the BIND distribution (currently version
8.2.3-T5B):

src/include/
  arpa/nameser.h
  arpa/nameser_compat.h
  resolv.h

src/lib/resolv/
  herror.c
  res_comp.c
  res_data.c
  res_debug.c
  res_debug.h
  res_init.c
  res_mkquery.c
  res_query.c
  res_send.c

src/lib/nameser/
  ns_name.c
  ns_netint.c
  ns_parse.c
  ns_print.c
  ns_samedomain.c
  ns_ttl.c

src/lib/inet/
  inet_addr.c
  inet_net_ntop.c
  inet_net_pton.c
  inet_neta.c
  inet_ntop.c
  inet_pton.c
  nsap_addr.c

src/lib/isc/
  base64.c

Some of these files have been optimised a bit, and adaptations have
been made to make them fit in with the rest of glibc.  The more
non-obvious changes are wrapped in something like `#ifdef _LIBC'.

res_libc.c is home-brewn, although parts of it are taken from res_data.c.

res_hconf.c and res_hconf.h were contributed by David Mosberger, and
do not come from BIND.

The files gethnamaddr.c, mapv4v6addr.h and mapv4v6hostent.h are
leftovers from BIND 4.9.7.
