summaryrefslogtreecommitdiffstats
path: root/contrib/bind9/bin/dig
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind9/bin/dig')
-rw-r--r--contrib/bind9/bin/dig/dig.c67
-rw-r--r--contrib/bind9/bin/dig/dighost.c87
-rw-r--r--contrib/bind9/bin/dig/host.c4
-rw-r--r--contrib/bind9/bin/dig/include/dig/dig.h6
-rw-r--r--contrib/bind9/bin/dig/nslookup.c8
5 files changed, 125 insertions, 47 deletions
diff --git a/contrib/bind9/bin/dig/dig.c b/contrib/bind9/bin/dig/dig.c
index b2c4625..08f5b5b 100644
--- a/contrib/bind9/bin/dig/dig.c
+++ b/contrib/bind9/bin/dig/dig.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dig.c,v 1.157.2.13.2.20 2004/06/23 04:19:40 marka Exp $ */
+/* $Id: dig.c,v 1.157.2.13.2.25 2004/09/16 02:14:14 marka Exp $ */
#include <config.h>
#include <stdlib.h>
@@ -41,6 +41,8 @@
#include <dns/rdataclass.h>
#include <dns/result.h>
+#include <bind9/getaddresses.h>
+
#include <dig/dig.h>
extern ISC_LIST(dig_lookup_t) lookup_list;
@@ -54,6 +56,7 @@ extern ISC_LIST(dig_searchlist_t) search_list;
isc_buffer_putstr(b, s); \
}
+#define DIG_MAX_ADDRESSES 20
extern isc_boolean_t have_ipv4, have_ipv6, specified_source,
usesearch, qr;
@@ -83,6 +86,7 @@ extern isc_boolean_t debugging, memdebugging;
static char *batchname = NULL;
static FILE *batchfp = NULL;
static char *argv0;
+static int addresscount = 0;
static char domainopt[DNS_NAME_MAXTEXT];
@@ -627,6 +631,15 @@ printgreeting(int argc, char **argv, dig_lookup_t *lookup) {
remaining = sizeof(lookup->cmdline) -
strlen(lookup->cmdline) - 1;
strncat(lookup->cmdline, "\n", remaining);
+ if (first && addresscount != 0) {
+ snprintf(append, sizeof(append),
+ "; (%d server%s found)\n",
+ addresscount,
+ addresscount > 1 ? "s" : "");
+ remaining = sizeof(lookup->cmdline) -
+ strlen(lookup->cmdline) - 1;
+ strncat(lookup->cmdline, append, remaining);
+ }
if (first) {
snprintf(append, sizeof(append),
";; global options: %s %s\n",
@@ -1008,7 +1021,7 @@ plus_option(char *option, isc_boolean_t is_batchfile,
lookup->stats = ISC_FALSE;
lookup->section_additional = ISC_FALSE;
lookup->section_authority = ISC_TRUE;
- lookup->section_question = ISC_FALSE;
+ lookup->section_question = ISC_FALSE;
}
break;
case 'i': /* tries */
@@ -1024,6 +1037,7 @@ plus_option(char *option, isc_boolean_t is_batchfile,
break;
#ifdef DIG_SIGCHASE
case 'u': /* trusted-key */
+ FULLCHECK("trusted-key");
if (value == NULL)
goto need_value;
if (!state)
@@ -1068,8 +1082,7 @@ static const char *single_dash_opts = "46dhimnv";
static const char *dash_opts = "46bcdfhikmnptvyx";
static isc_boolean_t
dash_option(char *option, char *next, dig_lookup_t **lookup,
- isc_boolean_t *open_type_class, isc_boolean_t *firstarg,
- int argc, char **argv)
+ isc_boolean_t *open_type_class)
{
char opt, *value, *ptr;
isc_result_t result;
@@ -1274,10 +1287,6 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
if (!(*lookup)->rdclassset)
(*lookup)->rdclass = dns_rdataclass_in;
(*lookup)->new_search = ISC_TRUE;
- if (*lookup && *firstarg) {
- printgreeting(argc, argv, *lookup);
- *firstarg = ISC_FALSE;
- }
ISC_LIST_APPEND(lookup_list, *lookup, link);
} else {
fprintf(stderr, "Invalid IP address %s\n", value);
@@ -1325,12 +1334,35 @@ preparse_args(int argc, char **argv) {
}
static void
+getaddresses(dig_lookup_t *lookup, const char *host) {
+ isc_result_t result;
+ isc_sockaddr_t sockaddrs[DIG_MAX_ADDRESSES];
+ isc_netaddr_t netaddr;
+ int count, i;
+ dig_server_t *srv;
+ char tmp[ISC_NETADDR_FORMATSIZE];
+
+ result = bind9_getaddresses(host, 0, sockaddrs,
+ DIG_MAX_ADDRESSES, &count);
+ if (result != ISC_R_SUCCESS)
+ fatal("couldn't get address for '%s': %s",
+ host, isc_result_totext(result));
+
+ for (i = 0; i < count; i++) {
+ isc_netaddr_fromsockaddr(&netaddr, &sockaddrs[i]);
+ isc_netaddr_format(&netaddr, tmp, sizeof(tmp));
+ srv = make_server(tmp, host);
+ ISC_LIST_APPEND(lookup->my_server_list, srv, link);
+ }
+ addresscount = count;
+}
+
+static void
parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
int argc, char **argv) {
isc_result_t result;
isc_textregion_t tr;
isc_boolean_t firstarg = ISC_TRUE;
- dig_server_t *srv = NULL;
dig_lookup_t *lookup = NULL;
dns_rdatatype_t rdtype;
dns_rdataclass_t rdclass;
@@ -1410,24 +1442,20 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
if (strncmp(rv[0], "%", 1) == 0)
break;
if (strncmp(rv[0], "@", 1) == 0) {
- srv = make_server(&rv[0][1]);
- ISC_LIST_APPEND(lookup->my_server_list,
- srv, link);
+ getaddresses(lookup, &rv[0][1]);
} else if (rv[0][0] == '+') {
plus_option(&rv[0][1], is_batchfile,
lookup);
} else if (rv[0][0] == '-') {
if (rc <= 1) {
if (dash_option(&rv[0][1], NULL,
- &lookup, &open_type_class,
- &firstarg, argc, argv)) {
+ &lookup, &open_type_class)) {
rc--;
rv++;
}
} else {
if (dash_option(&rv[0][1], rv[1],
- &lookup, &open_type_class,
- &firstarg, argc, argv)) {
+ &lookup, &open_type_class)) {
rc--;
rv++;
}
@@ -1498,10 +1526,6 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
if (!config_only) {
lookup = clone_lookup(default_lookup,
ISC_TRUE);
- if (firstarg) {
- printgreeting(argc, argv, lookup);
- firstarg = ISC_FALSE;
- }
strncpy(lookup->textname, rv[0],
sizeof(lookup->textname));
lookup->textname[sizeof(lookup->textname)-1]=0;
@@ -1568,6 +1592,9 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
firstarg = ISC_FALSE;
}
ISC_LIST_APPEND(lookup_list, lookup, link);
+ } else if (!config_only && firstarg) {
+ printgreeting(argc, argv, lookup);
+ firstarg = ISC_FALSE;
}
}
diff --git a/contrib/bind9/bin/dig/dighost.c b/contrib/bind9/bin/dig/dighost.c
index dd49b5b..63a8110 100644
--- a/contrib/bind9/bin/dig/dighost.c
+++ b/contrib/bind9/bin/dig/dighost.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dighost.c,v 1.221.2.19.2.14 2004/06/30 23:57:52 marka Exp $ */
+/* $Id: dighost.c,v 1.221.2.19.2.20 2004/11/22 23:30:31 marka Exp $ */
/*
* Notice to programmers: Do not use this code as an example of how to
@@ -290,6 +290,8 @@ struct_tk_list tk_list = { {NULL, NULL, NULL, NULL, NULL}, 0};
#endif
+#define DIG_MAX_ADDRESSES 20
+
/*
* Apply and clear locks at the event level in global task.
* Can I get rid of these using shutdown events? XXX
@@ -493,7 +495,7 @@ check_result(isc_result_t result, const char *msg) {
* of finding the answer the user is looking for
*/
dig_server_t *
-make_server(const char *servname) {
+make_server(const char *servname, const char *userarg) {
dig_server_t *srv;
REQUIRE(servname != NULL);
@@ -504,10 +506,13 @@ make_server(const char *servname) {
fatal("memory allocation failure in %s:%d",
__FILE__, __LINE__);
strncpy(srv->servername, servname, MXNAME);
+ strncpy(srv->userarg, userarg, MXNAME);
srv->servername[MXNAME-1] = 0;
+ srv->userarg[MXNAME-1] = 0;
ISC_LINK_INIT(srv, link);
return (srv);
}
+
static int
addr2af(int lwresaddrtype)
{
@@ -525,6 +530,7 @@ addr2af(int lwresaddrtype)
return (af);
}
+
/*
* Create a copy of the server list from the lwres configuration structure.
* The dest list must have already had ISC_LIST_INIT applied.
@@ -542,11 +548,12 @@ copy_server_list(lwres_conf_t *confdata, dig_serverlist_t *dest) {
lwres_net_ntop(af, confdata->nameservers[i].address,
tmp, sizeof(tmp));
- newsrv = make_server(tmp);
+ newsrv = make_server(tmp, tmp);
ISC_LINK_INIT(newsrv, link);
ISC_LIST_ENQUEUE(*dest, newsrv, link);
}
}
+
void
flush_server_list(void) {
dig_server_t *s, *ps;
@@ -560,18 +567,35 @@ flush_server_list(void) {
isc_mem_free(mctx, ps);
}
}
+
void
set_nameserver(char *opt) {
+ isc_result_t result;
+ isc_sockaddr_t sockaddrs[DIG_MAX_ADDRESSES];
+ isc_netaddr_t netaddr;
+ int count, i;
dig_server_t *srv;
+ char tmp[ISC_NETADDR_FORMATSIZE];
if (opt == NULL)
return;
+ result = bind9_getaddresses(opt, 0, sockaddrs,
+ DIG_MAX_ADDRESSES, &count);
+ if (result != ISC_R_SUCCESS)
+ fatal("couldn't get address for '%s': %s",
+ opt, isc_result_totext(result));
+
flush_server_list();
- srv = make_server(opt);
- if (srv == NULL)
- fatal("memory allocation failure");
- ISC_LIST_INITANDAPPEND(server_list, srv, link);
+
+ for (i = 0; i < count; i++) {
+ isc_netaddr_fromsockaddr(&netaddr, &sockaddrs[i]);
+ isc_netaddr_format(&netaddr, tmp, sizeof(tmp));
+ srv = make_server(tmp, opt);
+ if (srv == NULL)
+ fatal("memory allocation failure");
+ ISC_LIST_APPEND(server_list, srv, link);
+ }
}
static isc_result_t
@@ -613,7 +637,7 @@ clone_server_list(dig_serverlist_t src, dig_serverlist_t *dest) {
debug("clone_server_list()");
srv = ISC_LIST_HEAD(src);
while (srv != NULL) {
- newsrv = make_server(srv->servername);
+ newsrv = make_server(srv->servername, srv->userarg);
ISC_LINK_INIT(newsrv, link);
ISC_LIST_ENQUEUE(*dest, newsrv, link);
srv = ISC_LIST_NEXT(srv, link);
@@ -1392,6 +1416,13 @@ followup_lookup(dns_message_t *msg, dig_query_t *query, dns_section_t section)
name = NULL;
dns_message_currentname(msg, section, &name);
+ if (section == DNS_SECTION_AUTHORITY) {
+ rdataset = NULL;
+ result = dns_message_findtype(name, dns_rdatatype_soa,
+ 0, &rdataset);
+ if (result == ISC_R_SUCCESS)
+ return (0);
+ }
rdataset = NULL;
result = dns_message_findtype(name, dns_rdatatype_ns, 0,
&rdataset);
@@ -1436,7 +1467,7 @@ followup_lookup(dns_message_t *msg, dig_query_t *query, dns_section_t section)
query->lookup->ns_search_only;
lookup->trace_root = ISC_FALSE;
}
- srv = make_server(namestr);
+ srv = make_server(namestr, namestr);
debug("adding server %s", srv->servername);
ISC_LIST_APPEND(lookup->my_server_list, srv, link);
dns_rdata_reset(&rdata);
@@ -1800,6 +1831,7 @@ setup_lookup(dig_lookup_t *lookup) {
query->first_rr_serial = 0;
query->second_rr_serial = 0;
query->servname = serv->servername;
+ query->userarg = serv->userarg;
query->rr_count = 0;
query->msg_count = 0;
ISC_LINK_INIT(query, link);
@@ -2581,11 +2613,26 @@ recv_done(isc_task_t *task, isc_event_t *event) {
else
isc_sockaddr_any6(&any);
+#ifdef ISC_PLATFORM_HAVESCOPEID
/*
- * We don't expect a match when the packet is
- * sent to 0.0.0.0, :: or to a multicast addresses.
- * XXXMPA broadcast needs to be handled here as well.
- */
+ * Accept answers from any scope if we havn't specified the
+ * scope as long as the address and port match.
+ */
+ if (isc_sockaddr_pf(&query->sockaddr) == AF_INET6 &&
+ query->sockaddr.type.sin6.sin6_scope_id == 0 &&
+ memcmp(&sevent->address.type.sin6.sin6_addr,
+ &query->sockaddr.type.sin6.sin6_addr,
+ sizeof(query->sockaddr.type.sin6.sin6_addr)) == 0 &&
+ isc_sockaddr_getport(&sevent->address) ==
+ isc_sockaddr_getport(&query->sockaddr))
+ /* empty */;
+ else
+#endif
+ /*
+ * We don't expect a match above when the packet is
+ * sent to 0.0.0.0, :: or to a multicast addresses.
+ * XXXMPA broadcast needs to be handled here as well.
+ */
if ((!isc_sockaddr_eqaddr(&query->sockaddr, &any) &&
!isc_sockaddr_ismulticast(&query->sockaddr)) ||
isc_sockaddr_getport(&query->sockaddr) !=
@@ -3564,8 +3611,8 @@ get_trusted_key(isc_mem_t *mctx)
return ISC_R_FAILURE;
}
fclose(fptemp);
- result = dst_key_fromnamedfile(filetemp, DST_TYPE_PUBLIC |
- DST_TYPE_KEY, mctx, &key);
+ result = dst_key_fromnamedfile(filetemp, DST_TYPE_PUBLIC,
+ mctx, &key);
removetmpkey(mctx, filetemp);
isc_mem_free(mctx, filetemp);
if (result != ISC_R_SUCCESS ) {
@@ -3688,7 +3735,7 @@ prepare_lookup(dns_name_t *name)
dns_rdata_reset(&aaaa);
- srv = make_server(namestr);
+ srv = make_server(namestr, namestr);
ISC_LIST_APPEND(lookup->my_server_list,
srv, link);
@@ -3718,7 +3765,7 @@ prepare_lookup(dns_name_t *name)
printf("ns name: %s\n", namestr);
- srv = make_server(namestr);
+ srv = make_server(namestr, namestr);
ISC_LIST_APPEND(lookup->my_server_list,
srv, link);
@@ -3730,7 +3777,7 @@ prepare_lookup(dns_name_t *name)
printf("ns name: ");
dns_name_print(&ns.name, stdout);
printf("\n");
- srv = make_server(namestr);
+ srv = make_server(namestr, namestr);
ISC_LIST_APPEND(lookup->my_server_list, srv, link);
@@ -4905,7 +4952,7 @@ prove_nx_domain(dns_message_t *msg,
dns_rdataset_t * nsecset = NULL;
dns_rdataset_t * signsecset = NULL ;
dns_rdata_t nsec = DNS_RDATA_INIT;
- dns_name_t * nsecname = NULL;
+ dns_name_t * nsecname;
dns_rdata_nsec_t nsecstruct;
if ((result = dns_message_firstname(msg, DNS_SECTION_AUTHORITY))
@@ -4916,6 +4963,7 @@ prove_nx_domain(dns_message_t *msg,
}
do {
+ nsecname = NULL;
dns_message_currentname(msg, DNS_SECTION_AUTHORITY, &nsecname);
nsecset = search_type(nsecname, dns_rdatatype_nsec,
dns_rdatatype_any);
@@ -4961,7 +5009,6 @@ prove_nx_domain(dns_message_t *msg,
dns_rdata_freestruct(&nsecstruct);
}
- nsecname = NULL;
} while (dns_message_nextname(msg, DNS_SECTION_AUTHORITY)
== ISC_R_SUCCESS);
diff --git a/contrib/bind9/bin/dig/host.c b/contrib/bind9/bin/dig/host.c
index 53d7812..b8f2d93 100644
--- a/contrib/bind9/bin/dig/host.c
+++ b/contrib/bind9/bin/dig/host.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: host.c,v 1.76.2.5.2.9 2004/04/13 03:00:06 marka Exp $ */
+/* $Id: host.c,v 1.76.2.5.2.10 2004/09/06 01:33:05 marka Exp $ */
#include <config.h>
#include <limits.h>
@@ -386,7 +386,7 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
char sockstr[ISC_SOCKADDR_FORMATSIZE];
printf("Using domain server:\n");
- printf("Name: %s\n", query->servname);
+ printf("Name: %s\n", query->userarg);
isc_sockaddr_format(&query->sockaddr, sockstr,
sizeof(sockstr));
printf("Address: %s\n", sockstr);
diff --git a/contrib/bind9/bin/dig/include/dig/dig.h b/contrib/bind9/bin/dig/include/dig/dig.h
index 12e1e21..4e88b15 100644
--- a/contrib/bind9/bin/dig/include/dig/dig.h
+++ b/contrib/bind9/bin/dig/include/dig/dig.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dig.h,v 1.71.2.6.2.6 2004/06/19 02:30:12 sra Exp $ */
+/* $Id: dig.h,v 1.71.2.6.2.7 2004/09/06 01:33:06 marka Exp $ */
#ifndef DIG_H
#define DIG_H
@@ -192,6 +192,7 @@ struct dig_query {
isc_uint32_t msg_count;
isc_uint32_t rr_count;
char *servname;
+ char *userarg;
isc_bufferlist_t sendlist,
recvlist,
lengthlist;
@@ -209,6 +210,7 @@ struct dig_query {
struct dig_server {
char servername[MXNAME];
+ char userarg[MXNAME];
ISC_LINK(dig_server_t) link;
};
@@ -272,7 +274,7 @@ dig_lookup_t *
clone_lookup(dig_lookup_t *lookold, isc_boolean_t servers);
dig_server_t *
-make_server(const char *servname);
+make_server(const char *servname, const char *userarg);
void
flush_server_list(void);
diff --git a/contrib/bind9/bin/dig/nslookup.c b/contrib/bind9/bin/dig/nslookup.c
index a616bae..b26c605 100644
--- a/contrib/bind9/bin/dig/nslookup.c
+++ b/contrib/bind9/bin/dig/nslookup.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nslookup.c,v 1.90.2.4.2.7 2004/08/18 23:25:58 marka Exp $ */
+/* $Id: nslookup.c,v 1.90.2.4.2.8 2004/09/06 01:33:05 marka Exp $ */
#include <config.h>
@@ -402,7 +402,7 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
debug("printmessage()");
isc_sockaddr_format(&query->sockaddr, servtext, sizeof(servtext));
- printf("Server:\t\t%s\n", query->servname);
+ printf("Server:\t\t%s\n", query->userarg);
printf("Address:\t%s\n", servtext);
puts("");
@@ -461,7 +461,7 @@ show_settings(isc_boolean_t full, isc_boolean_t serv_only) {
get_address(srv->servername, port, &sockaddr);
isc_sockaddr_format(&sockaddr, sockstr, sizeof(sockstr));
printf("Default server: %s\nAddress: %s\n",
- srv->servername, sockstr);
+ srv->userarg, sockstr);
if (!full)
return;
srv = ISC_LIST_NEXT(srv, link);
@@ -738,7 +738,9 @@ get_next_command(void) {
setoption(arg);
else if ((strcasecmp(ptr, "server") == 0) ||
(strcasecmp(ptr, "lserver") == 0)) {
+ isc_app_block();
set_nameserver(arg);
+ isc_app_unblock();
show_settings(ISC_TRUE, ISC_TRUE);
} else if (strcasecmp(ptr, "exit") == 0) {
in_use = ISC_FALSE;
OpenPOWER on IntegriCloud