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