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

📄 server.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 5 页
字号:
	 * "hints zone" configured.  Issue a warning, except if this	 * is a root server.  Root servers never need to consult 	 * their hints, so it's no point requiring users to configure	 * them.	 */	if (view->hints == NULL) {		dns_zone_t *rootzone = NULL;		(void)dns_view_findzone(view, dns_rootname, &rootzone);		if (rootzone != NULL) {			dns_zone_detach(&rootzone);			need_hints = ISC_FALSE;		}		if (need_hints)			isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,				      NS_LOGMODULE_SERVER, ISC_LOG_WARNING,				      "no root hints for view '%s'",				      view->name);	}	/*	 * Configure the view's TSIG keys.	 */	ring = NULL;	CHECK(ns_tsigkeyring_fromconfig(config, vconfig, view->mctx, &ring));	dns_view_setkeyring(view, ring);	/*	 * Configure the view's peer list.	 */	{		cfg_obj_t *peers = NULL;		cfg_listelt_t *element;		dns_peerlist_t *newpeers = NULL;		(void)ns_config_get(cfgmaps, "server", &peers);		CHECK(dns_peerlist_new(mctx, &newpeers));		for (element = cfg_list_first(peers);		     element != NULL;		     element = cfg_list_next(element))		{			cfg_obj_t *cpeer = cfg_listelt_value(element);			dns_peer_t *peer;			CHECK(configure_peer(cpeer, mctx, &peer));			dns_peerlist_addpeer(newpeers, peer);			dns_peer_detach(&peer);		}		dns_peerlist_detach(&view->peers);		view->peers = newpeers; /* Transfer ownership. */	}	/*	 *	Configure the views rrset-order.	 */	{		cfg_obj_t *rrsetorder = NULL;		cfg_listelt_t *element;		(void)ns_config_get(maps, "rrset-order", &rrsetorder);		CHECK(dns_order_create(mctx, &order));		for (element = cfg_list_first(rrsetorder);		     element != NULL;		     element = cfg_list_next(element))		{			cfg_obj_t *ent = cfg_listelt_value(element);			CHECK(configure_order(order, ent));		}		if (view->order != NULL)			dns_order_detach(&view->order);		dns_order_attach(order, &view->order);		dns_order_detach(&order);	}	/*	 * Copy the aclenv object.	 */	dns_aclenv_copy(&view->aclenv, &ns_g_server->aclenv);	/*	 * Configure the "match-clients" and "match-destinations" ACL.	 */	CHECK(configure_view_acl(vconfig, config, "match-clients", actx,				 ns_g_mctx, &view->matchclients));	CHECK(configure_view_acl(vconfig, config, "match-destinations", actx,				 ns_g_mctx, &view->matchdestinations));	/*	 * Configure the "match-recursive-only" option.	 */	obj = NULL;	(void) ns_config_get(maps, "match-recursive-only", &obj);	if (obj != NULL && cfg_obj_asboolean(obj))		view->matchrecursiveonly = ISC_TRUE;	else		view->matchrecursiveonly = ISC_FALSE;	/*	 * Configure other configurable data.	 */	obj = NULL;	result = ns_config_get(maps, "recursion", &obj);	INSIST(result == ISC_R_SUCCESS);	view->recursion = cfg_obj_asboolean(obj);	obj = NULL;	result = ns_config_get(maps, "auth-nxdomain", &obj);	INSIST(result == ISC_R_SUCCESS);	view->auth_nxdomain = cfg_obj_asboolean(obj);	obj = NULL;	result = ns_config_get(maps, "minimal-responses", &obj);	INSIST(result == ISC_R_SUCCESS);	view->minimalresponses = cfg_obj_asboolean(obj);	obj = NULL;	result = ns_config_get(maps, "transfer-format", &obj);	INSIST(result == ISC_R_SUCCESS);	str = cfg_obj_asstring(obj);	if (strcasecmp(str, "many-answers") == 0)		view->transfer_format = dns_many_answers;	else if (strcasecmp(str, "one-answer") == 0)		view->transfer_format = dns_one_answer;	else		INSIST(0);		/*	 * Set sources where additional data and CNAME/DNAME	 * targets for authoritative answers may be found.	 */	obj = NULL;	result = ns_config_get(maps, "additional-from-auth", &obj);	INSIST(result == ISC_R_SUCCESS);	view->additionalfromauth = cfg_obj_asboolean(obj);	if (view->recursion && ! view->additionalfromauth) {		cfg_obj_log(obj, ns_g_lctx, ISC_LOG_WARNING,			    "'additional-from-auth no' is only supported "			    "with 'recursion no'");		view->additionalfromauth = ISC_TRUE;	}	obj = NULL;	result = ns_config_get(maps, "additional-from-cache", &obj);	INSIST(result == ISC_R_SUCCESS);	view->additionalfromcache = cfg_obj_asboolean(obj);	if (view->recursion && ! view->additionalfromcache) {		cfg_obj_log(obj, ns_g_lctx, ISC_LOG_WARNING,			    "'additional-from-cache no' is only supported "			    "with 'recursion no'");		view->additionalfromcache = ISC_TRUE;	}	CHECK(configure_view_acl(vconfig, config, "allow-query",				 actx, ns_g_mctx, &view->queryacl));	if (strcmp(view->name, "_bind") != 0)		CHECK(configure_view_acl(vconfig, config, "allow-recursion",					 actx, ns_g_mctx, &view->recursionacl));	/*	 * Warning if both "recursion no;" and allow-recursion are active	 * except for "allow-recursion { none; };".	 */	if (!view->recursion && view->recursionacl != NULL &&	    (view->recursionacl->length != 1 ||	     view->recursionacl->elements[0].type != dns_aclelementtype_any ||	     view->recursionacl->elements[0].negative != ISC_TRUE)) {		const char *forview = " for view ";		const char *viewname = view->name;		if (!strcmp(view->name, "_bind") ||		    !strcmp(view->name, "_default")) {			forview = "";			viewname = "";		}		isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,			      NS_LOGMODULE_SERVER, ISC_LOG_WARNING,			      "both \"recursion no;\" and \"allow-recursion\" "			      "active%s%s", forview, viewname);	}	CHECK(configure_view_acl(vconfig, config, "sortlist",				 actx, ns_g_mctx, &view->sortlist));	obj = NULL;	result = ns_config_get(maps, "request-ixfr", &obj);	INSIST(result == ISC_R_SUCCESS);	view->requestixfr = cfg_obj_asboolean(obj);	obj = NULL;	result = ns_config_get(maps, "provide-ixfr", &obj);	INSIST(result == ISC_R_SUCCESS);	view->provideixfr = cfg_obj_asboolean(obj);				obj = NULL;	result = ns_config_get(maps, "dnssec-enable", &obj);	INSIST(result == ISC_R_SUCCESS);	view->enablednssec = cfg_obj_asboolean(obj);	obj = NULL;	result = ns_config_get(maps, "dnssec-lookaside", &obj);	if (result == ISC_R_SUCCESS) {		for (element = cfg_list_first(obj);		     element != NULL;		     element = cfg_list_next(element))		{			const char *str;			isc_buffer_t b;			dns_name_t *dlv;			obj = cfg_listelt_value(element);#if 0			dns_fixedname_t fixed;			dns_name_t *name;			/*			 * When we support multiple dnssec-lookaside			 * entries this is how to find the domain to be			 * checked. XXXMPA			 */			dns_fixedname_init(&fixed);			name = dns_fixedname_name(&fixed);			str = cfg_obj_asstring(cfg_tuple_get(obj,							     "domain"));			isc_buffer_init(&b, str, strlen(str));			isc_buffer_add(&b, strlen(str));			CHECK(dns_name_fromtext(name, &b, dns_rootname,						ISC_TRUE, NULL));#endif			str = cfg_obj_asstring(cfg_tuple_get(obj,							     "trust-anchor"));			isc_buffer_init(&b, str, strlen(str));			isc_buffer_add(&b, strlen(str));			dlv = dns_fixedname_name(&view->dlv_fixed);			CHECK(dns_name_fromtext(dlv, &b, dns_rootname,						ISC_TRUE, NULL));			view->dlv = dns_fixedname_name(&view->dlv_fixed);		}	} else		view->dlv = NULL;	/*	 * For now, there is only one kind of trusted keys, the	 * "security roots".	 */	if (view->enablednssec) {		CHECK(configure_view_dnsseckeys(vconfig, config, mctx,						&view->secroots));		dns_resolver_resetmustbesecure(view->resolver);		obj = NULL;		result = ns_config_get(maps, "dnssec-must-be-secure", &obj);		if (result == ISC_R_SUCCESS)			CHECK(mustbesecure(obj, view->resolver));	}	obj = NULL;	result = ns_config_get(maps, "max-cache-ttl", &obj);	INSIST(result == ISC_R_SUCCESS);	view->maxcachettl = cfg_obj_asuint32(obj);	obj = NULL;	result = ns_config_get(maps, "max-ncache-ttl", &obj);	INSIST(result == ISC_R_SUCCESS);	view->maxncachettl = cfg_obj_asuint32(obj);	if (view->maxncachettl > 7 * 24 * 3600)		view->maxncachettl = 7 * 24 * 3600;	obj = NULL;	result = ns_config_get(maps, "preferred-glue", &obj);	if (result == ISC_R_SUCCESS) {		str = cfg_obj_asstring(obj);		if (strcasecmp(str, "a") == 0)			view->preferred_glue = dns_rdatatype_a;		else if (strcasecmp(str, "aaaa") == 0)			view->preferred_glue = dns_rdatatype_aaaa;		else			view->preferred_glue = 0;	} else		view->preferred_glue = 0;	obj = NULL;	result = ns_config_get(maps, "root-delegation-only", &obj);	if (result == ISC_R_SUCCESS) {		dns_view_setrootdelonly(view, ISC_TRUE);		if (!cfg_obj_isvoid(obj)) {			dns_fixedname_t fixed;			dns_name_t *name;			isc_buffer_t b;			char *str;			cfg_obj_t *exclude;			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));				CHECK(dns_name_fromtext(name, &b, dns_rootname,							ISC_FALSE, NULL));				CHECK(dns_view_excludedelegationonly(view,								     name));			}		}	} else		dns_view_setrootdelonly(view, ISC_FALSE);	result = ISC_R_SUCCESS; cleanup:	if (dispatch4 != NULL)		dns_dispatch_detach(&dispatch4);	if (dispatch6 != NULL)		dns_dispatch_detach(&dispatch6);	if (order != NULL)		dns_order_detach(&order);	if (cmctx != NULL)		isc_mem_detach(&cmctx);	if (cache != NULL)		dns_cache_detach(&cache);	return (result);}static isc_result_tconfigure_hints(dns_view_t *view, const char *filename) {	isc_result_t result;	dns_db_t *db;	db = NULL;	result = dns_rootns_create(view->mctx, view->rdclass, filename, &db);	if (result == ISC_R_SUCCESS) {		dns_view_sethints(view, db);		dns_db_detach(&db);	}	return (result);}static isc_result_tconfigure_alternates(cfg_obj_t *config, dns_view_t *view,		     cfg_obj_t *alternates){	cfg_obj_t *portobj;	cfg_obj_t *addresses;	cfg_listelt_t *element;	isc_result_t result = ISC_R_SUCCESS;	in_port_t port;	/*	 * Determine which port to send requests to.	 */	if (ns_g_lwresdonly && ns_g_port != 0)		port = ns_g_port;	else		CHECKM(ns_config_getport(config, &port), "port");	if (alternates != NULL) {		portobj = cfg_tuple_get(alternates, "port");		if (cfg_obj_isuint32(portobj)) {			isc_uint32_t val = cfg_obj_asuint32(portobj);			if (val > ISC_UINT16_MAX) {				cfg_obj_log(portobj, ns_g_lctx, ISC_LOG_ERROR,					    "port '%u' out of range", val);				return (ISC_R_RANGE);			}			port = (in_port_t) val;		}	}	addresses = NULL;	if (alternates != NULL)		addresses = cfg_tuple_get(alternates, "addresses");	for (element = cfg_list_first(addresses);	     element != NULL;	     element = cfg_list_next(element))	{		cfg_obj_t *alternate = cfg_listelt_value(element);		isc_sockaddr_t sa;		if (!cfg_obj_issockaddr(alternate)) {			dns_fixedname_t fixed;			dns_name_t *name;			char *str = cfg_obj_asstring(cfg_tuple_get(alternate,								   "name"));			isc_buffer_t buffer;			in_port_t myport = port;			isc_buffer_init(&buffer, str, strlen(str));			isc_buffer_add(&buffer, strlen(str));			dns_fixedname_init(&fixed);			name = dns_fixedname_name(&fixed);			CHECK(dns_name_fromtext(name, &buffer, dns_rootname,						ISC_FALSE, NULL));			portobj = cfg_tuple_get(alternate, "port");			if (cfg_obj_isuint32(portobj)) {				isc_uint32_t val = cfg_obj_asuint32(portobj);				if (val > ISC_UINT16_MAX) {					cfg_obj_log(portobj, ns_g_lctx,						    ISC_LOG_ERROR,						    "port '%u' out of range",						     val);					return (ISC_R_RANGE);				}				myport = (in_port_t) val;			}			CHECK(dns_resolver_addalternate(view->resolver, NULL,							name, myport));			continue;		}		sa = *cfg_obj_assockaddr(alternate);		if (isc_sockaddr_getport(&sa) == 0)			isc_sockaddr_setport(&sa, port);		CHECK(dns_resolver_addalternate(view->resolver, &sa,						NULL, 0));	} cleanup:	return (result);}static isc_result_tconfigure_forward(cfg_obj_t *config, dns_view_t *view, dns_name_t *origin,		  cfg_obj_t *forwarders, cfg_obj_t *forwardtype){	cfg_obj_t *portobj;	cfg_obj_t *faddresses;	cfg_listelt_t *element;	dns_fwdpolicy_t fwdpolicy = dns_fwdpolicy_none;	isc_sockaddrlist_t addresses;	isc_sockaddr_t *sa;	isc_result_t result;	in_port_t port;	/*	 * Determine which port to send forwarded requests to.	 */	if (ns_g_lwresdonly && ns_g_port != 0)		port = ns_g_port;	else		CHECKM(ns_config_getport(config, &port), "port");	if (forwarders != NULL) {		portobj = cfg_tuple_get(forwarders, "port");		if (cfg_obj_isuint32(portobj)) {			isc_uint32_t val = cfg_obj_asuint32(portobj);			if (val > ISC_UINT16_MAX) {				cfg_obj_log(portobj, ns_g_lctx, ISC_LOG_ERROR,					    "port '%u' out of range", val);				return (ISC_R_RANGE);			}			port = (in_port_t) val;		}	}	faddresses = NULL;	if (forwarders != NULL)		faddresses = cfg_tuple_get(forwarders, "addresses");	ISC_LIST_INIT(addresses);	for (element = cfg_list_first(faddresses);	     element != NULL;	     element = cfg_list_next(element))	{		cfg_obj_t *forwarder = cfg_listelt_value(element);		sa = isc_mem_get(view->mctx, sizeof(isc_sockaddr_t));		if (sa == NULL) {			result = ISC_R_NOMEMORY;			goto cleanup;		}		*sa = *cfg_obj_assockaddr(forwarder);		if (isc_sockaddr_getport(sa) == 0)			isc_sockaddr_setport(sa, port);		ISC_LINK_INIT(sa, link);		ISC_LIST_APPEND(addresses, sa, link);	}	if (ISC_LIST_EMPTY(addresses)) {		if (forwardtype != NULL)			cfg_obj_log(forwarders, ns_g_lctx, ISC_LOG_WARNING,

⌨️ 快捷键说明

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