mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-29 13:38:26 +00:00
Added +bufsize (EDNS0) option to dig
Added 1.2.3.4-> 4.3.2.1.in-addr.arpa translation to host Added +defname, +aaonly, +cmd, +nostats, +qr flags to dig Reviewed (and changed) result codes of dig.
This commit is contained in:
parent
0c5a46afed
commit
f17b62a64b
293
bin/dig/dig.c
293
bin/dig/dig.c
@ -36,7 +36,7 @@ extern ISC_LIST(dig_lookup_t) lookup_list;
|
||||
extern ISC_LIST(dig_server_t) server_list;
|
||||
|
||||
extern isc_boolean_t tcp_mode, have_ipv6, show_details,
|
||||
usesearch, trace;
|
||||
usesearch, trace, qr;
|
||||
extern in_port_t port;
|
||||
extern unsigned int timeout;
|
||||
extern isc_mem_t *mctx;
|
||||
@ -55,8 +55,18 @@ extern char fixeddomain[MXNAME];
|
||||
#ifdef TWIDDLE
|
||||
extern isc_boolean_t twiddle;
|
||||
#endif
|
||||
extern int exitcode;
|
||||
|
||||
isc_boolean_t short_form = ISC_FALSE;
|
||||
isc_boolean_t short_form = ISC_FALSE, printcmd = ISC_TRUE;
|
||||
|
||||
isc_uint16_t bufsize = 0;
|
||||
isc_boolean_t have_host = ISC_FALSE, identify = ISC_FALSE,
|
||||
trace = ISC_FALSE, ns_search_only = ISC_FALSE,
|
||||
forcecomment = ISC_FALSE, stats = ISC_TRUE,
|
||||
comments = ISC_TRUE, section_question = ISC_TRUE,
|
||||
section_answer = ISC_TRUE, section_authority = ISC_TRUE,
|
||||
section_additional = ISC_TRUE, recurse = ISC_TRUE,
|
||||
defname = ISC_TRUE, aaonly = ISC_FALSE;
|
||||
|
||||
|
||||
static char *opcodetext[] = {
|
||||
@ -118,8 +128,11 @@ show_usage() {
|
||||
" +time=### (Set query timeout) [5]\n"
|
||||
" +tries=### (Set number of UDP attempts) [3]\n"
|
||||
" +domain=### (Set default domainname)\n"
|
||||
" +bufsize=### (Set EDNS0 Max UDP packet size)\n"
|
||||
" +[no]search (Set whether to use searchlist)\n"
|
||||
" +[no]defname (Set whether to use default domaon)\n"
|
||||
" +[no]recursive (Recursive mode)\n"
|
||||
" +[no]aaonly (Set AA flag in query)\n"
|
||||
" +[no]details (Show details of all requests)\n"
|
||||
#ifdef TWIDDLE
|
||||
" +twiddle (Intentionally form bad requests)\n"
|
||||
@ -132,6 +145,7 @@ show_usage() {
|
||||
" +[no]additional (Control display of additional)\n"
|
||||
" +[no]short (Disable everything except short\n"
|
||||
" form of answer)\n"
|
||||
" +qr (Print question before sending)\n"
|
||||
" Additional d-opts subject to removal before release:\n"
|
||||
" +[no]nssearch (Search all authorative nameservers)\n"
|
||||
" +[no]identify (ID responders in short answers)\n"
|
||||
@ -193,13 +207,13 @@ received(int bytes, int frmsize, char *frm, dig_query_t *query) {
|
||||
result = isc_time_now(&now);
|
||||
check_result (result, "isc_time_now");
|
||||
|
||||
if (query->lookup->comments) {
|
||||
if (query->lookup->stats) {
|
||||
diff = isc_time_microdiff(&now, &query->time_sent);
|
||||
printf(";; Query time: %ld msec\n", (long int)diff/1000);
|
||||
printf(";; Received %u bytes from %.*s\n",
|
||||
bytes, frmsize, frm);
|
||||
printf(";; SERVER: %.*s\n", frmsize, frm);
|
||||
time (&tnow);
|
||||
printf(";; When: %s\n", ctime(&tnow));
|
||||
printf(";; WHEN: %s", ctime(&tnow));
|
||||
printf (";; MSG SIZE rcvd: %d\n\n", bytes);
|
||||
} else if (query->lookup->identify && !short_form) {
|
||||
diff = isc_time_microdiff(&now, &query->time_sent);
|
||||
printf(";; Received %u bytes from %.*s in %d ms\n",
|
||||
@ -209,10 +223,11 @@ received(int bytes, int frmsize, char *frm, dig_query_t *query) {
|
||||
|
||||
void
|
||||
trying(int frmsize, char *frm, dig_lookup_t *lookup) {
|
||||
if (lookup->comments && !short_form)
|
||||
printf ("; Trying %.*s\n", frmsize, frm);
|
||||
}
|
||||
UNUSED (frmsize);
|
||||
UNUSED (frm);
|
||||
UNUSED (lookup);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
say_message(dns_rdata_t *rdata, dig_query_t *query) {
|
||||
@ -367,8 +382,23 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
|
||||
|
||||
UNUSED (query);
|
||||
|
||||
/*
|
||||
* Exitcode 9 means we timed out, but if we're printing a message,
|
||||
* we much have recovered. Go ahead and reset it to code 0, and
|
||||
* call this a success.
|
||||
*/
|
||||
if (exitcode == 9)
|
||||
exitcode = 0;
|
||||
|
||||
result = ISC_R_SUCCESS;
|
||||
|
||||
if (query->lookup->comments && !short_form) {
|
||||
if (msg == query->lookup->sendmsg)
|
||||
printf (";; Sending:\n");
|
||||
else
|
||||
printf (";; Got answer:\n");
|
||||
}
|
||||
|
||||
if (headers) {
|
||||
if (query->lookup->comments && !short_form) {
|
||||
printf(";; ->>HEADER<<- opcode: %s, status: %s, "
|
||||
@ -475,6 +505,23 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
|
||||
return (result);
|
||||
}
|
||||
|
||||
static void
|
||||
printgreeting(int argc, char **argv) {
|
||||
int i = 1;
|
||||
|
||||
if (printcmd) {
|
||||
puts ("");
|
||||
printf ("; <<>> DiG 9.0 <<>>");
|
||||
while (i < argc) {
|
||||
printf (" %s", argv[i++]);
|
||||
}
|
||||
puts ("");
|
||||
printf (";; global options: %s %s\n",
|
||||
short_form?"short_form":"",
|
||||
printcmd?"printcmd":"");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Reorder an argument list so that server names all come at the end.
|
||||
* This is a bit of a hack, to allow batch-mode processing to properly
|
||||
@ -518,12 +565,6 @@ reorder_args(int argc, char *argv[]) {
|
||||
*/
|
||||
void
|
||||
parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
isc_boolean_t have_host = ISC_FALSE, identify = ISC_FALSE,
|
||||
trace = ISC_FALSE, ns_search_only = ISC_FALSE,
|
||||
forcecomment = ISC_FALSE,
|
||||
comments = ISC_TRUE, section_question = ISC_TRUE,
|
||||
section_answer = ISC_TRUE, section_authority = ISC_TRUE,
|
||||
section_additional = ISC_TRUE, recurse = ISC_TRUE;
|
||||
dig_server_t *srv = NULL;
|
||||
dig_lookup_t *lookup = NULL;
|
||||
char *batchname = NULL;
|
||||
@ -533,14 +574,18 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
char *bargv[16];
|
||||
int i, n;
|
||||
int adrs[4];
|
||||
int rc;
|
||||
char **rv;
|
||||
|
||||
for (argc--, argv++; argc > 0; argc--, argv++) {
|
||||
debug ("Main parsing %s", argv[0]);
|
||||
if (strncmp(argv[0], "@", 1) == 0) {
|
||||
rc = argc;
|
||||
rv = argv;
|
||||
for (rc--, rv++; rc > 0; rc--, rv++) {
|
||||
debug ("Main parsing %s", rv[0]);
|
||||
if (strncmp(rv[0], "@", 1) == 0) {
|
||||
srv=isc_mem_allocate(mctx, sizeof(struct dig_server));
|
||||
if (srv == NULL)
|
||||
fatal("Memory allocation failure.");
|
||||
strncpy(srv->servername, &argv[0][1], MXNAME-1);
|
||||
strncpy(srv->servername, &rv[0][1], MXNAME-1);
|
||||
if (is_batchfile && have_host) {
|
||||
if (!lookup->use_my_server_list) {
|
||||
ISC_LIST_INIT (lookup->
|
||||
@ -553,41 +598,61 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
} else {
|
||||
ISC_LIST_APPEND(server_list, srv, link);
|
||||
}
|
||||
} else if ((strcmp(argv[0], "+vc") == 0)
|
||||
} else if ((strcmp(rv[0], "+vc") == 0)
|
||||
&& (!is_batchfile)) {
|
||||
tcp_mode = ISC_TRUE;
|
||||
} else if ((strcmp(argv[0], "+novc") == 0)
|
||||
} else if ((strcmp(rv[0], "+novc") == 0)
|
||||
&& (!is_batchfile)) {
|
||||
tcp_mode = ISC_FALSE;
|
||||
} else if ((strcmp(argv[0], "+tcp") == 0)
|
||||
} else if ((strcmp(rv[0], "+tcp") == 0)
|
||||
&& (!is_batchfile)) {
|
||||
tcp_mode = ISC_TRUE;
|
||||
} else if ((strcmp(argv[0], "+notcp") == 0)
|
||||
} else if ((strcmp(rv[0], "+notcp") == 0)
|
||||
&& (!is_batchfile)) {
|
||||
tcp_mode = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+domain=", 8) == 0) {
|
||||
strncpy (fixeddomain, &argv[0][8], MXNAME);
|
||||
} else if (strncmp(argv[0], "+sea", 4) == 0) {
|
||||
} else if (strncmp(rv[0], "+domain=", 8) == 0) {
|
||||
strncpy (fixeddomain, &rv[0][8], MXNAME);
|
||||
} else if (strncmp(rv[0], "+sea", 4) == 0) {
|
||||
usesearch = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+nosea", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+nosea", 6) == 0) {
|
||||
usesearch = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+time=", 6) == 0) {
|
||||
timeout = atoi(&argv[0][6]);
|
||||
} else if (strncmp(rv[0], "+defn", 5) == 0) {
|
||||
defname = ISC_TRUE;
|
||||
} else if (strncmp(rv[0], "+nodefn", 7) == 0) {
|
||||
defname = ISC_FALSE;
|
||||
} else if (strncmp(rv[0], "+time=", 6) == 0) {
|
||||
timeout = atoi(&rv[0][6]);
|
||||
if (timeout <= 0)
|
||||
timeout = 1;
|
||||
} else if (strncmp(argv[0], "+tries=", 7) == 0) {
|
||||
tries = atoi(&argv[0][7]);
|
||||
} else if (strncmp(rv[0], "+tries=", 7) == 0) {
|
||||
tries = atoi(&rv[0][7]);
|
||||
if (tries <= 0)
|
||||
tries = 1;
|
||||
} else if (strncmp(argv[0], "+ndots=", 7) == 0) {
|
||||
ndots = atoi(&argv[0][7]);
|
||||
} else if (strncmp(rv[0], "+buf=", 5) == 0) {
|
||||
bufsize = atoi(&rv[0][5]);
|
||||
if (bufsize <= 0)
|
||||
bufsize = 0;
|
||||
if (bufsize > COMMSIZE)
|
||||
bufsize = COMMSIZE;
|
||||
} else if (strncmp(rv[0], "+bufsize=", 9) == 0) {
|
||||
bufsize = atoi(&rv[0][9]);
|
||||
if (bufsize <= 0)
|
||||
bufsize = 0;
|
||||
if (bufsize > COMMSIZE)
|
||||
bufsize = COMMSIZE;
|
||||
} else if (strncmp(rv[0], "+ndots=", 7) == 0) {
|
||||
ndots = atoi(&rv[0][7]);
|
||||
if (timeout <= 0)
|
||||
timeout = 1;
|
||||
} else if (strncmp(argv[0], "+rec", 4) == 0) {
|
||||
} else if (strncmp(rv[0], "+rec", 4) == 0) {
|
||||
recurse = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+norec", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+norec", 6) == 0) {
|
||||
recurse = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+ns", 3) == 0) {
|
||||
} else if (strncmp(rv[0], "+aa", 3) == 0) {
|
||||
aaonly = ISC_TRUE;
|
||||
} else if (strncmp(rv[0], "+noaa", 5) == 0) {
|
||||
aaonly = ISC_FALSE;
|
||||
} else if (strncmp(rv[0], "+ns", 3) == 0) {
|
||||
ns_search_only = ISC_TRUE;
|
||||
recurse = ISC_FALSE;
|
||||
identify = ISC_TRUE;
|
||||
@ -598,66 +663,80 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
section_additional = ISC_FALSE;
|
||||
section_authority = ISC_FALSE;
|
||||
section_question = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+nons", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+nons", 6) == 0) {
|
||||
ns_search_only = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+tr", 3) == 0) {
|
||||
} else if (strncmp(rv[0], "+tr", 3) == 0) {
|
||||
trace = ISC_TRUE;
|
||||
recurse = ISC_FALSE;
|
||||
identify = ISC_TRUE;
|
||||
if (!forcecomment)
|
||||
if (!forcecomment) {
|
||||
comments = ISC_FALSE;
|
||||
stats = ISC_FALSE;
|
||||
}
|
||||
section_additional = ISC_FALSE;
|
||||
section_authority = ISC_FALSE;
|
||||
section_question = ISC_FALSE;
|
||||
show_details = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+notr", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+notr", 6) == 0) {
|
||||
trace = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+det", 4) == 0) {
|
||||
} else if (strncmp(rv[0], "+det", 4) == 0) {
|
||||
show_details = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+nodet", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+nodet", 6) == 0) {
|
||||
show_details = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+sho", 4) == 0) {
|
||||
} else if (strncmp(rv[0], "+sho", 4) == 0) {
|
||||
short_form = ISC_TRUE;
|
||||
if (!forcecomment)
|
||||
if (!forcecomment) {
|
||||
comments = ISC_FALSE;
|
||||
stats = ISC_FALSE;
|
||||
}
|
||||
printcmd = ISC_FALSE;
|
||||
section_additional = ISC_FALSE;
|
||||
section_authority = ISC_FALSE;
|
||||
section_question = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+nosho", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+nosho", 6) == 0) {
|
||||
short_form = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+id", 3) == 0) {
|
||||
} else if (strncmp(rv[0], "+id", 3) == 0) {
|
||||
identify = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+noid", 5) == 0) {
|
||||
} else if (strncmp(rv[0], "+noid", 5) == 0) {
|
||||
identify = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+com", 4) == 0) {
|
||||
} else if (strncmp(rv[0], "+com", 4) == 0) {
|
||||
comments = ISC_TRUE;
|
||||
forcecomment = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+nocom", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+nocom", 6) == 0) {
|
||||
comments = ISC_FALSE;
|
||||
forcecomment = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+que", 4) == 0) {
|
||||
stats = ISC_FALSE;
|
||||
} else if (strncmp(rv[0], "+sta", 4) == 0) {
|
||||
stats = ISC_TRUE;
|
||||
} else if (strncmp(rv[0], "+nosta", 6) == 0) {
|
||||
stats = ISC_FALSE;
|
||||
} else if (strncmp(rv[0], "+qr", 3) == 0) {
|
||||
qr = ISC_TRUE;
|
||||
} else if (strncmp(rv[0], "+noqr", 5) == 0) {
|
||||
qr = ISC_FALSE;
|
||||
} else if (strncmp(rv[0], "+que", 4) == 0) {
|
||||
section_question = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+noque", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+noque", 6) == 0) {
|
||||
section_question = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+ans", 4) == 0) {
|
||||
} else if (strncmp(rv[0], "+ans", 4) == 0) {
|
||||
section_answer = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+noans", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+noans", 6) == 0) {
|
||||
section_answer = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+add", 4) == 0) {
|
||||
} else if (strncmp(rv[0], "+add", 4) == 0) {
|
||||
section_additional = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+noadd", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+noadd", 6) == 0) {
|
||||
section_additional = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+aut", 4) == 0) {
|
||||
} else if (strncmp(rv[0], "+aut", 4) == 0) {
|
||||
section_authority = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+noaut", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+noaut", 6) == 0) {
|
||||
section_authority = ISC_FALSE;
|
||||
} else if (strncmp(argv[0], "+all", 4) == 0) {
|
||||
} else if (strncmp(rv[0], "+all", 4) == 0) {
|
||||
section_question = ISC_TRUE;
|
||||
section_authority = ISC_TRUE;
|
||||
section_answer = ISC_TRUE;
|
||||
section_additional = ISC_TRUE;
|
||||
comments = ISC_TRUE;
|
||||
} else if (strncmp(argv[0], "+noall", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+noall", 6) == 0) {
|
||||
section_question = ISC_FALSE;
|
||||
section_authority = ISC_FALSE;
|
||||
section_answer = ISC_FALSE;
|
||||
@ -665,54 +744,63 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
comments = ISC_FALSE;
|
||||
|
||||
#ifdef TWIDDLE
|
||||
} else if (strncmp(argv[0], "+twiddle", 6) == 0) {
|
||||
} else if (strncmp(rv[0], "+twiddle", 6) == 0) {
|
||||
twiddle = ISC_TRUE;
|
||||
#endif
|
||||
} else if (strncmp(argv[0], "-c", 2) == 0) {
|
||||
} else if (strncmp(rv[0], "-c", 2) == 0) {
|
||||
if (have_host) {
|
||||
if (argv[0][2]!=0) {
|
||||
strncpy(lookup->rctext, &argv[0][2],
|
||||
if (rv[0][2]!=0) {
|
||||
strncpy(lookup->rctext, &rv[0][2],
|
||||
MXRD);
|
||||
} else {
|
||||
strncpy(lookup->rctext, argv[1],
|
||||
strncpy(lookup->rctext, rv[1],
|
||||
MXRD);
|
||||
argv++;
|
||||
argc--;
|
||||
rv++;
|
||||
rc--;
|
||||
}
|
||||
}
|
||||
} else if (strncmp(argv[0], "-t", 2) == 0) {
|
||||
} else if (strncmp(rv[0], "-t", 2) == 0) {
|
||||
if (have_host) {
|
||||
if (argv[0][2]!=0) {
|
||||
strncpy(lookup->rttext, &argv[0][2],
|
||||
if (rv[0][2]!=0) {
|
||||
strncpy(lookup->rttext, &rv[0][2],
|
||||
MXRD);
|
||||
} else {
|
||||
strncpy(lookup->rttext, argv[1],
|
||||
strncpy(lookup->rttext, rv[1],
|
||||
MXRD);
|
||||
argv++;
|
||||
argc--;
|
||||
rv++;
|
||||
rc--;
|
||||
}
|
||||
}
|
||||
} else if (strncmp(argv[0], "-f", 2) == 0) {
|
||||
if (argv[0][2]!=0) {
|
||||
batchname=&argv[0][2];
|
||||
} else if (strncmp(rv[0], "-f", 2) == 0) {
|
||||
if (rv[0][2]!=0) {
|
||||
batchname=&rv[0][2];
|
||||
} else {
|
||||
batchname=argv[1];
|
||||
argv++;
|
||||
argc--;
|
||||
batchname=rv[1];
|
||||
rv++;
|
||||
rc--;
|
||||
}
|
||||
} else if (strncmp(argv[0], "-p", 2) == 0) {
|
||||
if (argv[0][2]!=0) {
|
||||
port=atoi(&argv[0][2]);
|
||||
} else if (strncmp(rv[0], "-p", 2) == 0) {
|
||||
if (rv[0][2]!=0) {
|
||||
port=atoi(&rv[0][2]);
|
||||
} else {
|
||||
port=atoi(argv[1]);
|
||||
argv++;
|
||||
argc--;
|
||||
port=atoi(rv[1]);
|
||||
rv++;
|
||||
rc--;
|
||||
}
|
||||
} else if (strncmp(argv[0], "-h", 2) == 0) {
|
||||
} else if (strncmp(rv[0], "-h", 2) == 0) {
|
||||
show_usage();
|
||||
exit (0);
|
||||
} else if (strncmp(argv[0], "-x", 2) == 0) {
|
||||
n = sscanf(argv[1], "%d.%d.%d.%d", &adrs[0], &adrs[1],
|
||||
exit (exitcode);
|
||||
} else if (strncmp(rv[0], "-x", 2) == 0) {
|
||||
/*
|
||||
*XXXMWS Only works for ipv4 now.
|
||||
* Can't use inet_pton here, since we allow
|
||||
* partial addresses.
|
||||
*/
|
||||
if (rc == 1) {
|
||||
show_usage();
|
||||
exit (exitcode);
|
||||
}
|
||||
n = sscanf(rv[1], "%d.%d.%d.%d", &adrs[0], &adrs[1],
|
||||
&adrs[2], &adrs[3]);
|
||||
if (n == 0)
|
||||
show_usage();
|
||||
@ -747,11 +835,15 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
lookup->trace_root = trace;
|
||||
lookup->ns_search_only = ns_search_only;
|
||||
lookup->doing_xfr = ISC_FALSE;
|
||||
lookup->defname = ISC_FALSE;
|
||||
lookup->identify = identify;
|
||||
lookup->recurse = recurse;
|
||||
lookup->aaonly = aaonly;
|
||||
lookup->retries = tries;
|
||||
lookup->udpsize = bufsize;
|
||||
lookup->nsfound = 0;
|
||||
lookup->comments = comments;
|
||||
lookup->stats = stats;
|
||||
lookup->section_question = section_question;
|
||||
lookup->section_answer = section_answer;
|
||||
lookup->section_authority = section_authority;
|
||||
@ -761,16 +853,16 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
ISC_LIST_INIT(lookup->my_server_list);
|
||||
ISC_LIST_APPEND(lookup_list, lookup, link);
|
||||
have_host = ISC_TRUE;
|
||||
argv++;
|
||||
argc--;
|
||||
rv++;
|
||||
rc--;
|
||||
} else {
|
||||
if (have_host) {
|
||||
ENSURE(lookup != NULL);
|
||||
if (istype(argv[0])) {
|
||||
strncpy(lookup->rttext, argv[0], MXRD);
|
||||
if (istype(rv[0])) {
|
||||
strncpy(lookup->rttext, rv[0], MXRD);
|
||||
continue;
|
||||
} else if (isclass(argv[0])) {
|
||||
strncpy(lookup->rctext, argv[0],
|
||||
} else if (isclass(rv[0])) {
|
||||
strncpy(lookup->rctext, rv[0],
|
||||
MXRD);
|
||||
continue;
|
||||
}
|
||||
@ -783,7 +875,7 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
if (lookup == NULL)
|
||||
fatal("Memory allocation failure.");
|
||||
lookup->pending = ISC_FALSE;
|
||||
strncpy(lookup->textname, argv[0], MXNAME-1);
|
||||
strncpy(lookup->textname, rv[0], MXNAME-1);
|
||||
lookup->rttext[0]=0;
|
||||
lookup->rctext[0]=0;
|
||||
lookup->namespace[0]=0;
|
||||
@ -796,14 +888,18 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
lookup->origin = NULL;
|
||||
lookup->use_my_server_list = ISC_FALSE;
|
||||
lookup->doing_xfr = ISC_FALSE;
|
||||
lookup->defname = ISC_FALSE;
|
||||
lookup->trace = (trace || ns_search_only);
|
||||
lookup->trace_root = trace;
|
||||
lookup->ns_search_only = ns_search_only;
|
||||
lookup->identify = identify;
|
||||
lookup->recurse = recurse;
|
||||
lookup->aaonly = aaonly;
|
||||
lookup->retries = tries;
|
||||
lookup->udpsize = bufsize;
|
||||
lookup->nsfound = 0;
|
||||
lookup->comments = comments;
|
||||
lookup->stats = stats;
|
||||
lookup->section_question = section_question;
|
||||
lookup->section_answer = section_answer;
|
||||
lookup->section_authority = section_authority;
|
||||
@ -820,6 +916,8 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
fp = fopen(batchname, "r");
|
||||
if (fp == NULL) {
|
||||
perror(batchname);
|
||||
if (exitcode < 10)
|
||||
exitcode = 10;
|
||||
fatal("Couldn't open specified batch file.");
|
||||
}
|
||||
while (fgets(batchline, MXNAME, fp) != 0) {
|
||||
@ -856,14 +954,18 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
lookup->origin = NULL;
|
||||
lookup->use_my_server_list = ISC_FALSE;
|
||||
lookup->doing_xfr = ISC_FALSE;
|
||||
lookup->defname = ISC_FALSE;
|
||||
lookup->trace = (trace || ns_search_only);
|
||||
lookup->trace_root = trace;
|
||||
lookup->ns_search_only = ns_search_only;
|
||||
lookup->identify = identify;
|
||||
lookup->recurse = recurse;
|
||||
lookup->aaonly = aaonly;
|
||||
lookup->retries = tries;
|
||||
lookup->udpsize = bufsize;
|
||||
lookup->nsfound = 0;
|
||||
lookup->comments = comments;
|
||||
lookup->stats = stats;
|
||||
lookup->section_question = section_question;
|
||||
lookup->section_answer = section_answer;
|
||||
lookup->section_authority = section_authority;
|
||||
@ -875,4 +977,5 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
lookup->rctext[0]=0;
|
||||
ISC_LIST_APPEND(lookup_list, lookup, link);
|
||||
}
|
||||
printgreeting (argc, argv);
|
||||
}
|
||||
|
@ -15,6 +15,15 @@
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Notice to programmers: Do not use this code as an example of how to
|
||||
* use the ISC library to perform DNS lookups. Dig and Host both operate
|
||||
* on the request level, since they allow fine-tuning of output and are
|
||||
* intended as debugging tools. As a result, they perform many of the
|
||||
* functions which could be better handled using the dns_resolver
|
||||
* functions in most applications.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
@ -34,6 +43,7 @@ extern int h_errno;
|
||||
#include <dns/rdataclass.h>
|
||||
#include <dns/rdataset.h>
|
||||
#include <dns/rdatatype.h>
|
||||
#include <dns/rdatalist.h>
|
||||
#include <dns/result.h>
|
||||
|
||||
#include <dig/dig.h>
|
||||
@ -43,7 +53,8 @@ ISC_LIST(dig_server_t) server_list;
|
||||
ISC_LIST(dig_searchlist_t) search_list;
|
||||
|
||||
isc_boolean_t tcp_mode = ISC_FALSE, have_ipv6 = ISC_FALSE,
|
||||
free_now = ISC_FALSE, show_details = ISC_FALSE, usesearch=ISC_TRUE;
|
||||
free_now = ISC_FALSE, show_details = ISC_FALSE, usesearch=ISC_TRUE,
|
||||
qr = ISC_FALSE;
|
||||
#ifdef TWIDDLE
|
||||
isc_boolean_t twiddle = ISC_FALSE;
|
||||
#endif
|
||||
@ -54,7 +65,6 @@ isc_taskmgr_t *taskmgr = NULL;
|
||||
isc_task_t *task = NULL;
|
||||
isc_timermgr_t *timermgr = NULL;
|
||||
isc_socketmgr_t *socketmgr = NULL;
|
||||
dns_messageid_t id;
|
||||
char *rootspace[BUFSIZE];
|
||||
isc_buffer_t rootbuf;
|
||||
int sendcount = 0;
|
||||
@ -62,6 +72,7 @@ int ndots = -1;
|
||||
int tries = 3;
|
||||
int lookup_counter = 0;
|
||||
char fixeddomain[MXNAME]="";
|
||||
int exitcode = 9;
|
||||
|
||||
static void
|
||||
free_lists(void);
|
||||
@ -116,7 +127,7 @@ fatal(char *format, ...) {
|
||||
isc_mem_destroy(&mctx);
|
||||
}
|
||||
#endif
|
||||
exit(1);
|
||||
exit(exitcode);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
@ -140,8 +151,10 @@ debug(char *format, ...) {
|
||||
|
||||
void
|
||||
check_result(isc_result_t result, char *msg) {
|
||||
if (result != ISC_R_SUCCESS)
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
exitcode = 1;
|
||||
fatal("%s: %s", msg, isc_result_totext(result));
|
||||
}
|
||||
}
|
||||
|
||||
isc_boolean_t
|
||||
@ -235,7 +248,12 @@ setup_system(void) {
|
||||
}
|
||||
|
||||
debug ("setup_system()");
|
||||
id = getpid() << 8;
|
||||
/*
|
||||
* Warning: This is not particularly good randomness. We'll
|
||||
* just use random() now for getting id values, but doing so
|
||||
* does NOT insure that id's cann't be guessed.
|
||||
*/
|
||||
srandom (getpid() + (int)&setup_system);
|
||||
get_servers = (server_list.head == NULL);
|
||||
fp = fopen (RESOLVCONF, "r");
|
||||
if (fp != NULL) {
|
||||
@ -380,6 +398,34 @@ setup_libs(void) {
|
||||
isc_buffer_add(&b, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
add_opt (dns_message_t *msg, isc_uint16_t udpsize) {
|
||||
dns_rdataset_t *rdataset = NULL;
|
||||
dns_rdatalist_t *rdatalist = NULL;
|
||||
dns_rdata_t *rdata = NULL;
|
||||
isc_result_t result;
|
||||
|
||||
result = dns_message_gettemprdataset(msg, &rdataset);
|
||||
check_result (result, "dns_message_gettemprdataset");
|
||||
dns_rdataset_init (rdataset);
|
||||
result = dns_message_gettemprdatalist(msg, &rdatalist);
|
||||
check_result (result, "dns_message_gettemprdatalist");
|
||||
result = dns_message_gettemprdata(msg, &rdata);
|
||||
check_result (result, "dns_message_gettemprdata");
|
||||
|
||||
rdatalist->type = dns_rdatatype_opt;
|
||||
rdatalist->covers = 0;
|
||||
rdatalist->rdclass = udpsize;
|
||||
rdatalist->ttl = 0;
|
||||
rdata->data = NULL;
|
||||
rdata->length = 0;
|
||||
ISC_LIST_INIT(rdatalist->rdata);
|
||||
ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
|
||||
dns_rdatalist_tordataset(rdatalist, rdataset);
|
||||
result = dns_message_setopt(msg, rdataset);
|
||||
check_result (result, "dns_message_setopt");
|
||||
}
|
||||
|
||||
static void
|
||||
add_type(dns_message_t *message, dns_name_t *name, dns_rdataclass_t rdclass,
|
||||
dns_rdatatype_t rdtype)
|
||||
@ -492,11 +538,17 @@ followup_lookup(dns_message_t *msg, dig_query_t *query,
|
||||
lookup->xfr_q = NULL;
|
||||
lookup->origin = NULL;
|
||||
lookup->doing_xfr = ISC_FALSE;
|
||||
lookup->defname = ISC_FALSE;
|
||||
lookup->identify =
|
||||
query->lookup->identify;
|
||||
lookup->udpsize =
|
||||
query->lookup->udpsize;
|
||||
lookup->recurse =
|
||||
query->lookup->
|
||||
recurse;
|
||||
lookup->aaonly =
|
||||
query->lookup->
|
||||
aaonly;
|
||||
lookup->ns_search_only =
|
||||
query->lookup->
|
||||
ns_search_only;
|
||||
@ -516,6 +568,9 @@ followup_lookup(dns_message_t *msg, dig_query_t *query,
|
||||
lookup->comments =
|
||||
query->lookup->
|
||||
comments;
|
||||
lookup->stats =
|
||||
query->lookup->
|
||||
stats;
|
||||
lookup->section_question =
|
||||
query->lookup->
|
||||
section_question;
|
||||
@ -620,16 +675,20 @@ next_origin(dns_message_t *msg, dig_query_t *query) {
|
||||
lookup->timer = NULL;
|
||||
lookup->xfr_q = NULL;
|
||||
lookup->doing_xfr = ISC_FALSE;
|
||||
lookup->defname = ISC_FALSE;
|
||||
lookup->trace = query->lookup->trace;
|
||||
lookup->trace_root = query->lookup->trace_root;
|
||||
lookup->identify = query->lookup->identify;
|
||||
lookup->udpsize = query->lookup->udpsize;
|
||||
lookup->recurse = query->lookup->recurse;
|
||||
lookup->aaonly = query->lookup->aaonly;
|
||||
lookup->ns_search_only = query->lookup->ns_search_only;
|
||||
lookup->use_my_server_list = query->lookup->use_my_server_list;
|
||||
lookup->origin = ISC_LIST_NEXT(query->lookup->origin, link);
|
||||
lookup->retries = tries;
|
||||
lookup->nsfound = 0;
|
||||
lookup->comments = query->lookup->comments;
|
||||
lookup->stats = query->lookup->stats;
|
||||
lookup->section_question = query->lookup->section_question;
|
||||
lookup->section_answer = query->lookup->section_answer;
|
||||
lookup->section_authority = query->lookup->section_authority;
|
||||
@ -700,7 +759,7 @@ setup_lookup(dig_lookup_t *lookup) {
|
||||
isc_buffer_init(&lookup->namebuf, lookup->namespace, BUFSIZE);
|
||||
isc_buffer_init(&lookup->onamebuf, lookup->onamespace, BUFSIZE);
|
||||
|
||||
if (count_dots(lookup->textname) >= ndots)
|
||||
if ((count_dots(lookup->textname) >= ndots) || lookup->defname)
|
||||
lookup->origin = NULL; /* Force root lookup */
|
||||
debug ("lookup->origin = %lx", (long int)lookup->origin);
|
||||
if (lookup->origin != NULL) {
|
||||
@ -792,7 +851,7 @@ setup_lookup(dig_lookup_t *lookup) {
|
||||
if (lookup->rttext[0] == 0)
|
||||
strcpy(lookup->rttext, "A");
|
||||
|
||||
lookup->sendmsg->id = id++;
|
||||
lookup->sendmsg->id = random();
|
||||
lookup->sendmsg->opcode = dns_opcode_query;
|
||||
/* If this is a trace request, completely disallow recursion, since
|
||||
* it's meaningless for traces */
|
||||
@ -801,6 +860,11 @@ setup_lookup(dig_lookup_t *lookup) {
|
||||
lookup->sendmsg->flags |= DNS_MESSAGEFLAG_RD;
|
||||
}
|
||||
|
||||
if (lookup->aaonly) {
|
||||
debug ("AA query");
|
||||
lookup->sendmsg->flags |= DNS_MESSAGEFLAG_AA;
|
||||
}
|
||||
|
||||
dns_message_addname(lookup->sendmsg, lookup->name,
|
||||
DNS_SECTION_QUESTION);
|
||||
|
||||
@ -836,6 +900,9 @@ setup_lookup(dig_lookup_t *lookup) {
|
||||
debug ("Starting to render the message");
|
||||
result = dns_message_renderbegin(lookup->sendmsg, &lookup->sendbuf);
|
||||
check_result(result, "dns_message_renderbegin");
|
||||
if (lookup->udpsize > 0) {
|
||||
add_opt(lookup->sendmsg, lookup->udpsize);
|
||||
}
|
||||
result = dns_message_rendersection(lookup->sendmsg,
|
||||
DNS_SECTION_QUESTION, 0);
|
||||
check_result(result, "dns_message_rendersection");
|
||||
@ -871,6 +938,10 @@ setup_lookup(dig_lookup_t *lookup) {
|
||||
|
||||
ISC_LIST_ENQUEUE(lookup->q, query, link);
|
||||
}
|
||||
if (!ISC_LIST_EMPTY(lookup->q) && qr) {
|
||||
printmessage (ISC_LIST_HEAD(lookup->q), lookup->sendmsg,
|
||||
ISC_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -977,13 +1048,14 @@ connect_timeout(isc_task_t *task, isc_event_t *event) {
|
||||
(int)r.length, r.base,
|
||||
q->lookup->textname,
|
||||
q->lookup->retries-1);
|
||||
else
|
||||
else {
|
||||
printf(";; Connection to server %.*s "
|
||||
"for %s timed out. "
|
||||
"Giving up.\n",
|
||||
(int)r.length, r.base,
|
||||
q->lookup->textname);
|
||||
}
|
||||
}
|
||||
isc_socket_cancel(q->sock, task,
|
||||
ISC_SOCKCANCEL_ALL);
|
||||
}
|
||||
@ -1135,6 +1207,8 @@ connect_done(isc_task_t *task, isc_event_t *event) {
|
||||
printf(";; Connection to server %.*s for %s failed: %s.\n",
|
||||
(int)r.length, r.base, query->lookup->textname,
|
||||
isc_result_totext(sevent->result));
|
||||
if (exitcode < 9)
|
||||
exitcode = 9;
|
||||
isc_buffer_free(&b);
|
||||
query->working = ISC_FALSE;
|
||||
query->waiting_connect = ISC_FALSE;
|
||||
@ -1502,7 +1576,7 @@ free_lists(void) {
|
||||
if (mctx != NULL)
|
||||
isc_mem_destroy(&mctx);
|
||||
|
||||
exit(0);
|
||||
exit(exitcode);
|
||||
}
|
||||
|
||||
int
|
||||
@ -1544,5 +1618,5 @@ main(int argc, char **argv) {
|
||||
/*
|
||||
* Should never get here.
|
||||
*/
|
||||
return (1);
|
||||
return (2);
|
||||
}
|
||||
|
@ -53,6 +53,7 @@ extern int sendcount;
|
||||
extern int ndots;
|
||||
extern int tries;
|
||||
extern int lookup_counter;
|
||||
extern int exitcode;
|
||||
|
||||
isc_boolean_t short_form=ISC_TRUE,
|
||||
filter=ISC_FALSE,
|
||||
@ -202,7 +203,7 @@ show_usage() {
|
||||
" -v enables verbose output\n"
|
||||
" -w specifies to wait forever for a reply\n"
|
||||
" -W specifies how long to wait for a reply\n", stderr);
|
||||
exit (0);
|
||||
exit (exitcode);
|
||||
}
|
||||
|
||||
void
|
||||
@ -391,6 +392,14 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
|
||||
|
||||
UNUSED (headers);
|
||||
|
||||
/*
|
||||
* Exitcode 9 means we timed out, but if we're printing a message,
|
||||
* we much have recovered. Go ahead and reset it to code 0, and
|
||||
* call this a success.
|
||||
*/
|
||||
if (exitcode == 9)
|
||||
exitcode = 0;
|
||||
|
||||
if (msg->rcode != 0) {
|
||||
result = isc_buffer_allocate(mctx, &b, MXNAME);
|
||||
check_result (result, "isc_buffer_allocate");
|
||||
@ -509,7 +518,8 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
char queryclass[32]="";
|
||||
dig_server_t *srv;
|
||||
dig_lookup_t *lookup;
|
||||
int c;
|
||||
int i, c, n, adrs[4];
|
||||
char store[MXNAME];
|
||||
|
||||
UNUSED(is_batchfile);
|
||||
|
||||
@ -588,11 +598,6 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
ISC_LIST_APPEND(server_list, srv, link);
|
||||
}
|
||||
|
||||
if (querytype[0] == 0)
|
||||
strcpy (querytype, "a");
|
||||
if (queryclass[0] == 0)
|
||||
strcpy (queryclass, "in");
|
||||
|
||||
lookup_counter++;
|
||||
if (lookup_counter > LOOKUP_LIMIT)
|
||||
fatal ("Too many lookups.");
|
||||
@ -601,7 +606,32 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
if (lookup == NULL)
|
||||
fatal ("Memory allocation failure.");
|
||||
lookup->pending = ISC_FALSE;
|
||||
/*
|
||||
* XXXMWS Add IPv6 translation here, probably using inet_pton
|
||||
* to extract the formatted text.
|
||||
*/
|
||||
if (strcspn(hostname, "0123456789.") != strlen(hostname)) {
|
||||
lookup->textname[0]=0;
|
||||
n = sscanf(hostname, "%d.%d.%d.%d", &adrs[0], &adrs[1],
|
||||
&adrs[2], &adrs[3]);
|
||||
if (n==0) {
|
||||
show_usage();
|
||||
exit (exitcode);
|
||||
}
|
||||
for (i = n - 1; i >= 0; i--) {
|
||||
snprintf(store, MXNAME/8, "%d.",
|
||||
adrs[i]);
|
||||
strncat(lookup->textname, store, MXNAME);
|
||||
}
|
||||
strncat(lookup->textname, "in-addr.arpa.", MXNAME);
|
||||
if (querytype[0] == 0)
|
||||
strcpy (querytype, "ptr");
|
||||
} else
|
||||
strncpy (lookup->textname, hostname, MXNAME);
|
||||
if (querytype[0] == 0)
|
||||
strcpy (querytype, "a");
|
||||
if (queryclass[0] == 0)
|
||||
strcpy (queryclass, "in");
|
||||
strncpy (lookup->rttext, querytype, 32);
|
||||
strncpy (lookup->rctext, queryclass, 32);
|
||||
lookup->namespace[0]=0;
|
||||
@ -613,6 +643,7 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) {
|
||||
lookup->xfr_q = NULL;
|
||||
lookup->origin = NULL;
|
||||
lookup->doing_xfr = ISC_FALSE;
|
||||
lookup->defname = ISC_FALSE;
|
||||
lookup->identify = ISC_FALSE;
|
||||
lookup->recurse = recursion;
|
||||
lookup->ns_search_only = showallsoa;
|
||||
|
@ -33,7 +33,7 @@
|
||||
#define MXNAME 256
|
||||
#define MXRD 32
|
||||
#define BUFSIZE 512
|
||||
#define COMMSIZE 65536
|
||||
#define COMMSIZE 32767
|
||||
#define RESOLVCONF "/etc/resolv.conf"
|
||||
#define LOOKUP_LIMIT 64
|
||||
/* Lookup_limit is just a limiter, keeping too many lookups from being
|
||||
@ -62,8 +62,10 @@ struct dig_lookup {
|
||||
use_my_server_list,
|
||||
identify,
|
||||
recurse,
|
||||
aaonly,
|
||||
trace,
|
||||
trace_root;
|
||||
trace_root,
|
||||
defname;
|
||||
char textname[MXNAME]; /* Name we're going to be looking up */
|
||||
char rttext[MXRD]; /* rdata type text */
|
||||
char rctext[MXRD]; /* rdata class text */
|
||||
@ -85,7 +87,9 @@ struct dig_lookup {
|
||||
dig_query_t *xfr_q;
|
||||
int retries;
|
||||
int nsfound;
|
||||
isc_uint16_t udpsize;
|
||||
isc_boolean_t comments,
|
||||
stats,
|
||||
section_question,
|
||||
section_answer,
|
||||
section_authority,
|
||||
|
Loading…
x
Reference in New Issue
Block a user