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

📄 check.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2001-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: check.c,v 1.37.6.28 2004/07/29 00:08:08 marka Exp $ */#include <config.h>#include <stdlib.h>#include <string.h>#include <isc/buffer.h>#include <isc/log.h>#include <isc/mem.h>#include <isc/netaddr.h>#include <isc/parseint.h>#include <isc/region.h>#include <isc/result.h>#include <isc/sockaddr.h>#include <isc/symtab.h>#include <isc/util.h>#include <dns/fixedname.h>#include <dns/rdataclass.h>#include <dns/rdatatype.h>#include <dns/secalg.h>#include <isccfg/cfg.h>#include <bind9/check.h>static voidfreekey(char *key, unsigned int type, isc_symvalue_t value, void *userarg) {	UNUSED(type);	UNUSED(value);	isc_mem_free(userarg, key);}static isc_result_tcheck_orderent(cfg_obj_t *ent, isc_log_t *logctx) {	isc_result_t result = ISC_R_SUCCESS;	isc_result_t tresult;	isc_textregion_t r;	dns_fixedname_t fixed;	cfg_obj_t *obj;	dns_rdataclass_t rdclass;	dns_rdatatype_t rdtype;	isc_buffer_t b;	const char *str;	dns_fixedname_init(&fixed);	obj = cfg_tuple_get(ent, "class");	if (cfg_obj_isstring(obj)) {		DE_CONST(cfg_obj_asstring(obj), r.base);		r.length = strlen(r.base);		tresult = dns_rdataclass_fromtext(&rdclass, &r);		if (tresult != ISC_R_SUCCESS) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "rrset-order: invalid class '%s'",				    r.base);			result = ISC_R_FAILURE;		}	}	obj = cfg_tuple_get(ent, "type");	if (cfg_obj_isstring(obj)) {		DE_CONST(cfg_obj_asstring(obj), r.base);		r.length = strlen(r.base);		tresult = dns_rdatatype_fromtext(&rdtype, &r);		if (tresult != ISC_R_SUCCESS) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "rrset-order: invalid type '%s'",				    r.base);			result = ISC_R_FAILURE;		}	}	obj = cfg_tuple_get(ent, "name");	if (cfg_obj_isstring(obj)) {		str = cfg_obj_asstring(obj);		isc_buffer_init(&b, str, strlen(str));		isc_buffer_add(&b, strlen(str));		tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,					    dns_rootname, ISC_FALSE, NULL);		if (tresult != ISC_R_SUCCESS) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "rrset-order: invalid name '%s'", str);			result = ISC_R_FAILURE;		}	}	obj = cfg_tuple_get(ent, "order");	if (!cfg_obj_isstring(obj) ||	    strcasecmp("order", cfg_obj_asstring(obj)) != 0) {		cfg_obj_log(ent, logctx, ISC_LOG_ERROR,			    "rrset-order: keyword 'order' missing");		result = ISC_R_FAILURE;	}	obj = cfg_tuple_get(ent, "ordering");	if (!cfg_obj_isstring(obj)) {	    cfg_obj_log(ent, logctx, ISC_LOG_ERROR,			"rrset-order: missing ordering");		result = ISC_R_FAILURE;	} else if (strcasecmp(cfg_obj_asstring(obj), "fixed") == 0) {		cfg_obj_log(obj, logctx, ISC_LOG_WARNING,			    "rrset-order: order 'fixed' not implemented");	} else if (/* strcasecmp(cfg_obj_asstring(obj), "fixed") != 0 && */		   strcasecmp(cfg_obj_asstring(obj), "random") != 0 &&		   strcasecmp(cfg_obj_asstring(obj), "cyclic") != 0) {		cfg_obj_log(obj, logctx, ISC_LOG_ERROR,			    "rrset-order: invalid order '%s'",			    cfg_obj_asstring(obj));		result = ISC_R_FAILURE;	}	return (result);}static isc_result_tcheck_order(cfg_obj_t *options, isc_log_t *logctx) {	isc_result_t result = ISC_R_SUCCESS;	isc_result_t tresult;	cfg_listelt_t *element;	cfg_obj_t *obj = NULL;	if (cfg_map_get(options, "rrset-order", &obj) != ISC_R_SUCCESS)		return (result);	for (element = cfg_list_first(obj);	     element != NULL;	     element = cfg_list_next(element))	{		tresult = check_orderent(cfg_listelt_value(element), logctx);		if (tresult != ISC_R_SUCCESS)			result = tresult;	}	return (result);}static isc_result_tcheck_dual_stack(cfg_obj_t *options, isc_log_t *logctx) {	cfg_listelt_t *element;	cfg_obj_t *alternates = NULL;	cfg_obj_t *value;	cfg_obj_t *obj;	char *str;	dns_fixedname_t fixed;	dns_name_t *name;	isc_buffer_t buffer;	isc_result_t result = ISC_R_SUCCESS;	isc_result_t tresult;	(void)cfg_map_get(options, "dual-stack-servers", &alternates);	if (alternates == NULL)		return (ISC_R_SUCCESS);	obj = cfg_tuple_get(alternates, "port");	if (cfg_obj_isuint32(obj)) {		isc_uint32_t val = cfg_obj_asuint32(obj);		if (val > ISC_UINT16_MAX) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "port '%u' out of range", val);			result = ISC_R_FAILURE;		}	}	obj = cfg_tuple_get(alternates, "addresses");	for (element = cfg_list_first(obj);	     element != NULL;	     element = cfg_list_next(element)) {		value = cfg_listelt_value(element);		if (cfg_obj_issockaddr(value))			continue;		obj = cfg_tuple_get(value, "name");		str = cfg_obj_asstring(obj);		isc_buffer_init(&buffer, str, strlen(str));		isc_buffer_add(&buffer, strlen(str));		dns_fixedname_init(&fixed);		name = dns_fixedname_name(&fixed);		tresult = dns_name_fromtext(name, &buffer, dns_rootname,					   ISC_FALSE, NULL);		if (tresult != ISC_R_SUCCESS) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "bad name '%s'", str);			result = ISC_R_FAILURE;		}		obj = cfg_tuple_get(value, "port");		if (cfg_obj_isuint32(obj)) {			isc_uint32_t val = cfg_obj_asuint32(obj);			if (val > ISC_UINT16_MAX) {				cfg_obj_log(obj, logctx, ISC_LOG_ERROR,					    "port '%u' out of range", val);				result = ISC_R_FAILURE;			}		}	}	return (result);}static isc_result_tcheck_forward(cfg_obj_t *options, isc_log_t *logctx) {	cfg_obj_t *forward = NULL;	cfg_obj_t *forwarders = NULL;	(void)cfg_map_get(options, "forward", &forward);	(void)cfg_map_get(options, "forwarders", &forwarders);	if (forward != NULL && forwarders == NULL) {		cfg_obj_log(forward, logctx, ISC_LOG_ERROR,			    "no matching 'forwarders' statement");		return (ISC_R_FAILURE);	}	return (ISC_R_SUCCESS);}static isc_result_tdisabled_algorithms(cfg_obj_t *disabled, isc_log_t *logctx) {	isc_result_t result = ISC_R_SUCCESS;	isc_result_t tresult;	cfg_listelt_t *element;	const char *str;	isc_buffer_t b;	dns_fixedname_t fixed;	dns_name_t *name;	cfg_obj_t *obj;	dns_fixedname_init(&fixed);	name = dns_fixedname_name(&fixed);	obj = cfg_tuple_get(disabled, "name");	str = cfg_obj_asstring(obj);	isc_buffer_init(&b, str, strlen(str));	isc_buffer_add(&b, strlen(str));	tresult = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);	if (tresult != ISC_R_SUCCESS) {		cfg_obj_log(obj, logctx, ISC_LOG_ERROR,			    "bad domain name '%s'", str);		result = tresult;	}	obj = cfg_tuple_get(disabled, "algorithms");	for (element = cfg_list_first(obj);	     element != NULL;	     element = cfg_list_next(element))	{		isc_textregion_t r;		dns_secalg_t alg;		isc_result_t tresult;		r.base = cfg_obj_asstring(cfg_listelt_value(element));		r.length = strlen(r.base);		tresult = dns_secalg_fromtext(&alg, &r);		if (tresult != ISC_R_SUCCESS) {			isc_uint8_t ui;			result = isc_parse_uint8(&ui, r.base, 10);		}		if (tresult != ISC_R_SUCCESS) {			cfg_obj_log(cfg_listelt_value(element), logctx,				    ISC_LOG_ERROR, "invalid algorithm");			result = tresult;		}	}	return (result);}static isc_result_tnameexist(cfg_obj_t *obj, const char *name, int value, isc_symtab_t *symtab,	  const char *fmt, isc_log_t *logctx, isc_mem_t *mctx){	char *key;	const char *file;	unsigned int line;	isc_result_t result;	isc_symvalue_t symvalue;	key = isc_mem_strdup(mctx, name);	if (key == NULL)		return (ISC_R_NOMEMORY);	symvalue.as_pointer = obj;	result = isc_symtab_define(symtab, key, value, symvalue,				   isc_symexists_reject);	if (result == ISC_R_EXISTS) {		RUNTIME_CHECK(isc_symtab_lookup(symtab, key, value,						&symvalue) == ISC_R_SUCCESS);		file = cfg_obj_file(symvalue.as_pointer);		line = cfg_obj_line(symvalue.as_pointer);		if (file == NULL)			file = "<unknown file>";		cfg_obj_log(obj, logctx, ISC_LOG_ERROR, fmt, key, file, line);		isc_mem_free(mctx, key);		result = ISC_R_EXISTS;	} else if (result != ISC_R_SUCCESS) {		isc_mem_free(mctx, key);	}	return (result);}static isc_result_tmustbesecure(cfg_obj_t *secure, isc_symtab_t *symtab, isc_log_t *logctx,	     isc_mem_t *mctx){	cfg_obj_t *obj;	char namebuf[DNS_NAME_FORMATSIZE];	const char *str;	dns_fixedname_t fixed;	dns_name_t *name;	isc_buffer_t b;	isc_result_t result = ISC_R_SUCCESS;	dns_fixedname_init(&fixed);	name = dns_fixedname_name(&fixed);	obj = cfg_tuple_get(secure, "name");	str = cfg_obj_asstring(obj);	isc_buffer_init(&b, str, strlen(str));	isc_buffer_add(&b, strlen(str));	result = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);	if (result != ISC_R_SUCCESS) {		cfg_obj_log(obj, logctx, ISC_LOG_ERROR,			    "bad domain name '%s'", str);	} else {		dns_name_format(name, namebuf, sizeof(namebuf));		result = nameexist(secure, namebuf, 1, symtab,				   "dnssec-must-be-secure '%s': already "				   "exists previous definition: %s:%u",				   logctx, mctx);	}	return (result);}typedef struct {	const char *name;	unsigned int scale;	unsigned int max;} intervaltable;static isc_result_tcheck_options(cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {	isc_result_t result = ISC_R_SUCCESS;	isc_result_t tresult;	unsigned int i;	cfg_obj_t *obj = NULL;	cfg_listelt_t *element;	isc_symtab_t *symtab = NULL;	static intervaltable intervals[] = {	{ "cleaning-interval", 60, 28 * 24 * 60 },	/* 28 days */	{ "heartbeat-interval", 60, 28 * 24 * 60 },	/* 28 days */	{ "interface-interval", 60, 28 * 24 * 60 },	/* 28 days */	{ "max-transfer-idle-in", 60, 28 * 24 * 60 },	/* 28 days */	{ "max-transfer-idle-out", 60, 28 * 24 * 60 },	/* 28 days */	{ "max-transfer-time-in", 60, 28 * 24 * 60 },	/* 28 days */	{ "max-transfer-time-out", 60, 28 * 24 * 60 },	/* 28 days */	{ "sig-validity-interval", 86400, 10 * 366 },	/* 10 years */	{ "statistics-interval", 60, 28 * 24 * 60 },	/* 28 days */	};	/*	 * Check that fields specified in units of time other than seconds	 * have reasonable values.	 */	for (i = 0; i < sizeof(intervals) / sizeof(intervals[0]); i++) {		isc_uint32_t val;		obj = NULL;		(void)cfg_map_get(options, intervals[i].name, &obj);		if (obj == NULL)			continue;		val = cfg_obj_asuint32(obj);		if (val > intervals[i].max) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "%s '%u' is out of range (0..%u)",				    intervals[i].name, val,				    intervals[i].max);			result = ISC_R_RANGE;		} else if (val > (ISC_UINT32_MAX / intervals[i].scale)) {			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "%s '%d' is out of range",				    intervals[i].name, val);			result = ISC_R_RANGE;		}	}	obj = NULL;	(void)cfg_map_get(options, "preferred-glue", &obj);	if (obj != NULL) {		const char *str;                str = cfg_obj_asstring(obj);                if (strcasecmp(str, "a") != 0 &&		    strcasecmp(str, "aaaa") != 0 &&		    strcasecmp(str, "none") != 0)			cfg_obj_log(obj, logctx, ISC_LOG_ERROR,				    "preferred-glue unexpected value '%s'",				    str);	}	obj = NULL;	(void)cfg_map_get(options, "root-delegation-only", &obj);	if (obj != NULL) {		if (!cfg_obj_isvoid(obj)) {			cfg_listelt_t *element;			cfg_obj_t *exclude;			char *str;			dns_fixedname_t fixed;			dns_name_t *name;			isc_buffer_t b;			dns_fixedname_init(&fixed);			name = dns_fixedname_name(&fixed);			for (element = cfg_list_first(obj);			     element != NULL;			     element = cfg_list_next(element)) {				exclude = cfg_listelt_value(element);				str = cfg_obj_asstring(exclude);				isc_buffer_init(&b, str, strlen(str));				isc_buffer_add(&b, strlen(str));				tresult = dns_name_fromtext(name, &b,							   dns_rootname,                                                           ISC_FALSE, NULL);				if (tresult != ISC_R_SUCCESS) {					cfg_obj_log(obj, logctx, ISC_LOG_ERROR,						    "bad domain name '%s'",						    str);					result = tresult;				}			}		}	}       	/*	 * Set supported DNSSEC algorithms.	 */	obj = NULL;	(void)cfg_map_get(options, "disable-algorithms", &obj);	if (obj != NULL) {		for (element = cfg_list_first(obj);		     element != NULL;		     element = cfg_list_next(element))		{			obj = cfg_listelt_value(element);			tresult = disabled_algorithms(obj, logctx);			if (tresult != ISC_R_SUCCESS)				result = tresult;		}	}	/*	 * Check the DLV zone name.	 */	obj = NULL;	(void)cfg_map_get(options, "dnssec-lookaside", &obj);	if (obj != NULL) {		tresult = isc_symtab_create(mctx, 100, freekey, mctx,					    ISC_TRUE, &symtab);		if (tresult != ISC_R_SUCCESS)			result = tresult;		for (element = cfg_list_first(obj);		     element != NULL;

⌨️ 快捷键说明

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