11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* $NetBSD: res_debug.c,v 1.7 2004/11/07 02:25:01 christos Exp $ */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1985 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 * Portions Copyright (c) 1995 by International Business Machines, Inc. 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * International Business Machines, Inc. (hereinafter called IBM) grants 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * permission under its copyrights to use, copy, modify, and distribute this 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Software with or without fee, provided that the above copyright notice and 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * all paragraphs of this notice appear in all copies, and that the name of IBM 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * not be used in connection with the marketing of any product incorporating 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the Software or modifications thereof, without specific, written prior 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * permission. 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * To the extent it has a right to do so, IBM grants an immunity from suit 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * under its patents, if any, for the use, sale or manufacture of products to 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the extent that such products are used for performing Domain Name System 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * dynamic updates in TCP/IP networks by means of the Software. No immunity is 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * granted for any product per se or for any other function of any product. 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Portions Copyright (c) 1996-1999 by Internet Software Consortium. 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies. 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if defined(LIBC_SCCS) && !defined(lint) 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93"; 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char rcsid[] = "Id: res_debug.c,v 1.3.2.5.4.5 2004/07/28 20:16:46 marka Exp"; 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$NetBSD: res_debug.c,v 1.7 2004/11/07 02:25:01 christos Exp $"); 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* LIBC_SCCS and not lint */ 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h> 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/param.h> 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/socket.h> 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netinet/in.h> 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <arpa/inet.h> 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "arpa_nameser.h" 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <ctype.h> 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h> 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <math.h> 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netdb.h> 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "resolv_private.h" 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdio.h> 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stdlib.h> 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h> 1262cc2b2be692f1d559a09d2066e56e450249cc9c0Carl Shapiro#include <strings.h> 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <time.h> 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef SPRINTF_CHAR 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# define SPRINTF(x) strlen(sprintf/**/x) 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# define SPRINTF(x) sprintf x 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char *precsize_ntoa(u_int32_t); 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern const char * const _res_opcodes[]; 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern const char * const _res_sectioncodes[]; 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _LIBC 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print the current options. 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfp_resstat(const res_state statp, FILE *file) { 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_long mask; 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; res options:"); 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (mask = 1; mask != 0U; mask <<= 1) 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & mask) 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " %s", p_option(mask)); 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n', file); 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdo_section(const res_state statp, 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_msg *handle, ns_sect section, 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int pflag, FILE *file) 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int n, sflag, rrnum; 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int buflen = 2048; 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *buf; 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_opcode opcode; 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_rr rr; 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print answer records. 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sflag = (statp->pfcode & pflag); 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->pfcode && !sflag) 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf = malloc((size_t)buflen); 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buf == NULL) { 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; memory allocation failure\n"); 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project opcode = (ns_opcode) ns_msg_getflag(*handle, ns_f_opcode); 1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rrnum = 0; 1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (;;) { 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_parserr(handle, section, rrnum, &rr)) { 1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno != ENODEV) 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; ns_parserr: %s\n", 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strerror(errno)); 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (rrnum > 0 && sflag != 0 && 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (statp->pfcode & RES_PRF_HEAD1)) 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n', file); 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto cleanup; 1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (rrnum == 0 && sflag != 0 && (statp->pfcode & RES_PRF_HEAD1)) 1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; %s SECTION:\n", 1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(section, opcode)); 1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (section == ns_s_qd) 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";;\t%s, type = %s, class = %s\n", 1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_rr_name(rr), 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_type(ns_rr_type(rr)), 2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_class(ns_rr_class(rr))); 2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (section == ns_s_ar && ns_rr_type(rr) == ns_t_opt) { 2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t ttl = ns_rr_ttl(rr); 2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, 2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "; EDNS: version: %u, udp=%u, flags=%04x\n", 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (ttl>>16)&0xff, ns_rr_class(rr), ttl&0xffff); 2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = ns_sprintrr(handle, &rr, NULL, NULL, 2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf, (u_int)buflen); 2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n < 0) { 2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno == ENOSPC) { 2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(buf); 2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf = NULL; 2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buflen < 131072) 2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf = malloc((size_t)(buflen += 1024)); 2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buf == NULL) { 2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, 2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ";; memory allocation failure\n"); 2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; ns_sprintrr: %s\n", 2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strerror(errno)); 2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto cleanup; 2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputs(buf, file); 2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputc('\n', file); 2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rrnum++; 2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cleanup: 2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buf != NULL) 2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(buf); 2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print the contents of a query. 2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This is intended to be primarily a debugging routine. 2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_pquery(const res_state statp, const u_char *msg, int len, FILE *file) { 2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_msg handle; 2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int qdcount, ancount, nscount, arcount; 2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int opcode, rcode, id; 2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_initparse(msg, len, &handle) < 0) { 2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; ns_initparse: %s\n", strerror(errno)); 2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project opcode = ns_msg_getflag(handle, ns_f_opcode); 2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rcode = ns_msg_getflag(handle, ns_f_rcode); 2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project id = ns_msg_id(handle); 2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project qdcount = ns_msg_count(handle, ns_s_qd); 2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ancount = ns_msg_count(handle, ns_s_an); 2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nscount = ns_msg_count(handle, ns_s_ns); 2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project arcount = ns_msg_count(handle, ns_s_ar); 2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print header fields. 2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEADX) || rcode) 2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, 2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ";; ->>HEADER<<- opcode: %s, status: %s, id: %d\n", 2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _res_opcodes[opcode], p_rcode((int)rcode), id); 2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEADX)) 2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc(';', file); 2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEAD2)) { 2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, "; flags:"); 2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_qr)) 2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " qr"); 2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_aa)) 2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " aa"); 2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_tc)) 2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " tc"); 2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_rd)) 2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " rd"); 2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_ra)) 2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " ra"); 2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_z)) 2811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " ??"); 2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_ad)) 2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " ad"); 2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_cd)) 2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " cd"); 2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEAD1)) { 2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, "; %s: %d", 2891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_qd, (int)opcode), qdcount); 2901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ", %s: %d", 2911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_an, (int)opcode), ancount); 2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ", %s: %d", 2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_ns, (int)opcode), nscount); 2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ", %s: %d", 2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_ar, (int)opcode), arcount); 2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & 2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1))) { 2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n',file); 3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 3021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print the various sections. 3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_qd, RES_PRF_QUES, file); 3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_an, RES_PRF_ANS, file); 3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_ns, RES_PRF_AUTH, file); 3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_ar, RES_PRF_ADD, file); 3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (qdcount == 0 && ancount == 0 && 3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nscount == 0 && arcount == 0) 3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n', file); 3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_cdnname(const u_char *cp, const u_char *msg, int len, FILE *file) { 3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char name[MAXDNAME]; 3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int n; 3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((n = dn_expand(msg, msg + len, cp, name, sizeof name)) < 0) 3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (name[0] == '\0') 3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('.', file); 3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputs(name, file); 3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (cp + n); 3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_cdname(const u_char *cp, const u_char *msg, FILE *file) { 3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (p_cdnname(cp, msg, PACKETSZ, file)); 3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Return a fully-qualified domain name from a compressed name (with 3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project length supplied). */ 3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_fqnname(cp, msg, msglen, name, namelen) 3371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *cp, *msg; 3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int msglen; 3391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *name; 3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int namelen; 3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 3421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int n, newlen; 3431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((n = dn_expand(msg, cp + msglen, cp, name, namelen)) < 0) 3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project newlen = strlen(name); 3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (newlen == 0 || name[newlen - 1] != '.') { 3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (newlen + 1 >= namelen) /* Lack space for final dot */ 3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(name + newlen, "."); 3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (cp + n); 3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* XXX: the rest of these functions need to become length-limited, too. */ 3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_fqname(const u_char *cp, const u_char *msg, FILE *file) { 3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char name[MAXDNAME]; 3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *n; 3621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = p_fqnname(cp, msg, MAXCDNAME, name, sizeof name); 3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n == NULL) 3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputs(name, file); 3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (n); 3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of RR classes and qclasses. Classes and qclasses are the same, except 3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that C_ANY is a qclass but not a class. (You can ask for records of class 3731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * C_ANY, but you can't have any records of that class in the database.) 3741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 3751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_class_syms[] = { 3761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_IN, "IN", (char *)0}, 3771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_CHAOS, "CH", (char *)0}, 3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_CHAOS, "CHAOS", (char *)0}, 3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_HS, "HS", (char *)0}, 3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_HS, "HESIOD", (char *)0}, 3811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_ANY, "ANY", (char *)0}, 3821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_NONE, "NONE", (char *)0}, 3831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_IN, (char *)0, (char *)0} 3841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 3851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 3871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of message sections. 3881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 3897cc5666d94615d9249163dc7ac0f58c2614497ceJim Huangstatic const struct res_sym __p_default_section_syms[] = { 3901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_qd, "QUERY", (char *)0}, 3911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_an, "ANSWER", (char *)0}, 3921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_ns, "AUTHORITY", (char *)0}, 3931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_ar, "ADDITIONAL", (char *)0}, 3941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, (char *)0, (char *)0} 3951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 3961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3977cc5666d94615d9249163dc7ac0f58c2614497ceJim Huangstatic const struct res_sym __p_update_section_syms[] = { 3981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_ZONE, "ZONE", (char *)0}, 3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_PREREQ, "PREREQUISITE", (char *)0}, 4001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_UPDATE, "UPDATE", (char *)0}, 4011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_ADDT, "ADDITIONAL", (char *)0}, 4021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, (char *)0, (char *)0} 4031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_key_syms[] = { 4061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_MD5RSA, "RSA", "RSA KEY with MD5 hash"}, 4071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_DH, "DH", "Diffie Hellman"}, 4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_DSA, "DSA", "Digital Signature Algorithm"}, 4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_EXPIRE_ONLY, "EXPIREONLY", "No algorithm"}, 4101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_PRIVATE_OID, "PRIVATE", "Algorithm obtained from OID"}, 4111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 4121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_cert_syms[] = { 4151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_pkix, "PKIX", "PKIX (X.509v3) Certificate"}, 4161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_spki, "SPKI", "SPKI certificate"}, 4171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_pgp, "PGP", "PGP certificate"}, 4181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_url, "URL", "URL Private"}, 4191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_oid, "OID", "OID Private"}, 4201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 4211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 4241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of RR types and qtypes. Types and qtypes are the same, except 4251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that T_ANY is a qtype but not a type. (You can ask for records of type 4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * T_ANY, but you can't have any records of that type in the database.) 4271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 4281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_type_syms[] = { 4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_a, "A", "address"}, 4301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_ns, "NS", "name server"}, 4311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_md, "MD", "mail destination (deprecated)"}, 4321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mf, "MF", "mail forwarder (deprecated)"}, 4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_cname, "CNAME", "canonical name"}, 4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_soa, "SOA", "start of authority"}, 4351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mb, "MB", "mailbox"}, 4361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mg, "MG", "mail group member"}, 4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mr, "MR", "mail rename"}, 4381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_null, "NULL", "null"}, 4391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_wks, "WKS", "well-known service (deprecated)"}, 4401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_ptr, "PTR", "domain name pointer"}, 4411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_hinfo, "HINFO", "host information"}, 4421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_minfo, "MINFO", "mailbox information"}, 4431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mx, "MX", "mail exchanger"}, 4441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_txt, "TXT", "text"}, 4451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_rp, "RP", "responsible person"}, 4461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_afsdb, "AFSDB", "DCE or AFS server"}, 4471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_x25, "X25", "X25 address"}, 4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_isdn, "ISDN", "ISDN address"}, 4491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_rt, "RT", "router"}, 4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nsap, "NSAP", "nsap address"}, 4511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nsap_ptr, "NSAP_PTR", "domain name pointer"}, 4521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_sig, "SIG", "signature"}, 4531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_key, "KEY", "key"}, 4541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_px, "PX", "mapping information"}, 4551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_gpos, "GPOS", "geographical position (withdrawn)"}, 4561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_aaaa, "AAAA", "IPv6 address"}, 4571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_loc, "LOC", "location"}, 4581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nxt, "NXT", "next valid name (unimplemented)"}, 4591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_eid, "EID", "endpoint identifier (unimplemented)"}, 4601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nimloc, "NIMLOC", "NIMROD locator (unimplemented)"}, 4611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_srv, "SRV", "server selection"}, 4621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_atma, "ATMA", "ATM address (unimplemented)"}, 4631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_tkey, "TKEY", "tkey"}, 4641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_tsig, "TSIG", "transaction signature"}, 4651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_ixfr, "IXFR", "incremental zone transfer"}, 4661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_axfr, "AXFR", "zone transfer"}, 4671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_zxfr, "ZXFR", "compressed zone transfer"}, 4681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mailb, "MAILB", "mailbox-related data (deprecated)"}, 4691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_maila, "MAILA", "mail agent (deprecated)"}, 4701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_naptr, "NAPTR", "URN Naming Authority"}, 4711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_kx, "KX", "Key Exchange"}, 4721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_cert, "CERT", "Certificate"}, 4731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_a6, "A6", "IPv6 Address"}, 4741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_dname, "DNAME", "dname"}, 4751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_sink, "SINK", "Kitchen Sink (experimental)"}, 4761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_opt, "OPT", "EDNS Options"}, 4771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_any, "ANY", "\"any\""}, 4781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 4791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 4821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of DNS rcodes. 4831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 4841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_rcode_syms[] = { 4851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_noerror, "NOERROR", "no error"}, 4861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_formerr, "FORMERR", "format error"}, 4871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_servfail, "SERVFAIL", "server failed"}, 4881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_nxdomain, "NXDOMAIN", "no such domain name"}, 4891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_notimpl, "NOTIMP", "not implemented"}, 4901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_refused, "REFUSED", "refused"}, 4911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_yxdomain, "YXDOMAIN", "domain name exists"}, 4921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_yxrrset, "YXRRSET", "rrset exists"}, 4931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_nxrrset, "NXRRSET", "rrset doesn't exist"}, 4941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_notauth, "NOTAUTH", "not authoritative"}, 4951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_notzone, "NOTZONE", "Not in zone"}, 4961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_max, "", ""}, 4971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_badsig, "BADSIG", "bad signature"}, 4981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_badkey, "BADKEY", "bad key"}, 4991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_badtime, "BADTIME", "bad time"}, 5001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 5011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 5021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 5041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsym_ston(const struct res_sym *syms, const char *name, int *success) { 5051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (; syms->name != 0; syms++) { 5061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strcasecmp (name, syms->name) == 0) { 5071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 1; 5091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->number); 5101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 0; 5141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->number); /* The default value. */ 5151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 5181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsym_ntos(const struct res_sym *syms, int number, int *success) { 5191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char unname[20]; 5201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (; syms->name != 0; syms++) { 5221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (number == syms->number) { 5231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 1; 5251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->name); 5261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(unname, "%d", number); /* XXX nonreentrant */ 5301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 0; 5321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (unname); 5331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 5361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsym_ntop(const struct res_sym *syms, int number, int *success) { 5371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char unname[20]; 5381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (; syms->name != 0; syms++) { 5401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (number == syms->number) { 5411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 1; 5431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->humanname); 5441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(unname, "%d", number); /* XXX nonreentrant */ 5471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 0; 5491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (unname); 5501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 5531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for the type. 5541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 5551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 5561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_type(int type) { 5571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 5581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *result; 5591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char typebuf[20]; 5601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ntos(__p_type_syms, type, &success); 5621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (result); 5641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (type < 0 || type > 0xffff) 5651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("BADTYPE"); 5661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(typebuf, "TYPE%d", type); 5671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (typebuf); 5681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 5711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for the type. 5721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 5731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 5741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_section(int section, int opcode) { 5751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const struct res_sym *symbols; 5761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (opcode) { 5781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case ns_o_update: 5791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project symbols = __p_update_section_syms; 5801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 5811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 5821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project symbols = __p_default_section_syms; 5831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 5841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (sym_ntos(symbols, section, (int *)0)); 5861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 5891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a mnemonic for class. 5901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 5911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 5921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_class(int class) { 5931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 5941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *result; 5951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char classbuf[20]; 5961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ntos(__p_class_syms, class, &success); 5981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (result); 6001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (class < 0 || class > 0xffff) 6011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("BADCLASS"); 6021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(classbuf, "CLASS%d", class); 6031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (classbuf); 6041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a mnemonic for an option 6081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_option(u_long option) { 6111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char nbuf[40]; 6121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (option) { 6141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_INIT: return "init"; 6151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_DEBUG: return "debug"; 6161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_AAONLY: return "aaonly(unimpl)"; 6171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USEVC: return "usevc"; 6181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_PRIMARY: return "primry(unimpl)"; 6191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_IGNTC: return "igntc"; 6201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_RECURSE: return "recurs"; 6211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_DEFNAMES: return "defnam"; 6221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_STAYOPEN: return "styopn"; 6231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_DNSRCH: return "dnsrch"; 6241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_INSECURE1: return "insecure1"; 6251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_INSECURE2: return "insecure2"; 6261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_NOALIASES: return "noaliases"; 6271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_INET6: return "inet6"; 6281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_EDNS0 /* KAME extension */ 6291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_EDNS0: return "edns0"; 6301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_DNAME 6321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_DNAME: return "dname"; 6331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_DNSSEC 6351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_DNSSEC: return "dnssec"; 6361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_NOTLDQUERY 6381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_NOTLDQUERY: return "no-tld-query"; 6391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_NO_NIBBLE2 6411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_NO_NIBBLE2: return "no-nibble2"; 6421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX nonreentrant */ 6441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: sprintf(nbuf, "?0x%lx?", (u_long)option); 6451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (nbuf); 6461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a mnemonic for a time to live. 6511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_time(u_int32_t value) { 6541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char nbuf[40]; /* XXX nonreentrant */ 6551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_format_ttl((u_long)value, nbuf, sizeof nbuf) < 0) 6571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(nbuf, "%u", value); 6581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (nbuf); 6591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for the rcode. 6631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_rcode(int rcode) { 6661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (sym_ntos(__p_rcode_syms, rcode, (int *)0)); 6671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for a res_sockaddr_union. 6711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_sockun(union res_sockaddr_union u, char *buf, size_t size) { 6741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char ret[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:123.123.123.123"]; 6751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (u.sin.sin_family) { 6771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET: 6781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project inet_ntop(AF_INET, &u.sin.sin_addr, ret, sizeof ret); 6791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 6801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAS_INET6_STRUCTS 6811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET6: 6821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project inet_ntop(AF_INET6, &u.sin6.sin6_addr, ret, sizeof ret); 6831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 6841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 6861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(ret, "[af%d]", u.sin.sin_family); 6871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 6881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (size > 0U) { 6901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(buf, ret, size - 1); 6911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf[size - 1] = '0'; 6921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (buf); 6941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * routines to convert between on-the-wire RR format and zone file format. 6981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Does not contain conversion to/from decimal degrees; divide or multiply 6991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * by 60*60*1000 for that. 7001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 7011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const unsigned int poweroften[10] = {1, 10, 100, 1000, 10000, 100000, 7031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1000000,10000000,100000000,1000000000}; 7041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* takes an XeY precision/size value, returns a string representation. */ 7061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char * 7071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectprecsize_ntoa(prec) 7081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t prec; 7091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 7101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char retbuf[sizeof "90000000.00"]; /* XXX nonreentrant */ 7111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned long val; 7121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int mantissa, exponent; 7131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mantissa = (int)((prec >> 4) & 0x0f) % 10; 7151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project exponent = (int)((prec >> 0) & 0x0f) % 10; 7161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project val = mantissa * poweroften[exponent]; 7181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void) sprintf(retbuf, "%lu.%.2lu", val/100, val%100); 7201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (retbuf); 7211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* converts ascii size/precision X * 10**Y(cm) to 0xXY. moves pointer. */ 7241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic u_int8_t 7251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectprecsize_aton(const char **strptr) { 7261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned int mval = 0, cmval = 0; 7271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t retval = 0; 7281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp; 7291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int exponent; 7301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int mantissa; 7311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = *strptr; 7331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 7351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mval = mval * 10 + (*cp++ - '0'); 7361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '.') { /* centimeters */ 7381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 7391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 7401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmval = (*cp++ - '0') * 10; 7411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 7421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmval += (*cp++ - '0'); 7431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmval = (mval * 100) + cmval; 7471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (exponent = 0; exponent < 9; exponent++) 7491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cmval < poweroften[exponent+1]) 7501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mantissa = cmval / poweroften[exponent]; 7531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (mantissa > 9) 7541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mantissa = 9; 7551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = (mantissa << 4) | exponent; 7571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *strptr = cp; 7591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (retval); 7611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* converts ascii lat/lon to unsigned encoded 32-bit number. moves pointer. */ 7641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic u_int32_t 7651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlatlon2ul(const char **latlonstrptr, int *which) { 7661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp; 7671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t retval; 7681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int deg = 0, min = 0, secs = 0, secsfrac = 0; 7691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = *latlonstrptr; 7711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 7731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project deg = deg * 10 + (*cp++ - '0'); 7741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) 7761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 7771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!(isdigit((unsigned char)*cp))) 7791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto fndhemi; 7801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 7821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project min = min * 10 + (*cp++ - '0'); 7831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) 7851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 7861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!(isdigit((unsigned char)*cp))) 7881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto fndhemi; 7891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 7911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secs = secs * 10 + (*cp++ - '0'); 7921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '.') { /* decimal seconds */ 7941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 7951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 7961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secsfrac = (*cp++ - '0') * 100; 7971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 7981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secsfrac += (*cp++ - '0') * 10; 7991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 8001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secsfrac += (*cp++ - '0'); 8011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp)) /* if any trailing garbage */ 8071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) 8101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fndhemi: 8131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (*cp) { 8141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'N': case 'n': 8151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'E': case 'e': 8161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = ((unsigned)1<<31) 8171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project + (((((deg * 60) + min) * 60) + secs) * 1000) 8181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project + secsfrac; 8191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'S': case 's': 8211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'W': case 'w': 8221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = ((unsigned)1<<31) 8231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project - (((((deg * 60) + min) * 60) + secs) * 1000) 8241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project - secsfrac; 8251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 8271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = 0; /* invalid value -- indicates error */ 8281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (*cp) { 8321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'N': case 'n': 8331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'S': case 's': 8341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *which = 1; /* latitude */ 8351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'E': case 'e': 8371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'W': case 'w': 8381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *which = 2; /* longitude */ 8391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 8411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *which = 0; /* error */ 8421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; /* skip the hemisphere */ 8461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp)) /* if any trailing garbage */ 8481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) /* move to next field */ 8511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *latlonstrptr = cp; 8541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (retval); 8561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 8571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* converts a zone file representation in a string to an RDATA on-the-wire 8591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * representation. */ 8601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 8611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectloc_aton(ascii, binary) 8621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *ascii; 8631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char *binary; 8641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 8651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp, *maxcp; 8661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char *bcp; 8671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t latit = 0, longit = 0, alt = 0; 8691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t lltemp1 = 0, lltemp2 = 0; 8701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int altmeters = 0, altfrac = 0, altsign = 1; 8711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t hp = 0x16; /* default = 1e6 cm = 10000.00m = 10km */ 8721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t vp = 0x13; /* default = 1e3 cm = 10.00m */ 8731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t siz = 0x12; /* default = 1e2 cm = 1.00m */ 8741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int which1 = 0, which2 = 0; 8751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = ascii; 8771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project maxcp = cp + strlen(ascii); 8781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project lltemp1 = latlon2ul(&cp, &which1); 8801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project lltemp2 = latlon2ul(&cp, &which2); 8821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (which1 + which2) { 8841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 3: /* 1 + 2, the only valid combination */ 8851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((which1 == 1) && (which2 == 2)) { /* normal case */ 8861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latit = lltemp1; 8871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longit = lltemp2; 8881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if ((which1 == 2) && (which2 == 1)) { /* reversed */ 8891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longit = lltemp1; 8901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latit = lltemp2; 8911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { /* some kind of brokenness */ 8921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 8931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: /* we didn't get one of each */ 8961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 8971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* altitude */ 9001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '-') { 9011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign = -1; 9021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '+') 9061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 9091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altmeters = altmeters * 10 + (*cp++ - '0'); 9101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '.') { /* decimal meters */ 9121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 9141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altfrac = (*cp++ - '0') * 10; 9151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 9161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altfrac += (*cp++ - '0'); 9171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project alt = (10000000 + (altsign * (altmeters * 100 + altfrac))); 9221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ 9241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp) && (cp < maxcp)) 9271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cp >= maxcp) 9301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto defaults; 9311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project siz = precsize_aton(&cp); 9331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ 9351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp) && (cp < maxcp)) 9381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cp >= maxcp) 9411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto defaults; 9421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hp = precsize_aton(&cp); 9441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ 9461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp) && (cp < maxcp)) 9491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cp >= maxcp) 9521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto defaults; 9531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project vp = precsize_aton(&cp); 9551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project defaults: 9571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project bcp = binary; 9591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = (u_int8_t) 0; /* version byte */ 9601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = siz; 9611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = hp; 9621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = vp; 9631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project PUTLONG(latit,bcp); 9641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project PUTLONG(longit,bcp); 9651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project PUTLONG(alt,bcp); 9661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (16); /* size of RR in octets */ 9681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 9691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* takes an on-the-wire LOC RR and formats it in a human readable format. */ 9711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 9721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectloc_ntoa(binary, ascii) 9731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *binary; 9741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *ascii; 9751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 9761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static const char *error = "?"; 9771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char tmpbuf[sizeof 9781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project"1000 60 60.000 N 1000 60 60.000 W -12345678.00m 90000000.00m 90000000.00m 90000000.00m"]; 9791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *cp = binary; 9801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int latdeg, latmin, latsec, latsecfrac; 9821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int longdeg, longmin, longsec, longsecfrac; 9831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char northsouth, eastwest; 9841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *altsign; 9851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int altmeters, altfrac; 9861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_int32_t referencealt = 100000 * 100; 9881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int32_t latval, longval, altval; 9901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t templ; 9911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t sizeval, hpval, vpval, versionval; 9921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *sizestr, *hpstr, *vpstr; 9941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project versionval = *cp++; 9961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ascii == NULL) 9981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ascii = tmpbuf; 9991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (versionval) { 10011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void) sprintf(ascii, "; error: unknown LOC RR version"); 10021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (ascii); 10031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 10041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeval = *cp++; 10061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hpval = *cp++; 10081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project vpval = *cp++; 10091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GETLONG(templ, cp); 10111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = (templ - ((unsigned)1<<31)); 10121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GETLONG(templ, cp); 10141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = (templ - ((unsigned)1<<31)); 10151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GETLONG(templ, cp); 10171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (templ < referencealt) { /* below WGS 84 spheroid */ 10181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altval = referencealt - templ; 10191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign = "-"; 10201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 10211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altval = templ - referencealt; 10221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign = ""; 10231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 10241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (latval < 0) { 10261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project northsouth = 'S'; 10271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = -latval; 10281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 10291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project northsouth = 'N'; 10301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latsecfrac = latval % 1000; 10321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = latval / 1000; 10331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latsec = latval % 60; 10341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = latval / 60; 10351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latmin = latval % 60; 10361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = latval / 60; 10371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latdeg = latval; 10381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (longval < 0) { 10401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project eastwest = 'W'; 10411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = -longval; 10421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 10431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project eastwest = 'E'; 10441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longsecfrac = longval % 1000; 10461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = longval / 1000; 10471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longsec = longval % 60; 10481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = longval / 60; 10491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longmin = longval % 60; 10501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = longval / 60; 10511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longdeg = longval; 10521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altfrac = altval % 100; 10541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altmeters = (altval / 100); 10551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizestr = strdup(precsize_ntoa((u_int32_t)sizeval)); 10571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hpstr = strdup(precsize_ntoa((u_int32_t)hpval)); 10581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project vpstr = strdup(precsize_ntoa((u_int32_t)vpval)); 10591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(ascii, 10611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %s%d.%.2dm %sm %sm %sm", 10621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latdeg, latmin, latsec, latsecfrac, northsouth, 10631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longdeg, longmin, longsec, longsecfrac, eastwest, 10641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign, altmeters, altfrac, 10651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (sizestr != NULL) ? sizestr : error, 10661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (hpstr != NULL) ? hpstr : error, 10671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (vpstr != NULL) ? vpstr : error); 10681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (sizestr != NULL) 10701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(sizestr); 10711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (hpstr != NULL) 10721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(hpstr); 10731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (vpstr != NULL) 10741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(vpstr); 10751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (ascii); 10771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 10781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Return the number of DNS hierarchy levels in the name. */ 10811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 10821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdn_count_labels(const char *name) { 10831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i, len, count; 10841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len = strlen(name); 10861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0, count = 0; i < len; i++) { 10871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX need to check for \. or use named's nlabels(). */ 10881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (name[i] == '.') 10891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project count++; 10901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 10911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* don't count initial wildcard */ 10931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (name[0] == '*') 10941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (count) 10951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project count--; 10961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* don't count the null label for root. */ 10981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* if terminating '.' not found, must adjust */ 10991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* count to include last label */ 11001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (len > 0 && name[len-1] != '.') 11011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project count++; 11021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (count); 11031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 11041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 11071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Make dates expressed in seconds-since-Jan-1-1970 easy to read. 11081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SIG records are required to be printed like this, by the Secure DNS RFC. 11091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 11101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar * 11111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_secstodate (u_long secs) { 11121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX nonreentrant */ 11131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char output[15]; /* YYYYMMDDHHMMSS and null */ 11141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project time_t myclock = secs; 11151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct tm *mytime; 11161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAVE_TIME_R 11171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct tm res; 11181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime = gmtime_r(&myclock, &res); 11201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 11211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime = gmtime(&myclock); 11221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 11231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_year += 1900; 11241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_mon += 1; 11251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(output, "%04d%02d%02d%02d%02d%02d", 11261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_year, mytime->tm_mon, mytime->tm_mday, 11271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_hour, mytime->tm_min, mytime->tm_sec); 11281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (output); 11291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 11301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int16_t 11321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_nametoclass(const char *buf, int *successp) { 11331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned long result; 11341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *endptr; 11351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 11361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ston(__p_class_syms, buf, &success); 11381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 11391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 11401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strncasecmp(buf, "CLASS", 5) != 0 || 11421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !isdigit((unsigned char)buf[5])) 11431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 11441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = 0; 11451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = strtoul(buf + 5, &endptr, 10); 11461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno == 0 && *endptr == '\0' && result <= 0xffffU) 11471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project success = 1; 11481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project done: 11491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (successp) 11501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *successp = success; 11511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (u_int16_t)(result); 11521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 11531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int16_t 11551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_nametotype(const char *buf, int *successp) { 11561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned long result; 11571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *endptr; 11581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 11591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ston(__p_type_syms, buf, &success); 11611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 11621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 11631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strncasecmp(buf, "type", 4) != 0 || 11651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !isdigit((unsigned char)buf[4])) 11661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 11671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = 0; 11681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = strtoul(buf + 4, &endptr, 10); 11691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno == 0 && *endptr == '\0' && result <= 0xffffU) 11701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project success = 1; 11711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project done: 11721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (successp) 11731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *successp = success; 11741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (u_int16_t)(result); 11751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1176