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