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