| 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. |