Home | History | Annotate | Download | only in rpcsvc
      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 #ifdef RPC_HDR
     30 %
     31 %/*
     32 % * Definitions for uint64, int64, uint32, and int32
     33 % */
     34 %#include <rpc/rpc_sztypes.h>
     35 %
     36 #endif
     37 
     38 const NFS_PORT          = 2049;
     39 const NFS_MAXDATA       = 8192;
     40 const NFS_MAXPATHLEN    = 1024;
     41 const NFS_MAXNAMLEN	= 255;
     42 const NFS_FHSIZE	= 32;
     43 const NFS_COOKIESIZE	= 4;
     44 const NFS_FIFO_DEV	= -1;	/* size kludge for named pipes */
     45 
     46 /*
     47  * File types
     48  */
     49 const NFSMODE_FMT  = 0170000;	/* type of file */
     50 const NFSMODE_DIR  = 0040000;	/* directory */
     51 const NFSMODE_CHR  = 0020000;	/* character special */
     52 const NFSMODE_BLK  = 0060000;	/* block special */
     53 const NFSMODE_REG  = 0100000;	/* regular */
     54 const NFSMODE_LNK  = 0120000;	/* symbolic link */
     55 const NFSMODE_SOCK = 0140000;	/* socket */
     56 const NFSMODE_FIFO = 0010000;	/* fifo */
     57 
     58 /*
     59  * Error status
     60  */
     61 enum nfsstat {
     62 	NFS_OK= 0,		/* no error */
     63 	NFSERR_PERM=1,		/* Not owner */
     64 	NFSERR_NOENT=2,		/* No such file or directory */
     65 	NFSERR_IO=5,		/* I/O error */
     66 	NFSERR_NXIO=6,		/* No such device or address */
     67 	NFSERR_ACCES=13,	/* Permission denied */
     68 	NFSERR_EXIST=17,	/* File exists */
     69 	NFSERR_XDEV=18,		/* Cross-device link */
     70 	NFSERR_NODEV=19,	/* No such device */
     71 	NFSERR_NOTDIR=20,	/* Not a directory*/
     72 	NFSERR_ISDIR=21,	/* Is a directory */
     73 	NFSERR_INVAL=22,	/* Invalid argument */
     74 	NFSERR_FBIG=27,		/* File too large */
     75 	NFSERR_NOSPC=28,	/* No space left on device */
     76 	NFSERR_ROFS=30,		/* Read-only file system */
     77 	NFSERR_OPNOTSUPP=45,	/* Operation not supported */
     78 	NFSERR_NAMETOOLONG=63,	/* File name too long */
     79 	NFSERR_NOTEMPTY=66,	/* Directory not empty */
     80 	NFSERR_DQUOT=69,	/* Disc quota exceeded */
     81 	NFSERR_STALE=70,	/* Stale NFS file handle */
     82 	NFSERR_REMOTE=71,	/* Object is remote */
     83 	NFSERR_WFLUSH=72	/* write cache flushed */
     84 };
     85 
     86 /*
     87  * File types
     88  */
     89 enum ftype {
     90 	NFNON = 0,	/* non-file */
     91 	NFREG = 1,	/* regular file */
     92 	NFDIR = 2,	/* directory */
     93 	NFBLK = 3,	/* block special */
     94 	NFCHR = 4,	/* character special */
     95 	NFLNK = 5,	/* symbolic link */
     96 	NFSOCK = 6,	/* unix domain sockets */
     97 	NFBAD = 7,	/* unused */
     98 	NFFIFO = 8 	/* named pipe */
     99 };
    100 
    101 /*
    102  * File access handle
    103  */
    104 struct nfs_fh {
    105 	opaque data[NFS_FHSIZE];
    106 };
    107 
    108 /*
    109  * Timeval
    110  */
    111 struct nfstime {
    112 	unsigned seconds;
    113 	unsigned useconds;
    114 };
    115 
    116 
    117 /*
    118  * File attributes
    119  */
    120 struct fattr {
    121 	ftype type;		/* file type */
    122 	unsigned mode;		/* protection mode bits */
    123 	unsigned nlink;		/* # hard links */
    124 	unsigned uid;		/* owner user id */
    125 	unsigned gid;		/* owner group id */
    126 	unsigned size;		/* file size in bytes */
    127 	unsigned blocksize;	/* prefered block size */
    128 	unsigned rdev;		/* special device # */
    129 	unsigned blocks;	/* Kb of disk used by file */
    130 	unsigned fsid;		/* device # */
    131 	unsigned fileid;	/* inode # */
    132 	nfstime	atime;		/* time of last access */
    133 	nfstime	mtime;		/* time of last modification */
    134 	nfstime	ctime;		/* time of last change */
    135 };
    136 
    137 /*
    138  * File attributes which can be set
    139  */
    140 struct sattr {
    141 	unsigned mode;	/* protection mode bits */
    142 	unsigned uid;	/* owner user id */
    143 	unsigned gid;	/* owner group id */
    144 	unsigned size;	/* file size in bytes */
    145 	nfstime	atime;	/* time of last access */
    146 	nfstime	mtime;	/* time of last modification */
    147 };
    148 
    149 
    150 typedef string filename<NFS_MAXNAMLEN>;
    151 typedef string nfspath<NFS_MAXPATHLEN>;
    152 
    153 /*
    154  * Reply status with file attributes
    155  */
    156 union attrstat switch (nfsstat status) {
    157 case NFS_OK:
    158 	fattr attributes;
    159 default:
    160 	void;
    161 };
    162 
    163 struct sattrargs {
    164 	nfs_fh file;
    165 	sattr attributes;
    166 };
    167 
    168 /*
    169  * Arguments for directory operations
    170  */
    171 struct diropargs {
    172 	nfs_fh	dir;	/* directory file handle */
    173 	filename name;		/* name (up to NFS_MAXNAMLEN bytes) */
    174 };
    175 
    176 struct diropokres {
    177 	nfs_fh file;
    178 	fattr attributes;
    179 };
    180 
    181 /*
    182  * Results from directory operation
    183  */
    184 union diropres switch (nfsstat status) {
    185 case NFS_OK:
    186 	diropokres diropres;
    187 default:
    188 	void;
    189 };
    190 
    191 union readlinkres switch (nfsstat status) {
    192 case NFS_OK:
    193 	nfspath data;
    194 default:
    195 	void;
    196 };
    197 
    198 /*
    199  * Arguments to remote read
    200  */
    201 struct readargs {
    202 	nfs_fh file;		/* handle for file */
    203 	unsigned offset;	/* byte offset in file */
    204 	unsigned count;		/* immediate read count */
    205 	unsigned totalcount;	/* total read count (from this offset)*/
    206 };
    207 
    208 /*
    209  * Status OK portion of remote read reply
    210  */
    211 struct readokres {
    212 	fattr	attributes;	/* attributes, need for pagin*/
    213 	opaque data<NFS_MAXDATA>;
    214 };
    215 
    216 union readres switch (nfsstat status) {
    217 case NFS_OK:
    218 	readokres reply;
    219 default:
    220 	void;
    221 };
    222 
    223 /*
    224  * Arguments to remote write
    225  */
    226 struct writeargs {
    227 	nfs_fh	file;		/* handle for file */
    228 	unsigned beginoffset;	/* beginning byte offset in file */
    229 	unsigned offset;	/* current byte offset in file */
    230 	unsigned totalcount;	/* total write count (to this offset)*/
    231 	opaque data<NFS_MAXDATA>;
    232 };
    233 
    234 struct createargs {
    235 	diropargs where;
    236 	sattr attributes;
    237 };
    238 
    239 struct renameargs {
    240 	diropargs from;
    241 	diropargs to;
    242 };
    243 
    244 struct linkargs {
    245 	nfs_fh from;
    246 	diropargs to;
    247 };
    248 
    249 struct symlinkargs {
    250 	diropargs from;
    251 	nfspath to;
    252 	sattr attributes;
    253 };
    254 
    255 
    256 typedef opaque nfscookie[NFS_COOKIESIZE];
    257 
    258 /*
    259  * Arguments to readdir
    260  */
    261 struct readdirargs {
    262 	nfs_fh dir;		/* directory handle */
    263 	nfscookie cookie;
    264 	unsigned count;		/* number of directory bytes to read */
    265 };
    266 
    267 struct entry {
    268 	unsigned fileid;
    269 	filename name;
    270 	nfscookie cookie;
    271 	entry *nextentry;
    272 };
    273 
    274 struct dirlist {
    275 	entry *entries;
    276 	bool eof;
    277 };
    278 
    279 union readdirres switch (nfsstat status) {
    280 case NFS_OK:
    281 	dirlist reply;
    282 default:
    283 	void;
    284 };
    285 
    286 struct statfsokres {
    287 	unsigned tsize;	/* preferred transfer size in bytes */
    288 	unsigned bsize;	/* fundamental file system block size */
    289 	unsigned blocks;	/* total blocks in file system */
    290 	unsigned bfree;	/* free blocks in fs */
    291 	unsigned bavail;	/* free blocks avail to non-superuser */
    292 };
    293 
    294 union statfsres switch (nfsstat status) {
    295 case NFS_OK:
    296 	statfsokres reply;
    297 default:
    298 	void;
    299 };
    300 
    301 /*
    302  * Remote file service routines
    303  */
    304 program NFS_PROGRAM {
    305 	version NFS_VERSION {
    306 		void
    307 		NFSPROC_NULL(void) = 0;
    308 
    309 		attrstat
    310 		NFSPROC_GETATTR(nfs_fh) =	1;
    311 
    312 		attrstat
    313 		NFSPROC_SETATTR(sattrargs) = 2;
    314 
    315 		void
    316 		NFSPROC_ROOT(void) = 3;
    317 
    318 		diropres
    319 		NFSPROC_LOOKUP(diropargs) = 4;
    320 
    321 		readlinkres
    322 		NFSPROC_READLINK(nfs_fh) = 5;
    323 
    324 		readres
    325 		NFSPROC_READ(readargs) = 6;
    326 
    327 		void
    328 		NFSPROC_WRITECACHE(void) = 7;
    329 
    330 		attrstat
    331 		NFSPROC_WRITE(writeargs) = 8;
    332 
    333 		diropres
    334 		NFSPROC_CREATE(createargs) = 9;
    335 
    336 		nfsstat
    337 		NFSPROC_REMOVE(diropargs) = 10;
    338 
    339 		nfsstat
    340 		NFSPROC_RENAME(renameargs) = 11;
    341 
    342 		nfsstat
    343 		NFSPROC_LINK(linkargs) = 12;
    344 
    345 		nfsstat
    346 		NFSPROC_SYMLINK(symlinkargs) = 13;
    347 
    348 		diropres
    349 		NFSPROC_MKDIR(createargs) = 14;
    350 
    351 		nfsstat
    352 		NFSPROC_RMDIR(diropargs) = 15;
    353 
    354 		readdirres
    355 		NFSPROC_READDIR(readdirargs) = 16;
    356 
    357 		statfsres
    358 		NFSPROC_STATFS(nfs_fh) = 17;
    359 	} = 2;
    360 } = 100003;
    361 
    362 /*
    363  * Version 3 declarations and definitions.
    364  */
    365 
    366 /*
    367  * Sizes
    368  */
    369 const NFS3_FHSIZE         = 64;
    370 const NFS3_COOKIEVERFSIZE = 8;
    371 const NFS3_CREATEVERFSIZE = 8;
    372 const NFS3_WRITEVERFSIZE  = 8;
    373 
    374 /*
    375  * Basic data types
    376  */
    377 typedef string		filename3<>;
    378 typedef string		nfspath3<>;
    379 typedef uint64		fileid3;
    380 typedef uint64		cookie3;
    381 typedef opaque		cookieverf3[NFS3_COOKIEVERFSIZE];
    382 typedef opaque		createverf3[NFS3_CREATEVERFSIZE];
    383 typedef opaque		writeverf3[NFS3_WRITEVERFSIZE];
    384 typedef uint32		uid3;
    385 typedef uint32		gid3;
    386 typedef uint64		size3;
    387 typedef uint64		offset3;
    388 typedef uint32		mode3;
    389 typedef uint32		count3;
    390 
    391 /*
    392  * Error status
    393  */
    394 enum nfsstat3 {
    395 	NFS3_OK = 0,
    396 	NFS3ERR_PERM = 1,
    397 	NFS3ERR_NOENT = 2,
    398 	NFS3ERR_IO = 5,
    399 	NFS3ERR_NXIO = 6,
    400 	NFS3ERR_ACCES = 13,
    401 	NFS3ERR_EXIST = 17,
    402 	NFS3ERR_XDEV = 18,
    403 	NFS3ERR_NODEV = 19,
    404 	NFS3ERR_NOTDIR = 20,
    405 	NFS3ERR_ISDIR = 21,
    406 	NFS3ERR_INVAL = 22,
    407 	NFS3ERR_FBIG = 27,
    408 	NFS3ERR_NOSPC = 28,
    409 	NFS3ERR_ROFS = 30,
    410 	NFS3ERR_MLINK = 31,
    411 	NFS3ERR_NAMETOOLONG = 63,
    412 	NFS3ERR_NOTEMPTY = 66,
    413 	NFS3ERR_DQUOT = 69,
    414 	NFS3ERR_STALE = 70,
    415 	NFS3ERR_REMOTE = 71,
    416 	NFS3ERR_BADHANDLE = 10001,
    417 	NFS3ERR_NOT_SYNC = 10002,
    418 	NFS3ERR_BAD_COOKIE = 10003,
    419 	NFS3ERR_NOTSUPP = 10004,
    420 	NFS3ERR_TOOSMALL = 10005,
    421 	NFS3ERR_SERVERFAULT = 10006,
    422 	NFS3ERR_BADTYPE = 10007,
    423 	NFS3ERR_JUKEBOX = 10008
    424 };
    425 
    426 /*
    427  * File types
    428  */
    429 enum ftype3 {
    430 	NF3REG = 1,
    431 	NF3DIR = 2,
    432 	NF3BLK = 3,
    433 	NF3CHR = 4,
    434 	NF3LNK = 5,
    435 	NF3SOCK = 6,
    436 	NF3FIFO = 7
    437 };
    438 
    439 struct specdata3 {
    440 	uint32	specdata1;
    441 	uint32	specdata2;
    442 };
    443 
    444 /*
    445  * File access handle
    446  */
    447 struct nfs_fh3 {
    448 	opaque data<NFS3_FHSIZE>;
    449 };
    450 
    451 /*
    452  * Timeval
    453  */
    454 struct nfstime3 {
    455 	uint32 seconds;
    456 	uint32 nseconds;
    457 };
    458 
    459 /*
    460  * File attributes
    461  */
    462 struct fattr3 {
    463 	ftype3	  type;
    464 	mode3	  mode;
    465 	uint32	  nlink;
    466 	uid3	  uid;
    467 	gid3	  gid;
    468 	size3	  size;
    469 	size3	  used;
    470 	specdata3 rdev;
    471 	uint64	  fsid;
    472 	fileid3	  fileid;
    473 	nfstime3  atime;
    474 	nfstime3  mtime;
    475 	nfstime3  ctime;
    476 };
    477 
    478 /*
    479  * File attributes
    480  */
    481 union post_op_attr switch (bool attributes_follow) {
    482 case TRUE:
    483 	fattr3 attributes;
    484 case FALSE:
    485 	void;
    486 };
    487 
    488 struct wcc_attr {
    489 	size3	 size;
    490 	nfstime3 mtime;
    491 	nfstime3 ctime;
    492 };
    493 
    494 union pre_op_attr switch (bool attributes_follow) {
    495 case TRUE:
    496 	wcc_attr attributes;
    497 case FALSE:
    498 	void;
    499 };
    500 
    501 struct wcc_data {
    502 	pre_op_attr  before;
    503 	post_op_attr after;
    504 };
    505 
    506 union post_op_fh3 switch (bool handle_follows) {
    507 case TRUE:
    508 	nfs_fh3 handle;
    509 case FALSE:
    510 	void;
    511 };
    512 
    513 enum time_how {
    514 	DONT_CHANGE	   = 0,
    515 	SET_TO_SERVER_TIME = 1,
    516 	SET_TO_CLIENT_TIME = 2
    517 };
    518 
    519 union set_mode3 switch (bool set_it) {
    520 case TRUE:
    521 	mode3 mode;
    522 default:
    523 	void;
    524 };
    525 
    526 union set_uid3 switch (bool set_it) {
    527 case TRUE:
    528 	uid3 uid;
    529 default:
    530 	void;
    531 };
    532 
    533 union set_gid3 switch (bool set_it) {
    534 case TRUE:
    535 	gid3 gid;
    536 default:
    537 	void;
    538 };
    539 
    540 union set_size3 switch (bool set_it) {
    541 case TRUE:
    542 	size3	size;
    543 default:
    544 	void;
    545 };
    546 
    547 union set_atime switch (time_how set_it) {
    548 case SET_TO_CLIENT_TIME:
    549 	nfstime3 atime;
    550 default:
    551 	void;
    552 };
    553 
    554 union set_mtime switch (time_how set_it) {
    555 case SET_TO_CLIENT_TIME:
    556 	nfstime3 mtime;
    557 default:
    558 	void;
    559 };
    560 
    561 struct sattr3 {
    562 	set_mode3 mode;
    563 	set_uid3  uid;
    564 	set_gid3  gid;
    565 	set_size3 size;
    566 	set_atime atime;
    567 	set_mtime mtime;
    568 };
    569 
    570 struct diropargs3 {
    571 	nfs_fh3   dir;
    572 	filename3 name;
    573 };
    574 
    575 /*
    576  * GETATTR: Get file attributes
    577  */
    578 struct GETATTR3args {
    579 	nfs_fh3 object;
    580 };
    581 
    582 struct GETATTR3resok {
    583 	fattr3 obj_attributes;
    584 };
    585 
    586 union GETATTR3res switch (nfsstat3 status) {
    587 case NFS3_OK:
    588 	GETATTR3resok resok;
    589 default:
    590 	void;
    591 };
    592 
    593 /*
    594  * SETATTR: Set file attributes
    595  */
    596 union sattrguard3 switch (bool check) {
    597 case TRUE:
    598 	nfstime3 obj_ctime;
    599 case FALSE:
    600 	void;
    601 };
    602 
    603 struct SETATTR3args {
    604 	nfs_fh3     object;
    605 	sattr3	    new_attributes;
    606 	sattrguard3 guard;
    607 };
    608 
    609 struct SETATTR3resok {
    610 	wcc_data obj_wcc;
    611 };
    612 
    613 struct SETATTR3resfail {
    614 	wcc_data obj_wcc;
    615 };
    616 
    617 union SETATTR3res switch (nfsstat3 status) {
    618 case NFS3_OK:
    619 	SETATTR3resok	resok;
    620 default:
    621 	SETATTR3resfail	resfail;
    622 };
    623 
    624 /*
    625  * LOOKUP: Lookup filename
    626  */
    627 struct LOOKUP3args {
    628 	diropargs3 what;
    629 };
    630 
    631 struct LOOKUP3resok {
    632 	nfs_fh3		object;
    633 	post_op_attr	obj_attributes;
    634 	post_op_attr	dir_attributes;
    635 };
    636 
    637 struct LOOKUP3resfail {
    638 	post_op_attr	dir_attributes;
    639 };
    640 
    641 union LOOKUP3res switch (nfsstat3 status) {
    642 case NFS3_OK:
    643 	LOOKUP3resok	resok;
    644 default:
    645 	LOOKUP3resfail	resfail;
    646 };
    647 
    648 /*
    649  * ACCESS: Check access permission
    650  */
    651 const ACCESS3_READ	= 0x0001;
    652 const ACCESS3_LOOKUP	= 0x0002;
    653 const ACCESS3_MODIFY	= 0x0004;
    654 const ACCESS3_EXTEND	= 0x0008;
    655 const ACCESS3_DELETE	= 0x0010;
    656 const ACCESS3_EXECUTE	= 0x0020;
    657 
    658 struct ACCESS3args {
    659 	nfs_fh3	object;
    660 	uint32	access;
    661 };
    662 
    663 struct ACCESS3resok {
    664 	post_op_attr	obj_attributes;
    665 	uint32		access;
    666 };
    667 
    668 struct ACCESS3resfail {
    669 	post_op_attr	obj_attributes;
    670 };
    671 
    672 union ACCESS3res switch (nfsstat3 status) {
    673 case NFS3_OK:
    674 	ACCESS3resok	resok;
    675 default:
    676 	ACCESS3resfail	resfail;
    677 };
    678 
    679 /*
    680  * READLINK: Read from symbolic link
    681  */
    682 struct READLINK3args {
    683 	nfs_fh3	symlink;
    684 };
    685 
    686 struct READLINK3resok {
    687 	post_op_attr	symlink_attributes;
    688 	nfspath3	data;
    689 };
    690 
    691 struct READLINK3resfail {
    692 	post_op_attr	symlink_attributes;
    693 };
    694 
    695 union READLINK3res switch (nfsstat3 status) {
    696 case NFS3_OK:
    697 	READLINK3resok	 resok;
    698 default:
    699 	READLINK3resfail resfail;
    700 };
    701 
    702 /*
    703  * READ: Read from file
    704  */
    705 struct READ3args {
    706 	nfs_fh3		file;
    707 	offset3		offset;
    708 	count3		count;
    709 };
    710 
    711 struct READ3resok {
    712 	post_op_attr	file_attributes;
    713 	count3		count;
    714 	bool		eof;
    715 	opaque		data<>;
    716 };
    717 
    718 struct READ3resfail {
    719 	post_op_attr	file_attributes;
    720 };
    721 
    722 union READ3res switch (nfsstat3 status) {
    723 case NFS3_OK:
    724 	READ3resok	resok;
    725 default:
    726 	READ3resfail	resfail;
    727 };
    728 
    729 /*
    730  * WRITE: Write to file
    731  */
    732 enum stable_how {
    733 	UNSTABLE  = 0,
    734 	DATA_SYNC = 1,
    735 	FILE_SYNC = 2
    736 };
    737 
    738 struct WRITE3args {
    739 	nfs_fh3		file;
    740 	offset3		offset;
    741 	count3		count;
    742 	stable_how	stable;
    743 	opaque		data<>;
    744 };
    745 
    746 struct WRITE3resok {
    747 	wcc_data	file_wcc;
    748 	count3		count;
    749 	stable_how	committed;
    750 	writeverf3	verf;
    751 };
    752 
    753 struct WRITE3resfail {
    754 	wcc_data	file_wcc;
    755 };
    756 
    757 union WRITE3res switch (nfsstat3 status) {
    758 case NFS3_OK:
    759 	WRITE3resok	resok;
    760 default:
    761 	WRITE3resfail	resfail;
    762 };
    763 
    764 /*
    765  * CREATE: Create a file
    766  */
    767 enum createmode3 {
    768 	UNCHECKED = 0,
    769 	GUARDED	  = 1,
    770 	EXCLUSIVE = 2
    771 };
    772 
    773 union createhow3 switch (createmode3 mode) {
    774 case UNCHECKED:
    775 case GUARDED:
    776 	sattr3		obj_attributes;
    777 case EXCLUSIVE:
    778 	createverf3	verf;
    779 };
    780 
    781 struct CREATE3args {
    782 	diropargs3	where;
    783 	createhow3	how;
    784 };
    785 
    786 struct CREATE3resok {
    787 	post_op_fh3	obj;
    788 	post_op_attr	obj_attributes;
    789 	wcc_data	dir_wcc;
    790 };
    791 
    792 struct CREATE3resfail {
    793 	wcc_data	dir_wcc;
    794 };
    795 
    796 union CREATE3res switch (nfsstat3 status) {
    797 case NFS3_OK:
    798 	CREATE3resok	resok;
    799 default:
    800 	CREATE3resfail	resfail;
    801 };
    802 
    803 /*
    804  * MKDIR: Create a directory
    805  */
    806 struct MKDIR3args {
    807 	diropargs3	where;
    808 	sattr3		attributes;
    809 };
    810 
    811 struct MKDIR3resok {
    812 	post_op_fh3	obj;
    813 	post_op_attr	obj_attributes;
    814 	wcc_data	dir_wcc;
    815 };
    816 
    817 struct MKDIR3resfail {
    818 	wcc_data	dir_wcc;
    819 };
    820 
    821 union MKDIR3res switch (nfsstat3 status) {
    822 case NFS3_OK:
    823 	MKDIR3resok	resok;
    824 default:
    825 	MKDIR3resfail	resfail;
    826 };
    827 
    828 /*
    829  * SYMLINK: Create a symbolic link
    830  */
    831 struct symlinkdata3 {
    832 	sattr3		symlink_attributes;
    833 	nfspath3	symlink_data;
    834 };
    835 
    836 struct SYMLINK3args {
    837 	diropargs3	where;
    838 	symlinkdata3	symlink;
    839 };
    840 
    841 struct SYMLINK3resok {
    842 	post_op_fh3	obj;
    843 	post_op_attr	obj_attributes;
    844 	wcc_data	dir_wcc;
    845 };
    846 
    847 struct SYMLINK3resfail {
    848 	wcc_data	dir_wcc;
    849 };
    850 
    851 union SYMLINK3res switch (nfsstat3 status) {
    852 case NFS3_OK:
    853 	SYMLINK3resok	resok;
    854 default:
    855 	SYMLINK3resfail	resfail;
    856 };
    857 
    858 /*
    859  * MKNOD: Create a special file
    860  */
    861 struct devicedata3 {
    862 	sattr3		dev_attributes;
    863 	specdata3	spec;
    864 };
    865 
    866 union mknoddata3 switch (ftype3 type) {
    867 case NF3CHR:
    868 case NF3BLK:
    869 	devicedata3	device;
    870 case NF3SOCK:
    871 case NF3FIFO:
    872 	sattr3		pipe_attributes;
    873 default:
    874 	void;
    875 };
    876 
    877 struct MKNOD3args {
    878 	diropargs3	where;
    879 	mknoddata3	what;
    880 };
    881 
    882 struct MKNOD3resok {
    883 	post_op_fh3	obj;
    884 	post_op_attr	obj_attributes;
    885 	wcc_data	dir_wcc;
    886 };
    887 
    888 struct MKNOD3resfail {
    889 	wcc_data	dir_wcc;
    890 };
    891 
    892 union MKNOD3res switch (nfsstat3 status) {
    893 case NFS3_OK:
    894 	MKNOD3resok	resok;
    895 default:
    896 	MKNOD3resfail	resfail;
    897 };
    898 
    899 /*
    900  * REMOVE: Remove a file
    901  */
    902 struct REMOVE3args {
    903 	diropargs3	object;
    904 };
    905 
    906 struct REMOVE3resok {
    907 	wcc_data	dir_wcc;
    908 };
    909 
    910 struct REMOVE3resfail {
    911 	wcc_data	dir_wcc;
    912 };
    913 
    914 union REMOVE3res switch (nfsstat3 status) {
    915 case NFS3_OK:
    916 	REMOVE3resok	resok;
    917 default:
    918 	REMOVE3resfail	resfail;
    919 };
    920 
    921 /*
    922  * RMDIR: Remove a directory
    923  */
    924 struct RMDIR3args {
    925 	diropargs3 object;
    926 };
    927 
    928 struct RMDIR3resok {
    929 	wcc_data	dir_wcc;
    930 };
    931 
    932 struct RMDIR3resfail {
    933 	wcc_data	dir_wcc;
    934 };
    935 
    936 union RMDIR3res switch (nfsstat3 status) {
    937 case NFS3_OK:
    938 	RMDIR3resok	resok;
    939 default:
    940 	RMDIR3resfail	resfail;
    941 };
    942 
    943 /*
    944  * RENAME: Rename a file or directory
    945  */
    946 struct RENAME3args {
    947 	diropargs3	from;
    948 	diropargs3	to;
    949 };
    950 
    951 struct RENAME3resok {
    952 	wcc_data	fromdir_wcc;
    953 	wcc_data	todir_wcc;
    954 };
    955 
    956 struct RENAME3resfail {
    957 	wcc_data	fromdir_wcc;
    958 	wcc_data	todir_wcc;
    959 };
    960 
    961 union RENAME3res switch (nfsstat3 status) {
    962 case NFS3_OK:
    963 	RENAME3resok	resok;
    964 default:
    965 	RENAME3resfail	resfail;
    966 };
    967 
    968 /*
    969  * LINK: Create link to an object
    970  */
    971 struct LINK3args {
    972 	nfs_fh3		file;
    973 	diropargs3	link;
    974 };
    975 
    976 struct LINK3resok {
    977 	post_op_attr	file_attributes;
    978 	wcc_data	linkdir_wcc;
    979 };
    980 
    981 struct LINK3resfail {
    982 	post_op_attr	file_attributes;
    983 	wcc_data	linkdir_wcc;
    984 };
    985 
    986 union LINK3res switch (nfsstat3 status) {
    987 case NFS3_OK:
    988 	LINK3resok	resok;
    989 default:
    990 	LINK3resfail	resfail;
    991 };
    992 
    993 /*
    994  * READDIR: Read from directory
    995  */
    996 struct READDIR3args {
    997 	nfs_fh3		dir;
    998 	cookie3		cookie;
    999 	cookieverf3	cookieverf;
   1000 	count3		count;
   1001 };
   1002 
   1003 struct entry3 {
   1004 	fileid3		fileid;
   1005 	filename3	name;
   1006 	cookie3		cookie;
   1007 	entry3		*nextentry;
   1008 };
   1009 
   1010 struct dirlist3 {
   1011 	entry3	*entries;
   1012 	bool	eof;
   1013 };
   1014 
   1015 struct READDIR3resok {
   1016 	post_op_attr	dir_attributes;
   1017 	cookieverf3	cookieverf;
   1018 	dirlist3	reply;
   1019 };
   1020 
   1021 struct READDIR3resfail {
   1022 	post_op_attr	dir_attributes;
   1023 };
   1024 
   1025 union READDIR3res switch (nfsstat3 status) {
   1026 case NFS3_OK:
   1027 	READDIR3resok	resok;
   1028 default:
   1029 	READDIR3resfail	resfail;
   1030 };
   1031 
   1032 /*
   1033  * READDIRPLUS: Extended read from a directory
   1034  */
   1035 struct READDIRPLUS3args {
   1036 	nfs_fh3		dir;
   1037 	cookie3		cookie;
   1038 	cookieverf3	cookieverf;
   1039 	count3		dircount;
   1040 	count3		maxcount;
   1041 };
   1042 
   1043 struct entryplus3 {
   1044 	fileid3		fileid;
   1045 	filename3	name;
   1046 	cookie3		cookie;
   1047 	post_op_attr	name_attributes;
   1048 	post_op_fh3	name_handle;
   1049 	entryplus3	*nextentry;
   1050 };
   1051 
   1052 struct dirlistplus3 {
   1053 	entryplus3	*entries;
   1054 	bool		eof;
   1055 };
   1056 
   1057 struct READDIRPLUS3resok {
   1058 	post_op_attr	dir_attributes;
   1059 	cookieverf3	cookieverf;
   1060 	dirlistplus3	reply;
   1061 };
   1062 
   1063 struct READDIRPLUS3resfail {
   1064 	post_op_attr	dir_attributes;
   1065 };
   1066 
   1067 union READDIRPLUS3res switch (nfsstat3 status) {
   1068 case NFS3_OK:
   1069 	READDIRPLUS3resok	resok;
   1070 default:
   1071 	READDIRPLUS3resfail	resfail;
   1072 };
   1073 
   1074 /*
   1075  * FSSTAT: Get dynamic file system information
   1076  */
   1077 struct FSSTAT3args {
   1078 	nfs_fh3	fsroot;
   1079 };
   1080 
   1081 struct FSSTAT3resok {
   1082 	post_op_attr	obj_attributes;
   1083 	size3		tbytes;
   1084 	size3		fbytes;
   1085 	size3		abytes;
   1086 	size3		tfiles;
   1087 	size3		ffiles;
   1088 	size3		afiles;
   1089 	uint32		invarsec;
   1090 };
   1091 
   1092 struct FSSTAT3resfail {
   1093 	post_op_attr	obj_attributes;
   1094 };
   1095 
   1096 union FSSTAT3res switch (nfsstat3 status) {
   1097 case NFS3_OK:
   1098 	FSSTAT3resok	resok;
   1099 default:
   1100 	FSSTAT3resfail	resfail;
   1101 };
   1102 
   1103 /*
   1104  * FSINFO: Get static file system information
   1105  */
   1106 
   1107 const FSF3_LINK		= 0x0001;
   1108 const FSF3_SYMLINK	= 0x0002;
   1109 const FSF3_HOMOGENEOUS	= 0x0008;
   1110 const FSF3_CANSETTIME	= 0x0010;
   1111 
   1112 struct FSINFO3args {
   1113 	nfs_fh3	fsroot;
   1114 };
   1115 
   1116 struct FSINFO3resok {
   1117 	post_op_attr	obj_attributes;
   1118 	uint32		rtmax;
   1119 	uint32		rtpref;
   1120 	uint32		rtmult;
   1121 	uint32		wtmax;
   1122 	uint32		wtpref;
   1123 	uint32		wtmult;
   1124 	uint32		dtpref;
   1125 	size3		maxfilesize;
   1126 	nfstime3	time_delta;
   1127 	uint32		properties;
   1128 };
   1129 
   1130 struct FSINFO3resfail {
   1131 	post_op_attr	obj_attributes;
   1132 };
   1133 
   1134 union FSINFO3res switch (nfsstat3 status) {
   1135 case NFS3_OK:
   1136 	FSINFO3resok	resok;
   1137 default:
   1138 	FSINFO3resfail	resfail;
   1139 };
   1140 
   1141 /*
   1142  * PATHCONF: Retrieve POSIX information
   1143  */
   1144 struct PATHCONF3args {
   1145 	nfs_fh3	object;
   1146 };
   1147 
   1148 struct PATHCONF3resok {
   1149 	post_op_attr	obj_attributes;
   1150 	uint32		linkmax;
   1151 	uint32		name_max;
   1152 	bool		no_trunc;
   1153 	bool		chown_restricted;
   1154 	bool		case_insensitive;
   1155 	bool		case_preserving;
   1156 };
   1157 
   1158 struct PATHCONF3resfail {
   1159 	post_op_attr	obj_attributes;
   1160 };
   1161 
   1162 union PATHCONF3res switch (nfsstat3 status) {
   1163 case NFS3_OK:
   1164 	PATHCONF3resok	 resok;
   1165 default:
   1166 	PATHCONF3resfail resfail;
   1167 };
   1168 
   1169 /*
   1170  * COMMIT: Commit cached data on a server to stable storage
   1171  */
   1172 struct COMMIT3args {
   1173 	nfs_fh3	file;
   1174 	offset3	offset;
   1175 	count3	count;
   1176 };
   1177 
   1178 struct COMMIT3resok {
   1179 	wcc_data	file_wcc;
   1180 	writeverf3	verf;
   1181 };
   1182 
   1183 struct COMMIT3resfail {
   1184 	wcc_data	file_wcc;
   1185 };
   1186 
   1187 union COMMIT3res switch (nfsstat3 status) {
   1188 case NFS3_OK:
   1189 	COMMIT3resok	resok;
   1190 default:
   1191 	COMMIT3resfail	resfail;
   1192 };
   1193 
   1194 /*
   1195  * Remote file service routines
   1196  */
   1197 program NFS3_PROGRAM {
   1198 	version NFS_V3 {
   1199 		void
   1200 		NFSPROC3_NULL(void) = 0;
   1201 
   1202 		GETATTR3res
   1203 		NFSPROC3_GETATTR(GETATTR3args) = 1;
   1204 
   1205 		SETATTR3res
   1206 		NFSPROC3_SETATTR(SETATTR3args) = 2;
   1207 
   1208 		LOOKUP3res
   1209 		NFSPROC3_LOOKUP(LOOKUP3args) = 3;
   1210 
   1211 		ACCESS3res
   1212 		NFSPROC3_ACCESS(ACCESS3args) = 4;
   1213 
   1214 		READLINK3res
   1215 		NFSPROC3_READLINK(READLINK3args) = 5;
   1216 
   1217 		READ3res
   1218 		NFSPROC3_READ(READ3args) = 6;
   1219 
   1220 		WRITE3res
   1221 		NFSPROC3_WRITE(WRITE3args) = 7;
   1222 
   1223 		CREATE3res
   1224 		NFSPROC3_CREATE(CREATE3args) = 8;
   1225 
   1226 		MKDIR3res
   1227 		NFSPROC3_MKDIR(MKDIR3args) = 9;
   1228 
   1229 		SYMLINK3res
   1230 		NFSPROC3_SYMLINK(SYMLINK3args) = 10;
   1231 
   1232 		MKNOD3res
   1233 		NFSPROC3_MKNOD(MKNOD3args) = 11;
   1234 
   1235 		REMOVE3res
   1236 		NFSPROC3_REMOVE(REMOVE3args) = 12;
   1237 
   1238 		RMDIR3res
   1239 		NFSPROC3_RMDIR(RMDIR3args) = 13;
   1240 
   1241 		RENAME3res
   1242 		NFSPROC3_RENAME(RENAME3args) = 14;
   1243 
   1244 		LINK3res
   1245 		NFSPROC3_LINK(LINK3args) = 15;
   1246 
   1247 		READDIR3res
   1248 		NFSPROC3_READDIR(READDIR3args) = 16;
   1249 
   1250 		READDIRPLUS3res
   1251 		NFSPROC3_READDIRPLUS(READDIRPLUS3args) = 17;
   1252 
   1253 		FSSTAT3res
   1254 		NFSPROC3_FSSTAT(FSSTAT3args) = 18;
   1255 
   1256 		FSINFO3res
   1257 		NFSPROC3_FSINFO(FSINFO3args) = 19;
   1258 
   1259 		PATHCONF3res
   1260 		NFSPROC3_PATHCONF(PATHCONF3args) = 20;
   1261 
   1262 		COMMIT3res
   1263 		NFSPROC3_COMMIT(COMMIT3args) = 21;
   1264 	} = 3;
   1265 } = 100003;
   1266