1 1.19 tron /* $NetBSD: xdr_stdio.c,v 1.19 2013/03/11 20:19:30 tron Exp $ */ 2 1.3 cgd 3 1.1 cgd /* 4 1.19 tron * Copyright (c) 2010, Oracle America, Inc. 5 1.19 tron * 6 1.19 tron * Redistribution and use in source and binary forms, with or without 7 1.19 tron * modification, are permitted provided that the following conditions are 8 1.19 tron * met: 9 1.19 tron * 10 1.19 tron * * Redistributions of source code must retain the above copyright 11 1.19 tron * notice, this list of conditions and the following disclaimer. 12 1.19 tron * * Redistributions in binary form must reproduce the above 13 1.19 tron * copyright notice, this list of conditions and the following 14 1.19 tron * disclaimer in the documentation and/or other materials 15 1.19 tron * provided with the distribution. 16 1.19 tron * * Neither the name of the "Oracle America, Inc." nor the names of its 17 1.19 tron * contributors may be used to endorse or promote products derived 18 1.19 tron * from this software without specific prior written permission. 19 1.19 tron * 20 1.19 tron * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 1.19 tron * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 1.19 tron * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 1.19 tron * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24 1.19 tron * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 25 1.19 tron * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 1.19 tron * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 27 1.19 tron * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 1.19 tron * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29 1.19 tron * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30 1.19 tron * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 1.19 tron * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 1.1 cgd */ 33 1.1 cgd 34 1.4 christos #include <sys/cdefs.h> 35 1.1 cgd #if defined(LIBC_SCCS) && !defined(lint) 36 1.4 christos #if 0 37 1.4 christos static char *sccsid = "@(#)xdr_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro"; 38 1.4 christos static char *sccsid = "@(#)xdr_stdio.c 2.1 88/07/29 4.0 RPCSRC"; 39 1.4 christos #else 40 1.19 tron __RCSID("$NetBSD: xdr_stdio.c,v 1.19 2013/03/11 20:19:30 tron Exp $"); 41 1.4 christos #endif 42 1.1 cgd #endif 43 1.1 cgd 44 1.1 cgd /* 45 1.1 cgd * xdr_stdio.c, XDR implementation on standard i/o file. 46 1.1 cgd * 47 1.1 cgd * Copyright (C) 1984, Sun Microsystems, Inc. 48 1.1 cgd * 49 1.1 cgd * This set of routines implements a XDR on a stdio stream. 50 1.1 cgd * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes 51 1.1 cgd * from the stream. 52 1.1 cgd */ 53 1.1 cgd 54 1.5 jtc #include "namespace.h" 55 1.9 lukem 56 1.9 lukem #include <stdio.h> 57 1.9 lukem 58 1.8 lukem #include <rpc/types.h> 59 1.1 cgd #include <rpc/xdr.h> 60 1.5 jtc 61 1.5 jtc #ifdef __weak_alias 62 1.14 mycroft __weak_alias(xdrstdio_create,_xdrstdio_create) 63 1.5 jtc #endif 64 1.1 cgd 65 1.18 matt static void xdrstdio_destroy(XDR *); 66 1.18 matt static bool_t xdrstdio_getlong(XDR *, long *); 67 1.18 matt static bool_t xdrstdio_putlong(XDR *, const long *); 68 1.18 matt static bool_t xdrstdio_getbytes(XDR *, char *, u_int); 69 1.18 matt static bool_t xdrstdio_putbytes(XDR *, const char *, u_int); 70 1.18 matt static u_int xdrstdio_getpos(XDR *); 71 1.18 matt static bool_t xdrstdio_setpos(XDR *, u_int); 72 1.18 matt static int32_t *xdrstdio_inline(XDR *, u_int); 73 1.1 cgd 74 1.1 cgd /* 75 1.1 cgd * Ops vector for stdio type XDR 76 1.1 cgd */ 77 1.10 mycroft static const struct xdr_ops xdrstdio_ops = { 78 1.1 cgd xdrstdio_getlong, /* deseraialize a long int */ 79 1.1 cgd xdrstdio_putlong, /* seraialize a long int */ 80 1.1 cgd xdrstdio_getbytes, /* deserialize counted bytes */ 81 1.1 cgd xdrstdio_putbytes, /* serialize counted bytes */ 82 1.1 cgd xdrstdio_getpos, /* get offset in the stream */ 83 1.1 cgd xdrstdio_setpos, /* set offset in the stream */ 84 1.1 cgd xdrstdio_inline, /* prime stream for inline macros */ 85 1.17 christos xdrstdio_destroy, /* destroy stream */ 86 1.17 christos NULL, /* xdrstdio_control */ 87 1.1 cgd }; 88 1.1 cgd 89 1.1 cgd /* 90 1.1 cgd * Initialize a stdio xdr stream. 91 1.1 cgd * Sets the xdr stream handle xdrs for use on the stream file. 92 1.1 cgd * Operation flag is set to op. 93 1.1 cgd */ 94 1.1 cgd void 95 1.18 matt xdrstdio_create(XDR *xdrs, FILE *file, enum xdr_op op) 96 1.1 cgd { 97 1.1 cgd 98 1.1 cgd xdrs->x_op = op; 99 1.1 cgd xdrs->x_ops = &xdrstdio_ops; 100 1.12 christos xdrs->x_private = file; 101 1.1 cgd xdrs->x_handy = 0; 102 1.1 cgd xdrs->x_base = 0; 103 1.1 cgd } 104 1.1 cgd 105 1.1 cgd /* 106 1.1 cgd * Destroy a stdio xdr stream. 107 1.1 cgd * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create. 108 1.1 cgd */ 109 1.1 cgd static void 110 1.18 matt xdrstdio_destroy(XDR *xdrs) 111 1.1 cgd { 112 1.1 cgd (void)fflush((FILE *)xdrs->x_private); 113 1.13 lukem /* XXX: should we close the file ?? */ 114 1.12 christos } 115 1.1 cgd 116 1.1 cgd static bool_t 117 1.18 matt xdrstdio_getlong(XDR *xdrs, long *lp) 118 1.1 cgd { 119 1.15 martin u_int32_t temp; 120 1.1 cgd 121 1.15 martin if (fread(&temp, sizeof(int32_t), 1, (FILE *)xdrs->x_private) != 1) 122 1.1 cgd return (FALSE); 123 1.15 martin *lp = (long)ntohl(temp); 124 1.1 cgd return (TRUE); 125 1.1 cgd } 126 1.1 cgd 127 1.1 cgd static bool_t 128 1.18 matt xdrstdio_putlong(XDR *xdrs, const long *lp) 129 1.1 cgd { 130 1.16 martin int32_t mycopy = htonl((u_int32_t)*lp); 131 1.1 cgd 132 1.12 christos if (fwrite(&mycopy, sizeof(int32_t), 1, (FILE *)xdrs->x_private) != 1) 133 1.1 cgd return (FALSE); 134 1.1 cgd return (TRUE); 135 1.1 cgd } 136 1.1 cgd 137 1.1 cgd static bool_t 138 1.18 matt xdrstdio_getbytes(XDR *xdrs, char *addr, u_int len) 139 1.1 cgd { 140 1.1 cgd 141 1.12 christos if ((len != 0) && (fread(addr, (size_t)len, 1, (FILE *)xdrs->x_private) != 1)) 142 1.1 cgd return (FALSE); 143 1.1 cgd return (TRUE); 144 1.1 cgd } 145 1.1 cgd 146 1.1 cgd static bool_t 147 1.18 matt xdrstdio_putbytes(XDR *xdrs, const char *addr, u_int len) 148 1.1 cgd { 149 1.1 cgd 150 1.12 christos if ((len != 0) && (fwrite(addr, (size_t)len, 1, 151 1.12 christos (FILE *)xdrs->x_private) != 1)) 152 1.1 cgd return (FALSE); 153 1.1 cgd return (TRUE); 154 1.1 cgd } 155 1.1 cgd 156 1.8 lukem static u_int 157 1.18 matt xdrstdio_getpos(XDR *xdrs) 158 1.1 cgd { 159 1.1 cgd 160 1.8 lukem return ((u_int) ftell((FILE *)xdrs->x_private)); 161 1.1 cgd } 162 1.1 cgd 163 1.1 cgd static bool_t 164 1.18 matt xdrstdio_setpos(XDR *xdrs, u_int pos) 165 1.1 cgd { 166 1.1 cgd 167 1.8 lukem return ((fseek((FILE *)xdrs->x_private, (long)pos, 0) < 0) ? 168 1.1 cgd FALSE : TRUE); 169 1.1 cgd } 170 1.1 cgd 171 1.12 christos /* ARGSUSED */ 172 1.2 cgd static int32_t * 173 1.18 matt xdrstdio_inline(XDR *xdrs, u_int len) 174 1.1 cgd { 175 1.1 cgd 176 1.1 cgd /* 177 1.1 cgd * Must do some work to implement this: must insure 178 1.1 cgd * enough data in the underlying stdio buffer, 179 1.1 cgd * that the buffer is aligned so that we can indirect through a 180 1.8 lukem * long *, and stuff this pointer in xdrs->x_buf. Doing 181 1.1 cgd * a fread or fwrite to a scratch buffer would defeat 182 1.1 cgd * most of the gains to be had here and require storage 183 1.1 cgd * management on this buffer, so we don't do this. 184 1.1 cgd */ 185 1.1 cgd return (NULL); 186 1.1 cgd } 187