diff options
Diffstat (limited to 'contrib/bind9/bin/dig')
-rw-r--r-- | contrib/bind9/bin/dig/dig.c | 67 | ||||
-rw-r--r-- | contrib/bind9/bin/dig/dighost.c | 87 | ||||
-rw-r--r-- | contrib/bind9/bin/dig/host.c | 4 | ||||
-rw-r--r-- | contrib/bind9/bin/dig/include/dig/dig.h | 6 | ||||
-rw-r--r-- | contrib/bind9/bin/dig/nslookup.c | 8 |
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; |