xref: /freebsd/include/rpcsvc/nfs_prot.x (revision df7f5d4de4592a8948a25ce01e5bddfbb7ce39dc)
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 %static char rcsid[] = "$Id$";
35 %#endif /* not lint */
36 #endif
37 
38 const NFS_PORT          = 2049;
39 const NFS_MAXDATA       = 8192;
40 const NFS_MAXPATHLEN    = 1024;
41 const NFS_MAXNAMLEN	= 255;
42 const NFS_FHSIZE	= 32;
43 const NFS_COOKIESIZE	= 4;
44 const NFS_FIFO_DEV	= -1;	/* size kludge for named pipes */
45 
46 /*
47  * File types
48  */
49 const NFSMODE_FMT  = 0170000;	/* type of file */
50 const NFSMODE_DIR  = 0040000;	/* directory */
51 const NFSMODE_CHR  = 0020000;	/* character special */
52 const NFSMODE_BLK  = 0060000;	/* block special */
53 const NFSMODE_REG  = 0100000;	/* regular */
54 const NFSMODE_LNK  = 0120000;	/* symbolic link */
55 const NFSMODE_SOCK = 0140000;	/* socket */
56 const NFSMODE_FIFO = 0010000;	/* fifo */
57 
58 /*
59  * Error status
60  */
61 enum nfsstat {
62 	NFS_OK= 0,		/* no error */
63 	NFSERR_PERM=1,		/* Not owner */
64 	NFSERR_NOENT=2,		/* No such file or directory */
65 	NFSERR_IO=5,		/* I/O error */
66 	NFSERR_NXIO=6,		/* No such device or address */
67 	NFSERR_ACCES=13,	/* Permission denied */
68 	NFSERR_EXIST=17,	/* File exists */
69 	NFSERR_NODEV=19,	/* No such device */
70 	NFSERR_NOTDIR=20,	/* Not a directory*/
71 	NFSERR_ISDIR=21,	/* Is a directory */
72 	NFSERR_FBIG=27,		/* File too large */
73 	NFSERR_NOSPC=28,	/* No space left on device */
74 	NFSERR_ROFS=30,		/* Read-only file system */
75 	NFSERR_NAMETOOLONG=63,	/* File name too long */
76 	NFSERR_NOTEMPTY=66,	/* Directory not empty */
77 	NFSERR_DQUOT=69,	/* Disc quota exceeded */
78 	NFSERR_STALE=70,	/* Stale NFS file handle */
79 	NFSERR_WFLUSH=99	/* write cache flushed */
80 };
81 
82 /*
83  * File types
84  */
85 enum ftype {
86 	NFNON = 0,	/* non-file */
87 	NFREG = 1,	/* regular file */
88 	NFDIR = 2,	/* directory */
89 	NFBLK = 3,	/* block special */
90 	NFCHR = 4,	/* character special */
91 	NFLNK = 5,	/* symbolic link */
92 	NFSOCK = 6,	/* unix domain sockets */
93 	NFBAD = 7,	/* unused */
94 	NFFIFO = 8 	/* named pipe */
95 };
96 
97 /*
98  * File access handle
99  */
100 struct nfs_fh {
101 	opaque data[NFS_FHSIZE];
102 };
103 
104 /*
105  * Timeval
106  */
107 struct nfstime {
108 	unsigned seconds;
109 	unsigned useconds;
110 };
111 
112 
113 /*
114  * File attributes
115  */
116 struct fattr {
117 	ftype type;		/* file type */
118 	unsigned mode;		/* protection mode bits */
119 	unsigned nlink;		/* # hard links */
120 	unsigned uid;		/* owner user id */
121 	unsigned gid;		/* owner group id */
122 	unsigned size;		/* file size in bytes */
123 	unsigned blocksize;	/* prefered block size */
124 	unsigned rdev;		/* special device # */
125 	unsigned blocks;	/* Kb of disk used by file */
126 	unsigned fsid;		/* device # */
127 	unsigned fileid;	/* inode # */
128 	nfstime	atime;		/* time of last access */
129 	nfstime	mtime;		/* time of last modification */
130 	nfstime	ctime;		/* time of last change */
131 };
132 
133 /*
134  * File attributes which can be set
135  */
136 struct sattr {
137 	unsigned mode;	/* protection mode bits */
138 	unsigned uid;	/* owner user id */
139 	unsigned gid;	/* owner group id */
140 	unsigned size;	/* file size in bytes */
141 	nfstime	atime;	/* time of last access */
142 	nfstime	mtime;	/* time of last modification */
143 };
144 
145 
146 typedef string filename<NFS_MAXNAMLEN>;
147 typedef string nfspath<NFS_MAXPATHLEN>;
148 
149 /*
150  * Reply status with file attributes
151  */
152 union attrstat switch (nfsstat status) {
153 case NFS_OK:
154 	fattr attributes;
155 default:
156 	void;
157 };
158 
159 struct sattrargs {
160 	nfs_fh file;
161 	sattr attributes;
162 };
163 
164 /*
165  * Arguments for directory operations
166  */
167 struct diropargs {
168 	nfs_fh	dir;	/* directory file handle */
169 	filename name;		/* name (up to NFS_MAXNAMLEN bytes) */
170 };
171 
172 struct diropokres {
173 	nfs_fh file;
174 	fattr attributes;
175 };
176 
177 /*
178  * Results from directory operation
179  */
180 union diropres switch (nfsstat status) {
181 case NFS_OK:
182 	diropokres diropres;
183 default:
184 	void;
185 };
186 
187 union readlinkres switch (nfsstat status) {
188 case NFS_OK:
189 	nfspath data;
190 default:
191 	void;
192 };
193 
194 /*
195  * Arguments to remote read
196  */
197 struct readargs {
198 	nfs_fh file;		/* handle for file */
199 	unsigned offset;	/* byte offset in file */
200 	unsigned count;		/* immediate read count */
201 	unsigned totalcount;	/* total read count (from this offset)*/
202 };
203 
204 /*
205  * Status OK portion of remote read reply
206  */
207 struct readokres {
208 	fattr	attributes;	/* attributes, need for pagin*/
209 	opaque data<NFS_MAXDATA>;
210 };
211 
212 union readres switch (nfsstat status) {
213 case NFS_OK:
214 	readokres reply;
215 default:
216 	void;
217 };
218 
219 /*
220  * Arguments to remote write
221  */
222 struct writeargs {
223 	nfs_fh	file;		/* handle for file */
224 	unsigned beginoffset;	/* beginning byte offset in file */
225 	unsigned offset;	/* current byte offset in file */
226 	unsigned totalcount;	/* total write count (to this offset)*/
227 	opaque data<NFS_MAXDATA>;
228 };
229 
230 struct createargs {
231 	diropargs where;
232 	sattr attributes;
233 };
234 
235 struct renameargs {
236 	diropargs from;
237 	diropargs to;
238 };
239 
240 struct linkargs {
241 	nfs_fh from;
242 	diropargs to;
243 };
244 
245 struct symlinkargs {
246 	diropargs from;
247 	nfspath to;
248 	sattr attributes;
249 };
250 
251 
252 typedef opaque nfscookie[NFS_COOKIESIZE];
253 
254 /*
255  * Arguments to readdir
256  */
257 struct readdirargs {
258 	nfs_fh dir;		/* directory handle */
259 	nfscookie cookie;
260 	unsigned count;		/* number of directory bytes to read */
261 };
262 
263 struct entry {
264 	unsigned fileid;
265 	filename name;
266 	nfscookie cookie;
267 	entry *nextentry;
268 };
269 
270 struct dirlist {
271 	entry *entries;
272 	bool eof;
273 };
274 
275 union readdirres switch (nfsstat status) {
276 case NFS_OK:
277 	dirlist reply;
278 default:
279 	void;
280 };
281 
282 struct statfsokres {
283 	unsigned tsize;	/* preferred transfer size in bytes */
284 	unsigned bsize;	/* fundamental file system block size */
285 	unsigned blocks;	/* total blocks in file system */
286 	unsigned bfree;	/* free blocks in fs */
287 	unsigned bavail;	/* free blocks avail to non-superuser */
288 };
289 
290 union statfsres switch (nfsstat status) {
291 case NFS_OK:
292 	statfsokres reply;
293 default:
294 	void;
295 };
296 
297 /*
298  * Remote file service routines
299  */
300 program NFS_PROGRAM {
301 	version NFS_VERSION {
302 		void
303 		NFSPROC_NULL(void) = 0;
304 
305 		attrstat
306 		NFSPROC_GETATTR(nfs_fh) =	1;
307 
308 		attrstat
309 		NFSPROC_SETATTR(sattrargs) = 2;
310 
311 		void
312 		NFSPROC_ROOT(void) = 3;
313 
314 		diropres
315 		NFSPROC_LOOKUP(diropargs) = 4;
316 
317 		readlinkres
318 		NFSPROC_READLINK(nfs_fh) = 5;
319 
320 		readres
321 		NFSPROC_READ(readargs) = 6;
322 
323 		void
324 		NFSPROC_WRITECACHE(void) = 7;
325 
326 		attrstat
327 		NFSPROC_WRITE(writeargs) = 8;
328 
329 		diropres
330 		NFSPROC_CREATE(createargs) = 9;
331 
332 		nfsstat
333 		NFSPROC_REMOVE(diropargs) = 10;
334 
335 		nfsstat
336 		NFSPROC_RENAME(renameargs) = 11;
337 
338 		nfsstat
339 		NFSPROC_LINK(linkargs) = 12;
340 
341 		nfsstat
342 		NFSPROC_SYMLINK(symlinkargs) = 13;
343 
344 		diropres
345 		NFSPROC_MKDIR(createargs) = 14;
346 
347 		nfsstat
348 		NFSPROC_RMDIR(diropargs) = 15;
349 
350 		readdirres
351 		NFSPROC_READDIR(readdirargs) = 16;
352 
353 		statfsres
354 		NFSPROC_STATFS(nfs_fh) = 17;
355 	} = 2;
356 } = 100003;
357 
358