* Copyright (c) 1985, 1989 Regents of the University of California.
* %sccs.include.redist.c%
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)res_init.c 6.15 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
#include <arpa/nameser.h>
* Resolver state default settings
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
.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 ((fp
= fopen(_PATH_RESCONF
, "r")) != NULL
) {
/* read the config file */
while (fgets(buf
, sizeof(buf
), fp
) != NULL
) {
/* 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
= index(_res
.defdname
, '\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'))
if ((_res
.nsaddr_list
[nserv
].sin_addr
.s_addr
=
inet_addr(cp
)) == (unsigned)-1) {
_res
.nsaddr_list
[nserv
].sin_addr
.s_addr
_res
.nsaddr_list
[nserv
].sin_family
= AF_INET
;
_res
.nsaddr_list
[nserv
].sin_port
= htons(NAMESERVER_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
;