xref: /nrf52832-nimble/rt-thread/components/dfs/filesystems/nfs/rpc/xdr_mem.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  */
9*10465441SEvalZero /* @(#)xdr_mem.c	2.1 88/07/29 4.0 RPCSRC */
10*10465441SEvalZero /*
11*10465441SEvalZero  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
12*10465441SEvalZero  * unrestricted use provided that this legend is included on all tape
13*10465441SEvalZero  * media and as a part of the software program in whole or part.  Users
14*10465441SEvalZero  * may copy or modify Sun RPC without charge, but are not authorized
15*10465441SEvalZero  * to license or distribute it to anyone else except as part of a product or
16*10465441SEvalZero  * program developed by the user.
17*10465441SEvalZero  *
18*10465441SEvalZero  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
19*10465441SEvalZero  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
20*10465441SEvalZero  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
21*10465441SEvalZero  *
22*10465441SEvalZero  * Sun RPC is provided with no support and without any obligation on the
23*10465441SEvalZero  * part of Sun Microsystems, Inc. to assist in its use, correction,
24*10465441SEvalZero  * modification or enhancement.
25*10465441SEvalZero  *
26*10465441SEvalZero  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
27*10465441SEvalZero  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
28*10465441SEvalZero  * OR ANY PART THEREOF.
29*10465441SEvalZero  *
30*10465441SEvalZero  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
31*10465441SEvalZero  * or profits or other special, indirect and consequential damages, even if
32*10465441SEvalZero  * Sun has been advised of the possibility of such damages.
33*10465441SEvalZero  *
34*10465441SEvalZero  * Sun Microsystems, Inc.
35*10465441SEvalZero  * 2550 Garcia Avenue
36*10465441SEvalZero  * Mountain View, California  94043
37*10465441SEvalZero  */
38*10465441SEvalZero #if !defined(lint) && defined(SCCSIDS)
39*10465441SEvalZero static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
40*10465441SEvalZero #endif
41*10465441SEvalZero 
42*10465441SEvalZero /*
43*10465441SEvalZero  * xdr_mem.h, XDR implementation using memory buffers.
44*10465441SEvalZero  *
45*10465441SEvalZero  * Copyright (C) 1984, Sun Microsystems, Inc.
46*10465441SEvalZero  *
47*10465441SEvalZero  * If you have some data to be interpreted as external data representation
48*10465441SEvalZero  * or to be converted to external data representation in a memory buffer,
49*10465441SEvalZero  * then this is the package for you.
50*10465441SEvalZero  *
51*10465441SEvalZero  */
52*10465441SEvalZero 
53*10465441SEvalZero #include <rpc/types.h>
54*10465441SEvalZero #include <rpc/xdr.h>
55*10465441SEvalZero #include <string.h>
56*10465441SEvalZero #include <limits.h>
57*10465441SEvalZero 
58*10465441SEvalZero static bool_t xdrmem_getlong (XDR *, long *);
59*10465441SEvalZero static bool_t xdrmem_putlong (XDR *, const long *);
60*10465441SEvalZero static bool_t xdrmem_getbytes (XDR *, char *, unsigned int);
61*10465441SEvalZero static bool_t xdrmem_putbytes (XDR *, const char *, unsigned int);
62*10465441SEvalZero static unsigned int xdrmem_getpos (const XDR *);
63*10465441SEvalZero static bool_t xdrmem_setpos (XDR *, unsigned int);
64*10465441SEvalZero static int32_t *xdrmem_inline (XDR *, unsigned int);
65*10465441SEvalZero static void xdrmem_destroy (XDR *);
66*10465441SEvalZero 
67*10465441SEvalZero static struct xdr_ops xdrmem_ops = {
68*10465441SEvalZero 	xdrmem_getlong,
69*10465441SEvalZero 	xdrmem_putlong,
70*10465441SEvalZero 	xdrmem_getbytes,
71*10465441SEvalZero 	xdrmem_putbytes,
72*10465441SEvalZero 	xdrmem_getpos,
73*10465441SEvalZero 	xdrmem_setpos,
74*10465441SEvalZero 	xdrmem_inline,
75*10465441SEvalZero 	xdrmem_destroy,
76*10465441SEvalZero 	NULL,
77*10465441SEvalZero 	NULL
78*10465441SEvalZero };
79*10465441SEvalZero 
80*10465441SEvalZero 
81*10465441SEvalZero /*
82*10465441SEvalZero  * The procedure xdrmem_create initializes a stream descriptor for a
83*10465441SEvalZero  * memory buffer.
84*10465441SEvalZero  */
85*10465441SEvalZero void
xdrmem_create(XDR * xdrs,const char * addr,unsigned int size,enum xdr_op op)86*10465441SEvalZero xdrmem_create (XDR *xdrs, const char* addr, unsigned int size, enum xdr_op op)
87*10465441SEvalZero {
88*10465441SEvalZero 	xdrs->x_op = op;
89*10465441SEvalZero 	xdrs->x_ops = &xdrmem_ops;
90*10465441SEvalZero 	xdrs->x_private = xdrs->x_base = (char*)addr;
91*10465441SEvalZero 	xdrs->x_handy = size;
92*10465441SEvalZero }
93*10465441SEvalZero 
94*10465441SEvalZero static void
xdrmem_destroy(XDR * xdrs)95*10465441SEvalZero xdrmem_destroy (XDR *xdrs)
96*10465441SEvalZero {
97*10465441SEvalZero }
98*10465441SEvalZero 
99*10465441SEvalZero static bool_t
xdrmem_getlong(XDR * xdrs,long * lp)100*10465441SEvalZero xdrmem_getlong (XDR *xdrs, long *lp)
101*10465441SEvalZero {
102*10465441SEvalZero   if (xdrs->x_handy < 4) return FALSE;
103*10465441SEvalZero   xdrs->x_handy -= 4;
104*10465441SEvalZero 
105*10465441SEvalZero   *lp = (int32_t) ntohl((*((int32_t *) (xdrs->x_private))));
106*10465441SEvalZero   xdrs->x_private += 4;
107*10465441SEvalZero   return TRUE;
108*10465441SEvalZero }
109*10465441SEvalZero 
110*10465441SEvalZero static bool_t
xdrmem_putlong(XDR * xdrs,const long * lp)111*10465441SEvalZero xdrmem_putlong (XDR *xdrs, const long *lp)
112*10465441SEvalZero {
113*10465441SEvalZero   if (xdrs->x_handy < 4) return FALSE;
114*10465441SEvalZero   xdrs->x_handy -= 4;
115*10465441SEvalZero 
116*10465441SEvalZero   *(int32_t *) xdrs->x_private = htonl(*lp);
117*10465441SEvalZero   xdrs->x_private += 4;
118*10465441SEvalZero   return (TRUE);
119*10465441SEvalZero }
120*10465441SEvalZero 
121*10465441SEvalZero static bool_t
xdrmem_getbytes(XDR * xdrs,char * addr,unsigned int len)122*10465441SEvalZero xdrmem_getbytes (XDR *xdrs, char *addr, unsigned int len)
123*10465441SEvalZero {
124*10465441SEvalZero   if (xdrs->x_handy < len) return FALSE;
125*10465441SEvalZero   xdrs->x_handy -= len;
126*10465441SEvalZero   memmove(addr, xdrs->x_private, len);
127*10465441SEvalZero   xdrs->x_private += len;
128*10465441SEvalZero   return TRUE;
129*10465441SEvalZero }
130*10465441SEvalZero 
131*10465441SEvalZero static bool_t
xdrmem_putbytes(XDR * xdrs,const char * addr,unsigned int len)132*10465441SEvalZero xdrmem_putbytes (XDR *xdrs, const char *addr, unsigned int len)
133*10465441SEvalZero {
134*10465441SEvalZero   if (xdrs->x_handy < len) return FALSE;
135*10465441SEvalZero   xdrs->x_handy -= len;
136*10465441SEvalZero   memmove(xdrs->x_private, addr, len);
137*10465441SEvalZero   xdrs->x_private += len;
138*10465441SEvalZero   return (TRUE);
139*10465441SEvalZero }
140*10465441SEvalZero 
xdrmem_getpos(const XDR * xdrs)141*10465441SEvalZero static unsigned int xdrmem_getpos (const XDR *xdrs)
142*10465441SEvalZero {
143*10465441SEvalZero 	return ((unsigned long) xdrs->x_private - (unsigned long) xdrs->x_base);
144*10465441SEvalZero }
145*10465441SEvalZero 
xdrmem_setpos(XDR * xdrs,unsigned int pos)146*10465441SEvalZero static bool_t xdrmem_setpos(XDR *xdrs, unsigned int pos)
147*10465441SEvalZero {
148*10465441SEvalZero   register char* newaddr = xdrs->x_base + pos;
149*10465441SEvalZero   register char* lastaddr = xdrs->x_private + xdrs->x_handy;
150*10465441SEvalZero 
151*10465441SEvalZero   if ((long) newaddr > (long) lastaddr
152*10465441SEvalZero 	  || (UINT_MAX < LONG_MAX
153*10465441SEvalZero 		  && (long) UINT_MAX < (long) lastaddr - (long) newaddr))
154*10465441SEvalZero 	  return (FALSE);
155*10465441SEvalZero   xdrs->x_private = newaddr;
156*10465441SEvalZero   xdrs->x_handy = (long) lastaddr - (long) newaddr;
157*10465441SEvalZero   return (TRUE);
158*10465441SEvalZero }
159*10465441SEvalZero 
160*10465441SEvalZero static int32_t *
xdrmem_inline(XDR * xdrs,unsigned int len)161*10465441SEvalZero xdrmem_inline (XDR *xdrs, unsigned int len)
162*10465441SEvalZero {
163*10465441SEvalZero 	int32_t *buf = 0;
164*10465441SEvalZero 
165*10465441SEvalZero 	if (xdrs->x_handy >= len) {
166*10465441SEvalZero 		xdrs->x_handy -= len;
167*10465441SEvalZero 		buf = (int32_t *) xdrs->x_private;
168*10465441SEvalZero 		xdrs->x_private += len;
169*10465441SEvalZero 	}
170*10465441SEvalZero 	return (buf);
171*10465441SEvalZero }
172*10465441SEvalZero 
173