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