1/*	$NetBSD$	*/
2
3/*
4 * Copyright (C) 2004-2009, 2011  Internet Systems Consortium, Inc. ("ISC")
5 * Copyright (C) 2000-2003  Internet Software Consortium.
6 *
7 * Permission to use, copy, modify, and/or distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19
20/* Id: dig.h,v 1.114 2011/12/07 17:23:28 each Exp  */
21
22#ifndef DIG_H
23#define DIG_H
24
25/*! \file */
26
27#include <dns/rdatalist.h>
28
29#include <dst/dst.h>
30
31#include <isc/boolean.h>
32#include <isc/buffer.h>
33#include <isc/bufferlist.h>
34#include <isc/formatcheck.h>
35#include <isc/lang.h>
36#include <isc/list.h>
37#include <isc/mem.h>
38#include <isc/print.h>
39#include <isc/sockaddr.h>
40#include <isc/socket.h>
41
42#define MXSERV 20
43#define MXNAME (DNS_NAME_MAXTEXT+1)
44#define MXRD 32
45/*% Buffer Size */
46#define BUFSIZE 512
47#define COMMSIZE 0xffff
48#ifndef RESOLV_CONF
49/*% location of resolve.conf */
50#define RESOLV_CONF "/etc/resolv.conf"
51#endif
52/*% output buffer */
53#define OUTPUTBUF 32767
54/*% Max RR Limit */
55#define MAXRRLIMIT 0xffffffff
56#define MAXTIMEOUT 0xffff
57/*% Max number of tries */
58#define MAXTRIES 0xffffffff
59/*% Max number of dots */
60#define MAXNDOTS 0xffff
61/*% Max number of ports */
62#define MAXPORT 0xffff
63/*% Max serial number */
64#define MAXSERIAL 0xffffffff
65
66/*% Default TCP Timeout */
67#define TCP_TIMEOUT 10
68/*% Default UDP Timeout */
69#define UDP_TIMEOUT 5
70
71#define SERVER_TIMEOUT 1
72
73#define LOOKUP_LIMIT 64
74/*%
75 * Lookup_limit is just a limiter, keeping too many lookups from being
76 * created.  It's job is mainly to prevent the program from running away
77 * in a tight loop of constant lookups.  It's value is arbitrary.
78 */
79
80/*
81 * Defaults for the sigchase suboptions.  Consolidated here because
82 * these control the layout of dig_lookup_t (among other things).
83 */
84#ifdef DIG_SIGCHASE
85#ifndef DIG_SIGCHASE_BU
86#define DIG_SIGCHASE_BU 1
87#endif
88#ifndef DIG_SIGCHASE_TD
89#define DIG_SIGCHASE_TD 1
90#endif
91#endif
92
93ISC_LANG_BEGINDECLS
94
95typedef struct dig_lookup dig_lookup_t;
96typedef struct dig_query dig_query_t;
97typedef struct dig_server dig_server_t;
98#ifdef DIG_SIGCHASE
99typedef struct dig_message dig_message_t;
100#endif
101typedef ISC_LIST(dig_server_t) dig_serverlist_t;
102typedef struct dig_searchlist dig_searchlist_t;
103
104/*% The dig_lookup structure */
105struct dig_lookup {
106	isc_boolean_t
107		pending, /*%< Pending a successful answer */
108		waiting_connect,
109		doing_xfr,
110		ns_search_only, /*%< dig +nssearch, host -C */
111		identify, /*%< Append an "on server <foo>" message */
112		identify_previous_line, /*% Prepend a "Nameserver <foo>:"
113					   message, with newline and tab */
114		ignore,
115		recurse,
116		aaonly,
117		adflag,
118		cdflag,
119		trace, /*% dig +trace */
120		trace_root, /*% initial query for either +trace or +nssearch */
121		tcp_mode,
122		ip6_int,
123		comments,
124		stats,
125		section_question,
126		section_answer,
127		section_authority,
128		section_additional,
129		servfail_stops,
130		new_search,
131		need_search,
132		done_as_is,
133		besteffort,
134		dnssec,
135		nsid;   /*% Name Server ID (RFC 5001) */
136#ifdef DIG_SIGCHASE
137isc_boolean_t	sigchase;
138#if DIG_SIGCHASE_TD
139	isc_boolean_t do_topdown,
140		trace_root_sigchase,
141		rdtype_sigchaseset,
142		rdclass_sigchaseset;
143	/* Name we are going to validate RRset */
144	char textnamesigchase[MXNAME];
145#endif
146#endif
147
148	char textname[MXNAME]; /*% Name we're going to be looking up */
149	char cmdline[MXNAME];
150	dns_rdatatype_t rdtype;
151	dns_rdatatype_t qrdtype;
152#if DIG_SIGCHASE_TD
153	dns_rdatatype_t rdtype_sigchase;
154	dns_rdatatype_t qrdtype_sigchase;
155	dns_rdataclass_t rdclass_sigchase;
156#endif
157	dns_rdataclass_t rdclass;
158	isc_boolean_t rdtypeset;
159	isc_boolean_t rdclassset;
160	char namespace[BUFSIZE];
161	char onamespace[BUFSIZE];
162	isc_buffer_t namebuf;
163	isc_buffer_t onamebuf;
164	isc_buffer_t renderbuf;
165	char *sendspace;
166	dns_name_t *name;
167	isc_timer_t *timer;
168	isc_interval_t interval;
169	dns_message_t *sendmsg;
170	dns_name_t *oname;
171	ISC_LINK(dig_lookup_t) link;
172	ISC_LIST(dig_query_t) q;
173	dig_query_t *current_query;
174	dig_serverlist_t my_server_list;
175	dig_searchlist_t *origin;
176	dig_query_t *xfr_q;
177	isc_uint32_t retries;
178	int nsfound;
179	isc_uint16_t udpsize;
180	isc_int16_t edns;
181	isc_uint32_t ixfr_serial;
182	isc_buffer_t rdatabuf;
183	char rdatastore[MXNAME];
184	dst_context_t *tsigctx;
185	isc_buffer_t *querysig;
186	isc_uint32_t msgcounter;
187	dns_fixedname_t fdomain;
188};
189
190/*% The dig_query structure */
191struct dig_query {
192	dig_lookup_t *lookup;
193	isc_boolean_t waiting_connect,
194		pending_free,
195		waiting_senddone,
196		first_pass,
197		first_soa_rcvd,
198		second_rr_rcvd,
199		first_repeat_rcvd,
200		recv_made,
201		warn_id;
202	isc_uint32_t first_rr_serial;
203	isc_uint32_t second_rr_serial;
204	isc_uint32_t msg_count;
205	isc_uint32_t rr_count;
206	char *servname;
207	char *userarg;
208	isc_bufferlist_t sendlist,
209		recvlist,
210		lengthlist;
211	isc_buffer_t recvbuf,
212		lengthbuf,
213		slbuf;
214	char *recvspace,
215		lengthspace[4],
216		slspace[4];
217	isc_socket_t *sock;
218	ISC_LINK(dig_query_t) link;
219	isc_sockaddr_t sockaddr;
220	isc_time_t time_sent;
221	isc_uint64_t byte_count;
222	isc_buffer_t sendbuf;
223};
224
225struct dig_server {
226	char servername[MXNAME];
227	char userarg[MXNAME];
228	ISC_LINK(dig_server_t) link;
229};
230
231struct dig_searchlist {
232	char origin[MXNAME];
233	ISC_LINK(dig_searchlist_t) link;
234};
235#ifdef DIG_SIGCHASE
236struct dig_message {
237		dns_message_t *msg;
238		ISC_LINK(dig_message_t) link;
239};
240#endif
241
242typedef ISC_LIST(dig_searchlist_t) dig_searchlistlist_t;
243typedef ISC_LIST(dig_lookup_t) dig_lookuplist_t;
244
245/*
246 * Externals from dighost.c
247 */
248
249extern dig_lookuplist_t lookup_list;
250extern dig_serverlist_t server_list;
251extern dig_searchlistlist_t search_list;
252extern unsigned int extrabytes;
253
254extern isc_boolean_t check_ra, have_ipv4, have_ipv6, specified_source,
255	usesearch, showsearch, qr;
256extern in_port_t port;
257extern unsigned int timeout;
258extern isc_mem_t *mctx;
259extern dns_messageid_t id;
260extern int sendcount;
261extern int ndots;
262extern int lookup_counter;
263extern int exitcode;
264extern isc_sockaddr_t bind_address;
265extern char keynametext[MXNAME];
266extern char keyfile[MXNAME];
267extern char keysecret[MXNAME];
268extern dns_name_t *hmacname;
269extern unsigned int digestbits;
270#ifdef DIG_SIGCHASE
271extern char trustedkey[MXNAME];
272#endif
273extern dns_tsigkey_t *key;
274extern isc_boolean_t validated;
275extern isc_taskmgr_t *taskmgr;
276extern isc_task_t *global_task;
277extern isc_boolean_t free_now;
278extern isc_boolean_t debugging, memdebugging;
279
280extern const char *progname;
281extern int tries;
282extern int fatalexit;
283#ifdef WITH_IDN
284extern int idnoptions;
285#endif
286
287/*
288 * Routines in dighost.c.
289 */
290isc_result_t
291get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr);
292
293int
294getaddresses(dig_lookup_t *lookup, const char *host, isc_result_t *resultp);
295
296isc_result_t
297get_reverse(char *reverse, size_t len, char *value, isc_boolean_t ip6_int,
298	    isc_boolean_t strict);
299
300ISC_PLATFORM_NORETURN_PRE void
301fatal(const char *format, ...)
302ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
303
304void
305debug(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
306
307void
308check_result(isc_result_t result, const char *msg);
309
310void
311setup_lookup(dig_lookup_t *lookup);
312
313void
314destroy_lookup(dig_lookup_t *lookup);
315
316void
317do_lookup(dig_lookup_t *lookup);
318
319void
320start_lookup(void);
321
322void
323onrun_callback(isc_task_t *task, isc_event_t *event);
324
325int
326dhmain(int argc, char **argv);
327
328void
329setup_libs(void);
330
331void
332setup_system(void);
333
334isc_result_t
335parse_uint(isc_uint32_t *uip, const char *value, isc_uint32_t max,
336	   const char *desc);
337
338void
339parse_hmac(const char *hmacstr);
340
341dig_lookup_t *
342requeue_lookup(dig_lookup_t *lookold, isc_boolean_t servers);
343
344dig_lookup_t *
345make_empty_lookup(void);
346
347dig_lookup_t *
348clone_lookup(dig_lookup_t *lookold, isc_boolean_t servers);
349
350dig_server_t *
351make_server(const char *servname, const char *userarg);
352
353void
354flush_server_list(void);
355
356void
357set_nameserver(char *opt);
358
359void
360clone_server_list(dig_serverlist_t src,
361		  dig_serverlist_t *dest);
362
363void
364cancel_all(void);
365
366void
367destroy_libs(void);
368
369void
370set_search_domain(char *domain);
371
372#ifdef DIG_SIGCHASE
373void
374clean_trustedkey(void);
375#endif
376
377/*
378 * Routines to be defined in dig.c, host.c, and nslookup.c.
379 */
380#ifdef DIG_SIGCHASE
381isc_result_t
382printrdataset(dns_name_t *owner_name, dns_rdataset_t *rdataset,
383	      isc_buffer_t *target);
384#endif
385
386isc_result_t
387printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers);
388/*%<
389 * Print the final result of the lookup.
390 */
391
392void
393received(int bytes, isc_sockaddr_t *from, dig_query_t *query);
394/*%<
395 * Print a message about where and when the response
396 * was received from, like the final comment in the
397 * output of "dig".
398 */
399
400void
401trying(char *frm, dig_lookup_t *lookup);
402
403void
404dighost_shutdown(void);
405
406char *
407next_token(char **stringp, const char *delim);
408
409#ifdef DIG_SIGCHASE
410/* Chasing functions */
411dns_rdataset_t *
412chase_scanname(dns_name_t *name, dns_rdatatype_t type, dns_rdatatype_t covers);
413void
414chase_sig(dns_message_t *msg);
415#endif
416
417ISC_LANG_ENDDECLS
418
419#endif
420