11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* $NetBSD: res_data.c,v 1.8 2004/06/09 18:07:03 christos Exp $ */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1995-1999 by Internet Software Consortium. 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if defined(LIBC_SCCS) && !defined(lint) 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char rcsid[] = "Id: res_data.c,v 1.1.206.2 2004/03/16 12:34:18 marka Exp"; 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$NetBSD: res_data.c,v 1.8 2004/06/09 18:07:03 christos Exp $"); 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* LIBC_SCCS and not lint */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/param.h> 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/socket.h> 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/time.h> 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netinet/in.h> 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <arpa/inet.h> 38569fb9887d00104509df79fa77d92e3cf9afe7dbCalin Juravle#include <arpa/nameser.h> 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <ctype.h> 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netdb.h> 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "resolv_private.h" 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdio.h> 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdlib.h> 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h> 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <unistd.h> 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 497cc5666d94615d9249163dc7ac0f58c2614497ceJim Huang__LIBC_HIDDEN__ 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * const _res_opcodes[] = { 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "QUERY", 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "IQUERY", 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "CQUERYM", 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "CQUERYU", /* experimental */ 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "NOTIFY", /* experimental */ 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "UPDATE", 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "6", 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "7", 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "8", 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "9", 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "10", 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "11", 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "12", 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "13", 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "ZONEINIT", 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "ZONEREF", 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef BIND_UPDATE 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * const _res_sectioncodes[] = { 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "ZONE", 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "PREREQUISITES", 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "UPDATE", 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "ADDITIONAL", 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef __BIND_NOSTATIC 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern struct __res_state _nres; 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Proto. */ 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint res_ourserver_p(const res_state, const struct sockaddr *); 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define res_need_init() ((_nres.options & RES_INIT) == 0U) 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_init(void) { 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int rv; 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project extern int __res_vinit(res_state, int); 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef COMPAT__RES 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Compatibility with program that were accessing _res directly 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * to set options. We keep another struct res that is the same 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * size as the original res structure, and then copy fields to 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * it so that we achieve the same initialization 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project extern void *__res_get_old_state(void); 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project extern void __res_put_old_state(void *); 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_state ores = __res_get_old_state(); 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ores->options != 0) 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _nres.options = ores->options; 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ores->retrans != 0) 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _nres.retrans = ores->retrans; 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ores->retry != 0) 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _nres.retry = ores->retry; 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * These three fields used to be statically initialized. This made 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * it hard to use this code in a shared library. It is necessary, 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * now that we're doing dynamic initialization here, that we preserve 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the old semantics: if an application modifies one of these three 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * fields of _res before res_init() is called, res_init() will not 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * alter them. Of course, if an application is setting them to 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _zero_ before calling res_init(), hoping to override what used 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * to be the static default, we can't detect it and unexpected results 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * will follow. Zero for any of these fields would make no sense, 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * so one can safely assume that the applications were already getting 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * unexpected results. 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * _nres.options is tricky since some apps were known to diddle the bits 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * before res_init() was first called. We can't replicate that semantic 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * with dynamic initialization (they may have turned bits off that are 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * set in RES_DEFAULT). Our solution is to declare such applications 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "broken". They could fool us by setting RES_INIT but none do (yet). 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!_nres.retrans) 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _nres.retrans = RES_TIMEOUT; 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!_nres.retry) 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _nres.retry = 4; 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!(_nres.options & RES_INIT)) 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _nres.options = RES_DEFAULT; 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This one used to initialize implicitly to zero, so unless the app 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * has set it to something in particular, we can randomize it now. 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!_nres.id) 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _nres.id = res_randomid(); 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rv = __res_vinit(&_nres, 1); 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef COMPAT__RES 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project __res_put_old_state(&_nres); 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return rv; 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_query(const u_char *msg) { 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fp_query(msg, stdout); 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfp_query(const u_char *msg, FILE *file) { 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fp_nquery(msg, PACKETSZ, file); 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfp_nquery(const u_char *msg, int len, FILE *file) { 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (res_need_init() && res_init() == -1) 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_pquery(&_nres, msg, len, file); 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_mkquery(int op, /* opcode of query */ 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *dname, /* domain name */ 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int class, int type, /* class and type of query */ 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *data, /* resource record data */ 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int datalen, /* length of data */ 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *newrr_in, /* new rr for modify or append */ 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char *buf, /* buffer to put query */ 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int buflen) /* size of buffer */ 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (res_need_init() && res_init() == -1) { 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL); 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (res_nmkquery(&_nres, op, dname, class, type, 1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project data, datalen, 1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project newrr_in, buf, buflen)); 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef _LIBRESOLV 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_mkupdate(ns_updrec *rrecp_in, u_char *buf, int buflen) { 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (res_need_init() && res_init() == -1) { 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL); 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (res_nmkupdate(&_nres, rrecp_in, buf, buflen)); 1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_query(const char *name, /* domain name */ 2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int class, int type, /* class and type of query */ 2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char *answer, /* buffer to put answer */ 2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int anslen) /* size of answer buffer */ 2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (res_need_init() && res_init() == -1) { 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL); 2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (res_nquery(&_nres, name, class, type, answer, anslen)); 2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_send_setqhook(res_send_qhook hook) { 2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _nres.qhook = hook; 2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_send_setrhook(res_send_rhook hook) { 2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _nres.rhook = hook; 2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_isourserver(const struct sockaddr_in *inp) { 2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (res_ourserver_p(&_nres, (const struct sockaddr *)(const void *)inp)); 2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_send(const u_char *buf, int buflen, u_char *ans, int anssiz) { 2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (res_need_init() && res_init() == -1) { 2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* errno should have been set by res_init() in this case. */ 2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (res_nsend(&_nres, buf, buflen, ans, anssiz)); 2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef _LIBRESOLV 2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_sendsigned(const u_char *buf, int buflen, ns_tsig_key *key, 2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char *ans, int anssiz) 2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (res_need_init() && res_init() == -1) { 2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* errno should have been set by res_init() in this case. */ 2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (res_nsendsigned(&_nres, buf, buflen, key, ans, anssiz)); 2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_close(void) { 2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_nclose(&_nres); 2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef _LIBRESOLV 2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_update(ns_updrec *rrecp_in) { 2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (res_need_init() && res_init() == -1) { 2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL); 2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (res_nupdate(&_nres, rrecp_in, NULL)); 2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_search(const char *name, /* domain name */ 2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int class, int type, /* class and type of query */ 2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char *answer, /* buffer to put answer */ 2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int anslen) /* size of answer */ 2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (res_need_init() && res_init() == -1) { 2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL); 2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (res_nsearch(&_nres, name, class, type, answer, anslen)); 2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_querydomain(const char *name, 2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *domain, 2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int class, int type, /* class and type of query */ 2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char *answer, /* buffer to put answer */ 2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int anslen) /* size of answer */ 2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 2891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (res_need_init() && res_init() == -1) { 2901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL); 2911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (res_nquerydomain(&_nres, name, domain, 2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project class, type, 2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project answer, anslen)); 2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_opt(int a, u_char *b, int c, int d) 3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 3021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return res_nopt(&_nres, a, b, c, d); 3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecthostalias(const char *name) { 3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return NULL; 3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ultrix 3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlocal_hostname_length(const char *hostname) { 3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int len_host, len_domain; 3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!*_nres.defdname) 3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project res_init(); 3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len_host = strlen(hostname); 3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len_domain = strlen(_nres.defdname); 3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (len_host > len_domain && 3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !strcasecmp(hostname + len_host - len_domain, _nres.defdname) && 3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hostname[len_host - len_domain - 1] == '.') 3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (len_host - len_domain - 1); 3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /*ultrix*/ 3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 328