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

📄 xdr_mbuf.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic char *sccsid = "@(#)xdr_mbuf.c	4.1	ULTRIX	7/2/90";#endif lint/************************************************************************ *									* *			Copyright (c) 1986 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.	* *									* ************************************************************************//* *	Portions of this software have been licensed to  *	Digital Equipment Company, Maynard, MA. *	Copyright (c) 1986 Sun Microsystems, Inc.  ALL RIGHTS RESERVED. *//* * xdr_mbuf.c, XDR implementation on kernel mbufs. * *  * */#include "../h/param.h"#include "../h/mbuf.h"#include "../rpc/types.h"#include "../rpc/xdr.h"#include "../netinet/in.h"#include "../h/uio.h"bool_t	xdrmbuf_getlong(), xdrmbuf_putlong();bool_t	xdrmbuf_getbytes(), xdrmbuf_putbytes();u_int	xdrmbuf_getpos();bool_t	xdrmbuf_setpos();long *	xdrmbuf_inline();void	xdrmbuf_destroy();/* * Xdr on mbufs operations vector. */struct	xdr_ops xdrmbuf_ops = {	xdrmbuf_getlong,	xdrmbuf_putlong,	xdrmbuf_getbytes,	xdrmbuf_putbytes,	xdrmbuf_getpos,	xdrmbuf_setpos,	xdrmbuf_inline,	xdrmbuf_destroy};/* * Initailize xdr stream. */voidxdrmbuf_init(xdrs, m, op)	register XDR		*xdrs;	register struct mbuf	*m;	enum xdr_op		 op;{	xdrs->x_op = op;	xdrs->x_ops = &xdrmbuf_ops;	xdrs->x_base = (caddr_t)m;	xdrs->x_private = mtod(m, caddr_t);	xdrs->x_public = (caddr_t)0;	xdrs->x_handy = m->m_len;}void/* ARGSUSED */xdrmbuf_destroy(xdrs)	XDR	*xdrs;{	/* do nothing */}bool_txdrmbuf_getlong(xdrs, lp)	register XDR	*xdrs;	long		*lp;{	if ((xdrs->x_handy -= sizeof(long)) < 0) {		if (xdrs->x_handy != -sizeof(long))			printf("xdr_mbuf: long crosses mbufs!\n");		if (xdrs->x_base) {			register struct mbuf *m =			    ((struct mbuf *)xdrs->x_base)->m_next;			xdrs->x_base = (caddr_t)m;			if (m == NULL)				return (FALSE);			xdrs->x_private = mtod(m, caddr_t);			xdrs->x_handy = m->m_len - sizeof(long);		} else {			return (FALSE);		}	}	*lp = ntohl(*((long *)(xdrs->x_private)));	xdrs->x_private += sizeof(long);	return (TRUE);}bool_txdrmbuf_putlong(xdrs, lp)	register XDR	*xdrs;	long		*lp;{	if ((xdrs->x_handy -= sizeof(long)) < 0) {		if (xdrs->x_handy != -sizeof(long))			printf("xdr_mbuf: putlong, long crosses mbufs!\n");		if (xdrs->x_base) {			register struct mbuf *m =			    ((struct mbuf *)xdrs->x_base)->m_next;			xdrs->x_base = (caddr_t)m;			if (m == NULL)				return (FALSE);			xdrs->x_private = mtod(m, caddr_t);			xdrs->x_handy = m->m_len - sizeof(long);		} else {			return (FALSE);		}	}	*(long *)xdrs->x_private = htonl(*lp);	xdrs->x_private += sizeof(long);	return (TRUE);}bool_txdrmbuf_getbytes(xdrs, addr, len)	register XDR	*xdrs;	caddr_t		 addr;	register u_int	 len;{	while ((xdrs->x_handy -= len) < 0) {		if ((xdrs->x_handy += len) > 0) {			bcopy(xdrs->x_private, addr, (u_int)xdrs->x_handy);			addr += xdrs->x_handy;			len -= xdrs->x_handy;		}		if (xdrs->x_base) {			register struct mbuf *m =			    ((struct mbuf *)xdrs->x_base)->m_next;			xdrs->x_base = (caddr_t)m;			if (m == NULL)				return (FALSE);			xdrs->x_private = mtod(m, caddr_t);			xdrs->x_handy = m->m_len;		} else {			return (FALSE);		}	}	bcopy(xdrs->x_private, addr, (u_int)len);	xdrs->x_private += len;	return (TRUE);}/* * Sort of like getbytes except that instead of getting * bytes we return the mbuf that contains all the rest * of the bytes. */bool_txdrmbuf_getmbuf(xdrs, mm, lenp)	register XDR	*xdrs;	register struct mbuf **mm;	register u_int *lenp;{	register struct mbuf *m;	register int len, used;	if (! xdr_u_int(xdrs, lenp)) {		return (FALSE);	}	m = (struct mbuf *)xdrs->x_base;	used = m->m_len - xdrs->x_handy;	m->m_off += used;	m->m_len -= used;	*mm = m;	/*	 * Consistency check.	 */	len = 0;	while (m) {		len += m->m_len;		m = m->m_next;	}	if (len < *lenp) {#ifdef KERNEL		printf("xdrmbuf_getmbuf failed\n");#endif		return (FALSE);	}	return (TRUE);}bool_txdrmbuf_putbytes(xdrs, addr, len)	register XDR	*xdrs;	caddr_t		 addr;	register u_int		 len;{	while ((xdrs->x_handy -= len) < 0) {		if ((xdrs->x_handy += len) > 0) {			bcopy(addr, xdrs->x_private, (u_int)xdrs->x_handy);			addr += xdrs->x_handy;			len -= xdrs->x_handy;		}		if (xdrs->x_base) {			register struct mbuf *m =			    ((struct mbuf *)xdrs->x_base)->m_next;			xdrs->x_base = (caddr_t)m;			if (m == NULL)				return (FALSE);			xdrs->x_private = mtod(m, caddr_t);			xdrs->x_handy = m->m_len;		} else {			return (FALSE);		}	}	bcopy(addr, xdrs->x_private, len);	xdrs->x_private += len;	return (TRUE);}/* * Like putbytes, only we avoid the copy by pointing a type 2 * mbuf at the buffer.  Not safe if the buffer goes away before * the mbuf chain is deallocated. */bool_txdrmbuf_putbuf(xdrs, addr, len, func, arg)	register XDR	*xdrs;	caddr_t		 addr;	u_int		 len;	int		 (*func)();	int		 arg;{	register struct mbuf *m;	struct mbuf *mclgetx();	long llen = len;	len = (len + 3) & ~3;	/* actually we could memory fault - need to put out zeros */	if (! xdrmbuf_putlong(xdrs, &llen)) {		return(FALSE);	}	((struct mbuf *)xdrs->x_base)->m_len -= xdrs->x_handy;	m = mclgetx(func, arg, addr, (int)len, M_WAIT);	if (m == NULL) {		printf("xdrmbuf_putbuf: mclgetx failed\n");		return (FALSE);	}	((struct mbuf *)xdrs->x_base)->m_next = m;	xdrs->x_handy = 0;	return (TRUE);}u_intxdrmbuf_getpos(xdrs)	register XDR	*xdrs;{	return (	    (u_int)xdrs->x_private - mtod(((struct mbuf *)xdrs->x_base), u_int));}bool_txdrmbuf_setpos(xdrs, pos)	register XDR	*xdrs;	u_int		 pos;{	register caddr_t	newaddr =	    mtod(((struct mbuf *)xdrs->x_base), caddr_t) + pos;	register caddr_t	lastaddr =	    xdrs->x_private + xdrs->x_handy;	if ((int)newaddr > (int)lastaddr)		return (FALSE);	xdrs->x_private = newaddr;	xdrs->x_handy = (int)lastaddr - (int)newaddr;	return (TRUE);}long *xdrmbuf_inline(xdrs, len)	register XDR	*xdrs;	int		 len;{	long *buf = 0;	if (xdrs->x_handy >= len) {		xdrs->x_handy -= len;		buf = (long *) xdrs->x_private;		xdrs->x_private += len;	}	return (buf);}

⌨️ 快捷键说明

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