1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* 23*7c478bd9Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24*7c478bd9Sstevel@tonic-gate * Use is subject to license terms. 25*7c478bd9Sstevel@tonic-gate */ 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 28*7c478bd9Sstevel@tonic-gate 29*7c478bd9Sstevel@tonic-gate #include <rpc/types.h> 30*7c478bd9Sstevel@tonic-gate #include <rpc/xdr.h> 31*7c478bd9Sstevel@tonic-gate #include <rpc/rpc.h> 32*7c478bd9Sstevel@tonic-gate #include <rpcsvc/nfs_prot.h> 33*7c478bd9Sstevel@tonic-gate 34*7c478bd9Sstevel@tonic-gate /* 35*7c478bd9Sstevel@tonic-gate * XDR routines for NFS ops. 36*7c478bd9Sstevel@tonic-gate */ 37*7c478bd9Sstevel@tonic-gate static bool_t 38*7c478bd9Sstevel@tonic-gate xdr_b_nfsstat(XDR *xdrs, nfsstat *objp) 39*7c478bd9Sstevel@tonic-gate { 40*7c478bd9Sstevel@tonic-gate return (xdr_enum(xdrs, (enum_t *)objp)); 41*7c478bd9Sstevel@tonic-gate } 42*7c478bd9Sstevel@tonic-gate 43*7c478bd9Sstevel@tonic-gate static bool_t 44*7c478bd9Sstevel@tonic-gate xdr_b_ftype(XDR *xdrs, ftype *objp) 45*7c478bd9Sstevel@tonic-gate { 46*7c478bd9Sstevel@tonic-gate return (xdr_enum(xdrs, (enum_t *)objp)); 47*7c478bd9Sstevel@tonic-gate } 48*7c478bd9Sstevel@tonic-gate 49*7c478bd9Sstevel@tonic-gate bool_t 50*7c478bd9Sstevel@tonic-gate xdr_nfs_fh(XDR *xdrs, nfs_fh *objp) 51*7c478bd9Sstevel@tonic-gate { 52*7c478bd9Sstevel@tonic-gate return (xdr_opaque(xdrs, objp->data, NFS_FHSIZE)); 53*7c478bd9Sstevel@tonic-gate } 54*7c478bd9Sstevel@tonic-gate 55*7c478bd9Sstevel@tonic-gate static bool_t 56*7c478bd9Sstevel@tonic-gate xdr_b_nfstime(XDR *xdrs, nfstime *objp) 57*7c478bd9Sstevel@tonic-gate { 58*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->seconds)) { 59*7c478bd9Sstevel@tonic-gate return (FALSE); 60*7c478bd9Sstevel@tonic-gate } 61*7c478bd9Sstevel@tonic-gate return (xdr_u_int(xdrs, &objp->useconds)); 62*7c478bd9Sstevel@tonic-gate } 63*7c478bd9Sstevel@tonic-gate 64*7c478bd9Sstevel@tonic-gate static bool_t 65*7c478bd9Sstevel@tonic-gate xdr_b_fattr(XDR *xdrs, fattr *objp) 66*7c478bd9Sstevel@tonic-gate { 67*7c478bd9Sstevel@tonic-gate if (!xdr_b_ftype(xdrs, &objp->type)) { 68*7c478bd9Sstevel@tonic-gate return (FALSE); 69*7c478bd9Sstevel@tonic-gate } 70*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->mode)) { 71*7c478bd9Sstevel@tonic-gate return (FALSE); 72*7c478bd9Sstevel@tonic-gate } 73*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->nlink)) { 74*7c478bd9Sstevel@tonic-gate return (FALSE); 75*7c478bd9Sstevel@tonic-gate } 76*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->uid)) { 77*7c478bd9Sstevel@tonic-gate return (FALSE); 78*7c478bd9Sstevel@tonic-gate } 79*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->gid)) { 80*7c478bd9Sstevel@tonic-gate return (FALSE); 81*7c478bd9Sstevel@tonic-gate } 82*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->size)) { 83*7c478bd9Sstevel@tonic-gate return (FALSE); 84*7c478bd9Sstevel@tonic-gate } 85*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->blocksize)) { 86*7c478bd9Sstevel@tonic-gate return (FALSE); 87*7c478bd9Sstevel@tonic-gate } 88*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->rdev)) { 89*7c478bd9Sstevel@tonic-gate return (FALSE); 90*7c478bd9Sstevel@tonic-gate } 91*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->blocks)) { 92*7c478bd9Sstevel@tonic-gate return (FALSE); 93*7c478bd9Sstevel@tonic-gate } 94*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->fsid)) { 95*7c478bd9Sstevel@tonic-gate return (FALSE); 96*7c478bd9Sstevel@tonic-gate } 97*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->fileid)) { 98*7c478bd9Sstevel@tonic-gate return (FALSE); 99*7c478bd9Sstevel@tonic-gate } 100*7c478bd9Sstevel@tonic-gate if (!xdr_b_nfstime(xdrs, &objp->atime)) { 101*7c478bd9Sstevel@tonic-gate return (FALSE); 102*7c478bd9Sstevel@tonic-gate } 103*7c478bd9Sstevel@tonic-gate if (!xdr_b_nfstime(xdrs, &objp->mtime)) { 104*7c478bd9Sstevel@tonic-gate return (FALSE); 105*7c478bd9Sstevel@tonic-gate } 106*7c478bd9Sstevel@tonic-gate return (xdr_b_nfstime(xdrs, &objp->ctime)); 107*7c478bd9Sstevel@tonic-gate } 108*7c478bd9Sstevel@tonic-gate 109*7c478bd9Sstevel@tonic-gate static bool_t 110*7c478bd9Sstevel@tonic-gate xdr_b_filename(XDR *xdrs, filename *objp) 111*7c478bd9Sstevel@tonic-gate { 112*7c478bd9Sstevel@tonic-gate return (xdr_string(xdrs, objp, NFS_MAXNAMLEN)); 113*7c478bd9Sstevel@tonic-gate } 114*7c478bd9Sstevel@tonic-gate 115*7c478bd9Sstevel@tonic-gate static bool_t 116*7c478bd9Sstevel@tonic-gate xdr_b_nfspath(XDR *xdrs, nfspath *objp) 117*7c478bd9Sstevel@tonic-gate { 118*7c478bd9Sstevel@tonic-gate return (xdr_string(xdrs, objp, NFS_MAXPATHLEN)); 119*7c478bd9Sstevel@tonic-gate } 120*7c478bd9Sstevel@tonic-gate 121*7c478bd9Sstevel@tonic-gate bool_t 122*7c478bd9Sstevel@tonic-gate xdr_attrstat(XDR *xdrs, attrstat *objp) 123*7c478bd9Sstevel@tonic-gate { 124*7c478bd9Sstevel@tonic-gate if (!xdr_b_nfsstat(xdrs, &objp->status)) { 125*7c478bd9Sstevel@tonic-gate return (FALSE); 126*7c478bd9Sstevel@tonic-gate } 127*7c478bd9Sstevel@tonic-gate if (objp->status == NFS_OK) { 128*7c478bd9Sstevel@tonic-gate return (xdr_b_fattr(xdrs, &objp->attrstat_u.attributes)); 129*7c478bd9Sstevel@tonic-gate } 130*7c478bd9Sstevel@tonic-gate return (TRUE); 131*7c478bd9Sstevel@tonic-gate } 132*7c478bd9Sstevel@tonic-gate 133*7c478bd9Sstevel@tonic-gate bool_t 134*7c478bd9Sstevel@tonic-gate xdr_diropargs(XDR *xdrs, diropargs *objp) 135*7c478bd9Sstevel@tonic-gate { 136*7c478bd9Sstevel@tonic-gate if (!xdr_nfs_fh(xdrs, &objp->dir)) { 137*7c478bd9Sstevel@tonic-gate return (FALSE); 138*7c478bd9Sstevel@tonic-gate } 139*7c478bd9Sstevel@tonic-gate return (xdr_b_filename(xdrs, &objp->name)); 140*7c478bd9Sstevel@tonic-gate } 141*7c478bd9Sstevel@tonic-gate 142*7c478bd9Sstevel@tonic-gate static bool_t 143*7c478bd9Sstevel@tonic-gate xdr_b_diropokres(XDR *xdrs, diropokres *objp) 144*7c478bd9Sstevel@tonic-gate { 145*7c478bd9Sstevel@tonic-gate if (!xdr_nfs_fh(xdrs, &objp->file)) { 146*7c478bd9Sstevel@tonic-gate return (FALSE); 147*7c478bd9Sstevel@tonic-gate } 148*7c478bd9Sstevel@tonic-gate return (xdr_b_fattr(xdrs, &objp->attributes)); 149*7c478bd9Sstevel@tonic-gate } 150*7c478bd9Sstevel@tonic-gate 151*7c478bd9Sstevel@tonic-gate bool_t 152*7c478bd9Sstevel@tonic-gate xdr_diropres(XDR *xdrs, diropres *objp) 153*7c478bd9Sstevel@tonic-gate { 154*7c478bd9Sstevel@tonic-gate if (!xdr_b_nfsstat(xdrs, &objp->status)) { 155*7c478bd9Sstevel@tonic-gate return (FALSE); 156*7c478bd9Sstevel@tonic-gate } 157*7c478bd9Sstevel@tonic-gate if (objp->status == NFS_OK) { 158*7c478bd9Sstevel@tonic-gate return (xdr_b_diropokres(xdrs, &objp->diropres_u.diropres)); 159*7c478bd9Sstevel@tonic-gate } 160*7c478bd9Sstevel@tonic-gate return (TRUE); 161*7c478bd9Sstevel@tonic-gate } 162*7c478bd9Sstevel@tonic-gate 163*7c478bd9Sstevel@tonic-gate bool_t 164*7c478bd9Sstevel@tonic-gate xdr_readlinkres(XDR *xdrs, readlinkres *objp) 165*7c478bd9Sstevel@tonic-gate { 166*7c478bd9Sstevel@tonic-gate if (!xdr_b_nfsstat(xdrs, &objp->status)) { 167*7c478bd9Sstevel@tonic-gate return (FALSE); 168*7c478bd9Sstevel@tonic-gate } 169*7c478bd9Sstevel@tonic-gate if (objp->status == NFS_OK) { 170*7c478bd9Sstevel@tonic-gate return (xdr_b_nfspath(xdrs, &objp->readlinkres_u.data)); 171*7c478bd9Sstevel@tonic-gate } 172*7c478bd9Sstevel@tonic-gate return (TRUE); 173*7c478bd9Sstevel@tonic-gate } 174*7c478bd9Sstevel@tonic-gate 175*7c478bd9Sstevel@tonic-gate bool_t 176*7c478bd9Sstevel@tonic-gate xdr_readargs(XDR *xdrs, readargs *objp) 177*7c478bd9Sstevel@tonic-gate { 178*7c478bd9Sstevel@tonic-gate if (!xdr_nfs_fh(xdrs, &objp->file)) { 179*7c478bd9Sstevel@tonic-gate return (FALSE); 180*7c478bd9Sstevel@tonic-gate } 181*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->offset)) { 182*7c478bd9Sstevel@tonic-gate return (FALSE); 183*7c478bd9Sstevel@tonic-gate } 184*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->count)) { 185*7c478bd9Sstevel@tonic-gate return (FALSE); 186*7c478bd9Sstevel@tonic-gate } 187*7c478bd9Sstevel@tonic-gate return (xdr_u_int(xdrs, &objp->totalcount)); 188*7c478bd9Sstevel@tonic-gate } 189*7c478bd9Sstevel@tonic-gate 190*7c478bd9Sstevel@tonic-gate static bool_t 191*7c478bd9Sstevel@tonic-gate xdr_b_readokres(XDR *xdrs, readokres *objp) 192*7c478bd9Sstevel@tonic-gate { 193*7c478bd9Sstevel@tonic-gate if (!xdr_b_fattr(xdrs, &objp->attributes)) { 194*7c478bd9Sstevel@tonic-gate return (FALSE); 195*7c478bd9Sstevel@tonic-gate } 196*7c478bd9Sstevel@tonic-gate return (xdr_bytes(xdrs, (char **)&objp->data.data_val, 197*7c478bd9Sstevel@tonic-gate (uint_t *)&objp->data.data_len, NFS_MAXDATA)); 198*7c478bd9Sstevel@tonic-gate } 199*7c478bd9Sstevel@tonic-gate 200*7c478bd9Sstevel@tonic-gate bool_t 201*7c478bd9Sstevel@tonic-gate xdr_readres(XDR *xdrs, readres *objp) 202*7c478bd9Sstevel@tonic-gate { 203*7c478bd9Sstevel@tonic-gate if (!xdr_b_nfsstat(xdrs, &objp->status)) { 204*7c478bd9Sstevel@tonic-gate return (FALSE); 205*7c478bd9Sstevel@tonic-gate } 206*7c478bd9Sstevel@tonic-gate if (objp->status == NFS_OK) { 207*7c478bd9Sstevel@tonic-gate return (xdr_b_readokres(xdrs, &objp->readres_u.reply)); 208*7c478bd9Sstevel@tonic-gate } 209*7c478bd9Sstevel@tonic-gate return (TRUE); 210*7c478bd9Sstevel@tonic-gate } 211*7c478bd9Sstevel@tonic-gate 212*7c478bd9Sstevel@tonic-gate static bool_t 213*7c478bd9Sstevel@tonic-gate xdr_b_nfscookie(XDR *xdrs, nfscookie objp) 214*7c478bd9Sstevel@tonic-gate { 215*7c478bd9Sstevel@tonic-gate return (xdr_opaque(xdrs, objp, NFS_COOKIESIZE)); 216*7c478bd9Sstevel@tonic-gate } 217*7c478bd9Sstevel@tonic-gate 218*7c478bd9Sstevel@tonic-gate bool_t 219*7c478bd9Sstevel@tonic-gate xdr_readdirargs(XDR *xdrs, readdirargs *objp) 220*7c478bd9Sstevel@tonic-gate { 221*7c478bd9Sstevel@tonic-gate if (!xdr_nfs_fh(xdrs, &objp->dir)) { 222*7c478bd9Sstevel@tonic-gate return (FALSE); 223*7c478bd9Sstevel@tonic-gate } 224*7c478bd9Sstevel@tonic-gate if (!xdr_b_nfscookie(xdrs, objp->cookie)) { 225*7c478bd9Sstevel@tonic-gate return (FALSE); 226*7c478bd9Sstevel@tonic-gate } 227*7c478bd9Sstevel@tonic-gate return (xdr_u_int(xdrs, &objp->count)); 228*7c478bd9Sstevel@tonic-gate } 229*7c478bd9Sstevel@tonic-gate 230*7c478bd9Sstevel@tonic-gate static bool_t 231*7c478bd9Sstevel@tonic-gate xdr_b_entry(XDR *xdrs, entry *objp) 232*7c478bd9Sstevel@tonic-gate { 233*7c478bd9Sstevel@tonic-gate if (!xdr_u_int(xdrs, &objp->fileid)) { 234*7c478bd9Sstevel@tonic-gate return (FALSE); 235*7c478bd9Sstevel@tonic-gate } 236*7c478bd9Sstevel@tonic-gate if (!xdr_b_filename(xdrs, &objp->name)) { 237*7c478bd9Sstevel@tonic-gate return (FALSE); 238*7c478bd9Sstevel@tonic-gate } 239*7c478bd9Sstevel@tonic-gate if (!xdr_b_nfscookie(xdrs, objp->cookie)) { 240*7c478bd9Sstevel@tonic-gate return (FALSE); 241*7c478bd9Sstevel@tonic-gate } 242*7c478bd9Sstevel@tonic-gate return (xdr_pointer(xdrs, (char **)&objp->nextentry, sizeof (entry), 243*7c478bd9Sstevel@tonic-gate (xdrproc_t)xdr_b_entry)); 244*7c478bd9Sstevel@tonic-gate } 245*7c478bd9Sstevel@tonic-gate 246*7c478bd9Sstevel@tonic-gate static bool_t 247*7c478bd9Sstevel@tonic-gate xdr_b_dirlist(XDR *xdrs, dirlist *objp) 248*7c478bd9Sstevel@tonic-gate { 249*7c478bd9Sstevel@tonic-gate if (!xdr_pointer(xdrs, (char **)&objp->entries, sizeof (entry), 250*7c478bd9Sstevel@tonic-gate (xdrproc_t)xdr_b_entry)) { 251*7c478bd9Sstevel@tonic-gate return (FALSE); 252*7c478bd9Sstevel@tonic-gate } 253*7c478bd9Sstevel@tonic-gate return (xdr_bool(xdrs, &objp->eof)); 254*7c478bd9Sstevel@tonic-gate } 255*7c478bd9Sstevel@tonic-gate 256*7c478bd9Sstevel@tonic-gate bool_t 257*7c478bd9Sstevel@tonic-gate xdr_readdirres(XDR *xdrs, readdirres *objp) 258*7c478bd9Sstevel@tonic-gate { 259*7c478bd9Sstevel@tonic-gate if (!xdr_b_nfsstat(xdrs, &objp->status)) { 260*7c478bd9Sstevel@tonic-gate return (FALSE); 261*7c478bd9Sstevel@tonic-gate } 262*7c478bd9Sstevel@tonic-gate if (objp->status == NFS_OK) { 263*7c478bd9Sstevel@tonic-gate return (xdr_b_dirlist(xdrs, &objp->readdirres_u.reply)); 264*7c478bd9Sstevel@tonic-gate } 265*7c478bd9Sstevel@tonic-gate return (TRUE); 266*7c478bd9Sstevel@tonic-gate } 267