Annotation of src/usr.bin/dig/dig.h, Revision 1.16
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:
1.9 jsg 22: #include <time.h>
23:
1.1 florian 24: #include <dst/dst.h>
25:
26: #include <isc/buffer.h>
27: #include <isc/list.h>
28: #include <isc/sockaddr.h>
29: #include <isc/socket.h>
30:
31: #define MXSERV 20
32: #define MXNAME (DNS_NAME_MAXTEXT+1)
33: #define MXRD 32
34: /*% Buffer Size */
35: #define BUFSIZE 512
36: #define COMMSIZE 0xffff
37: /*% output buffer */
38: #define OUTPUTBUF 32767
39: /*% Max RR Limit */
40: #define MAXRRLIMIT 0xffffffff
41: #define MAXTIMEOUT 0xffff
42: /*% Max number of tries */
43: #define MAXTRIES 0xffffffff
44: /*% Max number of dots */
45: #define MAXNDOTS 0xffff
46: /*% Max number of ports */
47: #define MAXPORT 0xffff
48: /*% Max serial number */
49: #define MAXSERIAL 0xffffffff
50:
51: /*% Default TCP Timeout */
52: #define TCP_TIMEOUT 10
53: /*% Default UDP Timeout */
54: #define UDP_TIMEOUT 5
55:
56: #define SERVER_TIMEOUT 1
57:
58: #define LOOKUP_LIMIT 64
59: /*%
60: * Lookup_limit is just a limiter, keeping too many lookups from being
61: * created. It's job is mainly to prevent the program from running away
62: * in a tight loop of constant lookups. It's value is arbitrary.
63: */
64:
65: /*
66: * Defaults for the sigchase suboptions. Consolidated here because
67: * these control the layout of dig_lookup_t (among other things).
68: */
69:
70: typedef struct dig_lookup dig_lookup_t;
71: typedef struct dig_query dig_query_t;
72: typedef struct dig_server dig_server_t;
73: typedef ISC_LIST(dig_server_t) dig_serverlist_t;
74: typedef struct dig_searchlist dig_searchlist_t;
75:
76: /*% The dig_lookup structure */
77: struct dig_lookup {
1.13 florian 78: int
1.1 florian 79: pending, /*%< Pending a successful answer */
80: waiting_connect,
81: doing_xfr,
82: ns_search_only, /*%< dig +nssearch, host -C */
83: identify, /*%< Append an "on server <foo>" message */
84: identify_previous_line, /*% Prepend a "Nameserver <foo>:"
85: message, with newline and tab */
86: ignore,
87: recurse,
88: aaonly,
89: adflag,
90: cdflag,
91: trace, /*% dig +trace */
92: trace_root, /*% initial query for either +trace or +nssearch */
93: tcp_mode,
94: tcp_mode_set,
95: ip6_int,
96: comments,
97: stats,
98: section_question,
99: section_answer,
100: section_authority,
101: section_additional,
102: servfail_stops,
103: new_search,
104: need_search,
105: done_as_is,
106: besteffort,
107: dnssec,
108: expire,
109: sit,
110: nsid, /*% Name Server ID (RFC 5001) */
111: ednsneg,
112: mapped,
113: idnout;
114:
115: char textname[MXNAME]; /*% Name we're going to be looking up */
116: char cmdline[MXNAME];
117: dns_rdatatype_t rdtype;
118: dns_rdatatype_t qrdtype;
119: dns_rdataclass_t rdclass;
1.13 florian 120: int rdtypeset;
121: int rdclassset;
1.1 florian 122: char name_space[BUFSIZE];
123: char oname_space[BUFSIZE];
124: isc_buffer_t namebuf;
125: isc_buffer_t onamebuf;
126: isc_buffer_t renderbuf;
127: char *sendspace;
128: dns_name_t *name;
1.8 florian 129: struct timespec interval;
1.1 florian 130: dns_message_t *sendmsg;
131: dns_name_t *oname;
132: ISC_LINK(dig_lookup_t) link;
133: ISC_LIST(dig_query_t) q;
134: ISC_LIST(dig_query_t) connecting;
135: dig_query_t *current_query;
136: dig_serverlist_t my_server_list;
137: dig_searchlist_t *origin;
138: dig_query_t *xfr_q;
139: uint32_t retries;
140: int nsfound;
141: uint16_t udpsize;
142: int16_t edns;
143: uint32_t ixfr_serial;
144: isc_buffer_t rdatabuf;
145: char rdatastore[MXNAME];
146: dst_context_t *tsigctx;
147: isc_buffer_t *querysig;
148: uint32_t msgcounter;
149: dns_fixedname_t fdomain;
1.15 florian 150: struct sockaddr_storage *ecs_addr;
1.14 florian 151: int ecs_plen;
1.1 florian 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;
1.13 florian 163: int waiting_connect,
1.1 florian 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;
1.13 florian 177: int ixfr_axfr;
1.1 florian 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;
1.15 florian 192: struct sockaddr_storage sockaddr;
1.8 florian 193: struct timespec time_sent;
194: struct timespec time_recv;
1.1 florian 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:
1.13 florian 224: extern int check_ra, have_ipv4, have_ipv6, specified_source,
1.1 florian 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;
1.15 florian 232: extern struct sockaddr_storage bind_address;
1.1 florian 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;
1.13 florian 239: extern int validated;
1.1 florian 240: extern isc_taskmgr_t *taskmgr;
241: extern isc_task_t *global_task;
1.13 florian 242: extern int free_now;
243: extern int debugging, debugtiming;
244: extern int keep_open;
1.1 florian 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
1.15 florian 257: get_address(char *host, in_port_t port, struct sockaddr_storage *sockaddr);
1.1 florian 258:
259: int
260: getaddresses(dig_lookup_t *lookup, const char *host, isc_result_t *resultp);
261:
262: isc_result_t
1.13 florian 263: get_reverse(char *reverse, size_t len, char *value, int ip6_int,
264: int strict);
1.1 florian 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:
1.13 florian 276: int
1.1 florian 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: void
292: setup_libs(void);
293:
294: void
1.13 florian 295: setup_system(int ipv4only, int ipv6only);
1.1 florian 296:
297: isc_result_t
1.15 florian 298: parse_netprefix(struct sockaddr_storage **sap, int *plen, const char *value);
1.1 florian 299:
300: void
301: parse_hmac(const char *hmacstr);
302:
303: dig_lookup_t *
1.13 florian 304: requeue_lookup(dig_lookup_t *lookold, int servers);
1.1 florian 305:
306: dig_lookup_t *
307: make_empty_lookup(void);
308:
309: dig_lookup_t *
1.13 florian 310: clone_lookup(dig_lookup_t *lookold, int servers);
1.1 florian 311:
312: dig_server_t *
313: make_server(const char *servname, const char *userarg);
314:
315: void
316: flush_server_list(void);
317:
1.10 deraadt 318: isc_result_t
1.1 florian 319: set_nameserver(char *opt);
320:
321: void
322: clone_server_list(dig_serverlist_t src,
323: dig_serverlist_t *dest);
324:
325: void
326: cancel_all(void);
327:
328: void
329: destroy_libs(void);
330:
331: void
332: set_search_domain(char *domain);
333:
334: char *
335: next_token(char **stringp, const char *delim);
336:
1.12 florian 337: int64_t
338: uelapsed(const struct timespec *t1, const struct timespec *t2);
339:
1.1 florian 340: /*
341: * Routines to be defined in dig.c, host.c, and nslookup.c. and
342: * then assigned to the appropriate function pointer
343: */
344:
345: extern isc_result_t
1.13 florian 346: (*dighost_printmessage)(dig_query_t *query, dns_message_t *msg, int headers);
1.1 florian 347: /*%<
348: * Print the final result of the lookup.
349: */
350:
351: extern void
1.15 florian 352: (*dighost_received)(unsigned int bytes, struct sockaddr_storage *from, dig_query_t *query);
1.1 florian 353: /*%<
354: * Print a message about where and when the response
355: * was received from, like the final comment in the
356: * output of "dig".
357: */
358:
359: extern void
360: (*dighost_trying)(char *frm, dig_lookup_t *lookup);
361:
362: extern void
363: (*dighost_shutdown)(void);
364:
365: void save_opt(dig_lookup_t *lookup, char *code, char *value);
366:
367: void setup_file_key(void);
368: void setup_text_key(void);
369:
370: /*
371: * Routines exported from dig.c for use by dig for iOS
372: */
373:
374: /*%<
375: * Call once only to set up libraries, parse global
376: * parameters and initial command line query parameters
377: */
378: void
379: dig_setup(int argc, char **argv);
380:
381: /*%<
382: * Call to supply new parameters for the next lookup
383: */
384: void
1.13 florian 385: dig_query_setup(int, int, int argc, char **argv);
1.1 florian 386:
387: /*%<
388: * set the main application event cycle running
389: */
390: void
391: dig_startup(void);
392:
393: /*%<
394: * Cleans up the application
395: */
396: void
397: dig_shutdown(void);
398:
399: #endif