* Copyright (c) 1985, 1989 Regents of the University of California.
* %sccs.include.redist.c%
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)res_init.c 8.1 (Berkeley) %G%";
static char rcsid
[] = "$Id: res_init.c,v 4.9.1.1 1993/05/02 22:43:03 vixie Rel $";
#endif /* LIBC_SCCS and not lint */
#include <arpa/nameser.h>
* Resolver state default settings
struct __res_state _res
= {
RES_TIMEOUT
, /* retransmition time interval */
4, /* number of times to retransmit */
RES_DEFAULT
, /* options flags */
1, /* number of name servers */
* Set up default settings. If the configuration file exist, the values
* there will have precedence. Otherwise, the server address is set to
* INADDR_ANY and the default domain name comes from the gethostname().
* The configuration file should only be used if you want to redefine your
* domain or run without a server on your machine.
* Return 0 if completes successfully, -1 on error
int nserv
= 0; /* number of nameserver records read from file */
_res
.nsaddr
.sin_addr
= inet_makeaddr(IN_LOOPBACKNET
, 1);
_res
.nsaddr
.sin_addr
.s_addr
= INADDR_ANY
;
_res
.nsaddr
.sin_family
= AF_INET
;
_res
.nsaddr
.sin_port
= htons(NAMESERVER_PORT
);
/* Allow user to override the local domain definition */
if ((cp
= getenv("LOCALDOMAIN")) != NULL
) {
(void)strncpy(_res
.defdname
, cp
, sizeof(_res
.defdname
));
if ((cp
= strpbrk(_res
.defdname
, " \t\n")) != NULL
)
if ((fp
= fopen(_PATH_RESCONF
, "r")) != NULL
) {
/* read the config file */
while (fgets(buf
, sizeof(buf
), fp
) != NULL
) {
if ((*buf
== ';') || (*buf
== '#'))
/* read default domain name */
if (!strncmp(buf
, "domain", sizeof("domain") - 1)) {
if (haveenv
) /* skip if have from environ */
cp
= buf
+ sizeof("domain") - 1;
while (*cp
== ' ' || *cp
== '\t')
if ((*cp
== '\0') || (*cp
== '\n'))
(void)strncpy(_res
.defdname
, cp
,
sizeof(_res
.defdname
) - 1);
if ((cp
= strpbrk(_res
.defdname
, " \t\n")) != NULL
)
if (!strncmp(buf
, "search", sizeof("search") - 1)) {
if (haveenv
) /* skip if have from environ */
cp
= buf
+ sizeof("search") - 1;
while (*cp
== ' ' || *cp
== '\t')
if ((*cp
== '\0') || (*cp
== '\n'))
(void)strncpy(_res
.defdname
, cp
,
sizeof(_res
.defdname
) - 1);
if ((cp
= index(_res
.defdname
, '\n')) != NULL
)
* Set search list to be blank-separated strings
for (n
= 0; *cp
&& pp
< _res
.dnsrch
+ MAXDNSRCH
; cp
++) {
if (*cp
== ' ' || *cp
== '\t') {
/* null terminate last domain if there are excess */
while (*cp
!= '\0' && *cp
!= ' ' && *cp
!= '\t')
/* read nameservers to query */
if (!strncmp(buf
, "nameserver", sizeof("nameserver") - 1) &&
cp
= buf
+ sizeof("nameserver") - 1;
while (*cp
== ' ' || *cp
== '\t')
if ((*cp
!= '\0') && (*cp
!= '\n') && inet_aton(cp
, &a
)) {
_res
.nsaddr_list
[nserv
].sin_addr
= a
;
_res
.nsaddr_list
[nserv
].sin_family
= AF_INET
;
_res
.nsaddr_list
[nserv
].sin_port
=
if (_res
.defdname
[0] == 0) {
if (gethostname(buf
, sizeof(_res
.defdname
)) == 0 &&
(void)strcpy(_res
.defdname
, cp
+ 1);
/* find components of local domain that might be searched */
for (cp
= _res
.defdname
, n
= 0; *cp
; cp
++)
for (; n
>= LOCALDOMAINPARTS
&& pp
< _res
.dnsrch
+ MAXDFLSRCH
;
_res
.options
|= RES_INIT
;