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