RESOLVER(3RESOLV) Resolver Library Functions RESOLVER(3RESOLV)
NAME
resolver, res_ninit, fp_resstat, res_hostalias, res_nquery, res_nsearch,
res_nquerydomain, res_nmkquery, res_nsend, res_nclose, res_nsendsigned,
dn_comp, dn_expand, hstrerror, res_init, res_query, res_search,
res_mkquery, res_send, herror, res_getservers, res_setservers,
res_ndestroy - resolver routines
SYNOPSIS
BIND 8.2.2 Interfaces
cc [
flag ... ]
file ...
-lresolv -lsocket -lnsl [
library ... ]
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
#include <netdb.h>
int res_ninit(
res_state statp);
void res_ndestroy(
res_state statp);
void fp_resstat(
const res_state statp,
FILE *fp);
const char *res_hostalias(
const res_state statp,
const char *name,
char * name,
char *buf,
size_tbuflen);
int res_nquery(
res_state statp,
const char *dname,
int class,
int type,
u_char *answer,
int datalen,
int anslen);
int res_nsearch(
res_state statp,
const char *dname,
int class,
int type,
u_char *answer,
int anslen);
int res_nquerydomain(
res_state statp,
const char *name,
const char *domain,
int class,
int type,
u_char *answer,
int anslen);
int res_nmkquery(
res_state statp,
int op,
const char *dname,
int class,
int type,
u_char *answer,
int datalen,
int anslen);
int res_nsend(
res_state statp,
const u_char *msg,
int msglen,
u_char *answer,
int anslen);
void res_nclose(
res_state statp);
int res_snendsigned(
res_state statp,
const u_char *msg,
int msglen,
ns_tsig_key *key,
u_char *answer,
int anslen);
int dn_comp(
const char *exp_dn,
u_char *comp_dn,
int length,
u_char **dnptrs,
**lastdnptr);
int dn_expand(
const u_char *msg,
*eomorig,
*comp_dn,
char *exp_dn,
int length);
const char *hstrerror(
int err);
void res_setservers(
res_state statp,
const union res_sockaddr_union *set,
int cnt);
int res_getservers(
res_state statp,
union res_sockaddr_union *set,
int cnt);
Deprecated Interfaces
cc [
flag ... ]
file ...
-lresolv -lsocket -lnsl [
library ... ]
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
#include <netdb.h>
int res_init(void)
int res_query(
const char *dname,
int class,
int type,
u_char *answer,
int anslen);
int res_search(
const char *dname,
int class,
int type,
u_char *answer,
int anslen);
int res_mkquery(
int op,
const char *dname,
int class,
int type,
const char *data,
int datalen,
struct rrec *newrr,
u_char *buf,
int buflen);
int res_send(
const u_char *msg,
int msglen,
u_char *answer,
int anslen);
void herror(
const char *s);
DESCRIPTION
These routines are used for making, sending, and interpreting query and
reply messages with Internet domain name servers.
State information is kept in
statp and is used to control the behavior of
these functions. Set
statp to all zeros prior to making the first call to
any of these functions.
The
res_ndestroy() function should be called to free memory allocated by
res_ninit() after the last use of
statp.
The functions
res_init(),
res_query(),
res_search(),
res_mkquery(),
res_send(), and
herror() are deprecated. They are supplied for backwards
compatibility. They use global configuration and state information that
is kept in the structure
_res rather than state information referenced
through
statp.
Most of the values in
statp and
_res are initialized to reasonable
defaults on the first call to
res_ninit() or
res_init() and can be
ignored. Options stored in
statp->options or
_res.options are defined in
<
resolv.h>. They are stored as a simple bit mask containing the bitwise
OR of the options enabled.
RES_INIT True if the initial name server address and default
domain name are initialized, that is,
res_init() or
res_ninit() has been called.
RES_DEBUG Print debugging messages.
RES_AAONLY Accept authoritative answers only. With this option,
res_send() will continue until it finds an authoritative
answer or finds an error. Currently this option is not
implemented.
RES_USEVC Use
TCP connections for queries instead of
UDP datagrams.
RES_STAYOPEN Use with
RES_USEVC to keep the
TCP connection open
between queries. This is a useful option for programs
that regularly do many queries. The normal mode used
should be
UDP.
RES_IGNTC Ignore truncation errors; that is, do not retry with
TCP.
RES_RECURSE Set the recursion-desired bit in queries. This is the
default.
res_send() and
res_nsend() do not do iterative
queries and expect the name server to handle recursion.
RES_DEFNAMES If set,
res_search() and
res_nsearch() append the
default domain name to single-component names, that is,
names that do not contain a dot. This option is enabled
by default.
RES_DNSRCH If this option is set,
res_search() and
res_nsearch() search for host names in the current domain and in
parent domains. See
hostname(1). This option is used by
the standard host lookup routine
gethostbyname(3NSL).
This option is enabled by default.
RES_NOALIASES This option turns off the user level aliasing feature
controlled by the
HOSTALIASES environment variable.
Network daemons should set this option.
RES_BLAST If the
RES_BLAST option is defined,
resolver() queries
will be sent to all servers. If the
RES_BLAST option is
not defined, but
RES_ROTATE is , the list of nameservers
are rotated according to a round-robin scheme.
RES_BLAST overrides
RES_ROTATE.
RES_ROTATE This option causes
res_nsend() and
res_send() to rotate
the list of nameservers in
statp->nsaddr_list or
_res.nsaddr_list.
RES_KEEPTSIG This option causes
res_nsendsigned() to leave the
message unchanged after
TSIG verification. Otherwise the
TSIG record would be removed and the header would be
updated.
res_ninit(),
res_init() The
res_ninit() and
res_init() routines read the configuration file, if
any is present, to get the default domain name, search list and the
Internet address of the local name server(s). See
resolv.conf(5). If no
server is configured,
res_init() or
res_ninit() will try to obtain name
resolution services from the host on which it is running. The current
domain name is defined by
domainname(8), or by the hostname if it is not
specified in the configuration file. Use the environment variable
LOCALDOMAIN to override the domain name. This environment variable may
contain several blank-separated tokens if you wish to override the search
list on a per-process basis. This is similar to the search command in the
configuration file. You can set the
RES_OPTIONS environment variable to
override certain internal resolver options. You can otherwise set them by
changing fields in the
statp /
_res structure. Alternatively, they are
inherited from the configuration file's
options command. See
resolv.conf(5) for information regarding the syntax of the
RES_OPTIONS environment variable. Initialization normally occurs on the first call to
one of the other resolver routines.
res_nquery(),
res_query() The
res_nquery() and
res_query() functions provide interfaces to the
server query mechanism. They construct a query, send it to the local
server, await a response, and make preliminary checks on the reply. The
query requests information of the specified
type and
class for the
specified fully-qualified domain name
dname. The reply message is left in
the
answer buffer with length
anslen supplied by the caller.
res_nquery() and
res_query() return the length of the
answer, or -1 upon
error.
The
res_nquery() and
res_query() routines return a length that may be
bigger than
anslen. In that case, retry the query with a larger
buf. The
answer to the second query may be larger still], so it is recommended
that you supply a
buf larger than the
answer returned by the previous
query.
answer must be large enough to receive a maximum
UDP response from
the server or parts of the
answer will be silently discarded. The default
maximum
UDP response size is 512 bytes.
res_nsearch(),
res_search() The
res_nsearch() and
res_search() routines make a query and await a
response, just like like
res_nquery() and
res_query(). In addition, they
implement the default and search rules controlled by the
RES_DEFNAMES and
RES_DNSRCH options. They return the length of the first successful reply
which is stored in
answer. On error, they return -1.
The
res_nsearch() and
res_search() routines return a length that may be
bigger than
anslen. In that case, retry the query with a larger
buf. The
answer to the second query may be larger still], so it is recommended
that you supply a
buf larger than the
answer returned by the previous
query.
answer must be large enough to receive a maximum
UDP response from
the server or parts of the
answer will be silently discarded. The default
maximum
UDP response size is 512 bytes.
res_nquerydomain() The
res_nquerydomain() function calls
res_query() on the concatenation of
name and
domain, removing a trailing dot from
name if
domain is
NULL.
res_nmkquery(),
res_mkquery() These routines are used by
res_nquery() and
res_query(). The
res_nmkquery() and
res_mkquery() functions construct a standard query
message and place it in
buf. The routine returns the
size of the query,
or -1 if the query is larger than
buflen. The query type
op is usually
QUERY, but can be any of the query types defined in <
arpa/nameser.h>. The
domain name for the query is given by
dname.
newrr is currently unused
but is intended for making update messages.
res_nsend(),
res_send(),
res_nsendsigned() The
res_nsend(),
res_send(), and
res_nsendsigned() routines send a pre-
formatted query that returns an
answer. The routine calls
res_ninit() or
res_init(). If
RES_INIT is not set, the routine sends the query to the
local name server and handles timeouts and retries. Additionally, the
res_nsendsigned() uses
TSIG signatures to add authentication to the query
and verify the response. In this case, only one name server will be
contacted. The routines return the length of the reply message, or -1 if
there are errors.
The
res_nsend() and
res_send() routines return a length that may be
bigger than
anslen. In that case, retry the query with a larger
buf. The
answer to the second query may be larger still], so it is recommended
that you supply a
buf larger than the
answer returned by the previous
query.
answer must be large enough to receive a maximum
UDP response from
the server or parts of the
answer will be silently discarded. The default
maximum
UDP response size is 512 bytes.
fp_resstat() The function
fp_resstat() prints out the active flag bits in
statp->
options preceded by the text "
;; res options:" on
file.
res_hostalias() The function
res_hostalias() looks up
name in the file referred to by the
HOSTALIASES environment variable and returns the fully qualified host
name. If
name is not found or an error occurs,
NULL is returned.
res_hostalias() stores the result in
buf.
res_nclose() The
res_nclose() function closes any open files referenced through
statp.
res_ndestroy() The
res_ndestroy() function calls
res_nclose(), then frees any memory
allocated by
res_ninit() referenced through
statp.
dn_comp() The
dn_comp() function compresses the domain name
exp_dn and stores it in
comp_dn. The
dn_comp() function returns the size of the compressed name,
or
-1 if there were errors.
length is the size of the array pointed to by
comp_dn.
The
dnptrs parameter is a pointer to the head of the list of pointers to
previously compressed names in the current message. The first pointer
must point to the beginning of the message. The list ends with
NULL. The
limit to the array is specified by
lastdnptr.
A side effect of calling
dn_comp() is to update the list of pointers for
labels inserted into the message by
dn_comp() as the name is compressed.
If
dnptrs is
NULL, names are not compressed. If
lastdnptr is
NULL,
dn_comp() does not update the list of labels.
dn_expand() The
dn_expand() function expands the compressed domain name
comp_dn to a
full domain name. The compressed name is contained in a query or reply
message.
msg is a pointer to the beginning of that message. The
uncompressed name is placed in the buffer indicated by
exp_dn, which is
of size
length. The
dn_expand() function returns the size of the
compressed name, or
-1 if there was an error.
hstrerror(),
herror() The variables
statp->res_h_errno and
_res.res_h_errno and external
variable
h_errno are set whenever an error occurs during a resolver
operation. The following definitions are given in <
netdb.h>:
#define NETDB_INTERNAL -1 /* see errno */
#define NETDB_SUCCESS 0 /* no problem */
#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */
#define TRY_AGAIN 2 /* Non-Authoritative not found, or SERVFAIL */
#define NO_RECOVERY 3 /* Non-Recoverable: FORMERR, REFUSED, NOTIMP*/
#define NO_DATA 4 /* Valid name, no data for requested type */
The
herror() function writes a message to the diagnostic output
consisting of the string parameters, the constant string "
:", and a
message corresponding to the value of
h_errno.
The
hstrerror() function returns a string, which is the message text that
corresponds to the value of the
err parameter.
res_setservers(),
res_getservers() The functions
res_getservers() and
res_setservers() are used to get and
set the list of servers to be queried.
FILES
/etc/resolv.conf resolver configuration file
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+-----------------------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
|Interface Stability | Committed |
+--------------------+-----------------------------+
|MT-Level | Unsafe for deprecated |
| | interfaces; MT-Safe for all |
| | others. |
+--------------------+-----------------------------+
SEE ALSO
libresolv(3LIB),
gethostbyname(3NSL),
resolv.conf(5),
attributes(7),
domainname(8) Lottor, M.
RFC 1033, Domain Administrators Operations Guide. Network
Working Group. November 1987.
Mockapetris, Paul.
RFC 1034, Domain Names - Concepts and Facilities.
Network Working Group. November 1987.
Mockapetris, Paul.
RFC 1035, Domain Names - Implementation and Specification. Network Working Group. November 1987.
Partridge, Craig.
RFC 974, Mail Routing and the Domain System. Network
Working Group. January 1986.
Stahl, M.
RFC 1032, Domain Administrators Guide. Network Working Group.
November 1987.
Vixie, Paul, Dunlap, Kevin J., Karels, Michael J.
Name Server Operations Guide for BIND. Internet Software Consortium, 1996.
NOTES
When the caller supplies a work buffer, for example the
answer buffer
argument to
res_nsend() or
res_send(), the buffer should be aligned on an
eight byte boundary. Otherwise, an error such as a
SIGBUS may result.
December 28, 2020
RESOLVER(3RESOLV)