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