📄 host.c
字号:
/* * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and 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 INTERNET SOFTWARE CONSORTIUM * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * INTERNET SOFTWARE CONSORTIUM 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: host.c,v 1.76.2.5 2003/07/25 04:36:44 marka Exp $ */#include <config.h>#include <stdlib.h>#include <limits.h>#include <isc/app.h>#include <isc/commandline.h>#include <isc/netaddr.h>#include <isc/string.h>#include <isc/util.h>#include <isc/task.h>#include <dns/byaddr.h>#include <dns/fixedname.h>#include <dns/message.h>#include <dns/name.h>#include <dns/rdata.h>#include <dns/rdataclass.h>#include <dns/rdataset.h>#include <dns/rdatatype.h>#include <dig/dig.h>extern ISC_LIST(dig_lookup_t) lookup_list;extern ISC_LIST(dig_server_t) server_list;extern ISC_LIST(dig_searchlist_t) search_list;extern isc_boolean_t usesearch;extern isc_boolean_t debugging;extern unsigned int timeout;extern isc_mem_t *mctx;extern int ndots;extern int tries;extern char *progname;extern isc_task_t *global_task;extern int fatalexit;static isc_boolean_t short_form = ISC_TRUE, listed_server = ISC_FALSE;static isc_boolean_t list_addresses = ISC_TRUE;static dns_rdatatype_t list_type = dns_rdatatype_a;static const char *opcodetext[] = { "QUERY", "IQUERY", "STATUS", "RESERVED3", "NOTIFY", "UPDATE", "RESERVED6", "RESERVED7", "RESERVED8", "RESERVED9", "RESERVED10", "RESERVED11", "RESERVED12", "RESERVED13", "RESERVED14", "RESERVED15"};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[] = { "zero", /* 0 */ "has address", /* 1 */ "name server", /* 2 */ "MD", /* 3 */ "MF", /* 4 */ "is an alias for", /* 5 */ "SOA", /* 6 */ "MB", /* 7 */ "MG", /* 8 */ "MR", /* 9 */ "NULL", /* 10 */ "has well known services", /* 11 */ "domain name pointer", /* 12 */ "host information", /* 13 */ "MINFO", /* 14 */ "mail is handled by", /* 15 */ "text", /* 16 */ "RP", /* 17 */ "AFSDB", /* 18 */ "x25 address", /* 19 */ "isdn address", /* 20 */ "RT", /* 21 */ "NSAP", /* 22 */ "NSAP_PTR", /* 23 */ "has signature", /* 24 */ "has key", /* 25 */ "PX", /* 26 */ "GPOS", /* 27 */ "has AAAA address", /* 28 */ "LOC", /* 29 */ "has next record", /* 30 */ "EID", /* 31 */ "NIMLOC", /* 32 */ "SRV", /* 33 */ "ATMA", /* 34 */ "NAPTR", /* 35 */ "KX", /* 36 */ "CERT", /* 37 */ "has v6 address", /* 38 */ "DNAME", /* 39 */ "has optional information", /* 41 */ "has 42 record", /* 42 */ "has 43 record", /* 43 */ "has 44 record", /* 44 */ "has 45 record", /* 45 */ "has 46 record", /* 46 */ "has 47 record", /* 47 */ "has 48 record", /* 48 */ "has 49 record", /* 49 */ "has 50 record", /* 50 */ "has 51 record", /* 51 */ "has 52 record", /* 52 */ "has 53 record", /* 53 */ "has 54 record", /* 54 */ "has 55 record", /* 55 */ "has 56 record", /* 56 */ "has 57 record", /* 57 */ "has 58 record", /* 58 */ "has 59 record", /* 59 */ "has 60 record", /* 60 */ "has 61 record", /* 61 */ "has 62 record", /* 62 */ "has 63 record", /* 63 */ "has 64 record", /* 64 */ "has 65 record", /* 65 */ "has 66 record", /* 66 */ "has 67 record", /* 67 */ "has 68 record", /* 68 */ "has 69 record", /* 69 */ "has 70 record", /* 70 */ "has 71 record", /* 71 */ "has 72 record", /* 72 */ "has 73 record", /* 73 */ "has 74 record", /* 74 */ "has 75 record", /* 75 */ "has 76 record", /* 76 */ "has 77 record", /* 77 */ "has 78 record", /* 78 */ "has 79 record", /* 79 */ "has 80 record", /* 80 */ "has 81 record", /* 81 */ "has 82 record", /* 82 */ "has 83 record", /* 83 */ "has 84 record", /* 84 */ "has 85 record", /* 85 */ "has 86 record", /* 86 */ "has 87 record", /* 87 */ "has 88 record", /* 88 */ "has 89 record", /* 89 */ "has 90 record", /* 90 */ "has 91 record", /* 91 */ "has 92 record", /* 92 */ "has 93 record", /* 93 */ "has 94 record", /* 94 */ "has 95 record", /* 95 */ "has 96 record", /* 96 */ "has 97 record", /* 97 */ "has 98 record", /* 98 */ "has 99 record", /* 99 */ "UINFO", /* 100 */ "UID", /* 101 */ "GID", /* 102 */ "UNSPEC"}; /* 103 */static voidshow_usage(void) { fputs("Usage: host [-aCdlrTwv] [-c class] [-n] [-N ndots] [-t type] [-W time]\n"" [-R number] hostname [server]\n"" -a is equivalent to -v -t *\n"" -c specifies query class for non-IN data\n"" -C compares SOA records on authoritative nameservers\n"" -d is equivalent to -v\n"" -l lists all hosts in a domain, using AXFR\n"" -i Use the old IN6.INT form of IPv6 reverse lookup\n"" -N changes the number of dots allowed before root lookup is done\n"" -r disables recursive processing\n"" -R specifies number of retries for UDP packets\n"" -t specifies the query type\n"" -T enables TCP/IP mode\n"" -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(1);}voiddighost_shutdown(void) { isc_app_shutdown();}voidreceived(int bytes, isc_sockaddr_t *from, dig_query_t *query){ isc_time_t now; isc_result_t result; int diff; if (!short_form) { char fromtext[ISC_SOCKADDR_FORMATSIZE]; isc_sockaddr_format(from, fromtext, sizeof(fromtext)); result = isc_time_now(&now); check_result(result, "isc_time_now"); diff = (int) isc_time_microdiff(&now, &query->time_sent); printf("Received %u bytes from %s in %d ms\n", bytes, fromtext, diff/1000); }}voidtrying(char *frm, dig_lookup_t *lookup) { UNUSED(lookup); if (!short_form) printf("Trying \"%s\"\n", frm);}static voidsay_message(dns_name_t *name, const char *msg, dns_rdata_t *rdata, dig_query_t *query){ isc_buffer_t *b = NULL; char namestr[DNS_NAME_FORMATSIZE]; isc_region_t r; isc_result_t result; unsigned int bufsize = BUFSIZ; dns_name_format(name, namestr, sizeof(namestr)); retry: result = isc_buffer_allocate(mctx, &b, bufsize); check_result(result, "isc_buffer_allocate"); result = dns_rdata_totext(rdata, NULL, b); if (result == ISC_R_NOSPACE) { isc_buffer_free(&b); bufsize *= 2; goto retry; } check_result(result, "dns_rdata_totext"); isc_buffer_usedregion(b, &r); if (query->lookup->identify_previous_line) { printf("Nameserver %s:\n\t", query->servname); } printf("%s %s %.*s", namestr, msg, (int)r.length, (char *)r.base); if (query->lookup->identify) { printf(" on server %s", query->servname); } printf("\n"); isc_buffer_free(&b);}static isc_result_tprintsection(dns_message_t *msg, dns_section_t sectionid, const char *section_name, isc_boolean_t headers, dig_query_t *query){ dns_name_t *name, *print_name; dns_rdataset_t *rdataset; dns_rdata_t rdata = DNS_RDATA_INIT; isc_buffer_t target; isc_result_t result, loopresult; isc_region_t r; dns_name_t empty_name; char t[4096]; isc_boolean_t first; isc_boolean_t no_rdata; const char *rtt; if (sectionid == DNS_SECTION_QUESTION) no_rdata = ISC_TRUE; else no_rdata = ISC_FALSE; if (headers) printf(";; %s SECTION:\n", section_name); dns_name_init(&empty_name, NULL); result = dns_message_firstname(msg, sectionid); if (result == ISC_R_NOMORE) return (ISC_R_SUCCESS); else if (result != ISC_R_SUCCESS) return (result); for (;;) { name = NULL; dns_message_currentname(msg, sectionid, &name); isc_buffer_init(&target, t, sizeof(t)); first = ISC_TRUE; print_name = name; for (rdataset = ISC_LIST_HEAD(name->list); rdataset != NULL; rdataset = ISC_LIST_NEXT(rdataset, link)) { if (query->lookup->rdtype == dns_rdatatype_axfr && !((!list_addresses && (list_type == dns_rdatatype_any || rdataset->type == list_type)) || (list_addresses && (rdataset->type == dns_rdatatype_a || rdataset->type == dns_rdatatype_aaaa || rdataset->type == dns_rdatatype_ns || rdataset->type == dns_rdatatype_ptr)))) continue; if (!short_form) { result = dns_rdataset_totext(rdataset, print_name, ISC_FALSE, no_rdata, &target); if (result != ISC_R_SUCCESS) return (result);#ifdef USEINITALWS if (first) { print_name = &empty_name; first = ISC_FALSE; }#else UNUSED(first); /* Shut up compiler. */#endif } else { loopresult = dns_rdataset_first(rdataset);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -