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 Projectextern const char * const _res_opcodes[]; 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern const char * const _res_sectioncodes[]; 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _LIBC 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print the current options. 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfp_resstat(const res_state statp, FILE *file) { 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_long mask; 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; res options:"); 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (mask = 1; mask != 0U; mask <<= 1) 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->options & mask) 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " %s", p_option(mask)); 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n', file); 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdo_section(const res_state statp, 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_msg *handle, ns_sect section, 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int pflag, FILE *file) 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int n, sflag, rrnum; 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int buflen = 2048; 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *buf; 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_opcode opcode; 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_rr rr; 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print answer records. 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1620ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle sflag = (int)(statp->pfcode & pflag); 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (statp->pfcode && !sflag) 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf = malloc((size_t)buflen); 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buf == NULL) { 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; memory allocation failure\n"); 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project opcode = (ns_opcode) ns_msg_getflag(*handle, ns_f_opcode); 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rrnum = 0; 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (;;) { 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_parserr(handle, section, rrnum, &rr)) { 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno != ENODEV) 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; ns_parserr: %s\n", 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strerror(errno)); 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (rrnum > 0 && sflag != 0 && 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (statp->pfcode & RES_PRF_HEAD1)) 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n', file); 1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto cleanup; 1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (rrnum == 0 && sflag != 0 && (statp->pfcode & RES_PRF_HEAD1)) 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; %s SECTION:\n", 1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(section, opcode)); 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (section == ns_s_qd) 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";;\t%s, type = %s, class = %s\n", 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_rr_name(rr), 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_type(ns_rr_type(rr)), 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_class(ns_rr_class(rr))); 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (section == ns_s_ar && ns_rr_type(rr) == ns_t_opt) { 1930ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle size_t rdatalen, ttl; 1940ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle uint16_t optcode, optlen; 1950ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle 1960ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle rdatalen = ns_rr_rdlen(rr); 1970ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle ttl = ns_rr_ttl(rr); 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, 1990ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle "; EDNS: version: %zu, udp=%u, flags=%04zx\n", 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (ttl>>16)&0xff, ns_rr_class(rr), ttl&0xffff); 2010ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle while (rdatalen >= 4) { 2020ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle const u_char *cp = ns_rr_rdata(rr); 2030ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle int i; 2040ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle 2050ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle GETSHORT(optcode, cp); 2060ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle GETSHORT(optlen, cp); 2070ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle 2080ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle if (optcode == NS_OPT_NSID) { 2090ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs("; NSID: ", file); 2100ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle if (optlen == 0) { 2110ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs("; NSID\n", file); 2120ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } else { 2130ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs("; NSID: ", file); 2140ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle for (i = 0; i < optlen; i++) 2150ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "%02x ", 2160ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle cp[i]); 2170ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs(" (",file); 2180ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle for (i = 0; i < optlen; i++) 2190ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "%c", 2200ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle isprint(cp[i])? 2210ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle cp[i] : '.'); 2220ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs(")\n", file); 2230ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } 2240ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } else { 2250ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle if (optlen == 0) { 2260ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "; OPT=%u\n", 2270ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle optcode); 2280ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } else { 2290ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "; OPT=%u: ", 2300ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle optcode); 2310ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle for (i = 0; i < optlen; i++) 2320ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "%02x ", 2330ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle cp[i]); 2340ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs(" (",file); 2350ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle for (i = 0; i < optlen; i++) 2360ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fprintf(file, "%c", 2370ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle isprint(cp[i]) ? 2380ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle cp[i] : '.'); 2390ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle fputs(")\n", file); 2400ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } 2410ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } 2420ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle rdatalen -= 4 + optlen; 2430ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle } 2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = ns_sprintrr(handle, &rr, NULL, NULL, 2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf, (u_int)buflen); 2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n < 0) { 2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno == ENOSPC) { 2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(buf); 2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf = NULL; 2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buflen < 131072) 2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf = malloc((size_t)(buflen += 1024)); 2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buf == NULL) { 2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, 2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ";; memory allocation failure\n"); 2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project continue; 2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; ns_sprintrr: %s\n", 2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strerror(errno)); 2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto cleanup; 2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputs(buf, file); 2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputc('\n', file); 2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rrnum++; 2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cleanup: 2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buf != NULL) 2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(buf); 2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print the contents of a query. 2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This is intended to be primarily a debugging routine. 2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_pquery(const res_state statp, const u_char *msg, int len, FILE *file) { 2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_msg handle; 2811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int qdcount, ancount, nscount, arcount; 2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int opcode, rcode, id; 2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_initparse(msg, len, &handle) < 0) { 2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ";; ns_initparse: %s\n", strerror(errno)); 2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return; 2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project opcode = ns_msg_getflag(handle, ns_f_opcode); 2891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rcode = ns_msg_getflag(handle, ns_f_rcode); 2901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project id = ns_msg_id(handle); 2911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project qdcount = ns_msg_count(handle, ns_s_qd); 2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ancount = ns_msg_count(handle, ns_s_an); 2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nscount = ns_msg_count(handle, ns_s_ns); 2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project arcount = ns_msg_count(handle, ns_s_ar); 2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print header fields. 2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEADX) || rcode) 3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, 3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ";; ->>HEADER<<- opcode: %s, status: %s, id: %d\n", 3021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project _res_opcodes[opcode], p_rcode((int)rcode), id); 3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEADX)) 3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc(';', file); 3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEAD2)) { 3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, "; flags:"); 3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_qr)) 3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " qr"); 3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_aa)) 3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " aa"); 3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_tc)) 3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " tc"); 3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_rd)) 3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " rd"); 3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_ra)) 3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " ra"); 3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_z)) 3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " ??"); 3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_ad)) 3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " ad"); 3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_msg_getflag(handle, ns_f_cd)) 3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, " cd"); 3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEAD1)) { 3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, "; %s: %d", 3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_qd, (int)opcode), qdcount); 3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ", %s: %d", 3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_an, (int)opcode), ancount); 3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ", %s: %d", 3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_ns, (int)opcode), nscount); 3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fprintf(file, ", %s: %d", 3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project p_section(ns_s_ar, (int)opcode), arcount); 3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((!statp->pfcode) || (statp->pfcode & 3351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1))) { 3361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n',file); 3371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 3391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Print the various sections. 3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_qd, RES_PRF_QUES, file); 3421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_an, RES_PRF_ANS, file); 3431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_ns, RES_PRF_AUTH, file); 3441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project do_section(statp, &handle, ns_s_ar, RES_PRF_ADD, file); 3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (qdcount == 0 && ancount == 0 && 3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project nscount == 0 && arcount == 0) 3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('\n', file); 3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_cdnname(const u_char *cp, const u_char *msg, int len, FILE *file) { 3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char name[MAXDNAME]; 3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int n; 3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3550ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle if ((n = dn_expand(msg, msg + len, cp, name, (int)sizeof name)) < 0) 3561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (name[0] == '\0') 3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project putc('.', file); 3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputs(name, file); 3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (cp + n); 3621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_cdname(const u_char *cp, const u_char *msg, FILE *file) { 3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (p_cdnname(cp, msg, PACKETSZ, file)); 3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Return a fully-qualified domain name from a compressed name (with 3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project length supplied). */ 3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3730ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravlep_fqnname(const u_char *cp, const u_char *msg, int msglen, char *name, 3740ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle int namelen) 3751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 3760ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle int n; 3770ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle size_t newlen; 3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((n = dn_expand(msg, cp + msglen, cp, name, namelen)) < 0) 3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 3811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project newlen = strlen(name); 3821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (newlen == 0 || name[newlen - 1] != '.') { 3830ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle if ((int)newlen + 1 >= namelen) /* Lack space for final dot */ 3841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 3851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 3861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(name + newlen, "."); 3871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 3881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (cp + n); 3891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 3901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* XXX: the rest of these functions need to become length-limited, too. */ 3921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst u_char * 3941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_fqname(const u_char *cp, const u_char *msg, FILE *file) { 3951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char name[MAXDNAME]; 3961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *n; 3971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 3980ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle n = p_fqnname(cp, msg, MAXCDNAME, name, (int)sizeof name); 3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n == NULL) 4001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (NULL); 4011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fputs(name, file); 4021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (n); 4031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 4041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 4061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of RR classes and qclasses. Classes and qclasses are the same, except 4071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that C_ANY is a qclass but not a class. (You can ask for records of class 4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * C_ANY, but you can't have any records of that class in the database.) 4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 4101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_class_syms[] = { 4111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_IN, "IN", (char *)0}, 4121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_CHAOS, "CH", (char *)0}, 4131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_CHAOS, "CHAOS", (char *)0}, 4141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_HS, "HS", (char *)0}, 4151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_HS, "HESIOD", (char *)0}, 4161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_ANY, "ANY", (char *)0}, 4171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_NONE, "NONE", (char *)0}, 4181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {C_IN, (char *)0, (char *)0} 4191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 4221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of message sections. 4231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 4247cc5666d94615d9249163dc7ac0f58c2614497ceJim Huangstatic const struct res_sym __p_default_section_syms[] = { 4251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_qd, "QUERY", (char *)0}, 4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_an, "ANSWER", (char *)0}, 4271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_ns, "AUTHORITY", (char *)0}, 4281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_s_ar, "ADDITIONAL", (char *)0}, 4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, (char *)0, (char *)0} 4301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4327cc5666d94615d9249163dc7ac0f58c2614497ceJim Huangstatic const struct res_sym __p_update_section_syms[] = { 4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_ZONE, "ZONE", (char *)0}, 4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_PREREQ, "PREREQUISITE", (char *)0}, 4351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_UPDATE, "UPDATE", (char *)0}, 4361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {S_ADDT, "ADDITIONAL", (char *)0}, 4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, (char *)0, (char *)0} 4381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_key_syms[] = { 4411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_MD5RSA, "RSA", "RSA KEY with MD5 hash"}, 4421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_DH, "DH", "Diffie Hellman"}, 4431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_DSA, "DSA", "Digital Signature Algorithm"}, 4441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_EXPIRE_ONLY, "EXPIREONLY", "No algorithm"}, 4451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {NS_ALG_PRIVATE_OID, "PRIVATE", "Algorithm obtained from OID"}, 4461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 4471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_cert_syms[] = { 4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_pkix, "PKIX", "PKIX (X.509v3) Certificate"}, 4511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_spki, "SPKI", "SPKI certificate"}, 4521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_pgp, "PGP", "PGP certificate"}, 4531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_url, "URL", "URL Private"}, 4541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {cert_t_oid, "OID", "OID Private"}, 4551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 4561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 4571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 4581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 4591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of RR types and qtypes. Types and qtypes are the same, except 4601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * that T_ANY is a qtype but not a type. (You can ask for records of type 4611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * T_ANY, but you can't have any records of that type in the database.) 4621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 4631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_type_syms[] = { 4641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_a, "A", "address"}, 4651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_ns, "NS", "name server"}, 4661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_md, "MD", "mail destination (deprecated)"}, 4671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mf, "MF", "mail forwarder (deprecated)"}, 4681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_cname, "CNAME", "canonical name"}, 4691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_soa, "SOA", "start of authority"}, 4701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mb, "MB", "mailbox"}, 4711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mg, "MG", "mail group member"}, 4721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mr, "MR", "mail rename"}, 4731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_null, "NULL", "null"}, 4741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_wks, "WKS", "well-known service (deprecated)"}, 4751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_ptr, "PTR", "domain name pointer"}, 4761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_hinfo, "HINFO", "host information"}, 4771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_minfo, "MINFO", "mailbox information"}, 4781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mx, "MX", "mail exchanger"}, 4791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_txt, "TXT", "text"}, 4801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_rp, "RP", "responsible person"}, 4811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_afsdb, "AFSDB", "DCE or AFS server"}, 4821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_x25, "X25", "X25 address"}, 4831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_isdn, "ISDN", "ISDN address"}, 4841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_rt, "RT", "router"}, 4851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nsap, "NSAP", "nsap address"}, 4861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nsap_ptr, "NSAP_PTR", "domain name pointer"}, 4871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_sig, "SIG", "signature"}, 4881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_key, "KEY", "key"}, 4891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_px, "PX", "mapping information"}, 4901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_gpos, "GPOS", "geographical position (withdrawn)"}, 4911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_aaaa, "AAAA", "IPv6 address"}, 4921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_loc, "LOC", "location"}, 4931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nxt, "NXT", "next valid name (unimplemented)"}, 4941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_eid, "EID", "endpoint identifier (unimplemented)"}, 4951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_nimloc, "NIMLOC", "NIMROD locator (unimplemented)"}, 4961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_srv, "SRV", "server selection"}, 4971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_atma, "ATMA", "ATM address (unimplemented)"}, 4980ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_naptr, "NAPTR", "naptr"}, 4990ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_kx, "KX", "key exchange"}, 5000ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_cert, "CERT", "certificate"}, 5010ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_a6, "A", "IPv6 address (experminental)"}, 5020ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_dname, "DNAME", "non-terminal redirection"}, 5030ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_opt, "OPT", "opt"}, 5040ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_apl, "apl", "apl"}, 5050ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_ds, "DS", "delegation signer"}, 5060ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_sshfp, "SSFP", "SSH fingerprint"}, 5070ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_ipseckey, "IPSECKEY", "IPSEC key"}, 5080ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_rrsig, "RRSIG", "rrsig"}, 5090ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_nsec, "NSEC", "nsec"}, 5100ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_dnskey, "DNSKEY", "DNS key"}, 5110ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_dhcid, "DHCID", "dynamic host configuration identifier"}, 5120ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_nsec3, "NSEC3", "nsec3"}, 5130ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_nsec3param, "NSEC3PARAM", "NSEC3 parameters"}, 5140ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_hip, "HIP", "host identity protocol"}, 5150ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_spf, "SPF", "sender policy framework"}, 5161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_tkey, "TKEY", "tkey"}, 5171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_tsig, "TSIG", "transaction signature"}, 5181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_ixfr, "IXFR", "incremental zone transfer"}, 5191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_axfr, "AXFR", "zone transfer"}, 5201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_zxfr, "ZXFR", "compressed zone transfer"}, 5211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_mailb, "MAILB", "mailbox-related data (deprecated)"}, 5221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_maila, "MAILA", "mail agent (deprecated)"}, 5231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_naptr, "NAPTR", "URN Naming Authority"}, 5241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_kx, "KX", "Key Exchange"}, 5251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_cert, "CERT", "Certificate"}, 5261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_a6, "A6", "IPv6 Address"}, 5271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_dname, "DNAME", "dname"}, 5281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_sink, "SINK", "Kitchen Sink (experimental)"}, 5291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_opt, "OPT", "EDNS Options"}, 5301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_t_any, "ANY", "\"any\""}, 5310ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle {ns_t_dlv, "DLV", "DNSSEC look-aside validation"}, 5321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 5331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 5341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 5361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Names of DNS rcodes. 5371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 5381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct res_sym __p_rcode_syms[] = { 5391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_noerror, "NOERROR", "no error"}, 5401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_formerr, "FORMERR", "format error"}, 5411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_servfail, "SERVFAIL", "server failed"}, 5421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_nxdomain, "NXDOMAIN", "no such domain name"}, 5431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_notimpl, "NOTIMP", "not implemented"}, 5441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_refused, "REFUSED", "refused"}, 5451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_yxdomain, "YXDOMAIN", "domain name exists"}, 5461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_yxrrset, "YXRRSET", "rrset exists"}, 5471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_nxrrset, "NXRRSET", "rrset doesn't exist"}, 5481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_notauth, "NOTAUTH", "not authoritative"}, 5491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_notzone, "NOTZONE", "Not in zone"}, 5501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_max, "", ""}, 5511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_badsig, "BADSIG", "bad signature"}, 5521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_badkey, "BADKEY", "bad key"}, 5531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {ns_r_badtime, "BADTIME", "bad time"}, 5541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {0, NULL, NULL} 5551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 5561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 5581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsym_ston(const struct res_sym *syms, const char *name, int *success) { 5591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (; syms->name != 0; syms++) { 5601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strcasecmp (name, syms->name) == 0) { 5611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 1; 5631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->number); 5641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 0; 5681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->number); /* The default value. */ 5691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 5721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsym_ntos(const struct res_sym *syms, int number, int *success) { 5731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char unname[20]; 5741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (; syms->name != 0; syms++) { 5761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (number == syms->number) { 5771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 1; 5791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->name); 5801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 583cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert snprintf(unname, sizeof(unname), "%d", number); /* XXX nonreentrant */ 5841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 0; 5861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (unname); 5871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 5881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 5901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsym_ntop(const struct res_sym *syms, int number, int *success) { 5911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char unname[20]; 5921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (; syms->name != 0; syms++) { 5941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (number == syms->number) { 5951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 5961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 1; 5971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (syms->humanname); 5981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 5991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 600cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert snprintf(unname, sizeof(unname), "%d", number); /* XXX nonreentrant */ 6011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 6021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *success = 0; 6031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (unname); 6041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for the type. 6081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_type(int type) { 6111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 6121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *result; 6131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char typebuf[20]; 6141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ntos(__p_type_syms, type, &success); 6161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 6171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (result); 6181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (type < 0 || type > 0xffff) 6191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("BADTYPE"); 620cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert snprintf(typebuf, sizeof(typebuf), "TYPE%d", type); 6211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (typebuf); 6221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for the type. 6261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_section(int section, int opcode) { 6291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const struct res_sym *symbols; 6301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (opcode) { 6321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case ns_o_update: 6331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project symbols = __p_update_section_syms; 6341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 6351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 6361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project symbols = __p_default_section_syms; 6371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 6381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 6391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (sym_ntos(symbols, section, (int *)0)); 6401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a mnemonic for class. 6441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_class(int class) { 6471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 6481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *result; 6491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char classbuf[20]; 6501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ntos(__p_class_syms, class, &success); 6521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 6531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (result); 6541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (class < 0 || class > 0xffff) 6551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("BADCLASS"); 656cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert snprintf(classbuf, sizeof(classbuf), "CLASS%d", class); 6571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (classbuf); 6581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 6591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 6611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a mnemonic for an option 6621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 6631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 6641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_option(u_long option) { 6651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char nbuf[40]; 6661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 6671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (option) { 6681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_INIT: return "init"; 6691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_DEBUG: return "debug"; 6701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_AAONLY: return "aaonly(unimpl)"; 6711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USEVC: return "usevc"; 6721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_PRIMARY: return "primry(unimpl)"; 6731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_IGNTC: return "igntc"; 6741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_RECURSE: return "recurs"; 6751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_DEFNAMES: return "defnam"; 6761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_STAYOPEN: return "styopn"; 6771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_DNSRCH: return "dnsrch"; 6781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_INSECURE1: return "insecure1"; 6791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_INSECURE2: return "insecure2"; 6801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_NOALIASES: return "noaliases"; 6811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_INET6: return "inet6"; 6821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_EDNS0 /* KAME extension */ 6831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_EDNS0: return "edns0"; 6841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_DNAME 6861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_DNAME: return "dname"; 6871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_USE_DNSSEC 6891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_USE_DNSSEC: return "dnssec"; 6901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_NOTLDQUERY 6921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_NOTLDQUERY: return "no-tld-query"; 6931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef RES_NO_NIBBLE2 6951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case RES_NO_NIBBLE2: return "no-nibble2"; 6961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 6971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX nonreentrant */ 698cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert default: snprintf(nbuf, sizeof(nbuf), "?0x%lx?", (u_long)option); 6991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (nbuf); 7001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 7041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a mnemonic for a time to live. 7051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 7061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 7071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_time(u_int32_t value) { 7081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char nbuf[40]; /* XXX nonreentrant */ 7091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_format_ttl((u_long)value, nbuf, sizeof nbuf) < 0) 711cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert snprintf(nbuf, sizeof(nbuf), "%u", value); 7121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (nbuf); 7131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 7161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for the rcode. 7171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 7181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 7191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_rcode(int rcode) { 7201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (sym_ntos(__p_rcode_syms, rcode, (int *)0)); 7211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 7241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return a string for a res_sockaddr_union. 7251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 7261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 7271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_sockun(union res_sockaddr_union u, char *buf, size_t size) { 7281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char ret[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:123.123.123.123"]; 7291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (u.sin.sin_family) { 7311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET: 7320ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle inet_ntop(AF_INET, &u.sin.sin_addr, ret, (socklen_t)sizeof ret); 7331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAS_INET6_STRUCTS 7351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case AF_INET6: 7361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project inet_ntop(AF_INET6, &u.sin6.sin6_addr, ret, sizeof ret); 7371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 7391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 740cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert snprintf(ret, sizeof(ret), "[af%d]", u.sin.sin_family); 7411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 7421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (size > 0U) { 7441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strncpy(buf, ret, size - 1); 7451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buf[size - 1] = '0'; 7461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (buf); 7481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 7511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * routines to convert between on-the-wire RR format and zone file format. 7521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Does not contain conversion to/from decimal degrees; divide or multiply 7531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * by 60*60*1000 for that. 7541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 7551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const unsigned int poweroften[10] = {1, 10, 100, 1000, 10000, 100000, 7571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1000000,10000000,100000000,1000000000}; 7581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* takes an XeY precision/size value, returns a string representation. */ 7601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char * 7610ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravleprecsize_ntoa(u_int32_t prec) 7621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 7631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char retbuf[sizeof "90000000.00"]; /* XXX nonreentrant */ 7641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned long val; 7651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int mantissa, exponent; 7661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mantissa = (int)((prec >> 4) & 0x0f) % 10; 7681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project exponent = (int)((prec >> 0) & 0x0f) % 10; 7691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project val = mantissa * poweroften[exponent]; 7711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 772cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert (void) snprintf(retbuf, sizeof(retbuf), "%lu.%.2lu", val/100, val%100); 7731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (retbuf); 7741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 7751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* converts ascii size/precision X * 10**Y(cm) to 0xXY. moves pointer. */ 7771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic u_int8_t 7781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectprecsize_aton(const char **strptr) { 7791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned int mval = 0, cmval = 0; 7801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t retval = 0; 7811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp; 7821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int exponent; 7831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int mantissa; 7841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = *strptr; 7861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 7881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mval = mval * 10 + (*cp++ - '0'); 7891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 7901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '.') { /* centimeters */ 7911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 7921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 7931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmval = (*cp++ - '0') * 10; 7941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 7951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmval += (*cp++ - '0'); 7961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 7991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cmval = (mval * 100) + cmval; 8001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (exponent = 0; exponent < 9; exponent++) 8021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cmval < poweroften[exponent+1]) 8031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mantissa = cmval / poweroften[exponent]; 8061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (mantissa > 9) 8071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mantissa = 9; 8081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = (mantissa << 4) | exponent; 8101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *strptr = cp; 8121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (retval); 8141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 8151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* converts ascii lat/lon to unsigned encoded 32-bit number. moves pointer. */ 8171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic u_int32_t 8181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlatlon2ul(const char **latlonstrptr, int *which) { 8191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp; 8201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t retval; 8211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int deg = 0, min = 0, secs = 0, secsfrac = 0; 8221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = *latlonstrptr; 8241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 8261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project deg = deg * 10 + (*cp++ - '0'); 8271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) 8291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!(isdigit((unsigned char)*cp))) 8321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto fndhemi; 8331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 8351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project min = min * 10 + (*cp++ - '0'); 8361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) 8381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!(isdigit((unsigned char)*cp))) 8411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto fndhemi; 8421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 8441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secs = secs * 10 + (*cp++ - '0'); 8451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '.') { /* decimal seconds */ 8471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 8491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secsfrac = (*cp++ - '0') * 100; 8501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 8511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secsfrac += (*cp++ - '0') * 10; 8521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 8531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project secsfrac += (*cp++ - '0'); 8541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp)) /* if any trailing garbage */ 8601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) 8631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 8641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project fndhemi: 8661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (*cp) { 8671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'N': case 'n': 8681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'E': case 'e': 8691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = ((unsigned)1<<31) 8701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project + (((((deg * 60) + min) * 60) + secs) * 1000) 8711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project + secsfrac; 8721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'S': case 's': 8741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'W': case 'w': 8751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = ((unsigned)1<<31) 8761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project - (((((deg * 60) + min) * 60) + secs) * 1000) 8771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project - secsfrac; 8781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 8801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project retval = 0; /* invalid value -- indicates error */ 8811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (*cp) { 8851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'N': case 'n': 8861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'S': case 's': 8871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *which = 1; /* latitude */ 8881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'E': case 'e': 8901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 'W': case 'w': 8911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *which = 2; /* longitude */ 8921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 8941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *which = 0; /* error */ 8951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 8961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 8971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 8981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; /* skip the hemisphere */ 8991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp)) /* if any trailing garbage */ 9011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp)) /* move to next field */ 9041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *latlonstrptr = cp; 9071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (retval); 9091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 9101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* converts a zone file representation in a string to an RDATA on-the-wire 9121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * representation. */ 9131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 9140ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravleloc_aton(const char *ascii, u_char *binary) 9151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 9161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp, *maxcp; 9171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_char *bcp; 9181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t latit = 0, longit = 0, alt = 0; 9201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t lltemp1 = 0, lltemp2 = 0; 9211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int altmeters = 0, altfrac = 0, altsign = 1; 9221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t hp = 0x16; /* default = 1e6 cm = 10000.00m = 10km */ 9231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t vp = 0x13; /* default = 1e3 cm = 10.00m */ 9241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t siz = 0x12; /* default = 1e2 cm = 1.00m */ 9251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int which1 = 0, which2 = 0; 9261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = ascii; 9281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project maxcp = cp + strlen(ascii); 9291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project lltemp1 = latlon2ul(&cp, &which1); 9311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project lltemp2 = latlon2ul(&cp, &which2); 9331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (which1 + which2) { 9351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 3: /* 1 + 2, the only valid combination */ 9361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((which1 == 1) && (which2 == 2)) { /* normal case */ 9371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latit = lltemp1; 9381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longit = lltemp2; 9391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else if ((which1 == 2) && (which2 == 1)) { /* reversed */ 9401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longit = lltemp1; 9411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latit = lltemp2; 9421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { /* some kind of brokenness */ 9431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 9441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 9461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: /* we didn't get one of each */ 9471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 9481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* altitude */ 9511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '-') { 9521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign = -1; 9531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '+') 9571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isdigit((unsigned char)*cp)) 9601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altmeters = altmeters * 10 + (*cp++ - '0'); 9611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (*cp == '.') { /* decimal meters */ 9631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 9651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altfrac = (*cp++ - '0') * 10; 9661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (isdigit((unsigned char)*cp)) { 9671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altfrac += (*cp++ - '0'); 9681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 9711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project alt = (10000000 + (altsign * (altmeters * 100 + altfrac))); 9731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ 9751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp) && (cp < maxcp)) 9781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cp >= maxcp) 9811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto defaults; 9821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project siz = precsize_aton(&cp); 9841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ 9861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp) && (cp < maxcp)) 9891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cp >= maxcp) 9921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto defaults; 9931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hp = precsize_aton(&cp); 9951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ 9971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 9981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 9991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (isspace((unsigned char)*cp) && (cp < maxcp)) 10001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp++; 10011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (cp >= maxcp) 10031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto defaults; 10041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project vp = precsize_aton(&cp); 10061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project defaults: 10081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project bcp = binary; 10101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = (u_int8_t) 0; /* version byte */ 10111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = siz; 10121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = hp; 10131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *bcp++ = vp; 10141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project PUTLONG(latit,bcp); 10151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project PUTLONG(longit,bcp); 10161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project PUTLONG(alt,bcp); 10171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (16); /* size of RR in octets */ 10191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 10201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* takes an on-the-wire LOC RR and formats it in a human readable format. */ 10221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 1023cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albertloc_ntoa(const u_char *binary, char *ascii, size_t bufsiz) 10241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 10251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static const char *error = "?"; 10261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char tmpbuf[sizeof 10271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project"1000 60 60.000 N 1000 60 60.000 W -12345678.00m 90000000.00m 90000000.00m 90000000.00m"]; 10281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *cp = binary; 10291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int latdeg, latmin, latsec, latsecfrac; 10311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int longdeg, longmin, longsec, longsecfrac; 10321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char northsouth, eastwest; 10331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *altsign; 10341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int altmeters, altfrac; 10351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_int32_t referencealt = 100000 * 100; 10371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int32_t latval, longval, altval; 10391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t templ; 10401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int8_t sizeval, hpval, vpval, versionval; 10411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *sizestr, *hpstr, *vpstr; 10431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project versionval = *cp++; 10451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ascii == NULL) 10471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ascii = tmpbuf; 10481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (versionval) { 1050cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert (void) snprintf(ascii, bufsiz, "; error: unknown LOC RR version"); 10511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (ascii); 10521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 10531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizeval = *cp++; 10551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hpval = *cp++; 10571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project vpval = *cp++; 10581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GETLONG(templ, cp); 10601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = (templ - ((unsigned)1<<31)); 10611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GETLONG(templ, cp); 10631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = (templ - ((unsigned)1<<31)); 10641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GETLONG(templ, cp); 10661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (templ < referencealt) { /* below WGS 84 spheroid */ 10671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altval = referencealt - templ; 10681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign = "-"; 10691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 10701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altval = templ - referencealt; 10711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign = ""; 10721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 10731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (latval < 0) { 10751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project northsouth = 'S'; 10761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = -latval; 10771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 10781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project northsouth = 'N'; 10791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latsecfrac = latval % 1000; 10811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = latval / 1000; 10821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latsec = latval % 60; 10831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = latval / 60; 10841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latmin = latval % 60; 10851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latval = latval / 60; 10861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latdeg = latval; 10871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (longval < 0) { 10891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project eastwest = 'W'; 10901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = -longval; 10911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 10921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project eastwest = 'E'; 10931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 10941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longsecfrac = longval % 1000; 10951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = longval / 1000; 10961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longsec = longval % 60; 10971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = longval / 60; 10981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longmin = longval % 60; 10991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longval = longval / 60; 11001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longdeg = longval; 11011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altfrac = altval % 100; 11031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altmeters = (altval / 100); 11041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project sizestr = strdup(precsize_ntoa((u_int32_t)sizeval)); 11061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hpstr = strdup(precsize_ntoa((u_int32_t)hpval)); 11071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project vpstr = strdup(precsize_ntoa((u_int32_t)vpval)); 11081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1109cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert snprintf(ascii, bufsiz, 11101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %s%d.%.2dm %sm %sm %sm", 11111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project latdeg, latmin, latsec, latsecfrac, northsouth, 11121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project longdeg, longmin, longsec, longsecfrac, eastwest, 11131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project altsign, altmeters, altfrac, 11141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (sizestr != NULL) ? sizestr : error, 11151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (hpstr != NULL) ? hpstr : error, 11161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (vpstr != NULL) ? vpstr : error); 11171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (sizestr != NULL) 11191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(sizestr); 11201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (hpstr != NULL) 11211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(hpstr); 11221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (vpstr != NULL) 11231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project free(vpstr); 11241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (ascii); 11261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 11271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Return the number of DNS hierarchy levels in the name. */ 11301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 11311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdn_count_labels(const char *name) { 11320ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle size_t len, i, count; 11331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len = strlen(name); 11351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0, count = 0; i < len; i++) { 11361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX need to check for \. or use named's nlabels(). */ 11371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (name[i] == '.') 11381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project count++; 11391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 11401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* don't count initial wildcard */ 11421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (name[0] == '*') 11431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (count) 11441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project count--; 11451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* don't count the null label for root. */ 11471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* if terminating '.' not found, must adjust */ 11481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* count to include last label */ 11491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (len > 0 && name[len-1] != '.') 11501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project count++; 11510ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle _DIAGASSERT(__type_fit(int, count)); 11520ad555a9089ea184060d9a1e16e0b95aafeb504bCalin Juravle return (int)count; 11531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 11541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 11571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Make dates expressed in seconds-since-Jan-1-1970 easy to read. 11581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SIG records are required to be printed like this, by the Secure DNS RFC. 11591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 11601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectchar * 11611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectp_secstodate (u_long secs) { 11621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* XXX nonreentrant */ 11631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static char output[15]; /* YYYYMMDDHHMMSS and null */ 11641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project time_t myclock = secs; 11651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct tm *mytime; 11661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef HAVE_TIME_R 11671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct tm res; 11681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime = gmtime_r(&myclock, &res); 11701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 11711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime = gmtime(&myclock); 11721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 11731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_year += 1900; 11741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_mon += 1; 1175cfd8c45725d85f3e2bfccb6b14a9bff59fd5c4c7Dan Albert snprintf(output, sizeof(output), "%04d%02d%02d%02d%02d%02d", 11761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_year, mytime->tm_mon, mytime->tm_mday, 11771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project mytime->tm_hour, mytime->tm_min, mytime->tm_sec); 11781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (output); 11791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 11801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int16_t 11821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_nametoclass(const char *buf, int *successp) { 11831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned long result; 11841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *endptr; 11851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 11861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ston(__p_class_syms, buf, &success); 11881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 11891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 11901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 11911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strncasecmp(buf, "CLASS", 5) != 0 || 11921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !isdigit((unsigned char)buf[5])) 11931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 11941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = 0; 11951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = strtoul(buf + 5, &endptr, 10); 11961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno == 0 && *endptr == '\0' && result <= 0xffffU) 11971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project success = 1; 11981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project done: 11991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (successp) 12001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *successp = success; 12011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (u_int16_t)(result); 12021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 12031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 12041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectu_int16_t 12051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectres_nametotype(const char *buf, int *successp) { 12061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned long result; 12071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *endptr; 12081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int success; 12091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 12101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = sym_ston(__p_type_syms, buf, &success); 12111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (success) 12121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 12131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 12141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strncasecmp(buf, "type", 4) != 0 || 12151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project !isdigit((unsigned char)buf[4])) 12161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto done; 12171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = 0; 12181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = strtoul(buf + 4, &endptr, 10); 12191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (errno == 0 && *endptr == '\0' && result <= 0xffffU) 12201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project success = 1; 12211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project done: 12221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (successp) 12231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *successp = success; 12241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (u_int16_t)(result); 12251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1226