1*53ee8cc1Swenshuai.xi /* @(#)nfs_prot.x 2.1 88/08/01 4.0 RPCSRC */ 2*53ee8cc1Swenshuai.xi 3*53ee8cc1Swenshuai.xi /* 4*53ee8cc1Swenshuai.xi * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 5*53ee8cc1Swenshuai.xi * unrestricted use provided that this legend is included on all tape 6*53ee8cc1Swenshuai.xi * media and as a part of the software program in whole or part. Users 7*53ee8cc1Swenshuai.xi * may copy or modify Sun RPC without charge, but are not authorized 8*53ee8cc1Swenshuai.xi * to license or distribute it to anyone else except as part of a product or 9*53ee8cc1Swenshuai.xi * program developed by the user. 10*53ee8cc1Swenshuai.xi * 11*53ee8cc1Swenshuai.xi * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 12*53ee8cc1Swenshuai.xi * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 13*53ee8cc1Swenshuai.xi * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 14*53ee8cc1Swenshuai.xi * 15*53ee8cc1Swenshuai.xi * Sun RPC is provided with no support and without any obligation on the 16*53ee8cc1Swenshuai.xi * part of Sun Microsystems, Inc. to assist in its use, correction, 17*53ee8cc1Swenshuai.xi * modification or enhancement. 18*53ee8cc1Swenshuai.xi * 19*53ee8cc1Swenshuai.xi * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 20*53ee8cc1Swenshuai.xi * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 21*53ee8cc1Swenshuai.xi * OR ANY PART THEREOF. 22*53ee8cc1Swenshuai.xi * 23*53ee8cc1Swenshuai.xi * In no event will Sun Microsystems, Inc. be liable for any lost revenue 24*53ee8cc1Swenshuai.xi * or profits or other special, indirect and consequential damages, even if 25*53ee8cc1Swenshuai.xi * Sun has been advised of the possibility of such damages. 26*53ee8cc1Swenshuai.xi * 27*53ee8cc1Swenshuai.xi * Sun Microsystems, Inc. 28*53ee8cc1Swenshuai.xi * 2550 Garcia Avenue 29*53ee8cc1Swenshuai.xi * Mountain View, California 94043 30*53ee8cc1Swenshuai.xi */ 31*53ee8cc1Swenshuai.xi 32*53ee8cc1Swenshuai.xi /* 33*53ee8cc1Swenshuai.xi * nfs_prot.x 1.2 87/10/12 34*53ee8cc1Swenshuai.xi * Copyright 1987 Sun Microsystems, Inc. 35*53ee8cc1Swenshuai.xi */ 36*53ee8cc1Swenshuai.xi const NFS_PORT = 2049; 37*53ee8cc1Swenshuai.xi const NFS_MAXDATA = 8192; 38*53ee8cc1Swenshuai.xi const NFS_MAXPATHLEN = 1024; 39*53ee8cc1Swenshuai.xi const NFS_MAXNAMLEN = 255; 40*53ee8cc1Swenshuai.xi const NFS_FHSIZE = 32; 41*53ee8cc1Swenshuai.xi const NFS_COOKIESIZE = 4; 42*53ee8cc1Swenshuai.xi const NFS_FIFO_DEV = -1; /* size kludge for named pipes */ 43*53ee8cc1Swenshuai.xi 44*53ee8cc1Swenshuai.xi /* 45*53ee8cc1Swenshuai.xi * File types 46*53ee8cc1Swenshuai.xi */ 47*53ee8cc1Swenshuai.xi const NFSMODE_FMT = 0170000; /* type of file */ 48*53ee8cc1Swenshuai.xi const NFSMODE_DIR = 0040000; /* directory */ 49*53ee8cc1Swenshuai.xi const NFSMODE_CHR = 0020000; /* character special */ 50*53ee8cc1Swenshuai.xi const NFSMODE_BLK = 0060000; /* block special */ 51*53ee8cc1Swenshuai.xi const NFSMODE_REG = 0100000; /* regular */ 52*53ee8cc1Swenshuai.xi const NFSMODE_LNK = 0120000; /* symbolic link */ 53*53ee8cc1Swenshuai.xi const NFSMODE_SOCK = 0140000; /* socket */ 54*53ee8cc1Swenshuai.xi const NFSMODE_FIFO = 0010000; /* fifo */ 55*53ee8cc1Swenshuai.xi 56*53ee8cc1Swenshuai.xi /* 57*53ee8cc1Swenshuai.xi * Error status 58*53ee8cc1Swenshuai.xi */ 59*53ee8cc1Swenshuai.xi enum nfsstat { 60*53ee8cc1Swenshuai.xi NFS_OK= 0, /* no error */ 61*53ee8cc1Swenshuai.xi NFSERR_PERM=1, /* Not owner */ 62*53ee8cc1Swenshuai.xi NFSERR_NOENT=2, /* No such file or directory */ 63*53ee8cc1Swenshuai.xi NFSERR_IO=5, /* I/O error */ 64*53ee8cc1Swenshuai.xi NFSERR_NXIO=6, /* No such device or address */ 65*53ee8cc1Swenshuai.xi NFSERR_ACCES=13, /* Permission denied */ 66*53ee8cc1Swenshuai.xi NFSERR_EXIST=17, /* File exists */ 67*53ee8cc1Swenshuai.xi NFSERR_NODEV=19, /* No such device */ 68*53ee8cc1Swenshuai.xi NFSERR_NOTDIR=20, /* Not a directory*/ 69*53ee8cc1Swenshuai.xi NFSERR_ISDIR=21, /* Is a directory */ 70*53ee8cc1Swenshuai.xi NFSERR_FBIG=27, /* File too large */ 71*53ee8cc1Swenshuai.xi NFSERR_NOSPC=28, /* No space left on device */ 72*53ee8cc1Swenshuai.xi NFSERR_ROFS=30, /* Read-only file system */ 73*53ee8cc1Swenshuai.xi NFSERR_NAMETOOLONG=63, /* File name too long */ 74*53ee8cc1Swenshuai.xi NFSERR_NOTEMPTY=66, /* Directory not empty */ 75*53ee8cc1Swenshuai.xi NFSERR_DQUOT=69, /* Disc quota exceeded */ 76*53ee8cc1Swenshuai.xi NFSERR_STALE=70, /* Stale NFS file handle */ 77*53ee8cc1Swenshuai.xi NFSERR_WFLUSH=99 /* write cache flushed */ 78*53ee8cc1Swenshuai.xi }; 79*53ee8cc1Swenshuai.xi 80*53ee8cc1Swenshuai.xi /* 81*53ee8cc1Swenshuai.xi * File types 82*53ee8cc1Swenshuai.xi */ 83*53ee8cc1Swenshuai.xi enum ftype { 84*53ee8cc1Swenshuai.xi NFNON = 0, /* non-file */ 85*53ee8cc1Swenshuai.xi NFREG = 1, /* regular file */ 86*53ee8cc1Swenshuai.xi NFDIR = 2, /* directory */ 87*53ee8cc1Swenshuai.xi NFBLK = 3, /* block special */ 88*53ee8cc1Swenshuai.xi NFCHR = 4, /* character special */ 89*53ee8cc1Swenshuai.xi NFLNK = 5, /* symbolic link */ 90*53ee8cc1Swenshuai.xi NFSOCK = 6, /* unix domain sockets */ 91*53ee8cc1Swenshuai.xi NFBAD = 7, /* unused */ 92*53ee8cc1Swenshuai.xi NFFIFO = 8 /* named pipe */ 93*53ee8cc1Swenshuai.xi }; 94*53ee8cc1Swenshuai.xi 95*53ee8cc1Swenshuai.xi /* 96*53ee8cc1Swenshuai.xi * File access handle 97*53ee8cc1Swenshuai.xi */ 98*53ee8cc1Swenshuai.xi struct nfs_fh { 99*53ee8cc1Swenshuai.xi opaque data[NFS_FHSIZE]; 100*53ee8cc1Swenshuai.xi }; 101*53ee8cc1Swenshuai.xi 102*53ee8cc1Swenshuai.xi /* 103*53ee8cc1Swenshuai.xi * Timeval 104*53ee8cc1Swenshuai.xi */ 105*53ee8cc1Swenshuai.xi struct nfstime { 106*53ee8cc1Swenshuai.xi unsigned seconds; 107*53ee8cc1Swenshuai.xi unsigned useconds; 108*53ee8cc1Swenshuai.xi }; 109*53ee8cc1Swenshuai.xi 110*53ee8cc1Swenshuai.xi 111*53ee8cc1Swenshuai.xi /* 112*53ee8cc1Swenshuai.xi * File attributes 113*53ee8cc1Swenshuai.xi */ 114*53ee8cc1Swenshuai.xi struct fattr { 115*53ee8cc1Swenshuai.xi ftype type; /* file type */ 116*53ee8cc1Swenshuai.xi unsigned mode; /* protection mode bits */ 117*53ee8cc1Swenshuai.xi unsigned nlink; /* # hard links */ 118*53ee8cc1Swenshuai.xi unsigned uid; /* owner user id */ 119*53ee8cc1Swenshuai.xi unsigned gid; /* owner group id */ 120*53ee8cc1Swenshuai.xi unsigned size; /* file size in bytes */ 121*53ee8cc1Swenshuai.xi unsigned blocksize; /* preferred block size */ 122*53ee8cc1Swenshuai.xi unsigned rdev; /* special device # */ 123*53ee8cc1Swenshuai.xi unsigned blocks; /* Kb of disk used by file */ 124*53ee8cc1Swenshuai.xi unsigned fsid; /* device # */ 125*53ee8cc1Swenshuai.xi unsigned fileid; /* inode # */ 126*53ee8cc1Swenshuai.xi nfstime atime; /* time of last access */ 127*53ee8cc1Swenshuai.xi nfstime mtime; /* time of last modification */ 128*53ee8cc1Swenshuai.xi nfstime ctime; /* time of last change */ 129*53ee8cc1Swenshuai.xi }; 130*53ee8cc1Swenshuai.xi 131*53ee8cc1Swenshuai.xi /* 132*53ee8cc1Swenshuai.xi * File attributes which can be set 133*53ee8cc1Swenshuai.xi */ 134*53ee8cc1Swenshuai.xi struct sattr { 135*53ee8cc1Swenshuai.xi unsigned mode; /* protection mode bits */ 136*53ee8cc1Swenshuai.xi unsigned uid; /* owner user id */ 137*53ee8cc1Swenshuai.xi unsigned gid; /* owner group id */ 138*53ee8cc1Swenshuai.xi unsigned size; /* file size in bytes */ 139*53ee8cc1Swenshuai.xi nfstime atime; /* time of last access */ 140*53ee8cc1Swenshuai.xi nfstime mtime; /* time of last modification */ 141*53ee8cc1Swenshuai.xi }; 142*53ee8cc1Swenshuai.xi 143*53ee8cc1Swenshuai.xi 144*53ee8cc1Swenshuai.xi typedef string filename<NFS_MAXNAMLEN>; 145*53ee8cc1Swenshuai.xi typedef string nfspath<NFS_MAXPATHLEN>; 146*53ee8cc1Swenshuai.xi 147*53ee8cc1Swenshuai.xi /* 148*53ee8cc1Swenshuai.xi * Reply status with file attributes 149*53ee8cc1Swenshuai.xi */ 150*53ee8cc1Swenshuai.xi union attrstat switch (nfsstat status) { 151*53ee8cc1Swenshuai.xi case NFS_OK: 152*53ee8cc1Swenshuai.xi fattr attributes; 153*53ee8cc1Swenshuai.xi default: 154*53ee8cc1Swenshuai.xi void; 155*53ee8cc1Swenshuai.xi }; 156*53ee8cc1Swenshuai.xi 157*53ee8cc1Swenshuai.xi struct sattrargs { 158*53ee8cc1Swenshuai.xi nfs_fh file; 159*53ee8cc1Swenshuai.xi sattr attributes; 160*53ee8cc1Swenshuai.xi }; 161*53ee8cc1Swenshuai.xi 162*53ee8cc1Swenshuai.xi /* 163*53ee8cc1Swenshuai.xi * Arguments for directory operations 164*53ee8cc1Swenshuai.xi */ 165*53ee8cc1Swenshuai.xi struct diropargs { 166*53ee8cc1Swenshuai.xi nfs_fh dir; /* directory file handle */ 167*53ee8cc1Swenshuai.xi filename name; /* name (up to NFS_MAXNAMLEN bytes) */ 168*53ee8cc1Swenshuai.xi }; 169*53ee8cc1Swenshuai.xi 170*53ee8cc1Swenshuai.xi struct diropokres { 171*53ee8cc1Swenshuai.xi nfs_fh file; 172*53ee8cc1Swenshuai.xi fattr attributes; 173*53ee8cc1Swenshuai.xi }; 174*53ee8cc1Swenshuai.xi 175*53ee8cc1Swenshuai.xi /* 176*53ee8cc1Swenshuai.xi * Results from directory operation 177*53ee8cc1Swenshuai.xi */ 178*53ee8cc1Swenshuai.xi union diropres switch (nfsstat status) { 179*53ee8cc1Swenshuai.xi case NFS_OK: 180*53ee8cc1Swenshuai.xi diropokres diropres; 181*53ee8cc1Swenshuai.xi default: 182*53ee8cc1Swenshuai.xi void; 183*53ee8cc1Swenshuai.xi }; 184*53ee8cc1Swenshuai.xi 185*53ee8cc1Swenshuai.xi union readlinkres switch (nfsstat status) { 186*53ee8cc1Swenshuai.xi case NFS_OK: 187*53ee8cc1Swenshuai.xi nfspath data; 188*53ee8cc1Swenshuai.xi default: 189*53ee8cc1Swenshuai.xi void; 190*53ee8cc1Swenshuai.xi }; 191*53ee8cc1Swenshuai.xi 192*53ee8cc1Swenshuai.xi /* 193*53ee8cc1Swenshuai.xi * Arguments to remote read 194*53ee8cc1Swenshuai.xi */ 195*53ee8cc1Swenshuai.xi struct readargs { 196*53ee8cc1Swenshuai.xi nfs_fh file; /* handle for file */ 197*53ee8cc1Swenshuai.xi unsigned offset; /* byte offset in file */ 198*53ee8cc1Swenshuai.xi unsigned count; /* immediate read count */ 199*53ee8cc1Swenshuai.xi unsigned totalcount; /* total read count (from this offset)*/ 200*53ee8cc1Swenshuai.xi }; 201*53ee8cc1Swenshuai.xi 202*53ee8cc1Swenshuai.xi /* 203*53ee8cc1Swenshuai.xi * Status OK portion of remote read reply 204*53ee8cc1Swenshuai.xi */ 205*53ee8cc1Swenshuai.xi struct readokres { 206*53ee8cc1Swenshuai.xi fattr attributes; /* attributes, need for pagin*/ 207*53ee8cc1Swenshuai.xi opaque data<NFS_MAXDATA>; 208*53ee8cc1Swenshuai.xi }; 209*53ee8cc1Swenshuai.xi 210*53ee8cc1Swenshuai.xi union readres switch (nfsstat status) { 211*53ee8cc1Swenshuai.xi case NFS_OK: 212*53ee8cc1Swenshuai.xi readokres reply; 213*53ee8cc1Swenshuai.xi default: 214*53ee8cc1Swenshuai.xi void; 215*53ee8cc1Swenshuai.xi }; 216*53ee8cc1Swenshuai.xi 217*53ee8cc1Swenshuai.xi /* 218*53ee8cc1Swenshuai.xi * Arguments to remote write 219*53ee8cc1Swenshuai.xi */ 220*53ee8cc1Swenshuai.xi struct writeargs { 221*53ee8cc1Swenshuai.xi nfs_fh file; /* handle for file */ 222*53ee8cc1Swenshuai.xi unsigned beginoffset; /* beginning byte offset in file */ 223*53ee8cc1Swenshuai.xi unsigned offset; /* current byte offset in file */ 224*53ee8cc1Swenshuai.xi unsigned totalcount; /* total write count (to this offset)*/ 225*53ee8cc1Swenshuai.xi opaque data<NFS_MAXDATA>; 226*53ee8cc1Swenshuai.xi }; 227*53ee8cc1Swenshuai.xi 228*53ee8cc1Swenshuai.xi struct createargs { 229*53ee8cc1Swenshuai.xi diropargs where; 230*53ee8cc1Swenshuai.xi sattr attributes; 231*53ee8cc1Swenshuai.xi }; 232*53ee8cc1Swenshuai.xi 233*53ee8cc1Swenshuai.xi struct renameargs { 234*53ee8cc1Swenshuai.xi diropargs from; 235*53ee8cc1Swenshuai.xi diropargs to; 236*53ee8cc1Swenshuai.xi }; 237*53ee8cc1Swenshuai.xi 238*53ee8cc1Swenshuai.xi struct linkargs { 239*53ee8cc1Swenshuai.xi nfs_fh from; 240*53ee8cc1Swenshuai.xi diropargs to; 241*53ee8cc1Swenshuai.xi }; 242*53ee8cc1Swenshuai.xi 243*53ee8cc1Swenshuai.xi struct symlinkargs { 244*53ee8cc1Swenshuai.xi diropargs from; 245*53ee8cc1Swenshuai.xi nfspath to; 246*53ee8cc1Swenshuai.xi sattr attributes; 247*53ee8cc1Swenshuai.xi }; 248*53ee8cc1Swenshuai.xi 249*53ee8cc1Swenshuai.xi 250*53ee8cc1Swenshuai.xi typedef opaque nfscookie[NFS_COOKIESIZE]; 251*53ee8cc1Swenshuai.xi 252*53ee8cc1Swenshuai.xi /* 253*53ee8cc1Swenshuai.xi * Arguments to readdir 254*53ee8cc1Swenshuai.xi */ 255*53ee8cc1Swenshuai.xi struct readdirargs { 256*53ee8cc1Swenshuai.xi nfs_fh dir; /* directory handle */ 257*53ee8cc1Swenshuai.xi nfscookie cookie; 258*53ee8cc1Swenshuai.xi unsigned count; /* number of directory bytes to read */ 259*53ee8cc1Swenshuai.xi }; 260*53ee8cc1Swenshuai.xi 261*53ee8cc1Swenshuai.xi struct entry { 262*53ee8cc1Swenshuai.xi unsigned fileid; 263*53ee8cc1Swenshuai.xi filename name; 264*53ee8cc1Swenshuai.xi nfscookie cookie; 265*53ee8cc1Swenshuai.xi entry *nextentry; 266*53ee8cc1Swenshuai.xi }; 267*53ee8cc1Swenshuai.xi 268*53ee8cc1Swenshuai.xi struct dirlist { 269*53ee8cc1Swenshuai.xi entry *entries; 270*53ee8cc1Swenshuai.xi bool eof; 271*53ee8cc1Swenshuai.xi }; 272*53ee8cc1Swenshuai.xi 273*53ee8cc1Swenshuai.xi union readdirres switch (nfsstat status) { 274*53ee8cc1Swenshuai.xi case NFS_OK: 275*53ee8cc1Swenshuai.xi dirlist reply; 276*53ee8cc1Swenshuai.xi default: 277*53ee8cc1Swenshuai.xi void; 278*53ee8cc1Swenshuai.xi }; 279*53ee8cc1Swenshuai.xi 280*53ee8cc1Swenshuai.xi struct statfsokres { 281*53ee8cc1Swenshuai.xi unsigned tsize; /* preferred transfer size in bytes */ 282*53ee8cc1Swenshuai.xi unsigned bsize; /* fundamental file system block size */ 283*53ee8cc1Swenshuai.xi unsigned blocks; /* total blocks in file system */ 284*53ee8cc1Swenshuai.xi unsigned bfree; /* free blocks in fs */ 285*53ee8cc1Swenshuai.xi unsigned bavail; /* free blocks avail to non-superuser */ 286*53ee8cc1Swenshuai.xi }; 287*53ee8cc1Swenshuai.xi 288*53ee8cc1Swenshuai.xi union statfsres switch (nfsstat status) { 289*53ee8cc1Swenshuai.xi case NFS_OK: 290*53ee8cc1Swenshuai.xi statfsokres reply; 291*53ee8cc1Swenshuai.xi default: 292*53ee8cc1Swenshuai.xi void; 293*53ee8cc1Swenshuai.xi }; 294*53ee8cc1Swenshuai.xi 295*53ee8cc1Swenshuai.xi /* 296*53ee8cc1Swenshuai.xi * Remote file service routines 297*53ee8cc1Swenshuai.xi */ 298*53ee8cc1Swenshuai.xi program NFS_PROGRAM { 299*53ee8cc1Swenshuai.xi version NFS_VERSION { 300*53ee8cc1Swenshuai.xi void 301*53ee8cc1Swenshuai.xi NFSPROC_NULL(void) = 0; 302*53ee8cc1Swenshuai.xi 303*53ee8cc1Swenshuai.xi attrstat 304*53ee8cc1Swenshuai.xi NFSPROC_GETATTR(nfs_fh) = 1; 305*53ee8cc1Swenshuai.xi 306*53ee8cc1Swenshuai.xi attrstat 307*53ee8cc1Swenshuai.xi NFSPROC_SETATTR(sattrargs) = 2; 308*53ee8cc1Swenshuai.xi 309*53ee8cc1Swenshuai.xi void 310*53ee8cc1Swenshuai.xi NFSPROC_ROOT(void) = 3; 311*53ee8cc1Swenshuai.xi 312*53ee8cc1Swenshuai.xi diropres 313*53ee8cc1Swenshuai.xi NFSPROC_LOOKUP(diropargs) = 4; 314*53ee8cc1Swenshuai.xi 315*53ee8cc1Swenshuai.xi readlinkres 316*53ee8cc1Swenshuai.xi NFSPROC_READLINK(nfs_fh) = 5; 317*53ee8cc1Swenshuai.xi 318*53ee8cc1Swenshuai.xi readres 319*53ee8cc1Swenshuai.xi NFSPROC_READ(readargs) = 6; 320*53ee8cc1Swenshuai.xi 321*53ee8cc1Swenshuai.xi void 322*53ee8cc1Swenshuai.xi NFSPROC_WRITECACHE(void) = 7; 323*53ee8cc1Swenshuai.xi 324*53ee8cc1Swenshuai.xi attrstat 325*53ee8cc1Swenshuai.xi NFSPROC_WRITE(writeargs) = 8; 326*53ee8cc1Swenshuai.xi 327*53ee8cc1Swenshuai.xi diropres 328*53ee8cc1Swenshuai.xi NFSPROC_CREATE(createargs) = 9; 329*53ee8cc1Swenshuai.xi 330*53ee8cc1Swenshuai.xi nfsstat 331*53ee8cc1Swenshuai.xi NFSPROC_REMOVE(diropargs) = 10; 332*53ee8cc1Swenshuai.xi 333*53ee8cc1Swenshuai.xi nfsstat 334*53ee8cc1Swenshuai.xi NFSPROC_RENAME(renameargs) = 11; 335*53ee8cc1Swenshuai.xi 336*53ee8cc1Swenshuai.xi nfsstat 337*53ee8cc1Swenshuai.xi NFSPROC_LINK(linkargs) = 12; 338*53ee8cc1Swenshuai.xi 339*53ee8cc1Swenshuai.xi nfsstat 340*53ee8cc1Swenshuai.xi NFSPROC_SYMLINK(symlinkargs) = 13; 341*53ee8cc1Swenshuai.xi 342*53ee8cc1Swenshuai.xi diropres 343*53ee8cc1Swenshuai.xi NFSPROC_MKDIR(createargs) = 14; 344*53ee8cc1Swenshuai.xi 345*53ee8cc1Swenshuai.xi nfsstat 346*53ee8cc1Swenshuai.xi NFSPROC_RMDIR(diropargs) = 15; 347*53ee8cc1Swenshuai.xi 348*53ee8cc1Swenshuai.xi readdirres 349*53ee8cc1Swenshuai.xi NFSPROC_READDIR(readdirargs) = 16; 350*53ee8cc1Swenshuai.xi 351*53ee8cc1Swenshuai.xi statfsres 352*53ee8cc1Swenshuai.xi NFSPROC_STATFS(nfs_fh) = 17; 353*53ee8cc1Swenshuai.xi } = 2; 354*53ee8cc1Swenshuai.xi } = 100003; 355