inet.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 219 行

C
219
字号
#ifndef lintstatic	char	*sccsid = "@(#)inet.c	4.1	(ULTRIX)	7/2/90";#endif lint/************************************************************************ *									* *			Copyright (c) 1984,1988 by			* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************//* * Copyright (c) 1983 Regents of the University of California. * All rights reserved.  The Berkeley software License Agreement * specifies the terms and conditions for redistribution. *//*#ifndef lintstatic char sccsid[] = "inet.c	5.5 (Berkeley) 5/28/87";#endif not lint*//* * Temporarily, copy these routines from the kernel, * as we need to know about subnets. */#include "defs.h"extern struct interface *ifnet;/* * Formulate an Internet address from network + host. */struct in_addrinet_makeaddr(net, host)	u_long net, host;{	register struct interface *ifp;	register u_long mask;	u_long addr;	if (IN_CLASSA(net))		mask = IN_CLASSA_HOST;	else if (IN_CLASSB(net))		mask = IN_CLASSB_HOST;	else		mask = IN_CLASSC_HOST;	for (ifp = ifnet; ifp; ifp = ifp->int_next)		if ((ifp->int_netmask & net) == ifp->int_net) {			mask = ~ifp->int_subnetmask;			break;		}	addr = net | (host & mask);	addr = htonl(addr);	return (*(struct in_addr *)&addr);}/* * Return the network number from an internet address. */inet_netof(in)	struct in_addr in;{	register u_long i = ntohl(in.s_addr);	register u_long net;	register struct interface *ifp;	if (IN_CLASSA(i))		net = i & IN_CLASSA_NET;	else if (IN_CLASSB(i))		net = i & IN_CLASSB_NET;	else		net = i & IN_CLASSC_NET;	/*	 * Check whether network is a subnet;	 * if so, return subnet number.	 */	for (ifp = ifnet; ifp; ifp = ifp->int_next)		if ((ifp->int_netmask & net) == ifp->int_net)			return (i & ifp->int_subnetmask);	return (net);}/* * Return the host portion of an internet address. */inet_lnaof(in)	struct in_addr in;{	register u_long i = ntohl(in.s_addr);	register u_long net, host;	register struct interface *ifp;	if (IN_CLASSA(i)) {		net = i & IN_CLASSA_NET;		host = i & IN_CLASSA_HOST;	} else if (IN_CLASSB(i)) {		net = i & IN_CLASSB_NET;		host = i & IN_CLASSB_HOST;	} else {		net = i & IN_CLASSC_NET;		host = i & IN_CLASSC_HOST;	}	/*	 * Check whether network is a subnet;	 * if so, use the modified interpretation of `host'.	 */	for (ifp = ifnet; ifp; ifp = ifp->int_next)		if ((ifp->int_netmask & net) == ifp->int_net)			return (host &~ ifp->int_subnetmask);	return (host);}/* * Return RTF_HOST if the address is * for an Internet host, RTF_SUBNET for a subnet, * 0 for a network. */inet_rtflags(sin)	struct sockaddr_in *sin;{	register u_long i = ntohl(sin->sin_addr.s_addr);	register u_long net, host;	register struct interface *ifp;	if (IN_CLASSA(i)) {		net = i & IN_CLASSA_NET;		host = i & IN_CLASSA_HOST;	} else if (IN_CLASSB(i)) {		net = i & IN_CLASSB_NET;		host = i & IN_CLASSB_HOST;	} else {		net = i & IN_CLASSC_NET;		host = i & IN_CLASSC_HOST;	}	/*	 * Check whether this network is subnetted;	 * if so, check whether this is a subnet or a host.	 */	for (ifp = ifnet; ifp; ifp = ifp->int_next)		if (net == ifp->int_net) {			if (host &~ ifp->int_subnetmask)				return (RTF_HOST);			else if (ifp->int_subnetmask != ifp->int_netmask)				return (RTF_SUBNET);			else				return (0);		/* network */		}	if (host == 0)		return (0);	/* network */	else		return (RTF_HOST);}/* * Return true if a route to subnet/host of route rt should be sent to dst. * Send it only if dst is on the same logical network if not "internal", * otherwise only if the route is the "internal" route for the logical net. */inet_sendroute(rt, dst)	struct rt_entry *rt;	struct sockaddr_in *dst;{	register u_long r =	    ntohl(((struct sockaddr_in *)&rt->rt_dst)->sin_addr.s_addr);	register u_long d = ntohl(dst->sin_addr.s_addr);	if (IN_CLASSA(r)) {		if ((r & IN_CLASSA_NET) == (d & IN_CLASSA_NET)) {			if ((r & IN_CLASSA_HOST) == 0)				return ((rt->rt_state & RTS_INTERNAL) == 0);			return (1);		}		if (r & IN_CLASSA_HOST)			return (0);		return ((rt->rt_state & RTS_INTERNAL) != 0);	} else if (IN_CLASSB(r)) {		if ((r & IN_CLASSB_NET) == (d & IN_CLASSB_NET)) {			if ((r & IN_CLASSB_HOST) == 0)				return ((rt->rt_state & RTS_INTERNAL) == 0);			return (1);		}		if (r & IN_CLASSB_HOST)			return (0);		return ((rt->rt_state & RTS_INTERNAL) != 0);	} else {		if ((r & IN_CLASSC_NET) == (d & IN_CLASSC_NET)) {			if ((r & IN_CLASSC_HOST) == 0)				return ((rt->rt_state & RTS_INTERNAL) == 0);			return (1);		}		if (r & IN_CLASSC_HOST)			return (0);		return ((rt->rt_state & RTS_INTERNAL) != 0);	}}

⌨️ 快捷键说明

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