1d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
2d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Copyright (c) 1985, 1989, 1993
3d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    The Regents of the University of California.  All rights reserved.
4d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
5d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions copyright (c) 1999, 2000
6d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Intel Corporation.
7d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * All rights reserved.
8d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
9d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Redistribution and use in source and binary forms, with or without
10d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * modification, are permitted provided that the following conditions
11d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * are met:
12d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
13d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 1. Redistributions of source code must retain the above copyright
14d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    notice, this list of conditions and the following disclaimer.
15d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
16d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 2. Redistributions in binary form must reproduce the above copyright
17d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    notice, this list of conditions and the following disclaimer in the
18d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    documentation and/or other materials provided with the distribution.
19d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
20d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 3. All advertising materials mentioning features or use of this software
21d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    must display the following acknowledgement:
22d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
23d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    This product includes software developed by the University of
24d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    California, Berkeley, Intel Corporation, and its contributors.
25d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
26d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 4. Neither the name of University, Intel Corporation, or their respective
27d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    contributors may be used to endorse or promote products derived from
28d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    this software without specific prior written permission.
29d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
30d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THIS SOFTWARE IS PROVIDED BY THE REGENTS, INTEL CORPORATION AND
31d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
32d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
33d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS,
34d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * INTEL CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
35d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
37d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
38d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
40d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
42d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
43d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
44d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
45d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SUCH DAMAGE.
46d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
47d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
48d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
49d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions Copyright (c) 1993 by Digital Equipment Corporation.
50d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
51d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Permission to use, copy, modify, and distribute this software for any
52d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * purpose with or without fee is hereby granted, provided that the above
53d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * copyright notice and this permission notice appear in all copies, and that
54d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * the name of Digital Equipment Corporation not be used in advertising or
55d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * publicity pertaining to distribution of the document or software without
56d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * specific, written prior permission.
57d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
58d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
59d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
60d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
61d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
62d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
63d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
64d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
65d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SOFTWARE.
66d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
67d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
68d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
69d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Portions Copyright (c) 1996 by Internet Software Consortium.
70d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
71d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Permission to use, copy, modify, and distribute this software for any
72d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * purpose with or without fee is hereby granted, provided that the above
73d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * copyright notice and this permission notice appear in all copies.
74d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
75d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
76d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
77d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
78d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
79d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
80d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
81d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
82d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SOFTWARE.
83d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
84d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
85d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#if defined(LIBC_SCCS) && !defined(lint)
86d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char sccsid[] = "@(#)res_init.c  8.1 (Berkeley) 6/7/93";
87d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char orig_rcsid[] = "From: Id: res_init.c,v 8.7 1996/11/18 09:10:04 vixie Exp $";
88d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char rcsid[] = "$Id: res_init.c,v 1.1.1.1 2003/11/19 01:51:37 kyu3 Exp $";
89d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif /* LIBC_SCCS and not lint */
90d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
91d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/types.h>
92d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/param.h>
93d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/socket.h>
94d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/time.h>
95d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <netinet/in.h>
96d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <arpa/inet.h>
97d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <arpa/nameser.h>
98d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <ctype.h>
99d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <resolv.h>
100d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdio.h>
101d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdlib.h>
102d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <string.h>
103d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <unistd.h>
104d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
105d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include "res_config.h"
106d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
107d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic void res_setoptions __P((char *, char *));
108d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
109d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef RESOLVSORT
110d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic const char sort_mask[] = "/&";
111d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define ISSORTMASK(ch) (strchr(sort_mask, ch) != NULL)
112d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic u_int32_t net_mask __P((struct in_addr));
113d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
114d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
115d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#if !defined(isascii) /* XXX - could be a function */
116d7ce700605e1af0e455e31ec11f19ff21d26b525darylm# define isascii(c) (!(c & 0200))
117d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
118d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
119d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
120d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Resolver state default settings.
121d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
122d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
123d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstruct __res_state _res
124d7ce700605e1af0e455e31ec11f19ff21d26b525darylm# if defined(__BIND_RES_TEXT)
125d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    = { RES_TIMEOUT, }  /* Motorola, et al. */
126d7ce700605e1af0e455e31ec11f19ff21d26b525darylm# endif
127d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    ;
128d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
129d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
130d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
131d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Set up default settings.  If the configuration file exist, the values
132d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * there will have precedence.  Otherwise, the server address is set to
133d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * INADDR_ANY and the default domain name comes from the gethostname().
134d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
135d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * An interrim version of this code (BIND 4.9, pre-4.4BSD) used 127.0.0.1
136d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * rather than INADDR_ANY ("0.0.0.0") as the default name server address
137d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * since it was noted that INADDR_ANY actually meant ``the first interface
138d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * you "ifconfig"'d at boot time'' and if this was a SLIP or PPP interface,
139d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * it had to be "up" in order for you to reach your own name server.  It
140d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * was later decided that since the recommended practice is to always
141d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * install local static routes through 127.0.0.1 for all your network
142d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * interfaces, that we could solve this problem without a code change.
143d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
144d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * The configuration file should always be used, since it is the only way
145d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * to specify a default domain.  If you are running a server on your local
146d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * machine, you should say "nameserver 0.0.0.0" or "nameserver 127.0.0.1"
147d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * in the configuration file.
148d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
149d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Return 0 if completes successfully, -1 on error
150d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
151d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint
152d7ce700605e1af0e455e31ec11f19ff21d26b525darylmres_init()
153d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
154d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    register FILE *fp;
155d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    register char *cp, **pp;
156d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    register int n;
157d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char buf[MAXDNAME];
158d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int nserv = 0;    /* number of nameserver records read from file */
159d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int haveenv = 0;
160d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int havesearch = 0;
161d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef RESOLVSORT
162d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int nsort = 0;
163d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char *net;
164d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
165d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifndef RFC1535
166d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int dots;
167d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
168d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
169d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /*
170d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * These three fields used to be statically initialized.  This made
171d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * it hard to use this code in a shared library.  It is necessary,
172d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * now that we're doing dynamic initialization here, that we preserve
173d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * the old semantics: if an application modifies one of these three
174d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * fields of _res before res_init() is called, res_init() will not
175d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * alter them.  Of course, if an application is setting them to
176d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * _zero_ before calling res_init(), hoping to override what used
177d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * to be the static default, we can't detect it and unexpected results
178d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * will follow.  Zero for any of these fields would make no sense,
179d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * so one can safely assume that the applications were already getting
180d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * unexpected results.
181d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     *
182d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * _res.options is tricky since some apps were known to diddle the bits
183d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * before res_init() was first called. We can't replicate that semantic
184d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * with dynamic initialization (they may have turned bits off that are
185d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * set in RES_DEFAULT).  Our solution is to declare such applications
186d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * "broken".  They could fool us by setting RES_INIT but none do (yet).
187d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     */
188d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (!_res.retrans)
189d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        _res.retrans = RES_TIMEOUT;
190d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (!_res.retry)
191d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        _res.retry = 4;
192d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (!(_res.options & RES_INIT))
193d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        _res.options = RES_DEFAULT;
194d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
195d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /*
196d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * This one used to initialize implicitly to zero, so unless the app
197d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     * has set it to something in particular, we can randomize it now.
198d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     */
199d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (!_res.id)
200d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        _res.id = (u_short)res_randomid();
201d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
202d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef USELOOPBACK
203d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    _res.nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
204d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#else
205d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
206d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
207d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    _res.nsaddr.sin_family = AF_INET;
208d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    _res.nsaddr.sin_port = htons(NAMESERVER_PORT);
209d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    _res.nscount = 1;
210d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    _res.ndots = 1;
211d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    _res.pfcode = 0;
212d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
213d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /* Allow user to override the local domain definition */
214d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef _ORG_FREEBSD_
215d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (issetugid() == 0 && (cp = getenv("LOCALDOMAIN")) != NULL)
216d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#else
217d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((cp = getenv("LOCALDOMAIN")) != NULL)
218d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
219d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    {
220d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1);
221d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        _res.defdname[sizeof(_res.defdname) - 1] = '\0';
222d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        haveenv++;
223d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
224d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /*
225d7ce700605e1af0e455e31ec11f19ff21d26b525darylm         * Set search list to be blank-separated strings
226d7ce700605e1af0e455e31ec11f19ff21d26b525darylm         * from rest of env value.  Permits users of LOCALDOMAIN
227d7ce700605e1af0e455e31ec11f19ff21d26b525darylm         * to still have a search list, and anyone to set the
228d7ce700605e1af0e455e31ec11f19ff21d26b525darylm         * one that they want to use as an individual (even more
229d7ce700605e1af0e455e31ec11f19ff21d26b525darylm         * important now that the rfc1535 stuff restricts searches)
230d7ce700605e1af0e455e31ec11f19ff21d26b525darylm         */
231d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp = _res.defdname;
232d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        pp = _res.dnsrch;
233d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *pp++ = cp;
234d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) {
235d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (*cp == '\n')    /* silly backwards compat */
236d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                break;
237d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            else if (*cp == ' ' || *cp == '\t') {
238d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                *cp = 0;
239d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                n = 1;
240d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            } else if (n) {
241d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                *pp++ = cp;
242d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                n = 0;
243d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                havesearch = 1;
244d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            }
245d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
246d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /* null terminate last domain if there are excess */
247d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        while (*cp != '\0' && *cp != ' ' && *cp != '\t' && *cp != '\n')
248d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cp++;
249d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *cp = '\0';
250d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *pp++ = 0;
251d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
252d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
253d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define MATCH(line, name) \
254d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    (!strncmp(line, name, sizeof(name) - 1) && \
255d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    (line[sizeof(name) - 1] == ' ' || \
256d7ce700605e1af0e455e31ec11f19ff21d26b525darylm     line[sizeof(name) - 1] == '\t'))
257d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
258d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) {
259d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /* read the config file */
260d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        while (fgets(buf, sizeof(buf), fp) != NULL) {
261d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /* skip comments */
262d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (*buf == ';' || *buf == '#')
263d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            continue;
264d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /* read default domain name */
265d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (MATCH(buf, "domain")) {
266d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (haveenv)    /* skip if have from environ */
267d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                continue;
268d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cp = buf + sizeof("domain") - 1;
269d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            while (*cp == ' ' || *cp == '\t')
270d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                cp++;
271d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if ((*cp == '\0') || (*cp == '\n'))
272d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                continue;
273d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1);
274d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            _res.defdname[sizeof(_res.defdname) - 1] = '\0';
275d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if ((cp = strpbrk(_res.defdname, " \t\n")) != NULL)
276d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                *cp = '\0';
277d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            havesearch = 0;
278d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            continue;
279d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
280d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /* set search list */
281d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (MATCH(buf, "search")) {
282d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (haveenv)    /* skip if have from environ */
283d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                continue;
284d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cp = buf + sizeof("search") - 1;
285d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            while (*cp == ' ' || *cp == '\t')
286d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                cp++;
287d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if ((*cp == '\0') || (*cp == '\n'))
288d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                continue;
289d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1);
290d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            _res.defdname[sizeof(_res.defdname) - 1] = '\0';
291d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if ((cp = strchr(_res.defdname, '\n')) != NULL)
292d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                *cp = '\0';
293d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            /*
294d7ce700605e1af0e455e31ec11f19ff21d26b525darylm             * Set search list to be blank-separated strings
295d7ce700605e1af0e455e31ec11f19ff21d26b525darylm             * on rest of line.
296d7ce700605e1af0e455e31ec11f19ff21d26b525darylm             */
297d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cp = _res.defdname;
298d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            pp = _res.dnsrch;
299d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            *pp++ = cp;
300d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) {
301d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                if (*cp == ' ' || *cp == '\t') {
302d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    *cp = 0;
303d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    n = 1;
304d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                } else if (n) {
305d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    *pp++ = cp;
306d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    n = 0;
307d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                }
308d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            }
309d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            /* null terminate last domain if there are excess */
310d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            while (*cp != '\0' && *cp != ' ' && *cp != '\t')
311d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                cp++;
312d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            *cp = '\0';
313d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            *pp++ = 0;
314d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            havesearch = 1;
315d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            continue;
316d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
317d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /* read nameservers to query */
318d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (MATCH(buf, "nameserver") && nserv < MAXNS) {
319d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            struct in_addr a;
320d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
321d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cp = buf + sizeof("nameserver") - 1;
322d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            while (*cp == ' ' || *cp == '\t')
323d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cp++;
324d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if ((*cp != '\0') && (*cp != '\n') && inet_aton(cp, &a)) {
325d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            _res.nsaddr_list[nserv].sin_addr = a;
326d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            _res.nsaddr_list[nserv].sin_family = AF_INET;
327d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            _res.nsaddr_list[nserv].sin_port =
328d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                htons(NAMESERVER_PORT);
329d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            nserv++;
330d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            }
331d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            continue;
332d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
333d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef RESOLVSORT
334d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (MATCH(buf, "sortlist")) {
335d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            struct in_addr a;
336d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
337d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cp = buf + sizeof("sortlist") - 1;
338d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            while (nsort < MAXRESOLVSORT) {
339d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            while (*cp == ' ' || *cp == '\t')
340d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                cp++;
341d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (*cp == '\0' || *cp == '\n' || *cp == ';')
342d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                break;
343d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            net = cp;
344d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            while (*cp && !ISSORTMASK(*cp) && *cp != ';' &&
345d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                   isascii(*cp) && !isspace(*cp))
346d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                cp++;
347d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            n = *cp;
348d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            *cp = 0;
349d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (inet_aton(net, &a)) {
350d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                _res.sort_list[nsort].addr = a;
351d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                if (ISSORTMASK(n)) {
352d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                *cp++ = (char)n;
353d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                net = cp;
354d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                while (*cp && *cp != ';' &&
355d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    isascii(*cp) && !isspace(*cp))
356d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    cp++;
357d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                n = *cp;
358d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                *cp = 0;
359d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                if (inet_aton(net, &a)) {
360d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    _res.sort_list[nsort].mask = a.s_addr;
361d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                } else {
362d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    _res.sort_list[nsort].mask =
363d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    net_mask(_res.sort_list[nsort].addr);
364d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                }
365d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                } else {
366d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                _res.sort_list[nsort].mask =
367d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                    net_mask(_res.sort_list[nsort].addr);
368d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                }
369d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                nsort++;
370d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            }
371d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            *cp = (char)n;
372d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            }
373d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            continue;
374d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
375d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
376d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (MATCH(buf, "options")) {
377d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            res_setoptions(buf + sizeof("options") - 1, "conf");
378d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            continue;
379d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
380d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
381d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (nserv > 1)
382d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        _res.nscount = nserv;
383d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef RESOLVSORT
384d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        _res.nsort = nsort;
385d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
386d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        (void) fclose(fp);
387d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
388d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (_res.defdname[0] == 0 &&
389d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        gethostname(buf, sizeof(_res.defdname) - 1) == 0 &&
390d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        (cp = strchr(buf, '.')) != NULL)
391d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        strcpy(_res.defdname, cp + 1);
392d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
393d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    /* find components of local domain that might be searched */
394d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (havesearch == 0) {
395d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        pp = _res.dnsrch;
396d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *pp++ = _res.defdname;
397d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *pp = NULL;
398d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
399d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifndef RFC1535
400d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        dots = 0;
401d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        for (cp = _res.defdname; *cp; cp++)
402d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            dots += (*cp == '.');
403d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
404d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        cp = _res.defdname;
405d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        while (pp < _res.dnsrch + MAXDFLSRCH) {
406d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (dots < LOCALDOMAINPARTS)
407d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                break;
408d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cp = strchr(cp, '.') + 1;    /* we know there is one */
409d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            *pp++ = cp;
410d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            dots--;
411d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
412d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        *pp = NULL;
413d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef DEBUG
414d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (_res.options & RES_DEBUG) {
415d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            printf(";; res_init()... default dnsrch list:\n");
416d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            for (pp = _res.dnsrch; *pp; pp++)
417d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                printf(";;\t%s\n", *pp);
418d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            printf(";;\t..END..\n");
419d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
420d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
421d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif /* !RFC1535 */
422d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
423d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
424d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef _ORG_FREEBSD_
425d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (issetugid())
426d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#else
427d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (1)
428d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
429d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        _res.options |= RES_NOALIASES;
430d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    else if ((cp = getenv("RES_OPTIONS")) != NULL)
431d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        res_setoptions(cp, "env");
432d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    _res.options |= RES_INIT;
433d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if ( 0 == nserv ) {
434d7ce700605e1af0e455e31ec11f19ff21d26b525darylm      return -1;
435d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
436d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (0);
437d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
438d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
439d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic void
440d7ce700605e1af0e455e31ec11f19ff21d26b525darylmres_setoptions(
441d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char *options,
442d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char *source
443d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    )
444d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
445d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    char *cp = options;
446d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    int i;
447d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
448d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef DEBUG
449d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (_res.options & RES_DEBUG)
450d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        printf(";; res_setoptions(\"%s\", \"%s\")...\n",
451d7ce700605e1af0e455e31ec11f19ff21d26b525darylm               options, source);
452d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
453d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    while (*cp) {
454d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /* skip leading and inner runs of spaces */
455d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        while (*cp == ' ' || *cp == '\t')
456d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cp++;
457d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /* search for and process individual options */
458d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        if (!strncmp(cp, "ndots:", sizeof("ndots:") - 1)) {
459d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            i = atoi(cp + sizeof("ndots:") - 1);
460d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (i <= RES_MAXNDOTS)
461d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                _res.ndots = i;
462d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            else
463d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                _res.ndots = RES_MAXNDOTS;
464d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef DEBUG
465d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (_res.options & RES_DEBUG)
466d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                printf(";;\tndots=%d\n", _res.ndots);
467d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
468d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        } else if (!strncmp(cp, "debug", sizeof("debug") - 1)) {
469d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef DEBUG
470d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            if (!(_res.options & RES_DEBUG)) {
471d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                printf(";; res_setoptions(\"%s\", \"%s\")..\n",
472d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                       options, source);
473d7ce700605e1af0e455e31ec11f19ff21d26b525darylm                _res.options |= RES_DEBUG;
474d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            }
475d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            printf(";;\tdebug\n");
476d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
477d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        } else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) {
478d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            _res.options |= RES_USE_INET6;
479d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        } else if (!strncmp(cp, "no_tld_query", sizeof("no_tld_query") - 1)) {
480d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            _res.options |= RES_NOTLDQUERY;
481d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        } else {
482d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            /* XXX - print a warning here? */
483d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        }
484d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        /* skip to next run of spaces */
485d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        while (*cp && *cp != ' ' && *cp != '\t')
486d7ce700605e1af0e455e31ec11f19ff21d26b525darylm            cp++;
487d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    }
488d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
489d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
490d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef RESOLVSORT
491d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/* XXX - should really support CIDR which means explicit masks always. */
492d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic u_int32_t
493d7ce700605e1af0e455e31ec11f19ff21d26b525darylmnet_mask(
494d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    struct in_addr in
495d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    )
496d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
497d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    register u_int32_t i = ntohl(in.s_addr);
498d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
499d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    if (IN_CLASSA(i))
500d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        return (htonl(IN_CLASSA_NET));
501d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    else if (IN_CLASSB(i))
502d7ce700605e1af0e455e31ec11f19ff21d26b525darylm        return (htonl(IN_CLASSB_NET));
503d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (htonl(IN_CLASSC_NET));
504d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
505d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
506d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
507d7ce700605e1af0e455e31ec11f19ff21d26b525darylmu_int
508d7ce700605e1af0e455e31ec11f19ff21d26b525darylmres_randomid()
509d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
510d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    struct timeval now;
511d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
512d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    gettimeofday(&now, NULL);
513d7ce700605e1af0e455e31ec11f19ff21d26b525darylm    return (0xffff & (now.tv_sec ^ now.tv_usec /* ^ getpid() */));
514d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
515