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