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

📄 ns_name.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
	lpp = cpp = NULL;	if (dnptrs != NULL) {		if ((msg = *dnptrs++) != NULL) {			for (cpp = dnptrs; *cpp != NULL; cpp++)				(void)NULL;			lpp = cpp;	/* end of list to search */		}	} else		msg = NULL;	/* make sure the domain we are about to add is legal */	l = 0;	do {		int l0;		n = *srcp;		if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) {			errno = EMSGSIZE;			return (-1);		}		if ((l0 = labellen(srcp)) < 0) {			errno = EINVAL;			return(-1);		}		l += l0 + 1;		if (l > MAXCDNAME) {			errno = EMSGSIZE;			return (-1);		}		srcp += l0 + 1;	} while (n != 0);	/* from here on we need to reset compression pointer array on error */	srcp = src;	do {		/* Look to see if we can use pointers. */		n = *srcp;		if (n != 0 && msg != NULL) {			l = dn_find(srcp, msg, (const u_char * const *)dnptrs,				    (const u_char * const *)lpp);			if (l >= 0) {				if (dstp + 1 >= eob) {					goto cleanup;				}				*dstp++ = (l >> 8) | NS_CMPRSFLGS;				*dstp++ = l % 256;				return (dstp - dst);			}			/* Not found, save it. */			if (lastdnptr != NULL && cpp < lastdnptr - 1 &&			    (dstp - msg) < 0x4000 && first) {				*cpp++ = dstp;				*cpp = NULL;				first = 0;			}		}		/* copy label to buffer */		if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) {			/* Should not happen. */			goto cleanup;		}		n = labellen(srcp);		if (dstp + 1 + n >= eob) {			goto cleanup;		}		memcpy(dstp, srcp, n + 1);		srcp += n + 1;		dstp += n + 1;	} while (n != 0);	if (dstp > eob) {cleanup:		if (msg != NULL)			*lpp = NULL;		errno = EMSGSIZE;		return (-1);	} 	return (dstp - dst);}/* * ns_name_uncompress(msg, eom, src, dst, dstsiz) *	Expand compressed domain name to presentation format. * return: *	Number of bytes read out of `src', or -1 (with errno set). * note: *	Root domain returns as "." not "". */intns_name_uncompress(const u_char *msg, const u_char *eom, const u_char *src,		   char *dst, size_t dstsiz){	u_char tmp[NS_MAXCDNAME];	int n;		if ((n = ns_name_unpack(msg, eom, src, tmp, sizeof tmp)) == -1)		return (-1);	if (ns_name_ntop(tmp, dst, dstsiz) == -1)		return (-1);	return (n);}/* * ns_name_compress(src, dst, dstsiz, dnptrs, lastdnptr) *	Compress a domain name into wire format, using compression pointers. * return: *	Number of bytes consumed in `dst' or -1 (with errno set). * notes: *	'dnptrs' is an array of pointers to previous compressed names. *	dnptrs[0] is a pointer to the beginning of the message. *	The list ends with NULL.  'lastdnptr' is a pointer to the end of the *	array pointed to by 'dnptrs'. Side effect is to update the list of *	pointers for labels inserted into the message as we compress the name. *	If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr' *	is NULL, we don't update the list. */intns_name_compress(const char *src, u_char *dst, size_t dstsiz,		 const u_char **dnptrs, const u_char **lastdnptr){	u_char tmp[NS_MAXCDNAME];	if (ns_name_pton(src, tmp, sizeof tmp) == -1)		return (-1);	return (ns_name_pack(tmp, dst, dstsiz, dnptrs, lastdnptr));}/* * Reset dnptrs so that there are no active references to pointers at or * after src. */voidns_name_rollback(const u_char *src, const u_char **dnptrs,		 const u_char **lastdnptr){	while (dnptrs < lastdnptr && *dnptrs != NULL) {		if (*dnptrs >= src) {			*dnptrs = NULL;			break;		}		dnptrs++;	}}/* * ns_name_skip(ptrptr, eom) *	Advance *ptrptr to skip over the compressed name it points at. * return: *	0 on success, -1 (with errno set) on failure. */intns_name_skip(const u_char **ptrptr, const u_char *eom){	const u_char *cp;	u_int n;	int l;	cp = *ptrptr;	while (cp < eom && (n = *cp++) != 0) {		/* Check for indirection. */		switch (n & NS_CMPRSFLGS) {		case 0:			/* normal case, n == len */			cp += n;			continue;		case NS_TYPE_ELT: /* EDNS0 extended label */			if ((l = labellen(cp - 1)) < 0) {				errno = EMSGSIZE; /* XXX */				return(-1);			}			cp += l;			continue;		case NS_CMPRSFLGS:	/* indirection */			cp++;			break;		default:		/* illegal type */			errno = EMSGSIZE;			return (-1);		}		break;	}	if (cp > eom) {		errno = EMSGSIZE;		return (-1);	}	*ptrptr = cp;	return (0);}/* Private. *//* * special(ch) *	Thinking in noninternationalized USASCII (per the DNS spec), *	is this characted special ("in need of quoting") ? * return: *	boolean. */static intspecial(int ch) {	switch (ch) {	case 0x22: /* '"' */	case 0x2E: /* '.' */	case 0x3B: /* ';' */	case 0x5C: /* '\\' */	case 0x28: /* '(' */	case 0x29: /* ')' */	/* Special modifiers in zone files. */	case 0x40: /* '@' */	case 0x24: /* '$' */		return (1);	default:		return (0);	}}/* * printable(ch) *	Thinking in noninternationalized USASCII (per the DNS spec), *	is this character visible and not a space when printed ? * return: *	boolean. */static intprintable(int ch) {	return (ch > 0x20 && ch < 0x7f);}/* *	Thinking in noninternationalized USASCII (per the DNS spec), *	convert this character to lower case if it's upper case. */static intmklower(int ch) {	if (ch >= 0x41 && ch <= 0x5A)		return (ch + 0x20);	return (ch);}/* * dn_find(domain, msg, dnptrs, lastdnptr) *	Search for the counted-label name in an array of compressed names. * return: *	offset from msg if found, or -1. * notes: *	dnptrs is the pointer to the first name on the list, *	not the pointer to the start of the message. */static intdn_find(const u_char *domain, const u_char *msg,	const u_char * const *dnptrs,	const u_char * const *lastdnptr){	const u_char *dn, *cp, *sp;	const u_char * const *cpp;	u_int n;	for (cpp = dnptrs; cpp < lastdnptr; cpp++) {		sp = *cpp;		/*		 * terminate search on:		 * root label		 * compression pointer		 * unusable offset		 */		while (*sp != 0 && (*sp & NS_CMPRSFLGS) == 0 &&		       (sp - msg) < 0x4000) {			dn = domain;			cp = sp;			while ((n = *cp++) != 0) {				/*				 * check for indirection				 */				switch (n & NS_CMPRSFLGS) {				case 0:		/* normal case, n == len */					n = labellen(cp - 1); /* XXX */					if (n != *dn++)						goto next;					for ((void)NULL; n > 0; n--)						if (mklower(*dn++) !=						    mklower(*cp++))							goto next;					/* Is next root for both ? */					if (*dn == '\0' && *cp == '\0')						return (sp - msg);					if (*dn)						continue;					goto next;				case NS_CMPRSFLGS:	/* indirection */					cp = msg + (((n & 0x3f) << 8) | *cp);					break;				default:	/* illegal type */					errno = EMSGSIZE;					return (-1);				}			} next: ;			sp += *sp + 1;		}	}	errno = ENOENT;	return (-1);}static intdecode_bitstring(const unsigned char **cpp, char *dn, const char *eom){	const unsigned char *cp = *cpp;	char *beg = dn, tc;	int b, blen, plen, i;	if ((blen = (*cp & 0xff)) == 0)		blen = 256;	plen = (blen + 3) / 4;	plen += sizeof("\\[x/]") + (blen > 99 ? 3 : (blen > 9) ? 2 : 1);	if (dn + plen >= eom)		return(-1);	cp++;	i = SPRINTF((dn, "\\[x"));	if (i < 0)		return (-1);	dn += i;	for (b = blen; b > 7; b -= 8, cp++) {		i = SPRINTF((dn, "%02x", *cp & 0xff));		if (i < 0)			return (-1);		dn += i;	}	if (b > 4) {		tc = *cp++;		i = SPRINTF((dn, "%02x", tc & (0xff << (8 - b))));		if (i < 0)			return (-1);		dn += i;	} else if (b > 0) {		tc = *cp++;		i = SPRINTF((dn, "%1x",			       ((tc >> 4) & 0x0f) & (0x0f << (4 - b)))); 		if (i < 0)			return (-1);		dn += i;	}	i = SPRINTF((dn, "/%d]", blen));	if (i < 0)		return (-1);	dn += i;	*cpp = cp;	return(dn - beg);}static intencode_bitsring(const char **bp, const char *end, unsigned char **labelp,	        unsigned char ** dst, unsigned const char *eom){	int afterslash = 0;	const char *cp = *bp;	unsigned char *tp;	char c;	const char *beg_blen;	char *end_blen = NULL;	int value = 0, count = 0, tbcount = 0, blen = 0;	beg_blen = end_blen = NULL;	/* a bitstring must contain at least 2 characters */	if (end - cp < 2)		return(EINVAL);	/* XXX: currently, only hex strings are supported */	if (*cp++ != 'x')		return(EINVAL);	if (!isxdigit((*cp) & 0xff)) /* reject '\[x/BLEN]' */		return(EINVAL);	for (tp = *dst + 1; cp < end && tp < eom; cp++) {		switch((c = *cp)) {		case ']':	/* end of the bitstring */			if (afterslash) {				if (beg_blen == NULL)					return(EINVAL);				blen = (int)strtol(beg_blen, &end_blen, 10);				if (*end_blen != ']')					return(EINVAL);			}			if (count)				*tp++ = ((value << 4) & 0xff);			cp++;	/* skip ']' */			goto done;		case '/':			afterslash = 1;			break;		default:			if (afterslash) {				if (!isdigit(c&0xff))					return(EINVAL);				if (beg_blen == NULL) {										if (c == '0') {						/* blen never begings with 0 */						return(EINVAL);					}					beg_blen = cp;				}			} else {				if (!isxdigit(c&0xff))					return(EINVAL);				value <<= 4;				value += digitvalue[(int)c];				count += 4;				tbcount += 4;				if (tbcount > 256)					return(EINVAL);				if (count == 8) {					*tp++ = value;					count = 0;				}			}			break;		}	}  done:	if (cp >= end || tp >= eom)		return(EMSGSIZE);	/*	 * bit length validation:	 * If a <length> is present, the number of digits in the <bit-data>	 * MUST be just sufficient to contain the number of bits specified	 * by the <length>. If there are insignificant bits in a final	 * hexadecimal or octal digit, they MUST be zero.	 * RFC 2673, Section 3.2.	 */	if (blen > 0) {		int traillen;		if (((blen + 3) & ~3) != tbcount)			return(EINVAL);		traillen = tbcount - blen; /* between 0 and 3 */		if (((value << (8 - traillen)) & 0xff) != 0)			return(EINVAL);	}	else		blen = tbcount;	if (blen == 256)		blen = 0;	/* encode the type and the significant bit fields */	**labelp = DNS_LABELTYPE_BITSTRING;	**dst = blen;	*bp = cp;	*dst = tp;	return(0);}static intlabellen(const u_char *lp){	int bitlen;	u_char l = *lp;	if ((l & NS_CMPRSFLGS) == NS_CMPRSFLGS) {		/* should be avoided by the caller */		return(-1);	}	if ((l & NS_CMPRSFLGS) == NS_TYPE_ELT) {		if (l == DNS_LABELTYPE_BITSTRING) {			if ((bitlen = *(lp + 1)) == 0)				bitlen = 256;			return((bitlen + 7 ) / 8 + 1);		}		return(-1);	/* unknwon ELT */	}	return(l);}

⌨️ 快捷键说明

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