2004-03-20 Joseph S. Myers <jsm@polyomino.org.uk>
[kopensolaris-gnu/glibc.git] / sunrpc / rpcsvc / nfs_prot.x
1 /* @(#)nfs_prot.x       2.1 88/08/01 4.0 RPCSRC */
2
3 /*
4  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
5  * unrestricted use provided that this legend is included on all tape
6  * media and as a part of the software program in whole or part.  Users
7  * may copy or modify Sun RPC without charge, but are not authorized
8  * to license or distribute it to anyone else except as part of a product or
9  * program developed by the user.
10  *
11  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
12  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
13  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
14  *
15  * Sun RPC is provided with no support and without any obligation on the
16  * part of Sun Microsystems, Inc. to assist in its use, correction,
17  * modification or enhancement.
18  *
19  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
20  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
21  * OR ANY PART THEREOF.
22  *
23  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
24  * or profits or other special, indirect and consequential damages, even if
25  * Sun has been advised of the possibility of such damages.
26  *
27  * Sun Microsystems, Inc.
28  * 2550 Garcia Avenue
29  * Mountain View, California  94043
30  */
31
32 /*
33  * nfs_prot.x 1.2 87/10/12
34  * Copyright 1987 Sun Microsystems, Inc.
35  */
36 const NFS_PORT          = 2049;
37 const NFS_MAXDATA       = 8192;
38 const NFS_MAXPATHLEN    = 1024;
39 const NFS_MAXNAMLEN     = 255;
40 const NFS_FHSIZE        = 32;
41 const NFS_COOKIESIZE    = 4;
42 const NFS_FIFO_DEV      = -1;   /* size kludge for named pipes */
43
44 /*
45  * File types
46  */
47 const NFSMODE_FMT  = 0170000;   /* type of file */
48 const NFSMODE_DIR  = 0040000;   /* directory */
49 const NFSMODE_CHR  = 0020000;   /* character special */
50 const NFSMODE_BLK  = 0060000;   /* block special */
51 const NFSMODE_REG  = 0100000;   /* regular */
52 const NFSMODE_LNK  = 0120000;   /* symbolic link */
53 const NFSMODE_SOCK = 0140000;   /* socket */
54 const NFSMODE_FIFO = 0010000;   /* fifo */
55
56 /*
57  * Error status
58  */
59 enum nfsstat {
60         NFS_OK= 0,              /* no error */
61         NFSERR_PERM=1,          /* Not owner */
62         NFSERR_NOENT=2,         /* No such file or directory */
63         NFSERR_IO=5,            /* I/O error */
64         NFSERR_NXIO=6,          /* No such device or address */
65         NFSERR_ACCES=13,        /* Permission denied */
66         NFSERR_EXIST=17,        /* File exists */
67         NFSERR_NODEV=19,        /* No such device */
68         NFSERR_NOTDIR=20,       /* Not a directory*/
69         NFSERR_ISDIR=21,        /* Is a directory */
70         NFSERR_FBIG=27,         /* File too large */
71         NFSERR_NOSPC=28,        /* No space left on device */
72         NFSERR_ROFS=30,         /* Read-only file system */
73         NFSERR_NAMETOOLONG=63,  /* File name too long */
74         NFSERR_NOTEMPTY=66,     /* Directory not empty */
75         NFSERR_DQUOT=69,        /* Disc quota exceeded */
76         NFSERR_STALE=70,        /* Stale NFS file handle */
77         NFSERR_WFLUSH=99        /* write cache flushed */
78 };
79
80 /*
81  * File types
82  */
83 enum ftype {
84         NFNON = 0,      /* non-file */
85         NFREG = 1,      /* regular file */
86         NFDIR = 2,      /* directory */
87         NFBLK = 3,      /* block special */
88         NFCHR = 4,      /* character special */
89         NFLNK = 5,      /* symbolic link */
90         NFSOCK = 6,     /* unix domain sockets */
91         NFBAD = 7,      /* unused */
92         NFFIFO = 8      /* named pipe */
93 };
94
95 /*
96  * File access handle
97  */
98 struct nfs_fh {
99         opaque data[NFS_FHSIZE];
100 };
101
102 /*
103  * Timeval
104  */
105 struct nfstime {
106         unsigned seconds;
107         unsigned useconds;
108 };
109
110
111 /*
112  * File attributes
113  */
114 struct fattr {
115         ftype type;             /* file type */
116         unsigned mode;          /* protection mode bits */
117         unsigned nlink;         /* # hard links */
118         unsigned uid;           /* owner user id */
119         unsigned gid;           /* owner group id */
120         unsigned size;          /* file size in bytes */
121         unsigned blocksize;     /* preferred block size */
122         unsigned rdev;          /* special device # */
123         unsigned blocks;        /* Kb of disk used by file */
124         unsigned fsid;          /* device # */
125         unsigned fileid;        /* inode # */
126         nfstime atime;          /* time of last access */
127         nfstime mtime;          /* time of last modification */
128         nfstime ctime;          /* time of last change */
129 };
130
131 /*
132  * File attributes which can be set
133  */
134 struct sattr {
135         unsigned mode;  /* protection mode bits */
136         unsigned uid;   /* owner user id */
137         unsigned gid;   /* owner group id */
138         unsigned size;  /* file size in bytes */
139         nfstime atime;  /* time of last access */
140         nfstime mtime;  /* time of last modification */
141 };
142
143
144 typedef string filename<NFS_MAXNAMLEN>;
145 typedef string nfspath<NFS_MAXPATHLEN>;
146
147 /*
148  * Reply status with file attributes
149  */
150 union attrstat switch (nfsstat status) {
151 case NFS_OK:
152         fattr attributes;
153 default:
154         void;
155 };
156
157 struct sattrargs {
158         nfs_fh file;
159         sattr attributes;
160 };
161
162 /*
163  * Arguments for directory operations
164  */
165 struct diropargs {
166         nfs_fh  dir;    /* directory file handle */
167         filename name;          /* name (up to NFS_MAXNAMLEN bytes) */
168 };
169
170 struct diropokres {
171         nfs_fh file;
172         fattr attributes;
173 };
174
175 /*
176  * Results from directory operation
177  */
178 union diropres switch (nfsstat status) {
179 case NFS_OK:
180         diropokres diropres;
181 default:
182         void;
183 };
184
185 union readlinkres switch (nfsstat status) {
186 case NFS_OK:
187         nfspath data;
188 default:
189         void;
190 };
191
192 /*
193  * Arguments to remote read
194  */
195 struct readargs {
196         nfs_fh file;            /* handle for file */
197         unsigned offset;        /* byte offset in file */
198         unsigned count;         /* immediate read count */
199         unsigned totalcount;    /* total read count (from this offset)*/
200 };
201
202 /*
203  * Status OK portion of remote read reply
204  */
205 struct readokres {
206         fattr   attributes;     /* attributes, need for pagin*/
207         opaque data<NFS_MAXDATA>;
208 };
209
210 union readres switch (nfsstat status) {
211 case NFS_OK:
212         readokres reply;
213 default:
214         void;
215 };
216
217 /*
218  * Arguments to remote write
219  */
220 struct writeargs {
221         nfs_fh  file;           /* handle for file */
222         unsigned beginoffset;   /* beginning byte offset in file */
223         unsigned offset;        /* current byte offset in file */
224         unsigned totalcount;    /* total write count (to this offset)*/
225         opaque data<NFS_MAXDATA>;
226 };
227
228 struct createargs {
229         diropargs where;
230         sattr attributes;
231 };
232
233 struct renameargs {
234         diropargs from;
235         diropargs to;
236 };
237
238 struct linkargs {
239         nfs_fh from;
240         diropargs to;
241 };
242
243 struct symlinkargs {
244         diropargs from;
245         nfspath to;
246         sattr attributes;
247 };
248
249
250 typedef opaque nfscookie[NFS_COOKIESIZE];
251
252 /*
253  * Arguments to readdir
254  */
255 struct readdirargs {
256         nfs_fh dir;             /* directory handle */
257         nfscookie cookie;
258         unsigned count;         /* number of directory bytes to read */
259 };
260
261 struct entry {
262         unsigned fileid;
263         filename name;
264         nfscookie cookie;
265         entry *nextentry;
266 };
267
268 struct dirlist {
269         entry *entries;
270         bool eof;
271 };
272
273 union readdirres switch (nfsstat status) {
274 case NFS_OK:
275         dirlist reply;
276 default:
277         void;
278 };
279
280 struct statfsokres {
281         unsigned tsize; /* preferred transfer size in bytes */
282         unsigned bsize; /* fundamental file system block size */
283         unsigned blocks;        /* total blocks in file system */
284         unsigned bfree; /* free blocks in fs */
285         unsigned bavail;        /* free blocks avail to non-superuser */
286 };
287
288 union statfsres switch (nfsstat status) {
289 case NFS_OK:
290         statfsokres reply;
291 default:
292         void;
293 };
294
295 /*
296  * Remote file service routines
297  */
298 program NFS_PROGRAM {
299         version NFS_VERSION {
300                 void
301                 NFSPROC_NULL(void) = 0;
302
303                 attrstat
304                 NFSPROC_GETATTR(nfs_fh) =       1;
305
306                 attrstat
307                 NFSPROC_SETATTR(sattrargs) = 2;
308
309                 void
310                 NFSPROC_ROOT(void) = 3;
311
312                 diropres
313                 NFSPROC_LOOKUP(diropargs) = 4;
314
315                 readlinkres
316                 NFSPROC_READLINK(nfs_fh) = 5;
317
318                 readres
319                 NFSPROC_READ(readargs) = 6;
320
321                 void
322                 NFSPROC_WRITECACHE(void) = 7;
323
324                 attrstat
325                 NFSPROC_WRITE(writeargs) = 8;
326
327                 diropres
328                 NFSPROC_CREATE(createargs) = 9;
329
330                 nfsstat
331                 NFSPROC_REMOVE(diropargs) = 10;
332
333                 nfsstat
334                 NFSPROC_RENAME(renameargs) = 11;
335
336                 nfsstat
337                 NFSPROC_LINK(linkargs) = 12;
338
339                 nfsstat
340                 NFSPROC_SYMLINK(symlinkargs) = 13;
341
342                 diropres
343                 NFSPROC_MKDIR(createargs) = 14;
344
345                 nfsstat
346                 NFSPROC_RMDIR(diropargs) = 15;
347
348                 readdirres
349                 NFSPROC_READDIR(readdirargs) = 16;
350
351                 statfsres
352                 NFSPROC_STATFS(nfs_fh) = 17;
353         } = 2;
354 } = 100003;