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 static bool_t
xdr_b_nfsstat(XDR * xdrs,nfsstat * objp)38 xdr_b_nfsstat(XDR *xdrs, nfsstat *objp)
39 {
40 return (xdr_enum(xdrs, (enum_t *)objp));
41 }
42
43 static bool_t
xdr_b_ftype(XDR * xdrs,ftype * objp)44 xdr_b_ftype(XDR *xdrs, ftype *objp)
45 {
46 return (xdr_enum(xdrs, (enum_t *)objp));
47 }
48
49 bool_t
xdr_nfs_fh(XDR * xdrs,nfs_fh * objp)50 xdr_nfs_fh(XDR *xdrs, nfs_fh *objp)
51 {
52 return (xdr_opaque(xdrs, objp->data, NFS_FHSIZE));
53 }
54
55 static bool_t
xdr_b_nfstime(XDR * xdrs,nfstime * objp)56 xdr_b_nfstime(XDR *xdrs, nfstime *objp)
57 {
58 if (!xdr_u_int(xdrs, &objp->seconds)) {
59 return (FALSE);
60 }
61 return (xdr_u_int(xdrs, &objp->useconds));
62 }
63
64 static bool_t
xdr_b_fattr(XDR * xdrs,fattr * objp)65 xdr_b_fattr(XDR *xdrs, fattr *objp)
66 {
67 if (!xdr_b_ftype(xdrs, &objp->type)) {
68 return (FALSE);
69 }
70 if (!xdr_u_int(xdrs, &objp->mode)) {
71 return (FALSE);
72 }
73 if (!xdr_u_int(xdrs, &objp->nlink)) {
74 return (FALSE);
75 }
76 if (!xdr_u_int(xdrs, &objp->uid)) {
77 return (FALSE);
78 }
79 if (!xdr_u_int(xdrs, &objp->gid)) {
80 return (FALSE);
81 }
82 if (!xdr_u_int(xdrs, &objp->size)) {
83 return (FALSE);
84 }
85 if (!xdr_u_int(xdrs, &objp->blocksize)) {
86 return (FALSE);
87 }
88 if (!xdr_u_int(xdrs, &objp->rdev)) {
89 return (FALSE);
90 }
91 if (!xdr_u_int(xdrs, &objp->blocks)) {
92 return (FALSE);
93 }
94 if (!xdr_u_int(xdrs, &objp->fsid)) {
95 return (FALSE);
96 }
97 if (!xdr_u_int(xdrs, &objp->fileid)) {
98 return (FALSE);
99 }
100 if (!xdr_b_nfstime(xdrs, &objp->atime)) {
101 return (FALSE);
102 }
103 if (!xdr_b_nfstime(xdrs, &objp->mtime)) {
104 return (FALSE);
105 }
106 return (xdr_b_nfstime(xdrs, &objp->ctime));
107 }
108
109 static bool_t
xdr_b_filename(XDR * xdrs,filename * objp)110 xdr_b_filename(XDR *xdrs, filename *objp)
111 {
112 return (xdr_string(xdrs, objp, NFS_MAXNAMLEN));
113 }
114
115 static bool_t
xdr_b_nfspath(XDR * xdrs,nfspath * objp)116 xdr_b_nfspath(XDR *xdrs, nfspath *objp)
117 {
118 return (xdr_string(xdrs, objp, NFS_MAXPATHLEN));
119 }
120
121 bool_t
xdr_attrstat(XDR * xdrs,attrstat * objp)122 xdr_attrstat(XDR *xdrs, attrstat *objp)
123 {
124 if (!xdr_b_nfsstat(xdrs, &objp->status)) {
125 return (FALSE);
126 }
127 if (objp->status == NFS_OK) {
128 return (xdr_b_fattr(xdrs, &objp->attrstat_u.attributes));
129 }
130 return (TRUE);
131 }
132
133 bool_t
xdr_diropargs(XDR * xdrs,diropargs * objp)134 xdr_diropargs(XDR *xdrs, diropargs *objp)
135 {
136 if (!xdr_nfs_fh(xdrs, &objp->dir)) {
137 return (FALSE);
138 }
139 return (xdr_b_filename(xdrs, &objp->name));
140 }
141
142 static bool_t
xdr_b_diropokres(XDR * xdrs,diropokres * objp)143 xdr_b_diropokres(XDR *xdrs, diropokres *objp)
144 {
145 if (!xdr_nfs_fh(xdrs, &objp->file)) {
146 return (FALSE);
147 }
148 return (xdr_b_fattr(xdrs, &objp->attributes));
149 }
150
151 bool_t
xdr_diropres(XDR * xdrs,diropres * objp)152 xdr_diropres(XDR *xdrs, diropres *objp)
153 {
154 if (!xdr_b_nfsstat(xdrs, &objp->status)) {
155 return (FALSE);
156 }
157 if (objp->status == NFS_OK) {
158 return (xdr_b_diropokres(xdrs, &objp->diropres_u.diropres));
159 }
160 return (TRUE);
161 }
162
163 bool_t
xdr_readlinkres(XDR * xdrs,readlinkres * objp)164 xdr_readlinkres(XDR *xdrs, readlinkres *objp)
165 {
166 if (!xdr_b_nfsstat(xdrs, &objp->status)) {
167 return (FALSE);
168 }
169 if (objp->status == NFS_OK) {
170 return (xdr_b_nfspath(xdrs, &objp->readlinkres_u.data));
171 }
172 return (TRUE);
173 }
174
175 bool_t
xdr_readargs(XDR * xdrs,readargs * objp)176 xdr_readargs(XDR *xdrs, readargs *objp)
177 {
178 if (!xdr_nfs_fh(xdrs, &objp->file)) {
179 return (FALSE);
180 }
181 if (!xdr_u_int(xdrs, &objp->offset)) {
182 return (FALSE);
183 }
184 if (!xdr_u_int(xdrs, &objp->count)) {
185 return (FALSE);
186 }
187 return (xdr_u_int(xdrs, &objp->totalcount));
188 }
189
190 static bool_t
xdr_b_readokres(XDR * xdrs,readokres * objp)191 xdr_b_readokres(XDR *xdrs, readokres *objp)
192 {
193 if (!xdr_b_fattr(xdrs, &objp->attributes)) {
194 return (FALSE);
195 }
196 return (xdr_bytes(xdrs, (char **)&objp->data.data_val,
197 (uint_t *)&objp->data.data_len, NFS_MAXDATA));
198 }
199
200 bool_t
xdr_readres(XDR * xdrs,readres * objp)201 xdr_readres(XDR *xdrs, readres *objp)
202 {
203 if (!xdr_b_nfsstat(xdrs, &objp->status)) {
204 return (FALSE);
205 }
206 if (objp->status == NFS_OK) {
207 return (xdr_b_readokres(xdrs, &objp->readres_u.reply));
208 }
209 return (TRUE);
210 }
211
212 static bool_t
xdr_b_nfscookie(XDR * xdrs,nfscookie objp)213 xdr_b_nfscookie(XDR *xdrs, nfscookie objp)
214 {
215 return (xdr_opaque(xdrs, objp, NFS_COOKIESIZE));
216 }
217
218 bool_t
xdr_readdirargs(XDR * xdrs,readdirargs * objp)219 xdr_readdirargs(XDR *xdrs, readdirargs *objp)
220 {
221 if (!xdr_nfs_fh(xdrs, &objp->dir)) {
222 return (FALSE);
223 }
224 if (!xdr_b_nfscookie(xdrs, objp->cookie)) {
225 return (FALSE);
226 }
227 return (xdr_u_int(xdrs, &objp->count));
228 }
229
230 static bool_t
xdr_b_entry(XDR * xdrs,entry * objp)231 xdr_b_entry(XDR *xdrs, entry *objp)
232 {
233 if (!xdr_u_int(xdrs, &objp->fileid)) {
234 return (FALSE);
235 }
236 if (!xdr_b_filename(xdrs, &objp->name)) {
237 return (FALSE);
238 }
239 if (!xdr_b_nfscookie(xdrs, objp->cookie)) {
240 return (FALSE);
241 }
242 return (xdr_pointer(xdrs, (char **)&objp->nextentry, sizeof (entry),
243 (xdrproc_t)xdr_b_entry));
244 }
245
246 static bool_t
xdr_b_dirlist(XDR * xdrs,dirlist * objp)247 xdr_b_dirlist(XDR *xdrs, dirlist *objp)
248 {
249 if (!xdr_pointer(xdrs, (char **)&objp->entries, sizeof (entry),
250 (xdrproc_t)xdr_b_entry)) {
251 return (FALSE);
252 }
253 return (xdr_bool(xdrs, &objp->eof));
254 }
255
256 bool_t
xdr_readdirres(XDR * xdrs,readdirres * objp)257 xdr_readdirres(XDR *xdrs, readdirres *objp)
258 {
259 if (!xdr_b_nfsstat(xdrs, &objp->status)) {
260 return (FALSE);
261 }
262 if (objp->status == NFS_OK) {
263 return (xdr_b_dirlist(xdrs, &objp->readdirres_u.reply));
264 }
265 return (TRUE);
266 }
267