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: }