1 /* $NetBSD: nfsv2.h,v 1.2 1995/03/06 19:10:40 mycroft Exp $ */ 2 3 /* 4 * Copyright (c) 1994 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Rick Macklem at The University of Guelph. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the University of 21 * California, Berkeley and its contributors. 22 * 4. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)nfsv2.h 7.11 (Berkeley) 9/30/92 39 */ 40 41 /* 42 * nfs definitions as per the version 2 specs 43 */ 44 45 /* 46 * Constants as defined in the Sun NFS Version 2 spec. 47 * "NFS: Network File System Protocol Specification" RFC1094 48 */ 49 50 #define NFS_PORT 2049 51 #define NFS_PROG 100003 52 #define NFS_VER2 2 53 #define NFS_MAXDGRAMDATA 8192 54 #define NFS_MAXDATA 32768 55 #define NFS_MAXPATHLEN 1024 56 #define NFS_MAXNAMLEN 255 57 #define NFS_FHSIZE 32 58 #define NFS_MAXPKTHDR 404 59 #define NFS_MAXPACKET (NFS_MAXPKTHDR+NFS_MAXDATA) 60 #define NFS_MINPACKET 20 61 #define NFS_FABLKSIZE 512 /* Size in bytes of a block wrt fa_blocks */ 62 63 /* Stat numbers for rpc returns */ 64 #define NFS_OK 0 65 #define NFSERR_PERM 1 66 #define NFSERR_NOENT 2 67 #define NFSERR_IO 5 68 #define NFSERR_NXIO 6 69 #define NFSERR_ACCES 13 70 #define NFSERR_EXIST 17 71 #define NFSERR_NODEV 19 72 #define NFSERR_NOTDIR 20 73 #define NFSERR_ISDIR 21 74 #define NFSERR_FBIG 27 75 #define NFSERR_NOSPC 28 76 #define NFSERR_ROFS 30 77 #define NFSERR_NAMETOL 63 78 #define NFSERR_NOTEMPTY 66 79 #define NFSERR_DQUOT 69 80 #define NFSERR_STALE 70 81 #define NFSERR_WFLUSH 99 82 83 /* Sizes in bytes of various nfs rpc components */ 84 #define NFSX_FH 32 85 #define NFSX_UNSIGNED 4 86 #define NFSX_NFSFATTR 68 87 #define NFSX_NQFATTR 92 88 #define NFSX_NFSSATTR 32 89 #define NFSX_NQSATTR 44 90 #define NFSX_COOKIE 4 91 #define NFSX_NFSSTATFS 20 92 #define NFSX_NQSTATFS 28 93 #define NFSX_FATTR(isnq) ((isnq) ? NFSX_NQFATTR : NFSX_NFSFATTR) 94 #define NFSX_SATTR(isnq) ((isnq) ? NFSX_NQSATTR : NFSX_NFSSATTR) 95 #define NFSX_STATFS(isnq) ((isnq) ? NFSX_NQSTATFS : NFSX_NFSSTATFS) 96 97 /* nfs rpc procedure numbers */ 98 #define NFSPROC_NULL 0 99 #define NFSPROC_GETATTR 1 100 #define NFSPROC_SETATTR 2 101 #define NFSPROC_NOOP 3 102 #define NFSPROC_ROOT NFSPROC_NOOP /* Obsolete */ 103 #define NFSPROC_LOOKUP 4 104 #define NFSPROC_READLINK 5 105 #define NFSPROC_READ 6 106 #define NFSPROC_WRITECACHE NFSPROC_NOOP /* Obsolete */ 107 #define NFSPROC_WRITE 8 108 #define NFSPROC_CREATE 9 109 #define NFSPROC_REMOVE 10 110 #define NFSPROC_RENAME 11 111 #define NFSPROC_LINK 12 112 #define NFSPROC_SYMLINK 13 113 #define NFSPROC_MKDIR 14 114 #define NFSPROC_RMDIR 15 115 #define NFSPROC_READDIR 16 116 #define NFSPROC_STATFS 17 117 118 /* NQ nfs numbers */ 119 #define NQNFSPROC_READDIRLOOK 18 120 #define NQNFSPROC_GETLEASE 19 121 #define NQNFSPROC_VACATED 20 122 #define NQNFSPROC_EVICTED 21 123 #define NQNFSPROC_ACCESS 22 124 125 #define NFS_NPROCS 23 126 /* Conversion macros */ 127 extern int vttoif_tab[]; 128 #define vtonfs_mode(t,m) \ 129 txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \ 130 MAKEIMODE((t), (m))) 131 #define nfstov_mode(a) (fxdr_unsigned(u_short, (a))&07777) 132 #define vtonfs_type(a) txdr_unsigned(nfs_type[((long)(a))]) 133 #define nfstov_type(a) ntov_type[fxdr_unsigned(u_long,(a))&0x7] 134 135 /* File types */ 136 typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5 } nfstype; 137 138 /* Structs for common parts of the rpc's */ 139 struct nfsv2_time { 140 u_long nfs_sec; 141 u_long nfs_usec; 142 }; 143 144 struct nqnfs_time { 145 u_long nq_sec; 146 u_long nq_nsec; 147 }; 148 149 /* 150 * File attributes and setable attributes. These structures cover both 151 * NFS version 2 and the NQNFS protocol. Note that the union is only 152 * used to that one pointer can refer to both variants. These structures 153 * go out on the wire and must be densely packed, so no quad data types 154 * are used. (all fields are longs or u_longs or structures of same) 155 * NB: You can't do sizeof(struct nfsv2_fattr), you must use the 156 * NFSX_FATTR(isnq) macro. 157 */ 158 struct nfsv2_fattr { 159 u_long fa_type; 160 u_long fa_mode; 161 u_long fa_nlink; 162 u_long fa_uid; 163 u_long fa_gid; 164 union { 165 struct { 166 u_long nfsfa_size; 167 u_long nfsfa_blocksize; 168 u_long nfsfa_rdev; 169 u_long nfsfa_blocks; 170 u_long nfsfa_fsid; 171 u_long nfsfa_fileid; 172 struct nfsv2_time nfsfa_atime; 173 struct nfsv2_time nfsfa_mtime; 174 struct nfsv2_time nfsfa_ctime; 175 } fa_nfsv2; 176 struct { 177 struct { 178 u_long nqfa_qsize[2]; 179 } nqfa_size; 180 u_long nqfa_blocksize; 181 u_long nqfa_rdev; 182 struct { 183 u_long nqfa_qbytes[2]; 184 } nqfa_bytes; 185 u_long nqfa_fsid; 186 u_long nqfa_fileid; 187 struct nqnfs_time nqfa_atime; 188 struct nqnfs_time nqfa_mtime; 189 struct nqnfs_time nqfa_ctime; 190 u_long nqfa_flags; 191 u_long nqfa_gen; 192 struct { 193 u_long nqfa_qfilerev[2]; 194 } nqfa_filerev; 195 } fa_nqnfs; 196 } fa_un; 197 }; 198 199 /* and some ugly defines for accessing union components */ 200 #define fa_nfssize fa_un.fa_nfsv2.nfsfa_size 201 #define fa_nfsblocksize fa_un.fa_nfsv2.nfsfa_blocksize 202 #define fa_nfsrdev fa_un.fa_nfsv2.nfsfa_rdev 203 #define fa_nfsblocks fa_un.fa_nfsv2.nfsfa_blocks 204 #define fa_nfsfsid fa_un.fa_nfsv2.nfsfa_fsid 205 #define fa_nfsfileid fa_un.fa_nfsv2.nfsfa_fileid 206 #define fa_nfsatime fa_un.fa_nfsv2.nfsfa_atime 207 #define fa_nfsmtime fa_un.fa_nfsv2.nfsfa_mtime 208 #define fa_nfsctime fa_un.fa_nfsv2.nfsfa_ctime 209 #define fa_nqsize fa_un.fa_nqnfs.nqfa_size 210 #define fa_nqblocksize fa_un.fa_nqnfs.nqfa_blocksize 211 #define fa_nqrdev fa_un.fa_nqnfs.nqfa_rdev 212 #define fa_nqbytes fa_un.fa_nqnfs.nqfa_bytes 213 #define fa_nqfsid fa_un.fa_nqnfs.nqfa_fsid 214 #define fa_nqfileid fa_un.fa_nqnfs.nqfa_fileid 215 #define fa_nqatime fa_un.fa_nqnfs.nqfa_atime 216 #define fa_nqmtime fa_un.fa_nqnfs.nqfa_mtime 217 #define fa_nqctime fa_un.fa_nqnfs.nqfa_ctime 218 #define fa_nqflags fa_un.fa_nqnfs.nqfa_flags 219 #define fa_nqgen fa_un.fa_nqnfs.nqfa_gen 220 #define fa_nqfilerev fa_un.fa_nqnfs.nqfa_filerev 221 222 struct nfsv2_sattr { 223 u_long sa_mode; 224 u_long sa_uid; 225 u_long sa_gid; 226 union { 227 struct { 228 u_long nfssa_size; 229 struct nfsv2_time nfssa_atime; 230 struct nfsv2_time nfssa_mtime; 231 } sa_nfsv2; 232 struct { 233 struct { 234 u_long nqsa_qsize[2]; 235 } nqsa_size; 236 struct nqnfs_time nqsa_atime; 237 struct nqnfs_time nqsa_mtime; 238 u_long nqsa_flags; 239 u_long nqsa_rdev; 240 } sa_nqnfs; 241 } sa_un; 242 }; 243 244 /* and some ugly defines for accessing the unions */ 245 #define sa_nfssize sa_un.sa_nfsv2.nfssa_size 246 #define sa_nfsatime sa_un.sa_nfsv2.nfssa_atime 247 #define sa_nfsmtime sa_un.sa_nfsv2.nfssa_mtime 248 #define sa_nqsize sa_un.sa_nqnfs.nqsa_size 249 #define sa_nqatime sa_un.sa_nqnfs.nqsa_atime 250 #define sa_nqmtime sa_un.sa_nqnfs.nqsa_mtime 251 #define sa_nqflags sa_un.sa_nqnfs.nqsa_flags 252 #define sa_nqrdev sa_un.sa_nqnfs.nqsa_rdev 253 254 struct nfsv2_statfs { 255 u_long sf_tsize; 256 u_long sf_bsize; 257 u_long sf_blocks; 258 u_long sf_bfree; 259 u_long sf_bavail; 260 u_long sf_files; /* Nqnfs only */ 261 u_long sf_ffree; /* ditto */ 262 }; 263