xref: /openbsd-src/lib/librpcsvc/nfs_prot.x (revision 2c53affbcc0119d6480b86c18f2790523b6a0aad)
1*2c53affbSjmc /*	$OpenBSD: nfs_prot.x,v 1.6 2022/12/27 17:10:07 jmc Exp $	*/
2c7940187Sniklas 
3df930be7Sderaadt /*
4cb7760d1Smillert  * Copyright (c) 2010, Oracle America, Inc.
5df930be7Sderaadt  *
6cb7760d1Smillert  * Redistribution and use in source and binary forms, with or without
7cb7760d1Smillert  * modification, are permitted provided that the following conditions are
8cb7760d1Smillert  * met:
9df930be7Sderaadt  *
10cb7760d1Smillert  *     * Redistributions of source code must retain the above copyright
11cb7760d1Smillert  *       notice, this list of conditions and the following disclaimer.
12cb7760d1Smillert  *     * Redistributions in binary form must reproduce the above
13cb7760d1Smillert  *       copyright notice, this list of conditions and the following
14cb7760d1Smillert  *       disclaimer in the documentation and/or other materials
15cb7760d1Smillert  *       provided with the distribution.
16cb7760d1Smillert  *     * Neither the name of the "Oracle America, Inc." nor the names of its
17cb7760d1Smillert  *       contributors may be used to endorse or promote products derived
18cb7760d1Smillert  *       from this software without specific prior written permission.
19df930be7Sderaadt  *
20cb7760d1Smillert  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21cb7760d1Smillert  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22cb7760d1Smillert  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23cb7760d1Smillert  *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24cb7760d1Smillert  *   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25cb7760d1Smillert  *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26cb7760d1Smillert  *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
27cb7760d1Smillert  *   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28cb7760d1Smillert  *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29cb7760d1Smillert  *   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30cb7760d1Smillert  *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31cb7760d1Smillert  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32df930be7Sderaadt  */
33df930be7Sderaadt 
34df930be7Sderaadt #ifndef RPC_HDR
35df930be7Sderaadt #endif
36df930be7Sderaadt 
37df930be7Sderaadt const NFS_PORT		= 2049;
38df930be7Sderaadt const NFS_MAXDATA	= 8192;
39df930be7Sderaadt const NFS_MAXPATHLEN	= 1024;
40df930be7Sderaadt const NFS_MAXNAMLEN	= 255;
41df930be7Sderaadt const NFS_FHSIZE	= 32;
42df930be7Sderaadt const NFS_COOKIESIZE	= 4;
43df930be7Sderaadt const NFS_FIFO_DEV	= -1;	/* size kludge for named pipes */
44df930be7Sderaadt 
45df930be7Sderaadt /*
46df930be7Sderaadt  * File types
47df930be7Sderaadt  */
48df930be7Sderaadt const NFSMODE_FMT  = 0170000;	/* type of file */
49df930be7Sderaadt const NFSMODE_DIR  = 0040000;	/* directory */
50df930be7Sderaadt const NFSMODE_CHR  = 0020000;	/* character special */
51df930be7Sderaadt const NFSMODE_BLK  = 0060000;	/* block special */
52df930be7Sderaadt const NFSMODE_REG  = 0100000;	/* regular */
53df930be7Sderaadt const NFSMODE_LNK  = 0120000;	/* symbolic link */
54df930be7Sderaadt const NFSMODE_SOCK = 0140000;	/* socket */
55df930be7Sderaadt const NFSMODE_FIFO = 0010000;	/* fifo */
56df930be7Sderaadt 
57df930be7Sderaadt /*
58df930be7Sderaadt  * Error status
59df930be7Sderaadt  */
60df930be7Sderaadt enum nfsstat {
61df930be7Sderaadt 	NFS_OK= 0,		/* no error */
62df930be7Sderaadt 	NFSERR_PERM=1,		/* Not owner */
63df930be7Sderaadt 	NFSERR_NOENT=2,		/* No such file or directory */
64df930be7Sderaadt 	NFSERR_IO=5,		/* I/O error */
65df930be7Sderaadt 	NFSERR_NXIO=6,		/* No such device or address */
66df930be7Sderaadt 	NFSERR_ACCES=13,	/* Permission denied */
67df930be7Sderaadt 	NFSERR_EXIST=17,	/* File exists */
68df930be7Sderaadt 	NFSERR_NODEV=19,	/* No such device */
69df930be7Sderaadt 	NFSERR_NOTDIR=20,	/* Not a directory*/
70df930be7Sderaadt 	NFSERR_ISDIR=21,	/* Is a directory */
71df930be7Sderaadt 	NFSERR_FBIG=27,		/* File too large */
72df930be7Sderaadt 	NFSERR_NOSPC=28,	/* No space left on device */
73df930be7Sderaadt 	NFSERR_ROFS=30,		/* Read-only file system */
74df930be7Sderaadt 	NFSERR_NAMETOOLONG=63,	/* File name too long */
75df930be7Sderaadt 	NFSERR_NOTEMPTY=66,	/* Directory not empty */
76df930be7Sderaadt 	NFSERR_DQUOT=69,	/* Disc quota exceeded */
77df930be7Sderaadt 	NFSERR_STALE=70,	/* Stale NFS file handle */
78df930be7Sderaadt 	NFSERR_WFLUSH=99	/* write cache flushed */
79df930be7Sderaadt };
80df930be7Sderaadt 
81df930be7Sderaadt /*
82df930be7Sderaadt  * File types
83df930be7Sderaadt  */
84df930be7Sderaadt enum ftype {
85df930be7Sderaadt 	NFNON = 0,	/* non-file */
86df930be7Sderaadt 	NFREG = 1,	/* regular file */
87df930be7Sderaadt 	NFDIR = 2,	/* directory */
88df930be7Sderaadt 	NFBLK = 3,	/* block special */
89df930be7Sderaadt 	NFCHR = 4,	/* character special */
90df930be7Sderaadt 	NFLNK = 5,	/* symbolic link */
91df930be7Sderaadt 	NFSOCK = 6,	/* unix domain sockets */
92df930be7Sderaadt 	NFBAD = 7,	/* unused */
93df930be7Sderaadt 	NFFIFO = 8	/* named pipe */
94df930be7Sderaadt };
95df930be7Sderaadt 
96df930be7Sderaadt /*
97df930be7Sderaadt  * File access handle
98df930be7Sderaadt  */
99df930be7Sderaadt struct nfs_fh {
100df930be7Sderaadt 	opaque data[NFS_FHSIZE];
101df930be7Sderaadt };
102df930be7Sderaadt 
103df930be7Sderaadt /*
104df930be7Sderaadt  * Timeval
105df930be7Sderaadt  */
106df930be7Sderaadt struct nfstime {
107df930be7Sderaadt 	unsigned seconds;
108df930be7Sderaadt 	unsigned useconds;
109df930be7Sderaadt };
110df930be7Sderaadt 
111df930be7Sderaadt 
112df930be7Sderaadt /*
113df930be7Sderaadt  * File attributes
114df930be7Sderaadt  */
115df930be7Sderaadt struct fattr {
116df930be7Sderaadt 	ftype type;		/* file type */
117df930be7Sderaadt 	unsigned mode;		/* protection mode bits */
118df930be7Sderaadt 	unsigned nlink;		/* # hard links */
119df930be7Sderaadt 	unsigned uid;		/* owner user id */
120df930be7Sderaadt 	unsigned gid;		/* owner group id */
121df930be7Sderaadt 	unsigned size;		/* file size in bytes */
122*2c53affbSjmc 	unsigned blocksize;	/* preferred block size */
123df930be7Sderaadt 	unsigned rdev;		/* special device # */
124df930be7Sderaadt 	unsigned blocks;	/* Kb of disk used by file */
125df930be7Sderaadt 	unsigned fsid;		/* device # */
126df930be7Sderaadt 	unsigned fileid;	/* inode # */
127df930be7Sderaadt 	nfstime	atime;		/* time of last access */
128df930be7Sderaadt 	nfstime	mtime;		/* time of last modification */
129df930be7Sderaadt 	nfstime	ctime;		/* time of last change */
130df930be7Sderaadt };
131df930be7Sderaadt 
132df930be7Sderaadt /*
133df930be7Sderaadt  * File attributes which can be set
134df930be7Sderaadt  */
135df930be7Sderaadt struct sattr {
136df930be7Sderaadt 	unsigned mode;	/* protection mode bits */
137df930be7Sderaadt 	unsigned uid;	/* owner user id */
138df930be7Sderaadt 	unsigned gid;	/* owner group id */
139df930be7Sderaadt 	unsigned size;	/* file size in bytes */
140df930be7Sderaadt 	nfstime	atime;	/* time of last access */
141df930be7Sderaadt 	nfstime	mtime;	/* time of last modification */
142df930be7Sderaadt };
143df930be7Sderaadt 
144df930be7Sderaadt 
145df930be7Sderaadt typedef string filename<NFS_MAXNAMLEN>;
146df930be7Sderaadt typedef string nfspath<NFS_MAXPATHLEN>;
147df930be7Sderaadt 
148df930be7Sderaadt /*
149df930be7Sderaadt  * Reply status with file attributes
150df930be7Sderaadt  */
151df930be7Sderaadt union attrstat switch (nfsstat status) {
152df930be7Sderaadt case NFS_OK:
153df930be7Sderaadt 	fattr attributes;
154df930be7Sderaadt default:
155df930be7Sderaadt 	void;
156df930be7Sderaadt };
157df930be7Sderaadt 
158df930be7Sderaadt struct sattrargs {
159df930be7Sderaadt 	nfs_fh file;
160df930be7Sderaadt 	sattr attributes;
161df930be7Sderaadt };
162df930be7Sderaadt 
163df930be7Sderaadt /*
164df930be7Sderaadt  * Arguments for directory operations
165df930be7Sderaadt  */
166df930be7Sderaadt struct diropargs {
167df930be7Sderaadt 	nfs_fh	dir;	/* directory file handle */
168df930be7Sderaadt 	filename name;		/* name (up to NFS_MAXNAMLEN bytes) */
169df930be7Sderaadt };
170df930be7Sderaadt 
171df930be7Sderaadt struct diropokres {
172df930be7Sderaadt 	nfs_fh file;
173df930be7Sderaadt 	fattr attributes;
174df930be7Sderaadt };
175df930be7Sderaadt 
176df930be7Sderaadt /*
177df930be7Sderaadt  * Results from directory operation
178df930be7Sderaadt  */
179df930be7Sderaadt union diropres switch (nfsstat status) {
180df930be7Sderaadt case NFS_OK:
181df930be7Sderaadt 	diropokres diropres;
182df930be7Sderaadt default:
183df930be7Sderaadt 	void;
184df930be7Sderaadt };
185df930be7Sderaadt 
186df930be7Sderaadt union readlinkres switch (nfsstat status) {
187df930be7Sderaadt case NFS_OK:
188df930be7Sderaadt 	nfspath data;
189df930be7Sderaadt default:
190df930be7Sderaadt 	void;
191df930be7Sderaadt };
192df930be7Sderaadt 
193df930be7Sderaadt /*
194df930be7Sderaadt  * Arguments to remote read
195df930be7Sderaadt  */
196df930be7Sderaadt struct readargs {
197df930be7Sderaadt 	nfs_fh file;		/* handle for file */
198df930be7Sderaadt 	unsigned offset;	/* byte offset in file */
199df930be7Sderaadt 	unsigned count;		/* immediate read count */
200df930be7Sderaadt 	unsigned totalcount;	/* total read count (from this offset)*/
201df930be7Sderaadt };
202df930be7Sderaadt 
203df930be7Sderaadt /*
204df930be7Sderaadt  * Status OK portion of remote read reply
205df930be7Sderaadt  */
206df930be7Sderaadt struct readokres {
207df930be7Sderaadt 	fattr	attributes;	/* attributes, need for pagin*/
208df930be7Sderaadt 	opaque data<NFS_MAXDATA>;
209df930be7Sderaadt };
210df930be7Sderaadt 
211df930be7Sderaadt union readres switch (nfsstat status) {
212df930be7Sderaadt case NFS_OK:
213df930be7Sderaadt 	readokres reply;
214df930be7Sderaadt default:
215df930be7Sderaadt 	void;
216df930be7Sderaadt };
217df930be7Sderaadt 
218df930be7Sderaadt /*
219df930be7Sderaadt  * Arguments to remote write
220df930be7Sderaadt  */
221df930be7Sderaadt struct writeargs {
222df930be7Sderaadt 	nfs_fh	file;		/* handle for file */
223df930be7Sderaadt 	unsigned beginoffset;	/* beginning byte offset in file */
224df930be7Sderaadt 	unsigned offset;	/* current byte offset in file */
225df930be7Sderaadt 	unsigned totalcount;	/* total write count (to this offset)*/
226df930be7Sderaadt 	opaque data<NFS_MAXDATA>;
227df930be7Sderaadt };
228df930be7Sderaadt 
229df930be7Sderaadt struct createargs {
230df930be7Sderaadt 	diropargs where;
231df930be7Sderaadt 	sattr attributes;
232df930be7Sderaadt };
233df930be7Sderaadt 
234df930be7Sderaadt struct renameargs {
235df930be7Sderaadt 	diropargs from;
236df930be7Sderaadt 	diropargs to;
237df930be7Sderaadt };
238df930be7Sderaadt 
239df930be7Sderaadt struct linkargs {
240df930be7Sderaadt 	nfs_fh from;
241df930be7Sderaadt 	diropargs to;
242df930be7Sderaadt };
243df930be7Sderaadt 
244df930be7Sderaadt struct symlinkargs {
245df930be7Sderaadt 	diropargs from;
246df930be7Sderaadt 	nfspath to;
247df930be7Sderaadt 	sattr attributes;
248df930be7Sderaadt };
249df930be7Sderaadt 
250df930be7Sderaadt 
251df930be7Sderaadt typedef opaque nfscookie[NFS_COOKIESIZE];
252df930be7Sderaadt 
253df930be7Sderaadt /*
254df930be7Sderaadt  * Arguments to readdir
255df930be7Sderaadt  */
256df930be7Sderaadt struct readdirargs {
257df930be7Sderaadt 	nfs_fh dir;		/* directory handle */
258df930be7Sderaadt 	nfscookie cookie;
259df930be7Sderaadt 	unsigned count;		/* number of directory bytes to read */
260df930be7Sderaadt };
261df930be7Sderaadt 
262df930be7Sderaadt struct entry {
263df930be7Sderaadt 	unsigned fileid;
264df930be7Sderaadt 	filename name;
265df930be7Sderaadt 	nfscookie cookie;
266df930be7Sderaadt 	entry *nextentry;
267df930be7Sderaadt };
268df930be7Sderaadt 
269df930be7Sderaadt struct dirlist {
270df930be7Sderaadt 	entry *entries;
271df930be7Sderaadt 	bool eof;
272df930be7Sderaadt };
273df930be7Sderaadt 
274df930be7Sderaadt union readdirres switch (nfsstat status) {
275df930be7Sderaadt case NFS_OK:
276df930be7Sderaadt 	dirlist reply;
277df930be7Sderaadt default:
278df930be7Sderaadt 	void;
279df930be7Sderaadt };
280df930be7Sderaadt 
281df930be7Sderaadt struct statfsokres {
282df930be7Sderaadt 	unsigned tsize;	/* preferred transfer size in bytes */
283df930be7Sderaadt 	unsigned bsize;	/* fundamental file system block size */
284df930be7Sderaadt 	unsigned blocks;	/* total blocks in file system */
285df930be7Sderaadt 	unsigned bfree;	/* free blocks in fs */
286df930be7Sderaadt 	unsigned bavail;	/* free blocks avail to non-superuser */
287df930be7Sderaadt };
288df930be7Sderaadt 
289df930be7Sderaadt union statfsres switch (nfsstat status) {
290df930be7Sderaadt case NFS_OK:
291df930be7Sderaadt 	statfsokres reply;
292df930be7Sderaadt default:
293df930be7Sderaadt 	void;
294df930be7Sderaadt };
295df930be7Sderaadt 
296df930be7Sderaadt /*
297df930be7Sderaadt  * Remote file service routines
298df930be7Sderaadt  */
299df930be7Sderaadt program NFS_PROGRAM {
300df930be7Sderaadt 	version NFS_VERSION {
301df930be7Sderaadt 		void
302df930be7Sderaadt 		NFSPROC_NULL(void) = 0;
303df930be7Sderaadt 
304df930be7Sderaadt 		attrstat
305df930be7Sderaadt 		NFSPROC_GETATTR(nfs_fh) =	1;
306df930be7Sderaadt 
307df930be7Sderaadt 		attrstat
308df930be7Sderaadt 		NFSPROC_SETATTR(sattrargs) = 2;
309df930be7Sderaadt 
310df930be7Sderaadt 		void
311df930be7Sderaadt 		NFSPROC_ROOT(void) = 3;
312df930be7Sderaadt 
313df930be7Sderaadt 		diropres
314df930be7Sderaadt 		NFSPROC_LOOKUP(diropargs) = 4;
315df930be7Sderaadt 
316df930be7Sderaadt 		readlinkres
317df930be7Sderaadt 		NFSPROC_READLINK(nfs_fh) = 5;
318df930be7Sderaadt 
319df930be7Sderaadt 		readres
320df930be7Sderaadt 		NFSPROC_READ(readargs) = 6;
321df930be7Sderaadt 
322df930be7Sderaadt 		void
323df930be7Sderaadt 		NFSPROC_WRITECACHE(void) = 7;
324df930be7Sderaadt 
325df930be7Sderaadt 		attrstat
326df930be7Sderaadt 		NFSPROC_WRITE(writeargs) = 8;
327df930be7Sderaadt 
328df930be7Sderaadt 		diropres
329df930be7Sderaadt 		NFSPROC_CREATE(createargs) = 9;
330df930be7Sderaadt 
331df930be7Sderaadt 		nfsstat
332df930be7Sderaadt 		NFSPROC_REMOVE(diropargs) = 10;
333df930be7Sderaadt 
334df930be7Sderaadt 		nfsstat
335df930be7Sderaadt 		NFSPROC_RENAME(renameargs) = 11;
336df930be7Sderaadt 
337df930be7Sderaadt 		nfsstat
338df930be7Sderaadt 		NFSPROC_LINK(linkargs) = 12;
339df930be7Sderaadt 
340df930be7Sderaadt 		nfsstat
341df930be7Sderaadt 		NFSPROC_SYMLINK(symlinkargs) = 13;
342df930be7Sderaadt 
343df930be7Sderaadt 		diropres
344df930be7Sderaadt 		NFSPROC_MKDIR(createargs) = 14;
345df930be7Sderaadt 
346df930be7Sderaadt 		nfsstat
347df930be7Sderaadt 		NFSPROC_RMDIR(diropargs) = 15;
348df930be7Sderaadt 
349df930be7Sderaadt 		readdirres
350df930be7Sderaadt 		NFSPROC_READDIR(readdirargs) = 16;
351df930be7Sderaadt 
352df930be7Sderaadt 		statfsres
353df930be7Sderaadt 		NFSPROC_STATFS(nfs_fh) = 17;
354df930be7Sderaadt 	} = 2;
355df930be7Sderaadt } = 100003;
356df930be7Sderaadt 
357