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

📄 inet_pton.c

📁 package of develop dns
💻 C
字号:
/* * 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. */#if defined(LIBC_SCCS) && !defined(lint)static const char rcsid[] = "$Id: inet_pton.c,v 1.2.206.1 2004/03/09 08:33:33 marka Exp $";#endif /* LIBC_SCCS and not lint */#include "port_before.h"#include <sys/param.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <arpa/nameser.h>#include <string.h>#include <errno.h>#include "port_after.h"/* * WARNING: Don't even consider trying to compile this on a system where * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX. */static int	inet_pton4 __P((const char *src, u_char *dst));static int	inet_pton6 __P((const char *src, u_char *dst));/* int * inet_pton(af, src, dst) *	convert from presentation format (which usually means ASCII printable) *	to network format (which is usually some kind of binary format). * return: *	1 if the address was valid for the specified address family *	0 if the address wasn't valid (`dst' is untouched in this case) *	-1 if some other error occurred (`dst' is untouched in this case, too) * author: *	Paul Vixie, 1996. */intinet_pton(af, src, dst)	int af;	const char *src;	void *dst;{	switch (af) {	case AF_INET:		return (inet_pton4(src, dst));	case AF_INET6:		return (inet_pton6(src, dst));	default:		errno = EAFNOSUPPORT;		return (-1);	}	/* NOTREACHED */}/* int * inet_pton4(src, dst) *	like inet_aton() but without all the hexadecimal and shorthand. * return: *	1 if `src' is a valid dotted quad, else 0. * notice: *	does not touch `dst' unless it's returning 1. * author: *	Paul Vixie, 1996. */static intinet_pton4(src, dst)	const char *src;	u_char *dst;{	static const char digits[] = "0123456789";	int saw_digit, octets, ch;	u_char tmp[NS_INADDRSZ], *tp;	saw_digit = 0;	octets = 0;	*(tp = tmp) = 0;	while ((ch = *src++) != '\0') {		const char *pch;		if ((pch = strchr(digits, ch)) != NULL) {			u_int new = *tp * 10 + (pch - digits);			if (saw_digit && *tp == 0)				return (0);			if (new > 255)				return (0);			*tp = new;			if (!saw_digit) {				if (++octets > 4)					return (0);				saw_digit = 1;			}		} else if (ch == '.' && saw_digit) {			if (octets == 4)				return (0);			*++tp = 0;			saw_digit = 0;		} else			return (0);	}	if (octets < 4)		return (0);	memcpy(dst, tmp, NS_INADDRSZ);	return (1);}/* int * inet_pton6(src, dst) *	convert presentation level address to network order binary form. * return: *	1 if `src' is a valid [RFC1884 2.2] address, else 0. * notice: *	(1) does not touch `dst' unless it's returning 1. *	(2) :: in a full address is silently ignored. * credit: *	inspired by Mark Andrews. * author: *	Paul Vixie, 1996. */static intinet_pton6(src, dst)	const char *src;	u_char *dst;{	static const char xdigits_l[] = "0123456789abcdef",			  xdigits_u[] = "0123456789ABCDEF";	u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;	const char *xdigits, *curtok;	int ch, saw_xdigit;	u_int val;	memset((tp = tmp), '\0', NS_IN6ADDRSZ);	endp = tp + NS_IN6ADDRSZ;	colonp = NULL;	/* Leading :: requires some special handling. */	if (*src == ':')		if (*++src != ':')			return (0);	curtok = src;	saw_xdigit = 0;	val = 0;	while ((ch = *src++) != '\0') {		const char *pch;		if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)			pch = strchr((xdigits = xdigits_u), ch);		if (pch != NULL) {			val <<= 4;			val |= (pch - xdigits);			if (val > 0xffff)				return (0);			saw_xdigit = 1;			continue;		}		if (ch == ':') {			curtok = src;			if (!saw_xdigit) {				if (colonp)					return (0);				colonp = tp;				continue;			} else if (*src == '\0') {				return (0);			}			if (tp + NS_INT16SZ > endp)				return (0);			*tp++ = (u_char) (val >> 8) & 0xff;			*tp++ = (u_char) val & 0xff;			saw_xdigit = 0;			val = 0;			continue;		}		if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&		    inet_pton4(curtok, tp) > 0) {			tp += NS_INADDRSZ;			saw_xdigit = 0;			break;	/* '\0' was seen by inet_pton4(). */		}		return (0);	}	if (saw_xdigit) {		if (tp + NS_INT16SZ > endp)			return (0);		*tp++ = (u_char) (val >> 8) & 0xff;		*tp++ = (u_char) val & 0xff;	}	if (colonp != NULL) {		/*		 * Since some memmove()'s erroneously fail to handle		 * overlapping regions, we'll do the shift by hand.		 */		const int n = tp - colonp;		int i;		if (tp == endp)			return (0);		for (i = 1; i <= n; i++) {			endp[- i] = colonp[n - i];			colonp[n - i] = 0;		}		tp = endp;	}	if (tp != endp)		return (0);	memcpy(dst, tmp, NS_IN6ADDRSZ);	return (1);}

⌨️ 快捷键说明

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