]> git.ipfire.org Git - thirdparty/glibc.git/blame - sunrpc/xdr_stdio.c
(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
[thirdparty/glibc.git] / sunrpc / xdr_stdio.c
CommitLineData
28f540f4
RM
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.
6d52618b 8 *
28f540f4
RM
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.
6d52618b 12 *
28f540f4
RM
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.
6d52618b 16 *
28f540f4
RM
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.
6d52618b 20 *
28f540f4
RM
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.
6d52618b 24 *
28f540f4
RM
25 * Sun Microsystems, Inc.
26 * 2550 Garcia Avenue
27 * Mountain View, California 94043
28 */
28f540f4
RM
29
30/*
31 * xdr_stdio.c, XDR implementation on standard i/o file.
32 *
33 * Copyright (C) 1984, Sun Microsystems, Inc.
34 *
35 * This set of routines implements a XDR on a stdio stream.
36 * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes
37 * from the stream.
38 */
39
40#include <rpc/types.h>
41#include <stdio.h>
42#include <rpc/xdr.h>
43
50304ef0
UD
44#ifdef USE_IN_LIBIO
45# include <libio/iolibio.h>
77fe0b9c
UD
46# define fflush(s) INTUSE(_IO_fflush) (s)
47# define fread(p, m, n, s) INTUSE(_IO_fread) (p, m, n, s)
48# define ftell(s) INTUSE(_IO_ftell) (s)
49# define fwrite(p, m, n, s) INTUSE(_IO_fwrite) (p, m, n, s)
50304ef0
UD
50#endif
51
e7fd8a39 52static bool_t xdrstdio_getlong (XDR *, long *);
1f205a47 53static bool_t xdrstdio_putlong (XDR *, const long *);
e7fd8a39 54static bool_t xdrstdio_getbytes (XDR *, caddr_t, u_int);
bfbc5754
UD
55static bool_t xdrstdio_putbytes (XDR *, const char *, u_int);
56static u_int xdrstdio_getpos (const XDR *);
e7fd8a39 57static bool_t xdrstdio_setpos (XDR *, u_int);
55187f62 58static int32_t *xdrstdio_inline (XDR *, u_int);
92f1da4d 59static void xdrstdio_destroy (XDR *);
7d1de115
UD
60static bool_t xdrstdio_getint32 (XDR *, int32_t *);
61static bool_t xdrstdio_putint32 (XDR *, const int32_t *);
28f540f4
RM
62
63/*
64 * Ops vector for stdio type XDR
65 */
e7fd8a39
UD
66static const struct xdr_ops xdrstdio_ops =
67{
68 xdrstdio_getlong, /* deserialize a long int */
69 xdrstdio_putlong, /* serialize 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 */
7d1de115
UD
75 xdrstdio_destroy, /* destroy stream */
76 xdrstdio_getint32, /* deserialize a int */
77 xdrstdio_putint32 /* serialize a int */
28f540f4
RM
78};
79
80/*
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.
84 */
85void
f8afba91 86xdrstdio_create (XDR *xdrs, FILE *file, enum xdr_op op)
28f540f4 87{
e7fd8a39 88 xdrs->x_op = op;
737547be
UD
89 /* We have to add the const since the `struct xdr_ops' in `struct XDR'
90 is not `const'. */
91 xdrs->x_ops = (struct xdr_ops *) &xdrstdio_ops;
e7fd8a39
UD
92 xdrs->x_private = (caddr_t) file;
93 xdrs->x_handy = 0;
94 xdrs->x_base = 0;
28f540f4
RM
95}
96
97/*
98 * Destroy a stdio xdr stream.
99 * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
100 */
101static void
f8afba91 102xdrstdio_destroy (XDR *xdrs)
28f540f4 103{
e7fd8a39
UD
104 (void) fflush ((FILE *) xdrs->x_private);
105 /* xx should we close the file ?? */
28f540f4
RM
106};
107
108static bool_t
f8afba91 109xdrstdio_getlong (XDR *xdrs, long *lp)
28f540f4 110{
a334319f 111 int32_t mycopy;
28f540f4 112
a334319f 113 if (fread ((caddr_t) & mycopy, 4, 1, (FILE *) xdrs->x_private) != 1)
e7fd8a39 114 return FALSE;
a334319f 115 *lp = (int32_t) ntohl (mycopy);
e7fd8a39 116 return TRUE;
28f540f4
RM
117}
118
119static bool_t
1f205a47 120xdrstdio_putlong (XDR *xdrs, const long *lp)
28f540f4 121{
a334319f
UD
122 long mycopy = htonl (*lp);
123 lp = &mycopy;
124 if (fwrite ((caddr_t) lp, 4, 1, (FILE *) xdrs->x_private) != 1)
e7fd8a39
UD
125 return FALSE;
126 return TRUE;
28f540f4
RM
127}
128
129static bool_t
f8afba91 130xdrstdio_getbytes (XDR *xdrs, const caddr_t addr, u_int len)
28f540f4 131{
f8afba91
UD
132 if ((len != 0) && (fread (addr, (int) len, 1,
133 (FILE *) xdrs->x_private) != 1))
e7fd8a39
UD
134 return FALSE;
135 return TRUE;
28f540f4
RM
136}
137
138static bool_t
bfbc5754 139xdrstdio_putbytes (XDR *xdrs, const char *addr, u_int len)
28f540f4 140{
f8afba91
UD
141 if ((len != 0) && (fwrite (addr, (int) len, 1,
142 (FILE *) xdrs->x_private) != 1))
e7fd8a39
UD
143 return FALSE;
144 return TRUE;
28f540f4
RM
145}
146
147static u_int
bfbc5754 148xdrstdio_getpos (const XDR *xdrs)
28f540f4 149{
e7fd8a39 150 return (u_int) ftell ((FILE *) xdrs->x_private);
28f540f4
RM
151}
152
153static bool_t
e7fd8a39 154xdrstdio_setpos (XDR *xdrs, u_int pos)
6d52618b 155{
e7fd8a39 156 return fseek ((FILE *) xdrs->x_private, (long) pos, 0) < 0 ? FALSE : TRUE;
28f540f4
RM
157}
158
f8afba91 159static int32_t *
55187f62 160xdrstdio_inline (XDR *xdrs, u_int len)
28f540f4 161{
e7fd8a39
UD
162 /*
163 * Must do some work to implement this: must insure
164 * enough data in the underlying stdio buffer,
165 * that the buffer is aligned so that we can indirect through a
166 * long *, and stuff this pointer in xdrs->x_buf. Doing
167 * a fread or fwrite to a scratch buffer would defeat
168 * most of the gains to be had here and require storage
169 * management on this buffer, so we don't do this.
170 */
171 return NULL;
28f540f4 172}
7d1de115
UD
173
174static bool_t
175xdrstdio_getint32 (XDR *xdrs, int32_t *ip)
176{
177 int32_t mycopy;
178
179 if (fread ((caddr_t) &mycopy, 4, 1, (FILE *) xdrs->x_private) != 1)
180 return FALSE;
181 *ip = ntohl (mycopy);
182 return TRUE;
183}
184
185static bool_t
186xdrstdio_putint32 (XDR *xdrs, const int32_t *ip)
187{
188 int32_t mycopy = htonl (*ip);
189
190 ip = &mycopy;
191 if (fwrite ((caddr_t) ip, 4, 1, (FILE *) xdrs->x_private) != 1)
192 return FALSE;
193 return TRUE;
194}
e436294b
RM
195
196libc_hidden_def (xdrstdio_create)