'\" te .\" Portions Copyright 1989 AT&T Portions Copyright (c) 1985, 1995 Regents of the University of California. .\" Copyright (C) 2006, Sun Microsystems, Inc. All Rights Reserved .TH RESOLVER 3RESOLV "December 28, 2020" .SH 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 .SH SYNOPSIS .nf BIND 8.2.2 Interfaces .fi .LP .nf \fBcc\fR [ \fIflag\fR ... ] \fIfile\fR ... \fB-lresolv\fR \fB -lsocket \fR \fB -lnsl \fR [ \fIlibrary\fR ... ] #include #include #include #include #include \fBint\fR \fBres_ninit\fR(\fBres_state\fR \fIstatp\fR); .fi .LP .nf \fBvoid\fR \fBres_ndestroy\fR(\fBres_state\fR \fIstatp\fR); .fi .LP .nf \fBvoid\fR \fBfp_resstat\fR(\fBconst res_state\fR \fIstatp\fR, \fBFILE *\fR\fIfp\fR); .fi .LP .nf \fBconst char *\fR\fBres_hostalias\fR(\fBconst res_state\fR \fIstatp\fR, \fBconst char *\fR\fIname\fR, \fBchar *\fR \fIname\fR, \fBchar *\fR\fIbuf\fR, \fBsize_t\fR\fIbuflen\fR); .fi .LP .nf \fBint\fR \fBres_nquery\fR(\fBres_state\fR \fIstatp\fR, \fBconst char *\fR\fIdname\fR, \fBint\fR \fIclass\fR, \fBint\fR \fItype\fR, \fBu_char *\fR\fIanswer\fR, \fBint\fR \fIdatalen\fR, \fBint\fR \fIanslen\fR); .fi .LP .nf \fBint\fR \fBres_nsearch\fR(\fBres_state\fR \fIstatp\fR, \fBconst char *\fR\fIdname\fR, \fBint\fR \fIclass\fR, \fBint\fR \fItype\fR, \fBu_char *\fR\fIanswer\fR, \fBint\fR \fIanslen\fR); .fi .LP .nf \fBint\fR \fBres_nquerydomain\fR(\fBres_state\fR \fIstatp\fR, \fBconst char *\fR\fIname\fR, \fBconst char *\fR\fIdomain\fR, \fBint\fR \fIclass\fR, \fBint\fR \fItype\fR, \fBu_char *\fR\fIanswer\fR, \fBint\fR \fIanslen\fR); .fi .LP .nf \fBint\fR \fBres_nmkquery\fR(\fBres_state\fR \fIstatp\fR, \fBint\fR \fIop\fR, \fBconst char *\fR\fIdname\fR, \fBint\fR \fIclass\fR, \fBint\fR \fItype\fR, \fBu_char *\fR\fIanswer\fR, \fBint\fR \fIdatalen\fR, \fBint\fR \fIanslen\fR); .fi .LP .nf \fBint\fR \fBres_nsend\fR(\fBres_state\fR \fIstatp\fR, \fBconst u_char *\fR\fImsg\fR, \fBint\fR \fImsglen\fR, \fBu_char *\fR\fIanswer\fR, \fBint\fR \fIanslen\fR); .fi .LP .nf \fBvoid\fR \fBres_nclose\fR(\fBres_state\fR \fIstatp\fR); .fi .LP .nf \fBint\fR \fBres_snendsigned\fR(\fBres_state\fR \fIstatp\fR, \fBconst u_char *\fR\fImsg\fR, \fBint\fR \fImsglen\fR, \fBns_tsig_key *\fR\fIkey\fR, \fBu_char *\fR\fIanswer\fR, \fBint\fR \fIanslen\fR); .fi .LP .nf \fBint\fR \fBdn_comp\fR(\fBconst char *\fR\fIexp_dn\fR, \fBu_char *\fR\fIcomp_dn\fR, \fBint\fR \fIlength\fR, \fBu_char **\fR\fIdnptrs\fR, \fB**\fR\fIlastdnptr\fR); .fi .LP .nf \fBint\fR \fBdn_expand\fR(\fBconst u_char *\fR\fImsg\fR, \fB*\fR\fIeomorig\fR, \fB*\fR\fIcomp_dn\fR, \fBchar *\fR\fIexp_dn\fR, \fBint\fR \fIlength\fR); .fi .LP .nf \fBconst char *\fR\fBhstrerror\fR(\fBint\fR \fIerr\fR); .fi .LP .nf \fBvoid\fR \fBres_setservers\fR(\fBres_state\fR \fIstatp\fR, \fBconst union res_sockaddr_union *\fR\fIset\fR, \fBint\fR \fIcnt\fR); .fi .LP .nf \fBint\fR \fBres_getservers\fR(\fBres_state\fR \fIstatp\fR, \fBunion res_sockaddr_union *\fR\fIset\fR, \fBint\fR \fIcnt\fR); .fi .LP .nf Deprecated Interfaces .fi .LP .nf \fBcc\fR [ \fIflag\fR ... ] \fIfile\fR ... \fB-lresolv\fR \fB -lsocket \fR \fB -lnsl \fR [ \fIlibrary\fR ... ] #include #include #include #include #include \fBint\fR \fBres_init\fR(void) .fi .LP .nf \fBint\fR \fBres_query\fR(\fBconst char *\fR\fIdname\fR, \fBint\fR \fIclass\fR, \fBint\fR \fItype\fR, \fBu_char *\fR\fIanswer\fR, \fBint\fR \fIanslen\fR); .fi .LP .nf \fBint\fR \fBres_search\fR(\fBconst char *\fR\fIdname\fR, \fBint\fR \fIclass\fR, \fBint\fR \fItype\fR, \fBu_char *\fR\fIanswer\fR, \fBint\fR \fIanslen\fR); .fi .LP .nf \fBint\fR \fBres_mkquery\fR(\fBint\fR \fIop\fR, \fBconst char *\fR\fIdname\fR, \fBint\fR \fIclass\fR, \fBint\fR \fItype\fR, \fBconst char *\fR\fIdata\fR,\fBint\fR \fIdatalen\fR, \fBstruct rrec *\fR\fInewrr\fR, \fBu_char *\fR\fIbuf\fR, \fBint\fR \fIbuflen\fR); .fi .LP .nf \fBint\fR \fBres_send\fR(\fBconst u_char *\fR\fImsg\fR, \fBint\fR \fImsglen\fR, \fBu_char *\fR\fIanswer\fR, \fBint\fR \fIanslen\fR); .fi .LP .nf \fBvoid\fR \fBherror\fR(\fBconst char *\fR\fIs\fR); .fi .SH DESCRIPTION These routines are used for making, sending, and interpreting query and reply messages with Internet domain name servers. .sp .LP State information is kept in \fIstatp\fR and is used to control the behavior of these functions. Set \fIstatp\fR to all zeros prior to making the first call to any of these functions. .sp .LP The \fBres_ndestroy()\fR function should be called to free memory allocated by \fBres_ninit()\fR after the last use of \fIstatp\fR. .sp .LP The functions \fBres_init()\fR, \fBres_query()\fR, \fBres_search()\fR, \fBres_mkquery()\fR, \fBres_send()\fR, and \fBherror()\fR are deprecated. They are supplied for backwards compatibility. They use global configuration and state information that is kept in the structure \fB_res\fR rather than state information referenced through \fIstatp\fR. .sp .LP Most of the values in \fIstatp\fR and \fB_res\fR are initialized to reasonable defaults on the first call to \fBres_ninit()\fR or \fBres_init()\fR and can be ignored. Options stored in \fBstatp->options\fR or \fB_res.options\fR are defined in <\fBresolv.h\fR>. They are stored as a simple bit mask containing the bitwise \fBOR\fR of the options enabled. .sp .ne 2 .na \fB\fBRES_INIT\fR\fR .ad .RS 17n True if the initial name server address and default domain name are initialized, that is, \fBres_init()\fR or \fBres_ninit()\fR has been called. .RE .sp .ne 2 .na \fB\fBRES_DEBUG\fR\fR .ad .RS 17n Print debugging messages. .RE .sp .ne 2 .na \fB\fBRES_AAONLY\fR\fR .ad .RS 17n Accept authoritative answers only. With this option, \fBres_send()\fR will continue until it finds an authoritative answer or finds an error. Currently this option is not implemented. .RE .sp .ne 2 .na \fB\fBRES_USEVC\fR\fR .ad .RS 17n Use \fBTCP\fR connections for queries instead of \fBUDP\fR datagrams. .RE .sp .ne 2 .na \fB\fBRES_STAYOPEN\fR\fR .ad .RS 17n Use with \fBRES_USEVC\fR to keep the \fBTCP\fR connection open between queries. This is a useful option for programs that regularly do many queries. The normal mode used should be \fBUDP\fR. .RE .sp .ne 2 .na \fB\fBRES_IGNTC\fR\fR .ad .RS 17n Ignore truncation errors; that is, do not retry with \fBTCP\fR. .RE .sp .ne 2 .na \fB\fBRES_RECURSE\fR\fR .ad .RS 17n Set the recursion-desired bit in queries. This is the default. \fBres_send()\fR and \fBres_nsend()\fR do not do iterative queries and expect the name server to handle recursion. .RE .sp .ne 2 .na \fB\fBRES_DEFNAMES\fR\fR .ad .RS 17n If set, \fBres_search()\fR and \fBres_nsearch()\fR append the default domain name to single-component names, that is, names that do not contain a dot. This option is enabled by default. .RE .sp .ne 2 .na \fB\fBRES_DNSRCH\fR\fR .ad .RS 17n If this option is set, \fBres_search()\fR and \fBres_nsearch()\fR search for host names in the current domain and in parent domains. See \fBhostname\fR(1). This option is used by the standard host lookup routine \fBgethostbyname\fR(3NSL). This option is enabled by default. .RE .sp .ne 2 .na \fB\fBRES_NOALIASES\fR\fR .ad .RS 17n This option turns off the user level aliasing feature controlled by the \fBHOSTALIASES\fR environment variable. Network daemons should set this option. .RE .sp .ne 2 .na \fB\fBRES_BLAST\fR\fR .ad .RS 17n If the \fBRES_BLAST\fR option is defined, \fBresolver()\fR queries will be sent to all servers. If the \fBRES_BLAST\fR option is not defined, but \fBRES_ROTATE\fR is , the list of nameservers are rotated according to a round-robin scheme. \fBRES_BLAST\fR overrides \fBRES_ROTATE\fR. .RE .sp .ne 2 .na \fB\fBRES_ROTATE\fR\fR .ad .RS 17n This option causes \fBres_nsend()\fR and \fBres_send()\fR to rotate the list of nameservers in \fBstatp->nsaddr_list\fR or \fB_res.nsaddr_list\fR. .RE .sp .ne 2 .na \fB\fBRES_KEEPTSIG\fR\fR .ad .RS 17n This option causes \fBres_nsendsigned()\fR to leave the message unchanged after \fBTSIG\fR verification. Otherwise the \fBTSIG\fR record would be removed and the header would be updated. .RE .SS "\fBres_ninit()\fR, \fBres_init()\fR" The \fBres_ninit()\fR and \fBres_init()\fR 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 \fBresolv.conf\fR(5). If no server is configured, \fBres_init()\fR or \fBres_ninit()\fR will try to obtain name resolution services from the host on which it is running. The current domain name is defined by \fBdomainname\fR(8), or by the hostname if it is not specified in the configuration file. Use the environment variable \fBLOCALDOMAIN\fR 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 \fBRES_OPTIONS\fR environment variable to override certain internal resolver options. You can otherwise set them by changing fields in the \fBstatp\fR /\fB_res\fR structure. Alternatively, they are inherited from the configuration file's \fBoptions\fR command. See \fBresolv.conf\fR(5) for information regarding the syntax of the \fBRES_OPTIONS\fR environment variable. Initialization normally occurs on the first call to one of the other resolver routines. .SS "\fBres_nquery()\fR, \fBres_query()\fR" The \fBres_nquery()\fR and \fBres_query()\fR 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 \fItype\fR and \fIclass\fR for the specified fully-qualified domain name \fIdname\fR. The reply message is left in the \fIanswer\fR buffer with length \fIanslen\fR supplied by the caller. \fBres_nquery()\fR and \fBres_query()\fR return the length of the \fIanswer\fR, or -1 upon error. .sp .LP The \fBres_nquery()\fR and \fBres_query()\fR routines return a length that may be bigger than \fIanslen\fR. In that case, retry the query with a larger \fIbuf\fR. The \fIanswer\fR to the second query may be larger still], so it is recommended that you supply a \fIbuf\fR larger than the \fIanswer\fR returned by the previous query. \fIanswer\fR must be large enough to receive a maximum \fBUDP\fR response from the server or parts of the \fIanswer\fR will be silently discarded. The default maximum \fBUDP\fR response size is 512 bytes. .SS "\fBres_nsearch()\fR, \fBres_search()\fR" The \fBres_nsearch()\fR and \fBres_search()\fR routines make a query and await a response, just like like \fBres_nquery()\fR and \fBres_query()\fR. In addition, they implement the default and search rules controlled by the \fBRES_DEFNAMES\fR and \fBRES_DNSRCH\fR options. They return the length of the first successful reply which is stored in \fIanswer\fR. On error, they return -1. .sp .LP The \fBres_nsearch()\fR and \fBres_search()\fR routines return a length that may be bigger than \fIanslen\fR. In that case, retry the query with a larger \fIbuf\fR. The \fIanswer\fR to the second query may be larger still], so it is recommended that you supply a \fIbuf\fR larger than the \fIanswer\fR returned by the previous query. \fIanswer\fR must be large enough to receive a maximum \fBUDP\fR response from the server or parts of the \fIanswer\fR will be silently discarded. The default maximum \fBUDP\fR response size is 512 bytes. .SS "\fBres_nquerydomain()\fR" The \fBres_nquerydomain()\fR function calls \fBres_query()\fR on the concatenation of \fIname\fR and \fIdomain\fR, removing a trailing dot from \fIname\fR if \fIdomain\fR is \fINULL\fR. .SS "\fBres_nmkquery()\fR, \fBres_mkquery()\fR" These routines are used by \fBres_nquery()\fR and \fBres_query()\fR. The \fBres_nmkquery()\fR and \fBres_mkquery()\fR functions construct a standard query message and place it in \fIbuf\fR. The routine returns the \fIsize\fR of the query, or -1 if the query is larger than \fIbuflen\fR. The query type \fIop\fR is usually \fBQUERY\fR, but can be any of the query types defined in <\fBarpa/nameser.h\fR>. The domain name for the query is given by \fIdname\fR. \fInewrr\fR is currently unused but is intended for making update messages. .SS "\fBres_nsend()\fR, \fBres_send()\fR, \fBres_nsendsigned()\fR" The \fBres_nsend()\fR, \fBres_send()\fR, and \fBres_nsendsigned()\fR routines send a pre-formatted query that returns an \fIanswer\fR. The routine calls \fBres_ninit()\fR or \fBres_init()\fR. If \fBRES_INIT\fR is not set, the routine sends the query to the local name server and handles timeouts and retries. Additionally, the \fBres_nsendsigned()\fR uses \fBTSIG\fR 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. .sp .LP The \fBres_nsend()\fR and \fBres_send()\fR routines return a length that may be bigger than \fIanslen\fR. In that case, retry the query with a larger \fIbuf\fR. The \fIanswer\fR to the second query may be larger still], so it is recommended that you supply a \fIbuf\fR larger than the \fIanswer\fR returned by the previous query. \fIanswer\fR must be large enough to receive a maximum \fBUDP\fR response from the server or parts of the \fIanswer\fR will be silently discarded. The default maximum \fBUDP\fR response size is 512 bytes. .SS "\fBfp_resstat()\fR" The function \fBfp_resstat()\fR prints out the active flag bits in \fIstatp\fR->\fBoptions\fR preceded by the text "\fB;; res options:\fR" on \fIfile\fR. .SS "\fBres_hostalias()\fR" The function \fBres_hostalias()\fR looks up \fIname\fR in the file referred to by the \fBHOSTALIASES\fR environment variable and returns the fully qualified host name. If \fIname\fR is not found or an error occurs, \fBNULL\fR is returned. \fBres_hostalias()\fR stores the result in \fIbuf\fR. .SS "\fBres_nclose()\fR" The \fBres_nclose()\fR function closes any open files referenced through \fIstatp\fR. .SS "\fBres_ndestroy()\fR" The \fBres_ndestroy()\fR function calls \fBres_nclose()\fR, then frees any memory allocated by \fBres_ninit()\fR referenced through \fIstatp\fR. .SS "\fBdn_comp()\fR" The \fBdn_comp()\fR function compresses the domain name \fIexp_dn\fR and stores it in \fIcomp_dn\fR. The \fBdn_comp()\fR function returns the size of the compressed name, or \fB\(mi1\fR if there were errors. \fIlength\fR is the size of the array pointed to by \fIcomp_dn\fR. .sp .LP The \fIdnptrs\fR 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 \fINULL\fR. The limit to the array is specified by \fIlastdnptr\fR. .sp .LP A side effect of calling \fBdn_comp()\fR is to update the list of pointers for labels inserted into the message by \fBdn_comp()\fR as the name is compressed. If \fIdnptrs\fR is \fINULL\fR, names are not compressed. If \fIlastdnptr\fR is \fINULL\fR, \fBdn_comp()\fR does not update the list of labels. .SS "\fBdn_expand()\fR" The \fBdn_expand()\fR function expands the compressed domain name \fIcomp_dn\fR to a full domain name. The compressed name is contained in a query or reply message. \fImsg\fR is a pointer to the beginning of that message. The uncompressed name is placed in the buffer indicated by \fIexp_dn\fR, which is of size \fIlength\fR. The \fBdn_expand()\fR function returns the size of the compressed name, or \fB\(mi1\fR if there was an error. .SS "\fBhstrerror()\fR, \fBherror()\fR" The variables \fIstatp->res_h_errno\fR and \fI_res.res_h_errno\fR and external variable \fIh_errno\fR are set whenever an error occurs during a resolver operation. The following definitions are given in <\fBnetdb.h\fR>: .sp .in +2 .nf #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 */ .fi .in -2 .sp .sp .LP The \fBherror()\fR function writes a message to the diagnostic output consisting of the string parameters, the constant string "\fB:\fR", and a message corresponding to the value of \fIh_errno\fR. .sp .LP The \fBhstrerror()\fR function returns a string, which is the message text that corresponds to the value of the \fIerr\fR parameter. .SS "\fBres_setservers()\fR, \fBres_getservers()\fR" The functions \fBres_getservers()\fR and \fBres_setservers()\fR are used to get and set the list of servers to be queried. .SH FILES .ne 2 .na \fB\fB/etc/resolv.conf\fR\fR .ad .RS 20n resolver configuration file .RE .SH ATTRIBUTES See \fBattributes\fR(7) for descriptions of the following attributes: .sp .sp .TS box; c | c l | l . ATTRIBUTE TYPE ATTRIBUTE VALUE Interface Stability Committed _ MT-Level T{ Unsafe for deprecated interfaces; MT-Safe for all others. T} .TE .SH SEE ALSO .BR libresolv (3LIB), .BR gethostbyname (3NSL), .BR resolv.conf (5), .BR attributes (7), .BR domainname (8) .sp .LP Lottor, M. \fIRFC 1033, Domain Administrators Operations Guide\fR. Network Working Group. November 1987. .sp .LP Mockapetris, Paul. \fIRFC 1034, Domain Names - Concepts and Facilities\fR. Network Working Group. November 1987. .sp .LP Mockapetris, Paul. \fIRFC 1035, Domain Names - Implementation and Specification\fR. Network Working Group. November 1987. .sp .LP Partridge, Craig. \fIRFC 974, Mail Routing and the Domain System\fR. Network Working Group. January 1986. .sp .LP Stahl, M. \fIRFC 1032, Domain Administrators Guide\fR. Network Working Group. November 1987. .sp .LP Vixie, Paul, Dunlap, Kevin J., Karels, Michael J. \fIName Server Operations Guide for BIND\fR. Internet Software Consortium, 1996. .SH NOTES When the caller supplies a work buffer, for example the \fIanswer\fR buffer argument to \fBres_nsend()\fR or \fBres_send()\fR, the buffer should be aligned on an eight byte boundary. Otherwise, an error such as a \fBSIGBUS\fR may result.