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

📄 res_findzonecut.c

📁 DHCP服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
			    ns_rr_class(rr) != class)				continue;			t = ns_rr_name(rr);			switch (sect) {			case ns_s_an:				if (ns_samedomain(dname, t) == 0) {					DPRINTF(("get_soa: %s'%s', '%s') == 0",						 "ns_samedomain(", dname, t));					return ISC_R_NOTZONE;				}				break;			case ns_s_ns:				if (ns_samename(dname, t) == 1 ||				    ns_samedomain(dname, t) == 0) {					DPRINTF(("get_soa: %smain('%s', '%s')",						 "ns_samename() || !ns_samedo",						 dname, t));					return ISC_R_NOTZONE;				}				break;			default:				abort();			}			if (strlen(t) + 1 > zsize) {				DPRINTF(("get_soa: zname(%d) too small (%d)",					 zsize, strlen(t) + 1));				return ISC_R_NOSPACE;			}			strcpy(zname, t);			rdata = ns_rr_rdata(rr);			rdlen = ns_rr_rdlen(rr);			if (ns_name_uncompress((u_char *)resp,					       ns_msg_end(msg), rdata,					       mname, msize) < 0) {				DPRINTF(("get_soa: %s failed",					 "ns_name_uncompress"));				return ISC_R_NOMEMORY;			}			rcode = save_ns(statp, &msg,					ns_s_ns, zname, class, nsrrsp);			if (rcode != ISC_R_SUCCESS) {				DPRINTF(("get_soa: save_ns failed"));				return rcode;			}			return ISC_R_SUCCESS;		}		/* If we're out of labels, then not even "." has an SOA! */		if (*dname == '\0')			break;		/* Find label-terminating "."; top of loop will skip it. */		while (*dname != '.') {			if (*dname == '\\')				if (*++dname == '\0') {					return ISC_R_NOSPACE;				}			dname++;		}	}	DPRINTF(("get_soa: out of labels"));	return ISC_R_DESTADDRREQ;}static isc_result_tget_ns(res_state statp, const char *zname, ns_class class, rrset_ns *nsrrsp) {	double resp[NS_PACKETSZ / sizeof (double)];	ns_msg msg;	int n;	isc_result_t rcode;	/* Go and get the NS RRs for this zone. */	rcode = do_query(statp, zname, class, ns_t_ns, resp, &msg, &n);	if (rcode != ISC_R_SUCCESS) {		DPRINTF(("get_ns: do_query('zname', %s) failed (%d)",			 zname, p_class(class), rcode));		return rcode;	}	/* Remember the NS RRs and associated A RRs that came back. */	rcode = save_ns(statp, &msg, ns_s_an, zname, class, nsrrsp);	if (rcode != ISC_R_SUCCESS) {		DPRINTF(("get_ns save_ns('%s', %s) failed",			 zname, p_class(class)));		return rcode;	}	return ISC_R_SUCCESS;}static isc_result_tget_glue(res_state statp, ns_class class, rrset_ns *nsrrsp) {	rr_ns *nsrr, *nsrr_n;	/* Go and get the A RRs for each empty NS RR on our list. */	for (nsrr = ISC_LIST_HEAD(*nsrrsp); nsrr != NULL; nsrr = nsrr_n) {		double resp[NS_PACKETSZ / sizeof (double)];		ns_msg msg;		int n;		isc_result_t rcode;		nsrr_n = ISC_LIST_NEXT(nsrr, link);		if (ISC_LIST_EMPTY(nsrr->addrs)) {			rcode = do_query(statp, nsrr->name, class, ns_t_a,					 resp, &msg, &n);			if (rcode != ISC_R_SUCCESS) {			    DPRINTF(("get_glue: do_query('%s', %s') failed",				     nsrr->name, p_class(class)));			    return rcode;			}			if (n > 0) {				DPRINTF((			"get_glue: do_query('%s', %s') CNAME or DNAME found",					 nsrr->name, p_class(class)));			}			rcode = save_a(statp, &msg, ns_s_an, nsrr->name, class,				       &nsrr->addrs);			if (rcode != ISC_R_SUCCESS) {				DPRINTF(("get_glue: save_r('%s', %s) failed",					 nsrr->name, p_class(class)));				return rcode;			}			/* If it's still empty, it's just chaff. */			if (ISC_LIST_EMPTY(nsrr->addrs)) {				DPRINTF(("get_glue: removing empty '%s' NS",					 nsrr->name));				free_nsrr(nsrrsp, nsrr);			}		}	}	return ISC_R_SUCCESS;}static isc_result_tsave_ns(res_state statp, ns_msg *msg, ns_sect sect,	const char *owner, ns_class class,	rrset_ns *nsrrsp){	int i;	isc_result_t rcode;	for (i = 0; i < ns_msg_count(*msg, sect); i++) {		char tname[MAXDNAME];		const u_char *rdata;		rr_ns *nsrr;		ns_rr rr;		int rdlen;		rcode = ns_parserr(msg, sect, i, &rr);		if (rcode != ISC_R_SUCCESS) {			DPRINTF(("save_ns: ns_parserr(%s, %d) failed",				 p_section(sect, ns_o_query), i));			return rcode;		}		if (ns_rr_type(rr) != ns_t_ns ||		    ns_rr_class(rr) != class ||		    ns_samename(ns_rr_name(rr), owner) != 1)			continue;		nsrr = find_ns(nsrrsp, ns_rr_name(rr));		if (nsrr == NULL) {			nsrr = malloc(sizeof *nsrr);			if (nsrr == NULL) {				DPRINTF(("save_ns: malloc failed"));				return ISC_R_NOMEMORY;			}			rdata = ns_rr_rdata(rr);			rdlen = ns_rr_rdlen(rr);			if (ns_name_uncompress(ns_msg_base(*msg),					       ns_msg_end(*msg), rdata,					       tname, sizeof tname) < 0) {				DPRINTF(("save_ns: ns_name_uncompress failed"));				free(nsrr);				return ISC_R_NOMEMORY;			}			nsrr->name = strdup(tname);			if (nsrr->name == NULL) {				DPRINTF(("save_ns: strdup failed"));				free(nsrr);				return ISC_R_NOMEMORY;			}			ISC_LIST_INIT(nsrr->addrs);			ISC_LIST_APPEND(*nsrrsp, nsrr, link);		}		rcode = save_a(statp, msg, ns_s_ar,			       nsrr->name, class, &nsrr->addrs);		if (rcode != ISC_R_SUCCESS) {			DPRINTF(("save_ns: save_r('%s', %s) failed",				 nsrr->name, p_class(class)));			return rcode;		}	}	return ISC_R_SUCCESS;}static isc_result_tsave_a(res_state statp, ns_msg *msg, ns_sect sect,       const char *owner, ns_class class,       rrset_a *arrsp){	int i;	isc_result_t rcode;	for (i = 0; i < ns_msg_count(*msg, sect); i++) {		ns_rr rr;		rr_a *arr;		rcode = ns_parserr(msg, sect, i, &rr);		if (rcode != ISC_R_SUCCESS) {			DPRINTF(("save_a: ns_parserr(%s, %d) failed",				 p_section(sect, ns_o_query), i));			return rcode;		}		if (ns_rr_type(rr) != ns_t_a ||		    ns_rr_class(rr) != class ||		    ns_samename(ns_rr_name(rr), owner) != 1 ||		    ns_rr_rdlen(rr) != NS_INADDRSZ)			continue;		arr = malloc(sizeof *arr);		if (arr == NULL) {			DPRINTF(("save_a: malloc failed"));			return ISC_R_NOMEMORY;		}		memcpy(&arr->addr, ns_rr_rdata(rr), NS_INADDRSZ);		ISC_LIST_APPEND(*arrsp, arr, link);	}	return ISC_R_SUCCESS;}static voidfree_nsrrset(rrset_ns *nsrrsp) {	rr_ns *nsrr;	while ((nsrr = ISC_LIST_HEAD(*nsrrsp)) != NULL)		free_nsrr(nsrrsp, nsrr);}static voidfree_nsrr(rrset_ns *nsrrsp, rr_ns *nsrr) {	rr_a *arr;	while ((arr = ISC_LIST_HEAD(nsrr->addrs)) != NULL) {		ISC_LIST_UNLINK(nsrr->addrs, arr, link);		free(arr);	}	free((char *)nsrr->name);	ISC_LIST_UNLINK(*nsrrsp, nsrr, link);	free(nsrr);}static rr_ns *find_ns(rrset_ns *nsrrsp, const char *dname) {	rr_ns *nsrr;	for (nsrr = ISC_LIST_HEAD(*nsrrsp);	     nsrr != NULL; nsrr = ISC_LIST_NEXT(nsrr, link))		if (ns_samename(nsrr->name, dname) == 1)			return (nsrr);	return (NULL);}static isc_result_tdo_query(res_state statp, const char *dname, ns_class class, ns_type qtype,	 double *resp, ns_msg *msg, int *alias_count){	double req[NS_PACKETSZ / sizeof (double)];	int i;	unsigned n;	isc_result_t status;	status = res_nmkquery(statp, ns_o_query, dname, class, qtype,			      NULL, 0, NULL, req, NS_PACKETSZ, &n);	if (status != ISC_R_SUCCESS) {		DPRINTF(("do_query: res_nmkquery failed"));		return status;	}	status = res_nsend(statp, req, n, resp, NS_PACKETSZ, &n);	if (status != ISC_R_SUCCESS) {		DPRINTF(("do_query: res_nsend failed"));		return status;	}	if (n == 0) {		DPRINTF(("do_query: res_nsend returned 0"));		return ISC_R_NOTFOUND;	}	if (ns_initparse((u_char *)resp, n, msg) < 0) {		DPRINTF(("do_query: ns_initparse failed"));		return ISC_R_NOSPACE;	}	n = 0;	for (i = 0; i < ns_msg_count(*msg, ns_s_an); i++) {		ns_rr rr;		status = ns_parserr(msg, ns_s_an, i, &rr);		if (status != ISC_R_SUCCESS) {			DPRINTF(("do_query: ns_parserr failed"));			return status;		}		n += (ns_rr_class(rr) == class &&		      (ns_rr_type(rr) == ns_t_cname ||		       ns_rr_type(rr) == ns_t_dname));	}	if (alias_count)		*alias_count = n;	return ISC_R_SUCCESS;}

⌨️ 快捷键说明

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