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

📄 ns_name.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 1996,1999 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */#ifndef lintstatic const char rcsid[] = "$Id: ns_name.c,v 1.3.2.4.4.2 2004/05/04 03:27:47 marka Exp $";#endif#include "port_before.h"#include <sys/types.h>#include <netinet/in.h>#include <arpa/nameser.h>#include <errno.h>#include <resolv.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#include <limits.h>#include "port_after.h"#ifdef SPRINTF_CHAR# define SPRINTF(x) strlen(sprintf/**/x)#else# define SPRINTF(x) ((size_t)sprintf x)#endif#define NS_TYPE_ELT			0x40 /* EDNS0 extended label type */#define DNS_LABELTYPE_BITSTRING		0x41/* Data. */static const char	digits[] = "0123456789";static const char digitvalue[256] = {	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	/*16*/	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*32*/	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*48*/	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, /*64*/	-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*80*/	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*96*/	-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*112*/	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*128*/	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*256*/};/* Forward. */static int		special(int);static int		printable(int);static int		dn_find(const u_char *, const u_char *,				const u_char * const *,				const u_char * const *);static int		encode_bitsring(const char **, const char *,					unsigned char **, unsigned char **,					unsigned const char *);static int		labellen(const u_char *);static int		decode_bitstring(const unsigned char **,					 char *, const char *);/* Public. *//* * ns_name_ntop(src, dst, dstsiz) *	Convert an encoded domain name to printable ascii as per RFC1035. * return: *	Number of bytes written to buffer, or -1 (with errno set) * notes: *	The root is returned as "." *	All other domains are returned in non absolute form */intns_name_ntop(const u_char *src, char *dst, size_t dstsiz){	const u_char *cp;	char *dn, *eom;	u_char c;	u_int n;	int l;	cp = src;	dn = dst;	eom = dst + dstsiz;	while ((n = *cp++) != 0) {		if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) {			/* Some kind of compression pointer. */			errno = EMSGSIZE;			return (-1);		}		if (dn != dst) {			if (dn >= eom) {				errno = EMSGSIZE;				return (-1);			}			*dn++ = '.';		}		if ((l = labellen(cp - 1)) < 0) {			errno = EMSGSIZE; /* XXX */			return(-1);		}		if (dn + l >= eom) {			errno = EMSGSIZE;			return (-1);		}		if ((n & NS_CMPRSFLGS) == NS_TYPE_ELT) {			int m;			if (n != DNS_LABELTYPE_BITSTRING) {				/* XXX: labellen should reject this case */				errno = EINVAL;				return(-1);			}			if ((m = decode_bitstring(&cp, dn, eom)) < 0)			{				errno = EMSGSIZE;				return(-1);			}			dn += m; 			continue;		}		for ((void)NULL; l > 0; l--) {			c = *cp++;			if (special(c)) {				if (dn + 1 >= eom) {					errno = EMSGSIZE;					return (-1);				}				*dn++ = '\\';				*dn++ = (char)c;			} else if (!printable(c)) {				if (dn + 3 >= eom) {					errno = EMSGSIZE;					return (-1);				}				*dn++ = '\\';				*dn++ = digits[c / 100];				*dn++ = digits[(c % 100) / 10];				*dn++ = digits[c % 10];			} else {				if (dn >= eom) {					errno = EMSGSIZE;					return (-1);				}				*dn++ = (char)c;			}		}	}	if (dn == dst) {		if (dn >= eom) {			errno = EMSGSIZE;			return (-1);		}		*dn++ = '.';	}	if (dn >= eom) {		errno = EMSGSIZE;		return (-1);	}	*dn++ = '\0';	return (dn - dst);}/* * ns_name_pton(src, dst, dstsiz) *	Convert a ascii string into an encoded domain name as per RFC1035. * return: *	-1 if it fails *	1 if string was fully qualified *	0 is string was not fully qualified * notes: *	Enforces label and domain length limits. */intns_name_pton(const char *src, u_char *dst, size_t dstsiz){	u_char *label, *bp, *eom;	int c, n, escaped, e = 0;	char *cp;	escaped = 0;	bp = dst;	eom = dst + dstsiz;	label = bp++;	while ((c = *src++) != 0) {		if (escaped) {			if (c == '[') { /* start a bit string label */				if ((cp = strchr(src, ']')) == NULL) {					errno = EINVAL; /* ??? */					return(-1);				}				if ((e = encode_bitsring(&src, cp + 2,							 &label, &bp, eom))				    != 0) {					errno = e;					return(-1);				}				escaped = 0;				label = bp++;				if ((c = *src++) == 0)					goto done;				else if (c != '.') {					errno = EINVAL;					return(-1);				}				continue;			}			else if ((cp = strchr(digits, c)) != NULL) {				n = (cp - digits) * 100;				if ((c = *src++) == 0 ||				    (cp = strchr(digits, c)) == NULL) {					errno = EMSGSIZE;					return (-1);				}				n += (cp - digits) * 10;				if ((c = *src++) == 0 ||				    (cp = strchr(digits, c)) == NULL) {					errno = EMSGSIZE;					return (-1);				}				n += (cp - digits);				if (n > 255) {					errno = EMSGSIZE;					return (-1);				}				c = n;			}			escaped = 0;		} else if (c == '\\') {			escaped = 1;			continue;		} else if (c == '.') {			c = (bp - label - 1);			if ((c & NS_CMPRSFLGS) != 0) {	/* Label too big. */				errno = EMSGSIZE;				return (-1);			}			if (label >= eom) {				errno = EMSGSIZE;				return (-1);			}			*label = c;			/* Fully qualified ? */			if (*src == '\0') {				if (c != 0) {					if (bp >= eom) {						errno = EMSGSIZE;						return (-1);					}					*bp++ = '\0';				}				if ((bp - dst) > MAXCDNAME) {					errno = EMSGSIZE;					return (-1);				}				return (1);			}			if (c == 0 || *src == '.') {				errno = EMSGSIZE;				return (-1);			}			label = bp++;			continue;		}		if (bp >= eom) {			errno = EMSGSIZE;			return (-1);		}		*bp++ = (u_char)c;	}	c = (bp - label - 1);	if ((c & NS_CMPRSFLGS) != 0) {		/* Label too big. */		errno = EMSGSIZE;		return (-1);	}  done:	if (label >= eom) {		errno = EMSGSIZE;		return (-1);	}	*label = c;	if (c != 0) {		if (bp >= eom) {			errno = EMSGSIZE;			return (-1);		}		*bp++ = 0;	}	if ((bp - dst) > MAXCDNAME) {	/* src too big */		errno = EMSGSIZE;		return (-1);	}	return (0);}/* * ns_name_ntol(src, dst, dstsiz) *	Convert a network strings labels into all lowercase. * return: *	Number of bytes written to buffer, or -1 (with errno set) * notes: *	Enforces label and domain length limits. */intns_name_ntol(const u_char *src, u_char *dst, size_t dstsiz){	const u_char *cp;	u_char *dn, *eom;	u_char c;	u_int n;	int l;	cp = src;	dn = dst;	eom = dst + dstsiz;	if (dn >= eom) {		errno = EMSGSIZE;		return (-1);	}	while ((n = *cp++) != 0) {		if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) {			/* Some kind of compression pointer. */			errno = EMSGSIZE;			return (-1);		}		*dn++ = n;		if ((l = labellen(cp - 1)) < 0) {			errno = EMSGSIZE;			return (-1);		}		if (dn + l >= eom) {			errno = EMSGSIZE;			return (-1);		}		for ((void)NULL; l > 0; l--) {			c = *cp++;			if (isupper(c))				*dn++ = tolower(c);			else				*dn++ = c;		}	}	*dn++ = '\0';	return (dn - dst);}/* * ns_name_unpack(msg, eom, src, dst, dstsiz) *	Unpack a domain name from a message, source may be compressed. * return: *	-1 if it fails, or consumed octets if it succeeds. */intns_name_unpack(const u_char *msg, const u_char *eom, const u_char *src,	       u_char *dst, size_t dstsiz){	const u_char *srcp, *dstlim;	u_char *dstp;	int n, len, checked, l;	len = -1;	checked = 0;	dstp = dst;	srcp = src;	dstlim = dst + dstsiz;	if (srcp < msg || srcp >= eom) {		errno = EMSGSIZE;		return (-1);	}	/* Fetch next label in domain name. */	while ((n = *srcp++) != 0) {		/* Check for indirection. */		switch (n & NS_CMPRSFLGS) {		case 0:		case NS_TYPE_ELT:			/* Limit checks. */			if ((l = labellen(srcp - 1)) < 0) {				errno = EMSGSIZE;				return(-1);			}			if (dstp + l + 1 >= dstlim || srcp + l >= eom) {				errno = EMSGSIZE;				return (-1);			}			checked += l + 1;			*dstp++ = n;			memcpy(dstp, srcp, l);			dstp += l;			srcp += l;			break;		case NS_CMPRSFLGS:			if (srcp >= eom) {				errno = EMSGSIZE;				return (-1);			}			if (len < 0)				len = srcp - src + 1;			srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff));			if (srcp < msg || srcp >= eom) {  /* Out of range. */				errno = EMSGSIZE;				return (-1);			}			checked += 2;			/*			 * Check for loops in the compressed name;			 * if we've looked at the whole message,			 * there must be a loop.			 */			if (checked >= eom - msg) {				errno = EMSGSIZE;				return (-1);			}			break;		default:			errno = EMSGSIZE;			return (-1);			/* flag error */		}	}	*dstp = '\0';	if (len < 0)		len = srcp - src;	return (len);}/* * ns_name_pack(src, dst, dstsiz, dnptrs, lastdnptr) *	Pack domain name 'domain' into 'comp_dn'. * return: *	Size of the compressed name, or -1. * notes: *	'dnptrs' is an array of pointers to previous compressed names. *	dnptrs[0] is a pointer to the beginning of the message. The array *	ends with NULL. *	'lastdnptr' is a pointer to the end of the array pointed to *	by 'dnptrs'. * Side effects: *	The list of pointers in dnptrs is updated 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_pack(const u_char *src, u_char *dst, int dstsiz,	     const u_char **dnptrs, const u_char **lastdnptr){	u_char *dstp;	const u_char **cpp, **lpp, *eob, *msg;	const u_char *srcp;	int n, l, first = 1;	srcp = src;	dstp = dst;	eob = dstp + dstsiz;

⌨️ 快捷键说明

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