|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.