D. J. Bernstein
The dns library
The djbdns package
features a new client library
designed to replace the old BIND res_*/dn_* library.
The dns library
easy-to-use DNS lookup routines:
dns_ip4, dns_ip4_qualify, dns_name4,
dns_mx, and dns_txt.
the traditional configuration mechanisms for hostname rewriting:
It also supports a
powerful new user-controlled rewriting mechanism.
The functions that read /etc/resolv.conf
automatically reread it every ten minutes,
so system administrators don't have to kill long-running programs.
make it easy to safely parse DNS packets.
send DNS queries of arbitrary types to arbitrary servers.
These are the functions used in the
The dns library, unlike the BIND client library,
has no problems looking up addresses for
non-ASCII domain names.
UNIX offers three levels of support for parallel DNS lookups:
- Multiple processes.
Any client library can be used here.
- Multiple threads.
The client library must be threadable.
(This means that,
in functions that wait for responses,
global variables are protected with mutexes,
and are not used while the function is waiting.
Other functions can be mutexed by the caller.)
Thread creation is generally faster than process creation.
- Event handling with poll or select.
The client library must be asynchronous.
(This means that none of the functions wait for responses.
Event information is passed to the caller.)
Event handling is generally the fastest solution,
but puts the most stringent requirements on the client library.
Asynchronous libraries are automatically threadable.
The dns_transmit_* functions are asynchronous.
The high-level features of dns_ip4, dns_name4, etc.
are available as asynchronous functions:
dns_ip4_packet, dns_name4_packet, etc.
There is a sample
program that shows how to do many PTR lookups in parallel.
The old res_query function
places its packets in a user-supplied buffer.
The buffer is inevitably much too large for typical results, wasting memory,
and too small for large results, making lookups fail on occasion.
In contrast, the dns functions
dynamically allocate the right amount of space
for incoming DNS packets and for final results.