]>
Commit | Line | Data |
---|---|---|
28f540f4 RM |
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. | |
6d52618b | 8 | * |
28f540f4 RM |
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. | |
6d52618b | 12 | * |
28f540f4 RM |
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. | |
6d52618b | 16 | * |
28f540f4 RM |
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. | |
6d52618b | 20 | * |
28f540f4 RM |
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. | |
6d52618b | 24 | * |
28f540f4 RM |
25 | * Sun Microsystems, Inc. |
26 | * 2550 Garcia Avenue | |
27 | * Mountain View, California 94043 | |
28 | */ | |
28f540f4 RM |
29 | |
30 | /* | |
31 | * xdr_stdio.c, XDR implementation on standard i/o file. | |
32 | * | |
33 | * Copyright (C) 1984, Sun Microsystems, Inc. | |
34 | * | |
35 | * This set of routines implements a XDR on a stdio stream. | |
36 | * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes | |
37 | * from the stream. | |
38 | */ | |
39 | ||
40 | #include <rpc/types.h> | |
41 | #include <stdio.h> | |
42 | #include <rpc/xdr.h> | |
43 | ||
50304ef0 UD |
44 | #ifdef USE_IN_LIBIO |
45 | # include <libio/iolibio.h> | |
77fe0b9c UD |
46 | # define fflush(s) INTUSE(_IO_fflush) (s) |
47 | # define fread(p, m, n, s) INTUSE(_IO_fread) (p, m, n, s) | |
48 | # define ftell(s) INTUSE(_IO_ftell) (s) | |
49 | # define fwrite(p, m, n, s) INTUSE(_IO_fwrite) (p, m, n, s) | |
50304ef0 UD |
50 | #endif |
51 | ||
e7fd8a39 | 52 | static bool_t xdrstdio_getlong (XDR *, long *); |
1f205a47 | 53 | static bool_t xdrstdio_putlong (XDR *, const long *); |
e7fd8a39 | 54 | static bool_t xdrstdio_getbytes (XDR *, caddr_t, u_int); |
bfbc5754 UD |
55 | static bool_t xdrstdio_putbytes (XDR *, const char *, u_int); |
56 | static u_int xdrstdio_getpos (const XDR *); | |
e7fd8a39 | 57 | static bool_t xdrstdio_setpos (XDR *, u_int); |
55187f62 | 58 | static int32_t *xdrstdio_inline (XDR *, u_int); |
92f1da4d | 59 | static void xdrstdio_destroy (XDR *); |
7d1de115 UD |
60 | static bool_t xdrstdio_getint32 (XDR *, int32_t *); |
61 | static bool_t xdrstdio_putint32 (XDR *, const int32_t *); | |
28f540f4 RM |
62 | |
63 | /* | |
64 | * Ops vector for stdio type XDR | |
65 | */ | |
e7fd8a39 UD |
66 | static const struct xdr_ops xdrstdio_ops = |
67 | { | |
68 | xdrstdio_getlong, /* deserialize a long int */ | |
69 | xdrstdio_putlong, /* serialize a long int */ | |
70 | xdrstdio_getbytes, /* deserialize counted bytes */ | |
71 | xdrstdio_putbytes, /* serialize counted bytes */ | |
72 | xdrstdio_getpos, /* get offset in the stream */ | |
73 | xdrstdio_setpos, /* set offset in the stream */ | |
74 | xdrstdio_inline, /* prime stream for inline macros */ | |
7d1de115 UD |
75 | xdrstdio_destroy, /* destroy stream */ |
76 | xdrstdio_getint32, /* deserialize a int */ | |
77 | xdrstdio_putint32 /* serialize a int */ | |
28f540f4 RM |
78 | }; |
79 | ||
80 | /* | |
81 | * Initialize a stdio xdr stream. | |
82 | * Sets the xdr stream handle xdrs for use on the stream file. | |
83 | * Operation flag is set to op. | |
84 | */ | |
85 | void | |
f8afba91 | 86 | xdrstdio_create (XDR *xdrs, FILE *file, enum xdr_op op) |
28f540f4 | 87 | { |
e7fd8a39 | 88 | xdrs->x_op = op; |
737547be UD |
89 | /* We have to add the const since the `struct xdr_ops' in `struct XDR' |
90 | is not `const'. */ | |
91 | xdrs->x_ops = (struct xdr_ops *) &xdrstdio_ops; | |
e7fd8a39 UD |
92 | xdrs->x_private = (caddr_t) file; |
93 | xdrs->x_handy = 0; | |
94 | xdrs->x_base = 0; | |
28f540f4 RM |
95 | } |
96 | ||
97 | /* | |
98 | * Destroy a stdio xdr stream. | |
99 | * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create. | |
100 | */ | |
101 | static void | |
f8afba91 | 102 | xdrstdio_destroy (XDR *xdrs) |
28f540f4 | 103 | { |
e7fd8a39 UD |
104 | (void) fflush ((FILE *) xdrs->x_private); |
105 | /* xx should we close the file ?? */ | |
28f540f4 RM |
106 | }; |
107 | ||
108 | static bool_t | |
f8afba91 | 109 | xdrstdio_getlong (XDR *xdrs, long *lp) |
28f540f4 | 110 | { |
a334319f | 111 | int32_t mycopy; |
28f540f4 | 112 | |
a334319f | 113 | if (fread ((caddr_t) & mycopy, 4, 1, (FILE *) xdrs->x_private) != 1) |
e7fd8a39 | 114 | return FALSE; |
a334319f | 115 | *lp = (int32_t) ntohl (mycopy); |
e7fd8a39 | 116 | return TRUE; |
28f540f4 RM |
117 | } |
118 | ||
119 | static bool_t | |
1f205a47 | 120 | xdrstdio_putlong (XDR *xdrs, const long *lp) |
28f540f4 | 121 | { |
a334319f UD |
122 | long mycopy = htonl (*lp); |
123 | lp = &mycopy; | |
124 | if (fwrite ((caddr_t) lp, 4, 1, (FILE *) xdrs->x_private) != 1) | |
e7fd8a39 UD |
125 | return FALSE; |
126 | return TRUE; | |
28f540f4 RM |
127 | } |
128 | ||
129 | static bool_t | |
f8afba91 | 130 | xdrstdio_getbytes (XDR *xdrs, const caddr_t addr, u_int len) |
28f540f4 | 131 | { |
f8afba91 UD |
132 | if ((len != 0) && (fread (addr, (int) len, 1, |
133 | (FILE *) xdrs->x_private) != 1)) | |
e7fd8a39 UD |
134 | return FALSE; |
135 | return TRUE; | |
28f540f4 RM |
136 | } |
137 | ||
138 | static bool_t | |
bfbc5754 | 139 | xdrstdio_putbytes (XDR *xdrs, const char *addr, u_int len) |
28f540f4 | 140 | { |
f8afba91 UD |
141 | if ((len != 0) && (fwrite (addr, (int) len, 1, |
142 | (FILE *) xdrs->x_private) != 1)) | |
e7fd8a39 UD |
143 | return FALSE; |
144 | return TRUE; | |
28f540f4 RM |
145 | } |
146 | ||
147 | static u_int | |
bfbc5754 | 148 | xdrstdio_getpos (const XDR *xdrs) |
28f540f4 | 149 | { |
e7fd8a39 | 150 | return (u_int) ftell ((FILE *) xdrs->x_private); |
28f540f4 RM |
151 | } |
152 | ||
153 | static bool_t | |
e7fd8a39 | 154 | xdrstdio_setpos (XDR *xdrs, u_int pos) |
6d52618b | 155 | { |
e7fd8a39 | 156 | return fseek ((FILE *) xdrs->x_private, (long) pos, 0) < 0 ? FALSE : TRUE; |
28f540f4 RM |
157 | } |
158 | ||
f8afba91 | 159 | static int32_t * |
55187f62 | 160 | xdrstdio_inline (XDR *xdrs, u_int len) |
28f540f4 | 161 | { |
e7fd8a39 UD |
162 | /* |
163 | * Must do some work to implement this: must insure | |
164 | * enough data in the underlying stdio buffer, | |
165 | * that the buffer is aligned so that we can indirect through a | |
166 | * long *, and stuff this pointer in xdrs->x_buf. Doing | |
167 | * a fread or fwrite to a scratch buffer would defeat | |
168 | * most of the gains to be had here and require storage | |
169 | * management on this buffer, so we don't do this. | |
170 | */ | |
171 | return NULL; | |
28f540f4 | 172 | } |
7d1de115 UD |
173 | |
174 | static bool_t | |
175 | xdrstdio_getint32 (XDR *xdrs, int32_t *ip) | |
176 | { | |
177 | int32_t mycopy; | |
178 | ||
179 | if (fread ((caddr_t) &mycopy, 4, 1, (FILE *) xdrs->x_private) != 1) | |
180 | return FALSE; | |
181 | *ip = ntohl (mycopy); | |
182 | return TRUE; | |
183 | } | |
184 | ||
185 | static bool_t | |
186 | xdrstdio_putint32 (XDR *xdrs, const int32_t *ip) | |
187 | { | |
188 | int32_t mycopy = htonl (*ip); | |
189 | ||
190 | ip = &mycopy; | |
191 | if (fwrite ((caddr_t) ip, 4, 1, (FILE *) xdrs->x_private) != 1) | |
192 | return FALSE; | |
193 | return TRUE; | |
194 | } | |
e436294b RM |
195 | |
196 | libc_hidden_def (xdrstdio_create) |