Annotation of 43BSDTahoe/etc/named/tools/nstest.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)nstest.c   4.6 (Berkeley) 12/7/86";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Copyright (c) 1986 Regents of the University of California
                      7:  *     All Rights Reserved
                      8:  */
                      9: 
                     10: #include <sys/types.h>
                     11: #include <sys/socket.h>
                     12: #include <netinet/in.h>
                     13: #include <stdio.h>
                     14: #include <arpa/nameser.h>
                     15: #include <resolv.h>
                     16: 
                     17: extern char *inet_ntoa();
                     18: char *progname;
                     19: FILE *log;
                     20: #define MAXDATA                256   /* really should get definition from named/db.h */
                     21: main(argc, argv)
                     22:        char **argv;
                     23: {
                     24:        register char *cp;
                     25:        struct hostent *hp;
                     26:        short port = htons(NAMESERVER_PORT);
                     27:        char buf[BUFSIZ];
                     28:        char packet[PACKETSZ];
                     29:        char answer[PACKETSZ];
                     30:        struct rrec NewRR;
                     31:        char OldRRData[MAXDATA];
                     32:        int n, dump_packet;
                     33: 
                     34:        NewRR.r_data = (char *) malloc(MAXDATA);
                     35:        NewRR.r_data = (char *) malloc(MAXDATA);
                     36:        progname = argv[0];
                     37:        dump_packet = 0;
                     38:        _res.options |= RES_INIT|RES_DEBUG|RES_RECURSE;
                     39:        while (argc > 1 && argv[1][0] == '-') {
                     40:                argc--;
                     41:                cp = *++argv;
                     42:                while (*++cp)
                     43:                        switch (*cp) {
                     44:                        case 'p':
                     45:                                if (--argc <= 0)
                     46:                                        usage();
                     47:                                port = htons(atoi(*++argv));
                     48:                                break;
                     49: 
                     50:                        case 'i':
                     51:                                _res.options |= RES_IGNTC;
                     52:                                break;
                     53: 
                     54:                        case 'v':
                     55:                                _res.options |= RES_USEVC|RES_STAYOPEN;
                     56:                                break;
                     57: 
                     58:                        case 'r':
                     59:                                _res.options &= ~RES_RECURSE;
                     60:                                break;
                     61: 
                     62:                        case 'd':
                     63:                                dump_packet++;
                     64:                                break;
                     65: 
                     66:                        default:
                     67:                                usage();
                     68:                        }
                     69:        }
                     70:        _res.nsaddr.sin_family = AF_INET;
                     71:        _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
                     72:        _res.nsaddr.sin_port = port;
                     73:        if (argc > 1)
                     74:                _res.nsaddr.sin_addr.s_addr = inet_addr(argv[1]);
                     75:        if (argc > 2) {
                     76:                log = fopen(argv[2],"w");
                     77:                if (log == NULL) perror(argv[2]);
                     78:        }
                     79:        for (;;) {
                     80:                printf("> ");
                     81:                fflush(stdout);
                     82:                if ((cp = (char *)gets(buf)) == NULL)
                     83:                        break;
                     84:                switch (*cp++) {
                     85:                case 'a':
                     86:                        n = res_mkquery(QUERY, cp, C_ANY, T_A, (char *)0, 0,
                     87:                                NULL, packet, sizeof(packet));
                     88:                        break;
                     89: 
                     90:                case 'A':
                     91:                        n = ntohl(inet_addr(cp));
                     92:                        putlong(n, cp);
                     93:                        n = res_mkquery(IQUERY, "", C_IN, T_A, cp, sizeof(long),
                     94:                                NULL, packet, sizeof(packet));
                     95:                        break;
                     96: 
                     97:                case 'f':
                     98:                        n = res_mkquery(QUERY, cp, C_ANY, T_UINFO, (char *)0, 0,
                     99:                                NULL, packet, sizeof(packet));
                    100:                        break;
                    101: 
                    102:                case 'g':
                    103:                        n = res_mkquery(QUERY, cp, C_ANY, T_GID, (char *)0, 0,
                    104:                                NULL, packet, sizeof(packet));
                    105:                        break;
                    106: 
                    107:                case 'G':
                    108:                        *(int *)cp = htonl(atoi(cp));
                    109:                        n = res_mkquery(IQUERY, "", C_ANY, T_GID, cp,
                    110:                                sizeof(int), NULL, packet, sizeof(packet));
                    111:                        break;
                    112: 
                    113:                case 'c':
                    114:                        n = res_mkquery(QUERY, cp, C_IN, T_CNAME, (char *)0, 0,
                    115:                                NULL, packet, sizeof(packet));
                    116:                        break;
                    117: 
                    118:                case 'h':
                    119:                        n = res_mkquery(QUERY, cp, C_IN, T_HINFO, (char *)0, 0,
                    120:                                NULL, packet, sizeof(packet));
                    121:                        break;
                    122: 
                    123:                case 'm':
                    124:                        n = res_mkquery(QUERY, cp, C_IN, T_MX, (char *)0, 0,
                    125:                                NULL, packet, sizeof(packet));
                    126:                        break;
                    127: 
                    128:                case 'M':
                    129:                        n = res_mkquery(QUERY, cp, C_IN, T_MAILB, (char *)0, 0,
                    130:                                NULL, packet, sizeof(packet));
                    131:                        break;
                    132: 
                    133:                case 'n':
                    134:                        n = res_mkquery(QUERY, cp, C_IN, T_NS, (char *)0, 0,
                    135:                                NULL, packet, sizeof(packet));
                    136:                        break;
                    137: 
                    138:                case 'p':
                    139:                        n = res_mkquery(QUERY, cp, C_IN, T_PTR, (char *)0, 0,
                    140:                                NULL, packet, sizeof(packet));
                    141:                        break;
                    142: 
                    143:                case 's':
                    144:                        n = res_mkquery(QUERY, cp, C_IN, T_SOA, (char *)0, 0,
                    145:                                NULL, packet, sizeof(packet));
                    146:                        break;
                    147: 
                    148:                case 'u':
                    149:                        n = res_mkquery(QUERY, cp, C_ANY, T_UID, (char *)0, 0,
                    150:                                NULL, packet, sizeof(packet));
                    151:                        break;
                    152: 
                    153:                case 'U':
                    154:                        *(int *)cp = htonl(atoi(cp));
                    155:                        n = res_mkquery(IQUERY, "", C_ANY, T_UID, cp,
                    156:                                sizeof(int), NULL, packet, sizeof(packet));
                    157:                        break;
                    158: 
                    159:                case 'x':
                    160:                        n = res_mkquery(QUERY, cp, C_IN, T_AXFR, (char *)0, 0,
                    161:                                NULL, packet, sizeof(packet));
                    162:                        break;
                    163: 
                    164:                case 'w':
                    165:                        n = res_mkquery(QUERY, cp, C_IN, T_WKS, (char *)0, 0,
                    166:                                NULL, packet, sizeof(packet));
                    167:                        break;
                    168: 
                    169:                case 'b':
                    170:                        n = res_mkquery(QUERY, cp, C_IN, T_MB, (char *)0, 0,
                    171:                                NULL, packet, sizeof(packet));
                    172:                        break;
                    173: 
                    174:                case 'B':
                    175:                        n = res_mkquery(QUERY, cp, C_IN, T_MG, (char *)0, 0,
                    176:                                NULL, packet, sizeof(packet));
                    177:                        break;
                    178: 
                    179:                case 'i':
                    180:                        n = res_mkquery(QUERY, cp, C_IN, T_MINFO, (char *)0, 0,
                    181:                                NULL, packet, sizeof(packet));
                    182:                        break;
                    183: 
                    184:                case 'r':
                    185:                        n = res_mkquery(QUERY, cp, C_IN, T_MR, (char *)0, 0,
                    186:                                NULL, packet, sizeof(packet));
                    187:                        break;
                    188: 
                    189:                case '*':
                    190:                        n = res_mkquery(QUERY, cp, C_IN, T_ANY, (char *)0, 0,
                    191:                                NULL, packet, sizeof(packet));
                    192:                        break;
                    193: 
                    194: #ifdef ALLOW_UPDATES
                    195:                case '^':
                    196:                        {
                    197:                            char IType[10], TempStr[50];
                    198:                            int Type, oldnbytes, nbytes, i;
                    199: #ifdef ALLOW_T_UNSPEC
                    200:                            printf("Data type (a = T_A, u = T_UNSPEC): ");
                    201:                            gets(IType);
                    202:                            if (IType[0] == 'u') {
                    203:                                Type = T_UNSPEC;
                    204:                                printf("How many data bytes? ");
                    205:                                gets(TempStr); /* Throw away CR */
                    206:                                sscanf(TempStr, "%d", &nbytes);
                    207:                                for (i = 0; i < nbytes; i++) {
                    208:                                        (NewRR.r_data)[i] = (char) i;
                    209:                                }
                    210:                            } else {
                    211: #endif ALLOW_T_UNSPEC
                    212:                                Type = T_A;
                    213:                                nbytes = sizeof(u_long);
                    214:                                printf("Inet addr for new dname (e.g., 192.4.3.2): ");
                    215:                                gets(TempStr);
                    216:                                putlong(ntohl(inet_addr(TempStr)), NewRR.r_data);
                    217: #ifdef ALLOW_T_UNSPEC
                    218:                            }
                    219: #endif ALLOW_T_UNSPEC
                    220:                            NewRR.r_class = C_IN;
                    221:                            NewRR.r_type = Type;
                    222:                            NewRR.r_size = nbytes;
                    223:                            NewRR.r_ttl = 99999999;
                    224:                            printf("Add, modify, or modify all (a/m/M)? ");
                    225:                            gets(TempStr);
                    226:                            if (TempStr[0] == 'a') {
                    227:                                n = res_mkquery(UPDATEA, cp, C_IN, Type,
                    228:                                                OldRRData, nbytes,
                    229:                                                &NewRR, packet,
                    230:                                                sizeof(packet));
                    231:                            } else {
                    232:                                if (TempStr[0] == 'm') {
                    233:                                    printf("How many data bytes in old RR? ");
                    234:                                    gets(TempStr); /* Throw away CR */
                    235:                                    sscanf(TempStr, "%d", &oldnbytes);
                    236:                                    for (i = 0; i < oldnbytes; i++) {
                    237:                                            OldRRData[i] = (char) i;
                    238:                                    }
                    239:                                        n = res_mkquery(UPDATEM, cp, C_IN, Type,
                    240:                                                        OldRRData, oldnbytes,
                    241:                                                        &NewRR, packet,
                    242:                                                        sizeof(packet));
                    243:                                } else { /* Modify all */
                    244:                                        n = res_mkquery(UPDATEMA, cp,
                    245:                                                        C_IN, Type, NULL, 0,
                    246:                                                        &NewRR, packet,
                    247:                                                        sizeof(packet));
                    248: 
                    249:                                }
                    250:                            }
                    251:                        }
                    252:                        break;
                    253: 
                    254: #ifdef ALLOW_T_UNSPEC
                    255:                case 'D':
                    256:                        n = res_mkquery(UPDATEDA, cp, C_IN, T_UNSPEC, (char *)0,
                    257:                                        0, NULL, packet, sizeof(packet));
                    258:                        break;
                    259: 
                    260:                case 'd':
                    261:                        {
                    262:                                char TempStr[100];
                    263:                                int nbytes, i;
                    264:                                printf("How many data bytes in oldrr data? ");
                    265:                                gets(TempStr); /* Throw away CR */
                    266:                                sscanf(TempStr, "%d", &nbytes);
                    267:                                for (i = 0; i < nbytes; i++) {
                    268:                                        OldRRData[i] = (char) i;
                    269:                                }
                    270:                                n = res_mkquery(UPDATED, cp, C_IN, T_UNSPEC,
                    271:                                                OldRRData, nbytes, NULL, packet,
                    272:                                                sizeof(packet));
                    273:                        }
                    274:                        break;
                    275: #endif ALLOW_T_UNSPEC
                    276: #endif ALLOW_UPDATES
                    277: 
                    278:                default:
                    279:                        printf("a{host} - query  T_A\n");
                    280:                        printf("A{addr} - iquery T_A\n");
                    281:                        printf("b{user} - query  T_MB\n");
                    282:                        printf("B{user} - query  T_MG\n");
                    283:                        printf("f{host} - query  T_UINFO\n");
                    284:                        printf("g{host} - query  T_GID\n");
                    285:                        printf("G{gid}  - iquery T_GID\n");
                    286:                        printf("h{host} - query  T_HINFO\n");
                    287:                        printf("i{host} - query  T_MINFO\n");
                    288:                        printf("p{host} - query  T_PTR\n");
                    289:                        printf("m{host} - query  T_MX\n");
                    290:                        printf("M{host} - query  T_MAILB\n");
                    291:                        printf("n{host} - query  T_NS\n");
                    292:                        printf("r{host} - query  T_MR\n");
                    293:                        printf("s{host} - query  T_SOA\n");
                    294:                        printf("u{host} - query  T_UID\n");
                    295:                        printf("U{uid}  - iquery T_UID\n");
                    296:                        printf("x{host} - query  T_AXFR\n");
                    297:                        printf("w{host} - query  T_WKS\n");
                    298:                        printf("c{host} - query  T_CNAME\n");
                    299:                        printf("*{host} - query  T_ANY\n");
                    300: #ifdef ALLOW_UPDATES
                    301:                        printf("^{host} - add/mod/moda    (T_A/T_UNSPEC)\n");
                    302: #ifdef ALLOW_T_UNSPEC
                    303:                        printf("D{host} - deletea T_UNSPEC\n");
                    304:                        printf("d{host} - delete T_UNSPEC\n");
                    305: #endif ALLOW_T_UNSPEC
                    306: #endif ALLOW_UPDATES
                    307:                        continue;
                    308:                }
                    309:                if (n < 0) {
                    310:                        printf("res_mkquery: buffer too small\n");
                    311:                        continue;
                    312:                }
                    313:                if (log) {
                    314:                        fprintf(log,"SEND QUERY\n");
                    315:                        fp_query(packet, log);
                    316:                }
                    317:                n = res_send(packet, n, answer, sizeof(answer));
                    318:                if (n < 0) {
                    319:                        printf("res_send: send error\n");
                    320:                        if (log) fprintf(log, "res_send: send error\n");
                    321:                }
                    322:                else {
                    323:                        if (dump_packet) {
                    324:                                int f;
                    325:                                f = creat("ns_packet.dump", 0644);
                    326:                                write(f, answer, n);
                    327:                                (void) close(f);
                    328:                        }
                    329:                        if (log) {
                    330:                                fprintf(log, "GOT ANSWER\n");
                    331:                                fp_query(answer, log);
                    332:                        }
                    333:                }
                    334:        }
                    335: }
                    336: 
                    337: usage()
                    338: {
                    339:        fprintf(stderr, "Usage: %s [-v] [-i] [-r] [-d] [-p port] hostaddr\n",
                    340:                progname);
                    341:        exit(1);
                    342: }

unix.superglobalmegacorp.com

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