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

📄 nsupdate.c

📁 bind-3.2.
💻 C
📖 第 1 页 / 共 4 页
字号:
		servers = isc_mem_get(mctx, ns_total * sizeof(isc_sockaddr_t));		if (servers == NULL)			fatal("out of memory");		for (i = 0; i < ns_total; i++) {			if (lwconf->nameservers[i].family == LWRES_ADDRTYPE_V4) {				struct in_addr in4;				memcpy(&in4, lwconf->nameservers[i].address, 4);				isc_sockaddr_fromin(&servers[i], &in4, DNSDEFAULTPORT);			} else {				struct in6_addr in6;				memcpy(&in6, lwconf->nameservers[i].address, 16);				isc_sockaddr_fromin6(&servers[i], &in6,						     DNSDEFAULTPORT);			}		}	}	result = isc_entropy_create(mctx, &entp);	check_result(result, "isc_entropy_create");	result = isc_hash_create(mctx, entp, DNS_NAME_MAXWIRE);	check_result(result, "isc_hash_create");	isc_hash_init();	result = dns_dispatchmgr_create(mctx, entp, &dispatchmgr);	check_result(result, "dns_dispatchmgr_create");	result = isc_socketmgr_create(mctx, &socketmgr);	check_result(result, "dns_socketmgr_create");	result = isc_timermgr_create(mctx, &timermgr);	check_result(result, "dns_timermgr_create");	result = isc_taskmgr_create(mctx, 1, 0, &taskmgr);	check_result(result, "isc_taskmgr_create");	result = isc_task_create(taskmgr, 0, &global_task);	check_result(result, "isc_task_create");	result = isc_task_onshutdown(global_task, shutdown_program, NULL);	check_result(result, "isc_task_onshutdown");	result = dst_lib_init(mctx, entp, 0);	check_result(result, "dst_lib_init");	is_dst_up = ISC_TRUE;	attrmask = DNS_DISPATCHATTR_UDP | DNS_DISPATCHATTR_TCP;	attrmask |= DNS_DISPATCHATTR_IPV4 | DNS_DISPATCHATTR_IPV6;	if (have_ipv6) {		attrs = DNS_DISPATCHATTR_UDP;		attrs |= DNS_DISPATCHATTR_MAKEQUERY;		attrs |= DNS_DISPATCHATTR_IPV6;		isc_sockaddr_any6(&bind_any6);		result = dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr,					     &bind_any6, PACKETSIZE,					     4, 2, 3, 5,					     attrs, attrmask, &dispatchv6);		check_result(result, "dns_dispatch_getudp (v6)");	}	if (have_ipv4) {		attrs = DNS_DISPATCHATTR_UDP;		attrs |= DNS_DISPATCHATTR_MAKEQUERY;		attrs |= DNS_DISPATCHATTR_IPV4;		isc_sockaddr_any(&bind_any);		result = dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr,					     &bind_any, PACKETSIZE,					     4, 2, 3, 5,					     attrs, attrmask, &dispatchv4);		check_result(result, "dns_dispatch_getudp (v4)");	}	result = dns_requestmgr_create(mctx, timermgr,				       socketmgr, taskmgr, dispatchmgr,				       dispatchv4, dispatchv6, &requestmgr);	check_result(result, "dns_requestmgr_create");	if (lwconf->domainname != NULL) {		dns_fixedname_init(&resolvdomain);		isc_buffer_init(&buf, lwconf->domainname,				strlen(lwconf->domainname));		isc_buffer_add(&buf, strlen(lwconf->domainname));		result = dns_name_fromtext(dns_fixedname_name(&resolvdomain),					   &buf, dns_rootname, ISC_FALSE,					   NULL);		check_result(result, "dns_name_fromtext");		origin = dns_fixedname_name(&resolvdomain);	}	else		origin = dns_rootname;	if (keystr != NULL)		setup_keystr();	else if (keyfile != NULL)		setup_keyfile();}static voidget_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) {	struct in_addr in4;	struct in6_addr in6;#ifdef USE_GETADDRINFO	struct addrinfo *res = NULL, hints;	int result;#else	struct hostent *he;#endif	ddebug("get_address()");	/*	 * Assume we have v4 if we don't have v6, since setup_libs	 * fatal()'s out if we don't have either.	 */	if (have_ipv6 && inet_pton(AF_INET6, host, &in6) == 1)		isc_sockaddr_fromin6(sockaddr, &in6, port);	else if (inet_pton(AF_INET, host, &in4) == 1)		isc_sockaddr_fromin(sockaddr, &in4, port);	else {#ifdef USE_GETADDRINFO		memset(&hints, 0, sizeof(hints));		if (!have_ipv6)			hints.ai_family = PF_INET;		else if (!have_ipv4)			hints.ai_family = PF_INET6;		else {			hints.ai_family = PF_UNSPEC;#ifdef AI_ADDRCONFIG			hints.ai_flags = AI_ADDRCONFIG;#endif		}		debug ("before getaddrinfo()");		isc_app_block();#ifdef AI_ADDRCONFIG again:#endif		result = getaddrinfo(host, NULL, &hints, &res);#ifdef AI_ADDRCONFIG		if (result == EAI_BADFLAGS &&		    (hints.ai_flags & AI_ADDRCONFIG) != 0) {			hints.ai_flags &= ~AI_ADDRCONFIG;			goto again;		}#endif		isc_app_unblock();		if (result != 0) {			fatal("couldn't find server '%s': %s",			      host, gai_strerror(result));		}		memcpy(&sockaddr->type.sa,res->ai_addr, res->ai_addrlen);		sockaddr->length = res->ai_addrlen;		isc_sockaddr_setport(sockaddr, port);		freeaddrinfo(res);#else		debug ("before gethostbyname()");		isc_app_block();		he = gethostbyname(host);		isc_app_unblock();		if (he == NULL)		     fatal("couldn't find server '%s' (h_errno=%d)",			   host, h_errno);		INSIST(he->h_addrtype == AF_INET);		isc_sockaddr_fromin(sockaddr,				    (struct in_addr *)(he->h_addr_list[0]),				    port);#endif	}}static voidparse_args(int argc, char **argv) {	int ch;	isc_result_t result;	debug("parse_args");	while ((ch = isc_commandline_parse(argc, argv, "dDMy:vk:")) != -1) {		switch (ch) {		case 'd':			debugging = ISC_TRUE;			break;		case 'D': /* was -dd */			debugging = ISC_TRUE;			ddebugging = ISC_TRUE;			break;		case 'M': /* was -dm */			debugging = ISC_TRUE;			ddebugging = ISC_TRUE;			memdebugging = ISC_TRUE;			isc_mem_debugging = ISC_MEM_DEBUGTRACE |					    ISC_MEM_DEBUGRECORD;			break;		case 'y':			keystr = isc_commandline_argument;			break;		case 'v':			usevc = ISC_TRUE;			break;		case 'k':			keyfile = isc_commandline_argument;			break;		default:			fprintf(stderr, "%s: invalid argument -%c\n",				argv[0], ch);			fprintf(stderr, "usage: nsupdate [-d] "				"[-y keyname:secret | -k keyfile] [-v] "				"[filename]\n");			exit(1);		}	}	if (keyfile != NULL && keystr != NULL) {		fprintf(stderr, "%s: cannot specify both -k and -y\n",			argv[0]);		exit(1);	}	if (argv[isc_commandline_index] != NULL) {		if (strcmp(argv[isc_commandline_index], "-") == 0) {			input = stdin;		} else {			result = isc_stdio_open(argv[isc_commandline_index],						"r", &input);			if (result != ISC_R_SUCCESS) {				fprintf(stderr, "could not open '%s': %s\n",					argv[isc_commandline_index],					isc_result_totext(result));				exit(1);			}		}		interactive = ISC_FALSE;	}}static isc_uint16_tparse_name(char **cmdlinep, dns_message_t *msg, dns_name_t **namep) {	isc_result_t result;	char *word;	isc_buffer_t *namebuf = NULL;	isc_buffer_t source;	unsigned int dots;	isc_boolean_t last;	dns_name_t *rn;	word = nsu_strsep(cmdlinep, " \t\r\n");	if (*word == 0) {		fprintf(stderr, "could not read owner name\n");		return (STATUS_SYNTAX);	}	result = dns_message_gettempname(msg, namep);	check_result(result, "dns_message_gettempname");	result = isc_buffer_allocate(mctx, &namebuf, NAMEBUF);	check_result(result, "isc_buffer_allocate");	dns_name_init(*namep, NULL);	dns_name_setbuffer(*namep, namebuf);	dns_message_takebuffer(msg, &namebuf);	isc_buffer_init(&source, word, strlen(word));	isc_buffer_add(&source, strlen(word));	dots = count_dots(word, &last);	if (dots > lwconf->ndots || last)		rn = dns_rootname;	else if (userzone != NULL)		rn = userzone;	else		rn = origin;	result = dns_name_fromtext(*namep, &source, rn,				   ISC_FALSE, NULL);	check_result(result, "dns_name_fromtext");	isc_buffer_invalidate(&source);	return (STATUS_MORE);}static isc_uint16_tparse_rdata(char **cmdlinep, dns_rdataclass_t rdataclass,	    dns_rdatatype_t rdatatype, dns_message_t *msg,	    dns_rdata_t *rdata){	char *cmdline = *cmdlinep;	isc_buffer_t source, *buf = NULL, *newbuf = NULL;	isc_region_t r;	isc_lex_t *lex = NULL;	dns_rdatacallbacks_t callbacks;	isc_result_t result;	dns_name_t *rn;	while (*cmdline != 0 && isspace((unsigned char)*cmdline))		cmdline++;	if (*cmdline != 0) {		dns_rdatacallbacks_init(&callbacks);		if (userzone != NULL)			rn = userzone;		else			rn = origin;		result = isc_lex_create(mctx, strlen(cmdline), &lex);		check_result(result, "isc_lex_create");		isc_buffer_init(&source, cmdline, strlen(cmdline));		isc_buffer_add(&source, strlen(cmdline));		result = isc_lex_openbuffer(lex, &source);		check_result(result, "isc_lex_openbuffer");		result = isc_buffer_allocate(mctx, &buf, MAXWIRE);		check_result(result, "isc_buffer_allocate");		result = dns_rdata_fromtext(rdata, rdataclass, rdatatype, lex,					    rn, ISC_FALSE, mctx, buf,					    &callbacks);		isc_lex_destroy(&lex);		if (result == ISC_R_SUCCESS) {			isc_buffer_usedregion(buf, &r);			result = isc_buffer_allocate(mctx, &newbuf, r.length);			check_result(result, "isc_buffer_allocate");			isc_buffer_putmem(newbuf, r.base, r.length);			isc_buffer_usedregion(newbuf, &r);			dns_rdata_fromregion(rdata, rdataclass, rdatatype, &r);			isc_buffer_free(&buf);			dns_message_takebuffer(msg, &newbuf);		} else {			fprintf(stderr, "invalid rdata format: %s\n",				isc_result_totext(result));			isc_buffer_free(&buf);			return (STATUS_SYNTAX);		}	} else {		rdata->flags = DNS_RDATA_UPDATE;	}	*cmdlinep = cmdline;	return (STATUS_MORE);}static isc_uint16_tmake_prereq(char *cmdline, isc_boolean_t ispositive, isc_boolean_t isrrset) {	isc_result_t result;	char *word;	dns_name_t *name = NULL;	isc_textregion_t region;	dns_rdataset_t *rdataset = NULL;	dns_rdatalist_t *rdatalist = NULL;	dns_rdataclass_t rdataclass;	dns_rdatatype_t rdatatype;	dns_rdata_t *rdata = NULL;	isc_uint16_t retval;	ddebug("make_prereq()");	/*	 * Read the owner name	 */	retval = parse_name(&cmdline, updatemsg, &name);	if (retval != STATUS_MORE)		return (retval);	/*	 * If this is an rrset prereq, read the class or type.	 */	if (isrrset) {		word = nsu_strsep(&cmdline, " \t\r\n");		if (*word == 0) {			fprintf(stderr, "could not read class or type\n");			goto failure;		}		region.base = word;		region.length = strlen(word);		result = dns_rdataclass_fromtext(&rdataclass, &region);		if (result == ISC_R_SUCCESS) {			/*			 * Now read the type.			 */			word = nsu_strsep(&cmdline, " \t\r\n");			if (*word == 0) {				fprintf(stderr, "could not read type\n");				goto failure;			}			region.base = word;			region.length = strlen(word);			result = dns_rdatatype_fromtext(&rdatatype, &region);			if (result != ISC_R_SUCCESS) {				fprintf(stderr, "invalid type: %s\n", word);				goto failure;			}		} else {			rdataclass = dns_rdataclass_in;			result = dns_rdatatype_fromtext(&rdatatype, &region);			if (result != ISC_R_SUCCESS) {				fprintf(stderr, "invalid type: %s\n", word);				goto failure;			}		}	} else		rdatatype = dns_rdatatype_any;	result = dns_message_gettemprdata(updatemsg, &rdata);	check_result(result, "dns_message_gettemprdata");	rdata->data = NULL;	rdata->length = 0;	if (isrrset && ispositive) {		retval = parse_rdata(&cmdline, rdataclass, rdatatype,				     updatemsg, rdata);		if (retval != STATUS_MORE)			goto failure;	} else		rdata->flags = DNS_RDATA_UPDATE;	result = dns_message_gettemprdatalist(updatemsg, &rdatalist);	check_result(result, "dns_message_gettemprdatalist");	result = dns_message_gettemprdataset(updatemsg, &rdataset);	check_result(result, "dns_message_gettemprdataset");	dns_rdatalist_init(rdatalist);	rdatalist->type = rdatatype;	if (ispositive) {		if (isrrset && rdata->data != NULL)			rdatalist->rdclass = rdataclass;		else			rdatalist->rdclass = dns_rdataclass_any;	} else		rdatalist->rdclass = dns_rdataclass_none;	rdatalist->covers = 0;	rdatalist->ttl = 0;	rdata->rdclass = rdatalist->rdclass;	rdata->type = rdatatype;	ISC_LIST_INIT(rdatalist->rdata);	ISC_LIST_APPEND(rdatalist->rdata, rdata, link);	dns_rdataset_init(rdataset);	dns_rdatalist_tordataset(rdatalist, rdataset);	ISC_LIST_INIT(name->list);	ISC_LIST_APPEND(name->list, rdataset, link);	dns_message_addname(updatemsg, name, DNS_SECTION_PREREQUISITE);	return (STATUS_MORE); failure:	if (name != NULL)		dns_message_puttempname(updatemsg, &name);	return (STATUS_SYNTAX);}static isc_uint16_tevaluate_prereq(char *cmdline) {	char *word;	isc_boolean_t ispositive, isrrset;	ddebug("evaluate_prereq()");	word = nsu_strsep(&cmdline, " \t\r\n");	if (*word == 0) {		fprintf(stderr, "could not read operation code\n");		return (STATUS_SYNTAX);	}	if (strcasecmp(word, "nxdomain") == 0) {		ispositive = ISC_FALSE;		isrrset = ISC_FALSE;	} else if (strcasecmp(word, "yxdomain") == 0) {		ispositive = ISC_TRUE;		isrrset = ISC_FALSE;	} else if (strcasecmp(word, "nxrrset") == 0) {		ispositive = ISC_FALSE;		isrrset = ISC_TRUE;	} else if (strcasecmp(word, "yxrrset") == 0) {		ispositive = ISC_TRUE;		isrrset = ISC_TRUE;	} else {		fprintf(stderr, "incorrect operation code: %s\n", word);		return (STATUS_SYNTAX);	}	return (make_prereq(cmdline, ispositive, isrrset));}static isc_uint16_tevaluate_server(char *cmdline) {	char *word, *server;	long port;	word = nsu_strsep(&cmdline, " \t\r\n");	if (*word == 0) {		fprintf(stderr, "could not read server name\n");

⌨️ 快捷键说明

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