source: rtems/cpukit/librpc/src/xdr/xdr_stdio.c @ 33a105fb

4.115
Last change on this file since 33a105fb was 37da47a, checked in by Ralf Corsepius <ralf.corsepius@…>, on 03/28/10 at 02:40:16

Add HAVE_CONFIG_H support to let files receive configure defines.

  • Property mode set to 100644
File size: 4.9 KB
Line 
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
30#if defined(LIBC_SCCS) && !defined(lint)
31/*static char *sccsid = "from: @(#)xdr_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro";*/
32/*static char *sccsid = "from: @(#)xdr_stdio.c  2.1 88/07/29 4.0 RPCSRC";*/
33static char *rcsid = "$FreeBSD: src/lib/libc/xdr/xdr_stdio.c,v 1.7 1999/08/28 00:02:56 peter Exp $";
34#endif
35
36/*
37 * xdr_stdio.c, XDR implementation on standard i/o file.
38 *
39 * Copyright (C) 1984, Sun Microsystems, Inc.
40 *
41 * This set of routines implements a XDR on a stdio stream.
42 * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes
43 * from the stream.
44 */
45
46#ifdef HAVE_CONFIG_H
47#include "config.h"
48#endif
49
50#include <rpc/types.h>
51#include <stdio.h>
52#include <rpc/xdr.h>
53#include <netinet/in.h>
54
55static bool_t   xdrstdio_getlong(XDR *xdrs, long *lp);
56static bool_t   xdrstdio_putlong(XDR *xdrs, const long *lp);
57static bool_t   xdrstdio_getbytes(XDR *xdrs, caddr_t addr, u_int len);
58static bool_t   xdrstdio_putbytes(XDR *xdrs, const char *addr, u_int len);
59static u_int    xdrstdio_getpos(XDR *xdrs);
60static bool_t   xdrstdio_setpos(XDR *xdrs, u_int pos);
61static int32_t *xdrstdio_inline(XDR *xdrs, u_int len);
62static void     xdrstdio_destroy(XDR *);
63
64/*
65 * Ops vector for stdio type XDR
66 */
67static 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};
77
78/*
79 * Initialize a stdio xdr stream.
80 * Sets the xdr stream handle xdrs for use on the stream file.
81 * Operation flag is set to op.
82 */
83void
84xdrstdio_create(
85        XDR *xdrs,
86        FILE *file,
87        enum xdr_op op)
88{
89
90        xdrs->x_op = op;
91        xdrs->x_ops = &xdrstdio_ops;
92        xdrs->x_private = (caddr_t)file;
93        xdrs->x_handy = 0;
94        xdrs->x_base = 0;
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
102xdrstdio_destroy(
103        XDR *xdrs)
104{
105        (void)fflush((FILE *)xdrs->x_private);
106        /* xx should we close the file ?? */
107}
108
109static bool_t
110xdrstdio_getlong(
111        XDR *xdrs,
112        long *lp)
113{
114
115        if (fread((caddr_t)lp, sizeof(int32_t), 1,
116                (FILE *)xdrs->x_private) != 1)
117                return (FALSE);
118        *lp = (long)ntohl((int32_t)*lp);
119        return (TRUE);
120}
121
122static bool_t
123xdrstdio_putlong(
124        XDR *xdrs,
125        const long *lp)
126{
127
128        long mycopy = (long)htonl((int32_t)*lp);
129
130        if (fwrite((caddr_t)&mycopy, sizeof(int32_t), 1,
131                (FILE *)xdrs->x_private) != 1)
132                return (FALSE);
133        return (TRUE);
134}
135
136static bool_t
137xdrstdio_getbytes(
138        XDR *xdrs,
139        caddr_t addr,
140        u_int len )
141{
142
143        if ((len != 0) && (fread(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
144                return (FALSE);
145        return (TRUE);
146}
147
148static bool_t
149xdrstdio_putbytes(
150        XDR *xdrs,
151        const char *addr,
152        u_int len)
153{
154
155        if ((len != 0) && (fwrite(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
156                return (FALSE);
157        return (TRUE);
158}
159
160static u_int
161xdrstdio_getpos(
162        XDR *xdrs)
163{
164
165        return ((u_int) ftell((FILE *)xdrs->x_private));
166}
167
168static bool_t
169xdrstdio_setpos(
170        XDR *xdrs,
171        u_int pos)
172{
173
174        return ((fseek((FILE *)xdrs->x_private, (long)pos, 0) < 0) ?
175                FALSE : TRUE);
176}
177
178static int32_t *
179xdrstdio_inline(
180        XDR *xdrs,
181        u_int len)
182{
183
184        /*
185         * Must do some work to implement this: must insure
186         * enough data in the underlying stdio buffer,
187         * that the buffer is aligned so that we can indirect through a
188         * long *, and stuff this pointer in xdrs->x_buf.  Doing
189         * a fread or fwrite to a scratch buffer would defeat
190         * most of the gains to be had here and require storage
191         * management on this buffer, so we don't do this.
192         */
193        return (NULL);
194}
Note: See TracBrowser for help on using the repository browser.