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 - resolver routines
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 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);
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 functions res_init(), res_query(), res_search(), res_mkquery(), res_send(), and herror() are deprecated. They are supplied for backwards compatability. 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_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(4)
. 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(1M)
, 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(4)
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 provides 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 reurn -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_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 preformatted
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.
dn_comp
dn_comp() compresses the domain name exp_dn and stores it in comp_dn.
dn_comp() 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.
dnptrs 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
dn_expand() 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.dn_expand() 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 */
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.
See attributes(5) for descriptions of the following attributes:
tab() allbox; cw(2.750000i)| cw(2.750000i) lw(2.750000i) lw(2.750000i). ATTRIBUTE TYPEATTRIBUTE VALUE AvailabilitySUNWcsl (32-bit) SUNWcslx (64-bit) Interface StabilityEvolving MT-LevelT{ Unsafe for Deprecated Interfaces; MT-Safe for all others. T}
domainname(1M) , gethostbyname(3NSL) , libresolv(3LIB) , resolv.conf(4) , attributes(5)
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 Specifi_cation. 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 Opera_tions Guide for BIND. Internet Software Consortium, 1996.
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.