⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 res_debug.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1985 *    The Regents of the University of California.  All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: * 	This product includes software developed by the University of * 	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. *  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. *//* * Portions Copyright (c) 1993 by Digital Equipment Corporation. *  * 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, and that * the name of Digital Equipment Corporation not be used in advertising or * publicity pertaining to distribution of the document or software without * specific, written prior permission. *  * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT * CORPORATION 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. *//* * Portions Copyright (c) 1995 by International Business Machines, Inc. * * International Business Machines, Inc. (hereinafter called IBM) grants * permission under its copyrights to use, copy, modify, and distribute this * Software with or without fee, provided that the above copyright notice and * all paragraphs of this notice appear in all copies, and that the name of IBM * not be used in connection with the marketing of any product incorporating * the Software or modifications thereof, without specific, written prior * permission. * * To the extent it has a right to do so, IBM grants an immunity from suit * under its patents, if any, for the use, sale or manufacture of products to * the extent that such products are used for performing Domain Name System * dynamic updates in TCP/IP networks by means of the Software.  No immunity is * granted for any product per se or for any other function of any product. * * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE.  IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. *//* * Portions Copyright (c) 1996 by 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. */#if defined(LIBC_SCCS) && !defined(lint)static char sccsid[] = "@(#)res_debug.c	8.1 (Berkeley) 6/4/93";static char rcsid[] = "$Id: res_debug.c,v 1.2 1998/08/20 21:47:36 joel Exp $";#endif /* LIBC_SCCS and not lint */#include <sys/types.h>#include <sys/param.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <arpa/nameser.h>#include <ctype.h>#include <errno.h>#include <math.h>#include <netdb.h>#include <resolv.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#define SPRINTF(x) sprintf xextern const char *_res_opcodes[];extern const char *_res_resultcodes[];extern const char *_res_sectioncodes[];/* * Print the current options. */voidfp_resstat(struct __res_state *statp, FILE *file) {	u_long mask;	fprintf(file, ";; res options:");	if (!statp)		statp = &_res;	for (mask = 1;  mask != 0;  mask <<= 1)		if (statp->options & mask)			fprintf(file, " %s", p_option(mask));	putc('\n', file);}static voiddo_section(ns_msg *handle, ns_sect section, int pflag, FILE *file) {	int n, sflag, rrnum;	char buf[2048];	/* XXX need to malloc */	ns_opcode opcode;	ns_rr rr;	/*	 * Print answer records.	 */	sflag = (_res.pfcode & pflag);	if (_res.pfcode && !sflag)		return;	opcode = ns_msg_getflag(*handle, ns_f_opcode);	rrnum = 0;	for (;;) {		if (ns_parserr(handle, section, rrnum, &rr)) {			if (errno != ENODEV)				fprintf(file, ";; ns_parserr: %s\n",					strerror(errno));			else if (rrnum > 0 && sflag != 0 &&				 (_res.pfcode & RES_PRF_HEAD1))				putc('\n', file);			return;		}		if (rrnum == 0 && sflag != 0 && (_res.pfcode & RES_PRF_HEAD1))			fprintf(file, ";; %s SECTION:\n",				p_section(section, opcode));		if (section == ns_s_qd)			fprintf(file, ";;\t%s, type = %s, class = %s\n",				ns_rr_name(rr),				p_type(ns_rr_type(rr)),				p_class(ns_rr_class(rr)));		else {			n = ns_sprintrr(handle, &rr, NULL, NULL,					buf, sizeof buf);			if (n < 0) {				fprintf(file, ";; ns_sprintrr: %s\n",					strerror(errno));				return;			}			fputs(buf, file);			fputc('\n', file);		}		rrnum++;	}}voidp_query(const u_char *msg) {	fp_query(msg, stdout);}voidfp_query(const u_char *msg, FILE *file) {	fp_nquery(msg, PACKETSZ, file);}/* * Print the contents of a query. * This is intended to be primarily a debugging routine. */voidfp_nquery(const u_char *msg, int len, FILE *file) {	ns_msg handle;	int qdcount, ancount, nscount, arcount;	u_int opcode, rcode, id;	if ((_res.options & RES_INIT) == 0 && res_init() == -1)		return;	if (ns_initparse(msg, len, &handle) < 0) {		fprintf(file, ";; ns_initparse: %s\n", strerror(errno));		return;	}	opcode = ns_msg_getflag(handle, ns_f_opcode);	rcode = ns_msg_getflag(handle, ns_f_rcode);	id = ns_msg_id(handle);	qdcount = ns_msg_count(handle, ns_s_qd);	ancount = ns_msg_count(handle, ns_s_an);	nscount = ns_msg_count(handle, ns_s_ns);	arcount = ns_msg_count(handle, ns_s_ar);	/*	 * Print header fields.	 */	if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX) || rcode)		fprintf(file,			";; ->>HEADER<<- opcode: %s, status: %s, id: %d\n",			_res_opcodes[opcode], _res_resultcodes[rcode], id);	if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX))		putc(';', file);	if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD2)) {		fprintf(file, "; flags:");		if (ns_msg_getflag(handle, ns_f_qr))			fprintf(file, " qr");		if (ns_msg_getflag(handle, ns_f_aa))			fprintf(file, " aa");		if (ns_msg_getflag(handle, ns_f_tc))			fprintf(file, " tc");		if (ns_msg_getflag(handle, ns_f_rd))			fprintf(file, " rd");		if (ns_msg_getflag(handle, ns_f_ra))			fprintf(file, " ra");		if (ns_msg_getflag(handle, ns_f_z))			fprintf(file, " ??");		if (ns_msg_getflag(handle, ns_f_ad))			fprintf(file, " ad");		if (ns_msg_getflag(handle, ns_f_cd))			fprintf(file, " cd");	}	if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD1)) {		fprintf(file, "; %s: %d",			p_section(ns_s_qd, opcode), qdcount);		fprintf(file, ", %s: %d",			p_section(ns_s_an, opcode), ancount);		fprintf(file, ", %s: %d",			p_section(ns_s_ns, opcode), nscount);		fprintf(file, ", %s: %d",			p_section(ns_s_ar, opcode), arcount);	}	if ((!_res.pfcode) || (_res.pfcode & 		(RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1))) {		putc('\n',file);	}	/*	 * Print the various sections.	 */	do_section(&handle, ns_s_qd, RES_PRF_QUES, file);	do_section(&handle, ns_s_an, RES_PRF_ANS, file);	do_section(&handle, ns_s_ns, RES_PRF_AUTH, file);	do_section(&handle, ns_s_ar, RES_PRF_ADD, file);	if (qdcount == 0 && ancount == 0 &&	    nscount == 0 && arcount == 0)		putc('\n', file);}const u_char *p_cdnname(const u_char *cp, const u_char *msg, int len, FILE *file) {	char name[MAXDNAME];	int n;	if ((n = dn_expand(msg, msg + len, cp, name, sizeof name)) < 0)		return (NULL);	if (name[0] == '\0')		putc('.', file);	else		fputs(name, file);	return (cp + n);}const u_char *p_cdname(const u_char *cp, const u_char *msg, FILE *file) {	return (p_cdnname(cp, msg, PACKETSZ, file));}/* Return a fully-qualified domain name from a compressed name (with   length supplied).  */const u_char *p_fqnname(cp, msg, msglen, name, namelen)	const u_char *cp, *msg;	int msglen;	char *name;	int namelen;{	int n, newlen;	if ((n = dn_expand(msg, cp + msglen, cp, name, namelen)) < 0)		return (NULL);	newlen = strlen(name);	if (newlen == 0 || name[newlen - 1] != '.') {		if (newlen + 1 >= namelen)	/* Lack space for final dot */			return (NULL);		else			strcpy(name + newlen, ".");	}	return (cp + n);}/* XXX:	the rest of these functions need to become length-limited, too. */const u_char *p_fqname(const u_char *cp, const u_char *msg, FILE *file) {	char name[MAXDNAME];	const u_char *n;	n = p_fqnname(cp, msg, MAXCDNAME, name, sizeof name);	if (n == NULL)		return (NULL);	fputs(name, file);	return (n);}/* * Names of RR classes and qclasses.  Classes and qclasses are the same, except * that C_ANY is a qclass but not a class.  (You can ask for records of class * C_ANY, but you can't have any records of that class in the database.) */const struct res_sym __p_class_syms[] = {	{C_IN,		"IN"},	{C_CHAOS,	"CHAOS"},	{C_HS,		"HS"},	{C_HS,		"HESIOD"},	{C_ANY,		"ANY"},	{C_NONE,	"NONE"},	{C_IN, 		(char *)0}};/* * Names of message sections. */const struct res_sym __p_default_section_syms[] = {	{ns_s_qd,	"QUERY"},	{ns_s_an,	"ANSWER"},	{ns_s_ns,	"AUTHORITY"},	{ns_s_ar,	"ADDITIONAL"},	{0,             (char *)0}};const struct res_sym __p_update_section_syms[] = {	{S_ZONE,	"ZONE"},	{S_PREREQ,	"PREREQUISITE"},	{S_UPDATE,	"UPDATE"},	{S_ADDT,	"ADDITIONAL"},	{0,             (char *)0}};/* * Names of RR types and qtypes.  Types and qtypes are the same, except * that T_ANY is a qtype but not a type.  (You can ask for records of type * T_ANY, but you can't have any records of that type in the database.) */const struct res_sym __p_type_syms[] = {	{T_A,		"A",		"address"},	{T_NS,		"NS",		"name server"},	{T_MD,		"MD",		"mail destination (deprecated)"},	{T_MF,		"MF",		"mail forwarder (deprecated)"},	{T_CNAME,	"CNAME",	"canonical name"},	{T_SOA,		"SOA",		"start of authority"},	{T_MB,		"MB",		"mailbox"},	{T_MG,		"MG",		"mail group member"},	{T_MR,		"MR",		"mail rename"},	{T_NULL,	"NULL",		"null"},	{T_WKS,		"WKS",		"well-known service (deprecated)"},	{T_PTR,		"PTR",		"domain name pointer"},	{T_HINFO,	"HINFO",	"host information"},	{T_MINFO,	"MINFO",	"mailbox information"},	{T_MX,		"MX",		"mail exchanger"},	{T_TXT,		"TXT",		"text"},	{T_RP,		"RP",		"responsible person"},	{T_AFSDB,	"AFSDB",	"DCE or AFS server"},	{T_X25,		"X25",		"X25 address"},	{T_ISDN,	"ISDN",		"ISDN address"},	{T_RT,		"RT",		"router"},	{T_NSAP,	"NSAP",		"nsap address"},	{T_NSAP_PTR,	"NSAP_PTR",	"domain name pointer"},	{T_SIG,		"SIG",		"signature"},	{T_KEY,		"KEY",		"key"},	{T_PX,		"PX",		"mapping information"},	{T_GPOS,	"GPOS",		"geographical position (withdrawn)"},	{T_AAAA,	"AAAA",		"IPv6 address"},	{T_LOC,		"LOC",		"location"},	{T_NXT,		"NXT",		"next valid name (unimplemented)"},	{T_EID,		"EID",		"endpoint identifier (unimplemented)"},	{T_NIMLOC,	"NIMLOC",	"NIMROD locator (unimplemented)"},	{T_SRV,		"SRV",		"server selection"},	{T_ATMA,	"ATMA",		"ATM address (unimplemented)"},	{T_IXFR,	"IXFR",		"incremental zone transfer"},	{T_AXFR,	"AXFR",		"zone transfer"},	{T_MAILB,	"MAILB",	"mailbox-related data (deprecated)"},	{T_MAILA,	"MAILA",	"mail agent (deprecated)"},	{T_NAPTR,	"NAPTR",	"URN Naming Authority"},	{T_ANY,		"ANY",		"\"any\""},	{0, 		NULL,		NULL}};intsym_ston(const struct res_sym *syms, const char *name, int *success) {	for ((void)NULL; syms->name != 0; syms++) {		if (strcasecmp (name, syms->name) == 0) {			if (success)				*success = 1;			return (syms->number);		}	}	if (success)		*success = 0;	return (syms->number);		/* The default value. */}const char *sym_ntos(const struct res_sym *syms, int number, int *success) {	static char unname[20];	for ((void)NULL; syms->name != 0; syms++) {		if (number == syms->number) {			if (success)				*success = 1;			return (syms->name);		}	}	sprintf(unname, "%d", number);	if (success)		*success = 0;	return (unname);}const char *sym_ntop(const struct res_sym *syms, int number, int *success) {	static char unname[20];	for ((void)NULL; syms->name != 0; syms++) {		if (number == syms->number) {			if (success)				*success = 1;			return (syms->humanname);		}	}	sprintf(unname, "%d", number);	if (success)		*success = 0;	return (unname);}/* * Return a string for the type. */const char *p_type(int type) {	return (sym_ntos(__p_type_syms, type, (int *)0));}/* * Return a string for the type. */const char *p_section(int section, int opcode) {	const struct res_sym *symbols;	switch (opcode) {	case ns_o_update:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -