18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/include/linux/hfsplus_raw.h 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 1999 68c2ecf20Sopenharmony_ci * Brad Boyer (flar@pants.nu) 78c2ecf20Sopenharmony_ci * (C) 2003 Ardis Technologies <roman@ardistech.com> 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Format of structures on disk 108c2ecf20Sopenharmony_ci * Information taken from Apple Technote #1150 (HFS Plus Volume Format) 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#ifndef _LINUX_HFSPLUS_RAW_H 158c2ecf20Sopenharmony_ci#define _LINUX_HFSPLUS_RAW_H 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include <linux/types.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci/* Some constants */ 208c2ecf20Sopenharmony_ci#define HFSPLUS_SECTOR_SIZE 512 218c2ecf20Sopenharmony_ci#define HFSPLUS_SECTOR_SHIFT 9 228c2ecf20Sopenharmony_ci#define HFSPLUS_VOLHEAD_SECTOR 2 238c2ecf20Sopenharmony_ci#define HFSPLUS_VOLHEAD_SIG 0x482b 248c2ecf20Sopenharmony_ci#define HFSPLUS_VOLHEAD_SIGX 0x4858 258c2ecf20Sopenharmony_ci#define HFSPLUS_SUPER_MAGIC 0x482b 268c2ecf20Sopenharmony_ci#define HFSPLUS_MIN_VERSION 4 278c2ecf20Sopenharmony_ci#define HFSPLUS_CURRENT_VERSION 5 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#define HFSP_WRAP_MAGIC 0x4244 308c2ecf20Sopenharmony_ci#define HFSP_WRAP_ATTRIB_SLOCK 0x8000 318c2ecf20Sopenharmony_ci#define HFSP_WRAP_ATTRIB_SPARED 0x0200 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#define HFSP_WRAPOFF_SIG 0x00 348c2ecf20Sopenharmony_ci#define HFSP_WRAPOFF_ATTRIB 0x0A 358c2ecf20Sopenharmony_ci#define HFSP_WRAPOFF_ABLKSIZE 0x14 368c2ecf20Sopenharmony_ci#define HFSP_WRAPOFF_ABLKSTART 0x1C 378c2ecf20Sopenharmony_ci#define HFSP_WRAPOFF_EMBEDSIG 0x7C 388c2ecf20Sopenharmony_ci#define HFSP_WRAPOFF_EMBEDEXT 0x7E 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#define HFSP_HIDDENDIR_NAME \ 418c2ecf20Sopenharmony_ci "\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80HFS+ Private Data" 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci#define HFSP_HARDLINK_TYPE 0x686c6e6b /* 'hlnk' */ 448c2ecf20Sopenharmony_ci#define HFSP_HFSPLUS_CREATOR 0x6866732b /* 'hfs+' */ 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci#define HFSP_SYMLINK_TYPE 0x736c6e6b /* 'slnk' */ 478c2ecf20Sopenharmony_ci#define HFSP_SYMLINK_CREATOR 0x72686170 /* 'rhap' */ 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci#define HFSP_MOUNT_VERSION 0x482b4c78 /* 'H+Lx' */ 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci/* Structures used on disk */ 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_citypedef __be32 hfsplus_cnid; 548c2ecf20Sopenharmony_citypedef __be16 hfsplus_unichr; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci#define HFSPLUS_MAX_STRLEN 255 578c2ecf20Sopenharmony_ci#define HFSPLUS_ATTR_MAX_STRLEN 127 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci/* A "string" as used in filenames, etc. */ 608c2ecf20Sopenharmony_cistruct hfsplus_unistr { 618c2ecf20Sopenharmony_ci __be16 length; 628c2ecf20Sopenharmony_ci hfsplus_unichr unicode[HFSPLUS_MAX_STRLEN]; 638c2ecf20Sopenharmony_ci} __packed; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci/* 668c2ecf20Sopenharmony_ci * A "string" is used in attributes file 678c2ecf20Sopenharmony_ci * for name of extended attribute 688c2ecf20Sopenharmony_ci */ 698c2ecf20Sopenharmony_cistruct hfsplus_attr_unistr { 708c2ecf20Sopenharmony_ci __be16 length; 718c2ecf20Sopenharmony_ci hfsplus_unichr unicode[HFSPLUS_ATTR_MAX_STRLEN]; 728c2ecf20Sopenharmony_ci} __packed; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* POSIX permissions */ 758c2ecf20Sopenharmony_cistruct hfsplus_perm { 768c2ecf20Sopenharmony_ci __be32 owner; 778c2ecf20Sopenharmony_ci __be32 group; 788c2ecf20Sopenharmony_ci u8 rootflags; 798c2ecf20Sopenharmony_ci u8 userflags; 808c2ecf20Sopenharmony_ci __be16 mode; 818c2ecf20Sopenharmony_ci __be32 dev; 828c2ecf20Sopenharmony_ci} __packed; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci#define HFSPLUS_FLG_NODUMP 0x01 858c2ecf20Sopenharmony_ci#define HFSPLUS_FLG_IMMUTABLE 0x02 868c2ecf20Sopenharmony_ci#define HFSPLUS_FLG_APPEND 0x04 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci/* A single contiguous area of a file */ 898c2ecf20Sopenharmony_cistruct hfsplus_extent { 908c2ecf20Sopenharmony_ci __be32 start_block; 918c2ecf20Sopenharmony_ci __be32 block_count; 928c2ecf20Sopenharmony_ci} __packed; 938c2ecf20Sopenharmony_citypedef struct hfsplus_extent hfsplus_extent_rec[8]; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci/* Information for a "Fork" in a file */ 968c2ecf20Sopenharmony_cistruct hfsplus_fork_raw { 978c2ecf20Sopenharmony_ci __be64 total_size; 988c2ecf20Sopenharmony_ci __be32 clump_size; 998c2ecf20Sopenharmony_ci __be32 total_blocks; 1008c2ecf20Sopenharmony_ci hfsplus_extent_rec extents; 1018c2ecf20Sopenharmony_ci} __packed; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci/* HFS+ Volume Header */ 1048c2ecf20Sopenharmony_cistruct hfsplus_vh { 1058c2ecf20Sopenharmony_ci __be16 signature; 1068c2ecf20Sopenharmony_ci __be16 version; 1078c2ecf20Sopenharmony_ci __be32 attributes; 1088c2ecf20Sopenharmony_ci __be32 last_mount_vers; 1098c2ecf20Sopenharmony_ci u32 reserved; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci __be32 create_date; 1128c2ecf20Sopenharmony_ci __be32 modify_date; 1138c2ecf20Sopenharmony_ci __be32 backup_date; 1148c2ecf20Sopenharmony_ci __be32 checked_date; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci __be32 file_count; 1178c2ecf20Sopenharmony_ci __be32 folder_count; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci __be32 blocksize; 1208c2ecf20Sopenharmony_ci __be32 total_blocks; 1218c2ecf20Sopenharmony_ci __be32 free_blocks; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci __be32 next_alloc; 1248c2ecf20Sopenharmony_ci __be32 rsrc_clump_sz; 1258c2ecf20Sopenharmony_ci __be32 data_clump_sz; 1268c2ecf20Sopenharmony_ci hfsplus_cnid next_cnid; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci __be32 write_count; 1298c2ecf20Sopenharmony_ci __be64 encodings_bmp; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci u32 finder_info[8]; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci struct hfsplus_fork_raw alloc_file; 1348c2ecf20Sopenharmony_ci struct hfsplus_fork_raw ext_file; 1358c2ecf20Sopenharmony_ci struct hfsplus_fork_raw cat_file; 1368c2ecf20Sopenharmony_ci struct hfsplus_fork_raw attr_file; 1378c2ecf20Sopenharmony_ci struct hfsplus_fork_raw start_file; 1388c2ecf20Sopenharmony_ci} __packed; 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci/* HFS+ volume attributes */ 1418c2ecf20Sopenharmony_ci#define HFSPLUS_VOL_UNMNT (1 << 8) 1428c2ecf20Sopenharmony_ci#define HFSPLUS_VOL_SPARE_BLK (1 << 9) 1438c2ecf20Sopenharmony_ci#define HFSPLUS_VOL_NOCACHE (1 << 10) 1448c2ecf20Sopenharmony_ci#define HFSPLUS_VOL_INCNSTNT (1 << 11) 1458c2ecf20Sopenharmony_ci#define HFSPLUS_VOL_NODEID_REUSED (1 << 12) 1468c2ecf20Sopenharmony_ci#define HFSPLUS_VOL_JOURNALED (1 << 13) 1478c2ecf20Sopenharmony_ci#define HFSPLUS_VOL_SOFTLOCK (1 << 15) 1488c2ecf20Sopenharmony_ci#define HFSPLUS_VOL_UNUSED_NODE_FIX (1 << 31) 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci/* HFS+ BTree node descriptor */ 1518c2ecf20Sopenharmony_cistruct hfs_bnode_desc { 1528c2ecf20Sopenharmony_ci __be32 next; 1538c2ecf20Sopenharmony_ci __be32 prev; 1548c2ecf20Sopenharmony_ci s8 type; 1558c2ecf20Sopenharmony_ci u8 height; 1568c2ecf20Sopenharmony_ci __be16 num_recs; 1578c2ecf20Sopenharmony_ci u16 reserved; 1588c2ecf20Sopenharmony_ci} __packed; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci/* HFS+ BTree node types */ 1618c2ecf20Sopenharmony_ci#define HFS_NODE_INDEX 0x00 /* An internal (index) node */ 1628c2ecf20Sopenharmony_ci#define HFS_NODE_HEADER 0x01 /* The tree header node (node 0) */ 1638c2ecf20Sopenharmony_ci#define HFS_NODE_MAP 0x02 /* Holds part of the bitmap of used nodes */ 1648c2ecf20Sopenharmony_ci#define HFS_NODE_LEAF 0xFF /* A leaf (ndNHeight==1) node */ 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci/* HFS+ BTree header */ 1678c2ecf20Sopenharmony_cistruct hfs_btree_header_rec { 1688c2ecf20Sopenharmony_ci __be16 depth; 1698c2ecf20Sopenharmony_ci __be32 root; 1708c2ecf20Sopenharmony_ci __be32 leaf_count; 1718c2ecf20Sopenharmony_ci __be32 leaf_head; 1728c2ecf20Sopenharmony_ci __be32 leaf_tail; 1738c2ecf20Sopenharmony_ci __be16 node_size; 1748c2ecf20Sopenharmony_ci __be16 max_key_len; 1758c2ecf20Sopenharmony_ci __be32 node_count; 1768c2ecf20Sopenharmony_ci __be32 free_nodes; 1778c2ecf20Sopenharmony_ci u16 reserved1; 1788c2ecf20Sopenharmony_ci __be32 clump_size; 1798c2ecf20Sopenharmony_ci u8 btree_type; 1808c2ecf20Sopenharmony_ci u8 key_type; 1818c2ecf20Sopenharmony_ci __be32 attributes; 1828c2ecf20Sopenharmony_ci u32 reserved3[16]; 1838c2ecf20Sopenharmony_ci} __packed; 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci/* BTree attributes */ 1868c2ecf20Sopenharmony_ci#define HFS_TREE_BIGKEYS 2 1878c2ecf20Sopenharmony_ci#define HFS_TREE_VARIDXKEYS 4 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci/* HFS+ BTree misc info */ 1908c2ecf20Sopenharmony_ci#define HFSPLUS_TREE_HEAD 0 1918c2ecf20Sopenharmony_ci#define HFSPLUS_NODE_MXSZ 32768 1928c2ecf20Sopenharmony_ci#define HFSPLUS_ATTR_TREE_NODE_SIZE 8192 1938c2ecf20Sopenharmony_ci#define HFSPLUS_BTREE_HDR_NODE_RECS_COUNT 3 1948c2ecf20Sopenharmony_ci#define HFSPLUS_BTREE_HDR_USER_BYTES 128 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci/* Some special File ID numbers (stolen from hfs.h) */ 1978c2ecf20Sopenharmony_ci#define HFSPLUS_POR_CNID 1 /* Parent Of the Root */ 1988c2ecf20Sopenharmony_ci#define HFSPLUS_ROOT_CNID 2 /* ROOT directory */ 1998c2ecf20Sopenharmony_ci#define HFSPLUS_EXT_CNID 3 /* EXTents B-tree */ 2008c2ecf20Sopenharmony_ci#define HFSPLUS_CAT_CNID 4 /* CATalog B-tree */ 2018c2ecf20Sopenharmony_ci#define HFSPLUS_BAD_CNID 5 /* BAD blocks file */ 2028c2ecf20Sopenharmony_ci#define HFSPLUS_ALLOC_CNID 6 /* ALLOCation file */ 2038c2ecf20Sopenharmony_ci#define HFSPLUS_START_CNID 7 /* STARTup file */ 2048c2ecf20Sopenharmony_ci#define HFSPLUS_ATTR_CNID 8 /* ATTRibutes file */ 2058c2ecf20Sopenharmony_ci#define HFSPLUS_EXCH_CNID 15 /* ExchangeFiles temp id */ 2068c2ecf20Sopenharmony_ci#define HFSPLUS_FIRSTUSER_CNID 16 /* first available user id */ 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci/* btree key type */ 2098c2ecf20Sopenharmony_ci#define HFSPLUS_KEY_CASEFOLDING 0xCF /* case-insensitive */ 2108c2ecf20Sopenharmony_ci#define HFSPLUS_KEY_BINARY 0xBC /* case-sensitive */ 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci/* HFS+ catalog entry key */ 2138c2ecf20Sopenharmony_cistruct hfsplus_cat_key { 2148c2ecf20Sopenharmony_ci __be16 key_len; 2158c2ecf20Sopenharmony_ci hfsplus_cnid parent; 2168c2ecf20Sopenharmony_ci struct hfsplus_unistr name; 2178c2ecf20Sopenharmony_ci} __packed; 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci#define HFSPLUS_CAT_KEYLEN (sizeof(struct hfsplus_cat_key)) 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci/* Structs from hfs.h */ 2228c2ecf20Sopenharmony_cistruct hfsp_point { 2238c2ecf20Sopenharmony_ci __be16 v; 2248c2ecf20Sopenharmony_ci __be16 h; 2258c2ecf20Sopenharmony_ci} __packed; 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_cistruct hfsp_rect { 2288c2ecf20Sopenharmony_ci __be16 top; 2298c2ecf20Sopenharmony_ci __be16 left; 2308c2ecf20Sopenharmony_ci __be16 bottom; 2318c2ecf20Sopenharmony_ci __be16 right; 2328c2ecf20Sopenharmony_ci} __packed; 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci/* HFS directory info (stolen from hfs.h */ 2368c2ecf20Sopenharmony_cistruct DInfo { 2378c2ecf20Sopenharmony_ci struct hfsp_rect frRect; 2388c2ecf20Sopenharmony_ci __be16 frFlags; 2398c2ecf20Sopenharmony_ci struct hfsp_point frLocation; 2408c2ecf20Sopenharmony_ci __be16 frView; 2418c2ecf20Sopenharmony_ci} __packed; 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_cistruct DXInfo { 2448c2ecf20Sopenharmony_ci struct hfsp_point frScroll; 2458c2ecf20Sopenharmony_ci __be32 frOpenChain; 2468c2ecf20Sopenharmony_ci __be16 frUnused; 2478c2ecf20Sopenharmony_ci __be16 frComment; 2488c2ecf20Sopenharmony_ci __be32 frPutAway; 2498c2ecf20Sopenharmony_ci} __packed; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci/* HFS+ folder data (part of an hfsplus_cat_entry) */ 2528c2ecf20Sopenharmony_cistruct hfsplus_cat_folder { 2538c2ecf20Sopenharmony_ci __be16 type; 2548c2ecf20Sopenharmony_ci __be16 flags; 2558c2ecf20Sopenharmony_ci __be32 valence; 2568c2ecf20Sopenharmony_ci hfsplus_cnid id; 2578c2ecf20Sopenharmony_ci __be32 create_date; 2588c2ecf20Sopenharmony_ci __be32 content_mod_date; 2598c2ecf20Sopenharmony_ci __be32 attribute_mod_date; 2608c2ecf20Sopenharmony_ci __be32 access_date; 2618c2ecf20Sopenharmony_ci __be32 backup_date; 2628c2ecf20Sopenharmony_ci struct hfsplus_perm permissions; 2638c2ecf20Sopenharmony_ci struct DInfo user_info; 2648c2ecf20Sopenharmony_ci struct DXInfo finder_info; 2658c2ecf20Sopenharmony_ci __be32 text_encoding; 2668c2ecf20Sopenharmony_ci __be32 subfolders; /* Subfolder count in HFSX. Reserved in HFS+. */ 2678c2ecf20Sopenharmony_ci} __packed; 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci/* HFS file info (stolen from hfs.h) */ 2708c2ecf20Sopenharmony_cistruct FInfo { 2718c2ecf20Sopenharmony_ci __be32 fdType; 2728c2ecf20Sopenharmony_ci __be32 fdCreator; 2738c2ecf20Sopenharmony_ci __be16 fdFlags; 2748c2ecf20Sopenharmony_ci struct hfsp_point fdLocation; 2758c2ecf20Sopenharmony_ci __be16 fdFldr; 2768c2ecf20Sopenharmony_ci} __packed; 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_cistruct FXInfo { 2798c2ecf20Sopenharmony_ci __be16 fdIconID; 2808c2ecf20Sopenharmony_ci u8 fdUnused[8]; 2818c2ecf20Sopenharmony_ci __be16 fdComment; 2828c2ecf20Sopenharmony_ci __be32 fdPutAway; 2838c2ecf20Sopenharmony_ci} __packed; 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci/* HFS+ file data (part of a cat_entry) */ 2868c2ecf20Sopenharmony_cistruct hfsplus_cat_file { 2878c2ecf20Sopenharmony_ci __be16 type; 2888c2ecf20Sopenharmony_ci __be16 flags; 2898c2ecf20Sopenharmony_ci u32 reserved1; 2908c2ecf20Sopenharmony_ci hfsplus_cnid id; 2918c2ecf20Sopenharmony_ci __be32 create_date; 2928c2ecf20Sopenharmony_ci __be32 content_mod_date; 2938c2ecf20Sopenharmony_ci __be32 attribute_mod_date; 2948c2ecf20Sopenharmony_ci __be32 access_date; 2958c2ecf20Sopenharmony_ci __be32 backup_date; 2968c2ecf20Sopenharmony_ci struct hfsplus_perm permissions; 2978c2ecf20Sopenharmony_ci struct FInfo user_info; 2988c2ecf20Sopenharmony_ci struct FXInfo finder_info; 2998c2ecf20Sopenharmony_ci __be32 text_encoding; 3008c2ecf20Sopenharmony_ci u32 reserved2; 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci struct hfsplus_fork_raw data_fork; 3038c2ecf20Sopenharmony_ci struct hfsplus_fork_raw rsrc_fork; 3048c2ecf20Sopenharmony_ci} __packed; 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_ci/* File and folder flag bits */ 3078c2ecf20Sopenharmony_ci#define HFSPLUS_FILE_LOCKED 0x0001 3088c2ecf20Sopenharmony_ci#define HFSPLUS_FILE_THREAD_EXISTS 0x0002 3098c2ecf20Sopenharmony_ci#define HFSPLUS_XATTR_EXISTS 0x0004 3108c2ecf20Sopenharmony_ci#define HFSPLUS_ACL_EXISTS 0x0008 3118c2ecf20Sopenharmony_ci#define HFSPLUS_HAS_FOLDER_COUNT 0x0010 /* Folder has subfolder count 3128c2ecf20Sopenharmony_ci * (HFSX only) */ 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_ci/* HFS+ catalog thread (part of a cat_entry) */ 3158c2ecf20Sopenharmony_cistruct hfsplus_cat_thread { 3168c2ecf20Sopenharmony_ci __be16 type; 3178c2ecf20Sopenharmony_ci s16 reserved; 3188c2ecf20Sopenharmony_ci hfsplus_cnid parentID; 3198c2ecf20Sopenharmony_ci struct hfsplus_unistr nodeName; 3208c2ecf20Sopenharmony_ci} __packed; 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ci#define HFSPLUS_MIN_THREAD_SZ 10 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ci/* A data record in the catalog tree */ 3258c2ecf20Sopenharmony_citypedef union { 3268c2ecf20Sopenharmony_ci __be16 type; 3278c2ecf20Sopenharmony_ci struct hfsplus_cat_folder folder; 3288c2ecf20Sopenharmony_ci struct hfsplus_cat_file file; 3298c2ecf20Sopenharmony_ci struct hfsplus_cat_thread thread; 3308c2ecf20Sopenharmony_ci} __packed hfsplus_cat_entry; 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci/* HFS+ catalog entry type */ 3338c2ecf20Sopenharmony_ci#define HFSPLUS_FOLDER 0x0001 3348c2ecf20Sopenharmony_ci#define HFSPLUS_FILE 0x0002 3358c2ecf20Sopenharmony_ci#define HFSPLUS_FOLDER_THREAD 0x0003 3368c2ecf20Sopenharmony_ci#define HFSPLUS_FILE_THREAD 0x0004 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci/* HFS+ extents tree key */ 3398c2ecf20Sopenharmony_cistruct hfsplus_ext_key { 3408c2ecf20Sopenharmony_ci __be16 key_len; 3418c2ecf20Sopenharmony_ci u8 fork_type; 3428c2ecf20Sopenharmony_ci u8 pad; 3438c2ecf20Sopenharmony_ci hfsplus_cnid cnid; 3448c2ecf20Sopenharmony_ci __be32 start_block; 3458c2ecf20Sopenharmony_ci} __packed; 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ci#define HFSPLUS_EXT_KEYLEN sizeof(struct hfsplus_ext_key) 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_ci#define HFSPLUS_XATTR_FINDER_INFO_NAME "com.apple.FinderInfo" 3508c2ecf20Sopenharmony_ci#define HFSPLUS_XATTR_ACL_NAME "com.apple.system.Security" 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci#define HFSPLUS_ATTR_INLINE_DATA 0x10 3538c2ecf20Sopenharmony_ci#define HFSPLUS_ATTR_FORK_DATA 0x20 3548c2ecf20Sopenharmony_ci#define HFSPLUS_ATTR_EXTENTS 0x30 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci/* HFS+ attributes tree key */ 3578c2ecf20Sopenharmony_cistruct hfsplus_attr_key { 3588c2ecf20Sopenharmony_ci __be16 key_len; 3598c2ecf20Sopenharmony_ci __be16 pad; 3608c2ecf20Sopenharmony_ci hfsplus_cnid cnid; 3618c2ecf20Sopenharmony_ci __be32 start_block; 3628c2ecf20Sopenharmony_ci struct hfsplus_attr_unistr key_name; 3638c2ecf20Sopenharmony_ci} __packed; 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ci#define HFSPLUS_ATTR_KEYLEN sizeof(struct hfsplus_attr_key) 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_ci/* HFS+ fork data attribute */ 3688c2ecf20Sopenharmony_cistruct hfsplus_attr_fork_data { 3698c2ecf20Sopenharmony_ci __be32 record_type; 3708c2ecf20Sopenharmony_ci __be32 reserved; 3718c2ecf20Sopenharmony_ci struct hfsplus_fork_raw the_fork; 3728c2ecf20Sopenharmony_ci} __packed; 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci/* HFS+ extension attribute */ 3758c2ecf20Sopenharmony_cistruct hfsplus_attr_extents { 3768c2ecf20Sopenharmony_ci __be32 record_type; 3778c2ecf20Sopenharmony_ci __be32 reserved; 3788c2ecf20Sopenharmony_ci struct hfsplus_extent extents; 3798c2ecf20Sopenharmony_ci} __packed; 3808c2ecf20Sopenharmony_ci 3818c2ecf20Sopenharmony_ci#define HFSPLUS_MAX_INLINE_DATA_SIZE 3802 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ci/* HFS+ attribute inline data */ 3848c2ecf20Sopenharmony_cistruct hfsplus_attr_inline_data { 3858c2ecf20Sopenharmony_ci __be32 record_type; 3868c2ecf20Sopenharmony_ci __be32 reserved1; 3878c2ecf20Sopenharmony_ci u8 reserved2[6]; 3888c2ecf20Sopenharmony_ci __be16 length; 3898c2ecf20Sopenharmony_ci u8 raw_bytes[HFSPLUS_MAX_INLINE_DATA_SIZE]; 3908c2ecf20Sopenharmony_ci} __packed; 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_ci/* A data record in the attributes tree */ 3938c2ecf20Sopenharmony_citypedef union { 3948c2ecf20Sopenharmony_ci __be32 record_type; 3958c2ecf20Sopenharmony_ci struct hfsplus_attr_fork_data fork_data; 3968c2ecf20Sopenharmony_ci struct hfsplus_attr_extents extents; 3978c2ecf20Sopenharmony_ci struct hfsplus_attr_inline_data inline_data; 3988c2ecf20Sopenharmony_ci} __packed hfsplus_attr_entry; 3998c2ecf20Sopenharmony_ci 4008c2ecf20Sopenharmony_ci/* HFS+ generic BTree key */ 4018c2ecf20Sopenharmony_citypedef union { 4028c2ecf20Sopenharmony_ci __be16 key_len; 4038c2ecf20Sopenharmony_ci struct hfsplus_cat_key cat; 4048c2ecf20Sopenharmony_ci struct hfsplus_ext_key ext; 4058c2ecf20Sopenharmony_ci struct hfsplus_attr_key attr; 4068c2ecf20Sopenharmony_ci} __packed hfsplus_btree_key; 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ci#endif 409