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 * @(#)xdr_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro 30 * @(#)xdr_stdio.c 2.1 88/07/29 4.0 RPCSRC 31 * $FreeBSD: src/lib/libc/xdr/xdr_stdio.c,v 1.7 1999/08/28 00:02:56 peter Exp $ 32 * $DragonFly: src/lib/libc/xdr/xdr_stdio.c,v 1.3 2004/10/25 19:38:02 drhodus Exp $ 33 */ 34 35 /* 36 * xdr_stdio.c, XDR implementation on standard i/o file. 37 * 38 * Copyright (C) 1984, Sun Microsystems, Inc. 39 * 40 * This set of routines implements a XDR on a stdio stream. 41 * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes 42 * from the stream. 43 */ 44 45 #include <rpc/types.h> 46 #include <stdio.h> 47 #include <rpc/xdr.h> 48 49 static bool_t xdrstdio_getlong(); 50 static bool_t xdrstdio_putlong(); 51 static bool_t xdrstdio_getbytes(); 52 static bool_t xdrstdio_putbytes(); 53 static u_int xdrstdio_getpos(); 54 static bool_t xdrstdio_setpos(); 55 static int32_t *xdrstdio_inline(); 56 static void xdrstdio_destroy(); 57 58 /* 59 * Ops vector for stdio type XDR 60 */ 61 static struct xdr_ops xdrstdio_ops = { 62 xdrstdio_getlong, /* deseraialize a long int */ 63 xdrstdio_putlong, /* seraialize a long int */ 64 xdrstdio_getbytes, /* deserialize counted bytes */ 65 xdrstdio_putbytes, /* serialize counted bytes */ 66 xdrstdio_getpos, /* get offset in the stream */ 67 xdrstdio_setpos, /* set offset in the stream */ 68 xdrstdio_inline, /* prime stream for inline macros */ 69 xdrstdio_destroy /* destroy stream */ 70 }; 71 72 /* 73 * Initialize a stdio xdr stream. 74 * Sets the xdr stream handle xdrs for use on the stream file. 75 * Operation flag is set to op. 76 */ 77 void 78 xdrstdio_create(xdrs, file, op) 79 XDR *xdrs; 80 FILE *file; 81 enum xdr_op op; 82 { 83 84 xdrs->x_op = op; 85 xdrs->x_ops = &xdrstdio_ops; 86 xdrs->x_private = (caddr_t)file; 87 xdrs->x_handy = 0; 88 xdrs->x_base = 0; 89 } 90 91 /* 92 * Destroy a stdio xdr stream. 93 * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create. 94 */ 95 static void 96 xdrstdio_destroy(xdrs) 97 XDR *xdrs; 98 { 99 (void)fflush((FILE *)xdrs->x_private); 100 /* xx should we close the file ?? */ 101 } 102 103 static bool_t 104 xdrstdio_getlong(xdrs, lp) 105 XDR *xdrs; 106 long *lp; 107 { 108 109 if (fread((caddr_t)lp, sizeof(int32_t), 1, 110 (FILE *)xdrs->x_private) != 1) 111 return (FALSE); 112 *lp = (long)ntohl((int32_t)*lp); 113 return (TRUE); 114 } 115 116 static bool_t 117 xdrstdio_putlong(xdrs, lp) 118 XDR *xdrs; 119 long *lp; 120 { 121 122 long mycopy = (long)htonl((int32_t)*lp); 123 124 if (fwrite((caddr_t)&mycopy, sizeof(int32_t), 1, 125 (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 int32_t * 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 } 189