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

📄 server.c

📁 非常好的dns解析软件
💻 C
📖 第 1 页 / 共 5 页
字号:
get_view_querysource_dispatch(const cfg_obj_t **maps,			      int af, dns_dispatch_t **dispatchp){	isc_result_t result;	dns_dispatch_t *disp;	isc_sockaddr_t sa;	unsigned int attrs, attrmask;	const cfg_obj_t *obj = NULL;	/*	 * Make compiler happy.	 */	result = ISC_R_FAILURE;	switch (af) {	case AF_INET:		result = ns_config_get(maps, "query-source", &obj);		INSIST(result == ISC_R_SUCCESS);		break;	case AF_INET6:		result = ns_config_get(maps, "query-source-v6", &obj);		INSIST(result == ISC_R_SUCCESS);		break;	default:		INSIST(0);	}	sa = *(cfg_obj_assockaddr(obj));	INSIST(isc_sockaddr_pf(&sa) == af);	/*	 * If we don't support this address family, we're done!	 */	switch (af) {	case AF_INET:		result = isc_net_probeipv4();		break;	case AF_INET6:		result = isc_net_probeipv6();		break;	default:		INSIST(0);	}	if (result != ISC_R_SUCCESS)		return (ISC_R_SUCCESS);	/*	 * Try to find a dispatcher that we can share.	 */	attrs = 0;	attrs |= DNS_DISPATCHATTR_UDP;	switch (af) {	case AF_INET:		attrs |= DNS_DISPATCHATTR_IPV4;		break;	case AF_INET6:		attrs |= DNS_DISPATCHATTR_IPV6;		break;	}	attrmask = 0;	attrmask |= DNS_DISPATCHATTR_UDP;	attrmask |= DNS_DISPATCHATTR_TCP;	attrmask |= DNS_DISPATCHATTR_IPV4;	attrmask |= DNS_DISPATCHATTR_IPV6;	disp = NULL;	result = dns_dispatch_getudp(ns_g_dispatchmgr, ns_g_socketmgr,				     ns_g_taskmgr, &sa, 4096,				     1000, 32768, 16411, 16433,				     attrs, attrmask, &disp);	if (result != ISC_R_SUCCESS) {		isc_sockaddr_t any;		char buf[ISC_SOCKADDR_FORMATSIZE];		switch (af) {		case AF_INET:			isc_sockaddr_any(&any);			break;		case AF_INET6:			isc_sockaddr_any6(&any);			break;		}		if (isc_sockaddr_equal(&sa, &any))			return (ISC_R_SUCCESS);		isc_sockaddr_format(&sa, buf, sizeof(buf));		isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,			      NS_LOGMODULE_SERVER, ISC_LOG_ERROR,			      "could not get query source dispatcher (%s)",			      buf);		return (result);	}	*dispatchp = disp;	return (ISC_R_SUCCESS);}static isc_result_tconfigure_order(dns_order_t *order, const cfg_obj_t *ent) {	dns_rdataclass_t rdclass;	dns_rdatatype_t rdtype;	const cfg_obj_t *obj;	dns_fixedname_t fixed;	unsigned int mode = 0;	const char *str;	isc_buffer_t b;	isc_result_t result;	isc_boolean_t addroot;	result = ns_config_getclass(cfg_tuple_get(ent, "class"),				    dns_rdataclass_any, &rdclass);	if (result != ISC_R_SUCCESS)		return (result);	result = ns_config_gettype(cfg_tuple_get(ent, "type"),				   dns_rdatatype_any, &rdtype);	if (result != ISC_R_SUCCESS)		return (result);	obj = cfg_tuple_get(ent, "name");	if (cfg_obj_isstring(obj)) 		str = cfg_obj_asstring(obj);	else		str = "*";	addroot = ISC_TF(strcmp(str, "*") == 0);	isc_buffer_init(&b, str, strlen(str));	isc_buffer_add(&b, strlen(str));	dns_fixedname_init(&fixed);	result = dns_name_fromtext(dns_fixedname_name(&fixed), &b,				   dns_rootname, ISC_FALSE, NULL);	if (result != ISC_R_SUCCESS)		return (result);	obj = cfg_tuple_get(ent, "ordering");	INSIST(cfg_obj_isstring(obj));	str = cfg_obj_asstring(obj);	if (!strcasecmp(str, "fixed"))		mode = DNS_RDATASETATTR_FIXEDORDER;	else if (!strcasecmp(str, "random"))		mode = DNS_RDATASETATTR_RANDOMIZE;	else if (!strcasecmp(str, "cyclic"))		mode = 0;	else		INSIST(0);	/*	 * "*" should match everything including the root (BIND 8 compat).	 * As dns_name_matcheswildcard(".", "*.") returns FALSE add a	 * explicit entry for "." when the name is "*".	 */	if (addroot) {		result = dns_order_add(order, dns_rootname,				       rdtype, rdclass, mode);		if (result != ISC_R_SUCCESS)			return (result);	}	return (dns_order_add(order, dns_fixedname_name(&fixed),			      rdtype, rdclass, mode));}static isc_result_tconfigure_peer(const cfg_obj_t *cpeer, isc_mem_t *mctx, dns_peer_t **peerp) {	isc_netaddr_t na;	dns_peer_t *peer;	const cfg_obj_t *obj;	const char *str;	isc_result_t result;	unsigned int prefixlen;	cfg_obj_asnetprefix(cfg_map_getname(cpeer), &na, &prefixlen);	peer = NULL;	result = dns_peer_new(mctx, &na, &peer);	if (result != ISC_R_SUCCESS)		return (result);	obj = NULL;	(void)cfg_map_get(cpeer, "bogus", &obj);	if (obj != NULL)		CHECK(dns_peer_setbogus(peer, cfg_obj_asboolean(obj)));	obj = NULL;	(void)cfg_map_get(cpeer, "provide-ixfr", &obj);	if (obj != NULL)		CHECK(dns_peer_setprovideixfr(peer, cfg_obj_asboolean(obj)));	obj = NULL;	(void)cfg_map_get(cpeer, "request-ixfr", &obj);	if (obj != NULL)		CHECK(dns_peer_setrequestixfr(peer, cfg_obj_asboolean(obj)));	obj = NULL;	(void)cfg_map_get(cpeer, "edns", &obj);	if (obj != NULL)		CHECK(dns_peer_setsupportedns(peer, cfg_obj_asboolean(obj)));	obj = NULL;	(void)cfg_map_get(cpeer, "edns-udp-size", &obj);	if (obj != NULL) {		isc_uint32_t udpsize = cfg_obj_asuint32(obj);		if (udpsize < 512)			udpsize = 512;		if (udpsize > 4096)			udpsize = 4096;		CHECK(dns_peer_setudpsize(peer, (isc_uint16_t)udpsize));	}	obj = NULL;	(void)cfg_map_get(cpeer, "max-udp-size", &obj);	if (obj != NULL) {		isc_uint32_t udpsize = cfg_obj_asuint32(obj);		if (udpsize < 512)			udpsize = 512;		if (udpsize > 4096)			udpsize = 4096;		CHECK(dns_peer_setmaxudp(peer, (isc_uint16_t)udpsize));	}	obj = NULL;	(void)cfg_map_get(cpeer, "transfers", &obj);	if (obj != NULL)		CHECK(dns_peer_settransfers(peer, cfg_obj_asuint32(obj)));	obj = NULL;	(void)cfg_map_get(cpeer, "transfer-format", &obj);	if (obj != NULL) {		str = cfg_obj_asstring(obj);		if (strcasecmp(str, "many-answers") == 0)			CHECK(dns_peer_settransferformat(peer,							 dns_many_answers));		else if (strcasecmp(str, "one-answer") == 0)			CHECK(dns_peer_settransferformat(peer,							 dns_one_answer));		else			INSIST(0);	}	obj = NULL;	(void)cfg_map_get(cpeer, "keys", &obj);	if (obj != NULL) {		result = dns_peer_setkeybycharp(peer, cfg_obj_asstring(obj));		if (result != ISC_R_SUCCESS)			goto cleanup;	}	obj = NULL;	if (na.family == AF_INET)		(void)cfg_map_get(cpeer, "transfer-source", &obj);	else		(void)cfg_map_get(cpeer, "transfer-source-v6", &obj);	if (obj != NULL) {		result = dns_peer_settransfersource(peer,						    cfg_obj_assockaddr(obj));		if (result != ISC_R_SUCCESS)			goto cleanup;		ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj));	}	obj = NULL;	if (na.family == AF_INET)		(void)cfg_map_get(cpeer, "notify-source", &obj);	else		(void)cfg_map_get(cpeer, "notify-source-v6", &obj);	if (obj != NULL) {		result = dns_peer_setnotifysource(peer,						  cfg_obj_assockaddr(obj));		if (result != ISC_R_SUCCESS)			goto cleanup;		ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj));	}	obj = NULL;	if (na.family == AF_INET)		(void)cfg_map_get(cpeer, "query-source", &obj);	else		(void)cfg_map_get(cpeer, "query-source-v6", &obj);	if (obj != NULL) {		result = dns_peer_setquerysource(peer,						 cfg_obj_assockaddr(obj));		if (result != ISC_R_SUCCESS)			goto cleanup;		ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj));	}	*peerp = peer;	return (ISC_R_SUCCESS); cleanup:	dns_peer_detach(&peer);	return (result);}static isc_result_tdisable_algorithms(const cfg_obj_t *disabled, dns_resolver_t *resolver) {	isc_result_t result;	const cfg_obj_t *algorithms;	const cfg_listelt_t *element;	const char *str;	dns_fixedname_t fixed;	dns_name_t *name;	isc_buffer_t b;	dns_fixedname_init(&fixed);	name = dns_fixedname_name(&fixed);	str = cfg_obj_asstring(cfg_tuple_get(disabled, "name"));	isc_buffer_init(&b, str, strlen(str));	isc_buffer_add(&b, strlen(str));	CHECK(dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL));	algorithms = cfg_tuple_get(disabled, "algorithms");	for (element = cfg_list_first(algorithms);	     element != NULL;	     element = cfg_list_next(element))	{		isc_textregion_t r;		dns_secalg_t alg;		DE_CONST(cfg_obj_asstring(cfg_listelt_value(element)), r.base);		r.length = strlen(r.base);		result = dns_secalg_fromtext(&alg, &r);		if (result != ISC_R_SUCCESS) {			isc_uint8_t ui;			result = isc_parse_uint8(&ui, r.base, 10);			alg = ui;		}		if (result != ISC_R_SUCCESS) {			cfg_obj_log(cfg_listelt_value(element),				    ns_g_lctx, ISC_LOG_ERROR,				    "invalid algorithm");			CHECK(result);		}		CHECK(dns_resolver_disable_algorithm(resolver, name, alg));	} cleanup:	return (result);}static isc_boolean_ton_disable_list(const cfg_obj_t *disablelist, dns_name_t *zonename) {	const cfg_listelt_t *element;	dns_fixedname_t fixed;	dns_name_t *name;	isc_result_t result;	const cfg_obj_t *value;	const char *str;	isc_buffer_t b;	dns_fixedname_init(&fixed);	name = dns_fixedname_name(&fixed);		for (element = cfg_list_first(disablelist);	     element != NULL;	     element = cfg_list_next(element))	{		value = cfg_listelt_value(element);		str = cfg_obj_asstring(value);		isc_buffer_init(&b, str, strlen(str));		isc_buffer_add(&b, strlen(str));		result = dns_name_fromtext(name, &b, dns_rootname,					   ISC_TRUE, NULL);		RUNTIME_CHECK(result == ISC_R_SUCCESS);		if (dns_name_equal(name, zonename))			return (ISC_TRUE);	}	return (ISC_FALSE);}static voidcheck_dbtype(dns_zone_t **zonep, unsigned int dbtypec, const char **dbargv,	     isc_mem_t *mctx){	char **argv = NULL;	unsigned int i;	isc_result_t result;	result = dns_zone_getdbtype(*zonep, &argv, mctx);	if (result != ISC_R_SUCCESS) {		dns_zone_detach(zonep);		return;	}	/*	 * Check that all the arguments match.	 */	for (i = 0; i < dbtypec; i++)		if (argv[i] == NULL || strcmp(argv[i], dbargv[i]) != 0) {			dns_zone_detach(zonep);			break;		}	/*	 * Check that there are not extra arguments.	 */	if (i == dbtypec && argv[i] != NULL)		dns_zone_detach(zonep);	isc_mem_free(mctx, argv);}/* * Configure 'view' according to 'vconfig', taking defaults from 'config' * where values are missing in 'vconfig'. * * When configuring the default view, 'vconfig' will be NULL and the * global defaults in 'config' used exclusively. */static isc_result_tconfigure_view(dns_view_t *view, const cfg_obj_t *config,	       const cfg_obj_t *vconfig, isc_mem_t *mctx,	       cfg_aclconfctx_t *actx, isc_boolean_t need_hints){	const cfg_obj_t *maps[4];	const cfg_obj_t *cfgmaps[3];	const cfg_obj_t *options = NULL;	const cfg_obj_t *voptions = NULL;	const cfg_obj_t *forwardtype;	const cfg_obj_t *forwarders;	const cfg_obj_t *alternates;	const cfg_obj_t *zonelist;#ifdef DLZ 	const cfg_obj_t *dlz; 	unsigned int dlzargc; 	char **dlzargv;#endif	const cfg_obj_t *disabled;	const cfg_obj_t *obj;	const cfg_listelt_t *element;	in_port_t port;	dns_cache_t *cache = NULL;	isc_result_t result;	isc_uint32_t max_adb_size;	isc_uint32_t max_cache_size;	isc_uint32_t max_acache_size;	isc_uint32_t lame_ttl;	dns_tsig_keyring_t *ring;	dns_view_t *pview = NULL;	/* Production view */	isc_mem_t *cmctx;	dns_dispatch_t *dispatch4 = NULL;	dns_dispatch_t *dispatch6 = NULL;	isc_boolean_t reused_cache = ISC_FALSE;	int i;	const char *str;	dns_order_t *order = NULL;	isc_uint32_t udpsize;	unsigned int check = 0;	dns_zone_t *zone = NULL;	isc_uint32_t max_clients_per_query;	const char *sep = ": view ";	const char *viewname = view->name;	const char *forview = " for view ";	isc_boolean_t rfc1918;	isc_boolean_t empty_zones_enable;	const cfg_obj_t *disablelist = NULL;	REQUIRE(DNS_VIEW_VALID(view));	cmctx = NULL;	if (config != NULL)		(void)cfg_map_get(config, "options", &options);	i = 0;	if (vconfig != NULL) {		voptions = cfg_tuple_get(vconfig, "options");		maps[i++] = voptions;	}	if (options != NULL)		maps[i++] = options;	maps[i++] = ns_g_defaults;	maps[i] = NULL;	i = 0;	if (voptions != NULL)		cfgmaps[i++] = voptions;	if (config != NULL)		cfgmaps[i++] = config;	cfgmaps[i] = NULL;	if (!strcmp(viewname, "_default")) {		sep = "";		viewname = "";

⌨️ 快捷键说明

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