📄 xdr_stdio.c
字号:
#ifndef lintstatic char *sccsid = "@(#)xdr_stdio.c 4.1 ULTRIX 7/3/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_stdio.c, XDR implementation on standard i/o file. * * * This set of routines implements a XDR on a stdio stream. * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes * from the stream. */#include <rpc/types.h>#include <stdio.h>#include <rpc/xdr.h>static bool_t xdrstdio_getlong();static bool_t xdrstdio_putlong();static bool_t xdrstdio_getbytes();static bool_t xdrstdio_putbytes();static u_int xdrstdio_getpos();static bool_t xdrstdio_setpos();static long * xdrstdio_inline();static void xdrstdio_destroy();/* * Ops vector for stdio type XDR */static struct xdr_ops xdrstdio_ops = { xdrstdio_getlong, /* deseraialize a long int */ xdrstdio_putlong, /* seraialize a long int */ xdrstdio_getbytes, /* deserialize counted bytes */ xdrstdio_putbytes, /* serialize counted bytes */ xdrstdio_getpos, /* get offset in the stream */ xdrstdio_setpos, /* set offset in the stream */ xdrstdio_inline, /* prime stream for inline macros */ xdrstdio_destroy /* destroy stream */};/* * Initialize a stdio xdr stream. * Sets the xdr stream handle xdrs for use on the stream file. * Operation flag is set to op. */voidxdrstdio_create(xdrs, file, op) register XDR *xdrs; FILE *file; enum xdr_op op;{ xdrs->x_op = op; xdrs->x_ops = &xdrstdio_ops; xdrs->x_private = (caddr_t)file; xdrs->x_handy = 0; xdrs->x_base = 0;}/* * Destroy a stdio xdr stream. * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create. */static voidxdrstdio_destroy(xdrs) register XDR *xdrs;{ (void)fflush((FILE *)xdrs->x_private); /* xx should we close the file ?? */};static bool_txdrstdio_getlong(xdrs, lp) XDR *xdrs; register long *lp;{ if (fread((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1) return (FALSE);#ifndef mc68000 *lp = ntohl(*lp);#endif return (TRUE);}static bool_txdrstdio_putlong(xdrs, lp) XDR *xdrs; long *lp;{#ifndef mc68000 long mycopy = htonl(*lp); lp = &mycopy;#endif if (fwrite((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1) return (FALSE); return (TRUE);}static bool_txdrstdio_getbytes(xdrs, addr, len) XDR *xdrs; caddr_t addr; u_int len;{ if ((len != 0) && (fread(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1)) return (FALSE); return (TRUE);}static bool_txdrstdio_putbytes(xdrs, addr, len) XDR *xdrs; caddr_t addr; u_int len;{ if ((len != 0) && (fwrite(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1)) return (FALSE); return (TRUE);}static u_intxdrstdio_getpos(xdrs) XDR *xdrs;{ return ((u_int) ftell((FILE *)xdrs->x_private));}static bool_txdrstdio_setpos(xdrs, pos) XDR *xdrs; u_int pos;{ return ((fseek((FILE *)xdrs->x_private, (long)pos, 0) < 0) ? FALSE : TRUE);}static long *xdrstdio_inline(xdrs, len) XDR *xdrs; u_int len;{ /* * Must do some work to implement this: must insure * enough data in the underlying stdio buffer, * that the buffer is aligned so that we can indirect through a * long *, and stuff this pointer in xdrs->x_buf. Doing * a fread or fwrite to a scratch buffer would defeat * most of the gains to be had here and require storage * management on this buffer, so we don't do this. */ return (NULL);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -