This is c-ares, a forked version of the original ares. The original ares
README follows below, the c-ares specific details are in README.cares

====================================================================

This is ares, an asynchronous resolver library.  It is intended for
applications which need to perform DNS queries without blocking, or
need to perform multiple DNS queries in parallel.  The primary
examples of such applications are servers which communicate with
multiple clients and programs with graphical user interfaces.

This library implementation is not especially portable to crufty old
systems like SunOS 4.  It assumes a compiler which can handle ANSI C
syntax, a system malloc which properly handles realloc(NULL, foo) and
free(NULL), and a reasonably up-to-date <arpa/nameser.h>.

I have attempted to preserve the externally visible behavior of the
BIND resolver in nearly all respects.  The API of the library is, of
course, very different from the synchronous BIND API; instead of
invoking a function like res_send() and getting a return value back
indicating the number of bytes in the response, you invoke a function
like ares_send() and give it a callback function to invoke when the
response arrives.  You then have to select() on the file descriptors
indicated by ares_fds(), with a timeout given by ares_timeout().  You
call ares_process() when select() returns.

Some features are missing from the current version of ares, relative
to the BIND resolver:

	* There is no IPV6 support.
	* There is no hostname verification.
	* There is no logging of unexpected events.
	* There is no debugging-oriented logging.
	* There is no YP support.

libares requires an ANSI compiler to compile and use.  To build the
library, just run "./configure" and "make".  To install it, run "make
install".  Run "./configure --help" to see a list of options you can
provide to configure to change how the library builds.  libares has no
data files, so you can move the include file and library around freely
without leaving behind any dependencies on old paths.  Building the
library will also build the "adig" program, a little toy for trying
out the library.  It doesn't get installed.

libares is distributed at athena-dist.mit.edu:pub/ATHENA/ares.  Please
send bug reports and comments to ghudson@mit.edu.
