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