* Copyright (c) 1985 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that this notice is preserved and that due credit is given
* to the University of California at Berkeley. The name of the University
* may not be used to endorse or promote products derived from this
* software without specific prior written permission. This software
* is provided ``as is'' without express or implied warranty.
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)res_init.c 6.8 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
#include <arpa/nameser.h>
* Resolver configuration file. Contains the address of the
* inital name server to query and the default domain for
* non fully qualified domain names.
#define CONFFILE "/etc/resolv.conf"
* 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
extern u_long
inet_addr();
extern char *strcpy(), *strncpy();
int n
= 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
);
if ((fp
= fopen(CONFFILE
, "r")) != NULL
) {
/* read the config file */
while (fgets(buf
, sizeof(buf
), fp
) != NULL
) {
/* read default domain name */
if (!strncmp(buf
, "domain", sizeof("domain") - 1)) {
cp
= buf
+ sizeof("domain") - 1;
while (*cp
== ' ' || *cp
== '\t')
(void)strncpy(_res
.defdname
, cp
, sizeof(_res
.defdname
));
_res
.defdname
[sizeof(_res
.defdname
) - 1] = '\0';
if ((cp
= index(_res
.defdname
, '\n')) != NULL
)
/* read nameservers to query */
if (!strncmp(buf
, "nameserver",
sizeof("nameserver") - 1) && (n
< MAXNS
)) {
cp
= buf
+ sizeof("nameserver") - 1;
while (*cp
== ' ' || *cp
== '\t')
_res
.nsaddr_list
[n
].sin_addr
.s_addr
= inet_addr(cp
);
if (_res
.nsaddr_list
[n
].sin_addr
.s_addr
== (unsigned)-1)
_res
.nsaddr_list
[n
].sin_addr
.s_addr
= INADDR_ANY
;
_res
.nsaddr_list
[n
].sin_family
= AF_INET
;
_res
.nsaddr_list
[n
].sin_port
= htons(NAMESERVER_PORT
);
if ( _res
.options
& RES_DEBUG
)
printf("MAXNS reached, reading resolv.conf\n");
if (_res
.defdname
[0] == 0) {
if (gethostname(buf
, sizeof(_res
.defdname
)) == 0 &&
(void)strcpy(_res
.defdname
, cp
+ 1);
/* Allow user to override the local domain definition */
if ((cp
= getenv("LOCALDOMAIN")) != NULL
)
(void)strncpy(_res
.defdname
, cp
, sizeof(_res
.defdname
));
/* find components of local domain that might be searched */
for (cp
= _res
.defdname
, n
= 0; *cp
; cp
++)
for (; n
>= LOCALDOMAINPARTS
&& pp
< _res
.dnsrch
+ MAXDNSRCH
; n
--) {
_res
.options
|= RES_INIT
;