diff options
Diffstat (limited to 'fs/hfsplus/hfsplus_raw.h')
| -rw-r--r-- | fs/hfsplus/hfsplus_raw.h | 91 | 
1 files changed, 81 insertions, 10 deletions
diff --git a/fs/hfsplus/hfsplus_raw.h b/fs/hfsplus/hfsplus_raw.h index 6892899fd6f..8298d0985f8 100644 --- a/fs/hfsplus/hfsplus_raw.h +++ b/fs/hfsplus/hfsplus_raw.h @@ -36,7 +36,8 @@  #define HFSP_WRAPOFF_EMBEDSIG     0x7C  #define HFSP_WRAPOFF_EMBEDEXT     0x7E -#define HFSP_HIDDENDIR_NAME	"\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80HFS+ Private Data" +#define HFSP_HIDDENDIR_NAME \ +	"\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80HFS+ Private Data"  #define HFSP_HARDLINK_TYPE	0x686c6e6b	/* 'hlnk' */  #define HFSP_HFSPLUS_CREATOR	0x6866732b	/* 'hfs+' */ @@ -51,13 +52,23 @@  typedef __be32 hfsplus_cnid;  typedef __be16 hfsplus_unichr; +#define HFSPLUS_MAX_STRLEN 255 +#define HFSPLUS_ATTR_MAX_STRLEN 127 +  /* A "string" as used in filenames, etc. */  struct hfsplus_unistr {  	__be16 length; -	hfsplus_unichr unicode[255]; +	hfsplus_unichr unicode[HFSPLUS_MAX_STRLEN];  } __packed; -#define HFSPLUS_MAX_STRLEN 255 +/* + * A "string" is used in attributes file + * for name of extended attribute + */ +struct hfsplus_attr_unistr { +	__be16 length; +	hfsplus_unichr unicode[HFSPLUS_ATTR_MAX_STRLEN]; +} __packed;  /* POSIX permissions */  struct hfsplus_perm { @@ -116,7 +127,7 @@ struct hfsplus_vh {  	__be32 write_count;  	__be64 encodings_bmp; -	u8 finder_info[32]; +	u32 finder_info[8];  	struct hfsplus_fork_raw alloc_file;  	struct hfsplus_fork_raw ext_file; @@ -133,6 +144,7 @@ struct hfsplus_vh {  #define HFSPLUS_VOL_NODEID_REUSED	(1 << 12)  #define HFSPLUS_VOL_JOURNALED		(1 << 13)  #define HFSPLUS_VOL_SOFTLOCK		(1 << 15) +#define HFSPLUS_VOL_UNUSED_NODE_FIX	(1 << 31)  /* HFS+ BTree node descriptor */  struct hfs_bnode_desc { @@ -145,10 +157,10 @@ struct hfs_bnode_desc {  } __packed;  /* HFS+ BTree node types */ -#define HFS_NODE_INDEX	0x00 -#define HFS_NODE_HEADER	0x01 -#define HFS_NODE_MAP	0x02 -#define HFS_NODE_LEAF	0xFF +#define HFS_NODE_INDEX	0x00	/* An internal (index) node */ +#define HFS_NODE_HEADER	0x01	/* The tree header node (node 0) */ +#define HFS_NODE_MAP	0x02	/* Holds part of the bitmap of used nodes */ +#define HFS_NODE_LEAF	0xFF	/* A leaf (ndNHeight==1) node */  /* HFS+ BTree header */  struct hfs_btree_header_rec { @@ -176,6 +188,9 @@ struct hfs_btree_header_rec {  /* HFS+ BTree misc info */  #define HFSPLUS_TREE_HEAD 0  #define HFSPLUS_NODE_MXSZ 32768 +#define HFSPLUS_ATTR_TREE_NODE_SIZE		8192 +#define HFSPLUS_BTREE_HDR_NODE_RECS_COUNT	3 +#define HFSPLUS_BTREE_HDR_USER_BYTES		128  /* Some special File ID numbers (stolen from hfs.h) */  #define HFSPLUS_POR_CNID		1	/* Parent Of the Root */ @@ -247,7 +262,7 @@ struct hfsplus_cat_folder {  	struct DInfo user_info;  	struct DXInfo finder_info;  	__be32 text_encoding; -	u32 reserved; +	__be32 subfolders;	/* Subfolder count in HFSX. Reserved in HFS+. */  } __packed;  /* HFS file info (stolen from hfs.h) */ @@ -287,9 +302,13 @@ struct hfsplus_cat_file {  	struct hfsplus_fork_raw rsrc_fork;  } __packed; -/* File attribute bits */ +/* File and folder flag bits */  #define HFSPLUS_FILE_LOCKED		0x0001  #define HFSPLUS_FILE_THREAD_EXISTS	0x0002 +#define HFSPLUS_XATTR_EXISTS		0x0004 +#define HFSPLUS_ACL_EXISTS		0x0008 +#define HFSPLUS_HAS_FOLDER_COUNT	0x0010	/* Folder has subfolder count +						 * (HFSX only) */  /* HFS+ catalog thread (part of a cat_entry) */  struct hfsplus_cat_thread { @@ -326,11 +345,63 @@ struct hfsplus_ext_key {  #define HFSPLUS_EXT_KEYLEN	sizeof(struct hfsplus_ext_key) +#define HFSPLUS_XATTR_FINDER_INFO_NAME "com.apple.FinderInfo" +#define HFSPLUS_XATTR_ACL_NAME "com.apple.system.Security" + +#define HFSPLUS_ATTR_INLINE_DATA 0x10 +#define HFSPLUS_ATTR_FORK_DATA   0x20 +#define HFSPLUS_ATTR_EXTENTS     0x30 + +/* HFS+ attributes tree key */ +struct hfsplus_attr_key { +	__be16 key_len; +	__be16 pad; +	hfsplus_cnid cnid; +	__be32 start_block; +	struct hfsplus_attr_unistr key_name; +} __packed; + +#define HFSPLUS_ATTR_KEYLEN	sizeof(struct hfsplus_attr_key) + +/* HFS+ fork data attribute */ +struct hfsplus_attr_fork_data { +	__be32 record_type; +	__be32 reserved; +	struct hfsplus_fork_raw the_fork; +} __packed; + +/* HFS+ extension attribute */ +struct hfsplus_attr_extents { +	__be32 record_type; +	__be32 reserved; +	struct hfsplus_extent extents; +} __packed; + +#define HFSPLUS_MAX_INLINE_DATA_SIZE 3802 + +/* HFS+ attribute inline data */ +struct hfsplus_attr_inline_data { +	__be32 record_type; +	__be32 reserved1; +	u8 reserved2[6]; +	__be16 length; +	u8 raw_bytes[HFSPLUS_MAX_INLINE_DATA_SIZE]; +} __packed; + +/* A data record in the attributes tree */ +typedef union { +	__be32 record_type; +	struct hfsplus_attr_fork_data fork_data; +	struct hfsplus_attr_extents extents; +	struct hfsplus_attr_inline_data inline_data; +} __packed hfsplus_attr_entry; +  /* HFS+ generic BTree key */  typedef union {  	__be16 key_len;  	struct hfsplus_cat_key cat;  	struct hfsplus_ext_key ext; +	struct hfsplus_attr_key attr;  } __packed hfsplus_btree_key;  #endif  | 
