2 * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 2000-2003 Internet Software Consortium.
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.
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.
18 /* $Id: dig.h,v 1.105.130.3 2008/12/16 02:59:46 jinmei Exp $ */
25 #include <dns/rdatalist.h>
29 #include <isc/boolean.h>
30 #include <isc/buffer.h>
31 #include <isc/bufferlist.h>
32 #include <isc/formatcheck.h>
36 #include <isc/print.h>
37 #include <isc/sockaddr.h>
38 #include <isc/socket.h>
41 #define MXNAME (DNS_NAME_MAXTEXT+1)
45 #define COMMSIZE 0xffff
47 /*% location of resolve.conf */
48 #define RESOLV_CONF "/etc/resolv.conf"
51 #define OUTPUTBUF 32767
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
64 /*% Default TCP Timeout */
65 #define TCP_TIMEOUT 10
66 /*% Default UDP Timeout */
69 #define SERVER_TIMEOUT 1
71 #define LOOKUP_LIMIT 64
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.
79 * Defaults for the sigchase suboptions. Consolidated here because
80 * these control the layout of dig_lookup_t (among other things).
83 #ifndef DIG_SIGCHASE_BU
84 #define DIG_SIGCHASE_BU 1
86 #ifndef DIG_SIGCHASE_TD
87 #define DIG_SIGCHASE_TD 1
93 typedef struct dig_lookup dig_lookup_t
;
94 typedef struct dig_query dig_query_t
;
95 typedef struct dig_server dig_server_t
;
97 typedef struct dig_message dig_message_t
;
99 typedef ISC_LIST(dig_server_t
) dig_serverlist_t
;
100 typedef struct dig_searchlist dig_searchlist_t
;
102 /*% The dig_lookup structure */
105 pending
, /*%< Pending a successful answer */
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 */
117 trace
, /*% dig +trace */
118 trace_root
, /*% initial query for either +trace or +nssearch */
133 nsid
; /*% Name Server ID (RFC 5001) */
135 isc_boolean_t sigchase
;
137 isc_boolean_t do_topdown
,
141 /* Name we are going to validate RRset */
142 char textnamesigchase
[MXNAME
];
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
;
151 dns_rdatatype_t rdtype_sigchase
;
152 dns_rdatatype_t qrdtype_sigchase
;
153 dns_rdataclass_t rdclass_sigchase
;
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
;
166 isc_interval_t interval
;
167 dns_message_t
*sendmsg
;
169 ISC_LINK(dig_lookup_t
) link
;
170 ISC_LIST(dig_query_t
) q
;
171 dig_query_t
*current_query
;
172 dig_serverlist_t my_server_list
;
173 dig_searchlist_t
*origin
;
175 isc_uint32_t retries
;
177 isc_uint16_t udpsize
;
179 isc_uint32_t ixfr_serial
;
180 isc_buffer_t rdatabuf
;
181 char rdatastore
[MXNAME
];
182 dst_context_t
*tsigctx
;
183 isc_buffer_t
*querysig
;
184 isc_uint32_t msgcounter
;
185 dns_fixedname_t fdomain
;
188 /*% The dig_query structure */
190 dig_lookup_t
*lookup
;
191 isc_boolean_t waiting_connect
,
200 isc_uint32_t first_rr_serial
;
201 isc_uint32_t second_rr_serial
;
202 isc_uint32_t msg_count
;
203 isc_uint32_t rr_count
;
206 isc_bufferlist_t sendlist
,
209 isc_buffer_t recvbuf
,
216 ISC_LINK(dig_query_t
) link
;
217 isc_sockaddr_t sockaddr
;
218 isc_time_t time_sent
;
219 isc_uint64_t byte_count
;
220 isc_buffer_t sendbuf
;
224 char servername
[MXNAME
];
225 char userarg
[MXNAME
];
226 ISC_LINK(dig_server_t
) link
;
229 struct dig_searchlist
{
231 ISC_LINK(dig_searchlist_t
) link
;
236 ISC_LINK(dig_message_t
) link
;
240 typedef ISC_LIST(dig_searchlist_t
) dig_searchlistlist_t
;
241 typedef ISC_LIST(dig_lookup_t
) dig_lookuplist_t
;
244 * Externals from dighost.c
247 extern dig_lookuplist_t lookup_list
;
248 extern dig_serverlist_t server_list
;
249 extern dig_searchlistlist_t search_list
;
250 extern unsigned int extrabytes
;
252 extern isc_boolean_t check_ra
, have_ipv4
, have_ipv6
, specified_source
,
253 usesearch
, showsearch
, qr
;
254 extern in_port_t port
;
255 extern unsigned int timeout
;
256 extern isc_mem_t
*mctx
;
257 extern dns_messageid_t id
;
258 extern int sendcount
;
260 extern int lookup_counter
;
262 extern isc_sockaddr_t bind_address
;
263 extern char keynametext
[MXNAME
];
264 extern char keyfile
[MXNAME
];
265 extern char keysecret
[MXNAME
];
266 extern dns_name_t
*hmacname
;
267 extern unsigned int digestbits
;
269 extern char trustedkey
[MXNAME
];
271 extern dns_tsigkey_t
*key
;
272 extern isc_boolean_t validated
;
273 extern isc_taskmgr_t
*taskmgr
;
274 extern isc_task_t
*global_task
;
275 extern isc_boolean_t free_now
;
276 extern isc_boolean_t debugging
, memdebugging
;
278 extern char *progname
;
280 extern int fatalexit
;
282 extern int idnoptions
;
286 * Routines in dighost.c.
289 get_address(char *host
, in_port_t port
, isc_sockaddr_t
*sockaddr
);
292 get_reverse(char *reverse
, size_t len
, char *value
, isc_boolean_t ip6_int
,
293 isc_boolean_t strict
);
296 fatal(const char *format
, ...) ISC_FORMAT_PRINTF(1, 2);
299 debug(const char *format
, ...) ISC_FORMAT_PRINTF(1, 2);
302 check_result(isc_result_t result
, const char *msg
);
305 setup_lookup(dig_lookup_t
*lookup
);
308 destroy_lookup(dig_lookup_t
*lookup
);
311 do_lookup(dig_lookup_t
*lookup
);
317 onrun_callback(isc_task_t
*task
, isc_event_t
*event
);
320 dhmain(int argc
, char **argv
);
329 requeue_lookup(dig_lookup_t
*lookold
, isc_boolean_t servers
);
332 make_empty_lookup(void);
335 clone_lookup(dig_lookup_t
*lookold
, isc_boolean_t servers
);
338 make_server(const char *servname
, const char *userarg
);
341 flush_server_list(void);
344 set_nameserver(char *opt
);
347 clone_server_list(dig_serverlist_t src
,
348 dig_serverlist_t
*dest
);
357 set_search_domain(char *domain
);
361 clean_trustedkey(void);
365 * Routines to be defined in dig.c, host.c, and nslookup.c.
369 printrdataset(dns_name_t
*owner_name
, dns_rdataset_t
*rdataset
,
370 isc_buffer_t
*target
);
374 printmessage(dig_query_t
*query
, dns_message_t
*msg
, isc_boolean_t headers
);
376 * Print the final result of the lookup.
380 received(int bytes
, isc_sockaddr_t
*from
, dig_query_t
*query
);
382 * Print a message about where and when the response
383 * was received from, like the final comment in the
388 trying(char *frm
, dig_lookup_t
*lookup
);
391 dighost_shutdown(void);
394 next_token(char **stringp
, const char *delim
);
397 /* Chasing functions */
399 chase_scanname(dns_name_t
*name
, dns_rdatatype_t type
, dns_rdatatype_t covers
);
401 chase_sig(dns_message_t
*msg
);