1 /* Copyright (c) 1998-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #include <rpc/types.h>
19 
20 /* We play dirty tricks with aliases.  */
21 #include <rpc/xdr.h>
22 
23 #include <stdint.h>
24 #include <shlib-compat.h>
25 
26 /* XDR 64bit integers */
27 bool_t
xdr_int64_t(XDR * xdrs,int64_t * ip)28 xdr_int64_t (XDR *xdrs, int64_t *ip)
29 {
30   int32_t t1, t2;
31 
32   switch (xdrs->x_op)
33     {
34     case XDR_ENCODE:
35       t1 = (int32_t) ((*ip) >> 32);
36       t2 = (int32_t) (*ip);
37       return (XDR_PUTINT32(xdrs, &t1) && XDR_PUTINT32(xdrs, &t2));
38     case XDR_DECODE:
39       if (!XDR_GETINT32(xdrs, &t1) || !XDR_GETINT32(xdrs, &t2))
40 	return FALSE;
41       *ip = ((int64_t) t1) << 32;
42       *ip |= (uint32_t) t2;	/* Avoid sign extension.  */
43       return TRUE;
44     case XDR_FREE:
45       return TRUE;
46     default:
47       return FALSE;
48     }
49 }
libc_hidden_nolink_sunrpc(xdr_int64_t,GLIBC_2_1_1)50 libc_hidden_nolink_sunrpc (xdr_int64_t, GLIBC_2_1_1)
51 
52 bool_t
53 xdr_quad_t (XDR *xdrs, quad_t *ip)
54 {
55   return xdr_int64_t (xdrs, (int64_t *) ip);
56 }
libc_hidden_nolink_sunrpc(xdr_quad_t,GLIBC_2_3_4)57 libc_hidden_nolink_sunrpc (xdr_quad_t, GLIBC_2_3_4)
58 
59 /* XDR 64bit unsigned integers */
60 bool_t
61 xdr_uint64_t (XDR *xdrs, uint64_t *uip)
62 {
63   uint32_t t1;
64   uint32_t t2;
65 
66   switch (xdrs->x_op)
67     {
68     case XDR_ENCODE:
69       t1 = (uint32_t) ((*uip) >> 32);
70       t2 = (uint32_t) (*uip);
71       return (XDR_PUTINT32 (xdrs, (int32_t *) &t1) &&
72 	      XDR_PUTINT32(xdrs, (int32_t *) &t2));
73     case XDR_DECODE:
74       if (!XDR_GETINT32(xdrs, (int32_t *) &t1) ||
75 	  !XDR_GETINT32(xdrs, (int32_t *) &t2))
76 	return FALSE;
77       *uip = ((uint64_t) t1) << 32;
78       *uip |= t2;
79       return TRUE;
80     case XDR_FREE:
81       return TRUE;
82     default:
83       return FALSE;
84     }
85 }
libc_hidden_nolink_sunrpc(xdr_uint64_t,GLIBC_2_1_1)86 libc_hidden_nolink_sunrpc (xdr_uint64_t, GLIBC_2_1_1)
87 
88 bool_t
89 xdr_u_quad_t (XDR *xdrs, u_quad_t *ip)
90 {
91   return xdr_uint64_t (xdrs, (uint64_t *) ip);
92 }
libc_hidden_nolink_sunrpc(xdr_u_quad_t,GLIBC_2_3_4)93 libc_hidden_nolink_sunrpc (xdr_u_quad_t, GLIBC_2_3_4)
94 
95 /* XDR 32bit integers */
96 bool_t
97 xdr_int32_t (XDR *xdrs, int32_t *lp)
98 {
99   switch (xdrs->x_op)
100     {
101     case XDR_ENCODE:
102       return XDR_PUTINT32 (xdrs, lp);
103     case XDR_DECODE:
104       return XDR_GETINT32 (xdrs, lp);
105     case XDR_FREE:
106       return TRUE;
107     default:
108       return FALSE;
109     }
110 }
libc_hidden_nolink_sunrpc(xdr_int32_t,GLIBC_2_1)111 libc_hidden_nolink_sunrpc (xdr_int32_t, GLIBC_2_1)
112 
113 /* XDR 32bit unsigned integers */
114 bool_t
115 xdr_uint32_t (XDR *xdrs, uint32_t *ulp)
116 {
117   switch (xdrs->x_op)
118     {
119     case XDR_ENCODE:
120       return XDR_PUTINT32 (xdrs, (int32_t *) ulp);
121     case XDR_DECODE:
122       return XDR_GETINT32 (xdrs, (int32_t *) ulp);
123     case XDR_FREE:
124       return TRUE;
125     default:
126       return FALSE;
127     }
128 }
129 #ifdef EXPORT_RPC_SYMBOLS
libc_hidden_def(xdr_uint32_t)130 libc_hidden_def (xdr_uint32_t)
131 #else
132 libc_hidden_nolink_sunrpc (xdr_uint32_t, GLIBC_2_1)
133 #endif
134 
135 /* XDR 16bit integers */
136 bool_t
137 xdr_int16_t (XDR *xdrs, int16_t *ip)
138 {
139   int32_t t;
140 
141   switch (xdrs->x_op)
142     {
143     case XDR_ENCODE:
144       t = (int32_t) *ip;
145       return XDR_PUTINT32 (xdrs, &t);
146     case XDR_DECODE:
147       if (!XDR_GETINT32 (xdrs, &t))
148 	return FALSE;
149       *ip = (int16_t) t;
150       return TRUE;
151     case XDR_FREE:
152       return TRUE;
153     default:
154       return FALSE;
155     }
156 }
libc_hidden_nolink_sunrpc(xdr_int16_t,GLIBC_2_1)157 libc_hidden_nolink_sunrpc (xdr_int16_t, GLIBC_2_1)
158 
159 /* XDR 16bit unsigned integers */
160 bool_t
161 xdr_uint16_t (XDR *xdrs, uint16_t *uip)
162 {
163   uint32_t ut;
164 
165   switch (xdrs->x_op)
166     {
167     case XDR_ENCODE:
168       ut = (uint32_t) *uip;
169       return XDR_PUTINT32 (xdrs, (int32_t *) &ut);
170     case XDR_DECODE:
171       if (!XDR_GETINT32 (xdrs, (int32_t *) &ut))
172 	return FALSE;
173       *uip = (uint16_t) ut;
174       return TRUE;
175     case XDR_FREE:
176       return TRUE;
177     default:
178       return FALSE;
179     }
180 }
libc_hidden_nolink_sunrpc(xdr_uint16_t,GLIBC_2_1)181 libc_hidden_nolink_sunrpc (xdr_uint16_t, GLIBC_2_1)
182 
183 /* XDR 8bit integers */
184 bool_t
185 xdr_int8_t (XDR *xdrs, int8_t *ip)
186 {
187   int32_t t;
188 
189   switch (xdrs->x_op)
190     {
191     case XDR_ENCODE:
192       t = (int32_t) *ip;
193       return XDR_PUTINT32 (xdrs, &t);
194     case XDR_DECODE:
195       if (!XDR_GETINT32 (xdrs, &t))
196 	return FALSE;
197       *ip = (int8_t) t;
198       return TRUE;
199     case XDR_FREE:
200       return TRUE;
201     default:
202       return FALSE;
203     }
204 }
libc_hidden_nolink_sunrpc(xdr_int8_t,GLIBC_2_1)205 libc_hidden_nolink_sunrpc (xdr_int8_t, GLIBC_2_1)
206 
207 /* XDR 8bit unsigned integers */
208 bool_t
209 xdr_uint8_t (XDR *xdrs, uint8_t *uip)
210 {
211   uint32_t ut;
212 
213   switch (xdrs->x_op)
214     {
215     case XDR_ENCODE:
216       ut = (uint32_t) *uip;
217       return XDR_PUTINT32 (xdrs, (int32_t *) &ut);
218     case XDR_DECODE:
219       if (!XDR_GETINT32 (xdrs, (int32_t *) &ut))
220 	return FALSE;
221       *uip = (uint8_t) ut;
222       return TRUE;
223     case XDR_FREE:
224       return TRUE;
225     default:
226       return FALSE;
227     }
228 }
229 libc_hidden_nolink_sunrpc (xdr_uint8_t, GLIBC_2_1)
230