linux-updates-20060309
[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 RCSID
33     ("$Header$");
34
35 #ifndef NeXT
36
37 /*
38  * xdr_stdio.c, XDR implementation on standard i/o file.
39  *
40  * Copyright (C) 1984, Sun Microsystems, Inc.
41  *
42  * This set of routines implements a XDR on a stdio stream.
43  * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes
44  * from the stream.
45  */
46
47 #include <stdio.h>
48 #include "xdr.h"
49
50 static bool_t xdrstdio_getint32();
51 static bool_t xdrstdio_putint32();
52 static bool_t xdrstdio_getbytes();
53 static bool_t xdrstdio_putbytes();
54 static u_int xdrstdio_getpos();
55 static bool_t xdrstdio_setpos();
56 static afs_int32 *xdrstdio_inline();
57 static void xdrstdio_destroy();
58
59 /*
60  * Ops vector for stdio type XDR
61  */
62 static struct xdr_ops xdrstdio_ops = {
63     xdrstdio_getint32,          /* deserialize an afs_int32 */
64     xdrstdio_putint32,          /* serialize an afs_int32 */
65     xdrstdio_getbytes,          /* deserialize counted bytes */
66     xdrstdio_putbytes,          /* serialize counted bytes */
67     xdrstdio_getpos,            /* get offset in the stream */
68     xdrstdio_setpos,            /* set offset in the stream */
69     xdrstdio_inline,            /* prime stream for inline macros */
70     xdrstdio_destroy            /* destroy stream */
71 };
72
73 /*
74  * Initialize a stdio xdr stream.
75  * Sets the xdr stream handle xdrs for use on the stream file.
76  * Operation flag is set to op.
77  */
78 void
79 xdrstdio_create(xdrs, file, op)
80      register XDR *xdrs;
81      FILE *file;
82      enum xdr_op op;
83 {
84
85     xdrs->x_op = op;
86     xdrs->x_ops = &xdrstdio_ops;
87     xdrs->x_private = (caddr_t) file;
88     xdrs->x_handy = 0;
89     xdrs->x_base = 0;
90 }
91
92 /*
93  * Destroy a stdio xdr stream.
94  * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
95  */
96 static void
97 xdrstdio_destroy(xdrs)
98      register XDR *xdrs;
99 {
100     (void)fflush((FILE *) xdrs->x_private);
101     /* xx should we close the file ?? */
102 };
103
104 static bool_t
105 xdrstdio_getint32(xdrs, lp)
106      XDR *xdrs;
107      register afs_int32 *lp;
108 {
109
110     if (fread((caddr_t) lp, sizeof(afs_int32), 1, (FILE *) xdrs->x_private) !=
111         1)
112         return (FALSE);
113 #ifndef mc68000
114     *lp = ntohl(*lp);
115 #endif
116     return (TRUE);
117 }
118
119 static bool_t
120 xdrstdio_putint32(xdrs, lp)
121      XDR *xdrs;
122      afs_int32 *lp;
123 {
124
125 #ifndef mc68000
126     afs_int32 mycopy = htonl(*lp);
127     lp = &mycopy;
128 #endif
129     if (fwrite((caddr_t) lp, sizeof(afs_int32), 1, (FILE *) xdrs->x_private)
130         != 1)
131         return (FALSE);
132     return (TRUE);
133 }
134
135 static bool_t
136 xdrstdio_getbytes(xdrs, addr, len)
137      XDR *xdrs;
138      caddr_t addr;
139      u_int len;
140 {
141
142     if ((len != 0)
143         && (fread(addr, (int)len, 1, (FILE *) xdrs->x_private) != 1))
144         return (FALSE);
145     return (TRUE);
146 }
147
148 static bool_t
149 xdrstdio_putbytes(xdrs, addr, len)
150      XDR *xdrs;
151      caddr_t addr;
152      u_int len;
153 {
154
155     if ((len != 0)
156         && (fwrite(addr, (int)len, 1, (FILE *) xdrs->x_private) != 1))
157         return (FALSE);
158     return (TRUE);
159 }
160
161 static u_int
162 xdrstdio_getpos(xdrs)
163      XDR *xdrs;
164 {
165
166     return ((u_int) ftell((FILE *) xdrs->x_private));
167 }
168
169 static bool_t
170 xdrstdio_setpos(xdrs, pos)
171      XDR *xdrs;
172      u_int pos;
173 {
174
175     return ((fseek((FILE *) xdrs->x_private, (afs_int32) pos, 0) <
176              0) ? FALSE : TRUE);
177 }
178
179 static afs_int32 *
180 xdrstdio_inline(xdrs, len)
181      XDR *xdrs;
182      u_int len;
183 {
184
185     /*
186      * Must do some work to implement this: must insure
187      * enough data in the underlying stdio buffer,
188      * that the buffer is aligned so that we can indirect through a
189      * afs_int32 *, and stuff this pointer in xdrs->x_buf.  Doing
190      * a fread or fwrite to a scratch buffer would defeat
191      * most of the gains to be had here and require storage
192      * management on this buffer, so we don't do this.
193      */
194     return (NULL);
195 }
196 #endif /* NeXT */