1 /* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rick Macklem at The University of Guelph. 7 * 8 * %sccs.include.redist.c% 9 * 10 * @(#)nfsproto.h 8.1 (Berkeley) 06/10/93 11 */ 12 13 /* 14 * nfs definitions as per the version 2 specs 15 */ 16 17 /* 18 * Constants as defined in the Sun NFS Version 2 spec. 19 * "NFS: Network File System Protocol Specification" RFC1094 20 */ 21 22 #define NFS_PORT 2049 23 #define NFS_PROG 100003 24 #define NFS_VER2 2 25 #define NFS_MAXDGRAMDATA 8192 26 #define NFS_MAXDATA 32768 27 #define NFS_MAXPATHLEN 1024 28 #define NFS_MAXNAMLEN 255 29 #define NFS_FHSIZE 32 30 #define NFS_MAXPKTHDR 404 31 #define NFS_MAXPACKET (NFS_MAXPKTHDR+NFS_MAXDATA) 32 #define NFS_MINPACKET 20 33 #define NFS_FABLKSIZE 512 /* Size in bytes of a block wrt fa_blocks */ 34 35 /* Stat numbers for rpc returns */ 36 #define NFS_OK 0 37 #define NFSERR_PERM 1 38 #define NFSERR_NOENT 2 39 #define NFSERR_IO 5 40 #define NFSERR_NXIO 6 41 #define NFSERR_ACCES 13 42 #define NFSERR_EXIST 17 43 #define NFSERR_NODEV 19 44 #define NFSERR_NOTDIR 20 45 #define NFSERR_ISDIR 21 46 #define NFSERR_FBIG 27 47 #define NFSERR_NOSPC 28 48 #define NFSERR_ROFS 30 49 #define NFSERR_NAMETOL 63 50 #define NFSERR_NOTEMPTY 66 51 #define NFSERR_DQUOT 69 52 #define NFSERR_STALE 70 53 #define NFSERR_WFLUSH 99 54 55 /* Sizes in bytes of various nfs rpc components */ 56 #define NFSX_FH 32 57 #define NFSX_UNSIGNED 4 58 #define NFSX_NFSFATTR 68 59 #define NFSX_NQFATTR 92 60 #define NFSX_NFSSATTR 32 61 #define NFSX_NQSATTR 44 62 #define NFSX_COOKIE 4 63 #define NFSX_NFSSTATFS 20 64 #define NFSX_NQSTATFS 28 65 #define NFSX_FATTR(isnq) ((isnq) ? NFSX_NQFATTR : NFSX_NFSFATTR) 66 #define NFSX_SATTR(isnq) ((isnq) ? NFSX_NQSATTR : NFSX_NFSSATTR) 67 #define NFSX_STATFS(isnq) ((isnq) ? NFSX_NQSTATFS : NFSX_NFSSTATFS) 68 69 /* nfs rpc procedure numbers */ 70 #define NFSPROC_NULL 0 71 #define NFSPROC_GETATTR 1 72 #define NFSPROC_SETATTR 2 73 #define NFSPROC_NOOP 3 74 #define NFSPROC_ROOT NFSPROC_NOOP /* Obsolete */ 75 #define NFSPROC_LOOKUP 4 76 #define NFSPROC_READLINK 5 77 #define NFSPROC_READ 6 78 #define NFSPROC_WRITECACHE NFSPROC_NOOP /* Obsolete */ 79 #define NFSPROC_WRITE 8 80 #define NFSPROC_CREATE 9 81 #define NFSPROC_REMOVE 10 82 #define NFSPROC_RENAME 11 83 #define NFSPROC_LINK 12 84 #define NFSPROC_SYMLINK 13 85 #define NFSPROC_MKDIR 14 86 #define NFSPROC_RMDIR 15 87 #define NFSPROC_READDIR 16 88 #define NFSPROC_STATFS 17 89 90 /* NQ nfs numbers */ 91 #define NQNFSPROC_READDIRLOOK 18 92 #define NQNFSPROC_GETLEASE 19 93 #define NQNFSPROC_VACATED 20 94 #define NQNFSPROC_EVICTED 21 95 #define NQNFSPROC_ACCESS 22 96 97 #define NFS_NPROCS 23 98 /* Conversion macros */ 99 extern int vttoif_tab[]; 100 #define vtonfs_mode(t,m) \ 101 txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \ 102 MAKEIMODE((t), (m))) 103 #define nfstov_mode(a) (fxdr_unsigned(u_short, (a))&07777) 104 #define vtonfs_type(a) txdr_unsigned(nfs_type[((long)(a))]) 105 #define nfstov_type(a) ntov_type[fxdr_unsigned(u_long,(a))&0x7] 106 107 /* File types */ 108 typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5 } nfstype; 109 110 /* Structs for common parts of the rpc's */ 111 struct nfsv2_time { 112 u_long nfs_sec; 113 u_long nfs_usec; 114 }; 115 116 struct nqnfs_time { 117 u_long nq_sec; 118 u_long nq_nsec; 119 }; 120 121 /* 122 * File attributes and setable attributes. These structures cover both 123 * NFS version 2 and the NQNFS protocol. Note that the union is only 124 * used to that one pointer can refer to both variants. These structures 125 * go out on the wire and must be densely packed, so no quad data types 126 * are used. (all fields are longs or u_longs or structures of same) 127 * NB: You can't do sizeof(struct nfsv2_fattr), you must use the 128 * NFSX_FATTR(isnq) macro. 129 */ 130 struct nfsv2_fattr { 131 u_long fa_type; 132 u_long fa_mode; 133 u_long fa_nlink; 134 u_long fa_uid; 135 u_long fa_gid; 136 union { 137 struct { 138 u_long nfsfa_size; 139 u_long nfsfa_blocksize; 140 u_long nfsfa_rdev; 141 u_long nfsfa_blocks; 142 u_long nfsfa_fsid; 143 u_long nfsfa_fileid; 144 struct nfsv2_time nfsfa_atime; 145 struct nfsv2_time nfsfa_mtime; 146 struct nfsv2_time nfsfa_ctime; 147 } fa_nfsv2; 148 struct { 149 struct { 150 u_long nqfa_qsize[2]; 151 } nqfa_size; 152 u_long nqfa_blocksize; 153 u_long nqfa_rdev; 154 struct { 155 u_long nqfa_qbytes[2]; 156 } nqfa_bytes; 157 u_long nqfa_fsid; 158 u_long nqfa_fileid; 159 struct nqnfs_time nqfa_atime; 160 struct nqnfs_time nqfa_mtime; 161 struct nqnfs_time nqfa_ctime; 162 u_long nqfa_flags; 163 u_long nqfa_gen; 164 struct { 165 u_long nqfa_qfilerev[2]; 166 } nqfa_filerev; 167 } fa_nqnfs; 168 } fa_un; 169 }; 170 171 /* and some ugly defines for accessing union components */ 172 #define fa_nfssize fa_un.fa_nfsv2.nfsfa_size 173 #define fa_nfsblocksize fa_un.fa_nfsv2.nfsfa_blocksize 174 #define fa_nfsrdev fa_un.fa_nfsv2.nfsfa_rdev 175 #define fa_nfsblocks fa_un.fa_nfsv2.nfsfa_blocks 176 #define fa_nfsfsid fa_un.fa_nfsv2.nfsfa_fsid 177 #define fa_nfsfileid fa_un.fa_nfsv2.nfsfa_fileid 178 #define fa_nfsatime fa_un.fa_nfsv2.nfsfa_atime 179 #define fa_nfsmtime fa_un.fa_nfsv2.nfsfa_mtime 180 #define fa_nfsctime fa_un.fa_nfsv2.nfsfa_ctime 181 #define fa_nqsize fa_un.fa_nqnfs.nqfa_size 182 #define fa_nqblocksize fa_un.fa_nqnfs.nqfa_blocksize 183 #define fa_nqrdev fa_un.fa_nqnfs.nqfa_rdev 184 #define fa_nqbytes fa_un.fa_nqnfs.nqfa_bytes 185 #define fa_nqfsid fa_un.fa_nqnfs.nqfa_fsid 186 #define fa_nqfileid fa_un.fa_nqnfs.nqfa_fileid 187 #define fa_nqatime fa_un.fa_nqnfs.nqfa_atime 188 #define fa_nqmtime fa_un.fa_nqnfs.nqfa_mtime 189 #define fa_nqctime fa_un.fa_nqnfs.nqfa_ctime 190 #define fa_nqflags fa_un.fa_nqnfs.nqfa_flags 191 #define fa_nqgen fa_un.fa_nqnfs.nqfa_gen 192 #define fa_nqfilerev fa_un.fa_nqnfs.nqfa_filerev 193 194 struct nfsv2_sattr { 195 u_long sa_mode; 196 u_long sa_uid; 197 u_long sa_gid; 198 union { 199 struct { 200 u_long nfssa_size; 201 struct nfsv2_time nfssa_atime; 202 struct nfsv2_time nfssa_mtime; 203 } sa_nfsv2; 204 struct { 205 struct { 206 u_long nqsa_qsize[2]; 207 } nqsa_size; 208 struct nqnfs_time nqsa_atime; 209 struct nqnfs_time nqsa_mtime; 210 u_long nqsa_flags; 211 u_long nqsa_rdev; 212 } sa_nqnfs; 213 } sa_un; 214 }; 215 216 /* and some ugly defines for accessing the unions */ 217 #define sa_nfssize sa_un.sa_nfsv2.nfssa_size 218 #define sa_nfsatime sa_un.sa_nfsv2.nfssa_atime 219 #define sa_nfsmtime sa_un.sa_nfsv2.nfssa_mtime 220 #define sa_nqsize sa_un.sa_nqnfs.nqsa_size 221 #define sa_nqatime sa_un.sa_nqnfs.nqsa_atime 222 #define sa_nqmtime sa_un.sa_nqnfs.nqsa_mtime 223 #define sa_nqflags sa_un.sa_nqnfs.nqsa_flags 224 #define sa_nqrdev sa_un.sa_nqnfs.nqsa_rdev 225 226 struct nfsv2_statfs { 227 u_long sf_tsize; 228 u_long sf_bsize; 229 u_long sf_blocks; 230 u_long sf_bfree; 231 u_long sf_bavail; 232 u_long sf_files; /* Nqnfs only */ 233 u_long sf_ffree; /* ditto */ 234 }; 235