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