Annotation of sys/nfs/nfsproto.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: nfsproto.h,v 1.7 2007/06/06 14:13:42 thib Exp $ */
! 2: /* $NetBSD: nfsproto.h,v 1.1 1996/02/18 11:54:06 fvdl Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1989, 1993
! 6: * The Regents of the University of California. All rights reserved.
! 7: *
! 8: * This code is derived from software contributed to Berkeley by
! 9: * Rick Macklem at The University of Guelph.
! 10: *
! 11: * Redistribution and use in source and binary forms, with or without
! 12: * modification, are permitted provided that the following conditions
! 13: * are met:
! 14: * 1. Redistributions of source code must retain the above copyright
! 15: * notice, this list of conditions and the following disclaimer.
! 16: * 2. Redistributions in binary form must reproduce the above copyright
! 17: * notice, this list of conditions and the following disclaimer in the
! 18: * documentation and/or other materials provided with the distribution.
! 19: * 3. Neither the name of the University nor the names of its contributors
! 20: * may be used to endorse or promote products derived from this software
! 21: * without specific prior written permission.
! 22: *
! 23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 33: * SUCH DAMAGE.
! 34: *
! 35: * @(#)nfsproto.h 8.2 (Berkeley) 3/30/95
! 36: */
! 37:
! 38: #ifndef _NFS_NFSPROTO_H_
! 39: #define _NFS_NFSPROTO_H_
! 40:
! 41:
! 42: /*
! 43: * nfs definitions as per the Version 2 and 3 specs
! 44: */
! 45:
! 46: /*
! 47: * Constants as defined in the Sun NFS Version 2 and 3 specs.
! 48: * "NFS: Network File System Protocol Specification" RFC1094
! 49: * and in the "NFS: Network File System Version 3 Protocol
! 50: * Specification"
! 51: */
! 52:
! 53: #define NFS_PORT 2049
! 54: #define NFS_PROG 100003
! 55: #define NFS_VER2 2
! 56: #define NFS_VER3 3
! 57: #define NFS_VER4 4
! 58: #define NFS_V2MAXDATA 8192
! 59: #define NFS_MAXDGRAMDATA 32768
! 60: #define NFS_MAXDATA MAXBSIZE
! 61: #define NFS_MAXPATHLEN 1024
! 62: #define NFS_MAXNAMLEN 255
! 63: #define NFS_MAXPKTHDR 404
! 64: #define NFS_MAXPACKET (NFS_MAXPKTHDR + NFS_MAXDATA)
! 65: #define NFS_MINPACKET 20
! 66: #define NFS_FABLKSIZE 512 /* Size in bytes of a block wrt fa_blocks */
! 67:
! 68: /* Stat numbers for rpc returns (version 2 and 3) */
! 69: #define NFS_OK 0
! 70: #define NFSERR_PERM 1
! 71: #define NFSERR_NOENT 2
! 72: #define NFSERR_IO 5
! 73: #define NFSERR_NXIO 6
! 74: #define NFSERR_ACCES 13
! 75: #define NFSERR_EXIST 17
! 76: #define NFSERR_XDEV 18 /* Version 3 only */
! 77: #define NFSERR_NODEV 19
! 78: #define NFSERR_NOTDIR 20
! 79: #define NFSERR_ISDIR 21
! 80: #define NFSERR_INVAL 22 /* Version 3 only */
! 81: #define NFSERR_FBIG 27
! 82: #define NFSERR_NOSPC 28
! 83: #define NFSERR_ROFS 30
! 84: #define NFSERR_MLINK 31 /* Version 3 only */
! 85: #define NFSERR_NAMETOL 63
! 86: #define NFSERR_NOTEMPTY 66
! 87: #define NFSERR_DQUOT 69
! 88: #define NFSERR_STALE 70
! 89: #define NFSERR_REMOTE 71 /* Version 3 only */
! 90: #define NFSERR_WFLUSH 99 /* Version 2 only */
! 91: #define NFSERR_BADHANDLE 10001 /* The rest Version 3 only */
! 92: #define NFSERR_NOT_SYNC 10002
! 93: #define NFSERR_BAD_COOKIE 10003
! 94: #define NFSERR_NOTSUPP 10004
! 95: #define NFSERR_TOOSMALL 10005
! 96: #define NFSERR_SERVERFAULT 10006
! 97: #define NFSERR_BADTYPE 10007
! 98: #define NFSERR_JUKEBOX 10008
! 99: #define NFSERR_TRYLATER NFSERR_JUKEBOX
! 100: #define NFSERR_STALEWRITEVERF 30001 /* Fake return for nfs_commit() */
! 101:
! 102: #define NFSERR_RETVOID 0x20000000 /* Return void, not error */
! 103: #define NFSERR_AUTHERR 0x40000000 /* Mark an authentication error */
! 104: #define NFSERR_RETERR 0x80000000 /* Mark an error return for V3 */
! 105:
! 106: /* Sizes in bytes of various nfs rpc components */
! 107: #define NFSX_UNSIGNED 4
! 108:
! 109: /* specific to NFS Version 2 */
! 110: #define NFSX_V2FH 32
! 111: #define NFSX_V2FATTR 68
! 112: #define NFSX_V2SATTR 32
! 113: #define NFSX_V2COOKIE 4
! 114: #define NFSX_V2STATFS 20
! 115:
! 116: /* specific to NFS Version 3 */
! 117: #define NFSX_V3FH (sizeof (fhandle_t)) /* size this server uses */
! 118: #define NFSX_V3FHMAX 64 /* max. allowed by protocol */
! 119: #define NFSX_V3FATTR 84
! 120: #define NFSX_V3SATTR 60 /* max. all fields filled in */
! 121: #define NFSX_V3SRVSATTR (sizeof (struct nfsv3_sattr))
! 122: #define NFSX_V3POSTOPATTR (NFSX_V3FATTR + NFSX_UNSIGNED)
! 123: #define NFSX_V3WCCDATA (NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
! 124: #define NFSX_V3COOKIEVERF 8
! 125: #define NFSX_V3WRITEVERF 8
! 126: #define NFSX_V3CREATEVERF 8
! 127: #define NFSX_V3STATFS 52
! 128: #define NFSX_V3FSINFO 48
! 129: #define NFSX_V3PATHCONF 24
! 130:
! 131: /* variants for both versions */
! 132: #define NFSX_FH(v3) ((v3) ? (NFSX_V3FHMAX + NFSX_UNSIGNED) : \
! 133: NFSX_V2FH)
! 134: #define NFSX_SRVFH(v3) ((v3) ? NFSX_V3FH : NFSX_V2FH)
! 135: #define NFSX_FATTR(v3) ((v3) ? NFSX_V3FATTR : NFSX_V2FATTR)
! 136: #define NFSX_PREOPATTR(v3) ((v3) ? (7 * NFSX_UNSIGNED) : 0)
! 137: #define NFSX_POSTOPATTR(v3) ((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : 0)
! 138: #define NFSX_POSTOPORFATTR(v3) ((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : \
! 139: NFSX_V2FATTR)
! 140: #define NFSX_WCCDATA(v3) ((v3) ? NFSX_V3WCCDATA : 0)
! 141: #define NFSX_WCCORFATTR(v3) ((v3) ? NFSX_V3WCCDATA : NFSX_V2FATTR)
! 142: #define NFSX_SATTR(v3) ((v3) ? NFSX_V3SATTR : NFSX_V2SATTR)
! 143: #define NFSX_COOKIEVERF(v3) ((v3) ? NFSX_V3COOKIEVERF : 0)
! 144: #define NFSX_WRITEVERF(v3) ((v3) ? NFSX_V3WRITEVERF : 0)
! 145: #define NFSX_READDIR(v3) ((v3) ? (5 * NFSX_UNSIGNED) : \
! 146: (2 * NFSX_UNSIGNED))
! 147: #define NFSX_STATFS(v3) ((v3) ? NFSX_V3STATFS : NFSX_V2STATFS)
! 148:
! 149: /* nfs rpc procedure numbers (before version mapping) */
! 150: #define NFSPROC_NULL 0
! 151: #define NFSPROC_GETATTR 1
! 152: #define NFSPROC_SETATTR 2
! 153: #define NFSPROC_LOOKUP 3
! 154: #define NFSPROC_ACCESS 4
! 155: #define NFSPROC_READLINK 5
! 156: #define NFSPROC_READ 6
! 157: #define NFSPROC_WRITE 7
! 158: #define NFSPROC_CREATE 8
! 159: #define NFSPROC_MKDIR 9
! 160: #define NFSPROC_SYMLINK 10
! 161: #define NFSPROC_MKNOD 11
! 162: #define NFSPROC_REMOVE 12
! 163: #define NFSPROC_RMDIR 13
! 164: #define NFSPROC_RENAME 14
! 165: #define NFSPROC_LINK 15
! 166: #define NFSPROC_READDIR 16
! 167: #define NFSPROC_READDIRPLUS 17
! 168: #define NFSPROC_FSSTAT 18
! 169: #define NFSPROC_FSINFO 19
! 170: #define NFSPROC_PATHCONF 20
! 171: #define NFSPROC_COMMIT 21
! 172:
! 173: #define NFSPROC_NOOP 25
! 174: #define NFS_NPROCS 26
! 175:
! 176: /* Actual Version 2 procedure numbers */
! 177: #define NFSV2PROC_NULL 0
! 178: #define NFSV2PROC_GETATTR 1
! 179: #define NFSV2PROC_SETATTR 2
! 180: #define NFSV2PROC_NOOP 3
! 181: #define NFSV2PROC_ROOT NFSV2PROC_NOOP /* Obsolete */
! 182: #define NFSV2PROC_LOOKUP 4
! 183: #define NFSV2PROC_READLINK 5
! 184: #define NFSV2PROC_READ 6
! 185: #define NFSV2PROC_WRITECACHE NFSV2PROC_NOOP /* Obsolete */
! 186: #define NFSV2PROC_WRITE 8
! 187: #define NFSV2PROC_CREATE 9
! 188: #define NFSV2PROC_REMOVE 10
! 189: #define NFSV2PROC_RENAME 11
! 190: #define NFSV2PROC_LINK 12
! 191: #define NFSV2PROC_SYMLINK 13
! 192: #define NFSV2PROC_MKDIR 14
! 193: #define NFSV2PROC_RMDIR 15
! 194: #define NFSV2PROC_READDIR 16
! 195: #define NFSV2PROC_STATFS 17
! 196:
! 197: /*
! 198: * Constants used by the Version 3 protocol for various RPCs
! 199: */
! 200: #define NFSV3SATTRTIME_DONTCHANGE 0
! 201: #define NFSV3SATTRTIME_TOSERVER 1
! 202: #define NFSV3SATTRTIME_TOCLIENT 2
! 203:
! 204: #define NFSV3ACCESS_READ 0x01
! 205: #define NFSV3ACCESS_LOOKUP 0x02
! 206: #define NFSV3ACCESS_MODIFY 0x04
! 207: #define NFSV3ACCESS_EXTEND 0x08
! 208: #define NFSV3ACCESS_DELETE 0x10
! 209: #define NFSV3ACCESS_EXECUTE 0x20
! 210:
! 211: #define NFSV3WRITE_UNSTABLE 0
! 212: #define NFSV3WRITE_DATASYNC 1
! 213: #define NFSV3WRITE_FILESYNC 2
! 214:
! 215: #define NFSV3CREATE_UNCHECKED 0
! 216: #define NFSV3CREATE_GUARDED 1
! 217: #define NFSV3CREATE_EXCLUSIVE 2
! 218:
! 219: #define NFSV3FSINFO_LINK 0x01
! 220: #define NFSV3FSINFO_SYMLINK 0x02
! 221: #define NFSV3FSINFO_HOMOGENEOUS 0x08
! 222: #define NFSV3FSINFO_CANSETTIME 0x10
! 223:
! 224: /* Conversion macros */
! 225: #define vtonfsv2_mode(t,m) \
! 226: txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \
! 227: MAKEIMODE((t), (m)))
! 228: #define vtonfsv3_mode(m) txdr_unsigned((m) & 07777)
! 229: #define nfstov_mode(a) (fxdr_unsigned(u_int16_t, (a))&07777)
! 230: #define vtonfsv2_type(a) txdr_unsigned(nfsv2_type[((int32_t)(a))])
! 231: #define vtonfsv3_type(a) txdr_unsigned(nfsv3_type[((int32_t)(a))])
! 232: #define nfsv2tov_type(a) nv2tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
! 233: #define nfsv3tov_type(a) nv3tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
! 234:
! 235: /* File types */
! 236: typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5,
! 237: NFSOCK=6, NFFIFO=7 } nfstype;
! 238:
! 239: /* Structs for common parts of the rpc's */
! 240: /*
! 241: * File Handle (32 bytes for version 2), variable up to 64 for version 3.
! 242: * File Handles of up to NFS_SMALLFH in size are stored directly in the
! 243: * nfs node, whereas larger ones are malloc'd. (This never happens when
! 244: * NFS_SMALLFH is set to 64.)
! 245: * NFS_SMALLFH should be in the range of 32 to 64 and be divisible by 4.
! 246: */
! 247: #ifndef NFS_SMALLFH
! 248: #define NFS_SMALLFH 64
! 249: #endif
! 250: union nfsfh {
! 251: fhandle_t fh_generic;
! 252: u_char fh_bytes[NFS_SMALLFH];
! 253: };
! 254: typedef union nfsfh nfsfh_t;
! 255:
! 256: struct nfsv2_time {
! 257: u_int32_t nfsv2_sec;
! 258: u_int32_t nfsv2_usec;
! 259: };
! 260: typedef struct nfsv2_time nfstime2;
! 261:
! 262: struct nfsv3_time {
! 263: u_int32_t nfsv3_sec;
! 264: u_int32_t nfsv3_nsec;
! 265: };
! 266: typedef struct nfsv3_time nfstime3;
! 267:
! 268: /*
! 269: * Quads are defined as arrays of 2 longs to ensure dense packing for the
! 270: * protocol and to facilitate xdr conversion.
! 271: */
! 272: struct nfs_uquad {
! 273: u_int32_t nfsuquad[2];
! 274: };
! 275: typedef struct nfs_uquad nfsuint64;
! 276:
! 277: /*
! 278: * NFS Version 3 special file number.
! 279: */
! 280: struct nfsv3_spec {
! 281: u_int32_t specdata1;
! 282: u_int32_t specdata2;
! 283: };
! 284: typedef struct nfsv3_spec nfsv3spec;
! 285:
! 286: /*
! 287: * File attributes and setable attributes. These structures cover both
! 288: * NFS version 2 and the version 3 protocol. Note that the union is only
! 289: * used so that one pointer can refer to both variants. These structures
! 290: * go out on the wire and must be densely packed, so no quad data types
! 291: * are used. (all fields are longs or u_longs or structures of same)
! 292: * NB: You can't do sizeof(struct nfs_fattr), you must use the
! 293: * NFSX_FATTR(v3) macro.
! 294: */
! 295: struct nfs_fattr {
! 296: u_int32_t fa_type;
! 297: u_int32_t fa_mode;
! 298: u_int32_t fa_nlink;
! 299: u_int32_t fa_uid;
! 300: u_int32_t fa_gid;
! 301: union {
! 302: struct {
! 303: u_int32_t nfsv2fa_size;
! 304: u_int32_t nfsv2fa_blocksize;
! 305: u_int32_t nfsv2fa_rdev;
! 306: u_int32_t nfsv2fa_blocks;
! 307: u_int32_t nfsv2fa_fsid;
! 308: u_int32_t nfsv2fa_fileid;
! 309: nfstime2 nfsv2fa_atime;
! 310: nfstime2 nfsv2fa_mtime;
! 311: nfstime2 nfsv2fa_ctime;
! 312: } fa_nfsv2;
! 313: struct {
! 314: nfsuint64 nfsv3fa_size;
! 315: nfsuint64 nfsv3fa_used;
! 316: nfsv3spec nfsv3fa_rdev;
! 317: nfsuint64 nfsv3fa_fsid;
! 318: nfsuint64 nfsv3fa_fileid;
! 319: nfstime3 nfsv3fa_atime;
! 320: nfstime3 nfsv3fa_mtime;
! 321: nfstime3 nfsv3fa_ctime;
! 322: } fa_nfsv3;
! 323: } fa_un;
! 324: };
! 325:
! 326: /* and some ugly defines for accessing union components */
! 327: #define fa2_size fa_un.fa_nfsv2.nfsv2fa_size
! 328: #define fa2_blocksize fa_un.fa_nfsv2.nfsv2fa_blocksize
! 329: #define fa2_rdev fa_un.fa_nfsv2.nfsv2fa_rdev
! 330: #define fa2_blocks fa_un.fa_nfsv2.nfsv2fa_blocks
! 331: #define fa2_fsid fa_un.fa_nfsv2.nfsv2fa_fsid
! 332: #define fa2_fileid fa_un.fa_nfsv2.nfsv2fa_fileid
! 333: #define fa2_atime fa_un.fa_nfsv2.nfsv2fa_atime
! 334: #define fa2_mtime fa_un.fa_nfsv2.nfsv2fa_mtime
! 335: #define fa2_ctime fa_un.fa_nfsv2.nfsv2fa_ctime
! 336: #define fa3_size fa_un.fa_nfsv3.nfsv3fa_size
! 337: #define fa3_used fa_un.fa_nfsv3.nfsv3fa_used
! 338: #define fa3_rdev fa_un.fa_nfsv3.nfsv3fa_rdev
! 339: #define fa3_fsid fa_un.fa_nfsv3.nfsv3fa_fsid
! 340: #define fa3_fileid fa_un.fa_nfsv3.nfsv3fa_fileid
! 341: #define fa3_atime fa_un.fa_nfsv3.nfsv3fa_atime
! 342: #define fa3_mtime fa_un.fa_nfsv3.nfsv3fa_mtime
! 343: #define fa3_ctime fa_un.fa_nfsv3.nfsv3fa_ctime
! 344:
! 345: struct nfsv2_sattr {
! 346: u_int32_t sa_mode;
! 347: u_int32_t sa_uid;
! 348: u_int32_t sa_gid;
! 349: u_int32_t sa_size;
! 350: nfstime2 sa_atime;
! 351: nfstime2 sa_mtime;
! 352: };
! 353:
! 354: /*
! 355: * NFS Version 3 sattr structure for the new node creation case.
! 356: */
! 357: struct nfsv3_sattr {
! 358: u_int32_t sa_modetrue;
! 359: u_int32_t sa_mode;
! 360: u_int32_t sa_uidfalse;
! 361: u_int32_t sa_gidfalse;
! 362: u_int32_t sa_sizefalse;
! 363: u_int32_t sa_atimetype;
! 364: nfstime3 sa_atime;
! 365: u_int32_t sa_mtimetype;
! 366: nfstime3 sa_mtime;
! 367: };
! 368:
! 369: struct nfs_statfs {
! 370: union {
! 371: struct {
! 372: u_int32_t nfsv2sf_tsize;
! 373: u_int32_t nfsv2sf_bsize;
! 374: u_int32_t nfsv2sf_blocks;
! 375: u_int32_t nfsv2sf_bfree;
! 376: u_int32_t nfsv2sf_bavail;
! 377: } sf_nfsv2;
! 378: struct {
! 379: nfsuint64 nfsv3sf_tbytes;
! 380: nfsuint64 nfsv3sf_fbytes;
! 381: nfsuint64 nfsv3sf_abytes;
! 382: nfsuint64 nfsv3sf_tfiles;
! 383: nfsuint64 nfsv3sf_ffiles;
! 384: nfsuint64 nfsv3sf_afiles;
! 385: u_int32_t nfsv3sf_invarsec;
! 386: } sf_nfsv3;
! 387: } sf_un;
! 388: };
! 389:
! 390: #define sf_tsize sf_un.sf_nfsv2.nfsv2sf_tsize
! 391: #define sf_bsize sf_un.sf_nfsv2.nfsv2sf_bsize
! 392: #define sf_blocks sf_un.sf_nfsv2.nfsv2sf_blocks
! 393: #define sf_bfree sf_un.sf_nfsv2.nfsv2sf_bfree
! 394: #define sf_bavail sf_un.sf_nfsv2.nfsv2sf_bavail
! 395: #define sf_tbytes sf_un.sf_nfsv3.nfsv3sf_tbytes
! 396: #define sf_fbytes sf_un.sf_nfsv3.nfsv3sf_fbytes
! 397: #define sf_abytes sf_un.sf_nfsv3.nfsv3sf_abytes
! 398: #define sf_tfiles sf_un.sf_nfsv3.nfsv3sf_tfiles
! 399: #define sf_ffiles sf_un.sf_nfsv3.nfsv3sf_ffiles
! 400: #define sf_afiles sf_un.sf_nfsv3.nfsv3sf_afiles
! 401: #define sf_invarsec sf_un.sf_nfsv3.nfsv3sf_invarsec
! 402:
! 403: struct nfsv3_fsinfo {
! 404: u_int32_t fs_rtmax;
! 405: u_int32_t fs_rtpref;
! 406: u_int32_t fs_rtmult;
! 407: u_int32_t fs_wtmax;
! 408: u_int32_t fs_wtpref;
! 409: u_int32_t fs_wtmult;
! 410: u_int32_t fs_dtpref;
! 411: nfsuint64 fs_maxfilesize;
! 412: nfstime3 fs_timedelta;
! 413: u_int32_t fs_properties;
! 414: };
! 415:
! 416: struct nfsv3_pathconf {
! 417: u_int32_t pc_linkmax;
! 418: u_int32_t pc_namemax;
! 419: u_int32_t pc_notrunc;
! 420: u_int32_t pc_chownrestricted;
! 421: u_int32_t pc_caseinsensitive;
! 422: u_int32_t pc_casepreserving;
! 423: };
! 424:
! 425: #endif
CVSweb