Annotation of 43BSDReno/usr.sbin/named/tools/nslookup/debug.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1985,1989 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted provided
        !             6:  * that: (1) source distributions retain this entire copyright notice and
        !             7:  * comment, and (2) distributions including binaries display the following
        !             8:  * acknowledgement:  ``This product includes software developed by the
        !             9:  * University of California, Berkeley and its contributors'' in the
        !            10:  * documentation or other materials provided with the distribution and in
        !            11:  * all advertising materials mentioning features or use of this software.
        !            12:  * Neither the name of the University nor the names of its contributors may
        !            13:  * be used to endorse or promote products derived from this software without
        !            14:  * specific prior written permission.
        !            15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            16:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            17:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            18:  */
        !            19: 
        !            20: #ifndef lint
        !            21: static char sccsid[] = "@(#)debug.c    5.22 (Berkeley) 6/29/90";
        !            22: #endif /* not lint */
        !            23: 
        !            24: /*
        !            25:  *******************************************************************************
        !            26:  *
        !            27:  *  debug.c --
        !            28:  *
        !            29:  *     Routines to print out packets received from a name server query.
        !            30:  *
        !            31:  *      Modified version of 4.3BSD BIND res_debug.c 5.30 6/27/90
        !            32:  *
        !            33:  *******************************************************************************
        !            34:  */
        !            35: 
        !            36: #include <sys/types.h>
        !            37: #include <netinet/in.h>
        !            38: #include <stdio.h>
        !            39: #include <arpa/nameser.h>
        !            40: #include <arpa/inet.h>
        !            41: #include <resolv.h>
        !            42: #include <netdb.h>
        !            43: #include "res.h"
        !            44: 
        !            45: extern char ctime();
        !            46: 
        !            47: /*
        !            48:  *  Imported from res_debug.c
        !            49:  */
        !            50: extern char *_res_resultcodes[];
        !            51: extern char *_res_opcodes[];
        !            52: 
        !            53: /*
        !            54:  *  Used to highlight the start of a record when printing it.
        !            55:  */
        !            56: #define INDENT "    ->  "
        !            57: 
        !            58: 
        !            59: 
        !            60: /*
        !            61:  * Print the contents of a query.
        !            62:  * This is intended to be primarily a debugging routine.
        !            63:  */
        !            64: 
        !            65: Print_query(msg, eom, printHeader)
        !            66:        char *msg, *eom;
        !            67:        int printHeader;
        !            68: {
        !            69:        Fprint_query(msg, eom, printHeader,stdout);
        !            70: }
        !            71: 
        !            72: Fprint_query(msg, eom, printHeader,file)
        !            73:        char *msg, *eom;
        !            74:        int printHeader;
        !            75:        FILE *file;
        !            76: {
        !            77:        register char *cp;
        !            78:        register HEADER *hp;
        !            79:        register int n;
        !            80:        short class;
        !            81:        short type;
        !            82: 
        !            83:        /*
        !            84:         * Print header fields.
        !            85:         */
        !            86:        hp = (HEADER *)msg;
        !            87:        cp = msg + sizeof(HEADER);
        !            88:        if (printHeader || (_res.options & RES_DEBUG2)) {
        !            89:            fprintf(file,"    HEADER:\n");
        !            90:            fprintf(file,"\topcode = %s", _res_opcodes[hp->opcode]);
        !            91:            fprintf(file,", id = %d", ntohs(hp->id));
        !            92:            fprintf(file,", rcode = %s\n", _res_resultcodes[hp->rcode]);
        !            93:            fprintf(file,"\theader flags: ");
        !            94:            if (hp->qr) {
        !            95:                    fprintf(file," response");
        !            96:            } else {
        !            97:                    fprintf(file," query");
        !            98:            }
        !            99:            if (hp->aa)
        !           100:                    fprintf(file,", auth. answer");
        !           101:            if (hp->tc)
        !           102:                    fprintf(file,", truncation");
        !           103:            if (hp->rd)
        !           104:                    fprintf(file,", want recursion");
        !           105:            if (hp->ra)
        !           106:                    fprintf(file,", recursion avail.");
        !           107:            if (hp->pr)
        !           108:                    fprintf(file,", primary");
        !           109:            fprintf(file,"\n\tquestions = %d", ntohs(hp->qdcount));
        !           110:            fprintf(file,",  answers = %d", ntohs(hp->ancount));
        !           111:            fprintf(file,",  authority records = %d", ntohs(hp->nscount));
        !           112:            fprintf(file,",  additional = %d\n\n", ntohs(hp->arcount));
        !           113:        }
        !           114: 
        !           115:        /*
        !           116:         * Print question records.
        !           117:         */
        !           118:        if (n = ntohs(hp->qdcount)) {
        !           119:                fprintf(file,"    QUESTIONS:\n");
        !           120:                while (--n >= 0) {
        !           121:                        fprintf(file,"\t");
        !           122:                        cp = Print_cdname(cp, msg, eom, file);
        !           123:                        if (cp == NULL)
        !           124:                                return;
        !           125:                        type = _getshort(cp);
        !           126:                        cp += sizeof(u_short);
        !           127:                        class = _getshort(cp);
        !           128:                        cp += sizeof(u_short);
        !           129:                        fprintf(file,", type = %s", p_type(type));
        !           130:                        fprintf(file,", class = %s\n", p_class(class));
        !           131:                }
        !           132:        }
        !           133:        /*
        !           134:         * Print authoritative answer records
        !           135:         */
        !           136:        if (n = ntohs(hp->ancount)) {
        !           137:                fprintf(file,"    ANSWERS:\n");
        !           138:                while (--n >= 0) {
        !           139:                        fprintf(file, INDENT);
        !           140:                        cp = Print_rr(cp, msg, eom, file);
        !           141:                        if (cp == NULL)
        !           142:                                return;
        !           143:                }
        !           144:        }
        !           145:        /*
        !           146:         * print name server records
        !           147:         */
        !           148:        if (n = ntohs(hp->nscount)) {
        !           149:                fprintf(file,"    AUTHORITY RECORDS:\n");
        !           150:                while (--n >= 0) {
        !           151:                        fprintf(file, INDENT);
        !           152:                        cp = Print_rr(cp, msg, eom, file);
        !           153:                        if (cp == NULL)
        !           154:                                return;
        !           155:                }
        !           156:        }
        !           157:        /*
        !           158:         * print additional records
        !           159:         */
        !           160:        if (n = ntohs(hp->arcount)) {
        !           161:                fprintf(file,"    ADDITIONAL RECORDS:\n");
        !           162:                while (--n >= 0) {
        !           163:                        fprintf(file, INDENT);
        !           164:                        cp = Print_rr(cp, msg, eom, file);
        !           165:                        if (cp == NULL)
        !           166:                                return;
        !           167:                }
        !           168:        }
        !           169:        fprintf(file,"\n------------\n");
        !           170: }
        !           171: 
        !           172: 
        !           173: char *
        !           174: Print_cdname_sub(cp, msg, eom, file, format)
        !           175:        char *cp, *msg, *eom;
        !           176:        FILE *file;
        !           177:        int format;
        !           178: {
        !           179:        int n;
        !           180:        char name[MAXDNAME];
        !           181:        extern char *strcpy();
        !           182: 
        !           183:        if ((n = dn_expand(msg, eom, cp, name, sizeof(name))) < 0)
        !           184:                return (NULL);
        !           185:        if (name[0] == '\0') {
        !           186:            (void) strcpy(name, "(root)");
        !           187:        }
        !           188:        if (format) {
        !           189:            fprintf(file, "%-30s", name);
        !           190:        } else {
        !           191:            fputs(name, file);
        !           192:        }
        !           193:        return (cp + n);
        !           194: }
        !           195: 
        !           196: char *
        !           197: Print_cdname(cp, msg, eom, file)
        !           198:        char *cp, *msg, *eom;
        !           199:        FILE *file;
        !           200: {
        !           201:     return(Print_cdname_sub(cp, msg, eom, file, 0));
        !           202: }
        !           203: 
        !           204: char *
        !           205: Print_cdname2(cp, msg, eom, file)
        !           206:        char *cp, *msg, *eom;
        !           207:        FILE *file;
        !           208: {
        !           209:     return(Print_cdname_sub(cp, msg, eom, file, 1));
        !           210: }
        !           211: 
        !           212: /*
        !           213:  * Print resource record fields in human readable form.
        !           214:  */
        !           215: char *
        !           216: Print_rr(cp, msg, eom, file)
        !           217:        char *cp, *msg, *eom;
        !           218:        FILE *file;
        !           219: {
        !           220:        int type, class, dlen, n, c;
        !           221:        unsigned long rrttl, ttl;
        !           222:        struct in_addr inaddr;
        !           223:        char *cp1, *cp2;
        !           224:        int debug;
        !           225: 
        !           226:        if ((cp = Print_cdname(cp, msg, eom, file)) == NULL) {
        !           227:                fprintf(file, "(name truncated?)\n");
        !           228:                return (NULL);                  /* compression error */
        !           229:        }
        !           230: 
        !           231:        type = _getshort(cp);
        !           232:        cp += sizeof(u_short);
        !           233:        class = _getshort(cp);
        !           234:        cp += sizeof(u_short);
        !           235:        rrttl = _getlong(cp);
        !           236:        cp += sizeof(u_long);
        !           237:        dlen = _getshort(cp);
        !           238:        cp += sizeof(u_short);
        !           239: 
        !           240:        debug = _res.options & (RES_DEBUG|RES_DEBUG2);
        !           241:        if (debug) {
        !           242:            if (_res.options & RES_DEBUG2) {
        !           243:                fprintf(file,"\n\ttype = %s, class = %s, dlen = %d",
        !           244:                            p_type(type), p_class(class), dlen);
        !           245:            }
        !           246:            if (type == T_SOA) {
        !           247:                fprintf(file,"\n\tttl = %lu (%s)", rrttl, p_time(rrttl));
        !           248:            }
        !           249:            (void) putc('\n', file);
        !           250:        } 
        !           251: 
        !           252:        cp1 = cp;
        !           253: 
        !           254:        /*
        !           255:         * Print type specific data, if appropriate
        !           256:         */
        !           257:        switch (type) {
        !           258:        case T_A:
        !           259:                switch (class) {
        !           260:                case C_IN:
        !           261:                case C_HS:
        !           262:                        bcopy(cp, (char *)&inaddr, sizeof(inaddr));
        !           263:                        if (dlen == 4) {
        !           264:                                fprintf(file,"\tinternet address = %s\n",
        !           265:                                        inet_ntoa(inaddr));
        !           266:                                cp += dlen;
        !           267:                        } else if (dlen == 7) {
        !           268:                                fprintf(file,"\tinternet address = %s",
        !           269:                                        inet_ntoa(inaddr));
        !           270:                                fprintf(file,", protocol = %d", cp[4]);
        !           271:                                fprintf(file,", port = %d\n",
        !           272:                                        (cp[5] << 8) + cp[6]);
        !           273:                                cp += dlen;
        !           274:                        }
        !           275:                        break;
        !           276:                default:
        !           277:                        fprintf(file,"\taddress, class = %d, len = %d\n",
        !           278:                            class, dlen);
        !           279:                        cp += dlen;
        !           280:                }
        !           281:                break;
        !           282: 
        !           283:        case T_CNAME:
        !           284:                fprintf(file,"\tcanonical name = ");
        !           285:                goto doname;
        !           286: 
        !           287:        case T_MG:
        !           288:                fprintf(file,"\tmail group member = ");
        !           289:                goto doname;
        !           290:        case T_MB:
        !           291:                fprintf(file,"\tmail box = ");
        !           292:                goto doname;
        !           293:        case T_MR:
        !           294:                fprintf(file,"\tmailbox rename = ");
        !           295:                goto doname;
        !           296:        case T_MX:
        !           297:                fprintf(file,"\tpreference = %u",_getshort(cp));
        !           298:                cp += sizeof(u_short);
        !           299:                fprintf(file,", mail exchanger = ");
        !           300:                goto doname;
        !           301:        case T_NS:
        !           302:                fprintf(file,"\tnameserver = ");
        !           303:                goto doname;
        !           304:        case T_PTR:
        !           305:                fprintf(file,"\tname = ");
        !           306: doname:
        !           307:                cp = Print_cdname(cp, msg, eom, file);
        !           308:                (void) putc('\n', file);
        !           309:                break;
        !           310: 
        !           311:        case T_HINFO:
        !           312:                if (n = *cp++) {
        !           313:                        fprintf(file,"\tCPU = %.*s", n, cp);
        !           314:                        cp += n;
        !           315:                }
        !           316:                if (n = *cp++) {
        !           317:                        fprintf(file,"\tOS = %.*s\n", n, cp);
        !           318:                        cp += n;
        !           319:                }
        !           320:                break;
        !           321: 
        !           322:        case T_SOA:
        !           323:                if (!debug)
        !           324:                    (void) putc('\n', file);
        !           325:                fprintf(file,"\torigin = ");
        !           326:                cp = Print_cdname(cp, msg, eom, file);
        !           327:                fprintf(file,"\n\tmail addr = ");
        !           328:                cp = Print_cdname(cp, msg, eom, file);
        !           329:                fprintf(file,"\n\tserial = %lu", _getlong(cp));
        !           330:                cp += sizeof(u_long);
        !           331:                ttl = _getlong(cp);
        !           332:                fprintf(file,"\n\trefresh = %lu (%s)", ttl, p_time(ttl));
        !           333:                cp += sizeof(u_long);
        !           334:                ttl = _getlong(cp);
        !           335:                fprintf(file,"\n\tretry   = %lu (%s)", ttl, p_time(ttl));
        !           336:                cp += sizeof(u_long);
        !           337:                ttl = _getlong(cp);
        !           338:                fprintf(file,"\n\texpire  = %lu (%s)", ttl, p_time(ttl));
        !           339:                cp += sizeof(u_long);
        !           340:                ttl = _getlong(cp);
        !           341:                fprintf(file,"\n\tminimum ttl = %lu (%s)\n", ttl, p_time(ttl));
        !           342:                cp += sizeof(u_long);
        !           343:                break;
        !           344: 
        !           345:        case T_MINFO:
        !           346:                if (!debug)
        !           347:                    (void) putc('\n', file);
        !           348:                fprintf(file,"\trequests = ");
        !           349:                cp = Print_cdname(cp, msg, eom, file);
        !           350:                fprintf(file,"\n\terrors = ");
        !           351:                cp = Print_cdname(cp, msg, eom, file);
        !           352:                (void) putc('\n', file);
        !           353:                break;
        !           354: 
        !           355:        case T_TXT:
        !           356:                (void) fputs("\ttext = \"", file);
        !           357:                cp2 = cp1 + dlen;
        !           358:                while (cp < cp2) {
        !           359:                        if (n = (unsigned char) *cp++) {
        !           360:                                for (c = n; c > 0 && cp < cp2; c--)
        !           361:                                        if (*cp == '\n') {
        !           362:                                            (void) putc('\\', file);
        !           363:                                            (void) putc(*cp++, file);
        !           364:                                        } else
        !           365:                                            (void) putc(*cp++, file);
        !           366:                        }
        !           367:                }
        !           368:                (void) fputs("\"\n", file);
        !           369:                break;
        !           370: 
        !           371:        case T_UINFO:
        !           372:                fprintf(file,"\tuser info = %s\n", cp);
        !           373:                cp += dlen;
        !           374:                break;
        !           375: 
        !           376:        case T_UID:
        !           377:        case T_GID:
        !           378:                if (dlen == 4) {
        !           379:                        fprintf(file,"\t%cid = %lu\n",type == T_UID ? 'u' : 'g',
        !           380:                            _getlong(cp));
        !           381:                        cp += sizeof(int);
        !           382:                } else {
        !           383:                        fprintf(file,"\t%cid of length %d?\n",
        !           384:                            type == T_UID ? 'u' : 'g', dlen);
        !           385:                        cp += dlen;
        !           386:                }
        !           387:                break;
        !           388: 
        !           389:        case T_WKS: {
        !           390:                struct protoent *protoPtr;
        !           391: 
        !           392:                if (dlen < sizeof(u_long) + 1)
        !           393:                        break;
        !           394:                if (!debug)
        !           395:                    (void) putc('\n', file);
        !           396:                bcopy(cp, (char *)&inaddr, sizeof(inaddr));
        !           397:                cp += sizeof(u_long);
        !           398:                if ((protoPtr = getprotobynumber(*cp)) != NULL) {
        !           399:                    fprintf(file,"\tinet address = %s, protocol = %s\n\t",
        !           400:                        inet_ntoa(inaddr), protoPtr->p_name);
        !           401:                } else {
        !           402:                    fprintf(file,"\tinet address = %s, protocol = %d\n\t",
        !           403:                        inet_ntoa(inaddr), *cp);
        !           404:                }
        !           405:                cp++;
        !           406:                n = 0;
        !           407:                while (cp < cp1 + dlen) {
        !           408:                        c = *cp++;
        !           409:                        do {
        !           410:                                struct servent *s;
        !           411: 
        !           412:                                if (c & 0200) {
        !           413:                                        s = getservbyport(n, NULL);
        !           414:                                        if (s != NULL) {
        !           415:                                            fprintf(file,"  %s", s->s_name);
        !           416:                                        } else {
        !           417:                                            fprintf(file," #%d", n);
        !           418:                                        }
        !           419:                                }
        !           420:                                c <<= 1;
        !           421:                        } while (++n & 07);
        !           422:                }
        !           423:                putc('\n',file);
        !           424:            }
        !           425:            break;
        !           426: 
        !           427:        case T_NULL:
        !           428:                fprintf(file, "\tNULL (dlen %d)\n", dlen);
        !           429:                cp += dlen;
        !           430:                break;
        !           431: 
        !           432:        default:
        !           433:                fprintf(file,"\t??? unknown type %d ???\n", type);
        !           434:                cp += dlen;
        !           435:        }
        !           436:        if (_res.options & RES_DEBUG && type != T_SOA) {
        !           437:            fprintf(file,"\tttl = %lu (%s)\n", rrttl, p_time(rrttl));
        !           438:        }
        !           439:        if (cp != cp1 + dlen) {
        !           440:                fprintf(file,
        !           441:                        "\n*** Error: record size incorrect (%d != %d)\n\n",
        !           442:                        cp - cp1, dlen);
        !           443:                cp = NULL;
        !           444:        }
        !           445:        return (cp);
        !           446: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.