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