4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
31 * University Copyright- Copyright (c) 1982, 1986, 1988
32 * The Regents of the University of California
35 * University Acknowledgment- Portions of this document are derived from
36 * software developed by the University of California, Berkeley, and its
40 #pragma ident "%Z%%M% %I% %E% SMI"
42 #include <sys/types.h>
43 #include <sys/sockio.h>
44 #include <sys/socket.h>
45 #include <netinet/in.h>
47 #include <arpa/nameser.h>
50 #include <netinet/in.h>
52 #include <netinet/if_ether.h>
53 #include <arpa/inet.h>
58 * Resolver state default settings
62 RES_TIMEOUT
, /* retransmition time interval */
63 4, /* number of times to retransmit */
64 RES_DEFAULT
, /* options flags */
65 1, /* number of name servers */
69 * Set up default settings. If the configuration file exist, the values
70 * there will have precedence. Otherwise, the server address is set to
71 * INADDR_LOOPBACK and the default domain name comes from the gethostname().
72 * BUT if the NIS/RPC domain name is set, that is used if all else fails.
74 * The configuration file should only be used if you want to redefine your
75 * domain or run without a server on your machine.
77 * Note the user can always override then domain name with the environment
78 * variable LOCALDOMAIN which has absolute priority.
81 * Return 0 if completes successfully, -1 on error
87 register char *cp
, **pp
;
91 extern char *strchr();
95 extern char *strcpy(), *strncpy();
96 extern char *getenv();
97 int nserv
= 0; /* number of nameserver records read from file */
101 _res
.nsaddr
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
); /* INADDR_ANY */
102 _res
.nsaddr
.sin_family
= AF_INET
;
103 _res
.nsaddr
.sin_port
= htons(NAMESERVER_PORT
);
107 { int numifs
, s
, n
, int_up
;
109 register struct ifreq
*ifrp
;
114 extern void *malloc();
116 if ((s
= socket(AF_INET
, SOCK_DGRAM
, 0)) < 0) {
120 if (ioctl(s
, SIOCGIFNUM
, (char *)&numifs
) < 0) {
123 bufsize
= numifs
* sizeof (struct ifreq
);
124 buf
= (char *)malloc(bufsize
);
126 perror("out of memory");
130 ifc
.ifc_len
= bufsize
;
132 if (ioctl(s
, SIOCGIFCONF
, (char *)&ifc
) < 0) {
133 perror("ifconfig: SIOCGIFCONF");
141 for (n
= ifc
.ifc_len
/ sizeof (struct ifreq
); n
> 0;
143 memset((void *) &ifr
, 0, sizeof (ifr
));
144 strncpy(ifr
.ifr_name
, ifrp
->ifr_name
,
145 sizeof (ifr
.ifr_name
));
146 if (ioctl(s
, SIOCGIFFLAGS
, (char *)&ifr
) < 0) {
147 perror("SIOCGIFFLAGS");
152 flags
= ifr
.ifr_flags
;
153 /* we are looking for a non-loopback interface */
154 if ((flags
& IFF_UP
) && ((flags
& IFF_LOOPBACK
) == 0))
159 if (int_up
== 0) /* all the non-LOOPBACK interfaces are DOWN */
162 #endif /* SIOCGIFNUM */
166 * for the benefit of hidden NIS domains, we use the same procedure
167 * as sendmail: convert leading + to dot, then drop to first dot
169 getdomainname(buf
, BUFSIZ
);
173 cp
= strchr(buf
, (int)'.');
175 cp
= index(buf
, '.');
178 strcpy(_res
.defdname
, buf
);
180 strcpy(_res
.defdname
, cp
+1);
182 /* Allow user to override the local domain definition */
183 if ((cp
= getenv("LOCALDOMAIN")) != NULL
) {
184 (void) strncpy(_res
.defdname
, cp
, sizeof (_res
.defdname
));
188 if ((fp
= fopen(_PATH_RESCONF
, "r")) != NULL
) {
189 /* read the config file */
190 while (fgets(buf
, sizeof (buf
), fp
) != NULL
) {
191 /* read default domain name */
192 if (!strncmp(buf
, "domain", sizeof ("domain") - 1)) {
193 if (haveenv
) /* skip if have from environ */
195 cp
= buf
+ sizeof ("domain") - 1;
196 while (*cp
== ' ' || *cp
== '\t')
198 if ((*cp
== '\0') || (*cp
== '\n'))
200 (void) strncpy(_res
.defdname
, cp
, sizeof (_res
.defdname
) - 1);
202 if ((cp
= strchr(_res
.defdname
, (int)'\n')) != NULL
)
204 if ((cp
= index(_res
.defdname
, '\n')) != NULL
)
210 /* set search list */
211 if (!strncmp(buf
, "search", sizeof ("search") - 1)) {
212 if (haveenv
) /* skip if have from environ */
214 cp
= buf
+ sizeof ("search") - 1;
215 while (*cp
== ' ' || *cp
== '\t')
217 if ((*cp
== '\0') || (*cp
== '\n'))
219 (void) strncpy(_res
.defdname
, cp
, sizeof (_res
.defdname
) - 1);
221 if ((cp
= strchr(_res
.defdname
, (int)'\n')) != NULL
)
223 if ((cp
= index(_res
.defdname
, '\n')) != NULL
)
227 * Set search list to be blank-separated strings
233 for (n
= 0; *cp
&& pp
< _res
.dnsrch
+ MAXDNSRCH
; cp
++) {
234 if (*cp
== ' ' || *cp
== '\t') {
242 /* null terminate last domain if there are excess */
243 while (*cp
!= '\0' && *cp
!= ' ' && *cp
!= '\t')
250 /* read nameservers to query */
251 if (!strncmp(buf
, "nameserver", sizeof ("nameserver") - 1) &&
253 cp
= buf
+ sizeof ("nameserver") - 1;
254 while (*cp
== ' ' || *cp
== '\t')
256 if ((*cp
== '\0') || (*cp
== '\n'))
258 if ((_res
.nsaddr_list
[nserv
].sin_addr
.s_addr
=
259 inet_addr(cp
)) == (unsigned) -1) {
260 _res
.nsaddr_list
[n
].sin_addr
.s_addr
= INADDR_ANY
;
263 _res
.nsaddr_list
[nserv
].sin_family
= AF_INET
;
264 _res
.nsaddr_list
[nserv
].sin_port
= htons(NAMESERVER_PORT
);
270 _res
.nscount
= nserv
;
273 if (_res
.defdname
[0] == 0) {
274 if (gethostname(buf
, sizeof (_res
.defdname
)) == 0 &&
276 (cp
= strchr(buf
, (int)'.')))
278 (cp
= index(buf
, '.')))
280 (void) strcpy(_res
.defdname
, cp
+ 1);
283 /* find components of local domain that might be searched */
284 if (havesearch
== 0) {
286 *pp
++ = _res
.defdname
;
287 for (cp
= _res
.defdname
, n
= 0; *cp
; cp
++)
291 for (; n
>= LOCALDOMAINPARTS
&& pp
< _res
.dnsrch
+ MAXDFLSRCH
; n
--) {
293 cp
= strchr(cp
, (int)'.');
301 _res
.options
|= RES_INIT
;