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%#endif /* not lint */ 35%#include <sys/cdefs.h> 36%__FBSDID("$FreeBSD$"); 37#endif 38 39const NFS_PORT = 2049; 40const NFS_MAXDATA = 8192; 41const NFS_MAXPATHLEN = 1024; 42const NFS_MAXNAMLEN = 255; 43const NFS_FHSIZE = 32; 44const NFS_COOKIESIZE = 4; 45const NFS_FIFO_DEV = -1; /* size kludge for named pipes */ 46 47/* 48 * File types 49 */ 50const NFSMODE_FMT = 0170000; /* type of file */ 51const NFSMODE_DIR = 0040000; /* directory */ 52const NFSMODE_CHR = 0020000; /* character special */ 53const NFSMODE_BLK = 0060000; /* block special */ 54const NFSMODE_REG = 0100000; /* regular */ 55const NFSMODE_LNK = 0120000; /* symbolic link */ 56const NFSMODE_SOCK = 0140000; /* socket */ 57const NFSMODE_FIFO = 0010000; /* fifo */ 58 59/* 60 * Error status 61 */ 62enum nfsstat { 63 NFS_OK= 0, /* no error */ 64 NFSERR_PERM=1, /* Not owner */ 65 NFSERR_NOENT=2, /* No such file or directory */ 66 NFSERR_IO=5, /* I/O error */ 67 NFSERR_NXIO=6, /* No such device or address */ 68 NFSERR_ACCES=13, /* Permission denied */ 69 NFSERR_EXIST=17, /* File exists */ 70 NFSERR_NODEV=19, /* No such device */ 71 NFSERR_NOTDIR=20, /* Not a directory*/ 72 NFSERR_ISDIR=21, /* Is a directory */ 73 NFSERR_FBIG=27, /* File too large */ 74 NFSERR_NOSPC=28, /* No space left on device */ 75 NFSERR_ROFS=30, /* Read-only file system */ 76 NFSERR_NAMETOOLONG=63, /* File name too long */ 77 NFSERR_NOTEMPTY=66, /* Directory not empty */ 78 NFSERR_DQUOT=69, /* Disc quota exceeded */ 79 NFSERR_STALE=70, /* Stale NFS file handle */ 80 NFSERR_WFLUSH=99 /* write cache flushed */ 81}; 82 83/* 84 * File types 85 */ 86enum ftype { 87 NFNON = 0, /* non-file */ 88 NFREG = 1, /* regular file */ 89 NFDIR = 2, /* directory */ 90 NFBLK = 3, /* block special */ 91 NFCHR = 4, /* character special */ 92 NFLNK = 5, /* symbolic link */ 93 NFSOCK = 6, /* unix domain sockets */ 94 NFBAD = 7, /* unused */ 95 NFFIFO = 8 /* named pipe */ 96}; 97 98/* 99 * File access handle 100 */ 101struct nfs_fh { 102 opaque data[NFS_FHSIZE]; 103}; 104 105/* 106 * Timeval 107 */ 108struct nfstime { 109 unsigned seconds; 110 unsigned useconds; 111}; 112 113 114/* 115 * File attributes 116 */ 117struct fattr { 118 ftype type; /* file type */ 119 unsigned mode; /* protection mode bits */ 120 unsigned nlink; /* # hard links */ 121 unsigned uid; /* owner user id */ 122 unsigned gid; /* owner group id */ 123 unsigned size; /* file size in bytes */ 124 unsigned blocksize; /* prefered block size */ 125 unsigned rdev; /* special device # */ 126 unsigned blocks; /* Kb of disk used by file */ 127 unsigned fsid; /* device # */ 128 unsigned fileid; /* inode # */ 129 nfstime atime; /* time of last access */ 130 nfstime mtime; /* time of last modification */ 131 nfstime ctime; /* time of last change */ 132}; 133 134/* 135 * File attributes which can be set 136 */ 137struct sattr { 138 unsigned mode; /* protection mode bits */ 139 unsigned uid; /* owner user id */ 140 unsigned gid; /* owner group id */ 141 unsigned size; /* file size in bytes */ 142 nfstime atime; /* time of last access */ 143 nfstime mtime; /* time of last modification */ 144}; 145 146 147typedef string filename<NFS_MAXNAMLEN>; 148typedef string nfspath<NFS_MAXPATHLEN>; 149 150/* 151 * Reply status with file attributes 152 */ 153union attrstat switch (nfsstat status) { 154case NFS_OK: 155 fattr attributes; 156default: 157 void; 158}; 159 160struct sattrargs { 161 nfs_fh file; 162 sattr attributes; 163}; 164 165/* 166 * Arguments for directory operations 167 */ 168struct diropargs { 169 nfs_fh dir; /* directory file handle */ 170 filename name; /* name (up to NFS_MAXNAMLEN bytes) */ 171}; 172 173struct diropokres { 174 nfs_fh file; 175 fattr attributes; 176}; 177 178/* 179 * Results from directory operation 180 */ 181union diropres switch (nfsstat status) { 182case NFS_OK: 183 diropokres diropres; 184default: 185 void; 186}; 187 188union readlinkres switch (nfsstat status) { 189case NFS_OK: 190 nfspath data; 191default: 192 void; 193}; 194 195/* 196 * Arguments to remote read 197 */ 198struct readargs { 199 nfs_fh file; /* handle for file */ 200 unsigned offset; /* byte offset in file */ 201 unsigned count; /* immediate read count */ 202 unsigned totalcount; /* total read count (from this offset)*/ 203}; 204 205/* 206 * Status OK portion of remote read reply 207 */ 208struct readokres { 209 fattr attributes; /* attributes, need for pagin*/ 210 opaque data<NFS_MAXDATA>; 211}; 212 213union readres switch (nfsstat status) { 214case NFS_OK: 215 readokres reply; 216default: 217 void; 218}; 219 220/* 221 * Arguments to remote write 222 */ 223struct writeargs { 224 nfs_fh file; /* handle for file */ 225 unsigned beginoffset; /* beginning byte offset in file */ 226 unsigned offset; /* current byte offset in file */ 227 unsigned totalcount; /* total write count (to this offset)*/ 228 opaque data<NFS_MAXDATA>; 229}; 230 231struct createargs { 232 diropargs where; 233 sattr attributes; 234}; 235 236struct renameargs { 237 diropargs from; 238 diropargs to; 239}; 240 241struct linkargs { 242 nfs_fh from; 243 diropargs to; 244}; 245 246struct symlinkargs { 247 diropargs from; 248 nfspath to; 249 sattr attributes; 250}; 251 252 253typedef opaque nfscookie[NFS_COOKIESIZE]; 254 255/* 256 * Arguments to readdir 257 */ 258struct readdirargs { 259 nfs_fh dir; /* directory handle */ 260 nfscookie cookie; 261 unsigned count; /* number of directory bytes to read */ 262}; 263 264struct entry { 265 unsigned fileid; 266 filename name; 267 nfscookie cookie; 268 entry *nextentry; 269}; 270 271struct dirlist { 272 entry *entries; 273 bool eof; 274}; 275 276union readdirres switch (nfsstat status) { 277case NFS_OK: 278 dirlist reply; 279default: 280 void; 281}; 282 283struct statfsokres { 284 unsigned tsize; /* preferred transfer size in bytes */ 285 unsigned bsize; /* fundamental file system block size */ 286 unsigned blocks; /* total blocks in file system */ 287 unsigned bfree; /* free blocks in fs */ 288 unsigned bavail; /* free blocks avail to non-superuser */ 289}; 290 291union statfsres switch (nfsstat status) { 292case NFS_OK: 293 statfsokres reply; 294default: 295 void; 296}; 297 298#ifdef WANT_NFS3 299 300/* 301 * NFSv3 constants and types 302 */ 303const NFS3_FHSIZE = 64; /* maximum size in bytes of a file handle */ 304const NFS3_COOKIEVERFSIZE = 8; /* size of a cookie verifier for READDIR */ 305const NFS3_CREATEVERFSIZE = 8; /* size of the verifier used for CREATE */ 306const NFS3_WRITEVERFSIZE = 8; /* size of the verifier used for WRITE */ 307 308typedef unsigned hyper uint64; 309typedef hyper int64; 310typedef unsigned long uint32; 311typedef long int32; 312typedef string filename3<>; 313typedef string nfspath3<>; 314typedef uint64 fileid3; 315typedef uint64 cookie3; 316typedef opaque cookieverf3[NFS3_COOKIEVERFSIZE]; 317typedef opaque createverf3[NFS3_CREATEVERFSIZE]; 318typedef opaque writeverf3[NFS3_WRITEVERFSIZE]; 319typedef uint32 uid3; 320typedef uint32 gid3; 321typedef uint64 size3; 322typedef uint64 offset3; 323typedef uint32 mode3; 324typedef uint32 count3; 325 326/* 327 * Error status (v3) 328 */ 329enum nfsstat3 { 330 NFS3_OK = 0, 331 NFS3ERR_PERM = 1, 332 NFS3ERR_NOENT = 2, 333 NFS3ERR_IO = 5, 334 NFS3ERR_NXIO = 6, 335 NFS3ERR_ACCES = 13, 336 NFS3ERR_EXIST = 17, 337 NFS3ERR_XDEV = 18, 338 NFS3ERR_NODEV = 19, 339 NFS3ERR_NOTDIR = 20, 340 NFS3ERR_ISDIR = 21, 341 NFS3ERR_INVAL = 22, 342 NFS3ERR_FBIG = 27, 343 NFS3ERR_NOSPC = 28, 344 NFS3ERR_ROFS = 30, 345 NFS3ERR_MLINK = 31, 346 NFS3ERR_NAMETOOLONG = 63, 347 NFS3ERR_NOTEMPTY = 66, 348 NFS3ERR_DQUOT = 69, 349 NFS3ERR_STALE = 70, 350 NFS3ERR_REMOTE = 71, 351 NFS3ERR_BADHANDLE = 10001, 352 NFS3ERR_NOT_SYNC = 10002, 353 NFS3ERR_BAD_COOKIE = 10003, 354 NFS3ERR_NOTSUPP = 10004, 355 NFS3ERR_TOOSMALL = 10005, 356 NFS3ERR_SERVERFAULT = 10006, 357 NFS3ERR_BADTYPE = 10007, 358 NFS3ERR_JUKEBOX = 10008 359}; 360 361/* 362 * File types (v3) 363 */ 364enum ftype3 { 365 NF3REG = 1, /* regular file */ 366 NF3DIR = 2, /* directory */ 367 NF3BLK = 3, /* block special */ 368 NF3CHR = 4, /* character special */ 369 NF3LNK = 5, /* symbolic link */ 370 NF3SOCK = 6, /* unix domain sockets */ 371 NF3FIFO = 7 /* named pipe */ 372}; 373 374struct specdata3 { 375 uint32 specdata1; 376 uint32 specdata2; 377}; 378 379/* 380 * File access handle (v3) 381 */ 382struct nfs_fh3 { 383 opaque data<NFS3_FHSIZE>; 384}; 385 386/* 387 * Timeval (v3) 388 */ 389struct nfstime3 { 390 uint32 seconds; 391 uint32 nseconds; 392}; 393 394 395/* 396 * File attributes (v3) 397 */ 398struct fattr3 { 399 ftype3 type; /* file type */ 400 mode3 mode; /* protection mode bits */ 401 uint32 nlink; /* # hard links */ 402 uid3 uid; /* owner user id */ 403 gid3 gid; /* owner group id */ 404 size3 size; /* file size in bytes */ 405 size3 used; /* prefered block size */ 406 specdata3 rdev; /* special device # */ 407 uint64 fsid; /* device # */ 408 fileid3 fileid; /* inode # */ 409 nfstime3 atime; /* time of last access */ 410 nfstime3 mtime; /* time of last modification */ 411 nfstime3 ctime; /* time of last change */ 412}; 413 414union post_op_attr switch (bool attributes_follow) { 415case TRUE: 416 fattr3 attributes; 417case FALSE: 418 void; 419}; 420 421struct wcc_attr { 422 size3 size; 423 nfstime3 mtime; 424 nfstime3 ctime; 425}; 426 427union pre_op_attr switch (bool attributes_follow) { 428case TRUE: 429 wcc_attr attributes; 430case FALSE: 431 void; 432}; 433 434struct wcc_data { 435 pre_op_attr before; 436 post_op_attr after; 437}; 438 439union post_op_fh3 switch (bool handle_follows) { 440case TRUE: 441 nfs_fh3 handle; 442case FALSE: 443 void; 444}; 445 446/* 447 * File attributes which can be set (v3) 448 */ 449enum time_how { 450 DONT_CHANGE = 0, 451 SET_TO_SERVER_TIME = 1, 452 SET_TO_CLIENT_TIME = 2 453}; 454 455union set_mode3 switch (bool set_it) { 456case TRUE: 457 mode3 mode; 458default: 459 void; 460}; 461 462union set_uid3 switch (bool set_it) { 463case TRUE: 464 uid3 uid; 465default: 466 void; 467}; 468 469union set_gid3 switch (bool set_it) { 470case TRUE: 471 gid3 gid; 472default: 473 void; 474}; 475 476union set_size3 switch (bool set_it) { 477case TRUE: 478 size3 size; 479default: 480 void; 481}; 482 483union set_atime switch (time_how set_it) { 484case SET_TO_CLIENT_TIME: 485 nfstime3 atime; 486default: 487 void; 488}; 489 490union set_mtime switch (time_how set_it) { 491case SET_TO_CLIENT_TIME: 492 nfstime3 mtime; 493default: 494 void; 495}; 496 497struct sattr3 { 498 set_mode3 mode; 499 set_uid3 uid; 500 set_gid3 gid; 501 set_size3 size; 502 set_atime atime; 503 set_mtime mtime; 504}; 505 506/* 507 * Arguments for directory operations (v3) 508 */ 509struct diropargs3 { 510 nfs_fh3 dir; /* directory file handle */ 511 filename3 name; /* name (up to NFS_MAXNAMLEN bytes) */ 512}; 513 514/* 515 * Arguments to getattr (v3). 516 */ 517struct GETATTR3args { 518 nfs_fh3 object; 519}; 520 521struct GETATTR3resok { 522 fattr3 obj_attributes; 523}; 524 525union GETATTR3res switch (nfsstat3 status) { 526case NFS3_OK: 527 GETATTR3resok resok; 528default: 529 void; 530}; 531 532/* 533 * Arguments to setattr (v3). 534 */ 535union sattrguard3 switch (bool check) { 536case TRUE: 537 nfstime3 obj_ctime; 538case FALSE: 539 void; 540}; 541 542struct SETATTR3args { 543 nfs_fh3 object; 544 sattr3 new_attributes; 545 sattrguard3 guard; 546}; 547 548struct SETATTR3resok { 549 wcc_data obj_wcc; 550}; 551 552struct SETATTR3resfail { 553 wcc_data obj_wcc; 554}; 555 556union SETATTR3res switch (nfsstat3 status) { 557case NFS3_OK: 558 SETATTR3resok resok; 559default: 560 SETATTR3resfail resfail; 561}; 562 563/* 564 * Arguments to lookup (v3). 565 */ 566struct LOOKUP3args { 567 diropargs3 what; 568}; 569 570struct LOOKUP3resok { 571 nfs_fh3 object; 572 post_op_attr obj_attributes; 573 post_op_attr dir_attributes; 574}; 575 576struct LOOKUP3resfail { 577 post_op_attr dir_attributes; 578}; 579 580union LOOKUP3res switch (nfsstat3 status) { 581case NFS3_OK: 582 LOOKUP3resok resok; 583default: 584 LOOKUP3resfail resfail; 585}; 586 587/* 588 * Arguments to access (v3). 589 */ 590const ACCESS3_READ = 0x0001; 591const ACCESS3_LOOKUP = 0x0002; 592const ACCESS3_MODIFY = 0x0004; 593const ACCESS3_EXTEND = 0x0008; 594const ACCESS3_DELETE = 0x0010; 595const ACCESS3_EXECUTE = 0x0020; 596 597struct ACCESS3args { 598 nfs_fh3 object; 599 uint32 access; 600}; 601 602struct ACCESS3resok { 603 post_op_attr obj_attributes; 604 uint32 access; 605}; 606 607struct ACCESS3resfail { 608 post_op_attr obj_attributes; 609}; 610 611union ACCESS3res switch (nfsstat3 status) { 612case NFS3_OK: 613 ACCESS3resok resok; 614default: 615 ACCESS3resfail resfail; 616}; 617 618/* 619 * Arguments to readlink (v3). 620 */ 621struct READLINK3args { 622 nfs_fh3 symlink; 623}; 624 625struct READLINK3resok { 626 post_op_attr symlink_attributes; 627 nfspath3 data; 628}; 629 630struct READLINK3resfail { 631 post_op_attr symlink_attributes; 632}; 633 634union READLINK3res switch (nfsstat3 status) { 635case NFS3_OK: 636 READLINK3resok resok; 637default: 638 READLINK3resfail resfail; 639}; 640 641/* 642 * Arguments to read (v3). 643 */ 644struct READ3args { 645 nfs_fh3 file; 646 offset3 offset; 647 count3 count; 648}; 649 650struct READ3resok { 651 post_op_attr file_attributes; 652 count3 count; 653 bool eof; 654 opaque data<>; 655}; 656 657struct READ3resfail { 658 post_op_attr file_attributes; 659}; 660 661/* XXX: solaris 2.6 uses ``nfsstat'' here */ 662union READ3res switch (nfsstat3 status) { 663case NFS3_OK: 664 READ3resok resok; 665default: 666 READ3resfail resfail; 667}; 668 669/* 670 * Arguments to write (v3). 671 */ 672enum stable_how { 673 UNSTABLE = 0, 674 DATA_SYNC = 1, 675 FILE_SYNC = 2 676}; 677 678struct WRITE3args { 679 nfs_fh3 file; 680 offset3 offset; 681 count3 count; 682 stable_how stable; 683 opaque data<>; 684}; 685 686struct WRITE3resok { 687 wcc_data file_wcc; 688 count3 count; 689 stable_how committed; 690 writeverf3 verf; 691}; 692 693struct WRITE3resfail { 694 wcc_data file_wcc; 695}; 696 697union WRITE3res switch (nfsstat3 status) { 698case NFS3_OK: 699 WRITE3resok resok; 700default: 701 WRITE3resfail resfail; 702}; 703 704/* 705 * Arguments to create (v3). 706 */ 707enum createmode3 { 708 UNCHECKED = 0, 709 GUARDED = 1, 710 EXCLUSIVE = 2 711}; 712 713union createhow3 switch (createmode3 mode) { 714case UNCHECKED: 715case GUARDED: 716 sattr3 obj_attributes; 717case EXCLUSIVE: 718 createverf3 verf; 719}; 720 721struct CREATE3args { 722 diropargs3 where; 723 createhow3 how; 724}; 725 726struct CREATE3resok { 727 post_op_fh3 obj; 728 post_op_attr obj_attributes; 729 wcc_data dir_wcc; 730}; 731 732struct CREATE3resfail { 733 wcc_data dir_wcc; 734}; 735 736union CREATE3res switch (nfsstat3 status) { 737case NFS3_OK: 738 CREATE3resok resok; 739default: 740 CREATE3resfail resfail; 741}; 742 743/* 744 * Arguments to mkdir (v3). 745 */ 746struct MKDIR3args { 747 diropargs3 where; 748 sattr3 attributes; 749}; 750 751struct MKDIR3resok { 752 post_op_fh3 obj; 753 post_op_attr obj_attributes; 754 wcc_data dir_wcc; 755}; 756 757struct MKDIR3resfail { 758 wcc_data dir_wcc; 759}; 760 761union MKDIR3res switch (nfsstat3 status) { 762case NFS3_OK: 763 MKDIR3resok resok; 764default: 765 MKDIR3resfail resfail; 766}; 767 768/* 769 * Arguments to symlink (v3). 770 */ 771struct symlinkdata3 { 772 sattr3 symlink_attributes; 773 nfspath3 symlink_data; 774}; 775 776struct SYMLINK3args { 777 diropargs3 where; 778 symlinkdata3 symlink; 779}; 780 781struct SYMLINK3resok { 782 post_op_fh3 obj; 783 post_op_attr obj_attributes; 784 wcc_data dir_wcc; 785}; 786 787struct SYMLINK3resfail { 788 wcc_data dir_wcc; 789}; 790 791union SYMLINK3res switch (nfsstat3 status) { 792case NFS3_OK: 793 SYMLINK3resok resok; 794default: 795 SYMLINK3resfail resfail; 796}; 797 798/* 799 * Arguments to mknod (v3). 800 */ 801struct devicedata3 { 802 sattr3 dev_attributes; 803 specdata3 spec; 804}; 805 806union mknoddata3 switch (ftype3 type) { 807case NF3CHR: 808case NF3BLK: 809 devicedata3 device; 810case NF3SOCK: 811case NF3FIFO: 812 sattr3 pipe_attributes; 813default: 814 void; 815}; 816 817struct MKNOD3args { 818 diropargs3 where; 819 mknoddata3 what; 820}; 821 822struct MKNOD3resok { 823 post_op_fh3 obj; 824 post_op_attr obj_attributes; 825 wcc_data dir_wcc; 826}; 827 828struct MKNOD3resfail { 829 wcc_data dir_wcc; 830}; 831 832union MKNOD3res switch (nfsstat3 status) { 833case NFS3_OK: 834 MKNOD3resok resok; 835default: 836 MKNOD3resfail resfail; 837}; 838 839/* 840 * Arguments to remove (v3). 841 */ 842struct REMOVE3args { 843 diropargs3 object; 844}; 845 846struct REMOVE3resok { 847 wcc_data dir_wcc; 848}; 849 850struct REMOVE3resfail { 851 wcc_data dir_wcc; 852}; 853 854union REMOVE3res switch (nfsstat3 status) { 855case NFS3_OK: 856 REMOVE3resok resok; 857default: 858 REMOVE3resfail resfail; 859}; 860 861/* 862 * Arguments to rmdir (v3). 863 */ 864struct RMDIR3args { 865 diropargs3 object; 866}; 867 868struct RMDIR3resok { 869 wcc_data dir_wcc; 870}; 871 872struct RMDIR3resfail { 873 wcc_data dir_wcc; 874}; 875 876union RMDIR3res switch (nfsstat3 status) { 877case NFS3_OK: 878 RMDIR3resok resok; 879default: 880 RMDIR3resfail resfail; 881}; 882 883/* 884 * Arguments to rename (v3). 885 */ 886struct RENAME3args { 887 diropargs3 from; 888 diropargs3 to; 889}; 890 891struct RENAME3resok { 892 wcc_data fromdir_wcc; 893 wcc_data todir_wcc; 894}; 895 896struct RENAME3resfail { 897 wcc_data fromdir_wcc; 898 wcc_data todir_wcc; 899}; 900 901union RENAME3res switch (nfsstat3 status) { 902case NFS3_OK: 903 RENAME3resok resok; 904default: 905 RENAME3resfail resfail; 906}; 907 908/* 909 * Arguments to link (v3). 910 */ 911struct LINK3args { 912 nfs_fh3 file; 913 diropargs3 link; 914}; 915 916struct LINK3resok { 917 post_op_attr file_attributes; 918 wcc_data linkdir_wcc; 919}; 920 921struct LINK3resfail { 922 post_op_attr file_attributes; 923 wcc_data linkdir_wcc; 924}; 925 926union LINK3res switch (nfsstat3 status) { 927case NFS3_OK: 928 LINK3resok resok; 929default: 930 LINK3resfail resfail; 931}; 932 933/* 934 * Arguments to readdir (v3). 935 */ 936struct READDIR3args { 937 nfs_fh3 dir; 938 cookie3 cookie; 939 cookieverf3 cookieverf; 940 count3 count; 941}; 942 943struct entry3 { 944 fileid3 fileid; 945 filename3 name; 946 cookie3 cookie; 947 entry3 *nextentry; 948}; 949 950struct dirlist3 { 951 entry3 *entries; 952 bool eof; 953}; 954 955struct READDIR3resok { 956 post_op_attr dir_attributes; 957 cookieverf3 cookieverf; 958 dirlist3 reply; 959}; 960 961struct READDIR3resfail { 962 post_op_attr dir_attributes; 963}; 964 965union READDIR3res switch (nfsstat3 status) { 966case NFS3_OK: 967 READDIR3resok resok; 968default: 969 READDIR3resfail resfail; 970}; 971 972/* 973 * Arguments to readdirplus (v3). 974 */ 975struct READDIRPLUS3args { 976 nfs_fh3 dir; 977 cookie3 cookie; 978 cookieverf3 cookieverf; 979 count3 dircount; 980 count3 maxcount; 981}; 982 983struct entryplus3 { 984 fileid3 fileid; 985 filename3 name; 986 cookie3 cookie; 987 post_op_attr name_attributes; 988 post_op_fh3 name_handle; 989 entryplus3 *nextentry; 990}; 991 992struct dirlistplus3 { 993 entryplus3 *entries; 994 bool eof; 995}; 996 997struct READDIRPLUS3resok { 998 post_op_attr dir_attributes; 999 cookieverf3 cookieverf; 1000 dirlistplus3 reply; 1001}; 1002 1003struct READDIRPLUS3resfail { 1004 post_op_attr dir_attributes; 1005}; 1006 1007union READDIRPLUS3res switch (nfsstat3 status) { 1008case NFS3_OK: 1009 READDIRPLUS3resok resok; 1010default: 1011 READDIRPLUS3resfail resfail; 1012}; 1013 1014/* 1015 * Arguments to fsstat (v3). 1016 */ 1017struct FSSTAT3args { 1018 nfs_fh3 fsroot; 1019}; 1020 1021struct FSSTAT3resok { 1022 post_op_attr obj_attributes; 1023 size3 tbytes; 1024 size3 fbytes; 1025 size3 abytes; 1026 size3 tfiles; 1027 size3 ffiles; 1028 size3 afiles; 1029 uint32 invarsec; 1030}; 1031 1032struct FSSTAT3resfail { 1033 post_op_attr obj_attributes; 1034}; 1035 1036union FSSTAT3res switch (nfsstat3 status) { 1037case NFS3_OK: 1038 FSSTAT3resok resok; 1039default: 1040 FSSTAT3resfail resfail; 1041}; 1042 1043/* 1044 * Arguments to fsinfo (v3). 1045 */ 1046const FSF3_LINK = 0x0001; 1047const FSF3_SYMLINK = 0x0002; 1048const FSF3_HOMOGENEOUS = 0x0008; 1049const FSF3_CANSETTIME = 0x0010; 1050 1051struct FSINFO3args { 1052 nfs_fh3 fsroot; 1053}; 1054 1055struct FSINFO3resok { 1056 post_op_attr obj_attributes; 1057 uint32 rtmax; 1058 uint32 rtpref; 1059 uint32 rtmult; 1060 uint32 wtmax; 1061 uint32 wtpref; 1062 uint32 wtmult; 1063 uint32 dtpref; 1064 size3 maxfilesize; 1065 nfstime3 time_delta; 1066 uint32 properties; 1067}; 1068 1069struct FSINFO3resfail { 1070 post_op_attr obj_attributes; 1071}; 1072 1073union FSINFO3res switch (nfsstat3 status) { 1074case NFS3_OK: 1075 FSINFO3resok resok; 1076default: 1077 FSINFO3resfail resfail; 1078}; 1079 1080/* 1081 * Arguments to pathconf (v3). 1082 */ 1083struct PATHCONF3args { 1084 nfs_fh3 object; 1085}; 1086 1087struct PATHCONF3resok { 1088 post_op_attr obj_attributes; 1089 uint32 linkmax; 1090 uint32 name_max; 1091 bool no_trunc; 1092 bool chown_restricted; 1093 bool case_insensitive; 1094 bool case_preserving; 1095}; 1096 1097struct PATHCONF3resfail { 1098 post_op_attr obj_attributes; 1099}; 1100 1101union PATHCONF3res switch (nfsstat3 status) { 1102case NFS3_OK: 1103 PATHCONF3resok resok; 1104default: 1105 PATHCONF3resfail resfail; 1106}; 1107 1108/* 1109 * Arguments to commit (v3). 1110 */ 1111struct COMMIT3args { 1112 nfs_fh3 file; 1113 offset3 offset; 1114 count3 count; 1115}; 1116 1117struct COMMIT3resok { 1118 wcc_data file_wcc; 1119 writeverf3 verf; 1120}; 1121 1122struct COMMIT3resfail { 1123 wcc_data file_wcc; 1124}; 1125 1126union COMMIT3res switch (nfsstat3 status) { 1127case NFS3_OK: 1128 COMMIT3resok resok; 1129default: 1130 COMMIT3resfail resfail; 1131}; 1132 1133#endif /* WANT_NFS3 */ 1134 1135/* 1136 * Remote file service routines 1137 */ 1138program NFS_PROGRAM { 1139 version NFS_VERSION { 1140 void 1141 NFSPROC_NULL(void) = 0; 1142 1143 attrstat 1144 NFSPROC_GETATTR(nfs_fh) = 1; 1145 1146 attrstat 1147 NFSPROC_SETATTR(sattrargs) = 2; 1148 1149 void 1150 NFSPROC_ROOT(void) = 3; 1151 1152 diropres 1153 NFSPROC_LOOKUP(diropargs) = 4; 1154 1155 readlinkres 1156 NFSPROC_READLINK(nfs_fh) = 5; 1157 1158 readres 1159 NFSPROC_READ(readargs) = 6; 1160 1161 void 1162 NFSPROC_WRITECACHE(void) = 7; 1163 1164 attrstat 1165 NFSPROC_WRITE(writeargs) = 8; 1166 1167 diropres 1168 NFSPROC_CREATE(createargs) = 9; 1169 1170 nfsstat 1171 NFSPROC_REMOVE(diropargs) = 10; 1172 1173 nfsstat 1174 NFSPROC_RENAME(renameargs) = 11; 1175 1176 nfsstat 1177 NFSPROC_LINK(linkargs) = 12; 1178 1179 nfsstat 1180 NFSPROC_SYMLINK(symlinkargs) = 13; 1181 1182 diropres 1183 NFSPROC_MKDIR(createargs) = 14; 1184 1185 nfsstat 1186 NFSPROC_RMDIR(diropargs) = 15; 1187 1188 readdirres 1189 NFSPROC_READDIR(readdirargs) = 16; 1190 1191 statfsres 1192 NFSPROC_STATFS(nfs_fh) = 17; 1193 } = 2; 1194} = 100003; 1195#ifdef WANT_NFS3 1196program NFS3_PROGRAM { 1197 version NFS_V3 { 1198 void 1199 NFSPROC3_NULL(void) = 0; 1200 1201 GETATTR3res 1202 NFSPROC3_GETATTR(GETATTR3args) = 1; 1203 1204 SETATTR3res 1205 NFSPROC3_SETATTR(SETATTR3args) = 2; 1206 1207 LOOKUP3res 1208 NFSPROC3_LOOKUP(LOOKUP3args) = 3; 1209 1210 ACCESS3res 1211 NFSPROC3_ACCESS(ACCESS3args) = 4; 1212 1213 READLINK3res 1214 NFSPROC3_READLINK(READLINK3args) = 5; 1215 1216 READ3res 1217 NFSPROC3_READ(READ3args) = 6; 1218 1219 WRITE3res 1220 NFSPROC3_WRITE(WRITE3args) = 7; 1221 1222 CREATE3res 1223 NFSPROC3_CREATE(CREATE3args) = 8; 1224 1225 MKDIR3res 1226 NFSPROC3_MKDIR(MKDIR3args) = 9; 1227 1228 SYMLINK3res 1229 NFSPROC3_SYMLINK(SYMLINK3args) = 10; 1230 1231 MKNOD3res 1232 NFSPROC3_MKNOD(MKNOD3args) = 11; 1233 1234 REMOVE3res 1235 NFSPROC3_REMOVE(REMOVE3args) = 12; 1236 1237 RMDIR3res 1238 NFSPROC3_RMDIR(RMDIR3args) = 13; 1239 1240 RENAME3res 1241 NFSPROC3_RENAME(RENAME3args) = 14; 1242 1243 LINK3res 1244 NFSPROC3_LINK(LINK3args) = 15; 1245 1246 READDIR3res 1247 NFSPROC3_READDIR(READDIR3args) = 16; 1248 1249 READDIRPLUS3res 1250 NFSPROC3_READDIRPLUS(READDIRPLUS3args) = 17; 1251 1252 FSSTAT3res 1253 NFSPROC3_FSSTAT(FSSTAT3args) = 18; 1254 1255 FSINFO3res 1256 NFSPROC3_FSINFO(FSINFO3args) = 19; 1257 1258 PATHCONF3res 1259 NFSPROC3_PATHCONF(PATHCONF3args) = 20; 1260 1261 COMMIT3res 1262 NFSPROC3_COMMIT(COMMIT3args) = 21; 1263 } = 3; 1264} = 100003; 1265#endif 1266 1267