xref: /freebsd/sys/xdr/xdr.c (revision a5d1cf5e362a2e3c3ebdf6d8f2b86658a6d0b9d6)
1dfdcada3SDoug Rabson /*	$NetBSD: xdr.c,v 1.22 2000/07/06 03:10:35 christos Exp $	*/
2dfdcada3SDoug Rabson 
3dfdcada3SDoug Rabson /*
4dfdcada3SDoug Rabson  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
5dfdcada3SDoug Rabson  * unrestricted use provided that this legend is included on all tape
6dfdcada3SDoug Rabson  * media and as a part of the software program in whole or part.  Users
7dfdcada3SDoug Rabson  * may copy or modify Sun RPC without charge, but are not authorized
8dfdcada3SDoug Rabson  * to license or distribute it to anyone else except as part of a product or
9dfdcada3SDoug Rabson  * program developed by the user.
10dfdcada3SDoug Rabson  *
11dfdcada3SDoug Rabson  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
12dfdcada3SDoug Rabson  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
13dfdcada3SDoug Rabson  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
14dfdcada3SDoug Rabson  *
15dfdcada3SDoug Rabson  * Sun RPC is provided with no support and without any obligation on the
16dfdcada3SDoug Rabson  * part of Sun Microsystems, Inc. to assist in its use, correction,
17dfdcada3SDoug Rabson  * modification or enhancement.
18dfdcada3SDoug Rabson  *
19dfdcada3SDoug Rabson  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
20dfdcada3SDoug Rabson  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
21dfdcada3SDoug Rabson  * OR ANY PART THEREOF.
22dfdcada3SDoug Rabson  *
23dfdcada3SDoug Rabson  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
24dfdcada3SDoug Rabson  * or profits or other special, indirect and consequential damages, even if
25dfdcada3SDoug Rabson  * Sun has been advised of the possibility of such damages.
26dfdcada3SDoug Rabson  *
27dfdcada3SDoug Rabson  * Sun Microsystems, Inc.
28dfdcada3SDoug Rabson  * 2550 Garcia Avenue
29dfdcada3SDoug Rabson  * Mountain View, California  94043
30dfdcada3SDoug Rabson  */
31dfdcada3SDoug Rabson 
32dfdcada3SDoug Rabson #include <sys/cdefs.h>
33dfdcada3SDoug Rabson /*
34dfdcada3SDoug Rabson  * xdr.c, Generic XDR routines implementation.
35dfdcada3SDoug Rabson  *
36dfdcada3SDoug Rabson  * Copyright (C) 1986, Sun Microsystems, Inc.
37dfdcada3SDoug Rabson  *
38dfdcada3SDoug Rabson  * These are the "generic" xdr routines used to serialize and de-serialize
39dfdcada3SDoug Rabson  * most common data items.  See xdr.h for more info on the interface to
40dfdcada3SDoug Rabson  * xdr.
41dfdcada3SDoug Rabson  */
42dfdcada3SDoug Rabson 
43dfdcada3SDoug Rabson #include <sys/param.h>
44dfdcada3SDoug Rabson #include <sys/systm.h>
45dfdcada3SDoug Rabson #include <sys/kernel.h>
46dfdcada3SDoug Rabson #include <sys/malloc.h>
47732a02b4SGleb Smirnoff #include <sys/module.h>
48dfdcada3SDoug Rabson 
496448ec89SXin LI #include <rpc/rpc.h>
506448ec89SXin LI #include <rpc/rpc_com.h>
51dfdcada3SDoug Rabson #include <rpc/types.h>
52dfdcada3SDoug Rabson #include <rpc/xdr.h>
53dfdcada3SDoug Rabson 
54dfdcada3SDoug Rabson typedef quad_t          longlong_t;     /* ANSI long long type */
55dfdcada3SDoug Rabson typedef u_quad_t        u_longlong_t;   /* ANSI unsigned long long type */
56dfdcada3SDoug Rabson 
57dfdcada3SDoug Rabson /*
58dfdcada3SDoug Rabson  * constants specific to the xdr "protocol"
59dfdcada3SDoug Rabson  */
60dfdcada3SDoug Rabson #define XDR_FALSE	((long) 0)
61dfdcada3SDoug Rabson #define XDR_TRUE	((long) 1)
62dfdcada3SDoug Rabson 
63e5c39410SGleb Smirnoff MALLOC_DEFINE(M_RPC, "rpc", "Remote Procedure Call");
64e5c39410SGleb Smirnoff 
65dfdcada3SDoug Rabson /*
66dfdcada3SDoug Rabson  * for unit alignment
67dfdcada3SDoug Rabson  */
68dfdcada3SDoug Rabson static const char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 };
69dfdcada3SDoug Rabson 
70dfdcada3SDoug Rabson /*
71dfdcada3SDoug Rabson  * Free a data structure using XDR
72dfdcada3SDoug Rabson  * Not a filter, but a convenient utility nonetheless
73dfdcada3SDoug Rabson  */
74dfdcada3SDoug Rabson void
xdr_free(xdrproc_t proc,void * objp)75dfdcada3SDoug Rabson xdr_free(xdrproc_t proc, void *objp)
76dfdcada3SDoug Rabson {
77dfdcada3SDoug Rabson 	XDR x;
78dfdcada3SDoug Rabson 
79dfdcada3SDoug Rabson 	x.x_op = XDR_FREE;
80dfdcada3SDoug Rabson 	(*proc)(&x, objp);
81dfdcada3SDoug Rabson }
82dfdcada3SDoug Rabson 
83dfdcada3SDoug Rabson /*
84dfdcada3SDoug Rabson  * XDR nothing
85dfdcada3SDoug Rabson  */
86dfdcada3SDoug Rabson bool_t
xdr_void(XDR * xrds __unused,void * ptr __unused)87*a5d1cf5eSMark Johnston xdr_void(XDR *xrds __unused, void *ptr __unused)
88dfdcada3SDoug Rabson {
89dfdcada3SDoug Rabson 	return (TRUE);
90dfdcada3SDoug Rabson }
91dfdcada3SDoug Rabson 
92dfdcada3SDoug Rabson /*
93dfdcada3SDoug Rabson  * XDR integers
94dfdcada3SDoug Rabson  */
95dfdcada3SDoug Rabson bool_t
xdr_int(XDR * xdrs,int * ip)96dfdcada3SDoug Rabson xdr_int(XDR *xdrs, int *ip)
97dfdcada3SDoug Rabson {
98dfdcada3SDoug Rabson 	long l;
99dfdcada3SDoug Rabson 
100dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
101dfdcada3SDoug Rabson 	case XDR_ENCODE:
102dfdcada3SDoug Rabson 		l = (long) *ip;
103dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, &l));
104dfdcada3SDoug Rabson 
105dfdcada3SDoug Rabson 	case XDR_DECODE:
106dfdcada3SDoug Rabson 		if (!XDR_GETLONG(xdrs, &l)) {
107dfdcada3SDoug Rabson 			return (FALSE);
108dfdcada3SDoug Rabson 		}
109dfdcada3SDoug Rabson 		*ip = (int) l;
110dfdcada3SDoug Rabson 		return (TRUE);
111dfdcada3SDoug Rabson 
112dfdcada3SDoug Rabson 	case XDR_FREE:
113dfdcada3SDoug Rabson 		return (TRUE);
114dfdcada3SDoug Rabson 	}
115dfdcada3SDoug Rabson 	/* NOTREACHED */
116dfdcada3SDoug Rabson 	return (FALSE);
117dfdcada3SDoug Rabson }
118dfdcada3SDoug Rabson 
119dfdcada3SDoug Rabson /*
120dfdcada3SDoug Rabson  * XDR unsigned integers
121dfdcada3SDoug Rabson  */
122dfdcada3SDoug Rabson bool_t
xdr_u_int(XDR * xdrs,u_int * up)123dfdcada3SDoug Rabson xdr_u_int(XDR *xdrs, u_int *up)
124dfdcada3SDoug Rabson {
125dfdcada3SDoug Rabson 	u_long l;
126dfdcada3SDoug Rabson 
127dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
128dfdcada3SDoug Rabson 	case XDR_ENCODE:
129dfdcada3SDoug Rabson 		l = (u_long) *up;
130dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&l));
131dfdcada3SDoug Rabson 
132dfdcada3SDoug Rabson 	case XDR_DECODE:
133dfdcada3SDoug Rabson 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
134dfdcada3SDoug Rabson 			return (FALSE);
135dfdcada3SDoug Rabson 		}
136dfdcada3SDoug Rabson 		*up = (u_int) l;
137dfdcada3SDoug Rabson 		return (TRUE);
138dfdcada3SDoug Rabson 
139dfdcada3SDoug Rabson 	case XDR_FREE:
140dfdcada3SDoug Rabson 		return (TRUE);
141dfdcada3SDoug Rabson 	}
142dfdcada3SDoug Rabson 	/* NOTREACHED */
143dfdcada3SDoug Rabson 	return (FALSE);
144dfdcada3SDoug Rabson }
145dfdcada3SDoug Rabson 
146dfdcada3SDoug Rabson /*
147dfdcada3SDoug Rabson  * XDR long integers
148dfdcada3SDoug Rabson  * same as xdr_u_long - open coded to save a proc call!
149dfdcada3SDoug Rabson  */
150dfdcada3SDoug Rabson bool_t
xdr_long(XDR * xdrs,long * lp)151dfdcada3SDoug Rabson xdr_long(XDR *xdrs, long *lp)
152dfdcada3SDoug Rabson {
153dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
154dfdcada3SDoug Rabson 	case XDR_ENCODE:
155dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, lp));
156dfdcada3SDoug Rabson 	case XDR_DECODE:
157dfdcada3SDoug Rabson 		return (XDR_GETLONG(xdrs, lp));
158dfdcada3SDoug Rabson 	case XDR_FREE:
159dfdcada3SDoug Rabson 		return (TRUE);
160dfdcada3SDoug Rabson 	}
161dfdcada3SDoug Rabson 	/* NOTREACHED */
162dfdcada3SDoug Rabson 	return (FALSE);
163dfdcada3SDoug Rabson }
164dfdcada3SDoug Rabson 
165dfdcada3SDoug Rabson /*
166dfdcada3SDoug Rabson  * XDR unsigned long integers
167dfdcada3SDoug Rabson  * same as xdr_long - open coded to save a proc call!
168dfdcada3SDoug Rabson  */
169dfdcada3SDoug Rabson bool_t
xdr_u_long(XDR * xdrs,u_long * ulp)170dfdcada3SDoug Rabson xdr_u_long(XDR *xdrs, u_long *ulp)
171dfdcada3SDoug Rabson {
172dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
173dfdcada3SDoug Rabson 	case XDR_ENCODE:
174dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)ulp));
175dfdcada3SDoug Rabson 	case XDR_DECODE:
176dfdcada3SDoug Rabson 		return (XDR_GETLONG(xdrs, (long *)ulp));
177dfdcada3SDoug Rabson 	case XDR_FREE:
178dfdcada3SDoug Rabson 		return (TRUE);
179dfdcada3SDoug Rabson 	}
180dfdcada3SDoug Rabson 	/* NOTREACHED */
181dfdcada3SDoug Rabson 	return (FALSE);
182dfdcada3SDoug Rabson }
183dfdcada3SDoug Rabson 
184dfdcada3SDoug Rabson /*
185dfdcada3SDoug Rabson  * XDR 32-bit integers
186dfdcada3SDoug Rabson  * same as xdr_uint32_t - open coded to save a proc call!
187dfdcada3SDoug Rabson  */
188dfdcada3SDoug Rabson bool_t
xdr_int32_t(XDR * xdrs,int32_t * int32_p)189dfdcada3SDoug Rabson xdr_int32_t(XDR *xdrs, int32_t *int32_p)
190dfdcada3SDoug Rabson {
191dfdcada3SDoug Rabson 	long l;
192dfdcada3SDoug Rabson 
193dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
194dfdcada3SDoug Rabson 	case XDR_ENCODE:
195dfdcada3SDoug Rabson 		l = (long) *int32_p;
196dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, &l));
197dfdcada3SDoug Rabson 
198dfdcada3SDoug Rabson 	case XDR_DECODE:
199dfdcada3SDoug Rabson 		if (!XDR_GETLONG(xdrs, &l)) {
200dfdcada3SDoug Rabson 			return (FALSE);
201dfdcada3SDoug Rabson 		}
202dfdcada3SDoug Rabson 		*int32_p = (int32_t) l;
203dfdcada3SDoug Rabson 		return (TRUE);
204dfdcada3SDoug Rabson 
205dfdcada3SDoug Rabson 	case XDR_FREE:
206dfdcada3SDoug Rabson 		return (TRUE);
207dfdcada3SDoug Rabson 	}
208dfdcada3SDoug Rabson 	/* NOTREACHED */
209dfdcada3SDoug Rabson 	return (FALSE);
210dfdcada3SDoug Rabson }
211dfdcada3SDoug Rabson 
212dfdcada3SDoug Rabson /*
213dfdcada3SDoug Rabson  * XDR unsigned 32-bit integers
214dfdcada3SDoug Rabson  * same as xdr_int32_t - open coded to save a proc call!
215dfdcada3SDoug Rabson  */
216dfdcada3SDoug Rabson bool_t
xdr_uint32_t(XDR * xdrs,uint32_t * uint32_p)217dfdcada3SDoug Rabson xdr_uint32_t(XDR *xdrs, uint32_t *uint32_p)
218dfdcada3SDoug Rabson {
219dfdcada3SDoug Rabson 	u_long l;
220dfdcada3SDoug Rabson 
221dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
222dfdcada3SDoug Rabson 	case XDR_ENCODE:
223dfdcada3SDoug Rabson 		l = (u_long) *uint32_p;
224dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&l));
225dfdcada3SDoug Rabson 
226dfdcada3SDoug Rabson 	case XDR_DECODE:
227dfdcada3SDoug Rabson 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
228dfdcada3SDoug Rabson 			return (FALSE);
229dfdcada3SDoug Rabson 		}
230dfdcada3SDoug Rabson 		*uint32_p = (uint32_t) l;
231dfdcada3SDoug Rabson 		return (TRUE);
232dfdcada3SDoug Rabson 
233dfdcada3SDoug Rabson 	case XDR_FREE:
234dfdcada3SDoug Rabson 		return (TRUE);
235dfdcada3SDoug Rabson 	}
236dfdcada3SDoug Rabson 	/* NOTREACHED */
237dfdcada3SDoug Rabson 	return (FALSE);
238dfdcada3SDoug Rabson }
239dfdcada3SDoug Rabson 
240dfdcada3SDoug Rabson /*
241dfdcada3SDoug Rabson  * XDR short integers
242dfdcada3SDoug Rabson  */
243dfdcada3SDoug Rabson bool_t
xdr_short(XDR * xdrs,short * sp)244dfdcada3SDoug Rabson xdr_short(XDR *xdrs, short *sp)
245dfdcada3SDoug Rabson {
246dfdcada3SDoug Rabson 	long l;
247dfdcada3SDoug Rabson 
248dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
249dfdcada3SDoug Rabson 	case XDR_ENCODE:
250dfdcada3SDoug Rabson 		l = (long) *sp;
251dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, &l));
252dfdcada3SDoug Rabson 
253dfdcada3SDoug Rabson 	case XDR_DECODE:
254dfdcada3SDoug Rabson 		if (!XDR_GETLONG(xdrs, &l)) {
255dfdcada3SDoug Rabson 			return (FALSE);
256dfdcada3SDoug Rabson 		}
257dfdcada3SDoug Rabson 		*sp = (short) l;
258dfdcada3SDoug Rabson 		return (TRUE);
259dfdcada3SDoug Rabson 
260dfdcada3SDoug Rabson 	case XDR_FREE:
261dfdcada3SDoug Rabson 		return (TRUE);
262dfdcada3SDoug Rabson 	}
263dfdcada3SDoug Rabson 	/* NOTREACHED */
264dfdcada3SDoug Rabson 	return (FALSE);
265dfdcada3SDoug Rabson }
266dfdcada3SDoug Rabson 
267dfdcada3SDoug Rabson /*
268dfdcada3SDoug Rabson  * XDR unsigned short integers
269dfdcada3SDoug Rabson  */
270dfdcada3SDoug Rabson bool_t
xdr_u_short(XDR * xdrs,u_short * usp)271dfdcada3SDoug Rabson xdr_u_short(XDR *xdrs, u_short *usp)
272dfdcada3SDoug Rabson {
273dfdcada3SDoug Rabson 	u_long l;
274dfdcada3SDoug Rabson 
275dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
276dfdcada3SDoug Rabson 	case XDR_ENCODE:
277dfdcada3SDoug Rabson 		l = (u_long) *usp;
278dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&l));
279dfdcada3SDoug Rabson 
280dfdcada3SDoug Rabson 	case XDR_DECODE:
281dfdcada3SDoug Rabson 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
282dfdcada3SDoug Rabson 			return (FALSE);
283dfdcada3SDoug Rabson 		}
284dfdcada3SDoug Rabson 		*usp = (u_short) l;
285dfdcada3SDoug Rabson 		return (TRUE);
286dfdcada3SDoug Rabson 
287dfdcada3SDoug Rabson 	case XDR_FREE:
288dfdcada3SDoug Rabson 		return (TRUE);
289dfdcada3SDoug Rabson 	}
290dfdcada3SDoug Rabson 	/* NOTREACHED */
291dfdcada3SDoug Rabson 	return (FALSE);
292dfdcada3SDoug Rabson }
293dfdcada3SDoug Rabson 
294dfdcada3SDoug Rabson /*
295dfdcada3SDoug Rabson  * XDR 16-bit integers
296dfdcada3SDoug Rabson  */
297dfdcada3SDoug Rabson bool_t
xdr_int16_t(XDR * xdrs,int16_t * int16_p)298dfdcada3SDoug Rabson xdr_int16_t(XDR *xdrs, int16_t *int16_p)
299dfdcada3SDoug Rabson {
300dfdcada3SDoug Rabson 	long l;
301dfdcada3SDoug Rabson 
302dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
303dfdcada3SDoug Rabson 	case XDR_ENCODE:
304dfdcada3SDoug Rabson 		l = (long) *int16_p;
305dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, &l));
306dfdcada3SDoug Rabson 
307dfdcada3SDoug Rabson 	case XDR_DECODE:
308dfdcada3SDoug Rabson 		if (!XDR_GETLONG(xdrs, &l)) {
309dfdcada3SDoug Rabson 			return (FALSE);
310dfdcada3SDoug Rabson 		}
311dfdcada3SDoug Rabson 		*int16_p = (int16_t) l;
312dfdcada3SDoug Rabson 		return (TRUE);
313dfdcada3SDoug Rabson 
314dfdcada3SDoug Rabson 	case XDR_FREE:
315dfdcada3SDoug Rabson 		return (TRUE);
316dfdcada3SDoug Rabson 	}
317dfdcada3SDoug Rabson 	/* NOTREACHED */
318dfdcada3SDoug Rabson 	return (FALSE);
319dfdcada3SDoug Rabson }
320dfdcada3SDoug Rabson 
321dfdcada3SDoug Rabson /*
322dfdcada3SDoug Rabson  * XDR unsigned 16-bit integers
323dfdcada3SDoug Rabson  */
324dfdcada3SDoug Rabson bool_t
xdr_uint16_t(XDR * xdrs,uint16_t * uint16_p)325dfdcada3SDoug Rabson xdr_uint16_t(XDR *xdrs, uint16_t *uint16_p)
326dfdcada3SDoug Rabson {
327dfdcada3SDoug Rabson 	u_long l;
328dfdcada3SDoug Rabson 
329dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
330dfdcada3SDoug Rabson 	case XDR_ENCODE:
331dfdcada3SDoug Rabson 		l = (u_long) *uint16_p;
332dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&l));
333dfdcada3SDoug Rabson 
334dfdcada3SDoug Rabson 	case XDR_DECODE:
335dfdcada3SDoug Rabson 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
336dfdcada3SDoug Rabson 			return (FALSE);
337dfdcada3SDoug Rabson 		}
338dfdcada3SDoug Rabson 		*uint16_p = (uint16_t) l;
339dfdcada3SDoug Rabson 		return (TRUE);
340dfdcada3SDoug Rabson 
341dfdcada3SDoug Rabson 	case XDR_FREE:
342dfdcada3SDoug Rabson 		return (TRUE);
343dfdcada3SDoug Rabson 	}
344dfdcada3SDoug Rabson 	/* NOTREACHED */
345dfdcada3SDoug Rabson 	return (FALSE);
346dfdcada3SDoug Rabson }
347dfdcada3SDoug Rabson 
348dfdcada3SDoug Rabson /*
349dfdcada3SDoug Rabson  * XDR a char
350dfdcada3SDoug Rabson  */
351dfdcada3SDoug Rabson bool_t
xdr_char(XDR * xdrs,char * cp)352dfdcada3SDoug Rabson xdr_char(XDR *xdrs, char *cp)
353dfdcada3SDoug Rabson {
354a872c370SBrooks Davis 	u_int i;
355dfdcada3SDoug Rabson 
356a872c370SBrooks Davis 	i = *((unsigned char *)cp);
357a872c370SBrooks Davis 	if (!xdr_u_int(xdrs, &i)) {
358dfdcada3SDoug Rabson 		return (FALSE);
359dfdcada3SDoug Rabson 	}
360a872c370SBrooks Davis 	*((unsigned char *)cp) = i;
361dfdcada3SDoug Rabson 	return (TRUE);
362dfdcada3SDoug Rabson }
363dfdcada3SDoug Rabson 
364dfdcada3SDoug Rabson /*
365dfdcada3SDoug Rabson  * XDR an unsigned char
366dfdcada3SDoug Rabson  */
367dfdcada3SDoug Rabson bool_t
xdr_u_char(XDR * xdrs,u_char * cp)368dfdcada3SDoug Rabson xdr_u_char(XDR *xdrs, u_char *cp)
369dfdcada3SDoug Rabson {
370dfdcada3SDoug Rabson 	u_int u;
371dfdcada3SDoug Rabson 
372dfdcada3SDoug Rabson 	u = (*cp);
373dfdcada3SDoug Rabson 	if (!xdr_u_int(xdrs, &u)) {
374dfdcada3SDoug Rabson 		return (FALSE);
375dfdcada3SDoug Rabson 	}
376dfdcada3SDoug Rabson 	*cp = u;
377dfdcada3SDoug Rabson 	return (TRUE);
378dfdcada3SDoug Rabson }
379dfdcada3SDoug Rabson 
380dfdcada3SDoug Rabson /*
381dfdcada3SDoug Rabson  * XDR booleans
382dfdcada3SDoug Rabson  */
383dfdcada3SDoug Rabson bool_t
xdr_bool(XDR * xdrs,bool_t * bp)384dfdcada3SDoug Rabson xdr_bool(XDR *xdrs, bool_t *bp)
385dfdcada3SDoug Rabson {
386dfdcada3SDoug Rabson 	long lb;
387dfdcada3SDoug Rabson 
388dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
389dfdcada3SDoug Rabson 	case XDR_ENCODE:
390dfdcada3SDoug Rabson 		lb = *bp ? XDR_TRUE : XDR_FALSE;
391dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, &lb));
392dfdcada3SDoug Rabson 
393dfdcada3SDoug Rabson 	case XDR_DECODE:
394dfdcada3SDoug Rabson 		if (!XDR_GETLONG(xdrs, &lb)) {
395dfdcada3SDoug Rabson 			return (FALSE);
396dfdcada3SDoug Rabson 		}
397dfdcada3SDoug Rabson 		*bp = (lb == XDR_FALSE) ? FALSE : TRUE;
398dfdcada3SDoug Rabson 		return (TRUE);
399dfdcada3SDoug Rabson 
400dfdcada3SDoug Rabson 	case XDR_FREE:
401dfdcada3SDoug Rabson 		return (TRUE);
402dfdcada3SDoug Rabson 	}
403dfdcada3SDoug Rabson 	/* NOTREACHED */
404dfdcada3SDoug Rabson 	return (FALSE);
405dfdcada3SDoug Rabson }
406dfdcada3SDoug Rabson 
407dfdcada3SDoug Rabson /*
408dfdcada3SDoug Rabson  * XDR enumerations
409dfdcada3SDoug Rabson  */
410dfdcada3SDoug Rabson bool_t
xdr_enum(XDR * xdrs,enum_t * ep)411dfdcada3SDoug Rabson xdr_enum(XDR *xdrs, enum_t *ep)
412dfdcada3SDoug Rabson {
413dfdcada3SDoug Rabson 	enum sizecheck { SIZEVAL };	/* used to find the size of an enum */
414dfdcada3SDoug Rabson 
415dfdcada3SDoug Rabson 	/*
416dfdcada3SDoug Rabson 	 * enums are treated as ints
417dfdcada3SDoug Rabson 	 */
418dfdcada3SDoug Rabson 	/* LINTED */ if (sizeof (enum sizecheck) == sizeof (long)) {
419dfdcada3SDoug Rabson 		return (xdr_long(xdrs, (long *)(void *)ep));
420dfdcada3SDoug Rabson 	} else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (int)) {
421dfdcada3SDoug Rabson 		return (xdr_int(xdrs, (int *)(void *)ep));
422dfdcada3SDoug Rabson 	} else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (short)) {
423dfdcada3SDoug Rabson 		return (xdr_short(xdrs, (short *)(void *)ep));
424dfdcada3SDoug Rabson 	} else {
425dfdcada3SDoug Rabson 		return (FALSE);
426dfdcada3SDoug Rabson 	}
427dfdcada3SDoug Rabson }
428dfdcada3SDoug Rabson 
429dfdcada3SDoug Rabson /*
430dfdcada3SDoug Rabson  * XDR opaque data
431dfdcada3SDoug Rabson  * Allows the specification of a fixed size sequence of opaque bytes.
432dfdcada3SDoug Rabson  * cp points to the opaque object and cnt gives the byte length.
433dfdcada3SDoug Rabson  */
434dfdcada3SDoug Rabson bool_t
xdr_opaque(XDR * xdrs,caddr_t cp,u_int cnt)435dfdcada3SDoug Rabson xdr_opaque(XDR *xdrs, caddr_t cp, u_int cnt)
436dfdcada3SDoug Rabson {
437dfdcada3SDoug Rabson 	u_int rndup;
438dfdcada3SDoug Rabson 	static int crud[BYTES_PER_XDR_UNIT];
439dfdcada3SDoug Rabson 
440dfdcada3SDoug Rabson 	/*
441dfdcada3SDoug Rabson 	 * if no data we are done
442dfdcada3SDoug Rabson 	 */
443dfdcada3SDoug Rabson 	if (cnt == 0)
444dfdcada3SDoug Rabson 		return (TRUE);
445dfdcada3SDoug Rabson 
446dfdcada3SDoug Rabson 	/*
447dfdcada3SDoug Rabson 	 * round byte count to full xdr units
448dfdcada3SDoug Rabson 	 */
449dfdcada3SDoug Rabson 	rndup = cnt % BYTES_PER_XDR_UNIT;
450dfdcada3SDoug Rabson 	if (rndup > 0)
451dfdcada3SDoug Rabson 		rndup = BYTES_PER_XDR_UNIT - rndup;
452dfdcada3SDoug Rabson 
453dfdcada3SDoug Rabson 	if (xdrs->x_op == XDR_DECODE) {
454dfdcada3SDoug Rabson 		if (!XDR_GETBYTES(xdrs, cp, cnt)) {
455dfdcada3SDoug Rabson 			return (FALSE);
456dfdcada3SDoug Rabson 		}
457dfdcada3SDoug Rabson 		if (rndup == 0)
458dfdcada3SDoug Rabson 			return (TRUE);
459dfdcada3SDoug Rabson 		return (XDR_GETBYTES(xdrs, (caddr_t)(void *)crud, rndup));
460dfdcada3SDoug Rabson 	}
461dfdcada3SDoug Rabson 
462dfdcada3SDoug Rabson 	if (xdrs->x_op == XDR_ENCODE) {
463dfdcada3SDoug Rabson 		if (!XDR_PUTBYTES(xdrs, cp, cnt)) {
464dfdcada3SDoug Rabson 			return (FALSE);
465dfdcada3SDoug Rabson 		}
466dfdcada3SDoug Rabson 		if (rndup == 0)
467dfdcada3SDoug Rabson 			return (TRUE);
468dfdcada3SDoug Rabson 		return (XDR_PUTBYTES(xdrs, xdr_zero, rndup));
469dfdcada3SDoug Rabson 	}
470dfdcada3SDoug Rabson 
471dfdcada3SDoug Rabson 	if (xdrs->x_op == XDR_FREE) {
472dfdcada3SDoug Rabson 		return (TRUE);
473dfdcada3SDoug Rabson 	}
474dfdcada3SDoug Rabson 
475dfdcada3SDoug Rabson 	return (FALSE);
476dfdcada3SDoug Rabson }
477dfdcada3SDoug Rabson 
478dfdcada3SDoug Rabson /*
479dfdcada3SDoug Rabson  * XDR counted bytes
480dfdcada3SDoug Rabson  * *cpp is a pointer to the bytes, *sizep is the count.
481dfdcada3SDoug Rabson  * If *cpp is NULL maxsize bytes are allocated
482dfdcada3SDoug Rabson  */
483dfdcada3SDoug Rabson bool_t
xdr_bytes(XDR * xdrs,char ** cpp,u_int * sizep,u_int maxsize)484dfdcada3SDoug Rabson xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize)
485dfdcada3SDoug Rabson {
486dfdcada3SDoug Rabson 	char *sp = *cpp;  /* sp is the actual string pointer */
487dfdcada3SDoug Rabson 	u_int nodesize;
4886448ec89SXin LI 	bool_t ret, allocated = FALSE;
489dfdcada3SDoug Rabson 
490dfdcada3SDoug Rabson 	/*
491dfdcada3SDoug Rabson 	 * first deal with the length since xdr bytes are counted
492dfdcada3SDoug Rabson 	 */
493dfdcada3SDoug Rabson 	if (! xdr_u_int(xdrs, sizep)) {
494dfdcada3SDoug Rabson 		return (FALSE);
495dfdcada3SDoug Rabson 	}
496dfdcada3SDoug Rabson 	nodesize = *sizep;
497dfdcada3SDoug Rabson 	if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) {
498dfdcada3SDoug Rabson 		return (FALSE);
499dfdcada3SDoug Rabson 	}
500dfdcada3SDoug Rabson 
501dfdcada3SDoug Rabson 	/*
502dfdcada3SDoug Rabson 	 * now deal with the actual bytes
503dfdcada3SDoug Rabson 	 */
504dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
505dfdcada3SDoug Rabson 	case XDR_DECODE:
506dfdcada3SDoug Rabson 		if (nodesize == 0) {
507dfdcada3SDoug Rabson 			return (TRUE);
508dfdcada3SDoug Rabson 		}
509dfdcada3SDoug Rabson 		if (sp == NULL) {
510dfdcada3SDoug Rabson 			*cpp = sp = mem_alloc(nodesize);
5116448ec89SXin LI 			allocated = TRUE;
512dfdcada3SDoug Rabson 		}
513dfdcada3SDoug Rabson 		if (sp == NULL) {
514dfdcada3SDoug Rabson 			printf("xdr_bytes: out of memory");
515dfdcada3SDoug Rabson 			return (FALSE);
516dfdcada3SDoug Rabson 		}
517dfdcada3SDoug Rabson 		/* FALLTHROUGH */
518dfdcada3SDoug Rabson 
519dfdcada3SDoug Rabson 	case XDR_ENCODE:
5206448ec89SXin LI 		ret = xdr_opaque(xdrs, sp, nodesize);
5216448ec89SXin LI 		if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) {
5226448ec89SXin LI 			if (allocated == TRUE) {
5236448ec89SXin LI 				mem_free(sp, nodesize);
5246448ec89SXin LI 				*cpp = NULL;
5256448ec89SXin LI 			}
5266448ec89SXin LI 		}
5276448ec89SXin LI 		return (ret);
528dfdcada3SDoug Rabson 
529dfdcada3SDoug Rabson 	case XDR_FREE:
530dfdcada3SDoug Rabson 		if (sp != NULL) {
531dfdcada3SDoug Rabson 			mem_free(sp, nodesize);
532dfdcada3SDoug Rabson 			*cpp = NULL;
533dfdcada3SDoug Rabson 		}
534dfdcada3SDoug Rabson 		return (TRUE);
535dfdcada3SDoug Rabson 	}
536dfdcada3SDoug Rabson 	/* NOTREACHED */
537dfdcada3SDoug Rabson 	return (FALSE);
538dfdcada3SDoug Rabson }
539dfdcada3SDoug Rabson 
540dfdcada3SDoug Rabson /*
541dfdcada3SDoug Rabson  * Implemented here due to commonality of the object.
542dfdcada3SDoug Rabson  */
543dfdcada3SDoug Rabson bool_t
xdr_netobj(XDR * xdrs,struct netobj * np)544dfdcada3SDoug Rabson xdr_netobj(XDR *xdrs, struct netobj *np)
545dfdcada3SDoug Rabson {
546dfdcada3SDoug Rabson 
547dfdcada3SDoug Rabson 	return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ));
548dfdcada3SDoug Rabson }
549dfdcada3SDoug Rabson 
550dfdcada3SDoug Rabson /*
551dfdcada3SDoug Rabson  * XDR a descriminated union
552dfdcada3SDoug Rabson  * Support routine for discriminated unions.
553dfdcada3SDoug Rabson  * You create an array of xdrdiscrim structures, terminated with
554dfdcada3SDoug Rabson  * an entry with a null procedure pointer.  The routine gets
555dfdcada3SDoug Rabson  * the discriminant value and then searches the array of xdrdiscrims
556dfdcada3SDoug Rabson  * looking for that value.  It calls the procedure given in the xdrdiscrim
557dfdcada3SDoug Rabson  * to handle the discriminant.  If there is no specific routine a default
558dfdcada3SDoug Rabson  * routine may be called.
559dfdcada3SDoug Rabson  * If there is no specific or default routine an error is returned.
560dfdcada3SDoug Rabson  */
561dfdcada3SDoug Rabson bool_t
xdr_union(XDR * xdrs,enum_t * dscmp,char * unp,const struct xdr_discrim * choices,xdrproc_t dfault)562dfdcada3SDoug Rabson xdr_union(XDR *xdrs,
563dfdcada3SDoug Rabson     enum_t *dscmp,		/* enum to decide which arm to work on */
564dfdcada3SDoug Rabson     char *unp,				/* the union itself */
565dfdcada3SDoug Rabson     const struct xdr_discrim *choices,	/* [value, xdr proc] for each arm */
566dfdcada3SDoug Rabson     xdrproc_t dfault)			/* default xdr routine */
567dfdcada3SDoug Rabson {
568dfdcada3SDoug Rabson 	enum_t dscm;
569dfdcada3SDoug Rabson 
570dfdcada3SDoug Rabson 	/*
571dfdcada3SDoug Rabson 	 * we deal with the discriminator;  it's an enum
572dfdcada3SDoug Rabson 	 */
573dfdcada3SDoug Rabson 	if (! xdr_enum(xdrs, dscmp)) {
574dfdcada3SDoug Rabson 		return (FALSE);
575dfdcada3SDoug Rabson 	}
576dfdcada3SDoug Rabson 	dscm = *dscmp;
577dfdcada3SDoug Rabson 
578dfdcada3SDoug Rabson 	/*
579dfdcada3SDoug Rabson 	 * search choices for a value that matches the discriminator.
580dfdcada3SDoug Rabson 	 * if we find one, execute the xdr routine for that value.
581dfdcada3SDoug Rabson 	 */
582dfdcada3SDoug Rabson 	for (; choices->proc != NULL_xdrproc_t; choices++) {
583dfdcada3SDoug Rabson 		if (choices->value == dscm)
584dfdcada3SDoug Rabson 			return ((*(choices->proc))(xdrs, unp));
585dfdcada3SDoug Rabson 	}
586dfdcada3SDoug Rabson 
587dfdcada3SDoug Rabson 	/*
588dfdcada3SDoug Rabson 	 * no match - execute the default xdr routine if there is one
589dfdcada3SDoug Rabson 	 */
590dfdcada3SDoug Rabson 	return ((dfault == NULL_xdrproc_t) ? FALSE :
591dfdcada3SDoug Rabson 	    (*dfault)(xdrs, unp));
592dfdcada3SDoug Rabson }
593dfdcada3SDoug Rabson 
594dfdcada3SDoug Rabson /*
595dfdcada3SDoug Rabson  * Non-portable xdr primitives.
596dfdcada3SDoug Rabson  * Care should be taken when moving these routines to new architectures.
597dfdcada3SDoug Rabson  */
598dfdcada3SDoug Rabson 
599dfdcada3SDoug Rabson /*
600dfdcada3SDoug Rabson  * XDR null terminated ASCII strings
601dfdcada3SDoug Rabson  * xdr_string deals with "C strings" - arrays of bytes that are
602dfdcada3SDoug Rabson  * terminated by a NULL character.  The parameter cpp references a
603dfdcada3SDoug Rabson  * pointer to storage; If the pointer is null, then the necessary
604dfdcada3SDoug Rabson  * storage is allocated.  The last parameter is the max allowed length
605dfdcada3SDoug Rabson  * of the string as specified by a protocol.
606dfdcada3SDoug Rabson  */
607dfdcada3SDoug Rabson bool_t
xdr_string(XDR * xdrs,char ** cpp,u_int maxsize)608dfdcada3SDoug Rabson xdr_string(XDR *xdrs, char **cpp, u_int maxsize)
609dfdcada3SDoug Rabson {
610dfdcada3SDoug Rabson 	char *sp = *cpp;  /* sp is the actual string pointer */
611dfdcada3SDoug Rabson 	u_int size;
612dfdcada3SDoug Rabson 	u_int nodesize;
6136448ec89SXin LI 	bool_t ret, allocated = FALSE;
614dfdcada3SDoug Rabson 
615dfdcada3SDoug Rabson 	/*
616dfdcada3SDoug Rabson 	 * first deal with the length since xdr strings are counted-strings
617dfdcada3SDoug Rabson 	 */
618dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
619dfdcada3SDoug Rabson 	case XDR_FREE:
620dfdcada3SDoug Rabson 		if (sp == NULL) {
621dfdcada3SDoug Rabson 			return(TRUE);	/* already free */
622dfdcada3SDoug Rabson 		}
623dfdcada3SDoug Rabson 		/* FALLTHROUGH */
624dfdcada3SDoug Rabson 	case XDR_ENCODE:
625dfdcada3SDoug Rabson 		size = strlen(sp);
626dfdcada3SDoug Rabson 		break;
627dfdcada3SDoug Rabson 	case XDR_DECODE:
628dfdcada3SDoug Rabson 		break;
629dfdcada3SDoug Rabson 	}
630dfdcada3SDoug Rabson 	if (! xdr_u_int(xdrs, &size)) {
631dfdcada3SDoug Rabson 		return (FALSE);
632dfdcada3SDoug Rabson 	}
633dfdcada3SDoug Rabson 	if (size > maxsize) {
634dfdcada3SDoug Rabson 		return (FALSE);
635dfdcada3SDoug Rabson 	}
636dfdcada3SDoug Rabson 	nodesize = size + 1;
637dfdcada3SDoug Rabson 
638dfdcada3SDoug Rabson 	/*
639dfdcada3SDoug Rabson 	 * now deal with the actual bytes
640dfdcada3SDoug Rabson 	 */
641dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
642dfdcada3SDoug Rabson 	case XDR_DECODE:
643dfdcada3SDoug Rabson 		if (nodesize == 0) {
644dfdcada3SDoug Rabson 			return (TRUE);
645dfdcada3SDoug Rabson 		}
6466448ec89SXin LI 		if (sp == NULL) {
647dfdcada3SDoug Rabson 			*cpp = sp = mem_alloc(nodesize);
6486448ec89SXin LI 			allocated = TRUE;
6496448ec89SXin LI 		}
650dfdcada3SDoug Rabson 		if (sp == NULL) {
651dfdcada3SDoug Rabson 			printf("xdr_string: out of memory");
652dfdcada3SDoug Rabson 			return (FALSE);
653dfdcada3SDoug Rabson 		}
654dfdcada3SDoug Rabson 		sp[size] = 0;
655dfdcada3SDoug Rabson 		/* FALLTHROUGH */
656dfdcada3SDoug Rabson 
657dfdcada3SDoug Rabson 	case XDR_ENCODE:
6586448ec89SXin LI 		ret = xdr_opaque(xdrs, sp, size);
6596448ec89SXin LI 		if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) {
6606448ec89SXin LI 			if (allocated == TRUE) {
6616448ec89SXin LI 				mem_free(sp, nodesize);
6626448ec89SXin LI 				*cpp = NULL;
6636448ec89SXin LI 			}
6646448ec89SXin LI 		}
6656448ec89SXin LI 		return (ret);
666dfdcada3SDoug Rabson 
667dfdcada3SDoug Rabson 	case XDR_FREE:
668dfdcada3SDoug Rabson 		mem_free(sp, nodesize);
669dfdcada3SDoug Rabson 		*cpp = NULL;
670dfdcada3SDoug Rabson 		return (TRUE);
671dfdcada3SDoug Rabson 	}
672dfdcada3SDoug Rabson 	/* NOTREACHED */
673dfdcada3SDoug Rabson 	return (FALSE);
674dfdcada3SDoug Rabson }
675dfdcada3SDoug Rabson 
676dfdcada3SDoug Rabson /*
677dfdcada3SDoug Rabson  * Wrapper for xdr_string that can be called directly from
678dfdcada3SDoug Rabson  * routines like clnt_call
679dfdcada3SDoug Rabson  */
680dfdcada3SDoug Rabson bool_t
xdr_wrapstring(XDR * xdrs,char ** cpp)681dfdcada3SDoug Rabson xdr_wrapstring(XDR *xdrs, char **cpp)
682dfdcada3SDoug Rabson {
6836448ec89SXin LI 	return xdr_string(xdrs, cpp, RPC_MAXDATASIZE);
684dfdcada3SDoug Rabson }
685dfdcada3SDoug Rabson 
686dfdcada3SDoug Rabson /*
687dfdcada3SDoug Rabson  * NOTE: xdr_hyper(), xdr_u_hyper(), xdr_longlong_t(), and xdr_u_longlong_t()
688dfdcada3SDoug Rabson  * are in the "non-portable" section because they require that a `long long'
689dfdcada3SDoug Rabson  * be a 64-bit type.
690dfdcada3SDoug Rabson  *
691dfdcada3SDoug Rabson  *	--thorpej@netbsd.org, November 30, 1999
692dfdcada3SDoug Rabson  */
693dfdcada3SDoug Rabson 
694dfdcada3SDoug Rabson /*
695dfdcada3SDoug Rabson  * XDR 64-bit integers
696dfdcada3SDoug Rabson  */
697dfdcada3SDoug Rabson bool_t
xdr_int64_t(XDR * xdrs,int64_t * llp)698dfdcada3SDoug Rabson xdr_int64_t(XDR *xdrs, int64_t *llp)
699dfdcada3SDoug Rabson {
700dfdcada3SDoug Rabson 	u_long ul[2];
701dfdcada3SDoug Rabson 
702dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
703dfdcada3SDoug Rabson 	case XDR_ENCODE:
704dfdcada3SDoug Rabson 		ul[0] = (u_long)((uint64_t)*llp >> 32) & 0xffffffff;
705dfdcada3SDoug Rabson 		ul[1] = (u_long)((uint64_t)*llp) & 0xffffffff;
706dfdcada3SDoug Rabson 		if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
707dfdcada3SDoug Rabson 			return (FALSE);
708dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
709dfdcada3SDoug Rabson 	case XDR_DECODE:
710dfdcada3SDoug Rabson 		if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
711dfdcada3SDoug Rabson 			return (FALSE);
712dfdcada3SDoug Rabson 		if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
713dfdcada3SDoug Rabson 			return (FALSE);
714dfdcada3SDoug Rabson 		*llp = (int64_t)
715dfdcada3SDoug Rabson 		    (((uint64_t)ul[0] << 32) | ((uint64_t)ul[1]));
716dfdcada3SDoug Rabson 		return (TRUE);
717dfdcada3SDoug Rabson 	case XDR_FREE:
718dfdcada3SDoug Rabson 		return (TRUE);
719dfdcada3SDoug Rabson 	}
720dfdcada3SDoug Rabson 	/* NOTREACHED */
721dfdcada3SDoug Rabson 	return (FALSE);
722dfdcada3SDoug Rabson }
723dfdcada3SDoug Rabson 
724dfdcada3SDoug Rabson /*
725dfdcada3SDoug Rabson  * XDR unsigned 64-bit integers
726dfdcada3SDoug Rabson  */
727dfdcada3SDoug Rabson bool_t
xdr_uint64_t(XDR * xdrs,uint64_t * ullp)728dfdcada3SDoug Rabson xdr_uint64_t(XDR *xdrs, uint64_t *ullp)
729dfdcada3SDoug Rabson {
730dfdcada3SDoug Rabson 	u_long ul[2];
731dfdcada3SDoug Rabson 
732dfdcada3SDoug Rabson 	switch (xdrs->x_op) {
733dfdcada3SDoug Rabson 	case XDR_ENCODE:
734dfdcada3SDoug Rabson 		ul[0] = (u_long)(*ullp >> 32) & 0xffffffff;
735dfdcada3SDoug Rabson 		ul[1] = (u_long)(*ullp) & 0xffffffff;
736dfdcada3SDoug Rabson 		if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
737dfdcada3SDoug Rabson 			return (FALSE);
738dfdcada3SDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
739dfdcada3SDoug Rabson 	case XDR_DECODE:
740dfdcada3SDoug Rabson 		if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
741dfdcada3SDoug Rabson 			return (FALSE);
742dfdcada3SDoug Rabson 		if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
743dfdcada3SDoug Rabson 			return (FALSE);
744dfdcada3SDoug Rabson 		*ullp = (uint64_t)
745dfdcada3SDoug Rabson 		    (((uint64_t)ul[0] << 32) | ((uint64_t)ul[1]));
746dfdcada3SDoug Rabson 		return (TRUE);
747dfdcada3SDoug Rabson 	case XDR_FREE:
748dfdcada3SDoug Rabson 		return (TRUE);
749dfdcada3SDoug Rabson 	}
750dfdcada3SDoug Rabson 	/* NOTREACHED */
751dfdcada3SDoug Rabson 	return (FALSE);
752dfdcada3SDoug Rabson }
753dfdcada3SDoug Rabson 
754dfdcada3SDoug Rabson /*
755dfdcada3SDoug Rabson  * XDR hypers
756dfdcada3SDoug Rabson  */
757dfdcada3SDoug Rabson bool_t
xdr_hyper(XDR * xdrs,longlong_t * llp)758dfdcada3SDoug Rabson xdr_hyper(XDR *xdrs, longlong_t *llp)
759dfdcada3SDoug Rabson {
760dfdcada3SDoug Rabson 
761dfdcada3SDoug Rabson 	/*
762dfdcada3SDoug Rabson 	 * Don't bother open-coding this; it's a fair amount of code.  Just
763dfdcada3SDoug Rabson 	 * call xdr_int64_t().
764dfdcada3SDoug Rabson 	 */
765dfdcada3SDoug Rabson 	return (xdr_int64_t(xdrs, (int64_t *)llp));
766dfdcada3SDoug Rabson }
767dfdcada3SDoug Rabson 
768dfdcada3SDoug Rabson /*
769dfdcada3SDoug Rabson  * XDR unsigned hypers
770dfdcada3SDoug Rabson  */
771dfdcada3SDoug Rabson bool_t
xdr_u_hyper(XDR * xdrs,u_longlong_t * ullp)772dfdcada3SDoug Rabson xdr_u_hyper(XDR *xdrs, u_longlong_t *ullp)
773dfdcada3SDoug Rabson {
774dfdcada3SDoug Rabson 
775dfdcada3SDoug Rabson 	/*
776dfdcada3SDoug Rabson 	 * Don't bother open-coding this; it's a fair amount of code.  Just
777dfdcada3SDoug Rabson 	 * call xdr_uint64_t().
778dfdcada3SDoug Rabson 	 */
779dfdcada3SDoug Rabson 	return (xdr_uint64_t(xdrs, (uint64_t *)ullp));
780dfdcada3SDoug Rabson }
781dfdcada3SDoug Rabson 
782dfdcada3SDoug Rabson /*
783dfdcada3SDoug Rabson  * XDR longlong_t's
784dfdcada3SDoug Rabson  */
785dfdcada3SDoug Rabson bool_t
xdr_longlong_t(XDR * xdrs,longlong_t * llp)786dfdcada3SDoug Rabson xdr_longlong_t(XDR *xdrs, longlong_t *llp)
787dfdcada3SDoug Rabson {
788dfdcada3SDoug Rabson 
789dfdcada3SDoug Rabson 	/*
790dfdcada3SDoug Rabson 	 * Don't bother open-coding this; it's a fair amount of code.  Just
791dfdcada3SDoug Rabson 	 * call xdr_int64_t().
792dfdcada3SDoug Rabson 	 */
793dfdcada3SDoug Rabson 	return (xdr_int64_t(xdrs, (int64_t *)llp));
794dfdcada3SDoug Rabson }
795dfdcada3SDoug Rabson 
796dfdcada3SDoug Rabson /*
797dfdcada3SDoug Rabson  * XDR u_longlong_t's
798dfdcada3SDoug Rabson  */
799dfdcada3SDoug Rabson bool_t
xdr_u_longlong_t(XDR * xdrs,u_longlong_t * ullp)800dfdcada3SDoug Rabson xdr_u_longlong_t(XDR *xdrs, u_longlong_t *ullp)
801dfdcada3SDoug Rabson {
802dfdcada3SDoug Rabson 
803dfdcada3SDoug Rabson 	/*
804dfdcada3SDoug Rabson 	 * Don't bother open-coding this; it's a fair amount of code.  Just
805dfdcada3SDoug Rabson 	 * call xdr_uint64_t().
806dfdcada3SDoug Rabson 	 */
807dfdcada3SDoug Rabson 	return (xdr_uint64_t(xdrs, (uint64_t *)ullp));
808dfdcada3SDoug Rabson }
809732a02b4SGleb Smirnoff 
810732a02b4SGleb Smirnoff /*
811732a02b4SGleb Smirnoff  * Kernel module glue
812732a02b4SGleb Smirnoff  */
813732a02b4SGleb Smirnoff static int
xdr_modevent(module_t mod,int type,void * data)814732a02b4SGleb Smirnoff xdr_modevent(module_t mod, int type, void *data)
815732a02b4SGleb Smirnoff {
816732a02b4SGleb Smirnoff 
817732a02b4SGleb Smirnoff         return (0);
818732a02b4SGleb Smirnoff }
819732a02b4SGleb Smirnoff static moduledata_t xdr_mod = {
820732a02b4SGleb Smirnoff         "xdr",
821732a02b4SGleb Smirnoff         xdr_modevent,
822732a02b4SGleb Smirnoff         NULL,
823732a02b4SGleb Smirnoff };
824732a02b4SGleb Smirnoff DECLARE_MODULE(xdr, xdr_mod, SI_SUB_VFS, SI_ORDER_ANY);
825732a02b4SGleb Smirnoff MODULE_VERSION(xdr, 1);
826