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

📄 master.c

📁 bind-3.2.
💻 C
📖 第 1 页 / 共 4 页
字号:
				if (lhs == NULL) {					result = ISC_R_NOMEMORY;					goto log_and_cleanup;				}				/* TYPE */				GETTOKEN(lctx->lex, 0, &token, ISC_FALSE);				gtype = isc_mem_strdup(mctx,						       token.value.as_pointer);				if (gtype == NULL) {					result = ISC_R_NOMEMORY;					goto log_and_cleanup;				}				/* RHS */				GETTOKEN(lctx->lex, 0, &token, ISC_FALSE);				rhs = isc_mem_strdup(mctx,						     token.value.as_pointer);				if (rhs == NULL) {					result = ISC_R_NOMEMORY;					goto log_and_cleanup;				}				result = generate(lctx, range, lhs, gtype, rhs,						  source, line);				if (MANYERRS(lctx, result)) {					SETRESULT(lctx, result);				} else if (result != ISC_R_SUCCESS)					goto insist_and_cleanup;				EXPECTEOL;				continue;			} else if (strncasecmp(token.value.as_pointer,					       "$", 1) == 0) {				(callbacks->error)(callbacks,					   "%s: %s:%lu: "					   "unknown $ directive '%s'",					   "dns_master_load", source, line,					   token.value.as_pointer);				result = DNS_R_SYNTAX;				if (MANYERRS(lctx, result)) {					SETRESULT(lctx, result);				} else if (result != ISC_R_SUCCESS)					goto insist_and_cleanup;			}			/*			 * Normal processing resumes.			 *			 * Find a free name buffer.			 */			for (new_in_use = 0; new_in_use < NBUFS ; new_in_use++)				if (!ictx->in_use[new_in_use])					break;			INSIST(new_in_use < NBUFS);			dns_fixedname_init(&ictx->fixed[new_in_use]);			new_name = dns_fixedname_name(&ictx->fixed[new_in_use]);			isc_buffer_init(&buffer, token.value.as_region.base,					token.value.as_region.length);			isc_buffer_add(&buffer, token.value.as_region.length);			isc_buffer_setactive(&buffer,					     token.value.as_region.length);			result = dns_name_fromtext(new_name, &buffer,					  ictx->origin, ISC_FALSE, NULL);			if (MANYERRS(lctx, result)) {				SETRESULT(lctx, result);				LOGITFILE(result, include_file);				read_till_eol = ISC_TRUE;				continue;			} else if (result != ISC_R_SUCCESS)				goto log_and_cleanup;			/*			 * Finish $ORIGIN / $INCLUDE processing if required.			 */			if (finish_origin) {				if (ictx->origin_in_use != -1)					ictx->in_use[ictx->origin_in_use] =						ISC_FALSE;				ictx->origin_in_use = new_in_use;				ictx->in_use[ictx->origin_in_use] = ISC_TRUE;				ictx->origin = new_name;				finish_origin = ISC_FALSE;				EXPECTEOL;				continue;			}			if (finish_include) {				finish_include = ISC_FALSE;				result = pushfile(include_file, new_name, lctx);				if (MANYERRS(lctx, result)) {					SETRESULT(lctx, result);					LOGITFILE(result, include_file);					continue;				} else if (result != ISC_R_SUCCESS) {					LOGITFILE(result, include_file);					goto insist_and_cleanup;				}				ictx = lctx->inc;				line = isc_lex_getsourceline(lctx->lex);				source = isc_lex_getsourcename(lctx->lex);				continue;			}			/*			 * "$" Processing Finished			 */			/*			 * If we are processing glue and the new name does			 * not match the current glue name, commit the glue			 * and pop stacks leaving us in 'normal' processing			 * state.  Linked lists are undone by commit().			 */			if (ictx->glue != NULL &&			    dns_name_compare(ictx->glue, new_name) != 0) {				result = commit(callbacks, lctx, &glue_list,						ictx->glue, source,						ictx->glue_line);				if (MANYERRS(lctx, result)) {					SETRESULT(lctx, result);				} else if (result != ISC_R_SUCCESS)					goto insist_and_cleanup;				if (ictx->glue_in_use != -1)					ictx->in_use[ictx->glue_in_use] =						ISC_FALSE;				ictx->glue_in_use = -1;				ictx->glue = NULL;				rdcount = rdcount_save;				rdlcount = rdlcount_save;				target = target_save;			}			/*			 * If we are in 'normal' processing state and the new			 * name does not match the current name, see if the			 * new name is for glue and treat it as such,			 * otherwise we have a new name so commit what we			 * have.			 */			if ((ictx->glue == NULL) && (ictx->current == NULL ||			    dns_name_compare(ictx->current, new_name) != 0)) {				if (current_has_delegation &&					is_glue(&current_list, new_name)) {					rdcount_save = rdcount;					rdlcount_save = rdlcount;					target_save = target;					ictx->glue = new_name;					ictx->glue_in_use = new_in_use;					ictx->in_use[ictx->glue_in_use] = 						ISC_TRUE;				} else {					result = commit(callbacks, lctx,							&current_list,							ictx->current,							source,							ictx->current_line);					if (MANYERRS(lctx, result)) {						SETRESULT(lctx, result);					} else if (result != ISC_R_SUCCESS)						goto insist_and_cleanup;					rdcount = 0;					rdlcount = 0;					if (ictx->current_in_use != -1)					    ictx->in_use[ictx->current_in_use] =						ISC_FALSE;					ictx->current_in_use = new_in_use;					ictx->in_use[ictx->current_in_use] =						ISC_TRUE;					ictx->current = new_name;					current_has_delegation = ISC_FALSE;					isc_buffer_init(&target, target_mem,							target_size);				}			}			if ((lctx->options & DNS_MASTER_ZONE) != 0 &&			    (lctx->options & DNS_MASTER_SLAVE) == 0 &&			    !dns_name_issubdomain(new_name, lctx->top))			{				char namebuf[DNS_NAME_FORMATSIZE];				dns_name_format(new_name, namebuf,						sizeof(namebuf));				/*				 * Ignore out-of-zone data.				 */				(*callbacks->warn)(callbacks,				       "dns_master_load: %s:%lu: "				       "ignoring out-of-zone data (%s)",				       source, line, namebuf);				ictx->drop = ISC_TRUE;			} else				ictx->drop = ISC_FALSE;		} else {			UNEXPECTED_ERROR(__FILE__, __LINE__,					 "%s:%lu: isc_lex_gettoken() returned "					 "unexpeced token type (%d)",					 source, line, token.type);			result = ISC_R_UNEXPECTED;			if (MANYERRS(lctx, result)) {				SETRESULT(lctx, result);				LOGIT(result);				continue;			} else if (result != ISC_R_SUCCESS)				goto insist_and_cleanup;		}		/*		 * Find TTL, class and type.  Both TTL and class are optional		 * and may occur in any order if they exist. TTL and class		 * come before type which must exist.		 *		 * [<TTL>] [<class>] <type> <RDATA>		 * [<class>] [<TTL>] <type> <RDATA>		 */		type = 0;		rdclass = 0;		GETTOKEN(lctx->lex, 0, &token, initialws);		if (initialws) {			if (token.type == isc_tokentype_eol) {				read_till_eol = ISC_FALSE;				continue;		/* blank line */			}			if (token.type == isc_tokentype_eof) {				WARNUNEXPECTEDEOF(lctx->lex);				read_till_eol = ISC_FALSE;				isc_lex_ungettoken(lctx->lex, &token);				continue;			}			if (ictx->current == NULL) {				(*callbacks->error)(callbacks,					"%s: %s:%lu: no current owner name",					"dns_master_load",					source, line);				result = DNS_R_NOOWNER;				if (MANYERRS(lctx, result)) {					SETRESULT(lctx, result);					read_till_eol = ISC_TRUE;					continue;				} else if (result != ISC_R_SUCCESS)					goto insist_and_cleanup;			}		}		if (dns_rdataclass_fromtext(&rdclass,					    &token.value.as_textregion)				== ISC_R_SUCCESS)			GETTOKEN(lctx->lex, 0, &token, ISC_FALSE);		explicit_ttl = ISC_FALSE;		if (dns_ttl_fromtext(&token.value.as_textregion, &lctx->ttl)				== ISC_R_SUCCESS) {			limit_ttl(callbacks, source, line, &lctx->ttl);			explicit_ttl = ISC_TRUE;			lctx->ttl_known = ISC_TRUE;			GETTOKEN(lctx->lex, 0, &token, ISC_FALSE);		}		if (token.type != isc_tokentype_string) {			UNEXPECTED_ERROR(__FILE__, __LINE__,			"isc_lex_gettoken() returned unexpected token type");			result = ISC_R_UNEXPECTED;			if (MANYERRS(lctx, result)) {				SETRESULT(lctx, result);				read_till_eol = ISC_TRUE;				continue;			} else if (result != ISC_R_SUCCESS)				goto insist_and_cleanup;		}		if (rdclass == 0 &&		    dns_rdataclass_fromtext(&rdclass,					    &token.value.as_textregion)				== ISC_R_SUCCESS)			GETTOKEN(lctx->lex, 0, &token, ISC_FALSE);		if (token.type != isc_tokentype_string) {			UNEXPECTED_ERROR(__FILE__, __LINE__,			"isc_lex_gettoken() returned unexpected token type");			result = ISC_R_UNEXPECTED;			if (MANYERRS(lctx, result)) {				SETRESULT(lctx, result);				read_till_eol = ISC_TRUE;				continue;			} else if (result != ISC_R_SUCCESS)				goto insist_and_cleanup;		}		result = dns_rdatatype_fromtext(&type,						&token.value.as_textregion);		if (result != ISC_R_SUCCESS) {			(*callbacks->warn)(callbacks,				   "%s: %s:%lu: unknown RR type '%.*s'",				   "dns_master_load", source, line,				   token.value.as_textregion.length,				   token.value.as_textregion.base);			if (MANYERRS(lctx, result)) {				SETRESULT(lctx, result);				read_till_eol = ISC_TRUE;				continue;			} else if (result != ISC_R_SUCCESS)				goto insist_and_cleanup;		}		/*		 * If the class specified does not match the zone's class		 * print out a error message and exit.		 */		if (rdclass != 0 && rdclass != lctx->zclass) {			char classname1[DNS_RDATACLASS_FORMATSIZE];			char classname2[DNS_RDATACLASS_FORMATSIZE];			dns_rdataclass_format(rdclass, classname1,					      sizeof(classname1));			dns_rdataclass_format(lctx->zclass, classname2,					      sizeof(classname2));			(*callbacks->error)(callbacks,					    "%s: %s:%lu: class '%s' != "					    "zone class '%s'",					    "dns_master_load", source, line,					    classname1, classname2);			result = DNS_R_BADCLASS;			if (MANYERRS(lctx, result)) {				SETRESULT(lctx, result);				read_till_eol = ISC_TRUE;				continue;			} else if (result != ISC_R_SUCCESS)				goto insist_and_cleanup;		}		if (type == dns_rdatatype_ns && ictx->glue == NULL)			current_has_delegation = ISC_TRUE;		/*		 * Find a rdata structure.		 */		if (rdcount == rdata_size) {			new_rdata = grow_rdata(rdata_size + RDSZ, rdata,					       rdata_size, &current_list,					       &glue_list, mctx);			if (new_rdata == NULL) {				result = ISC_R_NOMEMORY;				goto log_and_cleanup;			}			rdata_size += RDSZ;			rdata = new_rdata;		}		/*		 * Read rdata contents.		 */		dns_rdata_init(&rdata[rdcount]);		target_ft = target;		result = dns_rdata_fromtext(&rdata[rdcount], lctx->zclass,					    type, lctx->lex, ictx->origin,					    ISC_FALSE, lctx->mctx, &target,					    callbacks);		if (MANYERRS(lctx, result)) {			SETRESULT(lctx, result);			continue;		} else if (result != ISC_R_SUCCESS)			goto insist_and_cleanup;		if (ictx->drop) {			target = target_ft;			continue;		}		if (type == dns_rdatatype_soa &&		    (lctx->options & DNS_MASTER_ZONE) != 0 &&		    dns_name_compare(ictx->current, lctx->top) != 0) {			char namebuf[DNS_NAME_FORMATSIZE];			dns_name_format(ictx->current, namebuf,					sizeof(namebuf));			(*callbacks->error)(callbacks,				            "dns_master_load: %s:%lu: SOA "			                    "record not at top of zone (%s)",				            source, line, namebuf);			result = DNS_R_NOTZONETOP;			if (MANYERRS(lctx, result)) {				SETRESULT(lctx, result);				read_till_eol = ISC_TRUE;				target = target_ft;				continue;			} else if (result != ISC_R_SUCCESS)				goto insist_and_cleanup;		}		if (type == dns_rdatatype_sig)			covers = dns_rdata_covers(&rdata[rdcount]);		else			covers = 0;		if (!lctx->ttl_known && !lctx->default_ttl_known) {			if (type == dns_rdatatype_soa) {				(*callbacks->warn)(callbacks,						   "%s:%lu: no TTL specified; "						   "using SOA MINTTL instead",						   source, line);				lctx->ttl = dns_soa_getminimum(&rdata[rdcount]);				limit_ttl(callbacks, source, line, &lctx->ttl);				lctx->default_ttl = lctx->ttl;				lctx->default_ttl_known = ISC_TRUE;			} else {				(*callbacks->warn)(callbacks,						   "%s:%lu: no TTL specified; "						   "zone rejected",						   source, line);				result = DNS_R_NOTTL;				if (MANYERRS(lctx, result)) {					SETRESULT(lctx, result);					lctx->ttl = 0;				} else {					goto insist_and_cleanup;				}			}		} else if (!explicit_ttl && lctx->default_ttl_known) {			lctx->ttl = lctx->default_ttl;		} else if (!explicit_ttl && lctx->warn_1035) {			(*callbacks->warn)(callbacks,					   "%s: %s:%lu: "					   "using RFC 1035 TTL semantics",					   "dns_master_load", source, line);			lctx->warn_1035 = ISC_FALSE;		}		if (type == dns_rdatatype_sig && lctx->warn_sigexpired) {			dns_rdata_sig_t sig;			(void)dns_rdata_tostruct(&rdata[rdcount], &sig, NULL);			if (isc_serial_lt(sig.timeexpire, now)) {				(*callbacks->warn)(callbacks,						   "%s: %s:%lu: "						   "signature has expired",						   "dns_master_load",						   source, line);				lctx->warn_sigexpired = ISC_FALSE;			}		}		if ((lctx->options & DNS_MASTER_AGETTL) != 0) {			/*			 * Adjust the TTL for $DATE.  If the RR has already			 * expired, ignore it.			 */			if (lctx->ttl < ttl_offset)				continue;			lctx->ttl -= ttl_offset;		}		/*		 * Find type in rdatalist.		 * If it does not exist create new one and prepend to list		 * as this will mimimise list traversal.		 */		if (ictx->glue != NULL)			this = ISC_LIST_HEAD(glue_list);		else			this = ISC_LIST_HEAD(current_list);		while (this != NULL) {			if (this->type == type && this->covers == covers)				break;			this = ISC_LIST_NEXT(this, link);		}		if (this == NULL) {			if (rdlcount == rdatalist_size) {				new_rdatalist =					grow_rdatalist(rdatalist_size + RDLSZ,						       rdatalist,						       rdatalist_size,						       &current_list,						       &glue_list,						       mctx);				if (new_rdatalist == NULL) {					result = ISC_R_NOMEMORY;					goto log_and_cleanup;				}				rdatalist = new_rdatalist;				rdatalist_size += RDLSZ;			}			this = &rdatalist[rdlcount++];			this->type = type;			this->covers = covers;			this->rdclass = lctx->zclass;			this->ttl = lctx->ttl;			ISC_LIST_INIT(this->rdata);			if (ictx->glue != NULL)				ISC_LIST_INITANDPREPEND(glue_list, this, link);			else				ISC_LIST_INITANDPREPEND(current_list, this,						        link);		} else if (this->ttl != lctx->ttl) {			(*callbacks->warn)(callbacks,					   "%s: %s:%lu: "					   "TTL set to prior TTL (%lu)",					   "dns_master_load",					   source, line, this->ttl);			lctx->ttl = this->ttl;		}		ISC_LIST_APPEND(this->rdata, &rdata[rdcount], link);		if (ictx->glue != NULL) 			ictx->glue_line = line;		else			ictx->current_line = line;		rdcount++;		/*		 * We must have at least 64k as rdlen is 16 bits.		 * If we don't commit everything we have so far.		 */		if ((target.length - target.used) < MINTSIZ)			COMMITALL; next_line:		;	} while (!done && (lctx->loop_cnt == 0 || loop_cnt++ < lctx->loop_cnt));	/*	 * Commit what has not yet been committed.	 */	result = commit(callbacks, lctx, &current_list, ictx->current,			source, ictx->current_line);	if (MANYERRS(lctx, result)) {		SETRESULT(lctx, result);	} else if (result != ISC_R_SUCCESS)		goto insist_and_cleanup;

⌨️ 快捷键说明

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