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