xref: /illumos-gate/usr/src/lib/librpcsvc/common/mountlist_xdr.c (revision 45ede40b2394db7967e59f19288fae9b62efd4aa)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 1998 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 
28 #pragma ident	"%Z%%M%	%I%	%E% SMI"
29 
30 
31 #include <stdio.h>				/* for fprintf() */
32 #include <stdlib.h>				/* for malloc() */
33 #include <rpc/types.h>
34 #include <rpc/xdr.h>
35 #include <rpcsvc/mount.h>
36 
37 
38 /*
39  * XDR routines to handle mountlist structure
40  *
41  * These are iterative versions to avoid the stack-blowing problems of
42  * the recursive routines generated by rpcgen.
43  *
44  * XXXX These should be removed when rpcgen is fixed to produce better
45  * code in these circumstances.
46  */
47 
48 
49 bool_t
50 xdr_mountlist(xdrs, objp)
51 	register XDR *xdrs;
52 	mountlist *objp;
53 {
54 	bool_t more_data;
55 
56 	switch (xdrs->x_op) {
57 
58 	case XDR_FREE: {
59 		mountbody *mb, *tmp;
60 
61 		tmp = *objp;
62 
63 		while (tmp != NULL) {
64 			mb = tmp;
65 			tmp = mb->ml_next;
66 			if (!xdr_name(xdrs, &mb->ml_hostname))
67 				return (FALSE);
68 			if (!xdr_dirpath(xdrs, &mb->ml_directory))
69 				return (FALSE);
70 			free(mb);
71 		}
72 
73 		break;
74 	}
75 
76 	case XDR_DECODE: {
77 		mountbody *mb;
78 		mountbody *mb_prev = NULL;
79 
80 		for (;;) {
81 			if (!xdr_bool(xdrs, &more_data))
82 				return (FALSE);
83 
84 			if (!more_data)
85 				break;
86 
87 			mb = (mountbody *)malloc(sizeof (struct mountbody));
88 			if (mb == NULL) {
89 				fprintf(stderr,
90 				    "xdr_mountlist: out of memory\n");
91 				return (FALSE);
92 			}
93 			mb->ml_hostname = NULL;
94 			mb->ml_directory = NULL;
95 			mb->ml_next = NULL;
96 
97 			if (mb_prev == NULL) {
98 				mb_prev = mb;
99 				*objp = mb;
100 			}
101 
102 			if (!xdr_name(xdrs, &mb->ml_hostname))
103 				return (FALSE);
104 			if (!xdr_dirpath(xdrs, &mb->ml_directory))
105 				return (FALSE);
106 
107 			if (mb_prev != mb) {
108 				mb_prev->ml_next = mb;
109 				mb_prev = mb;
110 			}
111 		}
112 		break;
113 	}
114 
115 	case XDR_ENCODE: {
116 		mountbody *mb;
117 
118 		mb = *objp;
119 
120 		for (;;) {
121 			more_data = mb != NULL;
122 
123 			if (!xdr_bool(xdrs, &more_data))
124 				return (FALSE);
125 
126 			if (!more_data)
127 				break;
128 
129 			if (!xdr_name(xdrs, &mb->ml_hostname))
130 				return (FALSE);
131 			if (!xdr_dirpath(xdrs, &mb->ml_directory))
132 				return (FALSE);
133 
134 			mb = mb->ml_next;
135 		}
136 		break;
137 	}
138 
139 	default:
140 		break;
141 	}
142 
143 	return (TRUE);
144 }
145 
146 
147 /*
148  * xdr_mountbody() is included here simply for backward compatibility. It is
149  * no longer used by xdr_mountlist(), nor by any other SunOS routine as of
150  * now.
151  *
152  * This is simply a copy of the rpcgen generated routine.
153  */
154 bool_t
155 xdr_mountbody(xdrs, objp)
156 	register XDR *xdrs;
157 	mountbody *objp;
158 {
159 	if (!xdr_name(xdrs, &objp->ml_hostname))
160 		return (FALSE);
161 	if (!xdr_dirpath(xdrs, &objp->ml_directory))
162 		return (FALSE);
163 	if (!xdr_mountlist(xdrs, &objp->ml_next))
164 		return (FALSE);
165 	return (TRUE);
166 }
167