linux/fs/hfsplus/hfsplus_raw.h
<<
>>
Prefs
   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 \
  40        "\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80\xe2\x90\x80HFS+ Private Data"
  41
  42#define HFSP_HARDLINK_TYPE      0x686c6e6b      /* 'hlnk' */
  43#define HFSP_HFSPLUS_CREATOR    0x6866732b      /* 'hfs+' */
  44
  45#define HFSP_SYMLINK_TYPE       0x736c6e6b      /* 'slnk' */
  46#define HFSP_SYMLINK_CREATOR    0x72686170      /* 'rhap' */
  47
  48#define HFSP_MOUNT_VERSION      0x482b4c78      /* 'H+Lx' */
  49
  50/* Structures used on disk */
  51
  52typedef __be32 hfsplus_cnid;
  53typedef __be16 hfsplus_unichr;
  54
  55#define HFSPLUS_MAX_STRLEN 255
  56#define HFSPLUS_ATTR_MAX_STRLEN 127
  57
  58/* A "string" as used in filenames, etc. */
  59struct hfsplus_unistr {
  60        __be16 length;
  61        hfsplus_unichr unicode[HFSPLUS_MAX_STRLEN];
  62} __packed;
  63
  64/*
  65 * A "string" is used in attributes file
  66 * for name of extended attribute
  67 */
  68struct hfsplus_attr_unistr {
  69        __be16 length;
  70        hfsplus_unichr unicode[HFSPLUS_ATTR_MAX_STRLEN];
  71} __packed;
  72
  73/* POSIX permissions */
  74struct hfsplus_perm {
  75        __be32 owner;
  76        __be32 group;
  77        u8  rootflags;
  78        u8  userflags;
  79        __be16 mode;
  80        __be32 dev;
  81} __packed;
  82
  83#define HFSPLUS_FLG_NODUMP      0x01
  84#define HFSPLUS_FLG_IMMUTABLE   0x02
  85#define HFSPLUS_FLG_APPEND      0x04
  86
  87/* A single contiguous area of a file */
  88struct hfsplus_extent {
  89        __be32 start_block;
  90        __be32 block_count;
  91} __packed;
  92typedef struct hfsplus_extent hfsplus_extent_rec[8];
  93
  94/* Information for a "Fork" in a file */
  95struct hfsplus_fork_raw {
  96        __be64 total_size;
  97        __be32 clump_size;
  98        __be32 total_blocks;
  99        hfsplus_extent_rec extents;
 100} __packed;
 101
 102/* HFS+ Volume Header */
 103struct hfsplus_vh {
 104        __be16 signature;
 105        __be16 version;
 106        __be32 attributes;
 107        __be32 last_mount_vers;
 108        u32 reserved;
 109
 110        __be32 create_date;
 111        __be32 modify_date;
 112        __be32 backup_date;
 113        __be32 checked_date;
 114
 115        __be32 file_count;
 116        __be32 folder_count;
 117
 118        __be32 blocksize;
 119        __be32 total_blocks;
 120        __be32 free_blocks;
 121
 122        __be32 next_alloc;
 123        __be32 rsrc_clump_sz;
 124        __be32 data_clump_sz;
 125        hfsplus_cnid next_cnid;
 126
 127        __be32 write_count;
 128        __be64 encodings_bmp;
 129
 130        u32 finder_info[8];
 131
 132        struct hfsplus_fork_raw alloc_file;
 133        struct hfsplus_fork_raw ext_file;
 134        struct hfsplus_fork_raw cat_file;
 135        struct hfsplus_fork_raw attr_file;
 136        struct hfsplus_fork_raw start_file;
 137} __packed;
 138
 139/* HFS+ volume attributes */
 140#define HFSPLUS_VOL_UNMNT               (1 << 8)
 141#define HFSPLUS_VOL_SPARE_BLK           (1 << 9)
 142#define HFSPLUS_VOL_NOCACHE             (1 << 10)
 143#define HFSPLUS_VOL_INCNSTNT            (1 << 11)
 144#define HFSPLUS_VOL_NODEID_REUSED       (1 << 12)
 145#define HFSPLUS_VOL_JOURNALED           (1 << 13)
 146#define HFSPLUS_VOL_SOFTLOCK            (1 << 15)
 147#define HFSPLUS_VOL_UNUSED_NODE_FIX     (1 << 31)
 148
 149/* HFS+ BTree node descriptor */
 150struct hfs_bnode_desc {
 151        __be32 next;
 152        __be32 prev;
 153        s8 type;
 154        u8 height;
 155        __be16 num_recs;
 156        u16 reserved;
 157} __packed;
 158
 159/* HFS+ BTree node types */
 160#define HFS_NODE_INDEX  0x00    /* An internal (index) node */
 161#define HFS_NODE_HEADER 0x01    /* The tree header node (node 0) */
 162#define HFS_NODE_MAP    0x02    /* Holds part of the bitmap of used nodes */
 163#define HFS_NODE_LEAF   0xFF    /* A leaf (ndNHeight==1) node */
 164
 165/* HFS+ BTree header */
 166struct hfs_btree_header_rec {
 167        __be16 depth;
 168        __be32 root;
 169        __be32 leaf_count;
 170        __be32 leaf_head;
 171        __be32 leaf_tail;
 172        __be16 node_size;
 173        __be16 max_key_len;
 174        __be32 node_count;
 175        __be32 free_nodes;
 176        u16 reserved1;
 177        __be32 clump_size;
 178        u8 btree_type;
 179        u8 key_type;
 180        __be32 attributes;
 181        u32 reserved3[16];
 182} __packed;
 183
 184/* BTree attributes */
 185#define HFS_TREE_BIGKEYS        2
 186#define HFS_TREE_VARIDXKEYS     4
 187
 188/* HFS+ BTree misc info */
 189#define HFSPLUS_TREE_HEAD 0
 190#define HFSPLUS_NODE_MXSZ 32768
 191#define HFSPLUS_ATTR_TREE_NODE_SIZE             8192
 192#define HFSPLUS_BTREE_HDR_NODE_RECS_COUNT       3
 193#define HFSPLUS_BTREE_HDR_USER_BYTES            128
 194
 195/* Some special File ID numbers (stolen from hfs.h) */
 196#define HFSPLUS_POR_CNID                1       /* Parent Of the Root */
 197#define HFSPLUS_ROOT_CNID               2       /* ROOT directory */
 198#define HFSPLUS_EXT_CNID                3       /* EXTents B-tree */
 199#define HFSPLUS_CAT_CNID                4       /* CATalog B-tree */
 200#define HFSPLUS_BAD_CNID                5       /* BAD blocks file */
 201#define HFSPLUS_ALLOC_CNID              6       /* ALLOCation file */
 202#define HFSPLUS_START_CNID              7       /* STARTup file */
 203#define HFSPLUS_ATTR_CNID               8       /* ATTRibutes file */
 204#define HFSPLUS_EXCH_CNID               15      /* ExchangeFiles temp id */
 205#define HFSPLUS_FIRSTUSER_CNID          16      /* first available user id */
 206
 207/* btree key type */
 208#define HFSPLUS_KEY_CASEFOLDING         0xCF    /* case-insensitive */
 209#define HFSPLUS_KEY_BINARY              0xBC    /* case-sensitive */
 210
 211/* HFS+ catalog entry key */
 212struct hfsplus_cat_key {
 213        __be16 key_len;
 214        hfsplus_cnid parent;
 215        struct hfsplus_unistr name;
 216} __packed;
 217
 218#define HFSPLUS_CAT_KEYLEN      (sizeof(struct hfsplus_cat_key))
 219
 220/* Structs from hfs.h */
 221struct hfsp_point {
 222        __be16 v;
 223        __be16 h;
 224} __packed;
 225
 226struct hfsp_rect {
 227        __be16 top;
 228        __be16 left;
 229        __be16 bottom;
 230        __be16 right;
 231} __packed;
 232
 233
 234/* HFS directory info (stolen from hfs.h */
 235struct DInfo {
 236        struct hfsp_rect frRect;
 237        __be16 frFlags;
 238        struct hfsp_point frLocation;
 239        __be16 frView;
 240} __packed;
 241
 242struct DXInfo {
 243        struct hfsp_point frScroll;
 244        __be32 frOpenChain;
 245        __be16 frUnused;
 246        __be16 frComment;
 247        __be32 frPutAway;
 248} __packed;
 249
 250/* HFS+ folder data (part of an hfsplus_cat_entry) */
 251struct hfsplus_cat_folder {
 252        __be16 type;
 253        __be16 flags;
 254        __be32 valence;
 255        hfsplus_cnid id;
 256        __be32 create_date;
 257        __be32 content_mod_date;
 258        __be32 attribute_mod_date;
 259        __be32 access_date;
 260        __be32 backup_date;
 261        struct hfsplus_perm permissions;
 262        struct DInfo user_info;
 263        struct DXInfo finder_info;
 264        __be32 text_encoding;
 265        __be32 subfolders;      /* Subfolder count in HFSX. Reserved in HFS+. */
 266} __packed;
 267
 268/* HFS file info (stolen from hfs.h) */
 269struct FInfo {
 270        __be32 fdType;
 271        __be32 fdCreator;
 272        __be16 fdFlags;
 273        struct hfsp_point fdLocation;
 274        __be16 fdFldr;
 275} __packed;
 276
 277struct FXInfo {
 278        __be16 fdIconID;
 279        u8 fdUnused[8];
 280        __be16 fdComment;
 281        __be32 fdPutAway;
 282} __packed;
 283
 284/* HFS+ file data (part of a cat_entry) */
 285struct hfsplus_cat_file {
 286        __be16 type;
 287        __be16 flags;
 288        u32 reserved1;
 289        hfsplus_cnid id;
 290        __be32 create_date;
 291        __be32 content_mod_date;
 292        __be32 attribute_mod_date;
 293        __be32 access_date;
 294        __be32 backup_date;
 295        struct hfsplus_perm permissions;
 296        struct FInfo user_info;
 297        struct FXInfo finder_info;
 298        __be32 text_encoding;
 299        u32 reserved2;
 300
 301        struct hfsplus_fork_raw data_fork;
 302        struct hfsplus_fork_raw rsrc_fork;
 303} __packed;
 304
 305/* File and folder flag bits */
 306#define HFSPLUS_FILE_LOCKED             0x0001
 307#define HFSPLUS_FILE_THREAD_EXISTS      0x0002
 308#define HFSPLUS_XATTR_EXISTS            0x0004
 309#define HFSPLUS_ACL_EXISTS              0x0008
 310#define HFSPLUS_HAS_FOLDER_COUNT        0x0010  /* Folder has subfolder count
 311                                                 * (HFSX only) */
 312
 313/* HFS+ catalog thread (part of a cat_entry) */
 314struct hfsplus_cat_thread {
 315        __be16 type;
 316        s16 reserved;
 317        hfsplus_cnid parentID;
 318        struct hfsplus_unistr nodeName;
 319} __packed;
 320
 321#define HFSPLUS_MIN_THREAD_SZ 10
 322
 323/* A data record in the catalog tree */
 324typedef union {
 325        __be16 type;
 326        struct hfsplus_cat_folder folder;
 327        struct hfsplus_cat_file file;
 328        struct hfsplus_cat_thread thread;
 329} __packed hfsplus_cat_entry;
 330
 331/* HFS+ catalog entry type */
 332#define HFSPLUS_FOLDER         0x0001
 333#define HFSPLUS_FILE           0x0002
 334#define HFSPLUS_FOLDER_THREAD  0x0003
 335#define HFSPLUS_FILE_THREAD    0x0004
 336
 337/* HFS+ extents tree key */
 338struct hfsplus_ext_key {
 339        __be16 key_len;
 340        u8 fork_type;
 341        u8 pad;
 342        hfsplus_cnid cnid;
 343        __be32 start_block;
 344} __packed;
 345
 346#define HFSPLUS_EXT_KEYLEN      sizeof(struct hfsplus_ext_key)
 347
 348#define HFSPLUS_XATTR_FINDER_INFO_NAME "com.apple.FinderInfo"
 349#define HFSPLUS_XATTR_ACL_NAME "com.apple.system.Security"
 350
 351#define HFSPLUS_ATTR_INLINE_DATA 0x10
 352#define HFSPLUS_ATTR_FORK_DATA   0x20
 353#define HFSPLUS_ATTR_EXTENTS     0x30
 354
 355/* HFS+ attributes tree key */
 356struct hfsplus_attr_key {
 357        __be16 key_len;
 358        __be16 pad;
 359        hfsplus_cnid cnid;
 360        __be32 start_block;
 361        struct hfsplus_attr_unistr key_name;
 362} __packed;
 363
 364#define HFSPLUS_ATTR_KEYLEN     sizeof(struct hfsplus_attr_key)
 365
 366/* HFS+ fork data attribute */
 367struct hfsplus_attr_fork_data {
 368        __be32 record_type;
 369        __be32 reserved;
 370        struct hfsplus_fork_raw the_fork;
 371} __packed;
 372
 373/* HFS+ extension attribute */
 374struct hfsplus_attr_extents {
 375        __be32 record_type;
 376        __be32 reserved;
 377        struct hfsplus_extent extents;
 378} __packed;
 379
 380#define HFSPLUS_MAX_INLINE_DATA_SIZE 3802
 381
 382/* HFS+ attribute inline data */
 383struct hfsplus_attr_inline_data {
 384        __be32 record_type;
 385        __be32 reserved1;
 386        u8 reserved2[6];
 387        __be16 length;
 388        u8 raw_bytes[HFSPLUS_MAX_INLINE_DATA_SIZE];
 389} __packed;
 390
 391/* A data record in the attributes tree */
 392typedef union {
 393        __be32 record_type;
 394        struct hfsplus_attr_fork_data fork_data;
 395        struct hfsplus_attr_extents extents;
 396        struct hfsplus_attr_inline_data inline_data;
 397} __packed hfsplus_attr_entry;
 398
 399/* HFS+ generic BTree key */
 400typedef union {
 401        __be16 key_len;
 402        struct hfsplus_cat_key cat;
 403        struct hfsplus_ext_key ext;
 404        struct hfsplus_attr_key attr;
 405} __packed hfsplus_btree_key;
 406
 407#endif
 408