2 * Copyright (c) 2009, Sun Microsystems, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * - Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 * - Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation
11 * and/or other materials provided with the distribution.
12 * - Neither the name of Sun Microsystems, Inc. nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
30 * xdr_stdio.c, XDR implementation on standard i/o file.
32 * Copyright (C) 1984, Sun Microsystems, Inc.
34 * This set of routines implements a XDR on a stdio stream.
35 * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes
41 #include <rpc/types.h>
44 #include "xdr_private.h"
47 # define ntohl(x) xdr_ntohl(x)
50 # define htonl(x) xdr_htonl(x)
53 static void xdrstdio_destroy (XDR
*);
54 static bool_t
xdrstdio_getlong (XDR
*, long *);
55 static bool_t
xdrstdio_putlong (XDR
*, const long *);
56 static bool_t
xdrstdio_getbytes (XDR
*, char *, u_int
);
57 static bool_t
xdrstdio_putbytes (XDR
*, const char *, u_int
);
58 static u_int
xdrstdio_getpos (XDR
*);
59 static bool_t
xdrstdio_setpos (XDR
*, u_int
);
60 static int32_t * xdrstdio_inline (XDR
*, u_int
);
61 static bool_t
xdrstdio_getint32 (XDR
*, int32_t *);
62 static bool_t
xdrstdio_putint32 (XDR
*, const int32_t *);
65 * Ops vector for stdio type XDR
67 static const struct xdr_ops xdrstdio_ops
= {
68 xdrstdio_getlong
, /* deseraialize a long int */
69 xdrstdio_putlong
, /* seraialize a long int */
70 xdrstdio_getbytes
, /* deserialize counted bytes */
71 xdrstdio_putbytes
, /* serialize counted bytes */
72 xdrstdio_getpos
, /* get offset in the stream */
73 xdrstdio_setpos
, /* set offset in the stream */
74 xdrstdio_inline
, /* prime stream for inline macros */
75 xdrstdio_destroy
, /* destroy stream */
76 xdrstdio_getint32
, /* deseraialize an int */
77 xdrstdio_putint32
/* seraialize an long int */
81 * Initialize a stdio xdr stream.
82 * Sets the xdr stream handle xdrs for use on the stream file.
83 * Operation flag is set to op.
86 xdrstdio_create (XDR
* xdrs
,
91 xdrs
->x_ops
= (struct xdr_ops
*) &xdrstdio_ops
;
92 xdrs
->x_private
= (void *) file
;
98 * Destroy a stdio xdr stream.
99 * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
102 xdrstdio_destroy (XDR
* xdrs
)
104 (void) fflush ((FILE *) xdrs
->x_private
);
105 /* XXX: should we close the file ?? */
109 xdrstdio_getlong (XDR
* xdrs
,
114 if (fread (&temp
, sizeof (int32_t), 1, (FILE *) xdrs
->x_private
) != 1)
116 *lp
= (long) (int32_t) ntohl (temp
);
121 xdrstdio_putlong (XDR
* xdrs
,
124 u_int32_t temp
= htonl ((u_int32_t
) * lp
);
126 if (fwrite (&temp
, sizeof (int32_t), 1, (FILE *) xdrs
->x_private
) != 1)
132 xdrstdio_getbytes (XDR
* xdrs
,
136 if ((len
!= 0) && (fread (addr
, (size_t) len
, 1,
137 (FILE *) xdrs
->x_private
) != 1))
143 xdrstdio_putbytes (XDR
* xdrs
,
147 if ((len
!= 0) && (fwrite (addr
, (size_t) len
, 1,
148 (FILE *) xdrs
->x_private
) != 1))
154 xdrstdio_getpos (XDR
* xdrs
)
156 return ((u_int
) ftell ((FILE *) xdrs
->x_private
));
160 xdrstdio_setpos (XDR
* xdrs
,
163 return ((fseek ((FILE *) xdrs
->x_private
, (long) pos
, 0) < 0) ?
169 xdrstdio_inline (XDR
* xdrs
,
173 * Must do some work to implement this: must insure
174 * enough data in the underlying stdio buffer,
175 * that the buffer is aligned so that we can indirect through a
176 * long *, and stuff this pointer in xdrs->x_buf. Doing
177 * a fread or fwrite to a scratch buffer would defeat
178 * most of the gains to be had here and require storage
179 * management on this buffer, so we don't do this.
185 xdrstdio_getint32 (XDR
*xdrs
,
190 if (fread (&temp
, sizeof (int32_t), 1, (FILE *) xdrs
->x_private
) != 1)
197 xdrstdio_putint32 (XDR
*xdrs
,
200 int32_t temp
= htonl (*ip
);
202 if (fwrite (&temp
, sizeof (int32_t), 1, (FILE *) xdrs
->x_private
) != 1)