1: /*
   2:  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
   3:  * unrestricted use provided that this legend is included on all tape
   4:  * media and as a part of the software program in whole or part.  Users
   5:  * may copy or modify Sun RPC without charge, but are not authorized
   6:  * to license or distribute it to anyone else except as part of a product or
   7:  * program developed by the user.
   8:  *
   9:  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  10:  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  11:  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  12:  *
  13:  * Sun RPC is provided with no support and without any obligation on the
  14:  * part of Sun Microsystems, Inc. to assist in its use, correction,
  15:  * modification or enhancement.
  16:  *
  17:  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  18:  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  19:  * OR ANY PART THEREOF.
  20:  *
  21:  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  22:  * or profits or other special, indirect and consequential damages, even if
  23:  * Sun has been advised of the possibility of such damages.
  24:  *
  25:  * Sun Microsystems, Inc.
  26:  * 2550 Garcia Avenue
  27:  * Mountain View, California  94043
  28:  */
  29: #ifndef lint
  30: static char sccsid[] = "@(#)xdr_stdio.c 1.4 85/03/14 Copyr 1984 Sun Micro";
  31: #endif
  32: 
  33: /*
  34:  * xdr_stdio.c, XDR implementation on standard i/o file.
  35:  *
  36:  * Copyright (C) 1984, Sun Microsystems, Inc.
  37:  *
  38:  * This set of routines implements a XDR on a stdio stream.
  39:  * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes
  40:  * from the stream.
  41:  */
  42: 
  43: #include "types.h"
  44: #include <stdio.h>
  45: #include "xdr.h"
  46: 
  47: static bool_t   xdrstdio_getlong();
  48: static bool_t   xdrstdio_putlong();
  49: static bool_t   xdrstdio_getbytes();
  50: static bool_t   xdrstdio_putbytes();
  51: static u_int    xdrstdio_getpos();
  52: static bool_t   xdrstdio_setpos();
  53: static long *   xdrstdio_inline();
  54: static void xdrstdio_destroy();
  55: 
  56: /*
  57:  * Ops vector for stdio type XDR
  58:  */
  59: static struct xdr_ops   xdrstdio_ops = {
  60:     xdrstdio_getlong,   /* deseraialize a long int */
  61:     xdrstdio_putlong,   /* seraialize a long int */
  62:     xdrstdio_getbytes,  /* deserialize counted bytes */
  63:     xdrstdio_putbytes,  /* serialize counted bytes */
  64:     xdrstdio_getpos,    /* get offset in the stream */
  65:     xdrstdio_setpos,    /* set offset in the stream */
  66:     xdrstdio_inline,    /* prime stream for inline macros */
  67:     xdrstdio_destroy    /* destroy stream */
  68: };
  69: 
  70: /*
  71:  * Initialize a stdio xdr stream.
  72:  * Sets the xdr stream handle xdrs for use on the stream file.
  73:  * Operation flag is set to op.
  74:  */
  75: void
  76: xdrstdio_create(xdrs, file, op)
  77:     register XDR *xdrs;
  78:     FILE *file;
  79:     enum xdr_op op;
  80: {
  81: 
  82:     xdrs->x_op = op;
  83:     xdrs->x_ops = &xdrstdio_ops;
  84:     xdrs->x_private = (caddr_t)file;
  85:     xdrs->x_handy = 0;
  86:     xdrs->x_base = 0;
  87: }
  88: 
  89: /*
  90:  * Destroy a stdio xdr stream.
  91:  * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
  92:  */
  93: static void
  94: xdrstdio_destroy(xdrs)
  95:     register XDR *xdrs;
  96: {
  97:     (void)fflush((FILE *)xdrs->x_private);
  98:     /* xx should we close the file ?? */
  99: };
 100: 
 101: static bool_t
 102: xdrstdio_getlong(xdrs, lp)
 103:     XDR *xdrs;
 104:     register long *lp;
 105: {
 106: 
 107:     if (fread((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1)
 108:         return (FALSE);
 109: #ifndef mc68000
 110:     *lp = ntohl(*lp);
 111: #endif
 112:     return (TRUE);
 113: }
 114: 
 115: static bool_t
 116: xdrstdio_putlong(xdrs, lp)
 117:     XDR *xdrs;
 118:     long *lp;
 119: {
 120: 
 121: #ifndef mc68000
 122:     long mycopy = htonl(*lp);
 123:     lp = &mycopy;
 124: #endif
 125:     if (fwrite((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1)
 126:         return (FALSE);
 127:     return (TRUE);
 128: }
 129: 
 130: static bool_t
 131: xdrstdio_getbytes(xdrs, addr, len)
 132:     XDR *xdrs;
 133:     caddr_t addr;
 134:     u_int len;
 135: {
 136: 
 137:     if ((len != 0) && (fread(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
 138:         return (FALSE);
 139:     return (TRUE);
 140: }
 141: 
 142: static bool_t
 143: xdrstdio_putbytes(xdrs, addr, len)
 144:     XDR *xdrs;
 145:     caddr_t addr;
 146:     u_int len;
 147: {
 148: 
 149:     if ((len != 0) && (fwrite(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
 150:         return (FALSE);
 151:     return (TRUE);
 152: }
 153: 
 154: static u_int
 155: xdrstdio_getpos(xdrs)
 156:     XDR *xdrs;
 157: {
 158: 
 159:     return ((u_int) ftell((FILE *)xdrs->x_private));
 160: }
 161: 
 162: static bool_t
 163: xdrstdio_setpos(xdrs, pos)
 164:     XDR *xdrs;
 165:     u_int pos;
 166: {
 167: 
 168:     return ((fseek((FILE *)xdrs->x_private, (long)pos, 0) < 0) ?
 169:         FALSE : TRUE);
 170: }
 171: 
 172: static long *
 173: xdrstdio_inline(xdrs, len)
 174:     XDR *xdrs;
 175:     u_int len;
 176: {
 177: 
 178:     /*
 179: 	 * Must do some work to implement this: must insure
 180: 	 * enough data in the underlying stdio buffer,
 181: 	 * that the buffer is aligned so that we can indirect through a
 182: 	 * long *, and stuff this pointer in xdrs->x_buf.  Doing
 183: 	 * a fread or fwrite to a scratch buffer would defeat
 184: 	 * most of the gains to be had here and require storage
 185: 	 * management on this buffer, so we don't do this.
 186: 	 */
 187:     return (NULL);
 188: }

Defined functions

xdrstdio_create defined in line 75; used 1 times
xdrstdio_destroy defined in line 93; used 2 times
xdrstdio_getbytes defined in line 130; used 2 times
xdrstdio_getlong defined in line 101; used 2 times
xdrstdio_getpos defined in line 154; used 2 times
xdrstdio_inline defined in line 172; used 2 times
xdrstdio_putbytes defined in line 142; used 2 times
xdrstdio_putlong defined in line 115; used 2 times
xdrstdio_setpos defined in line 162; used 2 times

Defined variables

sccsid defined in line 30; never used
xdrstdio_ops defined in line 59; used 1 times
  • in line 83
Last modified: 1985-04-19
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1082
Valid CSS Valid XHTML 1.0 Strict