1/*
2 * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
29/*
30 * Copyright (c) 1989, 1993
31 *	The Regents of the University of California.  All rights reserved.
32 *
33 * This code is derived from software contributed to Berkeley by
34 * Rick Macklem at The University of Guelph.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 *    notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 *    notice, this list of conditions and the following disclaimer in the
43 *    documentation and/or other materials provided with the distribution.
44 * 3. All advertising materials mentioning features or use of this software
45 *    must display the following acknowledgement:
46 *	This product includes software developed by the University of
47 *	California, Berkeley and its contributors.
48 * 4. Neither the name of the University nor the names of its contributors
49 *    may be used to endorse or promote products derived from this software
50 *    without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 *
64 *	@(#)nfsproto.h	8.2 (Berkeley) 3/30/95
65 * FreeBSD-Id: nfsproto.h,v 1.3 1997/02/22 09:42:50 peter Exp $
66 */
67
68#ifndef _NFS_NFSPROTO_H_
69#define _NFS_NFSPROTO_H_
70
71#include <sys/appleapiopts.h>
72
73#ifdef __APPLE_API_PRIVATE
74
75/*
76 * NFS definitions per the various NFS protocol specs:
77 * Version 2 (RFC 1094), Version 3 (RFC 1813), and Version 4 (RFC 3530)
78 * and various protocol-related implementation definitions.
79 */
80
81/* Only define these if nfs_prot.h hasn't been included */
82#ifndef NFS_PROGRAM
83
84#define NFS_PORT	2049
85#define	NFS_PROG	100003
86#define NFS_VER2	2
87#define	NFS_VER3	3
88#define	NFS_VER4	4
89#define NFS_V2MAXDATA	8192
90#define	NFS_MAXDGRAMDATA 16384
91#define	NFS_PREFDGRAMDATA 8192
92#define	NFS_MAXDATA	(64*1024) // XXX not ready for >64K
93#define	NFS_MAXPATHLEN	1024
94#define	NFS_MAXNAMLEN	255
95#define	NFS_MAXPKTHDR	404
96#define NFS_MAXPACKET	(NFS_MAXPKTHDR + NFS_MAXDATA)
97#define	NFS_MINPACKET	20
98#define	NFS_UDPSOCKBUF	(224*1024)
99#define	NFS_FABLKSIZE	512	/* Size in bytes of a block wrt fa_blocks */
100
101/* Stat numbers for NFS RPC returns */
102#define NFS_OK				0
103#define NFSERR_PERM			1
104#define NFSERR_NOENT			2
105#define NFSERR_IO			5
106#define NFSERR_NXIO			6
107#define NFSERR_ACCES			13
108#define NFSERR_EXIST			17
109#define NFSERR_XDEV			18	/* Version 3 only */
110#define NFSERR_NODEV			19
111#define NFSERR_NOTDIR			20
112#define NFSERR_ISDIR			21
113#define NFSERR_INVAL			22	/* Version 3 only */
114#define NFSERR_FBIG			27
115#define NFSERR_NOSPC			28
116#define NFSERR_ROFS			30
117#define NFSERR_MLINK			31	/* Version 3 only */
118#define NFSERR_NAMETOL			63
119#define NFSERR_NOTEMPTY			66
120#define NFSERR_DQUOT			69
121#define NFSERR_STALE			70
122#define NFSERR_REMOTE			71	/* Version 3 only */
123#define NFSERR_WFLUSH			99	/* Version 2 only */
124#define NFSERR_BADHANDLE		10001	/* The rest Version 3 only */
125#define NFSERR_NOT_SYNC			10002
126#define NFSERR_BAD_COOKIE		10003
127#define NFSERR_NOTSUPP			10004
128#define NFSERR_TOOSMALL			10005
129#define NFSERR_SERVERFAULT		10006
130#define NFSERR_BADTYPE			10007
131#define NFSERR_JUKEBOX			10008
132#define NFSERR_TRYLATER			NFSERR_JUKEBOX
133#define NFSERR_DELAY			NFSERR_JUKEBOX
134#define NFSERR_SAME			10009	/* The rest Version 4 only */
135#define NFSERR_DENIED			10010
136#define NFSERR_EXPIRED			10011
137#define NFSERR_LOCKED			10012
138#define NFSERR_GRACE			10013
139#define NFSERR_FHEXPIRED		10014
140#define NFSERR_SHARE_DENIED		10015
141#define NFSERR_WRONGSEC			10016
142#define NFSERR_CLID_INUSE		10017
143#define NFSERR_RESOURCE			10018
144#define NFSERR_MOVED			10019
145#define NFSERR_NOFILEHANDLE		10020
146#define NFSERR_MINOR_VERS_MISMATCH	10021
147#define NFSERR_STALE_CLIENTID		10022
148#define NFSERR_STALE_STATEID		10023
149#define NFSERR_OLD_STATEID		10024
150#define NFSERR_BAD_STATEID		10025
151#define NFSERR_BAD_SEQID		10026
152#define NFSERR_NOT_SAME			10027
153#define NFSERR_LOCK_RANGE		10028
154#define NFSERR_SYMLINK			10029
155#define NFSERR_RESTOREFH		10030
156#define NFSERR_LEASE_MOVED		10031
157#define NFSERR_ATTRNOTSUPP		10032
158#define NFSERR_NO_GRACE			10033
159#define NFSERR_RECLAIM_BAD		10034
160#define NFSERR_RECLAIM_CONFLICT		10035
161#define NFSERR_BADXDR			10036
162#define NFSERR_LOCKS_HELD		10037
163#define NFSERR_OPENMODE			10038
164#define NFSERR_BADOWNER			10039
165#define NFSERR_BADCHAR			10040
166#define NFSERR_BADNAME			10041
167#define NFSERR_BAD_RANGE		10042
168#define NFSERR_LOCK_NOTSUPP		10043
169#define NFSERR_OP_ILLEGAL		10044
170#define NFSERR_DEADLOCK			10045
171#define NFSERR_FILE_OPEN		10046
172#define NFSERR_ADMIN_REVOKED		10047
173#define NFSERR_CB_PATH_DOWN		10048
174
175#define NFSERR_STALEWRITEVERF		30001	/* Fake return for nfs_commit() */
176
177#define NFSERR_RETVOID		0x20000000 /* Return void, not error */
178#define NFSERR_AUTHERR		0x40000000 /* Mark an authentication error */
179#define NFSERR_RETERR		0x80000000 /* Mark an error return for V3 */
180
181#endif /* !NFS_PROGRAM */
182
183/* Sizes in bytes of various nfs rpc components */
184#define	NFSX_UNSIGNED	4
185
186/* specific to NFS Version 2 */
187#define	NFSX_V2FH	32
188#define	NFSX_V2FATTR	68
189#define	NFSX_V2SATTR	32
190#define	NFSX_V2COOKIE	4
191#define NFSX_V2STATFS	20
192
193/* specific to NFS Version 3 */
194#define	NFSX_V3FHMAX		64	/* max. allowed by protocol */
195#define NFSX_V3FATTR		84
196#define NFSX_V3SATTR		60	/* max. all fields filled in */
197#define NFSX_V3POSTOPATTR	(NFSX_V3FATTR + NFSX_UNSIGNED)
198#define NFSX_V3WCCDATA		(NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
199#define NFSX_V3COOKIEVERF 	8
200#define NFSX_V3WRITEVERF 	8
201#define NFSX_V3CREATEVERF	8
202#define NFSX_V3STATFS		52
203#define NFSX_V3FSINFO		48
204#define NFSX_V3PATHCONF		24
205
206/* specific to NFS Version 4 */
207#define NFS4_FHSIZE		128
208#define NFS4_VERIFIER_SIZE	8
209#define NFS4_OPAQUE_LIMIT	1024
210
211/* variants for multiple versions */
212#define NFSX_FH(V)		(((V) == NFS_VER2) ? NFSX_V2FH : (NFSX_UNSIGNED + \
213				 (((V) == NFS_VER3) ? NFSX_V3FHMAX : NFS4_FHSIZE)))
214#define NFSX_SRVFH(V,FH)	(((V) == NFS_VER2) ? NFSX_V2FH : (FH)->nfh_len)
215#define	NFSX_FATTR(V)		(((V) == NFS_VER3) ? NFSX_V3FATTR : NFSX_V2FATTR)
216#define NFSX_PREOPATTR(V)	(((V) == NFS_VER3) ? (7 * NFSX_UNSIGNED) : 0)
217#define NFSX_POSTOPATTR(V)	(((V) == NFS_VER3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : 0)
218#define NFSX_POSTOPORFATTR(V)	(((V) == NFS_VER3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : NFSX_V2FATTR)
219#define NFSX_WCCDATA(V)		(((V) == NFS_VER3) ? NFSX_V3WCCDATA : 0)
220#define NFSX_WCCORFATTR(V)	(((V) == NFS_VER3) ? NFSX_V3WCCDATA : NFSX_V2FATTR)
221#define	NFSX_SATTR(V)		(((V) == NFS_VER3) ? NFSX_V3SATTR : NFSX_V2SATTR)
222#define	NFSX_COOKIEVERF(V)	(((V) == NFS_VER3) ? NFSX_V3COOKIEVERF : 0)
223#define	NFSX_WRITEVERF(V)	(((V) == NFS_VER3) ? NFSX_V3WRITEVERF : 0)
224#define NFSX_READDIR(V)		(((V) == NFS_VER3) ? (5 * NFSX_UNSIGNED) : \
225					(2 * NFSX_UNSIGNED))
226#define	NFSX_STATFS(V)		(((V) == NFS_VER3) ? NFSX_V3STATFS : NFSX_V2STATFS)
227
228/* Only define these if nfs_prot.h hasn't been included */
229#ifndef NFS_PROGRAM
230
231/* nfs rpc procedure numbers (before version mapping) */
232#define	NFSPROC_NULL		0
233#define	NFSPROC_GETATTR		1
234#define	NFSPROC_SETATTR		2
235#define	NFSPROC_LOOKUP		3
236#define	NFSPROC_ACCESS		4
237#define	NFSPROC_READLINK	5
238#define	NFSPROC_READ		6
239#define	NFSPROC_WRITE		7
240#define	NFSPROC_CREATE		8
241#define	NFSPROC_MKDIR		9
242#define	NFSPROC_SYMLINK		10
243#define	NFSPROC_MKNOD		11
244#define	NFSPROC_REMOVE		12
245#define	NFSPROC_RMDIR		13
246#define	NFSPROC_RENAME		14
247#define	NFSPROC_LINK		15
248#define	NFSPROC_READDIR		16
249#define	NFSPROC_READDIRPLUS	17
250#define	NFSPROC_FSSTAT		18
251#define	NFSPROC_FSINFO		19
252#define	NFSPROC_PATHCONF	20
253#define	NFSPROC_COMMIT		21
254
255#endif /* !NFS_PROGRAM */
256
257#define NFSPROC_NOOP		22
258#define	NFS_NPROCS		23
259
260/* Actual Version 2 procedure numbers */
261#define	NFSV2PROC_NULL		0
262#define	NFSV2PROC_GETATTR	1
263#define	NFSV2PROC_SETATTR	2
264#define	NFSV2PROC_NOOP		3
265#define	NFSV2PROC_ROOT		NFSV2PROC_NOOP	/* Obsolete */
266#define	NFSV2PROC_LOOKUP	4
267#define	NFSV2PROC_READLINK	5
268#define	NFSV2PROC_READ		6
269#define	NFSV2PROC_WRITECACHE	NFSV2PROC_NOOP	/* Obsolete */
270#define	NFSV2PROC_WRITE		8
271#define	NFSV2PROC_CREATE	9
272#define	NFSV2PROC_REMOVE	10
273#define	NFSV2PROC_RENAME	11
274#define	NFSV2PROC_LINK		12
275#define	NFSV2PROC_SYMLINK	13
276#define	NFSV2PROC_MKDIR		14
277#define	NFSV2PROC_RMDIR		15
278#define	NFSV2PROC_READDIR	16
279#define	NFSV2PROC_STATFS	17
280
281/*
282 * Constants used by the Version 3 protocol for various RPCs
283 */
284
285#define NFSV3FSINFO_LINK		0x01
286#define NFSV3FSINFO_SYMLINK		0x02
287#define NFSV3FSINFO_HOMOGENEOUS		0x08
288#define NFSV3FSINFO_CANSETTIME		0x10
289
290/* time setting constants */
291#define NFS_TIME_DONT_CHANGE		0
292#define NFS_TIME_SET_TO_SERVER		1
293#define NFS_TIME_SET_TO_CLIENT		2
294
295/* access() constants */
296#define NFS_ACCESS_READ			0x01
297#define NFS_ACCESS_LOOKUP		0x02
298#define NFS_ACCESS_MODIFY		0x04
299#define NFS_ACCESS_EXTEND		0x08
300#define NFS_ACCESS_DELETE		0x10
301#define NFS_ACCESS_EXECUTE		0x20
302#define	NFS_ACCESS_ALL (NFS_ACCESS_READ | NFS_ACCESS_MODIFY		\
303			 | NFS_ACCESS_EXTEND | NFS_ACCESS_EXECUTE	\
304			 | NFS_ACCESS_DELETE | NFS_ACCESS_LOOKUP)
305
306/* NFS WRITE how constants */
307#define NFS_WRITE_UNSTABLE		0
308#define NFS_WRITE_DATASYNC		1
309#define NFS_WRITE_FILESYNC		2
310
311/* NFS CREATE types */
312#define NFS_CREATE_UNCHECKED		0
313#define NFS_CREATE_GUARDED		1
314#define NFS_CREATE_EXCLUSIVE		2
315
316/* Only define these if nfs_prot.h hasn't been included */
317#ifndef NFS_PROGRAM
318/* NFS object types */
319typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5,
320	NFSOCK=6, NFFIFO=7, NFATTRDIR=8, NFNAMEDATTR=9 } nfstype;
321#endif /* !NFS_PROGRAM */
322
323/*
324 * File Handle (32 bytes for version 2), variable up to 64 for version 3
325 * and variable up to 128 bytes for version 4.
326 * File Handles of up to NFS_SMALLFH in size are stored directly in the
327 * nfs node, whereas larger ones are malloc'd. (This never happens when
328 * NFS_SMALLFH is set to the largest size.)
329 * NFS_SMALLFH should be in the range of 32 to 64 and be divisible by 4.
330 */
331#ifndef NFS_SMALLFH
332#define NFS_SMALLFH	64
333#endif
334
335/*
336 * NFS attribute management stuff
337 */
338#define NFS_ATTR_BITMAP_LEN	2
339#define NFS_BITMAP_SET(A, I)	(((uint32_t *)(A))[(I)/32] |= 1<<((I)%32))
340#define NFS_BITMAP_CLR(A, I)	(((uint32_t *)(A))[(I)/32] &= ~(1<<((I)%32)))
341#define NFS_BITMAP_ISSET(A, I)	(((uint32_t *)(A))[(I)/32] & (1<<((I)%32)))
342
343__private_extern__ uint32_t nfs_fs_attr_bitmap[NFS_ATTR_BITMAP_LEN];
344__private_extern__ uint32_t nfs_object_attr_bitmap[NFS_ATTR_BITMAP_LEN];
345__private_extern__ uint32_t nfs_getattr_bitmap[NFS_ATTR_BITMAP_LEN];
346
347#define NFS_CLEAR_ATTRIBUTES(A) \
348	do { \
349	int __i; \
350	for (__i=0; __i < NFS_ATTR_BITMAP_LEN; __i++) \
351		((uint32_t*)(A))[__i] = 0; \
352	} while (0)
353
354#define NFS_COPY_ATTRIBUTES(SRC, DST) \
355	do { \
356	int __i; \
357	for (__i=0; __i < NFS_ATTR_BITMAP_LEN; __i++) \
358		((uint32_t*)(DST))[__i] = ((uint32_t*)(SRC))[__i]; \
359	} while (0)
360
361/* NFS attributes */
362#define NFS_FATTR_SUPPORTED_ATTRS		0
363#define NFS_FATTR_TYPE				1
364#define NFS_FATTR_FH_EXPIRE_TYPE		2
365#define NFS_FATTR_CHANGE			3
366#define NFS_FATTR_SIZE				4
367#define NFS_FATTR_LINK_SUPPORT			5
368#define NFS_FATTR_SYMLINK_SUPPORT		6
369#define NFS_FATTR_NAMED_ATTR			7
370#define NFS_FATTR_FSID				8
371#define NFS_FATTR_UNIQUE_HANDLES		9
372#define NFS_FATTR_LEASE_TIME			10
373#define NFS_FATTR_RDATTR_ERROR			11
374#define NFS_FATTR_FILEHANDLE			19
375#define NFS_FATTR_ACL				12
376#define NFS_FATTR_ACLSUPPORT			13
377#define NFS_FATTR_ARCHIVE			14
378#define NFS_FATTR_CANSETTIME			15
379#define NFS_FATTR_CASE_INSENSITIVE		16
380#define NFS_FATTR_CASE_PRESERVING		17
381#define NFS_FATTR_CHOWN_RESTRICTED		18
382#define NFS_FATTR_FILEID			20
383#define NFS_FATTR_FILES_AVAIL			21
384#define NFS_FATTR_FILES_FREE			22
385#define NFS_FATTR_FILES_TOTAL			23
386#define NFS_FATTR_FS_LOCATIONS			24
387#define NFS_FATTR_HIDDEN			25
388#define NFS_FATTR_HOMOGENEOUS			26
389#define NFS_FATTR_MAXFILESIZE			27
390#define NFS_FATTR_MAXLINK			28
391#define NFS_FATTR_MAXNAME			29
392#define NFS_FATTR_MAXREAD			30
393#define NFS_FATTR_MAXWRITE			31
394#define NFS_FATTR_MIMETYPE			32
395#define NFS_FATTR_MODE				33
396#define NFS_FATTR_NO_TRUNC			34
397#define NFS_FATTR_NUMLINKS			35
398#define NFS_FATTR_OWNER				36
399#define NFS_FATTR_OWNER_GROUP			37
400#define NFS_FATTR_QUOTA_AVAIL_HARD		38
401#define NFS_FATTR_QUOTA_AVAIL_SOFT		39
402#define NFS_FATTR_QUOTA_USED			40
403#define NFS_FATTR_RAWDEV			41
404#define NFS_FATTR_SPACE_AVAIL			42
405#define NFS_FATTR_SPACE_FREE			43
406#define NFS_FATTR_SPACE_TOTAL			44
407#define NFS_FATTR_SPACE_USED			45
408#define NFS_FATTR_SYSTEM			46
409#define NFS_FATTR_TIME_ACCESS			47
410#define NFS_FATTR_TIME_ACCESS_SET		48
411#define NFS_FATTR_TIME_BACKUP			49
412#define NFS_FATTR_TIME_CREATE			50
413#define NFS_FATTR_TIME_DELTA			51
414#define NFS_FATTR_TIME_METADATA			52
415#define NFS_FATTR_TIME_MODIFY			53
416#define NFS_FATTR_TIME_MODIFY_SET		54
417#define NFS_FATTR_MOUNTED_ON_FILEID		55
418
419#define NFS4_ALL_ATTRIBUTES(A) \
420	do { \
421	/* required: */ \
422	NFS_BITMAP_SET((A), NFS_FATTR_SUPPORTED_ATTRS); \
423	NFS_BITMAP_SET((A), NFS_FATTR_TYPE); \
424	NFS_BITMAP_SET((A), NFS_FATTR_FH_EXPIRE_TYPE); \
425	NFS_BITMAP_SET((A), NFS_FATTR_CHANGE); \
426	NFS_BITMAP_SET((A), NFS_FATTR_SIZE); \
427	NFS_BITMAP_SET((A), NFS_FATTR_LINK_SUPPORT); \
428	NFS_BITMAP_SET((A), NFS_FATTR_SYMLINK_SUPPORT); \
429	NFS_BITMAP_SET((A), NFS_FATTR_NAMED_ATTR); \
430	NFS_BITMAP_SET((A), NFS_FATTR_FSID); \
431	NFS_BITMAP_SET((A), NFS_FATTR_UNIQUE_HANDLES); \
432	NFS_BITMAP_SET((A), NFS_FATTR_LEASE_TIME); \
433	NFS_BITMAP_SET((A), NFS_FATTR_RDATTR_ERROR); \
434	NFS_BITMAP_SET((A), NFS_FATTR_FILEHANDLE); \
435	/* optional: */ \
436	NFS_BITMAP_SET((A), NFS_FATTR_ACL); \
437	NFS_BITMAP_SET((A), NFS_FATTR_ACLSUPPORT); \
438	NFS_BITMAP_SET((A), NFS_FATTR_ARCHIVE); \
439	NFS_BITMAP_SET((A), NFS_FATTR_CANSETTIME); \
440	NFS_BITMAP_SET((A), NFS_FATTR_CASE_INSENSITIVE); \
441	NFS_BITMAP_SET((A), NFS_FATTR_CASE_PRESERVING); \
442	NFS_BITMAP_SET((A), NFS_FATTR_CHOWN_RESTRICTED); \
443	NFS_BITMAP_SET((A), NFS_FATTR_FILEID); \
444	NFS_BITMAP_SET((A), NFS_FATTR_FILES_AVAIL); \
445	NFS_BITMAP_SET((A), NFS_FATTR_FILES_FREE); \
446	NFS_BITMAP_SET((A), NFS_FATTR_FILES_TOTAL); \
447	NFS_BITMAP_SET((A), NFS_FATTR_FS_LOCATIONS); \
448	NFS_BITMAP_SET((A), NFS_FATTR_HIDDEN); \
449	NFS_BITMAP_SET((A), NFS_FATTR_HOMOGENEOUS); \
450	NFS_BITMAP_SET((A), NFS_FATTR_MAXFILESIZE); \
451	NFS_BITMAP_SET((A), NFS_FATTR_MAXLINK); \
452	NFS_BITMAP_SET((A), NFS_FATTR_MAXNAME); \
453	NFS_BITMAP_SET((A), NFS_FATTR_MAXREAD); \
454	NFS_BITMAP_SET((A), NFS_FATTR_MAXWRITE); \
455	NFS_BITMAP_SET((A), NFS_FATTR_MIMETYPE); \
456	NFS_BITMAP_SET((A), NFS_FATTR_MODE); \
457	NFS_BITMAP_SET((A), NFS_FATTR_NO_TRUNC); \
458	NFS_BITMAP_SET((A), NFS_FATTR_NUMLINKS); \
459	NFS_BITMAP_SET((A), NFS_FATTR_OWNER); \
460	NFS_BITMAP_SET((A), NFS_FATTR_OWNER_GROUP); \
461	NFS_BITMAP_SET((A), NFS_FATTR_QUOTA_AVAIL_HARD); \
462	NFS_BITMAP_SET((A), NFS_FATTR_QUOTA_AVAIL_SOFT); \
463	NFS_BITMAP_SET((A), NFS_FATTR_QUOTA_USED); \
464	NFS_BITMAP_SET((A), NFS_FATTR_RAWDEV); \
465	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_AVAIL); \
466	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_FREE); \
467	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_TOTAL); \
468	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_USED); \
469	NFS_BITMAP_SET((A), NFS_FATTR_SYSTEM); \
470	NFS_BITMAP_SET((A), NFS_FATTR_TIME_ACCESS); \
471	NFS_BITMAP_SET((A), NFS_FATTR_TIME_ACCESS_SET); \
472	NFS_BITMAP_SET((A), NFS_FATTR_TIME_BACKUP); \
473	NFS_BITMAP_SET((A), NFS_FATTR_TIME_CREATE); \
474	NFS_BITMAP_SET((A), NFS_FATTR_TIME_DELTA); \
475	NFS_BITMAP_SET((A), NFS_FATTR_TIME_METADATA); \
476	NFS_BITMAP_SET((A), NFS_FATTR_TIME_MODIFY); \
477	NFS_BITMAP_SET((A), NFS_FATTR_TIME_MODIFY_SET); \
478	NFS_BITMAP_SET((A), NFS_FATTR_MOUNTED_ON_FILEID); \
479	} while (0)
480
481#define NFS4_PER_OBJECT_ATTRIBUTES(A) \
482	do { \
483	/* required: */ \
484	NFS_BITMAP_SET((A), NFS_FATTR_TYPE); \
485	NFS_BITMAP_SET((A), NFS_FATTR_CHANGE); \
486	NFS_BITMAP_SET((A), NFS_FATTR_SIZE); \
487	NFS_BITMAP_SET((A), NFS_FATTR_NAMED_ATTR); \
488	NFS_BITMAP_SET((A), NFS_FATTR_FSID); \
489	NFS_BITMAP_SET((A), NFS_FATTR_RDATTR_ERROR); \
490	NFS_BITMAP_SET((A), NFS_FATTR_FILEHANDLE); \
491	/* optional: */ \
492	NFS_BITMAP_SET((A), NFS_FATTR_ACL); \
493	NFS_BITMAP_SET((A), NFS_FATTR_ARCHIVE); \
494	NFS_BITMAP_SET((A), NFS_FATTR_FILEID); \
495	NFS_BITMAP_SET((A), NFS_FATTR_HIDDEN); \
496	NFS_BITMAP_SET((A), NFS_FATTR_MAXLINK); \
497	NFS_BITMAP_SET((A), NFS_FATTR_MIMETYPE); \
498	NFS_BITMAP_SET((A), NFS_FATTR_MODE); \
499	NFS_BITMAP_SET((A), NFS_FATTR_NUMLINKS); \
500	NFS_BITMAP_SET((A), NFS_FATTR_OWNER); \
501	NFS_BITMAP_SET((A), NFS_FATTR_OWNER_GROUP); \
502	NFS_BITMAP_SET((A), NFS_FATTR_RAWDEV); \
503	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_USED); \
504	NFS_BITMAP_SET((A), NFS_FATTR_SYSTEM); \
505	NFS_BITMAP_SET((A), NFS_FATTR_TIME_ACCESS); \
506	NFS_BITMAP_SET((A), NFS_FATTR_TIME_BACKUP); \
507	NFS_BITMAP_SET((A), NFS_FATTR_TIME_CREATE); \
508	NFS_BITMAP_SET((A), NFS_FATTR_TIME_METADATA); \
509	NFS_BITMAP_SET((A), NFS_FATTR_TIME_MODIFY); \
510	NFS_BITMAP_SET((A), NFS_FATTR_MOUNTED_ON_FILEID); \
511	} while (0)
512
513#define NFS4_PER_FS_ATTRIBUTES(A) \
514	do { \
515	/* required: */ \
516	NFS_BITMAP_SET((A), NFS_FATTR_SUPPORTED_ATTRS); \
517	NFS_BITMAP_SET((A), NFS_FATTR_FH_EXPIRE_TYPE); \
518	NFS_BITMAP_SET((A), NFS_FATTR_LINK_SUPPORT); \
519	NFS_BITMAP_SET((A), NFS_FATTR_SYMLINK_SUPPORT); \
520	NFS_BITMAP_SET((A), NFS_FATTR_UNIQUE_HANDLES); \
521	NFS_BITMAP_SET((A), NFS_FATTR_LEASE_TIME); \
522	/* optional: */ \
523	NFS_BITMAP_SET((A), NFS_FATTR_ACLSUPPORT); \
524	NFS_BITMAP_SET((A), NFS_FATTR_CANSETTIME); \
525	NFS_BITMAP_SET((A), NFS_FATTR_CASE_INSENSITIVE); \
526	NFS_BITMAP_SET((A), NFS_FATTR_CASE_PRESERVING); \
527	NFS_BITMAP_SET((A), NFS_FATTR_CHOWN_RESTRICTED); \
528	NFS_BITMAP_SET((A), NFS_FATTR_FILES_AVAIL); \
529	NFS_BITMAP_SET((A), NFS_FATTR_FILES_FREE); \
530	NFS_BITMAP_SET((A), NFS_FATTR_FILES_TOTAL); \
531	NFS_BITMAP_SET((A), NFS_FATTR_FS_LOCATIONS); \
532	NFS_BITMAP_SET((A), NFS_FATTR_HOMOGENEOUS); \
533	NFS_BITMAP_SET((A), NFS_FATTR_MAXFILESIZE); \
534	NFS_BITMAP_SET((A), NFS_FATTR_MAXNAME); \
535	NFS_BITMAP_SET((A), NFS_FATTR_MAXREAD); \
536	NFS_BITMAP_SET((A), NFS_FATTR_MAXWRITE); \
537	NFS_BITMAP_SET((A), NFS_FATTR_NO_TRUNC); \
538	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_AVAIL); \
539	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_FREE); \
540	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_TOTAL); \
541	NFS_BITMAP_SET((A), NFS_FATTR_TIME_DELTA); \
542	} while (0)
543
544#define NFS4_DEFAULT_ATTRIBUTES(A) \
545	do { \
546	/* required: */ \
547	NFS_BITMAP_SET((A), NFS_FATTR_SUPPORTED_ATTRS); \
548	NFS_BITMAP_SET((A), NFS_FATTR_TYPE); \
549	NFS_BITMAP_SET((A), NFS_FATTR_FH_EXPIRE_TYPE); \
550	NFS_BITMAP_SET((A), NFS_FATTR_CHANGE); \
551	NFS_BITMAP_SET((A), NFS_FATTR_SIZE); \
552	NFS_BITMAP_SET((A), NFS_FATTR_LINK_SUPPORT); \
553	NFS_BITMAP_SET((A), NFS_FATTR_SYMLINK_SUPPORT); \
554	NFS_BITMAP_SET((A), NFS_FATTR_NAMED_ATTR); \
555	NFS_BITMAP_SET((A), NFS_FATTR_FSID); \
556	NFS_BITMAP_SET((A), NFS_FATTR_UNIQUE_HANDLES); \
557	NFS_BITMAP_SET((A), NFS_FATTR_LEASE_TIME); \
558	/* NFS_BITMAP_SET((A), NFS_FATTR_RDATTR_ERROR); */ \
559	/* NFS_BITMAP_SET((A), NFS_FATTR_FILEHANDLE); */ \
560	/* optional: */ \
561	/* NFS_BITMAP_SET((A), NFS_FATTR_ACL); */ \
562	/* NFS_BITMAP_SET((A), NFS_FATTR_ACLSUPPORT); */ \
563	NFS_BITMAP_SET((A), NFS_FATTR_ARCHIVE); \
564	/* NFS_BITMAP_SET((A), NFS_FATTR_CANSETTIME); */ \
565	NFS_BITMAP_SET((A), NFS_FATTR_CASE_INSENSITIVE); \
566	NFS_BITMAP_SET((A), NFS_FATTR_CASE_PRESERVING); \
567	NFS_BITMAP_SET((A), NFS_FATTR_CHOWN_RESTRICTED); \
568	NFS_BITMAP_SET((A), NFS_FATTR_FILEID); \
569	NFS_BITMAP_SET((A), NFS_FATTR_FILES_AVAIL); \
570	NFS_BITMAP_SET((A), NFS_FATTR_FILES_FREE); \
571	NFS_BITMAP_SET((A), NFS_FATTR_FILES_TOTAL); \
572	/* NFS_BITMAP_SET((A), NFS_FATTR_FS_LOCATIONS); */ \
573	NFS_BITMAP_SET((A), NFS_FATTR_HIDDEN); \
574	NFS_BITMAP_SET((A), NFS_FATTR_HOMOGENEOUS); \
575	NFS_BITMAP_SET((A), NFS_FATTR_MAXFILESIZE); \
576	NFS_BITMAP_SET((A), NFS_FATTR_MAXLINK); \
577	NFS_BITMAP_SET((A), NFS_FATTR_MAXNAME); \
578	NFS_BITMAP_SET((A), NFS_FATTR_MAXREAD); \
579	NFS_BITMAP_SET((A), NFS_FATTR_MAXWRITE); \
580	/* NFS_BITMAP_SET((A), NFS_FATTR_MIMETYPE); */ \
581	NFS_BITMAP_SET((A), NFS_FATTR_MODE); \
582	NFS_BITMAP_SET((A), NFS_FATTR_NO_TRUNC); \
583	NFS_BITMAP_SET((A), NFS_FATTR_NUMLINKS); \
584	NFS_BITMAP_SET((A), NFS_FATTR_OWNER); \
585	NFS_BITMAP_SET((A), NFS_FATTR_OWNER_GROUP); \
586	/* NFS_BITMAP_SET((A), NFS_FATTR_QUOTA_AVAIL_HARD); */ \
587	/* NFS_BITMAP_SET((A), NFS_FATTR_QUOTA_AVAIL_SOFT); */ \
588	/* NFS_BITMAP_SET((A), NFS_FATTR_QUOTA_USED); */ \
589	NFS_BITMAP_SET((A), NFS_FATTR_RAWDEV); \
590	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_AVAIL); \
591	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_FREE); \
592	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_TOTAL); \
593	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_USED); \
594	/* NFS_BITMAP_SET((A), NFS_FATTR_SYSTEM); */ \
595	NFS_BITMAP_SET((A), NFS_FATTR_TIME_ACCESS); \
596	/* NFS_BITMAP_SET((A), NFS_FATTR_TIME_ACCESS_SET); */ \
597	NFS_BITMAP_SET((A), NFS_FATTR_TIME_BACKUP); \
598	NFS_BITMAP_SET((A), NFS_FATTR_TIME_CREATE); \
599	/* NFS_BITMAP_SET((A), NFS_FATTR_TIME_DELTA); */ \
600	NFS_BITMAP_SET((A), NFS_FATTR_TIME_METADATA); \
601	NFS_BITMAP_SET((A), NFS_FATTR_TIME_MODIFY); \
602	/* NFS_BITMAP_SET((A), NFS_FATTR_TIME_MODIFY_SET); */ \
603	/* NFS_BITMAP_SET((A), NFS_FATTR_MOUNTED_ON_FILEID); */ \
604	} while (0)
605
606/* attributes requested when we want to do a "statfs" */
607#define NFS4_STATFS_ATTRIBUTES(A) \
608	do { \
609	/* optional: */ \
610	NFS_BITMAP_SET((A), NFS_FATTR_FILES_AVAIL); \
611	NFS_BITMAP_SET((A), NFS_FATTR_FILES_FREE); \
612	NFS_BITMAP_SET((A), NFS_FATTR_FILES_TOTAL); \
613	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_AVAIL); \
614	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_FREE); \
615	NFS_BITMAP_SET((A), NFS_FATTR_SPACE_TOTAL); \
616	} while (0)
617
618/*
619 * NFS OPEN constants
620 */
621/* open type */
622#define NFS_OPEN_NOCREATE			0
623#define NFS_OPEN_CREATE				1
624/* delegation space limit */
625#define NFS_LIMIT_SIZE				1
626#define NFS_LIMIT_BLOCKS			2
627/* access/deny modes */
628#define NFS_OPEN_SHARE_ACCESS_READ		0x00000001
629#define NFS_OPEN_SHARE_ACCESS_WRITE		0x00000002
630#define NFS_OPEN_SHARE_ACCESS_BOTH		0x00000003
631#define NFS_OPEN_SHARE_DENY_NONE		0x00000000
632#define NFS_OPEN_SHARE_DENY_READ		0x00000001
633#define NFS_OPEN_SHARE_DENY_WRITE		0x00000002
634#define NFS_OPEN_SHARE_DENY_BOTH		0x00000003
635/* delegation types */
636#define NFS_OPEN_DELEGATE_NONE			0
637#define NFS_OPEN_DELEGATE_READ			1
638#define NFS_OPEN_DELEGATE_WRITE			2
639/* delegation claim types */
640#define NFS_CLAIM_NULL				0
641#define NFS_CLAIM_PREVIOUS			1
642#define NFS_CLAIM_DELEGATE_CUR			2
643#define NFS_CLAIM_DELEGATE_PREV			3
644/* open result flags */
645#define NFS_OPEN_RESULT_CONFIRM			0x00000002
646#define NFS_OPEN_RESULT_LOCKTYPE_POSIX		0x00000004
647/* NFS lock types */
648#define NFS_LOCK_TYPE_READ			1
649#define NFS_LOCK_TYPE_WRITE			2
650#define NFS_LOCK_TYPE_READW			3 /* "blocking" */
651#define NFS_LOCK_TYPE_WRITEW			4 /* "blocking" */
652
653/* NFSv4 RPC procedures */
654#define NFSPROC4_NULL				0
655#define NFSPROC4_COMPOUND			1
656
657/* NFSv4 opcodes */
658#define NFS_OP_ACCESS				3
659#define NFS_OP_CLOSE				4
660#define NFS_OP_COMMIT				5
661#define NFS_OP_CREATE				6
662#define NFS_OP_DELEGPURGE			7
663#define NFS_OP_DELEGRETURN			8
664#define NFS_OP_GETATTR				9
665#define NFS_OP_GETFH				10
666#define NFS_OP_LINK				11
667#define NFS_OP_LOCK				12
668#define NFS_OP_LOCKT				13
669#define NFS_OP_LOCKU				14
670#define NFS_OP_LOOKUP				15
671#define NFS_OP_LOOKUPP				16
672#define NFS_OP_NVERIFY				17
673#define NFS_OP_OPEN				18
674#define NFS_OP_OPENATTR				19
675#define NFS_OP_OPEN_CONFIRM			20
676#define NFS_OP_OPEN_DOWNGRADE			21
677#define NFS_OP_PUTFH				22
678#define NFS_OP_PUTPUBFH				23
679#define NFS_OP_PUTROOTFH			24
680#define NFS_OP_READ				25
681#define NFS_OP_READDIR				26
682#define NFS_OP_READLINK				27
683#define NFS_OP_REMOVE				28
684#define NFS_OP_RENAME				29
685#define NFS_OP_RENEW				30
686#define NFS_OP_RESTOREFH			31
687#define NFS_OP_SAVEFH				32
688#define NFS_OP_SECINFO				33
689#define NFS_OP_SETATTR				34
690#define NFS_OP_SETCLIENTID			35
691#define NFS_OP_SETCLIENTID_CONFIRM		36
692#define NFS_OP_VERIFY				37
693#define NFS_OP_WRITE				38
694#define NFS_OP_RELEASE_LOCKOWNER		39
695#define NFS_OP_ILLEGAL				10044
696/* NFSv4 callback opcodes */
697#define NFS_OP_CB_GETATTR			3
698#define NFS_OP_CB_RECALL			4
699#define NFS_OP_CB_ILLEGAL			10044
700
701/* NFSv4 file handle type flags */
702#define NFS_FH_PERSISTENT			0x00000000
703#define NFS_FH_NOEXPIRE_WITH_OPEN		0x00000001
704#define NFS_FH_VOLATILE_ANY			0x00000002
705#define NFS_FH_VOL_MIGRATION			0x00000004
706#define NFS_FH_VOL_RENAME			0x00000008
707
708/*
709 * NFSv4 ACL constants
710 */
711/* ACE support mask bits */
712#define NFS_ACL_SUPPORT_ALLOW_ACL		0x00000001
713#define NFS_ACL_SUPPORT_DENY_ACL		0x00000002
714#define NFS_ACL_SUPPORT_AUDIT_ACL		0x00000004
715#define NFS_ACL_SUPPORT_ALARM_ACL		0x00000008
716/* ACE types */
717#define NFS_ACE_ACCESS_ALLOWED_ACE_TYPE		0x00000000
718#define NFS_ACE_ACCESS_DENIED_ACE_TYPE		0x00000001
719#define NFS_ACE_SYSTEM_AUDIT_ACE_TYPE		0x00000002
720#define NFS_ACE_SYSTEM_ALARM_ACE_TYPE		0x00000003
721/* ACE flags */
722#define NFS_ACE_FILE_INHERIT_ACE		0x00000001
723#define NFS_ACE_DIRECTORY_INHERIT_ACE		0x00000002
724#define NFS_ACE_NO_PROPAGATE_INHERIT_ACE	0x00000004
725#define NFS_ACE_INHERIT_ONLY_ACE		0x00000008
726#define NFS_ACE_SUCCESSFUL_ACCESS_ACE_FLAG	0x00000010
727#define NFS_ACE_FAILED_ACCESS_ACE_FLAG		0x00000020
728#define NFS_ACE_IDENTIFIER_GROUP		0x00000040
729/* ACE mask flags */
730#define NFS_ACE_READ_DATA			0x00000001
731#define NFS_ACE_LIST_DIRECTORY			0x00000001
732#define NFS_ACE_WRITE_DATA			0x00000002
733#define NFS_ACE_ADD_FILE			0x00000002
734#define NFS_ACE_APPEND_DATA			0x00000004
735#define NFS_ACE_ADD_SUBDIRECTORY		0x00000004
736#define NFS_ACE_READ_NAMED_ATTRS		0x00000008
737#define NFS_ACE_WRITE_NAMED_ATTRS		0x00000010
738#define NFS_ACE_EXECUTE				0x00000020
739#define NFS_ACE_DELETE_CHILD			0x00000040
740#define NFS_ACE_READ_ATTRIBUTES			0x00000080
741#define NFS_ACE_WRITE_ATTRIBUTES		0x00000100
742#define NFS_ACE_DELETE				0x00010000
743#define NFS_ACE_READ_ACL			0x00020000
744#define NFS_ACE_WRITE_ACL			0x00040000
745#define NFS_ACE_WRITE_OWNER			0x00080000
746#define NFS_ACE_SYNCHRONIZE			0x00100000
747#define NFS_ACE_GENERIC_READ			0x00120081
748#define NFS_ACE_GENERIC_WRITE			0x00160106
749#define NFS_ACE_GENERIC_EXECUTE			0x001200A0
750
751
752/*
753 * Quads are defined as arrays of 2 longs to ensure dense packing for the
754 * protocol and to facilitate xdr conversion.
755 */
756struct nfs_uquad {
757	u_long	nfsuquad[2];
758};
759typedef	struct nfs_uquad	nfsuint64;
760
761/*
762 * Used to convert between two u_longs and a u_quad_t.
763 */
764union nfs_quadconvert {
765	u_long		lval[2];
766	u_quad_t	qval;
767};
768typedef union nfs_quadconvert	nfsquad_t;
769
770/*
771 * special data/attribute associated with NFBLK/NFCHR
772 */
773struct nfs_specdata {
774	uint32_t specdata1;	/* major device number */
775	uint32_t specdata2;	/* minor device number */
776};
777typedef struct nfs_specdata nfs_specdata;
778
779/*
780 * an "fsid" large enough to hold an NFSv4 fsid.
781 */
782struct nfs_fsid {
783	uint64_t major;
784	uint64_t minor;
785};
786typedef struct nfs_fsid nfs_fsid;
787
788
789/*
790 * remove these once we're sure nobody's using them
791 */
792struct nfsv2_time {
793	u_long	nfsv2_sec;
794	u_long	nfsv2_usec;
795};
796typedef struct nfsv2_time	nfstime2;
797struct nfsv2_sattr {
798	u_long		sa_mode;
799	u_long		sa_uid;
800	u_long		sa_gid;
801	u_long		sa_size;
802	nfstime2	sa_atime;
803	nfstime2	sa_mtime;
804};
805
806#endif /* __APPLE_API_PRIVATE */
807#endif /* _NFS_NFSPROTO_H_ */
808