1/* 2 * linux/include/linux/hfsplus_raw.h 3 * 4 * Copyright (C) 1999 5 * Brad Boyer (flar@pants.nu) 6 * (C) 2003 Ardis Technologies <roman@ardistech.com> 7 * 8 * Format of structures on disk 9 * Information taken from Apple Technote #1150 (HFS Plus Volume Format) 10 * 11 */ 12 13#ifndef _LINUX_HFSPLUS_RAW_H 14#define _LINUX_HFSPLUS_RAW_H 15 16#include <linux/types.h> 17 18/* Some constants */ 19#define HFSPLUS_SECTOR_SIZE 512 20#define HFSPLUS_SECTOR_SHIFT 9 21#define HFSPLUS_VOLHEAD_SECTOR 2 22#define HFSPLUS_VOLHEAD_SIG 0x482b 23#define HFSPLUS_VOLHEAD_SIGX 0x4858 24#define HFSPLUS_SUPER_MAGIC 0x482b 25#define HFSPLUS_MIN_VERSION 4 26#define HFSPLUS_CURRENT_VERSION 5 27 28#define HFSP_WRAP_MAGIC 0x4244 29#define HFSP_WRAP_ATTRIB_SLOCK 0x8000 30#define HFSP_WRAP_ATTRIB_SPARED 0x0200 31 32#define HFSP_WRAPOFF_SIG 0x00 33#define HFSP_WRAPOFF_ATTRIB 0x0A 34#define HFSP_WRAPOFF_ABLKSIZE 0x14 35#define HFSP_WRAPOFF_ABLKSTART 0x1C 36#define HFSP_WRAPOFF_EMBEDSIG 0x7C 37#define HFSP_WRAPOFF_EMBEDEXT 0x7E 38 39#define HFSP_HIDDENDIR_NAME "\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80HFS+ Private Data" 40 41#define HFSP_HARDLINK_TYPE 0x686c6e6b /* 'hlnk' */ 42#define HFSP_HFSPLUS_CREATOR 0x6866732b /* 'hfs+' */ 43 44#define HFSP_SYMLINK_TYPE 0x736c6e6b /* 'slnk' */ 45#define HFSP_SYMLINK_CREATOR 0x72686170 /* 'rhap' */ 46 47#define HFSP_MOUNT_VERSION 0x482b4c78 /* 'H+Lx' */ 48#define HFSP_MOUNT_JOURNALED_VERSION 0x4846534A 49 50/* Structures used on disk */ 51 52typedef __be32 hfsplus_cnid; 53typedef __be16 hfsplus_unichr; 54 55/* A "string" as used in filenames, etc. */ 56struct hfsplus_unistr { 57 __be16 length; 58 hfsplus_unichr unicode[255]; 59} __packed; 60 61#define HFSPLUS_MAX_STRLEN 255 62 63/* POSIX permissions */ 64struct hfsplus_perm { 65 __be32 owner; 66 __be32 group; 67 u8 rootflags; 68 u8 userflags; 69 __be16 mode; 70 __be32 dev; 71} __packed; 72 73#define HFSPLUS_FLG_NODUMP 0x01 74#define HFSPLUS_FLG_IMMUTABLE 0x02 75#define HFSPLUS_FLG_APPEND 0x04 76 77/* A single contiguous area of a file */ 78struct hfsplus_extent { 79 __be32 start_block; 80 __be32 block_count; 81} __packed; 82typedef struct hfsplus_extent hfsplus_extent_rec[8]; 83 84/* Information for a "Fork" in a file */ 85struct hfsplus_fork_raw { 86 __be64 total_size; 87 __be32 clump_size; 88 __be32 total_blocks; 89 hfsplus_extent_rec extents; 90} __packed; 91 92/* HFS+ Volume Header */ 93struct hfsplus_vh { 94 __be16 signature; 95 __be16 version; 96 __be32 attributes; 97 __be32 last_mount_vers; 98 __be32 journal_info_block; 99 100 __be32 create_date; 101 __be32 modify_date; 102 __be32 backup_date; 103 __be32 checked_date; 104 105 __be32 file_count; 106 __be32 folder_count; 107 108 __be32 blocksize; 109 __be32 total_blocks; 110 __be32 free_blocks; 111 112 __be32 next_alloc; 113 __be32 rsrc_clump_sz; 114 __be32 data_clump_sz; 115 hfsplus_cnid next_cnid; 116 117 __be32 write_count; 118 __be64 encodings_bmp; 119 120 u8 finder_info[32]; 121 122 struct hfsplus_fork_raw alloc_file; 123 struct hfsplus_fork_raw ext_file; 124 struct hfsplus_fork_raw cat_file; 125 struct hfsplus_fork_raw attr_file; 126 struct hfsplus_fork_raw start_file; 127} __packed; 128 129/* HFS+ volume attributes */ 130#define HFSPLUS_VOL_UNMNT (1 << 8) 131#define HFSPLUS_VOL_SPARE_BLK (1 << 9) 132#define HFSPLUS_VOL_NOCACHE (1 << 10) 133#define HFSPLUS_VOL_INCNSTNT (1 << 11) 134#define HFSPLUS_VOL_NODEID_REUSED (1 << 12) 135//#define HFSPLUS_VOL_JOURNALED (1 << 13) 136#define HFSPLUS_VOL_JOURNALED (0 << 13) 137#define HFSPLUS_VOL_SOFTLOCK (1 << 15) 138 139/* HFS+ BTree node descriptor */ 140struct hfs_bnode_desc { 141 __be32 next; 142 __be32 prev; 143 s8 type; 144 u8 height; 145 __be16 num_recs; 146 u16 reserved; 147} __packed; 148 149/* HFS+ BTree node types */ 150#define HFS_NODE_INDEX 0x00 151#define HFS_NODE_HEADER 0x01 152#define HFS_NODE_MAP 0x02 153#define HFS_NODE_LEAF 0xFF 154 155/* HFS+ BTree header */ 156struct hfs_btree_header_rec { 157 __be16 depth; 158 __be32 root; 159 __be32 leaf_count; 160 __be32 leaf_head; 161 __be32 leaf_tail; 162 __be16 node_size; 163 __be16 max_key_len; 164 __be32 node_count; 165 __be32 free_nodes; 166 u16 reserved1; 167 __be32 clump_size; 168 u8 btree_type; 169 u8 key_type; 170 __be32 attributes; 171 u32 reserved3[16]; 172} __packed; 173 174/* BTree attributes */ 175#define HFS_TREE_BIGKEYS 2 176#define HFS_TREE_VARIDXKEYS 4 177 178/* HFS+ BTree misc info */ 179#define HFSPLUS_TREE_HEAD 0 180#define HFSPLUS_NODE_MXSZ 32768 181 182/* Some special File ID numbers (stolen from hfs.h) */ 183#define HFSPLUS_POR_CNID 1 /* Parent Of the Root */ 184#define HFSPLUS_ROOT_CNID 2 /* ROOT directory */ 185#define HFSPLUS_EXT_CNID 3 /* EXTents B-tree */ 186#define HFSPLUS_CAT_CNID 4 /* CATalog B-tree */ 187#define HFSPLUS_BAD_CNID 5 /* BAD blocks file */ 188#define HFSPLUS_ALLOC_CNID 6 /* ALLOCation file */ 189#define HFSPLUS_START_CNID 7 /* STARTup file */ 190#define HFSPLUS_ATTR_CNID 8 /* ATTRibutes file */ 191#define HFSPLUS_EXCH_CNID 15 /* ExchangeFiles temp id */ 192#define HFSPLUS_FIRSTUSER_CNID 16 /* first available user id */ 193 194/* btree key type */ 195#define HFSPLUS_KEY_CASEFOLDING 0xCF /* case-insensitive */ 196#define HFSPLUS_KEY_BINARY 0xBC /* case-sensitive */ 197 198/* HFS+ catalog entry key */ 199struct hfsplus_cat_key { 200 __be16 key_len; 201 hfsplus_cnid parent; 202 struct hfsplus_unistr name; 203} __packed; 204 205#define HFSPLUS_CAT_KEYLEN (sizeof(struct hfsplus_cat_key)) 206 207/* Structs from hfs.h */ 208struct hfsp_point { 209 __be16 v; 210 __be16 h; 211} __packed; 212 213struct hfsp_rect { 214 __be16 top; 215 __be16 left; 216 __be16 bottom; 217 __be16 right; 218} __packed; 219 220 221/* HFS directory info (stolen from hfs.h */ 222struct DInfo { 223 struct hfsp_rect frRect; 224 __be16 frFlags; 225 struct hfsp_point frLocation; 226 __be16 frView; 227} __packed; 228 229struct DXInfo { 230 struct hfsp_point frScroll; 231 __be32 frOpenChain; 232 __be16 frUnused; 233 __be16 frComment; 234 __be32 frPutAway; 235} __packed; 236 237/* HFS+ folder data (part of an hfsplus_cat_entry) */ 238struct hfsplus_cat_folder { 239 __be16 type; 240 __be16 flags; 241 __be32 valence; 242 hfsplus_cnid id; 243 __be32 create_date; 244 __be32 content_mod_date; 245 __be32 attribute_mod_date; 246 __be32 access_date; 247 __be32 backup_date; 248 struct hfsplus_perm permissions; 249 struct DInfo user_info; 250 struct DXInfo finder_info; 251 __be32 text_encoding; 252 u32 reserved; 253} __packed; 254 255/* HFS file info (stolen from hfs.h) */ 256struct FInfo { 257 __be32 fdType; 258 __be32 fdCreator; 259 __be16 fdFlags; 260 struct hfsp_point fdLocation; 261 __be16 fdFldr; 262} __packed; 263 264struct FXInfo { 265 __be16 fdIconID; 266 u8 fdUnused[8]; 267 __be16 fdComment; 268 __be32 fdPutAway; 269} __packed; 270 271/* HFS+ file data (part of a cat_entry) */ 272struct hfsplus_cat_file { 273 __be16 type; 274 __be16 flags; 275 u32 reserved1; 276 hfsplus_cnid id; 277 __be32 create_date; 278 __be32 content_mod_date; 279 __be32 attribute_mod_date; 280 __be32 access_date; 281 __be32 backup_date; 282 struct hfsplus_perm permissions; 283 struct FInfo user_info; 284 struct FXInfo finder_info; 285 __be32 text_encoding; 286 u32 reserved2; 287 288 struct hfsplus_fork_raw data_fork; 289 struct hfsplus_fork_raw rsrc_fork; 290} __packed; 291 292/* File attribute bits */ 293#define HFSPLUS_FILE_LOCKED 0x0001 294#define HFSPLUS_FILE_THREAD_EXISTS 0x0002 295 296/* HFS+ catalog thread (part of a cat_entry) */ 297struct hfsplus_cat_thread { 298 __be16 type; 299 s16 reserved; 300 hfsplus_cnid parentID; 301 struct hfsplus_unistr nodeName; 302} __packed; 303 304#define HFSPLUS_MIN_THREAD_SZ 10 305 306/* A data record in the catalog tree */ 307typedef union { 308 __be16 type; 309 struct hfsplus_cat_folder folder; 310 struct hfsplus_cat_file file; 311 struct hfsplus_cat_thread thread; 312} __packed hfsplus_cat_entry; 313 314/* HFS+ catalog entry type */ 315#define HFSPLUS_FOLDER 0x0001 316#define HFSPLUS_FILE 0x0002 317#define HFSPLUS_FOLDER_THREAD 0x0003 318#define HFSPLUS_FILE_THREAD 0x0004 319 320/* HFS+ extents tree key */ 321struct hfsplus_ext_key { 322 __be16 key_len; 323 u8 fork_type; 324 u8 pad; 325 hfsplus_cnid cnid; 326 __be32 start_block; 327} __packed; 328 329#define HFSPLUS_EXT_KEYLEN sizeof(struct hfsplus_ext_key) 330 331/* HFS+ generic BTree key */ 332typedef union { 333 __be16 key_len; 334 struct hfsplus_cat_key cat; 335 struct hfsplus_ext_key ext; 336} __packed hfsplus_btree_key; 337 338struct hfsplus_journal_info_block { 339 __be32 flags; 340 __be32 device_signature[8]; 341 __be64 offset; 342 __be64 size; 343 u32 reserved[32]; 344} __packed; 345 346/* Possible values of flags */ 347#define HFSPLUS_JOURNAL_IN_FS 0x01 348#define HFSPLUS_JOURNAL_ON_OTHER_DEVICE 0x02 349#define HFSPLUS_JOURNAL_NEED_INIT 0x04 350 351struct hfsplus_journal_header { 352 __be32 magic; 353 __be32 endian; 354 __be64 start; 355 __be64 end; 356 __be64 size; /* This includes the journal header and the journal buffer */ 357 __be32 blhdr_size; 358 __be32 checksum; 359 __be32 jhdr_size; 360} __packed; 361 362/* Valid magic and endian value */ 363#define HFSPLUS_JOURNAL_HEADER_MAGIC 0x4A4E4C78 364#define HFSPLUS_JOURNAL_HEADER_ENDIAN 0x12345678 365 366struct hfsplus_block_info { 367 __be64 bnum; 368 __be32 bsize; 369 __be32 next; 370} __packed; 371 372struct hfsplus_blhdr { 373 __be16 max_blocks; 374 __be16 num_blocks; 375 __be32 bytes_used; 376 __be32 checksum; 377 __be32 pad; 378 struct hfsplus_block_info binfo[1]; 379} __packed; 380 381typedef struct hfsplus_blhdr hfsplus_blhdr_t; 382 383#endif 384