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