11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* $NetBSD: res_init.c,v 1.8 2006/03/19 03:10:08 christos Exp $ */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1985, 1989, 1993 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The Regents of the University of California. All rights reserved. 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * documentation and/or other materials provided with the distribution. 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. All advertising materials mentioning features or use of this software 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * must display the following acknowledgement: 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This product includes software developed by the University of 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * California, Berkeley and its contributors. 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 4. Neither the name of the University nor the names of its contributors 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * may be used to endorse or promote products derived from this software 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * without specific prior written permission. 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Portions Copyright (c) 1993 by Digital Equipment Corporation. 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies, and that 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the name of Digital Equipment Corporation not be used in advertising or 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * publicity pertaining to distribution of the document or software without 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * specific, written prior permission. 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SOFTWARE. 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Portions Copyright (c) 1996-1999 by Internet Software Consortium. 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies. 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if defined(LIBC_SCCS) && !defined(lint) 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93"; 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char rcsid[] = "Id: res_init.c,v 1.9.2.5.4.2 2004/03/16 12:34:18 marka Exp"; 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$NetBSD: res_init.c,v 1.8 2006/03/19 03:10:08 christos Exp $"); 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* LIBC_SCCS and not lint */ 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h> 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/param.h> 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/socket.h> 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/time.h> 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netinet/in.h> 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <arpa/inet.h> 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "arpa_nameser.h" 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <ctype.h> 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdio.h> 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdlib.h> 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h> 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <unistd.h> 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netdb.h> 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES 102b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra#include <errno.h> 103b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra#include <fcntl.h> 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/system_properties.h> 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* ANDROID_CHANGES */ 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef MIN 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define MIN(x,y) ((x)<(y)?(x):(y)) 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* ensure that sockaddr_in6 and IN6ADDR_ANY_INIT are declared / defined */ 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "resolv_private.h" 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <resolv.h> 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "res_private.h" 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Options. Should all be left alone. */ 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef DEBUG 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DEBUG 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void res_setoptions __P((res_state, const char *, const char *)); 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char sort_mask[] = "/&"; 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ISSORTMASK(ch) (strchr(sort_mask, ch) != NULL) 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic u_int32_t net_mask __P((struct in_addr)); 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if !defined(isascii) /* XXX - could be a function */ 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# define isascii(c) (!(c & 0200)) 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Resolver state default settings. 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Set up default settings. If the configuration file exist, the values 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * there will have precedence. Otherwise, the server address is set to 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INADDR_ANY and the default domain name comes from the gethostname(). 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * An interrim version of this code (BIND 4.9, pre-4.4BSD) used 127.0.0.1 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * rather than INADDR_ANY ("0.0.0.0") as the default name server address 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * since it was noted that INADDR_ANY actually meant ``the first interface 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * you "ifconfig"'d at boot time'' and if this was a SLIP or PPP interface, 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * it had to be "up" in order for you to reach your own name server. It 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * was later decided that since the recommended practice is to always 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * install local static routes through 127.0.0.1 for all your network 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * interfaces, that we could solve this problem without a code change. 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The configuration file should always be used, since it is the only way 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * to specify a default domain. If you are running a server on your local 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * machine, you should say "nameserver 0.0.0.0" or "nameserver 127.0.0.1" 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * in the configuration file. 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return 0 if completes successfully, -1 on error 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_ninit(res_state statp) { 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project extern int __res_vinit(res_state, int); 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (__res_vinit(statp, 0)); 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* This function has to be reachable by res_data.c but not publicly. */ 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__res_vinit(res_state statp, int preinit) { 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project register FILE *fp; 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project register char *cp, **pp; 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project register int n; 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char buf[BUFSIZ]; 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int nserv = 0; /* number of nameserver records read from file */ 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int haveenv = 0; 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int havesearch = 0; 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int nsort = 0; 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *net; 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int dots; 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project union res_sockaddr_union u[2]; 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1824661fda2e5339c39ceb3aefd184eb8be3d0ca835David 'Digit' Turner if ((statp->options & RES_INIT) != 0U) 1834661fda2e5339c39ceb3aefd184eb8be3d0ca835David 'Digit' Turner res_ndestroy(statp); 1844661fda2e5339c39ceb3aefd184eb8be3d0ca835David 'Digit' Turner 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!preinit) { 1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retrans = RES_TIMEOUT; 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retry = RES_DFLRETRY; 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options = RES_DEFAULT; 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->id = res_randomid(); 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memset(u, 0, sizeof(u)); 1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef USELOOPBACK 1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1); 1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin.sin_addr.s_addr = INADDR_ANY; 1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin.sin_family = AF_INET; 1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin.sin_port = htons(NAMESERVER_PORT); 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAVE_SA_LEN 2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin.sin_len = sizeof(struct sockaddr_in); 2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAS_INET6_STRUCTS 2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef USELOOPBACK 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin6.sin6_addr = in6addr_loopback; 2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin6.sin6_addr = in6addr_any; 2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin6.sin6_family = AF_INET6; 2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin6.sin6_port = htons(NAMESERVER_PORT); 2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAVE_SA_LEN 2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin6.sin6_len = sizeof(struct sockaddr_in6); 2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nscount = 0; 2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->ndots = 1; 2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->pfcode = 0; 2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_vcsock = -1; 2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_flags = 0; 2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->qhook = NULL; 2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->rhook = NULL; 2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.nscount = 0; 2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.ext = malloc(sizeof(*statp->_u._ext.ext)); 2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext != NULL) { 2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memset(statp->_u._ext.ext, 0, sizeof(*statp->_u._ext.ext)); 2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.ext->nsaddrs[0].sin = statp->nsaddr; 2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(statp->_u._ext.ext->nsuffix, "ip6.arpa"); 2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(statp->_u._ext.ext->nsuffix2, "ip6.int"); 2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsort = 0; 2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_setservers(statp, u, nserv); 2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if 0 /* IGNORE THE ENVIRONMENT */ 2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Allow user to override the local domain definition */ 2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((cp = getenv("LOCALDOMAIN")) != NULL) { 2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void)strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1); 2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->defdname[sizeof(statp->defdname) - 1] = '\0'; 2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project haveenv++; 2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Set search list to be blank-separated strings 2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * from rest of env value. Permits users of LOCALDOMAIN 2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * to still have a search list, and anyone to set the 2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * one that they want to use as an individual (even more 2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * important now that the rfc1535 stuff restricts searches) 2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = statp->defdname; 2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pp = statp->dnsrch; 2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = cp; 2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (n = 0; *cp && pp < statp->dnsrch + MAXDNSRCH; cp++) { 2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '\n') /* silly backwards compat */ 2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (*cp == ' ' || *cp == '\t') { 2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = 0; 2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = 1; 2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (n) { 2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = cp; 2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = 0; 2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project havesearch = 1; 2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* null terminate last domain if there are excess */ 2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp != '\0' && *cp != ' ' && *cp != '\t' && *cp != '\n') 2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = '\0'; 2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = 0; 2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (nserv > 0) 2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nscount = nserv; 2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 274c63e59039d28c352e3053bb81319e960c392dbd4Mattias Falk#ifndef ANDROID_CHANGES /* !ANDROID_CHANGES - IGNORE resolv.conf in Android */ 2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define MATCH(line, name) \ 2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (!strncmp(line, name, sizeof(name) - 1) && \ 2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (line[sizeof(name) - 1] == ' ' || \ 2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project line[sizeof(name) - 1] == '\t')) 2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv = 0; 2811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) { 2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* read the config file */ 2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (fgets(buf, sizeof(buf), fp) != NULL) { 2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* skip comments */ 2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*buf == ';' || *buf == '#') 2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* read default domain name */ 2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (MATCH(buf, "domain")) { 2891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (haveenv) /* skip if have from environ */ 2901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 2911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = buf + sizeof("domain") - 1; 2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((*cp == '\0') || (*cp == '\n')) 2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1); 2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->defdname[sizeof(statp->defdname) - 1] = '\0'; 2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((cp = strpbrk(statp->defdname, " \t\n")) != NULL) 2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = '\0'; 3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project havesearch = 0; 3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 3021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* set search list */ 3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (MATCH(buf, "search")) { 3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (haveenv) /* skip if have from environ */ 3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = buf + sizeof("search") - 1; 3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((*cp == '\0') || (*cp == '\n')) 3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1); 3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->defdname[sizeof(statp->defdname) - 1] = '\0'; 3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((cp = strchr(statp->defdname, '\n')) != NULL) 3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = '\0'; 3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Set search list to be blank-separated strings 3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * on rest of line. 3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = statp->defdname; 3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pp = statp->dnsrch; 3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = cp; 3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (n = 0; *cp && pp < statp->dnsrch + MAXDNSRCH; cp++) { 3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == ' ' || *cp == '\t') { 3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = 0; 3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = 1; 3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (n) { 3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = cp; 3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = 0; 3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* null terminate last domain if there are excess */ 3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp != '\0' && *cp != ' ' && *cp != '\t') 3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 3351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = '\0'; 3361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = 0; 3371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project havesearch = 1; 3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 3391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* read nameservers to query */ 3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (MATCH(buf, "nameserver") && nserv < MAXNS) { 3421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct addrinfo hints, *ai; 3431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char sbuf[NI_MAXSERV]; 3441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const size_t minsiz = 3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof(statp->_u._ext.ext->nsaddrs[0]); 3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = buf + sizeof("nameserver") - 1; 3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp[strcspn(cp, ";# \t\n")] = '\0'; 3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((*cp != '\0') && (*cp != '\n')) { 3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memset(&hints, 0, sizeof(hints)); 3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hints.ai_family = PF_UNSPEC; 3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hints.ai_socktype = SOCK_DGRAM; /*dummy*/ 3551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hints.ai_flags = AI_NUMERICHOST; 3561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(sbuf, "%u", NAMESERVER_PORT); 3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (getaddrinfo(cp, sbuf, &hints, &ai) == 0 && 3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ai->ai_addrlen <= minsiz) { 3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext != NULL) { 3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->_u._ext.ext->nsaddrs[nserv], 3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ai->ai_addr, ai->ai_addrlen); 3621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ai->ai_addrlen <= 3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof(statp->nsaddr_list[nserv])) { 3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->nsaddr_list[nserv], 3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ai->ai_addr, ai->ai_addrlen); 3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsaddr_list[nserv].sin_family = 0; 3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project freeaddrinfo(ai); 3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 3741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (MATCH(buf, "sortlist")) { 3761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct in_addr a; 3771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = buf + sizeof("sortlist") - 1; 3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (nsort < MAXRESOLVSORT) { 3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 3811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 3821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '\0' || *cp == '\n' || *cp == ';') 3831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 3841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project net = cp; 3851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp && !ISSORTMASK(*cp) && *cp != ';' && 3861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project isascii(*cp) && !isspace((unsigned char)*cp)) 3871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 3881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = *cp; 3891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = 0; 3901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (inet_aton(net, &a)) { 3911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->sort_list[nsort].addr = a; 3921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ISSORTMASK(n)) { 3931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp++ = n; 3941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project net = cp; 3951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp && *cp != ';' && 3961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project isascii(*cp) && 3971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !isspace((unsigned char)*cp)) 3981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = *cp; 4001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = 0; 4011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (inet_aton(net, &a)) { 4021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->sort_list[nsort].mask = a.s_addr; 4031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 4041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->sort_list[nsort].mask = 4051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project net_mask(statp->sort_list[nsort].addr); 4061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->sort_list[nsort].mask = 4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project net_mask(statp->sort_list[nsort].addr); 4101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nsort++; 4121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = n; 4141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 4161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (MATCH(buf, "options")) { 4181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_setoptions(statp, buf + sizeof("options") - 1, "conf"); 4191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 4201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (nserv > 0) 4231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nscount = nserv; 4241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsort = nsort; 4251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void) fclose(fp); 4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 427d378c68d74cb4fdac450650fe816c9d649c8edafDavid 'Digit' Turner#endif /* !ANDROID_CHANGES */ 4281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Last chance to get a nameserver. This should not normally 4301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * be necessary 4311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 4321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef NO_RESOLV_CONF 4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(nserv == 0) 4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv = get_nameservers(statp); 4351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 4361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->defdname[0] == 0 && 4381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project gethostname(buf, sizeof(statp->defdname) - 1) == 0 && 4391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (cp = strchr(buf, '.')) != NULL) 4401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(statp->defdname, cp + 1); 4411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* find components of local domain that might be searched */ 4431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (havesearch == 0) { 4441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pp = statp->dnsrch; 4451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = statp->defdname; 4461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp = NULL; 4471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dots = 0; 4491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (cp = statp->defdname; *cp; cp++) 4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dots += (*cp == '.'); 4511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = statp->defdname; 4531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (pp < statp->dnsrch + MAXDFLSRCH) { 4541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (dots < LOCALDOMAINPARTS) 4551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 4561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = strchr(cp, '.') + 1; /* we know there is one */ 4571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = cp; 4581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dots--; 4591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp = NULL; 4611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 4621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & RES_DEBUG) { 4631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";; res_init()... default dnsrch list:\n"); 4641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (pp = statp->dnsrch; *pp; pp++) 4651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\t%s\n", *pp); 4661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\t..END..\n"); 4671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 4691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((cp = getenv("RES_OPTIONS")) != NULL) 4721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_setoptions(statp, cp, "env"); 4731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (nserv > 0) { 4741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nscount = nserv; 4751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_INIT; 4761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 4781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 4791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void 4811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_setoptions(res_state statp, const char *options, const char *source) 4821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 4831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp = options; 4841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i; 4851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct __res_state_ext *ext = statp->_u._ext.ext; 4861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 4881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & RES_DEBUG) 4891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";; res_setoptions(\"%s\", \"%s\")...\n", 4901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project options, source); 4911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 4921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp) { 4931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* skip leading and inner runs of spaces */ 4941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 4951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 4961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* search for and process individual options */ 4971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!strncmp(cp, "ndots:", sizeof("ndots:") - 1)) { 4981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project i = atoi(cp + sizeof("ndots:") - 1); 4991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (i <= RES_MAXNDOTS) 5001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->ndots = i; 5011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 5021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->ndots = RES_MAXNDOTS; 5031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 5041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & RES_DEBUG) 5051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\tndots=%d\n", statp->ndots); 5061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 5071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "timeout:", sizeof("timeout:") - 1)) { 5081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project i = atoi(cp + sizeof("timeout:") - 1); 5091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (i <= RES_MAXRETRANS) 5101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retrans = i; 5111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 5121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retrans = RES_MAXRETRANS; 5131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 5141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & RES_DEBUG) 5151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\ttimeout=%d\n", statp->retrans); 5161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 5171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "attempts:", sizeof("attempts:") - 1)){ 5181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project i = atoi(cp + sizeof("attempts:") - 1); 5191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (i <= RES_MAXRETRY) 5201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retry = i; 5211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 5221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retry = RES_MAXRETRY; 5231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 5241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & RES_DEBUG) 5251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\tattempts=%d\n", statp->retry); 5261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 5271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "debug", sizeof("debug") - 1)) { 5281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 5291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!(statp->options & RES_DEBUG)) { 5301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";; res_setoptions(\"%s\", \"%s\")..\n", 5311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project options, source); 5321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_DEBUG; 5331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\tdebug\n"); 5351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 5361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "no_tld_query", 5371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof("no_tld_query") - 1) || 5381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !strncmp(cp, "no-tld-query", 5391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof("no-tld-query") - 1)) { 5401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_NOTLDQUERY; 5411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) { 5421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_USE_INET6; 5431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "rotate", sizeof("rotate") - 1)) { 5441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_ROTATE; 5451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "no-check-names", 5461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof("no-check-names") - 1)) { 5471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_NOCHECKNAME; 5481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_EDNS0 5501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) { 5511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_USE_EDNS0; 5521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 5541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (!strncmp(cp, "dname", sizeof("dname") - 1)) { 5551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_USE_DNAME; 5561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (!strncmp(cp, "nibble:", sizeof("nibble:") - 1)) { 5581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ext == NULL) 5591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto skip; 5601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp += sizeof("nibble:") - 1; 5611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project i = MIN(strcspn(cp, " \t"), sizeof(ext->nsuffix) - 1); 5621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(ext->nsuffix, cp, (size_t)i); 5631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ext->nsuffix[i] = '\0'; 5641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (!strncmp(cp, "nibble2:", sizeof("nibble2:") - 1)) { 5661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ext == NULL) 5671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto skip; 5681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp += sizeof("nibble2:") - 1; 5691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project i = MIN(strcspn(cp, " \t"), sizeof(ext->nsuffix2) - 1); 5701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(ext->nsuffix2, cp, (size_t)i); 5711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ext->nsuffix2[i] = '\0'; 5721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (!strncmp(cp, "v6revmode:", sizeof("v6revmode:") - 1)) { 5741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp += sizeof("v6revmode:") - 1; 5751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* "nibble" and "bitstring" used to be valid */ 5761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!strncmp(cp, "single", sizeof("single") - 1)) { 5771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_NO_NIBBLE2; 5781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "both", sizeof("both") - 1)) { 5791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options &= 5801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ~RES_NO_NIBBLE2; 5811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else { 5841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX - print a warning here? */ 5851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project skip: 5871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* skip to next run of spaces */ 5881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp && *cp != ' ' && *cp != '\t') 5891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 5901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* XXX - should really support CIDR which means explicit masks always. */ 5941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic u_int32_t 5951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectnet_mask(in) /* XXX - should really use system's version of this */ 5961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct in_addr in; 5971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 5981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project register u_int32_t i = ntohl(in.s_addr); 5991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (IN_CLASSA(i)) 6011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (htonl(IN_CLASSA_NET)); 6021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (IN_CLASSB(i)) 6031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (htonl(IN_CLASSB_NET)); 6041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (htonl(IN_CLASSC_NET)); 6051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 607b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra#ifdef ANDROID_CHANGES 608b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condrastatic int 609b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condrareal_randomid(u_int *random_value) { 610b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra /* open the nonblocking random device, returning -1 on failure */ 611b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra int random_device = open("/dev/urandom", O_RDONLY); 612b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra if (random_device < 0) { 613b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra return -1; 614b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra } 615b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra 616b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra /* read from the random device, returning -1 on failure (or too many retries)*/ 617b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra u_int retry = 5; 618b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra for (retry; retry > 0; retry--) { 619b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra int retval = read(random_device, random_value, sizeof(u_int)); 620b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra if (retval == sizeof(u_int)) { 621b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra *random_value &= 0xffff; 622b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra close(random_device); 623b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra return 0; 624b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra } else if ((retval < 0) && (errno != EINTR)) { 625b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra break; 626b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra } 627b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra } 628b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra 629b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra close(random_device); 630b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra return -1; 631b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra} 632b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra#endif /* ANDROID_CHANGES */ 633b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra 6341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int 6351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_randomid(void) { 636b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra#ifdef ANDROID_CHANGES 637b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra int status = 0; 638b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra u_int output = 0; 639b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra status = real_randomid(&output); 640b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra if (status != -1) { 641b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra return output; 642b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra } 643b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra#endif /* ANDROID_CHANGES */ 6441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct timeval now; 6451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project gettimeofday(&now, NULL); 6461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0xffff & (now.tv_sec ^ now.tv_usec ^ getpid())); 6471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This routine is for closing the socket if a virtual circuit is used and 6511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the program wants to close it. This provides support for endhostent() 6521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * which expects to close the socket. 6531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 6541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This routine is not expected to be user visible. 6551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 6571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_nclose(res_state statp) { 6581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int ns; 6591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_vcsock >= 0) { 6611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void) close(statp->_vcsock); 6621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_vcsock = -1; 6631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_flags &= ~(RES_F_VC | RES_F_CONN); 6641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (ns = 0; ns < statp->_u._ext.nscount; ns++) { 6661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.nssocks[ns] != -1) { 6671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void) close(statp->_u._ext.nssocks[ns]); 6681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.nssocks[ns] = -1; 6691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 6741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_ndestroy(res_state statp) { 6751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_nclose(statp); 6761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext != NULL) 6771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(statp->_u._ext.ext); 6781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options &= ~RES_INIT; 6791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.ext = NULL; 6801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_get_nibblesuffix(res_state statp) { 6841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 6851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (statp->_u._ext.ext->nsuffix); 6861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("ip6.arpa"); 6871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_get_nibblesuffix2(res_state statp) { 6911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 6921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (statp->_u._ext.ext->nsuffix2); 6931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("ip6.int"); 6941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 6971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_setservers(res_state statp, const union res_sockaddr_union *set, int cnt) { 6981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i, nserv; 6991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size_t size; 7001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* close open servers */ 7021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_nclose(statp); 7031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* cause rtt times to be forgotten */ 7051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.nscount = 0; 7061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv = 0; 7081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0; i < cnt && nserv < MAXNS; i++) { 7091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (set->sin.sin_family) { 7101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET: 7111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size = sizeof(set->sin); 7121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 7131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->_u._ext.ext->nsaddrs[nserv], 7141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &set->sin, size); 7151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (size <= sizeof(statp->nsaddr_list[nserv])) 7161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->nsaddr_list[nserv], 7171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &set->sin, size); 7181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef 7191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 7201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsaddr_list[nserv].sin_family = 0; 7211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 7221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 7231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAS_INET6_STRUCTS 7261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET6: 7271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size = sizeof(set->sin6); 7281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 7291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->_u._ext.ext->nsaddrs[nserv], 7301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &set->sin6, size); 7311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (size <= sizeof(statp->nsaddr_list[nserv])) 7321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->nsaddr_list[nserv], 7331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &set->sin6, size); 7341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 7351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsaddr_list[nserv].sin_family = 0; 7361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 7371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 7391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 7411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project set++; 7441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nscount = nserv; 7461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 7501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_getservers(res_state statp, union res_sockaddr_union *set, int cnt) { 7511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i; 7521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size_t size; 7531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t family; 7541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0; i < statp->nscount && i < cnt; i++) { 7561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 7571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project family = statp->_u._ext.ext->nsaddrs[i].sin.sin_family; 7581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 7591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project family = statp->nsaddr_list[i].sin_family; 7601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (family) { 7621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET: 7631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size = sizeof(set->sin); 7641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 7651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&set->sin, 7661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &statp->_u._ext.ext->nsaddrs[i], 7671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size); 7681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 7691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&set->sin, &statp->nsaddr_list[i], 7701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size); 7711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAS_INET6_STRUCTS 7741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET6: 7751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size = sizeof(set->sin6); 7761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 7771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&set->sin6, 7781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &statp->_u._ext.ext->nsaddrs[i], 7791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size); 7801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 7811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&set->sin6, &statp->nsaddr_list[i], 7821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size); 7831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 7851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 7871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project set->sin.sin_family = 0; 7881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project set++; 7911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (statp->nscount); 7931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES 796c63e59039d28c352e3053bb81319e960c392dbd4Mattias Falkvoid res_setiface(res_state statp, const char* iface) 7971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 798c63e59039d28c352e3053bb81319e960c392dbd4Mattias Falk if (statp != NULL) { 799c63e59039d28c352e3053bb81319e960c392dbd4Mattias Falk // set interface 800c63e59039d28c352e3053bb81319e960c392dbd4Mattias Falk if (iface && iface[0] != '\0') { 801c63e59039d28c352e3053bb81319e960c392dbd4Mattias Falk int len = sizeof(statp->iface); 802c63e59039d28c352e3053bb81319e960c392dbd4Mattias Falk strncpy(statp->iface, iface, len - 1); 803c63e59039d28c352e3053bb81319e960c392dbd4Mattias Falk statp->iface[len - 1] = '\0'; 804c63e59039d28c352e3053bb81319e960c392dbd4Mattias Falk } else { 805c63e59039d28c352e3053bb81319e960c392dbd4Mattias Falk statp->iface[0] = '\0'; 8061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 809c39214e0ac49b9f7de6fd9989331145c6e1cd584Chad Brubaker 810c39214e0ac49b9f7de6fd9989331145c6e1cd584Chad Brubakervoid res_setmark(res_state statp, int mark) 811c39214e0ac49b9f7de6fd9989331145c6e1cd584Chad Brubaker{ 812c39214e0ac49b9f7de6fd9989331145c6e1cd584Chad Brubaker if (statp != NULL) { 813c39214e0ac49b9f7de6fd9989331145c6e1cd584Chad Brubaker statp->_mark = mark; 814c39214e0ac49b9f7de6fd9989331145c6e1cd584Chad Brubaker } 815c39214e0ac49b9f7de6fd9989331145c6e1cd584Chad Brubaker} 8161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* ANDROID_CHANGES */ 817