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