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