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