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

📄 masterdump.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-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 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: masterdump.c,v 1.56.2.5.2.12 2004/08/28 06:25:19 marka Exp $ */#include <config.h>#include <stdlib.h>#include <isc/event.h>#include <isc/file.h>#include <isc/magic.h>#include <isc/mem.h>#include <isc/print.h>#include <isc/stdio.h>#include <isc/string.h>#include <isc/task.h>#include <isc/util.h>#include <dns/db.h>#include <dns/dbiterator.h>#include <dns/events.h>#include <dns/fixedname.h>#include <dns/log.h>#include <dns/masterdump.h>#include <dns/rdata.h>#include <dns/rdataclass.h>#include <dns/rdataset.h>#include <dns/rdatasetiter.h>#include <dns/rdatatype.h>#include <dns/result.h>#include <dns/time.h>#include <dns/ttl.h>#define DNS_DCTX_MAGIC		ISC_MAGIC('D', 'c', 't', 'x')#define DNS_DCTX_VALID(d)	ISC_MAGIC_VALID(d, DNS_DCTX_MAGIC)#define RETERR(x) do { \	isc_result_t _r = (x); \	if (_r != ISC_R_SUCCESS) \		return (_r); \	} while (0)struct dns_master_style {	unsigned int flags;		/* DNS_STYLEFLAG_* */	unsigned int ttl_column;	unsigned int class_column;	unsigned int type_column;	unsigned int rdata_column;	unsigned int line_length;	unsigned int tab_width;};/* * The maximum length of the newline+indentation that is output * when inserting a line break in an RR.  This effectively puts an * upper limits on the value of "rdata_column", because if it is * very large, the tabs and spaces needed to reach it will not fit. */#define DNS_TOTEXT_LINEBREAK_MAXLEN 100/* * Context structure for a masterfile dump in progress. */typedef struct dns_totext_ctx {	dns_master_style_t	style;	isc_boolean_t 		class_printed;	char *			linebreak;	char 			linebreak_buf[DNS_TOTEXT_LINEBREAK_MAXLEN];	dns_name_t *		origin;	dns_name_t *		neworigin;	dns_fixedname_t		origin_fixname;	isc_uint32_t 		current_ttl;	isc_boolean_t 		current_ttl_valid;} dns_totext_ctx_t;LIBDNS_EXTERNAL_DATA const dns_master_style_tdns_master_style_default = {	DNS_STYLEFLAG_OMIT_OWNER |	DNS_STYLEFLAG_OMIT_CLASS |	DNS_STYLEFLAG_REL_OWNER |	DNS_STYLEFLAG_REL_DATA |	DNS_STYLEFLAG_OMIT_TTL |	DNS_STYLEFLAG_TTL |	DNS_STYLEFLAG_COMMENT |	DNS_STYLEFLAG_MULTILINE,	24, 24, 24, 32, 80, 8};LIBDNS_EXTERNAL_DATA const dns_master_style_tdns_master_style_full = {	DNS_STYLEFLAG_COMMENT,	46, 46, 46, 64, 120, 8};LIBDNS_EXTERNAL_DATA const dns_master_style_tdns_master_style_explicitttl = {	DNS_STYLEFLAG_OMIT_OWNER |	DNS_STYLEFLAG_OMIT_CLASS |	DNS_STYLEFLAG_REL_OWNER |	DNS_STYLEFLAG_REL_DATA |	DNS_STYLEFLAG_COMMENT |	DNS_STYLEFLAG_MULTILINE,	24, 32, 32, 40, 80, 8};LIBDNS_EXTERNAL_DATA const dns_master_style_tdns_master_style_cache = {	DNS_STYLEFLAG_OMIT_OWNER |	DNS_STYLEFLAG_OMIT_CLASS |	DNS_STYLEFLAG_MULTILINE |	DNS_STYLEFLAG_TRUST |	DNS_STYLEFLAG_NCACHE,	24, 32, 32, 40, 80, 8};LIBDNS_EXTERNAL_DATA const dns_master_style_tdns_master_style_simple = {	0,	24, 32, 32, 40, 80, 8};/* * A style suitable for dns_rdataset_totext(). */LIBDNS_EXTERNAL_DATA const dns_master_style_tdns_master_style_debug = {	DNS_STYLEFLAG_REL_OWNER,	24, 32, 40, 48, 80, 8};#define N_SPACES 10static char spaces[N_SPACES+1] = "          ";#define N_TABS 10static char tabs[N_TABS+1] = "\t\t\t\t\t\t\t\t\t\t";struct dns_dumpctx {	unsigned int		magic;	isc_mem_t		*mctx;	isc_mutex_t		lock;	unsigned int		references;	isc_boolean_t		canceled;	isc_boolean_t		first;	isc_boolean_t		do_date;	isc_stdtime_t		now;	FILE			*f;	dns_db_t		*db;	dns_dbversion_t		*version;	dns_dbiterator_t	*dbiter;	dns_totext_ctx_t	tctx;	isc_task_t		*task;	dns_dumpdonefunc_t	done;	void			*done_arg;	unsigned int		nodes;	/* dns_master_dumpinc() */	char			*file;	char 			*tmpfile;};#define NXDOMAIN(x) (((x)->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0) /* * Output tabs and spaces to go from column '*current' to * column 'to', and update '*current' to reflect the new * current column. */static isc_result_tindent(unsigned int *current, unsigned int to, int tabwidth,       isc_buffer_t *target){	isc_region_t r;	unsigned char *p;	unsigned int from;	int ntabs, nspaces, t;	from = *current;	if (to < from + 1)		to = from + 1;	ntabs = to / tabwidth - from / tabwidth;	if (ntabs < 0)		ntabs = 0;	if (ntabs > 0) {		isc_buffer_availableregion(target, &r);		if (r.length < (unsigned) ntabs)			return (ISC_R_NOSPACE);		p = r.base;		t = ntabs;		while (t) {			int n = t;			if (n > N_TABS)				n = N_TABS;			memcpy(p, tabs, n);			p += n;			t -= n;		}		isc_buffer_add(target, ntabs);		from = (to / tabwidth) * tabwidth;	}	nspaces = to - from;	INSIST(nspaces >= 0);	isc_buffer_availableregion(target, &r);	if (r.length < (unsigned) nspaces)		return (ISC_R_NOSPACE);	p = r.base;	t = nspaces;	while (t) {		int n = t;		if (n > N_SPACES)			n = N_SPACES;		memcpy(p, spaces, n);		p += n;		t -= n;	}	isc_buffer_add(target, nspaces);	*current = to;	return (ISC_R_SUCCESS);}static isc_result_ttotext_ctx_init(const dns_master_style_t *style, dns_totext_ctx_t *ctx) {	isc_result_t result;	REQUIRE(style->tab_width != 0);	ctx->style = *style;	ctx->class_printed = ISC_FALSE;	dns_fixedname_init(&ctx->origin_fixname);	/*	 * Set up the line break string if needed.	 */	if ((ctx->style.flags & DNS_STYLEFLAG_MULTILINE) != 0) {		isc_buffer_t buf;		isc_region_t r;		unsigned int col = 0;		isc_buffer_init(&buf, ctx->linebreak_buf,				sizeof(ctx->linebreak_buf));		isc_buffer_availableregion(&buf, &r);		if (r.length < 1)			return (DNS_R_TEXTTOOLONG);		r.base[0] = '\n';		isc_buffer_add(&buf, 1);		result = indent(&col, ctx->style.rdata_column,				ctx->style.tab_width, &buf);		/*		 * Do not return ISC_R_NOSPACE if the line break string		 * buffer is too small, because that would just make		 * dump_rdataset() retry indenfinitely with ever		 * bigger target buffers.  That's a different buffer,		 * so it won't help.  Use DNS_R_TEXTTOOLONG as a substitute.		 */		if (result == ISC_R_NOSPACE)			return (DNS_R_TEXTTOOLONG);		if (result != ISC_R_SUCCESS)			return (result);		isc_buffer_availableregion(&buf, &r);		if (r.length < 1)			return (DNS_R_TEXTTOOLONG);		r.base[0] = '\0';		isc_buffer_add(&buf, 1);		ctx->linebreak = ctx->linebreak_buf;	} else {		ctx->linebreak = NULL;	}	ctx->origin = NULL;	ctx->neworigin = NULL;	ctx->current_ttl = 0;	ctx->current_ttl_valid = ISC_FALSE;	return (ISC_R_SUCCESS);}#define INDENT_TO(col) \	do { \		 if ((result = indent(&column, ctx->style.col, \				      ctx->style.tab_width, target)) \		     != ISC_R_SUCCESS) \			    return (result); \	} while (0)static isc_result_tstr_totext(const char *source, isc_buffer_t *target) {	unsigned int l;	isc_region_t region;	isc_buffer_availableregion(target, &region);	l = strlen(source);	if (l > region.length)		return (ISC_R_NOSPACE);	memcpy(region.base, source, l);	isc_buffer_add(target, l);	return (ISC_R_SUCCESS);}/* * Convert 'rdataset' to master file text format according to 'ctx', * storing the result in 'target'.  If 'owner_name' is NULL, it * is omitted; otherwise 'owner_name' must be valid and have at least * one label. */static isc_result_trdataset_totext(dns_rdataset_t *rdataset,		dns_name_t *owner_name,		dns_totext_ctx_t *ctx,		isc_boolean_t omit_final_dot,		isc_buffer_t *target){	isc_result_t result;	unsigned int column;	isc_boolean_t first = ISC_TRUE;	isc_uint32_t current_ttl;	isc_boolean_t current_ttl_valid;	dns_rdatatype_t type;	REQUIRE(DNS_RDATASET_VALID(rdataset));	result = dns_rdataset_first(rdataset);	REQUIRE(result == ISC_R_SUCCESS);	current_ttl = ctx->current_ttl;	current_ttl_valid = ctx->current_ttl_valid;	do {		column = 0;		/*		 * Owner name.		 */		if (owner_name != NULL &&		    ! ((ctx->style.flags & DNS_STYLEFLAG_OMIT_OWNER) != 0 &&		       !first))		{			unsigned int name_start = target->used;			RETERR(dns_name_totext(owner_name,					       omit_final_dot,					       target));			column += target->used - name_start;		}		/*		 * TTL.		 */		if ((ctx->style.flags & DNS_STYLEFLAG_NO_TTL) == 0 &&		    !((ctx->style.flags & DNS_STYLEFLAG_OMIT_TTL) != 0 &&		      current_ttl_valid &&		      rdataset->ttl == current_ttl))		{			char ttlbuf[64];			isc_region_t r;			unsigned int length;			INDENT_TO(ttl_column);			length = snprintf(ttlbuf, sizeof(ttlbuf), "%u",					  rdataset->ttl);			INSIST(length <= sizeof(ttlbuf));			isc_buffer_availableregion(target, &r);			if (r.length < length)				return (ISC_R_NOSPACE);			memcpy(r.base, ttlbuf, length);			isc_buffer_add(target, length);			column += length;			/*			 * If the $TTL directive is not in use, the TTL we			 * just printed becomes the default for subsequent RRs.			 */			if ((ctx->style.flags & DNS_STYLEFLAG_TTL) == 0) {				current_ttl = rdataset->ttl;				current_ttl_valid = ISC_TRUE;			}		}		/*		 * Class.		 */		if ((ctx->style.flags & DNS_STYLEFLAG_NO_CLASS) == 0 &&		    ((ctx->style.flags & DNS_STYLEFLAG_OMIT_CLASS) == 0 ||		     ctx->class_printed == ISC_FALSE))		{			unsigned int class_start;			INDENT_TO(class_column);			class_start = target->used;			result = dns_rdataclass_totext(rdataset->rdclass,						       target);			if (result != ISC_R_SUCCESS)				return (result);			column += (target->used - class_start);		}		/*		 * Type.		 */		if (rdataset->type == 0) {			type = rdataset->covers;		} else {			type = rdataset->type;		}		{			unsigned int type_start;			INDENT_TO(type_column);			type_start = target->used;			if (rdataset->type == 0)				RETERR(str_totext("\\-", target));			result = dns_rdatatype_totext(type, target);			if (result != ISC_R_SUCCESS)				return (result);			column += (target->used - type_start);		}		/*		 * Rdata.		 */		INDENT_TO(rdata_column);		if (rdataset->type == 0) {			if (NXDOMAIN(rdataset))				RETERR(str_totext(";-$NXDOMAIN\n", target));			else				RETERR(str_totext(";-$NXRRSET\n", target));		} else {			dns_rdata_t rdata = DNS_RDATA_INIT;			isc_region_t r;			dns_rdataset_current(rdataset, &rdata);			RETERR(dns_rdata_tofmttext(&rdata,						   ctx->origin,						   ctx->style.flags,						   ctx->style.line_length -						       ctx->style.rdata_column,						   ctx->linebreak,						   target));			isc_buffer_availableregion(target, &r);			if (r.length < 1)				return (ISC_R_NOSPACE);			r.base[0] = '\n';			isc_buffer_add(target, 1);		}		first = ISC_FALSE;		result = dns_rdataset_next(rdataset);	} while (result == ISC_R_SUCCESS);	if (result != ISC_R_NOMORE)		return (result);	/*	 * Update the ctx state to reflect what we just printed.	 * This is done last, only when we are sure we will return	 * success, because this function may be called multiple

⌨️ 快捷键说明

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