2
* Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
2
* Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
3
3
* Copyright (C) 2000-2003 Internet Software Consortium.
5
* Permission to use, copy, modify, and distribute this software for any
5
* Permission to use, copy, modify, and/or distribute this software for any
6
6
* purpose with or without fee is hereby granted, provided that the above
7
7
* copyright notice and this permission notice appear in all copies.
15
15
* PERFORMANCE OF THIS SOFTWARE.
18
/* $Id: host.c,v 1.76.2.5.2.13 2005/07/04 03:29:45 marka Exp $ */
18
/* $Id: host.c,v 1.116 2007/12/03 00:21:48 marka Exp $ */
20
22
#include <config.h>
21
24
#include <limits.h>
31
#include <idn/result.h>
33
#include <idn/resconf.h>
23
37
#include <isc/app.h>
24
38
#include <isc/commandline.h>
25
39
#include <isc/netaddr.h>
45
60
static int seen_error = -1;
46
61
static isc_boolean_t list_addresses = ISC_TRUE;
47
62
static dns_rdatatype_t list_type = dns_rdatatype_a;
63
static isc_boolean_t printed_server = ISC_FALSE;
49
65
static const char *opcodetext[] = {
112
128
show_usage(void) {
114
130
"Usage: host [-aCdlriTwv] [-c class] [-N ndots] [-t type] [-W time]\n"
115
" [-R number] hostname [server]\n"
116
" -a is equivalent to -v -t *\n"
131
" [-R number] [-m flag] hostname [server]\n"
132
" -a is equivalent to -v -t ANY\n"
117
133
" -c specifies query class for non-IN data\n"
118
134
" -C compares SOA records on authoritative nameservers\n"
119
135
" -d is equivalent to -v\n"
122
138
" -N changes the number of dots allowed before root lookup is done\n"
123
139
" -r disables recursive processing\n"
124
140
" -R specifies number of retries for UDP packets\n"
141
" -s a SERVFAIL response should stop query\n"
125
142
" -t specifies the query type\n"
126
143
" -T enables TCP/IP mode\n"
127
144
" -v enables verbose output\n"
128
145
" -w specifies to wait forever for a reply\n"
129
146
" -W specifies how long to wait for a reply\n"
130
147
" -4 use IPv4 query transport only\n"
131
" -6 use IPv6 query transport only\n", stderr);
148
" -6 use IPv6 query transport only\n"
149
" -m set memory debugging flag (trace|record|usage)\n", stderr);
351
369
return (ISC_R_SUCCESS);
373
chase_cnamechain(dns_message_t *msg, dns_name_t *qname) {
375
dns_rdataset_t *rdataset;
376
dns_rdata_cname_t cname;
377
dns_rdata_t rdata = DNS_RDATA_INIT;
378
unsigned int i = msg->counts[DNS_SECTION_ANSWER];
382
result = dns_message_findname(msg, DNS_SECTION_ANSWER, qname,
383
dns_rdatatype_cname, 0, NULL,
385
if (result != ISC_R_SUCCESS)
387
result = dns_rdataset_first(rdataset);
388
check_result(result, "dns_rdataset_first");
389
dns_rdata_reset(&rdata);
390
dns_rdataset_current(rdataset, &rdata);
391
result = dns_rdata_tostruct(&rdata, &cname, NULL);
392
check_result(result, "dns_rdata_tostruct");
393
dns_name_copy(&cname.cname, qname, NULL);
394
dns_rdata_freestruct(&cname);
355
399
printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
356
400
isc_boolean_t did_flag = ISC_FALSE;
376
420
sizeof(sockstr));
377
421
printf("Address: %s\n", sockstr);
378
422
printf("Aliases: \n\n");
423
printed_server = ISC_TRUE;
381
426
if (msg->rcode != 0) {
382
427
char namestr[DNS_NAME_FORMATSIZE];
383
428
dns_name_format(query->lookup->name, namestr, sizeof(namestr));
384
printf("Host %s not found: %d(%s)\n", namestr,
385
msg->rcode, rcodetext[msg->rcode]);
429
printf("Host %s not found: %d(%s)\n",
430
(msg->rcode != dns_rcode_nxdomain) ? namestr :
431
query->lookup->textname, msg->rcode,
432
rcodetext[msg->rcode]);
386
433
return (ISC_R_SUCCESS);
389
436
if (default_lookups && query->lookup->rdtype == dns_rdatatype_a) {
390
437
char namestr[DNS_NAME_FORMATSIZE];
391
438
dig_lookup_t *lookup;
439
dns_fixedname_t fixed;
393
442
/* Add AAAA and MX lookups. */
395
dns_name_format(query->lookup->name, namestr, sizeof(namestr));
443
dns_fixedname_init(&fixed);
444
name = dns_fixedname_name(&fixed);
445
dns_name_copy(query->lookup->name, name, NULL);
446
chase_cnamechain(msg, name);
447
dns_name_format(name, namestr, sizeof(namestr));
396
448
lookup = clone_lookup(query->lookup, ISC_FALSE);
397
449
if (lookup != NULL) {
398
450
strncpy(lookup->textname, namestr,
577
static const char * optstring = "46ac:dilnm:rst:vwCDN:R:TW:";
580
pre_parse_args(int argc, char **argv) {
583
while ((c = isc_commandline_parse(argc, argv, optstring)) != -1) {
586
memdebugging = ISC_TRUE;
587
if (strcasecmp("trace", isc_commandline_argument) == 0)
588
isc_mem_debugging |= ISC_MEM_DEBUGTRACE;
589
else if (!strcasecmp("record",
590
isc_commandline_argument) == 0)
591
isc_mem_debugging |= ISC_MEM_DEBUGRECORD;
592
else if (strcasecmp("usage",
593
isc_commandline_argument) == 0)
594
isc_mem_debugging |= ISC_MEM_DEBUGUSAGE;
620
isc_commandline_reset = ISC_TRUE;
621
isc_commandline_index = 1;
526
625
parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
527
626
char hostname[MXNAME];
539
638
lookup = make_empty_lookup();
541
while ((c = isc_commandline_parse(argc, argv, "lvwrdt:c:aTCN:R:W:Dni46"))
640
lookup->servfail_stops = ISC_FALSE;
641
lookup->comments = ISC_FALSE;
643
while ((c = isc_commandline_parse(argc, argv, optstring)) != -1) {
545
646
lookup->tcp_mode = ISC_TRUE;
585
689
lookup->tcp_mode = ISC_TRUE;
586
690
} else if (rdtype == dns_rdatatype_ixfr) {
587
691
lookup->ixfr_serial = serial;
692
lookup->tcp_mode = ISC_TRUE;
695
} else if (rdtype == dns_rdatatype_a ||
696
rdtype == dns_rdatatype_aaaa ||
697
rdtype == dns_rdatatype_mx) {
698
idnoptions = IDN_ASCCHECK;
590
702
list_type = rdtype;
591
703
list_addresses = ISC_FALSE;
690
808
set_nameserver(argv[isc_commandline_index+1]);
691
809
debug("server is %s", argv[isc_commandline_index+1]);
692
810
listed_server = ISC_TRUE;
695
814
lookup->pending = ISC_FALSE;
696
815
if (get_reverse(store, sizeof(store), hostname,
721
840
ISC_LIST_INIT(search_list);
844
idnoptions = IDN_ASCCHECK;
726
848
progname = argv[0];
849
pre_parse_args(argc, argv);
727
850
result = isc_app_start();
728
851
check_result(result, "isc_app_start");