X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/46de5c986cf345056c6685618db1cf1f0198f596..8f94d68a09e1103353cc7d1133d6dfdf7d5a920d:/print-domain.c diff --git a/print-domain.c b/print-domain.c index c0a4be5b..0ffa872d 100644 --- a/print-domain.c +++ b/print-domain.c @@ -21,24 +21,15 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-domain.c,v 1.75 2001-02-23 08:55:21 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-domain.c,v 1.84 2003-04-04 03:49:25 fenner Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include -#include +#include -#include - -#ifdef NOERROR -#undef NOERROR /* Solaris sucks */ -#endif -#ifdef NOERROR -#undef T_UNSPEC /* SINIX does too */ -#endif #include "nameser.h" #include @@ -48,13 +39,13 @@ static const char rcsid[] = #include "addrtoname.h" #include "extract.h" /* must come after interface.h */ -static char *ns_ops[] = { +static const char *ns_ops[] = { "", " inv_q", " stat", " op3", " notify", " update", " op6", " op7", " op8", " updataA", " updateD", " updateDA", " updateM", " updateMA", " zoneInit", " zoneRef", }; -static char *ns_resp[] = { +static const char *ns_resp[] = { "", " FormErr", " ServFail", " NXDomain", " NotImp", " Refused", " YXDomain", " YXRRSet", " NXRRSet", " NotAuth", " NotZone", " Resp11", @@ -63,15 +54,16 @@ static char *ns_resp[] = { /* skip over a domain name */ static const u_char * -ns_nskip(register const u_char *cp, register const u_char *bp) +ns_nskip(register const u_char *cp) { register u_char i; if (!TTEST2(*cp, 1)) return (NULL); - if (((i = *cp++) & INDIR_MASK) == INDIR_MASK) - return (cp + 1); + i = *cp++; while (i) { + if ((i & INDIR_MASK) == INDIR_MASK) + return (cp + 1); if ((i & INDIR_MASK) == EDNS0_MASK) { int bitlen, bytelen; @@ -161,7 +153,7 @@ ns_nprint(register const u_char *cp, register const u_char *bp) int elt; int data_size = snapend - bp; - if ((l = labellen(cp)) < 0) + if ((l = labellen(cp)) == (u_int)-1) return(NULL); if (!TTEST2(*cp, 1)) return(NULL); @@ -181,7 +173,7 @@ ns_nprint(register const u_char *cp, register const u_char *bp) if (!TTEST2(*cp, 1)) return(NULL); cp = bp + (((i << 8) | *cp) & 0x3fff); - if ((l = labellen(cp)) < 0) + if ((l = labellen(cp)) == (u_int)-1) return(NULL); if (!TTEST2(*cp, 1)) return(NULL); @@ -220,7 +212,7 @@ ns_nprint(register const u_char *cp, register const u_char *bp) cp += l; chars_processed += l; putchar('.'); - if ((l = labellen(cp)) < 0) + if ((l = labellen(cp)) == (u_int)-1) return(NULL); if (!TTEST2(*cp, 1)) return(NULL); @@ -236,7 +228,7 @@ ns_nprint(register const u_char *cp, register const u_char *bp) /* print a */ static const u_char * -ns_cprint(register const u_char *cp, register const u_char *bp) +ns_cprint(register const u_char *cp) { register u_int i; @@ -248,56 +240,57 @@ ns_cprint(register const u_char *cp, register const u_char *bp) return (cp + i); } +/* http://www.iana.org/assignments/dns-parameters */ struct tok ns_type2str[] = { - { T_A, "A" }, - { T_NS, "NS" }, - { T_MD, "MD" }, - { T_MF, "MF" }, - { T_CNAME, "CNAME" }, - { T_SOA, "SOA" }, - { T_MB, "MB" }, - { T_MG, "MG" }, - { T_MR, "MR" }, - { T_NULL, "NULL" }, - { T_WKS, "WKS" }, - { T_PTR, "PTR" }, - { T_HINFO, "HINFO" }, - { T_MINFO, "MINFO" }, - { T_MX, "MX" }, - { T_TXT, "TXT" }, - { T_RP, "RP" }, - { T_AFSDB, "AFSDB" }, - { T_X25, "X25" }, - { T_ISDN, "ISDN" }, - { T_RT, "RT" }, - { T_NSAP, "NSAP" }, + { T_A, "A" }, /* RFC 1035 */ + { T_NS, "NS" }, /* RFC 1035 */ + { T_MD, "MD" }, /* RFC 1035 */ + { T_MF, "MF" }, /* RFC 1035 */ + { T_CNAME, "CNAME" }, /* RFC 1035 */ + { T_SOA, "SOA" }, /* RFC 1035 */ + { T_MB, "MB" }, /* RFC 1035 */ + { T_MG, "MG" }, /* RFC 1035 */ + { T_MR, "MR" }, /* RFC 1035 */ + { T_NULL, "NULL" }, /* RFC 1035 */ + { T_WKS, "WKS" }, /* RFC 1035 */ + { T_PTR, "PTR" }, /* RFC 1035 */ + { T_HINFO, "HINFO" }, /* RFC 1035 */ + { T_MINFO, "MINFO" }, /* RFC 1035 */ + { T_MX, "MX" }, /* RFC 1035 */ + { T_TXT, "TXT" }, /* RFC 1035 */ + { T_RP, "RP" }, /* RFC 1183 */ + { T_AFSDB, "AFSDB" }, /* RFC 1183 */ + { T_X25, "X25" }, /* RFC 1183 */ + { T_ISDN, "ISDN" }, /* RFC 1183 */ + { T_RT, "RT" }, /* RFC 1183 */ + { T_NSAP, "NSAP" }, /* RFC 1706 */ { T_NSAP_PTR, "NSAP_PTR" }, - { T_SIG, "SIG" }, - { T_KEY, "KEY" }, - { T_PX, "PX" }, - { T_GPOS, "GPOS" }, - { T_AAAA, "AAAA" }, - { T_LOC, "LOC" }, - { T_NXT, "NXT" }, - { T_EID, "EID" }, - { T_NIMLOC, "NIMLOC" }, - { T_SRV, "SRV" }, - { T_ATMA, "ATMA" }, - { T_NAPTR, "NAPTR" }, - { T_A6, "A6" }, - { T_DNAME, "DNAME" }, - { T_OPT, "OPT" }, + { T_SIG, "SIG" }, /* RFC 2535 */ + { T_KEY, "KEY" }, /* RFC 2535 */ + { T_PX, "PX" }, /* RFC 2163 */ + { T_GPOS, "GPOS" }, /* RFC 1712 */ + { T_AAAA, "AAAA" }, /* RFC 1886 */ + { T_LOC, "LOC" }, /* RFC 1876 */ + { T_NXT, "NXT" }, /* RFC 2535 */ + { T_EID, "EID" }, /* Nimrod */ + { T_NIMLOC, "NIMLOC" }, /* Nimrod */ + { T_SRV, "SRV" }, /* RFC 2782 */ + { T_ATMA, "ATMA" }, /* ATM Forum */ + { T_NAPTR, "NAPTR" }, /* RFC 2168, RFC 2915 */ + { T_A6, "A6" }, /* RFC 2874 */ + { T_DNAME, "DNAME" }, /* RFC 2672 */ + { T_OPT, "OPT" }, /* RFC 2671 */ { T_UINFO, "UINFO" }, { T_UID, "UID" }, { T_GID, "GID" }, { T_UNSPEC, "UNSPEC" }, { T_UNSPECA, "UNSPECA" }, - { T_TKEY, "TKEY" }, - { T_TSIG, "TSIG" }, - { T_IXFR, "IXFR" }, - { T_AXFR, "AXFR" }, - { T_MAILB, "MAILB" }, - { T_MAILA, "MAILA" }, + { T_TKEY, "TKEY" }, /* RFC 2930 */ + { T_TSIG, "TSIG" }, /* RFC 2845 */ + { T_IXFR, "IXFR" }, /* RFC 1995 */ + { T_AXFR, "AXFR" }, /* RFC 1035 */ + { T_MAILB, "MAILB" }, /* RFC 1035 */ + { T_MAILA, "MAILA" }, /* RFC 1035 */ { T_ANY, "ANY" }, { 0, NULL } }; @@ -317,17 +310,17 @@ ns_qprint(register const u_char *cp, register const u_char *bp) register const u_char *np = cp; register u_int i; - cp = ns_nskip(cp, bp); + cp = ns_nskip(cp); if (cp == NULL || !TTEST2(*cp, 4)) return(NULL); /* print the qtype and qclass (if it's not IN) */ - i = *cp++ << 8; - i |= *cp++; + i = EXTRACT_16BITS(cp); + cp += 2; printf(" %s", tok2str(ns_type2str, "Type%d", i)); - i = *cp++ << 8; - i |= *cp++; + i = EXTRACT_16BITS(cp); + cp += 2; if (i != C_IN) printf(" %s", tok2str(ns_class2str, "(Class %d)", i)); @@ -349,24 +342,24 @@ ns_rprint(register const u_char *cp, register const u_char *bp) if ((cp = ns_nprint(cp, bp)) == NULL) return NULL; } else - cp = ns_nskip(cp, bp); + cp = ns_nskip(cp); if (cp == NULL || !TTEST2(*cp, 10)) return (snapend); /* print the type/qtype and class (if it's not IN) */ - typ = *cp++ << 8; - typ |= *cp++; - class = *cp++ << 8; - class |= *cp++; + typ = EXTRACT_16BITS(cp); + cp += 2; + class = EXTRACT_16BITS(cp); + cp += 2; if (class != C_IN && typ != T_OPT) printf(" %s", tok2str(ns_class2str, "(Class %d)", class)); /* ignore ttl */ cp += 4; - len = *cp++ << 8; - len |= *cp++; + len = EXTRACT_16BITS(cp); + cp += 2; rp = cp + len; @@ -424,8 +417,23 @@ ns_rprint(register const u_char *cp, register const u_char *bp) break; case T_TXT: + while (cp < rp) { + printf(" \""); + cp = ns_cprint(cp); + if (cp == NULL) + return(NULL); + putchar('"'); + } + break; + + case T_SRV: putchar(' '); - (void)ns_cprint(cp, bp); + if (!TTEST2(*cp, 6)) + return(NULL); + if (ns_nprint(cp + 6, bp) == NULL) + return(NULL); + printf(":%d %d %d", EXTRACT_16BITS(cp + 4), + EXTRACT_16BITS(cp), EXTRACT_16BITS(cp + 2)); break; #ifdef INET6 @@ -514,20 +522,21 @@ ns_print(register const u_char *bp, u_int length) { register const HEADER *np; register int qdcount, ancount, nscount, arcount; - register const u_char *cp = NULL; + register const u_char *cp; + u_int16_t b2; np = (const HEADER *)bp; TCHECK(*np); /* get the byte-order right */ - qdcount = ntohs(np->qdcount); - ancount = ntohs(np->ancount); - nscount = ntohs(np->nscount); - arcount = ntohs(np->arcount); + qdcount = EXTRACT_16BITS(&np->qdcount); + ancount = EXTRACT_16BITS(&np->ancount); + nscount = EXTRACT_16BITS(&np->nscount); + arcount = EXTRACT_16BITS(&np->arcount); if (DNS_QR(np)) { /* this is a response */ printf(" %d%s%s%s%s%s%s", - ntohs(np->id), + EXTRACT_16BITS(&np->id), ns_ops[DNS_OPCODE(np)], ns_resp[DNS_RCODE(np)], DNS_AA(np)? "*" : "", @@ -540,16 +549,14 @@ ns_print(register const u_char *bp, u_int length) /* Print QUESTION section on -vv */ cp = (const u_char *)(np + 1); while (qdcount--) { - if (qdcount < ntohs(np->qdcount) - 1) + if (qdcount < EXTRACT_16BITS(&np->qdcount) - 1) putchar(','); if (vflag > 1) { fputs(" q:", stdout); - if ((cp = ns_qprint((const u_char *)(np + 1), bp)) - == NULL) + if ((cp = ns_qprint(cp, bp)) == NULL) goto trunc; } else { - if ((cp = ns_nskip((const u_char *)(np + 1), bp)) - == NULL) + if ((cp = ns_nskip(cp)) == NULL) goto trunc; cp += 4; /* skip QTYPE and QCLASS */ } @@ -596,13 +603,14 @@ ns_print(register const u_char *bp, u_int length) } else { /* this is a request */ - printf(" %d%s%s%s", ntohs(np->id), ns_ops[DNS_OPCODE(np)], + printf(" %d%s%s%s", EXTRACT_16BITS(&np->id), ns_ops[DNS_OPCODE(np)], DNS_RD(np) ? "+" : "", DNS_AD(np) ? "$" : ""); /* any weirdness? */ - if (*(((u_short *)np)+1) & htons(0x6cf)) - printf(" [b2&3=0x%x]", ntohs(*(((u_short *)np)+1))); + b2 = EXTRACT_16BITS(((u_short *)np)+1); + if (b2 & 0x6cf) + printf(" [b2&3=0x%x]", b2); if (DNS_OPCODE(np) == IQUERY) { if (qdcount) @@ -621,9 +629,9 @@ ns_print(register const u_char *bp, u_int length) if (arcount) printf(" [%dau]", arcount); + cp = (const u_char *)(np + 1); if (qdcount--) { - cp = ns_qprint((const u_char *)(np + 1), - (const u_char *)np); + cp = ns_qprint(cp, (const u_char *)np); if (!cp) goto trunc; while (cp < snapend && qdcount--) {