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