res_init.c revision b23f193dcc0fa74b5be1978f85cc1c6811493c86
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#define MAX_DNS_PROPERTIES 8 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DNS_PROP_NAME_PREFIX "net.dns" 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DNS_CHANGE_PROP_NAME "net.dnschange" 117aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang#define DNS_SEARCH_PROP_NAME "net.dns.search" 1187cc5666d94615d9249163dc7ac0f58c2614497ceJim Huangstatic const prop_info *dns_change_prop; 1197cc5666d94615d9249163dc7ac0f58c2614497ceJim Huangstatic int dns_last_change_counter; 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int _get_dns_change_count(); 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <resolv.h> 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "res_private.h" 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Options. Should all be left alone. */ 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef DEBUG 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DEBUG 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void res_setoptions __P((res_state, const char *, const char *)); 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char sort_mask[] = "/&"; 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define ISSORTMASK(ch) (strchr(sort_mask, ch) != NULL) 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic u_int32_t net_mask __P((struct in_addr)); 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if !defined(isascii) /* XXX - could be a function */ 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# define isascii(c) (!(c & 0200)) 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Resolver state default settings. 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Set up default settings. If the configuration file exist, the values 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * there will have precedence. Otherwise, the server address is set to 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INADDR_ANY and the default domain name comes from the gethostname(). 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * An interrim version of this code (BIND 4.9, pre-4.4BSD) used 127.0.0.1 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * rather than INADDR_ANY ("0.0.0.0") as the default name server address 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * since it was noted that INADDR_ANY actually meant ``the first interface 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * you "ifconfig"'d at boot time'' and if this was a SLIP or PPP interface, 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * it had to be "up" in order for you to reach your own name server. It 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * was later decided that since the recommended practice is to always 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * install local static routes through 127.0.0.1 for all your network 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * interfaces, that we could solve this problem without a code change. 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The configuration file should always be used, since it is the only way 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * to specify a default domain. If you are running a server on your local 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * machine, you should say "nameserver 0.0.0.0" or "nameserver 127.0.0.1" 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * in the configuration file. 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return 0 if completes successfully, -1 on error 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_ninit(res_state statp) { 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project extern int __res_vinit(res_state, int); 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (__res_vinit(statp, 0)); 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 174aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang#ifdef ANDROID_CHANGES 1757cc5666d94615d9249163dc7ac0f58c2614497ceJim Huangstatic int load_domain_search_list(res_state statp) { 176aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang char propvalue[PROP_VALUE_MAX]; 177aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang register char *cp, **pp; 178aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang 179aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang if(__system_property_get(DNS_SEARCH_PROP_NAME, propvalue) >= 1) { 180aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang strlcpy(statp->defdname, propvalue, sizeof(statp->defdname)); 181aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang if ((cp = strchr(statp->defdname, '\n')) != NULL) 182aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang *cp = '\0'; 183aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang cp = statp->defdname; 184aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang pp = statp->dnsrch; 185aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang while ( pp < statp->dnsrch + MAXDNSRCH ) { 186aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang while (*cp == ' ' || *cp == '\t') /* skip leading white space */ 187aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang cp++; 188aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang if (*cp == '\0') /* stop if nothing more */ 189aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang break; 190aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang *pp++ = cp; /* record this search domain */ 191aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang while (*cp) { /* zero-terminate it */ 192aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang if (*cp == ' ' || *cp == '\t') { 193aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang *cp++ = '\0'; 194aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang break; 195aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang } 196aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang cp++; 197aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang } 198aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang } 199aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang *pp = NULL; /* statp->dnsrch has MAXDNSRCH+1 items */ 200aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang if (pp > statp->dnsrch) 201aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang return 1; 202aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang } 203d378c68d74cb4fdac450650fe816c9d649c8edafDavid 'Digit' Turner statp->defdname[0] = '\0'; /* no default domain name on Android */ 204d378c68d74cb4fdac450650fe816c9d649c8edafDavid 'Digit' Turner statp->dnsrch[0] = NULL; 205aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang return 0; 206aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang} 207aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang#endif 208aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang 2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* This function has to be reachable by res_data.c but not publicly. */ 2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__res_vinit(res_state statp, int preinit) { 2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project register FILE *fp; 2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project register char *cp, **pp; 2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project register int n; 2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char buf[BUFSIZ]; 2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int nserv = 0; /* number of nameserver records read from file */ 2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int haveenv = 0; 2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int havesearch = 0; 2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int nsort = 0; 2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *net; 2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int dots; 2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project union res_sockaddr_union u[2]; 2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES 2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pid_t mypid = getpid(); 2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int use_proc_props = 0; 2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int found_prop; 2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char dnsProperty[PROP_VALUE_MAX]; 2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2304661fda2e5339c39ceb3aefd184eb8be3d0ca835David 'Digit' Turner if ((statp->options & RES_INIT) != 0U) 2314661fda2e5339c39ceb3aefd184eb8be3d0ca835David 'Digit' Turner res_ndestroy(statp); 2324661fda2e5339c39ceb3aefd184eb8be3d0ca835David 'Digit' Turner 2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!preinit) { 2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retrans = RES_TIMEOUT; 2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retry = RES_DFLRETRY; 2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options = RES_DEFAULT; 2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->id = res_randomid(); 2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memset(u, 0, sizeof(u)); 2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef USELOOPBACK 2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1); 2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin.sin_addr.s_addr = INADDR_ANY; 2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin.sin_family = AF_INET; 2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin.sin_port = htons(NAMESERVER_PORT); 2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAVE_SA_LEN 2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin.sin_len = sizeof(struct sockaddr_in); 2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAS_INET6_STRUCTS 2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef USELOOPBACK 2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin6.sin6_addr = in6addr_loopback; 2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin6.sin6_addr = in6addr_any; 2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin6.sin6_family = AF_INET6; 2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin6.sin6_port = htons(NAMESERVER_PORT); 2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAVE_SA_LEN 2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u[nserv].sin6.sin6_len = sizeof(struct sockaddr_in6); 2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nscount = 0; 2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->ndots = 1; 2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->pfcode = 0; 2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_vcsock = -1; 2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_flags = 0; 2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->qhook = NULL; 2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->rhook = NULL; 2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.nscount = 0; 2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.ext = malloc(sizeof(*statp->_u._ext.ext)); 2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext != NULL) { 2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memset(statp->_u._ext.ext, 0, sizeof(*statp->_u._ext.ext)); 2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.ext->nsaddrs[0].sin = statp->nsaddr; 2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(statp->_u._ext.ext->nsuffix, "ip6.arpa"); 2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(statp->_u._ext.ext->nsuffix2, "ip6.int"); 2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsort = 0; 2811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_setservers(statp, u, nserv); 2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if 0 /* IGNORE THE ENVIRONMENT */ 2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Allow user to override the local domain definition */ 2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((cp = getenv("LOCALDOMAIN")) != NULL) { 2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void)strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1); 2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->defdname[sizeof(statp->defdname) - 1] = '\0'; 2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project haveenv++; 2891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 2911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Set search list to be blank-separated strings 2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * from rest of env value. Permits users of LOCALDOMAIN 2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * to still have a search list, and anyone to set the 2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * one that they want to use as an individual (even more 2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * important now that the rfc1535 stuff restricts searches) 2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = statp->defdname; 2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pp = statp->dnsrch; 2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = cp; 3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (n = 0; *cp && pp < statp->dnsrch + MAXDNSRCH; cp++) { 3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '\n') /* silly backwards compat */ 3021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (*cp == ' ' || *cp == '\t') { 3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = 0; 3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = 1; 3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (n) { 3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = cp; 3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = 0; 3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project havesearch = 1; 3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* null terminate last domain if there are excess */ 3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp != '\0' && *cp != ' ' && *cp != '\t' && *cp != '\n') 3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = '\0'; 3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = 0; 3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (nserv > 0) 3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nscount = nserv; 3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES /* READ FROM SYSTEM PROPERTIES */ 3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dns_last_change_counter = _get_dns_change_count(); 3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv = 0; 3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for(n = 1; n <= MAX_DNS_PROPERTIES && nserv < MAXNS; n++) { 3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char propname[PROP_NAME_MAX]; 3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char propvalue[PROP_VALUE_MAX]; 3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct addrinfo hints, *ai; 3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char sbuf[NI_MAXSERV]; 3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const size_t minsiz = sizeof(statp->_u._ext.ext->nsaddrs[0]); 3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Check first for process-specific properties, and if those don't 3351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * exist, try the generic properties. 3361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 3371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project found_prop = 0; 3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n == 1 || use_proc_props) { 3391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project snprintf(propname, sizeof(propname), "%s%d.%d", DNS_PROP_NAME_PREFIX, n, mypid); 3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(__system_property_get(propname, propvalue) < 1) { 3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (use_proc_props) { 3421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 3431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project found_prop = 1; 3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project use_proc_props = 1; 3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!found_prop) { 3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project snprintf(propname, sizeof(propname), "%s%d", DNS_PROP_NAME_PREFIX, n); 3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(__system_property_get(propname, propvalue) < 1) { 3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = propvalue; 3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp[strcspn(cp, ";# \t\n")] = '\0'; 3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((*cp != '\0') && (*cp != '\n')) { 3621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memset(&hints, 0, sizeof(hints)); 3631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hints.ai_family = PF_UNSPEC; 3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hints.ai_socktype = SOCK_DGRAM; /*dummy*/ 3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hints.ai_flags = AI_NUMERICHOST; 3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(sbuf, "%u", NAMESERVER_PORT); 3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (getaddrinfo(cp, sbuf, &hints, &ai) == 0 && 3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (size_t)ai->ai_addrlen <= minsiz) { 3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext != NULL) { 3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->_u._ext.ext->nsaddrs[nserv], 3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ai->ai_addr, ai->ai_addrlen); 3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((size_t)ai->ai_addrlen <= 3741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof(statp->nsaddr_list[nserv])) { 3751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->nsaddr_list[nserv], 3761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ai->ai_addr, ai->ai_addrlen); 3771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsaddr_list[nserv].sin_family = 0; 3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project freeaddrinfo(ai); 3811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 3821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 385aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang 386aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang /* Add the domain search list */ 387aeae1f5b6c6cf22c2854e07f11555591c5430607Chung-yih Wang havesearch = load_domain_search_list(statp); 388d378c68d74cb4fdac450650fe816c9d649c8edafDavid 'Digit' Turner#else /* !ANDROID_CHANGES - IGNORE resolv.conf in Android */ 3891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define MATCH(line, name) \ 3901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (!strncmp(line, name, sizeof(name) - 1) && \ 3911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (line[sizeof(name) - 1] == ' ' || \ 3921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project line[sizeof(name) - 1] == '\t')) 3931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv = 0; 3951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) { 3961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* read the config file */ 3971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (fgets(buf, sizeof(buf), fp) != NULL) { 3981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* skip comments */ 3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*buf == ';' || *buf == '#') 4001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 4011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* read default domain name */ 4021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (MATCH(buf, "domain")) { 4031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (haveenv) /* skip if have from environ */ 4041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 4051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = buf + sizeof("domain") - 1; 4061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 4071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((*cp == '\0') || (*cp == '\n')) 4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 4101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1); 4111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->defdname[sizeof(statp->defdname) - 1] = '\0'; 4121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((cp = strpbrk(statp->defdname, " \t\n")) != NULL) 4131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = '\0'; 4141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project havesearch = 0; 4151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 4161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* set search list */ 4181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (MATCH(buf, "search")) { 4191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (haveenv) /* skip if have from environ */ 4201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 4211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = buf + sizeof("search") - 1; 4221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 4231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 4241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((*cp == '\0') || (*cp == '\n')) 4251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1); 4271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->defdname[sizeof(statp->defdname) - 1] = '\0'; 4281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((cp = strchr(statp->defdname, '\n')) != NULL) 4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = '\0'; 4301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 4311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Set search list to be blank-separated strings 4321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * on rest of line. 4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = statp->defdname; 4351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pp = statp->dnsrch; 4361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = cp; 4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (n = 0; *cp && pp < statp->dnsrch + MAXDNSRCH; cp++) { 4381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == ' ' || *cp == '\t') { 4391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = 0; 4401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = 1; 4411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (n) { 4421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = cp; 4431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = 0; 4441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* null terminate last domain if there are excess */ 4471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp != '\0' && *cp != ' ' && *cp != '\t') 4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 4491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = '\0'; 4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = 0; 4511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project havesearch = 1; 4521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 4531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* read nameservers to query */ 4551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (MATCH(buf, "nameserver") && nserv < MAXNS) { 4561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct addrinfo hints, *ai; 4571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char sbuf[NI_MAXSERV]; 4581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const size_t minsiz = 4591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof(statp->_u._ext.ext->nsaddrs[0]); 4601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = buf + sizeof("nameserver") - 1; 4621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 4631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 4641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp[strcspn(cp, ";# \t\n")] = '\0'; 4651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((*cp != '\0') && (*cp != '\n')) { 4661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memset(&hints, 0, sizeof(hints)); 4671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hints.ai_family = PF_UNSPEC; 4681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hints.ai_socktype = SOCK_DGRAM; /*dummy*/ 4691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hints.ai_flags = AI_NUMERICHOST; 4701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(sbuf, "%u", NAMESERVER_PORT); 4711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (getaddrinfo(cp, sbuf, &hints, &ai) == 0 && 4721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ai->ai_addrlen <= minsiz) { 4731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext != NULL) { 4741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->_u._ext.ext->nsaddrs[nserv], 4751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ai->ai_addr, ai->ai_addrlen); 4761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ai->ai_addrlen <= 4781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof(statp->nsaddr_list[nserv])) { 4791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->nsaddr_list[nserv], 4801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ai->ai_addr, ai->ai_addrlen); 4811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 4821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsaddr_list[nserv].sin_family = 0; 4831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project freeaddrinfo(ai); 4841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 4851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 4881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 4891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (MATCH(buf, "sortlist")) { 4901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct in_addr a; 4911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = buf + sizeof("sortlist") - 1; 4931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (nsort < MAXRESOLVSORT) { 4941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 4951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 4961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '\0' || *cp == '\n' || *cp == ';') 4971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 4981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project net = cp; 4991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp && !ISSORTMASK(*cp) && *cp != ';' && 5001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project isascii(*cp) && !isspace((unsigned char)*cp)) 5011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 5021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = *cp; 5031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = 0; 5041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (inet_aton(net, &a)) { 5051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->sort_list[nsort].addr = a; 5061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ISSORTMASK(n)) { 5071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp++ = n; 5081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project net = cp; 5091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp && *cp != ';' && 5101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project isascii(*cp) && 5111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !isspace((unsigned char)*cp)) 5121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 5131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = *cp; 5141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = 0; 5151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (inet_aton(net, &a)) { 5161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->sort_list[nsort].mask = a.s_addr; 5171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 5181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->sort_list[nsort].mask = 5191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project net_mask(statp->sort_list[nsort].addr); 5201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 5221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->sort_list[nsort].mask = 5231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project net_mask(statp->sort_list[nsort].addr); 5241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nsort++; 5261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *cp = n; 5281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 5301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (MATCH(buf, "options")) { 5321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_setoptions(statp, buf + sizeof("options") - 1, "conf"); 5331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 5341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (nserv > 0) 5371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nscount = nserv; 5381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsort = nsort; 5391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void) fclose(fp); 5401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 541d378c68d74cb4fdac450650fe816c9d649c8edafDavid 'Digit' Turner#endif /* !ANDROID_CHANGES */ 5421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 5431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Last chance to get a nameserver. This should not normally 5441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * be necessary 5451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 5461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef NO_RESOLV_CONF 5471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(nserv == 0) 5481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv = get_nameservers(statp); 5491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 5501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->defdname[0] == 0 && 5521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project gethostname(buf, sizeof(statp->defdname) - 1) == 0 && 5531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (cp = strchr(buf, '.')) != NULL) 5541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(statp->defdname, cp + 1); 5551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* find components of local domain that might be searched */ 5571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (havesearch == 0) { 5581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project pp = statp->dnsrch; 5591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = statp->defdname; 5601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp = NULL; 5611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dots = 0; 5631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (cp = statp->defdname; *cp; cp++) 5641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dots += (*cp == '.'); 5651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = statp->defdname; 5671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (pp < statp->dnsrch + MAXDFLSRCH) { 5681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (dots < LOCALDOMAINPARTS) 5691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 5701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = strchr(cp, '.') + 1; /* we know there is one */ 5711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp++ = cp; 5721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dots--; 5731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *pp = NULL; 5751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 5761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & RES_DEBUG) { 5771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";; res_init()... default dnsrch list:\n"); 5781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (pp = statp->dnsrch; *pp; pp++) 5791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\t%s\n", *pp); 5801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\t..END..\n"); 5811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 5831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((cp = getenv("RES_OPTIONS")) != NULL) 5861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_setoptions(statp, cp, "env"); 5871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (nserv > 0) { 5881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nscount = nserv; 5891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_INIT; 5901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 5921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void 5951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_setoptions(res_state statp, const char *options, const char *source) 5961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 5971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp = options; 5981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i; 5991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct __res_state_ext *ext = statp->_u._ext.ext; 6001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 6021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & RES_DEBUG) 6031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";; res_setoptions(\"%s\", \"%s\")...\n", 6041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project options, source); 6051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp) { 6071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* skip leading and inner runs of spaces */ 6081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp == ' ' || *cp == '\t') 6091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 6101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* search for and process individual options */ 6111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!strncmp(cp, "ndots:", sizeof("ndots:") - 1)) { 6121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project i = atoi(cp + sizeof("ndots:") - 1); 6131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (i <= RES_MAXNDOTS) 6141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->ndots = i; 6151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 6161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->ndots = RES_MAXNDOTS; 6171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 6181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & RES_DEBUG) 6191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\tndots=%d\n", statp->ndots); 6201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "timeout:", sizeof("timeout:") - 1)) { 6221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project i = atoi(cp + sizeof("timeout:") - 1); 6231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (i <= RES_MAXRETRANS) 6241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retrans = i; 6251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 6261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retrans = RES_MAXRETRANS; 6271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 6281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & RES_DEBUG) 6291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\ttimeout=%d\n", statp->retrans); 6301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "attempts:", sizeof("attempts:") - 1)){ 6321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project i = atoi(cp + sizeof("attempts:") - 1); 6331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (i <= RES_MAXRETRY) 6341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retry = i; 6351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 6361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->retry = RES_MAXRETRY; 6371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 6381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & RES_DEBUG) 6391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\tattempts=%d\n", statp->retry); 6401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "debug", sizeof("debug") - 1)) { 6421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef DEBUG 6431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!(statp->options & RES_DEBUG)) { 6441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";; res_setoptions(\"%s\", \"%s\")..\n", 6451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project options, source); 6461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_DEBUG; 6471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project printf(";;\tdebug\n"); 6491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "no_tld_query", 6511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof("no_tld_query") - 1) || 6521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !strncmp(cp, "no-tld-query", 6531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof("no-tld-query") - 1)) { 6541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_NOTLDQUERY; 6551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) { 6561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_USE_INET6; 6571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "rotate", sizeof("rotate") - 1)) { 6581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_ROTATE; 6591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "no-check-names", 6601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeof("no-check-names") - 1)) { 6611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_NOCHECKNAME; 6621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_EDNS0 6641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) { 6651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_USE_EDNS0; 6661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (!strncmp(cp, "dname", sizeof("dname") - 1)) { 6691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_USE_DNAME; 6701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (!strncmp(cp, "nibble:", sizeof("nibble:") - 1)) { 6721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ext == NULL) 6731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto skip; 6741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp += sizeof("nibble:") - 1; 6751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project i = MIN(strcspn(cp, " \t"), sizeof(ext->nsuffix) - 1); 6761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(ext->nsuffix, cp, (size_t)i); 6771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ext->nsuffix[i] = '\0'; 6781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (!strncmp(cp, "nibble2:", sizeof("nibble2:") - 1)) { 6801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ext == NULL) 6811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto skip; 6821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp += sizeof("nibble2:") - 1; 6831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project i = MIN(strcspn(cp, " \t"), sizeof(ext->nsuffix2) - 1); 6841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(ext->nsuffix2, cp, (size_t)i); 6851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ext->nsuffix2[i] = '\0'; 6861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (!strncmp(cp, "v6revmode:", sizeof("v6revmode:") - 1)) { 6881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp += sizeof("v6revmode:") - 1; 6891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* "nibble" and "bitstring" used to be valid */ 6901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!strncmp(cp, "single", sizeof("single") - 1)) { 6911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options |= RES_NO_NIBBLE2; 6921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if (!strncmp(cp, "both", sizeof("both") - 1)) { 6931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options &= 6941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ~RES_NO_NIBBLE2; 6951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else { 6981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX - print a warning here? */ 6991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project skip: 7011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* skip to next run of spaces */ 7021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (*cp && *cp != ' ' && *cp != '\t') 7031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 7041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* XXX - should really support CIDR which means explicit masks always. */ 7081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic u_int32_t 7091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectnet_mask(in) /* XXX - should really use system's version of this */ 7101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct in_addr in; 7111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 7121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project register u_int32_t i = ntohl(in.s_addr); 7131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (IN_CLASSA(i)) 7151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (htonl(IN_CLASSA_NET)); 7161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (IN_CLASSB(i)) 7171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (htonl(IN_CLASSB_NET)); 7181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (htonl(IN_CLASSC_NET)); 7191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 721b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra#ifdef ANDROID_CHANGES 722b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condrastatic int 723b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condrareal_randomid(u_int *random_value) { 724b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra /* open the nonblocking random device, returning -1 on failure */ 725b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra int random_device = open("/dev/urandom", O_RDONLY); 726b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra if (random_device < 0) { 727b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra return -1; 728b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra } 729b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra 730b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra /* read from the random device, returning -1 on failure (or too many retries)*/ 731b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra u_int retry = 5; 732b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra for (retry; retry > 0; retry--) { 733b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra int retval = read(random_device, random_value, sizeof(u_int)); 734b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra if (retval == sizeof(u_int)) { 735b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra *random_value &= 0xffff; 736b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra close(random_device); 737b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra return 0; 738b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra } else if ((retval < 0) && (errno != EINTR)) { 739b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra break; 740b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra } 741b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra } 742b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra 743b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra close(random_device); 744b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra return -1; 745b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra} 746b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra#endif /* ANDROID_CHANGES */ 747b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra 7481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int 7491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_randomid(void) { 750b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra#ifdef ANDROID_CHANGES 751b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra int status = 0; 752b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra u_int output = 0; 753b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra status = real_randomid(&output); 754b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra if (status != -1) { 755b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra return output; 756b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra } 757b23f193dcc0fa74b5be1978f85cc1c6811493c86Geremy Condra#endif /* ANDROID_CHANGES */ 7581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct timeval now; 7591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project gettimeofday(&now, NULL); 7601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0xffff & (now.tv_sec ^ now.tv_usec ^ getpid())); 7611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 7641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This routine is for closing the socket if a virtual circuit is used and 7651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the program wants to close it. This provides support for endhostent() 7661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * which expects to close the socket. 7671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 7681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This routine is not expected to be user visible. 7691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 7701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 7711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_nclose(res_state statp) { 7721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int ns; 7731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_vcsock >= 0) { 7751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void) close(statp->_vcsock); 7761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_vcsock = -1; 7771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_flags &= ~(RES_F_VC | RES_F_CONN); 7781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (ns = 0; ns < statp->_u._ext.nscount; ns++) { 7801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.nssocks[ns] != -1) { 7811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void) close(statp->_u._ext.nssocks[ns]); 7821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.nssocks[ns] = -1; 7831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 7881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_ndestroy(res_state statp) { 7891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_nclose(statp); 7901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext != NULL) 7911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(statp->_u._ext.ext); 7921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->options &= ~RES_INIT; 7931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.ext = NULL; 7941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 7971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_get_nibblesuffix(res_state statp) { 7981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 7991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (statp->_u._ext.ext->nsuffix); 8001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("ip6.arpa"); 8011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 8021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 8041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_get_nibblesuffix2(res_state statp) { 8051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 8061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (statp->_u._ext.ext->nsuffix2); 8071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("ip6.int"); 8081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 8091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 8111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_setservers(res_state statp, const union res_sockaddr_union *set, int cnt) { 8121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i, nserv; 8131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size_t size; 8141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* close open servers */ 8161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_nclose(statp); 8171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* cause rtt times to be forgotten */ 8191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->_u._ext.nscount = 0; 8201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv = 0; 8221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0; i < cnt && nserv < MAXNS; i++) { 8231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (set->sin.sin_family) { 8241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET: 8251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size = sizeof(set->sin); 8261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 8271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->_u._ext.ext->nsaddrs[nserv], 8281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &set->sin, size); 8291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (size <= sizeof(statp->nsaddr_list[nserv])) 8301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->nsaddr_list[nserv], 8311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &set->sin, size); 8321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef 8331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 8341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsaddr_list[nserv].sin_family = 0; 8351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 8361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 8371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAS_INET6_STRUCTS 8401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET6: 8411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size = sizeof(set->sin6); 8421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 8431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->_u._ext.ext->nsaddrs[nserv], 8441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &set->sin6, size); 8451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (size <= sizeof(statp->nsaddr_list[nserv])) 8461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&statp->nsaddr_list[nserv], 8471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &set->sin6, size); 8481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 8491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nsaddr_list[nserv].sin_family = 0; 8501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nserv++; 8511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 8531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 8551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project set++; 8581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project statp->nscount = nserv; 8601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 8621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 8641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_getservers(res_state statp, union res_sockaddr_union *set, int cnt) { 8651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i; 8661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size_t size; 8671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int16_t family; 8681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0; i < statp->nscount && i < cnt; i++) { 8701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 8711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project family = statp->_u._ext.ext->nsaddrs[i].sin.sin_family; 8721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 8731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project family = statp->nsaddr_list[i].sin_family; 8741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (family) { 8761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET: 8771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size = sizeof(set->sin); 8781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 8791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&set->sin, 8801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &statp->_u._ext.ext->nsaddrs[i], 8811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size); 8821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 8831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&set->sin, &statp->nsaddr_list[i], 8841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size); 8851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAS_INET6_STRUCTS 8881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET6: 8891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size = sizeof(set->sin6); 8901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->_u._ext.ext) 8911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&set->sin6, 8921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project &statp->_u._ext.ext->nsaddrs[i], 8931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size); 8941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 8951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy(&set->sin6, &statp->nsaddr_list[i], 8961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size); 8971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 8991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 9011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project set->sin.sin_family = 0; 9021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 9031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project set++; 9051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (statp->nscount); 9071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 9081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES 9101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int _get_dns_change_count() 9111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 9121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (dns_change_prop == NULL) { 9131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dns_change_prop = __system_property_find(DNS_CHANGE_PROP_NAME); 9141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (dns_change_prop != NULL) { 9161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char propvalue[PROP_VALUE_MAX]; 9171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (__system_property_read(dns_change_prop, NULL, propvalue) >= 1) { 9181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return atoi(propvalue); 9191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -1; 9221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 9231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint res_get_dns_changed() 9251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 9261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int change_count; 9271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project change_count = _get_dns_change_count(); 9291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (change_count != dns_last_change_counter) { 9301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (change_count != -1) { 9311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dns_last_change_counter = change_count; 9321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return 1; 9341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 9351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return 0; 9361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 9381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* ANDROID_CHANGES */ 939