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 118d082c877SGordon 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 129*479c108bSGordon 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