/* * Copyright (C) 2000, 2001 Nominum, Inc. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * Copyright (C) 2004 - 2006 Nominum, Inc. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose with or without fee is hereby granted, * provided that the above copyright notice and this permission notice * appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "version.h" /* * Configuration defaults */ #define DEF_SERVER_TO_QUERY "127.0.0.1" #define DEF_SERVER_PORT 53 #define DEF_BUFFER_SIZE 32 /* in k */ /* * Other constants / definitions */ #define COMMENT_CHAR ';' #define MAX_INPUT_LEN 512 #define EDNSLEN 11 #define MAX_UDP_PACKET 512 #define MAX_EDNS_PACKET 4096 #define MAX_RECV_PACKET 4096 #define TSIG_HMACMD5_NAME "\010hmac-md5\007sig-alg\003reg\003int" #define WHITESPACE " \t\n" /* * Data type definitions */ struct query_status; typedef ISC_LIST(struct query_status) query_list; struct query_status { struct timeval sent_timestamp; char *desc; /* * This link links the query into the list of outstanding * queries or the list of available query IDs. */ ISC_LINK(struct query_status) link; /* * The list this query is on. */ query_list *list; }; /* * Configuration options (global) */ #ifdef DEFINE_GLOBALS #define EXTERN #define INIT(value) = value #else #define EXTERN extern #define INIT(value) #endif EXTERN isc_boolean_t print_arguments INIT(ISC_FALSE); EXTERN isc_uint32_t socket_bufsize INIT(DEF_BUFFER_SIZE); EXTERN int family INIT(AF_UNSPEC); EXTERN const char *datafile_name; /* init NULL */ EXTERN const char *server_name INIT(DEF_SERVER_TO_QUERY); EXTERN in_port_t server_port INIT(DEF_SERVER_PORT); EXTERN isc_sockaddr_t server_addr; EXTERN char server_addr_str[ISC_NETADDR_FORMATSIZE]; EXTERN isc_boolean_t edns INIT(ISC_FALSE); EXTERN isc_boolean_t dnssec INIT(ISC_FALSE); EXTERN isc_boolean_t verbose INIT(ISC_FALSE); EXTERN char *tsigkeyarg; /* init NULL */ EXTERN isc_boolean_t update_mode INIT(ISC_FALSE); /* * Other global stuff */ EXTERN const char *progname; EXTERN unsigned char outpacket_buffer[MAX_EDNS_PACKET]; EXTERN unsigned char inpacket_buffer[MAX_RECV_PACKET]; EXTERN isc_uint64_t total_request_size; EXTERN isc_uint64_t total_response_size; EXTERN FILE *datafile; /* init NULL */ EXTERN unsigned int num_queries_sent; /* init 0 */ EXTERN unsigned int num_queries_outstanding; /* init 0 */ EXTERN struct timeval time_now; /* init {0,0} */ EXTERN struct timeval time_of_program_start; /* init {0,0} */ EXTERN struct timeval time_of_end_of_run; /* init {0,0} */ EXTERN isc_mem_t *mctx; /* init NULL */ EXTERN isc_lex_t *lexer; /* init NULL */ EXTERN dns_compress_t compress; EXTERN isc_region_t tsigalg; EXTERN dns_fixedname_t tsigfname; EXTERN dns_name_t *tsigname; /* init NULL */ EXTERN unsigned char tsigdata[256]; EXTERN isc_buffer_t tsigsecret; extern const char *rcode_strings[]; #define NQIDS 65536 /* * Information about outstanding queries, indexed by query ID. */ EXTERN struct query_status status[NQIDS]; /* * The list of outstanding queries. */ EXTERN query_list outstanding_list; /* * The list of unused query IDs */ EXTERN query_list instanding_list; EXTERN int query_socket INIT(-1); /* * Function prototypes */ isc_result_t parse_args(int argc, char **argv, const char *progopts); void show_usage(void); void show_usage_prog(void); void show_options_prog(void); void show_usage_common(void); void show_options_common(void); isc_boolean_t register_response(unsigned int id, unsigned int rcode); isc_result_t handle_prog_opt(int c); isc_result_t parse_udouble(double *dp, const char *string); double difftv(const struct timeval *tv1, const struct timeval *tv2); void update_current_time(void); isc_result_t setup(int argc, char **argv, const char *progopts); isc_result_t get_input_line(char *line, int n); isc_result_t process_line(char *query_desc); isc_boolean_t try_process_response(int sockfd); void cleanup(void); void maybe_print_args(int argc, char **argv);