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