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