15185a700Sflorian /* 25185a700Sflorian * Copyright (C) Internet Systems Consortium, Inc. ("ISC") 35185a700Sflorian * 45185a700Sflorian * Permission to use, copy, modify, and/or distribute this software for any 55185a700Sflorian * purpose with or without fee is hereby granted, provided that the above 65185a700Sflorian * copyright notice and this permission notice appear in all copies. 75185a700Sflorian * 85185a700Sflorian * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 95185a700Sflorian * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 105185a700Sflorian * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 115185a700Sflorian * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 125185a700Sflorian * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 135185a700Sflorian * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 145185a700Sflorian * PERFORMANCE OF THIS SOFTWARE. 155185a700Sflorian */ 165185a700Sflorian 175185a700Sflorian #ifndef DIG_H 185185a700Sflorian #define DIG_H 195185a700Sflorian 205185a700Sflorian /*! \file */ 215185a700Sflorian 224465bcfbSjsg #include <time.h> 234465bcfbSjsg 245185a700Sflorian #include <dst/dst.h> 255185a700Sflorian 265185a700Sflorian #include <isc/buffer.h> 275185a700Sflorian #include <isc/list.h> 285185a700Sflorian #include <isc/sockaddr.h> 295185a700Sflorian #include <isc/socket.h> 305185a700Sflorian 315185a700Sflorian #define MXSERV 20 325185a700Sflorian #define MXNAME (DNS_NAME_MAXTEXT+1) 335185a700Sflorian #define MXRD 32 345185a700Sflorian /*% Buffer Size */ 355185a700Sflorian #define BUFSIZE 512 365185a700Sflorian #define COMMSIZE 0xffff 375185a700Sflorian /*% output buffer */ 385185a700Sflorian #define OUTPUTBUF 32767 395185a700Sflorian /*% Max RR Limit */ 405185a700Sflorian #define MAXRRLIMIT 0xffffffff 415185a700Sflorian #define MAXTIMEOUT 0xffff 425185a700Sflorian /*% Max number of tries */ 435185a700Sflorian #define MAXTRIES 0xffffffff 445185a700Sflorian /*% Max number of dots */ 455185a700Sflorian #define MAXNDOTS 0xffff 465185a700Sflorian /*% Max number of ports */ 475185a700Sflorian #define MAXPORT 0xffff 485185a700Sflorian /*% Max serial number */ 495185a700Sflorian #define MAXSERIAL 0xffffffff 505185a700Sflorian 515185a700Sflorian /*% Default TCP Timeout */ 525185a700Sflorian #define TCP_TIMEOUT 10 535185a700Sflorian /*% Default UDP Timeout */ 545185a700Sflorian #define UDP_TIMEOUT 5 555185a700Sflorian 565185a700Sflorian #define SERVER_TIMEOUT 1 575185a700Sflorian 585185a700Sflorian #define LOOKUP_LIMIT 64 595185a700Sflorian /*% 605185a700Sflorian * Lookup_limit is just a limiter, keeping too many lookups from being 615185a700Sflorian * created. It's job is mainly to prevent the program from running away 625185a700Sflorian * in a tight loop of constant lookups. It's value is arbitrary. 635185a700Sflorian */ 645185a700Sflorian 655185a700Sflorian /* 665185a700Sflorian * Defaults for the sigchase suboptions. Consolidated here because 675185a700Sflorian * these control the layout of dig_lookup_t (among other things). 685185a700Sflorian */ 695185a700Sflorian 705185a700Sflorian typedef struct dig_lookup dig_lookup_t; 715185a700Sflorian typedef struct dig_query dig_query_t; 725185a700Sflorian typedef struct dig_server dig_server_t; 735185a700Sflorian typedef ISC_LIST(dig_server_t) dig_serverlist_t; 745185a700Sflorian typedef struct dig_searchlist dig_searchlist_t; 755185a700Sflorian 765185a700Sflorian /*% The dig_lookup structure */ 775185a700Sflorian struct dig_lookup { 781fb015a8Sflorian int 795185a700Sflorian pending, /*%< Pending a successful answer */ 805185a700Sflorian waiting_connect, 815185a700Sflorian doing_xfr, 825185a700Sflorian ns_search_only, /*%< dig +nssearch, host -C */ 835185a700Sflorian identify, /*%< Append an "on server <foo>" message */ 845185a700Sflorian identify_previous_line, /*% Prepend a "Nameserver <foo>:" 855185a700Sflorian message, with newline and tab */ 865185a700Sflorian ignore, 875185a700Sflorian recurse, 885185a700Sflorian aaonly, 895185a700Sflorian adflag, 905185a700Sflorian cdflag, 915185a700Sflorian trace, /*% dig +trace */ 925185a700Sflorian trace_root, /*% initial query for either +trace or +nssearch */ 935185a700Sflorian tcp_mode, 945185a700Sflorian tcp_mode_set, 955185a700Sflorian ip6_int, 965185a700Sflorian comments, 975185a700Sflorian stats, 985185a700Sflorian section_question, 995185a700Sflorian section_answer, 1005185a700Sflorian section_authority, 1015185a700Sflorian section_additional, 1025185a700Sflorian servfail_stops, 1035185a700Sflorian new_search, 1045185a700Sflorian need_search, 1055185a700Sflorian done_as_is, 1065185a700Sflorian besteffort, 1075185a700Sflorian dnssec, 1085185a700Sflorian expire, 1095185a700Sflorian sit, 1105185a700Sflorian nsid, /*% Name Server ID (RFC 5001) */ 1115185a700Sflorian ednsneg, 1125185a700Sflorian mapped, 1135185a700Sflorian idnout; 1145185a700Sflorian 1155185a700Sflorian char textname[MXNAME]; /*% Name we're going to be looking up */ 1165185a700Sflorian char cmdline[MXNAME]; 1175185a700Sflorian dns_rdatatype_t rdtype; 1185185a700Sflorian dns_rdatatype_t qrdtype; 1195185a700Sflorian dns_rdataclass_t rdclass; 1201fb015a8Sflorian int rdtypeset; 1211fb015a8Sflorian int rdclassset; 1225185a700Sflorian char name_space[BUFSIZE]; 1235185a700Sflorian char oname_space[BUFSIZE]; 1245185a700Sflorian isc_buffer_t namebuf; 1255185a700Sflorian isc_buffer_t onamebuf; 1265185a700Sflorian isc_buffer_t renderbuf; 1275185a700Sflorian char *sendspace; 1285185a700Sflorian dns_name_t *name; 1297238a213Sflorian struct timespec interval; 1305185a700Sflorian dns_message_t *sendmsg; 1315185a700Sflorian dns_name_t *oname; 1325185a700Sflorian ISC_LINK(dig_lookup_t) link; 1335185a700Sflorian ISC_LIST(dig_query_t) q; 1345185a700Sflorian ISC_LIST(dig_query_t) connecting; 1355185a700Sflorian dig_query_t *current_query; 1365185a700Sflorian dig_serverlist_t my_server_list; 1375185a700Sflorian dig_searchlist_t *origin; 1385185a700Sflorian dig_query_t *xfr_q; 1395185a700Sflorian uint32_t retries; 1405185a700Sflorian int nsfound; 1415185a700Sflorian uint16_t udpsize; 1425185a700Sflorian int16_t edns; 1435185a700Sflorian uint32_t ixfr_serial; 1445185a700Sflorian isc_buffer_t rdatabuf; 1455185a700Sflorian char rdatastore[MXNAME]; 1465185a700Sflorian dst_context_t *tsigctx; 1475185a700Sflorian isc_buffer_t *querysig; 1485185a700Sflorian uint32_t msgcounter; 1495185a700Sflorian dns_fixedname_t fdomain; 150*b1a294b5Sflorian struct sockaddr_storage *ecs_addr; 1518c9fac11Sflorian int ecs_plen; 1525185a700Sflorian char *sitvalue; 1535185a700Sflorian dns_ednsopt_t *ednsopts; 1545185a700Sflorian unsigned int ednsoptscnt; 1555185a700Sflorian unsigned int ednsflags; 1565185a700Sflorian dns_opcode_t opcode; 1575185a700Sflorian unsigned int eoferr; 1585185a700Sflorian }; 1595185a700Sflorian 1605185a700Sflorian /*% The dig_query structure */ 1615185a700Sflorian struct dig_query { 1625185a700Sflorian dig_lookup_t *lookup; 1631fb015a8Sflorian int waiting_connect, 1645185a700Sflorian pending_free, 1655185a700Sflorian waiting_senddone, 1665185a700Sflorian first_pass, 1675185a700Sflorian first_soa_rcvd, 1685185a700Sflorian second_rr_rcvd, 1695185a700Sflorian first_repeat_rcvd, 1705185a700Sflorian recv_made, 1715185a700Sflorian warn_id, 1725185a700Sflorian timedout; 1735185a700Sflorian uint32_t first_rr_serial; 1745185a700Sflorian uint32_t second_rr_serial; 1755185a700Sflorian uint32_t msg_count; 1765185a700Sflorian uint32_t rr_count; 1771fb015a8Sflorian int ixfr_axfr; 1785185a700Sflorian char *servname; 1795185a700Sflorian char *userarg; 1805185a700Sflorian isc_bufferlist_t sendlist, 1815185a700Sflorian recvlist, 1825185a700Sflorian lengthlist; 1835185a700Sflorian isc_buffer_t recvbuf, 1845185a700Sflorian lengthbuf, 1855185a700Sflorian slbuf; 1865185a700Sflorian char *recvspace, 1875185a700Sflorian lengthspace[4], 1885185a700Sflorian slspace[4]; 1895185a700Sflorian isc_socket_t *sock; 1905185a700Sflorian ISC_LINK(dig_query_t) link; 1915185a700Sflorian ISC_LINK(dig_query_t) clink; 192*b1a294b5Sflorian struct sockaddr_storage sockaddr; 1937238a213Sflorian struct timespec time_sent; 1947238a213Sflorian struct timespec time_recv; 1955185a700Sflorian uint64_t byte_count; 1965185a700Sflorian isc_buffer_t sendbuf; 1975185a700Sflorian isc_timer_t *timer; 1985185a700Sflorian }; 1995185a700Sflorian 2005185a700Sflorian struct dig_server { 2015185a700Sflorian char servername[MXNAME]; 2025185a700Sflorian char userarg[MXNAME]; 2035185a700Sflorian ISC_LINK(dig_server_t) link; 2045185a700Sflorian }; 2055185a700Sflorian 2065185a700Sflorian struct dig_searchlist { 2075185a700Sflorian char origin[MXNAME]; 2085185a700Sflorian ISC_LINK(dig_searchlist_t) link; 2095185a700Sflorian }; 2105185a700Sflorian 2115185a700Sflorian typedef ISC_LIST(dig_searchlist_t) dig_searchlistlist_t; 2125185a700Sflorian typedef ISC_LIST(dig_lookup_t) dig_lookuplist_t; 2135185a700Sflorian 2145185a700Sflorian /* 2155185a700Sflorian * Externals from dighost.c 2165185a700Sflorian */ 2175185a700Sflorian 2185185a700Sflorian extern dig_lookuplist_t lookup_list; 2195185a700Sflorian extern dig_serverlist_t server_list; 220927deb69Sflorian extern dig_serverlist_t root_hints_server_list; 2215185a700Sflorian extern dig_searchlistlist_t search_list; 2225185a700Sflorian extern unsigned int extrabytes; 2235185a700Sflorian 2241fb015a8Sflorian extern int check_ra, have_ipv4, have_ipv6, specified_source, 2255185a700Sflorian usesearch, showsearch, qr; 2265185a700Sflorian extern in_port_t port; 2275185a700Sflorian extern unsigned int timeout; 2285185a700Sflorian extern int sendcount; 2295185a700Sflorian extern int ndots; 2305185a700Sflorian extern int lookup_counter; 2315185a700Sflorian extern int exitcode; 232*b1a294b5Sflorian extern struct sockaddr_storage bind_address; 2335185a700Sflorian extern char keynametext[MXNAME]; 2345185a700Sflorian extern char keyfile[MXNAME]; 2355185a700Sflorian extern char keysecret[MXNAME]; 2365185a700Sflorian extern dns_name_t *hmacname; 2375185a700Sflorian extern unsigned int digestbits; 2385185a700Sflorian extern dns_tsigkey_t *tsigkey; 2391fb015a8Sflorian extern int validated; 2405185a700Sflorian extern isc_taskmgr_t *taskmgr; 2415185a700Sflorian extern isc_task_t *global_task; 2421fb015a8Sflorian extern int free_now; 2431fb015a8Sflorian extern int debugging, debugtiming; 2441fb015a8Sflorian extern int keep_open; 2455185a700Sflorian 2465185a700Sflorian extern char *progname; 2475185a700Sflorian extern int tries; 2485185a700Sflorian extern int fatalexit; 2495185a700Sflorian 2505185a700Sflorian int host_main(int, char **); 2515185a700Sflorian int nslookup_main(int, char **); 2525185a700Sflorian 2535185a700Sflorian /* 2545185a700Sflorian * Routines in dighost.c. 2555185a700Sflorian */ 2565185a700Sflorian isc_result_t 257*b1a294b5Sflorian get_address(char *host, in_port_t port, struct sockaddr_storage *sockaddr); 2585185a700Sflorian 2595185a700Sflorian int 2605185a700Sflorian getaddresses(dig_lookup_t *lookup, const char *host, isc_result_t *resultp); 2615185a700Sflorian 2625185a700Sflorian isc_result_t 2631fb015a8Sflorian get_reverse(char *reverse, size_t len, char *value, int ip6_int, 2641fb015a8Sflorian int strict); 2655185a700Sflorian 2665185a700Sflorian __dead void 2675185a700Sflorian fatal(const char *format, ...) 26887f06ebfSflorian __attribute__((__format__(__printf__, 1, 2))); 2695185a700Sflorian 2705185a700Sflorian void 27187f06ebfSflorian debug(const char *format, ...) __attribute__((__format__(__printf__, 1, 2))); 2725185a700Sflorian 2735185a700Sflorian void 2745185a700Sflorian check_result(isc_result_t result, const char *msg); 2755185a700Sflorian 2761fb015a8Sflorian int 2775185a700Sflorian setup_lookup(dig_lookup_t *lookup); 2785185a700Sflorian 2795185a700Sflorian void 2805185a700Sflorian destroy_lookup(dig_lookup_t *lookup); 2815185a700Sflorian 2825185a700Sflorian void 2835185a700Sflorian do_lookup(dig_lookup_t *lookup); 2845185a700Sflorian 2855185a700Sflorian void 2865185a700Sflorian start_lookup(void); 2875185a700Sflorian 2885185a700Sflorian void 2895185a700Sflorian onrun_callback(isc_task_t *task, isc_event_t *event); 2905185a700Sflorian 2915185a700Sflorian void 2925185a700Sflorian setup_libs(void); 2935185a700Sflorian 2945185a700Sflorian void 2951fb015a8Sflorian setup_system(int ipv4only, int ipv6only); 2965185a700Sflorian 2975185a700Sflorian isc_result_t 298*b1a294b5Sflorian parse_netprefix(struct sockaddr_storage **sap, int *plen, const char *value); 2995185a700Sflorian 3005185a700Sflorian void 3015185a700Sflorian parse_hmac(const char *hmacstr); 3025185a700Sflorian 3035185a700Sflorian dig_lookup_t * 3041fb015a8Sflorian requeue_lookup(dig_lookup_t *lookold, int servers); 3055185a700Sflorian 3065185a700Sflorian dig_lookup_t * 3075185a700Sflorian make_empty_lookup(void); 3085185a700Sflorian 3095185a700Sflorian dig_lookup_t * 3101fb015a8Sflorian clone_lookup(dig_lookup_t *lookold, int servers); 3115185a700Sflorian 3125185a700Sflorian dig_server_t * 3135185a700Sflorian make_server(const char *servname, const char *userarg); 3145185a700Sflorian 3155185a700Sflorian void 3165185a700Sflorian flush_server_list(void); 3175185a700Sflorian 318aebd9aa6Sderaadt isc_result_t 3195185a700Sflorian set_nameserver(char *opt); 3205185a700Sflorian 3215185a700Sflorian void 3225185a700Sflorian clone_server_list(dig_serverlist_t src, 3235185a700Sflorian dig_serverlist_t *dest); 3245185a700Sflorian 3255185a700Sflorian void 3265185a700Sflorian cancel_all(void); 3275185a700Sflorian 3285185a700Sflorian void 3295185a700Sflorian destroy_libs(void); 3305185a700Sflorian 3315185a700Sflorian void 3325185a700Sflorian set_search_domain(char *domain); 3335185a700Sflorian 3345185a700Sflorian char * 3355185a700Sflorian next_token(char **stringp, const char *delim); 3365185a700Sflorian 337427f8978Sflorian int64_t 338427f8978Sflorian uelapsed(const struct timespec *t1, const struct timespec *t2); 339427f8978Sflorian 3405185a700Sflorian /* 3415185a700Sflorian * Routines to be defined in dig.c, host.c, and nslookup.c. and 3425185a700Sflorian * then assigned to the appropriate function pointer 3435185a700Sflorian */ 3445185a700Sflorian 3455185a700Sflorian extern isc_result_t 3461fb015a8Sflorian (*dighost_printmessage)(dig_query_t *query, dns_message_t *msg, int headers); 3475185a700Sflorian /*%< 3485185a700Sflorian * Print the final result of the lookup. 3495185a700Sflorian */ 3505185a700Sflorian 3515185a700Sflorian extern void 352*b1a294b5Sflorian (*dighost_received)(unsigned int bytes, struct sockaddr_storage *from, dig_query_t *query); 3535185a700Sflorian /*%< 3545185a700Sflorian * Print a message about where and when the response 3555185a700Sflorian * was received from, like the final comment in the 3565185a700Sflorian * output of "dig". 3575185a700Sflorian */ 3585185a700Sflorian 3595185a700Sflorian extern void 3605185a700Sflorian (*dighost_trying)(char *frm, dig_lookup_t *lookup); 3615185a700Sflorian 3625185a700Sflorian extern void 3635185a700Sflorian (*dighost_shutdown)(void); 3645185a700Sflorian 3655185a700Sflorian void save_opt(dig_lookup_t *lookup, char *code, char *value); 3665185a700Sflorian 3675185a700Sflorian void setup_file_key(void); 3685185a700Sflorian void setup_text_key(void); 3695185a700Sflorian 3705185a700Sflorian /* 3715185a700Sflorian * Routines exported from dig.c for use by dig for iOS 3725185a700Sflorian */ 3735185a700Sflorian 3745185a700Sflorian /*%< 3755185a700Sflorian * Call once only to set up libraries, parse global 3765185a700Sflorian * parameters and initial command line query parameters 3775185a700Sflorian */ 3785185a700Sflorian void 3795185a700Sflorian dig_setup(int argc, char **argv); 3805185a700Sflorian 3815185a700Sflorian /*%< 3825185a700Sflorian * Call to supply new parameters for the next lookup 3835185a700Sflorian */ 3845185a700Sflorian void 3851fb015a8Sflorian dig_query_setup(int, int, int argc, char **argv); 3865185a700Sflorian 3875185a700Sflorian /*%< 3885185a700Sflorian * set the main application event cycle running 3895185a700Sflorian */ 3905185a700Sflorian void 3915185a700Sflorian dig_startup(void); 3925185a700Sflorian 3935185a700Sflorian /*%< 3945185a700Sflorian * Cleans up the application 3955185a700Sflorian */ 3965185a700Sflorian void 3975185a700Sflorian dig_shutdown(void); 3985185a700Sflorian 3995185a700Sflorian #endif 400