xref: /freebsd/lib/libc/xdr/xdr.c (revision c304ad8a23bc3b8e3f9315d01c2e291c391117c7)
1eae561b3SGarrett Wollman /*
2eae561b3SGarrett Wollman  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
3eae561b3SGarrett Wollman  * unrestricted use provided that this legend is included on all tape
4eae561b3SGarrett Wollman  * media and as a part of the software program in whole or part.  Users
5eae561b3SGarrett Wollman  * may copy or modify Sun RPC without charge, but are not authorized
6eae561b3SGarrett Wollman  * to license or distribute it to anyone else except as part of a product or
7eae561b3SGarrett Wollman  * program developed by the user.
8eae561b3SGarrett Wollman  *
9eae561b3SGarrett Wollman  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
10eae561b3SGarrett Wollman  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
11eae561b3SGarrett Wollman  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
12eae561b3SGarrett Wollman  *
13eae561b3SGarrett Wollman  * Sun RPC is provided with no support and without any obligation on the
14eae561b3SGarrett Wollman  * part of Sun Microsystems, Inc. to assist in its use, correction,
15eae561b3SGarrett Wollman  * modification or enhancement.
16eae561b3SGarrett Wollman  *
17eae561b3SGarrett Wollman  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
18eae561b3SGarrett Wollman  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
19eae561b3SGarrett Wollman  * OR ANY PART THEREOF.
20eae561b3SGarrett Wollman  *
21eae561b3SGarrett Wollman  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
22eae561b3SGarrett Wollman  * or profits or other special, indirect and consequential damages, even if
23eae561b3SGarrett Wollman  * Sun has been advised of the possibility of such damages.
24eae561b3SGarrett Wollman  *
25eae561b3SGarrett Wollman  * Sun Microsystems, Inc.
26eae561b3SGarrett Wollman  * 2550 Garcia Avenue
27eae561b3SGarrett Wollman  * Mountain View, California  94043
28eae561b3SGarrett Wollman  */
29eae561b3SGarrett Wollman 
30eae561b3SGarrett Wollman #if defined(LIBC_SCCS) && !defined(lint)
31eae561b3SGarrett Wollman /*static char *sccsid = "from: @(#)xdr.c 1.35 87/08/12";*/
32eae561b3SGarrett Wollman /*static char *sccsid = "from: @(#)xdr.c	2.1 88/07/29 4.0 RPCSRC";*/
33c304ad8aSDavid E. O'Brien static char *rcsid = "$Id: xdr.c,v 1.7 1997/05/28 04:57:30 wpaul Exp $";
34eae561b3SGarrett Wollman #endif
35eae561b3SGarrett Wollman 
36eae561b3SGarrett Wollman /*
37eae561b3SGarrett Wollman  * xdr.c, Generic XDR routines implementation.
38eae561b3SGarrett Wollman  *
39eae561b3SGarrett Wollman  * Copyright (C) 1986, Sun Microsystems, Inc.
40eae561b3SGarrett Wollman  *
41eae561b3SGarrett Wollman  * These are the "generic" xdr routines used to serialize and de-serialize
42eae561b3SGarrett Wollman  * most common data items.  See xdr.h for more info on the interface to
43eae561b3SGarrett Wollman  * xdr.
44eae561b3SGarrett Wollman  */
45eae561b3SGarrett Wollman 
46eae561b3SGarrett Wollman #include <stdio.h>
4729285d6cSPoul-Henning Kamp #include <stdlib.h>
481ad08a09SPeter Wemm #include <string.h>
49eae561b3SGarrett Wollman 
50eae561b3SGarrett Wollman #include <rpc/types.h>
51eae561b3SGarrett Wollman #include <rpc/xdr.h>
52eae561b3SGarrett Wollman 
53eae561b3SGarrett Wollman /*
54eae561b3SGarrett Wollman  * constants specific to the xdr "protocol"
55eae561b3SGarrett Wollman  */
56eae561b3SGarrett Wollman #define XDR_FALSE	((long) 0)
57eae561b3SGarrett Wollman #define XDR_TRUE	((long) 1)
58eae561b3SGarrett Wollman #define LASTUNSIGNED	((u_int) 0-1)
59eae561b3SGarrett Wollman 
60eae561b3SGarrett Wollman /*
61eae561b3SGarrett Wollman  * for unit alignment
62eae561b3SGarrett Wollman  */
63eae561b3SGarrett Wollman static char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 };
64eae561b3SGarrett Wollman 
65eae561b3SGarrett Wollman /*
66eae561b3SGarrett Wollman  * Free a data structure using XDR
67eae561b3SGarrett Wollman  * Not a filter, but a convenient utility nonetheless
68eae561b3SGarrett Wollman  */
69eae561b3SGarrett Wollman void
70eae561b3SGarrett Wollman xdr_free(proc, objp)
71eae561b3SGarrett Wollman 	xdrproc_t proc;
72eae561b3SGarrett Wollman 	char *objp;
73eae561b3SGarrett Wollman {
74eae561b3SGarrett Wollman 	XDR x;
75eae561b3SGarrett Wollman 
76eae561b3SGarrett Wollman 	x.x_op = XDR_FREE;
77eae561b3SGarrett Wollman 	(*proc)(&x, objp);
78eae561b3SGarrett Wollman }
79eae561b3SGarrett Wollman 
80eae561b3SGarrett Wollman /*
81eae561b3SGarrett Wollman  * XDR nothing
82eae561b3SGarrett Wollman  */
83eae561b3SGarrett Wollman bool_t
84eae561b3SGarrett Wollman xdr_void(/* xdrs, addr */)
85eae561b3SGarrett Wollman 	/* XDR *xdrs; */
86eae561b3SGarrett Wollman 	/* caddr_t addr; */
87eae561b3SGarrett Wollman {
88eae561b3SGarrett Wollman 
89eae561b3SGarrett Wollman 	return (TRUE);
90eae561b3SGarrett Wollman }
91eae561b3SGarrett Wollman 
921ad08a09SPeter Wemm 
93eae561b3SGarrett Wollman /*
94eae561b3SGarrett Wollman  * XDR integers
95eae561b3SGarrett Wollman  */
96eae561b3SGarrett Wollman bool_t
97eae561b3SGarrett Wollman xdr_int(xdrs, ip)
98eae561b3SGarrett Wollman 	XDR *xdrs;
99eae561b3SGarrett Wollman 	int *ip;
100eae561b3SGarrett Wollman {
1011ad08a09SPeter Wemm 	long l;
102eae561b3SGarrett Wollman 
1031ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1041ad08a09SPeter Wemm 
1051ad08a09SPeter Wemm 	case XDR_ENCODE:
1061ad08a09SPeter Wemm 		l = (long) *ip;
1071ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, &l));
1081ad08a09SPeter Wemm 
1091ad08a09SPeter Wemm 	case XDR_DECODE:
1101ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, &l)) {
1111ad08a09SPeter Wemm 			return (FALSE);
112eae561b3SGarrett Wollman 		}
1131ad08a09SPeter Wemm 		*ip = (int) l;
1141ad08a09SPeter Wemm 		return (TRUE);
1151ad08a09SPeter Wemm 
1161ad08a09SPeter Wemm 	case XDR_FREE:
1171ad08a09SPeter Wemm 		return (TRUE);
1181ad08a09SPeter Wemm 	}
1191ad08a09SPeter Wemm 	return (FALSE);
120eae561b3SGarrett Wollman }
121eae561b3SGarrett Wollman 
122eae561b3SGarrett Wollman /*
123eae561b3SGarrett Wollman  * XDR unsigned integers
124eae561b3SGarrett Wollman  */
125eae561b3SGarrett Wollman bool_t
126eae561b3SGarrett Wollman xdr_u_int(xdrs, up)
127eae561b3SGarrett Wollman 	XDR *xdrs;
128eae561b3SGarrett Wollman 	u_int *up;
129eae561b3SGarrett Wollman {
1301ad08a09SPeter Wemm 	u_long l;
131eae561b3SGarrett Wollman 
1321ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1331ad08a09SPeter Wemm 
1341ad08a09SPeter Wemm 	case XDR_ENCODE:
1351ad08a09SPeter Wemm 		l = (u_long) *up;
1361ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
1371ad08a09SPeter Wemm 
1381ad08a09SPeter Wemm 	case XDR_DECODE:
1391ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
1401ad08a09SPeter Wemm 			return (FALSE);
141eae561b3SGarrett Wollman 		}
1421ad08a09SPeter Wemm 		*up = (u_int) l;
1431ad08a09SPeter Wemm 		return (TRUE);
1441ad08a09SPeter Wemm 
1451ad08a09SPeter Wemm 	case XDR_FREE:
1461ad08a09SPeter Wemm 		return (TRUE);
147eae561b3SGarrett Wollman 	}
1481ad08a09SPeter Wemm 	return (FALSE);
1491ad08a09SPeter Wemm }
1501ad08a09SPeter Wemm 
151eae561b3SGarrett Wollman 
152eae561b3SGarrett Wollman /*
153eae561b3SGarrett Wollman  * XDR long integers
154eae561b3SGarrett Wollman  * same as xdr_u_long - open coded to save a proc call!
155eae561b3SGarrett Wollman  */
156eae561b3SGarrett Wollman bool_t
157eae561b3SGarrett Wollman xdr_long(xdrs, lp)
158eae561b3SGarrett Wollman 	register XDR *xdrs;
159eae561b3SGarrett Wollman 	long *lp;
160eae561b3SGarrett Wollman {
1611ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1621ad08a09SPeter Wemm 	case XDR_ENCODE:
163eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, lp));
1641ad08a09SPeter Wemm 	case XDR_DECODE:
165eae561b3SGarrett Wollman 		return (XDR_GETLONG(xdrs, lp));
1661ad08a09SPeter Wemm 	case XDR_FREE:
167eae561b3SGarrett Wollman 		return (TRUE);
1681ad08a09SPeter Wemm 	}
169eae561b3SGarrett Wollman 
170eae561b3SGarrett Wollman 	return (FALSE);
171eae561b3SGarrett Wollman }
172eae561b3SGarrett Wollman 
173eae561b3SGarrett Wollman /*
174eae561b3SGarrett Wollman  * XDR unsigned long integers
175eae561b3SGarrett Wollman  * same as xdr_long - open coded to save a proc call!
176eae561b3SGarrett Wollman  */
177eae561b3SGarrett Wollman bool_t
178eae561b3SGarrett Wollman xdr_u_long(xdrs, ulp)
179eae561b3SGarrett Wollman 	register XDR *xdrs;
180eae561b3SGarrett Wollman 	u_long *ulp;
181eae561b3SGarrett Wollman {
1821ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1831ad08a09SPeter Wemm 	case XDR_ENCODE:
184eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, (long *)ulp));
1851ad08a09SPeter Wemm 	case XDR_DECODE:
1861ad08a09SPeter Wemm 		return (XDR_GETLONG(xdrs, (long *)ulp));
1871ad08a09SPeter Wemm 	case XDR_FREE:
188eae561b3SGarrett Wollman 		return (TRUE);
1891ad08a09SPeter Wemm 	}
190eae561b3SGarrett Wollman 	return (FALSE);
191eae561b3SGarrett Wollman }
192eae561b3SGarrett Wollman 
1931ad08a09SPeter Wemm 
1941ad08a09SPeter Wemm /*
1951ad08a09SPeter Wemm  * XDR 32-bit integers
1961ad08a09SPeter Wemm  * same as xdr_u_int32_t - open coded to save a proc call!
1971ad08a09SPeter Wemm  */
1981ad08a09SPeter Wemm bool_t
1991ad08a09SPeter Wemm xdr_int32_t(xdrs, int32_p)
2001ad08a09SPeter Wemm 	register XDR *xdrs;
2011ad08a09SPeter Wemm 	int32_t *int32_p;
2021ad08a09SPeter Wemm {
2031ad08a09SPeter Wemm 	long l;
2041ad08a09SPeter Wemm 
2051ad08a09SPeter Wemm 	switch (xdrs->x_op) {
2061ad08a09SPeter Wemm 
2071ad08a09SPeter Wemm 	case XDR_ENCODE:
2081ad08a09SPeter Wemm 		l = (long) *int32_p;
2091ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, &l));
2101ad08a09SPeter Wemm 
2111ad08a09SPeter Wemm 	case XDR_DECODE:
2121ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, &l)) {
2131ad08a09SPeter Wemm 			return (FALSE);
2141ad08a09SPeter Wemm 		}
2151ad08a09SPeter Wemm 		*int32_p = (int32_t) l;
2161ad08a09SPeter Wemm 		return (TRUE);
2171ad08a09SPeter Wemm 
2181ad08a09SPeter Wemm 	case XDR_FREE:
2191ad08a09SPeter Wemm 		return (TRUE);
2201ad08a09SPeter Wemm 	}
2211ad08a09SPeter Wemm 	return (FALSE);
2221ad08a09SPeter Wemm }
2231ad08a09SPeter Wemm 
2241ad08a09SPeter Wemm /*
2251ad08a09SPeter Wemm  * XDR unsigned 32-bit integers
2261ad08a09SPeter Wemm  * same as xdr_int32_t - open coded to save a proc call!
2271ad08a09SPeter Wemm  */
2281ad08a09SPeter Wemm bool_t
2291ad08a09SPeter Wemm xdr_u_int32_t(xdrs, u_int32_p)
2301ad08a09SPeter Wemm 	register XDR *xdrs;
2311ad08a09SPeter Wemm 	u_int32_t *u_int32_p;
2321ad08a09SPeter Wemm {
2331ad08a09SPeter Wemm 	u_long l;
2341ad08a09SPeter Wemm 
2351ad08a09SPeter Wemm 	switch (xdrs->x_op) {
2361ad08a09SPeter Wemm 
2371ad08a09SPeter Wemm 	case XDR_ENCODE:
2381ad08a09SPeter Wemm 		l = (u_long) *u_int32_p;
2391ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
2401ad08a09SPeter Wemm 
2411ad08a09SPeter Wemm 	case XDR_DECODE:
2421ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
2431ad08a09SPeter Wemm 			return (FALSE);
2441ad08a09SPeter Wemm 		}
2451ad08a09SPeter Wemm 		*u_int32_p = (u_int32_t) l;
2461ad08a09SPeter Wemm 		return (TRUE);
2471ad08a09SPeter Wemm 
2481ad08a09SPeter Wemm 	case XDR_FREE:
2491ad08a09SPeter Wemm 		return (TRUE);
2501ad08a09SPeter Wemm 	}
2511ad08a09SPeter Wemm 	return (FALSE);
2521ad08a09SPeter Wemm }
2531ad08a09SPeter Wemm 
254c304ad8aSDavid E. O'Brien /*
255c304ad8aSDavid E. O'Brien  * XDR 64-bit integers
256c304ad8aSDavid E. O'Brien  */
257c304ad8aSDavid E. O'Brien bool_t
258c304ad8aSDavid E. O'Brien xdr_int64_t(xdrs, int64_p)
259c304ad8aSDavid E. O'Brien 	register XDR *xdrs;
260c304ad8aSDavid E. O'Brien 	int64_t *int64_p;
261c304ad8aSDavid E. O'Brien {
262c304ad8aSDavid E. O'Brien 	int64_t x;
263c304ad8aSDavid E. O'Brien 
264c304ad8aSDavid E. O'Brien 	switch (xdrs->x_op) {
265c304ad8aSDavid E. O'Brien 
266c304ad8aSDavid E. O'Brien 	case XDR_ENCODE:
267c304ad8aSDavid E. O'Brien 		return (xdr_opaque(xdrs, (caddr_t)int64_p, sizeof(int64_t)));
268c304ad8aSDavid E. O'Brien 
269c304ad8aSDavid E. O'Brien 	case XDR_DECODE:
270c304ad8aSDavid E. O'Brien 		if (!xdr_opaque(xdrs, (caddr_t)&x, sizeof x)) {
271c304ad8aSDavid E. O'Brien 			return (FALSE);
272c304ad8aSDavid E. O'Brien 		}
273c304ad8aSDavid E. O'Brien 		*int64_p = x;
274c304ad8aSDavid E. O'Brien 		return (TRUE);
275c304ad8aSDavid E. O'Brien 
276c304ad8aSDavid E. O'Brien 	case XDR_FREE:
277c304ad8aSDavid E. O'Brien 		return (TRUE);
278c304ad8aSDavid E. O'Brien 	}
279c304ad8aSDavid E. O'Brien 	return (FALSE);
280c304ad8aSDavid E. O'Brien }
281c304ad8aSDavid E. O'Brien 
282c304ad8aSDavid E. O'Brien /*
283c304ad8aSDavid E. O'Brien  * XDR unsigned 64-bit integers
284c304ad8aSDavid E. O'Brien  */
285c304ad8aSDavid E. O'Brien bool_t
286c304ad8aSDavid E. O'Brien xdr_u_int64_t(xdrs, uint64_p)
287c304ad8aSDavid E. O'Brien 	register XDR *xdrs;
288c304ad8aSDavid E. O'Brien 	u_int64_t *uint64_p;
289c304ad8aSDavid E. O'Brien {
290c304ad8aSDavid E. O'Brien 	u_int64_t x;
291c304ad8aSDavid E. O'Brien 
292c304ad8aSDavid E. O'Brien 	switch (xdrs->x_op) {
293c304ad8aSDavid E. O'Brien 
294c304ad8aSDavid E. O'Brien 	case XDR_ENCODE:
295c304ad8aSDavid E. O'Brien 		return (xdr_opaque(xdrs, (caddr_t)uint64_p, sizeof(u_int64_t)));
296c304ad8aSDavid E. O'Brien 
297c304ad8aSDavid E. O'Brien 	case XDR_DECODE:
298c304ad8aSDavid E. O'Brien 		if (!xdr_opaque(xdrs, (caddr_t)&x, sizeof x)) {
299c304ad8aSDavid E. O'Brien 			return (FALSE);
300c304ad8aSDavid E. O'Brien 		}
301c304ad8aSDavid E. O'Brien 		*uint64_p = x;
302c304ad8aSDavid E. O'Brien 		return (TRUE);
303c304ad8aSDavid E. O'Brien 
304c304ad8aSDavid E. O'Brien 	case XDR_FREE:
305c304ad8aSDavid E. O'Brien 		return (TRUE);
306c304ad8aSDavid E. O'Brien 	}
307c304ad8aSDavid E. O'Brien 	return (FALSE);
308c304ad8aSDavid E. O'Brien }
309c304ad8aSDavid E. O'Brien 
3101ad08a09SPeter Wemm 
311eae561b3SGarrett Wollman /*
312eae561b3SGarrett Wollman  * XDR short integers
313eae561b3SGarrett Wollman  */
314eae561b3SGarrett Wollman bool_t
315eae561b3SGarrett Wollman xdr_short(xdrs, sp)
316eae561b3SGarrett Wollman 	register XDR *xdrs;
317eae561b3SGarrett Wollman 	short *sp;
318eae561b3SGarrett Wollman {
319eae561b3SGarrett Wollman 	long l;
320eae561b3SGarrett Wollman 
321eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
322eae561b3SGarrett Wollman 
323eae561b3SGarrett Wollman 	case XDR_ENCODE:
324eae561b3SGarrett Wollman 		l = (long) *sp;
325eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, &l));
326eae561b3SGarrett Wollman 
327eae561b3SGarrett Wollman 	case XDR_DECODE:
328eae561b3SGarrett Wollman 		if (!XDR_GETLONG(xdrs, &l)) {
329eae561b3SGarrett Wollman 			return (FALSE);
330eae561b3SGarrett Wollman 		}
331eae561b3SGarrett Wollman 		*sp = (short) l;
332eae561b3SGarrett Wollman 		return (TRUE);
333eae561b3SGarrett Wollman 
334eae561b3SGarrett Wollman 	case XDR_FREE:
335eae561b3SGarrett Wollman 		return (TRUE);
336eae561b3SGarrett Wollman 	}
337eae561b3SGarrett Wollman 	return (FALSE);
338eae561b3SGarrett Wollman }
339eae561b3SGarrett Wollman 
340eae561b3SGarrett Wollman /*
341eae561b3SGarrett Wollman  * XDR unsigned short integers
342eae561b3SGarrett Wollman  */
343eae561b3SGarrett Wollman bool_t
344eae561b3SGarrett Wollman xdr_u_short(xdrs, usp)
345eae561b3SGarrett Wollman 	register XDR *xdrs;
346eae561b3SGarrett Wollman 	u_short *usp;
347eae561b3SGarrett Wollman {
348eae561b3SGarrett Wollman 	u_long l;
349eae561b3SGarrett Wollman 
350eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
351eae561b3SGarrett Wollman 
352eae561b3SGarrett Wollman 	case XDR_ENCODE:
353eae561b3SGarrett Wollman 		l = (u_long) *usp;
3541ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
3551ad08a09SPeter Wemm 
3561ad08a09SPeter Wemm 	case XDR_DECODE:
3571ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
3581ad08a09SPeter Wemm 			return (FALSE);
3591ad08a09SPeter Wemm 		}
3601ad08a09SPeter Wemm 		*usp = (u_short) l;
3611ad08a09SPeter Wemm 		return (TRUE);
3621ad08a09SPeter Wemm 
3631ad08a09SPeter Wemm 	case XDR_FREE:
3641ad08a09SPeter Wemm 		return (TRUE);
3651ad08a09SPeter Wemm 	}
3661ad08a09SPeter Wemm 	return (FALSE);
3671ad08a09SPeter Wemm }
3681ad08a09SPeter Wemm 
3691ad08a09SPeter Wemm 
3701ad08a09SPeter Wemm /*
3711ad08a09SPeter Wemm  * XDR 16-bit integers
3721ad08a09SPeter Wemm  */
3731ad08a09SPeter Wemm bool_t
3741ad08a09SPeter Wemm xdr_int16_t(xdrs, int16_p)
3751ad08a09SPeter Wemm 	register XDR *xdrs;
3761ad08a09SPeter Wemm 	int16_t *int16_p;
3771ad08a09SPeter Wemm {
3781ad08a09SPeter Wemm 	long l;
3791ad08a09SPeter Wemm 
3801ad08a09SPeter Wemm 	switch (xdrs->x_op) {
3811ad08a09SPeter Wemm 
3821ad08a09SPeter Wemm 	case XDR_ENCODE:
3831ad08a09SPeter Wemm 		l = (long) *int16_p;
384eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, &l));
385eae561b3SGarrett Wollman 
386eae561b3SGarrett Wollman 	case XDR_DECODE:
387eae561b3SGarrett Wollman 		if (!XDR_GETLONG(xdrs, &l)) {
388eae561b3SGarrett Wollman 			return (FALSE);
389eae561b3SGarrett Wollman 		}
3901ad08a09SPeter Wemm 		*int16_p = (int16_t) l;
3911ad08a09SPeter Wemm 		return (TRUE);
3921ad08a09SPeter Wemm 
3931ad08a09SPeter Wemm 	case XDR_FREE:
3941ad08a09SPeter Wemm 		return (TRUE);
3951ad08a09SPeter Wemm 	}
3961ad08a09SPeter Wemm 	return (FALSE);
3971ad08a09SPeter Wemm }
3981ad08a09SPeter Wemm 
3991ad08a09SPeter Wemm /*
4001ad08a09SPeter Wemm  * XDR unsigned 16-bit integers
4011ad08a09SPeter Wemm  */
4021ad08a09SPeter Wemm bool_t
4031ad08a09SPeter Wemm xdr_u_int16_t(xdrs, u_int16_p)
4041ad08a09SPeter Wemm 	register XDR *xdrs;
4051ad08a09SPeter Wemm 	u_int16_t *u_int16_p;
4061ad08a09SPeter Wemm {
4071ad08a09SPeter Wemm 	u_long l;
4081ad08a09SPeter Wemm 
4091ad08a09SPeter Wemm 	switch (xdrs->x_op) {
4101ad08a09SPeter Wemm 
4111ad08a09SPeter Wemm 	case XDR_ENCODE:
4121ad08a09SPeter Wemm 		l = (u_long) *u_int16_p;
4131ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
4141ad08a09SPeter Wemm 
4151ad08a09SPeter Wemm 	case XDR_DECODE:
4161ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
4171ad08a09SPeter Wemm 			return (FALSE);
4181ad08a09SPeter Wemm 		}
4191ad08a09SPeter Wemm 		*u_int16_p = (u_int16_t) l;
420eae561b3SGarrett Wollman 		return (TRUE);
421eae561b3SGarrett Wollman 
422eae561b3SGarrett Wollman 	case XDR_FREE:
423eae561b3SGarrett Wollman 		return (TRUE);
424eae561b3SGarrett Wollman 	}
425eae561b3SGarrett Wollman 	return (FALSE);
426eae561b3SGarrett Wollman }
427eae561b3SGarrett Wollman 
428eae561b3SGarrett Wollman 
429eae561b3SGarrett Wollman /*
430eae561b3SGarrett Wollman  * XDR a char
431eae561b3SGarrett Wollman  */
432eae561b3SGarrett Wollman bool_t
433eae561b3SGarrett Wollman xdr_char(xdrs, cp)
434eae561b3SGarrett Wollman 	XDR *xdrs;
435eae561b3SGarrett Wollman 	char *cp;
436eae561b3SGarrett Wollman {
437eae561b3SGarrett Wollman 	int i;
438eae561b3SGarrett Wollman 
439eae561b3SGarrett Wollman 	i = (*cp);
440eae561b3SGarrett Wollman 	if (!xdr_int(xdrs, &i)) {
441eae561b3SGarrett Wollman 		return (FALSE);
442eae561b3SGarrett Wollman 	}
443eae561b3SGarrett Wollman 	*cp = i;
444eae561b3SGarrett Wollman 	return (TRUE);
445eae561b3SGarrett Wollman }
446eae561b3SGarrett Wollman 
447eae561b3SGarrett Wollman /*
448eae561b3SGarrett Wollman  * XDR an unsigned char
449eae561b3SGarrett Wollman  */
450eae561b3SGarrett Wollman bool_t
451eae561b3SGarrett Wollman xdr_u_char(xdrs, cp)
452eae561b3SGarrett Wollman 	XDR *xdrs;
4531ad08a09SPeter Wemm 	u_char *cp;
454eae561b3SGarrett Wollman {
455eae561b3SGarrett Wollman 	u_int u;
456eae561b3SGarrett Wollman 
457eae561b3SGarrett Wollman 	u = (*cp);
458eae561b3SGarrett Wollman 	if (!xdr_u_int(xdrs, &u)) {
459eae561b3SGarrett Wollman 		return (FALSE);
460eae561b3SGarrett Wollman 	}
461eae561b3SGarrett Wollman 	*cp = u;
462eae561b3SGarrett Wollman 	return (TRUE);
463eae561b3SGarrett Wollman }
464eae561b3SGarrett Wollman 
465eae561b3SGarrett Wollman /*
466eae561b3SGarrett Wollman  * XDR booleans
467eae561b3SGarrett Wollman  */
468eae561b3SGarrett Wollman bool_t
469eae561b3SGarrett Wollman xdr_bool(xdrs, bp)
470eae561b3SGarrett Wollman 	register XDR *xdrs;
471eae561b3SGarrett Wollman 	bool_t *bp;
472eae561b3SGarrett Wollman {
473eae561b3SGarrett Wollman 	long lb;
474eae561b3SGarrett Wollman 
475eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
476eae561b3SGarrett Wollman 
477eae561b3SGarrett Wollman 	case XDR_ENCODE:
478eae561b3SGarrett Wollman 		lb = *bp ? XDR_TRUE : XDR_FALSE;
479eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, &lb));
480eae561b3SGarrett Wollman 
481eae561b3SGarrett Wollman 	case XDR_DECODE:
482eae561b3SGarrett Wollman 		if (!XDR_GETLONG(xdrs, &lb)) {
483eae561b3SGarrett Wollman 			return (FALSE);
484eae561b3SGarrett Wollman 		}
485eae561b3SGarrett Wollman 		*bp = (lb == XDR_FALSE) ? FALSE : TRUE;
486eae561b3SGarrett Wollman 		return (TRUE);
487eae561b3SGarrett Wollman 
488eae561b3SGarrett Wollman 	case XDR_FREE:
489eae561b3SGarrett Wollman 		return (TRUE);
490eae561b3SGarrett Wollman 	}
491eae561b3SGarrett Wollman 	return (FALSE);
492eae561b3SGarrett Wollman }
493eae561b3SGarrett Wollman 
494eae561b3SGarrett Wollman /*
495eae561b3SGarrett Wollman  * XDR enumerations
496eae561b3SGarrett Wollman  */
497eae561b3SGarrett Wollman bool_t
498eae561b3SGarrett Wollman xdr_enum(xdrs, ep)
499eae561b3SGarrett Wollman 	XDR *xdrs;
500eae561b3SGarrett Wollman 	enum_t *ep;
501eae561b3SGarrett Wollman {
502eae561b3SGarrett Wollman #ifndef lint
503eae561b3SGarrett Wollman 	enum sizecheck { SIZEVAL };	/* used to find the size of an enum */
504eae561b3SGarrett Wollman 
505eae561b3SGarrett Wollman 	/*
506eae561b3SGarrett Wollman 	 * enums are treated as ints
507eae561b3SGarrett Wollman 	 */
508eae561b3SGarrett Wollman 	if (sizeof (enum sizecheck) == sizeof (long)) {
509eae561b3SGarrett Wollman 		return (xdr_long(xdrs, (long *)ep));
5101ad08a09SPeter Wemm 	} else if (sizeof (enum sizecheck) == sizeof (int)) {
5111ad08a09SPeter Wemm 		return (xdr_int(xdrs, (int *)ep));
512eae561b3SGarrett Wollman 	} else if (sizeof (enum sizecheck) == sizeof (short)) {
513eae561b3SGarrett Wollman 		return (xdr_short(xdrs, (short *)ep));
514eae561b3SGarrett Wollman 	} else {
515eae561b3SGarrett Wollman 		return (FALSE);
516eae561b3SGarrett Wollman 	}
517eae561b3SGarrett Wollman #else
518eae561b3SGarrett Wollman 	(void) (xdr_short(xdrs, (short *)ep));
5191ad08a09SPeter Wemm 	(void) (xdr_int(xdrs, (int *)ep));
520eae561b3SGarrett Wollman 	return (xdr_long(xdrs, (long *)ep));
521eae561b3SGarrett Wollman #endif
522eae561b3SGarrett Wollman }
523eae561b3SGarrett Wollman 
524eae561b3SGarrett Wollman /*
525eae561b3SGarrett Wollman  * XDR opaque data
526eae561b3SGarrett Wollman  * Allows the specification of a fixed size sequence of opaque bytes.
527eae561b3SGarrett Wollman  * cp points to the opaque object and cnt gives the byte length.
528eae561b3SGarrett Wollman  */
529eae561b3SGarrett Wollman bool_t
530eae561b3SGarrett Wollman xdr_opaque(xdrs, cp, cnt)
531eae561b3SGarrett Wollman 	register XDR *xdrs;
532eae561b3SGarrett Wollman 	caddr_t cp;
533eae561b3SGarrett Wollman 	register u_int cnt;
534eae561b3SGarrett Wollman {
535eae561b3SGarrett Wollman 	register u_int rndup;
536eae561b3SGarrett Wollman 	static crud[BYTES_PER_XDR_UNIT];
537eae561b3SGarrett Wollman 
538eae561b3SGarrett Wollman 	/*
539eae561b3SGarrett Wollman 	 * if no data we are done
540eae561b3SGarrett Wollman 	 */
541eae561b3SGarrett Wollman 	if (cnt == 0)
542eae561b3SGarrett Wollman 		return (TRUE);
543eae561b3SGarrett Wollman 
544eae561b3SGarrett Wollman 	/*
545eae561b3SGarrett Wollman 	 * round byte count to full xdr units
546eae561b3SGarrett Wollman 	 */
547eae561b3SGarrett Wollman 	rndup = cnt % BYTES_PER_XDR_UNIT;
548eae561b3SGarrett Wollman 	if (rndup > 0)
549eae561b3SGarrett Wollman 		rndup = BYTES_PER_XDR_UNIT - rndup;
550eae561b3SGarrett Wollman 
551eae561b3SGarrett Wollman 	if (xdrs->x_op == XDR_DECODE) {
552eae561b3SGarrett Wollman 		if (!XDR_GETBYTES(xdrs, cp, cnt)) {
553eae561b3SGarrett Wollman 			return (FALSE);
554eae561b3SGarrett Wollman 		}
555eae561b3SGarrett Wollman 		if (rndup == 0)
556eae561b3SGarrett Wollman 			return (TRUE);
5571ad08a09SPeter Wemm 		return (XDR_GETBYTES(xdrs, (caddr_t)crud, rndup));
558eae561b3SGarrett Wollman 	}
559eae561b3SGarrett Wollman 
560eae561b3SGarrett Wollman 	if (xdrs->x_op == XDR_ENCODE) {
561eae561b3SGarrett Wollman 		if (!XDR_PUTBYTES(xdrs, cp, cnt)) {
562eae561b3SGarrett Wollman 			return (FALSE);
563eae561b3SGarrett Wollman 		}
564eae561b3SGarrett Wollman 		if (rndup == 0)
565eae561b3SGarrett Wollman 			return (TRUE);
566eae561b3SGarrett Wollman 		return (XDR_PUTBYTES(xdrs, xdr_zero, rndup));
567eae561b3SGarrett Wollman 	}
568eae561b3SGarrett Wollman 
569eae561b3SGarrett Wollman 	if (xdrs->x_op == XDR_FREE) {
570eae561b3SGarrett Wollman 		return (TRUE);
571eae561b3SGarrett Wollman 	}
572eae561b3SGarrett Wollman 
573eae561b3SGarrett Wollman 	return (FALSE);
574eae561b3SGarrett Wollman }
575eae561b3SGarrett Wollman 
576eae561b3SGarrett Wollman /*
577eae561b3SGarrett Wollman  * XDR counted bytes
578eae561b3SGarrett Wollman  * *cpp is a pointer to the bytes, *sizep is the count.
579eae561b3SGarrett Wollman  * If *cpp is NULL maxsize bytes are allocated
580eae561b3SGarrett Wollman  */
581eae561b3SGarrett Wollman bool_t
582eae561b3SGarrett Wollman xdr_bytes(xdrs, cpp, sizep, maxsize)
583eae561b3SGarrett Wollman 	register XDR *xdrs;
584eae561b3SGarrett Wollman 	char **cpp;
585eae561b3SGarrett Wollman 	register u_int *sizep;
586eae561b3SGarrett Wollman 	u_int maxsize;
587eae561b3SGarrett Wollman {
588eae561b3SGarrett Wollman 	register char *sp = *cpp;  /* sp is the actual string pointer */
589eae561b3SGarrett Wollman 	register u_int nodesize;
590eae561b3SGarrett Wollman 
591eae561b3SGarrett Wollman 	/*
592eae561b3SGarrett Wollman 	 * first deal with the length since xdr bytes are counted
593eae561b3SGarrett Wollman 	 */
594eae561b3SGarrett Wollman 	if (! xdr_u_int(xdrs, sizep)) {
595eae561b3SGarrett Wollman 		return (FALSE);
596eae561b3SGarrett Wollman 	}
597eae561b3SGarrett Wollman 	nodesize = *sizep;
598eae561b3SGarrett Wollman 	if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) {
599eae561b3SGarrett Wollman 		return (FALSE);
600eae561b3SGarrett Wollman 	}
601eae561b3SGarrett Wollman 
602eae561b3SGarrett Wollman 	/*
603eae561b3SGarrett Wollman 	 * now deal with the actual bytes
604eae561b3SGarrett Wollman 	 */
605eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
606eae561b3SGarrett Wollman 
607eae561b3SGarrett Wollman 	case XDR_DECODE:
608eae561b3SGarrett Wollman 		if (nodesize == 0) {
609eae561b3SGarrett Wollman 			return (TRUE);
610eae561b3SGarrett Wollman 		}
611eae561b3SGarrett Wollman 		if (sp == NULL) {
612eae561b3SGarrett Wollman 			*cpp = sp = (char *)mem_alloc(nodesize);
613eae561b3SGarrett Wollman 		}
614eae561b3SGarrett Wollman 		if (sp == NULL) {
615eae561b3SGarrett Wollman 			(void) fprintf(stderr, "xdr_bytes: out of memory\n");
616eae561b3SGarrett Wollman 			return (FALSE);
617eae561b3SGarrett Wollman 		}
618eae561b3SGarrett Wollman 		/* fall into ... */
619eae561b3SGarrett Wollman 
620eae561b3SGarrett Wollman 	case XDR_ENCODE:
621eae561b3SGarrett Wollman 		return (xdr_opaque(xdrs, sp, nodesize));
622eae561b3SGarrett Wollman 
623eae561b3SGarrett Wollman 	case XDR_FREE:
624eae561b3SGarrett Wollman 		if (sp != NULL) {
625eae561b3SGarrett Wollman 			mem_free(sp, nodesize);
626eae561b3SGarrett Wollman 			*cpp = NULL;
627eae561b3SGarrett Wollman 		}
628eae561b3SGarrett Wollman 		return (TRUE);
629eae561b3SGarrett Wollman 	}
630eae561b3SGarrett Wollman 	return (FALSE);
631eae561b3SGarrett Wollman }
632eae561b3SGarrett Wollman 
633eae561b3SGarrett Wollman /*
634eae561b3SGarrett Wollman  * Implemented here due to commonality of the object.
635eae561b3SGarrett Wollman  */
636eae561b3SGarrett Wollman bool_t
637eae561b3SGarrett Wollman xdr_netobj(xdrs, np)
638eae561b3SGarrett Wollman 	XDR *xdrs;
639eae561b3SGarrett Wollman 	struct netobj *np;
640eae561b3SGarrett Wollman {
641eae561b3SGarrett Wollman 
642eae561b3SGarrett Wollman 	return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ));
643eae561b3SGarrett Wollman }
644eae561b3SGarrett Wollman 
645eae561b3SGarrett Wollman /*
646eae561b3SGarrett Wollman  * XDR a descriminated union
647eae561b3SGarrett Wollman  * Support routine for discriminated unions.
648eae561b3SGarrett Wollman  * You create an array of xdrdiscrim structures, terminated with
649eae561b3SGarrett Wollman  * an entry with a null procedure pointer.  The routine gets
650eae561b3SGarrett Wollman  * the discriminant value and then searches the array of xdrdiscrims
651eae561b3SGarrett Wollman  * looking for that value.  It calls the procedure given in the xdrdiscrim
652eae561b3SGarrett Wollman  * to handle the discriminant.  If there is no specific routine a default
653eae561b3SGarrett Wollman  * routine may be called.
654eae561b3SGarrett Wollman  * If there is no specific or default routine an error is returned.
655eae561b3SGarrett Wollman  */
656eae561b3SGarrett Wollman bool_t
657eae561b3SGarrett Wollman xdr_union(xdrs, dscmp, unp, choices, dfault)
658eae561b3SGarrett Wollman 	register XDR *xdrs;
659eae561b3SGarrett Wollman 	enum_t *dscmp;		/* enum to decide which arm to work on */
660eae561b3SGarrett Wollman 	char *unp;		/* the union itself */
661eae561b3SGarrett Wollman 	struct xdr_discrim *choices;	/* [value, xdr proc] for each arm */
662eae561b3SGarrett Wollman 	xdrproc_t dfault;	/* default xdr routine */
663eae561b3SGarrett Wollman {
664eae561b3SGarrett Wollman 	register enum_t dscm;
665eae561b3SGarrett Wollman 
666eae561b3SGarrett Wollman 	/*
667eae561b3SGarrett Wollman 	 * we deal with the discriminator;  it's an enum
668eae561b3SGarrett Wollman 	 */
669eae561b3SGarrett Wollman 	if (! xdr_enum(xdrs, dscmp)) {
670eae561b3SGarrett Wollman 		return (FALSE);
671eae561b3SGarrett Wollman 	}
672eae561b3SGarrett Wollman 	dscm = *dscmp;
673eae561b3SGarrett Wollman 
674eae561b3SGarrett Wollman 	/*
675eae561b3SGarrett Wollman 	 * search choices for a value that matches the discriminator.
676eae561b3SGarrett Wollman 	 * if we find one, execute the xdr routine for that value.
677eae561b3SGarrett Wollman 	 */
678eae561b3SGarrett Wollman 	for (; choices->proc != NULL_xdrproc_t; choices++) {
679eae561b3SGarrett Wollman 		if (choices->value == dscm)
680eae561b3SGarrett Wollman 			return ((*(choices->proc))(xdrs, unp, LASTUNSIGNED));
681eae561b3SGarrett Wollman 	}
682eae561b3SGarrett Wollman 
683eae561b3SGarrett Wollman 	/*
684eae561b3SGarrett Wollman 	 * no match - execute the default xdr routine if there is one
685eae561b3SGarrett Wollman 	 */
686eae561b3SGarrett Wollman 	return ((dfault == NULL_xdrproc_t) ? FALSE :
687eae561b3SGarrett Wollman 	    (*dfault)(xdrs, unp, LASTUNSIGNED));
688eae561b3SGarrett Wollman }
689eae561b3SGarrett Wollman 
690eae561b3SGarrett Wollman 
691eae561b3SGarrett Wollman /*
692eae561b3SGarrett Wollman  * Non-portable xdr primitives.
693eae561b3SGarrett Wollman  * Care should be taken when moving these routines to new architectures.
694eae561b3SGarrett Wollman  */
695eae561b3SGarrett Wollman 
696eae561b3SGarrett Wollman 
697eae561b3SGarrett Wollman /*
698eae561b3SGarrett Wollman  * XDR null terminated ASCII strings
699eae561b3SGarrett Wollman  * xdr_string deals with "C strings" - arrays of bytes that are
700eae561b3SGarrett Wollman  * terminated by a NULL character.  The parameter cpp references a
701eae561b3SGarrett Wollman  * pointer to storage; If the pointer is null, then the necessary
702eae561b3SGarrett Wollman  * storage is allocated.  The last parameter is the max allowed length
703eae561b3SGarrett Wollman  * of the string as specified by a protocol.
704eae561b3SGarrett Wollman  */
705eae561b3SGarrett Wollman bool_t
706eae561b3SGarrett Wollman xdr_string(xdrs, cpp, maxsize)
707eae561b3SGarrett Wollman 	register XDR *xdrs;
708eae561b3SGarrett Wollman 	char **cpp;
709eae561b3SGarrett Wollman 	u_int maxsize;
710eae561b3SGarrett Wollman {
711eae561b3SGarrett Wollman 	register char *sp = *cpp;  /* sp is the actual string pointer */
712eae561b3SGarrett Wollman 	u_int size;
713eae561b3SGarrett Wollman 	u_int nodesize;
714eae561b3SGarrett Wollman 
715eae561b3SGarrett Wollman 	/*
716eae561b3SGarrett Wollman 	 * first deal with the length since xdr strings are counted-strings
717eae561b3SGarrett Wollman 	 */
718eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
719eae561b3SGarrett Wollman 	case XDR_FREE:
720eae561b3SGarrett Wollman 		if (sp == NULL) {
721eae561b3SGarrett Wollman 			return(TRUE);	/* already free */
722eae561b3SGarrett Wollman 		}
723eae561b3SGarrett Wollman 		/* fall through... */
724eae561b3SGarrett Wollman 	case XDR_ENCODE:
725eae561b3SGarrett Wollman 		size = strlen(sp);
726eae561b3SGarrett Wollman 		break;
727eae561b3SGarrett Wollman 	}
728eae561b3SGarrett Wollman 	if (! xdr_u_int(xdrs, &size)) {
729eae561b3SGarrett Wollman 		return (FALSE);
730eae561b3SGarrett Wollman 	}
731eae561b3SGarrett Wollman 	if (size > maxsize) {
732eae561b3SGarrett Wollman 		return (FALSE);
733eae561b3SGarrett Wollman 	}
734eae561b3SGarrett Wollman 	nodesize = size + 1;
735eae561b3SGarrett Wollman 
736eae561b3SGarrett Wollman 	/*
737eae561b3SGarrett Wollman 	 * now deal with the actual bytes
738eae561b3SGarrett Wollman 	 */
739eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
740eae561b3SGarrett Wollman 
741eae561b3SGarrett Wollman 	case XDR_DECODE:
742eae561b3SGarrett Wollman 		if (nodesize == 0) {
743eae561b3SGarrett Wollman 			return (TRUE);
744eae561b3SGarrett Wollman 		}
745eae561b3SGarrett Wollman 		if (sp == NULL)
746eae561b3SGarrett Wollman 			*cpp = sp = (char *)mem_alloc(nodesize);
747eae561b3SGarrett Wollman 		if (sp == NULL) {
748eae561b3SGarrett Wollman 			(void) fprintf(stderr, "xdr_string: out of memory\n");
749eae561b3SGarrett Wollman 			return (FALSE);
750eae561b3SGarrett Wollman 		}
751eae561b3SGarrett Wollman 		sp[size] = 0;
752eae561b3SGarrett Wollman 		/* fall into ... */
753eae561b3SGarrett Wollman 
754eae561b3SGarrett Wollman 	case XDR_ENCODE:
755eae561b3SGarrett Wollman 		return (xdr_opaque(xdrs, sp, size));
756eae561b3SGarrett Wollman 
757eae561b3SGarrett Wollman 	case XDR_FREE:
758eae561b3SGarrett Wollman 		mem_free(sp, nodesize);
759eae561b3SGarrett Wollman 		*cpp = NULL;
760eae561b3SGarrett Wollman 		return (TRUE);
761eae561b3SGarrett Wollman 	}
762eae561b3SGarrett Wollman 	return (FALSE);
763eae561b3SGarrett Wollman }
764eae561b3SGarrett Wollman 
765eae561b3SGarrett Wollman /*
766eae561b3SGarrett Wollman  * Wrapper for xdr_string that can be called directly from
767eae561b3SGarrett Wollman  * routines like clnt_call
768eae561b3SGarrett Wollman  */
769eae561b3SGarrett Wollman bool_t
770eae561b3SGarrett Wollman xdr_wrapstring(xdrs, cpp)
771eae561b3SGarrett Wollman 	XDR *xdrs;
772eae561b3SGarrett Wollman 	char **cpp;
773eae561b3SGarrett Wollman {
7741ad08a09SPeter Wemm 	return xdr_string(xdrs, cpp, LASTUNSIGNED);
775eae561b3SGarrett Wollman }
776