summaryrefslogtreecommitdiffstats
path: root/contrib/bind9/bin/dig/nslookup.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind9/bin/dig/nslookup.c')
-rw-r--r--contrib/bind9/bin/dig/nslookup.c891
1 files changed, 0 insertions, 891 deletions
diff --git a/contrib/bind9/bin/dig/nslookup.c b/contrib/bind9/bin/dig/nslookup.c
deleted file mode 100644
index 3327c6e..0000000
--- a/contrib/bind9/bin/dig/nslookup.c
+++ /dev/null
@@ -1,891 +0,0 @@
-/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
- * Copyright (C) 2000-2003 Internet Software Consortium.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* $Id: nslookup.c,v 1.101.18.15 2007/08/28 07:19:55 tbox Exp $ */
-
-#include <config.h>
-
-#include <stdlib.h>
-
-#include <isc/app.h>
-#include <isc/buffer.h>
-#include <isc/commandline.h>
-#include <isc/event.h>
-#include <isc/parseint.h>
-#include <isc/string.h>
-#include <isc/timer.h>
-#include <isc/util.h>
-#include <isc/task.h>
-#include <isc/netaddr.h>
-
-#include <dns/message.h>
-#include <dns/name.h>
-#include <dns/fixedname.h>
-#include <dns/rdata.h>
-#include <dns/rdataclass.h>
-#include <dns/rdataset.h>
-#include <dns/rdatastruct.h>
-#include <dns/rdatatype.h>
-#include <dns/byaddr.h>
-
-#include <dig/dig.h>
-
-static isc_boolean_t short_form = ISC_TRUE,
- tcpmode = ISC_FALSE,
- identify = 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,
- aaonly = ISC_FALSE, nofail = ISC_TRUE;
-
-static isc_boolean_t in_use = ISC_FALSE;
-static char defclass[MXRD] = "IN";
-static char deftype[MXRD] = "A";
-static isc_event_t *global_event = NULL;
-
-static char domainopt[DNS_NAME_MAXTEXT];
-
-static const char *rcodetext[] = {
- "NOERROR",
- "FORMERR",
- "SERVFAIL",
- "NXDOMAIN",
- "NOTIMP",
- "REFUSED",
- "YXDOMAIN",
- "YXRRSET",
- "NXRRSET",
- "NOTAUTH",
- "NOTZONE",
- "RESERVED11",
- "RESERVED12",
- "RESERVED13",
- "RESERVED14",
- "RESERVED15",
- "BADVERS"
-};
-
-static const char *rtypetext[] = {
- "rtype_0 = ", /* 0 */
- "internet address = ", /* 1 */
- "nameserver = ", /* 2 */
- "md = ", /* 3 */
- "mf = ", /* 4 */
- "canonical name = ", /* 5 */
- "soa = ", /* 6 */
- "mb = ", /* 7 */
- "mg = ", /* 8 */
- "mr = ", /* 9 */
- "rtype_10 = ", /* 10 */
- "protocol = ", /* 11 */
- "name = ", /* 12 */
- "hinfo = ", /* 13 */
- "minfo = ", /* 14 */
- "mail exchanger = ", /* 15 */
- "text = ", /* 16 */
- "rp = ", /* 17 */
- "afsdb = ", /* 18 */
- "x25 address = ", /* 19 */
- "isdn address = ", /* 20 */
- "rt = ", /* 21 */
- "nsap = ", /* 22 */
- "nsap_ptr = ", /* 23 */
- "signature = ", /* 24 */
- "key = ", /* 25 */
- "px = ", /* 26 */
- "gpos = ", /* 27 */
- "has AAAA address ", /* 28 */
- "loc = ", /* 29 */
- "next = ", /* 30 */
- "rtype_31 = ", /* 31 */
- "rtype_32 = ", /* 32 */
- "service = ", /* 33 */
- "rtype_34 = ", /* 34 */
- "naptr = ", /* 35 */
- "kx = ", /* 36 */
- "cert = ", /* 37 */
- "v6 address = ", /* 38 */
- "dname = ", /* 39 */
- "rtype_40 = ", /* 40 */
- "optional = " /* 41 */
-};
-
-#define N_KNOWN_RRTYPES (sizeof(rtypetext) / sizeof(rtypetext[0]))
-
-static void flush_lookup_list(void);
-static void getinput(isc_task_t *task, isc_event_t *event);
-
-void
-dighost_shutdown(void) {
- isc_event_t *event = global_event;
-
- flush_lookup_list();
- debug("dighost_shutdown()");
-
- if (!in_use) {
- isc_app_shutdown();
- return;
- }
-
- isc_task_send(global_task, &event);
-}
-
-static void
-printsoa(dns_rdata_t *rdata) {
- dns_rdata_soa_t soa;
- isc_result_t result;
- char namebuf[DNS_NAME_FORMATSIZE];
-
- result = dns_rdata_tostruct(rdata, &soa, NULL);
- check_result(result, "dns_rdata_tostruct");
-
- dns_name_format(&soa.origin, namebuf, sizeof(namebuf));
- printf("\torigin = %s\n", namebuf);
- dns_name_format(&soa.contact, namebuf, sizeof(namebuf));
- printf("\tmail addr = %s\n", namebuf);
- printf("\tserial = %u\n", soa.serial);
- printf("\trefresh = %u\n", soa.refresh);
- printf("\tretry = %u\n", soa.retry);
- printf("\texpire = %u\n", soa.expire);
- printf("\tminimum = %u\n", soa.minimum);
- dns_rdata_freestruct(&soa);
-}
-
-static void
-printa(dns_rdata_t *rdata) {
- isc_result_t result;
- char text[sizeof("255.255.255.255")];
- isc_buffer_t b;
-
- isc_buffer_init(&b, text, sizeof(text));
- result = dns_rdata_totext(rdata, NULL, &b);
- check_result(result, "dns_rdata_totext");
- printf("Address: %.*s\n", (int)isc_buffer_usedlength(&b),
- (char *)isc_buffer_base(&b));
-}
-#ifdef DIG_SIGCHASE
-/* Just for compatibility : not use in host program */
-isc_result_t
-printrdataset(dns_name_t *owner_name, dns_rdataset_t *rdataset,
- isc_buffer_t *target)
-{
- UNUSED(owner_name);
- UNUSED(rdataset);
- UNUSED(target);
- return(ISC_FALSE);
-}
-#endif
-static void
-printrdata(dns_rdata_t *rdata) {
- isc_result_t result;
- isc_buffer_t *b = NULL;
- unsigned int size = 1024;
- isc_boolean_t done = ISC_FALSE;
-
- if (rdata->type < N_KNOWN_RRTYPES)
- printf("%s", rtypetext[rdata->type]);
- else
- printf("rdata_%d = ", rdata->type);
-
- while (!done) {
- result = isc_buffer_allocate(mctx, &b, size);
- if (result != ISC_R_SUCCESS)
- check_result(result, "isc_buffer_allocate");
- result = dns_rdata_totext(rdata, NULL, b);
- if (result == ISC_R_SUCCESS) {
- printf("%.*s\n", (int)isc_buffer_usedlength(b),
- (char *)isc_buffer_base(b));
- done = ISC_TRUE;
- } else if (result != ISC_R_NOSPACE)
- check_result(result, "dns_rdata_totext");
- isc_buffer_free(&b);
- size *= 2;
- }
-}
-
-static isc_result_t
-printsection(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers,
- dns_section_t section) {
- isc_result_t result, loopresult;
- dns_name_t *name;
- dns_rdataset_t *rdataset = NULL;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- char namebuf[DNS_NAME_FORMATSIZE];
-
- UNUSED(query);
- UNUSED(headers);
-
- debug("printsection()");
-
- result = dns_message_firstname(msg, section);
- if (result == ISC_R_NOMORE)
- return (ISC_R_SUCCESS);
- else if (result != ISC_R_SUCCESS)
- return (result);
- for (;;) {
- name = NULL;
- dns_message_currentname(msg, section,
- &name);
- for (rdataset = ISC_LIST_HEAD(name->list);
- rdataset != NULL;
- rdataset = ISC_LIST_NEXT(rdataset, link)) {
- loopresult = dns_rdataset_first(rdataset);
- while (loopresult == ISC_R_SUCCESS) {
- dns_rdataset_current(rdataset, &rdata);
- switch (rdata.type) {
- case dns_rdatatype_a:
- if (section != DNS_SECTION_ANSWER)
- goto def_short_section;
- dns_name_format(name, namebuf,
- sizeof(namebuf));
- printf("Name:\t%s\n", namebuf);
- printa(&rdata);
- break;
- case dns_rdatatype_soa:
- dns_name_format(name, namebuf,
- sizeof(namebuf));
- printf("%s\n", namebuf);
- printsoa(&rdata);
- break;
- default:
- def_short_section:
- dns_name_format(name, namebuf,
- sizeof(namebuf));
- printf("%s\t", namebuf);
- printrdata(&rdata);
- break;
- }
- dns_rdata_reset(&rdata);
- loopresult = dns_rdataset_next(rdataset);
- }
- }
- result = dns_message_nextname(msg, section);
- if (result == ISC_R_NOMORE)
- break;
- else if (result != ISC_R_SUCCESS) {
- return (result);
- }
- }
- return (ISC_R_SUCCESS);
-}
-
-static isc_result_t
-detailsection(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers,
- dns_section_t section) {
- isc_result_t result, loopresult;
- dns_name_t *name;
- dns_rdataset_t *rdataset = NULL;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- char namebuf[DNS_NAME_FORMATSIZE];
-
- UNUSED(query);
-
- debug("detailsection()");
-
- if (headers) {
- switch (section) {
- case DNS_SECTION_QUESTION:
- puts(" QUESTIONS:");
- break;
- case DNS_SECTION_ANSWER:
- puts(" ANSWERS:");
- break;
- case DNS_SECTION_AUTHORITY:
- puts(" AUTHORITY RECORDS:");
- break;
- case DNS_SECTION_ADDITIONAL:
- puts(" ADDITIONAL RECORDS:");
- break;
- }
- }
-
- result = dns_message_firstname(msg, section);
- if (result == ISC_R_NOMORE)
- return (ISC_R_SUCCESS);
- else if (result != ISC_R_SUCCESS)
- return (result);
- for (;;) {
- name = NULL;
- dns_message_currentname(msg, section,
- &name);
- for (rdataset = ISC_LIST_HEAD(name->list);
- rdataset != NULL;
- rdataset = ISC_LIST_NEXT(rdataset, link)) {
- if (section == DNS_SECTION_QUESTION) {
- dns_name_format(name, namebuf,
- sizeof(namebuf));
- printf("\t%s, ", namebuf);
- dns_rdatatype_format(rdataset->type,
- namebuf,
- sizeof(namebuf));
- printf("type = %s, ", namebuf);
- dns_rdataclass_format(rdataset->rdclass,
- namebuf,
- sizeof(namebuf));
- printf("class = %s\n", namebuf);
- }
- loopresult = dns_rdataset_first(rdataset);
- while (loopresult == ISC_R_SUCCESS) {
- dns_rdataset_current(rdataset, &rdata);
-
- dns_name_format(name, namebuf,
- sizeof(namebuf));
- printf(" -> %s\n", namebuf);
-
- switch (rdata.type) {
- case dns_rdatatype_soa:
- printsoa(&rdata);
- break;
- default:
- printf("\t");
- printrdata(&rdata);
- }
- dns_rdata_reset(&rdata);
- loopresult = dns_rdataset_next(rdataset);
- }
- }
- result = dns_message_nextname(msg, section);
- if (result == ISC_R_NOMORE)
- break;
- else if (result != ISC_R_SUCCESS) {
- return (result);
- }
- }
- return (ISC_R_SUCCESS);
-}
-
-void
-received(int bytes, isc_sockaddr_t *from, dig_query_t *query)
-{
- UNUSED(bytes);
- UNUSED(from);
- UNUSED(query);
-}
-
-void
-trying(char *frm, dig_lookup_t *lookup) {
- UNUSED(frm);
- UNUSED(lookup);
-
-}
-
-isc_result_t
-printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
- char servtext[ISC_SOCKADDR_FORMATSIZE];
-
- debug("printmessage()");
-
- isc_sockaddr_format(&query->sockaddr, servtext, sizeof(servtext));
- printf("Server:\t\t%s\n", query->userarg);
- printf("Address:\t%s\n", servtext);
-
- puts("");
-
- if (!short_form) {
- isc_boolean_t headers = ISC_TRUE;
- puts("------------");
- /* detailheader(query, msg);*/
- detailsection(query, msg, headers, DNS_SECTION_QUESTION);
- detailsection(query, msg, headers, DNS_SECTION_ANSWER);
- detailsection(query, msg, headers, DNS_SECTION_AUTHORITY);
- detailsection(query, msg, headers, DNS_SECTION_ADDITIONAL);
- puts("------------");
- }
-
- if (msg->rcode != 0) {
- char nametext[DNS_NAME_FORMATSIZE];
- dns_name_format(query->lookup->name,
- nametext, sizeof(nametext));
- printf("** server can't find %s: %s\n",
- (msg->rcode != dns_rcode_nxdomain) ? nametext :
- query->lookup->textname, rcodetext[msg->rcode]);
- debug("returning with rcode == 0");
- return (ISC_R_SUCCESS);
- }
-
- if ((msg->flags & DNS_MESSAGEFLAG_AA) == 0)
- puts("Non-authoritative answer:");
- if (!ISC_LIST_EMPTY(msg->sections[DNS_SECTION_ANSWER]))
- printsection(query, msg, headers, DNS_SECTION_ANSWER);
- else
- printf("*** Can't find %s: No answer\n",
- query->lookup->textname);
-
- if (((msg->flags & DNS_MESSAGEFLAG_AA) == 0) &&
- (query->lookup->rdtype != dns_rdatatype_a)) {
- puts("\nAuthoritative answers can be found from:");
- printsection(query, msg, headers,
- DNS_SECTION_AUTHORITY);
- printsection(query, msg, headers,
- DNS_SECTION_ADDITIONAL);
- }
- return (ISC_R_SUCCESS);
-}
-
-static void
-show_settings(isc_boolean_t full, isc_boolean_t serv_only) {
- dig_server_t *srv;
- isc_sockaddr_t sockaddr;
- dig_searchlist_t *listent;
-
- srv = ISC_LIST_HEAD(server_list);
-
- while (srv != NULL) {
- char sockstr[ISC_SOCKADDR_FORMATSIZE];
-
- get_address(srv->servername, port, &sockaddr);
- isc_sockaddr_format(&sockaddr, sockstr, sizeof(sockstr));
- printf("Default server: %s\nAddress: %s\n",
- srv->userarg, sockstr);
- if (!full)
- return;
- srv = ISC_LIST_NEXT(srv, link);
- }
- if (serv_only)
- return;
- printf("\nSet options:\n");
- printf(" %s\t\t\t%s\t\t%s\n",
- tcpmode ? "vc" : "novc",
- short_form ? "nodebug" : "debug",
- debugging ? "d2" : "nod2");
- printf(" %s\t\t%s\n",
- usesearch ? "search" : "nosearch",
- recurse ? "recurse" : "norecurse");
- printf(" timeout = %d\t\tretry = %d\tport = %d\n",
- timeout, tries, port);
- printf(" querytype = %-8s\tclass = %s\n", deftype, defclass);
- printf(" srchlist = ");
- for (listent = ISC_LIST_HEAD(search_list);
- listent != NULL;
- listent = ISC_LIST_NEXT(listent, link)) {
- printf("%s", listent->origin);
- if (ISC_LIST_NEXT(listent, link) != NULL)
- printf("/");
- }
- printf("\n");
-}
-
-static isc_boolean_t
-testtype(char *typetext) {
- isc_result_t result;
- isc_textregion_t tr;
- dns_rdatatype_t rdtype;
-
- tr.base = typetext;
- tr.length = strlen(typetext);
- result = dns_rdatatype_fromtext(&rdtype, &tr);
- if (result == ISC_R_SUCCESS)
- return (ISC_TRUE);
- else {
- printf("unknown query type: %s\n", typetext);
- return (ISC_FALSE);
- }
-}
-
-static isc_boolean_t
-testclass(char *typetext) {
- isc_result_t result;
- isc_textregion_t tr;
- dns_rdataclass_t rdclass;
-
- tr.base = typetext;
- tr.length = strlen(typetext);
- result = dns_rdataclass_fromtext(&rdclass, &tr);
- if (result == ISC_R_SUCCESS)
- return (ISC_TRUE);
- else {
- printf("unknown query class: %s\n", typetext);
- return (ISC_FALSE);
- }
-}
-
-static void
-safecpy(char *dest, char *src, int size) {
- strncpy(dest, src, size);
- dest[size-1] = 0;
-}
-
-static isc_result_t
-parse_uint(isc_uint32_t *uip, const char *value, isc_uint32_t max,
- const char *desc) {
- isc_uint32_t n;
- isc_result_t result = isc_parse_uint32(&n, value, 10);
- if (result == ISC_R_SUCCESS && n > max)
- result = ISC_R_RANGE;
- if (result != ISC_R_SUCCESS) {
- printf("invalid %s '%s': %s\n", desc,
- value, isc_result_totext(result));
- return result;
- }
- *uip = n;
- return (ISC_R_SUCCESS);
-}
-
-static void
-set_port(const char *value) {
- isc_uint32_t n;
- isc_result_t result = parse_uint(&n, value, 65535, "port");
- if (result == ISC_R_SUCCESS)
- port = (isc_uint16_t) n;
-}
-
-static void
-set_timeout(const char *value) {
- isc_uint32_t n;
- isc_result_t result = parse_uint(&n, value, UINT_MAX, "timeout");
- if (result == ISC_R_SUCCESS)
- timeout = n;
-}
-
-static void
-set_tries(const char *value) {
- isc_uint32_t n;
- isc_result_t result = parse_uint(&n, value, INT_MAX, "tries");
- if (result == ISC_R_SUCCESS)
- tries = n;
-}
-
-static void
-setoption(char *opt) {
- if (strncasecmp(opt, "all", 4) == 0) {
- show_settings(ISC_TRUE, ISC_FALSE);
- } else if (strncasecmp(opt, "class=", 6) == 0) {
- if (testclass(&opt[6]))
- safecpy(defclass, &opt[6], sizeof(defclass));
- } else if (strncasecmp(opt, "cl=", 3) == 0) {
- if (testclass(&opt[3]))
- safecpy(defclass, &opt[3], sizeof(defclass));
- } else if (strncasecmp(opt, "type=", 5) == 0) {
- if (testtype(&opt[5]))
- safecpy(deftype, &opt[5], sizeof(deftype));
- } else if (strncasecmp(opt, "ty=", 3) == 0) {
- if (testtype(&opt[3]))
- safecpy(deftype, &opt[3], sizeof(deftype));
- } else if (strncasecmp(opt, "querytype=", 10) == 0) {
- if (testtype(&opt[10]))
- safecpy(deftype, &opt[10], sizeof(deftype));
- } else if (strncasecmp(opt, "query=", 6) == 0) {
- if (testtype(&opt[6]))
- safecpy(deftype, &opt[6], sizeof(deftype));
- } else if (strncasecmp(opt, "qu=", 3) == 0) {
- if (testtype(&opt[3]))
- safecpy(deftype, &opt[3], sizeof(deftype));
- } else if (strncasecmp(opt, "q=", 2) == 0) {
- if (testtype(&opt[2]))
- safecpy(deftype, &opt[2], sizeof(deftype));
- } else if (strncasecmp(opt, "domain=", 7) == 0) {
- safecpy(domainopt, &opt[7], sizeof(domainopt));
- set_search_domain(domainopt);
- usesearch = ISC_TRUE;
- } else if (strncasecmp(opt, "do=", 3) == 0) {
- safecpy(domainopt, &opt[3], sizeof(domainopt));
- set_search_domain(domainopt);
- usesearch = ISC_TRUE;
- } else if (strncasecmp(opt, "port=", 5) == 0) {
- set_port(&opt[5]);
- } else if (strncasecmp(opt, "po=", 3) == 0) {
- set_port(&opt[3]);
- } else if (strncasecmp(opt, "timeout=", 8) == 0) {
- set_timeout(&opt[8]);
- } else if (strncasecmp(opt, "t=", 2) == 0) {
- set_timeout(&opt[2]);
- } else if (strncasecmp(opt, "rec", 3) == 0) {
- recurse = ISC_TRUE;
- } else if (strncasecmp(opt, "norec", 5) == 0) {
- recurse = ISC_FALSE;
- } else if (strncasecmp(opt, "retry=", 6) == 0) {
- set_tries(&opt[6]);
- } else if (strncasecmp(opt, "ret=", 4) == 0) {
- set_tries(&opt[4]);
- } else if (strncasecmp(opt, "def", 3) == 0) {
- usesearch = ISC_TRUE;
- } else if (strncasecmp(opt, "nodef", 5) == 0) {
- usesearch = ISC_FALSE;
- } else if (strncasecmp(opt, "vc", 3) == 0) {
- tcpmode = ISC_TRUE;
- } else if (strncasecmp(opt, "novc", 5) == 0) {
- tcpmode = ISC_FALSE;
- } else if (strncasecmp(opt, "deb", 3) == 0) {
- short_form = ISC_FALSE;
- showsearch = ISC_TRUE;
- } else if (strncasecmp(opt, "nodeb", 5) == 0) {
- short_form = ISC_TRUE;
- showsearch = ISC_FALSE;
- } else if (strncasecmp(opt, "d2", 2) == 0) {
- debugging = ISC_TRUE;
- } else if (strncasecmp(opt, "nod2", 4) == 0) {
- debugging = ISC_FALSE;
- } else if (strncasecmp(opt, "search", 3) == 0) {
- usesearch = ISC_TRUE;
- } else if (strncasecmp(opt, "nosearch", 5) == 0) {
- usesearch = ISC_FALSE;
- } else if (strncasecmp(opt, "sil", 3) == 0) {
- /* deprecation_msg = ISC_FALSE; */
- } else if (strncasecmp(opt, "fail", 3) == 0) {
- nofail=ISC_FALSE;
- } else if (strncasecmp(opt, "nofail", 3) == 0) {
- nofail=ISC_TRUE;
- } else {
- printf("*** Invalid option: %s\n", opt);
- }
-}
-
-static void
-addlookup(char *opt) {
- dig_lookup_t *lookup;
- isc_result_t result;
- isc_textregion_t tr;
- dns_rdatatype_t rdtype;
- dns_rdataclass_t rdclass;
- char store[MXNAME];
-
- debug("addlookup()");
- tr.base = deftype;
- tr.length = strlen(deftype);
- result = dns_rdatatype_fromtext(&rdtype, &tr);
- if (result != ISC_R_SUCCESS) {
- printf("unknown query type: %s\n", deftype);
- rdclass = dns_rdatatype_a;
- }
- tr.base = defclass;
- tr.length = strlen(defclass);
- result = dns_rdataclass_fromtext(&rdclass, &tr);
- if (result != ISC_R_SUCCESS) {
- printf("unknown query class: %s\n", defclass);
- rdclass = dns_rdataclass_in;
- }
- lookup = make_empty_lookup();
- if (get_reverse(store, sizeof(store), opt, lookup->ip6_int, ISC_TRUE)
- == ISC_R_SUCCESS) {
- safecpy(lookup->textname, store, sizeof(lookup->textname));
- lookup->rdtype = dns_rdatatype_ptr;
- lookup->rdtypeset = ISC_TRUE;
- } else {
- safecpy(lookup->textname, opt, sizeof(lookup->textname));
- lookup->rdtype = rdtype;
- lookup->rdtypeset = ISC_TRUE;
- }
- lookup->rdclass = rdclass;
- lookup->rdclassset = ISC_TRUE;
- lookup->trace = ISC_FALSE;
- lookup->trace_root = lookup->trace;
- lookup->ns_search_only = ISC_FALSE;
- lookup->identify = identify;
- lookup->recurse = recurse;
- lookup->aaonly = aaonly;
- lookup->retries = tries;
- lookup->udpsize = 0;
- lookup->comments = comments;
- lookup->tcp_mode = tcpmode;
- lookup->stats = stats;
- lookup->section_question = section_question;
- lookup->section_answer = section_answer;
- lookup->section_authority = section_authority;
- lookup->section_additional = section_additional;
- lookup->new_search = ISC_TRUE;
- if (nofail)
- lookup->servfail_stops = ISC_FALSE;
- ISC_LIST_INIT(lookup->q);
- ISC_LINK_INIT(lookup, link);
- ISC_LIST_APPEND(lookup_list, lookup, link);
- lookup->origin = NULL;
- ISC_LIST_INIT(lookup->my_server_list);
- debug("looking up %s", lookup->textname);
-}
-
-static void
-get_next_command(void) {
- char *buf;
- char *ptr, *arg;
- char *input;
-
- fflush(stdout);
- buf = isc_mem_allocate(mctx, COMMSIZE);
- if (buf == NULL)
- fatal("memory allocation failure");
- fputs("> ", stderr);
- fflush(stderr);
- isc_app_block();
- ptr = fgets(buf, COMMSIZE, stdin);
- isc_app_unblock();
- if (ptr == NULL) {
- in_use = ISC_FALSE;
- goto cleanup;
- }
- input = buf;
- ptr = next_token(&input, " \t\r\n");
- if (ptr == NULL)
- goto cleanup;
- arg = next_token(&input, " \t\r\n");
- if ((strcasecmp(ptr, "set") == 0) &&
- (arg != NULL))
- setoption(arg);
- else if ((strcasecmp(ptr, "server") == 0) ||
- (strcasecmp(ptr, "lserver") == 0)) {
- isc_app_block();
- set_nameserver(arg);
- check_ra = ISC_FALSE;
- isc_app_unblock();
- show_settings(ISC_TRUE, ISC_TRUE);
- } else if (strcasecmp(ptr, "exit") == 0) {
- in_use = ISC_FALSE;
- goto cleanup;
- } else if (strcasecmp(ptr, "help") == 0 ||
- strcasecmp(ptr, "?") == 0) {
- printf("The '%s' command is not yet implemented.\n", ptr);
- goto cleanup;
- } else if (strcasecmp(ptr, "finger") == 0 ||
- strcasecmp(ptr, "root") == 0 ||
- strcasecmp(ptr, "ls") == 0 ||
- strcasecmp(ptr, "view") == 0) {
- printf("The '%s' command is not implemented.\n", ptr);
- goto cleanup;
- } else
- addlookup(ptr);
- cleanup:
- isc_mem_free(mctx, buf);
-}
-
-static void
-parse_args(int argc, char **argv) {
- isc_boolean_t have_lookup = ISC_FALSE;
-
- usesearch = ISC_TRUE;
- for (argc--, argv++; argc > 0; argc--, argv++) {
- debug("main parsing %s", argv[0]);
- if (argv[0][0] == '-') {
- if (argv[0][1] != 0)
- setoption(&argv[0][1]);
- else
- have_lookup = ISC_TRUE;
- } else {
- if (!have_lookup) {
- have_lookup = ISC_TRUE;
- in_use = ISC_TRUE;
- addlookup(argv[0]);
- } else {
- set_nameserver(argv[0]);
- check_ra = ISC_FALSE;
- }
- }
- }
-}
-
-static void
-flush_lookup_list(void) {
- dig_lookup_t *l, *lp;
- dig_query_t *q, *qp;
- dig_server_t *s, *sp;
-
- lookup_counter = 0;
- l = ISC_LIST_HEAD(lookup_list);
- while (l != NULL) {
- q = ISC_LIST_HEAD(l->q);
- while (q != NULL) {
- if (q->sock != NULL) {
- isc_socket_cancel(q->sock, NULL,
- ISC_SOCKCANCEL_ALL);
- isc_socket_detach(&q->sock);
- }
- if (ISC_LINK_LINKED(&q->recvbuf, link))
- ISC_LIST_DEQUEUE(q->recvlist, &q->recvbuf,
- link);
- if (ISC_LINK_LINKED(&q->lengthbuf, link))
- ISC_LIST_DEQUEUE(q->lengthlist, &q->lengthbuf,
- link);
- isc_buffer_invalidate(&q->recvbuf);
- isc_buffer_invalidate(&q->lengthbuf);
- qp = q;
- q = ISC_LIST_NEXT(q, link);
- ISC_LIST_DEQUEUE(l->q, qp, link);
- isc_mem_free(mctx, qp);
- }
- s = ISC_LIST_HEAD(l->my_server_list);
- while (s != NULL) {
- sp = s;
- s = ISC_LIST_NEXT(s, link);
- ISC_LIST_DEQUEUE(l->my_server_list, sp, link);
- isc_mem_free(mctx, sp);
-
- }
- if (l->sendmsg != NULL)
- dns_message_destroy(&l->sendmsg);
- if (l->timer != NULL)
- isc_timer_detach(&l->timer);
- lp = l;
- l = ISC_LIST_NEXT(l, link);
- ISC_LIST_DEQUEUE(lookup_list, lp, link);
- isc_mem_free(mctx, lp);
- }
-}
-
-static void
-getinput(isc_task_t *task, isc_event_t *event) {
- UNUSED(task);
- if (global_event == NULL)
- global_event = event;
- while (in_use) {
- get_next_command();
- if (ISC_LIST_HEAD(lookup_list) != NULL) {
- start_lookup();
- return;
- }
- }
- isc_app_shutdown();
-}
-
-int
-main(int argc, char **argv) {
- isc_result_t result;
-
- ISC_LIST_INIT(lookup_list);
- ISC_LIST_INIT(server_list);
- ISC_LIST_INIT(search_list);
-
- check_ra = ISC_TRUE;
-
- result = isc_app_start();
- check_result(result, "isc_app_start");
-
- setup_libs();
- progname = argv[0];
-
- parse_args(argc, argv);
-
- setup_system();
- if (domainopt[0] != '\0')
- set_search_domain(domainopt);
- if (in_use)
- result = isc_app_onrun(mctx, global_task, onrun_callback,
- NULL);
- else
- result = isc_app_onrun(mctx, global_task, getinput, NULL);
- check_result(result, "isc_app_onrun");
- in_use = ISC_TF(!in_use);
-
- (void)isc_app_run();
-
- puts("");
- debug("done, and starting to shut down");
- if (global_event != NULL)
- isc_event_free(&global_event);
- cancel_all();
- destroy_libs();
- isc_app_finish();
-
- return (0);
-}
OpenPOWER on IntegriCloud