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