11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  linux/include/linux/hfsplus_raw.h
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Brad Boyer (flar@pants.nu)
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (C) 2003 Ardis Technologies <roman@ardistech.com>
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Format of structures on disk
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Information taken from Apple Technote #1150 (HFS Plus Volume Format)
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _LINUX_HFSPLUS_RAW_H
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _LINUX_HFSPLUS_RAW_H
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Some constants */
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_SECTOR_SIZE        512
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_SECTOR_SHIFT         9
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_VOLHEAD_SECTOR       2
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_VOLHEAD_SIG     0x482b
232179d372d9f8b5fc5c189c89bc6a565a42151b23David Elliott#define HFSPLUS_VOLHEAD_SIGX    0x4858
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_SUPER_MAGIC     0x482b
252179d372d9f8b5fc5c189c89bc6a565a42151b23David Elliott#define HFSPLUS_MIN_VERSION          4
262179d372d9f8b5fc5c189c89bc6a565a42151b23David Elliott#define HFSPLUS_CURRENT_VERSION      5
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_WRAP_MAGIC         0x4244
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_WRAP_ATTRIB_SLOCK  0x8000
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_WRAP_ATTRIB_SPARED 0x0200
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_WRAPOFF_SIG          0x00
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_WRAPOFF_ATTRIB       0x0A
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_WRAPOFF_ABLKSIZE     0x14
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_WRAPOFF_ABLKSTART    0x1C
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_WRAPOFF_EMBEDSIG     0x7C
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_WRAPOFF_EMBEDEXT     0x7E
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
392753cc281c9a0e8a0a45ee2b8110866a9fe63bddAnton Salikhmetov#define HFSP_HIDDENDIR_NAME \
402753cc281c9a0e8a0a45ee2b8110866a9fe63bddAnton Salikhmetov	"\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80HFS+ Private Data"
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_HARDLINK_TYPE	0x686c6e6b	/* 'hlnk' */
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_HFSPLUS_CREATOR	0x6866732b	/* 'hfs+' */
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
456b192832daae6d141063c49ae1ded6f7dddee50eRoman Zippel#define HFSP_SYMLINK_TYPE	0x736c6e6b	/* 'slnk' */
466b192832daae6d141063c49ae1ded6f7dddee50eRoman Zippel#define HFSP_SYMLINK_CREATOR	0x72686170	/* 'rhap' */
476b192832daae6d141063c49ae1ded6f7dddee50eRoman Zippel
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSP_MOUNT_VERSION	0x482b4c78	/* 'H+Lx' */
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Structures used on disk */
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef __be32 hfsplus_cnid;
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef __be16 hfsplus_unichr;
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
559ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_MAX_STRLEN 255
569ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_ATTR_MAX_STRLEN 127
579ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* A "string" as used in filenames, etc. */
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsplus_unistr {
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 length;
619ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	hfsplus_unichr unicode[HFSPLUS_MAX_STRLEN];
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
649ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko/*
659ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko * A "string" is used in attributes file
669ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko * for name of extended attribute
679ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko */
689ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeykostruct hfsplus_attr_unistr {
699ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be16 length;
709ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	hfsplus_unichr unicode[HFSPLUS_ATTR_MAX_STRLEN];
719ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko} __packed;
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* POSIX permissions */
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsplus_perm {
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 owner;
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 group;
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8  rootflags;
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8  userflags;
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 mode;
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 dev;
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_FLG_NODUMP	0x01
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_FLG_IMMUTABLE	0x02
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_FLG_APPEND	0x04
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* A single contiguous area of a file */
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsplus_extent {
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 start_block;
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 block_count;
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct hfsplus_extent hfsplus_extent_rec[8];
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Information for a "Fork" in a file */
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsplus_fork_raw {
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be64 total_size;
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 clump_size;
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 total_blocks;
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hfsplus_extent_rec extents;
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ Volume Header */
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsplus_vh {
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 signature;
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 version;
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 attributes;
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 last_mount_vers;
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 reserved;
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 create_date;
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 modify_date;
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 backup_date;
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 checked_date;
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 file_count;
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 folder_count;
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 blocksize;
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 total_blocks;
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 free_blocks;
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 next_alloc;
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 rsrc_clump_sz;
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 data_clump_sz;
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hfsplus_cnid next_cnid;
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 write_count;
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be64 encodings_bmp;
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1300347b6e95ceeb648631f89a0ced001e90e4daaa9Matthew Garrett	u32 finder_info[8];
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_fork_raw alloc_file;
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_fork_raw ext_file;
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_fork_raw cat_file;
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_fork_raw attr_file;
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_fork_raw start_file;
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ volume attributes */
140b0b623c3b22d57d6941b200321779d56c4e79e6bRoman Zippel#define HFSPLUS_VOL_UNMNT		(1 << 8)
141b0b623c3b22d57d6941b200321779d56c4e79e6bRoman Zippel#define HFSPLUS_VOL_SPARE_BLK		(1 << 9)
142b0b623c3b22d57d6941b200321779d56c4e79e6bRoman Zippel#define HFSPLUS_VOL_NOCACHE		(1 << 10)
143b0b623c3b22d57d6941b200321779d56c4e79e6bRoman Zippel#define HFSPLUS_VOL_INCNSTNT		(1 << 11)
144b0b623c3b22d57d6941b200321779d56c4e79e6bRoman Zippel#define HFSPLUS_VOL_NODEID_REUSED	(1 << 12)
145b0b623c3b22d57d6941b200321779d56c4e79e6bRoman Zippel#define HFSPLUS_VOL_JOURNALED		(1 << 13)
146b0b623c3b22d57d6941b200321779d56c4e79e6bRoman Zippel#define HFSPLUS_VOL_SOFTLOCK		(1 << 15)
1472cd282a1bc6b9d111b8beee63bea0af735a8a1aaSergei Antonov#define HFSPLUS_VOL_UNUSED_NODE_FIX	(1 << 31)
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ BTree node descriptor */
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfs_bnode_desc {
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 next;
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 prev;
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	s8 type;
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 height;
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 num_recs;
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 reserved;
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ BTree node types */
16074a797d99a9fa4871ca978ac65e0f3a90dcf84d8Michael Opdenacker#define HFS_NODE_INDEX	0x00	/* An internal (index) node */
16174a797d99a9fa4871ca978ac65e0f3a90dcf84d8Michael Opdenacker#define HFS_NODE_HEADER	0x01	/* The tree header node (node 0) */
16274a797d99a9fa4871ca978ac65e0f3a90dcf84d8Michael Opdenacker#define HFS_NODE_MAP	0x02	/* Holds part of the bitmap of used nodes */
16374a797d99a9fa4871ca978ac65e0f3a90dcf84d8Michael Opdenacker#define HFS_NODE_LEAF	0xFF	/* A leaf (ndNHeight==1) node */
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ BTree header */
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfs_btree_header_rec {
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 depth;
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 root;
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 leaf_count;
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 leaf_head;
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 leaf_tail;
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 node_size;
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 max_key_len;
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 node_count;
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 free_nodes;
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 reserved1;
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 clump_size;
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 btree_type;
1792179d372d9f8b5fc5c189c89bc6a565a42151b23David Elliott	u8 key_type;
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 attributes;
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 reserved3[16];
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* BTree attributes */
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFS_TREE_BIGKEYS	2
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFS_TREE_VARIDXKEYS	4
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ BTree misc info */
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_TREE_HEAD 0
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_NODE_MXSZ 32768
191099e9245e04d50bb12ed621b4fa61df0a4c9dba9Vyacheslav Dubeyko#define HFSPLUS_ATTR_TREE_NODE_SIZE		8192
192099e9245e04d50bb12ed621b4fa61df0a4c9dba9Vyacheslav Dubeyko#define HFSPLUS_BTREE_HDR_NODE_RECS_COUNT	3
193099e9245e04d50bb12ed621b4fa61df0a4c9dba9Vyacheslav Dubeyko#define HFSPLUS_BTREE_HDR_USER_BYTES		128
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Some special File ID numbers (stolen from hfs.h) */
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_POR_CNID		1	/* Parent Of the Root */
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_ROOT_CNID		2	/* ROOT directory */
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_EXT_CNID		3	/* EXTents B-tree */
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_CAT_CNID		4	/* CATalog B-tree */
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_BAD_CNID		5	/* BAD blocks file */
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_ALLOC_CNID		6	/* ALLOCation file */
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_START_CNID		7	/* STARTup file */
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_ATTR_CNID		8	/* ATTRibutes file */
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_EXCH_CNID		15	/* ExchangeFiles temp id */
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_FIRSTUSER_CNID		16	/* first available user id */
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2072179d372d9f8b5fc5c189c89bc6a565a42151b23David Elliott/* btree key type */
2082179d372d9f8b5fc5c189c89bc6a565a42151b23David Elliott#define HFSPLUS_KEY_CASEFOLDING		0xCF	/* case-insensitive */
2092179d372d9f8b5fc5c189c89bc6a565a42151b23David Elliott#define HFSPLUS_KEY_BINARY		0xBC	/* case-sensitive */
2102179d372d9f8b5fc5c189c89bc6a565a42151b23David Elliott
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ catalog entry key */
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsplus_cat_key {
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 key_len;
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hfsplus_cnid parent;
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_unistr name;
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2189250f925972d03ccc0c0a4dd4e9b794d2ef6d52bEric Sandeen#define HFSPLUS_CAT_KEYLEN	(sizeof(struct hfsplus_cat_key))
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Structs from hfs.h */
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsp_point {
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 v;
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 h;
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsp_rect {
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 top;
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 left;
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 bottom;
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 right;
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS directory info (stolen from hfs.h */
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct DInfo {
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsp_rect frRect;
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 frFlags;
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsp_point frLocation;
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 frView;
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct DXInfo {
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsp_point frScroll;
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 frOpenChain;
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 frUnused;
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 frComment;
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 frPutAway;
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ folder data (part of an hfsplus_cat_entry) */
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsplus_cat_folder {
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 type;
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 flags;
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 valence;
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hfsplus_cnid id;
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 create_date;
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 content_mod_date;
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 attribute_mod_date;
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 access_date;
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 backup_date;
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_perm permissions;
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct DInfo user_info;
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct DXInfo finder_info;
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 text_encoding;
265d7d673a591701f131e53d4fd4e2b9352f1316642Sergei Antonov	__be32 subfolders;	/* Subfolder count in HFSX. Reserved in HFS+. */
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS file info (stolen from hfs.h) */
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct FInfo {
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 fdType;
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 fdCreator;
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 fdFlags;
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsp_point fdLocation;
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 fdFldr;
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct FXInfo {
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 fdIconID;
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 fdUnused[8];
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 fdComment;
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 fdPutAway;
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ file data (part of a cat_entry) */
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsplus_cat_file {
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 type;
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 flags;
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 reserved1;
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hfsplus_cnid id;
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 create_date;
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 content_mod_date;
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 attribute_mod_date;
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 access_date;
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 backup_date;
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_perm permissions;
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct FInfo user_info;
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct FXInfo finder_info;
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 text_encoding;
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 reserved2;
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_fork_raw data_fork;
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_fork_raw rsrc_fork;
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
305d7d673a591701f131e53d4fd4e2b9352f1316642Sergei Antonov/* File and folder flag bits */
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_FILE_LOCKED		0x0001
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_FILE_THREAD_EXISTS	0x0002
3089ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_XATTR_EXISTS		0x0004
3099ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_ACL_EXISTS		0x0008
310d7d673a591701f131e53d4fd4e2b9352f1316642Sergei Antonov#define HFSPLUS_HAS_FOLDER_COUNT	0x0010	/* Folder has subfolder count
311d7d673a591701f131e53d4fd4e2b9352f1316642Sergei Antonov						 * (HFSX only) */
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ catalog thread (part of a cat_entry) */
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsplus_cat_thread {
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 type;
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	s16 reserved;
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hfsplus_cnid parentID;
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_unistr nodeName;
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_MIN_THREAD_SZ 10
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* A data record in the catalog tree */
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef union {
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 type;
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_cat_folder folder;
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_cat_file file;
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_cat_thread thread;
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed hfsplus_cat_entry;
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ catalog entry type */
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_FOLDER         0x0001
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_FILE           0x0002
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_FOLDER_THREAD  0x0003
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HFSPLUS_FILE_THREAD    0x0004
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ extents tree key */
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct hfsplus_ext_key {
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 key_len;
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 fork_type;
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 pad;
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hfsplus_cnid cnid;
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be32 start_block;
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed;
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3469250f925972d03ccc0c0a4dd4e9b794d2ef6d52bEric Sandeen#define HFSPLUS_EXT_KEYLEN	sizeof(struct hfsplus_ext_key)
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3489ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_XATTR_FINDER_INFO_NAME "com.apple.FinderInfo"
3499ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_XATTR_ACL_NAME "com.apple.system.Security"
3509ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko
3519ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_ATTR_INLINE_DATA 0x10
3529ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_ATTR_FORK_DATA   0x20
3539ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_ATTR_EXTENTS     0x30
3549ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko
3559ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko/* HFS+ attributes tree key */
3569ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeykostruct hfsplus_attr_key {
3579ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be16 key_len;
3589ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be16 pad;
3599ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	hfsplus_cnid cnid;
3609ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be32 start_block;
3619ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	struct hfsplus_attr_unistr key_name;
3629ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko} __packed;
3639ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko
3649ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_ATTR_KEYLEN	sizeof(struct hfsplus_attr_key)
3659ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko
3669ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko/* HFS+ fork data attribute */
3679ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeykostruct hfsplus_attr_fork_data {
3689ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be32 record_type;
3699ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be32 reserved;
3709ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	struct hfsplus_fork_raw the_fork;
3719ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko} __packed;
3729ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko
3739ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko/* HFS+ extension attribute */
3749ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeykostruct hfsplus_attr_extents {
3759ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be32 record_type;
3769ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be32 reserved;
3779ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	struct hfsplus_extent extents;
3789ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko} __packed;
3799ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko
3809ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko#define HFSPLUS_MAX_INLINE_DATA_SIZE 3802
3819ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko
3829ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko/* HFS+ attribute inline data */
3839ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeykostruct hfsplus_attr_inline_data {
3849ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be32 record_type;
3859ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be32 reserved1;
3869ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	u8 reserved2[6];
3879ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be16 length;
3889ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	u8 raw_bytes[HFSPLUS_MAX_INLINE_DATA_SIZE];
3899ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko} __packed;
3909ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko
3919ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko/* A data record in the attributes tree */
3929ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeykotypedef union {
3939ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	__be32 record_type;
3949ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	struct hfsplus_attr_fork_data fork_data;
3959ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	struct hfsplus_attr_extents extents;
3969ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	struct hfsplus_attr_inline_data inline_data;
3979ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko} __packed hfsplus_attr_entry;
3989ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* HFS+ generic BTree key */
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef union {
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__be16 key_len;
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_cat_key cat;
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hfsplus_ext_key ext;
4049ed083d8ccc6186448c3558c6f40b40ba0b1568aVyacheslav Dubeyko	struct hfsplus_attr_key attr;
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} __packed hfsplus_btree_key;
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
408