1*2c53affbSjmc /* $OpenBSD: nfs_prot.x,v 1.6 2022/12/27 17:10:07 jmc Exp $ */ 2c7940187Sniklas 3df930be7Sderaadt /* 4cb7760d1Smillert * Copyright (c) 2010, Oracle America, Inc. 5df930be7Sderaadt * 6cb7760d1Smillert * Redistribution and use in source and binary forms, with or without 7cb7760d1Smillert * modification, are permitted provided that the following conditions are 8cb7760d1Smillert * met: 9df930be7Sderaadt * 10cb7760d1Smillert * * Redistributions of source code must retain the above copyright 11cb7760d1Smillert * notice, this list of conditions and the following disclaimer. 12cb7760d1Smillert * * Redistributions in binary form must reproduce the above 13cb7760d1Smillert * copyright notice, this list of conditions and the following 14cb7760d1Smillert * disclaimer in the documentation and/or other materials 15cb7760d1Smillert * provided with the distribution. 16cb7760d1Smillert * * Neither the name of the "Oracle America, Inc." nor the names of its 17cb7760d1Smillert * contributors may be used to endorse or promote products derived 18cb7760d1Smillert * from this software without specific prior written permission. 19df930be7Sderaadt * 20cb7760d1Smillert * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21cb7760d1Smillert * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22cb7760d1Smillert * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23cb7760d1Smillert * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24cb7760d1Smillert * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 25cb7760d1Smillert * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26cb7760d1Smillert * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 27cb7760d1Smillert * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28cb7760d1Smillert * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29cb7760d1Smillert * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30cb7760d1Smillert * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31cb7760d1Smillert * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32df930be7Sderaadt */ 33df930be7Sderaadt 34df930be7Sderaadt #ifndef RPC_HDR 35df930be7Sderaadt #endif 36df930be7Sderaadt 37df930be7Sderaadt const NFS_PORT = 2049; 38df930be7Sderaadt const NFS_MAXDATA = 8192; 39df930be7Sderaadt const NFS_MAXPATHLEN = 1024; 40df930be7Sderaadt const NFS_MAXNAMLEN = 255; 41df930be7Sderaadt const NFS_FHSIZE = 32; 42df930be7Sderaadt const NFS_COOKIESIZE = 4; 43df930be7Sderaadt const NFS_FIFO_DEV = -1; /* size kludge for named pipes */ 44df930be7Sderaadt 45df930be7Sderaadt /* 46df930be7Sderaadt * File types 47df930be7Sderaadt */ 48df930be7Sderaadt const NFSMODE_FMT = 0170000; /* type of file */ 49df930be7Sderaadt const NFSMODE_DIR = 0040000; /* directory */ 50df930be7Sderaadt const NFSMODE_CHR = 0020000; /* character special */ 51df930be7Sderaadt const NFSMODE_BLK = 0060000; /* block special */ 52df930be7Sderaadt const NFSMODE_REG = 0100000; /* regular */ 53df930be7Sderaadt const NFSMODE_LNK = 0120000; /* symbolic link */ 54df930be7Sderaadt const NFSMODE_SOCK = 0140000; /* socket */ 55df930be7Sderaadt const NFSMODE_FIFO = 0010000; /* fifo */ 56df930be7Sderaadt 57df930be7Sderaadt /* 58df930be7Sderaadt * Error status 59df930be7Sderaadt */ 60df930be7Sderaadt enum nfsstat { 61df930be7Sderaadt NFS_OK= 0, /* no error */ 62df930be7Sderaadt NFSERR_PERM=1, /* Not owner */ 63df930be7Sderaadt NFSERR_NOENT=2, /* No such file or directory */ 64df930be7Sderaadt NFSERR_IO=5, /* I/O error */ 65df930be7Sderaadt NFSERR_NXIO=6, /* No such device or address */ 66df930be7Sderaadt NFSERR_ACCES=13, /* Permission denied */ 67df930be7Sderaadt NFSERR_EXIST=17, /* File exists */ 68df930be7Sderaadt NFSERR_NODEV=19, /* No such device */ 69df930be7Sderaadt NFSERR_NOTDIR=20, /* Not a directory*/ 70df930be7Sderaadt NFSERR_ISDIR=21, /* Is a directory */ 71df930be7Sderaadt NFSERR_FBIG=27, /* File too large */ 72df930be7Sderaadt NFSERR_NOSPC=28, /* No space left on device */ 73df930be7Sderaadt NFSERR_ROFS=30, /* Read-only file system */ 74df930be7Sderaadt NFSERR_NAMETOOLONG=63, /* File name too long */ 75df930be7Sderaadt NFSERR_NOTEMPTY=66, /* Directory not empty */ 76df930be7Sderaadt NFSERR_DQUOT=69, /* Disc quota exceeded */ 77df930be7Sderaadt NFSERR_STALE=70, /* Stale NFS file handle */ 78df930be7Sderaadt NFSERR_WFLUSH=99 /* write cache flushed */ 79df930be7Sderaadt }; 80df930be7Sderaadt 81df930be7Sderaadt /* 82df930be7Sderaadt * File types 83df930be7Sderaadt */ 84df930be7Sderaadt enum ftype { 85df930be7Sderaadt NFNON = 0, /* non-file */ 86df930be7Sderaadt NFREG = 1, /* regular file */ 87df930be7Sderaadt NFDIR = 2, /* directory */ 88df930be7Sderaadt NFBLK = 3, /* block special */ 89df930be7Sderaadt NFCHR = 4, /* character special */ 90df930be7Sderaadt NFLNK = 5, /* symbolic link */ 91df930be7Sderaadt NFSOCK = 6, /* unix domain sockets */ 92df930be7Sderaadt NFBAD = 7, /* unused */ 93df930be7Sderaadt NFFIFO = 8 /* named pipe */ 94df930be7Sderaadt }; 95df930be7Sderaadt 96df930be7Sderaadt /* 97df930be7Sderaadt * File access handle 98df930be7Sderaadt */ 99df930be7Sderaadt struct nfs_fh { 100df930be7Sderaadt opaque data[NFS_FHSIZE]; 101df930be7Sderaadt }; 102df930be7Sderaadt 103df930be7Sderaadt /* 104df930be7Sderaadt * Timeval 105df930be7Sderaadt */ 106df930be7Sderaadt struct nfstime { 107df930be7Sderaadt unsigned seconds; 108df930be7Sderaadt unsigned useconds; 109df930be7Sderaadt }; 110df930be7Sderaadt 111df930be7Sderaadt 112df930be7Sderaadt /* 113df930be7Sderaadt * File attributes 114df930be7Sderaadt */ 115df930be7Sderaadt struct fattr { 116df930be7Sderaadt ftype type; /* file type */ 117df930be7Sderaadt unsigned mode; /* protection mode bits */ 118df930be7Sderaadt unsigned nlink; /* # hard links */ 119df930be7Sderaadt unsigned uid; /* owner user id */ 120df930be7Sderaadt unsigned gid; /* owner group id */ 121df930be7Sderaadt unsigned size; /* file size in bytes */ 122*2c53affbSjmc unsigned blocksize; /* preferred block size */ 123df930be7Sderaadt unsigned rdev; /* special device # */ 124df930be7Sderaadt unsigned blocks; /* Kb of disk used by file */ 125df930be7Sderaadt unsigned fsid; /* device # */ 126df930be7Sderaadt unsigned fileid; /* inode # */ 127df930be7Sderaadt nfstime atime; /* time of last access */ 128df930be7Sderaadt nfstime mtime; /* time of last modification */ 129df930be7Sderaadt nfstime ctime; /* time of last change */ 130df930be7Sderaadt }; 131df930be7Sderaadt 132df930be7Sderaadt /* 133df930be7Sderaadt * File attributes which can be set 134df930be7Sderaadt */ 135df930be7Sderaadt struct sattr { 136df930be7Sderaadt unsigned mode; /* protection mode bits */ 137df930be7Sderaadt unsigned uid; /* owner user id */ 138df930be7Sderaadt unsigned gid; /* owner group id */ 139df930be7Sderaadt unsigned size; /* file size in bytes */ 140df930be7Sderaadt nfstime atime; /* time of last access */ 141df930be7Sderaadt nfstime mtime; /* time of last modification */ 142df930be7Sderaadt }; 143df930be7Sderaadt 144df930be7Sderaadt 145df930be7Sderaadt typedef string filename<NFS_MAXNAMLEN>; 146df930be7Sderaadt typedef string nfspath<NFS_MAXPATHLEN>; 147df930be7Sderaadt 148df930be7Sderaadt /* 149df930be7Sderaadt * Reply status with file attributes 150df930be7Sderaadt */ 151df930be7Sderaadt union attrstat switch (nfsstat status) { 152df930be7Sderaadt case NFS_OK: 153df930be7Sderaadt fattr attributes; 154df930be7Sderaadt default: 155df930be7Sderaadt void; 156df930be7Sderaadt }; 157df930be7Sderaadt 158df930be7Sderaadt struct sattrargs { 159df930be7Sderaadt nfs_fh file; 160df930be7Sderaadt sattr attributes; 161df930be7Sderaadt }; 162df930be7Sderaadt 163df930be7Sderaadt /* 164df930be7Sderaadt * Arguments for directory operations 165df930be7Sderaadt */ 166df930be7Sderaadt struct diropargs { 167df930be7Sderaadt nfs_fh dir; /* directory file handle */ 168df930be7Sderaadt filename name; /* name (up to NFS_MAXNAMLEN bytes) */ 169df930be7Sderaadt }; 170df930be7Sderaadt 171df930be7Sderaadt struct diropokres { 172df930be7Sderaadt nfs_fh file; 173df930be7Sderaadt fattr attributes; 174df930be7Sderaadt }; 175df930be7Sderaadt 176df930be7Sderaadt /* 177df930be7Sderaadt * Results from directory operation 178df930be7Sderaadt */ 179df930be7Sderaadt union diropres switch (nfsstat status) { 180df930be7Sderaadt case NFS_OK: 181df930be7Sderaadt diropokres diropres; 182df930be7Sderaadt default: 183df930be7Sderaadt void; 184df930be7Sderaadt }; 185df930be7Sderaadt 186df930be7Sderaadt union readlinkres switch (nfsstat status) { 187df930be7Sderaadt case NFS_OK: 188df930be7Sderaadt nfspath data; 189df930be7Sderaadt default: 190df930be7Sderaadt void; 191df930be7Sderaadt }; 192df930be7Sderaadt 193df930be7Sderaadt /* 194df930be7Sderaadt * Arguments to remote read 195df930be7Sderaadt */ 196df930be7Sderaadt struct readargs { 197df930be7Sderaadt nfs_fh file; /* handle for file */ 198df930be7Sderaadt unsigned offset; /* byte offset in file */ 199df930be7Sderaadt unsigned count; /* immediate read count */ 200df930be7Sderaadt unsigned totalcount; /* total read count (from this offset)*/ 201df930be7Sderaadt }; 202df930be7Sderaadt 203df930be7Sderaadt /* 204df930be7Sderaadt * Status OK portion of remote read reply 205df930be7Sderaadt */ 206df930be7Sderaadt struct readokres { 207df930be7Sderaadt fattr attributes; /* attributes, need for pagin*/ 208df930be7Sderaadt opaque data<NFS_MAXDATA>; 209df930be7Sderaadt }; 210df930be7Sderaadt 211df930be7Sderaadt union readres switch (nfsstat status) { 212df930be7Sderaadt case NFS_OK: 213df930be7Sderaadt readokres reply; 214df930be7Sderaadt default: 215df930be7Sderaadt void; 216df930be7Sderaadt }; 217df930be7Sderaadt 218df930be7Sderaadt /* 219df930be7Sderaadt * Arguments to remote write 220df930be7Sderaadt */ 221df930be7Sderaadt struct writeargs { 222df930be7Sderaadt nfs_fh file; /* handle for file */ 223df930be7Sderaadt unsigned beginoffset; /* beginning byte offset in file */ 224df930be7Sderaadt unsigned offset; /* current byte offset in file */ 225df930be7Sderaadt unsigned totalcount; /* total write count (to this offset)*/ 226df930be7Sderaadt opaque data<NFS_MAXDATA>; 227df930be7Sderaadt }; 228df930be7Sderaadt 229df930be7Sderaadt struct createargs { 230df930be7Sderaadt diropargs where; 231df930be7Sderaadt sattr attributes; 232df930be7Sderaadt }; 233df930be7Sderaadt 234df930be7Sderaadt struct renameargs { 235df930be7Sderaadt diropargs from; 236df930be7Sderaadt diropargs to; 237df930be7Sderaadt }; 238df930be7Sderaadt 239df930be7Sderaadt struct linkargs { 240df930be7Sderaadt nfs_fh from; 241df930be7Sderaadt diropargs to; 242df930be7Sderaadt }; 243df930be7Sderaadt 244df930be7Sderaadt struct symlinkargs { 245df930be7Sderaadt diropargs from; 246df930be7Sderaadt nfspath to; 247df930be7Sderaadt sattr attributes; 248df930be7Sderaadt }; 249df930be7Sderaadt 250df930be7Sderaadt 251df930be7Sderaadt typedef opaque nfscookie[NFS_COOKIESIZE]; 252df930be7Sderaadt 253df930be7Sderaadt /* 254df930be7Sderaadt * Arguments to readdir 255df930be7Sderaadt */ 256df930be7Sderaadt struct readdirargs { 257df930be7Sderaadt nfs_fh dir; /* directory handle */ 258df930be7Sderaadt nfscookie cookie; 259df930be7Sderaadt unsigned count; /* number of directory bytes to read */ 260df930be7Sderaadt }; 261df930be7Sderaadt 262df930be7Sderaadt struct entry { 263df930be7Sderaadt unsigned fileid; 264df930be7Sderaadt filename name; 265df930be7Sderaadt nfscookie cookie; 266df930be7Sderaadt entry *nextentry; 267df930be7Sderaadt }; 268df930be7Sderaadt 269df930be7Sderaadt struct dirlist { 270df930be7Sderaadt entry *entries; 271df930be7Sderaadt bool eof; 272df930be7Sderaadt }; 273df930be7Sderaadt 274df930be7Sderaadt union readdirres switch (nfsstat status) { 275df930be7Sderaadt case NFS_OK: 276df930be7Sderaadt dirlist reply; 277df930be7Sderaadt default: 278df930be7Sderaadt void; 279df930be7Sderaadt }; 280df930be7Sderaadt 281df930be7Sderaadt struct statfsokres { 282df930be7Sderaadt unsigned tsize; /* preferred transfer size in bytes */ 283df930be7Sderaadt unsigned bsize; /* fundamental file system block size */ 284df930be7Sderaadt unsigned blocks; /* total blocks in file system */ 285df930be7Sderaadt unsigned bfree; /* free blocks in fs */ 286df930be7Sderaadt unsigned bavail; /* free blocks avail to non-superuser */ 287df930be7Sderaadt }; 288df930be7Sderaadt 289df930be7Sderaadt union statfsres switch (nfsstat status) { 290df930be7Sderaadt case NFS_OK: 291df930be7Sderaadt statfsokres reply; 292df930be7Sderaadt default: 293df930be7Sderaadt void; 294df930be7Sderaadt }; 295df930be7Sderaadt 296df930be7Sderaadt /* 297df930be7Sderaadt * Remote file service routines 298df930be7Sderaadt */ 299df930be7Sderaadt program NFS_PROGRAM { 300df930be7Sderaadt version NFS_VERSION { 301df930be7Sderaadt void 302df930be7Sderaadt NFSPROC_NULL(void) = 0; 303df930be7Sderaadt 304df930be7Sderaadt attrstat 305df930be7Sderaadt NFSPROC_GETATTR(nfs_fh) = 1; 306df930be7Sderaadt 307df930be7Sderaadt attrstat 308df930be7Sderaadt NFSPROC_SETATTR(sattrargs) = 2; 309df930be7Sderaadt 310df930be7Sderaadt void 311df930be7Sderaadt NFSPROC_ROOT(void) = 3; 312df930be7Sderaadt 313df930be7Sderaadt diropres 314df930be7Sderaadt NFSPROC_LOOKUP(diropargs) = 4; 315df930be7Sderaadt 316df930be7Sderaadt readlinkres 317df930be7Sderaadt NFSPROC_READLINK(nfs_fh) = 5; 318df930be7Sderaadt 319df930be7Sderaadt readres 320df930be7Sderaadt NFSPROC_READ(readargs) = 6; 321df930be7Sderaadt 322df930be7Sderaadt void 323df930be7Sderaadt NFSPROC_WRITECACHE(void) = 7; 324df930be7Sderaadt 325df930be7Sderaadt attrstat 326df930be7Sderaadt NFSPROC_WRITE(writeargs) = 8; 327df930be7Sderaadt 328df930be7Sderaadt diropres 329df930be7Sderaadt NFSPROC_CREATE(createargs) = 9; 330df930be7Sderaadt 331df930be7Sderaadt nfsstat 332df930be7Sderaadt NFSPROC_REMOVE(diropargs) = 10; 333df930be7Sderaadt 334df930be7Sderaadt nfsstat 335df930be7Sderaadt NFSPROC_RENAME(renameargs) = 11; 336df930be7Sderaadt 337df930be7Sderaadt nfsstat 338df930be7Sderaadt NFSPROC_LINK(linkargs) = 12; 339df930be7Sderaadt 340df930be7Sderaadt nfsstat 341df930be7Sderaadt NFSPROC_SYMLINK(symlinkargs) = 13; 342df930be7Sderaadt 343df930be7Sderaadt diropres 344df930be7Sderaadt NFSPROC_MKDIR(createargs) = 14; 345df930be7Sderaadt 346df930be7Sderaadt nfsstat 347df930be7Sderaadt NFSPROC_RMDIR(diropargs) = 15; 348df930be7Sderaadt 349df930be7Sderaadt readdirres 350df930be7Sderaadt NFSPROC_READDIR(readdirargs) = 16; 351df930be7Sderaadt 352df930be7Sderaadt statfsres 353df930be7Sderaadt NFSPROC_STATFS(nfs_fh) = 17; 354df930be7Sderaadt } = 2; 355df930be7Sderaadt } = 100003; 356df930be7Sderaadt 357