]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1714. [bug] dig/host/nslookup were only trying the first
authorMark Andrews <marka@isc.org>
Mon, 6 Sep 2004 01:24:44 +0000 (01:24 +0000)
committerMark Andrews <marka@isc.org>
Mon, 6 Sep 2004 01:24:44 +0000 (01:24 +0000)
                        address when a nameserver was specified by name.
                        [RT #12286]

CHANGES
bin/dig/dig.c
bin/dig/dighost.c
bin/dig/host.c
bin/dig/include/dig/dig.h
bin/dig/nslookup.c

diff --git a/CHANGES b/CHANGES
index 050f3132695bf0ce2362cda3dfd79860124c972f..cb0e956e3f0a29c49bfccaedd2f7a616c0ab83d4 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+1714.  [bug]           dig/host/nslookup were only trying the first
+                       address when a nameserver was specified by name.
+                       [RT #12286]
+
 1713.  [placeholder]   rt12375
 
 1712.  [bug]           Missing FULLCHECK for "trusted-key" in dig.
index abf0c085dd0a3e7ce248d0d51792b242a6d6071e..1803ecf6ab663d3bb9520e13145d750e6511d467 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dig.c,v 1.195 2004/09/03 03:55:20 marka Exp $ */
+/* $Id: dig.c,v 1.196 2004/09/06 01:24:42 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" : "");
+                       strncat(lookup->cmdline, append, remaining);
+                       remaining = sizeof(lookup->cmdline) -
+                                   strlen(lookup->cmdline) - 1;
+               }
                if (first) {
                        snprintf(append, sizeof(append), 
                                 ";; global options: %s %s\n",
@@ -1069,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;
@@ -1275,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,13 +1333,36 @@ 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;
+       unsigned 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;
@@ -1411,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++;
                                }
@@ -1499,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;
@@ -1569,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;
        }
 }
 
index b0d322eb3ec37855b7ebb291dbaf8902db1bee51..5cd9614ba1e7bf838a899141d693323a2f2a8c47 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dighost.c,v 1.264 2004/06/30 23:47:48 marka Exp $ */
+/* $Id: dighost.c,v 1.265 2004/09/06 01:24:43 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;
+       unsigned 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);
@@ -1436,7 +1460,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 +1824,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);
@@ -3688,7 +3713,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 +3743,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 +3755,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);
 
index 24aea48785cfa3ccf6c5bca98e33fca46b7f5bb3..5c099e5e9202f885d0afb1021ddb526f0a43b15e 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: host.c,v 1.97 2004/04/13 02:54:14 marka Exp $ */
+/* $Id: host.c,v 1.98 2004/09/06 01:24:43 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);
index 067c08649b1e0f98080cd4f408d1c69e0f56af02..555206c56a2a247f9dc05498699179a2f22c7003 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dig.h,v 1.85 2004/06/19 02:23:36 sra Exp $ */
+/* $Id: dig.h,v 1.86 2004/09/06 01:24:44 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);
index a5eaff52cdd6ae6bcdb27079685b6aff49300d7c..a70323ab94783e275261a8cbb36fe1add1c3e809 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: nslookup.c,v 1.106 2004/08/19 07:02:42 marka Exp $ */
+/* $Id: nslookup.c,v 1.107 2004/09/06 01:24:43 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;