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

📄 master.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 5 页
字号:
	REQUIRE(callbacks->add != NULL);	REQUIRE(callbacks->error != NULL);	REQUIRE(callbacks->warn != NULL);	REQUIRE(mctx != NULL);	REQUIRE(dns_name_isabsolute(top));	REQUIRE(dns_name_isabsolute(origin));	REQUIRE((task == NULL && done == NULL) ||		(task != NULL && done != NULL));	lctx = isc_mem_get(mctx, sizeof(*lctx));	if (lctx == NULL)		return (ISC_R_NOMEMORY);	result = isc_mutex_init(&lctx->lock);	if (result != ISC_R_SUCCESS) {		isc_mem_put(mctx, lctx, sizeof(*lctx));		UNEXPECTED_ERROR(__FILE__, __LINE__,				 "isc_mutex_init() failed: %s",				 isc_result_totext(result));		return (ISC_R_UNEXPECTED);	}	lctx->inc = NULL;	result = incctx_create(mctx, origin, &lctx->inc);	if (result != ISC_R_SUCCESS) 		goto cleanup_ctx;	if (lex != NULL) {		lctx->lex = lex;		lctx->keep_lex = ISC_TRUE;	} else {		lctx->lex = NULL;		result = isc_lex_create(mctx, TOKENSIZ, &lctx->lex);		if (result != ISC_R_SUCCESS)			goto cleanup_inc;		lctx->keep_lex = ISC_FALSE;		memset(specials, 0, sizeof(specials));		specials['('] = 1;		specials[')'] = 1;		specials['"'] = 1;		isc_lex_setspecials(lctx->lex, specials);		isc_lex_setcomments(lctx->lex, ISC_LEXCOMMENT_DNSMASTERFILE);	}	lctx->ttl_known = ISC_FALSE;	lctx->ttl = 0;	lctx->default_ttl_known = ISC_FALSE;	lctx->default_ttl = 0;	lctx->warn_1035 = ISC_TRUE;	/* XXX Argument? */	lctx->warn_tcr = ISC_TRUE;	/* XXX Argument? */	lctx->warn_sigexpired = ISC_TRUE;	/* XXX Argument? */	lctx->options = options;	lctx->seen_include = ISC_FALSE;	lctx->zclass = zclass;	lctx->result = ISC_R_SUCCESS;	dns_fixedname_init(&lctx->fixed_top);	lctx->top = dns_fixedname_name(&lctx->fixed_top);	dns_name_toregion(top, &r);	dns_name_fromregion(lctx->top, &r);	lctx->loop_cnt = (done != NULL) ? 100 : 0;	lctx->callbacks = callbacks;	lctx->task = NULL;	if (task != NULL)		isc_task_attach(task, &lctx->task);	lctx->done = done;	lctx->done_arg = done_arg;	lctx->canceled = ISC_FALSE;	lctx->mctx = NULL;	isc_mem_attach(mctx, &lctx->mctx);	lctx->references = 1;			/* Implicit attach. */	lctx->magic = DNS_LCTX_MAGIC;	*lctxp = lctx;	return (ISC_R_SUCCESS); cleanup_inc:	incctx_destroy(mctx, lctx->inc); cleanup_ctx:	isc_mem_put(mctx, lctx, sizeof(*lctx));	return (result);}static isc_result_tgenname(char *name, int it, char *buffer, size_t length) {	char fmt[sizeof("%04000000000d")];	char numbuf[128];	char *cp;	char mode[2];	int delta = 0;	isc_textregion_t r;	unsigned int n;	unsigned int width;	r.base = buffer;	r.length = length;	while (*name != '\0') {		if (*name == '$') {			name++;			if (*name == '$') {				if (r.length == 0)					return (ISC_R_NOSPACE);				r.base[0] = *name++;				isc_textregion_consume(&r, 1);				continue;			}			strcpy(fmt, "%d");			/* Get format specifier. */			if (*name == '{' ) {				n = sscanf(name, "{%d,%u,%1[doxX]}",					   &delta, &width, mode);				switch (n) {				case 1:					break;				case 2:					n = snprintf(fmt, sizeof(fmt),						     "%%0%ud", width);					break;				case 3:					n = snprintf(fmt, sizeof(fmt),						     "%%0%u%c", width, mode[0]);					break;				default:					return (DNS_R_SYNTAX);				}				if (n >= sizeof(fmt))					return (ISC_R_NOSPACE);				/* Skip past closing brace. */				while (*name != '\0' && *name++ != '}')					continue;			}			n = snprintf(numbuf, sizeof(numbuf), fmt, it + delta);			if (n >= sizeof(numbuf))				return (ISC_R_NOSPACE);			cp = numbuf;			while (*cp != '\0') {				if (r.length == 0)					return (ISC_R_NOSPACE);				r.base[0] = *cp++;				isc_textregion_consume(&r, 1);			}		} else if (*name == '\\') {			if (r.length == 0)				return (ISC_R_NOSPACE);			r.base[0] = *name++;			isc_textregion_consume(&r, 1);			if (*name == '\0')				continue;			if (r.length == 0)				return (ISC_R_NOSPACE);			r.base[0] = *name++;			isc_textregion_consume(&r, 1);		} else {			if (r.length == 0)				return (ISC_R_NOSPACE);			r.base[0] = *name++;			isc_textregion_consume(&r, 1);		}	}	if (r.length == 0)		return (ISC_R_NOSPACE);	r.base[0] = '\0';	return (ISC_R_SUCCESS);}static isc_result_tgenerate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs,	 const char *source, unsigned int line){	char *target_mem = NULL;	char *lhsbuf = NULL;	char *rhsbuf = NULL;	dns_fixedname_t ownerfixed;	dns_name_t *owner;	dns_rdata_t rdata = DNS_RDATA_INIT;	dns_rdatacallbacks_t *callbacks;	dns_rdatalist_t rdatalist;	dns_rdatatype_t type;	rdatalist_head_t head;	int n;	int target_size = MINTSIZ;	/* only one rdata at a time */	isc_buffer_t buffer;	isc_buffer_t target;	isc_result_t result;	isc_textregion_t r;	unsigned int start, stop, step, i;	dns_incctx_t *ictx;	ictx = lctx->inc;	callbacks = lctx->callbacks;	dns_fixedname_init(&ownerfixed);	owner = dns_fixedname_name(&ownerfixed);	ISC_LIST_INIT(head);	target_mem = isc_mem_get(lctx->mctx, target_size);	rhsbuf = isc_mem_get(lctx->mctx, DNS_MASTER_BUFSZ);	lhsbuf = isc_mem_get(lctx->mctx, DNS_MASTER_BUFSZ);	if (target_mem == NULL || rhsbuf == NULL || lhsbuf == NULL) {		result = ISC_R_NOMEMORY;		goto error_cleanup;	}	isc_buffer_init(&target, target_mem, target_size);	n = sscanf(range, "%u-%u/%u", &start, &stop, &step);	if (n < 2 || stop < start) {	       (*callbacks->error)(callbacks,				  "%s: %s:%lu: invalid range '%s'",				  "$GENERATE", source, line, range);		result = DNS_R_SYNTAX;		goto insist_cleanup;	}	if (n == 2)		step = 1;	/*	 * Get type.	 */	r.base = gtype;	r.length = strlen(gtype);	result = dns_rdatatype_fromtext(&type, &r);	if (result != ISC_R_SUCCESS) {		(*callbacks->error)(callbacks,				   "%s: %s:%lu: unknown RR type '%s'",				   "$GENERATE", source, line, gtype);		goto insist_cleanup;	}	switch (type) {	case dns_rdatatype_ns:	case dns_rdatatype_ptr:	case dns_rdatatype_cname:	case dns_rdatatype_dname:		break;	case dns_rdatatype_a:	case dns_rdatatype_aaaa:		if (lctx->zclass == dns_rdataclass_in ||		    lctx->zclass == dns_rdataclass_hs)			break;		/* FALLTHROUGH */	default:	       (*callbacks->error)(callbacks,				  "%s: %s:%lu: unsupported type '%s'",				  "$GENERATE", source, line, gtype);		result = ISC_R_NOTIMPLEMENTED;		goto error_cleanup;	}	ISC_LIST_INIT(rdatalist.rdata);	ISC_LINK_INIT(&rdatalist, link);	for (i = start; i <= stop; i += step) {		result = genname(lhs, i, lhsbuf, DNS_MASTER_BUFSZ);		if (result != ISC_R_SUCCESS)			goto error_cleanup;		result = genname(rhs, i, rhsbuf, DNS_MASTER_BUFSZ);		if (result != ISC_R_SUCCESS)			goto error_cleanup;		isc_buffer_init(&buffer, lhsbuf, strlen(lhsbuf));		isc_buffer_add(&buffer, strlen(lhsbuf));		isc_buffer_setactive(&buffer, strlen(lhsbuf));		result = dns_name_fromtext(owner, &buffer, ictx->origin,					   0, NULL);		if (result != ISC_R_SUCCESS)			goto error_cleanup;		if ((lctx->options & DNS_MASTER_ZONE) != 0 &&		    (lctx->options & DNS_MASTER_SLAVE) == 0 &&		    !dns_name_issubdomain(owner, lctx->top))		{			char namebuf[DNS_NAME_FORMATSIZE];			dns_name_format(owner, namebuf, sizeof(namebuf));			/*			 * Ignore out-of-zone data.			 */			(*callbacks->warn)(callbacks,					   "%s:%lu: "					   "ignoring out-of-zone data (%s)",					   source, line, namebuf);			continue;		}		isc_buffer_init(&buffer, rhsbuf, strlen(rhsbuf));		isc_buffer_add(&buffer, strlen(rhsbuf));		isc_buffer_setactive(&buffer, strlen(rhsbuf));		result = isc_lex_openbuffer(lctx->lex, &buffer);		if (result != ISC_R_SUCCESS)			goto error_cleanup;		isc_buffer_init(&target, target_mem, target_size);		result = dns_rdata_fromtext(&rdata, lctx->zclass, type,					    lctx->lex, ictx->origin, 0,					    lctx->mctx, &target, callbacks);		RUNTIME_CHECK(isc_lex_close(lctx->lex) == ISC_R_SUCCESS);		if (result != ISC_R_SUCCESS)			goto error_cleanup;		rdatalist.type = type;		rdatalist.covers = 0;		rdatalist.rdclass = lctx->zclass;		rdatalist.ttl = lctx->ttl;		ISC_LIST_PREPEND(head, &rdatalist, link);		ISC_LIST_APPEND(rdatalist.rdata, &rdata, link);		result = commit(callbacks, lctx, &head, owner, source, line);		ISC_LIST_UNLINK(rdatalist.rdata, &rdata, link);		if (result != ISC_R_SUCCESS)			goto error_cleanup;		dns_rdata_reset(&rdata);	}	result = ISC_R_SUCCESS;	goto cleanup; error_cleanup:	if (result == ISC_R_NOMEMORY)		(*callbacks->error)(callbacks, "$GENERATE: %s",				    dns_result_totext(result));	else		(*callbacks->error)(callbacks, "$GENERATE: %s:%lu: %s",				    source, line, dns_result_totext(result)); insist_cleanup:	INSIST(result != ISC_R_SUCCESS); cleanup:	if (target_mem != NULL)		isc_mem_put(lctx->mctx, target_mem, target_size);	if (lhsbuf != NULL)		isc_mem_put(lctx->mctx, lhsbuf, DNS_MASTER_BUFSZ);	if (rhsbuf != NULL)		isc_mem_put(lctx->mctx, rhsbuf, DNS_MASTER_BUFSZ);	return (result);}static voidlimit_ttl(dns_rdatacallbacks_t *callbacks, const char *source, unsigned int line,	  isc_uint32_t *ttlp){	if (*ttlp > 0x7fffffffUL) {		(callbacks->warn)(callbacks,				  "%s: %s:%lu: "				  "$TTL %lu > MAXTTL, "				  "setting $TTL to 0",				  "dns_master_load",				  source, line,				  *ttlp);		*ttlp = 0;	}}static isc_result_tcheck_ns(dns_loadctx_t *lctx, isc_token_t *token, const char *source,	 unsigned long line){	char *tmp = NULL;	isc_result_t result = ISC_R_SUCCESS;	void (*callback)(struct dns_rdatacallbacks *, const char *, ...);	if ((lctx->options & DNS_MASTER_FATALNS) != 0)		callback = lctx->callbacks->error;	else		callback = lctx->callbacks->warn;			if (token->type == isc_tokentype_string) {		struct in_addr addr;		struct in6_addr addr6;		tmp = isc_mem_strdup(lctx->mctx, DNS_AS_STR(*token));		if (tmp == NULL)			return (ISC_R_NOMEMORY);		/*		 * Catch both "1.2.3.4" and "1.2.3.4."		 */		if (tmp[strlen(tmp) - 1] == '.')			tmp[strlen(tmp) - 1] = '\0';		if (inet_aton(tmp, &addr) == 1 ||		    inet_pton(AF_INET6, tmp, &addr6) == 1)			result = DNS_R_NSISADDRESS;	}	if (result != ISC_R_SUCCESS)		(*callback)(lctx->callbacks, "%s:%lu: NS record '%s' "			    "appears to be an address",			    source, line, DNS_AS_STR(*token));	if (tmp != NULL)		isc_mem_free(lctx->mctx, tmp);	return (result);}static isc_result_tload(dns_loadctx_t *lctx) {	dns_rdataclass_t rdclass;	dns_rdatatype_t type, covers;	isc_uint32_t ttl_offset = 0;	dns_name_t *new_name;	isc_boolean_t current_has_delegation = ISC_FALSE;	isc_boolean_t done = ISC_FALSE;	isc_boolean_t finish_origin = ISC_FALSE;	isc_boolean_t finish_include = ISC_FALSE;	isc_boolean_t read_till_eol = ISC_FALSE;	isc_boolean_t initialws;	char *include_file = NULL;	isc_token_t token;	isc_result_t result = ISC_R_UNEXPECTED;	rdatalist_head_t glue_list;	rdatalist_head_t current_list;	dns_rdatalist_t *this;	dns_rdatalist_t *rdatalist = NULL;	dns_rdatalist_t *new_rdatalist;	int rdlcount = 0;	int rdlcount_save = 0;	int rdatalist_size = 0;	isc_buffer_t buffer;	isc_buffer_t target;	isc_buffer_t target_ft;	isc_buffer_t target_save;	dns_rdata_t *rdata = NULL;	dns_rdata_t *new_rdata;	int rdcount = 0;	int rdcount_save = 0;	int rdata_size = 0;	unsigned char *target_mem = NULL;	int target_size = TSIZ;	int new_in_use;	unsigned int loop_cnt = 0;	isc_mem_t *mctx;	dns_rdatacallbacks_t *callbacks;	dns_incctx_t *ictx;	char *range = NULL;	char *lhs = NULL;	char *gtype = NULL;	char *rhs = NULL;	const char *source = "";	unsigned long line = 0;	isc_boolean_t explicit_ttl;	isc_stdtime_t now;	char classname1[DNS_RDATACLASS_FORMATSIZE];	char classname2[DNS_RDATACLASS_FORMATSIZE];	unsigned int options = 0;	REQUIRE(DNS_LCTX_VALID(lctx));	callbacks = lctx->callbacks;	mctx = lctx->mctx;	ictx = lctx->inc;	ISC_LIST_INIT(glue_list);	ISC_LIST_INIT(current_list);	isc_stdtime_get(&now);	/*	 * Allocate target_size of buffer space.  This is greater than twice	 * the maximum individual RR data size.	 */	target_mem = isc_mem_get(mctx, target_size);	if (target_mem == NULL) {		result = ISC_R_NOMEMORY;		goto log_and_cleanup;	}	isc_buffer_init(&target, target_mem, target_size);	target_save = target;	if ((lctx->options & DNS_MASTER_CHECKNAMES) != 0)		options |= DNS_RDATA_CHECKNAMES;	if ((lctx->options & DNS_MASTER_CHECKNAMESFAIL) != 0)		options |= DNS_RDATA_CHECKNAMESFAIL;	source = isc_lex_getsourcename(lctx->lex);	do {		initialws = ISC_FALSE;		line = isc_lex_getsourceline(lctx->lex);		GETTOKEN(lctx->lex, ISC_LEXOPT_INITIALWS, &token, ISC_TRUE);		line = isc_lex_getsourceline(lctx->lex);		if (token.type == isc_tokentype_eof) {			if (read_till_eol)				WARNUNEXPECTEDEOF(lctx->lex);			/* Pop the include stack? */

⌨️ 快捷键说明

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