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