vitastor/src/nfs/nfs.x

1381 lines
24 KiB
Plaintext

/* Based on RFC 1813 - NFS Version 3 Protocol Specification */
/*
Copyright (c) 2014, Ronnie Sahlberg
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
/*
* NFS v3 Definitions
*/
const NFS3_FHSIZE = 64; /* Maximum bytes in a V3 file handle */
const NFS3_WRITEVERFSIZE = 8;
const NFS3_CREATEVERFSIZE = 8;
const NFS3_COOKIEVERFSIZE = 8;
typedef opaque cookieverf3[NFS3_COOKIEVERFSIZE];
typedef uint64_t cookie3;
typedef opaque nfs_fh3<NFS3_FHSIZE>;
typedef string filename3<>;
struct diropargs3 {
nfs_fh3 dir;
filename3 name;
};
enum ftype3 {
NF3REG = 1,
NF3DIR = 2,
NF3BLK = 3,
NF3CHR = 4,
NF3LNK = 5,
NF3SOCK = 6,
NF3FIFO = 7
};
typedef unsigned int mode3;
typedef unsigned int uid3;
typedef unsigned int gid3;
typedef uint64_t size3;
typedef uint64_t fileid3;
struct specdata3 {
unsigned int specdata1;
unsigned int specdata2;
};
struct nfstime3 {
unsigned int seconds;
unsigned int nseconds;
};
struct fattr3 {
ftype3 type;
mode3 mode;
unsigned int nlink;
uid3 uid;
gid3 gid;
size3 size;
size3 used;
specdata3 rdev;
uint64_t fsid;
fileid3 fileid;
nfstime3 atime;
nfstime3 mtime;
nfstime3 ctime;
};
union post_op_attr switch (bool attributes_follow) {
case TRUE:
fattr3 attributes;
case FALSE:
void;
};
enum nfsstat3 {
NFS3_OK = 0,
NFS3ERR_PERM = 1,
NFS3ERR_NOENT = 2,
NFS3ERR_IO = 5,
NFS3ERR_NXIO = 6,
NFS3ERR_ACCES = 13,
NFS3ERR_EXIST = 17,
NFS3ERR_XDEV = 18,
NFS3ERR_NODEV = 19,
NFS3ERR_NOTDIR = 20,
NFS3ERR_ISDIR = 21,
NFS3ERR_INVAL = 22,
NFS3ERR_FBIG = 27,
NFS3ERR_NOSPC = 28,
NFS3ERR_ROFS = 30,
NFS3ERR_MLINK = 31,
NFS3ERR_NAMETOOLONG = 63,
NFS3ERR_NOTEMPTY = 66,
NFS3ERR_DQUOT = 69,
NFS3ERR_STALE = 70,
NFS3ERR_REMOTE = 71,
NFS3ERR_BADHANDLE = 10001,
NFS3ERR_NOT_SYNC = 10002,
NFS3ERR_BAD_COOKIE = 10003,
NFS3ERR_NOTSUPP = 10004,
NFS3ERR_TOOSMALL = 10005,
NFS3ERR_SERVERFAULT = 10006,
NFS3ERR_BADTYPE = 10007,
NFS3ERR_JUKEBOX = 10008
};
enum stable_how {
UNSTABLE = 0,
DATA_SYNC = 1,
FILE_SYNC = 2
};
typedef uint64_t offset3;
typedef unsigned int count3;
struct wcc_attr {
size3 size;
nfstime3 mtime;
nfstime3 ctime;
};
union pre_op_attr switch (bool attributes_follow) {
case TRUE:
wcc_attr attributes;
case FALSE:
void;
};
struct wcc_data {
pre_op_attr before;
post_op_attr after;
};
struct WRITE3args {
nfs_fh3 file;
offset3 offset;
count3 count;
stable_how stable;
opaque data<>;
};
typedef opaque writeverf3[NFS3_WRITEVERFSIZE];
struct WRITE3resok {
wcc_data file_wcc;
count3 count;
stable_how committed;
writeverf3 verf;
};
struct WRITE3resfail {
wcc_data file_wcc;
};
union WRITE3res switch (nfsstat3 status) {
case NFS3_OK:
WRITE3resok resok;
default:
WRITE3resfail resfail;
};
struct LOOKUP3args {
diropargs3 what;
};
struct LOOKUP3resok {
nfs_fh3 object;
post_op_attr obj_attributes;
post_op_attr dir_attributes;
};
struct LOOKUP3resfail {
post_op_attr dir_attributes;
};
union LOOKUP3res switch (nfsstat3 status) {
case NFS3_OK:
LOOKUP3resok resok;
default:
LOOKUP3resfail resfail;
};
struct COMMIT3args {
nfs_fh3 file;
offset3 offset;
count3 count;
};
struct COMMIT3resok {
wcc_data file_wcc;
writeverf3 verf;
};
struct COMMIT3resfail {
wcc_data file_wcc;
};
union COMMIT3res switch (nfsstat3 status) {
case NFS3_OK:
COMMIT3resok resok;
default:
COMMIT3resfail resfail;
};
const ACCESS3_READ = 0x0001;
const ACCESS3_LOOKUP = 0x0002;
const ACCESS3_MODIFY = 0x0004;
const ACCESS3_EXTEND = 0x0008;
const ACCESS3_DELETE = 0x0010;
const ACCESS3_EXECUTE = 0x0020;
struct ACCESS3args {
nfs_fh3 object;
unsigned int access;
};
struct ACCESS3resok {
post_op_attr obj_attributes;
unsigned int access;
};
struct ACCESS3resfail {
post_op_attr obj_attributes;
};
union ACCESS3res switch (nfsstat3 status) {
case NFS3_OK:
ACCESS3resok resok;
default:
ACCESS3resfail resfail;
};
struct GETATTR3args {
nfs_fh3 object;
};
struct GETATTR3resok {
fattr3 obj_attributes;
};
union GETATTR3res switch (nfsstat3 status) {
case NFS3_OK:
GETATTR3resok resok;
default:
void;
};
enum time_how {
DONT_CHANGE = 0,
SET_TO_SERVER_TIME = 1,
SET_TO_CLIENT_TIME = 2
};
union set_mode3 switch (bool set_it) {
case TRUE:
mode3 mode;
default:
void;
};
union set_uid3 switch (bool set_it) {
case TRUE:
uid3 uid;
default:
void;
};
union set_gid3 switch (bool set_it) {
case TRUE:
gid3 gid;
default:
void;
};
union set_size3 switch (bool set_it) {
case TRUE:
size3 size;
default:
void;
};
union set_atime switch (time_how set_it) {
case SET_TO_CLIENT_TIME:
nfstime3 atime;
default:
void;
};
union set_mtime switch (time_how set_it) {
case SET_TO_CLIENT_TIME:
nfstime3 mtime;
default:
void;
};
struct sattr3 {
set_mode3 mode;
set_uid3 uid;
set_gid3 gid;
set_size3 size;
set_atime atime;
set_mtime mtime;
};
enum createmode3 {
NFS_UNCHECKED = 0,
NFS_GUARDED = 1,
NFS_EXCLUSIVE = 2
};
typedef opaque createverf3[NFS3_CREATEVERFSIZE];
union createhow3 switch (createmode3 mode) {
case NFS_UNCHECKED:
sattr3 obj_attributes;
case NFS_GUARDED:
sattr3 g_obj_attributes;
case NFS_EXCLUSIVE:
createverf3 verf;
};
struct CREATE3args {
diropargs3 where;
createhow3 how;
};
union post_op_fh3 switch (bool handle_follows) {
case TRUE:
nfs_fh3 handle;
case FALSE:
void;
};
struct CREATE3resok {
post_op_fh3 obj;
post_op_attr obj_attributes;
wcc_data dir_wcc;
};
struct CREATE3resfail {
wcc_data dir_wcc;
};
union CREATE3res switch (nfsstat3 status) {
case NFS3_OK:
CREATE3resok resok;
default:
CREATE3resfail resfail;
};
struct REMOVE3args {
diropargs3 object;
};
struct REMOVE3resok {
wcc_data dir_wcc;
};
struct REMOVE3resfail {
wcc_data dir_wcc;
};
union REMOVE3res switch (nfsstat3 status) {
case NFS3_OK:
REMOVE3resok resok;
default:
REMOVE3resfail resfail;
};
struct READ3args {
nfs_fh3 file;
offset3 offset;
count3 count;
};
struct READ3resok {
post_op_attr file_attributes;
count3 count;
bool eof;
opaque data<>;
};
struct READ3resfail {
post_op_attr file_attributes;
};
union READ3res switch (nfsstat3 status) {
case NFS3_OK:
READ3resok resok;
default:
READ3resfail resfail;
};
const FSF3_LINK = 0x0001;
const FSF3_SYMLINK = 0x0002;
const FSF3_HOMOGENEOUS = 0x0008;
const FSF3_CANSETTIME = 0x0010;
struct FSINFO3args {
nfs_fh3 fsroot;
};
struct FSINFO3resok {
post_op_attr obj_attributes;
unsigned int rtmax;
unsigned int rtpref;
unsigned int rtmult;
unsigned int wtmax;
unsigned int wtpref;
unsigned int wtmult;
unsigned int dtpref;
size3 maxfilesize;
nfstime3 time_delta;
unsigned int properties;
};
struct FSINFO3resfail {
post_op_attr obj_attributes;
};
union FSINFO3res switch (nfsstat3 status) {
case NFS3_OK:
FSINFO3resok resok;
default:
FSINFO3resfail resfail;
};
struct FSSTAT3args {
nfs_fh3 fsroot;
};
struct FSSTAT3resok {
post_op_attr obj_attributes;
size3 tbytes;
size3 fbytes;
size3 abytes;
size3 tfiles;
size3 ffiles;
size3 afiles;
unsigned int invarsec;
};
struct FSSTAT3resfail {
post_op_attr obj_attributes;
};
union FSSTAT3res switch (nfsstat3 status) {
case NFS3_OK:
FSSTAT3resok resok;
default:
FSSTAT3resfail resfail;
};
struct PATHCONF3args {
nfs_fh3 object;
};
struct PATHCONF3resok {
post_op_attr obj_attributes;
unsigned int linkmax;
unsigned int name_max;
bool no_trunc;
bool chown_restricted;
bool case_insensitive;
bool case_preserving;
};
struct PATHCONF3resfail {
post_op_attr obj_attributes;
};
union PATHCONF3res switch (nfsstat3 status) {
case NFS3_OK:
PATHCONF3resok resok;
default:
PATHCONF3resfail resfail;
};
typedef string nfspath3<>;
struct symlinkdata3 {
sattr3 symlink_attributes;
nfspath3 symlink_data;
};
struct SYMLINK3args {
diropargs3 where;
symlinkdata3 symlink;
};
struct SYMLINK3resok {
post_op_fh3 obj;
post_op_attr obj_attributes;
wcc_data dir_wcc;
};
struct SYMLINK3resfail {
wcc_data dir_wcc;
};
union SYMLINK3res switch (nfsstat3 status) {
case NFS3_OK:
SYMLINK3resok resok;
default:
SYMLINK3resfail resfail;
};
struct READLINK3args {
nfs_fh3 symlink;
};
struct READLINK3resok {
post_op_attr symlink_attributes;
nfspath3 data;
};
struct READLINK3resfail {
post_op_attr symlink_attributes;
};
union READLINK3res switch (nfsstat3 status) {
case NFS3_OK:
READLINK3resok resok;
default:
READLINK3resfail resfail;
};
struct devicedata3 {
sattr3 dev_attributes;
specdata3 spec;
};
union mknoddata3 switch (ftype3 type) {
case NF3CHR:
devicedata3 chr_device;
case NF3BLK:
devicedata3 blk_device;
case NF3SOCK:
sattr3 sock_attributes;
case NF3FIFO:
sattr3 pipe_attributes;
default:
void;
};
struct MKNOD3args {
diropargs3 where;
mknoddata3 what;
};
struct MKNOD3resok {
post_op_fh3 obj;
post_op_attr obj_attributes;
wcc_data dir_wcc;
};
struct MKNOD3resfail {
wcc_data dir_wcc;
};
union MKNOD3res switch (nfsstat3 status) {
case NFS3_OK:
MKNOD3resok resok;
default:
MKNOD3resfail resfail;
};
struct MKDIR3args {
diropargs3 where;
sattr3 attributes;
};
struct MKDIR3resok {
post_op_fh3 obj;
post_op_attr obj_attributes;
wcc_data dir_wcc;
};
struct MKDIR3resfail {
wcc_data dir_wcc;
};
union MKDIR3res switch (nfsstat3 status) {
case NFS3_OK:
MKDIR3resok resok;
default:
MKDIR3resfail resfail;
};
struct RMDIR3args {
diropargs3 object;
};
struct RMDIR3resok {
wcc_data dir_wcc;
};
struct RMDIR3resfail {
wcc_data dir_wcc;
};
union RMDIR3res switch (nfsstat3 status) {
case NFS3_OK:
RMDIR3resok resok;
default:
RMDIR3resfail resfail;
};
struct RENAME3args {
diropargs3 from;
diropargs3 to;
};
struct RENAME3resok {
wcc_data fromdir_wcc;
wcc_data todir_wcc;
};
struct RENAME3resfail {
wcc_data fromdir_wcc;
wcc_data todir_wcc;
};
union RENAME3res switch (nfsstat3 status) {
case NFS3_OK:
RENAME3resok resok;
default:
RENAME3resfail resfail;
};
struct READDIRPLUS3args {
nfs_fh3 dir;
cookie3 cookie;
cookieverf3 cookieverf;
count3 dircount;
count3 maxcount;
};
struct entryplus3 {
fileid3 fileid;
filename3 name;
cookie3 cookie;
post_op_attr name_attributes;
post_op_fh3 name_handle;
entryplus3 *nextentry;
};
struct dirlistplus3 {
entryplus3 *entries;
bool eof;
};
struct READDIRPLUS3resok {
post_op_attr dir_attributes;
cookieverf3 cookieverf;
dirlistplus3 reply;
};
struct READDIRPLUS3resfail {
post_op_attr dir_attributes;
};
union READDIRPLUS3res switch (nfsstat3 status) {
case NFS3_OK:
READDIRPLUS3resok resok;
default:
READDIRPLUS3resfail resfail;
};
struct READDIR3args {
nfs_fh3 dir;
cookie3 cookie;
cookieverf3 cookieverf;
count3 count;
};
struct entry3 {
fileid3 fileid;
filename3 name;
cookie3 cookie;
entry3 *nextentry;
};
struct dirlist3 {
entry3 *entries;
bool eof;
};
struct READDIR3resok {
post_op_attr dir_attributes;
cookieverf3 cookieverf;
dirlist3 reply;
};
struct READDIR3resfail {
post_op_attr dir_attributes;
};
union READDIR3res switch (nfsstat3 status) {
case NFS3_OK:
READDIR3resok resok;
default:
READDIR3resfail resfail;
};
struct LINK3args {
nfs_fh3 file;
diropargs3 link;
};
struct LINK3resok {
post_op_attr file_attributes;
wcc_data linkdir_wcc;
};
struct LINK3resfail {
post_op_attr file_attributes;
wcc_data linkdir_wcc;
};
union LINK3res switch (nfsstat3 status) {
case NFS3_OK:
LINK3resok resok;
default:
LINK3resfail resfail;
};
union sattrguard3 switch (bool check) {
case TRUE:
nfstime3 obj_ctime;
case FALSE:
void;
};
struct SETATTR3args {
nfs_fh3 object;
sattr3 new_attributes;
sattrguard3 guard;
};
struct SETATTR3resok {
wcc_data obj_wcc;
};
struct SETATTR3resfail {
wcc_data obj_wcc;
};
union SETATTR3res switch (nfsstat3 status) {
case NFS3_OK:
SETATTR3resok resok;
default:
SETATTR3resfail resfail;
};
/*
* NFS v2 Definitions
* We share many definitions from v3
*/
const FHSIZE2 = 32;
typedef opaque fhandle2[FHSIZE2];
enum ftype2 {
NF2NON = 0,
NF2REG = 1,
NF2DIR = 2,
NF2BLK = 3,
NF2CHR = 4,
NF2LNK = 5
};
struct fattr2 {
ftype2 type;
unsigned int mode;
unsigned int nlink;
unsigned int uid;
unsigned int gid;
unsigned int size;
unsigned int blocksize;
unsigned int rdev;
unsigned int blocks;
unsigned int fsid;
unsigned int fileid;
nfstime3 atime;
nfstime3 mtime;
nfstime3 ctime;
};
struct sattr2 {
unsigned int mode;
unsigned int uid;
unsigned int gid;
unsigned int size;
nfstime3 atime;
nfstime3 mtime;
};
const MAXNAMLEN2 = 255;
typedef string filename2<MAXNAMLEN2>;
const MAXPATHLEN2 = 1024;
typedef string path2<MAXPATHLEN2>;
const NFSMAXDATA2 = 8192;
typedef opaque nfsdata2<NFSMAXDATA2>;
const NFSCOOKIESIZE2 = 4;
typedef opaque nfscookie2[NFSCOOKIESIZE2];
struct entry2 {
unsigned int fileid;
filename2 name;
nfscookie2 cookie;
entry2 *nextentry;
};
struct diropargs2 {
fhandle2 dir;
filename2 name;
};
struct GETATTR2args {
fhandle2 fhandle;
};
struct GETATTR2resok {
fattr2 attributes;
};
union GETATTR2res switch (nfsstat3 status) {
case NFS3_OK:
GETATTR2resok resok;
default:
void;
};
struct SETATTR2args {
fhandle2 fhandle;
sattr2 attributes;
};
struct SETATTR2resok {
fattr2 attributes;
};
union SETATTR2res switch (nfsstat3 status) {
case NFS3_OK:
SETATTR2resok resok;
default:
void;
};
struct LOOKUP2args {
diropargs2 what;
};
struct LOOKUP2resok {
fhandle2 file;
fattr2 attributes;
};
union LOOKUP2res switch (nfsstat3 status) {
case NFS3_OK:
LOOKUP2resok resok;
default:
void;
};
struct READLINK2args {
fhandle2 file;
};
struct READLINK2resok {
path2 data;
};
union READLINK2res switch (nfsstat3 status) {
case NFS3_OK:
READLINK2resok resok;
default:
void;
};
struct READ2args {
fhandle2 file;
unsigned int offset;
unsigned int count;
unsigned int totalcount;
};
struct READ2resok {
fattr2 attributes;
nfsdata2 data;
};
union READ2res switch (nfsstat3 status) {
case NFS3_OK:
READ2resok resok;
default:
void;
};
struct WRITE2args {
fhandle2 file;
unsigned int beginoffset;
unsigned int offset;
unsigned int totalcount;
nfsdata2 data;
};
struct WRITE2resok {
fattr2 attributes;
};
union WRITE2res switch (nfsstat3 status) {
case NFS3_OK:
WRITE2resok resok;
default:
void;
};
struct CREATE2args {
diropargs2 where;
sattr2 attributes;
};
struct CREATE2resok {
fhandle2 file;
fattr2 attributes;
};
union CREATE2res switch (nfsstat3 status) {
case NFS3_OK:
CREATE2resok resok;
default:
void;
};
struct REMOVE2args {
diropargs2 what;
};
struct REMOVE2res {
nfsstat3 status;
};
struct RENAME2args {
diropargs2 from;
diropargs2 to;
};
struct RENAME2res {
nfsstat3 status;
};
struct LINK2args {
fhandle2 from;
diropargs2 to;
};
struct LINK2res {
nfsstat3 status;
};
struct SYMLINK2args {
diropargs2 from;
path2 to;
sattr2 attributes;
};
struct SYMLINK2res {
nfsstat3 status;
};
struct MKDIR2args {
diropargs2 where;
sattr2 attributes;
};
struct MKDIR2resok {
fhandle2 file;
fattr2 attributes;
};
union MKDIR2res switch (nfsstat3 status) {
case NFS3_OK:
MKDIR2resok resok;
default:
void;
};
struct RMDIR2args {
diropargs2 what;
};
struct RMDIR2res {
nfsstat3 status;
};
struct READDIR2args {
fhandle2 dir;
nfscookie2 cookie;
unsigned int count;
};
struct READDIR2resok {
entry2 *entries;
bool eof;
};
union READDIR2res switch (nfsstat3 status) {
case NFS3_OK:
READDIR2resok resok;
default:
void;
};
struct STATFS2args {
fhandle2 dir;
};
struct STATFS2resok {
unsigned int tsize;
unsigned int bsize;
unsigned int blocks;
unsigned int bfree;
unsigned int bavail;
};
union STATFS2res switch (nfsstat3 status) {
case NFS3_OK:
STATFS2resok resok;
default:
void;
};
program NFS_PROGRAM {
version NFS_V2 {
void
NFS2_NULL(void) = 0;
GETATTR2res
NFS2_GETATTR(GETATTR2args) = 1;
SETATTR2res
NFS2_SETATTR(SETATTR2args) = 2;
LOOKUP2res
NFS2_LOOKUP(LOOKUP2args) = 4;
READLINK2res
NFS2_READLINK(READLINK2args) = 5;
READ2res
NFS2_READ(READ2args) = 6;
WRITE2res
NFS2_WRITE(WRITE2args) = 8;
CREATE2res
NFS2_CREATE(CREATE2args) = 9;
REMOVE2res
NFS2_REMOVE(REMOVE2args) = 10;
RENAME2res
NFS2_RENAME(RENAME2args) = 11;
LINK2res
NFS2_LINK(LINK2args) = 12;
SYMLINK2res
NFS2_SYMLINK(SYMLINK2args) = 13;
MKDIR2res
NFS2_MKDIR(MKDIR2args) = 14;
RMDIR2res
NFS2_RMDIR(RMDIR2args) = 15;
READDIR2res
NFS2_READDIR(READDIR2args) = 16;
STATFS2res
NFS2_STATFS(STATFS2args) = 17;
} = 2;
version NFS_V3 {
void
NFS3_NULL(void) = 0;
GETATTR3res
NFS3_GETATTR(GETATTR3args) = 1;
SETATTR3res
NFS3_SETATTR(SETATTR3args) = 2;
LOOKUP3res
NFS3_LOOKUP(LOOKUP3args) = 3;
ACCESS3res
NFS3_ACCESS(ACCESS3args) = 4;
READLINK3res
NFS3_READLINK(READLINK3args) = 5;
READ3res
NFS3_READ(READ3args) = 6;
WRITE3res
NFS3_WRITE(WRITE3args) = 7;
CREATE3res
NFS3_CREATE(CREATE3args) = 8;
MKDIR3res
NFS3_MKDIR(MKDIR3args) = 9;
SYMLINK3res
NFS3_SYMLINK(SYMLINK3args) = 10;
MKNOD3res
NFS3_MKNOD(MKNOD3args) = 11;
REMOVE3res
NFS3_REMOVE(REMOVE3args) = 12;
RMDIR3res
NFS3_RMDIR(RMDIR3args) = 13;
RENAME3res
NFS3_RENAME(RENAME3args) = 14;
LINK3res
NFS3_LINK(LINK3args) = 15;
READDIR3res
NFS3_READDIR(READDIR3args) = 16;
READDIRPLUS3res
NFS3_READDIRPLUS(READDIRPLUS3args) = 17;
FSSTAT3res
NFS3_FSSTAT(FSSTAT3args) = 18;
FSINFO3res
NFS3_FSINFO(FSINFO3args) = 19;
PATHCONF3res
NFS3_PATHCONF(PATHCONF3args) = 20;
COMMIT3res
NFS3_COMMIT(COMMIT3args) = 21;
} = 3;
} = 100003;
/* NFS ACL definitions based on wireshark souces and network traces */
/* NFSACL interface. Uses same port/process as NFS */
enum nfsacl_type {
NFSACL_TYPE_USER_OBJ = 0x0001,
NFSACL_TYPE_USER = 0x0002,
NFSACL_TYPE_GROUP_OBJ = 0x0004,
NFSACL_TYPE_GROUP = 0x0008,
NFSACL_TYPE_CLASS_OBJ = 0x0010,
NFSACL_TYPE_CLASS = 0x0020,
NFSACL_TYPE_DEFAULT = 0x1000,
NFSACL_TYPE_DEFAULT_USER_OBJ = 0x1001,
NFSACL_TYPE_DEFAULT_USER = 0x1002,
NFSACL_TYPE_DEFAULT_GROUP_OBJ = 0x1004,
NFSACL_TYPE_DEFAULT_GROUP = 0x1008,
NFSACL_TYPE_DEFAULT_CLASS_OBJ = 0x1010,
NFSACL_TYPE_DEFAULT_OTHER_OBJ = 0x1020
};
const NFSACL_PERM_READ = 0x04;
const NFSACL_PERM_WRITE = 0x02;
const NFSACL_PERM_EXEC = 0x01;
struct nfsacl_ace {
enum nfsacl_type type;
unsigned int id;
unsigned int perm;
};
const NFSACL_MASK_ACL_ENTRY = 0x0001;
const NFSACL_MASK_ACL_COUNT = 0x0002;
const NFSACL_MASK_ACL_DEFAULT_ENTRY = 0x0004;
const NFSACL_MASK_ACL_DEFAULT_COUNT = 0x0008;
struct GETACL3args {
nfs_fh3 dir;
unsigned int mask;
};
struct GETACL3resok {
post_op_attr attr;
unsigned int mask;
unsigned int ace_count;
struct nfsacl_ace ace<>;
unsigned int default_ace_count;
struct nfsacl_ace default_ace<>;
};
union GETACL3res switch (nfsstat3 status) {
case NFS3_OK:
GETACL3resok resok;
default:
void;
};
struct SETACL3args {
nfs_fh3 dir;
unsigned int mask;
unsigned int ace_count;
struct nfsacl_ace ace<>;
unsigned int default_ace_count;
struct nfsacl_ace default_ace<>;
};
struct SETACL3resok {
post_op_attr attr;
};
union SETACL3res switch (nfsstat3 status) {
case NFS3_OK:
SETACL3resok resok;
default:
void;
};
program NFSACL_PROGRAM {
version NFSACL_V3 {
void
NFSACL3_NULL(void) = 0;
GETACL3res
NFSACL3_GETACL(GETACL3args) = 1;
SETACL3res
NFSACL3_SETACL(SETACL3args) = 2;
} = 3;
} = 100227;
/* NFS MOUNT definitions */
const MNTPATHLEN = 1024; /* Maximum bytes in a path name */
const MNTNAMLEN = 255; /* Maximum bytes in a name */
typedef string nfs_dirpath<MNTPATHLEN>;
typedef string nfs_name<MNTNAMLEN>;
enum nfs_mountstat3 {
MNT3_OK = 0, /* no error */
MNT3ERR_PERM = 1, /* Not owner */
MNT3ERR_NOENT = 2, /* No such file or directory */
MNT3ERR_IO = 5, /* I/O error */
MNT3ERR_ACCES = 13, /* Permission denied */
MNT3ERR_NOTDIR = 20, /* Not a directory */
MNT3ERR_INVAL = 22, /* Invalid argument */
MNT3ERR_NAMETOOLONG = 63, /* Filename too long */
MNT3ERR_NOTSUPP = 10004, /* Operation not supported */
MNT3ERR_SERVERFAULT = 10006 /* A failure on the server */
};
typedef struct nfs_mountbody *nfs_mountlist;
struct nfs_mountbody {
nfs_name ml_hostname;
nfs_dirpath ml_directory;
nfs_mountlist ml_next;
};
typedef struct nfs_groupnode *nfs_groups;
struct nfs_groupnode {
nfs_name gr_name;
nfs_groups gr_next;
};
typedef struct nfs_exportnode *nfs_exports;
struct nfs_exportnode {
nfs_dirpath ex_dir;
nfs_groups ex_groups;
nfs_exports ex_next;
};
struct nfs_mountres3_ok {
nfs_fh3 fhandle;
u_int auth_flavors<>;
};
union nfs_mountres3 switch (nfs_mountstat3 fhs_status) {
case MNT3_OK:
nfs_mountres3_ok mountinfo;
default:
void;
};
enum nfs_mountstat1 {
MNT1_OK = 0, /* no error */
MNT1ERR_PERM = 1, /* Not owner */
MNT1ERR_NOENT = 2, /* No such file or directory */
MNT1ERR_IO = 5, /* I/O error */
MNT1ERR_ACCES = 13, /* Permission denied */
MNT1ERR_NOTDIR = 20, /* Not a directory */
MNT1ERR_INVAL = 22, /* Invalid argument */
MNT1ERR_NAMETOOLONG = 63, /* Filename too long */
MNT1ERR_NOTSUPP = 10004, /* Operation not supported */
MNT1ERR_SERVERFAULT = 10006 /* A failure on the server */
};
const FHSIZE = 32;
typedef opaque nfs_fhandle1[FHSIZE];
struct nfs_mountres1_ok {
nfs_fhandle1 fhandle;
};
union nfs_mountres1 switch (nfs_mountstat1 fhs_status) {
case MNT1_OK:
nfs_mountres1_ok mountinfo;
default:
void;
};
program MOUNT_PROGRAM {
version MOUNT_V1 {
void MOUNT1_NULL(void) = 0;
nfs_mountres1 MOUNT1_MNT(nfs_dirpath) = 1;
nfs_mountlist MOUNT1_DUMP(void) = 2;
void MOUNT1_UMNT(nfs_dirpath) = 3;
void MOUNT1_UMNTALL(void) = 4;
nfs_exports MOUNT1_EXPORT(void) = 5;
} = 1;
version MOUNT_V3 {
void MOUNT3_NULL(void) = 0;
nfs_mountres3 MOUNT3_MNT(nfs_dirpath) = 1;
nfs_mountlist MOUNT3_DUMP(void) = 2;
void MOUNT3_UMNT(nfs_dirpath) = 3;
void MOUNT3_UMNTALL(void) = 4;
nfs_exports MOUNT3_EXPORT(void) = 5;
} = 3;
} = 100005;