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     "\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
  49/* Structures used on disk */
  50
  51typedef __be32 hfsplus_cnid;
  52typedef __be16 hfsplus_unichr;
  53
  54/* A "string" as used in filenames, etc. */
  55struct hfsplus_unistr {
  56        __be16 length;
  57        hfsplus_unichr unicode[255];
  58} __packed;
  59
  60#define HFSPLUS_MAX_STRLEN 255
  61
  62/* POSIX permissions */
  63struct hfsplus_perm {
  64        __be32 owner;
  65        __be32 group;
  66        u8  rootflags;
  67        u8  userflags;
  68        __be16 mode;
  69        __be32 dev;
  70} __packed;
  71
  72#define HFSPLUS_FLG_NODUMP      0x01
  73#define HFSPLUS_FLG_IMMUTABLE   0x02
  74#define HFSPLUS_FLG_APPEND      0x04
  75
  76/* A single contiguous area of a file */
  77struct hfsplus_extent {
  78        __be32 start_block;
  79        __be32 block_count;
  80} __packed;
  81typedef struct hfsplus_extent hfsplus_extent_rec[8];
  82
  83/* Information for a "Fork" in a file */
  84struct hfsplus_fork_raw {
  85        __be64 total_size;
  86        __be32 clump_size;
  87        __be32 total_blocks;
  88        hfsplus_extent_rec extents;
  89} __packed;
  90
  91/* HFS+ Volume Header */
  92struct hfsplus_vh {
  93        __be16 signature;
  94        __be16 version;
  95        __be32 attributes;
  96        __be32 last_mount_vers;
  97        u32 reserved;
  98
  99        __be32 create_date;
 100        __be32 modify_date;
 101        __be32 backup_date;
 102        __be32 checked_date;
 103
 104        __be32 file_count;
 105        __be32 folder_count;
 106
 107        __be32 blocksize;
 108        __be32 total_blocks;
 109        __be32 free_blocks;
 110
 111        __be32 next_alloc;
 112        __be32 rsrc_clump_sz;
 113        __be32 data_clump_sz;
 114        hfsplus_cnid next_cnid;
 115
 116        __be32 write_count;
 117        __be64 encodings_bmp;
 118
 119        u8 finder_info[32];
 120
 121        struct hfsplus_fork_raw alloc_file;
 122        struct hfsplus_fork_raw ext_file;
 123        struct hfsplus_fork_raw cat_file;
 124        struct hfsplus_fork_raw attr_file;
 125        struct hfsplus_fork_raw start_file;
 126} __packed;
 127
 128/* HFS+ volume attributes */
 129#define HFSPLUS_VOL_UNMNT               (1 << 8)
 130#define HFSPLUS_VOL_SPARE_BLK           (1 << 9)
 131#define HFSPLUS_VOL_NOCACHE             (1 << 10)
 132#define HFSPLUS_VOL_INCNSTNT            (1 << 11)
 133#define HFSPLUS_VOL_NODEID_REUSED       (1 << 12)
 134#define HFSPLUS_VOL_JOURNALED           (1 << 13)
 135#define HFSPLUS_VOL_SOFTLOCK            (1 << 15)
 136
 137/* HFS+ BTree node descriptor */
 138struct hfs_bnode_desc {
 139        __be32 next;
 140        __be32 prev;
 141        s8 type;
 142        u8 height;
 143        __be16 num_recs;
 144        u16 reserved;
 145} __packed;
 146
 147/* HFS+ BTree node types */
 148#define HFS_NODE_INDEX  0x00
 149#define HFS_NODE_HEADER 0x01
 150#define HFS_NODE_MAP    0x02
 151#define HFS_NODE_LEAF   0xFF
 152
 153/* HFS+ BTree header */
 154struct hfs_btree_header_rec {
 155        __be16 depth;
 156        __be32 root;
 157        __be32 leaf_count;
 158        __be32 leaf_head;
 159        __be32 leaf_tail;
 160        __be16 node_size;
 161        __be16 max_key_len;
 162        __be32 node_count;
 163        __be32 free_nodes;
 164        u16 reserved1;
 165        __be32 clump_size;
 166        u8 btree_type;
 167        u8 key_type;
 168        __be32 attributes;
 169        u32 reserved3[16];
 170} __packed;
 171
 172/* BTree attributes */
 173#define HFS_TREE_BIGKEYS        2
 174#define HFS_TREE_VARIDXKEYS     4
 175
 176/* HFS+ BTree misc info */
 177#define HFSPLUS_TREE_HEAD 0
 178#define HFSPLUS_NODE_MXSZ 32768
 179
 180/* Some special File ID numbers (stolen from hfs.h) */
 181#define HFSPLUS_POR_CNID                1       /* Parent Of the Root */
 182#define HFSPLUS_ROOT_CNID               2       /* ROOT directory */
 183#define HFSPLUS_EXT_CNID                3       /* EXTents B-tree */
 184#define HFSPLUS_CAT_CNID                4       /* CATalog B-tree */
 185#define HFSPLUS_BAD_CNID                5       /* BAD blocks file */
 186#define HFSPLUS_ALLOC_CNID              6       /* ALLOCation file */
 187#define HFSPLUS_START_CNID              7       /* STARTup file */
 188#define HFSPLUS_ATTR_CNID               8       /* ATTRibutes file */
 189#define HFSPLUS_EXCH_CNID               15      /* ExchangeFiles temp id */
 190#define HFSPLUS_FIRSTUSER_CNID          16      /* first available user id */
 191
 192/* btree key type */
 193#define HFSPLUS_KEY_CASEFOLDING         0xCF    /* case-insensitive */
 194#define HFSPLUS_KEY_BINARY              0xBC    /* case-sensitive */
 195
 196/* HFS+ catalog entry key */
 197struct hfsplus_cat_key {
 198        __be16 key_len;
 199        hfsplus_cnid parent;
 200        struct hfsplus_unistr name;
 201} __packed;
 202
 203
 204/* Structs from hfs.h */
 205struct hfsp_point {
 206        __be16 v;
 207        __be16 h;
 208} __packed;
 209
 210struct hfsp_rect {
 211        __be16 top;
 212        __be16 left;
 213        __be16 bottom;
 214        __be16 right;
 215} __packed;
 216
 217
 218/* HFS directory info (stolen from hfs.h */
 219struct DInfo {
 220        struct hfsp_rect frRect;
 221        __be16 frFlags;
 222        struct hfsp_point frLocation;
 223        __be16 frView;
 224} __packed;
 225
 226struct DXInfo {
 227        struct hfsp_point frScroll;
 228        __be32 frOpenChain;
 229        __be16 frUnused;
 230        __be16 frComment;
 231        __be32 frPutAway;
 232} __packed;
 233
 234/* HFS+ folder data (part of an hfsplus_cat_entry) */
 235struct hfsplus_cat_folder {
 236        __be16 type;
 237        __be16 flags;
 238        __be32 valence;
 239        hfsplus_cnid id;
 240        __be32 create_date;
 241        __be32 content_mod_date;
 242        __be32 attribute_mod_date;
 243        __be32 access_date;
 244        __be32 backup_date;
 245        struct hfsplus_perm permissions;
 246        struct DInfo user_info;
 247        struct DXInfo finder_info;
 248        __be32 text_encoding;
 249        u32 reserved;
 250} __packed;
 251
 252/* HFS file info (stolen from hfs.h) */
 253struct FInfo {
 254        __be32 fdType;
 255        __be32 fdCreator;
 256        __be16 fdFlags;
 257        struct hfsp_point fdLocation;
 258        __be16 fdFldr;
 259} __packed;
 260
 261struct FXInfo {
 262        __be16 fdIconID;
 263        u8 fdUnused[8];
 264        __be16 fdComment;
 265        __be32 fdPutAway;
 266} __packed;
 267
 268/* HFS+ file data (part of a cat_entry) */
 269struct hfsplus_cat_file {
 270        __be16 type;
 271        __be16 flags;
 272        u32 reserved1;
 273        hfsplus_cnid id;
 274        __be32 create_date;
 275        __be32 content_mod_date;
 276        __be32 attribute_mod_date;
 277        __be32 access_date;
 278        __be32 backup_date;
 279        struct hfsplus_perm permissions;
 280        struct FInfo user_info;
 281        struct FXInfo finder_info;
 282        __be32 text_encoding;
 283        u32 reserved2;
 284
 285        struct hfsplus_fork_raw data_fork;
 286        struct hfsplus_fork_raw rsrc_fork;
 287} __packed;
 288
 289/* File attribute bits */
 290#define HFSPLUS_FILE_LOCKED             0x0001
 291#define HFSPLUS_FILE_THREAD_EXISTS      0x0002
 292
 293/* HFS+ catalog thread (part of a cat_entry) */
 294struct hfsplus_cat_thread {
 295        __be16 type;
 296        s16 reserved;
 297        hfsplus_cnid parentID;
 298        struct hfsplus_unistr nodeName;
 299} __packed;
 300
 301#define HFSPLUS_MIN_THREAD_SZ 10
 302
 303/* A data record in the catalog tree */
 304typedef union {
 305        __be16 type;
 306        struct hfsplus_cat_folder folder;
 307        struct hfsplus_cat_file file;
 308        struct hfsplus_cat_thread thread;
 309} __packed hfsplus_cat_entry;
 310
 311/* HFS+ catalog entry type */
 312#define HFSPLUS_FOLDER         0x0001
 313#define HFSPLUS_FILE           0x0002
 314#define HFSPLUS_FOLDER_THREAD  0x0003
 315#define HFSPLUS_FILE_THREAD    0x0004
 316
 317/* HFS+ extents tree key */
 318struct hfsplus_ext_key {
 319        __be16 key_len;
 320        u8 fork_type;
 321        u8 pad;
 322        hfsplus_cnid cnid;
 323        __be32 start_block;
 324} __packed;
 325
 326#define HFSPLUS_EXT_KEYLEN 12
 327
 328/* HFS+ generic BTree key */
 329typedef union {
 330        __be16 key_len;
 331        struct hfsplus_cat_key cat;
 332        struct hfsplus_ext_key ext;
 333} __packed hfsplus_btree_key;
 334
 335#endif
 336