10ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle/* $NetBSD: res_debug.c,v 1.13 2012/06/25 22:32:45 abs Exp $ */ 20ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle 30ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle/* 40ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * Portions Copyright (C) 2004, 2005, 2008, 2009 Internet Systems Consortium, Inc. ("ISC") 50ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * Portions Copyright (C) 1996-2003 Internet Software Consortium. 60ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * 70ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * Permission to use, copy, modify, and/or distribute this software for any 80ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * purpose with or without fee is hereby granted, provided that the above 90ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * copyright notice and this permission notice appear in all copies. 100ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * 110ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 120ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 130ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 140ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 150ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 160ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 170ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle * PERFORMANCE OF THIS SOFTWARE. 180ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle */ 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1985 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The Regents of the University of California. All rights reserved. 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * documentation and/or other materials provided with the distribution. 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. All advertising materials mentioning features or use of this software 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * must display the following acknowledgement: 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This product includes software developed by the University of 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * California, Berkeley and its contributors. 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 4. Neither the name of the University nor the names of its contributors 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * may be used to endorse or promote products derived from this software 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * without specific prior written permission. 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Portions Copyright (c) 1993 by Digital Equipment Corporation. 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies, and that 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the name of Digital Equipment Corporation not be used in advertising or 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * publicity pertaining to distribution of the document or software without 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * specific, written prior permission. 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SOFTWARE. 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Portions Copyright (c) 1995 by International Business Machines, Inc. 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * International Business Machines, Inc. (hereinafter called IBM) grants 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * permission under its copyrights to use, copy, modify, and distribute this 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Software with or without fee, provided that the above copyright notice and 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * all paragraphs of this notice appear in all copies, and that the name of IBM 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * not be used in connection with the marketing of any product incorporating 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the Software or modifications thereof, without specific, written prior 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * permission. 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * To the extent it has a right to do so, IBM grants an immunity from suit 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * under its patents, if any, for the use, sale or manufacture of products to 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the extent that such products are used for performing Domain Name System 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * dynamic updates in TCP/IP networks by means of the Software. No immunity is 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * granted for any product per se or for any other function of any product. 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. 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"; 1020ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravlestatic const char rcsid[] = "Id: res_debug.c,v 1.19 2009/02/26 11:20:20 tbox Exp"; 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 1040ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle__RCSID("$NetBSD: res_debug.c,v 1.13 2012/06/25 22:32:45 abs 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> 116569fb9887d00104509df79fa77d92e3cf9afe7dbCalin Juravle#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 Projectextern const char * const _res_opcodes[]; 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern const char * const _res_sectioncodes[]; 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _LIBC 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print the current options. 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfp_resstat(const res_state statp, FILE *file) { 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_long mask; 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; res options:"); 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (mask = 1; mask != 0U; mask <<= 1) 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & mask) 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " %s", p_option(mask)); 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n', file); 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdo_section(const res_state statp, 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_msg *handle, ns_sect section, 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int pflag, FILE *file) 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int n, sflag, rrnum; 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int buflen = 2048; 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *buf; 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_opcode opcode; 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_rr rr; 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print answer records. 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1700ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle sflag = (int)(statp->pfcode & pflag); 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->pfcode && !sflag) 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf = malloc((size_t)buflen); 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buf == NULL) { 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; memory allocation failure\n"); 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project opcode = (ns_opcode) ns_msg_getflag(*handle, ns_f_opcode); 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rrnum = 0; 1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (;;) { 1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_parserr(handle, section, rrnum, &rr)) { 1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno != ENODEV) 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; ns_parserr: %s\n", 1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strerror(errno)); 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (rrnum > 0 && sflag != 0 && 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (statp->pfcode & RES_PRF_HEAD1)) 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n', file); 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto cleanup; 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (rrnum == 0 && sflag != 0 && (statp->pfcode & RES_PRF_HEAD1)) 1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; %s SECTION:\n", 1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(section, opcode)); 1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (section == ns_s_qd) 1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";;\t%s, type = %s, class = %s\n", 1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_rr_name(rr), 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_type(ns_rr_type(rr)), 1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_class(ns_rr_class(rr))); 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (section == ns_s_ar && ns_rr_type(rr) == ns_t_opt) { 2010ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle size_t rdatalen, ttl; 2020ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle uint16_t optcode, optlen; 2030ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle 2040ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle rdatalen = ns_rr_rdlen(rr); 2050ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle ttl = ns_rr_ttl(rr); 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, 2070ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle "; EDNS: version: %zu, udp=%u, flags=%04zx\n", 2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (ttl>>16)&0xff, ns_rr_class(rr), ttl&0xffff); 2090ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle while (rdatalen >= 4) { 2100ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle const u_char *cp = ns_rr_rdata(rr); 2110ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle int i; 2120ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle 2130ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle GETSHORT(optcode, cp); 2140ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle GETSHORT(optlen, cp); 2150ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle 2160ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle if (optcode == NS_OPT_NSID) { 2170ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs("; NSID: ", file); 2180ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle if (optlen == 0) { 2190ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs("; NSID\n", file); 2200ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } else { 2210ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs("; NSID: ", file); 2220ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle for (i = 0; i < optlen; i++) 2230ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "%02x ", 2240ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle cp[i]); 2250ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs(" (",file); 2260ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle for (i = 0; i < optlen; i++) 2270ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "%c", 2280ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle isprint(cp[i])? 2290ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle cp[i] : '.'); 2300ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs(")\n", file); 2310ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } 2320ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } else { 2330ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle if (optlen == 0) { 2340ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "; OPT=%u\n", 2350ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle optcode); 2360ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } else { 2370ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "; OPT=%u: ", 2380ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle optcode); 2390ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle for (i = 0; i < optlen; i++) 2400ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "%02x ", 2410ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle cp[i]); 2420ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs(" (",file); 2430ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle for (i = 0; i < optlen; i++) 2440ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "%c", 2450ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle isprint(cp[i]) ? 2460ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle cp[i] : '.'); 2470ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs(")\n", file); 2480ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } 2490ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } 2500ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle rdatalen -= 4 + optlen; 2510ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } 2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = ns_sprintrr(handle, &rr, NULL, NULL, 2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf, (u_int)buflen); 2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n < 0) { 2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno == ENOSPC) { 2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(buf); 2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf = NULL; 2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buflen < 131072) 2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf = malloc((size_t)(buflen += 1024)); 2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buf == NULL) { 2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, 2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ";; memory allocation failure\n"); 2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; ns_sprintrr: %s\n", 2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strerror(errno)); 2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto cleanup; 2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputs(buf, file); 2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputc('\n', file); 2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rrnum++; 2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cleanup: 2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buf != NULL) 2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(buf); 2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print the contents of a query. 2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This is intended to be primarily a debugging routine. 2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_pquery(const res_state statp, const u_char *msg, int len, FILE *file) { 2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_msg handle; 2891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int qdcount, ancount, nscount, arcount; 2901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int opcode, rcode, id; 2911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_initparse(msg, len, &handle) < 0) { 2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; ns_initparse: %s\n", strerror(errno)); 2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project opcode = ns_msg_getflag(handle, ns_f_opcode); 2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rcode = ns_msg_getflag(handle, ns_f_rcode); 2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project id = ns_msg_id(handle); 2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project qdcount = ns_msg_count(handle, ns_s_qd); 3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ancount = ns_msg_count(handle, ns_s_an); 3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nscount = ns_msg_count(handle, ns_s_ns); 3021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project arcount = ns_msg_count(handle, ns_s_ar); 3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print header fields. 3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEADX) || rcode) 3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, 3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ";; ->>HEADER<<- opcode: %s, status: %s, id: %d\n", 3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _res_opcodes[opcode], p_rcode((int)rcode), id); 3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEADX)) 3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc(';', file); 3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEAD2)) { 3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, "; flags:"); 3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_qr)) 3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " qr"); 3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_aa)) 3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " aa"); 3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_tc)) 3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " tc"); 3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_rd)) 3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " rd"); 3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_ra)) 3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " ra"); 3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_z)) 3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " ??"); 3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_ad)) 3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " ad"); 3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_cd)) 3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " cd"); 3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEAD1)) { 3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, "; %s: %d", 3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_qd, (int)opcode), qdcount); 3351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ", %s: %d", 3361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_an, (int)opcode), ancount); 3371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ", %s: %d", 3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_ns, (int)opcode), nscount); 3391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ", %s: %d", 3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_ar, (int)opcode), arcount); 3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & 3431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1))) { 3441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n',file); 3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print the various sections. 3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_qd, RES_PRF_QUES, file); 3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_an, RES_PRF_ANS, file); 3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_ns, RES_PRF_AUTH, file); 3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_ar, RES_PRF_ADD, file); 3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (qdcount == 0 && ancount == 0 && 3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nscount == 0 && arcount == 0) 3551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n', file); 3561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_cdnname(const u_char *cp, const u_char *msg, int len, FILE *file) { 3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char name[MAXDNAME]; 3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int n; 3621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3630ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle if ((n = dn_expand(msg, msg + len, cp, name, (int)sizeof name)) < 0) 3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (name[0] == '\0') 3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('.', file); 3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputs(name, file); 3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (cp + n); 3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_cdname(const u_char *cp, const u_char *msg, FILE *file) { 3741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (p_cdnname(cp, msg, PACKETSZ, file)); 3751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Return a fully-qualified domain name from a compressed name (with 3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project length supplied). */ 3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3810ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravlep_fqnname(const u_char *cp, const u_char *msg, int msglen, char *name, 3820ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle int namelen) 3831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 3840ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle int n; 3850ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle size_t newlen; 3861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((n = dn_expand(msg, cp + msglen, cp, name, namelen)) < 0) 3881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 3891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project newlen = strlen(name); 3901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (newlen == 0 || name[newlen - 1] != '.') { 3910ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle if ((int)newlen + 1 >= namelen) /* Lack space for final dot */ 3921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 3931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 3941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(name + newlen, "."); 3951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (cp + n); 3971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* XXX: the rest of these functions need to become length-limited, too. */ 4001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 4021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_fqname(const u_char *cp, const u_char *msg, FILE *file) { 4031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char name[MAXDNAME]; 4041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *n; 4051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4060ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle n = p_fqnname(cp, msg, MAXCDNAME, name, (int)sizeof name); 4071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n == NULL) 4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputs(name, file); 4101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (n); 4111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 4121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 4141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of RR classes and qclasses. Classes and qclasses are the same, except 4151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that C_ANY is a qclass but not a class. (You can ask for records of class 4161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * C_ANY, but you can't have any records of that class in the database.) 4171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 4181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_class_syms[] = { 4191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_IN, "IN", (char *)0}, 4201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_CHAOS, "CH", (char *)0}, 4211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_CHAOS, "CHAOS", (char *)0}, 4221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_HS, "HS", (char *)0}, 4231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_HS, "HESIOD", (char *)0}, 4241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_ANY, "ANY", (char *)0}, 4251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_NONE, "NONE", (char *)0}, 4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_IN, (char *)0, (char *)0} 4271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 4301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of message sections. 4311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 4327cc5666d94615d9249163dc7ac0f58c2614497ceJim Huangstatic const struct res_sym __p_default_section_syms[] = { 4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_qd, "QUERY", (char *)0}, 4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_an, "ANSWER", (char *)0}, 4351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_ns, "AUTHORITY", (char *)0}, 4361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_ar, "ADDITIONAL", (char *)0}, 4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, (char *)0, (char *)0} 4381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4407cc5666d94615d9249163dc7ac0f58c2614497ceJim Huangstatic const struct res_sym __p_update_section_syms[] = { 4411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_ZONE, "ZONE", (char *)0}, 4421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_PREREQ, "PREREQUISITE", (char *)0}, 4431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_UPDATE, "UPDATE", (char *)0}, 4441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_ADDT, "ADDITIONAL", (char *)0}, 4451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, (char *)0, (char *)0} 4461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_key_syms[] = { 4491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_MD5RSA, "RSA", "RSA KEY with MD5 hash"}, 4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_DH, "DH", "Diffie Hellman"}, 4511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_DSA, "DSA", "Digital Signature Algorithm"}, 4521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_EXPIRE_ONLY, "EXPIREONLY", "No algorithm"}, 4531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_PRIVATE_OID, "PRIVATE", "Algorithm obtained from OID"}, 4541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 4551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_cert_syms[] = { 4581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_pkix, "PKIX", "PKIX (X.509v3) Certificate"}, 4591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_spki, "SPKI", "SPKI certificate"}, 4601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_pgp, "PGP", "PGP certificate"}, 4611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_url, "URL", "URL Private"}, 4621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_oid, "OID", "OID Private"}, 4631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 4641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 4671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of RR types and qtypes. Types and qtypes are the same, except 4681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that T_ANY is a qtype but not a type. (You can ask for records of type 4691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * T_ANY, but you can't have any records of that type in the database.) 4701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 4711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_type_syms[] = { 4721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_a, "A", "address"}, 4731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_ns, "NS", "name server"}, 4741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_md, "MD", "mail destination (deprecated)"}, 4751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mf, "MF", "mail forwarder (deprecated)"}, 4761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_cname, "CNAME", "canonical name"}, 4771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_soa, "SOA", "start of authority"}, 4781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mb, "MB", "mailbox"}, 4791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mg, "MG", "mail group member"}, 4801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mr, "MR", "mail rename"}, 4811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_null, "NULL", "null"}, 4821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_wks, "WKS", "well-known service (deprecated)"}, 4831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_ptr, "PTR", "domain name pointer"}, 4841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_hinfo, "HINFO", "host information"}, 4851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_minfo, "MINFO", "mailbox information"}, 4861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mx, "MX", "mail exchanger"}, 4871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_txt, "TXT", "text"}, 4881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_rp, "RP", "responsible person"}, 4891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_afsdb, "AFSDB", "DCE or AFS server"}, 4901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_x25, "X25", "X25 address"}, 4911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_isdn, "ISDN", "ISDN address"}, 4921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_rt, "RT", "router"}, 4931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nsap, "NSAP", "nsap address"}, 4941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nsap_ptr, "NSAP_PTR", "domain name pointer"}, 4951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_sig, "SIG", "signature"}, 4961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_key, "KEY", "key"}, 4971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_px, "PX", "mapping information"}, 4981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_gpos, "GPOS", "geographical position (withdrawn)"}, 4991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_aaaa, "AAAA", "IPv6 address"}, 5001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_loc, "LOC", "location"}, 5011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nxt, "NXT", "next valid name (unimplemented)"}, 5021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_eid, "EID", "endpoint identifier (unimplemented)"}, 5031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nimloc, "NIMLOC", "NIMROD locator (unimplemented)"}, 5041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_srv, "SRV", "server selection"}, 5051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_atma, "ATMA", "ATM address (unimplemented)"}, 5060ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_naptr, "NAPTR", "naptr"}, 5070ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_kx, "KX", "key exchange"}, 5080ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_cert, "CERT", "certificate"}, 5090ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_a6, "A", "IPv6 address (experminental)"}, 5100ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_dname, "DNAME", "non-terminal redirection"}, 5110ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_opt, "OPT", "opt"}, 5120ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_apl, "apl", "apl"}, 5130ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_ds, "DS", "delegation signer"}, 5140ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_sshfp, "SSFP", "SSH fingerprint"}, 5150ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_ipseckey, "IPSECKEY", "IPSEC key"}, 5160ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_rrsig, "RRSIG", "rrsig"}, 5170ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_nsec, "NSEC", "nsec"}, 5180ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_dnskey, "DNSKEY", "DNS key"}, 5190ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_dhcid, "DHCID", "dynamic host configuration identifier"}, 5200ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_nsec3, "NSEC3", "nsec3"}, 5210ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_nsec3param, "NSEC3PARAM", "NSEC3 parameters"}, 5220ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_hip, "HIP", "host identity protocol"}, 5230ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_spf, "SPF", "sender policy framework"}, 5241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_tkey, "TKEY", "tkey"}, 5251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_tsig, "TSIG", "transaction signature"}, 5261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_ixfr, "IXFR", "incremental zone transfer"}, 5271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_axfr, "AXFR", "zone transfer"}, 5281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_zxfr, "ZXFR", "compressed zone transfer"}, 5291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mailb, "MAILB", "mailbox-related data (deprecated)"}, 5301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_maila, "MAILA", "mail agent (deprecated)"}, 5311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_naptr, "NAPTR", "URN Naming Authority"}, 5321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_kx, "KX", "Key Exchange"}, 5331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_cert, "CERT", "Certificate"}, 5341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_a6, "A6", "IPv6 Address"}, 5351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_dname, "DNAME", "dname"}, 5361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_sink, "SINK", "Kitchen Sink (experimental)"}, 5371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_opt, "OPT", "EDNS Options"}, 5381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_any, "ANY", "\"any\""}, 5390ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_dlv, "DLV", "DNSSEC look-aside validation"}, 5401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 5411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 5421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 5441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of DNS rcodes. 5451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 5461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_rcode_syms[] = { 5471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_noerror, "NOERROR", "no error"}, 5481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_formerr, "FORMERR", "format error"}, 5491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_servfail, "SERVFAIL", "server failed"}, 5501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_nxdomain, "NXDOMAIN", "no such domain name"}, 5511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_notimpl, "NOTIMP", "not implemented"}, 5521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_refused, "REFUSED", "refused"}, 5531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_yxdomain, "YXDOMAIN", "domain name exists"}, 5541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_yxrrset, "YXRRSET", "rrset exists"}, 5551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_nxrrset, "NXRRSET", "rrset doesn't exist"}, 5561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_notauth, "NOTAUTH", "not authoritative"}, 5571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_notzone, "NOTZONE", "Not in zone"}, 5581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_max, "", ""}, 5591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_badsig, "BADSIG", "bad signature"}, 5601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_badkey, "BADKEY", "bad key"}, 5611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_badtime, "BADTIME", "bad time"}, 5621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 5631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 5641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 5661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsym_ston(const struct res_sym *syms, const char *name, int *success) { 5671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (; syms->name != 0; syms++) { 5681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strcasecmp (name, syms->name) == 0) { 5691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 1; 5711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->number); 5721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 0; 5761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->number); /* The default value. */ 5771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 5801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsym_ntos(const struct res_sym *syms, int number, int *success) { 5811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char unname[20]; 5821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (; syms->name != 0; syms++) { 5841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (number == syms->number) { 5851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 1; 5871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->name); 5881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(unname, "%d", number); /* XXX nonreentrant */ 5921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 0; 5941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (unname); 5951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 5981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsym_ntop(const struct res_sym *syms, int number, int *success) { 5991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char unname[20]; 6001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (; syms->name != 0; syms++) { 6021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (number == syms->number) { 6031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 6041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 1; 6051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->humanname); 6061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(unname, "%d", number); /* XXX nonreentrant */ 6091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 6101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 0; 6111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (unname); 6121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for the type. 6161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_type(int type) { 6191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 6201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *result; 6211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char typebuf[20]; 6221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ntos(__p_type_syms, type, &success); 6241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 6251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (result); 6261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (type < 0 || type > 0xffff) 6271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("BADTYPE"); 6281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(typebuf, "TYPE%d", type); 6291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (typebuf); 6301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for the type. 6341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_section(int section, int opcode) { 6371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const struct res_sym *symbols; 6381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (opcode) { 6401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case ns_o_update: 6411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project symbols = __p_update_section_syms; 6421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 6431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 6441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project symbols = __p_default_section_syms; 6451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 6461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (sym_ntos(symbols, section, (int *)0)); 6481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a mnemonic for class. 6521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_class(int class) { 6551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 6561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *result; 6571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char classbuf[20]; 6581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ntos(__p_class_syms, class, &success); 6601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 6611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (result); 6621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (class < 0 || class > 0xffff) 6631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("BADCLASS"); 6641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(classbuf, "CLASS%d", class); 6651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (classbuf); 6661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a mnemonic for an option 6701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_option(u_long option) { 6731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char nbuf[40]; 6741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (option) { 6761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_INIT: return "init"; 6771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_DEBUG: return "debug"; 6781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_AAONLY: return "aaonly(unimpl)"; 6791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USEVC: return "usevc"; 6801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_PRIMARY: return "primry(unimpl)"; 6811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_IGNTC: return "igntc"; 6821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_RECURSE: return "recurs"; 6831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_DEFNAMES: return "defnam"; 6841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_STAYOPEN: return "styopn"; 6851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_DNSRCH: return "dnsrch"; 6861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_INSECURE1: return "insecure1"; 6871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_INSECURE2: return "insecure2"; 6881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_NOALIASES: return "noaliases"; 6891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_INET6: return "inet6"; 6901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_EDNS0 /* KAME extension */ 6911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_EDNS0: return "edns0"; 6921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_DNAME 6941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_DNAME: return "dname"; 6951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_DNSSEC 6971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_DNSSEC: return "dnssec"; 6981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_NOTLDQUERY 7001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_NOTLDQUERY: return "no-tld-query"; 7011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 7021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_NO_NIBBLE2 7031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_NO_NIBBLE2: return "no-nibble2"; 7041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 7051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX nonreentrant */ 7061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: sprintf(nbuf, "?0x%lx?", (u_long)option); 7071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (nbuf); 7081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 7121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a mnemonic for a time to live. 7131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 7141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 7151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_time(u_int32_t value) { 7161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char nbuf[40]; /* XXX nonreentrant */ 7171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_format_ttl((u_long)value, nbuf, sizeof nbuf) < 0) 7191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(nbuf, "%u", value); 7201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (nbuf); 7211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 7241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for the rcode. 7251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 7261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 7271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_rcode(int rcode) { 7281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (sym_ntos(__p_rcode_syms, rcode, (int *)0)); 7291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 7321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for a res_sockaddr_union. 7331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 7341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 7351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_sockun(union res_sockaddr_union u, char *buf, size_t size) { 7361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char ret[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:123.123.123.123"]; 7371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (u.sin.sin_family) { 7391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET: 7400ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle inet_ntop(AF_INET, &u.sin.sin_addr, ret, (socklen_t)sizeof ret); 7411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAS_INET6_STRUCTS 7431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET6: 7441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project inet_ntop(AF_INET6, &u.sin6.sin6_addr, ret, sizeof ret); 7451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 7471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 7481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(ret, "[af%d]", u.sin.sin_family); 7491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (size > 0U) { 7521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(buf, ret, size - 1); 7531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf[size - 1] = '0'; 7541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (buf); 7561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 7591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * routines to convert between on-the-wire RR format and zone file format. 7601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Does not contain conversion to/from decimal degrees; divide or multiply 7611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * by 60*60*1000 for that. 7621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 7631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const unsigned int poweroften[10] = {1, 10, 100, 1000, 10000, 100000, 7651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1000000,10000000,100000000,1000000000}; 7661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* takes an XeY precision/size value, returns a string representation. */ 7681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char * 7690ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravleprecsize_ntoa(u_int32_t prec) 7701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 7711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char retbuf[sizeof "90000000.00"]; /* XXX nonreentrant */ 7721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned long val; 7731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int mantissa, exponent; 7741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mantissa = (int)((prec >> 4) & 0x0f) % 10; 7761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project exponent = (int)((prec >> 0) & 0x0f) % 10; 7771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project val = mantissa * poweroften[exponent]; 7791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void) sprintf(retbuf, "%lu.%.2lu", val/100, val%100); 7811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (retbuf); 7821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* converts ascii size/precision X * 10**Y(cm) to 0xXY. moves pointer. */ 7851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic u_int8_t 7861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectprecsize_aton(const char **strptr) { 7871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned int mval = 0, cmval = 0; 7881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t retval = 0; 7891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp; 7901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int exponent; 7911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int mantissa; 7921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = *strptr; 7941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 7961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mval = mval * 10 + (*cp++ - '0'); 7971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '.') { /* centimeters */ 7991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 8011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmval = (*cp++ - '0') * 10; 8021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 8031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmval += (*cp++ - '0'); 8041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmval = (mval * 100) + cmval; 8081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (exponent = 0; exponent < 9; exponent++) 8101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cmval < poweroften[exponent+1]) 8111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mantissa = cmval / poweroften[exponent]; 8141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (mantissa > 9) 8151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mantissa = 9; 8161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = (mantissa << 4) | exponent; 8181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *strptr = cp; 8201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (retval); 8221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 8231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* converts ascii lat/lon to unsigned encoded 32-bit number. moves pointer. */ 8251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic u_int32_t 8261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlatlon2ul(const char **latlonstrptr, int *which) { 8271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp; 8281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t retval; 8291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int deg = 0, min = 0, secs = 0, secsfrac = 0; 8301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = *latlonstrptr; 8321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 8341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project deg = deg * 10 + (*cp++ - '0'); 8351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) 8371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!(isdigit((unsigned char)*cp))) 8401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto fndhemi; 8411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 8431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project min = min * 10 + (*cp++ - '0'); 8441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) 8461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!(isdigit((unsigned char)*cp))) 8491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto fndhemi; 8501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 8521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secs = secs * 10 + (*cp++ - '0'); 8531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '.') { /* decimal seconds */ 8551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 8571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secsfrac = (*cp++ - '0') * 100; 8581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 8591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secsfrac += (*cp++ - '0') * 10; 8601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 8611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secsfrac += (*cp++ - '0'); 8621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp)) /* if any trailing garbage */ 8681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) 8711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fndhemi: 8741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (*cp) { 8751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'N': case 'n': 8761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'E': case 'e': 8771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = ((unsigned)1<<31) 8781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project + (((((deg * 60) + min) * 60) + secs) * 1000) 8791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project + secsfrac; 8801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'S': case 's': 8821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'W': case 'w': 8831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = ((unsigned)1<<31) 8841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project - (((((deg * 60) + min) * 60) + secs) * 1000) 8851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project - secsfrac; 8861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 8881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = 0; /* invalid value -- indicates error */ 8891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (*cp) { 8931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'N': case 'n': 8941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'S': case 's': 8951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *which = 1; /* latitude */ 8961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'E': case 'e': 8981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'W': case 'w': 8991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *which = 2; /* longitude */ 9001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 9011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 9021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *which = 0; /* error */ 9031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 9041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; /* skip the hemisphere */ 9071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp)) /* if any trailing garbage */ 9091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) /* move to next field */ 9121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *latlonstrptr = cp; 9151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (retval); 9171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 9181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* converts a zone file representation in a string to an RDATA on-the-wire 9201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * representation. */ 9211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 9220ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravleloc_aton(const char *ascii, u_char *binary) 9231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 9241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp, *maxcp; 9251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char *bcp; 9261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t latit = 0, longit = 0, alt = 0; 9281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t lltemp1 = 0, lltemp2 = 0; 9291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int altmeters = 0, altfrac = 0, altsign = 1; 9301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t hp = 0x16; /* default = 1e6 cm = 10000.00m = 10km */ 9311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t vp = 0x13; /* default = 1e3 cm = 10.00m */ 9321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t siz = 0x12; /* default = 1e2 cm = 1.00m */ 9331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int which1 = 0, which2 = 0; 9341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = ascii; 9361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project maxcp = cp + strlen(ascii); 9371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project lltemp1 = latlon2ul(&cp, &which1); 9391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project lltemp2 = latlon2ul(&cp, &which2); 9411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (which1 + which2) { 9431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 3: /* 1 + 2, the only valid combination */ 9441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((which1 == 1) && (which2 == 2)) { /* normal case */ 9451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latit = lltemp1; 9461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longit = lltemp2; 9471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if ((which1 == 2) && (which2 == 1)) { /* reversed */ 9481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longit = lltemp1; 9491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latit = lltemp2; 9501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { /* some kind of brokenness */ 9511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 9521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 9541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: /* we didn't get one of each */ 9551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 9561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* altitude */ 9591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '-') { 9601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign = -1; 9611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '+') 9651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 9681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altmeters = altmeters * 10 + (*cp++ - '0'); 9691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '.') { /* decimal meters */ 9711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 9731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altfrac = (*cp++ - '0') * 10; 9741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 9751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altfrac += (*cp++ - '0'); 9761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project alt = (10000000 + (altsign * (altmeters * 100 + altfrac))); 9811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ 9831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp) && (cp < maxcp)) 9861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cp >= maxcp) 9891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto defaults; 9901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project siz = precsize_aton(&cp); 9921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ 9941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp) && (cp < maxcp)) 9971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cp >= maxcp) 10001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto defaults; 10011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hp = precsize_aton(&cp); 10031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ 10051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 10061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp) && (cp < maxcp)) 10081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 10091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cp >= maxcp) 10111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto defaults; 10121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project vp = precsize_aton(&cp); 10141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project defaults: 10161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project bcp = binary; 10181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = (u_int8_t) 0; /* version byte */ 10191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = siz; 10201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = hp; 10211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = vp; 10221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project PUTLONG(latit,bcp); 10231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project PUTLONG(longit,bcp); 10241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project PUTLONG(alt,bcp); 10251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (16); /* size of RR in octets */ 10271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 10281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* takes an on-the-wire LOC RR and formats it in a human readable format. */ 10301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 10310ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravleloc_ntoa(const u_char *binary, char *ascii) 10321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 10331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static const char *error = "?"; 10341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char tmpbuf[sizeof 10351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project"1000 60 60.000 N 1000 60 60.000 W -12345678.00m 90000000.00m 90000000.00m 90000000.00m"]; 10361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *cp = binary; 10371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int latdeg, latmin, latsec, latsecfrac; 10391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int longdeg, longmin, longsec, longsecfrac; 10401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char northsouth, eastwest; 10411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *altsign; 10421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int altmeters, altfrac; 10431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_int32_t referencealt = 100000 * 100; 10451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int32_t latval, longval, altval; 10471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t templ; 10481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t sizeval, hpval, vpval, versionval; 10491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *sizestr, *hpstr, *vpstr; 10511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project versionval = *cp++; 10531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ascii == NULL) 10551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ascii = tmpbuf; 10561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (versionval) { 10581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (void) sprintf(ascii, "; error: unknown LOC RR version"); 10591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (ascii); 10601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 10611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeval = *cp++; 10631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hpval = *cp++; 10651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project vpval = *cp++; 10661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GETLONG(templ, cp); 10681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = (templ - ((unsigned)1<<31)); 10691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GETLONG(templ, cp); 10711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = (templ - ((unsigned)1<<31)); 10721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GETLONG(templ, cp); 10741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (templ < referencealt) { /* below WGS 84 spheroid */ 10751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altval = referencealt - templ; 10761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign = "-"; 10771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 10781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altval = templ - referencealt; 10791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign = ""; 10801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 10811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (latval < 0) { 10831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project northsouth = 'S'; 10841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = -latval; 10851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 10861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project northsouth = 'N'; 10871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latsecfrac = latval % 1000; 10891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = latval / 1000; 10901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latsec = latval % 60; 10911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = latval / 60; 10921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latmin = latval % 60; 10931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = latval / 60; 10941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latdeg = latval; 10951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (longval < 0) { 10971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project eastwest = 'W'; 10981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = -longval; 10991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 11001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project eastwest = 'E'; 11011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longsecfrac = longval % 1000; 11031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = longval / 1000; 11041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longsec = longval % 60; 11051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = longval / 60; 11061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longmin = longval % 60; 11071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = longval / 60; 11081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longdeg = longval; 11091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altfrac = altval % 100; 11111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altmeters = (altval / 100); 11121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizestr = strdup(precsize_ntoa((u_int32_t)sizeval)); 11141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hpstr = strdup(precsize_ntoa((u_int32_t)hpval)); 11151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project vpstr = strdup(precsize_ntoa((u_int32_t)vpval)); 11161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(ascii, 11181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %s%d.%.2dm %sm %sm %sm", 11191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latdeg, latmin, latsec, latsecfrac, northsouth, 11201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longdeg, longmin, longsec, longsecfrac, eastwest, 11211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign, altmeters, altfrac, 11221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (sizestr != NULL) ? sizestr : error, 11231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (hpstr != NULL) ? hpstr : error, 11241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (vpstr != NULL) ? vpstr : error); 11251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (sizestr != NULL) 11271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(sizestr); 11281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (hpstr != NULL) 11291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(hpstr); 11301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (vpstr != NULL) 11311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(vpstr); 11321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (ascii); 11341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 11351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Return the number of DNS hierarchy levels in the name. */ 11381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 11391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdn_count_labels(const char *name) { 11400ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle size_t len, i, count; 11411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len = strlen(name); 11431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0, count = 0; i < len; i++) { 11441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX need to check for \. or use named's nlabels(). */ 11451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (name[i] == '.') 11461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project count++; 11471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 11481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* don't count initial wildcard */ 11501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (name[0] == '*') 11511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (count) 11521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project count--; 11531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* don't count the null label for root. */ 11551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* if terminating '.' not found, must adjust */ 11561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* count to include last label */ 11571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (len > 0 && name[len-1] != '.') 11581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project count++; 11590ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle _DIAGASSERT(__type_fit(int, count)); 11600ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle return (int)count; 11611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 11621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 11651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Make dates expressed in seconds-since-Jan-1-1970 easy to read. 11661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SIG records are required to be printed like this, by the Secure DNS RFC. 11671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 11681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar * 11691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_secstodate (u_long secs) { 11701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX nonreentrant */ 11711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char output[15]; /* YYYYMMDDHHMMSS and null */ 11721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project time_t myclock = secs; 11731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct tm *mytime; 11741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAVE_TIME_R 11751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct tm res; 11761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime = gmtime_r(&myclock, &res); 11781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 11791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime = gmtime(&myclock); 11801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 11811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_year += 1900; 11821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_mon += 1; 11831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sprintf(output, "%04d%02d%02d%02d%02d%02d", 11841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_year, mytime->tm_mon, mytime->tm_mday, 11851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_hour, mytime->tm_min, mytime->tm_sec); 11861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (output); 11871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 11881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int16_t 11901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_nametoclass(const char *buf, int *successp) { 11911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned long result; 11921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *endptr; 11931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 11941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ston(__p_class_syms, buf, &success); 11961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 11971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 11981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strncasecmp(buf, "CLASS", 5) != 0 || 12001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !isdigit((unsigned char)buf[5])) 12011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 12021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = 0; 12031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = strtoul(buf + 5, &endptr, 10); 12041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno == 0 && *endptr == '\0' && result <= 0xffffU) 12051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project success = 1; 12061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project done: 12071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (successp) 12081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *successp = success; 12091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (u_int16_t)(result); 12101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 12111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 12121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int16_t 12131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_nametotype(const char *buf, int *successp) { 12141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned long result; 12151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *endptr; 12161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 12171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 12181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ston(__p_type_syms, buf, &success); 12191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 12201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 12211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 12221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strncasecmp(buf, "type", 4) != 0 || 12231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !isdigit((unsigned char)buf[4])) 12241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 12251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = 0; 12261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = strtoul(buf + 4, &endptr, 10); 12271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno == 0 && *endptr == '\0' && result <= 0xffffU) 12281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project success = 1; 12291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project done: 12301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (successp) 12311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *successp = success; 12321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (u_int16_t)(result); 12331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1234