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