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

📄 inetaddr.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
字号:
/*****************************************************************************

* InetAddr.c - 

*

* Copyright (c) 1983, 1990, 1993

*	The Regents of the University of California.  All rights reserved.

*

* Redistribution and use in source and binary forms, with or without

* modification, are permitted provided that the following conditions

* are met:

* 1. Redistributions of source code must retain the above copyright

*    notice, this list of conditions and the following disclaimer.

* 2. Redistributions in binary form must reproduce the above copyright

*    notice, this list of conditions and the following disclaimer in the

*    documentation and/or other materials provided with the distribution.

* 3. All advertising materials mentioning features or use of this software

*    must display the following acknowledgement:

*	This product includes software developed by the University of

*	California, Berkeley and its contributors.

* 4. Neither the name of the University nor the names of its contributors

*    may be used to endorse or promote products derived from this software

*    without specific prior written permission.

*

* portions Copyright (c) 2001 by Cognizant Pty Ltd.

*

* The authors hereby grant permission to use, copy, modify, distribute,

* and license this software and its documentation for any purpose, provided

* that existing copyright notices are retained in all copies and that this

* notice and the following disclaimer are included verbatim in any 

* distributions. No written agreement, license, or royalty fee is required

* for any of the authorized uses.

*

* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR

* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES

* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 

* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,

* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT

* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*

******************************************************************************

* REVISION HISTORY (please don't use tabs!)

*

*(yyyy-mm-dd)

* 2001-05-12 Robert Dickenson <odin@pnc.com.au>, Cognizant Pty Ltd.

*            Minor modifications to original file from NetBSD.

*

******************************************************************************

*/

#include "netconf.h"

#include <ctype.h>

#include "net.h"

#include "InetAddr.h"



/*

 * Ascii internet address interpretation routine.

 * The value returned is in network order.

 */



/*  */



static int isascii( char c);





/* inet_addr */

u_long inet_addr(register const char *cp)

{

	struct in_addr val;



	if (inet_aton(cp, &val))

		return (val.s_addr);

	return (INADDR_NONE);

}



/* 

 * Check whether "cp" is a valid ascii representation

 * of an Internet address and convert to a binary address.

 * Returns 1 if the address is valid, 0 if not.

 * This replaces inet_addr, the return value from which

 * cannot distinguish between failure and a local broadcast address.

 */

/*  */

/* inet_aton */

int inet_aton(register const char *cp, struct in_addr *addr)

{

	register u_long val;

	register int base, n;

	register char c;

	u_int parts[4];

	register u_int *pp = parts;



	c = *cp;

	for (;;) {

		/*

		 * Collect number up to ``.''.

		 * Values are specified as for C:

		 * 0x=hex, 0=octal, isdigit=decimal.

		 */

		if (!isdigit(c))

			return (0);

		val = 0; base = 10;

		if (c == '0') {

			c = *++cp;

			if (c == 'x' || c == 'X')

				base = 16, c = *++cp;

			else

				base = 8;

		}

		for (;;) {

			if (isascii(c) && isdigit(c)) {

				val = (val * base) + (c - '0');

				c = *++cp;

			} else if (base == 16 && isascii(c) && isxdigit(c)) {

				val = (val << 4) |

					(c + 10 - (islower(c) ? 'a' : 'A'));

				c = *++cp;

			} else

			break;

		}

		if (c == '.') {

			/*

			 * Internet format:

			 *	a.b.c.d

			 *	a.b.c	(with c treated as 16 bits)

			 *	a.b	(with b treated as 24 bits)

			 */

			if (pp >= parts + 3)

				return (0);

			*pp++ = val;

			c = *++cp;

		} else

			break;

	}

	/*

	 * Check for trailing characters.

	 */

	if (c != '\0' && (!isascii(c) || !isspace(c)))

		return (0);

	/*

	 * Concoct the address according to

	 * the number of parts specified.

	 */

	n = pp - parts + 1;

	switch (n) {



	case 0:

		return (0);		/* initial nondigit */



	case 1:				/* a -- 32 bits */

		break;



	case 2:				/* a.b -- 8.24 bits */

		if (val > 0xffffff)

			return (0);

		val |= parts[0] << 24;

		break;



	case 3:				/* a.b.c -- 8.8.16 bits */

		if (val > 0xffff)

			return (0);

		val |= (parts[0] << 24) | (parts[1] << 16);

		break;



	case 4:				/* a.b.c.d -- 8.8.8.8 bits */

		if (val > 0xff)

			return (0);

		val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);

		break;

	}

	if (addr)

		addr->s_addr = htonl(val);

	return (1);

}





static int isascii( char c)
{

	if (c>=0 && c<=127)
		return TRUE;
	else 
		return FALSE;

}



⌨️ 快捷键说明

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