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