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
 148/* HFS+ BTree node descriptor */
 149struct hfs_bnode_desc {
 150        __be32 next;
 151        __be32 prev;
 152        s8 type;
 153        u8 height;
 154        __be16 num_recs;
 155        u16 reserved;
 156} __packed;
 157
 158/* HFS+ BTree node types */
 159#define HFS_NODE_INDEX  0x00
 160#define HFS_NODE_HEADER 0x01
 161#define HFS_NODE_MAP    0x02
 162#define HFS_NODE_LEAF   0xFF
 163
 164/* HFS+ BTree header */
 165struct hfs_btree_header_rec {
 166        __be16 depth;
 167        __be32 root;
 168        __be32 leaf_count;
 169        __be32 leaf_head;
 170        __be32 leaf_tail;
 171        __be16 node_size;
 172        __be16 max_key_len;
 173        __be32 node_count;
 174        __be32 free_nodes;
 175        u16 reserved1;
 176        __be32 clump_size;
 177        u8 btree_type;
 178        u8 key_type;
 179        __be32 attributes;
 180        u32 reserved3[16];
 181} __packed;
 182
 183/* BTree attributes */
 184#define HFS_TREE_BIGKEYS        2
 185#define HFS_TREE_VARIDXKEYS     4
 186
 187/* HFS+ BTree misc info */
 188#define HFSPLUS_TREE_HEAD 0
 189#define HFSPLUS_NODE_MXSZ 32768
 190
 191/* Some special File ID numbers (stolen from hfs.h) */
 192#define HFSPLUS_POR_CNID                1       /* Parent Of the Root */
 193#define HFSPLUS_ROOT_CNID               2       /* ROOT directory */
 194#define HFSPLUS_EXT_CNID                3       /* EXTents B-tree */
 195#define HFSPLUS_CAT_CNID                4       /* CATalog B-tree */
 196#define HFSPLUS_BAD_CNID                5       /* BAD blocks file */
 197#define HFSPLUS_ALLOC_CNID              6       /* ALLOCation file */
 198#define HFSPLUS_START_CNID              7       /* STARTup file */
 199#define HFSPLUS_ATTR_CNID               8       /* ATTRibutes file */
 200#define HFSPLUS_EXCH_CNID               15      /* ExchangeFiles temp id */
 201#define HFSPLUS_FIRSTUSER_CNID          16      /* first available user id */
 202
 203/* btree key type */
 204#define HFSPLUS_KEY_CASEFOLDING         0xCF    /* case-insensitive */
 205#define HFSPLUS_KEY_BINARY              0xBC    /* case-sensitive */
 206
 207/* HFS+ catalog entry key */
 208struct hfsplus_cat_key {
 209        __be16 key_len;
 210        hfsplus_cnid parent;
 211        struct hfsplus_unistr name;
 212} __packed;
 213
 214#define HFSPLUS_CAT_KEYLEN      (sizeof(struct hfsplus_cat_key))
 215
 216/* Structs from hfs.h */
 217struct hfsp_point {
 218        __be16 v;
 219        __be16 h;
 220} __packed;
 221
 222struct hfsp_rect {
 223        __be16 top;
 224        __be16 left;
 225        __be16 bottom;
 226        __be16 right;
 227} __packed;
 228
 229
 230/* HFS directory info (stolen from hfs.h */
 231struct DInfo {
 232        struct hfsp_rect frRect;
 233        __be16 frFlags;
 234        struct hfsp_point frLocation;
 235        __be16 frView;
 236} __packed;
 237
 238struct DXInfo {
 239        struct hfsp_point frScroll;
 240        __be32 frOpenChain;
 241        __be16 frUnused;
 242        __be16 frComment;
 243        __be32 frPutAway;
 244} __packed;
 245
 246/* HFS+ folder data (part of an hfsplus_cat_entry) */
 247struct hfsplus_cat_folder {
 248        __be16 type;
 249        __be16 flags;
 250        __be32 valence;
 251        hfsplus_cnid id;
 252        __be32 create_date;
 253        __be32 content_mod_date;
 254        __be32 attribute_mod_date;
 255        __be32 access_date;
 256        __be32 backup_date;
 257        struct hfsplus_perm permissions;
 258        struct DInfo user_info;
 259        struct DXInfo finder_info;
 260        __be32 text_encoding;
 261        u32 reserved;
 262} __packed;
 263
 264/* HFS file info (stolen from hfs.h) */
 265struct FInfo {
 266        __be32 fdType;
 267        __be32 fdCreator;
 268        __be16 fdFlags;
 269        struct hfsp_point fdLocation;
 270        __be16 fdFldr;
 271} __packed;
 272
 273struct FXInfo {
 274        __be16 fdIconID;
 275        u8 fdUnused[8];
 276        __be16 fdComment;
 277        __be32 fdPutAway;
 278} __packed;
 279
 280/* HFS+ file data (part of a cat_entry) */
 281struct hfsplus_cat_file {
 282        __be16 type;
 283        __be16 flags;
 284        u32 reserved1;
 285        hfsplus_cnid id;
 286        __be32 create_date;
 287        __be32 content_mod_date;
 288        __be32 attribute_mod_date;
 289        __be32 access_date;
 290        __be32 backup_date;
 291        struct hfsplus_perm permissions;
 292        struct FInfo user_info;
 293        struct FXInfo finder_info;
 294        __be32 text_encoding;
 295        u32 reserved2;
 296
 297        struct hfsplus_fork_raw data_fork;
 298        struct hfsplus_fork_raw rsrc_fork;
 299} __packed;
 300
 301/* File attribute bits */
 302#define HFSPLUS_FILE_LOCKED             0x0001
 303#define HFSPLUS_FILE_THREAD_EXISTS      0x0002
 304#define HFSPLUS_XATTR_EXISTS            0x0004
 305#define HFSPLUS_ACL_EXISTS              0x0008
 306
 307/* HFS+ catalog thread (part of a cat_entry) */
 308struct hfsplus_cat_thread {
 309        __be16 type;
 310        s16 reserved;
 311        hfsplus_cnid parentID;
 312        struct hfsplus_unistr nodeName;
 313} __packed;
 314
 315#define HFSPLUS_MIN_THREAD_SZ 10
 316
 317/* A data record in the catalog tree */
 318typedef union {
 319        __be16 type;
 320        struct hfsplus_cat_folder folder;
 321        struct hfsplus_cat_file file;
 322        struct hfsplus_cat_thread thread;
 323} __packed hfsplus_cat_entry;
 324
 325/* HFS+ catalog entry type */
 326#define HFSPLUS_FOLDER         0x0001
 327#define HFSPLUS_FILE           0x0002
 328#define HFSPLUS_FOLDER_THREAD  0x0003
 329#define HFSPLUS_FILE_THREAD    0x0004
 330
 331/* HFS+ extents tree key */
 332struct hfsplus_ext_key {
 333        __be16 key_len;
 334        u8 fork_type;
 335        u8 pad;
 336        hfsplus_cnid cnid;
 337        __be32 start_block;
 338} __packed;
 339
 340#define HFSPLUS_EXT_KEYLEN      sizeof(struct hfsplus_ext_key)
 341
 342#define HFSPLUS_XATTR_FINDER_INFO_NAME "com.apple.FinderInfo"
 343#define HFSPLUS_XATTR_ACL_NAME "com.apple.system.Security"
 344
 345#define HFSPLUS_ATTR_INLINE_DATA 0x10
 346#define HFSPLUS_ATTR_FORK_DATA   0x20
 347#define HFSPLUS_ATTR_EXTENTS     0x30
 348
 349/* HFS+ attributes tree key */
 350struct hfsplus_attr_key {
 351        __be16 key_len;
 352        __be16 pad;
 353        hfsplus_cnid cnid;
 354        __be32 start_block;
 355        struct hfsplus_attr_unistr key_name;
 356} __packed;
 357
 358#define HFSPLUS_ATTR_KEYLEN     sizeof(struct hfsplus_attr_key)
 359
 360/* HFS+ fork data attribute */
 361struct hfsplus_attr_fork_data {
 362        __be32 record_type;
 363        __be32 reserved;
 364        struct hfsplus_fork_raw the_fork;
 365} __packed;
 366
 367/* HFS+ extension attribute */
 368struct hfsplus_attr_extents {
 369        __be32 record_type;
 370        __be32 reserved;
 371        struct hfsplus_extent extents;
 372} __packed;
 373
 374#define HFSPLUS_MAX_INLINE_DATA_SIZE 3802
 375
 376/* HFS+ attribute inline data */
 377struct hfsplus_attr_inline_data {
 378        __be32 record_type;
 379        __be32 reserved1;
 380        u8 reserved2[6];
 381        __be16 length;
 382        u8 raw_bytes[HFSPLUS_MAX_INLINE_DATA_SIZE];
 383} __packed;
 384
 385/* A data record in the attributes tree */
 386typedef union {
 387        __be32 record_type;
 388        struct hfsplus_attr_fork_data fork_data;
 389        struct hfsplus_attr_extents extents;
 390        struct hfsplus_attr_inline_data inline_data;
 391} __packed hfsplus_attr_entry;
 392
 393/* HFS+ generic BTree key */
 394typedef union {
 395        __be16 key_len;
 396        struct hfsplus_cat_key cat;
 397        struct hfsplus_ext_key ext;
 398        struct hfsplus_attr_key attr;
 399} __packed hfsplus_btree_key;
 400
 401#endif
 402