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