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