1d082c877SGordon Ross /*
2d082c877SGordon Ross  * Copyright (c) 2011 - 2012 Apple Inc. All rights reserved.
3d082c877SGordon Ross  *
4d082c877SGordon Ross  * @APPLE_LICENSE_HEADER_START@
5d082c877SGordon Ross  *
6d082c877SGordon Ross  * This file contains Original Code and/or Modifications of Original Code
7d082c877SGordon Ross  * as defined in and that are subject to the Apple Public Source License
8d082c877SGordon Ross  * Version 2.0 (the 'License'). You may not use this file except in
9d082c877SGordon Ross  * compliance with the License. Please obtain a copy of the License at
10d082c877SGordon Ross  * http://www.opensource.apple.com/apsl/ and read it before using this
11d082c877SGordon Ross  * file.
12d082c877SGordon Ross  *
13d082c877SGordon Ross  * The Original Code and all software distributed under the License are
14d082c877SGordon Ross  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15d082c877SGordon Ross  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16d082c877SGordon Ross  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17d082c877SGordon Ross  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18d082c877SGordon Ross  * Please see the License for the specific language governing rights and
19d082c877SGordon Ross  * limitations under the License.
20d082c877SGordon Ross  *
21d082c877SGordon Ross  * @APPLE_LICENSE_HEADER_END@
22d082c877SGordon Ross  */
23d082c877SGordon Ross 
24d082c877SGordon Ross /*
25*479c108bSGordon Ross  * This file contains excerpts of content published under:
26*479c108bSGordon Ross  * http://opensource.apple.com/source/smb/smb-759.40.1.1
27d082c877SGordon Ross  */
28d082c877SGordon Ross 
29d082c877SGordon Ross #ifndef	_SMB2AAPL_H
30d082c877SGordon Ross #define	_SMB2AAPL_H
31d082c877SGordon Ross 
32d082c877SGordon Ross #include <sys/types.h>
33d082c877SGordon Ross 
34d082c877SGordon Ross /*
35d082c877SGordon Ross  * Apple SMB 2/3 "AAPL" Create Context extensions
36d082c877SGordon Ross  */
37d082c877SGordon Ross 
38d082c877SGordon Ross /* Define "AAPL" Context Command Codes */
39d082c877SGordon Ross enum {
40d082c877SGordon Ross 	kAAPL_SERVER_QUERY = 1,
41d082c877SGordon Ross 	kAAPL_RESOLVE_ID = 2
42d082c877SGordon Ross };
43d082c877SGordon Ross 
44d082c877SGordon Ross /*
45d082c877SGordon Ross  * Server Query Request
46d082c877SGordon Ross  *
47d082c877SGordon Ross  *	uint32_t command_code = kAAPL_SERVER_QUERY;
48d082c877SGordon Ross  *	uint32_t reserved = 0;
49d082c877SGordon Ross  *	uint64_t request_bitmap;
50d082c877SGordon Ross  *	uint64_t client_capabilities;
51d082c877SGordon Ross  *
52d082c877SGordon Ross  * Server Query Response
53d082c877SGordon Ross  *
54d082c877SGordon Ross  *	uint32_t command_code = kAAPL_SERVER_QUERY;
55d082c877SGordon Ross  *	uint32_t reserved = 0;
56d082c877SGordon Ross  *	uint64_t reply_bitmap;
57d082c877SGordon Ross  *	<reply specific data>
58d082c877SGordon Ross  *
59d082c877SGordon Ross  *	The reply data is packed in the response block in the order specified
60d082c877SGordon Ross  *	by the reply_bitmap.
61d082c877SGordon Ross  *
62d082c877SGordon Ross  * Server Query request/reply bitmap
63d082c877SGordon Ross  *  Bit 0 - kAAPL_SERVER_CAPS returns uint64_t bitmap of server capabilities
64d082c877SGordon Ross  *  Bit 1 - kAAPL_VOLUME_CAPS returns uint64_t bitmap of volume capabilities
65d082c877SGordon Ross  *  Bit 2 - kAAPL_MODEL_INFO returns uint32_t Pad2 followed by uint32_t length
66d082c877SGordon Ross  *	followed by the Unicode model string. The Unicode string is padded with
67d082c877SGordon Ross  *	zeros to end on an 8 byte boundary.
68d082c877SGordon Ross  *
69d082c877SGordon Ross  * Example Server Query Context Response Buffer:
70d082c877SGordon Ross  *	uint32_t Next = 0;
71d082c877SGordon Ross  *	uint16_t NameOffset = 16;
72d082c877SGordon Ross  *	uint16_t NameLength = 4;
73d082c877SGordon Ross  *	uint16_t Reserved = 0;
74d082c877SGordon Ross  *	uint16_t DataOffset = 24;
75d082c877SGordon Ross  *	uint32_t DataLength = variable based on ModelString length;
76d082c877SGordon Ross  *	uint32_t ContextName = "AAPL";
77d082c877SGordon Ross  *	uint32_t Pad = 0;
78d082c877SGordon Ross  *	uint32_t CommandCode = kAAPL_SERVER_QUERY
79d082c877SGordon Ross  *	uint32_t Reserved = 0;
80d082c877SGordon Ross  *	uint64_t ReplyBitmap = kAAPL_SERVER_CAPS | kAAPL_VOLUME_CAPS |
81d082c877SGordon Ross  *			       kAAPL_MODEL_INFO;
82d082c877SGordon Ross  *	uint64_t ServerCaps = kAAPL_SUPPORTS_READ_DIR_ATTR |
83d082c877SGordon Ross  *			      kAAPL_SUPPORTS_OSX_COPYFILE;
84d082c877SGordon Ross  *	uint64_t VolumeCaps = kAAPL_SUPPORT_RESOLVE_ID | kAAPL_CASE_SENSITIVE;
85d082c877SGordon Ross  *	uint32_t Pad2 = 0;
86d082c877SGordon Ross  *	uint32_t ModelStringLen = variable;
87d082c877SGordon Ross  *	char *   ModelString;
88d082c877SGordon Ross  *	char     PadBytes = variable to end on 8 byte boundary;
89d082c877SGordon Ross  *
90d082c877SGordon Ross  * kAAPL_SUPPORTS_NFS_ACE - Uses to set Posix permission when ACLs are off
91d082c877SGordon Ross  *	on the server. The server must allow the client to get the current
92d082c877SGordon Ross  *	ACL and then the client will return it with the desired Posix
93d082c877SGordon Ross  *	permissions in the NFS ACE in the ACL.
94d082c877SGordon Ross  */
95d082c877SGordon Ross 
96d082c877SGordon Ross /* Define Server Query request/response bitmap */
97d082c877SGordon Ross enum {
98d082c877SGordon Ross 	kAAPL_SERVER_CAPS = 0x01,
99d082c877SGordon Ross 	kAAPL_VOLUME_CAPS = 0x02,
100d082c877SGordon Ross 	kAAPL_MODEL_INFO = 0x04
101d082c877SGordon Ross };
102d082c877SGordon Ross 
103d082c877SGordon Ross /* Define Client/Server Capabilities bitmap */
104d082c877SGordon Ross enum {
105d082c877SGordon Ross 	kAAPL_SUPPORTS_READ_DIR_ATTR = 0x01,
106d082c877SGordon Ross 	kAAPL_SUPPORTS_OSX_COPYFILE = 0x02,
107d082c877SGordon Ross 	kAAPL_UNIX_BASED = 0x04,
108d082c877SGordon Ross 	kAAPL_SUPPORTS_NFS_ACE = 0x08
109d082c877SGordon Ross };
110d082c877SGordon Ross 
111d082c877SGordon Ross /* Define Volume Capabilities bitmap */
112d082c877SGordon Ross enum {
113d082c877SGordon Ross 	kAAPL_SUPPORT_RESOLVE_ID = 0x01,
114*479c108bSGordon Ross 	kAAPL_CASE_SENSITIVE = 0x02,
115*479c108bSGordon Ross 	kAAPL_SUPPORTS_FULL_SYNC = 0x04
116d082c877SGordon Ross };
117d082c877SGordon Ross 
118*479c108bSGordon Ross /*
119*479c108bSGordon Ross  * kAAPL_SUPPORTS_FULL_SYNC - Full Sync Request
120*479c108bSGordon Ross  * If the volume supports Full Sync, then when a F_FULLSYNC is done on the
121*479c108bSGordon Ross  * client side, the client will flush its buffers and then a SMB Flush Request
122*479c108bSGordon Ross  * with Reserved1 (uint16_t) set to 0xFFFF will be sent to the server. The
123*479c108bSGordon Ross  * server should flush all its buffer for that file and then call the
124*479c108bSGordon Ross  * filesystem to perform a F_FULLSYNC on that file.
125*479c108bSGordon Ross  * Refer to "man fsync" and "man fcntl" in OS X for more information on
126*479c108bSGordon Ross  * F_FULLSYNC
127*479c108bSGordon Ross  */
128*479c108bSGordon Ross 
129d082c877SGordon Ross /*
130d082c877SGordon Ross  * Resolve ID Request
131d082c877SGordon Ross  *
132d082c877SGordon Ross  *	uint32_t command_code = kAAPL_RESOLVE_ID;
133d082c877SGordon Ross  *	uint32_t reserved = 0;
134d082c877SGordon Ross  *	uint64_t file_id;
135d082c877SGordon Ross  *
136d082c877SGordon Ross  * Resolve ID Response
137d082c877SGordon Ross  *
138d082c877SGordon Ross  *	uint32_t command_code = kAAPL_RESOLVE_ID;
139d082c877SGordon Ross  *	uint32_t reserved = 0;
140d082c877SGordon Ross  *	uint32_t resolve_id_ntstatus;
141d082c877SGordon Ross  *	uint32_t path_string_len = variable;
142d082c877SGordon Ross  *	char *   path_string;
143d082c877SGordon Ross  *
144d082c877SGordon Ross  * Example Resolve ID Context Response Buffer:
145d082c877SGordon Ross  *	uint32_t Next = 0;
146d082c877SGordon Ross  *	uint16_t NameOffset = 16;
147d082c877SGordon Ross  *	uint16_t NameLength = 4;
148d082c877SGordon Ross  *	uint16_t Reserved = 0;
149d082c877SGordon Ross  *	uint16_t DataOffset = 24;
150d082c877SGordon Ross  *	uint32_t DataLength = variable based on PathString length;
151d082c877SGordon Ross  *	uint32_t ContextName = "AAPL";
152d082c877SGordon Ross  *	uint32_t Pad = 0;
153d082c877SGordon Ross  *	uint32_t CommandCode = kAAPL_RESOLVE_ID;
154d082c877SGordon Ross  *	uint32_t Reserved = 0;
155d082c877SGordon Ross  *	uint32_t ResolveID_NTStatus = 0;
156d082c877SGordon Ross  *	uint32_t ServerPathLen = variable;
157d082c877SGordon Ross  *	char *   ServerPath;
158d082c877SGordon Ross  *	char     PadBytes = variable to end on 8 byte boundary;
159d082c877SGordon Ross  */
160d082c877SGordon Ross 
161d082c877SGordon Ross /*
162d082c877SGordon Ross  * ReadDirAttr Support
163d082c877SGordon Ross  *
164d082c877SGordon Ross  * Server has to support AAPL Create Context and support the
165d082c877SGordon Ross  * command of kAAPL_SERVER_QUERY. In the ReplyBitMap, kAAPL_SERVER_CAPS
166d082c877SGordon Ross  * has to be set and in the ServerCaps field, kAAPL_SUPPORTS_READ_DIR_ATTR
167d082c877SGordon Ross  * must be set.
168d082c877SGordon Ross  *
169d082c877SGordon Ross  * Client uses FILE_ID_BOTH_DIR_INFORMATION for QueryDir
170d082c877SGordon Ross  *
171d082c877SGordon Ross  * In the Server reply for FILE_ID_BOTH_DIR_INFORMATION, fields are defined as:
172d082c877SGordon Ross  *	uint32_t ea_size;
173d082c877SGordon Ross  *	uint8_t short_name_len;
174d082c877SGordon Ross  *	uint8_t reserved;
175d082c877SGordon Ross  *	uint8_t short_name[24];
176d082c877SGordon Ross  *	uint16_t reserved2;
177d082c877SGordon Ross  *
178d082c877SGordon Ross  * If kAAPL_SUPPORTS_READ_DIR_ATTR is set, the fields will be filled in as:
179d082c877SGordon Ross  *	uint32_t max_access;
180d082c877SGordon Ross  *	uint8_t short_name_len = 0;
181d082c877SGordon Ross  *	uint8_t reserved = 0;
182d082c877SGordon Ross  *	uint64_t rsrc_fork_len;
183d082c877SGordon Ross  *	uint8_t compressed_finder_info[16];
184d082c877SGordon Ross  *	uint16_t unix_mode;  (only if kAAPL_UNIX_BASED is set)
185d082c877SGordon Ross  *
186d082c877SGordon Ross  * Notes:
187d082c877SGordon Ross  *	(1) ea_size is the max access if SMB_EFA_REPARSE_POINT is NOT set in
188d082c877SGordon Ross  *	the file attributes. For a reparse point, the SMB Client will assume
189d082c877SGordon Ross  *	full access.
190d082c877SGordon Ross  *	(2) short_name is now the Resource Fork logical length and minimal
191d082c877SGordon Ross  *	Finder Info.
192d082c877SGordon Ross  *	(3) SMB Cient will calculate the resource fork allocation size based on
193d082c877SGordon Ross  *	block size. This will be done in all places resource fork allocation
194d082c877SGordon Ross  *	size is returned by the SMB Client so we return consistent answers.
195d082c877SGordon Ross  *	(4) Compressed Finder Info will be only the fields actually still in
196d082c877SGordon Ross  *	use in the regular Finder Info and in the Ext Finder Info. SMB client
197d082c877SGordon Ross  *	will build a normal Finder Info and Ext Finder Info and fill in the
198d082c877SGordon Ross  *	other fields in with zeros.
199d082c877SGordon Ross  *	(5) If kAAPL_UNIX_BASED is set, then reserved2 is the entire Posix mode
200d082c877SGordon Ross  *
201d082c877SGordon Ross  *	struct smb_finder_file_info {
202d082c877SGordon Ross  *		uint32_t finder_type;
203d082c877SGordon Ross  *		uint32_t finder_creator;
204d082c877SGordon Ross  *		uint16_t finder_flags;
205d082c877SGordon Ross  *		uint16_t finder_ext_flags;
206d082c877SGordon Ross  *		uint32_t finder_date_added;
207d082c877SGordon Ross  *	}
208d082c877SGordon Ross  *
209d082c877SGordon Ross  *	struct smb_finder_folder_info {
210d082c877SGordon Ross  *		uint64_t reserved1;
211d082c877SGordon Ross  *		uint16_t finder_flags;
212d082c877SGordon Ross  *		uint16_t finder_ext_flags;
213d082c877SGordon Ross  *		uint32_t finder_date_added;
214d082c877SGordon Ross  *	}
215d082c877SGordon Ross  *
216d082c877SGordon Ross  *
217d082c877SGordon Ross  * Normal Finder Info and Extended Finder Info definitions
218d082c877SGordon Ross  *	struct finder_file_info {
219d082c877SGordon Ross  *		uint32_t finder_type;
220d082c877SGordon Ross  *		uint32_t finder_creator;
221d082c877SGordon Ross  *		uint16_t finder_flags;
222d082c877SGordon Ross  *		uint32_t finder_old_location = 0;
223d082c877SGordon Ross  *		uint16_t reserved = 0;
224d082c877SGordon Ross  *
225d082c877SGordon Ross  *		uint32_t reserved2 = 0;
226d082c877SGordon Ross  *		uint32_t finder_date_added;
227d082c877SGordon Ross  *		uint16_t finder_ext_flags;
228d082c877SGordon Ross  *		uint16_t reserved3 = 0;
229d082c877SGordon Ross  *		uint32_t reserved4 = 0;
230d082c877SGordon Ross  *	}
231d082c877SGordon Ross  *
232d082c877SGordon Ross  *	struct finder_folder_info {
233d082c877SGordon Ross  *		uint64_t reserved1;
234d082c877SGordon Ross  *		uint16_t finder_flags;
235d082c877SGordon Ross  *		uint32_t finder_old_location = 0;
236d082c877SGordon Ross  *		uint16_t finder_old_view_flags = 0;
237d082c877SGordon Ross  *
238d082c877SGordon Ross  *		uint32_t finder_old_scroll_position = 0;
239d082c877SGordon Ross  *		uint32_t finder_date_added;
240d082c877SGordon Ross  *		uint16_t finder_ext_flags;
241d082c877SGordon Ross  *		uint16_t reserved3 = 0;
242d082c877SGordon Ross  *		uint32_t reserved4 = 0;
243d082c877SGordon Ross  *	}
244d082c877SGordon Ross  */
245d082c877SGordon Ross 
246d082c877SGordon Ross /*
247d082c877SGordon Ross  * Note: If you use the above smb_finder_* structs, they must be "packed".
248d082c877SGordon Ross  * (no alignment padding).  On the server side, all of these can be
249d082c877SGordon Ross  * opaque, so for simplicity we use smb_macinfo_t below.
250d082c877SGordon Ross  */
251d082c877SGordon Ross 
252d082c877SGordon Ross /*
253d082c877SGordon Ross  * Implementation specific:
254d082c877SGordon Ross  */
255d082c877SGordon Ross typedef struct smb_macinfo {
256d082c877SGordon Ross 	uint64_t mi_rforksize;
257d082c877SGordon Ross 	uint32_t mi_finderinfo[4];
258d082c877SGordon Ross 	uint32_t mi_maxaccess;
259d082c877SGordon Ross 	uint16_t mi_unixmode;
260d082c877SGordon Ross } smb_macinfo_t;
261d082c877SGordon Ross 
262d082c877SGordon Ross int smb2_aapl_get_macinfo(smb_request_t *, smb_odir_t *,
263d082c877SGordon Ross 	smb_fileinfo_t *, smb_macinfo_t *, char *, size_t);
264d082c877SGordon Ross 
265d082c877SGordon Ross #endif	/* _SMB2AAPL_H */
266