|
|
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_mem.c 1.4 85/03/14 Copyr 1984 Sun Micro";
31: #endif
32:
33: /*
34: * xdr_mem.h, XDR implementation using memory buffers.
35: *
36: * Copyright (C) 1984, Sun Microsystems, Inc.
37: *
38: * If you have some data to be interpreted as external data representation
39: * or to be converted to external data representation in a memory buffer,
40: * then this is the package for you.
41: *
42: */
43:
44: #include "types.h"
45: #include "xdr.h"
46: #include <netinet/in.h>
47:
48: static bool_t xdrmem_getlong();
49: static bool_t xdrmem_putlong();
50: static bool_t xdrmem_getbytes();
51: static bool_t xdrmem_putbytes();
52: static u_int xdrmem_getpos();
53: static bool_t xdrmem_setpos();
54: static long * xdrmem_inline();
55: static void xdrmem_destroy();
56:
57: static struct xdr_ops xdrmem_ops = {
58: xdrmem_getlong,
59: xdrmem_putlong,
60: xdrmem_getbytes,
61: xdrmem_putbytes,
62: xdrmem_getpos,
63: xdrmem_setpos,
64: xdrmem_inline,
65: xdrmem_destroy
66: };
67:
68: /*
69: * The procedure xdrmem_create initializes a stream descriptor for a
70: * memory buffer.
71: */
72: void
73: xdrmem_create(xdrs, addr, size, op)
74: register XDR *xdrs;
75: caddr_t addr;
76: u_int size;
77: enum xdr_op op;
78: {
79:
80: xdrs->x_op = op;
81: xdrs->x_ops = &xdrmem_ops;
82: xdrs->x_private = xdrs->x_base = addr;
83: xdrs->x_handy = size;
84: }
85:
86: static void
87: xdrmem_destroy(/*xdrs*/)
88: /*XDR *xdrs;*/
89: {
90: }
91:
92: static bool_t
93: xdrmem_getlong(xdrs, lp)
94: register XDR *xdrs;
95: long *lp;
96: {
97:
98: if ((xdrs->x_handy -= sizeof(long)) < 0)
99: return (FALSE);
100: *lp = ntohl(*((long *)(xdrs->x_private)));
101: xdrs->x_private += sizeof(long);
102: return (TRUE);
103: }
104:
105: static bool_t
106: xdrmem_putlong(xdrs, lp)
107: register XDR *xdrs;
108: long *lp;
109: {
110:
111: if ((xdrs->x_handy -= sizeof(long)) < 0)
112: return (FALSE);
113: *(long *)xdrs->x_private = htonl(*lp);
114: xdrs->x_private += sizeof(long);
115: return (TRUE);
116: }
117:
118: static bool_t
119: xdrmem_getbytes(xdrs, addr, len)
120: register XDR *xdrs;
121: caddr_t addr;
122: register u_int len;
123: {
124:
125: if ((xdrs->x_handy -= len) < 0)
126: return (FALSE);
127: bcopy(xdrs->x_private, addr, len);
128: xdrs->x_private += len;
129: return (TRUE);
130: }
131:
132: static bool_t
133: xdrmem_putbytes(xdrs, addr, len)
134: register XDR *xdrs;
135: caddr_t addr;
136: register u_int len;
137: {
138:
139: if ((xdrs->x_handy -= len) < 0)
140: return (FALSE);
141: bcopy(addr, xdrs->x_private, len);
142: xdrs->x_private += len;
143: return (TRUE);
144: }
145:
146: static u_int
147: xdrmem_getpos(xdrs)
148: register XDR *xdrs;
149: {
150:
151: return ((u_int)xdrs->x_private - (u_int)xdrs->x_base);
152: }
153:
154: static bool_t
155: xdrmem_setpos(xdrs, pos)
156: register XDR *xdrs;
157: u_int pos;
158: {
159: register caddr_t newaddr = xdrs->x_base + pos;
160: register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
161:
162: if ((long)newaddr > (long)lastaddr)
163: return (FALSE);
164: xdrs->x_private = newaddr;
165: xdrs->x_handy = (int)lastaddr - (int)newaddr;
166: return (TRUE);
167: }
168:
169: static long *
170: xdrmem_inline(xdrs, len)
171: register XDR *xdrs;
172: int len;
173: {
174: long *buf = 0;
175:
176: if (xdrs->x_handy >= len) {
177: xdrs->x_handy -= len;
178: buf = (long *) xdrs->x_private;
179: xdrs->x_private += len;
180: }
181: return (buf);
182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.