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