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