XDR: decouple from system XDR implementation
[openafs.git] / src / rx / xdr_stdio.c
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 #include <afsconfig.h>
30 #include <afs/param.h>
31
32
33 #ifndef NeXT
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 <stdio.h>
46 #include "xdr.h"
47
48 static bool_t xdrstdio_getint32();
49 static bool_t xdrstdio_putint32();
50 static bool_t xdrstdio_getbytes();
51 static bool_t xdrstdio_putbytes();
52 static u_int xdrstdio_getpos();
53 static bool_t xdrstdio_setpos();
54 static afs_int32 *xdrstdio_inline();
55 static void xdrstdio_destroy();
56
57 /*
58  * Ops vector for stdio type XDR
59  */
60 static struct xdr_ops xdrstdio_ops = {
61 #ifdef AFS_NT40_ENV
62     /* Windows does not support labeled assignments */
63 #if !(defined(KERNEL) && defined(AFS_SUN57_ENV))
64     xdrstdio_getint32,          /* deserialize an afs_int32 */
65     xdrstdio_putint32,          /* serialize an afs_int32 */
66 #endif
67     xdrstdio_getbytes,          /* deserialize counted bytes */
68     xdrstdio_putbytes,          /* serialize counted bytes */
69     xdrstdio_getpos,            /* get offset in the stream */
70     xdrstdio_setpos,            /* set offset in the stream */
71     xdrstdio_inline,            /* prime stream for inline macros */
72     xdrstdio_destroy,           /* destroy stream */
73 #if (defined(KERNEL) && defined(AFS_SUN57_ENV))
74     NULL,
75     xdrstdio_getint32,    /* deserialize an afs_int32 */
76     xdrstdio_putint32,    /* serialize an afs_int32 */
77 #endif
78 #else
79     .x_getint32 = xdrstdio_getint32,    /* deserialize an afs_int32 */
80     .x_putint32 = xdrstdio_putint32,    /* serialize an afs_int32 */
81     .x_getbytes = xdrstdio_getbytes,    /* deserialize counted bytes */
82     .x_putbytes = xdrstdio_putbytes,    /* serialize counted bytes */
83     .x_getpos = xdrstdio_getpos,        /* get offset in the stream */
84     .x_setpos = xdrstdio_setpos,        /* set offset in the stream */
85     .x_inline = xdrstdio_inline,        /* prime stream for inline macros */
86     .x_destroy = xdrstdio_destroy       /* destroy stream */
87 #endif
88 };
89
90 /*
91  * Initialize a stdio xdr stream.
92  * Sets the xdr stream handle xdrs for use on the stream file.
93  * Operation flag is set to op.
94  */
95 void
96 xdrstdio_create(xdrs, file, op)
97      XDR *xdrs;
98      FILE *file;
99      enum xdr_op op;
100 {
101
102     xdrs->x_op = op;
103     xdrs->x_ops = &xdrstdio_ops;
104     xdrs->x_private = (caddr_t) file;
105     xdrs->x_handy = 0;
106     xdrs->x_base = 0;
107 }
108
109 /*
110  * Destroy a stdio xdr stream.
111  * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
112  */
113 static void
114 xdrstdio_destroy(xdrs)
115      XDR *xdrs;
116 {
117     (void)fflush((FILE *) xdrs->x_private);
118     /* xx should we close the file ?? */
119 };
120
121 static bool_t
122 xdrstdio_getint32(xdrs, lp)
123      XDR *xdrs;
124      afs_int32 *lp;
125 {
126
127     if (fread((caddr_t) lp, sizeof(afs_int32), 1, (FILE *) xdrs->x_private) !=
128         1)
129         return (FALSE);
130 #ifndef mc68000
131     *lp = ntohl(*lp);
132 #endif
133     return (TRUE);
134 }
135
136 static bool_t
137 xdrstdio_putint32(xdrs, lp)
138      XDR *xdrs;
139      afs_int32 *lp;
140 {
141
142 #ifndef mc68000
143     afs_int32 mycopy = htonl(*lp);
144     lp = &mycopy;
145 #endif
146     if (fwrite((caddr_t) lp, sizeof(afs_int32), 1, (FILE *) xdrs->x_private)
147         != 1)
148         return (FALSE);
149     return (TRUE);
150 }
151
152 static bool_t
153 xdrstdio_getbytes(xdrs, addr, len)
154      XDR *xdrs;
155      caddr_t addr;
156      u_int len;
157 {
158
159     if ((len != 0)
160         && (fread(addr, (int)len, 1, (FILE *) xdrs->x_private) != 1))
161         return (FALSE);
162     return (TRUE);
163 }
164
165 static bool_t
166 xdrstdio_putbytes(xdrs, addr, len)
167      XDR *xdrs;
168      caddr_t addr;
169      u_int len;
170 {
171
172     if ((len != 0)
173         && (fwrite(addr, (int)len, 1, (FILE *) xdrs->x_private) != 1))
174         return (FALSE);
175     return (TRUE);
176 }
177
178 static u_int
179 xdrstdio_getpos(xdrs)
180      XDR *xdrs;
181 {
182
183     return ((u_int) ftell((FILE *) xdrs->x_private));
184 }
185
186 static bool_t
187 xdrstdio_setpos(xdrs, pos)
188      XDR *xdrs;
189      u_int pos;
190 {
191
192     return ((fseek((FILE *) xdrs->x_private, (afs_int32) pos, 0) <
193              0) ? FALSE : TRUE);
194 }
195
196 static afs_int32 *
197 xdrstdio_inline(xdrs, len)
198      XDR *xdrs;
199      u_int len;
200 {
201
202     /*
203      * Must do some work to implement this: must insure
204      * enough data in the underlying stdio buffer,
205      * that the buffer is aligned so that we can indirect through a
206      * afs_int32 *, and stuff this pointer in xdrs->x_buf.  Doing
207      * a fread or fwrite to a scratch buffer would defeat
208      * most of the gains to be had here and require storage
209      * management on this buffer, so we don't do this.
210      */
211     return (NULL);
212 }
213 #endif /* NeXT */