Annotation of 43BSD/etc/named/tools/ns.lookup/src/debug.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *******************************************************************************
                      3:  *
                      4:  *  debug.c --
                      5:  *
                      6:  *     Routines to print out packets received from a name server query.
                      7:  *
                      8:  *      Modified version of 4.3BSD BIND res_debug.c 5.6 9/14/85
                      9:  *
                     10:  *     Copyright (c) 1985 Regents of the University of California.
                     11:  *     All rights reserved.  The Berkeley software License Agreement
                     12:  *     specifies the terms and conditions for redistribution.
                     13:  *
                     14:  *******************************************************************************
                     15:  */
                     16: 
                     17: #ifndef lint
                     18: static char sccsid[] = "@(#)debug.c    5.3 (Berkeley) 3/31/86";
                     19: #endif not lint
                     20: 
                     21: #include <sys/types.h>
                     22: #include <netinet/in.h>
                     23: #include <stdio.h>
                     24: #include <arpa/nameser.h>
                     25: #include <resolv.h>
                     26: #include "res.h"
                     27: 
                     28: extern char ctime();
                     29: 
                     30: /*
                     31:  *  Imported from res_debug.c
                     32:  */
                     33: extern char *rcodes[];
                     34: extern char *opcodes[];
                     35: 
                     36: /*
                     37:  *  Used to highlight the start of a record when printing it.
                     38:  */
                     39: #define INDENT "->  "
                     40: 
                     41: 
                     42: 
                     43: /*
                     44:  * Print the contents of a query.
                     45:  * This is intended to be primarily a debugging routine.
                     46:  */
                     47: 
                     48: Print_query(msg, eom, printHeader)
                     49:        char *msg, *eom;
                     50:        int printHeader;
                     51: {
                     52:        Fprint_query(msg, eom, printHeader,stdout);
                     53: }
                     54: 
                     55: Fprint_query(msg, eom, printHeader,file)
                     56:        char *msg, *eom;
                     57:        int printHeader;
                     58:        FILE *file;
                     59: {
                     60:        register char *cp;
                     61:        register HEADER *hp;
                     62:        register int n;
                     63:        short class;
                     64:        short type;
                     65: 
                     66:        /*
                     67:         * Print header fields.
                     68:         */
                     69:        hp = (HEADER *)msg;
                     70:        cp = msg + sizeof(HEADER);
                     71:        if (printHeader || (_res.options & RES_DEBUG2)) {
                     72:            fprintf(file,"HEADER:\n");
                     73:            fprintf(file,"\topcode = %s", opcodes[hp->opcode]);
                     74:            fprintf(file,", id = %d", ntohs(hp->id));
                     75:            fprintf(file,", rcode = %s\n", rcodes[hp->rcode]);
                     76:            fprintf(file,"\theader flags: ");
                     77:            if (hp->qr) {
                     78:                    fprintf(file," response");
                     79:            } else {
                     80:                    fprintf(file," query");
                     81:            }
                     82:            if (hp->aa)
                     83:                    fprintf(file,", auth. answer");
                     84:            if (hp->tc)
                     85:                    fprintf(file,", truncation");
                     86:            if (hp->rd)
                     87:                    fprintf(file,", want recursion");
                     88:            if (hp->ra)
                     89:                    fprintf(file,", recursion avail.");
                     90:            if (hp->pr)
                     91:                    fprintf(file,", primary");
                     92:            fprintf(file,"\n\tquestions = %d", ntohs(hp->qdcount));
                     93:            fprintf(file,",  answers = %d", ntohs(hp->ancount));
                     94:            fprintf(file,",  n.s. = %d", ntohs(hp->nscount));
                     95:            fprintf(file,",  additional = %d\n\n", ntohs(hp->arcount));
                     96:        }
                     97: 
                     98:        /*
                     99:         * Print question records.
                    100:         */
                    101:        if (n = ntohs(hp->qdcount)) {
                    102:                fprintf(file,"QUESTIONS:\n");
                    103:                while (--n >= 0) {
                    104:                        fprintf(file,"\t");
                    105:                        cp = Print_cdname(cp, msg, eom, file);
                    106:                        if (cp == NULL)
                    107:                                return;
                    108:                        type = getshort(cp);
                    109:                        cp += sizeof(u_short);
                    110:                        class = getshort(cp);
                    111:                        cp += sizeof(u_short);
                    112:                        fprintf(file,", type = %s", p_type(type));
                    113:                        fprintf(file,", class = %s\n", p_class(class));
                    114:                }
                    115:        }
                    116:        /*
                    117:         * Print authoritative answer records
                    118:         */
                    119:        if (n = ntohs(hp->ancount)) {
                    120:                fprintf(file,"ANSWERS:\n");
                    121:                while (--n >= 0) {
                    122:                        fprintf(file, INDENT);
                    123:                        cp = Print_rr(cp, msg, eom, file);
                    124:                        if (cp == NULL)
                    125:                                return;
                    126:                }
                    127:        }
                    128:        /*
                    129:         * print name server records
                    130:         */
                    131:        if (n = ntohs(hp->nscount)) {
                    132:                fprintf(file,"NAME SERVERS:\n");
                    133:                while (--n >= 0) {
                    134:                        fprintf(file, INDENT);
                    135:                        cp = Print_rr(cp, msg, eom, file);
                    136:                        if (cp == NULL)
                    137:                                return;
                    138:                }
                    139:        }
                    140:        /*
                    141:         * print additional records
                    142:         */
                    143:        if (n = ntohs(hp->arcount)) {
                    144:                fprintf(file,"ADDITIONAL RECORDS:\n");
                    145:                while (--n >= 0) {
                    146:                        fprintf(file, INDENT);
                    147:                        cp = Print_rr(cp, msg, eom, file);
                    148:                        if (cp == NULL)
                    149:                                return;
                    150:                }
                    151:        }
                    152:        fprintf(file,"\n");
                    153: 
                    154: }
                    155: 
                    156: 
                    157: char *
                    158: Print_cdname_sub(cp, msg, eom, file, format)
                    159:        char *cp, *msg, *eom;
                    160:        FILE *file;
                    161:        int format;
                    162: {
                    163:        int n;
                    164:        char name[MAXDNAME];
                    165:        extern char *strcpy();
                    166: 
                    167:        if ((n = dn_expand(msg, eom, cp, name, sizeof(name))) < 0)
                    168:                return (NULL);
                    169:        if (name[0] == '\0') {
                    170:            (void) strcpy(name, "(root)");
                    171:        }
                    172:        if (format) {
                    173:            fprintf(file, "%-30s", name);
                    174:        } else {
                    175:            fputs(name, file);
                    176:        }
                    177:        return (cp + n);
                    178: }
                    179: 
                    180: char *
                    181: Print_cdname(cp, msg, eom, file)
                    182:        char *cp, *msg, *eom;
                    183:        FILE *file;
                    184: {
                    185:     return(Print_cdname_sub(cp, msg, eom, file, 0));
                    186: }
                    187: 
                    188: char *
                    189: Print_cdname2(cp, msg, eom, file)
                    190:        char *cp, *msg, *eom;
                    191:        FILE *file;
                    192: {
                    193:     return(Print_cdname_sub(cp, msg, eom, file, 1));
                    194: }
                    195: 
                    196: /*
                    197:  * Print resource record fields in human readable form.
                    198:  */
                    199: char *
                    200: Print_rr(cp, msg, eom, file)
                    201:        char *cp, *msg, *eom;
                    202:        FILE *file;
                    203: {
                    204:        int type, class, dlen, n, c;
                    205:        long ttl;
                    206:        struct in_addr inaddr;
                    207:        char *cp1;
                    208: 
                    209:        if ((cp = Print_cdname(cp, msg, eom, file)) == NULL)
                    210:                return (NULL);                  /* compression error */
                    211: 
                    212:        type = getshort(cp);
                    213:        cp += sizeof(u_short);
                    214:        class = getshort(cp);
                    215:        cp += sizeof(u_short);
                    216:        ttl = getlong(cp);
                    217:        cp += sizeof(u_long);
                    218:        dlen = getshort(cp);
                    219:        cp += sizeof(u_short);
                    220: 
                    221:        if (_res.options & RES_DEBUG2) {
                    222:            fprintf(file,"\n\ttype = %s, class = %s, ttl = %u, dlen = %d",
                    223:                        p_type(type), p_class(class), ttl, dlen);
                    224:            fprintf(file,"\n");
                    225:        }
                    226: 
                    227:        cp1 = cp;
                    228: 
                    229:        /*
                    230:         * Print type specific data, if appropriate
                    231:         */
                    232:        switch (type) {
                    233:        case T_A:
                    234:                switch (class) {
                    235:                case C_IN:
                    236:                        bcopy(cp, (char *)&inaddr, sizeof(inaddr));
                    237:                        if (dlen == 4) {
                    238:                                fprintf(file,"\tinet address = %s\n",
                    239:                                        inet_ntoa(inaddr));
                    240:                                cp += dlen;
                    241:                        } else if (dlen == 7) {
                    242:                                fprintf(file,"\tinet address = %s",
                    243:                                        inet_ntoa(inaddr));
                    244:                                fprintf(file,", protocol = %d", cp[4]);
                    245:                                fprintf(file,", port = %d\n",
                    246:                                        (cp[5] << 8) + cp[6]);
                    247:                                cp += dlen;
                    248:                        }
                    249:                        break;
                    250:                }
                    251:                break;
                    252: 
                    253:        case T_CNAME:
                    254:                fprintf(file,"\tcanonical name = ");
                    255:                cp = Print_cdname(cp, msg, eom, file);
                    256:                fprintf(file,"\n");
                    257:                break;
                    258: 
                    259:        case T_MX:
                    260:                fprintf(file,"\tpreference = %d",getshort(cp));
                    261:                cp += sizeof(u_short);
                    262:                fprintf(file,", mail exchanger = ");
                    263:                cp = Print_cdname(cp,msg, eom, file);
                    264:                fprintf(file,"\n");
                    265:                break;
                    266: 
                    267:        case T_MG:
                    268:        case T_MB:
                    269:        case T_MR:
                    270:        case T_NS:
                    271:        case T_PTR:
                    272:                fprintf(file,"\tserver name = ");
                    273:                cp = Print_cdname(cp, msg, eom, file);
                    274:                fprintf(file,"\n");
                    275:                break;
                    276: 
                    277:        case T_HINFO:
                    278:                if (n = *cp++) {
                    279:                        fprintf(file,"\tCPU=%.*s", n, cp);
                    280:                        cp += n;
                    281:                }
                    282:                if (n = *cp++) {
                    283:                        fprintf(file,"\tOS=%.*s\n", n, cp);
                    284:                        cp += n;
                    285:                }
                    286:                break;
                    287: 
                    288:        case T_SOA:
                    289:                fprintf(file,"\torigin = ");
                    290:                cp = Print_cdname(cp, msg, eom, file);
                    291:                fprintf(file,"\n\tmail addr = ");
                    292:                cp = Print_cdname(cp, msg, eom, file);
                    293:                fprintf(file,"\n\tserial=%ld", getlong(cp));
                    294:                cp += sizeof(u_long);
                    295:                fprintf(file,", refresh=%ld", getlong(cp));
                    296:                cp += sizeof(u_long);
                    297:                fprintf(file,", retry=%ld", getlong(cp));
                    298:                cp += sizeof(u_long);
                    299:                fprintf(file,", expire=%ld", getlong(cp));
                    300:                cp += sizeof(u_long);
                    301:                fprintf(file,", min=%ld\n", getlong(cp));
                    302:                cp += sizeof(u_long);
                    303:                break;
                    304: 
                    305:        case T_MINFO:
                    306:                fprintf(file,"\trequests = ");
                    307:                cp = Print_cdname(cp, msg, eom, file);
                    308:                fprintf(file,"\n\terrors = ");
                    309:                cp = Print_cdname(cp, msg, eom, file);
                    310:                break;
                    311: 
                    312:        case T_UINFO:
                    313:                fprintf(file,"\t%s\n", cp);
                    314:                cp += dlen;
                    315:                break;
                    316: 
                    317:        case T_UID:
                    318:        case T_GID:
                    319:                if (dlen == 4) {
                    320:                        fprintf(file,"\t%ld\n", getlong(cp));
                    321:                        cp += sizeof(int);
                    322:                }
                    323:                break;
                    324: 
                    325:        case T_WKS:
                    326:                if (dlen < sizeof(u_long) + 1)
                    327:                        break;
                    328:                bcopy(cp, (char *)&inaddr, sizeof(inaddr));
                    329:                cp += sizeof(u_long);
                    330:                fprintf(file,"\tinet address = %s, protocol = %d\n\t",
                    331:                        inet_ntoa(inaddr), *cp++);
                    332:                n = 0;
                    333:                while (cp < cp1 + dlen) {
                    334:                        c = *cp++;
                    335:                        do {
                    336:                                if (c & 0200)
                    337:                                        fprintf(file," %d", n);
                    338:                                c <<= 1;
                    339:                        } while (++n & 07);
                    340:                }
                    341:                putc('\n',file);
                    342:                break;
                    343: 
                    344:        case T_NULL:
                    345:                break;
                    346: 
                    347:        default:
                    348:                fprintf(file,"\t???\n");
                    349:                cp += dlen;
                    350:        }
                    351:        if (cp != cp1 + dlen)
                    352:                fprintf(file,"packet size error (%#x != %#x)\n", cp, cp1+dlen);
                    353:        return (cp);
                    354: }

unix.superglobalmegacorp.com

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