xref: /netbsd-src/lib/librpcsvc/nfs_prot.x (revision d710132b4b8ce7f7cccaaf660cb16aa16b4077a0)
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 %#include <sys/cdefs.h>
32 %#ifndef lint
33 %/*static char sccsid[] = "from: @(#)nfs_prot.x 1.2 87/10/12 Copyr 1987 Sun Micro";*/
34 %/*static char sccsid[] = "from: @(#)nfs_prot.x	2.1 88/08/01 4.0 RPCSRC";*/
35 %__RCSID("$NetBSD: nfs_prot.x,v 1.5 2003/05/08 13:32:00 yamt Exp $");
36 %#endif /* not lint */
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;	/* prefered 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 /*
299  * NFSv3 constants and types
300  */
301 const NFS3_FHSIZE	= 64;	/* maximum size in bytes of a file handle */
302 const NFS3_COOKIEVERFSIZE = 8;	/* size of a cookie verifier for READDIR */
303 const NFS3_CREATEVERFSIZE = 8;	/* size of the verifier used for CREATE */
304 const NFS3_WRITEVERFSIZE = 8;	/* size of the verifier used for WRITE */
305 
306 typedef u_int64_t uint64; /* XXX */
307 typedef int64_t int64; /* XXX */
308 typedef unsigned long uint32;
309 typedef long int32;
310 typedef string filename3<>;
311 typedef string nfspath3<>;
312 typedef uint64 fileid3;
313 typedef uint64 cookie3;
314 typedef opaque cookieverf3[NFS3_COOKIEVERFSIZE];
315 typedef opaque createverf3[NFS3_CREATEVERFSIZE];
316 typedef opaque writeverf3[NFS3_WRITEVERFSIZE];
317 typedef uint32 uid3;
318 typedef uint32 gid3;
319 typedef uint64 size3;
320 typedef uint64 offset3;
321 typedef uint32 mode3;
322 typedef uint32 count3;
323 
324 /*
325  * Error status (v3)
326  */
327 enum nfsstat3 {
328 	NFS3_OK	= 0,
329 	NFS3ERR_PERM		= 1,
330 	NFS3ERR_NOENT		= 2,
331 	NFS3ERR_IO		= 5,
332 	NFS3ERR_NXIO		= 6,
333 	NFS3ERR_ACCES		= 13,
334 	NFS3ERR_EXIST		= 17,
335 	NFS3ERR_XDEV		= 18,
336 	NFS3ERR_NODEV		= 19,
337 	NFS3ERR_NOTDIR		= 20,
338 	NFS3ERR_ISDIR		= 21,
339 	NFS3ERR_INVAL		= 22,
340 	NFS3ERR_FBIG		= 27,
341 	NFS3ERR_NOSPC		= 28,
342 	NFS3ERR_ROFS		= 30,
343 	NFS3ERR_MLINK		= 31,
344 	NFS3ERR_NAMETOOLONG	= 63,
345 	NFS3ERR_NOTEMPTY	= 66,
346 	NFS3ERR_DQUOT		= 69,
347 	NFS3ERR_STALE		= 70,
348 	NFS3ERR_REMOTE		= 71,
349 	NFS3ERR_BADHANDLE	= 10001,
350 	NFS3ERR_NOT_SYNC	= 10002,
351 	NFS3ERR_BAD_COOKIE	= 10003,
352 	NFS3ERR_NOTSUPP		= 10004,
353 	NFS3ERR_TOOSMALL	= 10005,
354 	NFS3ERR_SERVERFAULT	= 10006,
355 	NFS3ERR_BADTYPE		= 10007,
356 	NFS3ERR_JUKEBOX		= 10008
357 };
358 
359 /*
360  * File types (v3)
361  */
362 enum ftype3 {
363 	NF3REG	= 1,		/* regular file */
364 	NF3DIR	= 2,		/* directory */
365 	NF3BLK	= 3,		/* block special */
366 	NF3CHR	= 4,		/* character special */
367 	NF3LNK	= 5,		/* symbolic link */
368 	NF3SOCK	= 6,		/* unix domain sockets */
369 	NF3FIFO	= 7		/* named pipe */
370 };
371 
372 struct specdata3 {
373 	uint32	specdata1;
374 	uint32	specdata2;
375 };
376 
377 /*
378  * File access handle (v3)
379  */
380 struct nfs_fh3 {
381 	opaque data<NFS3_FHSIZE>;
382 };
383 
384 /*
385  * Timeval (v3)
386  */
387 struct nfstime3 {
388 	uint32	seconds;
389 	uint32	nseconds;
390 };
391 
392 
393 /*
394  * File attributes (v3)
395  */
396 struct fattr3 {
397 	ftype3	type;		/* file type */
398 	mode3	mode;		/* protection mode bits */
399 	uint32	nlink;		/* # hard links */
400 	uid3	uid;		/* owner user id */
401 	gid3	gid;		/* owner group id */
402 	size3	size;		/* file size in bytes */
403 	size3	used;		/* prefered block size */
404 	specdata3 rdev;		/* special device # */
405 	uint64 fsid;		/* device # */
406 	fileid3	fileid;		/* inode # */
407 	nfstime3 atime;		/* time of last access */
408 	nfstime3 mtime;		/* time of last modification */
409 	nfstime3 ctime;		/* time of last change */
410 };
411 
412 union post_op_attr switch (bool attributes_follow) {
413 case TRUE:
414 	fattr3	attributes;
415 case FALSE:
416 	void;
417 };
418 
419 struct wcc_attr {
420 	size3	size;
421 	nfstime3 mtime;
422 	nfstime3 ctime;
423 };
424 
425 union pre_op_attr switch (bool attributes_follow) {
426 case TRUE:
427 	wcc_attr attributes;
428 case FALSE:
429 	void;
430 };
431 
432 struct wcc_data {
433 	pre_op_attr before;
434 	post_op_attr after;
435 };
436 
437 union post_op_fh3 switch (bool handle_follows) {
438 case TRUE:
439 	nfs_fh3	handle;
440 case FALSE:
441 	void;
442 };
443 
444 /*
445  * File attributes which can be set (v3)
446  */
447 enum time_how {
448 	DONT_CHANGE		= 0,
449 	SET_TO_SERVER_TIME	= 1,
450 	SET_TO_CLIENT_TIME	= 2
451 };
452 
453 union set_mode3 switch (bool set_it) {
454 case TRUE:
455 	mode3	mode;
456 default:
457 	void;
458 };
459 
460 union set_uid3 switch (bool set_it) {
461 case TRUE:
462 	uid3	uid;
463 default:
464 	void;
465 };
466 
467 union set_gid3 switch (bool set_it) {
468 case TRUE:
469 	gid3	gid;
470 default:
471 	void;
472 };
473 
474 union set_size3 switch (bool set_it) {
475 case TRUE:
476 	size3	size;
477 default:
478 	void;
479 };
480 
481 union set_atime switch (time_how set_it) {
482 case SET_TO_CLIENT_TIME:
483 	nfstime3	atime;
484 default:
485 	void;
486 };
487 
488 union set_mtime switch (time_how set_it) {
489 case SET_TO_CLIENT_TIME:
490 	nfstime3	mtime;
491 default:
492 	void;
493 };
494 
495 struct sattr3 {
496 	set_mode3	mode;
497 	set_uid3	uid;
498 	set_gid3	gid;
499 	set_size3	size;
500 	set_atime	atime;
501 	set_mtime	mtime;
502 };
503 
504 /*
505  * Arguments for directory operations (v3)
506  */
507 struct diropargs3 {
508 	nfs_fh3	dir;		/* directory file handle */
509 	filename3 name;		/* name (up to NFS_MAXNAMLEN bytes) */
510 };
511 
512 /*
513  * Arguments to getattr (v3).
514  */
515 struct GETATTR3args {
516 	nfs_fh3		object;
517 };
518 
519 struct GETATTR3resok {
520 	fattr3		obj_attributes;
521 };
522 
523 union GETATTR3res switch (nfsstat3 status) {
524 case NFS3_OK:
525 	GETATTR3resok	resok;
526 default:
527 	void;
528 };
529 
530 /*
531  * Arguments to setattr (v3).
532  */
533 union sattrguard3 switch (bool check) {
534 case TRUE:
535 	nfstime3	obj_ctime;
536 case FALSE:
537 	void;
538 };
539 
540 struct SETATTR3args {
541 	nfs_fh3		object;
542 	sattr3		new_attributes;
543 	sattrguard3	guard;
544 };
545 
546 struct SETATTR3resok {
547 	wcc_data	obj_wcc;
548 };
549 
550 struct SETATTR3resfail {
551 	wcc_data	obj_wcc;
552 };
553 
554 union SETATTR3res switch (nfsstat3 status) {
555 case NFS3_OK:
556 	SETATTR3resok	resok;
557 default:
558 	SETATTR3resfail	resfail;
559 };
560 
561 /*
562  * Arguments to lookup (v3).
563  */
564 struct LOOKUP3args {
565 	diropargs3	what;
566 };
567 
568 struct LOOKUP3resok {
569 	nfs_fh3		object;
570 	post_op_attr	obj_attributes;
571 	post_op_attr	dir_attributes;
572 };
573 
574 struct LOOKUP3resfail {
575 	post_op_attr	dir_attributes;
576 };
577 
578 union LOOKUP3res switch (nfsstat3 status) {
579 case NFS3_OK:
580 	LOOKUP3resok	resok;
581 default:
582 	LOOKUP3resfail	resfail;
583 };
584 
585 /*
586  * Arguments to access (v3).
587  */
588 const ACCESS3_READ	= 0x0001;
589 const ACCESS3_LOOKUP	= 0x0002;
590 const ACCESS3_MODIFY	= 0x0004;
591 const ACCESS3_EXTEND	= 0x0008;
592 const ACCESS3_DELETE	= 0x0010;
593 const ACCESS3_EXECUTE	= 0x0020;
594 
595 struct ACCESS3args {
596 	nfs_fh3		object;
597 	uint32		access;
598 };
599 
600 struct ACCESS3resok {
601 	post_op_attr	obj_attributes;
602 	uint32		access;
603 };
604 
605 struct ACCESS3resfail {
606 	post_op_attr	obj_attributes;
607 };
608 
609 union ACCESS3res switch (nfsstat3 status) {
610 case NFS3_OK:
611 	ACCESS3resok	resok;
612 default:
613 	ACCESS3resfail	resfail;
614 };
615 
616 /*
617  * Arguments to readlink (v3).
618  */
619 struct READLINK3args {
620 	nfs_fh3		symlink;
621 };
622 
623 struct READLINK3resok {
624 	post_op_attr	symlink_attributes;
625 	nfspath3	data;
626 };
627 
628 struct READLINK3resfail {
629 	post_op_attr	symlink_attributes;
630 };
631 
632 union READLINK3res switch (nfsstat3 status) {
633 case NFS3_OK:
634 	READLINK3resok	resok;
635 default:
636 	READLINK3resfail resfail;
637 };
638 
639 /*
640  * Arguments to read (v3).
641  */
642 struct READ3args {
643 	nfs_fh3		file;
644 	offset3		offset;
645 	count3		count;
646 };
647 
648 struct READ3resok {
649 	post_op_attr	file_attributes;
650 	count3		count;
651 	bool		eof;
652 	opaque		data<>;
653 };
654 
655 struct READ3resfail {
656 	post_op_attr	file_attributes;
657 };
658 
659 /* XXX: solaris 2.6 uses ``nfsstat'' here */
660 union READ3res switch (nfsstat3 status) {
661 case NFS3_OK:
662 	READ3resok	resok;
663 default:
664 	READ3resfail	resfail;
665 };
666 
667 /*
668  * Arguments to write (v3).
669  */
670 enum stable_how {
671 	UNSTABLE	= 0,
672 	DATA_SYNC	= 1,
673 	FILE_SYNC	= 2
674 };
675 
676 struct WRITE3args {
677 	nfs_fh3		file;
678 	offset3		offset;
679 	count3		count;
680 	stable_how	stable;
681 	opaque		data<>;
682 };
683 
684 struct WRITE3resok {
685 	wcc_data	file_wcc;
686 	count3		count;
687 	stable_how	committed;
688 	writeverf3	verf;
689 };
690 
691 struct WRITE3resfail {
692 	wcc_data	file_wcc;
693 };
694 
695 union WRITE3res switch (nfsstat3 status) {
696 case NFS3_OK:
697 	WRITE3resok	resok;
698 default:
699 	WRITE3resfail	resfail;
700 };
701 
702 /*
703  * Arguments to create (v3).
704  */
705 enum createmode3 {
706 	UNCHECKED	= 0,
707 	GUARDED		= 1,
708 	EXCLUSIVE	= 2
709 };
710 
711 union createhow3 switch (createmode3 mode) {
712 case UNCHECKED:
713 case GUARDED:
714 	sattr3		obj_attributes;
715 case EXCLUSIVE:
716 	createverf3	verf;
717 };
718 
719 struct CREATE3args {
720 	diropargs3	where;
721 	createhow3	how;
722 };
723 
724 struct CREATE3resok {
725 	post_op_fh3	obj;
726 	post_op_attr	obj_attributes;
727 	wcc_data	dir_wcc;
728 };
729 
730 struct CREATE3resfail {
731 	wcc_data	dir_wcc;
732 };
733 
734 union CREATE3res switch (nfsstat3 status) {
735 case NFS3_OK:
736 	CREATE3resok	resok;
737 default:
738 	CREATE3resfail	resfail;
739 };
740 
741 /*
742  * Arguments to mkdir (v3).
743  */
744 struct MKDIR3args {
745 	diropargs3	where;
746 	sattr3		attributes;
747 };
748 
749 struct MKDIR3resok {
750 	post_op_fh3	obj;
751 	post_op_attr	obj_attributes;
752 	wcc_data	dir_wcc;
753 };
754 
755 struct MKDIR3resfail {
756 	wcc_data	dir_wcc;
757 };
758 
759 union MKDIR3res switch (nfsstat3 status) {
760 case NFS3_OK:
761 	MKDIR3resok	resok;
762 default:
763 	MKDIR3resfail	resfail;
764 };
765 
766 /*
767  * Arguments to symlink (v3).
768  */
769 struct symlinkdata3 {
770 	sattr3		symlink_attributes;
771 	nfspath3	symlink_data;
772 };
773 
774 struct SYMLINK3args {
775 	diropargs3	where;
776 	symlinkdata3	symlink;
777 };
778 
779 struct SYMLINK3resok {
780 	post_op_fh3	obj;
781 	post_op_attr	obj_attributes;
782 	wcc_data	dir_wcc;
783 };
784 
785 struct SYMLINK3resfail {
786 	wcc_data	dir_wcc;
787 };
788 
789 union SYMLINK3res switch (nfsstat3 status) {
790 case NFS3_OK:
791 	SYMLINK3resok	resok;
792 default:
793 	SYMLINK3resfail	resfail;
794 };
795 
796 /*
797  * Arguments to mknod (v3).
798  */
799 struct devicedata3 {
800 	sattr3		dev_attributes;
801 	specdata3	spec;
802 };
803 
804 union mknoddata3 switch (ftype3 type) {
805 case NF3CHR:
806 case NF3BLK:
807 	devicedata3	device;
808 case NF3SOCK:
809 case NF3FIFO:
810 	sattr3		pipe_attributes;
811 default:
812 	void;
813 };
814 
815 struct MKNOD3args {
816 	diropargs3	where;
817 	mknoddata3	what;
818 };
819 
820 struct MKNOD3resok {
821 	post_op_fh3	obj;
822 	post_op_attr	obj_attributes;
823 	wcc_data	dir_wcc;
824 };
825 
826 struct MKNOD3resfail {
827 	wcc_data	dir_wcc;
828 };
829 
830 union MKNOD3res switch (nfsstat3 status) {
831 case NFS3_OK:
832 	MKNOD3resok	resok;
833 default:
834 	MKNOD3resfail	resfail;
835 };
836 
837 /*
838  * Arguments to remove (v3).
839  */
840 struct REMOVE3args {
841 	diropargs3	object;
842 };
843 
844 struct REMOVE3resok {
845 	wcc_data	dir_wcc;
846 };
847 
848 struct REMOVE3resfail {
849 	wcc_data	dir_wcc;
850 };
851 
852 union REMOVE3res switch (nfsstat3 status) {
853 case NFS3_OK:
854 	REMOVE3resok	resok;
855 default:
856 	REMOVE3resfail	resfail;
857 };
858 
859 /*
860  * Arguments to rmdir (v3).
861  */
862 struct RMDIR3args {
863 	diropargs3	object;
864 };
865 
866 struct RMDIR3resok {
867 	wcc_data	dir_wcc;
868 };
869 
870 struct RMDIR3resfail {
871 	wcc_data	dir_wcc;
872 };
873 
874 union RMDIR3res switch (nfsstat3 status) {
875 case NFS3_OK:
876 	RMDIR3resok	resok;
877 default:
878 	RMDIR3resfail	resfail;
879 };
880 
881 /*
882  * Arguments to rename (v3).
883  */
884 struct RENAME3args {
885 	diropargs3	from;
886 	diropargs3	to;
887 };
888 
889 struct RENAME3resok {
890 	wcc_data	fromdir_wcc;
891 	wcc_data	todir_wcc;
892 };
893 
894 struct RENAME3resfail {
895 	wcc_data	fromdir_wcc;
896 	wcc_data	todir_wcc;
897 };
898 
899 union RENAME3res switch (nfsstat3 status) {
900 case NFS3_OK:
901 	RENAME3resok	resok;
902 default:
903 	RENAME3resfail	resfail;
904 };
905 
906 /*
907  * Arguments to link (v3).
908  */
909 struct LINK3args {
910 	nfs_fh3		file;
911 	diropargs3	link;
912 };
913 
914 struct LINK3resok {
915 	post_op_attr	file_attributes;
916 	wcc_data	linkdir_wcc;
917 };
918 
919 struct LINK3resfail {
920 	post_op_attr	file_attributes;
921 	wcc_data	linkdir_wcc;
922 };
923 
924 union LINK3res switch (nfsstat3 status) {
925 case NFS3_OK:
926 	LINK3resok	resok;
927 default:
928 	LINK3resfail	resfail;
929 };
930 
931 /*
932  * Arguments to readdir (v3).
933  */
934 struct READDIR3args {
935 	nfs_fh3		dir;
936 	cookie3		cookie;
937 	cookieverf3	cookieverf;
938 	count3		count;
939 };
940 
941 struct entry3 {
942 	fileid3		fileid;
943 	filename3	name;
944 	cookie3		cookie;
945 	entry3		*nextentry;
946 };
947 
948 struct dirlist3 {
949 	entry3		*entries;
950 	bool		eof;
951 };
952 
953 struct READDIR3resok {
954 	post_op_attr	dir_attributes;
955 	cookieverf3	cookieverf;
956 	dirlist3	reply;
957 };
958 
959 struct READDIR3resfail {
960 	post_op_attr	dir_attributes;
961 };
962 
963 union READDIR3res switch (nfsstat3 status) {
964 case NFS3_OK:
965 	READDIR3resok	resok;
966 default:
967 	READDIR3resfail	resfail;
968 };
969 
970 /*
971  * Arguments to readdirplus (v3).
972  */
973 struct READDIRPLUS3args {
974 	nfs_fh3		dir;
975 	cookie3		cookie;
976 	cookieverf3	cookieverf;
977 	count3		dircount;
978 	count3		maxcount;
979 };
980 
981 struct entryplus3 {
982 	fileid3		fileid;
983 	filename3	name;
984 	cookie3		cookie;
985 	post_op_attr	name_attributes;
986 	post_op_fh3	name_handle;
987 	entryplus3	*nextentry;
988 };
989 
990 struct dirlistplus3 {
991 	entryplus3	*entries;
992 	bool		eof;
993 };
994 
995 struct READDIRPLUS3resok {
996 	post_op_attr	dir_attributes;
997 	cookieverf3	cookieverf;
998 	dirlistplus3	reply;
999 };
1000 
1001 struct READDIRPLUS3resfail {
1002 	post_op_attr	dir_attributes;
1003 };
1004 
1005 union READDIRPLUS3res switch (nfsstat3 status) {
1006 case NFS3_OK:
1007 	READDIRPLUS3resok	resok;
1008 default:
1009 	READDIRPLUS3resfail	resfail;
1010 };
1011 
1012 /*
1013  * Arguments to fsstat (v3).
1014  */
1015 struct FSSTAT3args {
1016 	nfs_fh3		fsroot;
1017 };
1018 
1019 struct FSSTAT3resok {
1020 	post_op_attr	obj_attributes;
1021 	size3		tbytes;
1022 	size3		fbytes;
1023 	size3		abytes;
1024 	size3		tfiles;
1025 	size3		ffiles;
1026 	size3		afiles;
1027 	uint32		invarsec;
1028 };
1029 
1030 struct FSSTAT3resfail {
1031 	post_op_attr	obj_attributes;
1032 };
1033 
1034 union FSSTAT3res switch (nfsstat3 status) {
1035 case NFS3_OK:
1036 	FSSTAT3resok	resok;
1037 default:
1038 	FSSTAT3resfail	resfail;
1039 };
1040 
1041 /*
1042  * Arguments to fsinfo (v3).
1043  */
1044 const FSF3_LINK		= 0x0001;
1045 const FSF3_SYMLINK	= 0x0002;
1046 const FSF3_HOMOGENEOUS	= 0x0008;
1047 const FSF3_CANSETTIME	= 0x0010;
1048 
1049 struct FSINFO3args {
1050 	nfs_fh3		fsroot;
1051 };
1052 
1053 struct FSINFO3resok {
1054 	post_op_attr	obj_attributes;
1055 	uint32		rtmax;
1056 	uint32		rtpref;
1057 	uint32		rtmult;
1058 	uint32		wtmax;
1059 	uint32		wtpref;
1060 	uint32		wtmult;
1061 	uint32		dtpref;
1062 	size3		maxfilesize;
1063 	nfstime3	time_delta;
1064 	uint32		properties;
1065 };
1066 
1067 struct FSINFO3resfail {
1068 	post_op_attr	obj_attributes;
1069 };
1070 
1071 union FSINFO3res switch (nfsstat3 status) {
1072 case NFS3_OK:
1073 	FSINFO3resok	resok;
1074 default:
1075 	FSINFO3resfail	resfail;
1076 };
1077 
1078 /*
1079  * Arguments to pathconf (v3).
1080  */
1081 struct PATHCONF3args {
1082 	nfs_fh3		object;
1083 };
1084 
1085 struct PATHCONF3resok {
1086 	post_op_attr	obj_attributes;
1087 	uint32		linkmax;
1088 	uint32		name_max;
1089 	bool		no_trunc;
1090 	bool		chown_restricted;
1091 	bool		case_insensitive;
1092 	bool		case_preserving;
1093 };
1094 
1095 struct PATHCONF3resfail {
1096 	post_op_attr	obj_attributes;
1097 };
1098 
1099 union PATHCONF3res switch (nfsstat3 status) {
1100 case NFS3_OK:
1101 	PATHCONF3resok	resok;
1102 default:
1103 	PATHCONF3resfail	resfail;
1104 };
1105 
1106 /*
1107  * Arguments to commit (v3).
1108  */
1109 struct COMMIT3args {
1110 	nfs_fh3		file;
1111 	offset3		offset;
1112 	count3		count;
1113 };
1114 
1115 struct COMMIT3resok {
1116 	wcc_data	file_wcc;
1117 	writeverf3	verf;
1118 };
1119 
1120 struct COMMIT3resfail {
1121 	wcc_data	file_wcc;
1122 };
1123 
1124 union COMMIT3res switch (nfsstat3 status) {
1125 case NFS3_OK:
1126 	COMMIT3resok	resok;
1127 default:
1128 	COMMIT3resfail	resfail;
1129 };
1130 
1131 /*
1132  * Remote file service routines
1133  */
1134 program NFS_PROGRAM {
1135 	version NFS_VERSION {
1136 		void
1137 		NFSPROC_NULL(void) = 0;
1138 
1139 		attrstat
1140 		NFSPROC_GETATTR(nfs_fh) =	1;
1141 
1142 		attrstat
1143 		NFSPROC_SETATTR(sattrargs) = 2;
1144 
1145 		void
1146 		NFSPROC_ROOT(void) = 3;
1147 
1148 		diropres
1149 		NFSPROC_LOOKUP(diropargs) = 4;
1150 
1151 		readlinkres
1152 		NFSPROC_READLINK(nfs_fh) = 5;
1153 
1154 		readres
1155 		NFSPROC_READ(readargs) = 6;
1156 
1157 		void
1158 		NFSPROC_WRITECACHE(void) = 7;
1159 
1160 		attrstat
1161 		NFSPROC_WRITE(writeargs) = 8;
1162 
1163 		diropres
1164 		NFSPROC_CREATE(createargs) = 9;
1165 
1166 		nfsstat
1167 		NFSPROC_REMOVE(diropargs) = 10;
1168 
1169 		nfsstat
1170 		NFSPROC_RENAME(renameargs) = 11;
1171 
1172 		nfsstat
1173 		NFSPROC_LINK(linkargs) = 12;
1174 
1175 		nfsstat
1176 		NFSPROC_SYMLINK(symlinkargs) = 13;
1177 
1178 		diropres
1179 		NFSPROC_MKDIR(createargs) = 14;
1180 
1181 		nfsstat
1182 		NFSPROC_RMDIR(diropargs) = 15;
1183 
1184 		readdirres
1185 		NFSPROC_READDIR(readdirargs) = 16;
1186 
1187 		statfsres
1188 		NFSPROC_STATFS(nfs_fh) = 17;
1189 	} = 2;
1190 	version NFS_V3 {
1191 		void
1192 		NFSPROC3_NULL(void)			= 0;
1193 
1194 		GETATTR3res
1195 		NFSPROC3_GETATTR(GETATTR3args)		= 1;
1196 
1197 		SETATTR3res
1198 		NFSPROC3_SETATTR(SETATTR3args)		= 2;
1199 
1200 		LOOKUP3res
1201 		NFSPROC3_LOOKUP(LOOKUP3args)		= 3;
1202 
1203 		ACCESS3res
1204 		NFSPROC3_ACCESS(ACCESS3args)		= 4;
1205 
1206 		READLINK3res
1207 		NFSPROC3_READLINK(READLINK3args)	= 5;
1208 
1209 		READ3res
1210 		NFSPROC3_READ(READ3args)		= 6;
1211 
1212 		WRITE3res
1213 		NFSPROC3_WRITE(WRITE3args)		= 7;
1214 
1215 		CREATE3res
1216 		NFSPROC3_CREATE(CREATE3args)		= 8;
1217 
1218 		MKDIR3res
1219 		NFSPROC3_MKDIR(MKDIR3args)		= 9;
1220 
1221 		SYMLINK3res
1222 		NFSPROC3_SYMLINK(SYMLINK3args)		= 10;
1223 
1224 		MKNOD3res
1225 		NFSPROC3_MKNOD(MKNOD3args)		= 11;
1226 
1227 		REMOVE3res
1228 		NFSPROC3_REMOVE(REMOVE3args)		= 12;
1229 
1230 		RMDIR3res
1231 		NFSPROC3_RMDIR(RMDIR3args)		= 13;
1232 
1233 		RENAME3res
1234 		NFSPROC3_RENAME(RENAME3args)		= 14;
1235 
1236 		LINK3res
1237 		NFSPROC3_LINK(LINK3args)		= 15;
1238 
1239 		READDIR3res
1240 		NFSPROC3_READDIR(READDIR3args)		= 16;
1241 
1242 		READDIRPLUS3res
1243 		NFSPROC3_READDIRPLUS(READDIRPLUS3args)	= 17;
1244 
1245 		FSSTAT3res
1246 		NFSPROC3_FSSTAT(FSSTAT3args)		= 18;
1247 
1248 		FSINFO3res
1249 		NFSPROC3_FSINFO(FSINFO3args)		= 19;
1250 
1251 		PATHCONF3res
1252 		NFSPROC3_PATHCONF(PATHCONF3args)	= 20;
1253 
1254 		COMMIT3res
1255 		NFSPROC3_COMMIT(COMMIT3args)		= 21;
1256 	} = 3;
1257 } = 100003;
1258 
1259