11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*	$NetBSD: ns_print.c,v 1.5 2004/11/07 02:19:49 christos Exp $	*/
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1996-1999 by Internet Software Consortium.
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h>
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char rcsid[] = "Id: ns_print.c,v 1.3.2.1.4.5 2004/07/28 20:16:45 marka Exp";
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$NetBSD: ns_print.c,v 1.5 2004/11/07 02:19:49 christos Exp $");
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Import. */
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h>
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/socket.h>
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netinet/in.h>
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "arpa_nameser.h"
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <arpa/inet.h>
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <isc/assertions.h>
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <isc/dst.h>
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h>
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "resolv_private.h"
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <resolv.h>
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h>
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <ctype.h>
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <assert.h>
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef SPRINTF_CHAR
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# define SPRINTF(x) strlen(sprintf/**/x)
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# define SPRINTF(x) ((size_t)sprintf x)
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef MIN
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	MIN(x,y)	((x)<(y)?(x):(y))
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Forward. */
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic size_t	prune_origin(const char *name, const char *origin);
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int	charstr(const u_char *rdata, const u_char *edata,
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			char **buf, size_t *buflen);
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int	addname(const u_char *msg, size_t msglen,
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			const u_char **p, const char *origin,
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			char **buf, size_t *buflen);
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void	addlen(size_t len, char **buf, size_t *buflen);
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int	addstr(const char *src, size_t len,
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		       char **buf, size_t *buflen);
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int	addtab(size_t len, size_t target, int spaced,
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		       char **buf, size_t *buflen);
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Macros. */
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	T(x) \
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	do { \
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if ((x) < 0) \
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (-1); \
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} while (/*CONSTCOND*/0)
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Public. */
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * int
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ns_sprintrr(handle, rr, name_ctx, origin, buf, buflen)
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Convert an RR to presentation format.
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return:
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Number of characters written to buf, or -1 (check errno).
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_sprintrr(const ns_msg *handle, const ns_rr *rr,
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    const char *name_ctx, const char *origin,
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    char *buf, size_t buflen)
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int n;
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	n = ns_sprintrrf(ns_msg_base(*handle), ns_msg_size(*handle),
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 ns_rr_name(*rr), ns_rr_class(*rr), ns_rr_type(*rr),
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 ns_rr_ttl(*rr), ns_rr_rdata(*rr), ns_rr_rdlen(*rr),
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			 name_ctx, origin, buf, buflen);
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (n);
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * int
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ns_sprintrrf(msg, msglen, name, class, type, ttl, rdata, rdlen,
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	       name_ctx, origin, buf, buflen)
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Convert the fields of an RR into presentation format.
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return:
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Number of characters written to buf, or -1 (check errno).
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_sprintrrf(const u_char *msg, size_t msglen,
1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    const char *name, ns_class class, ns_type type,
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    u_long ttl, const u_char *rdata, size_t rdlen,
1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    const char *name_ctx, const char *origin,
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    char *buf, size_t buflen)
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	const char *obuf = buf;
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	const u_char *edata = rdata + rdlen;
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int spaced = 0;
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	const char *comment;
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char tmp[100];
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int len, x;
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * Owner.
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (name_ctx != NULL && ns_samename(name_ctx, name) == 1) {
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("\t\t\t", (size_t)3, &buf, &buflen));
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else {
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = prune_origin(name, origin);
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (*name == '\0') {
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto root;
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} else if (len == 0) {
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr("@\t\t\t", (size_t)4, &buf, &buflen));
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} else {
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(name, (size_t)len, &buf, &buflen));
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/* Origin not used or not root, and no trailing dot? */
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (((origin == NULL || origin[0] == '\0') ||
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			    (origin[0] != '.' && origin[1] != '\0' &&
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			    name[len] == '\0')) && name[len - 1] != '.') {
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project root:
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				T(addstr(".", (size_t)1, &buf, &buflen));
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				len++;
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(spaced = addtab((size_t)len, 24, spaced, &buf, &buflen));
1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * TTL, Class, Type.
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	T(x = ns_format_ttl(ttl, buf, buflen));
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	addlen((size_t)x, &buf, &buflen);
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	len = SPRINTF((tmp, " %s %s", p_class(class), p_type(type)));
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	T(addstr(tmp, (size_t)len, &buf, &buflen));
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	T(spaced = addtab((size_t)(x + len), (size_t)16, spaced, &buf, &buflen));
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * RData.
1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	switch (type) {
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_a:
1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdlen != (size_t)NS_INADDRSZ)
1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(void) inet_ntop(AF_INET, rdata, buf, buflen);
1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		addlen(strlen(buf), &buf, &buflen);
1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_cname:
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_mb:
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_mg:
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_mr:
1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_ns:
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_ptr:
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_dname:
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_hinfo:
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_isdn:
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* First word. */
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = charstr(rdata, edata, &buf, &buflen));
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len == 0)
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += len;
1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" ", (size_t)1, &buf, &buflen));
1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Second word, optional in ISDN records. */
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (type == ns_t_isdn && rdata == edata)
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			break;
1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = charstr(rdata, edata, &buf, &buflen));
1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len == 0)
1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += len;
2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_soa: {
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		u_long t;
2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Server name. */
2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" ", (size_t)1, &buf, &buflen));
2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Administrator name. */
2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" (\n", (size_t)3, &buf, &buflen));
2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		spaced = 0;
2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if ((edata - rdata) != 5*NS_INT32SZ)
2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Serial number. */
2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get32(rdata);  rdata += NS_INT32SZ;
2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%lu", t));
2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("; serial\n", (size_t)9, &buf, &buflen));
2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		spaced = 0;
2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Refresh interval. */
2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get32(rdata);  rdata += NS_INT32SZ;
2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = ns_format_ttl(t, buf, buflen));
2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		addlen((size_t)len, &buf, &buflen);
2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("; refresh\n", (size_t)10, &buf, &buflen));
2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		spaced = 0;
2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Retry interval. */
2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get32(rdata);  rdata += NS_INT32SZ;
2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = ns_format_ttl(t, buf, buflen));
2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		addlen((size_t)len, &buf, &buflen);
2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("; retry\n", (size_t)8, &buf, &buflen));
2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		spaced = 0;
2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Expiry. */
2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get32(rdata);  rdata += NS_INT32SZ;
2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = ns_format_ttl(t, buf, buflen));
2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		addlen((size_t)len, &buf, &buflen);
2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("; expiry\n", (size_t)9, &buf, &buflen));
2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		spaced = 0;
2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Minimum TTL. */
2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get32(rdata);  rdata += NS_INT32SZ;
2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = ns_format_ttl(t, buf, buflen));
2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		addlen((size_t)len, &buf, &buflen);
2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" )", (size_t)2, &buf, &buflen));
2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("; minimum\n", (size_t)10, &buf, &buflen));
2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_mx:
2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_afsdb:
2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_rt: {
2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		u_int t;
2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdlen < (size_t)NS_INT16SZ)
2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Priority. */
2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get16(rdata);
2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += NS_INT16SZ;
2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%u ", t));
2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Target. */
2811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_px: {
2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		u_int t;
2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdlen < (size_t)NS_INT16SZ)
2901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
2911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Priority. */
2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get16(rdata);
2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += NS_INT16SZ;
2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%u ", t));
2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Name1. */
2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" ", (size_t)1, &buf, &buflen));
3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Name2. */
3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_x25:
3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = charstr(rdata, edata, &buf, &buflen));
3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len == 0)
3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += len;
3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_txt:
3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		while (rdata < edata) {
3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(len = charstr(rdata, edata, &buf, &buflen));
3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (len == 0)
3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				goto formerr;
3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			rdata += len;
3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (rdata < edata)
3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				T(addstr(" ", (size_t)1, &buf, &buflen));
3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_nsap: {
3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		char t[2+255*3];
3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(void) inet_nsap_ntoa((int)rdlen, rdata, t);
3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(t, strlen(t), &buf, &buflen));
3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_aaaa:
3351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdlen != (size_t)NS_IN6ADDRSZ)
3361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
3371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(void) inet_ntop(AF_INET6, rdata, buf, buflen);
3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		addlen(strlen(buf), &buf, &buflen);
3391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_loc: {
3421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		char t[255];
3431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* XXX protocol format checking? */
3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(void) loc_ntoa(rdata, t);
3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(t, strlen(t), &buf, &buflen));
3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_naptr: {
3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		u_int order, preference;
3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		char t[50];
3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdlen < 2U*NS_INT16SZ)
3551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
3561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Order, Precedence. */
3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		order = ns_get16(rdata);	rdata += NS_INT16SZ;
3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		preference = ns_get16(rdata);	rdata += NS_INT16SZ;
3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((t, "%u %u ", order, preference));
3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(t, (size_t)len, &buf, &buflen));
3621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Flags. */
3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = charstr(rdata, edata, &buf, &buflen));
3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len == 0)
3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += len;
3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" ", (size_t)1, &buf, &buflen));
3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Service. */
3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = charstr(rdata, edata, &buf, &buflen));
3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len == 0)
3731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
3741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += len;
3751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" ", (size_t)1, &buf, &buflen));
3761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Regexp. */
3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = charstr(rdata, edata, &buf, &buflen));
3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len < 0)
3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (-1);
3811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len == 0)
3821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
3831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += len;
3841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" ", (size_t)1, &buf, &buflen));
3851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Server. */
3871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
3881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
3891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
3901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_srv: {
3921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		u_int priority, weight, port;
3931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		char t[50];
3941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdlen < 3U*NS_INT16SZ)
3961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
3971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Priority, Weight, Port. */
3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		priority = ns_get16(rdata);  rdata += NS_INT16SZ;
4001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		weight   = ns_get16(rdata);  rdata += NS_INT16SZ;
4011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		port     = ns_get16(rdata);  rdata += NS_INT16SZ;
4021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((t, "%u %u %u ", priority, weight, port));
4031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(t, (size_t)len, &buf, &buflen));
4041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Server. */
4061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
4071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_minfo:
4111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_rp:
4121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Name1. */
4131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
4141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" ", (size_t)1, &buf, &buflen));
4151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Name2. */
4171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
4181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
4201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_wks: {
4221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int n, lcnt;
4231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdlen < 1U + NS_INT32SZ)
4251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Address. */
4281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(void) inet_ntop(AF_INET, rdata, buf, buflen);
4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		addlen(strlen(buf), &buf, &buflen);
4301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += NS_INADDRSZ;
4311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Protocol. */
4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, " %u ( ", *rdata));
4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
4351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += NS_INT8SZ;
4361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Bit map. */
4381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		n = 0;
4391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		lcnt = 0;
4401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		while (rdata < edata) {
4411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			u_int c = *rdata++;
4421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			do {
4431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				if (c & 0200) {
4441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					if (lcnt == 0) {
4451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project						T(addstr("\n\t\t\t\t", (size_t)5,
4461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project							 &buf, &buflen));
4471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project						lcnt = 10;
4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project						spaced = 0;
4491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					}
4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					len = SPRINTF((tmp, "%d ", n));
4511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					T(addstr(tmp, (size_t)len, &buf, &buflen));
4521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					lcnt--;
4531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				}
4541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				c <<= 1;
4551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			} while (++n & 07);
4561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
4571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(")", (size_t)1, &buf, &buflen));
4581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
4601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
4611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_key: {
4631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		char base64_key[NS_MD5RSA_MAX_BASE64];
4641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		u_int keyflags, protocol, algorithm, key_id;
4651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		const char *leader;
4661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int n;
4671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdlen < 0U + NS_INT16SZ + NS_INT8SZ + NS_INT8SZ)
4691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
4701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Key flags, Protocol, Algorithm. */
4721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _LIBC
4731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		key_id = dst_s_dns_key_id(rdata, edata-rdata);
4741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
4751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		key_id = 0;
4761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
4771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		keyflags = ns_get16(rdata);  rdata += NS_INT16SZ;
4781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		protocol = *rdata++;
4791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		algorithm = *rdata++;
4801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "0x%04x %u %u",
4811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			       keyflags, protocol, algorithm));
4821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
4831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Public key data. */
4851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = b64_ntop(rdata, (size_t)(edata - rdata),
4861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			       base64_key, sizeof base64_key);
4871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len < 0)
4881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
4891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len > 15) {
4901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(" (", (size_t)2, &buf, &buflen));
4911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			leader = "\n\t\t";
4921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			spaced = 0;
4931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} else
4941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			leader = " ";
4951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		for (n = 0; n < len; n += 48) {
4961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(leader, strlen(leader), &buf, &buflen));
4971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(base64_key + n, (size_t)MIN(len - n, 48),
4981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 &buf, &buflen));
4991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
5001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len > 15)
5011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(" )", (size_t)2, &buf, &buflen));
5021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		n = SPRINTF((tmp, " ; key_tag= %u", key_id));
5031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)n, &buf, &buflen));
5041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
5061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
5071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_sig: {
5091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		char base64_key[NS_MD5RSA_MAX_BASE64];
5101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		u_int typ, algorithm, labels, footprint;
5111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		const char *leader;
5121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		u_long t;
5131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int n;
5141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdlen < 22U)
5161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
5171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Type covered, Algorithm, Label count, Original TTL. */
5191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	        typ = ns_get16(rdata);  rdata += NS_INT16SZ;
5201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		algorithm = *rdata++;
5211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		labels = *rdata++;
5221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get32(rdata);  rdata += NS_INT32SZ;
5231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%s %d %d %lu ",
5241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			       p_type((int)typ), algorithm, labels, t));
5251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
5261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (labels > (u_int)dn_count_labels(name))
5271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
5281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Signature expiry. */
5301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get32(rdata);  rdata += NS_INT32SZ;
5311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%s ", p_secstodate(t)));
5321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
5331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Time signed. */
5351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get32(rdata);  rdata += NS_INT32SZ;
5361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%s ", p_secstodate(t)));
5371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
5381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Signature Footprint. */
5401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		footprint = ns_get16(rdata);  rdata += NS_INT16SZ;
5411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%u ", footprint));
5421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
5431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Signer's name. */
5451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
5461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Signature. */
5481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = b64_ntop(rdata, (size_t)(edata - rdata),
5491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			       base64_key, sizeof base64_key);
5501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len > 15) {
5511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(" (", (size_t)2, &buf, &buflen));
5521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			leader = "\n\t\t";
5531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			spaced = 0;
5541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		} else
5551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			leader = " ";
5561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len < 0)
5571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto formerr;
5581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		for (n = 0; n < len; n += 48) {
5591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(leader, strlen(leader), &buf, &buflen));
5601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(base64_key + n, (size_t)MIN(len - n, 48),
5611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				 &buf, &buflen));
5621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
5631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (len > 15)
5641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(" )", (size_t)2, &buf, &buflen));
5651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
5661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
5671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_nxt: {
5691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int n, c;
5701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Next domain name. */
5721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
5731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Type bit map. */
5751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		n = edata - rdata;
5761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		for (c = 0; c < n*8; c++)
5771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (NS_NXT_BIT_ISSET(c, rdata)) {
5781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				len = SPRINTF((tmp, " %s", p_type(c)));
5791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				T(addstr(tmp, (size_t)len, &buf, &buflen));
5801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
5811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
5821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
5831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_cert: {
5851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		u_int c_type, key_tag, alg;
5861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int n;
5871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		unsigned int siz;
5881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		char base64_cert[8192], tmp1[40];
5891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		const char *leader;
5901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		c_type  = ns_get16(rdata); rdata += NS_INT16SZ;
5921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		key_tag = ns_get16(rdata); rdata += NS_INT16SZ;
5931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		alg = (u_int) *rdata++;
5941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
5951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp1, "%d %d %d ", c_type, key_tag, alg));
5961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp1, (size_t)len, &buf, &buflen));
5971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */
5981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (siz > sizeof(base64_cert) * 3/4) {
5991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			const char *str = "record too long to print";
6001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(str, strlen(str), &buf, &buflen));
6011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
6021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		else {
6031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			len = b64_ntop(rdata, (size_t)(edata-rdata),
6041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			    base64_cert, siz);
6051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (len < 0)
6071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				goto formerr;
6081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			else if (len > 15) {
6091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				T(addstr(" (", (size_t)2, &buf, &buflen));
6101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				leader = "\n\t\t";
6111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				spaced = 0;
6121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
6131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			else
6141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				leader = " ";
6151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			for (n = 0; n < len; n += 48) {
6171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				T(addstr(leader, strlen(leader),
6181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					 &buf, &buflen));
6191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				T(addstr(base64_cert + n, (size_t)MIN(len - n, 48),
6201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					 &buf, &buflen));
6211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
6221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (len > 15)
6231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				T(addstr(" )", (size_t)2, &buf, &buflen));
6241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
6251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
6261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
6271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_tkey: {
6291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* KJD - need to complete this */
6301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		u_long t;
6311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int mode, err, keysize;
6321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Algorithm name. */
6341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
6351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" ", (size_t)1, &buf, &buflen));
6361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Inception. */
6381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get32(rdata);  rdata += NS_INT32SZ;
6391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%s ", p_secstodate(t)));
6401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
6411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Experation. */
6431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		t = ns_get32(rdata);  rdata += NS_INT32SZ;
6441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%s ", p_secstodate(t)));
6451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
6461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Mode , Error, Key Size. */
6481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Priority, Weight, Port. */
6491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		mode = ns_get16(rdata);  rdata += NS_INT16SZ;
6501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		err  = ns_get16(rdata);  rdata += NS_INT16SZ;
6511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		keysize  = ns_get16(rdata);  rdata += NS_INT16SZ;
6521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%u %u %u ", mode, err, keysize));
6531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
6541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* XXX need to dump key, print otherdata length & other data */
6561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
6571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
6581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_tsig: {
6601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* BEW - need to complete this */
6611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int n;
6621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(len = addname(msg, msglen, &rdata, origin, &buf, &buflen));
6641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" ", (size_t)1, &buf, &buflen));
6651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += 8; /* time */
6661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		n = ns_get16(rdata); rdata += INT16SZ;
6671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += n; /* sig */
6681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		n = ns_get16(rdata); rdata += INT16SZ; /* original id */
6691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		sprintf(buf, "%d", ns_get16(rdata));
6701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += INT16SZ;
6711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		addlen(strlen(buf), &buf, &buflen);
6721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
6731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
6741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_a6: {
6761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		struct in6_addr a;
6771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int pbyte, pbit;
6781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* prefix length */
6801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdlen == 0U) goto formerr;
6811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%d ", *rdata));
6821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
6831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		pbit = *rdata;
6841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (pbit > 128) goto formerr;
6851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		pbyte = (pbit & ~7) / 8;
6861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata++;
6871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* address suffix: provided only when prefix len != 128 */
6891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (pbit < 128) {
6901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (rdata + pbyte >= edata) goto formerr;
6911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			memset(&a, 0, sizeof(a));
6921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			memcpy(&a.s6_addr[pbyte], rdata, sizeof(a) - pbyte);
6931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			(void) inet_ntop(AF_INET6, &a, buf, buflen);
6941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			addlen(strlen(buf), &buf, &buflen);
6951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			rdata += sizeof(a) - pbyte;
6961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
6971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* prefix name: provided only when prefix len > 0 */
6991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (pbit == 0)
7001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			break;
7011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdata >= edata) goto formerr;
7021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(" ", (size_t)1, &buf, &buflen));
7031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
7041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
7061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
7071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case ns_t_opt: {
7091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		len = SPRINTF((tmp, "%u bytes", class));
7101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)len, &buf, &buflen));
7111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
7121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    }
7131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	default:
7151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		comment = "unknown RR type";
7161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		goto hexify;
7171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
7181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (buf - obuf);
7191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project formerr:
7201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	comment = "RR format error";
7211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project hexify: {
7221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int n, m;
7231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char *p;
7241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	len = SPRINTF((tmp, "\\# %tu%s\t; %s", edata - rdata,
7261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		       rdlen != 0 ? " (" : "", comment));
7271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	T(addstr(tmp, (size_t)len, &buf, &buflen));
7281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	while (rdata < edata) {
7291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		p = tmp;
7301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		p += SPRINTF((p, "\n\t"));
7311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		spaced = 0;
7321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		n = MIN(16, edata - rdata);
7331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		for (m = 0; m < n; m++)
7341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			p += SPRINTF((p, "%02x ", rdata[m]));
7351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)(p - tmp), &buf, &buflen));
7361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (n < 16) {
7371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addstr(")", (size_t)1, &buf, &buflen));
7381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			T(addtab((size_t)(p - tmp + 1), (size_t)48, spaced, &buf, &buflen));
7391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
7401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		p = tmp;
7411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		p += SPRINTF((p, "; "));
7421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		for (m = 0; m < n; m++)
7431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			*p++ = (isascii(rdata[m]) && isprint(rdata[m]))
7441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				? rdata[m]
7451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				: '.';
7461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr(tmp, (size_t)(p - tmp), &buf, &buflen));
7471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		rdata += n;
7481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
7491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (buf - obuf);
7501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    }
7511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
7521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Private. */
7541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
7561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * size_t
7571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * prune_origin(name, origin)
7581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Find out if the name is at or under the current origin.
7591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return:
7601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Number of characters in name before start of origin,
7611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	or length of name if origin does not match.
7621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notes:
7631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	This function should share code with samedomain().
7641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
7651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic size_t
7661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectprune_origin(const char *name, const char *origin) {
7671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	const char *oname = name;
7681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	while (*name != '\0') {
7701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (origin != NULL && ns_samename(name, origin) == 1)
7711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			return (name - oname - (name > oname));
7721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		while (*name != '\0') {
7731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (*name == '\\') {
7741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				name++;
7751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/* XXX need to handle \nnn form. */
7761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				if (*name == '\0')
7771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					break;
7781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			} else if (*name == '.') {
7791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				name++;
7801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				break;
7811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
7821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			name++;
7831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
7841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
7851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (name - oname);
7861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
7871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
7891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * int
7901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * charstr(rdata, edata, buf, buflen)
7911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Format a <character-string> into the presentation buffer.
7921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return:
7931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	Number of rdata octets consumed
7941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	0 for protocol format error
7951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	-1 for output buffer error
7961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * side effects:
7971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *	buffer is advanced on success.
7981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
7991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int
8001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectcharstr(const u_char *rdata, const u_char *edata, char **buf, size_t *buflen) {
8011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	const u_char *odata = rdata;
8021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	size_t save_buflen = *buflen;
8031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char *save_buf = *buf;
8041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
8051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (addstr("\"", (size_t)1, buf, buflen) < 0)
8061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		goto enospc;
8071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (rdata < edata) {
8081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		int n = *rdata;
8091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
8101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (rdata + 1 + n <= edata) {
8111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			rdata++;
8121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			while (n-- > 0) {
8131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				if (strchr("\n\"\\", *rdata) != NULL)
8141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					if (addstr("\\", (size_t)1, buf, buflen) < 0)
8151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project						goto enospc;
8161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				if (addstr((const char *)rdata, (size_t)1,
8171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					   buf, buflen) < 0)
8181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project					goto enospc;
8191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				rdata++;
8201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
8211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
8221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
8231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (addstr("\"", (size_t)1, buf, buflen) < 0)
8241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		goto enospc;
8251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (rdata - odata);
8261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project enospc:
8271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	errno = ENOSPC;
8281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	*buf = save_buf;
8291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	*buflen = save_buflen;
8301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (-1);
8311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
8321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
8331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int
8341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectaddname(const u_char *msg, size_t msglen,
8351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	const u_char **pp, const char *origin,
8361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char **buf, size_t *buflen)
8371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
8381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	size_t newlen, save_buflen = *buflen;
8391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char *save_buf = *buf;
8401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int n;
8411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
8421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	n = dn_expand(msg, msg + msglen, *pp, *buf, (int)*buflen);
8431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (n < 0)
8441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		goto enospc;	/* Guess. */
8451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	newlen = prune_origin(*buf, origin);
8461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (**buf == '\0') {
8471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		goto root;
8481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else if (newlen == 0U) {
8491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* Use "@" instead of name. */
8501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (newlen + 2 > *buflen)
8511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			goto enospc;        /* No room for "@\0". */
8521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(*buf)[newlen++] = '@';
8531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(*buf)[newlen] = '\0';
8541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else {
8551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		if (((origin == NULL || origin[0] == '\0') ||
8561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    (origin[0] != '.' && origin[1] != '\0' &&
8571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		    (*buf)[newlen] == '\0')) && (*buf)[newlen - 1] != '.') {
8581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			/* No trailing dot. */
8591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project root:
8601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (newlen + 2 > *buflen)
8611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				goto enospc;	/* No room for ".\0". */
8621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			(*buf)[newlen++] = '.';
8631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			(*buf)[newlen] = '\0';
8641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		}
8651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
8661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	*pp += n;
8671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	addlen(newlen, buf, buflen);
8681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	**buf = '\0';
8691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (newlen);
8701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project enospc:
8711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	errno = ENOSPC;
8721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	*buf = save_buf;
8731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	*buflen = save_buflen;
8741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (-1);
8751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
8761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
8771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void
8781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectaddlen(size_t len, char **buf, size_t *buflen) {
8791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	assert(len <= *buflen);
8801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	*buf += len;
8811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	*buflen -= len;
8821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
8831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
8841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int
8851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectaddstr(const char *src, size_t len, char **buf, size_t *buflen) {
8861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (len >= *buflen) {
8871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		errno = ENOSPC;
8881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (-1);
8891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
8901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	memcpy(*buf, src, len);
8911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	addlen(len, buf, buflen);
8921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	**buf = '\0';
8931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
8941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
8951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
8961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int
8971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectaddtab(size_t len, size_t target, int spaced, char **buf, size_t *buflen) {
8981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	size_t save_buflen = *buflen;
8991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char *save_buf = *buf;
9001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int t;
9011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
9021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (spaced || len >= target - 1) {
9031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		T(addstr("  ", (size_t)2, buf, buflen));
9041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		spaced = 1;
9051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else {
9061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		for (t = (target - len - 1) / 8; t >= 0; t--)
9071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			if (addstr("\t", (size_t)1, buf, buflen) < 0) {
9081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				*buflen = save_buflen;
9091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				*buf = save_buf;
9101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				return (-1);
9111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			}
9121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		spaced = 0;
9131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
9141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (spaced);
9151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
916