xref: /openbsd-src/usr.bin/dig/dig.h (revision db6316a3523340d2ca2fb492fb6ddf9cf77e15f6)
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