home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1996 May / PCOnline_05_1996.bin / linux / source / n / bind / bind-4.001 / bind-4~ / bind-4.9.3-BETA9 / tools / nstest.c < prev   
C/C++ Source or Header  |  1994-06-01  |  12KB  |  425 lines

  1. /*
  2.  * ++Copyright++ 1986
  3.  * -
  4.  * Copyright (c) 1986
  5.  *    The Regents of the University of California.  All rights reserved.
  6.  * 
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 2. Redistributions in binary form must reproduce the above copyright
  13.  *    notice, this list of conditions and the following disclaimer in the
  14.  *    documentation and/or other materials provided with the distribution.
  15.  * 3. All advertising materials mentioning features or use of this software
  16.  *    must display the following acknowledgement:
  17.  *     This product includes software developed by the University of
  18.  *     California, Berkeley and its contributors.
  19.  * 4. Neither the name of the University nor the names of its contributors
  20.  *    may be used to endorse or promote products derived from this software
  21.  *    without specific prior written permission.
  22.  * 
  23.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  24.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  27.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33.  * SUCH DAMAGE.
  34.  * -
  35.  * Portions Copyright (c) 1993 by Digital Equipment Corporation.
  36.  * 
  37.  * Permission to use, copy, modify, and distribute this software for any
  38.  * purpose with or without fee is hereby granted, provided that the above
  39.  * copyright notice and this permission notice appear in all copies, and that
  40.  * the name of Digital Equipment Corporation not be used in advertising or
  41.  * publicity pertaining to distribution of the document or software without
  42.  * specific, written prior permission.
  43.  * 
  44.  * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
  45.  * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
  46.  * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
  47.  * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  48.  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  49.  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
  50.  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  51.  * SOFTWARE.
  52.  * -
  53.  * --Copyright--
  54.  */
  55.  
  56. #ifndef lint
  57. char copyright[] =
  58. "@(#) Copyright (c) 1986 Regents of the University of California.\n\
  59.  portions Copyright (c) 1993 Digital Equipment Corporation\n\
  60.  All rights reserved.\n";
  61. #endif /* not lint */
  62.  
  63. #ifndef lint
  64. static char sccsid[] = "@(#)nstest.c    4.15 (Berkeley) 3/21/91";
  65. static char rcsid[] = "$Id: nstest.c,v 4.9.1.6 1994/06/01 21:10:11 vixie Exp $";
  66. #endif /* not lint */
  67.  
  68. #include <sys/param.h>
  69. #include <sys/socket.h>
  70. #include <netinet/in.h>
  71. #include <arpa/inet.h>
  72. #include <arpa/nameser.h>
  73. #include <stdio.h>
  74. #include <resolv.h>
  75. #include "../conf/portability.h"
  76.  
  77. char *progname;
  78. FILE *log;
  79. #define MAXDATA        256   /* really should get this from named/db.h */
  80. main(argc, argv)
  81.     char **argv;
  82. {
  83.     register char *cp;
  84.     register u_char *ucp;
  85.     struct hostent *hp;
  86.     u_short port = htons(NAMESERVER_PORT);
  87.     char buf[BUFSIZ];
  88.     u_char packet[PACKETSZ], answer[8*1024], OldRRData[MAXDATA];
  89.     struct rrec NewRR;
  90.     u_int32_t l;
  91.     int n, dump_packet;
  92.  
  93.     NewRR.r_data = (char *) malloc(MAXDATA);
  94.     NewRR.r_data = (char *) malloc(MAXDATA);
  95.     progname = argv[0];
  96.     dump_packet = 0;
  97.     _res.options |= RES_DEBUG|RES_RECURSE;
  98.     (void) res_init();
  99.     while (argc > 1 && argv[1][0] == '-') {
  100.         argc--;
  101.         cp = *++argv;
  102.         while (*++cp)
  103.             switch (*cp) {
  104.             case 'p':
  105.                 if (--argc <= 0)
  106.                     usage();
  107.                 port = htons(atoi(*++argv));
  108.                 break;
  109.  
  110.             case 'i':
  111.                 _res.options |= RES_IGNTC;
  112.                 break;
  113.  
  114.             case 'v':
  115.                 _res.options |= RES_USEVC|RES_STAYOPEN;
  116.                 break;
  117.  
  118.             case 'r':
  119.                 _res.options &= ~RES_RECURSE;
  120.                 break;
  121.  
  122.             case 'd':
  123.                 dump_packet++;
  124.                 break;
  125.  
  126.             default:
  127.                 usage();
  128.             }
  129.     }
  130.     _res.nsaddr.sin_family = AF_INET;
  131.     _res.nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
  132.     _res.nsaddr.sin_port = port;
  133.      if (argc > 1) {
  134.         if (!inet_aton(argv[1],
  135.                    (struct in_addr *)&_res.nsaddr.sin_addr))
  136.             usage();
  137.     }
  138.      if (argc > 2) {
  139.          log = fopen(argv[2],"w");
  140.          if (log == NULL) perror(argv[2]);
  141.      }
  142.     for (;;) {
  143.         printf("> ");
  144.         fflush(stdout);
  145.         if ((cp = fgets(buf, sizeof buf, stdin)) == NULL)
  146.             break;
  147.         switch (*cp++) {
  148.         case 'a':
  149.             n = res_mkquery(QUERY, cp, C_IN, T_A, NULL, 0,
  150.                     NULL, packet, sizeof packet);
  151.             break;
  152.  
  153.         case 'A':
  154.             n = ntohl(inet_addr(cp));
  155.             putlong((u_int32_t)n, (u_char*)cp);
  156.             n = res_mkquery(IQUERY, "", C_IN, T_A, (u_char *)cp,
  157.                     INT32SZ, NULL,
  158.                     packet, sizeof(packet));
  159.             break;
  160.  
  161.         case 'f':
  162.             n = res_mkquery(QUERY, cp, C_ANY, T_UINFO, NULL,
  163.                     0, NULL, packet, sizeof packet);
  164.             break;
  165.  
  166.         case 'F':
  167.             n = res_mkquery(QUERY, cp, C_IN, T_AFSDB, NULL, 0,
  168.                     NULL, packet, sizeof packet);
  169.             break;
  170.  
  171.         case 'g':
  172.             n = res_mkquery(QUERY, cp, C_ANY, T_GID, NULL, 0,
  173.                     NULL, packet, sizeof packet);
  174.             break;
  175.  
  176.         case 'G':
  177.             *(int *)cp = htonl(atoi(cp));
  178.             n = res_mkquery(IQUERY, "", C_ANY, T_GID, (u_char *)cp,
  179.                     sizeof(int), NULL, packet, sizeof packet);
  180.             break;
  181.  
  182.         case 'c':
  183.             n = res_mkquery(QUERY, cp, C_IN, T_CNAME, NULL, 0,
  184.                     NULL, packet, sizeof packet);
  185.             break;
  186.  
  187.         case 'h':
  188.             n = res_mkquery(QUERY, cp, C_IN, T_HINFO, NULL, 0,
  189.                     NULL, packet, sizeof packet);
  190.             break;
  191.  
  192.         case 'm':
  193.             n = res_mkquery(QUERY, cp, C_IN, T_MX, NULL, 0,
  194.                     NULL, packet, sizeof packet);
  195.             break;
  196.  
  197.         case 'M':
  198.             n = res_mkquery(QUERY, cp, C_IN, T_MAILB, NULL, 0,
  199.                     NULL, packet, sizeof packet);
  200.             break;
  201.  
  202.         case 'n':
  203.             n = res_mkquery(QUERY, cp, C_IN, T_NS, NULL, 0,
  204.                     NULL, packet, sizeof packet);
  205.             break;
  206.  
  207.         case 'p':
  208.             n = res_mkquery(QUERY, cp, C_IN, T_PTR, NULL, 0,
  209.                     NULL, packet, sizeof packet);
  210.             break;
  211.  
  212.         case 's':
  213.             n = res_mkquery(QUERY, cp, C_IN, T_SOA, NULL, 0,
  214.                     NULL, packet, sizeof packet);
  215.             break;
  216.  
  217.         case 'T':
  218.             n = res_mkquery(QUERY, cp, C_IN, T_TXT, NULL, 0,
  219.                     NULL, packet, sizeof packet);
  220.             break;
  221.  
  222.         case 'u':
  223.             n = res_mkquery(QUERY, cp, C_ANY, T_UID, NULL, 0,
  224.                     NULL, packet, sizeof packet);
  225.             break;
  226.  
  227.         case 'U':
  228.             *(int *)cp = htonl(atoi(cp));
  229.             n = res_mkquery(IQUERY, "", C_ANY, T_UID, (u_char *)cp,
  230.                     sizeof(int), NULL,
  231.                     packet, sizeof packet);
  232.             break;
  233.  
  234.         case 'x':
  235.             n = res_mkquery(QUERY, cp, C_IN, T_AXFR, NULL, 0,
  236.                     NULL, packet, sizeof packet);
  237.             break;
  238.  
  239.         case 'w':
  240.             n = res_mkquery(QUERY, cp, C_IN, T_WKS, NULL, 0,
  241.                     NULL, packet, sizeof packet);
  242.             break;
  243.  
  244.         case 'b':
  245.             n = res_mkquery(QUERY, cp, C_IN, T_MB, NULL, 0,
  246.                     NULL, packet, sizeof packet);
  247.             break;
  248.  
  249.         case 'B':
  250.             n = res_mkquery(QUERY, cp, C_IN, T_MG, NULL, 0,
  251.                     NULL, packet, sizeof packet);
  252.             break;
  253.  
  254.         case 'i':
  255.             n = res_mkquery(QUERY, cp, C_IN, T_MINFO, NULL, 0,
  256.                     NULL, packet, sizeof packet);
  257.             break;
  258.  
  259.         case 'r':
  260.             n = res_mkquery(QUERY, cp, C_IN, T_MR, NULL, 0,
  261.                     NULL, packet, sizeof packet);
  262.             break;
  263.  
  264.         case '*':
  265.             n = res_mkquery(QUERY, cp, C_IN, T_ANY, NULL, 0,
  266.                     NULL, packet, sizeof packet);
  267.             break;
  268.  
  269. #ifdef ALLOW_UPDATES
  270.         case '^':
  271.             {
  272.                 char IType[10], TempStr[50];
  273.                 int Type, oldnbytes, nbytes, i;
  274. #ifdef ALLOW_T_UNSPEC
  275.                 printf("Data type (a = T_A, u = T_UNSPEC): ");
  276.                 gets(IType);
  277.                 if (IType[0] == 'u') {
  278.                     Type = T_UNSPEC;
  279.                     printf("How many data bytes? ");
  280.                     gets(TempStr); /* Throw away CR */
  281.                     sscanf(TempStr, "%d", &nbytes);
  282.                     for (i = 0; i < nbytes; i++) {
  283.                         (NewRR.r_data)[i] = (char) i;
  284.                     }
  285.                 } else {
  286. #endif /* ALLOW_T_UNSPEC */
  287.                     Type = T_A;
  288.                     nbytes = INT32SZ;
  289.                     printf(
  290.                   "Inet addr for new dname (e.g., 192.4.3.2): "
  291.                        );
  292.                     gets(TempStr);
  293.                     putlong(ntohl(inet_addr(TempStr)),
  294.                     NewRR.r_data);
  295. #ifdef ALLOW_T_UNSPEC
  296.                 }
  297. #endif
  298.                 NewRR.r_class = C_IN;
  299.                 NewRR.r_type = Type;
  300.                 NewRR.r_size = nbytes;
  301.                 NewRR.r_ttl = 99999999;
  302.                 printf("Add, modify, or modify all (a/m/M)? ");
  303.                 gets(TempStr);
  304.                 if (TempStr[0] == 'a') {
  305.                     n = res_mkquery(UPDATEA, cp, C_IN, Type,
  306.                             OldRRData, nbytes,
  307.                             &NewRR, packet,
  308.                             sizeof packet);
  309.                 } else {
  310.                     if (TempStr[0] == 'm') {
  311.                         printf("How many data bytes in old RR? ");
  312.                         gets(TempStr); /* Throw away CR */
  313.                         sscanf(TempStr, "%d", &oldnbytes);
  314.                     for (i = 0; i < oldnbytes; i++) {
  315.                         OldRRData[i] = (char) i;
  316.                     }
  317.                     n = res_mkquery(UPDATEM, cp,
  318.                             C_IN, Type,
  319.                             OldRRData, oldnbytes,
  320.                             &NewRR, packet,
  321.                             sizeof packet);
  322.                 } else { /* Modify all */
  323.                     n = res_mkquery(UPDATEMA, cp,
  324.                             C_IN, Type, NULL, 0,
  325.                             &NewRR, packet,
  326.                             sizeof packet);
  327.  
  328.                 }
  329.                 }
  330.             }
  331.             break;
  332.  
  333. #ifdef ALLOW_T_UNSPEC
  334.         case 'D':
  335.             n = res_mkquery(UPDATEDA, cp, C_IN, T_UNSPEC,
  336.                     (char *)0, 0, NULL,
  337.                     packet, sizeof packet);
  338.             break;
  339.  
  340.         case 'd':
  341.             {
  342.                 char TempStr[100];
  343.                 int nbytes, i;
  344.                 printf("How many data bytes in oldrr data? ");
  345.                 gets(TempStr); /* Throw away CR */
  346.                 sscanf(TempStr, "%d", &nbytes);
  347.                 for (i = 0; i < nbytes; i++) {
  348.                     OldRRData[i] = (char) i;
  349.                 }
  350.                 n = res_mkquery(UPDATED, cp, C_IN, T_UNSPEC,
  351.                         OldRRData, nbytes, NULL,
  352.                         packet, sizeof packet);
  353.             }
  354.             break;
  355. #endif /* ALLOW_T_UNSPEC */
  356. #endif /* ALLOW_UPDATES */
  357.  
  358.         default:
  359.             printf("a{host} - query  T_A\n");
  360.             printf("A{addr} - iquery T_A\n");
  361.             printf("b{user} - query  T_MB\n");
  362.             printf("B{user} - query  T_MG\n");
  363.             printf("f{host} - query  T_UINFO\n");
  364.             printf("g{host} - query  T_GID\n");
  365.             printf("G{gid}  - iquery T_GID\n");
  366.             printf("h{host} - query  T_HINFO\n");
  367.             printf("i{host} - query  T_MINFO\n");
  368.             printf("p{host} - query  T_PTR\n");
  369.             printf("m{host} - query  T_MX\n");
  370.             printf("M{host} - query  T_MAILB\n");
  371.             printf("n{host} - query  T_NS\n");
  372.             printf("r{host} - query  T_MR\n");
  373.             printf("s{host} - query  T_SOA\n");
  374.             printf("T{host} - query  T_TXT\n");
  375.             printf("u{host} - query  T_UID\n");
  376.             printf("U{uid}  - iquery T_UID\n");
  377.             printf("x{host} - query  T_AXFR\n");
  378.             printf("w{host} - query  T_WKS\n");
  379.             printf("F{host} - query  T_AFSDB\n");
  380.             printf("c{host} - query  T_CNAME\n");
  381.             printf("*{host} - query  T_ANY\n");
  382. #ifdef ALLOW_UPDATES
  383.             printf("^{host} - add/mod/moda    (T_A/T_UNSPEC)\n");
  384. #ifdef ALLOW_T_UNSPEC
  385.             printf("D{host} - deletea T_UNSPEC\n");
  386.             printf("d{host} - delete T_UNSPEC\n");
  387. #endif /* ALLOW_T_UNSPEC */
  388. #endif /* ALLOW_UPDATES */
  389.             continue;
  390.         }
  391.         if (n < 0) {
  392.             printf("res_mkquery: buffer too small\n");
  393.             continue;
  394.         }
  395.         if (log) {
  396.             fprintf(log,"SEND QUERY\n");
  397.             fp_query(packet, log);
  398.         }
  399.         n = res_send(packet, n, answer, sizeof(answer));
  400.         if (n < 0) {
  401.             printf("res_send: send error\n");
  402.             if (log) fprintf(log, "res_send: send error\n");
  403.         }
  404.         else {
  405.             if (dump_packet) {
  406.                 int f;
  407.                 f = creat("ns_packet.dump", 0644);
  408.                 write(f, answer, n);
  409.                 (void) close(f);
  410.             }
  411.             if (log) {
  412.                 fprintf(log, "GOT ANSWER\n");
  413.                 fp_query(answer, log);
  414.             }
  415.         }
  416.     }
  417. }
  418.  
  419. usage()
  420. {
  421.     fprintf(stderr, "Usage: %s [-v] [-i] [-r] [-d] [-p port] hostaddr\n",
  422.         progname);
  423.     exit(1);
  424. }
  425.