12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Regents of the University of California. All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement: 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California, 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission. 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/print-domain.c,v 1.98 2007-12-09 01:40:32 guy Exp $ (LBL)"; 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "nameser.h" 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" /* must come after interface.h */ 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *ns_ops[] = { 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "", " inv_q", " stat", " op3", " notify", " update", " op6", " op7", 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project " op8", " updataA", " updateD", " updateDA", 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project " updateM", " updateMA", " zoneInit", " zoneRef", 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *ns_resp[] = { 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "", " FormErr", " ServFail", " NXDomain", 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project " NotImp", " Refused", " YXDomain", " YXRRSet", 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project " NXRRSet", " NotAuth", " NotZone", " Resp11", 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project " Resp12", " Resp13", " Resp14", " NoChange", 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* skip over a domain name */ 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectns_nskip(register const u_char *cp) 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_char i; 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (NULL); 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = *cp++; 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (i) { 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((i & INDIR_MASK) == INDIR_MASK) 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (cp + 1); 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((i & INDIR_MASK) == EDNS0_MASK) { 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int bitlen, bytelen; 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((i & ~INDIR_MASK) != EDNS0_ELT_BITLABEL) 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); /* unknown ELT */ 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (NULL); 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((bitlen = *cp++) == 0) 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bitlen = 256; 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bytelen = (bitlen + 7) / 8; 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += bytelen; 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += i; 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (NULL); 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = *cp++; 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (cp); 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* print a <domain-name> */ 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectblabel_print(const u_char *cp) 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int bitlen, slen, b; 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *bitp, *lim; 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char tc; 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((bitlen = *cp) == 0) 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bitlen = 256; 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project slen = (bitlen + 3) / 4; 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lim = cp + 1 + slen; 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* print the bit string as a hex string */ 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\\[x"); 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (bitp = cp + 1, b = bitlen; bitp < lim && b > 7; b -= 8, bitp++) { 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*bitp); 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%02x", *bitp); 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (b > 4) { 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*bitp); 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tc = *bitp++; 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%02x", tc & (0xff << (8 - b))); 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (b > 0) { 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*bitp); 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tc = *bitp++; 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%1x", ((tc >> 4) & 0x0f) & (0x0f << (4 - b))); 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("/%d]", bitlen); 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return lim; 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(".../%d]", bitlen); 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectlabellen(const u_char *cp) 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i; 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(-1); 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = *cp; 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((i & INDIR_MASK) == EDNS0_MASK) { 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int bitlen, elt; 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((elt = (i & ~INDIR_MASK)) != EDNS0_ELT_BITLABEL) { 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("<ELT %d>", elt); 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(-1); 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(cp + 1), 1)) 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(-1); 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((bitlen = *(cp + 1)) == 0) 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bitlen = 256; 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(((bitlen + 7) / 8) + 1); 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(i); 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14753f17a9db278d33517d9888dd77848f554522a38JP Abgrallconst u_char * 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectns_nprint(register const u_char *cp, register const u_char *bp) 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i, l; 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *rp = NULL; 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int compress = 0; 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int chars_processed; 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int elt; 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int data_size = snapend - bp; 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((l = labellen(cp)) == (u_int)-1) 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project chars_processed = 1; 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (((i = *cp++) & INDIR_MASK) != INDIR_MASK) { 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project compress = 0; 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rp = cp + l; 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i != 0) 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (i && cp < snapend) { 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((i & INDIR_MASK) == INDIR_MASK) { 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!compress) { 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rp = cp + 1; 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project compress = 1; 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = bp + (((i << 8) | *cp) & 0x3fff); 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((l = labellen(cp)) == (u_int)-1) 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = *cp++; 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project chars_processed++; 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If we've looked at every character in 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the message, this pointer will make 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * us look at some character again, 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * which means we're looping. 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (chars_processed >= data_size) { 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("<LOOP>"); 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (NULL); 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project continue; 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((i & INDIR_MASK) == EDNS0_MASK) { 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project elt = (i & ~INDIR_MASK); 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(elt) { 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EDNS0_ELT_BITLABEL: 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (blabel_print(cp) == NULL) 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (NULL); 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* unknown ELT */ 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("<ELT %d>", elt); 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fn_printn(cp, l, snapend)) 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += l; 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project chars_processed += l; 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('.'); 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((l = labellen(cp)) == (u_int)-1) 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = *cp++; 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project chars_processed++; 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!compress) 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rp += l + 1; 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('.'); 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (rp); 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* print a <character-string> */ 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectns_cprint(register const u_char *cp) 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i; 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (NULL); 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = *cp++; 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fn_printn(cp, i, snapend)) 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (NULL); 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (cp + i); 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* http://www.iana.org/assignments/dns-parameters */ 24553f17a9db278d33517d9888dd77848f554522a38JP Abgrallconst struct tok ns_type2str[] = { 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_A, "A" }, /* RFC 1035 */ 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_NS, "NS" }, /* RFC 1035 */ 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_MD, "MD" }, /* RFC 1035 */ 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_MF, "MF" }, /* RFC 1035 */ 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_CNAME, "CNAME" }, /* RFC 1035 */ 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_SOA, "SOA" }, /* RFC 1035 */ 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_MB, "MB" }, /* RFC 1035 */ 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_MG, "MG" }, /* RFC 1035 */ 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_MR, "MR" }, /* RFC 1035 */ 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_NULL, "NULL" }, /* RFC 1035 */ 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_WKS, "WKS" }, /* RFC 1035 */ 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_PTR, "PTR" }, /* RFC 1035 */ 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_HINFO, "HINFO" }, /* RFC 1035 */ 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_MINFO, "MINFO" }, /* RFC 1035 */ 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_MX, "MX" }, /* RFC 1035 */ 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_TXT, "TXT" }, /* RFC 1035 */ 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_RP, "RP" }, /* RFC 1183 */ 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_AFSDB, "AFSDB" }, /* RFC 1183 */ 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_X25, "X25" }, /* RFC 1183 */ 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_ISDN, "ISDN" }, /* RFC 1183 */ 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_RT, "RT" }, /* RFC 1183 */ 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_NSAP, "NSAP" }, /* RFC 1706 */ 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_NSAP_PTR, "NSAP_PTR" }, 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_SIG, "SIG" }, /* RFC 2535 */ 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_KEY, "KEY" }, /* RFC 2535 */ 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_PX, "PX" }, /* RFC 2163 */ 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_GPOS, "GPOS" }, /* RFC 1712 */ 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_AAAA, "AAAA" }, /* RFC 1886 */ 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_LOC, "LOC" }, /* RFC 1876 */ 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_NXT, "NXT" }, /* RFC 2535 */ 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_EID, "EID" }, /* Nimrod */ 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_NIMLOC, "NIMLOC" }, /* Nimrod */ 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_SRV, "SRV" }, /* RFC 2782 */ 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_ATMA, "ATMA" }, /* ATM Forum */ 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_NAPTR, "NAPTR" }, /* RFC 2168, RFC 2915 */ 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_KX, "KX" }, /* RFC 2230 */ 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_CERT, "CERT" }, /* RFC 2538 */ 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_A6, "A6" }, /* RFC 2874 */ 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_DNAME, "DNAME" }, /* RFC 2672 */ 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_SINK, "SINK" }, 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_OPT, "OPT" }, /* RFC 2671 */ 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_APL, "APL" }, /* RFC 3123 */ 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_DS, "DS" }, /* RFC 4034 */ 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_SSHFP, "SSHFP" }, /* RFC 4255 */ 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_IPSECKEY, "IPSECKEY" }, /* RFC 4025 */ 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_RRSIG, "RRSIG" }, /* RFC 4034 */ 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_NSEC, "NSEC" }, /* RFC 4034 */ 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_DNSKEY, "DNSKEY" }, /* RFC 4034 */ 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_SPF, "SPF" }, /* RFC-schlitt-spf-classic-02.txt */ 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_UINFO, "UINFO" }, 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_UID, "UID" }, 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_GID, "GID" }, 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_UNSPEC, "UNSPEC" }, 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_UNSPECA, "UNSPECA" }, 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_TKEY, "TKEY" }, /* RFC 2930 */ 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_TSIG, "TSIG" }, /* RFC 2845 */ 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_IXFR, "IXFR" }, /* RFC 1995 */ 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_AXFR, "AXFR" }, /* RFC 1035 */ 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_MAILB, "MAILB" }, /* RFC 1035 */ 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_MAILA, "MAILA" }, /* RFC 1035 */ 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { T_ANY, "ANY" }, 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 31053f17a9db278d33517d9888dd77848f554522a38JP Abgrallconst struct tok ns_class2str[] = { 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { C_IN, "IN" }, /* Not used */ 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { C_CHAOS, "CHAOS" }, 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { C_HS, "HS" }, 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { C_ANY, "ANY" }, 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* print a query */ 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectns_qprint(register const u_char *cp, register const u_char *bp, int is_mdns) 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *np = cp; 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i, class; 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = ns_nskip(cp); 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp == NULL || !TTEST2(*cp, 4)) 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* print the qtype */ 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = EXTRACT_16BITS(cp); 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 2; 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %s", tok2str(ns_type2str, "Type%d", i)); 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* print the qclass (if it's not IN) */ 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = EXTRACT_16BITS(cp); 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 2; 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (is_mdns) 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class = (i & ~C_QU); 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class = i; 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (class != C_IN) 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %s", tok2str(ns_class2str, "(Class %d)", class)); 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (is_mdns) { 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i & C_QU) 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (QU)"); 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (QM)"); 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("? ", stdout); 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = ns_nprint(np, bp); 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(cp ? cp + 4 : NULL); 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* print a reply */ 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char * 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectns_rprint(register const u_char *cp, register const u_char *bp, int is_mdns) 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i, class, opt_flags = 0; 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_short typ, len; 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *rp; 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_nprint(cp, bp)) == NULL) 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = ns_nskip(cp); 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp == NULL || !TTEST2(*cp, 10)) 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (snapend); 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* print the type/qtype */ 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project typ = EXTRACT_16BITS(cp); 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 2; 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* print the class (if it's not IN and the type isn't OPT) */ 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = EXTRACT_16BITS(cp); 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 2; 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (is_mdns) 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class = (i & ~C_CACHE_FLUSH); 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class = i; 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (class != C_IN && typ != T_OPT) 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %s", tok2str(ns_class2str, "(Class %d)", class)); 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (is_mdns) { 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i & C_CACHE_FLUSH) 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (Cache flush)"); 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 39053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (typ == T_OPT) { 39153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* get opt flags */ 39253f17a9db278d33517d9888dd77848f554522a38JP Abgrall cp += 2; 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt_flags = EXTRACT_16BITS(cp); 39453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* ignore rest of ttl field */ 39553f17a9db278d33517d9888dd77848f554522a38JP Abgrall cp += 2; 39653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else if (vflag > 2) { 39753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* print ttl */ 39853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" ["); 39953f17a9db278d33517d9888dd77848f554522a38JP Abgrall relts_print(EXTRACT_32BITS(cp)); 40053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("]"); 40153f17a9db278d33517d9888dd77848f554522a38JP Abgrall cp += 4; 40253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 40353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* ignore ttl */ 40453f17a9db278d33517d9888dd77848f554522a38JP Abgrall cp += 4; 40553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = EXTRACT_16BITS(cp); 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 2; 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rp = cp + len; 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %s", tok2str(ns_type2str, "Type%d", typ)); 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rp > snapend) 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (typ) { 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_A: 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, sizeof(struct in_addr))) 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 42053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" %s", intoa(htonl(EXTRACT_32BITS(cp)))); 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_NS: 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_CNAME: 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_PTR: 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef T_DNAME 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_DNAME: 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ns_nprint(cp, bp) == NULL) 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_SOA: 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!vflag) 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_nprint(cp, bp)) == NULL) 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_nprint(cp, bp)) == NULL) 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 5 * 4)) 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %u", EXTRACT_32BITS(cp)); 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 4; 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %u", EXTRACT_32BITS(cp)); 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 4; 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %u", EXTRACT_32BITS(cp)); 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 4; 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %u", EXTRACT_32BITS(cp)); 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 4; 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %u", EXTRACT_32BITS(cp)); 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 4; 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_MX: 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 2)) 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ns_nprint(cp + 2, bp) == NULL) 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %d", EXTRACT_16BITS(cp)); 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_TXT: 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (cp < rp) { 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" \""); 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = ns_cprint(cp); 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp == NULL) 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('"'); 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_SRV: 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 6)) 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ns_nprint(cp + 6, bp) == NULL) 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(":%d %d %d", EXTRACT_16BITS(cp + 4), 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(cp), EXTRACT_16BITS(cp + 2)); 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_AAAA: 48753f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 48853f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct in6_addr addr; 48953f17a9db278d33517d9888dd77848f554522a38JP Abgrall char ntop_buf[INET6_ADDRSTRLEN]; 49053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, sizeof(struct in6_addr))) 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 49353f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&addr, cp, sizeof(struct in6_addr)); 49453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" %s", 49553f17a9db278d33517d9888dd77848f554522a38JP Abgrall inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf))); 49653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 49853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_A6: 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in6_addr a; 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int pbit, pbyte; 50453f17a9db278d33517d9888dd77848f554522a38JP Abgrall char ntop_buf[INET6_ADDRSTRLEN]; 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 1)) 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbit = *cp; 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbyte = (pbit & ~7) / 8; 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pbit > 128) { 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %u(bad plen)", pbit); 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (pbit < 128) { 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(cp + 1), sizeof(a) - pbyte)) 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&a, 0, sizeof(a)); 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&a.s6_addr[pbyte], cp + 1, sizeof(a) - pbyte); 51853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" %u %s", pbit, 51953f17a9db278d33517d9888dd77848f554522a38JP Abgrall inet_ntop(AF_INET6, &a, ntop_buf, sizeof(ntop_buf))); 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pbit > 0) { 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ns_nprint(cp + 1 + sizeof(a) - pbyte, bp) == NULL) 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/ 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_OPT: 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" UDPsize=%u", class); 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_flags & 0x8000) 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" OK"); 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_UNSPECA: /* One long string */ 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, len)) 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fn_printn(cp, len, snapend)) 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_TSIG: 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp + len > snapend) 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!vflag) 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_nprint(cp, bp)) == NULL) 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 6; 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 2)) 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" fudge=%u", EXTRACT_16BITS(cp)); 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 2; 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 2)) 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" maclen=%u", EXTRACT_16BITS(cp)); 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 2 + EXTRACT_16BITS(cp); 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 2)) 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" origid=%u", EXTRACT_16BITS(cp)); 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 2; 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 2)) 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" error=%u", EXTRACT_16BITS(cp)); 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 2; 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 2)) 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(NULL); 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" otherlen=%u", EXTRACT_16BITS(cp)); 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 2; 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (rp); /* XXX This isn't always right */ 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectns_print(register const u_char *bp, u_int length, int is_mdns) 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const HEADER *np; 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int qdcount, ancount, nscount, arcount; 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *cp; 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t b2; 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project np = (const HEADER *)bp; 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*np); 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* get the byte-order right */ 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project qdcount = EXTRACT_16BITS(&np->qdcount); 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ancount = EXTRACT_16BITS(&np->ancount); 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nscount = EXTRACT_16BITS(&np->nscount); 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project arcount = EXTRACT_16BITS(&np->arcount); 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DNS_QR(np)) { 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this is a response */ 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%d%s%s%s%s%s%s", 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&np->id), 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ns_ops[DNS_OPCODE(np)], 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ns_resp[DNS_RCODE(np)], 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project DNS_AA(np)? "*" : "", 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project DNS_RA(np)? "" : "-", 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project DNS_TC(np)? "|" : "", 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project DNS_AD(np)? "$" : ""); 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (qdcount != 1) 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [%dq]", qdcount); 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Print QUESTION section on -vv */ 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = (const u_char *)(np + 1); 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (qdcount--) { 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (qdcount < EXTRACT_16BITS(&np->qdcount) - 1) 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(','); 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag > 1) { 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(" q:", stdout); 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_qprint(cp, bp, is_mdns)) == NULL) 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_nskip(cp)) == NULL) 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += 4; /* skip QTYPE and QCLASS */ 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %d/%d/%d", ancount, nscount, arcount); 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ancount--) { 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (cp < snapend && ancount--) { 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(','); 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ancount > 0) 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Print NS and AR sections on -vv */ 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag > 1) { 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp < snapend && nscount--) { 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(" ns:", stdout); 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (cp < snapend && nscount--) { 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(','); 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (nscount > 0) 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp < snapend && arcount--) { 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(" ar:", stdout); 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (cp < snapend && arcount--) { 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(','); 6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (arcount > 0) 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this is a request */ 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%d%s%s%s", EXTRACT_16BITS(&np->id), ns_ops[DNS_OPCODE(np)], 6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project DNS_RD(np) ? "+" : "", 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project DNS_CD(np) ? "%" : ""); 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* any weirdness? */ 6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project b2 = EXTRACT_16BITS(((u_short *)np)+1); 6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (b2 & 0x6cf) 6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [b2&3=0x%x]", b2); 6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DNS_OPCODE(np) == IQUERY) { 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (qdcount) 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [%dq]", qdcount); 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ancount != 1) 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [%da]", ancount); 6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ancount) 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [%da]", ancount); 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (qdcount != 1) 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [%dq]", qdcount); 6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (nscount) 6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [%dn]", nscount); 6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (arcount) 6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [%dau]", arcount); 6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = (const u_char *)(np + 1); 6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (qdcount--) { 6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = ns_qprint(cp, (const u_char *)np, is_mdns); 6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!cp) 6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (cp < snapend && qdcount--) { 6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = ns_qprint((const u_char *)cp, 6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (const u_char *)np, 6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project is_mdns); 6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!cp) 7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (qdcount > 0) 7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Print remaining sections on -vv */ 7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag > 1) { 7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ancount--) { 7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (cp < snapend && ancount--) { 7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(','); 7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ancount > 0) 7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp < snapend && nscount--) { 7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(" ns:", stdout); 7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (nscount-- && cp < snapend) { 7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(','); 7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (nscount > 0) 7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp < snapend && arcount--) { 7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(" ar:", stdout); 7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (cp < snapend && arcount--) { 7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(','); 7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((cp = ns_rprint(cp, bp, is_mdns)) == NULL) 7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (arcount > 0) 7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (%d)", length); 7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc: 7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|domain]"); 7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 752