xref: /netbsd-src/external/bsd/am-utils/dist/conf/nfs_prot/nfs_prot_nextstep.h (revision 8bae5d409deb915cf7c8f0539fae22ff2cb8a313)
1 /*	$NetBSD: nfs_prot_nextstep.h,v 1.1.1.3 2015/01/17 16:34:16 christos Exp $	*/
2 
3 /*
4  * Copyright (c) 1997-2014 Erez Zadok
5  * Copyright (c) 1990 Jan-Simon Pendry
6  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
7  * Copyright (c) 1990 The Regents of the University of California.
8  * All rights reserved.
9  *
10  * This code is derived from software contributed to Berkeley by
11  * Jan-Simon Pendry at Imperial College, London.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  *    notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  * 3. Neither the name of the University nor the names of its contributors
22  *    may be used to endorse or promote products derived from this software
23  *    without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35  * SUCH DAMAGE.
36  *
37  *
38  * File: am-utils/conf/nfs_prot/nfs_prot_nextstep.h
39  *
40  */
41 
42 #ifndef _AMU_NFS_PROT_H
43 #define _AMU_NFS_PROT_H
44 
45 #ifdef HAVE_RPCSVC_NFS_PROT_H
46 # include <rpcsvc/nfs_prot.h>
47 #endif /* HAVE_RPCSVC_NFS_PROT_H */
48 #ifdef HAVE_BSD_RPC_RPC_H
49 # include <bsd/rpc/rpc.h>
50 #endif /* HAVE_BSD_RPC_RPC_H */
51 #ifdef HAVE_SYS_STAT_H
52 # include <sys/stat.h>
53 #endif /* HAVE_SYS_STAT_H */
54 
55 /*
56  * odd problems happen during configuration and nextstep's /bin/cc
57  * gets strange errors from /bin/sh.  I suspect it may be a conflict
58  * over some memory, a bad /bin/cc, or even kernel bug.
59  * this is what I get, as a result of running cc inside configure:
60  *  /bin/cc -o conftest -g -O2 -D_POSIX_SOURCE conftest.c -lrpcsvc
61  *  configure:2294: illegal external declaration, found `#'
62  *  configure:2388: illegal file name 'AMU_NFS_PROTOCOL_HEADER'
63  *  configure:2416: illegal external declaration, found `{'
64  * I have no explanation for it... -Erez
65  * Solution: don't use /bin/cc, but gcc 2.7.2.1 or better!
66  */
67 
68 #if 0
69 /* cannot include this file b/c it refers to non-existing headers */
70 # include <bsd/nfs/nfs_mount.h>
71 #endif /* 0 */
72 
73 
74 /*
75  * MACROS:
76  */
77 
78 /* ugly: fix up nextstep's nfs mount type */
79 #ifdef MOUNT_TYPE_NFS___off_no_longer_needed
80 # undef MOUNT_TYPE_UFS
81 # define MOUNT_TYPE_UFS		MOUNT_UFS
82 # undef MOUNT_TYPE_NFS
83 # define MOUNT_TYPE_NFS		MOUNT_NFS
84 # undef MOUNT_TYPE_PCFS
85 # define MOUNT_TYPE_PCFS	MOUNT_PC
86 # undef MOUNT_TYPE_LOFS
87 # define MOUNT_TYPE_LOFS	MOUNT_LO
88 # undef MOUNT_TYPE_SPECFS
89 # define MOUNT_TYPE_SPECFS	MOUNT_SPECFS
90 # undef MOUNT_TYPE_CFS
91 # define MOUNT_TYPE_CFS		MOUNT_CFS
92 #endif /* MOUNT_TYPE_NFS */
93 
94 #define	dr_drok_u	diropres
95 #define ca_attributes	attributes
96 #define ca_where	where
97 #define da_fhandle	dir
98 #define da_name		name
99 #define dl_entries	entries
100 #define dl_eof		eof
101 #define dr_status	status
102 #define dr_u		diropres_u
103 #define drok_attributes	attributes
104 #define drok_fhandle	file
105 #define fh_data		data
106 #define la_fhandle	from
107 #define la_to		to
108 #define na_atime	atime
109 #define na_blocks	blocks
110 #define na_blocksize	blocksize
111 #define na_ctime	ctime
112 #define na_fileid	fileid
113 #define na_fsid		fsid
114 #define na_gid		gid
115 #define na_mode		mode
116 #define na_mtime	mtime
117 #define na_nlink	nlink
118 #define na_rdev		rdev
119 #define na_size		size
120 #define na_type		type
121 #define na_uid		uid
122 #define ne_cookie	cookie
123 #define ne_fileid	fileid
124 #define ne_name		name
125 #define ne_nextentry	nextentry
126 #define ns_attr_u	attributes
127 #define ns_status	status
128 #define ns_u		attrstat_u
129 #define nt_seconds	seconds
130 #define nt_useconds	useconds
131 #define ra_count	count
132 #define ra_fhandle	file
133 #define ra_offset	offset
134 #define ra_totalcount	totalcount
135 #define raok_attributes	attributes
136 #define raok_len_u	data_len
137 #define raok_u		data
138 #define raok_val_u	data_val
139 #define rda_cookie	cookie
140 #define rda_count	count
141 #define rda_fhandle	dir
142 #define rdr_reply_u	reply
143 #define rdr_status	status
144 #define rdr_u		readdirres_u
145 #define rlr_data_u	data
146 #define rlr_status	status
147 #define rlr_u		readlinkres_u
148 #define rna_from	from
149 #define rna_to		to
150 #define rr_reply_u	reply
151 #define rr_status	status
152 #define rr_u		readres_u
153 #define sa_atime	atime
154 #define sa_gid		gid
155 #define sa_mode		mode
156 #define sa_mtime	mtime
157 #define sa_size		size
158 #define sa_uid		uid
159 #define sag_attributes	attributes
160 #define sag_fhandle	file
161 #define sfr_reply_u	reply
162 #define sfr_status	status
163 #define sfr_u		statfsres_u
164 #define sfrok_bavail	bavail
165 #define sfrok_bfree	bfree
166 #define sfrok_blocks	blocks
167 #define sfrok_bsize	bsize
168 #define sfrok_tsize	tsize
169 #define sla_attributes	attributes
170 #define sla_from	from
171 #define sla_to		to
172 #define wra_beginoffset	beginoffset
173 #define wra_fhandle	file
174 #define wra_len_u	data_len
175 #define wra_offset	offset
176 #define wra_totalcount	totalcount
177 #define wra_u		data
178 #define wra_val_u	data_val
179 
180 /* map field names */
181 #define ex_dir ex_name
182 #define gr_name g_name
183 #define gr_next g_next
184 #define ml_directory ml_path
185 #define ml_hostname ml_name
186 #define ml_next ml_nxt
187 
188 /*
189  * NFS mount option flags
190  */
191 #define	NFSMNT_SOFT	0x001	/* soft mount (hard is default) */
192 #define	NFSMNT_WSIZE	0x002	/* set write size */
193 #define	NFSMNT_RSIZE	0x004	/* set read size */
194 #define	NFSMNT_TIMEO	0x008	/* set initial timeout */
195 #define	NFSMNT_RETRANS	0x010	/* set number of request retries */
196 #define	NFSMNT_HOSTNAME	0x020	/* set hostname for error printf */
197 #define	NFSMNT_INT	0x040	/* allow interrupts on hard mount */
198 #define	NFSMNT_NOAC	0x080	/* don't cache attributes */
199 #define	NFSMNT_ACREGMIN	0x0100	/* set min secs for file attr cache */
200 #define	NFSMNT_ACREGMAX	0x0200	/* set max secs for file attr cache */
201 #define	NFSMNT_ACDIRMIN	0x0400	/* set min secs for dir attr cache */
202 #define	NFSMNT_ACDIRMAX	0x0800	/* set max secs for dir attr cache */
203 #define NFSMNT_SECURE	0x1000	/* secure mount */
204 #define NFSMNT_NOCTO	0x2000	/* no close-to-open consistency */
205 
206 #define NFS_PORT	2049
207 #ifndef NFS_MAXDATA
208 # define NFS_MAXDATA	8192
209 #endif /* NFS_MAXDATA */
210 #define NFS_MAXPATHLEN	1024
211 #define NFS_MAXNAMLEN	255
212 #define NFS_FHSIZE	32
213 #define NFS_COOKIESIZE	4
214 #define	MNTPATHLEN	1024
215 #define	MNTNAMLEN	255
216 
217 #define NFSMODE_FMT	0170000
218 #define NFSMODE_DIR	0040000
219 #define NFSMODE_CHR	0020000
220 #define NFSMODE_BLK	0060000
221 #define NFSMODE_REG	0100000
222 #define NFSMODE_LNK	0120000
223 #define NFSMODE_SOCK	0140000
224 #define NFSMODE_FIFO	0010000
225 
226 #ifndef NFS_PROGRAM
227 # define NFS_PROGRAM	((u_long)100003)
228 #endif /* not NFS_PROGRAM */
229 #ifndef NFS_VERSION
230 # define NFS_VERSION	((u_long)2)
231 #endif /* not NFS_VERSION */
232 
233 #define NFSPROC_NULL		((u_long)0)
234 #define NFSPROC_GETATTR		((u_long)1)
235 #define NFSPROC_SETATTR		((u_long)2)
236 #define NFSPROC_ROOT		((u_long)3)
237 #define NFSPROC_LOOKUP		((u_long)4)
238 #define NFSPROC_READLINK	((u_long)5)
239 #define NFSPROC_READ		((u_long)6)
240 #define NFSPROC_WRITECACHE	((u_long)7)
241 #define NFSPROC_WRITE		((u_long)8)
242 #define NFSPROC_CREATE		((u_long)9)
243 #define NFSPROC_REMOVE		((u_long)10)
244 #define NFSPROC_RENAME		((u_long)11)
245 #define NFSPROC_LINK		((u_long)12)
246 #define NFSPROC_SYMLINK		((u_long)13)
247 #define NFSPROC_MKDIR		((u_long)14)
248 #define NFSPROC_RMDIR		((u_long)15)
249 #define NFSPROC_READDIR		((u_long)16)
250 #define NFSPROC_STATFS		((u_long)17)
251 
252 /*
253  * fix up or complete other some definitions...
254  */
255 #define WNOHANG         01
256 #define WUNTRACED       02
257 #define WIFSTOPPED(status)      ((status) & 0100)
258 #define WSTOPSIG(status)        (int)(WIFSTOPPED(status) ? \
259 				      (((status) >> 8) & 0177) : -1)
260 #define WIFSIGNALED(status)     ( !WIFEXITED(status) && \
261 				  !WIFSTOPPED(status) )
262 #define WTERMSIG(status)        (int)(WIFSIGNALED(status) ? \
263                                       ((status) & 0177) : -1)
264 /* define missing macros */
265 #ifndef S_ISDIR
266 # ifdef S_IFMT
267 #  define S_ISDIR(mode)   (((mode) & (S_IFMT)) == (S_IFDIR))
268 # else /* not S_IFMT */
269 #  define S_ISDIR(mode)   (((mode) & (_S_IFMT)) == (_S_IFDIR))
270 # endif /* not S_IFMT */
271 #endif /* not S_ISDIR */
272 
273 /*
274  * ENUMS:
275  */
276 
277 enum nfstype {
278   NFNON = 0,
279   NFREG = 1,
280   NFDIR = 2,
281   NFBLK = 3,
282   NFCHR = 4,
283   NFLNK = 5,
284   NFSOCK = 6,
285   NFBAD = 7,
286   NFFIFO = 8,
287 };
288 
289 enum nfsstat {
290   NFS_OK = 0,                     /* no error */
291   NFSERR_PERM=EPERM,              /* Not owner */
292   NFSERR_NOENT=ENOENT,            /* No such file or directory */
293   NFSERR_IO=EIO,                  /* I/O error */
294   NFSERR_NXIO=ENXIO,              /* No such device or address */
295   NFSERR_ACCES=EACCES,            /* Permission denied */
296   NFSERR_EXIST=EEXIST,            /* File exists */
297   NFSERR_NODEV=ENODEV,            /* No such device */
298   NFSERR_NOTDIR=ENOTDIR,          /* Not a directory */
299   NFSERR_ISDIR=EISDIR,            /* Is a directory */
300   NFSERR_FBIG=EFBIG,              /* File too large */
301   NFSERR_NOSPC=ENOSPC,            /* No space left on device */
302   NFSERR_ROFS=EROFS,              /* Read-only file system */
303   NFSERR_NAMETOOLONG=ENAMETOOLONG,/* File name too long */
304   NFSERR_NOTEMPTY=ENOTEMPTY,      /* Directory not empty */
305   NFSERR_DQUOT=EDQUOT,            /* Disc quota exceeded */
306   NFSERR_STALE=ESTALE,            /* Stale NFS file handle */
307   NFSERR_WFLUSH                   /* write cache flushed */
308 };
309 
310 
311 /*
312  * TYPEDEFS:
313  */
314 typedef char *dirpath;
315 typedef char *filename;
316 typedef char *name;
317 typedef char *nfspath;
318 typedef char fhandle[NFS_FHSIZE];
319 typedef char nfscookie[NFS_COOKIESIZE];
320 typedef enum ftype ftype;
321 typedef enum nfsstat nfsstat;
322 typedef enum nfstype nfsftype;
323 typedef fhandle fhandle_t;
324 typedef struct attrstat nfsattrstat;
325 typedef struct createargs nfscreateargs;
326 typedef struct dirlist nfsdirlist;
327 typedef struct diropargs nfsdiropargs;
328 typedef struct diropokres nfsdiropokres;
329 typedef struct diropres nfsdiropres;
330 typedef struct entry nfsentry;
331 typedef struct exports *exports;
332 typedef struct exports exportnode;
333 typedef struct fattr nfsfattr;
334 typedef struct fhstatus fhstatus;
335 typedef struct groups *groups;
336 typedef struct groups groupnode;
337 typedef struct linkargs nfslinkargs;
338 typedef struct mountlist *mountlist;
339 typedef struct mountlist mountbody;
340 typedef struct nfs_fh nfs_fh;
341 typedef struct nfstime nfstime;
342 typedef struct readargs nfsreadargs;
343 typedef struct readdirargs nfsreaddirargs;
344 typedef struct readdirres nfsreaddirres;
345 typedef struct readlinkres nfsreadlinkres;
346 typedef struct readokres nfsreadokres;
347 typedef struct readres nfsreadres;
348 typedef struct renameargs nfsrenameargs;
349 typedef struct sattr nfssattr;
350 typedef struct sattrargs nfssattrargs;
351 typedef struct statfsokres nfsstatfsokres;
352 typedef struct statfsres nfsstatfsres;
353 typedef struct symlinkargs nfssymlinkargs;
354 typedef struct writeargs nfswriteargs;
355 
356 
357 /*
358  * EXTERNALS:
359  */
360 
361 extern nfsattrstat *nfsproc_getattr_2_svc(nfs_fh *, struct svc_req *);
362 extern nfsattrstat *nfsproc_setattr_2_svc(nfssattrargs *, struct svc_req *);
363 extern nfsattrstat *nfsproc_write_2_svc(nfswriteargs *, struct svc_req *);
364 extern nfsdiropres *nfsproc_create_2_svc(nfscreateargs *, struct svc_req *);
365 extern nfsdiropres *nfsproc_lookup_2_svc(nfsdiropargs *, struct svc_req *);
366 extern nfsdiropres *nfsproc_mkdir_2_svc(nfscreateargs *, struct svc_req *);
367 extern nfsreaddirres *nfsproc_readdir_2_svc(nfsreaddirargs *, struct svc_req *);
368 extern nfsreadlinkres *nfsproc_readlink_2_svc(nfs_fh *, struct svc_req *);
369 extern nfsreadres *nfsproc_read_2_svc(nfsreadargs *, struct svc_req *);
370 extern nfsstat *nfsproc_link_2_svc(nfslinkargs *, struct svc_req *);
371 extern nfsstat *nfsproc_remove_2_svc(nfsdiropargs *, struct svc_req *);
372 extern nfsstat *nfsproc_rename_2_svc(nfsrenameargs *, struct svc_req *);
373 extern nfsstat *nfsproc_rmdir_2_svc(nfsdiropargs *, struct svc_req *);
374 extern nfsstat *nfsproc_symlink_2_svc(nfssymlinkargs *, struct svc_req *);
375 extern nfsstatfsres *nfsproc_statfs_2_svc(nfs_fh *, struct svc_req *);
376 extern void *nfsproc_null_2_svc(void *, struct svc_req *);
377 extern void *nfsproc_root_2_svc(void *, struct svc_req *);
378 extern void *nfsproc_writecache_2_svc(void *, struct svc_req *);
379 
380 extern bool_t xdr_attrstat(XDR *, nfsattrstat*);
381 extern bool_t xdr_createargs(XDR *, nfscreateargs*);
382 extern bool_t xdr_dirlist(XDR *, nfsdirlist*);
383 extern bool_t xdr_diropargs(XDR *, nfsdiropargs*);
384 extern bool_t xdr_diropokres(XDR *, nfsdiropokres*);
385 extern bool_t xdr_diropres(XDR *, nfsdiropres*);
386 extern bool_t xdr_entry(XDR *, nfsentry*);
387 extern bool_t xdr_fattr(XDR *, nfsfattr*);
388 extern bool_t xdr_filename(XDR *, filename*);
389 extern bool_t xdr_ftype(XDR *, nfsftype*);
390 extern bool_t xdr_linkargs(XDR *, nfslinkargs*);
391 extern bool_t xdr_mountlist(XDR *xdrs, mountlist *objp);
392 extern bool_t xdr_nfs_fh(XDR *, nfs_fh*);
393 extern bool_t xdr_nfscookie(XDR *, nfscookie);
394 extern bool_t xdr_nfspath(XDR *, nfspath*);
395 extern bool_t xdr_nfsstat(XDR *, nfsstat*);
396 extern bool_t xdr_nfstime(XDR *, nfstime*);
397 extern bool_t xdr_readargs(XDR *, nfsreadargs*);
398 extern bool_t xdr_readdirargs(XDR *, nfsreaddirargs*);
399 extern bool_t xdr_readdirres(XDR *, nfsreaddirres*);
400 extern bool_t xdr_readlinkres(XDR *, nfsreadlinkres*);
401 extern bool_t xdr_readokres(XDR *, nfsreadokres*);
402 extern bool_t xdr_readres(XDR *, nfsreadres*);
403 extern bool_t xdr_renameargs(XDR *, nfsrenameargs*);
404 extern bool_t xdr_sattr(XDR *, nfssattr*);
405 extern bool_t xdr_sattrargs(XDR *, nfssattrargs*);
406 extern bool_t xdr_statfsokres(XDR *, nfsstatfsokres*);
407 extern bool_t xdr_statfsres(XDR *, nfsstatfsres*);
408 extern bool_t xdr_symlinkargs(XDR *, nfssymlinkargs*);
409 extern bool_t xdr_writeargs(XDR *, nfswriteargs*);
410 
411 
412 /*
413  * STRUCTURES:
414  */
415 
416 struct nfs_args {
417   struct sockaddr_in	*addr;		/* file server address */
418   caddr_t		fh;		/* File handle to be mounted */
419   int			flags;		/* flags */
420   int			wsize;		/* write size in bytes */
421   int			rsize;		/* read size in bytes */
422   int			timeo;		/* initial timeout in .1 secs */
423   int			retrans;	/* times to retry send */
424   char			*hostname;	/* server's hostname */
425   int			acregmin;	/* attr cache file min secs */
426   int			acregmax;	/* attr cache file max secs */
427   int			acdirmin;	/* attr cache dir min secs */
428   int			acdirmax;	/* attr cache dir max secs */
429   char			*netname;	/* server's netname */
430 };
431 
432 struct nfs_fh {
433   char data[NFS_FHSIZE];
434 };
435 
436 struct nfstime {
437   u_int nt_seconds;
438   u_int nt_useconds;
439 };
440 
441 struct fattr {
442   nfsftype na_type;
443   u_int na_mode;
444   u_int na_nlink;
445   u_int na_uid;
446   u_int na_gid;
447   u_int na_size;
448   u_int na_blocksize;
449   u_int na_rdev;
450   u_int na_blocks;
451   u_int na_fsid;
452   u_int na_fileid;
453   nfstime na_atime;
454   nfstime na_mtime;
455   nfstime na_ctime;
456 };
457 
458 struct sattr {
459   u_int sa_mode;
460   u_int sa_uid;
461   u_int sa_gid;
462   u_int sa_size;
463   nfstime sa_atime;
464   nfstime sa_mtime;
465 };
466 
467 struct attrstat {
468   nfsstat ns_status;
469   union {
470     nfsfattr ns_attr_u;
471   } ns_u;
472 };
473 
474 struct sattrargs {
475   nfs_fh sag_fhandle;
476   nfssattr sag_attributes;
477 };
478 
479 struct diropargs {
480   nfs_fh da_fhandle;		/* was dir */
481   filename da_name;
482 };
483 
484 struct diropokres {
485   nfs_fh drok_fhandle;
486   nfsfattr drok_attributes;
487 };
488 
489 struct diropres {
490   nfsstat dr_status;		/* was status */
491   union {
492     nfsdiropokres dr_drok_u;	/* was diropres */
493   } dr_u;			/* was diropres_u */
494 };
495 
496 struct readlinkres {
497   nfsstat rlr_status;
498   union {
499     nfspath rlr_data_u;
500   } rlr_u;
501 };
502 
503 struct readargs {
504   nfs_fh ra_fhandle;
505   u_int ra_offset;
506   u_int ra_count;
507   u_int ra_totalcount;
508 };
509 
510 struct readokres {
511   nfsfattr raok_attributes;
512   struct {
513     u_int raok_len_u;
514     char *raok_val_u;
515   } raok_u;
516 };
517 
518 struct readres {
519   nfsstat rr_status;
520   union {
521     nfsreadokres rr_reply_u;
522   } rr_u;
523 };
524 
525 struct writeargs {
526   nfs_fh wra_fhandle;
527   u_int wra_beginoffset;
528   u_int wra_offset;
529   u_int wra_totalcount;
530   struct {
531     u_int wra_len_u;
532     char *wra_val_u;
533   } wra_u;
534 };
535 
536 struct createargs {
537   nfsdiropargs ca_where;
538   nfssattr ca_attributes;
539 };
540 
541 struct renameargs {
542   nfsdiropargs rna_from;
543   nfsdiropargs rna_to;
544 };
545 
546 struct linkargs {
547   nfs_fh la_fhandle;
548   nfsdiropargs la_to;
549 };
550 
551 struct symlinkargs {
552   nfsdiropargs sla_from;
553   nfspath sla_to;
554   nfssattr sla_attributes;
555 };
556 
557 struct readdirargs {
558   nfs_fh rda_fhandle;
559   nfscookie rda_cookie;
560   u_int rda_count;
561 };
562 
563 struct entry {
564   u_int ne_fileid;
565   filename ne_name;
566   nfscookie ne_cookie;
567   nfsentry *ne_nextentry;
568 };
569 
570 struct dirlist {
571   nfsentry *dl_entries;
572   bool_t dl_eof;
573 };
574 
575 struct readdirres {
576   nfsstat rdr_status;
577   union {
578     nfsdirlist rdr_reply_u;
579   } rdr_u;
580 };
581 
582 struct statfsokres {
583   u_int sfrok_tsize;
584   u_int sfrok_bsize;
585   u_int sfrok_blocks;
586   u_int sfrok_bfree;
587   u_int sfrok_bavail;
588 };
589 
590 struct statfsres {
591   nfsstat sfr_status;
592   union {
593     nfsstatfsokres sfr_reply_u;
594   } sfr_u;
595 };
596 
597 #endif /* not _AMU_NFS_PROT_H */
598