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 2004 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #pragma ident "%Z%%M% %I% %E% SMI"
28
29 #include <rpc/types.h>
30 #include <rpc/xdr.h>
31 #include <rpc/rpc.h>
32 #include <rpcsvc/nfs_prot.h>
33
34 /*
35 * Xdr routines for NFS ops.
36 */
37
38 static bool_t
xdr_b_nfs_fh3(XDR * xdrs,nfs_fh3 * objp)39 xdr_b_nfs_fh3(XDR *xdrs, nfs_fh3 *objp)
40 {
41 return (xdr_bytes(xdrs, (char **)&objp->data.data_val,
42 (uint_t *)&objp->data.data_len, NFS3_FHSIZE));
43 }
44
45 static bool_t
xdr_b_fattr3(XDR * xdrs,fattr3 * objp)46 xdr_b_fattr3(XDR *xdrs, fattr3 *objp)
47 {
48 if (!xdr_enum(xdrs, (enum_t *)&objp->type))
49 return (FALSE);
50 if (!xdr_u_int(xdrs, &objp->mode))
51 return (FALSE);
52 if (!xdr_u_int(xdrs, &objp->nlink))
53 return (FALSE);
54 if (!xdr_u_int(xdrs, &objp->uid))
55 return (FALSE);
56 if (!xdr_u_int(xdrs, &objp->gid))
57 return (FALSE);
58 if (!xdr_u_longlong_t(xdrs, &objp->size))
59 return (FALSE);
60 if (!xdr_u_longlong_t(xdrs, &objp->used))
61 return (FALSE);
62 if (!xdr_u_int(xdrs, &objp->rdev.specdata1))
63 return (FALSE);
64 if (!xdr_u_int(xdrs, &objp->rdev.specdata2))
65 return (FALSE);
66 if (!xdr_u_longlong_t(xdrs, &objp->fsid))
67 return (FALSE);
68 if (!xdr_u_longlong_t(xdrs, &objp->fileid))
69 return (FALSE);
70 if (!xdr_u_int(xdrs, &objp->atime.seconds))
71 return (FALSE);
72 if (!xdr_u_int(xdrs, &objp->atime.nseconds))
73 return (FALSE);
74 if (!xdr_u_int(xdrs, &objp->mtime.seconds))
75 return (FALSE);
76 if (!xdr_u_int(xdrs, &objp->mtime.nseconds))
77 return (FALSE);
78 if (!xdr_u_int(xdrs, &objp->ctime.seconds))
79 return (FALSE);
80 return (xdr_u_int(xdrs, &objp->ctime.nseconds));
81 }
82
83 static bool_t
xdr_b_post_op_attr(XDR * xdrs,post_op_attr * objp)84 xdr_b_post_op_attr(XDR *xdrs, post_op_attr *objp)
85 {
86 if (!xdr_bool(xdrs, &objp->attributes_follow))
87 return (FALSE);
88 switch (objp->attributes_follow) {
89 case TRUE:
90 return (xdr_b_fattr3(xdrs, &objp->post_op_attr_u.attributes));
91 case FALSE:
92 return (TRUE);
93 default:
94 return (FALSE);
95 }
96 }
97
98 static bool_t
xdr_b_diropargs3(XDR * xdrs,diropargs3 * objp)99 xdr_b_diropargs3(XDR *xdrs, diropargs3 *objp)
100 {
101 if (!xdr_b_nfs_fh3(xdrs, &objp->dir))
102 return (FALSE);
103 return (xdr_string(xdrs, &objp->name, ~0));
104 }
105
106 bool_t
xdr_GETATTR3args(XDR * xdrs,GETATTR3args * objp)107 xdr_GETATTR3args(XDR *xdrs, GETATTR3args *objp)
108 {
109 return (xdr_b_nfs_fh3(xdrs, &objp->object));
110 }
111
112 static bool_t
xdr_b_GETATTR3resok(XDR * xdrs,GETATTR3resok * objp)113 xdr_b_GETATTR3resok(XDR *xdrs, GETATTR3resok *objp)
114 {
115 return (xdr_b_fattr3(xdrs, &objp->obj_attributes));
116 }
117
118 bool_t
xdr_GETATTR3res(XDR * xdrs,GETATTR3res * objp)119 xdr_GETATTR3res(XDR *xdrs, GETATTR3res *objp)
120 {
121 if (!xdr_enum(xdrs, (enum_t *)&objp->status))
122 return (FALSE);
123 if (objp->status == NFS3_OK)
124 return (xdr_b_GETATTR3resok(xdrs, &objp->GETATTR3res_u.resok));
125 return (TRUE);
126 }
127
128 bool_t
xdr_LOOKUP3args(XDR * xdrs,LOOKUP3args * objp)129 xdr_LOOKUP3args(XDR *xdrs, LOOKUP3args *objp)
130 {
131 return (xdr_b_diropargs3(xdrs, &objp->what));
132 }
133
134 static bool_t
xdr_b_LOOKUP3resok(XDR * xdrs,LOOKUP3resok * objp)135 xdr_b_LOOKUP3resok(XDR *xdrs, LOOKUP3resok *objp)
136 {
137 if (!xdr_b_nfs_fh3(xdrs, &objp->object))
138 return (FALSE);
139 if (!xdr_b_post_op_attr(xdrs, &objp->obj_attributes))
140 return (FALSE);
141 return (xdr_b_post_op_attr(xdrs, &objp->dir_attributes));
142 }
143
144 static bool_t
xdr_b_LOOKUP3resfail(XDR * xdrs,LOOKUP3resfail * objp)145 xdr_b_LOOKUP3resfail(XDR *xdrs, LOOKUP3resfail *objp)
146 {
147 return (xdr_b_post_op_attr(xdrs, &objp->dir_attributes));
148 }
149
150 bool_t
xdr_LOOKUP3res(XDR * xdrs,LOOKUP3res * objp)151 xdr_LOOKUP3res(XDR *xdrs, LOOKUP3res *objp)
152 {
153 if (!xdr_enum(xdrs, (enum_t *)&objp->status))
154 return (FALSE);
155
156 if (objp->status == NFS3_OK)
157 return (xdr_b_LOOKUP3resok(xdrs, &objp->LOOKUP3res_u.resok));
158
159 return (xdr_b_LOOKUP3resfail(xdrs, &objp->LOOKUP3res_u.resfail));
160 }
161
162 bool_t
xdr_READLINK3args(XDR * xdrs,READLINK3args * objp)163 xdr_READLINK3args(XDR *xdrs, READLINK3args *objp)
164 {
165 return (xdr_b_nfs_fh3(xdrs, &objp->symlink));
166 }
167
168 static bool_t
xdr_b_READLINK3resok(XDR * xdrs,READLINK3resok * objp)169 xdr_b_READLINK3resok(XDR *xdrs, READLINK3resok *objp)
170 {
171 if (!xdr_b_post_op_attr(xdrs, &objp->symlink_attributes))
172 return (FALSE);
173 return (xdr_string(xdrs, &objp->data, ~0));
174 }
175
176 static bool_t
xdr_b_READLINK3resfail(XDR * xdrs,READLINK3resfail * objp)177 xdr_b_READLINK3resfail(XDR *xdrs, READLINK3resfail *objp)
178 {
179 return (xdr_b_post_op_attr(xdrs, &objp->symlink_attributes));
180 }
181
182 bool_t
xdr_READLINK3res(XDR * xdrs,READLINK3res * objp)183 xdr_READLINK3res(XDR *xdrs, READLINK3res *objp)
184 {
185 if (!xdr_enum(xdrs, (enum_t *)&objp->status))
186 return (FALSE);
187 if (objp->status == NFS3_OK)
188 return (xdr_b_READLINK3resok(xdrs,
189 &objp->READLINK3res_u.resok));
190 return (xdr_b_READLINK3resfail(xdrs, &objp->READLINK3res_u.resfail));
191 }
192
193 bool_t
xdr_READ3args(XDR * xdrs,READ3args * objp)194 xdr_READ3args(XDR *xdrs, READ3args *objp)
195 {
196 if (!xdr_b_nfs_fh3(xdrs, &objp->file))
197 return (FALSE);
198 if (!xdr_u_longlong_t(xdrs, &objp->offset))
199 return (FALSE);
200 return (xdr_u_int(xdrs, &objp->count));
201 }
202
203 static bool_t
xdr_b_READ3resok(XDR * xdrs,READ3resok * objp)204 xdr_b_READ3resok(XDR *xdrs, READ3resok *objp)
205 {
206 if (!xdr_b_post_op_attr(xdrs, &objp->file_attributes))
207 return (FALSE);
208 if (!xdr_u_int(xdrs, &objp->count))
209 return (FALSE);
210 if (!xdr_bool(xdrs, &objp->eof))
211 return (FALSE);
212 return (xdr_bytes(xdrs, (char **)&objp->data.data_val,
213 (uint_t *)&objp->data.data_len, ~0));
214 }
215
216 static bool_t
xdr_b_READ3resfail(XDR * xdrs,READ3resfail * objp)217 xdr_b_READ3resfail(XDR *xdrs, READ3resfail *objp)
218 {
219 return (xdr_b_post_op_attr(xdrs, &objp->file_attributes));
220 }
221
222 bool_t
xdr_READ3res(XDR * xdrs,READ3res * objp)223 xdr_READ3res(XDR *xdrs, READ3res *objp)
224 {
225 if (!xdr_enum(xdrs, (enum_t *)&objp->status))
226 return (FALSE);
227 if (objp->status == NFS3_OK)
228 return (xdr_b_READ3resok(xdrs, &objp->READ3res_u.resok));
229 return (xdr_b_READ3resfail(xdrs, &objp->READ3res_u.resfail));
230 }
231
232 bool_t
xdr_READDIR3args(XDR * xdrs,READDIR3args * objp)233 xdr_READDIR3args(XDR *xdrs, READDIR3args *objp)
234 {
235 if (!xdr_b_nfs_fh3(xdrs, &objp->dir))
236 return (FALSE);
237 if (!xdr_u_longlong_t(xdrs, &objp->cookie))
238 return (FALSE);
239 if (!xdr_opaque(xdrs, objp->cookieverf, NFS3_COOKIEVERFSIZE))
240 return (FALSE);
241 return (xdr_u_int(xdrs, &objp->count));
242 }
243
244 static bool_t
xdr_b_entry3(XDR * xdrs,entry3 * objp)245 xdr_b_entry3(XDR *xdrs, entry3 *objp)
246 {
247 if (!xdr_u_longlong_t(xdrs, &objp->fileid))
248 return (FALSE);
249 if (!xdr_string(xdrs, &objp->name, ~0))
250 return (FALSE);
251 if (!xdr_u_longlong_t(xdrs, &objp->cookie))
252 return (FALSE);
253 return (xdr_pointer(xdrs, (char **)&objp->nextentry,
254 sizeof (entry3), (xdrproc_t)xdr_b_entry3));
255 }
256
257 static bool_t
xdr_b_READDIR3resok(XDR * xdrs,READDIR3resok * objp)258 xdr_b_READDIR3resok(XDR *xdrs, READDIR3resok *objp)
259 {
260 if (!xdr_b_post_op_attr(xdrs, &objp->dir_attributes))
261 return (FALSE);
262 if (!xdr_opaque(xdrs, objp->cookieverf, NFS3_COOKIEVERFSIZE))
263 return (FALSE);
264 if (!xdr_pointer(xdrs, (char **)&objp->reply.entries,
265 sizeof (entry3), (xdrproc_t)xdr_b_entry3))
266 return (FALSE);
267 return (xdr_bool(xdrs, &objp->reply.eof));
268 }
269
270 static bool_t
xdr_b_READDIR3resfail(XDR * xdrs,READDIR3resfail * objp)271 xdr_b_READDIR3resfail(XDR *xdrs, READDIR3resfail *objp)
272 {
273 return (xdr_b_post_op_attr(xdrs, &objp->dir_attributes));
274 }
275
276 bool_t
xdr_READDIR3res(XDR * xdrs,READDIR3res * objp)277 xdr_READDIR3res(XDR *xdrs, READDIR3res *objp)
278 {
279 if (!xdr_enum(xdrs, (enum_t *)&objp->status))
280 return (FALSE);
281 if (objp->status == NFS3_OK)
282 return (xdr_b_READDIR3resok(xdrs, &objp->READDIR3res_u.resok));
283 return (xdr_b_READDIR3resfail(xdrs, &objp->READDIR3res_u.resfail));
284 }
285